{"version":3,"sources":["node_modules/browser-pack/_prelude.js","assets/scripts/lib/bookmarks.js","assets/scripts/lib/component-module.js","assets/scripts/lib/contact-us.js","assets/scripts/lib/cta-bar-bottom.js","assets/scripts/lib/cta-bar-top.js","assets/scripts/lib/documentation-contextual.js","assets/scripts/lib/documentation.js","assets/scripts/lib/drawer.js","assets/scripts/lib/event-bus.js","assets/scripts/lib/fetcher.js","assets/scripts/lib/filter-components.js","assets/scripts/lib/footer-units.js","assets/scripts/lib/fw-media.js","assets/scripts/lib/generic-modal.js","assets/scripts/lib/hero-products.js","assets/scripts/lib/home-hero.js","assets/scripts/lib/how-it-works.js","assets/scripts/lib/internal-search.js","assets/scripts/lib/legal-compliance.js","assets/scripts/lib/lit-order.js","assets/scripts/lib/market-applications.js","assets/scripts/lib/megamenu.js","assets/scripts/lib/menu-top-bar.js","assets/scripts/lib/meter-selector/button-set.js","assets/scripts/lib/meter-selector/frame.js","assets/scripts/lib/meter-selector/input-box.js","assets/scripts/lib/meter-selector/step-bar.js","assets/scripts/lib/misc.js","assets/scripts/lib/modal-trigger.js","assets/scripts/lib/modals.js","assets/scripts/lib/modules/affiliates.js","assets/scripts/lib/modules/find-distributor.js","assets/scripts/lib/modules/global-message.js","assets/scripts/lib/modules/index.js","assets/scripts/lib/modules/locations-map.js","assets/scripts/lib/modules/meter-selector.js","assets/scripts/lib/modules/my-saved-page.js","assets/scripts/lib/modules/recent-posts.js","assets/scripts/lib/modules/solution-area.js","assets/scripts/lib/pardot-form.js","assets/scripts/lib/patents.js","assets/scripts/lib/product-catalog.js","assets/scripts/lib/products-accessories.js","assets/scripts/lib/quick-links.js","assets/scripts/lib/search-results.js","assets/scripts/lib/slideshow.js","assets/scripts/lib/software-card.js","assets/scripts/lib/software-firmware.js","assets/scripts/lib/spec-table.js","assets/scripts/lib/specifications.js","assets/scripts/lib/storage-manager.js","assets/scripts/lib/store.js","assets/scripts/lib/sub-nav.js","assets/scripts/lib/tabs.js","assets/scripts/lib/template-strings/my-saved-page.js","assets/scripts/lib/template-strings/recent-posts.js","assets/scripts/lib/template-strings/solution-area.js","assets/scripts/lib/template-strings/tabs-component.js","assets/scripts/lib/testimonial.js","assets/scripts/lib/timeline.js","assets/scripts/lib/video-player-link.js","assets/scripts/lib/video-player.js","assets/scripts/main.js","assets/scripts/polyfills/element.closest.js","assets/scripts/polyfills/matchMedia.js","db.json","node_modules/@popperjs/core/dist/cjs/popper.js","node_modules/axios/index.js","node_modules/axios/lib/adapters/xhr.js","node_modules/axios/lib/axios.js","node_modules/axios/lib/cancel/Cancel.js","node_modules/axios/lib/cancel/CancelToken.js","node_modules/axios/lib/cancel/isCancel.js","node_modules/axios/lib/core/Axios.js","node_modules/axios/lib/core/InterceptorManager.js","node_modules/axios/lib/core/buildFullPath.js","node_modules/axios/lib/core/createError.js","node_modules/axios/lib/core/dispatchRequest.js","node_modules/axios/lib/core/enhanceError.js","node_modules/axios/lib/core/mergeConfig.js","node_modules/axios/lib/core/settle.js","node_modules/axios/lib/core/transformData.js","node_modules/axios/lib/defaults.js","node_modules/axios/lib/helpers/bind.js","node_modules/axios/lib/helpers/buildURL.js","node_modules/axios/lib/helpers/combineURLs.js","node_modules/axios/lib/helpers/cookies.js","node_modules/axios/lib/helpers/isAbsoluteURL.js","node_modules/axios/lib/helpers/isURLSameOrigin.js","node_modules/axios/lib/helpers/normalizeHeaderName.js","node_modules/axios/lib/helpers/parseHeaders.js","node_modules/axios/lib/helpers/spread.js","node_modules/axios/lib/utils.js","node_modules/core-js/es/array/find.js","node_modules/core-js/es/array/from.js","node_modules/core-js/es/array/includes.js","node_modules/core-js/es/object/assign.js","node_modules/core-js/es/promise/index.js","node_modules/core-js/es/string/includes.js","node_modules/core-js/es/symbol/iterator.js","node_modules/core-js/features/promise/index.js","node_modules/core-js/internals/a-function.js","node_modules/core-js/internals/add-to-unscopables.js","node_modules/core-js/internals/an-instance.js","node_modules/core-js/internals/an-object.js","node_modules/core-js/internals/array-from.js","node_modules/core-js/internals/array-includes.js","node_modules/core-js/internals/array-methods.js","node_modules/core-js/internals/array-species-create.js","node_modules/core-js/internals/bind-context.js","node_modules/core-js/internals/call-with-safe-iteration-closing.js","node_modules/core-js/internals/check-correctness-of-iteration.js","node_modules/core-js/internals/classof-raw.js","node_modules/core-js/internals/classof.js","node_modules/core-js/internals/copy-constructor-properties.js","node_modules/core-js/internals/correct-is-regexp-logic.js","node_modules/core-js/internals/correct-prototype-getter.js","node_modules/core-js/internals/create-iterator-constructor.js","node_modules/core-js/internals/create-property-descriptor.js","node_modules/core-js/internals/create-property.js","node_modules/core-js/internals/define-iterator.js","node_modules/core-js/internals/define-well-known-symbol.js","node_modules/core-js/internals/descriptors.js","node_modules/core-js/internals/document-create-element.js","node_modules/core-js/internals/dom-iterables.js","node_modules/core-js/internals/entry-unbind.js","node_modules/core-js/internals/enum-bug-keys.js","node_modules/core-js/internals/export.js","node_modules/core-js/internals/fails.js","node_modules/core-js/internals/function-to-string.js","node_modules/core-js/internals/get-built-in.js","node_modules/core-js/internals/get-iterator-method.js","node_modules/core-js/internals/global.js","node_modules/core-js/internals/has.js","node_modules/core-js/internals/hidden-keys.js","node_modules/core-js/internals/hide.js","node_modules/core-js/internals/host-report-errors.js","node_modules/core-js/internals/html.js","node_modules/core-js/internals/ie8-dom-define.js","node_modules/core-js/internals/indexed-object.js","node_modules/core-js/internals/internal-state.js","node_modules/core-js/internals/is-array-iterator-method.js","node_modules/core-js/internals/is-array.js","node_modules/core-js/internals/is-forced.js","node_modules/core-js/internals/is-object.js","node_modules/core-js/internals/is-pure.js","node_modules/core-js/internals/is-regexp.js","node_modules/core-js/internals/iterate.js","node_modules/core-js/internals/iterators-core.js","node_modules/core-js/internals/microtask.js","node_modules/core-js/internals/native-symbol.js","node_modules/core-js/internals/native-weak-map.js","node_modules/core-js/internals/new-promise-capability.js","node_modules/core-js/internals/object-assign.js","node_modules/core-js/internals/object-create.js","node_modules/core-js/internals/object-define-properties.js","node_modules/core-js/internals/object-define-property.js","node_modules/core-js/internals/object-get-own-property-descriptor.js","node_modules/core-js/internals/object-get-own-property-names.js","node_modules/core-js/internals/object-get-own-property-symbols.js","node_modules/core-js/internals/object-get-prototype-of.js","node_modules/core-js/internals/object-keys-internal.js","node_modules/core-js/internals/object-keys.js","node_modules/core-js/internals/object-property-is-enumerable.js","node_modules/core-js/internals/object-set-prototype-of.js","node_modules/core-js/internals/object-to-string.js","node_modules/core-js/internals/own-keys.js","node_modules/core-js/internals/path.js","node_modules/core-js/internals/perform.js","node_modules/core-js/internals/promise-resolve.js","node_modules/core-js/internals/redefine-all.js","node_modules/core-js/internals/redefine.js","node_modules/core-js/internals/require-object-coercible.js","node_modules/core-js/internals/set-global.js","node_modules/core-js/internals/set-species.js","node_modules/core-js/internals/set-to-string-tag.js","node_modules/core-js/internals/shared-key.js","node_modules/core-js/internals/shared.js","node_modules/core-js/internals/species-constructor.js","node_modules/core-js/internals/string-at.js","node_modules/core-js/internals/task.js","node_modules/core-js/internals/to-absolute-index.js","node_modules/core-js/internals/to-indexed-object.js","node_modules/core-js/internals/to-integer.js","node_modules/core-js/internals/to-length.js","node_modules/core-js/internals/to-object.js","node_modules/core-js/internals/to-primitive.js","node_modules/core-js/internals/uid.js","node_modules/core-js/internals/user-agent.js","node_modules/core-js/internals/validate-set-prototype-of-arguments.js","node_modules/core-js/internals/validate-string-method-arguments.js","node_modules/core-js/internals/well-known-symbol.js","node_modules/core-js/internals/wrapped-well-known-symbol.js","node_modules/core-js/modules/es.array.find.js","node_modules/core-js/modules/es.array.from.js","node_modules/core-js/modules/es.array.includes.js","node_modules/core-js/modules/es.array.iterator.js","node_modules/core-js/modules/es.object.assign.js","node_modules/core-js/modules/es.object.to-string.js","node_modules/core-js/modules/es.promise.finally.js","node_modules/core-js/modules/es.promise.js","node_modules/core-js/modules/es.string.includes.js","node_modules/core-js/modules/es.string.iterator.js","node_modules/core-js/modules/es.symbol.iterator.js","node_modules/core-js/modules/esnext.aggregate-error.js","node_modules/core-js/modules/esnext.promise.all-settled.js","node_modules/core-js/modules/esnext.promise.any.js","node_modules/core-js/modules/esnext.promise.try.js","node_modules/core-js/modules/web.dom-collections.iterator.js","node_modules/intersection-observer/intersection-observer.js","node_modules/lory.js/dist/lory.js","node_modules/nodelist-foreach-polyfill/index.js","node_modules/process/browser.js","node_modules/qs/lib/formats.js","node_modules/qs/lib/index.js","node_modules/qs/lib/parse.js","node_modules/qs/lib/stringify.js","node_modules/qs/lib/utils.js","node_modules/showdown/dist/showdown.js","node_modules/timers-browserify/main.js","node_modules/tippy.js/dist/tippy.cjs.js","node_modules/vue-js-modal/dist/index.js","node_modules/vue/dist/vue.min.js","node_modules/vuex/dist/vuex.common.js","views/partials/shared/meter-selector-button-set.hbs","views/partials/shared/meter-selector-content.hbs","views/partials/shared/meter-selector-frame-question.hbs","views/partials/shared/meter-selector-frame-separator.hbs","views/partials/shared/meter-selector-frame.hbs","views/partials/shared/meter-selector-input-box.hbs","views/partials/shared/meter-selector-paginator.hbs","views/partials/shared/meter-selector-product-item-h.hbs","views/partials/shared/meter-selector-product-item-v.hbs","views/partials/shared/meter-selector-step-bar.hbs"],"names":[],"mappings":"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ACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC38DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpzDA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzDA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxVA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACdA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;;ACHA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpWA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC19BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACngCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACriKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC3EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpuEA;AACA;;;ACDA;AACA;AACA;AACA;AACA;AACA;;;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACrkCA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA;;ACDA;AACA","file":"main.bundle.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i {\n\n let bookmarkItems = document.querySelectorAll('.bookmark-container');\n\n let bookmarkConstructor = (id) => {\n Vue.component('bookmark', {\n props: ['data'],\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.productId ? this.$refs.bookmark.dataset.productId : this.$refs.bookmark.dataset.articleId ? this.$refs.bookmark.dataset.articleId : this.$refs.bookmark.dataset.documentId ? this.$refs.bookmark.dataset.documentId : this.$refs.bookmark.dataset.softwareId ? this.$refs.bookmark.dataset.softwareId : null;\n\n this.type = this.$refs.bookmark.dataset.productId ? \"productId\" : this.$refs.bookmark.dataset.articleId ? \"articleId\" : this.$refs.bookmark.dataset.documentId ? \"documentId\" : this.$refs.bookmark.dataset.softwareId ? \"softwareId\" : null;\n \n // console.log(\"saved\",this.saved);\n\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n });\n\n new Vue({\n el: `.bookmark-container-${id}`,\n }).$mount(`.bookmark-container-${id}`, true);\n }\n\n if (bookmarkItems.length > 0) {\n bookmarkItems.forEach((item, index) => {\n item.classList.add(`bookmark-container-${index}`);\n bookmarkConstructor(index);\n })\n }\n\n}\n\nexport default bookmarks;","/*\n METHODS:\n\n # ComponentModule.AddModule(target, options)\n * Arguments:\n - {string} target\n - {Object} options\n * Usage:\n Register a Module. Registration allows starting a new Vue instance with the configuration that you provide in 'options' object. 'target' argument is used to find the elements in the DOM and provides the Vue instance an existing DOM element to mount on. It can be a CSS selector string.\n\n # ComponentModule.Init:\n The function that initializes every Module added.\n\n OBJECTS:\n\n # Options\n With the 'options' argument can pass the configuration options for Vue (https://vuejs.org/v2/api/#Options-Data) except 'el' and 'components' options, and additionally the next options:\n\n - {array[object]} components:\n this works like Local Registration Component in Veu (https://vuejs.org/v2/guide/components-registration.html), just is an array in place of an object and the id component must be in the 'name' parameter. i.e:\n\n [Directly in VUE]:\n\n new Vue({\n el: '#app',\n components: {\n 'component-a': ComponentA,\n 'component-b': ComponentB\n }\n });\n\n [HERE]:\n\n ...\n components: [ { name: 'component-a', ...ComponentA }, { name: 'component-b', ...ComponentB } ],\n ...\n\n - {string} prefix:\n this will be added to every id component as prefix, i.e:\n prefix = \"comp_\" and component.name = \"form\". So the final result will be 'comp_form' as id component.\n\n - {string} initFunc:\n this is just a simple function that is called before to create the Vue instance, for the preconditions\n\n - {boolean} mount:\n this value is true by default. If the value is true, will force the hydration of the module.\n\n*/\n\nimport Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst ComponentModule = {\n AddModule: (target, options) => {\n ComponentModule._modules.push({target, ...options});\n },\n\n Init: () => {\n ComponentModule._modules.forEach(({ prefix, components, initFunc, target, template, mount = true, ...vueOptions }) => {\n const _prfx = prefix || '';\n const found = document.querySelectorAll(target);\n found.forEach(el => {\n initFunc && initFunc(Vue);\n const instance = new Vue({\n el: !template && el,\n store: store,\n components: components?.reduce((obj, {name, ...options}) => {\n obj[_prfx+name] = options;\n return obj;\n }, {}),\n template,\n ...vueOptions,\n })\n\n mount && instance.$mount(el, true);\n });\n });\n },\n};\n\nComponentModule._modules = [];\n\nexport default ComponentModule;\n","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport EventBus from './event-bus';\n// import { contactModal } from \"./modals\";\n\nconst ContactUs = () => {\n Vue.use(VModal);\n\n Vue.component('contact-us', {\n props: ['contactOpen'],\n methods: {\n toggleModal() {\n EventBus.$emit('close-contact');\n\n // this.$modal.show(\n // contactModal.template,\n // contactModal.name,\n // contactModal.options,\n // contactModal.events\n // )\n },\n },\n mounted() {\n }\n });\n\n}\n\nexport default ContactUs;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus'\nimport ContactUs from './contact-us';\n\nconst ctaBarBottom = () => {\n const ctaBar = document.querySelectorAll('.persistent-cta--bottom');\n\n let ctaBarConstructor = (id) => {\n Vue.component('cta-bar-bottom-template', {\n data: function() {\n return {\n isSticky: false,\n isMobile: store.state.isMobile,\n scrolled: false,\n isFinalPosition: false,\n observer: null,\n contactOpen: false,\n store: store\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n computedIsMobile: function() {\n if (this.computedIsMobile == true) {\n this.initShow();\n this.detectFooter();\n this.isMobile = true;\n \n EventBus.$on('stick-nav', () => {\n this.stickyNav();\n this.isSticky = true;\n });\n EventBus.$on('unstick-nav', () => {\n if (!this.isFinalPosition) {\n this.unstickyNav();\n this.isSticky = false;\n } else { return; }\n });\n } else {\n this.isMobile = false;\n EventBus.$off('stick-nav');\n EventBus.$off('unstick-nav');\n document.querySelector('.persistent-cta--bottom-final').classList.remove('active');\n this.unstickyNav();\n document.querySelector('.persistent-cta--bottom').style.display = \"none\";\n\n let target = document.querySelector('.footer');\n this.observer.disconnect(target);\n }\n },\n // isSticky: function() {\n // this.contactOpen = this.isSticky ? this.contactOpen : false; \n // }\n },\n methods: {\n toggleContact() {\n this.contactOpen = !this.contactOpen;\n },\n stickyNav() {\n if (!this.$el.parentNode.classList.contains('active') && !this.isSticky && this.computedIsMobile) {\n this.$el.parentNode.classList.add(\"active\");\n } \n },\n unstickyNav() {\n if (this.isSticky) {\n this.$el.parentNode.classList.remove(\"active\");\n }\n },\n initShow() {\n // show bottom after 3 seconds\n setTimeout(() => {\n this.$el.parentNode.classList.add('active');\n }, 3000);\n },\n detectFooter() {\n let options= {\n root: null,\n rootMargin: '0px',\n threshold: 0\n }\n const handleSticky = (changes) => {\n changes.forEach(change => {\n if (!(change.intersectionRatio > 0)) {\n this.isFinalPosition = false;\n document.querySelector('.persistent-cta--bottom').style.display = 'block';\n } else {\n this.isFinalPosition = true;\n document.querySelector('.persistent-cta--bottom').style.display = 'none';\n }\n })\n }\n let observer = new IntersectionObserver(handleSticky, options);\n this.observer = observer;\n let target = document.querySelector('.footer');\n\n observer.observe(target);\n }\n },\n mounted() {\n EventBus.$on('stick-nav', () => {\n this.stickyNav();\n this.isSticky = true;\n this.scrolled = true;\n });\n EventBus.$on('unstick-nav', () => {\n if (!this.isFinalPosition) {\n this.unstickyNav();\n this.isSticky = false;\n this.scrolled = true;\n } else { return; }\n });\n EventBus.$on('close-contact', () => {\n this.contactOpen = false;\n });\n if (this.isMobile) {\n this.initShow();\n this.detectFooter();\n }\n }\n });\n\n ContactUs();\n\n new Vue({\n el: `.persistent-cta--bottom-${id}`,\n store: store,\n }).$mount(`.persistent-cta--bottom-${id}`, true);\n }\n\n if (ctaBar.length > 0) {\n ctaBar.forEach((item, index) => {\n item.classList.add(`persistent-cta--bottom-${index}`);\n ctaBarConstructor(index);\n })\n }\n\n}\n\nexport default ctaBarBottom;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport ContactUs from './contact-us';\nimport VModal from 'vue-js-modal';\n// import {quoteModal} from './modals';\n\nconst ctaBarTop = () => {\n const ctaBar = document.querySelector('.persistent-cta--top');\n Vue.use(VModal);\n\n let ctaBarConstructor = () => {\n Vue.component('cta-bar-top-template', {\n data: function() {\n return {\n title: store.state.pageTitle || '',\n showTitle: false,\n anchorLinks: {test: 'test'},\n currentAnchor: null,\n // store: store, //for testing only\n hasAnchors: false,\n isMobile: false,\n scrollDir: null,\n contactOpen: false,\n contactOpenText: '',\n store: store\n }\n },\n created: function(){\n window.addEventListener('scroll', this.handleScroll);\n this.handleScroll();\n },\n destroyed: function(){\n window.removeEventListener('scroll', this.handleScroll);\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n },\n watch: {\n computedIsMobile: function() {\n this.isMobile = this.computedIsMobile;\n // this.scrollDirection();\n },\n scrollDir: function() {\n if (this.scrollDir == \"up\") {\n this.stickyNav();\n } else if (this.scrollDir == \"down\") {\n this.unstickyNav();\n } else if (this.scrollDir == \"top\") {\n this.$el.parentNode.classList.remove(\"active\");\n }\n },\n contactOpen: function() {\n this.contactOpenText = this.contactOpen ? '' : this.$refs.contactBtn.querySelector('.button-text').dataset.openText; \n }\n },\n methods: {\n handleScroll() {\n const el = this.$parent.$el;\n const wTop = document.documentElement.scrollTop || document.body.scrollTop;\n const eTop = this.parentTop || el.getBoundingClientRect().top;\n\n if (this.parentTop === null){\n this.parentTop = eTop;\n }\n\n if (wTop > eTop) {\n el.classList.add(\"persistent-cta--top-fixed\");\n } else {\n el.classList.remove(\"persistent-cta--top-fixed\");\n }\n },\n toggleContact(e) {\n this.contactOpen = !this.contactOpen;\n },\n\n // toggleModal() {\n // this.$modal.show(\n // quoteModal.template(),\n // quoteModal.name, \n // quoteModal.options,\n // quoteModal.events\n // )\n // },\n\n setTitle() {\n \n if (document.querySelector('h1')) {\n let pageTitle = document.querySelector('h1').innerText;\n store.commit('updateTitle', pageTitle);\n this.title = store.state.pageTitle;\n }\n },\n detectHero() {\n let options= {\n root: null,\n rootMargin: '0px',\n threshold: 0\n }\n const toggleTitle = (changes) => {\n changes.forEach(change => {\n if (!(change.intersectionRatio > 0)) {\n // console.log('hero NOT visible');\n this.showTitle = true;\n } else {\n // console.log('hero visible');\n this.showTitle = false;\n }\n })\n }\n let observer = new IntersectionObserver(toggleTitle, options);\n \n if (document.querySelector('h1')) {\n let target = document.querySelector('h1').parentNode;\n observer.observe(target);\n } else {return;}\n\n },\n setAnchors() {\n let anchorContainer = document.querySelectorAll('.sub-nav__list-container li a');\n let anchors = [];\n this.hasAnchors = anchorContainer.length > 0 ? true : false;\n\n if (this.hasAnchors) {\n // let test = '';\n // document.addEventListener('click', () => {\n // console.log(\"clicked\");\n // });\n anchorContainer.forEach((item, index) => {\n anchors.push({\n name: item.innerText,\n key: item.getAttribute('href').substr(1)\n });\n // console.log(item)\n // this.$nextTick(() => {\n // item.addEventListener(\"click\", () => {\n // console.log(\"CLICKED\");\n // }, false);\n\n // })\n\n });\n \n // console.log(anchors);\n this.anchorLinks = anchors;\n\n store.commit('setPageAnchors', anchors);\n this.$nextTick(() => {\n this.observeAnchors();\n })\n }\n },\n initMobile() {\n this.isMobile = store.state.isMobile;\n },\n scrollDirection() {\n var scrollPos = 0;\n var self = this;\n function handleScroll() {\n if (self.computedIsMobile) {\n if ((document.body.getBoundingClientRect()).top == 0) {\n self.scrollDir = \"top\";\n } else if ((document.body.getBoundingClientRect()).top > scrollPos) {\n EventBus.$emit('unstick-nav');\n self.scrollDir = \"up\";\n // this.stickyNav();\n } else {\n EventBus.$emit('stick-nav');\n self.scrollDir = \"down\";\n // this.unstickyNav();\n }\n scrollPos = (document.body.getBoundingClientRect()).top;\n } else {\n return;\n }\n }\n\n window.addEventListener(\"scroll\", handleScroll, true);\n \n },\n stickyNav() {\n if (!this.$el.parentNode.classList.contains('active')) {\n this.$el.parentNode.classList.add(\"active\");\n } \n },\n unstickyNav() {\n this.$el.parentNode.classList.remove(\"active\");\n },\n observeAnchors() {\n let options = {\n root: null,\n rootMargin: '0px',\n // threshold: .25\n threshold: [0, .1, .2, .3, .4, .5, .6, .7, .8, .9, 1]\n // more thresholds = more accuracy\n }\n\n const setCurrentAnchor = (entries) => {\n for (let entry of entries) {\n entry.target._intersectionHeight = entry.intersectionRect.height;\n }\n \n // compare visibility of sections(all) after every intersection\n const mostVisibleSection = targets.reduce((prev, current) => {\n if (current._intersectionHeight > (prev ? prev._intersectionHeight : 0)) {\n return current;\n } else {\n return prev;\n }\n }, null);\n if (mostVisibleSection) {\n this.currentAnchor = mostVisibleSection.dataset.id;\n } \n }\n\n let observer = new IntersectionObserver(setCurrentAnchor, options);\n let targets = [];\n\n this.anchorLinks.forEach((anchor) => {\n let target = document.querySelector(`[data-id=\"${anchor.key}\"]`);\n if (target) { targets.push(target); }\n });\n // console.log(targets);\n targets.forEach((target) => {\n observer.observe(target);\n })\n }\n },\n mounted() {\n // console.log(this.$el)\n this.setTitle();\n this.detectHero();\n this.setAnchors();\n this.initMobile();\n this.scrollDirection();\n\n this.contactOpenText = this.$refs.contactBtn.querySelector('.button-text').dataset.openText; \n // for opening the contact tooltip from other modules\n EventBus.$on(`open-contact`, () => {\n this.contactOpen = true;\n });\n // for toggling the contact tooltip in the cta top bar only\n EventBus.$on('toggle-contact', () => {\n this.toggleContact();\n })\n EventBus.$on('close-contact', () => {\n this.contactOpen = false;\n });\n }\n \n });\n\n Vue.component('anchor-dropdown', {\n props: ['anchorLinks', 'showTitle', 'hasAnchors', 'isMobile', 'currentAnchor'],\n data: function() {\n return {\n showAnchors: false,\n dropdownAnchor: null\n // showTopBar: true,\n }\n },\n computed: {\n computedCurrentAnchor: function() {\n return this.currentAnchor;\n }\n },\n watch: {\n \"currentAnchor\": function() {\n this.dropdownAnchor = this.currentAnchor;\n },\n // showTopBar: function() {\n // let topBar = document.querySelector('.persistent-cta--top');\n // if (this.isMobile) {\n // if (this.showTopBar == true) {\n // topBar.classList.remove('hide-bar');\n // } else if (this.showTopBar == false) {\n // topBar.classList.add('hide-bar');\n // }\n // }\n // },\n hasAnchors: function() {\n this.detectAnchors();\n }\n },\n template: `\n \n `,\n methods: {\n jump(e) {\n // console.log(\"jump\");\n window.location.hash = `#${e.target.value}`;\n // console.log(e.target.value);\n },\n detectAnchors() {\n var subNav = document.querySelector(\".sub-nav\");\n window.addEventListener(\"scroll\", () => {\n if (window.scrollY > subNav.offsetTop ){\n this.showAnchors = true;\n } else {\n this.showAnchors = false;\n }\n })\n },\n },\n mounted() {\n this.$nextTick(function() {\n if(this.hasAnchors) {\n this.detectAnchors();\n }\n }); \n }\n })\n\n Vue.component('anchor-dropdown-item', {\n props: ['data'],\n template: `\n \n `,\n });\n\n ContactUs();\n\n new Vue({\n el: '.persistent-cta--top',\n store: store,\n }).$mount('.persistent-cta--top', true);\n }\n\n if(ctaBar) {\n ctaBarConstructor();\n } \n\n}\n\nexport default ctaBarTop;\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\n\nconst documentationContextual = () => {\n\n let docs = document.querySelectorAll('.doc-con');\n\n let documentationConstructor = (id) => {\n Vue.component('documentation-contextual-template', {\n data: function() {\n return {\n emailDocs: [], //for emailing,\n mailto: null,\n mailtoAll: null,\n totalItems: null,\n items: [],\n }\n },\n watch: {\n \"emailDocs\": function() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.emailDocs.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}:%20${item.url}%0D%0A`;\n });\n this.mailto = mailto;\n },\n \"items\": function() {\n this.shareAll();\n },\n },\n methods: {\n updateEmailDocs(data) {\n let item = this.emailDocs.find(item => {\n return item.id == data.id;\n });\n\n if (!item) {\n this.emailDocs = [...this.emailDocs, data];\n } else {\n this.emailDocs.splice(this.emailDocs.indexOf(item),1);\n }\n },\n updateItems(data) {\n this.items.push(data);\n },\n shareAll() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.items.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${item.url}%0D%0A`;\n });\n this.mailtoAll = mailto;\n },\n },\n mounted() {\n EventBus.$on('email-docs', (data) => {\n this.updateEmailDocs(data);\n });\n EventBus.$on('update-items', (data) => {\n this.updateItems(data);\n });\n this.shareAll(); //init share all\n\n this.totalItems = Array.from(this.$el.querySelectorAll('.doc-card')).length;\n }\n });\n\n Vue.component('doc-con-item', {\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: \"documentId\",\n name: null,\n url: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n methods: {\n emailDoc() {\n EventBus.$emit('email-docs', {\"name\": this.name, \"url\": this.url, \"id\": this.id});\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails},`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n this.name = this.$refs.name.innerText;\n this.url = this.$refs.name.getAttribute('href');\n this.$nextTick(() => {\n EventBus.$emit('update-items', {\"name\": this.name, \"url\": this.url, \"id\": this.id})\n });\n this.initSeeAll();\n }\n });\n\n new Vue({\n el: `.doc-con-${id}`,\n }).$mount(`.doc-con-${id}`, true);\n }\n\n if (docs.length > 0) {\n docs.forEach((item, index) => {\n item.classList.add(`doc-con-${index}`);\n documentationConstructor(index);\n })\n }\n\n}\n\nexport default documentationContextual;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nconst safeString = (str) => {\n return encodeURIComponent(str);\n}\n\nconst Documentation = () => {\n\n let documentation = document.querySelectorAll('.documentation');\n\n const documentationConstructor = (id) => {\n Vue.component('documentation-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n products: [],\n results: [],\n emailDocs: [], //for emailing\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs,\n savedDocsOnly: null, //is saved docs only checked?\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n shareAll: false,\n query: null, //search query\n // store: store\n class: 'documentation',\n trackingType: 'document'\n },\n isLoading: null\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.documentId;\n },\n pageRange: function() {\n if (this.data.totalResults > 10) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n page: function() {\n return this.data.currentPage;\n },\n lang: function() {\n return store.state.currentLang;\n }\n },\n watch: {\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDocuments');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.addLoading();\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n // this.data.currentPage = 1; //reset page to 1\n this.data.emailDocs = [];\n \n // check for if brand is selected\n let brands = this.data.filters.filter(el => {\n return el.type == \"brand\";\n }).map(el => {\n return el.value;\n });\n\n if (brands.length > 0) {\n this.populateProducts(brands); \n } else {\n //if not brand selected, empty the products array\n this.data.products = []; \n // remove selected product filters\n this.data.filters.filter(el => {\n return el.type == \"product\"\n }).forEach(item => {\n this.removeFilter(this.data.class, item.value);\n });\n }\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n\n },\n page: function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n // this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n }\n \n },\n methods: {\n toggleFilters() {\n if (this.data.isMobile) {\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return; //abort if not documentation module\n }\n var type = type;\n var value = safeString(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1;\n\n if (checked) {\n if (type !== \"savedDocuments\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": label}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": label}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n }\n console.log(this.data.filters)\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) {\n return;\n }\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n populateProducts(brands) {\n let brandStr = decodeURIComponent(brands.join('|'));\n let apiUrl = `/api/GetDocumentProductsByBrand`;\n // let apiUrl = \"http://localhost:3003/productsByBrand\"; //from json-server\n let self = this;\n\n axios.get(apiUrl, {\n params: {\n brand: brandStr,\n lang: this.lang\n }\n })\n .then(function(response) {\n self.data.products = response.data.results; \n })\n .catch(function(error) {\n console.log(error);\n });\n },\n getUrl() {\n let savedParams = this.data.savedDocs.toString();\n let query= this.data.query;\n let productParams = this.data.filters.filter(item => {\n return item.type == \"product\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let langParams = this.data.filters.filter(item => {\n return item.type == \"lang\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let brandParams = this.data.filters.filter(item => {\n return item.type == \"brand\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let docTypeParams = this.data.filters.filter(item => {\n return item.type == \"docType\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return savedOnly.value;\n } else {\n return false;\n }\n }\n\n let pageParams = this.data.currentPage;\n this.data.urlParams = \"?\"\n if (query) {\n this.data.urlParams +=\"q=\"+encodeURIComponent(query);\n }\n this.data.urlParams += `${productParams !== \"\" ? \"&product=\" + productParams : \"\"}${langParams !== \"\" ? \"&lang=\" + langParams : \"\"}${brandParams !== \"\" ? \"&brand=\" + brandParams : \"\"}${docTypeParams !== \"\" ? \"&docType=\" + docTypeParams : \"\"}&savedDocuments=${savedDocumentsTrueParams()}&page=${pageParams}`;\n\n },\n\n didYouMean(e) {\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n let query;\n if (e.target) {\n query = e.target.innerText;\n } else {\n query = e;\n }\n this.data.query = query;\n\n document.querySelector('.hero-center__search-input').value = query;\n this.addLoading();\n this.getResults(e);\n },\n addLoading() {\n this.isLoading = true;\n\n let inputField = document.querySelector('.hero-center__search-input-container');\n if (inputField)\n inputField.classList.add('loading');\n },\n removeLoading() {\n this.isLoading = false;\n\n let inputField = document.querySelector('.hero-center__search-input-container');\n if (inputField)\n inputField.classList.remove('loading');\n },\n getResults(query) {\n\n this.data.query = query === null ? null : query ? query : this.data.query;\n this.data.currentPage = query ? 1 : this.data.currentPage;\n\n this.getUrl();\n let baseUrl = window.documentAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/documentation\"; //from json-server\n // let apiUrlTest = \"http://localhost:3003/documentationTest\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var product = [];\n var lang = [];\n var brand = [];\n var docType = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"product\":\n product.push(item.value);\n break;\n case \"lang\":\n lang.push(item.value);\n break;\n case \"brand\":\n brand.push(item.value);\n break;\n case \"docType\":\n docType.push(item.value);\n break;\n default:\n return;\n }\n });\n\n let productStr = decodeURIComponent(product.join('|'));\n let langStr = decodeURIComponent(lang.join('|'));\n let brandStr = decodeURIComponent(brand.join('|'));\n let docTypeStr = decodeURIComponent(docType.join('|'));\n\n let axiosParams = {\n q: this.data.query ? this.data.query : null,\n saved: (this.data.savedDocs.join('|')) == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'), //@TODO make this less insane. Send NULL if empty string. Remove leading comma if present.\n product: productStr == \"\" ? null : productStr,\n language: langStr == \"\" ? null : langStr,\n brand: brandStr == \"\" ? null : brandStr,\n docType: docTypeStr == \"\" ? null : docTypeStr,\n savedDocuments: savedDocumentsTrueParams(),\n page: this.data.currentPage,\n }\n\n var searchTerm = this.data.query;\n\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n ///\n /// Did you mean query logic from episerver find:\n ///\n let didyoumeanEl, didyoumeanContainer;\n if (response.data.results.length == 0) {\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n \n }\n else {\n\n didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n }\n\n if (response.data.didYouMean && response.data.didYouMean.length > 0) \n {\n let allElements = [];\n response.data.didYouMean.forEach(dym => {\n let anchorElement = document.createElement('a');\n anchorElement.href=\"#\";\n anchorElement.innerText = dym;\n anchorElement.addEventListener(\"click\", function (e) {\n e.stopPropagation();\n self.didYouMean(anchorElement.innerText);\n });\n allElements.push(anchorElement);\n });\n\n //clear out all previous elements\n didyoumeanEl.forEach(parent => {\n while (parent.firstChild) {\n parent.removeChild(parent.firstChild);\n }\n });\n \n for (let i = 0; i el.append(allElements[i]));\n if (i + 1 < allElements.length) {\n var commaEl = document.createElement('span');\n commaEl.style.paddingLeft = \"7px\";\n didyoumeanEl.forEach(el => el.append(commaEl));\n }\n } \n didyoumeanContainer.forEach(element => element.classList.add('show'));\n\n } else {\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n }\n ///\n /// End of did you mean query logic\n ///\n\n // GTM TAGGING\n if (searchTerm && searchTerm.length > 0 && \n window.dataLayer[window.dataLayer.length-1].event != \"search-results\" // hack to avoid double entry. this runs twice for some reason\n ) { // only push if this is a query, not a filter\n window.dataLayer.push( {\n event: \"search-results\",\n type: \"documentation\",\n category: \"Search\",\n action: searchTerm,\n label: response.data.totalResults,\n });\n }\n\n // SET RESULTS\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults;\n self.data.shownResults = response.data.results.length;\n self.data.trackId = response.data.trackId;\n self.removeLoading();\n\n })\n .catch(function(error) {\n console.log(error);\n self.removeLoading();\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n\n EventBus.$emit('scroll-to-top', this.data.class);\n this.addLoading();\n this.getResults();\n },\n updateEmailDocs(data) {\n let item = this.data.emailDocs.find(item => {\n return item.id == data.id;\n });\n\n if (!item) {\n this.data.emailDocs = [...this.data.emailDocs, data];\n } else {\n this.data.emailDocs.splice(this.data.emailDocs.indexOf(item),1);\n }\n },\n //update history record when filters change\n updateHistory() {\n this.getUrl();\n let url = `${window.location.pathname}${this.data.urlParams}`;\n history.pushState(\"\",\"\",url);\n },\n // handle deep linking on history change\n deeplink() {\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n\n\n let params = window.location.search.substr(1).split(\"&\").filter(item => {\n return item != \"\"\n });\n\n var initFilters = [];\n let page;\n\n params.forEach(param => {\n let type = param.slice(0, param.indexOf('='));\n let content = param.slice(param.indexOf('=') + 1);\n\n let entry = {}\n if (type == \"page\") {\n page = parseInt(content);\n } else if (type == \"savedDocuments\") {\n if (content == \"false\" || content == false) {\n return;\n } else {\n entry = {\n \"type\": type,\n \"value\": true,\n \"name\": this.data.savedDocsLabel\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n } else if (content.indexOf(',') > -1) {\n let contentArray = content.split(',');\n contentArray.forEach(item => {\n entry = {\n \"type\": type,\n \"value\": item,\n \"name\": decodeURIComponent(item)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n });\n } else if (type.toLocaleLowerCase() == \"manuals\") {\n entry = {\n \"type\": \"docType\",\n \"value\": \"Manuals%20%26%20Guides\",\n \"name\": \"Manuals & Guides\"\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n else if (type.toLocaleLowerCase() != \"manuals\") {\n entry = {\n \"type\": type,\n \"value\": content,\n \"name\": decodeURIComponent(content)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n\n this.data.filters = initFilters;\n });\n\n if (page)\n this.data.currentPage = page;\n\n },\n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.documentation__area-cards').getBoundingClientRect().top + window.scrollY - 100;\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n this.data.totalPages = Math.ceil(this.data.totalResults / 10);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n init() {\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.documentId[0] == \"\" ? store.state.favorites.documentId.slice(1) : store.state.favorites.documentId;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n \n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n this.addLoading();\n this.getResults();\n });\n EventBus.$on('email-docs', (data) => {\n this.updateEmailDocs(data);\n });\n EventBus.$on('internal-search', (value, type) => {\n if (type == \"documentation\") {\n //this.updateHistory(value);\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n this.addLoading();\n this.getResults(value);\n }\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n\n // init results\n this.data.results = window.initialDocumentationApiResults.results;\n this.data.totalResults = window.initialDocumentationApiResults.totalResults;\n this.data.shownResults = window.initialDocumentationApiResults.results.length;\n // this.data.results = fpodb.documentation.results;\n // this.data.totalResults = fpodb.documentation.totalResults;\n // this.data.shownResults = fpodb.documentation.results.length;\n \n // hide filters if less then 10 initial results\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true;\n\n // enable \"share all\" if 5 of less results\n this.data.shareAll = parseInt(this.data.totalResults) <= 5 ? true : false;\n window.onpopstate = () => {\n this.deeplink();\n }\n\n if (window.manualsAndGuidesFilter && window.hasManuals) {\n this.data.filters = [...this.data.filters, {\"value\": window.manualsAndGuidesFilterValue, \"type\": \"docType\", \"name\": window.manualsAndGuidesFilterName}];\n }\n }\n },\n mounted() {\n this.init();\n this.initPages();\n // for deeplinking\n // if (window.location.search) {\n // this.$nextTick(() => {\n // this.deeplink();\n // });\n // }\n },\n });\n\n Vue.component('doc-products', {\n props: ['data', 'category'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n components: {\n 'checkbox-item': Checkbox\n },\n template: `\n
\n \n
\n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n \n // results list\n Vue.component('doc-results-list', {\n props: ['data', 'isLoading'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n template: `\n
\n \n
\n `,\n methods: {\n isSelected(result){\n return this.data.emailDocs.find(i => i.id == result.id) !== undefined;\n }\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('doc-results-item', {\n props: ['data', 'content', 'isSelected', 'isLoading'],\n data: function() {\n return {\n isChecked: this.isSelected,\n isBookmarked: false,\n id: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.documentId;\n },\n encodedUrl: function() {\n return encodeURIComponent(this.content.url);\n },\n newTabLink: function() {\n return this.content.url ? this.content.url.replace('download=true', 'download=false') : null;\n },\n tagMetaBody: function() {\n return JSON.stringify({\n \"type\": \"document\", \n \"category\": this.content.eyebrow.split(\"|\")[0].trim(),\n \"label\": this.content.name, \n \"productLine\": this.content.details, \n \"language\": this.content.language,\n \"documentId\": this.content.documentId\n })\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"data.emailDocs\": function() {\n if(this.data.emailDocs.length === 0){\n this.isChecked = false;\n }\n },\n \"content\": function() {\n // update id when content changes\n this.$nextTick(() => {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n })\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n template: `\n
\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
\n {{content.eyebrow}}\n \\{{moreContent}} \n \\{{seeAllLabel}}\n
\n \n {{content.name}}\n \n \n
\n
\n \n \n \n
\n
\n \n
\n
\n
\n `,\n methods: {\n emailDoc() {\n EventBus.$emit('email-docs', {\"name\": this.content.name, \"url\": this.content.url, \"id\": this.content.id});\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"documentId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n //let details = this.$refs.seeAllContent.innerHTML.split(/[,;]+/);\n let details = this.$refs.seeAllContent.innerHTML.replace(\" ; \", \", \").split(/[,]+/);\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join().replace(/ ,/g, ',');;\n let moreDetails = details.slice(3).join().replace(/ ,/g, ',');\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n this.initSeeAll();\n\n let self = this;\n this.$nextTick(() => {\n let trackId = self.data.trackId;\n\n if (trackId) {\n let hitId = self.content.hitId;\n let query = self.data.query;\n let url = `/api/SearchHit?q=${encodeURIComponent(query)}&h=${encodeURIComponent(hitId)}&t=${encodeURIComponent(trackId)}`\n let allAnchors = self.$el.querySelectorAll('a');\n allAnchors.forEach(el => el.addEventListener('click', (e) => \n axios.get(url)\n .then(function(response) {\n })\n ));\n }\n });\n\n }\n });\n\n Vue.component('email-docs', {\n props: ['data'],\n data: function() {\n return {\n mailto: null,\n // mailtoAll: null\n }\n },\n watch: {\n \"data.emailDocs\": function() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.data.emailDocs.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${encodeURIComponent(item.url)}%0D%0A`;\n });\n this.mailto = mailto;\n }\n },\n methods: {\n // shareAll() {\n // let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n // this.data.results.forEach(item => {\n // mailto = `${mailto}${item.name}: ${item.url}%0D%0A`;\n // });\n // this.mailtoAll = mailto;\n // }\n },\n mounted() {\n // if (parseInt(this.data.totalResults) <= 5) {\n // this.shareAll();\n // }\n }\n });\n\n new Vue({\n el: `.documentation-${id}`,\n store: store\n }).$mount(`.documentation-${id}`, true);\n }\n\n if (documentation.length > 0) {\n documentation.forEach((item, index) => {\n item.classList.add(`documentation-${index}`);\n documentationConstructor(index);\n })\n }\n\n // window.seeLessLabel = \"see less\";\n // window.seeAllLabel = \"see more\";\n\n}\n\nexport default Documentation;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus';\nimport store from './store';\nimport {pardotFormInstance} from \"./pardot-form\";\n\nconst Drawer = () => {\n const drawers = document.querySelectorAll('.drawer__wrapper');\n \n let drawerConstructor = (id) => {\n // main component wrapper\n Vue.component('drawer-template', {\n data: function() {\n return {\n activeTab: '',\n isMobile: store.state.isMobile,\n store: store\n }\n },\n computed: {\n mobileState: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n mobileState: function() {\n this.isMobile = this.mobileState;\n }\n },\n methods: {\n setActiveTab(e) {\n this.activeTab = e;\n },\n handleTab(e) {\n let tabTarget = e.currentTarget.dataset.target;\n \n if (tabTarget !== this.activeTab) {\n // console.log(\"derp\");\n this.setActiveTab(tabTarget);\n this.$el.querySelector('.drawer__tab-item.active').classList.remove('active');\n \n this.$el.querySelector(`[data-target=${tabTarget}]`).classList.add('active');\n }\n },\n setResponsive() {\n\n if (!isMobile) {\n // remove inline styles from accordions\n let accordionContainers = this.$el.querySelectorAll('.drawer__drawer-content-container');\n accordionContainers.forEach((item) => {\n item.style = null;\n });\n }\n },\n // set the first tab to active\n initDesktop() {\n\n if (this.isMobile) { //under 768px\n } else { //over 768px\n // if desktop, check for desktop buttons and set initial tab\n let initial = this.$el.querySelector('[data-target]').dataset.target;\n this.activeTab = initial;\n this.$el.querySelector('[data-target]').classList.add('active');\n }\n }\n },\n mounted() {\n // console.log(store.state.isMobile);\n this.initDesktop(); //set the first tab to active on init\n //listen for child click events on the labels and pass targets to parent\n EventBus.$on('handle-mobile', (e) => {\n this.setActiveTab(e);\n })\n EventBus.$on('handle-desktop', (e) => {\n this.setActiveTab(e);\n })\n }\n });\n\n // desktop labels\n Vue.component('drawer-tab-label', {\n props: ['activeTab', 'isMobile'],\n data: function() {\n return {\n tabTarget: '',\n isActive: false\n }\n },\n watch: {\n activeTab: function() {\n this.isActive = this.activeTab == this.tabTarget ? true : false;\n }\n },\n methods: {\n handleTab(e) {\n EventBus.$emit('handle-desktop', this.tabTarget);\n }\n },\n mounted() {\n this.tabTarget = this.$el.dataset.target;\n }\n });\n\n // mobile accordion containers & labels\n Vue.component('drawer-content-template', {\n props: ['activeTab', 'isMobile'], //active tab \n data: function() {\n return {\n tabName: '',\n isActive: false, //is current tab the selected tab 'activeTab'\n isOpen: false, //is tab open\n }\n },\n watch: {\n activeTab: function(tab) {\n this.isActive = this.tabName == tab ? true : false;\n },\n isActive: function() {\n if (!this.isActive) {\n this.isOpen = false; //set accodion to close when not the active item\n\n // close the accordion\n if (this.isMobile) {\n\n let contentArea = this.$el.querySelector('.drawer__drawer-content-container');\n let contentHeight = this.$el.querySelector('.drawer__drawer-content-inner').getBoundingClientRect().height;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n this.scrollToTop();\n }\n } else {\n // if this is the active tab, set isOpen to true when isActive is true to pre open the tab on mobile\n this.isOpen = true;\n }\n }\n },\n methods: {\n handleMobile(e) {\n let mobileTarget = e.currentTarget.parentNode.dataset.tabId;\n\n EventBus.$emit('handle-mobile', mobileTarget);\n\n if (this.isMobile) {\n // toggle the accordion\n this.handleAccordion(e);\n }\n },\n // toggle accordions\n handleAccordion(e) {\n let contentArea = this.$el.querySelector('.drawer__drawer-content-container');\n let contentHeight = this.$el.querySelector('.drawer__drawer-content-inner').getBoundingClientRect().height;\n\n if (this.isOpen == true) {\n this.isOpen = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isOpen = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n scrollToTop() {\n let elmOffset = this.$el.offsetTop;\n let scrollOffset = window.scrollY;\n // console.log(\"el\",elmOffset);\n // console.log(\"window\",scrollOffset);\n if (elmOffset < scrollOffset) {\n let elmPos = this.$el.getBoundingClientRect().top + window.scrollY;\n setTimeout(function() {\n window.scrollTo({\n top: (elmPos - 70),\n behavior: 'smooth'\n });\n },500);\n }\n },\n\n initMobile() {\n if (this.isMobile) {\n // console.log(\"is mobile\");\n } else {\n // console.log(\"not mobile\");\n\n // remove all inline styles for accordions on desktop\n let contentContainers = this.$el.querySelectorAll('.drawer__drawer-content-container');\n contentContainers.forEach((item) => {\n item.style = ''\n });\n } \n }\n },\n mounted() {\n var initialTab = this.$el.dataset.tabId;\n this.tabName = initialTab;\n this.initMobile();\n }\n });\n\n // import pardot form component instance\n pardotFormInstance;\n\n new Vue({\n el: `.drawer-${id}`,\n store: store\n }).$mount(`.drawer-${id}`, true);\n }\n\n if (drawers.length > 0) {\n drawers.forEach((item, index) => {\n item.classList.add(`drawer-${index}`);\n drawerConstructor(index);\n })\n }\n}\n\nexport default Drawer;","import Vue from 'vue/dist/vue.min.js';\n\nconst EventBus = new Vue();\n\nexport default EventBus;","/*\n Fetcher is a decorator function to add the Vue Fetcher component.\n * Arguments:\n - {Object} options\n - {Object} conf\n * Usage:\n The 'options' argument is the same configuration for a Vue Component. in addition, the next options:\n\n - name [string]: name used for Fetcher component in Vue. (by default is 'fetch'. Remember considering the prefix option.)\n\n in the 'conf' argument you can provide the next options:\n\n - fetchOnCreated [boolean]: by default is 'true', if the value is 'true' this will do a call for fetching from the start\n - fetchOnUpdateParams [boolean]: by default is 'true', if the value is 'true' this will do a call for fetching when the params are updated\n - fetchOnUpdatePostData [boolean]: by default is 'true', if the value is 'true' this will do a call for fetching when the 'post data' object is updated\n - url [string]: is the server URL that will be used for the request\n - method [string]: by default is 'GET', is the request method to be used when making the request\n - fetchOptions [object]: is the Axios config (https://github.com/axios/axios)\n - debounceWait [integer]: time to wait between every call to the fetch function, it uses for changes in fields for voiding multiple calls to the API when the user is typing ( time in milliseconds. by default: 500 milliseconds)\n\n Just Props:\n\n - url-prop [string]: replace the url option\n - method-prop [string]: replace the method option\n - fetch-on-created-prop [boolean]: replace the fetchOnCreated option\n - fetch-on-update-post-data-prop [boolean]: replace the fetchOnUpdatePostData option\n - fetch-on-update-params-prop [boolean]: replace the fetchOnUpdateParamsData option\n\n Methods:\n\n fetch(successFunc [function], options [Object]): you can call the fetch function for doing a call to the service or API. also you can pass the successFunc function for altering process by default when the response is successful, and the second parameter is for changing or modifying the Axios config (https://github.com/axios/axios)\n\n Others:\n\n Params ('params'): is an object with GET parameters for the request, you can use it as an object in the Vue Data (with v-model or as Vue variable).\n\n Post Data ('postData'): is an object with POST data parameters for the request, you can use it as an object in the Vue Data (with v-model or as Vue variable).\n\n*/\nimport axios from 'axios';\nimport { debounce } from 'lib/misc';\n\nconst fetcher = ({name = 'fetch', props, data: dataProp, created, watch, methods, ...options}, conf = {}) => {\n const {\n fetchOnCreated = true,\n fetchOnUpdatePostData = true,\n fetchOnUpdateParams = true,\n url,\n method = 'GET',\n fetchOptions: _fetchOptions = {},\n fetchTrigger,\n debounceWait = 500\n } = conf;\n\n const { data: postData = {}, params = {}, fetchOptions } = _fetchOptions;\n\n return {\n name,\n props: {\n urlProp: String,\n methodProp: String,\n fetchOnCreatedProp: { type: Boolean, default: undefined },\n fetchOnUpdatePostDataProp: { type: Boolean, default: undefined },\n fetchOnUpdateParamsProp: { type: Boolean, default: undefined },\n ...props\n },\n data: function() {\n const _dataProp = dataProp && dataProp.call(this);\n let data = {\n url: this.urlProp || url,\n method: this.methodProp || method,\n fetchOptions,\n fetchOnCreated,\n fetchOnUpdateParams,\n fetchOnUpdatePostData,\n fetchTrigger: this.fetchTriggerProp || fetchTrigger,\n data: null,\n params,\n postData,\n ..._dataProp,\n };\n\n if (this.fetchOnCreatedProp !== undefined) {\n data.fetchOnCreated = this.fetchOnCreatedProp;\n }\n\n if (this.fetchOnUpdateParamsProp !== undefined) {\n data.fetchOnUpdateParams = this.fetchOnUpdateParamsProp;\n }\n\n if (this.fetchOnUpdatePostDataProp !== undefined) {\n data.fetchOnUpdatePostData = this.fetchOnUpdatePostDataProp;\n }\n\n return data;\n },\n created: function() {\n created && created.call(this);\n if (this.fetchOnCreated) {\n this.fetch();\n }\n },\n watch: {\n params:{\n handler: function() {\n if (this.fetchOnUpdateParams) {\n this.debounceFetch();\n }\n },\n deep: true\n },\n postData: {\n handler: function() {\n if (this.fetchOnUpdatePostData) {\n this.debounceFetch();\n }\n },\n deep: true\n },\n ...watch\n },\n methods: {\n debounceFetch: debounce(function(){ this.fetch() }, debounceWait),\n fetch: function(successFunc, options) {\n const _this = this;\n\n if (this.url || this.fetchOptions) {\n return axios({\n url: this.url,\n method: this.method,\n params: this.params,\n data: this.postData,\n ...this.fetchOptions,\n ...options\n }).then(function (response) {\n if (!successFunc || successFunc(response)){\n _this.data = response.data;\n }\n });\n }\n },\n ...methods\n },\n ...options\n }\n};\n\nexport default fetcher;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus';\n\nexport const Checkbox = {\n props: ['data', 'label', 'value', 'type', 'category'],\n data: function() {\n return {\n id: null,\n isChecked: false,\n }\n },\n // template for product checkboxes only\n // static checkboxes are inline templates \n template: `\n
\n \n
\n `,\n watch: {\n \"data.filters\": function() {\n this.checkState();\n },\n \"data.products\": function() {\n this.checkProductState();\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": this.data.trackingType, \n \"action\": this.category || null, \n \"label\": decodeURIComponent(this.id)\n })\n }\n },\n methods: {\n updateFilters(el, e, type) {\n EventBus.$emit('updateFilters', el, e, type);\n },\n checkState() {\n let item = this.data.filters.find(el => {\n return el.value == this.id;\n });\n this.isChecked = item ? true : false;\n },\n checkProductState() {\n if (this.type === \"product\") {\n // console.log(\"is product\");\n let item = this.data.filters.find(el => {\n // console.log(\"el\", el.value);\n // console.log(\"id\", this.id);\n return el.value == this.id;\n });\n this.isChecked = item ? true : false;\n // console.log(this.isChecked);\n }\n }\n },\n mounted() {\n this.id = encodeURIComponent(this.$refs.input.value);\n // this.category = null;\n this.checkState();\n // if has saved docs filter, get the label\n if (this.$refs.input.dataset.savedLabel) {\n this.data.savedDocsLabel = this.$refs.input.dataset.savedLabel;\n }\n }\n};\n\nexport const Accordion = {\n props: ['data', 'defaultopen'],\n components: {\n 'checkbox-item': Checkbox\n }, \n data: function() {\n return {\n isOpen: (this.defaultopen ? true : false), //is the accordion open\n isTruncated: null, //is accordion content truncated \n openText: null,\n closeText: null,\n seeAllTypesText: false\n }\n },\n watch: {\n isTruncated: function() {\n if (this.isTruncated == true) {\n this.openText = this.$refs.expandText.dataset.expandText;\n this.closeText = this.$refs.expandText.dataset.collapseText;\n }\n },\n \"data.products\": {\n deep: true,\n handler() {\n this.$nextTick(() => {\n /*\n this.isTruncated = this.data.products.length > 0 ? this.isTruncated : null;\n if (this.$el.querySelector('.checkbox:nth-of-type(6)')) {\n this.toggleTruncation(true);\n } else {\n this.isTruncated = null;\n }\n */\n }); \n }\n }\n },\n methods: {\n handleClick() {\n this.toggleAccordion();\n },\n\n toggleAccordion() {\n let contentArea = this.$refs.outerContainer;\n let contentHeight = this.$refs.innerContainer.getBoundingClientRect().height;\n\n if (this.isOpen == true) {\n this.isOpen = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isOpen = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n toggleSeeAll() {\n this.seeAllTypesText = !this.seeAllTypesText\n },\n toggleTruncation(state) {\n return;\n // console.log(\"truncate this\");\n if (state) {\n this.isTruncated = state;\n } else {\n this.isTruncated = this.isTruncated == null ? true : !this.isTruncated;\n }\n\n var truncHeight = 0;\n let container = this.$refs.innerContainer;\n\n const truncate = () => {\n for (let i = 1; i < 6; i++) {\n let el = this.$el.querySelector(`.checkbox:nth-of-type(${i})`);\n let itemHeight = el.getBoundingClientRect().height;\n let elStyles = window.getComputedStyle(el);\n let itemMargin = parseFloat(elStyles.marginBottom);\n\n truncHeight = truncHeight + itemHeight + itemMargin;\n }\n truncHeight = truncHeight + 5; //little bit of wiggleroom\n }\n\n truncate();\n\n if (this.isTruncated == true) {\n container.style.maxHeight = truncHeight + \"px\";\n } else {\n container.style.maxHeight = 'none';\n }\n },\n },\n mounted() {\n \n }\n};\n\nexport const SelectedFiltersComponent = {\n props: ['data'],\n data: function() {\n return {\n }\n },\n computed: {\n className: function() {\n return `${this.data.class}__selected-filters`;\n } \n },\n template: `\n
\n
\n
\n \n {{filter.name}}\n
\n
\n
\n `,\n methods: {\n removeFilter(e) {\n let type = e.currentTarget.dataset.type;\n let value = e.currentTarget.dataset.value;\n EventBus.$emit('remove-filter', this.data.class, value, type);\n }\n },\n mounted() {\n \n }\n};\n\nexport const PageNum = {\n props: ['data', 'num'],\n data: function() {\n return {\n page: null,\n isActive: false,\n isSpacer: false\n }\n },\n watch: {\n \"data.currentPage\": function() {\n this.isActive = this.data.currentPage == this.num ? true : false;\n }\n },\n template: `\n {{num}}\n `,\n methods: {\n changePageTo(num) {\n if(num !== \"...\") {\n EventBus.$emit('change-page-to', this.data.class, num);\n EventBus.$emit('scroll-to-top', this.data.class);\n } else {\n return;\n }\n },\n },\n mounted() {\n this.isActive = this.data.currentPage == this.num ? true : false;\n }\n};\n\nexport const Pagination = {\n props: ['data'],\n data: function() {\n return {\n pageNums: [],\n }\n },\n computed: {\n className: function() {\n return `${this.data.class}__pagination-nums`;\n }\n }, \n components: {\n 'page-num': PageNum\n },\n watch: {\n \"data.currentPage\": function() {\n this.pageNums = [];\n this.initPages();\n if (this.data.currentPage > this.data.totalPages) {\n EventBus.$emit('change-page-to', this.data.class, 1);\n }\n },\n \"data.totalPages\": function() {\n this.pageNums = [];\n this.initPages();\n EventBus.$emit('change-page-to', this.data.class, 1);\n }\n },\n template: `\n
\n \n
\n `,\n methods: {\n initPages() {\n if (this.data.totalPages <= 6) {\n // if less than 6 pages, list all pages\n for(let page = 1; page < this.data.totalPages + 1; page++) {\n this.pageNums.push(page);\n }\n } else {\n if(this.data.currentPage > this.data.totalPages - 6) {\n // on the last 6 pages, do not add ellipsis\n for(let page = this.data.totalPages - 5; page < this.data.currentPage + 6 && page < this.data.totalPages + 1; page++) {\n this.pageNums.push(page);\n // console.log(page);\n } \n } else {\n // if not on the last 6 pages, add ellpisis\n for(let page = this.data.currentPage; page < this.data.currentPage + 3 && page < this.data.totalPages - 1; page++) {\n this.pageNums.push(page);\n }\n this.pageNums.push(\"...\");\n for(let page = this.data.totalPages - 1; page < this.data.totalPages + 1; page++) {\n this.pageNums.push(page);\n }\n }\n }\n }\n },\n mounted() {\n this.initPages();\n }\n};\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst FooterUnits = () => {\n\n let footerUnits = document.querySelector('.footer__units-container');\n\n let FooterUnitsConstructor = () => {\n Vue.component('footer-unit-toggler', {\n data: function() {\n return {\n selectedUnit: store.state.units,\n selectedUnitText: null\n }\n },\n computed: {\n units: function() {\n return store.state.units;\n },\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"cta\",\n \"category\": \"Preference\",\n \"action\": \"Unit of measure\",\n \"label\": this.selectedUnitText\n })\n }\n },\n watch: {\n units: function() {\n this.selectedUnit = this.units;\n this.setTags();\n }\n },\n methods: {\n handleChange(e) {\n store.commit('setUnits', e.target.value);\n this.setWidth();\n },\n setTags() {\n let select = this.$refs.select;\n // console.log(select);\n let selectedText = select.options[select.selectedIndex] ? select.options[select.selectedIndex].text : null;\n this.selectedUnitText = selectedText;\n },\n initTags() {\n let text = this.$el.querySelector(`option[value=\"${store.state.units}\"]`) ? this.$el.querySelector(`option[value=\"${store.state.units}\"]`).innerText : null;\n this.selectedUnitText = text;\n },\n setWidth() {\n let select = this.$refs.select;\n let selectedText = select.options[select.selectedIndex].text;\n let width = `${(selectedText.length / 2) + 2}em`; //assumes each chara is ~.5em width, +2em buffer\n select.style.maxWidth = width;\n }\n },\n mounted() {\n this.$nextTick(() => {\n this.initTags();\n this.setWidth();\n })\n this.setTags();\n }\n });\n\n Vue.component('footer-lang-toggler', {\n data: function() {\n return {\n selectedLang: store.state.currentLang,\n selectedLangText: null,\n languages: [],\n store: store\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"cta\",\n \"category\": \"Preference\",\n \"action\": \"Language\",\n \"label\": this.selectedLangText\n })\n }\n },\n watch: {\n \n },\n methods: {\n handleChange(e) {\n let url = e.target.value;\n let el = this.$refs.select;\n let lang = el.options[el.selectedIndex].dataset.lang;\n if (lang) {\n document.cookie = `selectedLanguage=${lang}; path=/; max-age=31536000;`;\n }\n this.setWidth();\n window.location.href = url;\n },\n setTags() {\n let text = this.$el.querySelector(`option[value=\"${store.state.currentLang}\"]`) ? this.$el.querySelector(`option[value=\"${store.state.currentLang}\"]`).innerText : null;\n this.selectedLangText = text;\n },\n setWidth() {\n let select = this.$refs.select;\n let selectedText = select.options[select.selectedIndex].text;\n let width = `${(selectedText.length / 2) + 2}em`;//assumes each chara is ~.5em width, +2em buffer\n select.style.maxWidth = width;\n }\n\n },\n mounted() {\n this.setTags();\n this.$nextTick(() => {\n this.setWidth();\n });\n }\n });\n\n new Vue({\n el: `.footer__units-container`,\n }).$mount(`.footer__units-container`, true);\n }\n\n if (footerUnits) {\n FooterUnitsConstructor();\n }\n\n}\n\nexport default FooterUnits;","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {videoModal} from './modals';\n\nconst FWMedia = () => {\n\n let media = document.querySelectorAll('.fw-media--video');\n Vue.use(VModal);\n\n let mediaConstructor = (id) => {\n Vue.component('fw-media-template', {\n data: function() {\n return {\n videoUrl: '',\n videoName: null\n }\n },\n methods: {\n launchVideo() {\n // console.log(\"clicked\");\n this.$modal.show(\n videoModal.template(this.videoUrl, this.videoName),\n videoModal.name,\n videoModal.options\n )\n }\n },\n mounted() {\n this.videoUrl = this.$el.querySelector('.fw-media__play-button').dataset.videoUrl;\n this.videoName = this.$refs.name ? this.$refs.name.innerHTML : null;\n }\n });\n \n new Vue({\n el: `.fw-media-video-${id}`,\n }).$mount(`.fw-media-video-${id}`, true);\n }\n\n if (media.length > 0) {\n media.forEach((item, index) => {\n item.classList.add(`fw-media-video-${index}`);\n mediaConstructor(index);\n })\n }\n}\n\nexport default FWMedia;","/* \nAllows for inline text links to trigger vue modals with any content\n*/\n\nimport Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {genericModal} from './modals';\n\nVue.use(VModal);\n\nconst genericModals = () => {\n let instance = new Vue({\n methods: {\n triggerModal(content) {\n this.$modal.show(\n genericModal.template(content),\n genericModal.name, \n genericModal.options,\n genericModal.events\n )\n }\n },\n });\n\n let modalData = [];\n\n document.querySelectorAll('.gen-modal').forEach((item) => {\n let data = {\n \"hashtag\": item.dataset.hashtag,\n \"content\": item.innerHTML\n }\n modalData.push(data);\n });\n\n if (modalData) {\n document.addEventListener('click', (e) => {\n if (e.target.getAttribute('href')) {\n let target = e.target.getAttribute('href');\n \n for (let i=0; i < modalData.length; i++) {\n if (target.includes(`#${modalData[i].hashtag}`)) {\n e.preventDefault();\n \n instance.triggerModal(modalData[i].content);\n return false;\n } \n }\n }\n });\n }\n}\n\nexport default genericModals;","import Vue from 'vue/dist/vue.min.js';\nimport {specsTableTemplate} from './spec-table';\nimport EventBus from './event-bus';\nimport store from './store';\n\nconst HeroProduct = () => {\n\n const heros = document.querySelectorAll('.hero-products');\n\n const heroProductConstructor = (id) => {\n Vue.component('hero-product-template', {\n data: function() {\n return {\n sizeSelect: null,\n viewConfig: null,\n gallery: null,\n galleryItems: [],\n selectedImage: 1,\n selectedItem: null //product name for passing to child spec table component\n }\n },\n watch: {\n selectedImage: function() {\n\n },\n },\n methods: {\n init() {\n // assign unique ID to each gallery item\n // if multiple images, set gallery array\n if (this.$el.querySelectorAll('.hero-products__gallery-image').length > 1) {\n this.gallery = true;\n\n // push images and their heights to array\n this.$el.querySelectorAll('.hero-products__gallery-image').forEach((item, index) => {\n item.dataset.id = index + 1;\n // console.log(item.clientHeight);\n this.galleryItems.push({\n src: item.src,\n });\n });\n } else {\n // if only one image, set id to 1 (the default selected image id)\n this.$el.querySelector('.hero-products__gallery-image').dataset.id = 1;\n }\n\n this.selectedItem = this.$refs.title ? this.$refs.title.innerText : null;\n },\n handleImageSelect(id) {\n this.selectedImage = id;\n },\n },\n mounted() {\n this.init();\n // recieve selected gallery item from child\n EventBus.$on('selectedImage', (id) => {\n this.handleImageSelect(id);\n });\n }\n });\n\n Vue.component('hero-products-image', {\n props: ['selectedImage'],\n data: function() {\n return {\n id: null,\n isActive: false\n }\n },\n watch: {\n selectedImage: function() {\n this.isActive = this.selectedImage == this.id ? true : false;\n }\n },\n methods: {\n\n },\n mounted() {\n this.$nextTick(() => {\n this.id = this.$el.dataset.id;\n this.isActive = this.selectedImage == this.id ? true : false;\n });\n }\n });\n\n Vue.component('hero-products-thumbnails', {\n props: ['galleryItems', 'selectedImage'],\n data: function() {\n return {\n }\n },\n template: `\n \n `,\n methods: {\n\n },\n mounted() {\n\n }\n });\n\n Vue.component('hero-products-thumbnail-item', {\n props: ['image', 'id', 'selectedImage'],\n data: function() {\n return {\n isActive: false\n }\n },\n computed: {\n imageUrl: function() {\n return `url('${this.image}')`\n }\n },\n watch: {\n selectedImage: function() {\n this.isActive = this.selectedImage == this.id ? true : false ;\n }\n },\n template: `\n
  • \n `,\n methods: {\n selectImage() {\n // emit id of clicked element to parent\n EventBus.$emit('selectedImage', this.id);\n }\n },\n mounted() {\n this.isActive = this.selectedImage == this.id ? true : false ;\n }\n });\n\n new Vue({\n el: `.hero-products-${id}`,\n store: store\n }).$mount(`.hero-products-${id}`, true);\n }\n\n specsTableTemplate();\n\n if (heros.length > 0) {\n heros.forEach((item, index) => {\n item.classList.add(`hero-products-${index}`);\n heroProductConstructor(index);\n })\n }\n\n}\n\nexport default HeroProduct;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst homeHero = () => {\n\n const component = document.querySelector('.home-hero');\n\n let heroConstructor = () => {\n Vue.component('home-hero', {\n data: function() {\n return {\n selectedId: null\n }\n },\n mounted() {\n this.$on('select-section', (id) => {\n this.selectedId = id;\n });\n }\n });\n\n Vue.component('hero-section', {\n props: ['selectedId'],\n data: function() {\n return {\n isActive: false,\n isHovered: false,\n id: null\n }\n },\n watch: {\n selectedId: function() {\n this.isActive = this.selectedId == this.id ? true : false;\n },\n isHovered: function() {\n if (this.isHovered || this.isActive) {\n this.playVideo();\n } else {\n this.pauseVideo();\n }\n },\n isActive: function() {\n if (this.isActive) {\n this.playVideo();\n } else {\n this.pauseVideo();\n }\n }\n },\n methods: {\n toggleExpand() {\n this.$parent.$emit('select-section', this.isActive ? null : this.id);\n // this.isActive = !this.isActive;\n },\n mouseover() {\n // console.log(\"moused over\");\n this.isHovered = true;\n },\n mouseleave() {\n // console.log(\"mouse leave\");\n this.isHovered = false;\n },\n playVideo() {\n this.$refs.video.play();\n },\n pauseVideo() {\n this.$refs.video.pause();\n },\n init() {\n this.id = Array.from(document.querySelectorAll('.home-hero__area')).indexOf(this.$el);\n },\n },\n mounted() {\n this.init();\n }\n });\n\n new Vue({\n el: `.home-hero`,\n }).$mount(`.home-hero`, true);\n }\n\n if (component) {\n heroConstructor();\n }\n\n}\n\nexport default homeHero;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus';\nimport store from './store';\n\nexport const template = {\n data: function() {\n return {\n activeTab: '',\n isMobile: null\n }\n },\n methods: {\n setActiveTab(e) {\n this.activeTab = e;\n },\n handleTab(e) {\n let tabTarget = e.currentTarget.dataset.target;\n\n if (tabTarget !== this.activeTab) {\n // console.log(\"derp\");\n this.setActiveTab(tabTarget);\n this.$el.querySelector('.hiw__tab-item.active').classList.remove('active');\n\n this.$el.querySelector(`[data-target=${tabTarget}]`).classList.add('active');\n }\n },\n setResponsive(mql) {\n this.isMobile = mql.matches ? true : false;\n if (!this.isMobile) {\n // remove inline styles from accordions\n let accordionContainers = this.$el.querySelectorAll('.hiw__hiw-content-container');\n accordionContainers.forEach((item) => {\n item.style = null;\n });\n }\n },\n // set the first tab to active\n initDesktop() {\n // this is checking for a breakpoint *smaller* than\n // var isMobile in store.js\n var mql = window.matchMedia('(max-width: 650px)');\n this.isMobile = mql.matches ? true : false;\n\n mql.addEventListener('change',() => {\n this.setResponsive(mql);\n });\n \n\n if (this.isMobile) { //under 650px\n let initial = this.$el.querySelector('[data-target]') ? this.$el.querySelector('[data-target]').dataset.target : null;\n this.activeTab = initial;\n } else { //over 650px\n // if desktop, check for desktop buttons and set initial tab\n let initial = this.$el.querySelector('[data-target]') ? this.$el.querySelector('[data-target]').dataset.target : null;\n this.activeTab = initial;\n if (this.$el.querySelector('[data-target]')) {\n this.$el.querySelector('[data-target]').classList.add('active');\n }\n }\n }\n },\n mounted() {\n this.initDesktop(); //set the first tab to active on init\n //listen for child click events on the labels and pass targets to parent\n EventBus.$on('handle-mobile', (e) => {\n this.setActiveTab(e);\n })\n EventBus.$on('handle-desktop', (e) => {\n this.setActiveTab(e);\n })\n }\n};\n\nexport const tabLabel = {\n props: ['activeTab', 'isMobile'],\n data: function() {\n return {\n tabTarget: '',\n isActive: false,\n index: null,\n label: null\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Drawer\",\n \"action\": \"Open\",\n \"label\": this.label,\n \"no\": this.index < 10 ? `0${this.index}` : `${this.index}`\n });\n }\n },\n watch: {\n activeTab: function() {\n this.isActive = this.activeTab == this.tabTarget ? true : false;\n }\n },\n methods: {\n handleTab(e) {\n EventBus.$emit('handle-desktop', this.tabTarget);\n },\n init() {\n this.label = this.$el.innerText;\n // console.log()\n this.index = Array.prototype.slice.call(document.querySelectorAll('.hiw__tab-labels li')).indexOf(this.$el) + 1;\n },\n },\n mounted() {\n this.tabTarget = this.$el.dataset.target;\n this.init();\n }\n};\n\nexport const contentTemplate = {\n props: ['activeTab', 'isMobile'], //active tab\n data: function() {\n return {\n tabName: '',\n isActive: false, //is current tab the selected tab 'activeTab'\n isOpen: false, //is tab openm\n label: null,\n index: null\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Drawer\",\n \"action\": \"Open\",\n \"label\": this.label,\n \"no\": this.index < 10 ? `0${this.index}` : `${this.index}`\n });\n }\n },\n watch: {\n activeTab: function(tab) {\n this.isActive = this.tabName == tab ? true : false;\n },\n isActive: function() {\n if (!this.isActive) {\n this.isOpen = false; //set accodion to close when not the active item\n\n // close the accordion\n if (this.isMobile) {\n\n let contentArea = this.$el.querySelector('.hiw__hiw-content-container');\n let contentHeight = this.$el.querySelector('.hiw__hiw-content-inner').getBoundingClientRect().height;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n this.scrollToTop();\n }\n } else {\n // if this is the active tab, set isOpen to true when isActive is true to pre open the tab on mobile\n this.isOpen = true;\n }\n }\n },\n methods: {\n handleMobile(e) {\n let mobileTarget = e.currentTarget.parentNode.dataset.tabId;\n\n EventBus.$emit('handle-mobile', mobileTarget);\n\n if (this.isMobile) {\n // toggle the accordion\n this.handleAccordion(e);\n }\n },\n scrollToTop() {\n let elmOffset = this.$el.offsetTop;\n let scrollOffset = window.scrollY;\n if (elmOffset < scrollOffset) {\n let elmPos = this.$el.getBoundingClientRect().top + window.scrollY;\n setTimeout(function() {\n window.scrollTo({\n top: (elmPos - 70),\n behavior: 'smooth'\n });\n },500);\n }\n },\n // toggle accordions\n handleAccordion(e) {\n let contentArea = this.$el.querySelector('.hiw__hiw-content-container');\n let contentHeight = this.$el.querySelector('.hiw__hiw-content-inner').getBoundingClientRect().height;\n\n if (this.isOpen == true) {\n this.isOpen = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isOpen = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n\n initMobile() {\n if (this.isMobile) {\n // console.log(\"is mobile\");\n } else {\n // console.log(\"not mobile\");\n\n // remove all inline styles for accordions on desktop\n let contentContainers = this.$el.querySelectorAll('.hiw__hiw-content-container');\n contentContainers.forEach((item) => {\n item.style = ''\n });\n }\n },\n init() {\n this.index = Array.prototype.slice.call(document.querySelectorAll('.hiw__area-content .hiw__hiw-container')).indexOf(this.$el) + 1;\n this.label = Array.prototype.slice.call(document.querySelectorAll('.hiw__tab-labels li'))[(this.index - 1)].innerText;\n }\n },\n mounted() {\n var initialTab = this.$el.dataset.tabId;\n this.tabName = initialTab;\n this.initMobile();\n this.init();\n }\n};\n\n\nconst HowItWorks = () => {\n const instances = document.querySelectorAll('.hiw__wrapper');\n\n let hiwConstructor = (id) => {\n // main component wrapper\n Vue.component('hiw-template', template);\n\n // desktop labels\n Vue.component('hiw-tab-label', tabLabel);\n\n // mobile accordion containers & labels\n Vue.component('hiw-content-template', contentTemplate);\n\n new Vue({\n el: `.hiw-${id}`,\n store: store\n }).$mount(`.hiw-${id}`, true);\n }\n\n if (instances.length > 0) {\n instances.forEach((item, index) => {\n item.classList.add(`hiw-${index}`);\n hiwConstructor(index);\n })\n }\n}\n\nexport default HowItWorks;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus';\n\nconst internalSearch = () => {\n\n let searchBar = document.querySelectorAll('.hero-center__search');\n\n let internalSearchConstructor = (id) => {\n Vue.component('internal-search', {\n data: function() {\n return {\n value: null,\n type: null\n }\n },\n watch: {\n \"value\": function() {\n if (this.value == \"\") {\n //console.log(\"no value\")\n EventBus.$emit('internal-search', null, this.type);\n }\n }\n },\n methods: {\n handleSubmit(e, type) {\n let value = this.value;\n // console.log(value);\n // emit search query to documentation and software modules\n EventBus.$emit('internal-search', value, type);\n }\n },\n mounted() {\n this.type = this.$refs.form.dataset.type;\n }\n });\n\n new Vue({\n el: `.internal-search-${id}`,\n }).$mount(`.internal-search-${id}`, true);\n };\n\n if (searchBar.length > 0) {\n searchBar.forEach((item, index) => {\n item.classList.add(`internal-search-${index}`);\n internalSearchConstructor(index);\n })\n }\n\n}\n\nexport default internalSearch;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nconst safeString = (str) => {\n return encodeURIComponent(str);\n}\n\nconst Legal = () => {\n\n let legal = document.querySelectorAll('.legal');\n\n const legalConstructor = (id) => {\n Vue.component('legal-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n products: [],\n results: [],\n emailDocs: [], //for emailing\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs,\n savedDocsOnly: null, //is saved docs only checked?\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n shareAll: false,\n class: 'legal',\n trackingType: 'document'\n // store: store\n }\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.legalDocumentId;\n },\n pageRange: function() {\n if (this.data.totalResults > 10) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n page: function() {\n return this.data.currentPage;\n }\n },\n watch: {\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDocuments');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n // this.data.currentPage = 1; //reset page to 1\n this.data.emailDocs = [];\n \n // check for if brand is selected\n let brands = this.data.filters.filter(el => {\n return el.type == \"brand\";\n }).map(el => {\n return el.value;\n });\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n\n },\n page: function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n // this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n }\n \n },\n methods: {\n toggleFilters() {\n // console.log(\"clicked\");\n if (this.data.isMobile) {\n // console.log(\"is mobile\");\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return;\n }\n\n var type = type;\n var value = safeString(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1;\n // console.log(\"type\", type)\n // console.log(e);\n // console.log(\"value\", safeString(e.target.value));\n // console.log(\"checked\",e.target.checked);\n\n if (checked) {\n if (type !== \"savedDocuments\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": label}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": label}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) {return; }\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n \n getUrl() {\n let savedParams = this.data.savedDocs.toString();\n\n let certTypeParams = this.data.filters.filter(item => {\n return item.type == \"certType\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let langParams = this.data.filters.filter(item => {\n return item.type == \"lang\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let docTypeParams = this.data.filters.filter(item => {\n return item.type == \"docType\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let regionParams = this.data.filters.filter(item => {\n return item.type == \"region\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return savedOnly.value;\n } else {\n return false;\n }\n }\n\n let pageParams = this.data.currentPage;\n\n this.data.urlParams = `?${certTypeParams !== \"\" ? \"&certificationType=\" + certTypeParams : \"\"}${langParams !== \"\" ? \"&lang=\" + langParams : \"\"}${regionParams !== \"\" ? \"®ion=\" + regionParams : \"\"}${docTypeParams !== \"\" ? \"&docType=\" + docTypeParams : \"\"}&savedDocuments=${savedDocumentsTrueParams()}&page=${pageParams}`;\n\n },\n getResults(query) {\n // let apiUrl = \"api/documents?\";\n this.data.currentPage = query ? 1 : this.data.currentPage;\n this.getUrl();\n let baseUrl = window.legalAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/legal\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var certType = [];\n var lang = [];\n var region = [];\n var docType = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"certType\":\n certType.push(item.value);\n break;\n case \"lang\":\n lang.push(item.value);\n break;\n case \"region\":\n region.push(item.value);\n break;\n case \"docType\":\n docType.push(item.value);\n break;\n default:\n return;\n }\n });\n\n let certTypeStr = decodeURIComponent(certType.join('|'));\n let langStr = decodeURIComponent(lang.join('|'));\n let regionStr = decodeURIComponent(region.join('|'));\n let docTypeStr = decodeURIComponent(docType.join('|'));\n\n let axiosParams = {\n q: query ? query : null,\n saved: (this.data.savedDocs.join('|')) == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'), //@TODO make this less insane. Send NULL if empty string. Remove leading comma if present.\n certificationType: certTypeStr == \"\" ? null : certTypeStr,\n language: langStr == \"\" ? null : langStr,\n region: regionStr == \"\" ? null : regionStr,\n docType: docTypeStr == \"\" ? null : docTypeStr,\n savedDocuments: savedDocumentsTrueParams(),\n page: this.data.currentPage,\n }\n\n // console.log(axiosParams);\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults;\n self.data.shownResults = response.data.results.length;\n //console.log(response.data);\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n EventBus.$emit('scroll-to-top', this.data.class);\n this.getResults();\n },\n updateEmailDocs(data) {\n let item = this.data.emailDocs.find(item => {\n return item.id == data.id;\n });\n\n if (!item) {\n this.data.emailDocs = [...this.data.emailDocs, data];\n } else {\n this.data.emailDocs.splice(this.data.emailDocs.indexOf(item),1);\n }\n },\n //update history record when filters change\n updateHistory() {\n let url = `${window.location.pathname}${this.data.urlParams}`;\n history.pushState(\"\",\"\",url);\n },\n // handle deep linking on history change\n deeplink() {\n let params = window.location.search.substr(1).split(\"&\").filter(item => {\n return item != \"\"\n });\n // console.log(params);\n // this.data.filters = []; //clear filters array first\n\n var initFilters = [];\n let page;\n\n params.forEach(param => {\n let type = param.slice(0, param.indexOf('='));\n let content = param.slice(param.indexOf('=') + 1);\n // console.log(\"TYPE\",type);\n // console.log(\"CONTENT\", content);\n\n let entry = {}\n if (type == \"page\") {\n // console.log(\"PAGE\", parseInt(content));\n // this.data.currentPage = parseInt(content);\n page = parseInt(content);\n } else if (type == \"savedDocuments\") {\n if (content == \"false\" || content == false) {\n return;\n } else {\n entry = {\n \"type\": type,\n \"value\": true,\n \"name\": this.data.savedDocsLabel\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n } else if (content.indexOf(',') > -1) {\n let contentArray = content.split(',');\n contentArray.forEach(item => {\n entry = {\n \"type\": type,\n \"value\": item,\n \"name\": decodeURIComponent(item)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n });\n } else {\n entry = {\n \"type\": type,\n \"value\": content,\n \"name\": decodeURIComponent(content)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n\n this.data.filters = initFilters;\n // console.log(this.initFilters);\n\n });\n\n this.data.currentPage = page;\n\n },\n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.legal__area-cards').getBoundingClientRect().top + window.scrollY - 100;\n // console.log(top);\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n this.data.totalPages = Math.ceil(this.data.totalResults / 10);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n init() {\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.legalDocumentId[0] == \"\" ? store.state.favorites.legalDocumentId.slice(1) : store.state.favorites.legalDocumentId;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el ,value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n this.getResults();\n });\n EventBus.$on('email-docs', (data) => {\n this.updateEmailDocs(data);\n });\n EventBus.$on('internal-search', (value, type) => {\n if (type == \"documentation\") {\n this.getResults(value);\n }\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n // init results\n this.data.results = window.initialLegalApiResults.results;\n this.data.totalResults = window.initialLegalApiResults.totalResults;\n this.data.shownResults = window.initialLegalApiResults.results.length;\n // this.data.results = fpodb.legal.results;\n // this.data.totalResults = fpodb.legal.totalResults;\n // this.data.shownResults = fpodb.legal.results.length;\n\n\n // hide filters if less then 10 initial results\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true;\n\n // enable \"share all\" if 5 of less results\n this.data.shareAll = parseInt(this.data.totalResults) <= 5 ? true : false;\n // window.onpopstate = () => {\n // this.deeplink();\n // }\n }\n },\n mounted() {\n this.init();\n this.initPages();\n // for deeplinking\n if (window.location.search) {\n this.$nextTick(() => {\n this.deeplink();\n });\n }\n }\n });\n\n \n // results list\n Vue.component('legal-results-list', {\n props: ['data'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n isSelected(result){\n return this.data.emailDocs.find(i => i.id == result.id) !== undefined;\n }\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('legal-results-item', {\n props: ['data', 'content', 'isSelected'],\n data: function() {\n return {\n isChecked: this.isSelected,\n isBookmarked: false,\n id: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.legalDocumentId;\n },\n encodedUrl: function() {\n return encodeURIComponent(this.content.url);\n },\n newTabLink: function() {\n return this.content.url.replace('download=true', 'download=false');\n },\n tagMetaBody: function() {\n return JSON.stringify({\n \"type\": \"legalDocument\", \n \"category\": this.content.eyebrow, \n \"label\": this.content.name, \n \"language\": this.content.language\n })\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"data.emailDocs\": function() {\n if(this.data.emailDocs.length === 0){\n this.isChecked = false;\n }\n },\n \"content\": function() {\n // update id when content changes\n this.$nextTick(() => {\n // console.log(this.$refs.bookmark.dataset.documentId);\n this.id = this.$refs.bookmark.dataset.legalDocumentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n })\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n template: `\n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n {{content.eyebrow}}\n \n \n {{content.name}}\n \n \n {{content.details}} \\{{moreContent}} \\{{seeAllLabel}} | {{content.language}}\n \n
    \n
    \n \n \n \n
    \n
    \n \n
    \n
    \n
    \n `,\n methods: {\n emailDoc() {\n EventBus.$emit('email-docs', {\"name\": this.content.name, \"url\": this.content.url, \"id\": this.content.id});\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"legalDocumentId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.legalDocumentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n // console.log(\"saved\",this.saved);\n this.initSeeAll();\n }\n });\n\n Vue.component('email-docs', {\n props: ['data'],\n data: function() {\n return {\n mailto: null,\n // mailtoAll: null\n }\n },\n watch: {\n \"data.emailDocs\": function() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.data.emailDocs.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${encodeURIComponent(item.url)}%0D%0A`;\n });\n this.mailto = mailto;\n }\n },\n methods: {\n // shareAll() {\n // let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n // this.data.results.forEach(item => {\n // mailto = `${mailto}${item.name}: ${item.url}%0D%0A`;\n // });\n // this.mailtoAll = mailto;\n // }\n },\n mounted() {\n // if (parseInt(this.data.totalResults) <= 5) {\n // this.shareAll();\n // }\n }\n });\n\n new Vue({\n el: `.legal-${id}`,\n store: store\n }).$mount(`.legal-${id}`, true);\n }\n\n if (legal.length > 0) {\n legal.forEach((item, index) => {\n item.classList.add(`legal-${index}`);\n legalConstructor(index);\n })\n }\n\n window.seeLessLabel = \"see less\";\n window.seeAllLabel = \"see more\";\n\n}\n\nexport default Legal;\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport VModal from 'vue-js-modal';\nimport { instance } from \"./modal-trigger\";\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nVue.use(VModal);\n\nconst safeString = (str) => {\n return encodeURIComponent(str);\n}\n\nconst LitOrder = () => {\n\n let litOrder = document.querySelectorAll('.lit-order');\n\n const litOrderConstructor = (id) => {\n Vue.component('lit-order-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n products: [],\n results: [],\n emailDocs: [], //for emailing\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs,\n savedDocsOnly: null, //is saved docs only checked?\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n shareAll: false,\n query: null, //search query,\n store: store,\n selectedItems: null,\n cartContents: null,\n isSubmitted: false,\n modalTarget: null, //modal hash for lit order form\n class: 'lit-order',\n trackingType: 'document'\n }\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.documentId;\n },\n pageRange: function() {\n if (this.data.totalResults > 10) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n page: function() {\n return this.data.currentPage;\n },\n lang: function() {\n return store.state.currentLang;\n }\n },\n watch: {\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDocuments');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n // this.data.currentPage = 1; //reset page to 1\n this.data.emailDocs = [];\n \n // check for if brand is selected\n let brands = this.data.filters.filter(el => {\n return el.type == \"brand\";\n }).map(el => {\n return el.value;\n });\n\n if (brands.length > 0) {\n this.populateProducts(brands); \n } else {\n //if not brand selected, empty the products array\n this.data.products = []; \n // remove selected product filters\n this.data.filters.filter(el => {\n return el.type == \"product\"\n }).forEach(item => {\n this.removeFilter(this.data.class, item.value);\n });\n }\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n\n },\n page: function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n // this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n },\n \"data.emailDocs\": function() {\n store.commit('updateLitOrderCart', this.data.emailDocs); //store cart in store\n\n // construct data string for passing selected docs to pardot\n let itemsStr;\n \n this.data.emailDocs.forEach((item) => {\n let str = `DOCUMENT ID: ${item.partNumber} | DOCUMENT NAME: ${item.name} | QUANTITY: ${item.qty} | PRE-PUNCHED: ${item.prePunched == true ? \"yes\" : \"no\"}`;\n if (itemsStr) {\n itemsStr = str ? `${itemsStr} || ${str}` : `${itemsStr}`;\n } else {\n itemsStr = str ? str : null\n }\n });\n\n this.data.selectedItems = itemsStr;\n\n // get cart \n // this.$nextTick(() => {\n // // console.log(this.$refs.cart.$el);\n // // console.log(this.$refs.cart.$el.outerHTML);\n // let cart = this.$refs.cart.$el.outerHTML;\n // this.data.cartContents = cart;\n // })\n }\n \n },\n methods: {\n openCart(e) {\n // prevent opening cart if its empty\n if (this.data.emailDocs.length == 0) {\n e.stopPropagation();\n }\n },\n toggleFilters() {\n // console.log(\"clicked\");\n if (this.data.isMobile) {\n // console.log(\"is mobile\");\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return; \n }\n var type = type;\n var value = safeString(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1;\n // console.log(\"type\", type)\n // console.log(e);\n // console.log(\"value\", safeString(e.target.value));\n // console.log(\"checked\",e.target.checked);\n\n if (checked) {\n if (type !== \"savedDocuments\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": label}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": label}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) { return; }\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n populateProducts(brands) {\n // need to concat options from all selected brands and remove options when brands are unselected \n let brandStr = decodeURIComponent(brands.join('|'));\n // // console.log(brandStr);\n let apiUrl = `/api/GetDocumentProductsByBrand`;\n // let apiUrl = \"http://localhost:3003/productsByBrand\"; //from json-server\n let self = this;\n\n axios.get(apiUrl, {\n params: {\n brand: brandStr,\n lang: this.lang\n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.products = response.data.results; \n })\n .catch(function(error) {\n console.log(error);\n });\n },\n \n getResults(query) {\n\n // let apiUrl = \"api/documents?\";\n // console.log(\"QUERY\", query);\n this.data.query = query === null ? null : query ? query : this.data.query;\n this.data.currentPage = query ? 1 : this.data.currentPage;\n\n // this.getUrl();\n let baseUrl = window.documentAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/documentation\"; //from json-server\n // let apiUrlTest = \"http://localhost:3003/documentationTest\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var product = [];\n var lang = [];\n var brand = [];\n var docType = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"product\":\n product.push(item.value);\n break;\n case \"lang\":\n lang.push(item.value);\n break;\n case \"brand\":\n brand.push(item.value);\n break;\n case \"docType\":\n docType.push(item.value);\n break;\n default:\n return;\n }\n });\n\n let productStr = decodeURIComponent(product.join('|'));\n let langStr = decodeURIComponent(lang.join('|'));\n let brandStr = decodeURIComponent(brand.join('|'));\n let docTypeStr = decodeURIComponent(docType.join('|'));\n\n let axiosParams = {\n q: this.data.query ? this.data.query : null,\n saved: (this.data.savedDocs.join('|')) == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'), //@TODO make this less insane. Send NULL if empty string. Remove leading comma if present.\n product: productStr == \"\" ? null : productStr,\n language: langStr == \"\" ? null : langStr,\n brand: brandStr == \"\" ? null : brandStr,\n docType: docTypeStr == \"\" ? null : docTypeStr,\n savedDocuments: savedDocumentsTrueParams(),\n page: this.data.currentPage,\n }\n\n // console.log(axiosParams);\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults;\n self.data.shownResults = response.data.results.length;\n //console.log(response.data);\n\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n EventBus.$emit('scroll-to-top', this.data.class);\n this.getResults();\n },\n // updateEmailDocs(data) {\n // // add or remove items to email\n // let item = this.data.emailDocs.find(item => {\n // return item.id == data.id;\n // });\n\n // if (!item) {\n // this.data.emailDocs = [...this.data.emailDocs, data];\n // } else {\n // this.data.emailDocs.splice(this.data.emailDocs.indexOf(item),1);\n // }\n // },\n updateEmailDocData(data) {\n let existing = this.data.emailDocs.filter((item) => {\n return item.id == data.id;\n });\n let updatedData;\n if (existing.length > 0) {\n updatedData = this.data.emailDocs.map((item) => {\n if (data.id == item.id) {\n return item = data;\n } else {\n return item;\n }\n });\n } else {\n updatedData = [\n ...this.data.emailDocs,\n data\n ]\n }\n this.data.emailDocs = updatedData;\n },\n removeCartItem(id) {\n // let index = this.data.emailDocs.map((e) => {\n // return e.id\n // }).indexOf(id);\n // if (index > -1) {\n // this.data.emailDocs.splice(index,1);\n // }\n\n this.data.emailDocs = this.data.emailDocs.filter((item) => {\n return item.id !== id;\n });\n },\n \n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.lit-order__area-cards').getBoundingClientRect().top + window.scrollY -100;\n // console.log(top);\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n this.data.totalPages = Math.ceil(this.data.totalResults / 10);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n handleSubmit(data) {\n if (data.modalName == this.data.modalTarget) {\n // set isSubmitted to true when form is submitted\n this.data.isSubmitted = true;\n }\n },\n handleClose(data) {\n if ((data.modalName == this.data.modalTarget) && this.data.isSubmitted) {\n this.data.emailDocs = []; //empty cart contents array on modal close (only if form is submitted)\n this.data.isSubmitted = false; //set is submitted back to false\n }\n },\n init() {\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.documentId[0] == \"\" ? store.state.favorites.documentId.slice(1) : store.state.favorites.documentId;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n this.getResults();\n });\n // EventBus.$on('email-docs', (data) => {\n // this.updateEmailDocs(data);\n // });\n EventBus.$on('update-email-doc-data', (data) => {\n this.updateEmailDocData(data);\n });\n EventBus.$on('internal-search', (value, type) => {\n if (type == \"documentation\") {\n this.getResults(value);\n }\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n EventBus.$on('remove-cart-item', (id) => {\n this.removeCartItem(id);\n });\n EventBus.$on('form-submitted', (data) => {\n this.handleSubmit(data);\n });\n EventBus.$on('form-closed', (data) => {\n this.handleClose(data);\n });\n\n // init results\n this.data.results = window.initialDocumentationApiResults.results;\n this.data.totalResults = window.initialDocumentationApiResults.totalResults;\n this.data.shownResults = window.initialDocumentationApiResults.results.length;\n // this.data.results = fpodb.documentation.results;\n // this.data.totalResults = fpodb.documentation.totalResults;\n // this.data.shownResults = fpodb.documentation.results.length;\n\n\n // hide filters if less then 10 initial results\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true;\n\n // enable \"share all\" if 5 of less results\n this.data.shareAll = parseInt(this.data.totalResults) <= 5 ? true : false;\n // window.onpopstate = () => {\n // this.deeplink();\n // }\n\n \n this.$nextTick(() => {\n this.data.modalTarget = this.$refs.cartButton.getAttribute('href').substring(1);\n // dynamic cart component container for passing to generic form modal \n this.data.cartContents = `
    `;\n })\n }\n },\n mounted() {\n this.init();\n this.initPages();\n\n // for deeplinking\n // if (window.location.search) {\n // this.$nextTick(() => {\n // this.deeplink();\n // });\n // }\n }\n });\n\n \n\n Vue.component('lit-products', {\n props: ['data'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n components: {\n 'checkbox-item': Checkbox\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n \n // results list\n Vue.component('lit-results-list', {\n props: ['data'],\n data: function() {\n return {\n type: \"document\"\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n isSelected(result){\n return this.data.emailDocs.find(i => i.id == result.id) !== undefined;\n },\n qtyData(result) {\n let saved = this.data.emailDocs.find(i => i.id == result.id);\n if (saved) {\n return ({\n qty: saved.qty,\n prePunched: saved.prePunched \n });\n } else {\n return null;\n }\n }\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('lit-results-item', {\n props: ['data', 'content', 'isSelected', 'qtyData', 'cartVersion'],\n data: function() {\n return {\n isChecked: this.isSelected,\n isBookmarked: false,\n id: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n prePunched: this.qtyData ? this.qtyData.prePunched : null,\n qty: this.qtyData ? this.qtyData.qty : null,\n valid: true,\n isInCart: this.cartVersion ? true : null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.documentId;\n },\n encodedUrl: function() {\n return encodeURIComponent(this.content.url);\n },\n newTabLink: function() {\n return this.content.url.replace('download=true', 'download=false');\n },\n errorMsg: function() {\n return window.enterValidQuantityLabel;\n },\n newTabLink: function() {\n return this.content.url ? this.content.url.replace('download=true', 'download=false') : null;\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"cartVersion\": function() {\n if (this.cartVersion) {\n this.isInCart = true;\n }\n },\n \"data.emailDocs\": function() {\n let match = this.data.emailDocs.filter((item) => {\n return item.id == this.id;\n });\n this.isInCart = match.length > 0 ? true : false;\n if (match.length > 0) {\n this.qty = match[0].qty;\n this.prePunched = match[0].prePunched;\n } \n // else {\n // this.qty = \"\";\n // this.prePunched = null;\n // }\n },\n \"content\": function() {\n // update id when content changes\n this.$nextTick(() => {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n })\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"qty\": function() {\n if (!this.cartVersion) {\n // allow empty qty value if not in cart\n this.valid = this.qty.match(/^\\d+$/) && parseInt(this.qty) >= 5 ? true : this.qty == \"\" ? true : false;\n } else {\n // if is in cart, empty values are invalid\n this.valid = this.qty.match(/^\\d+$/) && parseInt(this.qty) >= 5 ? true : false;\n }\n\n // if qty is valid, update the value\n this.$nextTick(() => {\n if (this.valid && this.qty !== \"\" && this.isInCart) {\n EventBus.$emit('update-email-doc-data', {\n id: this.content.id,\n partNumber: this.content.documentId,\n eyebrow: this.content.eyebrow,\n details: this.content.details,\n name: this.content.name,\n qty: this.qty,\n prePunched: this.prePunched,\n url: this.content.url\n });\n }\n })\n\n // validate values if qty is updated in cart\n if (this.isInCart && this.cartVersion) {\n EventBus.$emit('check-errors');\n }\n },\n \"prePunched\": function() {\n if (this.valid && this.qty !== \"\" && this.isInCart) {\n EventBus.$emit('update-email-doc-data', {\n id: this.content.id,\n partNumber: this.content.documentId,\n eyebrow: this.content.eyebrow,\n details: this.content.details,\n name: this.content.name,\n qty: this.qty,\n prePunched: this.prePunched,\n url: this.content.url\n });\n }\n },\n \"qtyData\": function() {\n // clear qty and prepunched data if null\n if (!this.qtyData) {\n this.qty = \"\";\n this.prePunched = null;\n }\n }\n },\n template: `\n
    \n
    \n
    \n
    \n \n
    \n \n
    \n
    \n \n {{content.eyebrow}}\n \n \n {{content.name}}\n \n \n {{content.details}} \\{{moreContent}} \\{{seeAllLabel}} | {{content.language}}\n \n
    \n
    \n
    \n \n Add\n \n
    \n
    \n

    {{errorMsg}}

    \n
    \n
    \n \n
    \n
    \n
    \n \n
    \n
    \n
    \n\n `,\n methods: {\n // emailDoc() {\n // EventBus.$emit('email-docs', {\n // \"name\": this.content.name, \n // \"url\": this.content.url, \n // \"id\": this.content.id, \n // \"qty\": this.qty,\n // \"prePunched\": this.prePunched,\n // \"eyebrow\": this.content.eyebrow,\n // \"details\": this.content.details\n // });\n // },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"documentId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n },\n addToCart() {\n if (!this.qty) {\n this.valid = false;\n } else if (parseInt(this.qty) < 5) {\n this.valid = false;\n } else {\n let data = {\n id: this.content.id,\n partNumber: this.content.documentId,\n eyebrow: this.content.eyebrow,\n details: this.content.details,\n name: this.content.name,\n qty: this.qty,\n prePunched: this.prePunched,\n url: this.content.url\n }\n EventBus.$emit('update-email-doc-data', data);\n }\n },\n removeFromCart() {\n EventBus.$emit('remove-cart-item', this.id);\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.documentId;\n // console.log(\"saved\",this.saved);\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n this.initSeeAll();\n\n // if item is explicitly removed from cart, clear its input values\n EventBus.$on('remove-cart-item', (id) => {\n if (id == this.id) {\n this.qty = \"\";\n this.prePunched = null;\n }\n });\n }\n });\n\n // cart\n Vue.component('cart', {\n props: ['modalTarget'],\n data: function() {\n return {\n hasErrors: null,\n cartHash: null,\n isSubmitted: false\n }\n },\n computed: {\n cartContent: function() {\n return store.state.litOrderCart;\n },\n errorMsg: function() {\n return window.enterValidQuantityLabel;\n }\n },\n watch: {\n hasErrors: function() {\n if (this.hasErrors) {\n this.$el.parentNode.classList.add('hasErrors');\n } else {\n this.$el.parentNode.classList.remove('hasErrors');\n }\n },\n cartContent: function() {\n if (this.cartContent.length == 0) {\n instance.closeModal(this.cartHash);\n }\n },\n // for showing/hiding cart module. hide if submitted.\n isSubmitted: function() {\n this.$el.style.display = this.isSubmitted ? 'none' : 'block';\n }\n },\n template: `\n
    \n
    \n \n
    \n

    {{errorMsg}}

    \n

    `,\n methods: {\n qtyData(result) {\n let saved = this.cartContent.find(i => i.id == result.id);\n if (saved) {\n return ({\n qty: saved.qty,\n prePunched: saved.prePunched \n });\n } else {\n return null;\n }\n },\n checkErrors() {\n // console.log(\"checking\");\n this.$nextTick(() => {\n let invalidEntry = this.$el.querySelector('.lit-card__qty-input.invalid');\n this.hasErrors = invalidEntry ? true : false;\n //console.log(invalidEntry);\n })\n },\n getHash() {\n this.cartHash = this.$el.closest('.bmi-modal__wrapper') ? this.$el.closest('.bmi-modal__wrapper').getAttribute('name') : null;\n },\n handleSubmit(data) {\n if (data.modalName == this.modalTarget) {\n this.isSubmitted = true;\n }\n },\n handleClose(data) {\n if ((data.modalName == this.modalTarget) && this.isSubmitted) {\n this.isSubmitted = false; //set is submitted back to false\n }\n },\n init() {\n EventBus.$on('form-submitted', (data) => {\n this.handleSubmit(data);\n });\n EventBus.$on('form-closed', (data) => {\n this.handleClose(data);\n });\n }\n },\n mounted() {\n EventBus.$on('check-errors', () => {\n this.checkErrors();\n });\n this.getHash(); \n this.init();\n }\n });\n\n new Vue({\n el: `.lit-order-${id}`,\n store: store\n }).$mount(`.lit-order-${id}`, true);\n }\n\n if (litOrder.length > 0) {\n litOrder.forEach((item, index) => {\n item.classList.add(`lit-order-${index}`);\n litOrderConstructor(index);\n })\n }\n\n // window.enterValidQuantityLabel = \"error test\";\n\n}\n\nexport default LitOrder;\n","import Vue from 'vue/dist/vue.min.js';\nimport { lory } from 'lory.js';\nimport EventBus from './event-bus';\n\n// **NOTE**\n// 1 index\n\nconst MarketApps = () => {\n\n const apps = document.querySelectorAll('.market-apps');\n\n const marketAppsConstructor = (id) => {\n\n Vue.component('market-apps-template', {\n data: function() {\n return {\n sliderEl: null,\n options: {\n classNameFrame: 'market-apps__frame',\n enableMouseEvents: true\n },\n lory: null,\n length: null,\n currentSlide: 1,\n }\n },\n methods: {\n initLory() {\n this.lory = lory(this.sliderEl, this.options);\n },\n initListener() {\n this.sliderEl.addEventListener('after.lory.slide', () => {\n this.currentSlide = this.lory.returnIndex() + 1;\n });\n\n EventBus.$on('select-slide', (target) => {\n this.currentSlide = target;\n this.lory.slideTo(target - 1);\n });\n },\n initTags() {\n let tags = {\n \"type\": \"layer\",\n \"category\": \"Preview Card\",\n \"action\": \"Open\",\n \"label\": null,\n \"no\": null\n }\n this.sliderEl.querySelectorAll('li').forEach((slide, i) => {\n slide.dataset.tagMeta = JSON.stringify({\n ...tags,\n \"label\": this.$el.querySelectorAll('.market-apps__nav-item a')[i].innerText,\n \"no\": (i + 1) < 10 ? `0${i + 1}` : `${i + 1}`\n })\n });\n }\n },\n mounted() {\n this.sliderEl = this.$el.querySelector('.market-apps__slider');\n this.length = this.$el.querySelectorAll('.market-apps__slide').length;\n this.initLory();\n this.initListener();\n this.initTags();\n }\n });\n\n Vue.component('market-apps-nav-item', {\n props: ['currentSlide'],\n data: function() {\n return {\n target: null,\n isActive: null,\n label: null\n } \n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Preview Card\",\n \"action\": \"Open\",\n \"label\": this.label,\n \"no\": this.target < 10 ? `0${this.target}` : this.target.toString()\n })\n }\n \n },\n watch: {\n currentSlide: function() {\n this.isActive = this.target == this.currentSlide ? true : false;\n }\n },\n methods: {\n init() {\n // set target id based on node position\n this.target = [].indexOf.call(this.$el.parentNode.children, this.$el) + 1; \n\n this.isActive = this.target == this.currentSlide ? true : false;\n this.label = this.$el.querySelector('a').innerText;\n },\n selectSlide() {\n EventBus.$emit('select-slide', this.target);\n }\n },\n mounted() {\n this.init();\n }\n });\n\n new Vue({\n el: `.market-apps-${id}`,\n }).$mount(`.market-apps-${id}`, true);\n\n }\n\n if (apps.length > 0) {\n apps.forEach((item, index) => {\n item.classList.add(`market-apps-${index}`);\n marketAppsConstructor(index);\n })\n }\n\n}\n\nexport default MarketApps;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport { debounce } from 'lib/misc';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\n\n// NOTES:\n// menu is broken down into primary, 2nd level, and 3rd level \"panels\" \n// primary: top level menu category (e.g. municipal water solutions, industrial measurement solutions)\n// 2nd lvl: categories under the primary category (e.g. products, product lines)\n// 3rd lvl: content inside the 2nd level category (e.g. meters, meter components, endpoints)\n\n// \"primary\" and \"secondary\" menu panels/items are based on the \n// megamenu DOM order in megamenu.hbs. \n\n// on mobile, primary-menu-item ID is determined by DOM order. (e.g. the first item in the dom is primary-1, the second is primary-2, etc.)\n// selectedSecondaryId is constructed from the secondary level ID and its parent, the selected primary Id (e.g. secondary-1-primary-2 refers to the 1st secondary category in the 2nd primary category)\n\n\nconst Megamenu = () => {\n\n const menu = document.querySelector('.megamenu');\n let historyArr = []\n let highestTierOpen = 0;\n\n const clearMobileMenu = function()\n {\n historyArr.length = 0;\n highestTierOpen = 0;\n const megaTiers = document.querySelector('.mega__content .mega__tiers');\n const triggersWrap = document.querySelector('.mega__triggers');\n const openTiers = document.querySelectorAll('.mobileActiveTier') \n const openCols = document.querySelectorAll('.mobileActiveCol') \n \n for(let i=0; i< openTiers.length; i++) // close all open mobile tiers (more than one might have been opened by desktop menu)\n {openTiers[i].classList.remove('mobileActiveTier')}\n \n for(let i=0; i< openCols.length; i++) // close all open mobile Cols (more than one might have been opened by desktop menu)\n {openCols[i].classList.remove('mobileActiveTier')}\n\n megaTiers.classList.add('mobileHide') // restore menu to default setting\n triggersWrap.classList.add('mobileActiveTier')\n }\n\n\n const megamenuConstructor = () => { \n Vue.component('megamenu-template', {\n data: function() {\n return {\n data: {\n isMobile: store.state.isMobile,\n selectedPrimaryId: null,\n selectedSecondaryId: null,\n selectedTopbarId: null,\n mobileMenuOpen: false,\n topbarMenuOpen: false, //topbar menu INSIDE the megamenu, not the one outside\n primaryMenuOpen: false,\n secondaryMenuOpen: false,\n menuData: store.state.menuKeys,\n searchOpen: false,\n store: store,\n scrollDir: null,\n }\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n computedMenuData: function() {\n return store.state.menuKeys;\n },\n },\n watch: {\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n if (!this.data.isMobile) {\n // close mobile menu if desktop\n this.data.mobileMenuOpen = false;\n } \n this.positionMenu();\n },\n computedMenuData: function() {\n this.data.menuData = this.computedMenuData;\n },\n // handle closing megamenu on outside click\n \"data.selectedPrimaryId\": function() {\n if (!this.data.isMobile) {\n if (this.data.selectedPrimaryId !== null) {\n document.addEventListener('click', this.outsideClick);\n } else {\n document.removeEventListener('click', this.outsideClick);\n }\n } else {\n document.removeEventListener('click', this.outsideClick);\n }\n },\n \"data.scrollDir\": function() {\n let menuContainer = this.$el.parentNode;\n // console.log(menuContainer);\n switch (this.data.scrollDir) {\n case \"top\":\n menuContainer.classList.remove(\"hidden\");\n break;\n case \"up\":\n menuContainer.classList.remove(\"hidden\");\n break;\n case \"down\":\n menuContainer.classList.add(\"hidden\");\n break;\n default:\n return;\n }\n }\n },\n methods: {\n toggleMobileMenu() {\n this.data.mobileMenuOpen = !this.data.mobileMenuOpen; ///////////////////////////////////////////////////////////////////////////////\n const isOpen = this.data.mobileMenuOpen \n if(isOpen == true)\n {document.body.classList.add('mobile-open');}\n else\n {document.body.classList.remove('mobile-open');}\n clearMobileMenu();\n },\n outsideClick(e) {\n let target = e.target;\n let megamenu = this.$el;\n if (!megamenu.contains(target)) {\n this.data.selectedPrimaryId = null;\n }\n },\n positionMenu() {\n let scrollPos = 0;\n const handleScroll = () => {\n if ((document.body.getBoundingClientRect()).top == 0) {\n this.data.scrollDir = \"top\";\n } else if ((document.body.getBoundingClientRect()).top > scrollPos) {\n this.data.scrollDir = \"up\";\n } else {\n this.data.scrollDir = \"down\";\n }\n scrollPos = (document.body.getBoundingClientRect()).top;\n }\n // if (this.data.isMobile) {\n window.addEventListener(\"scroll\", handleScroll);\n // } else {\n // window.removeEventListener('scroll', handleScroll);\n // }\n },\n init() {\n EventBus.$on('setTopbarSelection', (id) => {\n this.data.selectedTopbarId = id;\n this.data.topbarMenuOpen = true;\n this.data.primaryMenuOpen = false;\n });\n\n /*\n EventBus.$on('back', (obj) => {\n let keys = Object.keys(obj);\n keys.forEach((item, i) => {\n this.data[item] = obj[item];\n });\n });\n\n EventBus.$on('setPrimarySelection', (id) => {\n this.data.selectedPrimaryId = id;\n this.data.primaryMenuOpen = true;\n this.data.topbarMenuOpen = false;\n });\n\n EventBus.$on('setSecondarySelection', (id) => {\n this.data.selectedSecondaryId = id;\n });\n */\n }\n },\n mounted() {\n this.init();\n this.positionMenu();\n }\n });\n \n\n // wrapper for top level submenus\n // e.g. Municipal water solutions, Industrial measurement solutions\n /*\n Vue.component('megamenu-submenu', {\n props: ['data'],\n data: function() {\n return {\n id: null,\n isOpen: false,\n }\n },\n watch: {\n 'data.selectedPrimaryId': function() {\n this.isOpen = this.id == this.data.selectedPrimaryId ? true : false;\n }\n },\n methods: {\n\n },\n mounted() { \n // set current submenu ID based on 1 index\n this.id = \"submenu-\" + ([].indexOf.call(this.$el.parentNode.children, this.$el)); \n }\n });\n */\n /*\n Vue.component('mobile-panel', {\n props: ['data'],\n data: function() {\n return {\n \n }\n },\n methods: {\n\n },\n mounted() {\n\n }\n });\n */\n /*\n Vue.component('primary-menu-item', {\n props: ['isMobile'],\n data: function() {\n return {\n id: null,\n title: '',\n suffix: null\n }\n },\n methods: {\n init() {\n // set =id\n let menuItems = Array.from(document.querySelectorAll('.megamenu__mobile-item--main'));\n this.id = \"primary-\" + (menuItems.indexOf(this.$el) + 1);\n this.suffix = menuItems.indexOf(this.$el) + 1;\n // set title\n this.title = this.$el.innerText;\n store.commit('updateMenu', {'id': this.id, 'title': this.title});\n\n this.initEvents();\n },\n\n initEvents() {\n this.$el.addEventListener('click', (e) => {\n e.preventDefault();\n if (this.isMobile) {\n this.handleMobileEvents(e)\n } else {\n // this.handleDesktopEvents(e);\n }\n }); \n },\n // handleDesktopEvents(e) {\n // EventBus.$emit('setSecondarySelection', `secondary-1-primary-${this.suffix}`);\n // },\n handleMobileEvents(e) {\n // console.log(\"clicked\");\n EventBus.$emit('setPrimarySelection',this.id);\n },\n },\n mounted() {\n this.init();\n }\n });\n */\n /*\n Vue.component('primary-menu-item-desktop', {\n props: ['parent-id', 'data'],\n data: function() {\n return {\n id: null,\n isActive: false,\n }\n },\n watch: {\n parentId: function() {\n this.id = \"primary-\" + this.parentId.slice(8);\n this.initSubmenu();\n },\n 'data.selectedPrimaryId': function() {\n this.isActive = this.parentId == this.data.selectedPrimaryId ? true : false;\n }\n },\n methods: {\n initSubmenu(e) {\n if(e) {e.preventDefault();}\n if(!this.data.isMobile) {\n EventBus.$emit('setSecondarySelection', `secondary-1-${this.id}`);\n }\n },\n selectMenu() {\n if (this.parentId == this.data.selectedPrimaryId) {\n EventBus.$emit('setPrimarySelection', null);\n } else {\n EventBus.$emit('setPrimarySelection', `${this.parentId}`);\n if(!this.data.isMobile) {\n EventBus.$emit('setSecondarySelection', `secondary-1-${this.id}`);\n }\n }\n\n }\n },\n mounted() {\n\n }\n });\n */\n /*\n Vue.component('primary-panel', {\n props: ['parent-id', 'data'],\n data: function() {\n return {\n id: null,\n title: '',\n isActive: false\n }\n },\n computed: {\n selectedId: function() {\n return this.data.selectedPrimaryId;\n }\n },\n watch: {\n selectedId: function() {\n this.isActive = this.selectedId == this.id ? true : false;\n }\n },\n methods: {\n init() {\n let primaryPanels = Array.from(document.querySelectorAll('.megamenu__submenu-area-left'));\n this.id = \"primary-\" + (primaryPanels.indexOf(this.$el) + 1);\n\n this.getTitle();\n },\n back(e) {\n // console.log('back');\n e.preventDefault();\n EventBus.$emit('back', {\"primaryMenuOpen\": false});\n },\n getTitle() {\n let match = this.data.menuData.find(item => {\n // console.log(\"item\", item.id);\n // console.log(\"id\", this.id);\n return item.id === this.id;\n })\n\n if (match) {\n this.title = match.title;\n }\n }\n },\n mounted() {\n this.init();\n }\n });\n */\n /*\n Vue.component('secondary-panel', {\n props: ['parent-id', 'data'],\n data: function() {\n return {\n \n }\n },\n methods: {\n\n },\n mounted() {\n\n }\n });\n */\n /*\n Vue.component('secondary-content', {\n props: ['parentId', 'data'],\n data: function() {\n return {\n id: null,\n suffix: '',\n isActive: false\n }\n },\n computed: {\n selectedId: function() {\n return this.data.selectedSecondaryId;\n },\n },\n watch: {\n parentId: function() {\n this.suffix = this.parentId.substring(8);\n this.init();\n },\n selectedId: function() {\n this.isActive = this.selectedId == this.id ? true : false;\n },\n // 'data.menuData': function() {\n // this.getElements();\n // }\n },\n methods: {\n init() {\n // set id\n let items = Array.from(this.$el.parentNode.querySelectorAll('.megamenu__submenu-content'));\n this.id = \"secondary-\" + (items.indexOf(this.$el) + 1) + \"-primary-\" + this.suffix;\n this.$el.dataset.id = this.id;\n },\n // getElements() {\n // let innerContent = this.$el.querySelector('.megamenu__inner-area');\n // }\n },\n mounted() {\n }\n });\n */\n /*\n Vue.component('secondary-menu-item', {\n props: ['parentId', 'data'],\n data: function() {\n return {\n id: null,\n title: '',\n isActive: false\n }\n },\n computed: {\n selectedId: function() {\n return this.data.selectedSecondaryId;\n }\n },\n // wait until parent has and ID to assign child id\n watch: {\n parentId: function() {\n this.init();\n },\n selectedId: function() {\n this.isActive = this.selectedId == this.id ? true : false;\n }\n },\n methods: {\n init() {\n // set id\n let items = Array.from(this.$el.parentNode.querySelectorAll('.megamenu__submenu-item'));\n this.id = \"secondary-\" + (items.indexOf(this.$el) + 1) + \"-\" + this.parentId;\n \n this.$nextTick(() => {\n let innerContent = document.querySelector(`div[data-id=\"${this.id}\"]`).cloneNode(true);\n\n this.title = this.$el.innerText;\n store.commit('updateMenu', {\"id\": this.id,\"title\":this.title, \"el\":innerContent});\n });\n\n // set title\n },\n handleDesktop(e) {\n e.preventDefault();\n // console.log(\"clicked desktop\");\n EventBus.$emit('setSecondarySelection', this.id);\n },\n\n handleMobile(e) {\n e.preventDefault();\n // console.log(\"clicked mobile\");\n this.isActive = !this.isActive;\n EventBus.$emit('setSecondarySelection', this.id);\n },\n initEvents() {\n this.$el.querySelector('.megamenu__submenu-item-link').addEventListener('click', (e) => {\n if (this.data.isMobile) {\n this.handleMobile(e);\n } else {\n this.handleDesktop(e);\n }\n });\n }\n },\n mounted() {\n this.initEvents();\n }\n });\n */\n /*\n Vue.component('secondary-inner-content', {\n props: ['data', 'id'],\n data: function() {\n return {\n }\n },\n watch: {\n 'data.menuData': function() {\n this.initContent();\n }\n },\n methods: {\n initContent() {\n let obj = this.data.menuData.find((item) => {\n return item.id == this.id;\n });\n if (obj) {\n let el = obj.el;\n this.$refs.inner.appendChild(el);\n }\n }\n },\n mounted() {\n // this.initContent();\n }\n });\n */\n Vue.component('topbar-panel', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n methods: {\n },\n mounted() {\n\n }\n });\n\n Vue.component('topbar-content', {\n props: ['data'],\n data: function() {\n return {\n menuData: store.state.menuKeys,\n id: null,\n isActive: false,\n title: '',\n }\n },\n computed: {\n selectedId: function() {\n return this.data.selectedTopbarId;\n },\n updatedMenuData: function() {\n return store.state.menuKeys;\n }\n },\n watch: {\n // only watch the selected topbar content id\n selectedId: function() {\n this.isActive = this.id == this.selectedId ? true : false;\n },\n updatedMenuData: function() {\n this.menuData = store.state.menuKeys;\n this.init();\n }\n },\n methods: {\n back(e) {\n // console.log('back');\n e.preventDefault();\n EventBus.$emit('back', {\"topbarMenuOpen\": false})\n },\n init() {\n let match = this.menuData.find(item => {\n // console.log(\"item\", item.id);\n // console.log(\"id\", this.id);\n return item.id === this.id;\n })\n\n if (match) {\n this.title = match.title;\n }\n }\n },\n mounted() {\n let menuItems = Array.from(document.querySelectorAll('.megamenu__mobile-topbar'));\n this.id = \"topbar-\" + (menuItems.indexOf(this.$el) + 1);\n\n // console.log(this.menuData);\n // console.log(\"test\",test);\n }\n });\n\n Vue.component('topbar-menu-item', {\n data: function() {\n return {\n isMobile: store.state.isMobile,\n id: null,\n title: '',\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n computedIsMobile: function() {\n this.isMobile = this.computedIsMobile;\n this.init();\n }\n },\n methods: {\n init() {\n if (this.isMobile) {\n // add event listeners\n this.$el.addEventListener('click', (e) => {\n e.preventDefault();\n this.handleEvents(e)\n });\n this.setTitle();\n\n } else {\n // remove event listeners\n this.$el.removeEventListener('click', (e) => {\n this.handleEvents(e);\n });\n }\n },\n handleEvents(e) {\n //console.log(\"clicked\");\n EventBus.$emit('setTopbarSelection',this.id);\n },\n // set section title to pass to section menu\n setTitle() {\n this.title = this.$el.innerText;\n store.commit('updateMenu', {\"id\": this.id,\"title\":this.title});\n }\n },\n mounted() {\n let menuItems = Array.from(document.querySelectorAll('.megamenu__mobile-item--topbar'));\n this.id = \"topbar-\" + (menuItems.indexOf(this.$el) + 1);\n this.init();\n }\n });\n\n Vue.component('lang-selector', {\n data: function() {\n return {\n activeLang: null,\n allLangs: [],\n store: store\n }\n },\n methods: {\n \n },\n mounted() {\n \n }\n });\n\n Vue.component('lang-selector-item', {\n props: ['allLangs','activeLang'],\n data: function() {\n return {\n lang: null,\n isActive: false\n }\n },\n watch: {\n activeLang: function() {\n this.isActive = this.activeLang === this.lang ? true : false;\n }\n },\n methods: {\n // changeLang(e) {\n // // this.activeLang = this.lang;\n // EventBus.$emit('set-lang', this.lang);\n // },\n selectLang(e) {\n // this.activeLang = this.lang;\n // EventBus.$emit('set-lang', this.lang);\n let lang = e.currentTarget.dataset.lang;\n if (lang) {\n document.cookie = `selectedLanguage=${lang}; path=/; max-age=31536000;`;\n }\n },\n \n \n },\n mounted() {\n this.lang = this.$el.getAttribute('href').slice(1).toLowerCase();\n this.isActive = this.activeLang == this.lang ? true : false;\n }\n });\n\n Vue.component('search', {\n props: ['data'],\n data: function() {\n return {\n isOpen: false,\n predictiveSearchOpen: false,\n searchTerm: null, //from input for v-model\n searchTermVis: null, //displayed search term\n isLoading: null,\n results: null,\n }\n },\n watch: {\n searchTerm: function() {\n // init search if search term is longer than 1 character and not spaces\n let self = this;\n if (this.searchTerm && this.searchTerm.replace(/\\s+/g, '') !== \"\" && this.searchTerm.length > 1) {\n this.predictiveSearchOpen = true;\n this.isLoading = true;\n this.getResults();\n // console.log(debounce);\n } else {\n this.predictiveSearchOpen = false;\n }\n },\n isOpen: function() {\n if (this.isOpen) {\n this.$nextTick(() => {\n this.$refs.globalSearch.focus();\n });\n }\n }\n },\n computed: {\n // includes url params for auto filtering on search results page\n // filters params are by filter ID\n searchUrl: function() {\n return `${window.baseSearchUrl}?q=${this.searchTermVis}`;\n },\n productUrl: function() {\n return `${window.baseProductUrl}&q=${this.searchTermVis}`;\n },\n documentationUrl: function() {\n return `${window.baseDocumentationUrl}&q=${this.searchTermVis}`;\n },\n TechnologyUrl: function() {\n return `${window.baseTechnologyUrl}&q=${this.searchTermVis}`;\n },\n language: function() {\n return store.state.currentLang\n },\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"search\",\n \"category\": \"Search\",\n \"action\": \"Keywords\",\n \"label\": this.searchTermVis ? this.searchTermVis : \"\",\n \"filterName\": \"filtername\"\n })\n }\n },\n methods: {\n addLoading() {\n document.querySelector('.megamenu__search-input').classList.add('loading');\n },\n removeLoading() {\n document.querySelector('.megamenu__search-input').classList.remove('loading');\n },\n toggleSearch() {\n this.isOpen = !this.isOpen;\n },\n getResults: debounce(function() {\n this.addLoading();\n this.searchTermVis = this.searchTerm;\n let apiUrl = \"/api/products\";\n // let apiUrl = \"http://localhost:3003/products\";\n let self = this;\n axios.get(apiUrl, {\n params: {\n q: this.searchTerm,\n lang: this.language\n }\n })\n .then(function(res) {\n // console.log(res.data.results);\n self.isLoading = false;\n self.results = res.data.results.slice(0, 3);\n self.removeLoading();\n })\n .catch(function(error) {\n console.log(error);\n });\n }, 1000) \n },\n mounted() {\n }\n });\n\n Vue.component('predictive-results', {\n props: ['results', 'isLoading'],\n data: function() {\n return {\n \n }\n },\n template: `\n
    \n \n
    \n `,\n watch: {\n \n },\n methods: {\n \n },\n mounted() {\n\n }\n });\n\n Vue.component('result-item', {\n props: ['content', 'isLoading'],\n data: function() {\n return {\n \n }\n },\n template: `\n
    \n
    \n \n
    \n \n
    \n `,\n watch: {\n \n },\n methods: {\n \n },\n mounted() {\n\n }\n });\n\n\n new Vue({\n el: `.megamenu`,\n store: store\n }).$mount(`.megamenu`, true);\n }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n if (menu) \n {\n megamenuConstructor();\n let hoverTimer = null;\n const triggersWrap = document.querySelector('.mega__triggers');\n const triggers = document.querySelectorAll('.mega__triggers .is-trigger');\n const megaContent = document.querySelector('.mega__content');\n const megaTiers = document.querySelector('.mega__content .mega__tiers');\n const colTriggers = document.querySelectorAll('.mega__content .trigger');\n const mobileBack = document.querySelector('#mega__mobile__tier__back');\n const mobileHeading = document.querySelector('#mega__mobile__tier__heading');\n\n/////////////////////////////////////////////////////////////////////// click off menu \ndocument.addEventListener('click', e => \n {\n // const clickedArea = \n if (!megaContent.contains(e.target) && !triggersWrap.contains(e.target) && megaContent.classList.contains('active'))\n {\n megaContent.classList.remove('active')\n triggersWrap.classList.remove('megamenuTriggered')\n document.querySelector('.mega__triggers .is-trigger.active').classList.remove('active')\n }\n })\n/////////////////////////////////////////////////////////////////////// back button for mobile \n mobileBack.addEventListener('click',function(e)\n {\n e.preventDefault();\n const historySize = historyArr.length; // this can also be the heighest tier open. \n const curIndex = historySize -1;\n\n // should only work if there is at least one item in history\n if( historySize > 1 )\n {\n const prevPlace = historyArr[curIndex -1]\n // close current open tier, and open UL\n document.querySelector(`.tier-${historySize}`).classList.remove('mobileActiveTier') \n document.querySelector(`.tier-${historySize} .mobileActiveCol`).classList.remove('mobileActiveCol')\n // open previous (in history)\n document.querySelector(`.tier-${curIndex}`).classList.add('mobileActiveTier')\n document.querySelector(`.tier-${curIndex} .mobileActiveCol`).classList.add('mobileActiveCol')\n mobileHeading.innerText = prevPlace.txt\n historyArr.length = historySize -1;\n }\n else if(historySize == 1) // history is back to default position\n {\n megaTiers.classList.add('mobileHide')\n triggersWrap.classList.add('mobileActiveTier')\n }\n }) \n\n\n\n\n\n\n\n \n\n/////////////////////////////////////////////////////////////////////// open active tier for mobile\n const setMobileTier = function(tier, pos, historyText)\n { \n const currentActive = document.querySelector('.mobileActiveTier')\n const highestTierEl = document.querySelector(`.tier-${tier}`)\n const activeColInTier = document.querySelectorAll(`.tier-${tier} .mobileActiveCol`)\n \n // no tier lower than 0\n if(tier >=0 )\n {\n highestTierOpen= tier;\n currentActive.classList.remove('mobileActiveTier')\n }\n // close any active cols\n if(activeColInTier != undefined && activeColInTier.length>0)\n {\n for(let i=0;i0 )\n {\n highestTierOpen= tier;\n triggersWrap.classList.remove('mobileActiveTier')\n megaTiers.classList.remove('mobileHide');\n historyArr[tier-1] = {txt: historyText, colPos:pos};\n\n if(pos != \"fromBackButton\")\n {\n document.querySelector(`.tier-${tier} .pos-${pos}`).classList.add('mobileActiveCol')\n mobileHeading.innerText = historyText\n }\n }\n else if (tier == 0)\n {\n highestTierOpen=0\n triggersWrap.classList.add('mobileActiveTier');\n megaTiers.classList.add('mobileHide'); \n }\n highestTierEl.classList.add('mobileActiveTier')\n }\n\n ////////////////////////////////////////////////////////////////////// open tiers/column logic\n const openTier=(triggerTier, posInTier, elClicked)=>\n {\n const maxDepth = 4\n const thisTier = parseInt(triggerTier)\n highestTierOpen = thisTier + 1\n const nextTier = \".tier-\" + highestTierOpen\n const pos = \".pos-\" + posInTier;\n const currentPos = document.querySelector(`${nextTier} .active`)\n const linkOpenSameTier = document.querySelector(`.tier-${thisTier} .isOpen`)\n const linkOpenNextTier = document.querySelector(`.tier-${thisTier+1} .isOpen`)\n const txt = elClicked.innerText;\n \n // hide any opened items - in Same tier\n if(currentPos != undefined) \n {\n currentPos.classList.remove('active');\n // same tier link needs to be cleared\n if(linkOpenSameTier != undefined)\n {linkOpenSameTier.classList.remove('isOpen');}\n // next tier link needs to be cleared\n if(linkOpenNextTier != undefined)\n {linkOpenNextTier.classList.remove('isOpen')}\n \n // hide any deeper columns (tiers)\n for (let i = (thisTier+1) ; i<= maxDepth; i++)\n {\n document.querySelector(`.tier-${i}`).classList.remove('active')\n }\n }\n \n // open/re-open selection\n document.querySelector(nextTier).classList.add('active')\n document.querySelector(`${nextTier} ${pos}`).classList.add('active')\n elClicked.classList.add('isOpen')\n setMobileTier(highestTierOpen, posInTier, txt); \n }\n\n/* ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// EVENTS */ \n/////////////////////////////////////////////////////////////////////// opening megamenu logic\n for(let i=0;i 1200) \n {\n if(e.target.classList.contains(\"active\") )\n {\n megaContent.classList.remove('active')\n triggersWrap.classList.remove('megamenuTriggered')\n e.target.classList.remove('active');\n }\n else\n {\n highestTierOpen = 1\n const allActives = document.querySelectorAll('.mega__content .active') // select all open columns\n const allopenArrows = document.querySelectorAll('.mega__content .isOpen') // my links that point to open columns \n const currentSelected = document.querySelector('.mega__triggers > li a.active') // select open main tab\n const target = e.target.dataset.target;\n \n // start by hiding all tiers 0 - 4\n for(let i=0;i< allActives.length; i++)\n {allActives[i].classList.remove('active')}\n\n // clear the main menu too\n if(currentSelected != null)\n {\n currentSelected.classList.remove('active');\n }\n\n // clear links to point to opened columns\n for(let i=0;i< allopenArrows.length; i++)\n {allopenArrows[i].classList.remove('isOpen')}\n\n e.target.classList.add('active') // highlight clicked tier 0\n megaContent.classList.add('active') // open mega menu\n triggersWrap.classList.add('megamenuTriggered')\n document.querySelector(`.mega__content .tier-1 .pos-${target}`).classList.add('active') // open tier-1\n }\n }\n // mobile logic\n else\n {\n //mobileHeading.innerText = e.target.innerText;\n const el = e.target\n const targetPos = el.dataset.target\n setMobileTier(1, targetPos , el.innerText); // on mobile there is no toggle, this button always opens the next tier\n }\n }) \n }\n /////////////////////////////////////////////////////////////////////// submenu columns logic\n for(let i=0;i 1200)\n {\n hoverTimer = setTimeout(function() \n {openTier( thisTier, posInTargetTier, elClicked) }, 500);\n }\n }) \n\n // cancel timer needed \n colTriggers[i].addEventListener('mouseout',function(e)\n { clearTimeout(hoverTimer); }) \n\n // click is ok for mobile\n colTriggers[i].addEventListener('click',function(e)\n {\n e.preventDefault();\n const thisTier = e.target.parentNode.parentNode.parentNode.dataset.tier; // backwards: starting from link clicked to < li < ul < tier-#\n const posInTargetTier = e.target.dataset.target;\n const elClicked = e.target;\n openTier( thisTier, posInTargetTier, elClicked)\n }) \n }\n \n }\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n // window.baseDocumentationUrl = '/search-results?filters=111';\n // window.baseProductUrl = '/search-results?filters=222';\n // window.baseTechnologyUrl = '/search-results?filters=333';\n // window.baseSearchUrl = '/search-results'; \n\n}\n\nexport default Megamenu;\n","import Vue from 'vue/dist/vue.min.js';\nimport EventBus from './event-bus'\nimport store from './store';\n\nconst MenuTopBar = () => {\n let topBar = document.querySelector('.top-bar');\n\n let MenuTopBarConstructor = () => {\n Vue.component('top-bar', {\n data: function() {\n return {\n activeNav: null,\n isOpen: null\n }\n },\n watch: {\n isOpen: function() {\n // handle closing subnav on outside click\n if (this.isOpen) {\n document.addEventListener(\"click\", this.outsideClick);\n } else {\n document.removeEventListener(\"click\", this.outsideClick);\n }\n }\n },\n methods: {\n setNav(id) {\n this.activeNav = id;\n },\n outsideClick(e) {\n let target = e.target;\n let topnav = document.querySelector('.top-bar');\n if (!topnav.contains(target)) {\n this.isOpen = false;\n this.activeNav = null;\n }\n }\n },\n mounted() {\n //give each nav item an id if it has a subnav\n this.$el.querySelectorAll('.top-bar__item').forEach((item, index) => {\n if (item.querySelector('.top-bar__subnav')) {\n item.dataset.id = index;\n }\n });\n // listen for click events from nav items\n EventBus.$on('setNav', (id) => {\n this.setNav(id);\n });\n // recieve open state from children to handle closing on outside click\n EventBus.$on('openState', (state) => {\n this.isOpen = state;\n });\n }\n });\n Vue.component('top-bar-item', {\n props: ['activeNav'],\n data: function() {\n return {\n navId: null,\n isActive: false,\n hasSubNav: false\n }\n },\n watch: {\n activeNav: function() {\n this.isActive = ((this.activeNav == this.navId) && this.navId !== null) ? true : false;\n },\n isActive: function() {\n // send open state to parent to handle closing on outside click\n EventBus.$emit('openState', this.isActive ? true : false);\n }\n },\n methods: {\n // emit click event to parent\n handleClick(e) {\n //set active state only if item has subnav\n this.isActive = this.hasSubNav ? !this.isActive : false;\n EventBus.$emit('setNav', this.navId);\n },\n },\n mounted() {\n // wait till next render to get id that's added by parent\n this.$nextTick(() => {\n this.navId = this.$el.dataset.id || null;\n this.hasSubNav = this.$el.dataset.id ? true : false;\n });\n }\n });\n\n Vue.component('lang-selector', {\n data: function() {\n return {\n activeLang: null,\n allLangs: [],\n store: store\n }\n },\n methods: {\n },\n mounted() {\n \n }\n });\n\n Vue.component('lang-selector-item', {\n props: ['allLangs','activeLang'],\n data: function() {\n return {\n lang: null,\n isActive: false\n }\n },\n // watch: {\n // activeLang: function() {\n // this.isActive = this.activeLang === this.lang ? true : false;\n // }\n // },\n methods: {\n selectLang(e) {\n // this.activeLang = this.lang;\n // EventBus.$emit('set-lang', this.lang);\n let lang = e.currentTarget.dataset.lang;\n if (lang) {\n document.cookie = `selectedLanguage=${lang}; path=/; max-age=31536000;`;\n }\n },\n \n },\n mounted() {\n // this.lang = this.$el.getAttribute('href').slice(1).toLowerCase();\n // this.isActive = this.activeLang == this.lang ? true : false;\n }\n });\n\n new Vue({\n el: `.top-bar`,\n store: store\n }).$mount(`.top-bar`, true);\n }\n\n if (topBar) {\n MenuTopBarConstructor();\n }\n}\n\nexport default MenuTopBar;","import Vue from 'vue/dist/vue.min.js';\nimport template from 'shared/meter-selector-button-set.hbs';\n\nVue.component(\n \"ms-button-set\",\n {\n props: {\n buttons: Array,\n multiple: { type: Boolean, default: false }, \n ovalButton: { type: Boolean, default: false }, \n onChange: Function,\n disabledMessage: String,\n defaultValue: { type: Array, default: [] },\n onTriggerEvent: Function\n },\n data(){\n return {\n values: this.buttons && this.buttons.map(v => !v.disabled && v.value ).map(v => this.defaultValue.indexOf(v) >= 0),\n };\n },\n watch: {\n values: {\n immediate: true,\n handler(v){\n const ctx = this;\n const value = v.reduce((o, e, i) => { if (!e) { return o; } return [...o, ctx.buttons[i]]; } , []);\n this.onChange && this.onChange(value);\n }\n }\n },\n computed: {\n },\n mounted() {\n },\n beforeUnmount() {\n },\n methods: {\n change(i) {\n if (!this.multiple) {\n const values = [];\n values[i] = this.values[i];\n this.values = values;\n }\n\n this.onTriggerEvent({ value: this.buttons[i] });\n }\n }, \n template\n }\n);\n","import Vue from 'vue/dist/vue.min.js';\nimport template from 'shared/meter-selector-frame.hbs';\nimport separatorTemplate from 'shared/meter-selector-frame-separator.hbs';\nimport questionTemplate from 'shared/meter-selector-frame-question.hbs';\n\nVue.component(\n \"ms-frame\",\n {\n props: {\n isLateralBar: { type: Boolean, default: false },\n transparent: { type: Boolean, default: true },\n closeButtonLabel: String,\n buttonLabel: String,\n cancelButtonLabel: String,\n disableButton: { type: Boolean, default: false },\n title: String,\n onCancel: Function,\n onClickButton: Function,\n hasParametersButton: { type: Boolean, default: false },\n contactButton: Object,\n message: String,\n notice: String,\n },\n data(){\n return {\n isOpen: false\n };\n },\n watch: {\n isOpen(v) {\n const nameClass = 'ms-frame_opened-lateral-bar';\n const layerNameClass = 'ms-frame_mobile-layer';\n const body = document.querySelector('body');\n\n if(v) {\n body.classList.add(nameClass);\n const layer = document.createElement('div');\n layer.classList.add(layerNameClass);\n body.appendChild(layer);\n } else {\n const layer = document.querySelector(`.${layerNameClass}`);\n\n layer && body.removeChild(layer);\n body.classList.remove(nameClass);\n }\n }\n },\n computed: {\n hasButton(){\n return Boolean(this.buttonLabel) && !Boolean(this.notice)\n },\n mobileButtonLabel() {\n return this.closeButtonLabel;\n },\n hasContactButton(){\n return Boolean(this.contactButton);\n },\n hasButtons(){\n return this.hasButton || this.hasContactButton;\n },\n },\n mounted() {\n },\n beforeUnmount() {\n },\n methods: {\n clickButton(){\n this.onClickButton && this.onClickButton();\n },\n open(){\n this.isOpen = !this.isOpen;\n },\n cancel(){\n this.onCancel && this.onCancel();\n }\n }, \n template\n }\n);\n\nVue.component(\n \"ms-frame-separator\",\n {\n props: {\n title: String,\n },\n template: separatorTemplate\n }\n);\n\nVue.component(\n \"ms-frame-question\",\n {\n props: {\n index: Number,\n options: { type: Object, default: {} },\n value: Object,\n selectedUnit: String,\n onTriggerEvent: Function\n },\n data() {\n return {\n defaultValue: this.value,\n }\n },\n computed: {\n showTitle(){\n return this.options.button && this.index > 0 && this.options.question;\n },\n dropdownOptions(){\n return this.options.dropdown;\n },\n input(){\n const inputs = this.options.input;\n if (!inputs) {\n return null;\n }\n\n const input = inputs[0];\n\n return { title: input.label, placeholder: input.placeholder };\n },\n defaultValues(){\n if (this.options.button) {\n if (!this.defaultValue || !this.defaultValue.value) {\n return [];\n }\n\n return typeof this.defaultValue.value === 'object' ? this.defaultValue.value : [this.defaultValue.value];\n }else{\n if (!this.defaultValue || !this.defaultValue.inputValue) {\n const def = {};\n\n if (this.selectedUnit && this.options.options) {\n def.switcher = { value: this.selectedUnit };\n }\n\n return def;\n }\n\n return this.defaultValue.inputValue;\n }\n },\n key(){\n return this.options.apiQuery.join();\n }\n },\n methods: {\n onChange(v){\n const { index, stepId: id, apiQuery, filterName:label = '' } = this.options;\n let input = null;\n\n if (this.options.button) {\n const value = v.map(o => o.value);\n const notice = (v.find(o => Boolean(o.selectedLabel)) || {}).selectedLabel || '';\n const queryName = apiQuery && apiQuery[0];\n const query = { [queryName]: value.length === 1 ? value[0] : value };\n input = value.length === 0 ? null : { index, id, value, query, notice, label };\n } else {\n const { input: inputValue, dropdown, switcher } = v;\n const hasInput = Boolean(this.options.input);\n\n input = {\n value: inputValue,\n inputValue: v,\n option: switcher,\n label\n }; \n\n const queryName = apiQuery && apiQuery[0];\n const query = { [queryName]: input.value };\n\n if (apiQuery && apiQuery.length > 1 && (switcher || dropdown)) {\n const unitName = apiQuery[apiQuery.length - 1];\n query[unitName] = dropdown ? dropdown.value : switcher.value;\n }\n\n const isEmpty = input.value === '' || input.value === undefined || input.value === null;\n input = !isEmpty ? { ...input, index, id, query } : null;\n }\n\n this.$emit('input', input);\n },\n onTriggerAnswerEvent(data) {\n this.onTriggerEvent({ ...data, questionIndex: this.index });\n }\n },\n template: questionTemplate\n }\n);\n","import Vue from 'vue/dist/vue.min.js';\nimport template from 'shared/meter-selector-input-box.hbs';\n\nVue.component(\n \"ms-input-box\",\n {\n props: {\n title: String,\n description: String,\n switcher: Object,\n input: Object,\n dropdown: Object,\n dropdownOptions: Array,\n onChange: Function,\n defaultValue: { type: Object, default: {} },\n onTriggerEvent: Function\n },\n data(){\n const data = {\n switcherValue: false,\n dropdownValue: '',\n inputValue: '',\n switcherField: this.switcher,\n inputField: this.input,\n changingMemo: this.defaultValue,\n inputErrorMessage: null, \n taggingInputValue: '',\n };\n\n if (this.defaultValue.switcher) {\n data.switcherValue = this.switcher.right.value === this.defaultValue.switcher.value;\n }\n\n if (this.defaultValue.dropdown) {\n data.dropdownValue = this.defaultValue.dropdown.value;\n }\n\n if (this.defaultValue.input) {\n data.inputValue = this.defaultValue.input.toString();\n }\n\n data.taggingInputValue = data.inputValue;\n\n return data;\n },\n watch: {\n switcherValue: {\n handler(v, a) {\n if (!this.switcherField) {\n return;\n }\n const option = v ? this.switcher.right : this.switcher.left;\n\n this.changingMemo = {\n ...this.changingMemo,\n switcher: option,\n };\n\n if ((a !== undefined || this.dropdownValue === '') && option && this.dropdownOptions) {\n if (this.dropdownOptions[option.value]) {\n const dropdownOption = this.dropdownOptions[option.value][0] || {};\n this.dropdownValue = dropdownOption.value || '';\n }\n }\n },\n immediate: true\n },\n dropdownValue: {\n handler(v) {\n if (!this.dropdownField) {\n return;\n }\n\n this.changingMemo = {\n ...this.changingMemo,\n dropdown: this.dropdownField.options.find(o => o.value === v),\n }\n },\n immediate: true\n },\n inputValue: {\n handler(v) {\n if (!this.inputField) {\n return;\n }\n\n const { noNegative, decimals = 2 } = this.input;\n let dashes = 0;\n let points = 0;\n\n let value = v.replace(/[^0-9.]|\\./g, function($0){\n if ( (!noNegative && $0 === '-' && v.indexOf('-') === 0 && !(dashes++)) || (decimals > 0 && $0 === '.' && !(points++)) ) {\n return $0;\n }\n\n return '';\n });\n \n const dp = value.indexOf('.');\n if (dp > -1) {\n const diff = value.length - dp - 1 - decimals;\n\n if (diff > 0) {\n value = value.substring(0, value.length - diff);\n }\n }\n\n const numericValue = parseFloat(value);\n this.inputErrorMessage = null;\n\n if (this.input.validation) {\n const {error, min = null, max} = this.input.validation;\n\n if ((min !== null && min > value) || (max && max < value)) {\n this.inputErrorMessage = error;\n }\n }\n\n this.inputValue = value;\n\n this.changingMemo = {\n ...this.changingMemo,\n input: value === '' ? '' : parseFloat(value),\n };\n },\n immediate: true\n },\n changingMemo(v) {\n this.hasChange();\n },\n taggingValue(){\n this.onTriggerEvent({ value: this.taggingValue });\n }\n },\n computed: {\n taggingValue(){\n return this.taggingInputValue + (this.option ? ' ' + (this.option.label || this.option.value) : '');\n },\n dropdownField(){\n if(!this.dropdownOptions){\n return null;\n }\n\n const option = (this.switcherValue ? this.switcher.right : this.switcher.left) || {};\n\n return { options: this.dropdownOptions[option.value] || [] };\n },\n inputTitle(){\n const ctx = this;\n return {\n props: {\n option: Object\n }, \n template: `${ctx.inputField.title}`\n }\n },\n option(){\n return this.dropdownField ? this.changingMemo.dropdown : this.changingMemo.switcher;\n } \n },\n mounted() {\n this.hasChange();\n },\n beforeUnmount() {\n },\n methods: {\n \n hasChange(){\n this.onChange && this.onChange(this.changingMemo);\n },\n onBlurInput(){\n this.taggingInputValue = this.inputValue;\n }\n }, \n template\n }\n);\n","import Vue from 'vue/dist/vue.min.js';\nimport template from 'shared/meter-selector-step-bar.hbs';\n\nVue.component(\n \"ms-step-bar\",\n {\n props: {\n steps: Array, \n onChange: Function,\n current: Number,\n selectedValues: { type: Array, default: [] },\n offset: { type: Number, default: 50 },\n },\n data(){\n return {\n rootClasses: {\n 'noCenterAlign' : true\n },\n onResizeFlag: false,\n isMouseDown: false,\n };\n },\n watch: {\n current: {\n handler() {\n this.onResize();\n },\n immediate: true\n },\n steps: {\n handler() {\n this.onResizeFlag = true;\n },\n immediate: true\n }\n },\n computed: {\n getSteps() {\n const ctx = this;\n return this.steps.map((s, i) => {\n const classes = {\n 'ms-step-bar_item' : true,\n 'ms-step-bar_item--selected' : i === ctx.current,\n 'ms-step-bar_item--checked' : i <= ctx.maxStep\n };\n\n return {...s, selectedValue: ctx.selectedValues[i], classes };\n })\n },\n maxStep() {\n return (this.selectedValues && this.selectedValues.length) || 0;\n }\n },\n mounted() {\n window.addEventListener('resize', this.onResize);\n\n this.$refs.list.addEventListener('touchstart', this.startDrag);\n this.$refs.list.addEventListener('mousedown', this.startDrag);\n\n document.addEventListener('mouseup', this.endDrag);\n document.addEventListener('touchend', this.endDrag);\n\n document.addEventListener('mousemove', this.moveDrag);\n document.addEventListener('touchmove', this.moveDrag);\n },\n beforeUnmount() {\n window.removeEventListener('resize', this.onResize);\n\n this.$refs.list.removeEventListener('touchstart', this.startDrag);\n this.$refs.list.removeEventListener('mousedown', this.startDrag);\n\n document.removeEventListener('mouseup', this.endDrag);\n document.removeEventListener('touchend', this.endDrag);\n\n document.removeEventListener('mousemove', this.moveDrag);\n document.removeEventListener('touchmove', this.moveDrag);\n },\n updated(){\n if (this.onResizeFlag) {\n this.onResize();\n this.onResizeFlag = false;\n }\n },\n methods: {\n onResize(){\n let diff = 0;\n\n const w = window.innerWidth;\n const list = this.$refs.list;\n const children = (list && list.childNodes) || [];\n const last = children[children.length - 1];\n const end = last ? (last.offsetWidth + last.offsetLeft + this.offset) : 0;\n\n if (w < end) {\n const ldiff = (end - w) * - 1;\n\n const mw = w / 2;\n const selected = children[this.current];\n const selectedEnd = selected && selected.offsetWidth + selected.offsetLeft;\n\n if (selected && mw < selectedEnd) {\n diff = (selectedEnd - mw) * -1;\n }\n\n if (ldiff > diff) {\n diff = ldiff \n }\n }\n\n if (list) {\n list.style.transform = `translateX(${diff}px)`;\n }\n\n this.rootClasses = {\n ...this.rootClasses,\n 'noCenterAlign': end === 0 ? true : w < end,\n };\n },\n hasSelectedValue(i){\n return this.selectedValues && this.selectedValues[i];\n },\n reset(defaultCurrent = 0){\n this.onChange && this.onChange(defaultCurrent);\n },\n onClickStep(i){\n if (i > this.maxStep){\n return;\n }\n\n this.onChange && this.onChange(i);\n },\n startDrag(){\n this.isMouseDown = true;\n },\n endDrag(){\n this.isMouseDown = false;\n },\n moveDrag(e){\n const elm = this.$refs.list;\n if (!elm || !this.isMouseDown) {\n return;\n }\n\n const clientX = e.clientX || (e.touches[0] || e.changedTouches[0] || {}).pageX;\n\n if (elm.previousClientX !== undefined) {\n const diff = clientX - elm.previousClientX;\n const styleFound = elm.style.transform.match(/translateX\\((.*)px\\)/i) || [];\n const x = styleFound[1] ? parseInt(styleFound[1]) : 0;\n\n const children = elm.childNodes || [];\n const last = children[children.length - 1];\n const w = window.innerWidth;\n const end = last ? (last.offsetWidth + last.offsetLeft + this.offset) : 0;\n const maxX = (end - w) * -1;\n\n const add = 10;\n let nx = x;\n\n if (diff > 0) {\n nx = x+add;\n\n if (nx > 0) {\n nx = 0;\n }\n } else if (diff < 0 && maxX < 0) {\n nx = x-add;\n\n if (nx < maxX) {\n nx = maxX;\n }\n }\n\n const transformStyle = `translateX(${nx}px)`;\n\n if (styleFound[0]) {\n elm.style.transform = elm.style.transform.replace(styleFound[0], transformStyle);\n } else {\n elm.style.transform += \ttransformStyle + ';' ;\n }\n }\n\n elm.previousClientX = clientX;\n }\n }, \n template\n }\n);\n","\n/*\n Debounce is a decorator function that returns a function, that,\n as long as it continues be invoked, will not be triggered.\n The function will be called after it stops being called for N milliseconds (set in the 'wait' parameter). \n*/\nexport function debounce(func, wait) {\n\tlet timeout;\n\treturn function() {\n\t\tconst context = this;\n const args = arguments;\n\t\tconst later = function() {\n\t\t\ttimeout = null;\n\t\t\tfunc.apply(context, args);\n\t\t};\n\t\tclearTimeout(timeout);\n\t\ttimeout = setTimeout(later, wait);\n\t};\n};\n\n// get value of url param by name\nexport const getUrlParameter = (sParam) => {\n var sPageURL = window.location.search.substring(1),\n sURLVariables = sPageURL.split('&'),\n sParameterName,\n i;\n\n for (i = 0; i < sURLVariables.length; i++) {\n sParameterName = sURLVariables[i].split('=');\n\n if (sParameterName[0] === sParam) {\n return sParameterName[1] === undefined ? true : decodeURIComponent(sParameterName[1]);\n }\n }\n};\n\n// get cookie value by name\nexport function getCookieValue(a) {\n\tvar b = document.cookie.match('(^|;)\\\\s*' + a + '\\\\s*=\\\\s*([^;]+)');\n\treturn b ? b.pop() : '';\n}","/* \nAllows for inline text links to trigger specified Vue modals\n\n*/\n\nimport Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {formModal, exitModal} from './modals';\nimport EventBus from './event-bus';\nimport store from './store';\n\nVue.use(VModal);\n\nconst instance = new Vue({\n methods: {\n triggerContactTooltip() {\n EventBus.$emit('toggle-contact');\n },\n\n triggerForm(data) {\n this.$modal.show(\n formModal.template(data.content),\n formModal.name(data.name), \n formModal.options(data.options),\n formModal.events(data.data)\n )\n },\n\n triggerExit(data) {\n this.$modal.show(\n exitModal.template(data),\n exitModal.name, \n exitModal.options,\n exitModal.events\n )\n },\n closeModal(name) {\n // this.$modal.hide(name);\n this.$modal.hideAll();\n }\n }\n});\n\nconst trigger = () => { \n document.addEventListener('click', (e) => { \n if (e.target.getAttribute('href')) {\n var hrefHash = e.target.getAttribute('href').split(\"#\")[1]; \n if (!e.target.classList.contains(\"leavingSiteClickEventAdded\") && hrefHash) {\n\n if (hrefHash === \"contactustip\") {\n e.preventDefault();\n instance.triggerContactTooltip();\n } \n if (window.modalHashtags) {\n window.modalHashtags.forEach((item) => {\n if (hrefHash === item.hashtagname) {\n e.preventDefault();\n let downloadUrl = e.target.dataset.downloadUrl || null;\n let downloadName = e.target.dataset.downloadName || null;\n let selectedProducts = e.target.dataset.quoteProducts || null;\n let literatureOrdered = e.target.dataset.literatureOrdered || null;\n let content = e.target.dataset.content || null;\n let comments = e.target.dataset.comments || null;\n let existingQueryParams = location.search;\n \n if (existingQueryParams != \"\") {\n if (downloadUrl && downloadUrl != \"\") {\n existingQueryParams = \"&\" + existingQueryParams;\n existingQueryParams = existingQueryParams.replace(\"&&\",\"&\");\n if (existingQueryParams.startsWith(\"?\")) \n existingQueryParams = existingQueryParams.slice(1); // remove the question mark\n } else {\n if (item.url.indexOf(\"?\") > -1) {\n existingQueryParams = \"&\" + existingQueryParams;\n existingQueryParams = existingQueryParams.replace(\"&&\",\"&\");\n }\n }\n }\n if (window.getFirstTouchCookies) { \n //***********************************************************************************************/\n // NOTE:\n // the function `window.getFirstTouchCookies` will only be available if the user accepted cookies. This script is in the BACKEND CODE ONLY.\n // This code is in the backend project only because it's cookie code and has to be disabled by an optanon-category from OneTrust if the user \n // does not accept cookies.\n //***********************************************************************************************/\n let FTCookies = window.getFirstTouchCookies();\n let LTCookies = window.getLastTouchCookies();\n function renameProperty(object, oldName, newName) { // .length of function is 2\n 'use strict';\n if (oldName === newName) {\n return object;\n }\n if (object.hasOwnProperty(oldName)) {\n object[newName] = object[oldName];\n delete object[oldName];\n }\n return object;\n }\n renameProperty(FTCookies, 'utm_campaign_FT', 'UTM_Campaign_FT');\n renameProperty(FTCookies, 'utm_content_FT', 'UTM_Content_FT');\n renameProperty(FTCookies, 'utm_medium_FT', 'UTM_Medium_FT');\n renameProperty(FTCookies, 'utm_source_FT', 'UTM_Source_FT');\n renameProperty(FTCookies, 'utm_campaign_ID_FT', 'UTM_Campaign_ID_FT');\n \n renameProperty(LTCookies, 'utm_campaign_LT', 'UTM_Campaign_LT');\n renameProperty(LTCookies, 'utm_content_LT', 'UTM_Content_LT');\n renameProperty(LTCookies, 'utm_medium_LT', 'UTM_Medium_LT');\n renameProperty(LTCookies, 'utm_source_LT', 'UTM_Source_LT');\n renameProperty(LTCookies, 'utm_campaign_ID_LT', 'UTM_Campaign_ID_LT');\n\n let cookieQueryString = \"\";\n let ftKeys = Object.keys(FTCookies);\n let ltKeys = Object.keys(LTCookies);\n\n cookieQueryString = ftKeys.filter(x => x != \"HasValues\").map(key => `${key}=${FTCookies[key]}`).join(\"&\");\n cookieQueryString += \"&\" + ltKeys.filter(x => x != \"HasValues\").map(key => `${key}=${LTCookies[key]}`).join(\"&\");\n if (existingQueryParams != \"\") {\n existingQueryParams += \"&\" + cookieQueryString;\n } else {\n existingQueryParams = \"?\" + cookieQueryString;\n }\n console.log(\"cookieQueryString\", cookieQueryString);\n }\n\n if (comments || selectedProducts || literatureOrdered || downloadUrl || downloadName) {\n instance.triggerForm({\n content: {\n url: downloadUrl && downloadUrl !== \"\" ? (`${item.url}?redirect_url=${downloadUrl}` + existingQueryParams) : (item.url + existingQueryParams),\n copy: `${content ? content : ``}`\n },\n name: item.hashtagname,\n options: {\"classes\": `bmi-modal bmi-modal--form bmi-modal--${item.hashtagname}`},\n data: {\n product_selections: selectedProducts,\n modalName: item.hashtagname,\n downloadName: downloadName,\n literatureOrdered,\n comments: comments,\n }\n })\n } else {\n instance.triggerForm({\n content: {\n url: item.url + existingQueryParams,\n copy: `${content ? content : ``}`\n },\n name: item.hashtagname,\n options: {\"classes\": `bmi-modal bmi-modal--form bmi-modal--${item.hashtagname}`}\n });\n } \n } \n });\n } \n }\n } else {\n console.log('e.target', e.target);\n return;\n }\n });\n\n\n let leavingSiteClick = (e) => { \n if (window.leavingSite) {\n var data = {\n \"copy\": window.leavingSite.modalContent,\n \"ok\": window.leavingSite.okLabel,\n \"close\": window.leavingSite.closeLabel,\n } \n var link = e.target.getAttribute('href');\n var target = e.target;\n var modal = document.querySelector('.bmi-modal--exit');\n \n for (let i=0; i < window.leavingSite.sites.length; i++) {\n let site = window.leavingSite.sites[i];\n if (modal && modal.contains(target)) {\n continue;\n } else if (link.includes(`${site}`)) {\n e.preventDefault();\n \n data = {\n ...data,\n \"link\": link\n }\n instance.triggerExit(data);\n return false;\n }\n }\n }\n };\n\n document.addEventListener(\"click\", function() {\n setTimeout(function() {\n document.querySelectorAll('a[href]').forEach(l => { \n if (l.href.toLowerCase().indexOf(\"http\") == -1) {\n //check if 'eventAdded' class to the element\n if (!l.classList.contains(\"leavingSiteClickEventAdded\")) {\n l.classList.add(\"leavingSiteClickEventAdded\");\n l.addEventListener('click', leavingSiteClick);\n }\n }\n });\n }, 500);\n });\n\n // in order for the return false/e.preventDefault() to actually work, you must attach this to the anchor tag itself, not document.addEventListener\n // like it was previously. The problem is that this only works for anything that already exists on the DOM.\n // The above document.addEventListener() will add it for anything that's injected into the DOM, querying the dom 500ms after the click.\n // this is not ideal, but there's not really a better way to handle this.\n \n document.querySelectorAll('a[href]').forEach(l => {\n //add a 'eventAdded' class to the element\n if (l.href.toLowerCase().indexOf(\"http\") == -1) {\n //check if 'eventAdded' class to the element\n if (!l.classList.contains(\"leavingSiteClickEventAdded\")) {\n l.classList.add(\"leavingSiteClickEventAdded\");\n l.addEventListener('click', leavingSiteClick);\n }\n }\n });\n}\n\n// export default trigger;\nexport { instance, trigger};\n","import store from './store';\nimport EventBus from './event-bus';\n\nlet defaultOptions = {\n height: \"auto\",\n scrollable: false,\n adaptive: true,\n focusTrap: true,\n classes: \"bmi-modal\",\n width: \"900px\",\n};\n\nlet defaultTemplate = (content, tagName) => {\n return {template: `\n
    \n \n\n
    \n
    \n ${content}\n
    \n
    \n
    \n `}\n};\n\nlet videoTemplate = (id, title) => {\n return {template: `\n
    \n \n
    \n ${title ? `

    ${title}

    ` : ``}\n
    \n \n
    \n
    \n
    \n `}\n};\n\nconst modalConstructor = (Template, Name, Options, Events) => (\n {\n template: Template,\n name: {name: Name},\n options: {\n name: Name,\n ...defaultOptions,\n ...Options\n },\n events: Events\n }\n)\n\nconst videoModal = modalConstructor(\n (id, title) => videoTemplate(id, title),\n \"video\",\n {classes: 'bmi-modal bmi-modal--video'},\n)\n\nconst releaseNotesModal = modalConstructor(\n (content) => defaultTemplate(`${content}`, 'Release Notes Overlay'),\n \"releaseNotes\",\n {classes: 'bmi-modal bmi-modal--release-notes'}\n)\n\nconst applicationsModal = modalConstructor(\n defaultTemplate('', 'Market Applications Overlay'),\n \"applications\",\n {classes: 'bmi-modal bmi-modal--applications'},\n (apps) => ({\n 'opened': () => {\n // console.log(\"before open\");\n let container = document.querySelector('.bmi-modal--applications .bmi-modal__area-body');\n container.appendChild(apps);\n }\n }),\n)\n\nconst quickLinksModal = modalConstructor(\n defaultTemplate('', 'Quick Links Overlay'),\n \"quickLinks\",\n {classes: 'bmi-modal bmi-modal--quick-links'},\n (links) => ({\n 'opened': () => {\n // console.log(\"before open\");\n let container = document.querySelector('.bmi-modal--quick-links .bmi-modal__area-body');\n container.appendChild(links);\n }\n }),\n)\n\nconst patentsModal = modalConstructor(\n defaultTemplate('', 'Patents Overlay'),\n \"patents\",\n {classes: 'bmi-modal bmi-modal--patents'},\n (content) => ({\n 'opened': () => {\n // console.log(\"before open\");\n // console.log(content);\n let container = document.querySelector('.bmi-modal--patents .bmi-modal__area-body');\n container.appendChild(content);\n }\n }),\n)\n\nconst tooltipModal = modalConstructor(\n (content) => defaultTemplate(`${content}`, 'Tooltip Overlay'),\n \"tooltip\",\n {classes: 'bmi-modal bmi-modal--tooltip'}\n);\n\nconst formModal = {\n template: (content) => defaultTemplate(\n `${content.copy ? `\n
    \n ${content.copy}\n
    \n ` : ``}\n
    \n \n
    `, 'Form Overlay'\n ),\n name: (value) => ({\"name\": value}),\n options: (data) => ({\n ...defaultOptions,\n classes: 'bmi-modal bmi-modal--form',\n ...data\n }),\n events: (data) => ({\n 'opened': () => {\n let id = store.state.GAID;\n\n var iframe = document.querySelector(\".bmi-modal__form iframe\");\n let src = document.querySelector(\".bmi-modal__form iframe\").getAttribute('src');\n let paramData = {\n ...data,\n GAID: id\n };\n\n window.addEventListener(\"message\", (event) => {\n // console.log(event);\n if (event.origin == \"https://info.badgermeter.com\") {\n sizeIframe(event);\n postData(event);\n receiveData(event);\n }\n });\n\n const postData = (event) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage(JSON.stringify(paramData), '*');\n } else {\n iframe.onload = function() {\n iframe.contentWindow.postMessage(JSON.stringify(paramData), '*');\n }\n }\n }\n \n const sizeIframe = (event) => {\n try {\n let data = typeof event.data === 'object' ? event.data : JSON.parse(event.data);\n // console.log(data);\n if (data.form) {\n if ( src.includes(data.form) ) {\n iframe.style.height = `${data.content + 20}px`;\n }\n }\n } catch (e) { console.log(\"Unexpected message\", e); }\n };\n\n const receiveData = (event) => {\n try {\n let eventData = typeof event.data === 'object' ? event.data : JSON.parse(event.data);\n eventData = {\n eventData, //pass data from postmessage event\n ...data //also pass data from modal trigger event\n }\n if (eventData.eventData.submit) {\n // emit submitted event whenever a form is submitted\n EventBus.$emit('form-submitted', eventData);\n }\n } catch (e) { console.log(\"Unexpected message\", e); }\n }\n },\n 'closed' : () => {\n // emit form closed event whenever form is closed\n EventBus.$emit('form-closed', data);\n }\n })\n}\n\nconst infoModal = modalConstructor(\n (title, content) => defaultTemplate(`\n

    \n ${title}\n

    \n
    \n ${content}\n
    \n `, 'Info Overlay'),\n \"contact\",\n { width:'none', height: 'none', shiftY: 0, classes: 'bmi-modal bmi-modal--info'},\n {\n opened: () => {\n const body = document.querySelector(\"body\");\n body.classList.add('bmi-modal__body');\n },\n closed: () => {\n const body = document.querySelector(\"body\");\n body.classList.remove('bmi-modal__body');\n }\n }\n);\n\nconst genericModal = modalConstructor(\n (content) => defaultTemplate(content, \"Content Overlay\"),\n \"generic\",\n {classes: 'bmi-modal bmi-modal--generic'},\n)\n\nconst exitModal = modalConstructor(\n (content) => {return {template: `\n
    \n
    \n
    \n ${content.copy}\n
    \n
    \n \n
    \n `}},\n \"exit\",\n {classes: 'bmi-modal bmi-modal--exit'},\n)\n\n\nexport { videoModal, releaseNotesModal, applicationsModal, quickLinksModal, infoModal, patentsModal, tooltipModal, formModal, genericModal, exitModal };\n","import ComponentModule from 'lib/component-module';\nimport { lory } from 'lory.js';\nimport { debounce } from '../misc';\n\nComponentModule.AddModule('.affiliates', {\n prefix: 'affiliates-',\n components: [\n {\n name: 'template',\n data(){\n return {\n lory: null,\n div: [],\n isMobile: null,\n totalSlides: null,\n currentSlide: 0,\n desc: null,\n isLast: false\n };\n },\n watch: {\n isMobile(){\n this.reset();\n }\n },\n methods: {\n initLory() {\n this.lory = lory(this.$el, { \n classNameFrame: 'affiliates__content',\n classNameSlideContainer: 'affiliates__list', \n classNamePrevCtrl: 'affiliates__prev',\n classNameNextCtrl: 'affiliates__next', \n slidesToScroll: 1,\n enableMouseEvents: true });\n\n this.$el.addEventListener('after.lory.slide', () => {\n this.currentSlide = this.lory.returnIndex();\n });\n\n // manually check for last slide because lory js\n // index doesn't work with variable width slides\n this.$el.querySelector('.affiliates__list').addEventListener('transitionend', () => {\n this.checkLastSlide();\n });\n\n this.checkLastSlide();\n },\n resize: debounce(function() {\n this.checkLastSlide();\n }, 500),\n checkLastSlide() {\n let containerOffset = parseInt(window.innerWidth - this.$el.querySelector('.affiliates__list-container').getBoundingClientRect().right);\n\n let lastSlideOffset = parseInt(window.innerWidth - this.$el.querySelector('.affiliates__list li:last-child').getBoundingClientRect().right);\n // \n this.isLast = containerOffset == lastSlideOffset || (lastSlideOffset >= containerOffset - 1 && lastSlideOffset <= containerOffset + 1) ? true : false;\n },\n setIsMobile() {\n var mql = window.matchMedia('(max-width: 650px)');\n this.isMobile = mql.matches ? true : false;\n\n mql.addEventListener('change',() => {\n this.isMobile = mql.matches ? true : false;\n });\n },\n reset() {\n if (this.isMobile) {\n this.$refs.desc.remove();\n } else {\n if (this.$refs.desc) {\n return;\n } else {\n this.$refs.list.prepend(this.desc);\n }\n }\n this.lory.setup();\n \n }\n },\n mounted() {\n this.desc = this.$refs.desc;\n this.initLory();\n this.setIsMobile();\n this.reset();\n \n window.addEventListener(\"resize\", this.resize);\n },\n unmounted() {\n window.removeEventListener(\"resize\", this.resize);\n }\n }\n ]\n});\n","import ComponentModule from 'lib/component-module';\nimport fetcher from 'lib/fetcher';\nimport store from 'lib/store';\nimport {\n template as hiwTemplate,\n tabLabel as hiwTabLabel,\n contentTemplate as hiwContentTemplate\n} from 'lib/how-it-works';\n\nComponentModule.AddModule('.find-distributor', {\n prefix: 'find-distributor-',\n components: [\n fetcher({\n name: 'template',\n data(){\n return {\n list: { template: '
    ' },\n listVisible: false\n };\n },\n methods: {\n getDistributors() {\n var self = this;\n\n if (this.params.country) {\n this.listVisible = true;\n\n this.fetch(function(res) {\n // const template = self.data;\n const template = res.data;\n // console.log(\"RES\", res);\n self.list = {\n template,\n components: {\n 'hiw-template': {\n ...hiwTemplate,\n components: {\n 'hiw-tab-label': hiwTabLabel,\n 'hiw-content-template': hiwContentTemplate\n }\n }\n }\n };\n \n }, {\n params: {\n ...this.params\n }\n }); \n } else {\n this.listVisible = false;\n }\n\n }\n }\n }, {\n fetchOnUpdateParams: false\n })\n ],\n store: store\n});\n","import ComponentModule from '../component-module';\nimport StorageManager, { LocalStorageManager } from '../storage-manager';\nimport { getCookieValue } from '../misc';\n\nconst storageManager = StorageManager(LocalStorageManager);\n\nconst GLOBAL_MESSAGE_SESSION = 'global-messsage';\n\nconst getNameSession = id => {\n return GLOBAL_MESSAGE_SESSION+'#'+id;\n}\n\nconst getTimesShowed = id => {\n return parseInt(storageManager.get(getNameSession(id)) || 0);\n}\n\nconst addTimeShowed = (id) => {\n storageManager.addTimes(getNameSession(id));\n}\n\nComponentModule.AddModule('.global-message', {\n prefix: 'global-message-',\n components: [\n {\n props: {\n showTimes: Number\n },\n name: 'template',\n data: () => ({\n isShow: false,\n }),\n mounted: function() {\n const el = this.$parent.$el;\n\n if (sessionStorage && el.className.includes(\"__show-times\") && el.id) {\n const times = getTimesShowed(el.id);\n const showTimes = this.showTimes || 1;\n if (times >= showTimes) {\n return;\n } else {\n this.isShow = true;\n this.$nextTick(() => {\n this.checkOneTrust();\n })\n }\n } else {\n this.isShow = true;\n this.$nextTick(() => {\n this.checkOneTrust();\n })\n }\n },\n methods: {\n close() {\n const el = this.$parent.$el;\n\n this.isShow = false;\n\n if (sessionStorage && el.className.includes(\"__show-times\") && el.id) {\n addTimeShowed(el.id);\n }\n\n const event = new Event('closeGlobalAlert');\n el.dispatchEvent(event);\n },\n checkOneTrust() {\n let oneTrustCookie = getCookieValue('OptanonAlertBoxClosed');\n console.log(this.$el);\n if (oneTrustCookie == '') {\n this.$el.style.display = 'none';\n this.$nextTick(() => {\n setTimeout(() => {\n this.init();\n }, 1000);\n })\n } else {\n this.$el.style.display = 'block';\n }\n },\n init() {\n let close = document.querySelector('#onetrust-close-btn-container');\n const el = this.$parent.$el;\n const openEvent = new Event('openGlobalAlert');\n if (close) {\n close.addEventListener('click', () => {\n el.dispatchEvent(openEvent);\n this.$el.style.display = 'block';\n });\n }\n }\n }\n }\n ]\n});\n\n","import './recent-posts';\nimport './my-saved-page';\nimport './solution-area';\nimport './meter-selector';\nimport './global-message';\nimport './find-distributor';\nimport './affiliates';\nimport './locations-map';\n","import ComponentModule from 'lib/component-module';\nimport tippy from 'tippy.js';\nimport store from '../store';\n\nComponentModule.AddModule('.locations-map', {\n prefix: 'locations-map-',\n components: [\n {\n name: 'template',\n data(){\n return {\n region: 0,\n resizeTimeout: null,\n openedId: null,\n locations: [],\n regions: window.locationsMapData.regions,\n data: window.locationsMapData.locations,\n fullscreenTooltipContainer: null,\n store: store\n };\n },\n computed: {\n isMobile: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n locations() {\n const elms = this.$el.getElementsByClassName('locations-map__location-pin');\n for (var i = 0; i < elms.length; i++) {\n const e = elms[i];\n const l = this.locations[i];\n\n }\n },\n region(){\n this.moveToRegion();\n this.calculatePosition();\n },\n openedId(){\n if(this.openedId === null){\n this.setContentTooltipReference(null);\n }\n },\n isMobile: function() {\n if (this.isMobile) {\n let map = this.$el.parentNode;\n map.style.removeProperty('height');\n }\n }\n },\n mounted() {\n this.calculatePosition();\n window.addEventListener(\"resize\", this.resize);\n },\n destroyed() {\n window.removeEventListener(\"resize\", this.resize);\n },\n methods: {\n setContentTooltipReference(content) {\n const body = document.querySelector('body');\n if (this.openedId === null && this.fullscreenTooltipContainer){\n body.removeChild(this.fullscreenTooltipContainer);\n this.fullscreenTooltipContainer = null;\n }\n\n if (content === null){\n return null;\n }\n\n const div = this.fullscreenTooltipContainer || document.createElement('div');\n body.appendChild(div);\n div.classList.add('locations-map__tooltip-fullscreen');\n div.appendChild(content);\n\n this.fullscreenTooltipContainer = div;\n },\n getPrefixCss() {\n var styles = window.getComputedStyle(document.documentElement, ''),\n pre = (Array.prototype.slice\n .call(styles)\n .join('')\n .match(/-(moz|webkit|ms)-/) || (styles.OLink === '' && ['', 'o'])\n )[1],\n dom = ('WebKit|Moz|MS|O').match(new RegExp('(' + pre + ')', 'i'))[1];\n return {\n dom: dom,\n lowercase: pre,\n css: '-' + pre + '-',\n js: pre[0].toUpperCase() + pre.substr(1)\n };\n },\n setStyleWithPrefix(el, style, value){\n const { css } = this.getPrefixCss();\n el.style[css+style] = value;\n },\n calculateDiff(){\n\n if(!this.isMobile) {\n this.calculateHeight();\n } \n\n let realWidth = 0;\n let realHeight = 0;\n\n const fullWidth = 1610;\n const fullHeight = 770;\n const fullRatio = fullWidth/fullHeight;\n const containerWidth = this.$el.parentElement.offsetWidth;\n const containerHeight = this.$el.parentElement.offsetHeight;\n const containerRation = containerWidth/containerHeight;\n\n\n if(containerRation > fullRatio){\n realWidth = containerWidth;\n realHeight = containerWidth/fullRatio;\n } else {\n realWidth = containerHeight*fullRatio;\n realHeight = containerHeight;\n }\n\n return {\n w: realWidth,\n h: realHeight,\n x: realWidth/fullWidth,\n y: realHeight/fullHeight\n };\n },\n moveToRegion(){\n let l = 0;\n let t = 0;\n\n if (this.region !== null && window.innerWidth < 835){\n const { x:xDiff, y:yDiff, w } = this.calculateDiff();\n const region = this.regions[this.region];\n l = region.coordinates[0] * xDiff * -1;\n t = region.coordinates[1] * yDiff * -1;\n\n const offsetWidth = this.$el.parentElement.offsetWidth;\n const offsetHeight = this.$el.parentElement.offsetHeight;\n\n const minLeft = (w - offsetWidth) * -1;\n const minTop = (w - offsetHeight) * -1;\n\n if (l < minLeft) {\n l = minLeft;\n }\n\n if (t < minTop) {\n t = minTop;\n }\n }\n\n this.$el.parentElement.style['background-position'] = `${l}px ${t}px`;\n this.$refs.locationsContainer.style.left = `${l}px`;\n this.$refs.locationsContainer.style.top = `${t}px`;\n },\n open(id){\n this.openedId = id;\n },\n resize(){\n const context = this;\n\n if (this.resizeTimeout) {\n clearTimeout(this.resizeTimeout);\n }\n\n this.resizeTimeout = setTimeout(function(){\n context.resizeTimeout = null;\n context.calculatePosition();\n }, 500);\n\n this.moveToRegion();\n },\n calculatePosition(){\n const { x:xDiff, y:yDiff } = this.calculateDiff();\n\n const locations = [];\n this.data.forEach(i => {\n const [l, t] = i.coordinates;\n const _top = Math.round(t * yDiff);\n const _left = Math.round(l * xDiff);\n\n locations.push({\n ...i,\n coordinates: [`${_left}px`, `${_top}px`],\n })\n });\n\n this.locations = locations;\n },\n calculateHeight() {\n let fullWidth = 1610;\n let fullHeight = 770;\n let fullRatio = fullWidth/fullHeight;\n let windowWidth = window.innerWidth;\n let calcHeight = Math.round(windowWidth / fullRatio);\n let map = this.$el.parentNode;\n map.style.height = `${calcHeight}px`;\n }\n },\n components: {\n 'content-tooltip': {\n name: 'content-tooltip',\n props: ['id', 'data', 'open', 'isOpen', 'setContentTooltipReference'],\n data(){\n return {\n tippyInstance: null,\n contentChild: null\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Preview Card\",\n \"action\": \"Open\",\n \"label\": this.data.name\n })\n }\n },\n watch: {\n data(){\n this.mobileMode();\n this.tippyInstance.setContent('');\n },\n isOpen(){\n this.mobileMode();\n this.tippyInstance.setContent('');\n if (this.isOpen) {\n // increase z-index of currently open tooltip\n let tippyTarget = document.querySelector(`#tippy-${this.id + 1}`);\n tippyTarget.style.zIndex = 100;\n }\n }\n },\n methods: {\n onOpen(){\n this.open(this.id);\n },\n onClose(){\n this.open(null);\n },\n mobileMode(){\n if (this.isOpen && window.innerWidth < 650){\n this.setContentTooltipReference(this.contentChild);\n } else {\n this.setTooltipContent();\n }\n },\n setTooltipContent(){\n this.tippyInstance.popper.querySelector('.tippy-content').appendChild(this.contentChild);\n }\n },\n mounted() {\n const context = this;\n this.contentChild = this.$el.children[0];\n const instance = tippy(this.$el, {\n content: '',\n maxWidth: 'none',\n allowHTML: true,\n interactive: true,\n placement: this.data.placement,\n trigger: 'manual',\n zIndex: 99,\n onCreate(instance) {\n context.tippyInstance = instance;\n context.setTooltipContent();\n instance.show();\n },\n onHide(instance) {\n return false;\n }\n });\n }\n }\n }\n }\n ]\n});\n","import qs from 'qs';\n\nimport ComponentModule from 'lib/component-module';\nimport fetcher from 'lib/fetcher';\n\nimport store from '../store';\nimport { infoModal as modal } from '../modals';\n\n// Meter selector components\nimport 'lib/meter-selector/step-bar';\nimport 'lib/meter-selector/input-box';\nimport 'lib/meter-selector/button-set';\nimport 'lib/meter-selector/frame';\n\n// Meter selector templates\nimport meterSelectorContentTemplate from 'shared/meter-selector-content.hbs';\nimport meterSelectorPaginatorTemplate from 'shared/meter-selector-paginator.hbs';\nimport productItemVTemplate from 'shared/meter-selector-product-item-v.hbs';\nimport productItemHTemplate from 'shared/meter-selector-product-item-h.hbs';\n\nComponentModule.AddModule('.meter-selector', {\n prefix: 'meter-selector-',\n components: [\n fetcher({\n props: {\n defaultCount: { type: Number, default: 0 },\n pageSize: { type: Number, default: 12 },\n requestQuoteButton: { type: String, default: '[href=\"#meterselector\"]' },\n },\n data: function(){\n return {\n // global\n data: {},\n \n // results\n count: this.defaultCount,\n\n // questions\n steps: [], \n stepNumber: 0,\n answerMemo: [],\n \n questions: [],\n answerModel: [],\n disabledContinue: true,\n notice: '',\n debounce: null,\n stepValues: [],\n isResultsPage: false,\n tagStepFlag: false,\n };\n },\n computed: {\n selectedUnit() {\n return store.state.units;\n },\n filters(){\n const filters = this.answerMemo.filter((_, i) => i < this.stepNumber ).reduce((a, aw) => {\n if (!aw) {\n return a;\n }\n\n const query = aw.reduce((ae, e) => ({...ae, ...e.query }), {});\n\n return {...a, ...query };\n } ,{});\n\n return filters;\n },\n hasButtons(){\n if (this.isResultsPage) {\n return false;\n }\n\n const questions = this.getQuestions(this.stepNumber);\n return Boolean(questions.find(q => q.button ));\n },\n isTransparent(){\n return this.isResultsPage || this.questions.length === 0 || this.hasButtons;\n },\n title(){\n if (this.isResultsPage) {\n const { title } = (this.data) || {};\n return title;\n }\n\n const tab = this.getTab(this.stepNumber);\n return (tab && tab.tabTitle) || null;\n },\n message(){\n if (!this.isResultsPage) {\n return null;\n }\n\n const { content } = (this.data) || {};\n return content;\n },\n closeLabel(){\n const results = this.data.searchResults || {};\n return results.CloseLabel;\n },\n nextLabel(){\n const results = this.data.searchResults || {};\n if (this.isResultsPage) {\n return results.AdjustParamsLabel;\n }\n\n return results.NextLabel;\n },\n skipLabel(){\n if (this.isResultsPage) {\n return null;\n }\n\n return this.data.searchResults && this.data.searchResults.SkipForNowLabel;\n },\n loadingMessage(){\n const results = this.data.searchResults || {};\n return results.LoadingLabel;\n },\n contactButton(){\n if (!this.isResultsPage) {\n return null;\n }\n\n return this.data.searchResults && { label: this.data.searchResults.ContactProductExpertLabel };\n }\n },\n watch: {\n isResultsPage(){\n if (!this.isResultsPage) {\n return;\n }\n\n const { tabs = [] } = this.data;\n const answerMemo = this.answerMemo;\n\n const questions = tabs.reduce((a, t, it) => {\n if (!t.questions){\n return a;\n }\n\n const questions = t.questions.map((q,i) => {\n return {...q, questionIndex: i, tabIndex: it };\n }).filter(q => !q.button);\n\n return [...a, ...questions];\n }, []); \n\n this.answerModel = questions.map((q, i) => {\n const { tabIndex, questionIndex, ...rest} = q;\n return answerMemo[q.tabIndex] && answerMemo[q.tabIndex][q.questionIndex]; \n });\n\n this.questions = questions;\n },\n answerModel(v){\n if (this.isResultsPage) {\n this.changedAnswerMemoOnResultPage();\n this.disabledContinue = false;\n this.notice = '';\n return;\n }\n\n const { enableNextWhen } = this.getTab(this.stepNumber);\n let questions = this.getQuestions(this.stepNumber);\n\n if (!questions) {\n return [];\n }\n\n questions = questions.map((q, i) => ({ ...q, index: i }));\n\n const answers = this.answerModel.filter(a => a);\n const answersValues = answers.reduce((o, a) => ({ ...o, [a.id]: a.value }), {});\n\n this.questions = questions.filter(q => {\n if (!q.showIfQuestion){\n return true;\n }\n\n const a = answersValues[q.showIfQuestion];\n\n return a && (typeof a === 'string' ? a === q.showIfValue : a.indexOf(q.showIfValue) >= 0);\n });\n\n const indexes = this.questions.map(q => q.index);\n const filteredAnswers = answers.filter(a => indexes.indexOf(a.index) >= 0);\n\n const { comparisonType = 'DEFAULT', stepIds = [] } = enableNextWhen || {};\n\n if (comparisonType === 'ANY') {\n this.disabledContinue = !((filteredAnswers.find(a => stepIds.indexOf(a.id) >= 0) || false) && true);\n } else if (comparisonType === 'ALL') {\n this.disabledContinue = filteredAnswers.filter(a => stepIds.indexOf(a.id) >= 0).length !== stepIds.length;\n } else {\n this.disabledContinue = this.questions.length !== filteredAnswers.length;\n }\n\n this.notice = (filteredAnswers.find(a => a.notice) || {}).notice || '';\n },\n filters: {\n handler: function(){\n this.data = {\n loadingMessage: this.isResultsPage && this.loadingMessage,\n };\n\n\n if (this.debounce){\n clearTimeout(this.debounce);\n }\n\n if (!this.isResultsPage) {\n this.loadData();\n }else{\n this.debounce = setTimeout(this.loadData, 600);\n }\n\n },\n deep: true\n },\n data: {\n handler: function(d){\n if (!d || !d.searchResults) {\n return;\n }\n\n const { TotalResults, remaining, ShowLastPage } = d.searchResults || {};\n const tabs = d.tabs || [];\n\n // set the total number of found results\n if (TotalResults !== undefined) {\n this.count = TotalResults\n }\n\n // for pagination\n !remaining && this.setData(d);\n\n this.steps = tabs.map(t => ({ label: t.tabTitleShort }));\n\n if (ShowLastPage) {\n this.stepNumber = this.steps.length;\n }\n\n this.isResultsPage = this.steps.length <= this.stepNumber;\n\n this.loadView();\n },\n deep: true\n },\n stepNumber(i) {\n this.tagStepFlag = true;\n this.loadView();\n },\n stepAnswers(v){\n }\n },\n created: function() {\n const bars = document.querySelectorAll('.persistent-cta');\n for (var i = 0; i < bars.length; i++){ const e = bars[i]; e.classList.add('persistent-cta--ms'); }\n },\n updated(){\n if (this.isResultsPage) {\n this.triggerForm();\n }\n },\n methods: {\n // Fetchs the remote data\n loadData: function(){\n const _this = this;\n let filters = {...this.filters};\n\n this.fetch(function(response){\n _this.setData(response.data || {});\n }, {\n params: {\n ...this.params,\n page: this.page,\n ...filters,\n },\n paramsSerializer: function (params) {\n return qs.stringify(params, {arrayFormat: 'repeat'})\n },\n });\n },\n\n // Pagination methods\n loadMore: function(e){\n this.setData(this.data);\n },\n setData: function(data){\n const { searchResults: { Results = [], remaining, ..._searchResults }, ...res } = data;\n let searchResults = {};\n\n if (!remaining) {\n searchResults = {\n Results: [\n ...Results.filter((_, i) => i < this.pageSize )\n ],\n remaining: Results.filter((_, i) => i >= this.pageSize ),\n ..._searchResults\n };\n\n this.onTriggerStepEvent(data);\n } else {\n searchResults = {\n Results: [\n ...Results,\n ...remaining.filter((_, i) => i < this.pageSize )\n ],\n remaining: remaining.filter((_, i) => i >= this.pageSize ),\n ..._searchResults\n };\n }\n\n this.data = {\n ...res,\n searchResults,\n nextPage: searchResults.remaining.length > 0\n };\n },\n\n // Step methods\n getTab(stepNumber, data) {\n const tabs = (data && data.tabs) || this.data.tabs || [];\n return tabs[stepNumber] || {};\n },\n getQuestions(stepNumber, data) {\n const tab = this.getTab(stepNumber, data);\n return tab.questions || [];\n },\n loadView() {\n this.setStepValues();\n\n if (this.isResultsPage){\n return;\n }\n\n this.answerModel = this.answerMemo[this.stepNumber] ? [...this.answerMemo[this.stepNumber]] : [];\n },\n setStepValues() {\n const tabs = this.data.tabs || [];\n if (tabs.length === 0) {\n return;\n }\n\n const answerMemo = this.answerMemo;\n\n this.stepValues = answerMemo.map((a, i) => {\n const tab = tabs[i] || {};\n\n if (tab.tabValue) {\n return tab.tabValue;\n }\n\n if (i >= this.stepNumber) {\n return '';\n }\n\n if (!a) {\n return '';\n }\n\n const label = a.map(e => {\n if (typeof e.value === 'object'){\n const { MoreLabel = '' } = this.data.searchResults || {};\n if (e.value.length <= 1) {\n return e.value.join();\n }\n const count = e.value.length-1;\n return e.value[0] + ` + ${count} ` + MoreLabel;\n }\n\n return e.value;\n }).join(' ');\n return label;\n });\n },\n onClickNextButton(skip=false) {\n if (this.isResultsPage) {\n this.$refs.slideBar.open(); \n return;\n }\n\n this.answerMemo = [...this.answerMemo];\n\n const indexes = this.questions.map(q => q.index);\n\n if(skip){\n this.answerMemo[this.stepNumber] = this.questions.map(q => this.questionSkipResult(q));\n } else {\n const anws = this.answerModel.reduce((a, e) => (!e ? a : {...a, [e.index]: e}), {});\n this.answerMemo[this.stepNumber] = indexes.map(i => anws[i] || {});\n }\n\n this.answerModel = [];\n this.stepNumber += 1;\n },\n onClickSkipButton() {\n this.onClickNextButton(true);\n },\n changeStepNumber(stepNumber) {\n this.stepNumber = stepNumber;\n },\n changedAnswerMemoOnResultPage(){\n const answerMemo = [...this.answerMemo];\n this.questions.forEach((q, i) => {\n const { tabIndex, questionIndex, ...rest} = q;\n if (!answerMemo[tabIndex]) {\n answerMemo[tabIndex] = [];\n }\n\n if (!this.answerModel[i]) {\n answerMemo[tabIndex][questionIndex] = this.questionSkipResult(q);\n return;\n }\n\n answerMemo[tabIndex][questionIndex] = this.answerModel[i];\n });\n\n this.answerMemo = answerMemo;\n },\n questionSkipResult(q){\n return { query: q.apiQuery.reduce((a, e) => ({ ...a, [e]: 'skip' }), {}) };\n },\n triggerTaggingEvent(data, type){\n if (!data){\n return;\n }\n\n const dataObject = {\n event: 'TF-Meter-Selection',\n type: 'tool',\n category: 'Meter Selector',\n ...data\n };\n\n try {\n if (type === 'immutable') {\n window.immutableDataLayerPush(dataObject);\n } else {\n window.customMutableDataLayerPush(dataObject);\n }\n } catch(err) {\n console.log('Analytics framework error: ', err)\n }\n },\n onTriggerQuestionEvent(data = {}){\n if (!Number.isInteger(data.questionIndex)){\n return;\n }\n\n if (!data || data.value === undefined) {\n return;\n }\n\n // tagging event\n const tab = this.getTab(this.stepNumber);\n const question = this.questions[data.questionIndex];\n const questionTitle = question.question || tab.tabTitle;\n const isButton = Boolean(question.button);\n\n this.triggerTaggingEvent({\n action: isButton ? questionTitle : question.filterName,\n label: isButton ? data.value.label : data.value,\n elementType: isButton ? 'button' : 'input',\n });\n },\n onTriggerStepEvent(data = {}){\n if (!this.tagStepFlag) {\n return;\n }\n\n this.tagStepFlag = false;\n\n // tagging event\n const i = this.stepNumber;\n const stepNo = this.padStart(String(i + 1), 2);\n const matchCount = data.searchResults && this.padStart(String(data.searchResults.TotalResults), 3);\n\n if (i < this.steps.length) {\n this.triggerTaggingEvent({\n stepNo,\n matchCount,\n stepName: this.steps[i].label\n }, 'immutable');\n } else if (i >= this.steps.length) {\n this.triggerTaggingEvent({\n stepNo,\n matchCount,\n stepName: 'COMPLETE'\n }, 'immutable');\n\n }\n },\n padStart(value, padSize = 2){\n let n = String(value);\n while (n.length < padSize) {n = \"0\" + n;}\n return n;\n },\n triggerForm() {\n const buttons = document.querySelectorAll(this.requestQuoteButton);\n const comments = this.answerMemo.reduce((a, o, i) => {\n if (!o) {\n return a;\n }\n\n const qa = o.filter(e => Boolean(e.label)).map(e => ({ label: e.label + (e.option && e.option.label ? ' in ' + e.option.label : ''), value: e.value }));\n\n return qa.length > 0 ? [...a, ...qa] : a;\n } , []);\n\n const commentsText = comments.filter(o => Boolean(o.value)).map(o => o.label.toUpperCase() + ': ' + (Array.isArray(o.value) ? o.value.join(', ') : o.value.toString())).join(' | ');\n\n for (var i = 0; i < buttons.length; i++){\n const button = buttons[i];\n button.dataset.comments = commentsText;\n }\n },\n },\n components: {\n 'meter-selector-paginator' : {\n props: ['data', 'isShow'],\n template: meterSelectorPaginatorTemplate,\n },\n 'meter-selector-content' : {\n props: ['data', 'count', 'isMatch', 'selectedUnit'],\n data: function() {\n return {\n };\n },\n computed: {\n viewProductLabel: function() {\n return this.data.searchResults.ViewProductLabel;\n },\n component(){\n return this.isMatch && this.count === 1 ? 'product-item-h' : 'product-item-v';\n }\n },\n components: {\n \"product-item-v\": {\n props: ['item', 'selectedUnit', 'viewProductLabel'],\n template: productItemVTemplate,\n components: {\n \"bookmark\": {\n props: ['item'],\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.productId ? this.$refs.bookmark.dataset.productId : this.$refs.bookmark.dataset.articleId ? this.$refs.bookmark.dataset.articleId : this.$refs.bookmark.dataset.documentId ? this.$refs.bookmark.dataset.documentId : this.$refs.bookmark.dataset.softwareId ? this.$refs.bookmark.dataset.softwareId : null;\n\n this.type = this.$refs.bookmark.dataset.productId ? \"productId\" : this.$refs.bookmark.dataset.articleId ? \"articleId\" : this.$refs.bookmark.dataset.documentId ? \"documentId\" : this.$refs.bookmark.dataset.softwareId ? \"softwareId\" : null;\n\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n }\n }\n },\n \"product-item-h\": {\n props: ['item', 'selectedUnit', 'viewProductLabel'],\n template: productItemHTemplate,\n components: {\n \"bookmark\": {\n props: ['item'],\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.productId ? this.$refs.bookmark.dataset.productId : this.$refs.bookmark.dataset.articleId ? this.$refs.bookmark.dataset.articleId : this.$refs.bookmark.dataset.documentId ? this.$refs.bookmark.dataset.documentId : this.$refs.bookmark.dataset.softwareId ? this.$refs.bookmark.dataset.softwareId : null;\n\n this.type = this.$refs.bookmark.dataset.productId ? \"productId\" : this.$refs.bookmark.dataset.articleId ? \"articleId\" : this.$refs.bookmark.dataset.documentId ? \"documentId\" : this.$refs.bookmark.dataset.softwareId ? \"softwareId\" : null;\n\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n \n }\n }\n },\n },\n watch: {\n },\n template: meterSelectorContentTemplate,\n },\n 'meter-selector-total': {\n props: ['count'],\n },\n }\n })\n ] \n});\n","import ComponentModule from 'lib/component-module';\nimport tabs from 'lib/tabs';\nimport {\n tabSelectMobile as tabSelectMobileTemplate,\n productItem as productItemTemplate,\n documentItem as documentItemTemplate,\n softwareItem as softwareItemTemplate,\n articleItem as articleItemTemplate\n} from 'lib/template-strings/my-saved-page';\nimport store from \"../store\";\n// import axios from \"axios\"\n// import fpodb from '../../../../db.json';\nimport EventBus from '../event-bus';\nimport VModal from 'vue-js-modal';\nimport {releaseNotesModal} from './../modals';\nimport Vue from 'vue/dist/vue.min.js';\n\nVue.use(VModal);\n\nComponentModule.AddModule('.my-saved-page', {\n prefix: 'my-saved-page-',\n components: [\n tabs({\n data: function() {\n return {\n savedIds: {\n products: [],\n documents: [],\n software: [],\n articles: [],\n legalDocuments: []\n }\n }\n },\n computed: {\n savedProducts: function() {\n return store.state.favorites.productId;\n },\n savedDocuments: function() {\n return store.state.favorites.documentId;\n },\n savedSoftware: function() {\n return store.state.favorites.softwareId;\n },\n savedArticles: function() {\n return store.state.favorites.articleId;\n },\n savedLegalDocuments: function() {\n return store.state.favorites.legalDocumentId;\n },\n },\n watch: {\n savedProducts: function() {\n this.savedIds.products = this.savedProducts[0] == \"\" ? this.savedProducts.shift() : this.savedProducts;\n },\n savedDocuments: function() {\n this.savedIds.documents = this.savedDocuments[0] == \"\" ? this.savedDocuments.shift() : this.savedDocuments;\n },\n savedSoftware: function() {\n this.savedIds.software = this.savedSoftware[0] == \"\" ? this.savedSoftware.shift() : this.savedSoftware;\n },\n savedArticles: function() {\n this.savedIds.articles = this.savedArticles[0] == \"\" ? this.savedArticles.shift() : this.savedArticles;\n },\n savedLegalDocuments: function() {\n this.savedIds.legalDocuments = this.savedLegalDocuments[0] == \"\" ? this.savedLegalDocuments.shift() : this.savedLegalDocuments;\n }\n },\n methods: {\n initSavedIds() {\n this.savedIds.products = this.savedProducts[0] == \"\" ? this.savedProducts.shift() : this.savedProducts;\n this.savedIds.documents = this.savedDocuments[0] == \"\" ? this.savedDocuments.shift() : this.savedDocuments;\n this.savedIds.software = this.savedSoftware[0] == \"\" ? this.savedSoftware.shift() : this.savedSoftware;\n this.savedIds.articles = this.savedArticles[0] == \"\" ? this.savedArticles.shift() : this.savedArticles;\n this.savedIds.legalDocuments = this.savedLegalDocuments[0] == \"\" ? this.savedLegalDocuments.shift() : this.savedLegalDocuments;\n }\n },\n created() {\n this.initSavedIds();\n },\n mounted() {\n },\n components: {\n tabSelectMobile: {\n name: 'tab-select-mobile',\n template: tabSelectMobileTemplate,\n props: {\n currentTab: [String, Number],\n selectClass: { type: String, default: 'my-saved-page__tab-select' },\n changeTab: Function,\n savedData: Object\n },\n data: function() {\n const data = {\n options: [],\n };\n\n return data;\n },\n mounted() {\n const defaultSlots = this.$slots.default;\n const childSlot = defaultSlots && defaultSlots[0]\n const children = childSlot && childSlot.children;\n if (children) {\n \n children.forEach(c => {\n const options = c.componentOptions;\n if (!options || options.tag !== 'tab'){\n return;\n }\n\n const props = options.propsData;\n const span = options.children[0];\n const text = span && span.children[0] && span.children[0].text;\n const id = props.idTab;\n\n this.options.push({id, text});\n });\n }\n },\n methods: {\n change: function(e) {\n this.changeTab(e.target.value);\n }\n }\n },\n savedProducts: {\n name: 'saved-products',\n props: ['savedIds'],\n data: function() {\n return {\n checked: [],\n checkedStr: null\n }\n },\n watch: {\n \"checked\": function() {\n this.checkedStr = this.checked.map((item) => {\n return `${item.name}`\n }).join(`\\n`);\n }\n },\n components: {\n productItem: {\n name: 'product-item',\n // template: productItemTemplate,\n props: ['checked', 'savedIds'],\n data: function() {\n const data = {\n id: null,\n isChecked: null,\n isBookmarked: false,\n type: 'productId'\n };\n \n return data;\n },\n watch: {\n isChecked: function() {\n let param = this.isChecked ? \"add\" : \"remove\";\n let url = this.$refs.url.getAttribute('href');\n let name = this.$refs.url.innerText;\n\n let obj = {\n 'id': this.id,\n 'url': url,\n 'name': name\n }\n\n EventBus.$emit('update-checked', param, obj);\n },\n \"savedIds.products\": function() {\n this.isBookmarked = this.savedIds.products.includes(this.id) ? true : false;\n }\n },\n mounted() {\n this.id = this.$refs.checkbox.dataset.productId;\n this.isBookmarked = this.savedIds.products.includes(`${this.id}`) ? true : false;\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n },\n },\n methods: {\n requestaquote() {\n console.log(\"REQUEST A QUOTE\");\n }\n },\n mounted() {\n EventBus.$on('update-checked', (param, value) => {\n if ( param == \"add\") {\n this.checked.push(value);\n } else {\n let match = this.checked.find((item) => {\n return item.id == value.id\n });\n\n let index = this.checked.map((item) => {\n return item.id;\n }).indexOf(value.id);\n if (match) {\n this.checked.splice(this.checked.indexOf(index), 1);\n }\n\n }\n });\n }\n }, \n docItem: {\n name: 'doc-item',\n props: ['savedIds'],\n data: function() {\n return {\n id: null,\n isBookmarked: false,\n type: 'documentId',\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n components: {\n\n },\n watch: {\n \"savedIds.documents\": function() {\n this.isBookmarked = this.savedIds.documents.includes(this.id) ? true : false;\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n methods: {\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.documentId;\n this.isBookmarked = this.savedIds.documents.includes(`${this.id}`) ? true : false;\n this.initSeeAll();\n }\n },\n legalDocItem: {\n name: 'legal-doc-item',\n props: ['savedIds'],\n data: function() {\n return {\n id: null,\n isBookmarked: false,\n type: 'legalDocumentId',\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null,\n }\n },\n components: {\n\n },\n watch: {\n \"savedIds.legalDocuments\": function() {\n this.isBookmarked = this.savedIds.legalDocuments.includes(this.id) ? true : false;\n },\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n }\n },\n methods: {\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails},`;\n }\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.legalDocumentId;\n this.isBookmarked = this.savedIds.legalDocuments.includes(`${this.id}`) ? true : false;\n this.initSeeAll();\n }\n },\n softwareItem: {\n name: 'software-item',\n props: ['savedIds'],\n data: function() {\n return {\n id: null,\n isBookmarked: false,\n type: 'softwareId',\n }\n },\n components: {\n\n },\n watch: {\n \"savedIds.software\": function() {\n this.isBookmarked = this.savedIds.software.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleModal() {\n let releaseNotes = this.$refs.releaseNotes.innerHTML;\n this.$modal.show(\n releaseNotesModal.template(releaseNotes),\n releaseNotesModal.name,\n releaseNotesModal.options\n )\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.softwareId;\n this.isBookmarked = this.savedIds.software.includes(`${this.id}`) ? true : false;\n }\n },\n articleItem: {\n name: 'article-item',\n props: ['savedIds'],\n data: function() {\n return {\n id: null,\n isBookmarked: false,\n type: 'articleId',\n }\n },\n components: {\n\n },\n watch: {\n \"savedIds.articles\": function() {\n this.isBookmarked = this.savedIds.articles.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.articleId;\n this.isBookmarked = this.savedIds.articles.includes(`${this.id}`) ? true : false;\n }\n }\n \n },\n tabProps: {\n savedIds: Object\n },\n tabOptions: {\n computed: {\n taggingMeta: function() {\n return null\n }\n }\n }, \n tabContentOptions: {\n computed: {\n taggingMeta: function() {\n return null\n }\n }\n }, \n contentProps: {\n savedIds: Object\n }\n }),\n \n ]\n});\n\n// window.seeLessLabel = \"see less\";\n// window.seeAllLabel = \"see more\";","import ComponentModule from 'lib/component-module';\nimport fetcher from 'lib/fetcher';\nimport store from '../store';\n\nimport {\n content as recentPostsContentTemplate,\n paginator as recentPostsPaginatorTemplate,\n} from 'lib/template-strings/recent-posts';\n\nComponentModule.AddModule('.recent-posts', {\n prefix: 'recent-posts-',\n components: [\n fetcher({\n data: function(){\n const data = {\n data: {\n firstLoad: true,\n keepContent: true,\n results: [],\n store: store,\n }\n };\n\n return data;\n },\n computed: {\n language: function() {\n return store.state.currentLang;\n },\n taggingMetaMarket: function() {\n return JSON.stringify({\n \"type\": \"dropdown\",\n \"category\": \"Dropdown\",\n \"action\": this.params.market,\n \"label\": \"Market\",\n }); \n },\n taggingMetaTechnology: function() {\n return JSON.stringify({\n \"type\": \"dropdown\",\n \"category\": \"Dropdown\",\n \"action\": this.params.technology,\n \"label\": \"Technology\",\n }); \n },\n taggingMetaProductLine: function() {\n return JSON.stringify({\n \"type\": \"dropdown\",\n \"category\": \"Dropdown\",\n \"action\": this.params.productLine,\n \"label\": \"Post Type\",\n }); \n }\n\n },\n watch: {\n \"language\": function() {\n this.params.lang = this.language;\n }\n },\n methods: {\n loadMore: function(e){\n const _this = this;\n\n this.fetch(function(response){\n let _results = [];\n let keepContent = false;\n const { results, ...data } = response.data || {};\n\n if (!results) {\n return false;\n }\n\n if (_this.data && _this.data.results) {\n _results = _this.data.results;\n keepContent = _this.data.keepContent;\n }\n\n _this.data = {\n ...data,\n results: [\n ..._results,\n ...results,\n ],\n keepContent,\n showPaginator: data.currentPage < data.totalPages,\n };\n }, {\n params: {\n ...this.params,\n page: (this.data && this.data.nextPage) || 2,\n pageSize: 8,\n }\n });\n },\n },\n components: {\n 'recent-posts-paginator' : {\n props: ['data', 'isShow'],\n template: recentPostsPaginatorTemplate,\n },\n 'recent-posts-content' : {\n props: ['data'],\n template: recentPostsContentTemplate,\n }\n }\n })\n ]\n});\n","import ComponentModule from 'lib/component-module';\nimport tabs from 'lib/tabs';\nimport {\n contentApplications as contentApplicationsTemplate,\n} from 'lib/template-strings/solution-area';\nimport { applicationsModal } from \"../modals\";\nimport Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport store from \"../store\";\n\nVue.use(VModal);\n\nComponentModule.AddModule('.solution-area', {\n prefix: 'solution-area-',\n components: [\n tabs({\n data: function() {\n return {\n isMobile: null,\n store: store\n }\n },\n watch: {\n isMobile: function() {\n if (!this.isMobile) {\n this.$modal.hide('applications');\n }\n }\n },\n methods: {\n changeTab: function(id){\n if (this.currentTab != id) {\n this.currentTab = id;\n this.$nextTick(() => {\n this.scrollToTop();\n })\n } else {\n // close tab if clicked again\n if(this.isMobile) {\n this.currentTab = null;\n }\n }\n },\n showModal() {\n const apps = document.querySelector('.solution-area__applications-item.active').cloneNode(true);\n console.log(applicationsModal.name);\n this.$modal.show(\n applicationsModal.template,\n applicationsModal.name,\n applicationsModal.options,\n applicationsModal.events(apps)\n )\n },\n hideApplications : function () {\n this.$modal.hide('applications');\n },\n checkIsMobile() {\n // this is checking for a breakpoint *smaller* than\n // var isMobile in store.js\n var mql = window.matchMedia('(max-width: 650px)');\n this.isMobile = mql.matches ? true : false;\n \n mql.addEventListener('change',() => {\n this.isMobile = mql.matches ? true : false;\n });\n },\n scrollToTop() {\n let el = this.$el.querySelector('.solution-area__content-item.active');\n let elmOffset = el.offsetTop;\n let scrollOffset = window.scrollY;\n // console.log(\"el\",elmOffset);\n // console.log(\"window\",scrollOffset);\n if (elmOffset < scrollOffset) {\n let elmPos = el.getBoundingClientRect().top + window.scrollY;\n setTimeout(function() {\n window.scrollTo({\n top: (elmPos - 70),\n behavior: 'smooth'\n });\n },500);\n }\n },\n },\n components: {\n 'applications-content': {\n name: 'applications-content',\n template: contentApplicationsTemplate,\n props: {\n idTab: [String, Number],\n currentTab: [String, Number],\n activeClass: {type: String, default: 'active'},\n close: Function\n },\n data: function() {\n return {\n label: null\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\", //static \n \"category\": \"Drawer\", //static\n \"action\": \"Open\", // static\n \"label\": this.label, // Tab label e.g. District system balancing\n \"no\": this.idTab < 10 ? `0${this.idTab}` : `${this.idTab}`\n })\n }\n },\n mounted() {\n this.label = Array.prototype.slice.call(document.querySelectorAll('.solution-area__tabs li'))[(this.idTab - 1)].innerText;\n }\n },\n },\n tabData: {\n label: null\n },\n tabOptions: {\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\", //static \n \"category\": \"Drawer\", //static\n \"action\": \"Open\", // static\n \"label\": this.label, // Tab label e.g. District system balancing\n \"no\": this.idTab < 10 ? `0${this.idTab}` : `${this.idTab}`\n })\n }\n },\n mounted() {\n this.label = this.$el.innerText;\n }\n },\n tabContentData: {\n label: null\n },\n tabContentOptions: {\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\", //static \n \"category\": \"Drawer\", //static\n \"action\": \"Open\", // static\n \"label\": this.label, // Tab label e.g. District system balancing\n \"no\": this.idTab < 10 ? `0${this.idTab}` : `${this.idTab}`\n })\n }\n },\n mounted() {\n this.label = Array.prototype.slice.call(document.querySelectorAll('.solution-area__tabs li'))[(this.idTab - 1)].innerText;\n }\n },\n mounted() {\n this.checkIsMobile();\n }\n })\n ]\n});\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst pardotFormInstance = Vue.component('pardot-form', {\n data: function() {\n return {\n }\n },\n computed: {\n paramData: function() {\n return ({\n GAID: store.state.GAID\n })\n }\n },\n methods: {\n handleIframe() {\n let iframe = this.$el;\n let src = this.$el.getAttribute('src');\n\n window.addEventListener(\"message\", (event) => {\n if (event.origin == \"https://info.badgermeter.com\") {\n this.$nextTick(() => {\n sizeIframe(event);\n postData(event);\n });\n }\n });\n\n const postData = (event) => {\n // console.log(this.paramData);\n if (iframe.contentWindow) {\n iframe.contentWindow.postMessage(JSON.stringify(this.paramData), '*');\n } else {\n iframe.onload = function() {\n iframe.contentWindow.postMessage(JSON.stringify(this.paramData), '*');\n }\n }\n }\n \n const sizeIframe = (event) => {\n let data = JSON.parse(event.data);\n // console.log(data);\n if (data.form) {\n if ( src.includes(data.form) ) {\n iframe.style.height = `${data.content + 20}px`;\n if (data.submit) {\n this.checkScroll();\n }\n }\n }\n };\n \n },\n checkScroll() {\n let iframe = this.$el;\n let iframePos = iframe.offsetTop;\n let scrollOffset = window.scrollY;\n\n if (iframePos < scrollOffset) {\n let elmPos = iframe.getBoundingClientRect().top + window.scrollY - 100;\n setTimeout(function() {\n window.scrollTo({\n top: (elmPos - 70),\n behavior: 'smooth'\n });\n },500);\n }\n }\n },\n mounted() {\n this.handleIframe();\n }\n});\n\nconst pardotForm = () => {\n\n let forms = document.querySelectorAll('.pardot-form');\n\n let formConstructor = (id) => {\n pardotFormInstance;\n\n new Vue({\n el: `.pardot-form-${id}`,\n }).$mount(`.pardot-form-${id}`, true);\n }\n\n if (forms.length > 0) {\n forms.forEach((item, index) => {\n item.classList.add(`pardot-form-${index}`);\n formConstructor(index);\n })\n }\n\n}\n\nexport {pardotForm, pardotFormInstance};","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {patentsModal} from './modals';\n\nVue.use(VModal);\n\nconst patents = () => {\n\n let patentItems = document.querySelectorAll('.patents');\n\n let patentsConstructor = (id) => {\n Vue.component('patents', {\n data: function() {\n return {\n allPatents: null\n }\n },\n methods: {\n triggerModal() {\n this.$modal.show(\n patentsModal.template,\n patentsModal.name, \n patentsModal.options,\n patentsModal.events(this.allPatents)\n )\n }\n },\n mounted() {\n this.$nextTick(() => {\n this.allPatents = this.$refs.allPatents;\n });\n }\n });\n\n new Vue({\n el: `.patents-${id}`,\n }).$mount(`.patents-${id}`, true);\n }\n\n if (patentItems.length > 0) {\n patentItems.forEach((item, index) => {\n item.classList.add(`patents-${index}`);\n patentsConstructor(index);\n })\n }\n\n}\n\nexport default patents;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport { debounce } from './misc';\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nconst ProductCatalog = () => {\n\n let catalog = document.querySelectorAll('.product-catalog');\n\n const productCatalogConstructor = (id) => {\n Vue.component('product-catalog-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true, //is filter area (including unit toggler and btns) visible\n filters: [],\n products: [],\n results: [],\n emailDocs: [], //for emailing\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs\n savedDocsOnly: null,\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n shareAll: false,\n selectedUnit: null,\n usLabel: '',\n metricLabel: '',\n store: store,\n viewProductLabel: null,\n class: 'product-catalog',\n\n }\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.productId[0] == \"\" ? store.state.favorites.productId.slice(1) : store.state.favorites.productId;\n },\n computedUnit: function() {\n return store.state.units;\n },\n pageRange: function() {\n if (this.data.totalResults > 9) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n },\n watch: {\n computedUnit: function() {\n this.data.selectedUnit = this.computedUnit;\n // console.log(\"unit changed\");\n this.getUrl();\n // this.updateHistory();\n },\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDownloads');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedProducts\";\n });\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n },\n \"data.currentPage\": function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n }\n },\n methods: {\n toggleFilters() {\n // console.log(\"clicked\");\n if (this.data.isMobile) {\n // console.log(\"is mobile\");\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return;\n }\n var type = type;\n var value = encodeURIComponent(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1; //reset page to 1\n\n if (checked) {\n switch(type) {\n case \"measuringMedium\":\n let measureFilter = this.data.filters.map((e) => {\n return e.type\n });\n // console.log(measureFilter);\n if (measureFilter.indexOf('measuringMedium') > -1) {\n let index = measureFilter.indexOf('measuringMedium');\n this.data.filters.splice(index,1);\n this.data.filters = [...this.data.filters, \n {\"value\": value, \n \"type\": type, \n \"name\": label\n }];\n } else {\n this.data.filters = [...this.data.filters, \n {\"value\": value, \n \"type\": type, \n \"name\": label}];\n }\n break;\n case \"savedProducts\":\n this.data.filters = [...this.data.filters, \n {\"value\": checked, \n \"type\": type, \n \"name\": label}];\n break;\n default: \n this.data.filters = [...this.data.filters, \n {\"value\": value, \n \"type\": type, \n \"name\": label}];\n }\n\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n console.log(\"updateFilters - this.data.filters=\", this.data.filters);\n\n },\n updateRangeFilter(entry) {\n this.data.currentPage = 1; //reset page to 1 when filters changed\n // console.log(entry);\n // allow only once instance of filter type at once for ranges\n let types = this.data.filters.map((e) => {\n return e.type\n });\n if (types.indexOf(entry.type) > -1) {\n let index = types.indexOf(entry.type);\n\n if (this.data.filters[index].value == entry.value && this.data.filters[index].type == entry.type) {\n // if old and new entries are the same, do nothing\n return;\n } else {\n // only update filters if new entry values differ\n this.data.filters.splice(index,1);\n this.data.filters = [...this.data.filters, entry];\n }\n\n } else {\n this.data.filters = [...this.data.filters, entry];\n }\n // this.data.filters = [...this.data.filters, entry];\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) { return; }\n if (value) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.type\n }).indexOf(type);\n // console.log(\"remove\", index);\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n \n getUrl() {\n let savedParams = this.data.savedDocs.toString();\n let unitParams = this.computedUnit;\n\n let marketParams = this.data.filters.filter(item => {\n return item.type == \"market\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let productCatParams = this.data.filters.filter(item => {\n return item.type == \"productCategory\"\n }).map(item => {\n return item.value;\n }).toString();\n let subparams = this.data.filters.filter(item => {\n return item.type == \"subparam\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let productTypeParams = this.data.filters.filter(item => {\n return item.type == \"productType\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let productLineParams = this.data.filters.filter(item => {\n return item.type == \"productLine\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let measuringParams = this.data.filters.filter(item => {\n return item.type == \"measuringMedium\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedProducts\";\n })\n if (savedOnly) {\n return savedOnly.value;\n } else {\n return false;\n }\n }\n \n let pageParams = this.data.currentPage;\n\n let sizeMinParams = this.data.filters.filter(item => {\n return item.type == \"sizeMin\"\n }).map(item => {\n return item.value;\n }).toString();\n let sizeMaxParams = this.data.filters.filter(item => {\n return item.type == \"sizeMax\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let tempMinParams = this.data.filters.filter(item => {\n return item.type == \"temperatureMin\"\n }).map(item => {\n return item.value;\n }).toString();\n let tempMaxParams = this.data.filters.filter(item => {\n return item.type == \"temperatureMax\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let pressureMinParams = this.data.filters.filter(item => {\n return item.type == \"pressureMin\"\n }).map(item => {\n return item.value;\n }).toString();\n let pressureMaxParams = this.data.filters.filter(item => {\n return item.type == \"pressureMax\"\n }).map(item => {\n return item.value;\n }).toString();\n\n let flowRangeMinParams = this.data.filters.filter(item => {\n return item.type == \"flowRangeMin\"\n }).map(item => {\n return item.value;\n }).toString();\n let flowRangeMaxParams = this.data.filters.filter(item => {\n return item.type == \"flowRangeMax\"\n }).map(item => {\n return item.value;\n }).toString();\n let flowRangeType = this.data.filters.filter(item => {\n return item.type == \"flowRangeMax\" || item.type == \"flowRangeMin\"\n }).map(item => {\n return item.flowRangeType;\n }).toString();\n\n this.data.urlParams = `${unitParams !== \"\" ? \"&units=\" + unitParams : \"\"}${marketParams !== \"\" ? \"&market=\" + marketParams : \"\"}${productCatParams !== \"\" ? \"&productCategory=\" + productCatParams : \"\"}${productTypeParams !== \"\" ? \"&productType=\" + productTypeParams : \"\"}${productLineParams !== \"\" ? \"&productLine=\" + productLineParams : \"\"}${measuringParams !== \"\" ? \"&measuringMedium=\" + measuringParams : \"\"}&savedProducts=${savedDocumentsTrueParams()}${subparams !== \"\" ? \"&subparam=\" + subparams : \"\"}&page=${pageParams}`;\n\n // console.log(apiUrl);\n // this.data.apiUrl = apiUrl;\n },\n getResults() {\n // let apiUrl = \"api/documents?\";\n this.getUrl();\n let baseUrl = window.productCatalogAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/products\"; //from json-server\n // let apiUrl = \"http://localhost:3003/productsTest\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedProducts\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var market = [];\n var productCategory = [];\n var productType = [];\n var productLine = [];\n var subparam = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"market\":\n market.push(item.value);\n break;\n case \"productCategory\":\n productCategory.push(item.value);\n break;\n case \"productLine\":\n productLine.push(item.value);\n break;\n case \"productType\":\n productType.push(item.value);\n break;\n case \"subparam\":\n subparam.push(item.value);\n default:\n return;\n }\n });\n\n const getValue = (param) => {\n let filter = this.data.filters.find((item) => {\n return item.type === param;\n });\n return filter ? filter.value : null;\n }\n\n const getFlowRangeType = () => {\n let filter = this.data.filters.find((item) => {\n return item.type === \"flowRangeMin\" || item.type === \"flowRangeMax\";\n });\n return filter ? filter.flowRangeType : null;\n }\n\n let axiosParams = {\n // language: null,\n units: this.computedUnit,\n market: market.join('|') == \"\" ? null : decodeURIComponent(market.join('|')),\n productCategory: productCategory.join('|') == \"\" ? null : decodeURIComponent(productCategory.join('|')),\n productType: productType.join('|') == \"\" ? null : decodeURIComponent(productType.join('|')),\n productLine: productLine.join('|') == \"\" ? null : decodeURIComponent(productLine.join('|')),\n sizeMin: getValue('sizeMin'),\n sizeMax: getValue('sizeMax'),\n flowRangeType: getFlowRangeType(),\n flowRangeMin: getValue('flowRangeMin'),\n flowRangeMax: getValue('flowRangeMax'),\n measuringMedium: getValue('measuringMedium') == null ? null : decodeURIComponent(getValue('measuringMedium')),\n temperatureMin: getValue('temperatureMin'),\n temperatureMax: getValue('temperatureMax'),\n pressureMin: getValue('pressureMin'),\n pressureMax: getValue('pressureMax'),\n savedProducts: savedDocumentsTrueParams(),\n subparam: subparam.join('|') == \"\" ? null : decodeURIComponent(subparam.join('|')),\n saved: this.data.savedDocs.join('|') == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'),\n page: this.data.currentPage,\n pageSize: 9,\n }\n\n console.log(axiosParams);\n\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults ? response.data.totalResults : 0;\n self.data.shownResults = response.data.results ? response.data.results.length : 0;\n self.data.viewProductLabel = response.data.viewProductLabel;\n //console.log(response.data);\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n EventBus.$emit('scroll-to-top', this.data.class);\n },\n updateEmailDocs(data) {\n let item = this.data.emailDocs.find(item => {\n return item.id == data.id;\n });\n\n if (!item) {\n this.data.emailDocs = [...this.data.emailDocs, data];\n } else {\n this.data.emailDocs.splice(this.data.emailDocs.indexOf(item),1);\n }\n },\n //update history record when filters change\n updateHistory() {\n let url = `${window.location.pathname}?${this.data.urlParams}`;\n if (history.state == null || history.state !== url) {\n history.pushState(url,\"\",url);\n }\n },\n // handle deep linking on history change\n deeplink() {\n let params = window.location.search.substr(1).split(\"&\").filter(item => {\n return item != \"\"\n });\n // console.log(params);\n // this.data.filters = []; //clear filters array first\n\n var initFilters = [];\n\n params.forEach(param => {\n let type = param.slice(0, param.indexOf('='));\n let content = param.slice(param.indexOf('=') + 1);\n // console.log(\"TYPE\",type);\n // console.log(\"CONTENT\", content);\n\n let entry = {}\n if (type == \"page\") {\n this.data.currentPage = parseInt(content);\n } else if (type == \"units\") {\n this.data.selectedUnit = content;\n } else if (type == \"savedProducts\") {\n if (content == \"false\" || content == false) {\n return;\n } else {\n entry = {\n \"type\": type,\n \"value\": true,\n \"name\": this.data.savedDocsLabel\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n } else if (content.indexOf(',') > -1) {\n let contentArray = content.split(',');\n contentArray.forEach(item => {\n entry = {\n \"type\": type,\n \"value\": item,\n \"name\": decodeURIComponent(item)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n });\n } else {\n entry = {\n \"type\": type,\n \"value\": content,\n \"name\": decodeURIComponent(content)\n }\n\n initFilters = [\n ...initFilters,\n entry\n ]\n }\n\n this.data.filters = initFilters;\n \n // console.log(this.initFilters);\n\n });\n },\n toggleUnits() {\n store.commit('setUnits');\n },\n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.product-catalog__area-cards').getBoundingClientRect().top + window.scrollY - 100;\n // console.log(top);\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n // 9 = page size\n this.data.totalPages = Math.ceil(this.data.totalResults / 9);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n init() {\n // init data variables\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.productId[0] == \"\" ? store.state.favorites.productId.slice(1) : store.state.favorites.productId;\n this.data.selectedUnit = store.state.units;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true; // hide filters if less then 10 initial results\n this.data.shareAll = parseInt(this.data.totalResults) <= 5 ? true : false; // enable \"share all\" if 5 of less results\n this.data.usLabel = this.$refs.unitToggler.dataset.usLabel;\n this.data.metricLabel = this.$refs.unitToggler.dataset.metricLabel;\n\n // init eventbus listeners\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('updateRangeFilter', (entry) => {\n this.updateRangeFilter(entry);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n });\n EventBus.$on('email-docs', (data) => {\n this.updateEmailDocs(data);\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n\n // init initial results\n if (window.defaultFilter) {\n this.data.filters.push(window.defaultFilter);\n }\n this.data.results = window.initialProductApiResults.results;\n this.data.totalResults = window.initialProductApiResults ? window.initialProductApiResults.totalResults : 0;\n this.data.shownResults = window.initialProductApiResults.results ? window.initialProductApiResults.results.length : 0;\n this.data.viewProductLabel = window.initialProductApiResults ? window.initialProductApiResults.viewProductLabel : null;\n\n // this.data.results = fpodb.products.results;\n // this.data.totalResults = fpodb.products.totalResults;\n // this.data.shownResults = fpodb.products.results ? fpodb.products.results.length : 0;\n // this.data.viewProductLabel = fpodb.products.viewProductLabel;\n \n // window.onpopstate = () => {\n // this.deeplink();\n // }\n }\n },\n mounted() {\n this.init();\n this.initPages();\n // for deeplinking\n // if (window.location.search) {\n // this.$nextTick(() => {\n // this.deeplink();\n // });\n // }\n }\n });\n \n // results list\n Vue.component('product-results-list', {\n props: ['data'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('product-results-item', {\n props: ['data', 'content', 'index'],\n data: function() {\n return {\n isChecked: false,\n isBookmarked: false,\n id: this.content.id || null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.productId;\n },\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"layer\",\n \"category\": \"Preview Card\",\n \"productLine\": this.content.brand,\n \"label\": this.content.productName ? this.content.productName.replace('

    ', '').replace('

    ','') : null,\n \"no\": this.index < 10 ? `0${this.index + 1}` : (this.index + 1).toString()\n })\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"content\": function() {\n this.id = this.content.id || null;\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n template: `\n
    \n
    \n
    \n
    \n \n
    \n
    \n \n
    \n
    \n \n \n \n
    \n \n \n
    \n\n
    \n\n
    \n
    {{spec.label}}
    \n
    \n
    {{spec.valueMetric}}
    \n
    {{spec.valueImperial}}
    \n
    \n
    \n \n
    \n\n \n
    \n
    \n `,\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"productId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n }\n },\n mounted() {\n // this.id = this.$refs.bookmark.dataset.productId;\n // console.log(\"saved\",this.saved);\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n });\n\n Vue.component('email-docs', {\n props: ['data'],\n data: function() {\n return {\n mailto: null,\n mailtoAll: null\n }\n },\n watch: {\n \"data.emailDocs\": function() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.data.emailDocs.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${item.url}%0D%0A`;\n });\n this.mailto = mailto;\n }\n },\n methods: {\n shareAll() {\n let mailto = \"mailto:?subject=Badger%20Meter%20Document%20Links&body=\";\n this.data.results.forEach(item => {\n mailto = `${mailto}${encodeURIComponent(item.name)}: ${item.url}%0D%0A`;\n });\n this.mailtoAll = mailto;\n }\n },\n mounted() {\n if (parseInt(this.data.totalResults) <= 5) {\n this.shareAll();\n }\n }\n });\n\n Vue.component('min-max', {\n props: ['data'],\n data: function() {\n return {\n minValue: null, //final values to send to api\n minValueRange: null, // model for range slider\n minValueInput: null, // model for input field\n maxValue: null, //final values to send to api\n maxValueRange: null, // model for range slider\n maxValueInput: null, // model for input field\n\n usMin: null,\n usMax: null,\n usStep: null,\n metricMin: null,\n metricMax: null,\n metricStep: null,\n\n currentMin: null,\n currentMax: null,\n currentStep: null,\n styles: null,\n\n type: null,\n currentUnit: null,\n label: null\n }\n },\n watch: {\n \"data.filters\": function() {\n let types = this.data.filters.map((e) => {\n return e.type\n });\n if (!(types.indexOf(`${this.type}Min`) > -1)) {\n this.minValue = null;\n }\n if (!(types.indexOf(`${this.type}Max`) > -1)) {\n this.maxValue = null;\n }\n },\n \"data.selectedUnit\": function() {\n this.initCurrentUnits();\n this.initUnitLabel();\n // reset selectors when units change\n this.maxValue = null;\n this.minValue = null;\n this.minValueRange = this.currentMin;\n this.maxValueRange = this.currentMax;\n\n // clear inputs and input filters when changing units\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Min`);\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Max`);\n },\n \"minValue\": function() {\n // if at max value, set to null for 'no min' and remove filter\n // if value exceeds min or max range, set to one step under max value\n if (this.minValue == this.currentMin || this.minValue == \"\") {\n this.minValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Min`);\n } else if (parseFloat(this.minValue) < parseFloat(this.currentMin) || parseFloat(this.minValue) > parseFloat(this.currentMax)) {\n // this.minValue = parseFloat(this.currentMin) === 0 ? 0 : (parseFloat(this.currentMin) - parseFloat(this.currentStep)).toString();\n this.minValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Min`);\n }\n\n this.updateFilters(\"Min\");\n this.minValueRange = this.minValue == null ? this.currentMin : this.minValue;\n this.minValueInput = this.minValue;\n\n },\n \"maxValue\": function() {\n // if at max value, set to null for 'no max' and remove filter\n // if value exceeds min or max range, set to one step under max value\n if (this.maxValue == this.currentMax || this.maxValue == \"\") {\n this.maxValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Max`);\n } else if (parseFloat(this.maxValue) > parseFloat(this.currentMax) || parseFloat(this.maxValue) < parseFloat(this.currentMin)) {\n // this.maxValue = (parseFloat(this.currentMax) - parseFloat(this.currentStep)).toString();\n this.maxValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, `${this.type}Max`);\n }\n\n this.updateFilters(\"Max\");\n this.maxValueRange = this.maxValue == null ? this.currentMax : this.maxValue;\n this.maxValueInput = this.maxValue;\n },\n \"maxValueRange\": function() {\n // condition to prevent dragging slider beyond the valid range\n if (parseFloat(this.maxValueRange) <= parseFloat(this.minValueRange)) {\n this.maxValueRange = (parseFloat(this.minValueRange) + parseFloat(this.currentStep)).toString();\n }\n\n this.maxValueInput = this.maxValueRange == this.currentMax ? null : this.maxValueRange;\n this.initStyles();\n\n },\n \"minValueRange\": function() {\n // condition to prevent dragging slider beyond the valid range\n if (parseFloat(this.minValueRange) >= parseFloat(this.maxValueRange)) {\n this.minValueRange = (parseFloat(this.maxValueRange) - parseFloat(this.currentStep)).toString();\n }\n\n this.minValueInput = this.minValueRange == this.currentMin ? null : this.minValueRange;\n this.initStyles();\n }\n },\n methods: {\n updateFilters: debounce(function(type) {\n // console.log(\"type:\", type);\n let entry = {\n name: `${type} ${this.label}: ${type == \"Min\" ? this.minValue : this.maxValue} ${this.currentUnit}`,\n value: type == \"Min\" ? this.minValue : this.maxValue,\n type: `${this.type}${type}`\n }\n // console.log(entry);\n if (entry.value !== null) {\n EventBus.$emit('updateRangeFilter', entry);\n }\n\n }, 500),\n handleRange: debounce(function(e, type) {\n let _t = e.target;\n var min = type == \"min\" ? _t.value : this.minValue;\n var max = type == \"max\" ? _t.value : this.maxValue; \n // console.log(\"MAX\", max);\n if (type == \"min\") {\n if (parseFloat(min) >= parseFloat(max)) {\n min = (parseFloat(max) - parseFloat(this.currentStep)).toString();\n }\n } else if (type == \"max\") {\n if (parseFloat(max) <= parseFloat(min)) {\n max = (parseFloat(min) + parseFloat(this.currentStep)).toString();\n }\n }\n\n this.minValue = min;\n this.maxValue = max;\n\n this.minValueInput = this.minValueInput !== this.minValue && this.minValue !== null ? this.minValue : this.minValueInput;\n this.maxValueInput = this.maxValueInput !== this.maxValue && this.maxValue !== null ? this.maxValue : this.maxValueInput;\n\n }, 500),\n initEvents() {\n this.$refs.rangeMin.addEventListener('input', e => {\n this.handleRange(e, 'min');\n }, false);\n this.$refs.rangeMax.addEventListener('input', e => {\n this.handleRange(e, 'max');\n }, false);\n },\n initMinMax() {\n // US\n this.usMin = this.$refs.rangeMin.dataset.usMin;\n this.usMax = this.$refs.rangeMin.dataset.usMax;\n this.usStep = this.$refs.rangeMin.dataset.usStep;\n\n // METRIC\n this.metricMin = this.$refs.rangeMin.dataset.metricMin;\n this.metricMax = this.$refs.rangeMin.dataset.metricMax;\n this.metricStep = this.$refs.rangeMin.dataset.metricStep;\n\n this.initCurrentUnits();\n },\n initCurrentUnits() {\n // CURRENT UNITS\n this.currentMin = this.data.selectedUnit == 'us' ? this.usMin : this.metricMin;\n this.currentMax = this.data.selectedUnit == 'us' ? this.usMax : this.metricMax;\n this.currentStep = this.data.selectedUnit == 'us' ? this.usStep : this.metricStep;\n this.initStyles();\n },\n initUnitLabel() {\n let unitLabels = this.$refs.rangeMin.dataset.units ? JSON.parse(this.$refs.rangeMin.dataset.units) : null;\n this.currentUnit = unitLabels[this.data.selectedUnit];\n },\n initStyles() {\n this.styles = `--a: ${this.minValueRange === null ? this.currentMin : this.minValueRange}; --b: ${this.maxValueRange === null ? this.currentMax : this.maxValueRange}; --min: ${this.currentMin}; --max: ${this.currentMax}`;\n },\n },\n mounted() {\n this.initMinMax();\n this.initEvents();\n // this.initUnitLabel();\n this.$nextTick(() => { \n // init slider positions\n this.minValueRange = this.data.selectedUnit == \"us\" ? this.$refs.rangeMin.dataset.usMin : this.$refs.rangeMin.dataset.metricMin;\n this.maxValueRange = this.data.selectedUnit == \"us\" ? this.$refs.rangeMin.dataset.usMax : this.$refs.rangeMin.dataset.metricMax;\n\n this.type = this.$refs.rangeMin.dataset.type;\n this.label = this.$refs.rangeMin.dataset.label;\n });\n\n \n\n }\n\n });\n\n Vue.component('min-max-flowrange', {\n props: ['data'],\n data: function() {\n return {\n minValue: null, //final values\n minValueRange: null, // model for range slider\n minValueInput: null, // model for input field\n maxValue: null, //final values\n maxValueRange: null,\n maxValueInput: null,\n\n min: null,\n // gpmMax: null,\n // gpmStep: null,\n // mhMax: null,\n // mhStep: null,\n // lpmMax: null,\n // lpmStep: null,\n\n currentMin: 0,\n currentMax: null,\n currentStep: null,\n styles: null,\n\n type: null,\n currentUnit: null,\n\n medium: null, //selected measuring medium\n label: null // display name for filter\n }\n },\n watch: {\n \"data.filters\": function() {\n let types = this.data.filters.map((e) => {\n return e.type\n });\n if (!(types.indexOf(`${this.type}Min`) > -1)) {\n this.minValue = null;\n }\n if (!(types.indexOf(`${this.type}Max`) > -1)) {\n this.maxValue = null;\n }\n if (types.indexOf('measuringMedium') > -1) {\n this.medium = this.data.filters.find((item) => {\n return item.type == 'measuringMedium';\n }).name.toLowerCase();\n } else {\n this.medium = null;\n }\n }, \n \"medium\": function() {\n this.currentUnit = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMin');\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMax');\n this.initOptions();\n },\n \"currentUnit\": function() {\n if (this.currentUnit !== \"null\" && this.currentUnit !== null) {\n this.$nextTick(() => {\n // this.initMinMax();\n this.initStyles();\n this.initEvents();\n this.type = this.$refs.rangeMin.dataset.type;\n\n // clear final values\n this.minValue = null;\n this.maxValue = null;\n\n // set default slide range positions\n this.minValueRange = this.min;\n this.maxValueRange = this.currentMax;\n\n // console.log('init',this.label);\n this.label = this.label !== null ? this.label : this.$refs.rangeMin ? this.$refs.rangeMin.dataset.label : null;\n // console.log('final',this.label);\n });\n\n } else {\n // if no unit selected, remove flow range filters\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMin');\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMax');\n }\n },\n \"minValue\": function() {\n if (this.minValue == this.currentMin || this.minValue == \"\") {\n this.minValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMin');\n } else if (parseFloat(this.minValue) < parseFloat(this.currentMin) || parseFloat(this.minValue) > parseFloat(this.currentMax)) {\n // this.minValue = (parseFloat(this.currentMin) - parseFloat(this.currentStep)).toString();\n this.minValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMin');\n }\n\n // this.initStyles();\n this.minValueRange = this.minValue == null ? this.min : this.minValue;\n this.minValueInput = this.minValue;\n if (this.minValue !== null) {\n this.updateFilters(\"Min\");\n }\n },\n \"maxValue\": function() {\n if (this.maxValue == this.currentMax || this.maxValue == \"\") {\n this.maxValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMax');\n } else if (parseFloat(this.maxValue) > parseFloat(this.currentMax) || parseFloat(this.maxValue) < parseFloat(this.currentMin)) {\n // this.maxValue = (parseFloat(this.currentMax) - parseFloat(this.currentStep)).toString();\n this.maxValue = null;\n EventBus.$emit('remove-filter', this.data.class, null, 'flowRangeMax');\n }\n\n // this.initStyles();\n this.maxValueRange = this.maxValue == null ? this.currentMax : this.maxValue;\n this.maxValueInput = this.maxValue;\n if (this.maxValue !== null) {\n this.updateFilters(\"Max\");\n }\n },\n // globally selected us/metric unit\n \"data.selectedUnit\": function() {\n // clear current flow range selection\n this.currentUnit = \"null\";\n\n // show/hide options for relevant units\n // this.initUnits();\n this.initOptions();\n },\n\n \"maxValueRange\": function() {\n // condition to prevent dragging slider beyond the valid range\n if (parseFloat(this.maxValueRange) <= parseFloat(this.minValueRange)) {\n this.maxValueRange = (parseFloat(this.minValueRange) + parseFloat(this.currentStep)).toString();\n }\n\n this.maxValueInput = this.maxValueRange == this.currentMax ? null : this.maxValueRange;\n this.initStyles();\n\n },\n \"minValueRange\": function() {\n // condition to prevent dragging slider beyond the valid range\n if (parseFloat(this.minValueRange) >= parseFloat(this.maxValueRange)) {\n this.minValueRange = (parseFloat(this.maxValueRange) - parseFloat(this.currentStep)).toString();\n }\n\n this.minValueInput = this.minValueRange == this.currentMin ? null : this.minValueRange;\n this.initStyles();\n }\n },\n methods: {\n updateFilters: debounce(function(type) {\n //console.log(\"type:\", type);\n let entry = {\n name: `${type} ${this.label}: ${type == \"Min\" ? this.minValue : this.maxValue} ${this.currentUnit}`,\n value: type == \"Min\" ? this.minValue : this.maxValue,\n type: `${this.type}${type}`,\n flowRangeType: this.currentUnit\n }\n // console.log(entry);\n if (entry.value !== null) {\n EventBus.$emit('updateRangeFilter', entry);\n }\n\n }, 500),\n handleRange: debounce(function(e, type) {\n let _t = e.target;\n var min = type == \"min\" ? _t.value : this.minValue;\n var max = type == \"max\" ? _t.value : this.maxValue; \n if (type == \"min\") {\n if (parseFloat(min) >= parseFloat(max)) {\n min = (parseFloat(max) - parseFloat(this.currentStep)).toString();\n }\n } else if (type == \"max\") {\n if (parseFloat(max) <= parseFloat(min)) {\n max = (parseFloat(min) + parseFloat(this.currentStep)).toString();\n }\n }\n\n this.minValue = min;\n this.maxValue = max;\n\n this.minValueInput = this.minValueInput !== this.minValue && this.minValue !== null ? this.minValue : this.minValueInput;\n this.maxValueInput = this.maxValueInput !== this.maxValue && this.maxValue !== null ? this.maxValue : this.maxValueInput;\n },500),\n initEvents() {\n this.$refs.rangeMin.addEventListener('input', e => {\n this.handleRange(e, 'min');\n }, false);\n this.$refs.rangeMax.addEventListener('input', e => {\n this.handleRange(e, 'max');\n }, false);\n },\n initOptions() {\n this.$el.querySelectorAll('option').forEach((item) => {\n let unit = item.dataset.unitType;\n let flow = item.dataset.flowType ? item.dataset.flowType.toLowerCase() : null;\n\n if (this.medium == null) {\n if (item.getAttribute('value') == \"null\") {\n return;\n } else if (unit == this.data.selectedUnit) {\n item.style.display = \"block\";\n } else {\n item.style.display = \"none\";\n }\n } else {\n if (item.getAttribute('value') == \"null\") {\n return;\n } else if (flow.includes(this.medium) && unit == this.data.selectedUnit) {\n item.style.display = \"block\";\n } else {\n item.style.display = \"none\";\n }\n }\n });\n },\n initStyles() {\n this.styles = `--a: ${this.minValueRange === null ? this.currentMin : this.minValueRange}; --b: ${this.maxValueRange === null ? this.currentMax : this.maxValueRange}; --min: ${this.currentMin}; --max: ${this.currentMax}`;\n },\n selectUnit(e) {\n this.currentUnit = e.target.value == \"null\" ? null : e.target.value; //set selected unit\n if (e.target.value !== \"null\" && e.target.value !== null) {\n let data = JSON.parse(this.$el.querySelector(`option[value=\"${e.target.value}\"]`).dataset.flowData); //get min/max data for selected unit\n \n // set min/max data for current unit\n this.min = data.min;\n this.currentMax = data.max;\n this.currentMin = data.min;\n this.currentStep = data.step;\n }\n\n },\n initUnits() {\n let unit = this.data.selectedUnit;\n // console.log(unit);\n this.$el.querySelectorAll(`option`).forEach((item) => {\n // console.log(item);\n if (item.getAttribute('value') == \"null\") {\n return;\n } else if (item.dataset.unitType !== unit) {\n item.style.display = \"none\";\n } else {\n item.style.display = \"block\";\n }\n });\n }\n },\n mounted() {\n this.$nextTick(() => {\n // this.initUnits();\n this.initOptions();\n // this.label = this.$refs.rangeMin ? this.$refs.rangeMin.dataset.label : null;\n });\n }\n });\n\n Vue.component('radio-item', {\n props: ['data'],\n data: function() {\n return {\n type: \"measuringMedium\",\n id: null,\n isChecked: null,\n selectedRadio: null\n }\n },\n watch: {\n \"data.filters\": function() {\n this.checkState();\n }\n },\n methods: {\n updateFilters(el, e, type) {\n // console.log(\"e\", e);\n // console.log(\"type\", type);\n EventBus.$emit('updateFilters', el, e, type);\n },\n checkState() {\n let item = this.data.filters.find(el => {\n return el.value == this.id;\n });\n this.isChecked = item ? true : false;\n this.selectedRadio = item ? decodeURIComponent(item.value) : null;\n },\n },\n mounted() {\n this.id = encodeURIComponent(this.$refs.input.value);\n }\n });\n\n new Vue({\n el: `.product-catalog-${id}`,\n store: store\n }).$mount(`.product-catalog-${id}`, true);\n }\n\n // multiHandleRange();\n if (catalog.length > 0) {\n catalog.forEach((item, index) => {\n item.classList.add(`product-catalog-${index}`);\n productCatalogConstructor(index);\n })\n }\n\n}\n\nexport default ProductCatalog;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\n\nconst ProductsAccessories = () => {\n const products = document.querySelectorAll('.products-acc__wrapper');\n\n let productsConstructor = (id) => {\n Vue.component('products-accessories-template', {\n data: function() {\n return {\n paginated: null,\n openText: '',\n collapseText: '',\n isExpanded: false,\n totalItems: null,\n initialItems: null,\n buttonText: ''\n }\n },\n watch: {\n isExpanded: function() {\n this.buttonText = this.isExpanded ? this.collapseText : this.openText;\n },\n paginated: function() {\n if (this.paginated) {\n this.$nextTick(() => {\n this.openText = this.$refs.openButton.dataset.openText;\n this.collapseText = this.$refs.openButton.dataset.collapseText;\n this.buttonText = this.isExpanded ? this.collapseText : this.openText;\n })\n }\n }\n },\n methods: {\n handleClick() {\n let contentArea = this.$refs.contentContainer;\n let contentHeight = this.$refs.contentInner.getBoundingClientRect().height;\n\n if (this.isExpanded == true) {\n this.isExpanded = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isExpanded = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n init() {\n // init counts\n this.initialItems = this.$refs.initialContent.querySelectorAll('.product-card').length;\n this.moreItems = this.$refs.contentInner.querySelectorAll('.product-card').length;\n this.totalItems = this.initialItems + this.moreItems;\n\n this.paginated = this.moreItems > 0 ? true : false;\n\n // init button only if paginated\n if (this.paginated) {\n this.$nextTick(() => {\n this.openText = this.$refs.openButton.dataset.openText;\n this.collapseText = this.$refs.openButton.dataset.collapseText;\n this.buttonText = this.isExpanded ? this.collapseText : this.openText;\n })\n }\n }\n },\n mounted() {\n this.init();\n }\n });\n\n new Vue({\n el: `.products-accessories-${id}`,\n store: store,\n }).$mount(`.products-accessories-${id}`, true);\n\n }\n\n if (products.length > 0 ) {\n products.forEach((item, index) => {\n item.classList.add(`products-accessories-${index}`);\n productsConstructor(index);\n })\n }\n\n}\n\nexport default ProductsAccessories;","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport { quickLinksModal } from \"./modals\";\nimport store from \"./store\";\n\nconst quickLinks = () => {\n\n const links = document.querySelectorAll('.quick-links');\n\n Vue.use(VModal);\n\n let quickLinksConstructor = (id) => {\n Vue.component('quick-links', {\n computed: {\n isMobile: function() {\n return store.state.isMobile;\n }\n },\n watch: {\n isMobile: function() {\n if (!this.isMobile) {\n this.$modal.hide('quickLinks');\n }\n }\n },\n methods: {\n triggerModal() { \n let links = this.$refs.links.cloneNode(true);\n this.$modal.show(\n quickLinksModal.template,\n quickLinksModal.name,\n quickLinksModal.options,\n quickLinksModal.events(links)\n )\n }\n },\n });\n\n new Vue({\n el: `.quick-links-${id}`,\n }).$mount(`.quick-links-${id}`, true);\n }\n\n if (links.length > 0) {\n links.forEach((item, index) => {\n item.classList.add(`quick-links-${index}`);\n quickLinksConstructor(index);\n })\n }\n\n}\n\nexport default quickLinks;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport { getUrlParameter } from './misc';\nimport showdown from 'showdown';\n\nconst searchResults = () => {\n\n let search = document.querySelectorAll('.search-results');\n \n const searchResultsConstructor = (id) => {\n Vue.component('search-results-template', {\n data: function() {\n return {\n data: {\n inputQuery: null,\n oldInputQuery: null,\n query: null,\n currentPage: 1, //current page #\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n results: [],\n totalResults: null,\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs\n isMobile: null,\n urlParams: null, //for deeplinking in-browser\n counts: {},\n store: store,\n didYouMean: null,\n resultsReturned: null,\n class: 'search-results',\n ai_related_questions: [],\n ai_sources: [],\n ai_sources_desktop: [],\n ai_sources_all: [],\n ai_chat_doc_id: \"\",\n ai_response: \"\",\n ai_disclaimer: \"\",\n ai_status_ai_stop: true,\n ai_status_first_call_fail: false,\n ai_status_second_call_fail: false,\n ai_status_show_more: false,\n ai_status_show_docs: false,\n ai_status_clicked_unlike: false,\n ai_status_clicked_like: false,\n ai_status_prefinal_result: false,\n ai_status_final_result: false,\n aiSearchDescHeight: -1,\n rerenderShowMore: 0,\n manageNoResultsOnFirstLoad: false,\n aiSearchEnabled: window.aiSearchEnabled,\n },\n isLoading: null\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites;\n },\n taggingMetaL1: function() {\n return JSON.stringify({\n \"type\": \"search-results\",\n \"category\": \"Search\",\n \"action\": this.data.query,\n \"label\": this.data.totalResults || 0,\n \"content\": \"Hero\",\n \"title\": \"Search Results\",\n \"name\": \"Hero - Search Results\",\n \"no\": \"01\"\n })\n },\n taggingMetaL2: function() {\n return JSON.stringify({\n \"type\": \"search-results\",\n \"category\": \"Search\",\n \"action\": this.data.query,\n \"label\": this.data.totalResults || 0,\n })\n },\n taggingTrigger: function() {\n return this.data.resultsReturned ? \"trigger\" : null\n },\n },\n watch: {\n saved: function() {\n let allSaved = [];\n let saved = store.state.favorites;\n\n for (let prop in saved) {\n allSaved = [...allSaved, ...saved[prop]];\n }\n\n this.data.savedDocs = allSaved.filter((item) => {\n return item !== \"\"\n });\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n\n this.initSubmit();\n },\n \"data.filters\": function() {\n //console.log(this.data.filters);\n this.data.currentPage = 1; //reset page to 1\n this.addLoading();\n this.getResults(); // handle api call\n },\n \"data.query\": function() {\n this.data.currentPage = 1; //reset page to 1 when query changes\n // this.getResults(this.data.query);\n }\n },\n methods: {\n toggleFilters() {\n if (this.data.isMobile) {\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== 'search') {\n return;\n }\n\n var type = type;\n var value = encodeURIComponent(e.currentTarget.value);\n var checked = e.currentTarget.checked;\n // console.log(\"type\", type)\n // console.log(e.currentTarget.name);\n // console.log(\"value\", encodeURIComponent(e.target.value));\n // console.log(\"checked\",e.target.checked);\n\n if (checked) {\n if (type !== \"savedDocuments\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": e.currentTarget.name}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": e.currentTarget.name}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) {return;};\n //console.log(\"remove\", value);\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n }, \n addLoading() {\n this.isLoading = true;\n\n let inputField = document.querySelectorAll('.search-results__input-container');\n inputField.forEach(element => element.classList.add('loading'));\n },\n removeLoading() {\n this.isLoading = false;\n\n let inputField = document.querySelectorAll('.search-results__input-container');\n inputField.forEach(element => element.classList.remove('loading'));\n },\n // AI SEARCH\n aiShowMore() {\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"click\",\n \"type\": \"accordion\",\n \"category\": \"Show More\",\n \"action\": \"AI Search Box\",\n \"label\": \"Expand\",\n \"responseType\": \"AI Response\"\n });\n }\n this.data.ai_status_show_more = true;\n },\n aiViewAll() {\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"click\",\n \"type\": \"accordion\",\n \"category\": \"View All\",\n \"action\": \"AI Search Box\",\n \"label\": \"Expand\",\n \"responseType\": \"AI Response\"\n });\n }\n this.data.ai_sources = this.data.ai_sources_all;\n this.data.ai_sources_desktop = this.data.ai_sources_all;\n this.data.ai_status_show_docs = true;\n },\n aiFeedbackUnlike() {\n this.aiFeedbackCall(1, 1);\n },\n aiFeedbackLike() {\n this.aiFeedbackCall(5, 2);\n },\n aiFeedbackCall(rating, type) {\n var beaconFeedback = \"/api/beaconfeedback\";\n // var beaconFeedback = \"http://localhost:3003/beaconfeedback\";\n\n if (type == 1) {\n this.data.ai_status_clicked_unlike = true;\n this.data.ai_status_clicked_like = false;\n }\n else if (type == 2) {\n this.data.ai_status_clicked_like = true;\n this.data.ai_status_clicked_unlike = false;\n }\n\n axios.patch(beaconFeedback, {\n docId: this.data.ai_chat_doc_id,\n rating: rating,\n feedback: \"\"\n }).then(function (response) {\n if (response.data.success) {\n console.log(response.data.success);\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"click\",\n \"type\": \"feedback\",\n \"category\": \"Feedback\",\n \"action\": rating,\n \"label\": rating,\n \"responseType\": \"AI Response\"\n });\n }\n }\n else {\n console.log(\"Beacon feedback request error message: \" + response.data.message);\n }\n }).catch(function (error) {\n console.log(\"Unable to submit user feedback: \" + error);\n });\n },\n getResults() {\n // AI Search - avoid showing tip and generating at loading without a previous search\n this.data.ai_status_ai_stop = false;\n\n // this.data.query = query ? query : null;\n this.data.resultsReturned = true; //set this once after initial results returned\n let baseUrl = window.searchAPIUrl;\n \n if (this.data.inputQuery == 'test no results') { // FOR TESTING ONLY\n baseUrl = 'http://localhost:3003/searchResultsNone';\n }\n\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/searchResults\"; //from json-server\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedDocuments\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var filters = [];\n\n this.data.filters.map((item) => {\n if (item.value !== true && item.value !== false) {\n filters.push(item.value);\n }\n });\n\n let filtersStr = decodeURIComponent(filters.join('|'));\n // console.log(filtersStr);\n\n let axiosParams = {\n q: this.data.inputQuery ? this.data.inputQuery : this.data.query ? this.data.query : null,\n filters: filtersStr == \"\" ? null : filtersStr,\n savedDocuments: savedDocumentsTrueParams() ? savedDocumentsTrueParams() : null,\n saved: savedDocumentsTrueParams() ? this.data.savedDocs.join('|') : null,\n page: this.data.currentPage\n }\n\n this.data.axiosParams = axiosParams;\n\n var searchTerm = axiosParams.q;\n\n // console.log(axiosParams);\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n ///\n /// Did you mean query logic from episerver find:\n ///\n let didyoumeanEl, didyoumeanContainer;\n \n if (response.data.results.length == 0) {\n didyoumeanEl = document.querySelectorAll('.global__didyoumean');\n didyoumeanContainer = document.querySelectorAll('.search-results__input-container__didyoumean');\n\n self.data.filterAreaVisible = false;\n }\n else {\n didyoumeanEl = document.querySelectorAll('.global__peoplealsosearchedfor');\n didyoumeanContainer = document.querySelectorAll('.search-results__input-container__peoplealsosearchedfor');\n\n self.data.filterAreaVisible = true;\n }\n if (response.data.didYouMean && response.data.didYouMean.length > 0) \n {\n let allElements = [];\n \n response.data.didYouMean.forEach(dym => {\n let anchorElement = document.createElement('a');\n anchorElement.href=`?q=${dym}`;\n anchorElement.innerText = dym;\n //anchorElement.addEventListener(\"click\", function (e) {\n // self.didYouMean(e);\n // didyoumeanContainer.forEach(element => element.classList.remove('show'));\n //});\n allElements.push(anchorElement);\n })\n //clear out all previous elements\n didyoumeanEl.forEach(parent => {\n while (parent.firstChild) {\n parent.removeChild(parent.firstChild);\n }\n });\n for (let i = 0; i < allElements.length; i++) {\n didyoumeanEl.forEach(el => { \n let anchorElement = allElements[i].cloneNode(true);\n anchorElement.addEventListener(\"click\", function (e) {\n e.stopPropagation();\n self.didYouMean(e);\n //didyoumeanContainer.forEach(element => element.classList.remove('show'));\n });\n\n el.append(anchorElement); \n });\n if (i + 1 < allElements.length) {\n var commaEl = document.createElement('span');\n //commaEl.innerText = ' ';\n commaEl.style.paddingLeft = \"7px\";\n didyoumeanEl.forEach(el => { \n el.append(commaEl.cloneNode(true)); \n });\n }\n }\n \n didyoumeanContainer.forEach(element => element.classList.add('show'));\n } else {\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n }\n ///\n /// End of did you mean query logic\n ///\n\n if (response.data.results) {\n // construct site section label into the title\n self.data.results = response.data.results.map((item) => {\n if (item.title && item.filterText) {\n if (item.title.indexOf(\"

    \") > -1) {\n return {\n ...item, \n \"title\": `

    ${item.title.replace(\"

    \", \"\")}`,\n \"rawTitle\": item.title\n }\n } else {\n return {\n ...item, \n \"title\": `${item.title}`,\n \"rawTitle\": item.title\n }\n }\n } else {\n return {...item}\n }\n });\n //if (!(response.data.results.length > 0)) {\n //self.data.didYouMean = response.data.didYouMean;\n //} else {\n self.data.didYouMean = null;\n //}\n self.data.manageNoResultsOnFirstLoad = true;\n } else {\n self.data.results = null;\n self.data.manageNoResultsOnFirstLoad = true;\n }\n\n // GTM TAGGING\n if (searchTerm && searchTerm.length > 0 && window.dataLayer &&\n window.dataLayer[window.dataLayer.length-1].event != \"search-results\" // hack to avoid double entry. this runs twice for some reason\n ) { // only push if this is a query, not a filter\n window.dataLayer.push( {\n event: \"search-results\",\n type: \"global\",\n category: \"Search\",\n action: searchTerm,\n label: response.data.totalResults,\n });\n }\n\n // self.data.results = response.data.results ? response.data.results : null; \n self.data.totalResults = response.data.totalResults;\n \n // get counts of search result types\n self.data.counts = response.data.filterCountResults;\n self.data.trackId = response.data.trackId;\n // console.log(response.data);\n\n self.removeLoading();\n })\n .catch(function(error) {\n console.log(error);\n self.removeLoading();\n });\n\n if (this.data.aiSearchEnabled) {\n if (this.data.oldInputQuery != this.data.inputQuery) {\n // AI SEARCH\n var prompt = this.data.inputQuery;\n var aiRefs = [];\n var aiDocs = [];\n var beaconrefs = \"/api/beacon\";\n var beacondocs = \"/api/beacon\";\n // var beaconrefs = \"http://localhost:3003/beaconrefs\";\n // var beacondocs = \"http://localhost:3003/beacondocs\";\n \n // reset\n this.data.ai_status_first_call_fail = false;\n this.data.ai_status_second_call_fail = false;\n this.data.ai_status_show_more = false;\n this.data.ai_status_show_docs = false;\n this.data.ai_status_clicked_unlike = false;\n this.data.ai_status_clicked_like = false;\n this.data.ai_status_prefinal_result = false;\n this.data.ai_status_final_result = false;\n this.data.aiSearchDescHeight = -1;\n // refs call (1 equals to refs)\n axios.get(beaconrefs, {\n params: {\n prompt: prompt,\n type: 1\n }\n }).then(function (response) {\n if (response.data.success) {\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"AI Result\",\n \"responseType\": \"AI Response\"\n });\n }\n self.data.ai_status_prefinal_result = true;\n aiRefs = response.data.content;\n self.setAIRefsValues(aiRefs);\n }\n else {\n console.log(\"Beacon refs request error message: \" + response.data.message);\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI Error\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"0\",\n \"responseType\": \"Search Result no AI\"\n });\n }\n self.data.ai_status_first_call_fail = true;\n }\n }).catch(function (error) {\n console.log(\"Beacon refs axios error message: \" + error);\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI Error\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"0\",\n \"responseType\": \"Search Result no AI\"\n });\n }\n self.data.ai_status_first_call_fail = true;\n });\n \n // docs call (2 equals to docs)\n axios.get(beacondocs, {\n params: {\n prompt: prompt,\n type: 2\n }\n }).then(function (response) {\n if (response.data.success) {\n self.data.ai_status_show_more = false;\n self.data.ai_status_show_docs = false;\n self.data.ai_status_final_result = true;\n aiDocs = response.data.content;\n self.setAIDocsValues(aiDocs);\n } else {\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI Error\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"0\",\n \"responseType\": \"Search Result no AI\"\n });\n }\n self.data.ai_status_second_call_fail = true;\n }\n }).catch(function (error) {\n console.log(\"Beacon docs axios error message: \" + error);\n if (window && window.dataLayer) {\n window.dataLayer.push({\n \"event\": \"search-results-ai\",\n \"pageTemplate\": \"SearchResults\",\n \"type\": \"search-results\",\n \"category\": \"Search Results AI Error\",\n \"action\": prompt.replaceAll('\\\"',''),\n \"label\": \"0\",\n \"responseType\": \"Search Result no AI\"\n });\n }\n self.data.ai_status_second_call_fail = true;\n });\n }\n \n this.data.oldInputQuery = this.data.inputQuery;\n }\n },\n \n setAIRefsValues(ai) {\n // only save documents and docId\n this.data.ai_chat_doc_id = ai.chat_doc_id.toString();\n for (let i = 0; i < ai.sources.length; i++) {\n ai.sources[i].source_title = ai.sources[i].source_title.replace(/\\\\/g, '');\n }\n let sources = ai.sources.length;\n this.data.ai_sources = ai.sources.slice(0, (sources > 2 ? 2 : sources));\n this.data.ai_sources_desktop = ai.sources.slice(0, (sources > 4 ? 4 : sources));\n this.data.ai_sources_all = ai.sources;\n },\n\n setAIDocsValues(ai) {\n const converter = new showdown.Converter({disableForced4SpacesIndentedSublists: true, openLinksInNewWindow: true});\n this.data.ai_response = converter.makeHtml(ai.response);\n this.data.ai_disclaimer = ai.disclaimer;\n this.data.ai_related_questions = ai.related_questions;\n },\n\n loadMore() {\n // console.log(\"load more\");\n this.data.currentPage = this.data.currentPage + 1;\n\n this.data.axiosParams = {\n ...this.data.axiosParams,\n page: this.data.currentPage\n }\n //console.log(this.data.axiosParams);\n let self = this;\n\n let baseUrl = window.searchAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/searchResults2\"; //from json-server\n\n axios.get(apiUrl, {\n params: {\n ...this.data.axiosParams,\n }\n })\n .then(function(response) {\n // self.data.results.push(...response.data.results);\n let results = response.data.results.map((item) => {\n if (item.title && item.filterText) {\n if (item.title.indexOf(\"

    \") > -1) {\n return {...item, \"title\": `

    ${item.title.replace(\"

    \", \"\")}`}\n } else {\n return {...item, \"title\": `${item.title}`}\n }\n } else {\n return {...item}\n }\n });\n // console.log(\"LOAD MORE\", results);\n\n if (results) {self.data.results.push(...results)}\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n submit() {\n let didyoumeanEl = document.querySelectorAll('.global__didyoumean');\n let didyoumeanContainer = document.querySelectorAll('.search-results__input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n\n didyoumeanEl = document.querySelectorAll('.global__peoplealsosearchedfor');\n didyoumeanContainer = document.querySelectorAll('.search-results__input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n\n this.updateHistory(this.data.inputQuery);\n this.data.query = this.data.inputQuery;\n // Set loading icon states\n\n this.addLoading();\n this.getResults();\n },\n prefilter() {\n let params = getUrlParameter('filters');\n if (params) {\n let paramsArray = params.split(',');\n let filters = [];\n\n this.$nextTick(() => {\n // if has filter params, dump them into filters array\n paramsArray.forEach((item) => {\n let name = document.querySelector(`[value=\"${item}\"]`) ? document.querySelector(`[value=\"${item}\"]`).getAttribute('name') : null;\n \n filters.push({\n value: `${item}`,\n name: name\n });\n });\n this.data.filters = filters;\n });\n \n }\n },\n didYouMean(e) {\n //console.log('didYouMean(',e,')');\n let query;\n if (e.target) {\n query = e.target.innerText;\n } else {\n query = e;\n }\n //console.log('query = ', query, 'e = ', e, e.target);\n this.data.inputQuery = query;\n this.submit();\n },\n updateHistory(q) {\n let currentParam = \"?q=\" + getUrlParameter('q');\n let newUrl = window.location.href.replace(currentParam, \"?q=\"+encodeURIComponent(q));\n history.pushState(null, '', newUrl);\n },\n navHistory() {\n let query = getUrlParameter('q');\n let filters = getUrlParameter('filters');\n let didyoumeanEl = document.querySelectorAll('.global__peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.search-results__input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.global__didyoumean');\n didyoumeanContainer = document.querySelectorAll('.search-results__input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n\n if (query) {\n this.data.inputQuery = query.replace(/\\+/g, \" \");\n this.data.query = query.replace(/\\+/g, \" \");\n }\n\n if (filters) {\n this.prefilter();\n } else {\n this.getResults();\n }\n\n\n },\n init() {\n // init is mobile\n this.data.isMobile = store.state.isMobile;\n // init saved docs\n let allSaved = [];\n let saved = store.state.favorites;\n\n for (let prop in saved) {\n allSaved = [...allSaved, ...saved[prop]];\n }\n\n this.data.savedDocs = allSaved.filter((item) => {\n return item !== \"\"\n });\n\n // init filters state\n this.data.filtersVisible = this.data.isMobile ? false : true; //init \n if (window.location.search) {\n let query = getUrlParameter('q');\n let filters = getUrlParameter('filters');\n this.data.inputQuery = query.replace(/\\+/g, \" \");\n this.data.query = query.replace(/\\+/g, \" \");\n // make api call for results if no filters\n // otherwise data.filters[] will update and the watcher will trigger \n // another api call\n if (query && !filters) {\n this.getResults();\n }\n }\n\n window.onpopstate = () => {\n this.navHistory();\n }\n \n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n\n this.initSubmit();\n\n\n },\n initSubmit() {\n let self = this;\n if (this.data.isMobile) {\n this.$refs.searchBarMobile.addEventListener(\"keyup\", function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n self.submit();\n }\n });\n } else {\n this.$refs.searchBarDesktop.addEventListener(\"keyup\", function(event) {\n if (event.keyCode === 13) {\n event.preventDefault();\n self.submit();\n }\n });\n }\n }\n },\n mounted() {\n this.init();\n if (window.location.search) {\n this.prefilter();\n }\n if (this.$refs && this.$refs.aiSearchDesc) {\n this.data.aiSearchDescHeight = this.$refs.aiSearchDesc.offsetHeight;\n }\n },\n updated() {\n var self = this;\n setTimeout(function() {\n if (self.$refs && self.$refs.aiSearchDesc) {\n let oldheight = self.data.aiSearchDescHeight;\n self.data.aiSearchDescHeight = self.$refs.aiSearchDesc.offsetHeight;\n \n if (oldheight != self.data.aiSearchDescHeight)\n self.data.rerenderShowMore++;\n }\n }, 1000);\n }\n });\n\n Vue.component('checkbox-item', {\n props: ['data', 'name', 'type'],\n data: function() {\n return {\n id: null,\n isChecked: false,\n isActive: null,\n count: 0,\n label: null\n }\n },\n watch: {\n \"data.filters\": function() {\n this.checkState();\n },\n \"data.counts\": function() {\n this.setCount();\n }\n },\n computed: {\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"search\",\n \"category\": \"Search\",\n \"action\": \"Filters\",\n \"label\": this.label,\n \"resultCount\": this.count ? this.count : \"\"\n })\n }\n },\n methods: {\n updateFilters(el, e, type) {\n EventBus.$emit('updateFilters', el, e, type);\n },\n checkState() {\n if (this.id == \"Saved%20documents%20only\") {\n let item = this.data.filters.find(el => {\n return encodeURIComponent(el.name) == this.id;\n });\n this.isChecked = item ? true : false;\n } else {\n let item = this.data.filters.find(el => {\n return encodeURIComponent(el.value) == this.id;\n });\n this.isChecked = item ? true : false;\n }\n },\n setCount() {\n //console.log(\"set count\")\n let paramName = this.$refs.input.value;\n let countObj = this.data.counts.filter((item) => {\n return item.filterValue.toString() === paramName;\n })[0];\n this.count = countObj ? countObj.count : 0;\n },\n init() {\n this.label = this.$refs.label.innerText;\n }\n },\n mounted() {\n this.id = encodeURIComponent(this.$refs.input.value);\n this.checkState();\n this.init();\n // this.setCount();\n }\n });\n \n // AI Search\n // Vue.component('ai-desc', {\n // props: ['data'],\n // data: function() {\n // return {\n // }\n // },\n // template: `\n //

    \n // `,\n \n // updated() {\n // this.data.aiSearchDescHeight = this.$refs.aiSearchDesc.offsetHeight;\n // console.log(\"this.data = \",this.data);\n // console.log('-------------> offsetHeight = ', this.data.aiSearchDescHeight);\n // }\n // });\n \n Vue.component('ai-disclaimer', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    {{data.ai_disclaimer}}
    \n `\n });\n Vue.component('ai-related-questions', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n
    \n
    {{item}}
    \n
    \n
    \n `,\n methods: {\n searchRelatedQuestion(e) {\n this.data.inputQuery = e.currentTarget.innerText;\n this.$parent.submit();\n }\n }\n });\n Vue.component('ai-sources', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n
    \n
    \n \n
    \n

    \n {{item.source_title}} [{{index + 1}}]\n

    \n
    \n
    \n \n
    \n
    \n `,\n methods: {\n imageRedirect(e) {\n window.open(e);\n }\n }\n });\n Vue.component('ai-sources-desktop', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n
    \n
    \n \n
    \n

    \n {{item.source_title}} [{{index + 1}}]\n

    \n
    \n
    \n \n
    \n
    \n `,\n methods: {\n imageRedirect(e) {\n window.open(e);\n }\n }\n });\n \n // results list\n Vue.component('results-list', {\n props: ['data', 'isLoading'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('results-item', {\n props: ['data', 'content', 'isLoading'],\n data: function() {\n return {\n resultType: null,\n seeAll: null, //is \"see all\" feature enabled,\n seeAllOpen: null,\n seeAllLabel: null,//label\n moreContent: null\n }\n },\n watch: {\n \"seeAll\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n },\n \"seeAllOpen\": function() {\n if (this.seeAll) {\n this.seeAllLabel = this.seeAllOpen ? window.seeLessLabel : window.seeAllLabel;\n }\n } \n },\n computed: {\n \"highlightedCopy\": function() {\n let regex = new RegExp(this.data.query, \"gi\")\n if (this.content.description) {\n let replaceText = this.data.query;\n const patternMatch = this.content.description.match(regex);\n if (patternMatch !== null && patternMatch.length > 0) { replaceText = patternMatch[0]}\n\n return this.content.description.replace(regex,`${replaceText}`);\n }\n },\n \"highlightedTitle\": function() {\n let regex = new RegExp(this.data.query, \"gi\")\n if (this.content.title) {\n //console.log(\"TEST TEST\", this.content.title);\n let replaceText = this.data.query;\n const patternMatch = this.content.title.match(regex);\n if (patternMatch !== null && patternMatch.length > 0) { replaceText = patternMatch[0]}\n\n return this.content.title.replace(regex,`${replaceText}`);\n }\n\n return this.content.title; // fallback, default to just title\n }, \n \"newTabLink\": function() {\n return this.content.linkUrl ? this.content.linkUrl.replace('download=true', 'download=false') : null;\n },\n \"hrefTarget\": function() {\n if (this.newTabLink) {\n return this.newTabLink.includes('download=false') ? '_blank' : '_self';\n }\n },\n \"trigger\": function() {\n let trackable;\n // for (let prop in window.searchFilterValues) {\n // if (window.searchFilterValues[prop] == this.content.filterValue) {\n // trackable = true;\n // }\n // }\n return trackable ? \"click\" : null;\n },\n \"taggingMeta\": function() {\n let meta; \n // if (this.resultType) {\n // switch (this.resultType) {\n // case 'documentation':\n // meta = {\n // \"type\": \"document\",\n // \"category\": \"\",\n // \"label\": \"\",\n // \"productLine\": \"\",\n // \"language\": \"\"\n // }\n // break;\n // case 'software':\n // meta = {\n // \"type\": \"app\",\n // \"category\": \"\",\n // \"label\": \"\",\n // \"productLine\": \"\",\n // \"language\": \"\"\n // }\n // break;\n // case 'products':\n // meta = { \n // \"type\": \"layer\",\n // \"category\": \"Preview Card\",\n // \"productLine\": \"\",\n // \"label\": this.content.rawTitle\n // }\n // break;\n // default:\n // return;\n // }\n // }\n \n return meta ? JSON.stringify(meta) : null;\n }\n },\n template: `\n
    \n \n \n \n
    \n `,\n methods: {\n init() {\n for (let prop in window.searchFilterValues) {\n if (window.searchFilterValues[prop] == this.content.filterValue) {\n this.resultType = prop;\n }\n }\n },\n toggleSeeAll() {\n this.seeAllOpen = !this.seeAllOpen;\n },\n initSeeAll() {\n if (this.$refs.seeAllContent) {\n let details = this.$refs.seeAllContent.innerHTML.split(',');\n this.seeAll = details.length > 3 ? true : false;\n\n let truncatedDetails = details.slice(0,3).join();\n let moreDetails = details.slice(3).join();\n\n this.moreContent = moreDetails;\n this.$refs.seeAllContent.innerHTML = `${truncatedDetails}${moreDetails == \"\" ? '' : ','}`;\n }\n }\n },\n mounted() {\n // this.init();\n this.initSeeAll();\n\n let self = this;\n this.$nextTick(() => {\n let trackId = self.data.trackId;\n\n if (trackId) {\n let hitId = self.content.hitId;\n let query = self.data.query;\n let url = `/api/SearchHit?q=${encodeURIComponent(query)}&h=${encodeURIComponent(hitId)}&t=${encodeURIComponent(trackId)}`\n let allAnchors = self.$el.querySelectorAll('a');\n allAnchors.forEach(el => el.addEventListener('click', (e) => \n axios.get(url)\n .then(function(response) {\n //console.log(\"--> Tracking response: \", response);\n })\n ));\n }\n });\n\n }\n });\n\n Vue.component('selectedFilters', {\n props: ['data'],\n data: function() {\n return {\n }\n },\n template: `\n
    \n
    \n
    \n \n {{filter.name}}\n
    \n
    \n
    \n `,\n methods: {\n removeFilter(e) {\n let type = e.currentTarget.dataset.type;\n let value = e.currentTarget.dataset.value;\n // console.log(e.currentTarget);\n EventBus.$emit('remove-filter', this.data.class, value, type);\n }\n },\n mounted() {\n \n }\n });\n\n Vue.component('filter-accordion-template', {\n props: ['data', 'defaultopen'],\n data: function() {\n return {\n isOpen: (this.defaultopen ? true : false), //is the accordion open\n seeAllTypesText: false\n }\n },\n computed: {\n productFilters: function() {\n return this.data.products;\n }\n },\n watch: {\n },\n methods: {\n handleClick() {\n this.toggleAccordion();\n },\n\n toggleAccordion() {\n let contentArea = this.$refs.outerContainer;\n let contentHeight = this.$refs.innerContainer.getBoundingClientRect().height;\n\n if (this.isOpen == true) {\n this.isOpen = false;\n\n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n\n } else {\n this.isOpen = true;\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n },\n toggleSeeAll() {\n this.seeAllTypesText = !this.seeAllTypesText\n },\n },\n mounted() {\n \n }\n });\n\n new Vue({\n el: `.search-results-${id}`,\n store: store\n }).$mount(`.search-results-${id}`, true);\n }\n\n if (search.length > 0) {\n search.forEach((item, index) => {\n item.classList.add(`search-results-${index}`);\n searchResultsConstructor(index);\n })\n }\n\n // window.searchFilterValues = {\n // documentation: 157,\n // software: 59,\n // products: 158\n // }\n\n}\n\nexport default searchResults;\n","import Vue from 'vue/dist/vue.min.js';\r\nimport VModal from 'vue-js-modal';\r\nimport { videoModal } from './modals';\r\n\r\n\r\n\r\nconst Slideshow = () => {\r\n const slideshowEl = document.getElementById('slideshow-slider')\r\n if (!slideshowEl) return;\r\n const slidesEl = slideshowEl.querySelectorAll('.slider-slides .slide');\r\n\r\n const SlideshowConstructor = () => {\r\n let activeSlide = 1;\r\n const arrowL = slideshowEl.querySelector('.slider-controls .arrow.L');\r\n const arrowR = slideshowEl.querySelector('.slider-controls .arrow.R');\r\n const pausePlay = slideshowEl.querySelector('.slider-controls .circular-progress');\r\n const totalSlides = slidesEl.length;\r\n const slidesVideos = slideshowEl.querySelectorAll('video');\r\n const modalTriggers = document.querySelectorAll('.video-player-link button')\r\n\r\n const circle = slideshowEl.querySelector('.slider-controls circle.fg');\r\n const circleSize = 30; // this is the width and height of svg (should be a square that fits the circle)\r\n const strokeW = 2\r\n const radius = (circleSize - strokeW) / 2\r\n const circumference = radius * Math.PI * 2;\r\n\r\n const maxTime = 10000; // in miliseconds\r\n const timesPerSec = 100\r\n \r\n let sliderInterval = null\r\n let timeElapsed = 0\r\n let isAutoPlaying = true;\r\n let playingBeforModal = true;\r\n let resizeTimeout = null;\r\n let lastScreenW = 0;\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// update mobile/desktop video background if any\r\n const responsiveVideoUpdate = function () {\r\n if (slidesVideos.length > 0 && window.innerWidth != lastScreenW) \r\n {\r\n lastScreenW = window.innerWidth // used to make sure only width is changing. mobile devices ad a menu that makes the window smaller vertically\r\n if (window.innerWidth <= 900) \r\n {\r\n for (let i = 0; i < slidesVideos.length; i++) \r\n {\r\n const vid = slidesVideos[i];\r\n const url = vid.dataset.mob;\r\n if (url != \"none\") { vid.src = url }\r\n }\r\n }\r\n else \r\n {\r\n for (let i = 0; i < slidesVideos.length; i++) \r\n {\r\n const vid = slidesVideos[i];\r\n const url = vid.dataset.desk;\r\n vid.src = url;\r\n }\r\n }\r\n }\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// stop videos\r\n const playAllVids = function (willPlay) {\r\n let vids = document.querySelectorAll('video')\r\n\r\n if (willPlay) {\r\n for (let i = 0; i < vids.length; i++) { vids[i].play(); }\r\n }\r\n else {\r\n for (let i = 0; i < vids.length; i++) { vids[i].pause(); }\r\n }\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// video controls for when popup opens/closes\r\n if (slidesVideos.length > 0 && modalTriggers.length > 0) {\r\n // modal trigger buttons in slideshow stop all videos\r\n for (let i = 0; i < modalTriggers.length; i++) {\r\n modalTriggers[i].addEventListener(\"click\", function (e) {\r\n playAllVids(false);\r\n isAutoPlaying = false\r\n toggleInterval(isAutoPlaying)\r\n });\r\n }\r\n /* not needed because the observer sees when modal disapears instead of when close button is pressed */\r\n // the modal buttons should start the videos again. but modal is created dynamically so we need this:\r\n // document.addEventListener(\"click\", function(e){\r\n // const closeButton = e.target.closest(\".bmi-modal__close\"); \r\n // const modalWindow = e.target.closest(\".vm--overlay\"); \r\n // if(modalWindow || closeButton)\r\n // {playAllVids(true);}\r\n // });\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// modal observer\r\n const observerConfig = { subtree: true, attributes: true, childList: true }\r\n const observer = new MutationObserver(function (mutationList) {\r\n const watchedTarget = document.querySelector('#modals-container .vm--container')\r\n for (const mutation of mutationList) {\r\n if (mutation.type === 'childList') {\r\n if (watchedTarget == null) {\r\n playAllVids(true);\r\n if (playingBeforModal == true) {\r\n isAutoPlaying = true;\r\n clearInterval(sliderInterval); // must be cleared before toggle... or multiple intervals will be added.\r\n toggleInterval(true)\r\n }\r\n }\r\n }\r\n }\r\n });\r\n observer.observe(document.body, observerConfig);\r\n\r\n }\r\n\r\n\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// show percent progress\r\n const updateProgress = () => {\r\n timeElapsed += timesPerSec;\r\n const progress = timeElapsed / maxTime;\r\n const dash = progress * circumference\r\n circle.setAttribute(\"stroke-dasharray\", `${dash} ${circumference - dash}`);\r\n\r\n if (progress >= 1) { showSlide(1) }\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// toggle interval\r\n const toggleInterval = function (isOn) {\r\n if (isOn === true) {\r\n sliderInterval = window.setInterval(function () { updateProgress() }, timesPerSec);\r\n }\r\n else { clearInterval(sliderInterval) }\r\n }\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// called on arrow click and with auto play\r\n const showSlide = function (direction) {\r\n timeElapsed = 0\r\n activeSlide += direction\r\n\r\n if (activeSlide > totalSlides) { activeSlide = 1 }\r\n if (activeSlide < 1) { activeSlide = totalSlides }\r\n\r\n slideshowEl.querySelector('.slide.active-slide').classList.remove('active-slide')\r\n slideshowEl.querySelector(`.slide:nth-child(${activeSlide})`).classList.add('active-slide')\r\n }\r\n //////////////////////////////////////////////////////////////////////////////////////////////// arrows\r\n arrowL.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n showSlide(-1);\r\n });\r\n arrowR.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n showSlide(1)\r\n });\r\n pausePlay.addEventListener(\"click\", function (e) {\r\n e.preventDefault();\r\n pausePlay.classList.toggle('playing')\r\n isAutoPlaying = !isAutoPlaying\r\n toggleInterval(isAutoPlaying);\r\n\r\n playingBeforModal = isAutoPlaying; // used when closing modal\r\n });\r\n\r\n //////////////////////////////////////////////////////////////////////////////////////////////// start interval as soon as script loads\r\n toggleInterval(true)\r\n //////////////////////////////////////////////////////////////////////////////////////////////// update mobile videos if there are any\r\n responsiveVideoUpdate();\r\n window.onresize = function () \r\n {\r\n clearTimeout(resizeTimeout);\r\n resizeTimeout = setTimeout(responsiveVideoUpdate, 1000); // add short delay so that video is only updated when user stops resizing; \r\n };\r\n }\r\n\r\n\r\n if (slideshowEl) {\r\n // if there is more than one slide start slideshow auto play and its timer\r\n if (slidesEl.length > 1) { SlideshowConstructor(); }\r\n // if there is only one dont start the timer and hide the controls for moving/p\r\n else { slideshowEl.querySelector('.slider-controls').classList.add('hide'); }\r\n }\r\n}\r\n\r\nexport default Slideshow;\r\n","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport VModal from 'vue-js-modal';\nimport { releaseNotesModal } from \"./modals\";\n\nconst softwareCard = () => {\n Vue.use(VModal);\n let software = document.querySelectorAll('.softward-card--nofilter');\n\n let softwareCardConstructor = (id) => {\n Vue.component('software-card-single', {\n data: function() {\n return {\n isBookmarked: false,\n id: null,\n type: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites[`${this.type}`];\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n }\n },\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: this.type,\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n toggleModal() { \n let releaseNotes = this.$refs.releaseNotes.innerHTML;\n this.$modal.show(\n releaseNotesModal.template(releaseNotes),\n releaseNotesModal.name,\n releaseNotesModal.options\n )\n },\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.softwareId ? this.$refs.bookmark.dataset.softwareId : null;\n\n this.type = \"softwareId\";\n \n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n }\n });\n\n new Vue({\n el: `.software-card--nofilter-${id}`,\n }).$mount(`.software-card--nofilter-${id}`, true);\n }\n\n if (software.length > 0) {\n software.forEach((item, index) => {\n item.classList.add(`software-card--nofilter-${index}`);\n softwareCardConstructor(index);\n })\n }\n\n}\n\nexport default softwareCard;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\nimport axios from 'axios';\nimport fpodb from '../../../db.json';\nimport VModal from 'vue-js-modal';\nimport {releaseNotesModal} from './modals';\nimport { Accordion, SelectedFiltersComponent, Checkbox, Pagination } from './filter-components';\n\nconst safeString = (str) => {\n return encodeURIComponent(str);\n}\n\nconst Software = () => {\n\n let software = document.querySelectorAll('.software');\n Vue.use(VModal);\n\n const softwareConstructor = (id) => {\n Vue.component('software-template', {\n data: function() {\n return {\n data: {\n currentPage: 1, //current page #\n totalPages: null, //total returns pages\n totalResults: null, //total results\n shownResults: null, //total shown items\n filtersVisible: null, //are filters visible\n filterAreaVisible: true,\n filters: [],\n products: [],\n results: [],\n savedDocs: [], //bookmarked items\n savedDocsLabel: null, //label for saved docs\n savedDocsOnly: null, //is saved docs only checked\n isMobile: null,\n nextActive: null,\n prevActive: null,\n // apiUrl: null, //for api call\n urlParams: null, //for deeplinking in-browser\n // store: store\n query: null,\n releaseNotesLabel: null,\n class: 'software',\n trackingType: 'app'\n },\n isLoading: null\n }\n },\n components: {\n 'filter-accordion-template': Accordion,\n 'selectedFilters': SelectedFiltersComponent,\n 'checkbox-item': Checkbox,\n 'pagination': Pagination\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n saved: function() {\n return store.state.favorites.softwareId[0] == \"\" ? store.state.favorites.softwareId.slice(1) : store.state.favorites.softwareId;\n },\n pageRange: function() {\n if (this.data.totalResults > 10) {\n if (this.data.currentPage == 1) {\n return `1-${this.data.shownResults}`;\n } else if (this.data.currentPage == this.data.totalPages ) {\n return `${this.data.totalResults - this.data.shownResults + 1}-${this.data.totalResults}`;\n } else {\n return `${(this.data.shownResults * (this.data.currentPage - 1)) + 1}-${this.data.shownResults * this.data.currentPage}`;\n }\n } else {\n return this.data.shownResults;\n }\n },\n siteLang: function() {\n return store.state.currentLang;\n }\n\n },\n watch: {\n saved: function() {\n this.data.savedDocs = this.saved;\n\n // remove saved only filter if no saved items\n if (this.saved.length == 0) {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf('savedDownloads');\n if (index > -1) {\n this.data.filters.splice(index,1);\n }\n }\n },\n computedIsMobile: function() {\n this.data.isMobile = this.computedIsMobile;\n this.data.filtersVisible = !this.computedIsMobile ? true : this.data.filtersVisible;\n },\n \"data.filters\": function() {\n this.addLoading();\n this.getResults(); // handle api call\n // this.updateHistory(); // handle history record\n // this.data.currentPage = 1; //reset page to 1\n\n // check for if productline is selected\n let productLines = this.data.filters.filter(el => {\n return el.type == \"productline\";\n }).map(el => {\n return el.value;\n });\n\n // set savedDocsOnly value\n let savedOnly = this.data.filters.find(item => {\n return item.type == \"savedSoftware\";\n })\n this.data.savedDocsOnly = savedOnly ? savedOnly.value : null;\n\n\n if (productLines.length > 0) {\n this.populateProducts(productLines); \n } else {\n //if not brand selected, empty the products array\n this.data.products = []; \n // remove selected product filters\n this.data.filters.filter(el => {\n return el.type == \"product\"\n }).forEach(item => {\n this.removeFilter(this.data.class, item.value);\n });\n }\n },\n \"data.currentPage\": function() {\n if (this.data.currentPage == 1) {\n this.data.nextActive = true;\n this.data.prevActive = false;\n } else if (this.data.currentPage == this.data.totalPages) {\n this.data.nextActive = false;\n this.data.prevActive = true;\n } else {\n this.data.nextActive = true;\n this.data.prevActive = true;\n }\n\n // this.getResults();\n // this.updateHistory();\n },\n \"data.totalResults\": function() {\n this.initPages();\n }\n },\n methods: {\n toggleFilters() {\n // console.log(\"clicked\");\n if (this.data.isMobile) {\n // console.log(\"is mobile\");\n this.data.filtersVisible = !this.data.filtersVisible;\n }\n },\n updateFilters(el, e, type) {\n if (el !== this.data.class) {\n return;\n }\n\n var type = type;\n var value = safeString(e.currentTarget.value);\n var label = e.currentTarget.parentNode.innerText;\n var checked = e.currentTarget.checked;\n this.data.currentPage = 1;//reset page to 1 when new filters added/removed\n // console.log(\"type\", type)\n // console.log(e);\n // console.log(\"value\", safeString(e.target.value));\n // console.log(\"checked\",e.target.checked);\n\n if (checked) {\n if (type !== \"savedSoftware\") {\n this.data.filters = [...this.data.filters, {\"value\": value, \"type\": type, \"name\": label}];\n } else {\n this.data.filters = [...this.data.filters, {\"value\": checked, \"type\": type, \"name\": label}];\n }\n } else {\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n // console.log(\"INDEX\", index);\n this.data.filters.splice(index,1);\n }\n },\n // removes specific filter\n removeFilter(el, value, type) {\n if (el !== this.data.class) {\n return;\n }\n let index = this.data.filters.map((e) => {\n return e.value\n }).indexOf(value);\n this.data.filters.splice(index,1);\n },\n // clears filters\n removeAll() {\n this.data.filters = [];\n this.data.currentPage = 1; //reset page to 1\n }, \n populateProducts(productLines) {\n let productLineStr = decodeURIComponent(productLines.join('|'));\n // console.log(brandStr);\n let baseUrl = window.softwareAPIUrl;\n let apiUrl = `/api/GetSoftwareProductsByBrand`;\n // let apiUrl = \"http://localhost:3003/productsByBrand\"; //from json-server\n let self = this;\n\n axios.get(apiUrl, {\n params: {\n brand: productLineStr,\n lang: this.siteLang \n }\n })\n .then(function(response) {\n // console.log(response);\n self.data.products = response.data.results; \n })\n .catch(function(error) {\n console.log(error);\n });\n },\n \n didYouMean(e) {\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n //console.log('didYouMean',e);\n let query;\n if (e.target) {\n query = e.target.innerText;\n } else {\n query = e;\n }\n //console.log('query = ',query, 'e = ', e, e.target);\n this.data.query = query;\n //this.updateHistory();\n document.querySelector('.hero-center__search-input').value = query;\n this.addLoading();\n this.getResults();\n },\n\n getResults(query) {\n\n // let apiUrl = \"api/documents?\";\n this.data.query = query === null ? null : query ? query : this.data.query;\n this.data.currentPage = query ? 1 : this.data.currentPage;\n // this.getUrl();\n let baseUrl = window.softwareAPIUrl;\n let apiUrl = `${baseUrl}${baseUrl.indexOf('?') > -1 ? '' : '?'}`;\n // let apiUrl = \"http://localhost:3003/software\"; //from json-server\n // let apiUrlTest = \"http://localhost:3003/documentationTest\"; //from json-server\n\n let self = this;\n\n let savedDocumentsTrueParams = () => {\n var savedOnly = this.data.filters.find(item => {\n return item.type == \"savedSoftware\";\n })\n if (savedOnly) {\n return true;\n } else {\n return false;\n }\n }\n\n var product = [];\n var lang = [];\n var productLine = [];\n var downloadType = [];\n\n this.data.filters.map((item) => {\n switch(item.type) {\n case \"product\":\n product.push(item.value);\n break;\n case \"lang\":\n lang.push(item.value);\n break;\n case \"productline\":\n productLine.push(item.value);\n break;\n case \"downloadType\":\n downloadType.push(item.value);\n break;\n default:\n return;\n }\n });\n\n let productStr = decodeURIComponent(product.join('|'));\n let langStr = decodeURIComponent(lang.join('|'));\n let productLineStr = decodeURIComponent(productLine.join('|'));\n let downloadTypeStr = decodeURIComponent(downloadType.join('|'));\n\n let axiosParams = {\n q: this.data.query ? this.data.query : null,\n saved: this.data.savedDocs.join('|') == \"\" ? null : this.data.savedDocs.join('|').charAt(0) == \",\" ? this.data.savedDocs.join('|').slice(1) : this.data.savedDocs.join('|'), //@TODO make this less insane. Send NULL if empty string. Remove leading comma if present.\n product: productStr == \"\" ? null : productStr,\n language: langStr == \"\" ? null : langStr,\n productLine: productLineStr == \"\" ? null : productLineStr,\n downloadType: downloadTypeStr == \"\" ? null : downloadTypeStr,\n savedSoftware: savedDocumentsTrueParams(),\n page: this.data.currentPage,\n lang: this.siteLang\n }\n\n // console.log(axiosParams);\n var searchTerm = this.data.query;\n\n axios.get(apiUrl,{\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n // console.log(response);\n///\n /// Did you mean query logic from episerver find:\n ///\n let didyoumeanEl, didyoumeanContainer;\n if (response.data.results.length == 0) {\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n }\n else {\n\n didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n }\n\n if (response.data.didYouMean && response.data.didYouMean.length > 0) \n {\n let allElements = [];\n response.data.didYouMean.forEach(dym => {\n let anchorElement = document.createElement('a');\n anchorElement.href=\"#\";\n anchorElement.innerText = dym;\n anchorElement.addEventListener(\"click\", function (e) {\n e.stopPropagation();\n self.didYouMean(anchorElement.innerText);\n });\n allElements.push(anchorElement);\n });\n\n //clear out all previous elements\n didyoumeanEl.forEach(parent => {\n while (parent.firstChild) {\n parent.removeChild(parent.firstChild);\n }\n });\n //console.log(' --> Appending to ', didyoumeanEl);\n \n for (let i = 0; i el.append(allElements[i]));\n if (i + 1 < allElements.length) {\n var commaEl = document.createElement('span');\n commaEl.style.paddingLeft = \"7px\";\n \n didyoumeanEl.forEach(el => el.append(commaEl));\n }\n } \n didyoumeanContainer.forEach(element => element.classList.add('show'));\n\n } else {\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n }\n ///\n /// End of did you mean query logic\n ///\n\n // GTM TAGGING\n if (searchTerm && searchTerm.length > 0 && \n window.dataLayer[window.dataLayer.length-1].event != \"search-results\" // hack to avoid double entry. this runs twice for some reason\n ) { // only push if this is a query, not a filter\n window.dataLayer.push( {\n event: \"search-results\",\n type: \"software\",\n category: \"Search\",\n action: searchTerm,\n label: response.data.totalResults,\n });\n }\n\n self.data.results = response.data.results; \n self.data.totalResults = response.data.totalResults;\n self.data.shownResults = response.data.results.length;\n self.data.trackId = response.data.trackId;\n \n self.removeLoading();\n })\n .catch(function(error) {\n console.log(error);\n self.removeLoading();\n\n });\n },\n changePage(dir) {\n if (dir == \"prev\" && this.data.currentPage !== 1) {\n this.data.currentPage--;\n } else if (dir == \"next\" && this.data.currentPage !== this.data.totalPages) {\n this.data.currentPage++;\n } else {\n return;\n }\n EventBus.$emit('scroll-to-top', this.data.class);\n this.addLoading();\n this.getResults();\n },\n \n scrollToTop(el) {\n if (el !== this.data.class) {return;}\n let top = this.$el.querySelector('.software__area-cards').getBoundingClientRect().top + window.scrollY - 100;\n // console.log(top);\n setTimeout(function() {\n window.scrollTo({\n top: top,\n behavior: 'smooth'\n });\n }, 500);\n },\n initPages() {\n // based on total result count, divide by 10 to get total pages needed\n // math ceil to round up\n // set active for prev/next based on current page\n this.data.totalPages = Math.ceil(this.data.totalResults / 10);\n this.data.prevActive = this.data.currentPage !== 1 ? true : false;\n this.data.nextActive = this.data.currentPage !== this.data.totalPages ? true : false;\n },\n addLoading() {\n this.isLoading = true;\n\n let inputField = document.querySelector('.hero-center__search-input-container');\n inputField.classList.add('loading');\n },\n removeLoading() {\n this.isLoading = false;\n\n let inputField = document.querySelector('.hero-center__search-input-container');\n inputField.classList.remove('loading');\n },\n init() {\n this.data.isMobile = store.state.isMobile;\n this.data.savedDocs = store.state.favorites.softwareId[0] == \"\" ? store.state.favorites.softwareId.slice(1) : store.state.favorites.softwareId;\n this.data.filtersVisible = this.data.isMobile ? false : true; //init show/hide filters if/is mobile\n // listen for filter updates in children\n EventBus.$on('updateFilters', (el, e, type) => {\n this.updateFilters(el, e, type);\n });\n EventBus.$on('remove-filter', (el, value, type) => {\n this.removeFilter(el, value, type);\n });\n EventBus.$on('change-page-to', (el, num) => {\n if (el !== this.data.class) {return;};\n this.data.currentPage = num;\n this.addLoading();\n this.getResults();\n });\n EventBus.$on('internal-search', (value, type) => {\n if (type == \"software\") {\n let didyoumeanEl = document.querySelectorAll('.peoplealsosearchedfor');\n let didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__peoplealsosearchedfor');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n didyoumeanEl = document.querySelectorAll('.didyoumean');\n didyoumeanContainer = document.querySelectorAll('.hero-center__search-input-container__didyoumean');\n didyoumeanContainer.forEach(element => element.classList.remove('show'));\n this.addLoading();\n\n this.getResults(value);\n }\n });\n EventBus.$on('scroll-to-top', (el) => {\n this.scrollToTop(el);\n });\n // init results\n this.data.results = window.initialSoftwareApiResults.results;\n this.data.totalResults = window.initialSoftwareApiResults.totalResults;\n this.data.shownResults = window.initialSoftwareApiResults.results.length;\n this.data.releaseNotesLabel = window.initialSoftwareApiResults.releaseNotesLabel;\n\n // this.data.results = fpodb.software.results;\n // this.data.totalResults = fpodb.software.totalResults;\n // this.data.shownResults = fpodb.software.results.length;\n // this.data.releaseNotesLabel = fpodb.software.releaseNotesLabel;\n\n this.data.filterAreaVisible = parseInt(this.data.totalResults) <= 10 ? false : true;\n\n // window.onpopstate = () => {\n // this.deeplink();\n // }\n }\n },\n mounted() {\n this.init();\n this.initPages();\n // for deeplinking\n // if (window.location.search) {\n // this.$nextTick(() => {\n // this.deeplink();\n // });\n // }\n }\n });\n\n Vue.component('software-products', {\n props: ['data', 'category'],\n data: function() {\n return {\n type: \"product\"\n }\n },\n components: {\n 'checkbox-item': Checkbox\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n \n // results list\n Vue.component('software-results-list', {\n props: ['data', 'isLoading'],\n data: function() {\n return {\n type: \"software\"\n }\n },\n template: `\n
    \n \n
    \n `,\n methods: {\n },\n\n mounted() {\n\n }\n });\n\n // single results item\n Vue.component('software-results-item', {\n props: ['data', 'content', 'isLoading'],\n data: function() {\n return {\n // isChecked: false,\n isBookmarked: false,\n id: null\n }\n },\n computed: {\n saved: function() {\n return store.state.favorites.softwareId;\n },\n tagMetaBody: function() {\n return JSON.stringify({\n \"type\": \"app\", \n \"category\": this.content.downloadType, \n \"label\": this.content.name, \n \"productLine\": this.content.eyebrow, \n \"language\": this.content.languages.toString()\n })\n }\n },\n watch: {\n saved: function() {\n this.isBookmarked = this.saved.includes(this.id) ? true : false;\n },\n \"content\": function() {\n this.$nextTick(() => {\n // console.log(this.$refs.bookmark.dataset.softwareId);\n this.id = this.$refs.bookmark.dataset.softwareId;\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n console.log('software-results-item - watch() content -> this', this);\n })\n }\n },\n template: `\n
    \n
    \n
    \n
    \n \n {{content.eyebrow}}\n \n \n {{content.name}}\n \n
    \n {{content.name}}\n
    \n \n {{content.details}} | {{data.releaseNotesLabel}} {{content.releaseNotes}}\n \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n `,\n methods: {\n handleBookmark() {\n store.commit('updateFavorites', {\n id: this.id,\n type: \"softwareId\",\n action: this.isBookmarked ? \"remove\" : \"add\"\n });\n store.dispatch('checkFavorites');\n },\n // initReleaseNotes() {\n // this.$refs.details.addEventListener('click', (e) => {\n // e.preventDefault();\n // this.triggerModal();\n // });\n // },\n triggerModal() {\n this.$modal.show(\n releaseNotesModal.template(this.content.releaseNotes),\n releaseNotesModal.name,\n releaseNotesModal.options\n )\n }\n },\n mounted() {\n this.id = this.$refs.bookmark.dataset.softwareId;\n // console.log(\"saved\",this.saved);\n this.isBookmarked = this.saved.includes(`${this.id}`) ? true : false;\n // this.initReleaseNotes();\n let self = this;\n this.$nextTick(() => {\n let trackId = self.data.trackId;\n\n if (trackId) {\n let hitId = self.content.hitId;\n let query = self.data.query;\n let url = `/api/SearchHit?q=${encodeURIComponent(query)}&h=${encodeURIComponent(hitId)}&t=${encodeURIComponent(trackId)}`\n let allAnchors = self.$el.querySelectorAll('a');\n allAnchors.forEach(el => el.addEventListener('click', (e) => \n axios.get(url)\n .then(function(response) {\n //console.log(\"--> Tracking response: \", response);\n })\n ));\n }\n });\n\n }\n });\n\n new Vue({\n el: `.software-${id}`,\n store: store\n }).$mount(`.software-${id}`, true);\n }\n\n if (software.length > 0) {\n software.forEach((item, index) => {\n item.classList.add(`software-${index}`);\n softwareConstructor(index);\n })\n }\n\n}\n\nexport default Software;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus';\n\n// const SpecTable = () => {\n\n // const tables = document.querySelectorAll('.spec-table');\n\n // const specTableConstructor = (id) => {\n const specsTableTemplate = () => {\n Vue.component('spec-table-template', {\n props: ['selectedItem'],\n data: function() {\n return {\n selectedUnit: store.state.units,\n usLabel: '',\n metricLabel: '',\n labelText: '',\n store: store,\n switchToText: '',\n loadMore: true,\n isOpen: null\n }\n },\n computed: {\n computedUnit: function() {\n return store.state.units;\n },\n taggingMeta: function() {\n return JSON.stringify({\n \"type\": \"cta\",\n \"category\": \"View all\",\n \"action\": \"Specifications\",\n \"label\": this.selectedItem ? this.selectedItem : \"\"\n })\n }\n },\n watch: {\n computedUnit: function() {\n this.selectedUnit = this.computedUnit;\n this.setLabels();\n }\n },\n methods: {\n toggleUnits() {\n store.commit('setUnits');\n },\n \n setLabels() {\n this.labelText = this.selectedUnit == 'us' ? this.usLabel : this.metricLabel;\n this.switchToText = this.selectedUnit == 'us' ? this.metricLabel : this.usLabel;\n },\n \n handleViewAll() {\n this.$refs.loadMore.viewAll();\n },\n },\n mounted() {\n // get labels from mark up to accomodate multi lang\n this.usLabel = this.$refs.unitToggler.dataset.usLabel;\n this.metricLabel = this.$refs.unitToggler.dataset.metricLabel;\n this.setLabels();\n EventBus.$on('toggleOpen', (state) => {\n this.isOpen = state;\n });\n\n }\n });\n }\n\n const specTableLoadMore = () => {\n Vue.component('specifications-load-more', {\n props: ['labelText', 'switchToText', 'selectedUnit', 'isOpen'],\n data: function() {\n return {\n innerHeight: null,\n // isOpen: false\n }\n },\n methods: {\n viewAll() {\n let contentArea = this.$refs.allContainer;\n let contentHeight = this.innerHeight;\n \n if (this.isOpen == true) {\n // this.isOpen = false;\n EventBus.$emit('toggleOpen', false);\n \n requestAnimationFrame(function() {\n //set content area height to content height to prevent transitioning from auto\n contentArea.style.maxHeight = contentHeight + 'px';\n // have the element transition to height: 0\n requestAnimationFrame(function() {\n contentArea.style.maxHeight = '0px';\n });\n });\n \n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = '0';\n });\n \n } else {\n // this.isOpen = true;\n EventBus.$emit('toggleOpen', true);\n contentArea.style.maxHeight = contentHeight + \"px\";\n contentArea.addEventListener('transitionend', () => {\n contentArea.style.maxHeight = 'none';\n });\n }\n }\n },\n mounted() {\n this.innerHeight = this.$refs.allInner.getBoundingClientRect().height;\n }\n });\n }\n \n\n // new Vue({\n // el: `.spec-table-${id}`,\n // store: store,\n // }).$mount(`.spec-table-${id}`, true);\n // }\n \n // if (tables.length > 0) {\n // tables.forEach((item, index) => {\n // item.classList.add(`spec-table-${index}`);\n // specTableConstructor(index);\n // })\n // }\n\n// }\n\n// export default SpecTable;\n\nexport {specsTableTemplate, specTableLoadMore}; ","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport {specsTableTemplate, specTableLoadMore} from './spec-table';\n\nconst Specifications = () => {\n\n const specs = document.querySelectorAll('.specs .page-section__wrapper');\n\n let specsConstructor = (id) => {\n Vue.component('specifications-template', {\n data: function() {\n return {\n selectedItem: null,\n selectedId: null,\n selectedUrl: null\n }\n },\n computed: {\n tagMetaSelect: function() {\n return JSON.stringify({\n \"type\": \"document\",\n \"category\": \"Product Data Sheets\",\n \"action\": \"Download\",\n \"label\": this.selectedItem,\n \"documentId\": this.selectedId\n })\n } \n },\n methods: {\n selectItem(e) {\n let select = this.$refs.dropdown;\n let text = select.options[select.selectedIndex].text;\n let Id = select.options[select.selectedIndex].dataset.id;\n this.selectedItem = text;\n this.selectedId = Id;\n if (e) {\n this.selectedUrl = e.target.value;\n } else {\n this.selectedUrl = select.options[select.selectedIndex].value;\n }\n \n },\n submit(e) {\n // console.log(e.target);\n window.open(this.selectedUrl, '_blank');\n }\n },\n mounted() {\n this.selectItem();\n }\n });\n\n\n new Vue({\n el: `.specs-${id}`,\n store: store,\n }).$mount(`.specs-${id}`, true);\n }\n\n specsTableTemplate();\n specTableLoadMore();\n\n if (specs.length > 0) {\n specs.forEach((item, index) => {\n item.classList.add(`specs-${index}`);\n specsConstructor(index);\n })\n }\n\n}\n\nexport default Specifications;","/*\n #StorageManager\n This component provides an interface to control and store the information with different kinds of storage. By default use SessionStorageManager (SessionStorage).\n\n # get:\n This method is for reading a value stored\n\n # set:\n This method is to store a value\n\n # remove:\n This method is to remove a value stored\n\n # addTimes:\n This method is to add a number to a integer value stored\n\n # subTimes:\n This method is to subtract a number to a integer value stored\n*/\n\nconst StorageManager = manager => {\n const instance = {\n get: function(key) {\n return instance._manager._get(key);\n },\n\n set: function(key, value) {\n return instance._manager._set(key, value);\n },\n\n remove: function(key) {\n return instance._manager._remove(key);\n },\n\n addTimes: function(key, num) {\n const add = parseInt(num || 1);\n return instance._manager._add(key, add);\n },\n\n subTimes: function(key, num) {\n const sub = parseInt(num || 1);\n return instance._manager._sub(key, sub);\n }\n };\n\n instance._manager = manager || SessionStorageManager;\n\n return instance;\n};\n\nexport const SessionStorageManager = {\n _get: function(key) {\n return sessionStorage.getItem(key);\n },\n\n _set: function(key, value) {\n return sessionStorage.setItem(key, value);\n },\n\n _remove: function(key) {\n return sessionStorage.removeItem(key);\n },\n\n _add: function(key, num) {\n const current = parseInt(SessionStorageManager._get(key) || 0);\n SessionStorageManager._set(key, current + num);\n },\n\n _sub: function(key, num) {\n SessionStorageManager._add(key, num * -1);\n }\n};\n\nexport const LocalStorageManager = {\n _get: function(key) {\n return localStorage.getItem(key);\n },\n\n _set: function(key, value) {\n return localStorage.setItem(key, value);\n },\n\n _remove: function(key) {\n return localStorage.removeItem(key);\n },\n\n _add: function(key, num) {\n const current = parseInt(LocalStorageManager._get(key) || 0);\n LocalStorageManager._set(key, current + num);\n },\n\n _sub: function(key, num) {\n LocalStorageManager._add(key, num * -1);\n }\n};\n\nexport default StorageManager;\n","import Vue from 'vue/dist/vue.min.js';\nimport Vuex from 'vuex';\nimport axios from 'axios';\nimport {getCookieValue} from './misc.js';\n\nVue.use(Vuex);\n\nconst store = new Vuex.Store({\n state: {\n pageTitle: '',\n isMobile: null, //is viewport < 835px\n isSmallMobile: null, //is viewport < 650px\n isMdDesktop: null, //is viewport < 1024px\n pageAnchors: [],\n showInlineAnchors: false,\n units: null,\n menuKeys: [],\n favorites: { //NOTE: all ids stored as strings\n documentId: [],\n softwareId: [],\n articleId: [],\n productId: [],\n legalDocumentId: []\n },\n currentLang: null,\n litOrderCart: [],\n GAID: null \n },\n\n mutations: {\n updateTitle(state, title) {\n state.pageTitle = title;\n },\n setMobileState(state, mobileState) {\n state.isMobile = mobileState;\n },\n setSmallMobileState(state, mobileState) {\n state.isSmallMobile = mobileState;\n },\n setMdDesktopState(state, mobileState) {\n state.isMdDesktop = mobileState;\n },\n setPageAnchors(state, anchors) {\n state.pageAnchors = anchors;\n },\n setAnchorDropdownVis(state, anchorState) {\n state.showInlineAnchors = anchorState;\n },\n setUnits(state, units) {\n if (units) {\n state.units = units;\n } else {\n state.units = \n state.units == 'us' ? 'metric'\n : state.units == 'metric' ? 'us'\n : null;\n }\n },\n updateMenu(state, obj) {\n state.menuKeys.push(obj);\n },\n updateFavorites(state, data) {\n // add/remove items from stores favorites\n if (data.action == \"add\") {\n // console.log(\"add\");\n state.favorites[data.type].push(data.id);\n } else if (data.action == \"remove\") {\n // console.log(\"remove\");\n\n if (state.favorites[data.type].includes(data.id)) {\n state.favorites[data.type].splice(state.favorites[data.type].indexOf(data.id), 1);\n }\n } else {\n return;\n }\n },\n initFavorites(state, data) {\n state.favorites[data.type] = data.arr;\n },\n sanitizeFavorites(state, results) {\n // sanitisze favorites based on valid favs returned from api\n state.favorites.documentId = results.documentIds.map(i => `${i}`);\n state.favorites.softwareId = results.softwareIds.map(i => `${i}`);\n state.favorites.articleId = results.articleIds.map(i => `${i}`);\n state.favorites.productId = results.productIds.map(i => `${i}`);\n state.favorites.legalDocumentId = results.legalDocumentIds.map(i => `${i}`);\n },\n setCurrentLang(state, lang) {\n state.currentLang = lang;\n },\n updateLitOrderCart(state, data) {\n state.litOrderCart = data;\n },\n setGAID(state, id) {\n state.GAID = id;\n }\n },\n actions: {\n checkMobile(context) {\n var mqlMd = window.matchMedia('(max-width: 835px)');\n var mqlSm = window.matchMedia('(max-width: 650px)');\n var mqlMdDesktop = window.matchMedia('(max-width: 1024px)');\n\n // console.log(mqlMd.matches);\n var isMobile = mqlMd.matches ? true : false;\n context.commit('setMobileState', isMobile);\n\n mqlMd.addEventListener('change',() => {\n isMobile = mqlMd.matches ? true : false;\n context.commit('setMobileState', isMobile);\n });\n\n var isSmallMobile = mqlSm.matches ? true : false;\n context.commit('setSmallMobileState', isSmallMobile);\n\n mqlSm.addEventListener('change',() => {\n isSmallMobile = mqlSm.matches ? true : false;\n context.commit('setSmallMobileState', isSmallMobile);\n });\n\n var isMdDesktop = mqlMdDesktop.matches ? true : false;\n context.commit('setMdDesktopState', isMdDesktop);\n\n mqlMdDesktop.addEventListener('change',() => {\n isMdDesktop = mqlMdDesktop.matches ? true : false;\n context.commit('setMdDesktopState', isMdDesktop);\n });\n },\n initCookies(context) {\n // check for current cookies\n context.commit('initFavorites', {\"type\":'documentId', arr: getCookieValue('documentIds').split(',')} );\n context.commit('initFavorites', {\"type\":'softwareId', arr: getCookieValue('softwareIds').split(',')} );\n context.commit('initFavorites', {\"type\":'articleId', arr: getCookieValue('articleIds').split(',')} );\n context.commit('initFavorites', {\"type\":'productId', arr: getCookieValue('productIds').split(',')} );\n context.commit('initFavorites', {\"type\":'legalDocumentId', arr: getCookieValue('legalDocumentIds').split(',')} );\n\n // console.log(context.state.favorites);\n\n context.dispatch('checkFavorites');\n },\n cookieFavorites(context) {\n // cookie current saved items in store\n let docStr = context.state.favorites.documentId.toString();\n let softwareStr = context.state.favorites.softwareId.toString();\n let articleStr = context.state.favorites.articleId.toString();\n let productStr = context.state.favorites.productId.toString();\n let legalDocStr = context.state.favorites.legalDocumentId.toString();\n document.cookie = `documentIds=${docStr}; max-age=1209600; path=/`;\n document.cookie = `softwareIds=${softwareStr}; max-age=1209600; path=/`;\n document.cookie = `articleIds=${articleStr}; max-age=1209600; path=/`;\n document.cookie = `productIds=${productStr}; max-age=1209600; path=/`;\n document.cookie = `legalDocumentIds=${legalDocStr}; max-age=1209600; path=/`;\n },\n checkFavorites(context) {\n // validate cookies with api\n let docStr = context.state.favorites.documentId.toString();\n let softwareStr = context.state.favorites.softwareId.toString();\n let articleStr = context.state.favorites.articleId.toString();\n let productStr = context.state.favorites.productId.toString();\n let legalDocStr = context.state.favorites.legalDocumentId.toString();\n\n let axiosParams = {\n documentId: docStr == \"\" ? null : docStr.charAt(0) == \",\" ? docStr.slice(1) : docStr,\n softwareId: softwareStr == \"\" ? null : softwareStr.charAt(0) == \",\" ? softwareStr.slice(1) : softwareStr,\n articleId: articleStr == \"\" ? null : articleStr.charAt(0) == \",\" ? articleStr.slice(1) : articleStr,\n productId: productStr == \"\" ? null : productStr.charAt(0) == \",\" ? productStr.slice(1) : productStr,\n legalDocumentId: legalDocStr == \"\" ? null : legalDocStr.charAt(0) == \",\" ? legalDocStr.slice(1) : legalDocStr\n }\n // console.log(axiosParams);\n\n // const apiUrl = getApiUrl();\n const apiUrl = `/api/validateids?`;\n // console.log(apiUrl);\n // let TESTURL = \"http://localhost:3003/validateIds\";\n axios.get(apiUrl, {\n params: {\n ...axiosParams\n }\n })\n .then(function(response) {\n store.commit('sanitizeFavorites', response.data.results);\n store.dispatch('cookieFavorites');\n })\n .catch(function(error) {\n console.log(error);\n });\n },\n initUnits(context) {\n let lang = document.querySelector('.top-bar__subnav-link.active') ? document.querySelector('.top-bar__subnav-link.active').dataset.lang : null;\n // console.log(\"LANG\", lang)\n store.commit('setCurrentLang', lang);\n if (lang !== \"en-us\") {\n store.commit('setUnits', 'metric');\n } else {\n store.commit('setUnits', 'us');\n }\n },\n initGAID(context) {\n let id = getCookieValue('_ga') == '' ? null : getCookieValue('_ga') ;\n store.commit('setGAID', id);\n // console.log(id);\n }\n }\n});\n\nexport default store;","import Vue from 'vue/dist/vue.min.js';\nimport store from './store';\nimport EventBus from './event-bus'\n\nconst Subnav = () => {\n const subnavDom = document.querySelectorAll('.sub-nav'); \n \n let subnavConstructor = (id) => {\n Vue.component('subnav-template', {\n data: function() {\n return {\n isMobile: store.state.isMobile,\n anchors: store.state.pageAnchors,\n }\n },\n computed: {\n computedIsMobile: function() {\n return store.state.isMobile;\n },\n // computedShowAnchors: function() {\n // return store.state.showInlineAnchors;\n // }\n },\n watch: {\n computedIsMobile() {\n this.isMobile = this.computedIsMobile;\n },\n // computedShowAnchors() {\n // this.showAnchors = this.computedShowAnchors;\n // }\n },\n methods: {\n \n },\n mounted() {\n \n }\n });\n\n Vue.component('subnav-desktop', {\n props: ['isMobile'],\n data: function() {\n return {\n\n }\n },\n methods: {\n\n },\n mounted() {\n\n }\n });\n\n Vue.component('subnavDropdown', {\n props: ['anchors'],\n data: function() {\n return {\n\n }\n },\n template: `\n \n `,\n methods: {\n jump(e) {\n window.location.hash = `#${e.target.value}`;\n //console.log(e.target.value);\n }\n },\n mounted() {\n \n }\n });\n\n Vue.component('anchor-dropdown-item', {\n props: ['data'],\n data: function() {\n return {\n\n }\n },\n template: `\n \n `,\n methods: {\n\n },\n mounted() {\n \n }\n });\n\n new Vue({\n el: `.subnav-${id}`,\n }).$mount(`.subnav-${id}`, true);\n }\n\n if (subnavDom.length > 0 ) {\n subnavDom.forEach((item, index) => {\n item.classList.add(`subnav-${index}`);\n subnavConstructor(index);\n })\n }\n\n}\n\nexport default Subnav;","/*\n Tabs is a decorator function to add the Vue Tabs component.\n * Arguments:\n - {Object} options\n * Usage:\n The 'options' argument is the same configuration for a Vue Component. in addition, the next options:\n\n - name [string]: name used for Tabs component in Vue. (by default is 'tabs'. Remember considering the prefix option.)\n\n * Props:\n\n - current-id-tab: sets the first the currently active tab (by default is '1').\n - active-class: is a CSS class, uses when the tab is active. this uses for passing the same value to the tab components.\n\n # The Sub-components:\n\n * tab: the tab component is the tab button, this has the next props:\n - id-tab: is the tab id that links with its content.\n - current-tab: identifies the currently active tab (is required for the tabs functionality).\n - change-tab: is the function that triggers the tab changing (is required for the tabs functionality).\n - active-class: is a CSS class, uses when the tab is active. (by default 'active')\n\n * tab-content: the tab-content component is the tab content, this has the next props:\n - id-tab: is the tab id that links with its tab button.\n - current-tab: identifies the currently active tab (is required for the tabs functionality).\n - change-tab: is the function that triggers the tab changing (is required for the tabs functionality in cascade mode).\n - tab-class: is a CSS class, uses when the tab button styles. (by default 'tab', only in cascade mode)\n - active-class: is a CSS class, uses when the tab is active. (by default is active)\n*/\nimport {\n content as contentTemplate,\n tab as tabTemplate,\n} from './template-strings/tabs-component';\n\nconst tabs = ({ name = 'tabs', props, data: dataProp, mounted, methods, components, tabProps, contentProps, tabData, tabContentData, tabOptions, tabContentOptions, ...options} = {}) => {\n return {\n name,\n props: {\n currentIdTab: [String, Number],\n activeClass: String,\n ...props\n },\n data: function() {\n const _dataProp = dataProp && dataProp();\n const data = {\n currentTab: this.currentIdTab || 1,\n ..._dataProp\n };\n\n return data;\n },\n mounted: function() {\n mounted && mounted.call(this);\n\n const tabChildren = {};\n this.$children.forEach(c => {\n const tag = c.$vnode.componentOptions.tag;\n if(!['tab', 'tab-content'].includes(tag)){\n return;\n }\n\n const id = c.idTab;\n const e = tabChildren[id];\n\n if(!e){\n tabChildren[id] = c;\n return;\n }\n\n c.setTabInstance(e);\n });\n },\n methods: {\n changeTab: function(id){\n this.currentTab = id;\n },\n ...methods\n },\n components: {\n 'tab' : {\n name: 'tab',\n template: tabTemplate,\n props: {\n idTab: [String, Number],\n activeClass: {type: String, default: 'active'},\n currentTab: [String, Number],\n changeTab: Function,\n ...tabProps\n },\n data: function() {\n return {\n ...tabData,\n }\n },\n ...tabOptions,\n methods: {\n onClick: function(){\n this.changeTab(this.idTab);\n },\n setTabInstance: function(e){\n return e.setTabDefaultSlot(this.getDefaultSlot())\n },\n getDefaultSlot: function(){\n return this.$slots.default;\n }\n },\n },\n 'tab-content' : {\n name: 'tab-content',\n template: contentTemplate,\n props: {\n idTab: [String, Number],\n currentTab: [String, Number],\n tabClass: { type: String, default: 'tab'},\n activeClass: {type: String, default: 'active'},\n changeTab: Function,\n ...contentProps\n },\n data: function() {\n let data = {\n tabSlot: undefined,\n ...tabContentData\n };\n\n return data;\n },\n ...tabContentOptions,\n beforeUpdate: function() {\n this.$slots.tab = this.tabSlot;\n },\n methods: {\n onClick: function(){\n this.changeTab(this.idTab);\n },\n setTabInstance: function(e){\n this.setTabDefaultSlot(e.getDefaultSlot())\n },\n setTabDefaultSlot: function(slot){\n this.tabSlot = slot;\n }\n },\n },\n ...components\n },\n ...options\n }\n};\n\nexport default tabs;\n","export const tabSelectMobile = `\n
    \n \n \n
    \n`;\n\nexport const productItem = `\n
    \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n \n
    \n
    \n
    \n
    \n \n \n \n

    \n \\{{data.productName}}\n

    \n
    \n \\{{data.description}}\n
    \n
    \n View product\n \n
    \n
    \n\n
    \n
    \n
    \n
    \n`;\n\nexport const documentItem = `\n
    \n
    \n
    \n
    \n \n \\{{data.eyebrow}}\n \n \n \\{{data.name}}\n \n \n \\{{data.details}}\n \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n`;\n\nexport const softwareItem = `\n
    \n
    \n
    \n
    \n \n \\{{data.eyebrow}}\n \n \n \\{{data.name}}\n \n \n \n \n
    \n
    \n \n \n \n \n \n
    \n
    \n
    \n
    \n`;\n\nexport const articleItem = `\n
    \n
    \n
    \n
    \n
    \n
    \n \n \n \n
    \n
    \n
    \n
    \n
    \n
    \n
    \n

    \n \\{{data.articleTitle}}\n

    \n
    \n

    \\{{data.articleDetails}}

    \n
    \n
    \n\n
    \n
    \n
    \n
    \n\n`;","export const content = `\n\n`;\n\nexport const paginator = `\n
    \n \n
    \n`;\n","export const contentApplications = `\n
    \n \n
    \n`;\n","export const content = `\n
    \n
    \n \n
    \n \n
    \n`;\n\nexport const tab = `\n
  • \n \n
  • \n`;\n","import Vue from 'vue/dist/vue.min.js';\nimport { lory } from 'lory.js';\n\nconst testimonial = () => {\n\n let testimonialItem = document.querySelectorAll('.testimonial');\n\n let testimonialConstructor = (id) => {\n Vue.component('testimonial', {\n data: function() {\n return {\n sliderEl: null,\n options: {\n classNameFrame: 'testimonial__frame',\n enableMouseEvents: true\n },\n lory: null,\n currentSlide: 1,\n length: null\n }\n },\n computed: {\n \n },\n watch: {\n \n },\n methods: {\n initLory() {\n this.lory = lory(this.sliderEl, this.options);\n },\n initListener() {\n this.sliderEl.addEventListener('after.lory.slide', () => {\n this.currentSlide = this.lory.returnIndex() + 1;\n });\n },\n nextSlide() {\n this.lory.next();\n },\n prevSlide() {\n this.lory.prev();\n }\n },\n mounted() {\n this.sliderEl = this.$el.querySelector('.testimonial__slider');\n this.length = this.$el.querySelectorAll('.testimonial__slide').length;\n this.initLory();\n this.initListener();\n }\n });\n\n new Vue({\n el: `.testimonial-${id}`,\n }).$mount(`.testimonial-${id}`, true);\n }\n\n if (testimonialItem.length > 0) {\n testimonialItem.forEach((item, index) => {\n item.classList.add(`testimonial-${index}`);\n testimonialConstructor(index);\n })\n }\n\n}\n\nexport default testimonial;","import Vue from 'vue/dist/vue.min.js';\nimport tippy from 'tippy.js';\nimport VModal from 'vue-js-modal';\nimport { tooltipModal } from \"./modals\";\nVue.use(VModal);\n\nconst Timeline = () => {\n\n let timelineItems = document.querySelectorAll('.timeline');\n\n let timelineConstructor = (id) => {\n Vue.component('timeline', {\n data: function() {\n return {\n isMobile: null,\n instance: null\n }\n },\n methods: {\n initIsMobile() {\n // console.log(\"calc this\", window.innerWidth);\n // note this is checking for a smaller screen size than the isMobile value in the vuex store\n var mql = window.matchMedia('(max-width: 650px)');\n this.isMobile = mql.matches ? true : false;\n\n mql.addEventListener('change',() => {\n this.isMobile = mql.matches ? true : false;\n });\n }\n },\n mounted() {\n this.initIsMobile();\n }\n });\n\n Vue.component('timeline-item', {\n props: ['isMobile'],\n data: function() {\n return {\n message: {},\n isOpen: null\n }\n },\n watch: {\n isMobile: function() {\n if (this.isMobile) {\n this.disableTooltips;\n }\n }\n },\n methods: {\n initTippy() {\n let self = this;\n\n tippy(this.$refs.tooltip, {\n allowHTML: true,\n arrow: true,\n hideOnClick: true,\n trigger: 'click',\n interactive: true,\n zIndex: 99,\n onShow(instance) {\n // console.log(\"OPENED\");\n self.isOpen = true;\n },\n onHide(instance) {\n self.isOpen = false;\n }\n })\n },\n mobileTooltip() {\n if (this.isMobile) {\n let content = `\n
    ${this.message.date}
    \n
    ${this.message.title}
    \n
    ${this.message.copy}
    \n `;\n\n this.$modal.show(\n tooltipModal.template(content),\n tooltipModal.name,\n tooltipModal.options\n )\n }\n },\n disableTooltips() {\n let target = this.$refs.tooltip;\n let instance = target._tippy;\n instance.disable(); //@TODO: figure out why disable method isn't working\n },\n initMessageData() {\n this.message.copy = this.$refs.tooltip.getAttribute('data-tippy-content');\n this.message.title = this.$refs.desc.innerText;\n this.message.date = this.$refs.date.innerText;\n }\n },\n mounted() {\n this.$nextTick(() => {\n this.initTippy();\n if (this.isMobile) {\n this.disableTooltips();\n } \n });\n this.initMessageData();\n }\n })\n\n new Vue({\n el: `.timeline-${id}`,\n }).$mount(`.timeline-${id}`, true);\n }\n\n if (timelineItems.length > 0) {\n timelineItems.forEach((item, index) => {\n item.classList.add(`timeline-${index}`);\n timelineConstructor(index);\n })\n }\n\n}\n\nexport default Timeline;","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {videoModal} from './modals';\n\nconst VideoPlayerLink = () => {\n\n let videos = document.querySelectorAll('.video-player-link');\n Vue.use(VModal);\n\n let VideoConstructor = (id) => {\n Vue.component('video-player-template-link', {\n data: function() {\n return {\n videoUrl: '',\n videoName: null\n }\n },\n methods: {\n launchVideo() {\n this.$modal.show(\n videoModal.template(this.videoUrl, this.videoName),\n videoModal.name,\n videoModal.options\n )\n }\n } ,\n mounted() {\n this.videoUrl = this.$refs.overlay.dataset.videoId;\n this.videoName = null;\n }\n });\n \n new Vue({\n el: `.video-player-link-${id}`,\n }).$mount(`.video-player-link-${id}`, true);\n }\n\n if (videos.length > 0) {\n videos.forEach((item, index) => {\n item.classList.add(`video-player-link-${index}`);\n VideoConstructor(index);\n })\n }\n}\n\nexport default VideoPlayerLink;","import Vue from 'vue/dist/vue.min.js';\nimport VModal from 'vue-js-modal';\nimport {videoModal} from './modals';\n\nconst VideoPlayer = () => {\n\n let videos = document.querySelectorAll('.video-player');\n Vue.use(VModal);\n\n let VideoConstructor = (id) => {\n Vue.component('video-player-template', {\n data: function() {\n return {\n videoUrl: '',\n videoName: null\n }\n },\n methods: {\n launchVideo() {\n this.$modal.show(\n videoModal.template(this.videoUrl, this.videoName),\n videoModal.name,\n videoModal.options\n )\n }\n },\n mounted() {\n this.videoUrl = this.$refs.overlay.dataset.videoId;\n this.videoName = this.$refs.name ? this.$refs.name.innerHTML : null;\n }\n });\n \n new Vue({\n el: `.video-player-${id}`,\n }).$mount(`.video-player-${id}`, true);\n }\n\n if (videos.length > 0) {\n videos.forEach((item, index) => {\n item.classList.add(`video-player-${index}`);\n VideoConstructor(index);\n })\n }\n}\n\nexport default VideoPlayer;","// Polyfills for IE\nimport './polyfills/element.closest';\nimport './polyfills/matchMedia';\nimport 'nodelist-foreach-polyfill';\nimport 'core-js/features/promise';\nimport 'core-js/es/symbol/iterator';\nimport 'core-js/es/object/assign';\nimport 'core-js/es/array/find';\nimport 'core-js/es/array/from';\nimport 'core-js/es/array/includes';\nimport 'core-js/es/string/includes';\nimport 'intersection-observer';\n\n// import sample from './lib/sample.js';\nimport drawer from './lib/drawer.js';\nimport productsAccessories from './lib/products-accessories.js';\nimport ctaBarTop from './lib/cta-bar-top.js';\nimport ctaBarBottom from './lib/cta-bar-bottom.js';\nimport subNav from './lib/sub-nav.js';\nimport topBar from './lib/menu-top-bar.js';\nimport fwMedia from './lib/fw-media.js';\nimport howItWorks from './lib/how-it-works.js';\nimport videoPlayer from './lib/video-player.js';\nimport videoPlayerLink from './lib/video-player-link.js';\n\nimport specifications from './lib/specifications.js';\nimport heroProducts from './lib/hero-products.js';\nimport marketApps from './lib/market-applications.js';\nimport megamenu from './lib/megamenu.js';\n\n\n\n\n\n\n\n\nimport footerUnitToggler from './lib/footer-units.js';\nimport documentation from './lib/documentation.js';\nimport software from './lib/software-firmware.js';\nimport productCatalog from './lib/product-catalog.js';\nimport internalSearch from './lib/internal-search.js';\nimport {pardotForm} from './lib/pardot-form.js';\nimport bookmarks from './lib/bookmarks.js';\nimport { instance, trigger} from './lib/modal-trigger.js';\n\nimport documentationContextual from './lib/documentation-contextual.js';\nimport softwareCard from './lib/software-card.js'; //for software/firmware no filtering version\nimport quickLinks from './lib/quick-links.js';\nimport homeHero from './lib/home-hero.js';\nimport searchResults from \"./lib/search-results\";\nimport testimonial from \"./lib/testimonial\";\nimport patents from \"./lib/patents\";\nimport legalCompliance from \"./lib/legal-compliance\";\nimport timeline from \"./lib/timeline\";\nimport literatureOrder from \"./lib/lit-order\";\nimport genericModal from \"./lib/generic-modal\";\nimport slideshow from './lib/slideshow.js';\n\nimport store from './lib/store';\n\n// importing libraries for modules\nimport ComponentModule from './lib/component-module';\nimport './lib/modules';\n\ndocument.addEventListener('DOMContentLoaded', () => {\n genericModal();\n drawer();\n productsAccessories();\n ctaBarTop();\n ctaBarBottom();\n subNav();\n topBar();\n fwMedia();\n howItWorks();\n videoPlayer();\n videoPlayerLink();\n \n specifications();\n heroProducts();\n marketApps();\n megamenu();\n footerUnitToggler();\n documentation();\n software();\n productCatalog();\n internalSearch();\n pardotForm();\n bookmarks();\n // Initialization modules\n ComponentModule.Init();\n instance;\n trigger();\n documentationContextual();\n softwareCard();\n quickLinks();\n homeHero();\n searchResults();\n testimonial();\n patents();\n legalCompliance();\n timeline();\n literatureOrder();\n slideshow();\n\n // always scroll lock body when modal or mobile megamenu is open\n let observerTarget = document.querySelector('body');\n let scrollLock = () => {\n if (document.querySelector('.bmi-modal') || document.querySelector('.megamenu__mobile-submenu.active')) {\n observerTarget.classList.add('scroll-lock');\n } else {\n observerTarget.classList.remove('scroll-lock');\n }\n }\n let options = {\n subtree: true,\n childList: true\n }\n let observer = new MutationObserver(scrollLock);\n observer.observe(observerTarget, options);\n\n // init units to us or metric\n store.dispatch('initUnits');\n // init getting GA client ID\n store.dispatch('initGAID');\n});\n\nstore.dispatch('initCookies'); //init cookies for bookmark feature\nstore.dispatch('checkMobile'); \n","if (!Element.prototype.matches) {\n\tElement.prototype.matches = Element.prototype.msMatchesSelector ||\n\t\tElement.prototype.webkitMatchesSelector;\n}\n\nif (!Element.prototype.closest) {\n\tElement.prototype.closest = function closest(s) {\n\t\tconst el = this;\n\t\tlet ancestor = this;\n\t\tif (!document.documentElement.contains(el)) return null;\n\t\tdo {\n\t\t\tif (ancestor.matches(s)) return ancestor;\n\t\t\tancestor = ancestor.parentElement;\n\t\t} while (ancestor !== null);\n\t\treturn null;\n\t};\n}\n","// Modernizr style test\nif (!(window.webkitMatchMedia || window.mozMatchMedia || window.oMatchMedia || window.msMatchMedia || window.matchMedia)) {\n\tvar root = document.getElementsByTagName( 'html' )[0];\n\troot.className += ' no-matchmedia';\n}\n\n/*! matchMedia() polyfill - Test a CSS media type/query in JS. Authors & copyright (c) 2012: Scott Jehl, Paul Irish, Nicholas Zakas, David Knight. Dual MIT/BSD license */\nwindow.matchMedia || (window.matchMedia = function() {\n \"use strict\";\n\n // For browsers that support matchMedium api such as IE 9 and webkit\n var styleMedia = (window.styleMedia || window.media);\n\n // For those that don't support matchMedium\n if (!styleMedia) {\n var style = document.createElement('style'),\n script = document.getElementsByTagName('script')[0],\n info = null;\n\n style.type = 'text/css';\n style.id = 'matchmediajs-test';\n\n script.parentNode.insertBefore(style, script);\n\n // 'style.currentStyle' is used by IE <= 8 and 'window.getComputedStyle' for all other browsers\n info = ('getComputedStyle' in window) && window.getComputedStyle(style, null) || style.currentStyle;\n\n styleMedia = {\n matchMedium: function(media) {\n var text = '@media ' + media + '{ #matchmediajs-test { width: 1px; } }';\n\n // 'style.styleSheet' is used by IE <= 8 and 'style.textContent' for all other browsers\n if (style.styleSheet) {\n style.styleSheet.cssText = text;\n } else {\n style.textContent = text;\n }\n\n // Test if media query is true or false\n return info.width === '1px';\n }\n };\n }\n\n return function(media) {\n return {\n matches: styleMedia.matchMedium(media || 'all'),\n media: media || 'all'\n };\n };\n}());\n\n/*! matchMedia() polyfill addEventListener/removeEventListener extension. Author & copyright (c) 2012: Scott Jehl. Dual MIT/BSD license */\n(function(){\n // Bail out for browsers that have addEventListener support\n if (window.matchMedia && window.matchMedia('all').addEventListener) {\n return false;\n }\n\n var localMatchMedia = window.matchMedia,\n hasMediaQueries = localMatchMedia('only all').matches,\n isListening = false,\n timeoutID = 0, // setTimeout for debouncing 'handleChange'\n queries = [], // Contains each 'mql' and associated 'listeners' if 'addEventListener' is used\n handleChange = function(evt) {\n // Debounce\n clearTimeout(timeoutID);\n\n timeoutID = setTimeout(function() {\n for (var i = 0, il = queries.length; i < il; i++) {\n var mql = queries[i].mql,\n listeners = queries[i].listeners || [],\n matches = localMatchMedia(mql.media).matches;\n\n // Update mql.matches value and call listeners\n // Fire listeners only if transitioning to or from matched state\n if (matches !== mql.matches) {\n mql.matches = matches;\n\n for (var j = 0, jl = listeners.length; j < jl; j++) {\n listeners[j].call(window, mql);\n }\n }\n }\n }, 30);\n };\n\n window.matchMedia = function(media) {\n var mql = localMatchMedia(media),\n listeners = [],\n index = 0;\n\n mql.addEventListener = function(listener) {\n // Changes would not occur to css media type so return now (Affects IE <= 8)\n if (!hasMediaQueries) {\n return;\n }\n\n // Set up 'resize' listener for browsers that support CSS3 media queries (Not for IE <= 8)\n // There should only ever be 1 resize listener running for performance\n if (!isListening) {\n isListening = true;\n window.addEventListener('resize', handleChange, true);\n }\n\n // Push object only if it has not been pushed already\n if (index === 0) {\n index = queries.push({\n mql : mql,\n listeners : listeners\n });\n }\n\n listeners.push(listener);\n };\n\n mql.removeEventListener = function(listener) {\n for (var i = 0, il = listeners.length; i < il; i++){\n if (listeners[i] === listener){\n listeners.splice(i, 1);\n }\n }\n };\n\n return mql;\n };\n}());\n","module.exports={\n \"meterSelector\": {\n \"apiQuery\": [\n \"flowType\"\n ],\n \"question\": \"What are you measuring?\",\n \"totalSteps\": 9,\n \"filterName\": \"Flow type\",\n \"stepId\": \"01.0\",\n \"button\": [\n {\n \"label\": \"Water\",\n \"value\": \"Water\",\n \"icon\": \"water\",\n \"totalPages\": 10\n },\n {\n \"label\": \"Oil\",\n \"value\": \"Oil\",\n \"icon\": \"oil\"\n },\n {\n \"label\": \"Steam\",\n \"value\": \"Steam\",\n \"icon\": \"steam\",\n \"totalPages\": 10\n },\n {\n \"label\": \"Air / Gas\",\n \"value\": \"Air / Gas\",\n \"icon\": \"air-gas\"\n },\n {\n \"label\": \"Other liquid\",\n \"value\": \"Other liquid\",\n \"icon\": \"other\",\n \"selectedLabel\": \"Based on your selection, we recommend you connect with a product expert for assistance finding the appropriate meter options for your application.\",\n \"totalPages\": 10\n }\n ],\n \"searchResults\": {\n \"Results\": [\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/9ffrt62foa/jpeg/Air%20and%20Compressed%20Gas%20Meters%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/yhf0kktfsd/png/Hedland-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"Air and Compressed Gas Meter\",\n \"url\": \"/products/meters/variable-area-flow-meters/air-and-compressed-gas-meter/\",\n \"id\": \"94\",\n \"stats\": [\n {\n \"label\": \"

    Size

    \",\n \"valueImperial\": \"1/4...3 in.\",\n \"valueMetric\": \"6...80 mm\"\n },\n {\n \"label\": \"

    Temperature Range

    \",\n \"valueImperial\": \"-20...240 °F\",\n \"valueMetric\": \"-29...116 °C\"\n },\n {\n \"label\": \"

    Flow Range

    \",\n \"valueImperial\": \"0.5...2200 scfm\",\n \"valueMetric\": \"0.2...1130 l/sec\"\n },\n {\n \"label\": \"

    Pressure Range

    \",\n \"valueImperial\": \"Up to 1500 PSI\",\n \"valueMetric\": \"Up to 103 bar\"\n }\n ],\n \"markets\": [\n \"Automotive Fluid Dispensing\",\n \"Aviation & Aerospace\",\n \"Municipal Water Treatment & Distribution\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Variable Area Flow Meters\",\n \"brand\": \"Hedland\",\n \"flowTypes\": [\n \"Air / Gas\"\n ],\n \"guid\": \"ca331136-ff6e-43c1-b513-d209a455e138\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/ly4uvs42he/jpeg/Air-Caustic%20and%20Corrosive%20Gas%20Meters%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/yhf0kktfsd/png/Hedland-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"Caustic and Corrosive Air/Gas Meter\",\n \"url\": \"/products/meters/variable-area-flow-meters/caustic-and-corrosive-airgas-meter/\",\n \"id\": \"96\",\n \"stats\": [\n {\n \"label\": \"Size Range\",\n \"valueImperial\": \"1/4…1 1/2 in.\",\n \"valueMetric\": \"6...40 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \" -20...240 °F\",\n \"valueMetric\": \"-29…116 °C\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"2...800 scfm\",\n \"valueMetric\": \"1…350 lpm\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"±2% (1/4 in. is +7%)\",\n \"valueMetric\": \"±2% (1/4 in. is +7%)\"\n }\n ],\n \"markets\": [\n \"Automotive Fluid Dispensing\",\n \"Aviation & Aerospace\",\n \"Municipal Water Treatment & Distribution\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Variable Area Flow Meters\",\n \"brand\": \"Hedland\",\n \"flowTypes\": [\n \"Air / Gas\"\n ],\n \"guid\": \"34907486-2783-4301-bbe8-d254e02e197b\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/5lrawuyqnd/jpeg/COIN-FF%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"COIN FF\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-wedge-flange-process-by-flange-instrumentation-model-ff-flow-meter/\",\n \"id\": \"139\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...48 in.\",\n \"valueMetric\": \"12...1219 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 1500 °F\",\n \"valueMetric\": \"Up to 815 °C\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Dependent on flange rating\",\n \"valueMetric\": \"Dependent on flange rating\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"57869087-8c87-46e4-b962-c0a43247632d\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/s8iymbnqc3/jpeg/COIN-NB-%28with-weld%29%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"COIN NB\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-butt-weld-wedge-model-nb-flow-meter/\",\n \"id\": \"137\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...4 in.\",\n \"valueMetric\": \"12...101 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 800 °F\",\n \"valueMetric\": \"Up to 426 °C\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Dependent on flange rating\",\n \"valueMetric\": \"Dependent on flange rating\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"31fdfe6b-d040-401a-ad0b-4e64e0016016\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/m8verp5tni/jpeg/COIN-NF%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"COIN NF\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-flanged-with-npt-pressure-taps-model-nf-flow-meter/\",\n \"id\": \"138\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...48 in.\",\n \"valueMetric\": \"12...1,219 mm\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Process & General Industry\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"dcb7bd65-a1fa-4309-bb4d-697274a1623a\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/3niwaz7vpr/jpeg/NN%20Back-to-Back-Wedge-Meter%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"COIN NN\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-back-to-back-wedge-model-nn-flow-meter/\",\n \"id\": \"136\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...6 in.\",\n \"valueMetric\": \"12...152 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 800 °F\",\n \"valueMetric\": \"Up to 426 °C\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Dependent on flange rating\",\n \"valueMetric\": \"Dependent on flange rating\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"2acc193c-dad7-45e2-b2da-d66715c99b6d\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/qi7m5tqc94/jpeg/COIN-NW%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"Coin NW\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/coin-wedge-wafer-model-nw-flow-meter/\",\n \"id\": \"135\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...4 in.\",\n \"valueMetric\": \"13...101 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 800 °F\",\n \"valueMetric\": \"Up to 426 °C\"\n },\n {\n \"label\": \"Pressure Rating\",\n \"valueImperial\": \"Dependent on flange rating \",\n \"valueMetric\": \"Dependent on flange rating\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"(uncalibrated) ±3% (calibrated) ±0.5%\",\n \"valueMetric\": \"(uncalibrated) ±3% (calibrated) ±0.5%\"\n }\n ],\n \"markets\": [\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"d7a7121d-391a-4f4c-80f8-d682bf7669d8\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/pyfbogfk4l/jpeg/2019_Cone%20Meter%20%28low%20res%29.png?w=400&h=400&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/zzheljuso0/png/Preso-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"Cone DP Meters\",\n \"url\": \"/products/meters/differential-pressure-flow-meters/cone-differential-pressure-flow-meter/\",\n \"id\": \"140\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/2...24 in.\",\n \"valueMetric\": \"12...609 mm\"\n },\n {\n \"label\": \"Accuracy\",\n \"valueImperial\": \"±0.5%\",\n \"valueMetric\": \"±0.5%\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Building Design, HVAC, & Plumbing\",\n \"Municipal Water Treatment & Distribution\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Differential Pressure Flow Meters\",\n \"brand\": \"Preso\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"d3bcb2a8-dab3-459d-8be6-b7c7489d6298\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/sabwvp2yss/jpeg/Cox%20Gas%20Turbine%20Meters%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/i3c0moz15i/png/Cox-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"CPG - Precision Meter for Gases\",\n \"url\": \"/products/meters/turbine-flow-meters/precision-gas-flow-meter/\",\n \"id\": \"148\",\n \"stats\": [\n {\n \"label\": \"Size Range\",\n \"valueImperial\": \"0.25...2 in. \",\n \"valueMetric\": \"6...50 mm\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"0.4...250 scfm\",\n \"valueMetric\": \"1.89...118 lps\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Up to 5000 PSI\",\n \"valueMetric\": \"Up to 344 bar\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 500 °F\",\n \"valueMetric\": \"Up to 260 °C\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Turbine Flow Meters\",\n \"brand\": \"Cox\",\n \"flowTypes\": [\n \"Air / Gas\"\n ],\n \"guid\": \"ce0c3b13-f870-4112-baba-a86e1fc064c0\"\n },\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/ylw0ld9kol/jpeg/Cox%20Precision%20Turbine%20Meters%20%28low-res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/i3c0moz15i/png/Cox-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"CPT - Precision Single Rotor\",\n \"url\": \"/products/meters/turbine-flow-meters/precision-turbine-meter/\",\n \"id\": \"146\",\n \"stats\": [\n {\n \"label\": \"Size Range\",\n \"valueImperial\": \"0.25...2 in.\",\n \"valueMetric\": \"6...50 mm\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"0.05...310 gpm\",\n \"valueMetric\": \"0.19...1173 l/min\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Up to 6000 PSI\",\n \"valueMetric\": \"Up to 408 bar\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"Up to 450 °F \",\n \"valueMetric\": \"Up to 232 °C\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Meters\",\n \"productType\": \"Turbine Flow Meters\",\n \"brand\": \"Cox\",\n \"flowTypes\": [\n \"Oil\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"f9efd9cf-2b00-4661-97ac-2c6eba04a994\"\n }\n ],\n \"SavedItemsCount\": 0,\n \"TotalResults\": 7,\n \"ViewProductLabel\": \"view product label\"\n }\n },\n \"searchResults\": {\n \"results\": [\n {\n \"title\": \"M2000 Electromagnetic Flow Meter\",\n \"description\": \"

    Combining a general-purpose detector with an amplifier, the ModMAG® M2000 Electromagnetic flow meter features an advanced, user-friendly design that is built for field verification testing with the use of a simple, handheld device.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/97vunv3vsv/jpeg/ModMAG-M2000-%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/electromagnetic-flow-meters/m2000-electromagnetic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_1666a162-2dfd-44d7-9f34-9b39f090b223_en\"\n },\n {\n \"title\": \"M5000 Electromagnetic Flow Meter\",\n \"description\": \"

    The ModMAG® M5000 Electromagnetic flow meter is an ideal solution for remote potable water applications, providing consistently reliable and accurate measurements.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/9yihjbuepv/jpeg/ModMAG-M5000-%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=hdkpxq\",\n \"linkUrl\": \"/products/meters/electromagnetic-flow-meters/m5000-electromagnetic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_bfb42605-a11a-4c92-a58e-812d05527d28_en\"\n },\n {\n \"title\": \"

    U500w Ultrasonic Flow Meter

    \",\n \"description\": \"

    The Dynasonics® U500w Ultrasonic flow meter uses solid-state technology in a compact, completely encapsulated housing, suitable for residential and commercial applications.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/nthehsoabl/jpeg/U500w%20Ultrasonic%20Flow%20Meters%20%28low%20res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=hdkpxq\",\n \"linkUrl\": \"/products/meters/ultrasonic-flow-meters/u500w-ultrasonic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_2eaf6ba9-9340-4f02-a5bf-27e0dab4bcf2_en\"\n },\n {\n \"title\": \"DXN Portable Hybrid Ultrasonic Flow Meter\",\n \"description\": \"

    The Dynasonics® DXN Portable Hybrid Ultrasonic flow meter is a powerful tool used for troubleshooting flow issues, whether you want to quickly verify the flow reading of another meter or to data log flow system values over an extended period of time.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/1uye50izbz/jpeg/Hybrid%20Ultrasonic%20Flow%20Meters%20-%20DXN%20%28low%20res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/ultrasonic-flow-meters/dxn-portable-hybrid-ultrasonic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_54b3483b-33c5-4106-a12b-a530af8f53c6_en\"\n },\n {\n \"title\": \"380 Series BTU System Meter\",\n \"description\": \"

    The Series 380 BTU meter is an all-in-one energy usage package for monitoring hydronic heating or cooling systems. This meter accurately measures flow and temperature differential to compute energy and can interface with many existing control systems.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/sbtdpgcxvd/jpeg/380%20Series%20Btu%20System%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/impeller-flow-products/380-series-btu-system-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_9d08a29f-c6a7-4783-9a85-774b369dc89d_en\"\n },\n {\n \"title\": \"

    Precision Turbine Meter

    \",\n \"description\": \"

    The Cox® Precision Turbine Meter has unprecedented mechanical linearity, resulting in minimizing or negating temperature induced viscosity influence.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/ylw0ld9kol/jpeg/Cox%20Precision%20Turbine%20Meters%20%28low-res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/turbine-flow-meters/precision-turbine-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_f9efd9cf-2b00-4661-97ac-2c6eba04a994_en\"\n },\n {\n \"title\": \"B1750 Positive Displacement Meter\",\n \"description\": \"

    The Blancett® B1750 Positive Displacement meter provides high measurement accuracy for fluids over a wide viscosity range.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/idv3exmbrj/jpeg/Positive%20Displacement%20-%20B1750%20%28low-res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/turbine-flow-meters/b1750-positive-displacement-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_398b68a9-53aa-4f60-8dad-889c47644324_en\"\n },\n {\n \"title\": \"B1500 Turbine Flow Meter\",\n \"description\": \"

    The Blancett® B1500 Turbine flow meter has exceptional mechanical linearity, resulting in minimizing or negating temperature induced viscosity influence.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/vevizb2zpc/jpeg/B1500%20with%20Monitor%20%28low%20res%29.png?w=600&h=600&keep=c&crop=yes&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/turbine-flow-meters/b1500-turbine-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_1392645a-e6db-4afe-a83a-7e2ab8d95658_en\"\n },\n {\n \"title\": \"900 Series Flow Meter\",\n \"description\": \"

    The Blancett® 900 Series flow meter is rugged, low-priced and specifically designed to measure floodwater line flow in secondary oil recovery operations.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/wbnbckchqu/jpeg/900%20Series%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"linkUrl\": \"/products/meters/turbine-flow-meters/900-series-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_3d399e3a-2e98-484e-8e71-3bdff24bb65d_en\"\n },\n {\n \"title\": \"Phosphate Ester Fluid Meter\",\n \"description\": \"

    The Hedland® phosphate ester fluid meter provides a measurement solution for fire-resistant fluids, aviation hydraulic fluid and industrial lubricant, which have high ignition temperatures and low vapor pressures.

    \\n

    Download a Hedland Price List

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/7keut3aify/jpeg/Phosphate%20Ester%20Fluid%20Meter%20%28low%20res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"linkUrl\": \"/products/meters/variable-area-flow-meters/phosphate-ester-fluid-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_82285c14-14b7-4e65-9848-3c67c6a1c1e8_en\"\n }\n ],\n \"savedItemsCount\": 0,\n \"totalResults\": 1542,\n \"trackId\": \"JXkJYrdtqhkFNyCtCrBnPw==\",\n \"filterCountResults\": [\n {\n \"filterValue\": 59,\n \"count\": 196\n },\n {\n \"filterValue\": 56,\n \"count\": 24\n },\n {\n \"filterValue\": 159,\n \"count\": 9\n },\n {\n \"filterValue\": 60,\n \"count\": 10\n },\n {\n \"filterValue\": 36,\n \"count\": 7\n },\n {\n \"filterValue\": 222,\n \"count\": 10\n },\n {\n \"filterValue\": 205,\n \"count\": 9\n },\n {\n \"filterValue\": 65,\n \"count\": 23\n },\n {\n \"filterValue\": 64,\n \"count\": 19\n },\n {\n \"filterValue\": 35,\n \"count\": 1078\n },\n {\n \"filterValue\": 161,\n \"count\": 11\n },\n {\n \"filterValue\": 157,\n \"count\": 57\n },\n {\n \"filterValue\": 158,\n \"count\": 21\n },\n {\n \"filterValue\": 201,\n \"count\": 47\n },\n {\n \"filterValue\": 58,\n \"count\": 14\n },\n {\n \"filterValue\": 160,\n \"count\": 7\n }\n ],\n \"didYouMean\": [\n \"meter specification\",\n \"strainer\",\n \"pulse meter\",\n \"meters\",\n \"meter \"\n ]\n },\n \"searchResults2\": {\n \"results\": [\n {\n \"title\": \"Specifications / ModMAG\",\n \"description\": \"ModMAG® M3000\",\n \"imageUrl\": \"/static/images/doc-icon.svg\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/0ytwh51ram/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_c635b182-867d-46ab-bba6-cfa4e82b3e49_en\"\n },\n {\n \"title\": \"M2000 Electromagnetic Flow Meter\",\n \"description\": \"

    Combining a general-purpose detector with an amplifier, the ModMAG® M2000 Electromagnetic flow meter features an advanced, user-friendly design that is built for field verification testing with the use of a simple, handheld device.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/97vunv3vsv/jpeg/ModMAG-M2000-%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rf1shk\",\n \"linkUrl\": \"/products/meters/electromagnetic-flow-meters/m2000-electromagnetic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"isProduct\": true,\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_1666a162-2dfd-44d7-9f34-9b39f090b223_en\"\n },\n {\n \"title\": \"Product Data Sheets / ModMAG\",\n \"description\": \"M-Series® M4000\",\n \"imageUrl\": \"/static/images/pdf-icon.svg\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/iiiwrqlyde/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"isProduct\": false,\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_947c8940-b704-431a-9cb1-abe18f873fe4_en\"\n },\n {\n \"title\": \"Brochures / AquaCUE, Dynasonics, Impeller, Industrial Oval Gear (IOG), ModMAG, Recordall, Vortex\",\n \"description\": \"ModMAG® M4000\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/pnuoqyhk3f/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_f7d86f38-8c5d-436f-bcf4-1fe5ca5d2a23_en\"\n },\n {\n \"title\": \"

    How Modern Technology and Data Analytics Are Enabling Total Visibility of Water Use

    \",\n \"description\": \"ModMAG® M1000, M2000 and M5000 Field Verification Device Manual\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/gv55za7hzw/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_b47c6583-b31d-44e4-bbfb-e59c90642806_en\"\n },\n {\n \"title\": \"

    Badger Meter Improves Operating Reliability in Hydronic Heating and Cooling Applications

    \",\n \"description\": \"ModMAG® M5000 OIML Certificate of Conformity\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/1y8oj0khwe/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_17a270e2-433d-4490-b492-ca7af876c6f6_en\"\n },\n {\n \"title\": \"M5000 Electromagnetic Flow Meter\",\n \"description\": \"

    The ModMAG® M5000 Electromagnetic flow meter is an ideal solution for remote potable water applications, providing consistently reliable and accurate measurements.

    \",\n \"imageUrl\": \"https://badgermeter.widen.net/content/9yihjbuepv/jpeg/ModMAG-M5000-%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=hdkpxq\",\n \"linkUrl\": \"/products/meters/electromagnetic-flow-meters/m5000-electromagnetic-flow-meter/\",\n \"filterValue\": 59,\n \"filterText\": \"Products\",\n \"isProduct\": true,\n \"hitId\": \"BadgerMeter_Web_Models_Catalog_ProductVariation/CatalogContent_bfb42605-a11a-4c92-a58e-812d05527d28_en\"\n },\n {\n \"title\": \"Specifications / ModMAG\",\n \"description\": \"ModMAG® M7600 Electromagnetic Flow Meter\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/1fdwgy8ecr/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_adc43f32-036f-43bc-aa46-3a57116ef114_en\"\n },\n {\n \"title\": \"Specifications / ModMAG\",\n \"description\": \"ModMAG® M1000\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/rayfx51aak/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_9e73d507-e7cd-42c1-a5f3-d417f2d72739_en\"\n },\n {\n \"title\": \"Application Data Sheets / ModMAG\",\n \"description\": \"ModMAG® M2000 Connecting a Badger Meter Endpoint to the M2000\",\n \"imageUrl\": \"\",\n \"linkUrl\": \"https://badgermeter.widen.net/content/tmwpmjrqkx/original?download=true&x.app=api\",\n \"filterValue\": 35,\n \"filterText\": \"Documents\",\n \"hitId\": \"BadgerMeter_Web_Models_Blocks_DataBlocks_DAMDocumentBlock/_eaf19cc3-1275-41c2-a42c-d0d9434a8298_en\"\n }\n ],\n \"savedItemsCount\": 0,\n \"totalResults\": 122,\n \"trackId\": \"JXkJYrdtqhkFNyCtCrBnPw==\",\n \"filterCountResults\": [\n {\n \"filterValue\": 56,\n \"count\": 1\n },\n {\n \"filterValue\": 35,\n \"count\": 97\n },\n {\n \"filterValue\": 59,\n \"count\": 7\n },\n {\n \"filterValue\": 36,\n \"count\": 3\n },\n {\n \"filterValue\": 64,\n \"count\": 2\n },\n {\n \"filterValue\": 161,\n \"count\": 1\n },\n {\n \"filterValue\": 157,\n \"count\": 9\n },\n {\n \"filterValue\": 158,\n \"count\": 2\n }\n ],\n \"didYouMean\": [\n \"modmag m2000 manual\",\n \"modmag m2000\",\n \"modmag \",\n \"modmag m\"\n ]\n },\n \"searchResultsNone\": {\n \"results\": [],\n \"savedItemsCount\": 0,\n \"totalResults\": 0,\n \"trackId\": \"1v7sJX0O1notEuJ3MpFl5w==\",\n \"filterCountResults\": [],\n \"didYouMean\": [\n \"meters\"\n ]\n },\n \"documentsById\": {\n \"results\": [\n {\n \"eyebrow\": \"APPLICATION DATA SHEET\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"36\"\n },\n {\n \"eyebrow\": \"APPLICATION DATA SHEET2\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"36\"\n },\n {\n \"eyebrow\": \"APPLICATION DATA SHEET3\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"36\"\n }\n ]\n },\n \"softwareById\": {\n \"results\": [\n {\n \"eyebrow\": \"Dynasonics\",\n \"name\": \"

    Dynasonics TFX Ultra - English Firmware®

    \",\n \"details\": \"Firmware | Version D007-1045-018_RevT | Updated July 23, 2020 | 190 KB | See release notes\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/v4yty5lduv/original/Dynasonics%20TFX%20Ultra%20-%20English%20Firmware-D007-1045-018_RevT.zip?download=true&x.app=api&expires=1595695089240&signature.version=V3&signature=aY-cU4AjThtvO94DKpSRRQrSh9ZCgOLNPxZF_zKFoPQ%3D\",\n \"viewDetailsUrl\": \"/en/test-software-page-1/\",\n \"id\": \"73\"\n },\n {\n \"eyebrow\": \"eyebrow\",\n \"name\": \"Dynasonics TFX Ultra - French Firmware2\",\n \"details\": \"Firmware | Version D007-1045-020_RevU | Updated July 23, 2020 | 190 KB | See release notes\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/rrutsxzq68/original/Dynasonics%20TFX%20Ultra%20-%20French%20Firmware-D007-1045-020_RevU.zip?download=true&x.app=api&expires=1595695089240&signature.version=V3&signature=f74dbR2mLkoPvrwCrBmbJm-s899ZfXukzr3hLRJr_Lw%3D\",\n \"viewDetailsUrl\": null,\n \"id\": \"74\"\n },\n {\n \"eyebrow\": \"Dynasonics\",\n \"name\": \"Dynasonics TFX Ultra EtherNet-IP eds file\",\n \"details\": \"Software | Version N/A | Updated July 23, 2020 | 25 KB | See release notes\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/w98jtufybu/original/Dynasonics%20TFX%20Ultra%20EtherNet-IP%20eds%20file.eds?download=true&x.app=api&expires=1595695089240&signature.version=V3&signature=gapKEGxWK38f6VfA55eWyYZRZxueLPQMR-iuzfijZsY%3D\",\n \"viewDetailsUrl\": null,\n \"id\": \"75\"\n }\n ]\n },\n \"recentPosts\": {\n \"success\": \"true\",\n \"page\": 1,\n \"count\": 50,\n \"prevPage\": null,\n \"nextPage\": 3,\n \"pageCount\": 3,\n \"totalPages\": 6,\n \"limit\": 24,\n \"results\": [\n {\n \"image\": \"https://placehold.it/353x550\",\n \"title\": \"

    10 ways flow meters aid in water & wastewater treatment

    \",\n \"url\": \"#\",\n \"type\": \"Article\",\n \"info\": \"2 min read\"\n },\n {\n \"image\": \"https://placehold.it/353x550\",\n \"title\": \"Blancett meters help hydraulic fracturing companies\",\n \"url\": \"#\",\n \"type\": \"Article\",\n \"info\": \"2 min read\"\n },\n {\n \"image\": \"https://placehold.it/353x550\",\n \"title\": \"High temperature© gas control for automotive test cell\",\n \"url\": \"#\",\n \"type\": \"Article\",\n \"info\": \"2 min read\"\n },\n {\n \"image\": \"https://placehold.it/353x550\",\n \"title\": \"High temperature gas control for automotive test cell\",\n \"url\": \"#\",\n \"type\": \"Article\",\n \"info\": \"2 min read\"\n }\n ]\n },\n \"productsByBrand\": {\n \"success\": \"true\",\n \"results\": [\n {\n \"key\": \"B1500 Turbine Flow Meter\",\n \"value\": \"B1500 Turbine Flow Meter\"\n },\n {\n \"key\": \"B1750 Positive Displacement Meter\",\n \"value\": \"B1750 Positive Displacement Meter\"\n },\n {\n \"key\": \"B2900 Series Flow Monitor\",\n \"value\": \"B2900 Series Flow Monitor\"\n },\n {\n \"key\": \"B3000 Series Flow Monitor\",\n \"value\": \"B3000 Series Flow Monitor\"\n },\n {\n \"key\": \"B3100 Series Flow Monitor\",\n \"value\": \"B3100 Series Flow Monitor\"\n },\n {\n \"key\": \"FloClean Sanitary Turbine Flow Meter\",\n \"value\": \"FloClean Sanitary Turbine Flow Meter\"\n },\n {\n \"key\": \"Intelligent Frequency Converter\",\n \"value\": \"

    Intelligent Frequency Converter

    \"\n },\n {\n \"key\": \"K-Factor Scaler (Blancett)\",\n \"value\": \"

    K-Factor Scaler (Blancett)

    \"\n },\n {\n \"key\": \"Model 1100 Turbine Flow Meter\",\n \"value\": \"Model 1100 Turbine Flow Meter\"\n },\n {\n \"key\": \"Model 1200 In-Line Turbine Flow Meter\",\n \"value\": \"Model 1200 In-Line Turbine Flow Meter\"\n },\n {\n \"key\": \"Model 900 Series Flow Meter\",\n \"value\": \"900 Series Flow Meter\"\n },\n {\n \"key\": \"QuikSert Gas B142\",\n \"value\": \"

    B142 Gas QuikSert® Turbine Flow Meter

    \"\n },\n {\n \"key\": \"QuikSert In-Line Turbine Flow Meter\",\n \"value\": \"

    QuikSert® In-Line Turbine Flow Meter

    \"\n }\n ]\n },\n \"products\": {\n \"success\": \"true\",\n \"viewProductLabel\": \"View product label\",\n \"totalResults\": 10,\n \"results\": [\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/odvvjf5xo7/jpeg/10%2C000%20psi%20-%20HP-10%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/9pdcioduim/png/RCV-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"

    10,000 PSI Type HP-10 High Pressure Control Valve

    \",\n \"url\": \"/products/valves/10000-psi-type-hp-10-high-pressure-control-valve/\",\n \"id\": \"70\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/4...1/2 in.\",\n \"valueMetric\": \"6...12 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"75…1000 °F\",\n \"valueMetric\": \"24…538 °C\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"0…2.5 cv\",\n \"valueMetric\": \"0...35.75 kv\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Up to 10,000 PSI\",\n \"valueMetric\": \"Up to 689 bar\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Valves\",\n \"productType\": null,\n \"brand\": \"Research Control Valves\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"b51983af-7c6e-44d2-850d-477bf9968dc5\"\n },\n {\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series sample\",\n \"url\": \"/url/to/product\",\n \"id\": \"7\",\n \"brand\": \"brand2\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueMetric\": \"54 cm.\",\n \"valueImperial\": \"5634 in.\"\n },\n {\n \"label\": \"Temperature range\",\n \"valueMetric\": \"up tp 123C\",\n \"valueImperial\": \"up tp 123F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 123 metric\",\n \"valueImperial\": \"up tp 123 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"8\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000\",\n \"url\": \"/url/to/product\",\n \"id\": \"12\",\n \"brand\": \"brand4\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueMetric\": \"1-7 cm.\",\n \"valueImperial\": \"1/4-2 in.\"\n },\n {\n \"label\": \"Temperature range\",\n \"valueMetric\": \"up tp 000C\",\n \"valueImperial\": \"up tp 000F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 000 metric\",\n \"valueImperial\": \"up tp 000 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"9\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"10\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"11\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"17\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"18\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n }\n ]\n },\n \"productsTest\": {\n \"success\": \"true\",\n \"viewProductLabel\": \"View product label\",\n \"totalResults\": 10,\n \"results\": [\n {\n \"productImageUrl\": \"https://badgermeter.widen.net/content/odvvjf5xo7/jpeg/10%2C000%20psi%20-%20HP-10%20%28low-res%29.png?w=600&h=600&position=c&color=ffffffff&quality=80&u=rb73pf\",\n \"brandImageUrl\": \"https://badgermeter.widen.net/content/9pdcioduim/png/RCV-Logo_Simplified_Gray%20%28Low%20Res%29.png?h=36&position=c&color=ffffff00&quality=80&u=uzmwhv\",\n \"productName\": \"

    Test

    \",\n \"url\": \"/products/valves/10000-psi-type-hp-10-high-pressure-control-valve/\",\n \"id\": \"4561\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueImperial\": \"1/4...1/2 in.\",\n \"valueMetric\": \"6...12 mm\"\n },\n {\n \"label\": \"Temperature Range\",\n \"valueImperial\": \"75…1000 °F\",\n \"valueMetric\": \"24…538 °C\"\n },\n {\n \"label\": \"Flow Range\",\n \"valueImperial\": \"0…2.5 cv\",\n \"valueMetric\": \"0...35.75 kv\"\n },\n {\n \"label\": \"Pressure Range\",\n \"valueImperial\": \"Up to 10,000 PSI\",\n \"valueMetric\": \"Up to 689 bar\"\n }\n ],\n \"markets\": [\n \"Aviation & Aerospace\",\n \"Oil & Gas\",\n \"Process & General Industry\",\n \"Refining, Chemical & Petrochemical\",\n \"Test Equipment & Services\"\n ],\n \"productCategory\": \"Valves\",\n \"productType\": null,\n \"brand\": \"Research Control Valves\",\n \"flowTypes\": [\n \"Oil\",\n \"Steam\",\n \"Air / Gas\",\n \"Water\",\n \"Other liquid\"\n ],\n \"guid\": \"b51983af-7c6e-44d2-850d-477bf9968dc5\"\n },\n {\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series sample\",\n \"url\": \"/url/to/product\",\n \"id\": \"700\",\n \"brand\": \"brand2\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueMetric\": \"54 cm.\",\n \"valueImperial\": \"5634 in.\"\n },\n {\n \"label\": \"Temperature range\",\n \"valueMetric\": \"up tp 123C\",\n \"valueImperial\": \"up tp 123F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 123 metric\",\n \"valueImperial\": \"up tp 123 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"test testModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"800\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000\",\n \"url\": \"/url/to/product\",\n \"id\": \"1200\",\n \"brand\": \"brand4\",\n \"stats\": [\n {\n \"label\": \"Size\",\n \"valueMetric\": \"1-7 cm.\",\n \"valueImperial\": \"1/4-2 in.\"\n },\n {\n \"label\": \"Temperature range\",\n \"valueMetric\": \"up tp 000C\",\n \"valueImperial\": \"up tp 000F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 000 metric\",\n \"valueImperial\": \"up tp 000 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"900\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"500\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"400\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"100\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n },\n {\n \"productImageUrl\": \"https://placehold.it/200x150\",\n \"brandImageUrl\": \"https://placehold.it/62x20\",\n \"productName\": \"ModMAG M-Series M2000 blah blah blah\",\n \"url\": \"/url/to/product\",\n \"id\": \"150\",\n \"brand\": \"brand3\",\n \"stats\": [\n {\n \"label\": \"Something else\",\n \"valueMetric\": \"97 cm.\",\n \"valueImperial\": \"3435 in.\"\n },\n {\n \"label\": \"Something\",\n \"valueMetric\": \"up tp 765C\",\n \"valueImperial\": \"up tp 777F\"\n },\n {\n \"label\": \"Prassure range\",\n \"valueMetric\": \"up tp 777 metric\",\n \"valueImperial\": \"up tp 777 us\"\n }\n ]\n }\n ]\n },\n \"software\": {\n \"results\": [\n {\n \"eyebrow\": \"Dynasonics\",\n \"name\": \"LM_LM-OGA-OGTAER_ZUL_MID_01_2012\",\n \"details\": \"Firmware | Version D007-1045-018_RevT | Updated July 23, 2020 | 190 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/v4yty5lduv/original/Dynasonics%20TFX%20Ultra%20Firmware%20%5BEnglish%5D%20-%20D007-1045-018_RevT.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": null,\n \"id\": \"295\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Dynasonics\",\n \"brands\": [\n \"Dynasonics\"\n ],\n \"downloadType\": \"Firmware\",\n \"documentName\": \"Dynasonics TFX Ultra Firmware [English]\",\n \"releaseNotes\": \"test test test test test\"\n },\n {\n \"eyebrow\": \"Impeller/Data Industrial\",\n \"name\": \"Impeller 340LW Series LonWorks Configuration Software\",\n \"details\": \"Software | Updated August 19, 2020 | 1 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/hlnzlwdv0t/original/Impeller%20340LW%20Series%20LonWorks%20Configuration%20Software.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/Impeller-340lw-series-lonworks-configuration-software/\",\n \"id\": \"438\",\n \"productName\": \"Type 340 LW-LonWorks BTU Transmitter\",\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Impeller/Data Industrial\",\n \"brands\": [\n \"Impeller/Data Industrial\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Impeller 340LW Series LonWorks Configuration Software\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"ModMAG\",\n \"name\": \"ModMag Field Verification Device PC Software\",\n \"details\": \"Software | Version v1.0.17 | Updated August 19, 2020 | 7.02 MB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/zjvppiew3o/original/ModMAG%20Field%20Verification%20Device%20PC%20Software%20-%20v1.0.17.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/modmag-field-verification-device-pc-software/\",\n \"id\": \"446\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"ModMAG\",\n \"brands\": [\n \"ModMAG\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"ModMag Field Verification Device PC Software\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Blancett\",\n \"name\": \"Blancett B3100 Monitor Configuration Software\",\n \"details\": \"Software | Updated August 19, 2020 | 1.51 MB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/5y34yrqpp6/original/Blancett%20B3100%20Monitor%20Configuration%20Software.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/blancett-b3100-monitor-configuration-software/\",\n \"id\": \"452\",\n \"productName\": \"B3100 Series Flow Monitor\",\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Blancett\",\n \"brands\": [\n \"Blancett\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Blancett B3100 Monitor Configuration Software\",\n \"releaseNotes\": \"test\"\n },\n {\n \"eyebrow\": \"Cox ; Impeller/Data Industrial\",\n \"name\": \"FC-5000 Firmware [Legacy]\",\n \"details\": \"Firmware | Version v1.2.4 | Updated August 19, 2020 | 374 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/ka4jpbkvo0/original/FC-5000%20Firmware%20-%20Legacy%201.2.4.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/fc-5000-firmware-legacy/\",\n \"id\": \"436\",\n \"productName\": \"FC-5000 BTU Monitor ; FC-5000 Flow Computer ; FC-5000 Flow Display\",\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Cox, Impeller/Data Industrial\",\n \"brands\": [\n \"Cox\",\n \"Impeller/Data Industrial\"\n ],\n \"downloadType\": \"Firmware\",\n \"documentName\": \"FC-5000 Firmware [Legacy]\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Coriolis\",\n \"name\": \"Coriolls RCTX Transmitter EtherNet/IP EDS\",\n \"details\": \"Software | Updated August 19, 2020 | 3 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/b3csju1yft/original/Coriolls%20EtherNetIP%20eds%20file%20for%20RCTX%20transmitter.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/coriolis-ethernet-ip-eds-file-for-rctx-transmitter/\",\n \"id\": \"450\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Coriolis\",\n \"brands\": [\n \"Coriolis\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Coriolls RCTX Transmitter EtherNet/IP EDS\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Dynasonics\",\n \"name\": \"Dynaconics Flow Meter Tool\",\n \"details\": \"Software | Version v1.6.10 | Updated August 19, 2020 | 2.24 MB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/p2nz5p5ylj/original/Dynaconics%20Flow%20Meter%20Tool%20-%20v1.6.10.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/dynasonics-isonic-4000-flow-meter-software/\",\n \"id\": \"455\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Dynasonics\",\n \"brands\": [\n \"Dynasonics\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Dynaconics Flow Meter Tool\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Research Control Valve (RCV)\",\n \"name\": \"RCV SEVA 100 EtherNet/IP Driver\",\n \"details\": \"Software | Updated August 19, 2020 | 3 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/riwznioshg/original/RCV%20SEVA%20100%20EtherNetIP%20Driver.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/rcv-seva-100-ethernet-ip-driver/\",\n \"id\": \"444\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Research Control Valve (RCV)\",\n \"brands\": [\n \"Research Control Valve (RCV)\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"RCV SEVA 100 EtherNet/IP Driver\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"Coriolis\",\n \"name\": \"Coriolis RCT Calc Selection Tool\",\n \"details\": \"Software | Updated August 19, 2020 | 21.73 MB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/ryl0fcae6v/original/Coriolis%20RCT%20Calc%20Selection%20Tool.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/sizing-and-selection-tools/coriolis-rctcalc-selection-tool/\",\n \"id\": \"460\",\n \"productName\": null,\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"Coriolis\",\n \"brands\": [\n \"Coriolis\"\n ],\n \"downloadType\": \"Software\",\n \"documentName\": \"Coriolis RCT Calc Selection Tool\",\n \"releaseNotes\": null\n },\n {\n \"eyebrow\": \"ModMAG\",\n \"name\": \"ModMAG M5000 Firmware\",\n \"details\": \"Firmware | Version v2.0.25 | Updated August 19, 2020 | 53 KB\",\n \"downloadUrl\": \"https://badgermeter.widen.net/content/767ksclvco/original/ModMAG%20M5000%20Firmware-v2.0.25.zip?download=true&x.app=api\",\n \"downloadHref\": \"#downloadhref\",\n \"viewDetailsUrl\": \"/software-firmware/modmag-m5000-firmware/\",\n \"id\": \"442\",\n \"productName\": \"M5000\",\n \"languages\": [\n \"English\"\n ],\n \"brand\": \"ModMAG\",\n \"brands\": [\n \"ModMAG\"\n ],\n \"downloadType\": \"Firmware\",\n \"documentName\": \"ModMAG M5000 Firmware\",\n \"releaseNotes\": null\n }\n ],\n \"savedItemsCount\": 0,\n \"totalResults\": 60,\n \"releaseNotesLabel\": \"release notes label\"\n },\n \"documentation\": {\n \"results\": [\n {\n \"eyebrow\": \"APPLICATION DATA SHEET\",\n \"name\": \"LM_LM-OGA-OGTAER_ZUL_MID_01_2012\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://badgermeter.widen.net/content/fjcdopcl3n/original/IOG-PS-00137-EN_Industrial%20Oval%20Gear%20Inline%20and%20Flanged%20Meters%20and%20Register%20Parts.pdf?download=true&x.app=api\",\n \"id\": \"35\",\n \"documentId\": \"abc-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Electromagnetic flow meter user manual\",\n \"details\": \"ModMAG M-Series M2000, test1, test2,test3, test4, test5\",\n \"language\": \"French\",\n \"url\": \"https://badgermeter.widen.net/content/hiv7vd69uo/original/TTM-SS-03125-EN_Dynasonics TFX-5000 Flow Meter Specifications.docx?download=true\",\n \"id\": \"36\",\n \"documentId\": \"def-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"37\",\n \"documentId\": \"ghi-000-0000-000\"\n },\n {\n \"eyebrow\": \"APPLICATION DATA SHEET\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000, test, test, test, test, test\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"38\",\n \"documentId\": \"jkl-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Electromagnetic flow meter user manual\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"39\",\n \"documentId\": \"mno-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"40\",\n \"documentId\": \"prq-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"41\",\n \"documentId\": \"abc-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"42\",\n \"documentId\": \"abc-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"43\",\n \"documentId\": \"abc-000-0000-000\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"44\",\n \"documentId\": \"abc-000-0000-000\"\n }\n ],\n \"totalResults\": 88\n },\n \"documentationTest\": {\n \"results\": [\n {\n \"eyebrow\": \"APPLICATION DATA SHEET test\",\n \"name\": \"Electromagnetic flow meter data sheet\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"350\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES test\",\n \"name\": \"Electromagnetic flow meter user manual\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"360\"\n },\n {\n \"eyebrow\": \"MANUALS & GUIDES\",\n \"name\": \"Test item 3\",\n \"details\": \"ModMAG M-Series M2000\",\n \"language\": \"French\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"370\"\n }\n ],\n \"totalResults\": 11\n },\n \"legal\": {\n \"results\": [\n {\n \"eyebrow\": \"Purchase terms\",\n \"name\": \"Purchase order - general terms and conditions\",\n \"details\": \"North America, test2, test3, test4, test5\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"40\"\n },\n {\n \"eyebrow\": \"Sales terms\",\n \"name\": \"Badger Meter sales terms and onditions\",\n \"details\": \"North America, test1, test2\",\n \"language\": \"English\",\n \"url\": \"https://widen.badgermeter.com/damstuff/document.docx\",\n \"id\": \"70\"\n }\n ],\n \"totalResults\": 67\n },\n \"validateIds\": {\n \"success\": \"true\",\n \"results\": {\n \"invalidIds\": [\n 10,\n 5,\n 110,\n 2\n ],\n \"documentIds\": [\n 35,\n 41\n ],\n \"softwareIds\": [\n 74\n ],\n \"productIds\": [\n 11,\n 20,\n 35,\n 8\n ],\n \"articleIds\": []\n }\n },\n \"beaconrefs\": {\n \"success\": true,\n \"content\": {\n \"chat_doc_id\": \"25cf117fef15421e813739ff6204cedb\",\n \"prompt_intent\": \"GENERAL_QUESTION\",\n \"response\": \"The following references were identified in the search:\",\n \"sources\": [\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:42+00:00\",\n \"date_published\": \"2024-06-27T15:21:42+00:00\",\n \"date_updated\": \"2024-06-27T15:21:42+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/9ac7d962d4e588bd71b39fd5a43125a7e3530d3d6e8fad493371da3598d55c67.png\",\n \"source_title\": \"RTS-DS-00320-EN\\\\_Recordall Turbo Series Meters Models 160, 200, 450, 1000, 2000, 3500, 5500, 6200\",\n \"source_url\": \"https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE\",\n \"date_created\": \"2024-06-27T15:22:07+00:00\",\n \"date_published\": \"2024-06-27T15:22:07+00:00\",\n \"date_updated\": \"2024-06-27T15:22:07+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/cms/24a270a2597726f4dca7107a3c0b53c218ff0fc75084dc6e15133198de631fa4.png\",\n \"source_title\": \"\",\n \"source_url\": \"https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE\",\n \"date_created\": \"2024-06-27T15:23:35+00:00\",\n \"date_published\": \"2024-06-27T15:23:35+00:00\",\n \"date_updated\": \"2024-06-27T15:23:35+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/cms/a236ceeceb97862294623e29a7498a669837e7d16a85b9209edfa2b00b46deb4.png\",\n \"source_title\": \"\",\n \"source_url\": \"https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:41+00:00\",\n \"date_published\": \"2024-06-27T15:21:41+00:00\",\n \"date_updated\": \"2024-06-27T15:21:41+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/35e78c89f1f25e39636fd8de98288743bc9d7a8c73ffe13484bff3c3500091b7.png\",\n \"source_title\": \"ORION Endpoint Utility 2.7.X for Trimble Ranger 3 Manual (ORI-UM-00802-EN).pdf\",\n \"source_url\": \"https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:41+00:00\",\n \"date_published\": \"2024-06-27T15:21:41+00:00\",\n \"date_updated\": \"2024-06-27T15:21:41+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/35e78c89f1f25e39636fd8de98288743bc9d7a8c73ffe13484bff3c3500091b7.png\",\n \"source_title\": \"ORION Endpoint Utility 2.7.X for Trimble Ranger 3 Manual (ORI-UM-00802-EN).pdf\",\n \"source_url\": \"https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api\"\n }\n ],\n \"status\": \"GENERATE_ANSWER_END\",\n \"took_secs\": 0.53,\n \"anonymous_id\": \"986f7fb25ef94d43a36321068d2e01b4\"\n }\n },\n \"beacondocs\": {\n \"success\": true,\n \"content\": {\n \"chat_doc_id\": \"0868bee1b1e24fcfbe4575b81a2e9dfe\",\n \"confidence_level\": null,\n \"disclaimer\": \"This information was generated by an AI system and should not be solely relied upon for decision-making. Always verify information with credible sources and consult with relevant experts before taking any action based on AI-generated content.\",\n \"preferred_language\": \"en\",\n \"prompt_intent\": \"GENERAL_QUESTION\",\n \"related_questions\": [\n \"What are the steps to clear a tamper condition on an endpoint?\",\n \"How can i troubleshoot common issues related to endpoint tampering?\"\n ],\n \"response\": \"The ModMAG documentation provides detailed information on the installation, operation, and maintenance of Badger Meter's ModMAG flow meters. Here are some key points extracted from the documentation:\\n\\n1. **Installation Requirements**:\\n - Temperature sensors must be connected to specific clamps: the inlet flow temperature sensor to clamps 5 and 6, and the outlet flow temperature sensor to clamps 7 and 8. The color of the wires does not matter, but connections must be tight [**2**].\\n - The pulse output of the flow meter must match the calculator input pulse value. For flow meters with open collector connections, ensure the polarity is correct [**2**].\\n\\n2. **Flow Meter Specifications**:\\n - Flow meters should comply with Class OA (reed contact) and Class OC (open collector) standards according to EN 1434-2: 2015. The maximum input frequency is 10 Hz, with a pulse length of at least 25 ms and a pulse pause of at least 50 ms [**2**].\\n\\n3. **Operation Guidelines**:\\n - Before starting operation, ensure that the flow meter is the correct size, the directional arrow matches the flow direction, and there are no leaks. Additionally, check that the heating/cooling system is clear of clogs [**2**].\\n\\n4. **Maintenance Procedures**:\\n - Regular cleaning of the flow tube and electrodes may be necessary, depending on the properties of the process fluid. Use isopropyl alcohol or clean water for cleaning, ensuring compatibility with the measured fluid [**4**].\\n - Fuse replacement should only be performed by authorized personnel, and the same type and rating of fuses must be used [**4**].\\n\\n5. **Technical Support**:\\n - If issues arise with the meter, it is recommended to contact Badger Meter's technical support for assistance, especially if a problem appears to originate from the printed circuit board (PCB) [**4**].\\n\\nFor more detailed information, including specific installation diagrams and technical specifications, you can refer to the official Badger Meter documentation available on their website [**1**].\\n\\nIf you have specific aspects of the ModMAG documentation you would like to explore further, please let me know!\\n\\n\",\n \"sources\": [\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:42+00:00\",\n \"date_published\": \"2024-06-27T15:21:42+00:00\",\n \"date_updated\": \"2024-06-27T15:21:42+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/9ac7d962d4e588bd71b39fd5a43125a7e3530d3d6e8fad493371da3598d55c67.png\",\n \"source_title\": \"ORION Field Application 4.3.0 for Trimble Ranger 3 with ReadCenter Manual (ORI-UM-00185-EN).pdf\",\n \"source_url\": \"https://badgermeter.widen.net/content/onii5cdw7m/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE\",\n \"date_created\": \"2024-06-27T15:22:07+00:00\",\n \"date_published\": \"2024-06-27T15:22:07+00:00\",\n \"date_updated\": \"2024-06-27T15:22:07+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/cms/24a270a2597726f4dca7107a3c0b53c218ff0fc75084dc6e15133198de631fa4.png\",\n \"source_title\": \"\",\n \"source_url\": \"https://badgermeter.widen.net/content/vodetxkyxh/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE\",\n \"date_created\": \"2024-06-27T15:23:35+00:00\",\n \"date_published\": \"2024-06-27T15:23:35+00:00\",\n \"date_updated\": \"2024-06-27T15:23:35+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/cms/a236ceeceb97862294623e29a7498a669837e7d16a85b9209edfa2b00b46deb4.png\",\n \"source_title\": \"\",\n \"source_url\": \"https://badgermeter.widen.net/content/aielwqtffe/original?download=false&x.app=api\"\n },\n {\n \"category\": \"BADGER_METER_SITE_DAM\",\n \"date_created\": \"2024-06-27T15:21:41+00:00\",\n \"date_published\": \"2024-06-27T15:21:41+00:00\",\n \"date_updated\": \"2024-06-27T15:21:41+00:00\",\n \"source\": \"KNN\",\n \"source_language\": \"en\",\n \"source_page_number\": null,\n \"source_summary\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_summary_full\": \"[Read more...](https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api)\",\n \"source_thumbnail\": \"https://aquaflo.beaconama-staging.net/v_6_4/thumbnails/dam/35e78c89f1f25e39636fd8de98288743bc9d7a8c73ffe13484bff3c3500091b7.png\",\n \"source_title\": \"ORION Endpoint Utility 2.7.X for Trimble Ranger 3 Manual (ORI-UM-00802-EN).pdf\",\n \"source_url\": \"https://badgermeter.widen.net/content/zjkj72tjs2/original?download=false&x.app=api\"\n }\n ],\n \"status\": \"GENERATE_ANSWER_END\",\n \"took_secs\": 6.13,\n \"anonymous_id\": \"c24dbe56476a4bdc9277f3cf04f11357\"\n }\n },\n \"beaconfeedback\": {\n \"success\": true\n }\n}","/**\n * @popperjs/core v2.4.4 - MIT License\n */\n\n'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nfunction getBoundingClientRect(element) {\n var rect = element.getBoundingClientRect();\n return {\n width: rect.width,\n height: rect.height,\n top: rect.top,\n right: rect.right,\n bottom: rect.bottom,\n left: rect.left,\n x: rect.left,\n y: rect.top\n };\n}\n\n/*:: import type { Window } from '../types'; */\n\n/*:: declare function getWindow(node: Node | Window): Window; */\nfunction getWindow(node) {\n if (node.toString() !== '[object Window]') {\n var ownerDocument = node.ownerDocument;\n return ownerDocument ? ownerDocument.defaultView : window;\n }\n\n return node;\n}\n\nfunction getWindowScroll(node) {\n var win = getWindow(node);\n var scrollLeft = win.pageXOffset;\n var scrollTop = win.pageYOffset;\n return {\n scrollLeft: scrollLeft,\n scrollTop: scrollTop\n };\n}\n\n/*:: declare function isElement(node: mixed): boolean %checks(node instanceof\n Element); */\n\nfunction isElement(node) {\n var OwnElement = getWindow(node).Element;\n return node instanceof OwnElement || node instanceof Element;\n}\n/*:: declare function isHTMLElement(node: mixed): boolean %checks(node instanceof\n HTMLElement); */\n\n\nfunction isHTMLElement(node) {\n var OwnElement = getWindow(node).HTMLElement;\n return node instanceof OwnElement || node instanceof HTMLElement;\n}\n\nfunction getHTMLElementScroll(element) {\n return {\n scrollLeft: element.scrollLeft,\n scrollTop: element.scrollTop\n };\n}\n\nfunction getNodeScroll(node) {\n if (node === getWindow(node) || !isHTMLElement(node)) {\n return getWindowScroll(node);\n } else {\n return getHTMLElementScroll(node);\n }\n}\n\nfunction getNodeName(element) {\n return element ? (element.nodeName || '').toLowerCase() : null;\n}\n\nfunction getDocumentElement(element) {\n // $FlowFixMe: assume body is always available\n return (isElement(element) ? element.ownerDocument : element.document).documentElement;\n}\n\nfunction getWindowScrollBarX(element) {\n // If has a CSS width greater than the viewport, then this will be\n // incorrect for RTL.\n // Popper 1 is broken in this case and never had a bug report so let's assume\n // it's not an issue. I don't think anyone ever specifies width on \n // anyway.\n // Browsers where the left scrollbar doesn't cause an issue report `0` for\n // this (e.g. Edge 2019, IE11, Safari)\n return getBoundingClientRect(getDocumentElement(element)).left + getWindowScroll(element).scrollLeft;\n}\n\nfunction getComputedStyle(element) {\n return getWindow(element).getComputedStyle(element);\n}\n\nfunction isScrollParent(element) {\n // Firefox wants us to check `-x` and `-y` variations as well\n var _getComputedStyle = getComputedStyle(element),\n overflow = _getComputedStyle.overflow,\n overflowX = _getComputedStyle.overflowX,\n overflowY = _getComputedStyle.overflowY;\n\n return /auto|scroll|overlay|hidden/.test(overflow + overflowY + overflowX);\n}\n\n// Composite means it takes into account transforms as well as layout.\n\nfunction getCompositeRect(elementOrVirtualElement, offsetParent, isFixed) {\n if (isFixed === void 0) {\n isFixed = false;\n }\n\n var documentElement = getDocumentElement(offsetParent);\n var rect = getBoundingClientRect(elementOrVirtualElement);\n var isOffsetParentAnElement = isHTMLElement(offsetParent);\n var scroll = {\n scrollLeft: 0,\n scrollTop: 0\n };\n var offsets = {\n x: 0,\n y: 0\n };\n\n if (isOffsetParentAnElement || !isOffsetParentAnElement && !isFixed) {\n if (getNodeName(offsetParent) !== 'body' || // https://github.com/popperjs/popper-core/issues/1078\n isScrollParent(documentElement)) {\n scroll = getNodeScroll(offsetParent);\n }\n\n if (isHTMLElement(offsetParent)) {\n offsets = getBoundingClientRect(offsetParent);\n offsets.x += offsetParent.clientLeft;\n offsets.y += offsetParent.clientTop;\n } else if (documentElement) {\n offsets.x = getWindowScrollBarX(documentElement);\n }\n }\n\n return {\n x: rect.left + scroll.scrollLeft - offsets.x,\n y: rect.top + scroll.scrollTop - offsets.y,\n width: rect.width,\n height: rect.height\n };\n}\n\n// Returns the layout rect of an element relative to its offsetParent. Layout\n// means it doesn't take into account transforms.\nfunction getLayoutRect(element) {\n return {\n x: element.offsetLeft,\n y: element.offsetTop,\n width: element.offsetWidth,\n height: element.offsetHeight\n };\n}\n\nfunction getParentNode(element) {\n if (getNodeName(element) === 'html') {\n return element;\n }\n\n return (// $FlowFixMe: this is a quicker (but less type safe) way to save quite some bytes from the bundle\n element.assignedSlot || // step into the shadow DOM of the parent of a slotted node\n element.parentNode || // DOM Element detected\n // $FlowFixMe: need a better way to handle this...\n element.host || // ShadowRoot detected\n // $FlowFixMe: HTMLElement is a Node\n getDocumentElement(element) // fallback\n\n );\n}\n\nfunction getScrollParent(node) {\n if (['html', 'body', '#document'].indexOf(getNodeName(node)) >= 0) {\n // $FlowFixMe: assume body is always available\n return node.ownerDocument.body;\n }\n\n if (isHTMLElement(node) && isScrollParent(node)) {\n return node;\n }\n\n return getScrollParent(getParentNode(node));\n}\n\n/*\ngiven a DOM element, return the list of all scroll parents, up the list of ancesors\nuntil we get to the top window object. This list is what we attach scroll listeners\nto, because if any of these parent elements scroll, we'll need to re-calculate the \nreference element's position.\n*/\n\nfunction listScrollParents(element, list) {\n if (list === void 0) {\n list = [];\n }\n\n var scrollParent = getScrollParent(element);\n var isBody = getNodeName(scrollParent) === 'body';\n var win = getWindow(scrollParent);\n var target = isBody ? [win].concat(win.visualViewport || [], isScrollParent(scrollParent) ? scrollParent : []) : scrollParent;\n var updatedList = list.concat(target);\n return isBody ? updatedList : // $FlowFixMe: isBody tells us target will be an HTMLElement here\n updatedList.concat(listScrollParents(getParentNode(target)));\n}\n\nfunction isTableElement(element) {\n return ['table', 'td', 'th'].indexOf(getNodeName(element)) >= 0;\n}\n\nfunction getTrueOffsetParent(element) {\n if (!isHTMLElement(element) || // https://github.com/popperjs/popper-core/issues/837\n getComputedStyle(element).position === 'fixed') {\n return null;\n }\n\n var offsetParent = element.offsetParent;\n\n if (offsetParent) {\n var html = getDocumentElement(offsetParent);\n\n if (getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static' && getComputedStyle(html).position !== 'static') {\n return html;\n }\n }\n\n return offsetParent;\n} // `.offsetParent` reports `null` for fixed elements, while absolute elements\n// return the containing block\n\n\nfunction getContainingBlock(element) {\n var currentNode = getParentNode(element);\n\n while (isHTMLElement(currentNode) && ['html', 'body'].indexOf(getNodeName(currentNode)) < 0) {\n var css = getComputedStyle(currentNode); // This is non-exhaustive but covers the most common CSS properties that\n // create a containing block.\n\n if (css.transform !== 'none' || css.perspective !== 'none' || css.willChange && css.willChange !== 'auto') {\n return currentNode;\n } else {\n currentNode = currentNode.parentNode;\n }\n }\n\n return null;\n} // Gets the closest ancestor positioned element. Handles some edge cases,\n// such as table ancestors and cross browser bugs.\n\n\nfunction getOffsetParent(element) {\n var window = getWindow(element);\n var offsetParent = getTrueOffsetParent(element);\n\n while (offsetParent && isTableElement(offsetParent) && getComputedStyle(offsetParent).position === 'static') {\n offsetParent = getTrueOffsetParent(offsetParent);\n }\n\n if (offsetParent && getNodeName(offsetParent) === 'body' && getComputedStyle(offsetParent).position === 'static') {\n return window;\n }\n\n return offsetParent || getContainingBlock(element) || window;\n}\n\nvar top = 'top';\nvar bottom = 'bottom';\nvar right = 'right';\nvar left = 'left';\nvar auto = 'auto';\nvar basePlacements = [top, bottom, right, left];\nvar start = 'start';\nvar end = 'end';\nvar clippingParents = 'clippingParents';\nvar viewport = 'viewport';\nvar popper = 'popper';\nvar reference = 'reference';\nvar variationPlacements = /*#__PURE__*/basePlacements.reduce(function (acc, placement) {\n return acc.concat([placement + \"-\" + start, placement + \"-\" + end]);\n}, []);\nvar placements = /*#__PURE__*/[].concat(basePlacements, [auto]).reduce(function (acc, placement) {\n return acc.concat([placement, placement + \"-\" + start, placement + \"-\" + end]);\n}, []); // modifiers that need to read the DOM\n\nvar beforeRead = 'beforeRead';\nvar read = 'read';\nvar afterRead = 'afterRead'; // pure-logic modifiers\n\nvar beforeMain = 'beforeMain';\nvar main = 'main';\nvar afterMain = 'afterMain'; // modifier with the purpose to write to the DOM (or write into a framework state)\n\nvar beforeWrite = 'beforeWrite';\nvar write = 'write';\nvar afterWrite = 'afterWrite';\nvar modifierPhases = [beforeRead, read, afterRead, beforeMain, main, afterMain, beforeWrite, write, afterWrite];\n\nfunction order(modifiers) {\n var map = new Map();\n var visited = new Set();\n var result = [];\n modifiers.forEach(function (modifier) {\n map.set(modifier.name, modifier);\n }); // On visiting object, check for its dependencies and visit them recursively\n\n function sort(modifier) {\n visited.add(modifier.name);\n var requires = [].concat(modifier.requires || [], modifier.requiresIfExists || []);\n requires.forEach(function (dep) {\n if (!visited.has(dep)) {\n var depModifier = map.get(dep);\n\n if (depModifier) {\n sort(depModifier);\n }\n }\n });\n result.push(modifier);\n }\n\n modifiers.forEach(function (modifier) {\n if (!visited.has(modifier.name)) {\n // check for visited object\n sort(modifier);\n }\n });\n return result;\n}\n\nfunction orderModifiers(modifiers) {\n // order based on dependencies\n var orderedModifiers = order(modifiers); // order based on phase\n\n return modifierPhases.reduce(function (acc, phase) {\n return acc.concat(orderedModifiers.filter(function (modifier) {\n return modifier.phase === phase;\n }));\n }, []);\n}\n\nfunction debounce(fn) {\n var pending;\n return function () {\n if (!pending) {\n pending = new Promise(function (resolve) {\n Promise.resolve().then(function () {\n pending = undefined;\n resolve(fn());\n });\n });\n }\n\n return pending;\n };\n}\n\nfunction format(str) {\n for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {\n args[_key - 1] = arguments[_key];\n }\n\n return [].concat(args).reduce(function (p, c) {\n return p.replace(/%s/, c);\n }, str);\n}\n\nvar INVALID_MODIFIER_ERROR = 'Popper: modifier \"%s\" provided an invalid %s property, expected %s but got %s';\nvar MISSING_DEPENDENCY_ERROR = 'Popper: modifier \"%s\" requires \"%s\", but \"%s\" modifier is not available';\nvar VALID_PROPERTIES = ['name', 'enabled', 'phase', 'fn', 'effect', 'requires', 'options'];\nfunction validateModifiers(modifiers) {\n modifiers.forEach(function (modifier) {\n Object.keys(modifier).forEach(function (key) {\n switch (key) {\n case 'name':\n if (typeof modifier.name !== 'string') {\n console.error(format(INVALID_MODIFIER_ERROR, String(modifier.name), '\"name\"', '\"string\"', \"\\\"\" + String(modifier.name) + \"\\\"\"));\n }\n\n break;\n\n case 'enabled':\n if (typeof modifier.enabled !== 'boolean') {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"enabled\"', '\"boolean\"', \"\\\"\" + String(modifier.enabled) + \"\\\"\"));\n }\n\n case 'phase':\n if (modifierPhases.indexOf(modifier.phase) < 0) {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"phase\"', \"either \" + modifierPhases.join(', '), \"\\\"\" + String(modifier.phase) + \"\\\"\"));\n }\n\n break;\n\n case 'fn':\n if (typeof modifier.fn !== 'function') {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"fn\"', '\"function\"', \"\\\"\" + String(modifier.fn) + \"\\\"\"));\n }\n\n break;\n\n case 'effect':\n if (typeof modifier.effect !== 'function') {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"effect\"', '\"function\"', \"\\\"\" + String(modifier.fn) + \"\\\"\"));\n }\n\n break;\n\n case 'requires':\n if (!Array.isArray(modifier.requires)) {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"requires\"', '\"array\"', \"\\\"\" + String(modifier.requires) + \"\\\"\"));\n }\n\n break;\n\n case 'requiresIfExists':\n if (!Array.isArray(modifier.requiresIfExists)) {\n console.error(format(INVALID_MODIFIER_ERROR, modifier.name, '\"requiresIfExists\"', '\"array\"', \"\\\"\" + String(modifier.requiresIfExists) + \"\\\"\"));\n }\n\n break;\n\n case 'options':\n case 'data':\n break;\n\n default:\n console.error(\"PopperJS: an invalid property has been provided to the \\\"\" + modifier.name + \"\\\" modifier, valid properties are \" + VALID_PROPERTIES.map(function (s) {\n return \"\\\"\" + s + \"\\\"\";\n }).join(', ') + \"; but \\\"\" + key + \"\\\" was provided.\");\n }\n\n modifier.requires && modifier.requires.forEach(function (requirement) {\n if (modifiers.find(function (mod) {\n return mod.name === requirement;\n }) == null) {\n console.error(format(MISSING_DEPENDENCY_ERROR, String(modifier.name), requirement, requirement));\n }\n });\n });\n });\n}\n\nfunction uniqueBy(arr, fn) {\n var identifiers = new Set();\n return arr.filter(function (item) {\n var identifier = fn(item);\n\n if (!identifiers.has(identifier)) {\n identifiers.add(identifier);\n return true;\n }\n });\n}\n\nfunction getBasePlacement(placement) {\n return placement.split('-')[0];\n}\n\nfunction mergeByName(modifiers) {\n var merged = modifiers.reduce(function (merged, current) {\n var existing = merged[current.name];\n merged[current.name] = existing ? Object.assign(Object.assign(Object.assign({}, existing), current), {}, {\n options: Object.assign(Object.assign({}, existing.options), current.options),\n data: Object.assign(Object.assign({}, existing.data), current.data)\n }) : current;\n return merged;\n }, {}); // IE11 does not support Object.values\n\n return Object.keys(merged).map(function (key) {\n return merged[key];\n });\n}\n\nfunction getViewportRect(element) {\n var win = getWindow(element);\n var html = getDocumentElement(element);\n var visualViewport = win.visualViewport;\n var width = html.clientWidth;\n var height = html.clientHeight;\n var x = 0;\n var y = 0; // NB: This isn't supported on iOS <= 12. If the keyboard is open, the popper\n // can be obscured underneath it.\n // Also, `html.clientHeight` adds the bottom bar height in Safari iOS, even\n // if it isn't open, so if this isn't available, the popper will be detected\n // to overflow the bottom of the screen too early.\n\n if (visualViewport) {\n width = visualViewport.width;\n height = visualViewport.height; // Uses Layout Viewport (like Chrome; Safari does not currently)\n // In Chrome, it returns a value very close to 0 (+/-) but contains rounding\n // errors due to floating point numbers, so we need to check precision.\n // Safari returns a number <= 0, usually < -1 when pinch-zoomed\n // Feature detection fails in mobile emulation mode in Chrome.\n // Math.abs(win.innerWidth / visualViewport.scale - visualViewport.width) <\n // 0.001\n // Fallback here: \"Not Safari\" userAgent\n\n if (!/^((?!chrome|android).)*safari/i.test(navigator.userAgent)) {\n x = visualViewport.offsetLeft;\n y = visualViewport.offsetTop;\n }\n }\n\n return {\n width: width,\n height: height,\n x: x + getWindowScrollBarX(element),\n y: y\n };\n}\n\n// of the `` and `` rect bounds if horizontally scrollable\n\nfunction getDocumentRect(element) {\n var html = getDocumentElement(element);\n var winScroll = getWindowScroll(element);\n var body = element.ownerDocument.body;\n var width = Math.max(html.scrollWidth, html.clientWidth, body ? body.scrollWidth : 0, body ? body.clientWidth : 0);\n var height = Math.max(html.scrollHeight, html.clientHeight, body ? body.scrollHeight : 0, body ? body.clientHeight : 0);\n var x = -winScroll.scrollLeft + getWindowScrollBarX(element);\n var y = -winScroll.scrollTop;\n\n if (getComputedStyle(body || html).direction === 'rtl') {\n x += Math.max(html.clientWidth, body ? body.clientWidth : 0) - width;\n }\n\n return {\n width: width,\n height: height,\n x: x,\n y: y\n };\n}\n\nfunction contains(parent, child) {\n // $FlowFixMe: hasOwnProperty doesn't seem to work in tests\n var isShadow = Boolean(child.getRootNode && child.getRootNode().host); // First, attempt with faster native method\n\n if (parent.contains(child)) {\n return true;\n } // then fallback to custom implementation with Shadow DOM support\n else if (isShadow) {\n var next = child;\n\n do {\n if (next && parent.isSameNode(next)) {\n return true;\n } // $FlowFixMe: need a better way to handle this...\n\n\n next = next.parentNode || next.host;\n } while (next);\n } // Give up, the result is false\n\n\n return false;\n}\n\nfunction rectToClientRect(rect) {\n return Object.assign(Object.assign({}, rect), {}, {\n left: rect.x,\n top: rect.y,\n right: rect.x + rect.width,\n bottom: rect.y + rect.height\n });\n}\n\nfunction getInnerBoundingClientRect(element) {\n var rect = getBoundingClientRect(element);\n rect.top = rect.top + element.clientTop;\n rect.left = rect.left + element.clientLeft;\n rect.bottom = rect.top + element.clientHeight;\n rect.right = rect.left + element.clientWidth;\n rect.width = element.clientWidth;\n rect.height = element.clientHeight;\n rect.x = rect.left;\n rect.y = rect.top;\n return rect;\n}\n\nfunction getClientRectFromMixedType(element, clippingParent) {\n return clippingParent === viewport ? rectToClientRect(getViewportRect(element)) : isHTMLElement(clippingParent) ? getInnerBoundingClientRect(clippingParent) : rectToClientRect(getDocumentRect(getDocumentElement(element)));\n} // A \"clipping parent\" is an overflowable container with the characteristic of\n// clipping (or hiding) overflowing elements with a position different from\n// `initial`\n\n\nfunction getClippingParents(element) {\n var clippingParents = listScrollParents(getParentNode(element));\n var canEscapeClipping = ['absolute', 'fixed'].indexOf(getComputedStyle(element).position) >= 0;\n var clipperElement = canEscapeClipping && isHTMLElement(element) ? getOffsetParent(element) : element;\n\n if (!isElement(clipperElement)) {\n return [];\n } // $FlowFixMe: https://github.com/facebook/flow/issues/1414\n\n\n return clippingParents.filter(function (clippingParent) {\n return isElement(clippingParent) && contains(clippingParent, clipperElement) && getNodeName(clippingParent) !== 'body';\n });\n} // Gets the maximum area that the element is visible in due to any number of\n// clipping parents\n\n\nfunction getClippingRect(element, boundary, rootBoundary) {\n var mainClippingParents = boundary === 'clippingParents' ? getClippingParents(element) : [].concat(boundary);\n var clippingParents = [].concat(mainClippingParents, [rootBoundary]);\n var firstClippingParent = clippingParents[0];\n var clippingRect = clippingParents.reduce(function (accRect, clippingParent) {\n var rect = getClientRectFromMixedType(element, clippingParent);\n accRect.top = Math.max(rect.top, accRect.top);\n accRect.right = Math.min(rect.right, accRect.right);\n accRect.bottom = Math.min(rect.bottom, accRect.bottom);\n accRect.left = Math.max(rect.left, accRect.left);\n return accRect;\n }, getClientRectFromMixedType(element, firstClippingParent));\n clippingRect.width = clippingRect.right - clippingRect.left;\n clippingRect.height = clippingRect.bottom - clippingRect.top;\n clippingRect.x = clippingRect.left;\n clippingRect.y = clippingRect.top;\n return clippingRect;\n}\n\nfunction getVariation(placement) {\n return placement.split('-')[1];\n}\n\nfunction getMainAxisFromPlacement(placement) {\n return ['top', 'bottom'].indexOf(placement) >= 0 ? 'x' : 'y';\n}\n\nfunction computeOffsets(_ref) {\n var reference = _ref.reference,\n element = _ref.element,\n placement = _ref.placement;\n var basePlacement = placement ? getBasePlacement(placement) : null;\n var variation = placement ? getVariation(placement) : null;\n var commonX = reference.x + reference.width / 2 - element.width / 2;\n var commonY = reference.y + reference.height / 2 - element.height / 2;\n var offsets;\n\n switch (basePlacement) {\n case top:\n offsets = {\n x: commonX,\n y: reference.y - element.height\n };\n break;\n\n case bottom:\n offsets = {\n x: commonX,\n y: reference.y + reference.height\n };\n break;\n\n case right:\n offsets = {\n x: reference.x + reference.width,\n y: commonY\n };\n break;\n\n case left:\n offsets = {\n x: reference.x - element.width,\n y: commonY\n };\n break;\n\n default:\n offsets = {\n x: reference.x,\n y: reference.y\n };\n }\n\n var mainAxis = basePlacement ? getMainAxisFromPlacement(basePlacement) : null;\n\n if (mainAxis != null) {\n var len = mainAxis === 'y' ? 'height' : 'width';\n\n switch (variation) {\n case start:\n offsets[mainAxis] = Math.floor(offsets[mainAxis]) - Math.floor(reference[len] / 2 - element[len] / 2);\n break;\n\n case end:\n offsets[mainAxis] = Math.floor(offsets[mainAxis]) + Math.ceil(reference[len] / 2 - element[len] / 2);\n break;\n }\n }\n\n return offsets;\n}\n\nfunction getFreshSideObject() {\n return {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n };\n}\n\nfunction mergePaddingObject(paddingObject) {\n return Object.assign(Object.assign({}, getFreshSideObject()), paddingObject);\n}\n\nfunction expandToHashMap(value, keys) {\n return keys.reduce(function (hashMap, key) {\n hashMap[key] = value;\n return hashMap;\n }, {});\n}\n\nfunction detectOverflow(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n _options$placement = _options.placement,\n placement = _options$placement === void 0 ? state.placement : _options$placement,\n _options$boundary = _options.boundary,\n boundary = _options$boundary === void 0 ? clippingParents : _options$boundary,\n _options$rootBoundary = _options.rootBoundary,\n rootBoundary = _options$rootBoundary === void 0 ? viewport : _options$rootBoundary,\n _options$elementConte = _options.elementContext,\n elementContext = _options$elementConte === void 0 ? popper : _options$elementConte,\n _options$altBoundary = _options.altBoundary,\n altBoundary = _options$altBoundary === void 0 ? false : _options$altBoundary,\n _options$padding = _options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n var paddingObject = mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements));\n var altContext = elementContext === popper ? reference : popper;\n var referenceElement = state.elements.reference;\n var popperRect = state.rects.popper;\n var element = state.elements[altBoundary ? altContext : elementContext];\n var clippingClientRect = getClippingRect(isElement(element) ? element : element.contextElement || getDocumentElement(state.elements.popper), boundary, rootBoundary);\n var referenceClientRect = getBoundingClientRect(referenceElement);\n var popperOffsets = computeOffsets({\n reference: referenceClientRect,\n element: popperRect,\n strategy: 'absolute',\n placement: placement\n });\n var popperClientRect = rectToClientRect(Object.assign(Object.assign({}, popperRect), popperOffsets));\n var elementClientRect = elementContext === popper ? popperClientRect : referenceClientRect; // positive = overflowing the clipping rect\n // 0 or negative = within the clipping rect\n\n var overflowOffsets = {\n top: clippingClientRect.top - elementClientRect.top + paddingObject.top,\n bottom: elementClientRect.bottom - clippingClientRect.bottom + paddingObject.bottom,\n left: clippingClientRect.left - elementClientRect.left + paddingObject.left,\n right: elementClientRect.right - clippingClientRect.right + paddingObject.right\n };\n var offsetData = state.modifiersData.offset; // Offsets can be applied only to the popper element\n\n if (elementContext === popper && offsetData) {\n var offset = offsetData[placement];\n Object.keys(overflowOffsets).forEach(function (key) {\n var multiply = [right, bottom].indexOf(key) >= 0 ? 1 : -1;\n var axis = [top, bottom].indexOf(key) >= 0 ? 'y' : 'x';\n overflowOffsets[key] += offset[axis] * multiply;\n });\n }\n\n return overflowOffsets;\n}\n\nvar INVALID_ELEMENT_ERROR = 'Popper: Invalid reference or popper argument provided. They must be either a DOM element or virtual element.';\nvar INFINITE_LOOP_ERROR = 'Popper: An infinite loop in the modifiers cycle has been detected! The cycle has been interrupted to prevent a browser crash.';\nvar DEFAULT_OPTIONS = {\n placement: 'bottom',\n modifiers: [],\n strategy: 'absolute'\n};\n\nfunction areValidElements() {\n for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {\n args[_key] = arguments[_key];\n }\n\n return !args.some(function (element) {\n return !(element && typeof element.getBoundingClientRect === 'function');\n });\n}\n\nfunction popperGenerator(generatorOptions) {\n if (generatorOptions === void 0) {\n generatorOptions = {};\n }\n\n var _generatorOptions = generatorOptions,\n _generatorOptions$def = _generatorOptions.defaultModifiers,\n defaultModifiers = _generatorOptions$def === void 0 ? [] : _generatorOptions$def,\n _generatorOptions$def2 = _generatorOptions.defaultOptions,\n defaultOptions = _generatorOptions$def2 === void 0 ? DEFAULT_OPTIONS : _generatorOptions$def2;\n return function createPopper(reference, popper, options) {\n if (options === void 0) {\n options = defaultOptions;\n }\n\n var state = {\n placement: 'bottom',\n orderedModifiers: [],\n options: Object.assign(Object.assign({}, DEFAULT_OPTIONS), defaultOptions),\n modifiersData: {},\n elements: {\n reference: reference,\n popper: popper\n },\n attributes: {},\n styles: {}\n };\n var effectCleanupFns = [];\n var isDestroyed = false;\n var instance = {\n state: state,\n setOptions: function setOptions(options) {\n cleanupModifierEffects();\n state.options = Object.assign(Object.assign(Object.assign({}, defaultOptions), state.options), options);\n state.scrollParents = {\n reference: isElement(reference) ? listScrollParents(reference) : reference.contextElement ? listScrollParents(reference.contextElement) : [],\n popper: listScrollParents(popper)\n }; // Orders the modifiers based on their dependencies and `phase`\n // properties\n\n var orderedModifiers = orderModifiers(mergeByName([].concat(defaultModifiers, state.options.modifiers))); // Strip out disabled modifiers\n\n state.orderedModifiers = orderedModifiers.filter(function (m) {\n return m.enabled;\n }); // Validate the provided modifiers so that the consumer will get warned\n // if one of the modifiers is invalid for any reason\n\n if (\"development\" !== \"production\") {\n var modifiers = uniqueBy([].concat(orderedModifiers, state.options.modifiers), function (_ref) {\n var name = _ref.name;\n return name;\n });\n validateModifiers(modifiers);\n\n if (getBasePlacement(state.options.placement) === auto) {\n var flipModifier = state.orderedModifiers.find(function (_ref2) {\n var name = _ref2.name;\n return name === 'flip';\n });\n\n if (!flipModifier) {\n console.error(['Popper: \"auto\" placements require the \"flip\" modifier be', 'present and enabled to work.'].join(' '));\n }\n }\n\n var _getComputedStyle = getComputedStyle(popper),\n marginTop = _getComputedStyle.marginTop,\n marginRight = _getComputedStyle.marginRight,\n marginBottom = _getComputedStyle.marginBottom,\n marginLeft = _getComputedStyle.marginLeft; // We no longer take into account `margins` on the popper, and it can\n // cause bugs with positioning, so we'll warn the consumer\n\n\n if ([marginTop, marginRight, marginBottom, marginLeft].some(function (margin) {\n return parseFloat(margin);\n })) {\n console.warn(['Popper: CSS \"margin\" styles cannot be used to apply padding', 'between the popper and its reference element or boundary.', 'To replicate margin, use the `offset` modifier, as well as', 'the `padding` option in the `preventOverflow` and `flip`', 'modifiers.'].join(' '));\n }\n }\n\n runModifierEffects();\n return instance.update();\n },\n // Sync update – it will always be executed, even if not necessary. This\n // is useful for low frequency updates where sync behavior simplifies the\n // logic.\n // For high frequency updates (e.g. `resize` and `scroll` events), always\n // prefer the async Popper#update method\n forceUpdate: function forceUpdate() {\n if (isDestroyed) {\n return;\n }\n\n var _state$elements = state.elements,\n reference = _state$elements.reference,\n popper = _state$elements.popper; // Don't proceed if `reference` or `popper` are not valid elements\n // anymore\n\n if (!areValidElements(reference, popper)) {\n if (\"development\" !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return;\n } // Store the reference and popper rects to be read by modifiers\n\n\n state.rects = {\n reference: getCompositeRect(reference, getOffsetParent(popper), state.options.strategy === 'fixed'),\n popper: getLayoutRect(popper)\n }; // Modifiers have the ability to reset the current update cycle. The\n // most common use case for this is the `flip` modifier changing the\n // placement, which then needs to re-run all the modifiers, because the\n // logic was previously ran for the previous placement and is therefore\n // stale/incorrect\n\n state.reset = false;\n state.placement = state.options.placement; // On each update cycle, the `modifiersData` property for each modifier\n // is filled with the initial data specified by the modifier. This means\n // it doesn't persist and is fresh on each update.\n // To ensure persistent data, use `${name}#persistent`\n\n state.orderedModifiers.forEach(function (modifier) {\n return state.modifiersData[modifier.name] = Object.assign({}, modifier.data);\n });\n var __debug_loops__ = 0;\n\n for (var index = 0; index < state.orderedModifiers.length; index++) {\n if (\"development\" !== \"production\") {\n __debug_loops__ += 1;\n\n if (__debug_loops__ > 100) {\n console.error(INFINITE_LOOP_ERROR);\n break;\n }\n }\n\n if (state.reset === true) {\n state.reset = false;\n index = -1;\n continue;\n }\n\n var _state$orderedModifie = state.orderedModifiers[index],\n fn = _state$orderedModifie.fn,\n _state$orderedModifie2 = _state$orderedModifie.options,\n _options = _state$orderedModifie2 === void 0 ? {} : _state$orderedModifie2,\n name = _state$orderedModifie.name;\n\n if (typeof fn === 'function') {\n state = fn({\n state: state,\n options: _options,\n name: name,\n instance: instance\n }) || state;\n }\n }\n },\n // Async and optimistically optimized update – it will not be executed if\n // not necessary (debounced to run at most once-per-tick)\n update: debounce(function () {\n return new Promise(function (resolve) {\n instance.forceUpdate();\n resolve(state);\n });\n }),\n destroy: function destroy() {\n cleanupModifierEffects();\n isDestroyed = true;\n }\n };\n\n if (!areValidElements(reference, popper)) {\n if (\"development\" !== \"production\") {\n console.error(INVALID_ELEMENT_ERROR);\n }\n\n return instance;\n }\n\n instance.setOptions(options).then(function (state) {\n if (!isDestroyed && options.onFirstUpdate) {\n options.onFirstUpdate(state);\n }\n }); // Modifiers have the ability to execute arbitrary code before the first\n // update cycle runs. They will be executed in the same order as the update\n // cycle. This is useful when a modifier adds some persistent data that\n // other modifiers need to use, but the modifier is run after the dependent\n // one.\n\n function runModifierEffects() {\n state.orderedModifiers.forEach(function (_ref3) {\n var name = _ref3.name,\n _ref3$options = _ref3.options,\n options = _ref3$options === void 0 ? {} : _ref3$options,\n effect = _ref3.effect;\n\n if (typeof effect === 'function') {\n var cleanupFn = effect({\n state: state,\n name: name,\n instance: instance,\n options: options\n });\n\n var noopFn = function noopFn() {};\n\n effectCleanupFns.push(cleanupFn || noopFn);\n }\n });\n }\n\n function cleanupModifierEffects() {\n effectCleanupFns.forEach(function (fn) {\n return fn();\n });\n effectCleanupFns = [];\n }\n\n return instance;\n };\n}\n\nvar passive = {\n passive: true\n};\n\nfunction effect(_ref) {\n var state = _ref.state,\n instance = _ref.instance,\n options = _ref.options;\n var _options$scroll = options.scroll,\n scroll = _options$scroll === void 0 ? true : _options$scroll,\n _options$resize = options.resize,\n resize = _options$resize === void 0 ? true : _options$resize;\n var window = getWindow(state.elements.popper);\n var scrollParents = [].concat(state.scrollParents.reference, state.scrollParents.popper);\n\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.addEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.addEventListener('resize', instance.update, passive);\n }\n\n return function () {\n if (scroll) {\n scrollParents.forEach(function (scrollParent) {\n scrollParent.removeEventListener('scroll', instance.update, passive);\n });\n }\n\n if (resize) {\n window.removeEventListener('resize', instance.update, passive);\n }\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar eventListeners = {\n name: 'eventListeners',\n enabled: true,\n phase: 'write',\n fn: function fn() {},\n effect: effect,\n data: {}\n};\n\nfunction popperOffsets(_ref) {\n var state = _ref.state,\n name = _ref.name;\n // Offsets are the actual position the popper needs to have to be\n // properly positioned near its reference element\n // This is the most basic placement, and will be adjusted by\n // the modifiers in the next step\n state.modifiersData[name] = computeOffsets({\n reference: state.rects.reference,\n element: state.rects.popper,\n strategy: 'absolute',\n placement: state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar popperOffsets$1 = {\n name: 'popperOffsets',\n enabled: true,\n phase: 'read',\n fn: popperOffsets,\n data: {}\n};\n\nvar unsetSides = {\n top: 'auto',\n right: 'auto',\n bottom: 'auto',\n left: 'auto'\n}; // Round the offsets to the nearest suitable subpixel based on the DPR.\n// Zooming can change the DPR, but it seems to report a value that will\n// cleanly divide the values into the appropriate subpixels.\n\nfunction roundOffsets(_ref) {\n var x = _ref.x,\n y = _ref.y;\n var win = window;\n var dpr = win.devicePixelRatio || 1;\n return {\n x: Math.round(x * dpr) / dpr || 0,\n y: Math.round(y * dpr) / dpr || 0\n };\n}\n\nfunction mapToStyles(_ref2) {\n var _Object$assign2;\n\n var popper = _ref2.popper,\n popperRect = _ref2.popperRect,\n placement = _ref2.placement,\n offsets = _ref2.offsets,\n position = _ref2.position,\n gpuAcceleration = _ref2.gpuAcceleration,\n adaptive = _ref2.adaptive;\n\n var _roundOffsets = roundOffsets(offsets),\n x = _roundOffsets.x,\n y = _roundOffsets.y;\n\n var hasX = offsets.hasOwnProperty('x');\n var hasY = offsets.hasOwnProperty('y');\n var sideX = left;\n var sideY = top;\n var win = window;\n\n if (adaptive) {\n var offsetParent = getOffsetParent(popper);\n\n if (offsetParent === getWindow(popper)) {\n offsetParent = getDocumentElement(popper);\n } // $FlowFixMe: force type refinement, we compare offsetParent with window above, but Flow doesn't detect it\n\n /*:: offsetParent = (offsetParent: Element); */\n\n\n if (placement === top) {\n sideY = bottom;\n y -= offsetParent.clientHeight - popperRect.height;\n y *= gpuAcceleration ? 1 : -1;\n }\n\n if (placement === left) {\n sideX = right;\n x -= offsetParent.clientWidth - popperRect.width;\n x *= gpuAcceleration ? 1 : -1;\n }\n }\n\n var commonStyles = Object.assign({\n position: position\n }, adaptive && unsetSides);\n\n if (gpuAcceleration) {\n var _Object$assign;\n\n return Object.assign(Object.assign({}, commonStyles), {}, (_Object$assign = {}, _Object$assign[sideY] = hasY ? '0' : '', _Object$assign[sideX] = hasX ? '0' : '', _Object$assign.transform = (win.devicePixelRatio || 1) < 2 ? \"translate(\" + x + \"px, \" + y + \"px)\" : \"translate3d(\" + x + \"px, \" + y + \"px, 0)\", _Object$assign));\n }\n\n return Object.assign(Object.assign({}, commonStyles), {}, (_Object$assign2 = {}, _Object$assign2[sideY] = hasY ? y + \"px\" : '', _Object$assign2[sideX] = hasX ? x + \"px\" : '', _Object$assign2.transform = '', _Object$assign2));\n}\n\nfunction computeStyles(_ref3) {\n var state = _ref3.state,\n options = _ref3.options;\n var _options$gpuAccelerat = options.gpuAcceleration,\n gpuAcceleration = _options$gpuAccelerat === void 0 ? true : _options$gpuAccelerat,\n _options$adaptive = options.adaptive,\n adaptive = _options$adaptive === void 0 ? true : _options$adaptive;\n\n if (\"development\" !== \"production\") {\n var transitionProperty = getComputedStyle(state.elements.popper).transitionProperty || '';\n\n if (adaptive && ['transform', 'top', 'right', 'bottom', 'left'].some(function (property) {\n return transitionProperty.indexOf(property) >= 0;\n })) {\n console.warn(['Popper: Detected CSS transitions on at least one of the following', 'CSS properties: \"transform\", \"top\", \"right\", \"bottom\", \"left\".', '\\n\\n', 'Disable the \"computeStyles\" modifier\\'s `adaptive` option to allow', 'for smooth transitions, or remove these properties from the CSS', 'transition declaration on the popper element if only transitioning', 'opacity or background-color for example.', '\\n\\n', 'We recommend using the popper element as a wrapper around an inner', 'element that can have any CSS property transitioned for animations.'].join(' '));\n }\n }\n\n var commonStyles = {\n placement: getBasePlacement(state.placement),\n popper: state.elements.popper,\n popperRect: state.rects.popper,\n gpuAcceleration: gpuAcceleration\n };\n\n if (state.modifiersData.popperOffsets != null) {\n state.styles.popper = Object.assign(Object.assign({}, state.styles.popper), mapToStyles(Object.assign(Object.assign({}, commonStyles), {}, {\n offsets: state.modifiersData.popperOffsets,\n position: state.options.strategy,\n adaptive: adaptive\n })));\n }\n\n if (state.modifiersData.arrow != null) {\n state.styles.arrow = Object.assign(Object.assign({}, state.styles.arrow), mapToStyles(Object.assign(Object.assign({}, commonStyles), {}, {\n offsets: state.modifiersData.arrow,\n position: 'absolute',\n adaptive: false\n })));\n }\n\n state.attributes.popper = Object.assign(Object.assign({}, state.attributes.popper), {}, {\n 'data-popper-placement': state.placement\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar computeStyles$1 = {\n name: 'computeStyles',\n enabled: true,\n phase: 'beforeWrite',\n fn: computeStyles,\n data: {}\n};\n\n// and applies them to the HTMLElements such as popper and arrow\n\nfunction applyStyles(_ref) {\n var state = _ref.state;\n Object.keys(state.elements).forEach(function (name) {\n var style = state.styles[name] || {};\n var attributes = state.attributes[name] || {};\n var element = state.elements[name]; // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (name) {\n var value = attributes[name];\n\n if (value === false) {\n element.removeAttribute(name);\n } else {\n element.setAttribute(name, value === true ? '' : value);\n }\n });\n });\n}\n\nfunction effect$1(_ref2) {\n var state = _ref2.state;\n var initialStyles = {\n popper: {\n position: state.options.strategy,\n left: '0',\n top: '0',\n margin: '0'\n },\n arrow: {\n position: 'absolute'\n },\n reference: {}\n };\n Object.assign(state.elements.popper.style, initialStyles.popper);\n\n if (state.elements.arrow) {\n Object.assign(state.elements.arrow.style, initialStyles.arrow);\n }\n\n return function () {\n Object.keys(state.elements).forEach(function (name) {\n var element = state.elements[name];\n var attributes = state.attributes[name] || {};\n var styleProperties = Object.keys(state.styles.hasOwnProperty(name) ? state.styles[name] : initialStyles[name]); // Set all values to an empty string to unset them\n\n var style = styleProperties.reduce(function (style, property) {\n style[property] = '';\n return style;\n }, {}); // arrow is optional + virtual elements\n\n if (!isHTMLElement(element) || !getNodeName(element)) {\n return;\n } // Flow doesn't support to extend this property, but it's the most\n // effective way to apply styles to an HTMLElement\n // $FlowFixMe\n\n\n Object.assign(element.style, style);\n Object.keys(attributes).forEach(function (attribute) {\n element.removeAttribute(attribute);\n });\n });\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar applyStyles$1 = {\n name: 'applyStyles',\n enabled: true,\n phase: 'write',\n fn: applyStyles,\n effect: effect$1,\n requires: ['computeStyles']\n};\n\nfunction distanceAndSkiddingToXY(placement, rects, offset) {\n var basePlacement = getBasePlacement(placement);\n var invertDistance = [left, top].indexOf(basePlacement) >= 0 ? -1 : 1;\n\n var _ref = typeof offset === 'function' ? offset(Object.assign(Object.assign({}, rects), {}, {\n placement: placement\n })) : offset,\n skidding = _ref[0],\n distance = _ref[1];\n\n skidding = skidding || 0;\n distance = (distance || 0) * invertDistance;\n return [left, right].indexOf(basePlacement) >= 0 ? {\n x: distance,\n y: skidding\n } : {\n x: skidding,\n y: distance\n };\n}\n\nfunction offset(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$offset = options.offset,\n offset = _options$offset === void 0 ? [0, 0] : _options$offset;\n var data = placements.reduce(function (acc, placement) {\n acc[placement] = distanceAndSkiddingToXY(placement, state.rects, offset);\n return acc;\n }, {});\n var _data$state$placement = data[state.placement],\n x = _data$state$placement.x,\n y = _data$state$placement.y;\n\n if (state.modifiersData.popperOffsets != null) {\n state.modifiersData.popperOffsets.x += x;\n state.modifiersData.popperOffsets.y += y;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar offset$1 = {\n name: 'offset',\n enabled: true,\n phase: 'main',\n requires: ['popperOffsets'],\n fn: offset\n};\n\nvar hash = {\n left: 'right',\n right: 'left',\n bottom: 'top',\n top: 'bottom'\n};\nfunction getOppositePlacement(placement) {\n return placement.replace(/left|right|bottom|top/g, function (matched) {\n return hash[matched];\n });\n}\n\nvar hash$1 = {\n start: 'end',\n end: 'start'\n};\nfunction getOppositeVariationPlacement(placement) {\n return placement.replace(/start|end/g, function (matched) {\n return hash$1[matched];\n });\n}\n\n/*:: type OverflowsMap = { [ComputedPlacement]: number }; */\n\n/*;; type OverflowsMap = { [key in ComputedPlacement]: number }; */\nfunction computeAutoPlacement(state, options) {\n if (options === void 0) {\n options = {};\n }\n\n var _options = options,\n placement = _options.placement,\n boundary = _options.boundary,\n rootBoundary = _options.rootBoundary,\n padding = _options.padding,\n flipVariations = _options.flipVariations,\n _options$allowedAutoP = _options.allowedAutoPlacements,\n allowedAutoPlacements = _options$allowedAutoP === void 0 ? placements : _options$allowedAutoP;\n var variation = getVariation(placement);\n var placements$1 = variation ? flipVariations ? variationPlacements : variationPlacements.filter(function (placement) {\n return getVariation(placement) === variation;\n }) : basePlacements; // $FlowFixMe\n\n var allowedPlacements = placements$1.filter(function (placement) {\n return allowedAutoPlacements.indexOf(placement) >= 0;\n });\n\n if (allowedPlacements.length === 0) {\n allowedPlacements = placements$1;\n\n if (\"development\" !== \"production\") {\n console.error(['Popper: The `allowedAutoPlacements` option did not allow any', 'placements. Ensure the `placement` option matches the variation', 'of the allowed placements.', 'For example, \"auto\" cannot be used to allow \"bottom-start\".', 'Use \"auto-start\" instead.'].join(' '));\n }\n } // $FlowFixMe: Flow seems to have problems with two array unions...\n\n\n var overflows = allowedPlacements.reduce(function (acc, placement) {\n acc[placement] = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding\n })[getBasePlacement(placement)];\n return acc;\n }, {});\n return Object.keys(overflows).sort(function (a, b) {\n return overflows[a] - overflows[b];\n });\n}\n\nfunction getExpandedFallbackPlacements(placement) {\n if (getBasePlacement(placement) === auto) {\n return [];\n }\n\n var oppositePlacement = getOppositePlacement(placement);\n return [getOppositeVariationPlacement(placement), oppositePlacement, getOppositeVariationPlacement(oppositePlacement)];\n}\n\nfunction flip(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n\n if (state.modifiersData[name]._skip) {\n return;\n }\n\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? true : _options$altAxis,\n specifiedFallbackPlacements = options.fallbackPlacements,\n padding = options.padding,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n _options$flipVariatio = options.flipVariations,\n flipVariations = _options$flipVariatio === void 0 ? true : _options$flipVariatio,\n allowedAutoPlacements = options.allowedAutoPlacements;\n var preferredPlacement = state.options.placement;\n var basePlacement = getBasePlacement(preferredPlacement);\n var isBasePlacement = basePlacement === preferredPlacement;\n var fallbackPlacements = specifiedFallbackPlacements || (isBasePlacement || !flipVariations ? [getOppositePlacement(preferredPlacement)] : getExpandedFallbackPlacements(preferredPlacement));\n var placements = [preferredPlacement].concat(fallbackPlacements).reduce(function (acc, placement) {\n return acc.concat(getBasePlacement(placement) === auto ? computeAutoPlacement(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n flipVariations: flipVariations,\n allowedAutoPlacements: allowedAutoPlacements\n }) : placement);\n }, []);\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var checksMap = new Map();\n var makeFallbackChecks = true;\n var firstFittingPlacement = placements[0];\n\n for (var i = 0; i < placements.length; i++) {\n var placement = placements[i];\n\n var _basePlacement = getBasePlacement(placement);\n\n var isStartVariation = getVariation(placement) === start;\n var isVertical = [top, bottom].indexOf(_basePlacement) >= 0;\n var len = isVertical ? 'width' : 'height';\n var overflow = detectOverflow(state, {\n placement: placement,\n boundary: boundary,\n rootBoundary: rootBoundary,\n altBoundary: altBoundary,\n padding: padding\n });\n var mainVariationSide = isVertical ? isStartVariation ? right : left : isStartVariation ? bottom : top;\n\n if (referenceRect[len] > popperRect[len]) {\n mainVariationSide = getOppositePlacement(mainVariationSide);\n }\n\n var altVariationSide = getOppositePlacement(mainVariationSide);\n var checks = [];\n\n if (checkMainAxis) {\n checks.push(overflow[_basePlacement] <= 0);\n }\n\n if (checkAltAxis) {\n checks.push(overflow[mainVariationSide] <= 0, overflow[altVariationSide] <= 0);\n }\n\n if (checks.every(function (check) {\n return check;\n })) {\n firstFittingPlacement = placement;\n makeFallbackChecks = false;\n break;\n }\n\n checksMap.set(placement, checks);\n }\n\n if (makeFallbackChecks) {\n // `2` may be desired in some cases – research later\n var numberOfChecks = flipVariations ? 3 : 1;\n\n var _loop = function _loop(_i) {\n var fittingPlacement = placements.find(function (placement) {\n var checks = checksMap.get(placement);\n\n if (checks) {\n return checks.slice(0, _i).every(function (check) {\n return check;\n });\n }\n });\n\n if (fittingPlacement) {\n firstFittingPlacement = fittingPlacement;\n return \"break\";\n }\n };\n\n for (var _i = numberOfChecks; _i > 0; _i--) {\n var _ret = _loop(_i);\n\n if (_ret === \"break\") break;\n }\n }\n\n if (state.placement !== firstFittingPlacement) {\n state.modifiersData[name]._skip = true;\n state.placement = firstFittingPlacement;\n state.reset = true;\n }\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar flip$1 = {\n name: 'flip',\n enabled: true,\n phase: 'main',\n fn: flip,\n requiresIfExists: ['offset'],\n data: {\n _skip: false\n }\n};\n\nfunction getAltAxis(axis) {\n return axis === 'x' ? 'y' : 'x';\n}\n\nfunction within(min, value, max) {\n return Math.max(min, Math.min(value, max));\n}\n\nfunction preventOverflow(_ref) {\n var state = _ref.state,\n options = _ref.options,\n name = _ref.name;\n var _options$mainAxis = options.mainAxis,\n checkMainAxis = _options$mainAxis === void 0 ? true : _options$mainAxis,\n _options$altAxis = options.altAxis,\n checkAltAxis = _options$altAxis === void 0 ? false : _options$altAxis,\n boundary = options.boundary,\n rootBoundary = options.rootBoundary,\n altBoundary = options.altBoundary,\n padding = options.padding,\n _options$tether = options.tether,\n tether = _options$tether === void 0 ? true : _options$tether,\n _options$tetherOffset = options.tetherOffset,\n tetherOffset = _options$tetherOffset === void 0 ? 0 : _options$tetherOffset;\n var overflow = detectOverflow(state, {\n boundary: boundary,\n rootBoundary: rootBoundary,\n padding: padding,\n altBoundary: altBoundary\n });\n var basePlacement = getBasePlacement(state.placement);\n var variation = getVariation(state.placement);\n var isBasePlacement = !variation;\n var mainAxis = getMainAxisFromPlacement(basePlacement);\n var altAxis = getAltAxis(mainAxis);\n var popperOffsets = state.modifiersData.popperOffsets;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var tetherOffsetValue = typeof tetherOffset === 'function' ? tetherOffset(Object.assign(Object.assign({}, state.rects), {}, {\n placement: state.placement\n })) : tetherOffset;\n var data = {\n x: 0,\n y: 0\n };\n\n if (!popperOffsets) {\n return;\n }\n\n if (checkMainAxis) {\n var mainSide = mainAxis === 'y' ? top : left;\n var altSide = mainAxis === 'y' ? bottom : right;\n var len = mainAxis === 'y' ? 'height' : 'width';\n var offset = popperOffsets[mainAxis];\n var min = popperOffsets[mainAxis] + overflow[mainSide];\n var max = popperOffsets[mainAxis] - overflow[altSide];\n var additive = tether ? -popperRect[len] / 2 : 0;\n var minLen = variation === start ? referenceRect[len] : popperRect[len];\n var maxLen = variation === start ? -popperRect[len] : -referenceRect[len]; // We need to include the arrow in the calculation so the arrow doesn't go\n // outside the reference bounds\n\n var arrowElement = state.elements.arrow;\n var arrowRect = tether && arrowElement ? getLayoutRect(arrowElement) : {\n width: 0,\n height: 0\n };\n var arrowPaddingObject = state.modifiersData['arrow#persistent'] ? state.modifiersData['arrow#persistent'].padding : getFreshSideObject();\n var arrowPaddingMin = arrowPaddingObject[mainSide];\n var arrowPaddingMax = arrowPaddingObject[altSide]; // If the reference length is smaller than the arrow length, we don't want\n // to include its full size in the calculation. If the reference is small\n // and near the edge of a boundary, the popper can overflow even if the\n // reference is not overflowing as well (e.g. virtual elements with no\n // width or height)\n\n var arrowLen = within(0, referenceRect[len], arrowRect[len]);\n var minOffset = isBasePlacement ? referenceRect[len] / 2 - additive - arrowLen - arrowPaddingMin - tetherOffsetValue : minLen - arrowLen - arrowPaddingMin - tetherOffsetValue;\n var maxOffset = isBasePlacement ? -referenceRect[len] / 2 + additive + arrowLen + arrowPaddingMax + tetherOffsetValue : maxLen + arrowLen + arrowPaddingMax + tetherOffsetValue;\n var arrowOffsetParent = state.elements.arrow && getOffsetParent(state.elements.arrow);\n var clientOffset = arrowOffsetParent ? mainAxis === 'y' ? arrowOffsetParent.clientTop || 0 : arrowOffsetParent.clientLeft || 0 : 0;\n var offsetModifierValue = state.modifiersData.offset ? state.modifiersData.offset[state.placement][mainAxis] : 0;\n var tetherMin = popperOffsets[mainAxis] + minOffset - offsetModifierValue - clientOffset;\n var tetherMax = popperOffsets[mainAxis] + maxOffset - offsetModifierValue;\n var preventedOffset = within(tether ? Math.min(min, tetherMin) : min, offset, tether ? Math.max(max, tetherMax) : max);\n popperOffsets[mainAxis] = preventedOffset;\n data[mainAxis] = preventedOffset - offset;\n }\n\n if (checkAltAxis) {\n var _mainSide = mainAxis === 'x' ? top : left;\n\n var _altSide = mainAxis === 'x' ? bottom : right;\n\n var _offset = popperOffsets[altAxis];\n\n var _min = _offset + overflow[_mainSide];\n\n var _max = _offset - overflow[_altSide];\n\n var _preventedOffset = within(_min, _offset, _max);\n\n popperOffsets[altAxis] = _preventedOffset;\n data[altAxis] = _preventedOffset - _offset;\n }\n\n state.modifiersData[name] = data;\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar preventOverflow$1 = {\n name: 'preventOverflow',\n enabled: true,\n phase: 'main',\n fn: preventOverflow,\n requiresIfExists: ['offset']\n};\n\nfunction arrow(_ref) {\n var _state$modifiersData$;\n\n var state = _ref.state,\n name = _ref.name;\n var arrowElement = state.elements.arrow;\n var popperOffsets = state.modifiersData.popperOffsets;\n var basePlacement = getBasePlacement(state.placement);\n var axis = getMainAxisFromPlacement(basePlacement);\n var isVertical = [left, right].indexOf(basePlacement) >= 0;\n var len = isVertical ? 'height' : 'width';\n\n if (!arrowElement || !popperOffsets) {\n return;\n }\n\n var paddingObject = state.modifiersData[name + \"#persistent\"].padding;\n var arrowRect = getLayoutRect(arrowElement);\n var minProp = axis === 'y' ? top : left;\n var maxProp = axis === 'y' ? bottom : right;\n var endDiff = state.rects.reference[len] + state.rects.reference[axis] - popperOffsets[axis] - state.rects.popper[len];\n var startDiff = popperOffsets[axis] - state.rects.reference[axis];\n var arrowOffsetParent = getOffsetParent(arrowElement);\n var clientSize = arrowOffsetParent ? axis === 'y' ? arrowOffsetParent.clientHeight || 0 : arrowOffsetParent.clientWidth || 0 : 0;\n var centerToReference = endDiff / 2 - startDiff / 2; // Make sure the arrow doesn't overflow the popper if the center point is\n // outside of the popper bounds\n\n var min = paddingObject[minProp];\n var max = clientSize - arrowRect[len] - paddingObject[maxProp];\n var center = clientSize / 2 - arrowRect[len] / 2 + centerToReference;\n var offset = within(min, center, max); // Prevents breaking syntax highlighting...\n\n var axisProp = axis;\n state.modifiersData[name] = (_state$modifiersData$ = {}, _state$modifiersData$[axisProp] = offset, _state$modifiersData$.centerOffset = offset - center, _state$modifiersData$);\n}\n\nfunction effect$2(_ref2) {\n var state = _ref2.state,\n options = _ref2.options,\n name = _ref2.name;\n var _options$element = options.element,\n arrowElement = _options$element === void 0 ? '[data-popper-arrow]' : _options$element,\n _options$padding = options.padding,\n padding = _options$padding === void 0 ? 0 : _options$padding;\n\n if (arrowElement == null) {\n return;\n } // CSS selector\n\n\n if (typeof arrowElement === 'string') {\n arrowElement = state.elements.popper.querySelector(arrowElement);\n\n if (!arrowElement) {\n return;\n }\n }\n\n if (\"development\" !== \"production\") {\n if (!isHTMLElement(arrowElement)) {\n console.error(['Popper: \"arrow\" element must be an HTMLElement (not an SVGElement).', 'To use an SVG arrow, wrap it in an HTMLElement that will be used as', 'the arrow.'].join(' '));\n }\n }\n\n if (!contains(state.elements.popper, arrowElement)) {\n if (\"development\" !== \"production\") {\n console.error(['Popper: \"arrow\" modifier\\'s `element` must be a child of the popper', 'element.'].join(' '));\n }\n\n return;\n }\n\n state.elements.arrow = arrowElement;\n state.modifiersData[name + \"#persistent\"] = {\n padding: mergePaddingObject(typeof padding !== 'number' ? padding : expandToHashMap(padding, basePlacements))\n };\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar arrow$1 = {\n name: 'arrow',\n enabled: true,\n phase: 'main',\n fn: arrow,\n effect: effect$2,\n requires: ['popperOffsets'],\n requiresIfExists: ['preventOverflow']\n};\n\nfunction getSideOffsets(overflow, rect, preventedOffsets) {\n if (preventedOffsets === void 0) {\n preventedOffsets = {\n x: 0,\n y: 0\n };\n }\n\n return {\n top: overflow.top - rect.height - preventedOffsets.y,\n right: overflow.right - rect.width + preventedOffsets.x,\n bottom: overflow.bottom - rect.height + preventedOffsets.y,\n left: overflow.left - rect.width - preventedOffsets.x\n };\n}\n\nfunction isAnySideFullyClipped(overflow) {\n return [top, right, bottom, left].some(function (side) {\n return overflow[side] >= 0;\n });\n}\n\nfunction hide(_ref) {\n var state = _ref.state,\n name = _ref.name;\n var referenceRect = state.rects.reference;\n var popperRect = state.rects.popper;\n var preventedOffsets = state.modifiersData.preventOverflow;\n var referenceOverflow = detectOverflow(state, {\n elementContext: 'reference'\n });\n var popperAltOverflow = detectOverflow(state, {\n altBoundary: true\n });\n var referenceClippingOffsets = getSideOffsets(referenceOverflow, referenceRect);\n var popperEscapeOffsets = getSideOffsets(popperAltOverflow, popperRect, preventedOffsets);\n var isReferenceHidden = isAnySideFullyClipped(referenceClippingOffsets);\n var hasPopperEscaped = isAnySideFullyClipped(popperEscapeOffsets);\n state.modifiersData[name] = {\n referenceClippingOffsets: referenceClippingOffsets,\n popperEscapeOffsets: popperEscapeOffsets,\n isReferenceHidden: isReferenceHidden,\n hasPopperEscaped: hasPopperEscaped\n };\n state.attributes.popper = Object.assign(Object.assign({}, state.attributes.popper), {}, {\n 'data-popper-reference-hidden': isReferenceHidden,\n 'data-popper-escaped': hasPopperEscaped\n });\n} // eslint-disable-next-line import/no-unused-modules\n\n\nvar hide$1 = {\n name: 'hide',\n enabled: true,\n phase: 'main',\n requiresIfExists: ['preventOverflow'],\n fn: hide\n};\n\nvar defaultModifiers = [eventListeners, popperOffsets$1, computeStyles$1, applyStyles$1, offset$1, flip$1, preventOverflow$1, arrow$1, hide$1];\nvar createPopper = /*#__PURE__*/popperGenerator({\n defaultModifiers: defaultModifiers\n}); // eslint-disable-next-line import/no-unused-modules\n\nexports.createPopper = createPopper;\nexports.defaultModifiers = defaultModifiers;\nexports.detectOverflow = detectOverflow;\nexports.popperGenerator = popperGenerator;\n//# sourceMappingURL=popper.js.map\n","module.exports = require('./lib/axios');","'use strict';\n\nvar utils = require('./../utils');\nvar settle = require('./../core/settle');\nvar buildURL = require('./../helpers/buildURL');\nvar buildFullPath = require('../core/buildFullPath');\nvar parseHeaders = require('./../helpers/parseHeaders');\nvar isURLSameOrigin = require('./../helpers/isURLSameOrigin');\nvar createError = require('../core/createError');\n\nmodule.exports = function xhrAdapter(config) {\n return new Promise(function dispatchXhrRequest(resolve, reject) {\n var requestData = config.data;\n var requestHeaders = config.headers;\n\n if (utils.isFormData(requestData)) {\n delete requestHeaders['Content-Type']; // Let the browser set it\n }\n\n var request = new XMLHttpRequest();\n\n // HTTP basic authentication\n if (config.auth) {\n var username = config.auth.username || '';\n var password = config.auth.password || '';\n requestHeaders.Authorization = 'Basic ' + btoa(username + ':' + password);\n }\n\n var fullPath = buildFullPath(config.baseURL, config.url);\n request.open(config.method.toUpperCase(), buildURL(fullPath, config.params, config.paramsSerializer), true);\n\n // Set the request timeout in MS\n request.timeout = config.timeout;\n\n // Listen for ready state\n request.onreadystatechange = function handleLoad() {\n if (!request || request.readyState !== 4) {\n return;\n }\n\n // The request errored out and we didn't get a response, this will be\n // handled by onerror instead\n // With one exception: request that using file: protocol, most browsers\n // will return status as 0 even though it's a successful request\n if (request.status === 0 && !(request.responseURL && request.responseURL.indexOf('file:') === 0)) {\n return;\n }\n\n // Prepare the response\n var responseHeaders = 'getAllResponseHeaders' in request ? parseHeaders(request.getAllResponseHeaders()) : null;\n var responseData = !config.responseType || config.responseType === 'text' ? request.responseText : request.response;\n var response = {\n data: responseData,\n status: request.status,\n statusText: request.statusText,\n headers: responseHeaders,\n config: config,\n request: request\n };\n\n settle(resolve, reject, response);\n\n // Clean up request\n request = null;\n };\n\n // Handle browser request cancellation (as opposed to a manual cancellation)\n request.onabort = function handleAbort() {\n if (!request) {\n return;\n }\n\n reject(createError('Request aborted', config, 'ECONNABORTED', request));\n\n // Clean up request\n request = null;\n };\n\n // Handle low level network errors\n request.onerror = function handleError() {\n // Real errors are hidden from us by the browser\n // onerror should only fire if it's a network error\n reject(createError('Network Error', config, null, request));\n\n // Clean up request\n request = null;\n };\n\n // Handle timeout\n request.ontimeout = function handleTimeout() {\n var timeoutErrorMessage = 'timeout of ' + config.timeout + 'ms exceeded';\n if (config.timeoutErrorMessage) {\n timeoutErrorMessage = config.timeoutErrorMessage;\n }\n reject(createError(timeoutErrorMessage, config, 'ECONNABORTED',\n request));\n\n // Clean up request\n request = null;\n };\n\n // Add xsrf header\n // This is only done if running in a standard browser environment.\n // Specifically not if we're in a web worker, or react-native.\n if (utils.isStandardBrowserEnv()) {\n var cookies = require('./../helpers/cookies');\n\n // Add xsrf header\n var xsrfValue = (config.withCredentials || isURLSameOrigin(fullPath)) && config.xsrfCookieName ?\n cookies.read(config.xsrfCookieName) :\n undefined;\n\n if (xsrfValue) {\n requestHeaders[config.xsrfHeaderName] = xsrfValue;\n }\n }\n\n // Add headers to the request\n if ('setRequestHeader' in request) {\n utils.forEach(requestHeaders, function setRequestHeader(val, key) {\n if (typeof requestData === 'undefined' && key.toLowerCase() === 'content-type') {\n // Remove Content-Type if data is undefined\n delete requestHeaders[key];\n } else {\n // Otherwise add header to the request\n request.setRequestHeader(key, val);\n }\n });\n }\n\n // Add withCredentials to request if needed\n if (!utils.isUndefined(config.withCredentials)) {\n request.withCredentials = !!config.withCredentials;\n }\n\n // Add responseType to request if needed\n if (config.responseType) {\n try {\n request.responseType = config.responseType;\n } catch (e) {\n // Expected DOMException thrown by browsers not compatible XMLHttpRequest Level 2.\n // But, this can be suppressed for 'json' type as it can be parsed by default 'transformResponse' function.\n if (config.responseType !== 'json') {\n throw e;\n }\n }\n }\n\n // Handle progress if needed\n if (typeof config.onDownloadProgress === 'function') {\n request.addEventListener('progress', config.onDownloadProgress);\n }\n\n // Not all browsers support upload events\n if (typeof config.onUploadProgress === 'function' && request.upload) {\n request.upload.addEventListener('progress', config.onUploadProgress);\n }\n\n if (config.cancelToken) {\n // Handle cancellation\n config.cancelToken.promise.then(function onCanceled(cancel) {\n if (!request) {\n return;\n }\n\n request.abort();\n reject(cancel);\n // Clean up request\n request = null;\n });\n }\n\n if (requestData === undefined) {\n requestData = null;\n }\n\n // Send the request\n request.send(requestData);\n });\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar bind = require('./helpers/bind');\nvar Axios = require('./core/Axios');\nvar mergeConfig = require('./core/mergeConfig');\nvar defaults = require('./defaults');\n\n/**\n * Create an instance of Axios\n *\n * @param {Object} defaultConfig The default config for the instance\n * @return {Axios} A new instance of Axios\n */\nfunction createInstance(defaultConfig) {\n var context = new Axios(defaultConfig);\n var instance = bind(Axios.prototype.request, context);\n\n // Copy axios.prototype to instance\n utils.extend(instance, Axios.prototype, context);\n\n // Copy context to instance\n utils.extend(instance, context);\n\n return instance;\n}\n\n// Create the default instance to be exported\nvar axios = createInstance(defaults);\n\n// Expose Axios class to allow class inheritance\naxios.Axios = Axios;\n\n// Factory for creating new instances\naxios.create = function create(instanceConfig) {\n return createInstance(mergeConfig(axios.defaults, instanceConfig));\n};\n\n// Expose Cancel & CancelToken\naxios.Cancel = require('./cancel/Cancel');\naxios.CancelToken = require('./cancel/CancelToken');\naxios.isCancel = require('./cancel/isCancel');\n\n// Expose all/spread\naxios.all = function all(promises) {\n return Promise.all(promises);\n};\naxios.spread = require('./helpers/spread');\n\nmodule.exports = axios;\n\n// Allow use of default import syntax in TypeScript\nmodule.exports.default = axios;\n","'use strict';\n\n/**\n * A `Cancel` is an object that is thrown when an operation is canceled.\n *\n * @class\n * @param {string=} message The message.\n */\nfunction Cancel(message) {\n this.message = message;\n}\n\nCancel.prototype.toString = function toString() {\n return 'Cancel' + (this.message ? ': ' + this.message : '');\n};\n\nCancel.prototype.__CANCEL__ = true;\n\nmodule.exports = Cancel;\n","'use strict';\n\nvar Cancel = require('./Cancel');\n\n/**\n * A `CancelToken` is an object that can be used to request cancellation of an operation.\n *\n * @class\n * @param {Function} executor The executor function.\n */\nfunction CancelToken(executor) {\n if (typeof executor !== 'function') {\n throw new TypeError('executor must be a function.');\n }\n\n var resolvePromise;\n this.promise = new Promise(function promiseExecutor(resolve) {\n resolvePromise = resolve;\n });\n\n var token = this;\n executor(function cancel(message) {\n if (token.reason) {\n // Cancellation has already been requested\n return;\n }\n\n token.reason = new Cancel(message);\n resolvePromise(token.reason);\n });\n}\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nCancelToken.prototype.throwIfRequested = function throwIfRequested() {\n if (this.reason) {\n throw this.reason;\n }\n};\n\n/**\n * Returns an object that contains a new `CancelToken` and a function that, when called,\n * cancels the `CancelToken`.\n */\nCancelToken.source = function source() {\n var cancel;\n var token = new CancelToken(function executor(c) {\n cancel = c;\n });\n return {\n token: token,\n cancel: cancel\n };\n};\n\nmodule.exports = CancelToken;\n","'use strict';\n\nmodule.exports = function isCancel(value) {\n return !!(value && value.__CANCEL__);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar buildURL = require('../helpers/buildURL');\nvar InterceptorManager = require('./InterceptorManager');\nvar dispatchRequest = require('./dispatchRequest');\nvar mergeConfig = require('./mergeConfig');\n\n/**\n * Create a new instance of Axios\n *\n * @param {Object} instanceConfig The default config for the instance\n */\nfunction Axios(instanceConfig) {\n this.defaults = instanceConfig;\n this.interceptors = {\n request: new InterceptorManager(),\n response: new InterceptorManager()\n };\n}\n\n/**\n * Dispatch a request\n *\n * @param {Object} config The config specific for this request (merged with this.defaults)\n */\nAxios.prototype.request = function request(config) {\n /*eslint no-param-reassign:0*/\n // Allow for axios('example/url'[, config]) a la fetch API\n if (typeof config === 'string') {\n config = arguments[1] || {};\n config.url = arguments[0];\n } else {\n config = config || {};\n }\n\n config = mergeConfig(this.defaults, config);\n\n // Set config.method\n if (config.method) {\n config.method = config.method.toLowerCase();\n } else if (this.defaults.method) {\n config.method = this.defaults.method.toLowerCase();\n } else {\n config.method = 'get';\n }\n\n // Hook up interceptors middleware\n var chain = [dispatchRequest, undefined];\n var promise = Promise.resolve(config);\n\n this.interceptors.request.forEach(function unshiftRequestInterceptors(interceptor) {\n chain.unshift(interceptor.fulfilled, interceptor.rejected);\n });\n\n this.interceptors.response.forEach(function pushResponseInterceptors(interceptor) {\n chain.push(interceptor.fulfilled, interceptor.rejected);\n });\n\n while (chain.length) {\n promise = promise.then(chain.shift(), chain.shift());\n }\n\n return promise;\n};\n\nAxios.prototype.getUri = function getUri(config) {\n config = mergeConfig(this.defaults, config);\n return buildURL(config.url, config.params, config.paramsSerializer).replace(/^\\?/, '');\n};\n\n// Provide aliases for supported request methods\nutils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url\n }));\n };\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n /*eslint func-names:0*/\n Axios.prototype[method] = function(url, data, config) {\n return this.request(utils.merge(config || {}, {\n method: method,\n url: url,\n data: data\n }));\n };\n});\n\nmodule.exports = Axios;\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction InterceptorManager() {\n this.handlers = [];\n}\n\n/**\n * Add a new interceptor to the stack\n *\n * @param {Function} fulfilled The function to handle `then` for a `Promise`\n * @param {Function} rejected The function to handle `reject` for a `Promise`\n *\n * @return {Number} An ID used to remove interceptor later\n */\nInterceptorManager.prototype.use = function use(fulfilled, rejected) {\n this.handlers.push({\n fulfilled: fulfilled,\n rejected: rejected\n });\n return this.handlers.length - 1;\n};\n\n/**\n * Remove an interceptor from the stack\n *\n * @param {Number} id The ID that was returned by `use`\n */\nInterceptorManager.prototype.eject = function eject(id) {\n if (this.handlers[id]) {\n this.handlers[id] = null;\n }\n};\n\n/**\n * Iterate over all the registered interceptors\n *\n * This method is particularly useful for skipping over any\n * interceptors that may have become `null` calling `eject`.\n *\n * @param {Function} fn The function to call for each interceptor\n */\nInterceptorManager.prototype.forEach = function forEach(fn) {\n utils.forEach(this.handlers, function forEachHandler(h) {\n if (h !== null) {\n fn(h);\n }\n });\n};\n\nmodule.exports = InterceptorManager;\n","'use strict';\n\nvar isAbsoluteURL = require('../helpers/isAbsoluteURL');\nvar combineURLs = require('../helpers/combineURLs');\n\n/**\n * Creates a new URL by combining the baseURL with the requestedURL,\n * only when the requestedURL is not already an absolute URL.\n * If the requestURL is absolute, this function returns the requestedURL untouched.\n *\n * @param {string} baseURL The base URL\n * @param {string} requestedURL Absolute or relative URL to combine\n * @returns {string} The combined full path\n */\nmodule.exports = function buildFullPath(baseURL, requestedURL) {\n if (baseURL && !isAbsoluteURL(requestedURL)) {\n return combineURLs(baseURL, requestedURL);\n }\n return requestedURL;\n};\n","'use strict';\n\nvar enhanceError = require('./enhanceError');\n\n/**\n * Create an Error with the specified message, config, error code, request and response.\n *\n * @param {string} message The error message.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The created error.\n */\nmodule.exports = function createError(message, config, code, request, response) {\n var error = new Error(message);\n return enhanceError(error, config, code, request, response);\n};\n","'use strict';\n\nvar utils = require('./../utils');\nvar transformData = require('./transformData');\nvar isCancel = require('../cancel/isCancel');\nvar defaults = require('../defaults');\n\n/**\n * Throws a `Cancel` if cancellation has been requested.\n */\nfunction throwIfCancellationRequested(config) {\n if (config.cancelToken) {\n config.cancelToken.throwIfRequested();\n }\n}\n\n/**\n * Dispatch a request to the server using the configured adapter.\n *\n * @param {object} config The config that is to be used for the request\n * @returns {Promise} The Promise to be fulfilled\n */\nmodule.exports = function dispatchRequest(config) {\n throwIfCancellationRequested(config);\n\n // Ensure headers exist\n config.headers = config.headers || {};\n\n // Transform request data\n config.data = transformData(\n config.data,\n config.headers,\n config.transformRequest\n );\n\n // Flatten headers\n config.headers = utils.merge(\n config.headers.common || {},\n config.headers[config.method] || {},\n config.headers\n );\n\n utils.forEach(\n ['delete', 'get', 'head', 'post', 'put', 'patch', 'common'],\n function cleanHeaderConfig(method) {\n delete config.headers[method];\n }\n );\n\n var adapter = config.adapter || defaults.adapter;\n\n return adapter(config).then(function onAdapterResolution(response) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n response.data = transformData(\n response.data,\n response.headers,\n config.transformResponse\n );\n\n return response;\n }, function onAdapterRejection(reason) {\n if (!isCancel(reason)) {\n throwIfCancellationRequested(config);\n\n // Transform response data\n if (reason && reason.response) {\n reason.response.data = transformData(\n reason.response.data,\n reason.response.headers,\n config.transformResponse\n );\n }\n }\n\n return Promise.reject(reason);\n });\n};\n","'use strict';\n\n/**\n * Update an Error with the specified config, error code, and response.\n *\n * @param {Error} error The error to update.\n * @param {Object} config The config.\n * @param {string} [code] The error code (for example, 'ECONNABORTED').\n * @param {Object} [request] The request.\n * @param {Object} [response] The response.\n * @returns {Error} The error.\n */\nmodule.exports = function enhanceError(error, config, code, request, response) {\n error.config = config;\n if (code) {\n error.code = code;\n }\n\n error.request = request;\n error.response = response;\n error.isAxiosError = true;\n\n error.toJSON = function() {\n return {\n // Standard\n message: this.message,\n name: this.name,\n // Microsoft\n description: this.description,\n number: this.number,\n // Mozilla\n fileName: this.fileName,\n lineNumber: this.lineNumber,\n columnNumber: this.columnNumber,\n stack: this.stack,\n // Axios\n config: this.config,\n code: this.code\n };\n };\n return error;\n};\n","'use strict';\n\nvar utils = require('../utils');\n\n/**\n * Config-specific merge-function which creates a new config-object\n * by merging two configuration objects together.\n *\n * @param {Object} config1\n * @param {Object} config2\n * @returns {Object} New object resulting from merging config2 to config1\n */\nmodule.exports = function mergeConfig(config1, config2) {\n // eslint-disable-next-line no-param-reassign\n config2 = config2 || {};\n var config = {};\n\n var valueFromConfig2Keys = ['url', 'method', 'params', 'data'];\n var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy'];\n var defaultToConfig2Keys = [\n 'baseURL', 'url', 'transformRequest', 'transformResponse', 'paramsSerializer',\n 'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',\n 'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress',\n 'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent',\n 'httpsAgent', 'cancelToken', 'socketPath'\n ];\n\n utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop) {\n if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n }\n });\n\n utils.forEach(mergeDeepPropertiesKeys, function mergeDeepProperties(prop) {\n if (utils.isObject(config2[prop])) {\n config[prop] = utils.deepMerge(config1[prop], config2[prop]);\n } else if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n } else if (utils.isObject(config1[prop])) {\n config[prop] = utils.deepMerge(config1[prop]);\n } else if (typeof config1[prop] !== 'undefined') {\n config[prop] = config1[prop];\n }\n });\n\n utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop) {\n if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n } else if (typeof config1[prop] !== 'undefined') {\n config[prop] = config1[prop];\n }\n });\n\n var axiosKeys = valueFromConfig2Keys\n .concat(mergeDeepPropertiesKeys)\n .concat(defaultToConfig2Keys);\n\n var otherKeys = Object\n .keys(config2)\n .filter(function filterAxiosKeys(key) {\n return axiosKeys.indexOf(key) === -1;\n });\n\n utils.forEach(otherKeys, function otherKeysDefaultToConfig2(prop) {\n if (typeof config2[prop] !== 'undefined') {\n config[prop] = config2[prop];\n } else if (typeof config1[prop] !== 'undefined') {\n config[prop] = config1[prop];\n }\n });\n\n return config;\n};\n","'use strict';\n\nvar createError = require('./createError');\n\n/**\n * Resolve or reject a Promise based on response status.\n *\n * @param {Function} resolve A function that resolves the promise.\n * @param {Function} reject A function that rejects the promise.\n * @param {object} response The response.\n */\nmodule.exports = function settle(resolve, reject, response) {\n var validateStatus = response.config.validateStatus;\n if (!validateStatus || validateStatus(response.status)) {\n resolve(response);\n } else {\n reject(createError(\n 'Request failed with status code ' + response.status,\n response.config,\n null,\n response.request,\n response\n ));\n }\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n/**\n * Transform the data for a request or a response\n *\n * @param {Object|String} data The data to be transformed\n * @param {Array} headers The headers for the request or response\n * @param {Array|Function} fns A single function or Array of functions\n * @returns {*} The resulting transformed data\n */\nmodule.exports = function transformData(data, headers, fns) {\n /*eslint no-param-reassign:0*/\n utils.forEach(fns, function transform(fn) {\n data = fn(data, headers);\n });\n\n return data;\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar normalizeHeaderName = require('./helpers/normalizeHeaderName');\n\nvar DEFAULT_CONTENT_TYPE = {\n 'Content-Type': 'application/x-www-form-urlencoded'\n};\n\nfunction setContentTypeIfUnset(headers, value) {\n if (!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])) {\n headers['Content-Type'] = value;\n }\n}\n\nfunction getDefaultAdapter() {\n var adapter;\n if (typeof XMLHttpRequest !== 'undefined') {\n // For browsers use XHR adapter\n adapter = require('./adapters/xhr');\n } else if (typeof process !== 'undefined' && Object.prototype.toString.call(process) === '[object process]') {\n // For node use HTTP adapter\n adapter = require('./adapters/http');\n }\n return adapter;\n}\n\nvar defaults = {\n adapter: getDefaultAdapter(),\n\n transformRequest: [function transformRequest(data, headers) {\n normalizeHeaderName(headers, 'Accept');\n normalizeHeaderName(headers, 'Content-Type');\n if (utils.isFormData(data) ||\n utils.isArrayBuffer(data) ||\n utils.isBuffer(data) ||\n utils.isStream(data) ||\n utils.isFile(data) ||\n utils.isBlob(data)\n ) {\n return data;\n }\n if (utils.isArrayBufferView(data)) {\n return data.buffer;\n }\n if (utils.isURLSearchParams(data)) {\n setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8');\n return data.toString();\n }\n if (utils.isObject(data)) {\n setContentTypeIfUnset(headers, 'application/json;charset=utf-8');\n return JSON.stringify(data);\n }\n return data;\n }],\n\n transformResponse: [function transformResponse(data) {\n /*eslint no-param-reassign:0*/\n if (typeof data === 'string') {\n try {\n data = JSON.parse(data);\n } catch (e) { /* Ignore */ }\n }\n return data;\n }],\n\n /**\n * A timeout in milliseconds to abort a request. If set to 0 (default) a\n * timeout is not created.\n */\n timeout: 0,\n\n xsrfCookieName: 'XSRF-TOKEN',\n xsrfHeaderName: 'X-XSRF-TOKEN',\n\n maxContentLength: -1,\n\n validateStatus: function validateStatus(status) {\n return status >= 200 && status < 300;\n }\n};\n\ndefaults.headers = {\n common: {\n 'Accept': 'application/json, text/plain, */*'\n }\n};\n\nutils.forEach(['delete', 'get', 'head'], function forEachMethodNoData(method) {\n defaults.headers[method] = {};\n});\n\nutils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {\n defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);\n});\n\nmodule.exports = defaults;\n","'use strict';\n\nmodule.exports = function bind(fn, thisArg) {\n return function wrap() {\n var args = new Array(arguments.length);\n for (var i = 0; i < args.length; i++) {\n args[i] = arguments[i];\n }\n return fn.apply(thisArg, args);\n };\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nfunction encode(val) {\n return encodeURIComponent(val).\n replace(/%40/gi, '@').\n replace(/%3A/gi, ':').\n replace(/%24/g, '$').\n replace(/%2C/gi, ',').\n replace(/%20/g, '+').\n replace(/%5B/gi, '[').\n replace(/%5D/gi, ']');\n}\n\n/**\n * Build a URL by appending params to the end\n *\n * @param {string} url The base of the url (e.g., http://www.google.com)\n * @param {object} [params] The params to be appended\n * @returns {string} The formatted url\n */\nmodule.exports = function buildURL(url, params, paramsSerializer) {\n /*eslint no-param-reassign:0*/\n if (!params) {\n return url;\n }\n\n var serializedParams;\n if (paramsSerializer) {\n serializedParams = paramsSerializer(params);\n } else if (utils.isURLSearchParams(params)) {\n serializedParams = params.toString();\n } else {\n var parts = [];\n\n utils.forEach(params, function serialize(val, key) {\n if (val === null || typeof val === 'undefined') {\n return;\n }\n\n if (utils.isArray(val)) {\n key = key + '[]';\n } else {\n val = [val];\n }\n\n utils.forEach(val, function parseValue(v) {\n if (utils.isDate(v)) {\n v = v.toISOString();\n } else if (utils.isObject(v)) {\n v = JSON.stringify(v);\n }\n parts.push(encode(key) + '=' + encode(v));\n });\n });\n\n serializedParams = parts.join('&');\n }\n\n if (serializedParams) {\n var hashmarkIndex = url.indexOf('#');\n if (hashmarkIndex !== -1) {\n url = url.slice(0, hashmarkIndex);\n }\n\n url += (url.indexOf('?') === -1 ? '?' : '&') + serializedParams;\n }\n\n return url;\n};\n","'use strict';\n\n/**\n * Creates a new URL by combining the specified URLs\n *\n * @param {string} baseURL The base URL\n * @param {string} relativeURL The relative URL\n * @returns {string} The combined URL\n */\nmodule.exports = function combineURLs(baseURL, relativeURL) {\n return relativeURL\n ? baseURL.replace(/\\/+$/, '') + '/' + relativeURL.replace(/^\\/+/, '')\n : baseURL;\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs support document.cookie\n (function standardBrowserEnv() {\n return {\n write: function write(name, value, expires, path, domain, secure) {\n var cookie = [];\n cookie.push(name + '=' + encodeURIComponent(value));\n\n if (utils.isNumber(expires)) {\n cookie.push('expires=' + new Date(expires).toGMTString());\n }\n\n if (utils.isString(path)) {\n cookie.push('path=' + path);\n }\n\n if (utils.isString(domain)) {\n cookie.push('domain=' + domain);\n }\n\n if (secure === true) {\n cookie.push('secure');\n }\n\n document.cookie = cookie.join('; ');\n },\n\n read: function read(name) {\n var match = document.cookie.match(new RegExp('(^|;\\\\s*)(' + name + ')=([^;]*)'));\n return (match ? decodeURIComponent(match[3]) : null);\n },\n\n remove: function remove(name) {\n this.write(name, '', Date.now() - 86400000);\n }\n };\n })() :\n\n // Non standard browser env (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return {\n write: function write() {},\n read: function read() { return null; },\n remove: function remove() {}\n };\n })()\n);\n","'use strict';\n\n/**\n * Determines whether the specified URL is absolute\n *\n * @param {string} url The URL to test\n * @returns {boolean} True if the specified URL is absolute, otherwise false\n */\nmodule.exports = function isAbsoluteURL(url) {\n // A URL is considered absolute if it begins with \"://\" or \"//\" (protocol-relative URL).\n // RFC 3986 defines scheme name as a sequence of characters beginning with a letter and followed\n // by any combination of letters, digits, plus, period, or hyphen.\n return /^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(url);\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\nmodule.exports = (\n utils.isStandardBrowserEnv() ?\n\n // Standard browser envs have full support of the APIs needed to test\n // whether the request URL is of the same origin as current location.\n (function standardBrowserEnv() {\n var msie = /(msie|trident)/i.test(navigator.userAgent);\n var urlParsingNode = document.createElement('a');\n var originURL;\n\n /**\n * Parse a URL to discover it's components\n *\n * @param {String} url The URL to be parsed\n * @returns {Object}\n */\n function resolveURL(url) {\n var href = url;\n\n if (msie) {\n // IE needs attribute set twice to normalize properties\n urlParsingNode.setAttribute('href', href);\n href = urlParsingNode.href;\n }\n\n urlParsingNode.setAttribute('href', href);\n\n // urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils\n return {\n href: urlParsingNode.href,\n protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',\n host: urlParsingNode.host,\n search: urlParsingNode.search ? urlParsingNode.search.replace(/^\\?/, '') : '',\n hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',\n hostname: urlParsingNode.hostname,\n port: urlParsingNode.port,\n pathname: (urlParsingNode.pathname.charAt(0) === '/') ?\n urlParsingNode.pathname :\n '/' + urlParsingNode.pathname\n };\n }\n\n originURL = resolveURL(window.location.href);\n\n /**\n * Determine if a URL shares the same origin as the current location\n *\n * @param {String} requestURL The URL to test\n * @returns {boolean} True if URL shares the same origin, otherwise false\n */\n return function isURLSameOrigin(requestURL) {\n var parsed = (utils.isString(requestURL)) ? resolveURL(requestURL) : requestURL;\n return (parsed.protocol === originURL.protocol &&\n parsed.host === originURL.host);\n };\n })() :\n\n // Non standard browser envs (web workers, react-native) lack needed support.\n (function nonStandardBrowserEnv() {\n return function isURLSameOrigin() {\n return true;\n };\n })()\n);\n","'use strict';\n\nvar utils = require('../utils');\n\nmodule.exports = function normalizeHeaderName(headers, normalizedName) {\n utils.forEach(headers, function processHeader(value, name) {\n if (name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()) {\n headers[normalizedName] = value;\n delete headers[name];\n }\n });\n};\n","'use strict';\n\nvar utils = require('./../utils');\n\n// Headers whose duplicates are ignored by node\n// c.f. https://nodejs.org/api/http.html#http_message_headers\nvar ignoreDuplicateOf = [\n 'age', 'authorization', 'content-length', 'content-type', 'etag',\n 'expires', 'from', 'host', 'if-modified-since', 'if-unmodified-since',\n 'last-modified', 'location', 'max-forwards', 'proxy-authorization',\n 'referer', 'retry-after', 'user-agent'\n];\n\n/**\n * Parse headers into an object\n *\n * ```\n * Date: Wed, 27 Aug 2014 08:58:49 GMT\n * Content-Type: application/json\n * Connection: keep-alive\n * Transfer-Encoding: chunked\n * ```\n *\n * @param {String} headers Headers needing to be parsed\n * @returns {Object} Headers parsed into an object\n */\nmodule.exports = function parseHeaders(headers) {\n var parsed = {};\n var key;\n var val;\n var i;\n\n if (!headers) { return parsed; }\n\n utils.forEach(headers.split('\\n'), function parser(line) {\n i = line.indexOf(':');\n key = utils.trim(line.substr(0, i)).toLowerCase();\n val = utils.trim(line.substr(i + 1));\n\n if (key) {\n if (parsed[key] && ignoreDuplicateOf.indexOf(key) >= 0) {\n return;\n }\n if (key === 'set-cookie') {\n parsed[key] = (parsed[key] ? parsed[key] : []).concat([val]);\n } else {\n parsed[key] = parsed[key] ? parsed[key] + ', ' + val : val;\n }\n }\n });\n\n return parsed;\n};\n","'use strict';\n\n/**\n * Syntactic sugar for invoking a function and expanding an array for arguments.\n *\n * Common use case would be to use `Function.prototype.apply`.\n *\n * ```js\n * function f(x, y, z) {}\n * var args = [1, 2, 3];\n * f.apply(null, args);\n * ```\n *\n * With `spread` this example can be re-written.\n *\n * ```js\n * spread(function(x, y, z) {})([1, 2, 3]);\n * ```\n *\n * @param {Function} callback\n * @returns {Function}\n */\nmodule.exports = function spread(callback) {\n return function wrap(arr) {\n return callback.apply(null, arr);\n };\n};\n","'use strict';\n\nvar bind = require('./helpers/bind');\n\n/*global toString:true*/\n\n// utils is a library of generic helper functions non-specific to axios\n\nvar toString = Object.prototype.toString;\n\n/**\n * Determine if a value is an Array\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Array, otherwise false\n */\nfunction isArray(val) {\n return toString.call(val) === '[object Array]';\n}\n\n/**\n * Determine if a value is undefined\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if the value is undefined, otherwise false\n */\nfunction isUndefined(val) {\n return typeof val === 'undefined';\n}\n\n/**\n * Determine if a value is a Buffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Buffer, otherwise false\n */\nfunction isBuffer(val) {\n return val !== null && !isUndefined(val) && val.constructor !== null && !isUndefined(val.constructor)\n && typeof val.constructor.isBuffer === 'function' && val.constructor.isBuffer(val);\n}\n\n/**\n * Determine if a value is an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an ArrayBuffer, otherwise false\n */\nfunction isArrayBuffer(val) {\n return toString.call(val) === '[object ArrayBuffer]';\n}\n\n/**\n * Determine if a value is a FormData\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an FormData, otherwise false\n */\nfunction isFormData(val) {\n return (typeof FormData !== 'undefined') && (val instanceof FormData);\n}\n\n/**\n * Determine if a value is a view on an ArrayBuffer\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a view on an ArrayBuffer, otherwise false\n */\nfunction isArrayBufferView(val) {\n var result;\n if ((typeof ArrayBuffer !== 'undefined') && (ArrayBuffer.isView)) {\n result = ArrayBuffer.isView(val);\n } else {\n result = (val) && (val.buffer) && (val.buffer instanceof ArrayBuffer);\n }\n return result;\n}\n\n/**\n * Determine if a value is a String\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a String, otherwise false\n */\nfunction isString(val) {\n return typeof val === 'string';\n}\n\n/**\n * Determine if a value is a Number\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Number, otherwise false\n */\nfunction isNumber(val) {\n return typeof val === 'number';\n}\n\n/**\n * Determine if a value is an Object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is an Object, otherwise false\n */\nfunction isObject(val) {\n return val !== null && typeof val === 'object';\n}\n\n/**\n * Determine if a value is a Date\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Date, otherwise false\n */\nfunction isDate(val) {\n return toString.call(val) === '[object Date]';\n}\n\n/**\n * Determine if a value is a File\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a File, otherwise false\n */\nfunction isFile(val) {\n return toString.call(val) === '[object File]';\n}\n\n/**\n * Determine if a value is a Blob\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Blob, otherwise false\n */\nfunction isBlob(val) {\n return toString.call(val) === '[object Blob]';\n}\n\n/**\n * Determine if a value is a Function\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Function, otherwise false\n */\nfunction isFunction(val) {\n return toString.call(val) === '[object Function]';\n}\n\n/**\n * Determine if a value is a Stream\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a Stream, otherwise false\n */\nfunction isStream(val) {\n return isObject(val) && isFunction(val.pipe);\n}\n\n/**\n * Determine if a value is a URLSearchParams object\n *\n * @param {Object} val The value to test\n * @returns {boolean} True if value is a URLSearchParams object, otherwise false\n */\nfunction isURLSearchParams(val) {\n return typeof URLSearchParams !== 'undefined' && val instanceof URLSearchParams;\n}\n\n/**\n * Trim excess whitespace off the beginning and end of a string\n *\n * @param {String} str The String to trim\n * @returns {String} The String freed of excess whitespace\n */\nfunction trim(str) {\n return str.replace(/^\\s*/, '').replace(/\\s*$/, '');\n}\n\n/**\n * Determine if we're running in a standard browser environment\n *\n * This allows axios to run in a web worker, and react-native.\n * Both environments support XMLHttpRequest, but not fully standard globals.\n *\n * web workers:\n * typeof window -> undefined\n * typeof document -> undefined\n *\n * react-native:\n * navigator.product -> 'ReactNative'\n * nativescript\n * navigator.product -> 'NativeScript' or 'NS'\n */\nfunction isStandardBrowserEnv() {\n if (typeof navigator !== 'undefined' && (navigator.product === 'ReactNative' ||\n navigator.product === 'NativeScript' ||\n navigator.product === 'NS')) {\n return false;\n }\n return (\n typeof window !== 'undefined' &&\n typeof document !== 'undefined'\n );\n}\n\n/**\n * Iterate over an Array or an Object invoking a function for each item.\n *\n * If `obj` is an Array callback will be called passing\n * the value, index, and complete array for each item.\n *\n * If 'obj' is an Object callback will be called passing\n * the value, key, and complete object for each property.\n *\n * @param {Object|Array} obj The object to iterate\n * @param {Function} fn The callback to invoke for each item\n */\nfunction forEach(obj, fn) {\n // Don't bother if no value provided\n if (obj === null || typeof obj === 'undefined') {\n return;\n }\n\n // Force an array if not already something iterable\n if (typeof obj !== 'object') {\n /*eslint no-param-reassign:0*/\n obj = [obj];\n }\n\n if (isArray(obj)) {\n // Iterate over array values\n for (var i = 0, l = obj.length; i < l; i++) {\n fn.call(null, obj[i], i, obj);\n }\n } else {\n // Iterate over object keys\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn.call(null, obj[key], key, obj);\n }\n }\n }\n}\n\n/**\n * Accepts varargs expecting each argument to be an object, then\n * immutably merges the properties of each object and returns result.\n *\n * When multiple objects contain the same key the later object in\n * the arguments list will take precedence.\n *\n * Example:\n *\n * ```js\n * var result = merge({foo: 123}, {foo: 456});\n * console.log(result.foo); // outputs 456\n * ```\n *\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction merge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = merge(result[key], val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Function equal to merge with the difference being that no reference\n * to original objects is kept.\n *\n * @see merge\n * @param {Object} obj1 Object to merge\n * @returns {Object} Result of all merge properties\n */\nfunction deepMerge(/* obj1, obj2, obj3, ... */) {\n var result = {};\n function assignValue(val, key) {\n if (typeof result[key] === 'object' && typeof val === 'object') {\n result[key] = deepMerge(result[key], val);\n } else if (typeof val === 'object') {\n result[key] = deepMerge({}, val);\n } else {\n result[key] = val;\n }\n }\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n forEach(arguments[i], assignValue);\n }\n return result;\n}\n\n/**\n * Extends object a by mutably adding to it the properties of object b.\n *\n * @param {Object} a The object to be extended\n * @param {Object} b The object to copy properties from\n * @param {Object} thisArg The object to bind function to\n * @return {Object} The resulting value of object a\n */\nfunction extend(a, b, thisArg) {\n forEach(b, function assignValue(val, key) {\n if (thisArg && typeof val === 'function') {\n a[key] = bind(val, thisArg);\n } else {\n a[key] = val;\n }\n });\n return a;\n}\n\nmodule.exports = {\n isArray: isArray,\n isArrayBuffer: isArrayBuffer,\n isBuffer: isBuffer,\n isFormData: isFormData,\n isArrayBufferView: isArrayBufferView,\n isString: isString,\n isNumber: isNumber,\n isObject: isObject,\n isUndefined: isUndefined,\n isDate: isDate,\n isFile: isFile,\n isBlob: isBlob,\n isFunction: isFunction,\n isStream: isStream,\n isURLSearchParams: isURLSearchParams,\n isStandardBrowserEnv: isStandardBrowserEnv,\n forEach: forEach,\n merge: merge,\n deepMerge: deepMerge,\n extend: extend,\n trim: trim\n};\n","require('../../modules/es.array.find');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('Array', 'find');\n","require('../../modules/es.string.iterator');\nrequire('../../modules/es.array.from');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Array.from;\n","require('../../modules/es.array.includes');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('Array', 'includes');\n","require('../../modules/es.object.assign');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Object.assign;\n","require('../../modules/es.object.to-string');\nrequire('../../modules/es.string.iterator');\nrequire('../../modules/web.dom-collections.iterator');\nrequire('../../modules/es.promise');\nrequire('../../modules/es.promise.finally');\nvar path = require('../../internals/path');\n\nmodule.exports = path.Promise;\n","require('../../modules/es.string.includes');\nvar entryUnbind = require('../../internals/entry-unbind');\n\nmodule.exports = entryUnbind('String', 'includes');\n","require('../../modules/es.symbol.iterator');\nrequire('../../modules/es.string.iterator');\nrequire('../../modules/web.dom-collections.iterator');\nvar WrappedWellKnownSymbolModule = require('../../internals/wrapped-well-known-symbol');\n\nmodule.exports = WrappedWellKnownSymbolModule.f('iterator');\n","module.exports = require('../../es/promise');\n\nrequire('../../modules/esnext.aggregate-error');\nrequire('../../modules/esnext.promise.all-settled');\nrequire('../../modules/esnext.promise.try');\nrequire('../../modules/esnext.promise.any');\n","module.exports = function (it) {\n if (typeof it != 'function') {\n throw TypeError(String(it) + ' is not a function');\n } return it;\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar create = require('../internals/object-create');\nvar hide = require('../internals/hide');\n\nvar UNSCOPABLES = wellKnownSymbol('unscopables');\nvar ArrayPrototype = Array.prototype;\n\n// Array.prototype[@@unscopables]\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\nif (ArrayPrototype[UNSCOPABLES] == undefined) {\n hide(ArrayPrototype, UNSCOPABLES, create(null));\n}\n\n// add a key to Array.prototype[@@unscopables]\nmodule.exports = function (key) {\n ArrayPrototype[UNSCOPABLES][key] = true;\n};\n","module.exports = function (it, Constructor, name) {\n if (!(it instanceof Constructor)) {\n throw TypeError('Incorrect ' + (name ? name + ' ' : '') + 'invocation');\n } return it;\n};\n","var isObject = require('../internals/is-object');\n\nmodule.exports = function (it) {\n if (!isObject(it)) {\n throw TypeError(String(it) + ' is not an object');\n } return it;\n};\n","'use strict';\nvar bind = require('../internals/bind-context');\nvar toObject = require('../internals/to-object');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar createProperty = require('../internals/create-property');\nvar getIteratorMethod = require('../internals/get-iterator-method');\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\nmodule.exports = function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var argumentsLength = arguments.length;\n var mapfn = argumentsLength > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iteratorMethod = getIteratorMethod(O);\n var length, result, step, iterator;\n if (mapping) mapfn = bind(mapfn, argumentsLength > 2 ? arguments[2] : undefined, 2);\n // if the target is not iterable or it's an array with the default iterator - use a simple case\n if (iteratorMethod != undefined && !(C == Array && isArrayIteratorMethod(iteratorMethod))) {\n iterator = iteratorMethod.call(O);\n result = new C();\n for (;!(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping\n ? callWithSafeIterationClosing(iterator, mapfn, [step.value, index], true)\n : step.value\n );\n }\n } else {\n length = toLength(O.length);\n result = new C(length);\n for (;length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n};\n","var toIndexedObject = require('../internals/to-indexed-object');\nvar toLength = require('../internals/to-length');\nvar toAbsoluteIndex = require('../internals/to-absolute-index');\n\n// `Array.prototype.{ indexOf, includes }` methods implementation\n// false -> Array#indexOf\n// https://tc39.github.io/ecma262/#sec-array.prototype.indexof\n// true -> Array#includes\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIndexedObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","var bind = require('../internals/bind-context');\nvar IndexedObject = require('../internals/indexed-object');\nvar toObject = require('../internals/to-object');\nvar toLength = require('../internals/to-length');\nvar arraySpeciesCreate = require('../internals/array-species-create');\n\n// `Array.prototype.{ forEach, map, filter, some, every, find, findIndex }` methods implementation\n// 0 -> Array#forEach\n// https://tc39.github.io/ecma262/#sec-array.prototype.foreach\n// 1 -> Array#map\n// https://tc39.github.io/ecma262/#sec-array.prototype.map\n// 2 -> Array#filter\n// https://tc39.github.io/ecma262/#sec-array.prototype.filter\n// 3 -> Array#some\n// https://tc39.github.io/ecma262/#sec-array.prototype.some\n// 4 -> Array#every\n// https://tc39.github.io/ecma262/#sec-array.prototype.every\n// 5 -> Array#find\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n// 6 -> Array#findIndex\n// https://tc39.github.io/ecma262/#sec-array.prototype.findIndex\nmodule.exports = function (TYPE, specificCreate) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = specificCreate || arraySpeciesCreate;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IndexedObject(O);\n var boundFunction = bind(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var target = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var value, result;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n value = self[index];\n result = boundFunction(value, index, O);\n if (TYPE) {\n if (IS_MAP) target[index] = result; // map\n else if (result) switch (TYPE) {\n case 3: return true; // some\n case 5: return value; // find\n case 6: return index; // findIndex\n case 2: target.push(value); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : target;\n };\n};\n","var isObject = require('../internals/is-object');\nvar isArray = require('../internals/is-array');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `ArraySpeciesCreate` abstract operation\n// https://tc39.github.io/ecma262/#sec-arrayspeciescreate\nmodule.exports = function (originalArray, length) {\n var C;\n if (isArray(originalArray)) {\n C = originalArray.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n else if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return new (C === undefined ? Array : C)(length === 0 ? 0 : length);\n};\n","var aFunction = require('../internals/a-function');\n\n// optional / simple context binding\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 0: return function () {\n return fn.call(that);\n };\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","var anObject = require('../internals/an-object');\n\n// call something on iterator step with safe closing on error\nmodule.exports = function (iterator, fn, value, ENTRIES) {\n try {\n return ENTRIES ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (error) {\n var returnMethod = iterator['return'];\n if (returnMethod !== undefined) anObject(returnMethod.call(iterator));\n throw error;\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var called = 0;\n var iteratorWithReturn = {\n next: function () {\n return { done: !!called++ };\n },\n 'return': function () {\n SAFE_CLOSING = true;\n }\n };\n iteratorWithReturn[ITERATOR] = function () {\n return this;\n };\n // eslint-disable-next-line no-throw-literal\n Array.from(iteratorWithReturn, function () { throw 2; });\n} catch (error) { /* empty */ }\n\nmodule.exports = function (exec, SKIP_CLOSING) {\n if (!SKIP_CLOSING && !SAFE_CLOSING) return false;\n var ITERATION_SUPPORT = false;\n try {\n var object = {};\n object[ITERATOR] = function () {\n return {\n next: function () {\n return { done: ITERATION_SUPPORT = true };\n }\n };\n };\n exec(object);\n } catch (error) { /* empty */ }\n return ITERATION_SUPPORT;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","var classofRaw = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n// ES3 wrong here\nvar CORRECT_ARGUMENTS = classofRaw(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (error) { /* empty */ }\n};\n\n// getting tag from ES6+ `Object.prototype.toString`\nmodule.exports = function (it) {\n var O, tag, result;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (tag = tryGet(O = Object(it), TO_STRING_TAG)) == 'string' ? tag\n // builtinTag case\n : CORRECT_ARGUMENTS ? classofRaw(O)\n // ES3 arguments fallback\n : (result = classofRaw(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : result;\n};\n","var has = require('../internals/has');\nvar ownKeys = require('../internals/own-keys');\nvar getOwnPropertyDescriptorModule = require('../internals/object-get-own-property-descriptor');\nvar definePropertyModule = require('../internals/object-define-property');\n\nmodule.exports = function (target, source) {\n var keys = ownKeys(source);\n var defineProperty = definePropertyModule.f;\n var getOwnPropertyDescriptor = getOwnPropertyDescriptorModule.f;\n for (var i = 0; i < keys.length; i++) {\n var key = keys[i];\n if (!has(target, key)) defineProperty(target, key, getOwnPropertyDescriptor(source, key));\n }\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\nmodule.exports = function (METHOD_NAME) {\n var regexp = /./;\n try {\n '/./'[METHOD_NAME](regexp);\n } catch (e) {\n try {\n regexp[MATCH] = false;\n return '/./'[METHOD_NAME](regexp);\n } catch (f) { /* empty */ }\n } return false;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !fails(function () {\n function F() { /* empty */ }\n F.prototype.constructor = null;\n return Object.getPrototypeOf(new F()) !== F.prototype;\n});\n","'use strict';\nvar IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar Iterators = require('../internals/iterators');\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (IteratorConstructor, NAME, next) {\n var TO_STRING_TAG = NAME + ' Iterator';\n IteratorConstructor.prototype = create(IteratorPrototype, { next: createPropertyDescriptor(1, next) });\n setToStringTag(IteratorConstructor, TO_STRING_TAG, false, true);\n Iterators[TO_STRING_TAG] = returnThis;\n return IteratorConstructor;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","'use strict';\nvar toPrimitive = require('../internals/to-primitive');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = function (object, key, value) {\n var propertyKey = toPrimitive(key);\n if (propertyKey in object) definePropertyModule.f(object, propertyKey, createPropertyDescriptor(0, value));\n else object[propertyKey] = value;\n};\n","'use strict';\nvar $ = require('../internals/export');\nvar createIteratorConstructor = require('../internals/create-iterator-constructor');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar hide = require('../internals/hide');\nvar redefine = require('../internals/redefine');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\nvar Iterators = require('../internals/iterators');\nvar IteratorsCore = require('../internals/iterators-core');\n\nvar IteratorPrototype = IteratorsCore.IteratorPrototype;\nvar BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS;\nvar ITERATOR = wellKnownSymbol('iterator');\nvar KEYS = 'keys';\nvar VALUES = 'values';\nvar ENTRIES = 'entries';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) {\n createIteratorConstructor(IteratorConstructor, NAME, next);\n\n var getIterationMethod = function (KIND) {\n if (KIND === DEFAULT && defaultIterator) return defaultIterator;\n if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND];\n switch (KIND) {\n case KEYS: return function keys() { return new IteratorConstructor(this, KIND); };\n case VALUES: return function values() { return new IteratorConstructor(this, KIND); };\n case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); };\n } return function () { return new IteratorConstructor(this); };\n };\n\n var TO_STRING_TAG = NAME + ' Iterator';\n var INCORRECT_VALUES_NAME = false;\n var IterablePrototype = Iterable.prototype;\n var nativeIterator = IterablePrototype[ITERATOR]\n || IterablePrototype['@@iterator']\n || DEFAULT && IterablePrototype[DEFAULT];\n var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT);\n var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator;\n var CurrentIteratorPrototype, methods, KEY;\n\n // fix native\n if (anyNativeIterator) {\n CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable()));\n if (IteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) {\n if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) {\n if (setPrototypeOf) {\n setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype);\n } else if (typeof CurrentIteratorPrototype[ITERATOR] != 'function') {\n hide(CurrentIteratorPrototype, ITERATOR, returnThis);\n }\n }\n // Set @@toStringTag to native iterators\n setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true);\n if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis;\n }\n }\n\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) {\n INCORRECT_VALUES_NAME = true;\n defaultIterator = function values() { return nativeIterator.call(this); };\n }\n\n // define iterator\n if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) {\n hide(IterablePrototype, ITERATOR, defaultIterator);\n }\n Iterators[NAME] = defaultIterator;\n\n // export additional methods\n if (DEFAULT) {\n methods = {\n values: getIterationMethod(VALUES),\n keys: IS_SET ? defaultIterator : getIterationMethod(KEYS),\n entries: getIterationMethod(ENTRIES)\n };\n if (FORCED) for (KEY in methods) {\n if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) {\n redefine(IterablePrototype, KEY, methods[KEY]);\n }\n } else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods);\n }\n\n return methods;\n};\n","var path = require('../internals/path');\nvar has = require('../internals/has');\nvar wrappedWellKnownSymbolModule = require('../internals/wrapped-well-known-symbol');\nvar defineProperty = require('../internals/object-define-property').f;\n\nmodule.exports = function (NAME) {\n var Symbol = path.Symbol || (path.Symbol = {});\n if (!has(Symbol, NAME)) defineProperty(Symbol, NAME, {\n value: wrappedWellKnownSymbolModule.f(NAME)\n });\n};\n","var fails = require('../internals/fails');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !fails(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var global = require('../internals/global');\nvar isObject = require('../internals/is-object');\n\nvar document = global.document;\n// typeof document.createElement is 'object' in old IE\nvar exist = isObject(document) && isObject(document.createElement);\n\nmodule.exports = function (it) {\n return exist ? document.createElement(it) : {};\n};\n","// iterable DOM collections\n// flag - `iterable` interface - 'entries', 'keys', 'values', 'forEach' methods\nmodule.exports = {\n CSSRuleList: 0,\n CSSStyleDeclaration: 0,\n CSSValueList: 0,\n ClientRectList: 0,\n DOMRectList: 0,\n DOMStringList: 0,\n DOMTokenList: 1,\n DataTransferItemList: 0,\n FileList: 0,\n HTMLAllCollection: 0,\n HTMLCollection: 0,\n HTMLFormElement: 0,\n HTMLSelectElement: 0,\n MediaList: 0,\n MimeTypeArray: 0,\n NamedNodeMap: 0,\n NodeList: 1,\n PaintRequestList: 0,\n Plugin: 0,\n PluginArray: 0,\n SVGLengthList: 0,\n SVGNumberList: 0,\n SVGPathSegList: 0,\n SVGPointList: 0,\n SVGStringList: 0,\n SVGTransformList: 0,\n SourceBufferList: 0,\n StyleSheetList: 0,\n TextTrackCueList: 0,\n TextTrackList: 0,\n TouchList: 0\n};\n","var global = require('../internals/global');\nvar bind = require('../internals/bind-context');\n\nvar call = Function.call;\n\nmodule.exports = function (CONSTRUCTOR, METHOD, length) {\n return bind(call, global[CONSTRUCTOR].prototype[METHOD], length);\n};\n","// IE8- don't enum bug keys\nmodule.exports = [\n 'constructor',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'toLocaleString',\n 'toString',\n 'valueOf'\n];\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar hide = require('../internals/hide');\nvar redefine = require('../internals/redefine');\nvar setGlobal = require('../internals/set-global');\nvar copyConstructorProperties = require('../internals/copy-constructor-properties');\nvar isForced = require('../internals/is-forced');\n\n/*\n options.target - name of the target object\n options.global - target is the global object\n options.stat - export as static methods of target\n options.proto - export as prototype methods of target\n options.real - real prototype method for the `pure` version\n options.forced - export even if the native feature is available\n options.bind - bind methods to the target, required for the `pure` version\n options.wrap - wrap constructors to preventing global pollution, required for the `pure` version\n options.unsafe - use the simple assignment of property instead of delete + defineProperty\n options.sham - add a flag to not completely full polyfills\n options.enumerable - export as enumerable property\n options.noTargetGet - prevent calling a getter on target\n*/\nmodule.exports = function (options, source) {\n var TARGET = options.target;\n var GLOBAL = options.global;\n var STATIC = options.stat;\n var FORCED, target, key, targetProperty, sourceProperty, descriptor;\n if (GLOBAL) {\n target = global;\n } else if (STATIC) {\n target = global[TARGET] || setGlobal(TARGET, {});\n } else {\n target = (global[TARGET] || {}).prototype;\n }\n if (target) for (key in source) {\n sourceProperty = source[key];\n if (options.noTargetGet) {\n descriptor = getOwnPropertyDescriptor(target, key);\n targetProperty = descriptor && descriptor.value;\n } else targetProperty = target[key];\n FORCED = isForced(GLOBAL ? key : TARGET + (STATIC ? '.' : '#') + key, options.forced);\n // contained in target\n if (!FORCED && targetProperty !== undefined) {\n if (typeof sourceProperty === typeof targetProperty) continue;\n copyConstructorProperties(sourceProperty, targetProperty);\n }\n // add a flag to not completely full polyfills\n if (options.sham || (targetProperty && targetProperty.sham)) {\n hide(sourceProperty, 'sham', true);\n }\n // extend global\n redefine(target, key, sourceProperty, options);\n }\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (error) {\n return true;\n }\n};\n","var shared = require('../internals/shared');\n\nmodule.exports = shared('native-function-to-string', Function.toString);\n","var path = require('../internals/path');\nvar global = require('../internals/global');\n\nvar aFunction = function (variable) {\n return typeof variable == 'function' ? variable : undefined;\n};\n\nmodule.exports = function (namespace, method) {\n return arguments.length < 2 ? aFunction(path[namespace]) || aFunction(global[namespace])\n : path[namespace] && path[namespace][method] || global[namespace] && global[namespace][method];\n};\n","var classof = require('../internals/classof');\nvar Iterators = require('../internals/iterators');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\n\nmodule.exports = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","var O = 'object';\nvar check = function (it) {\n return it && it.Math == Math && it;\n};\n\n// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nmodule.exports =\n // eslint-disable-next-line no-undef\n check(typeof globalThis == O && globalThis) ||\n check(typeof window == O && window) ||\n check(typeof self == O && self) ||\n check(typeof global == O && global) ||\n // eslint-disable-next-line no-new-func\n Function('return this')();\n","var hasOwnProperty = {}.hasOwnProperty;\n\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","module.exports = {};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\n\nmodule.exports = DESCRIPTORS ? function (object, key, value) {\n return definePropertyModule.f(object, key, createPropertyDescriptor(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var global = require('../internals/global');\n\nmodule.exports = function (a, b) {\n var console = global.console;\n if (console && console.error) {\n arguments.length === 1 ? console.error(a) : console.error(a, b);\n }\n};\n","var global = require('../internals/global');\n\nvar document = global.document;\n\nmodule.exports = document && document.documentElement;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar createElement = require('../internals/document-create-element');\n\n// Thank's IE8 for his funny defineProperty\nmodule.exports = !DESCRIPTORS && !fails(function () {\n return Object.defineProperty(createElement('div'), 'a', {\n get: function () { return 7; }\n }).a != 7;\n});\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\n\nvar split = ''.split;\n\nmodule.exports = fails(function () {\n // throws an error in rhino, see https://github.com/mozilla/rhino/issues/346\n // eslint-disable-next-line no-prototype-builtins\n return !Object('z').propertyIsEnumerable(0);\n}) ? function (it) {\n return classof(it) == 'String' ? split.call(it, '') : Object(it);\n} : Object;\n","var NATIVE_WEAK_MAP = require('../internals/native-weak-map');\nvar global = require('../internals/global');\nvar isObject = require('../internals/is-object');\nvar hide = require('../internals/hide');\nvar objectHas = require('../internals/has');\nvar sharedKey = require('../internals/shared-key');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar WeakMap = global.WeakMap;\nvar set, get, has;\n\nvar enforce = function (it) {\n return has(it) ? get(it) : set(it, {});\n};\n\nvar getterFor = function (TYPE) {\n return function (it) {\n var state;\n if (!isObject(it) || (state = get(it)).type !== TYPE) {\n throw TypeError('Incompatible receiver, ' + TYPE + ' required');\n } return state;\n };\n};\n\nif (NATIVE_WEAK_MAP) {\n var store = new WeakMap();\n var wmget = store.get;\n var wmhas = store.has;\n var wmset = store.set;\n set = function (it, metadata) {\n wmset.call(store, it, metadata);\n return metadata;\n };\n get = function (it) {\n return wmget.call(store, it) || {};\n };\n has = function (it) {\n return wmhas.call(store, it);\n };\n} else {\n var STATE = sharedKey('state');\n hiddenKeys[STATE] = true;\n set = function (it, metadata) {\n hide(it, STATE, metadata);\n return metadata;\n };\n get = function (it) {\n return objectHas(it, STATE) ? it[STATE] : {};\n };\n has = function (it) {\n return objectHas(it, STATE);\n };\n}\n\nmodule.exports = {\n set: set,\n get: get,\n has: has,\n enforce: enforce,\n getterFor: getterFor\n};\n","var wellKnownSymbol = require('../internals/well-known-symbol');\nvar Iterators = require('../internals/iterators');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar ArrayPrototype = Array.prototype;\n\n// check on default Array iterator\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayPrototype[ITERATOR] === it);\n};\n","var classof = require('../internals/classof-raw');\n\n// `IsArray` abstract operation\n// https://tc39.github.io/ecma262/#sec-isarray\nmodule.exports = Array.isArray || function isArray(arg) {\n return classof(arg) == 'Array';\n};\n","var fails = require('../internals/fails');\n\nvar replacement = /#|\\.prototype\\./;\n\nvar isForced = function (feature, detection) {\n var value = data[normalize(feature)];\n return value == POLYFILL ? true\n : value == NATIVE ? false\n : typeof detection == 'function' ? fails(detection)\n : !!detection;\n};\n\nvar normalize = isForced.normalize = function (string) {\n return String(string).replace(replacement, '.').toLowerCase();\n};\n\nvar data = isForced.data = {};\nvar NATIVE = isForced.NATIVE = 'N';\nvar POLYFILL = isForced.POLYFILL = 'P';\n\nmodule.exports = isForced;\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","module.exports = false;\n","var isObject = require('../internals/is-object');\nvar classof = require('../internals/classof-raw');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar MATCH = wellKnownSymbol('match');\n\n// `IsRegExp` abstract operation\n// https://tc39.github.io/ecma262/#sec-isregexp\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : classof(it) == 'RegExp');\n};\n","var anObject = require('../internals/an-object');\nvar isArrayIteratorMethod = require('../internals/is-array-iterator-method');\nvar toLength = require('../internals/to-length');\nvar bind = require('../internals/bind-context');\nvar getIteratorMethod = require('../internals/get-iterator-method');\nvar callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');\n\nvar BREAK = {};\n\nvar exports = module.exports = function (iterable, fn, that, ENTRIES, ITERATOR) {\n var boundFunction = bind(fn, that, ENTRIES ? 2 : 1);\n var iterator, iterFn, index, length, result, step;\n\n if (ITERATOR) {\n iterator = iterable;\n } else {\n iterFn = getIteratorMethod(iterable);\n if (typeof iterFn != 'function') throw TypeError('Target is not iterable');\n // optimisation for array iterators\n if (isArrayIteratorMethod(iterFn)) {\n for (index = 0, length = toLength(iterable.length); length > index; index++) {\n result = ENTRIES ? boundFunction(anObject(step = iterable[index])[0], step[1]) : boundFunction(iterable[index]);\n if (result === BREAK) return BREAK;\n } return;\n }\n iterator = iterFn.call(iterable);\n }\n\n while (!(step = iterator.next()).done) {\n if (callWithSafeIterationClosing(iterator, boundFunction, step.value, ENTRIES) === BREAK) return BREAK;\n }\n};\n\nexports.BREAK = BREAK;\n","'use strict';\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar hide = require('../internals/hide');\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar IS_PURE = require('../internals/is-pure');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar BUGGY_SAFARI_ITERATORS = false;\n\nvar returnThis = function () { return this; };\n\n// `%IteratorPrototype%` object\n// https://tc39.github.io/ecma262/#sec-%iteratorprototype%-object\nvar IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;\n\nif ([].keys) {\n arrayIterator = [].keys();\n // Safari 8 has buggy iterators w/o `next`\n if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;\n else {\n PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));\n if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;\n }\n}\n\nif (IteratorPrototype == undefined) IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nif (!IS_PURE && !has(IteratorPrototype, ITERATOR)) hide(IteratorPrototype, ITERATOR, returnThis);\n\nmodule.exports = {\n IteratorPrototype: IteratorPrototype,\n BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS\n};\n","var global = require('../internals/global');\nvar getOwnPropertyDescriptor = require('../internals/object-get-own-property-descriptor').f;\nvar classof = require('../internals/classof-raw');\nvar macrotask = require('../internals/task').set;\nvar userAgent = require('../internals/user-agent');\n\nvar MutationObserver = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar IS_NODE = classof(process) == 'process';\n// Node.js 11 shows ExperimentalWarning on getting `queueMicrotask`\nvar queueMicrotaskDescriptor = getOwnPropertyDescriptor(global, 'queueMicrotask');\nvar queueMicrotask = queueMicrotaskDescriptor && queueMicrotaskDescriptor.value;\n\nvar flush, head, last, notify, toggle, node, promise;\n\n// modern engines have queueMicrotask method\nif (!queueMicrotask) {\n flush = function () {\n var parent, fn;\n if (IS_NODE && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (error) {\n if (head) notify();\n else last = undefined;\n throw error;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (IS_NODE) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS - https://github.com/zloirock/core-js/issues/339\n } else if (MutationObserver && !/(iphone|ipod|ipad).*applewebkit/i.test(userAgent)) {\n toggle = true;\n node = document.createTextNode('');\n new MutationObserver(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n}\n\nmodule.exports = queueMicrotask || function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n};\n","var fails = require('../internals/fails');\n\nmodule.exports = !!Object.getOwnPropertySymbols && !fails(function () {\n // Chrome 38 Symbol has incorrect toString conversion\n // eslint-disable-next-line no-undef\n return !String(Symbol());\n});\n","var global = require('../internals/global');\nvar nativeFunctionToString = require('../internals/function-to-string');\n\nvar WeakMap = global.WeakMap;\n\nmodule.exports = typeof WeakMap === 'function' && /native code/.test(nativeFunctionToString.call(WeakMap));\n","'use strict';\nvar aFunction = require('../internals/a-function');\n\nvar PromiseCapability = function (C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n};\n\n// 25.4.1.5 NewPromiseCapability(C)\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\nvar DESCRIPTORS = require('../internals/descriptors');\nvar fails = require('../internals/fails');\nvar objectKeys = require('../internals/object-keys');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar toObject = require('../internals/to-object');\nvar IndexedObject = require('../internals/indexed-object');\n\nvar nativeAssign = Object.assign;\n\n// 19.1.2.1 Object.assign(target, source, ...)\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !nativeAssign || fails(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var symbol = Symbol();\n var alphabet = 'abcdefghijklmnopqrst';\n A[symbol] = 7;\n alphabet.split('').forEach(function (chr) { B[chr] = chr; });\n return nativeAssign({}, A)[symbol] != 7 || objectKeys(nativeAssign({}, B)).join('') != alphabet;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var argumentsLength = arguments.length;\n var index = 1;\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n var propertyIsEnumerable = propertyIsEnumerableModule.f;\n while (argumentsLength > index) {\n var S = IndexedObject(arguments[index++]);\n var keys = getOwnPropertySymbols ? objectKeys(S).concat(getOwnPropertySymbols(S)) : objectKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || propertyIsEnumerable.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : nativeAssign;\n","var anObject = require('../internals/an-object');\nvar defineProperties = require('../internals/object-define-properties');\nvar enumBugKeys = require('../internals/enum-bug-keys');\nvar hiddenKeys = require('../internals/hidden-keys');\nvar html = require('../internals/html');\nvar documentCreateElement = require('../internals/document-create-element');\nvar sharedKey = require('../internals/shared-key');\nvar IE_PROTO = sharedKey('IE_PROTO');\n\nvar PROTOTYPE = 'prototype';\nvar Empty = function () { /* empty */ };\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = documentCreateElement('iframe');\n var length = enumBugKeys.length;\n var lt = '<';\n var script = 'script';\n var gt = '>';\n var js = 'java' + script + ':';\n var iframeDocument;\n iframe.style.display = 'none';\n html.appendChild(iframe);\n iframe.src = String(js);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + script + gt + 'document.F=Object' + lt + '/' + script + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (length--) delete createDict[PROTOTYPE][enumBugKeys[length]];\n return createDict();\n};\n\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : defineProperties(result, Properties);\n};\n\nhiddenKeys[IE_PROTO] = true;\n","var DESCRIPTORS = require('../internals/descriptors');\nvar definePropertyModule = require('../internals/object-define-property');\nvar anObject = require('../internals/an-object');\nvar objectKeys = require('../internals/object-keys');\n\nmodule.exports = DESCRIPTORS ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = objectKeys(Properties);\n var length = keys.length;\n var i = 0;\n var key;\n while (length > i) definePropertyModule.f(O, key = keys[i++], Properties[key]);\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\nvar anObject = require('../internals/an-object');\nvar toPrimitive = require('../internals/to-primitive');\n\nvar nativeDefineProperty = Object.defineProperty;\n\nexports.f = DESCRIPTORS ? nativeDefineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return nativeDefineProperty(O, P, Attributes);\n } catch (error) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var DESCRIPTORS = require('../internals/descriptors');\nvar propertyIsEnumerableModule = require('../internals/object-property-is-enumerable');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar toPrimitive = require('../internals/to-primitive');\nvar has = require('../internals/has');\nvar IE8_DOM_DEFINE = require('../internals/ie8-dom-define');\n\nvar nativeGetOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\nexports.f = DESCRIPTORS ? nativeGetOwnPropertyDescriptor : function getOwnPropertyDescriptor(O, P) {\n O = toIndexedObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return nativeGetOwnPropertyDescriptor(O, P);\n } catch (error) { /* empty */ }\n if (has(O, P)) return createPropertyDescriptor(!propertyIsEnumerableModule.f.call(O, P), O[P]);\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\nvar hiddenKeys = enumBugKeys.concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return internalObjectKeys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","var has = require('../internals/has');\nvar toObject = require('../internals/to-object');\nvar sharedKey = require('../internals/shared-key');\nvar CORRECT_PROTOTYPE_GETTER = require('../internals/correct-prototype-getter');\n\nvar IE_PROTO = sharedKey('IE_PROTO');\nvar ObjectPrototype = Object.prototype;\n\n// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nmodule.exports = CORRECT_PROTOTYPE_GETTER ? Object.getPrototypeOf : function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectPrototype : null;\n};\n","var has = require('../internals/has');\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar arrayIncludes = require('../internals/array-includes');\nvar hiddenKeys = require('../internals/hidden-keys');\n\nvar arrayIndexOf = arrayIncludes(false);\n\nmodule.exports = function (object, names) {\n var O = toIndexedObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) !has(hiddenKeys, key) && has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","var internalObjectKeys = require('../internals/object-keys-internal');\nvar enumBugKeys = require('../internals/enum-bug-keys');\n\n// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nmodule.exports = Object.keys || function keys(O) {\n return internalObjectKeys(O, enumBugKeys);\n};\n","'use strict';\nvar nativePropertyIsEnumerable = {}.propertyIsEnumerable;\nvar getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor;\n\n// Nashorn ~ JDK8 bug\nvar NASHORN_BUG = getOwnPropertyDescriptor && !nativePropertyIsEnumerable.call({ 1: 2 }, 1);\n\nexports.f = NASHORN_BUG ? function propertyIsEnumerable(V) {\n var descriptor = getOwnPropertyDescriptor(this, V);\n return !!descriptor && descriptor.enumerable;\n} : nativePropertyIsEnumerable;\n","var validateSetPrototypeOfArguments = require('../internals/validate-set-prototype-of-arguments');\n\n// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nmodule.exports = Object.setPrototypeOf || ('__proto__' in {} ? function () {\n var correctSetter = false;\n var test = {};\n var setter;\n try {\n setter = Object.getOwnPropertyDescriptor(Object.prototype, '__proto__').set;\n setter.call(test, []);\n correctSetter = test instanceof Array;\n } catch (error) { /* empty */ }\n return function setPrototypeOf(O, proto) {\n validateSetPrototypeOfArguments(O, proto);\n if (correctSetter) setter.call(O, proto);\n else O.__proto__ = proto;\n return O;\n };\n}() : undefined);\n","'use strict';\nvar classof = require('../internals/classof');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar test = {};\n\ntest[TO_STRING_TAG] = 'z';\n\n// `Object.prototype.toString` method implementation\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nmodule.exports = String(test) !== '[object z]' ? function toString() {\n return '[object ' + classof(this) + ']';\n} : test.toString;\n","var global = require('../internals/global');\nvar getOwnPropertyNamesModule = require('../internals/object-get-own-property-names');\nvar getOwnPropertySymbolsModule = require('../internals/object-get-own-property-symbols');\nvar anObject = require('../internals/an-object');\n\nvar Reflect = global.Reflect;\n\n// all object keys, includes non-enumerable and symbols\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = getOwnPropertyNamesModule.f(anObject(it));\n var getOwnPropertySymbols = getOwnPropertySymbolsModule.f;\n return getOwnPropertySymbols ? keys.concat(getOwnPropertySymbols(it)) : keys;\n};\n","module.exports = require('../internals/global');\n","module.exports = function (exec) {\n try {\n return { error: false, value: exec() };\n } catch (error) {\n return { error: true, value: error };\n }\n};\n","var anObject = require('../internals/an-object');\nvar isObject = require('../internals/is-object');\nvar newPromiseCapability = require('../internals/new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","var redefine = require('../internals/redefine');\n\nmodule.exports = function (target, src, options) {\n for (var key in src) redefine(target, key, src[key], options);\n return target;\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar hide = require('../internals/hide');\nvar has = require('../internals/has');\nvar setGlobal = require('../internals/set-global');\nvar nativeFunctionToString = require('../internals/function-to-string');\nvar InternalStateModule = require('../internals/internal-state');\n\nvar getInternalState = InternalStateModule.get;\nvar enforceInternalState = InternalStateModule.enforce;\nvar TEMPLATE = String(nativeFunctionToString).split('toString');\n\nshared('inspectSource', function (it) {\n return nativeFunctionToString.call(it);\n});\n\n(module.exports = function (O, key, value, options) {\n var unsafe = options ? !!options.unsafe : false;\n var simple = options ? !!options.enumerable : false;\n var noTargetGet = options ? !!options.noTargetGet : false;\n if (typeof value == 'function') {\n if (typeof key == 'string' && !has(value, 'name')) hide(value, 'name', key);\n enforceInternalState(value).source = TEMPLATE.join(typeof key == 'string' ? key : '');\n }\n if (O === global) {\n if (simple) O[key] = value;\n else setGlobal(key, value);\n return;\n } else if (!unsafe) {\n delete O[key];\n } else if (!noTargetGet && O[key]) {\n simple = true;\n }\n if (simple) O[key] = value;\n else hide(O, key, value);\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, 'toString', function toString() {\n return typeof this == 'function' && getInternalState(this).source || nativeFunctionToString.call(this);\n});\n","// `RequireObjectCoercible` abstract operation\n// https://tc39.github.io/ecma262/#sec-requireobjectcoercible\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","var global = require('../internals/global');\nvar hide = require('../internals/hide');\n\nmodule.exports = function (key, value) {\n try {\n hide(global, key, value);\n } catch (error) {\n global[key] = value;\n } return value;\n};\n","'use strict';\nvar getBuiltIn = require('../internals/get-built-in');\nvar definePropertyModule = require('../internals/object-define-property');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\nvar DESCRIPTORS = require('../internals/descriptors');\n\nvar SPECIES = wellKnownSymbol('species');\n\nmodule.exports = function (CONSTRUCTOR_NAME) {\n var C = getBuiltIn(CONSTRUCTOR_NAME);\n var defineProperty = definePropertyModule.f;\n if (DESCRIPTORS && C && !C[SPECIES]) defineProperty(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","var defineProperty = require('../internals/object-define-property').f;\nvar has = require('../internals/has');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\n\nmodule.exports = function (it, TAG, STATIC) {\n if (it && !has(it = STATIC ? it : it.prototype, TO_STRING_TAG)) {\n defineProperty(it, TO_STRING_TAG, { configurable: true, value: TAG });\n }\n};\n","var shared = require('../internals/shared');\nvar uid = require('../internals/uid');\n\nvar keys = shared('keys');\n\nmodule.exports = function (key) {\n return keys[key] || (keys[key] = uid(key));\n};\n","var global = require('../internals/global');\nvar setGlobal = require('../internals/set-global');\nvar IS_PURE = require('../internals/is-pure');\n\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || setGlobal(SHARED, {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: '3.1.3',\n mode: IS_PURE ? 'pure' : 'global',\n copyright: '© 2019 Denis Pushkarev (zloirock.ru)'\n});\n","var anObject = require('../internals/an-object');\nvar aFunction = require('../internals/a-function');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\n\n// `SpeciesConstructor` abstract operation\n// https://tc39.github.io/ecma262/#sec-speciesconstructor\nmodule.exports = function (O, defaultConstructor) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? defaultConstructor : aFunction(S);\n};\n","var toInteger = require('../internals/to-integer');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\n// CONVERT_TO_STRING: true -> String#at\n// CONVERT_TO_STRING: false -> String#codePointAt\nmodule.exports = function (that, pos, CONVERT_TO_STRING) {\n var S = String(requireObjectCoercible(that));\n var position = toInteger(pos);\n var size = S.length;\n var first, second;\n if (position < 0 || position >= size) return CONVERT_TO_STRING ? '' : undefined;\n first = S.charCodeAt(position);\n return first < 0xD800 || first > 0xDBFF || position + 1 === size\n || (second = S.charCodeAt(position + 1)) < 0xDC00 || second > 0xDFFF\n ? CONVERT_TO_STRING ? S.charAt(position) : first\n : CONVERT_TO_STRING ? S.slice(position, position + 2) : (first - 0xD800 << 10) + (second - 0xDC00) + 0x10000;\n};\n","var global = require('../internals/global');\nvar fails = require('../internals/fails');\nvar classof = require('../internals/classof-raw');\nvar bind = require('../internals/bind-context');\nvar html = require('../internals/html');\nvar createElement = require('../internals/document-create-element');\n\nvar location = global.location;\nvar set = global.setImmediate;\nvar clear = global.clearImmediate;\nvar process = global.process;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\n\nvar run = function (id) {\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\n\nvar runner = function (id) {\n return function () {\n run(id);\n };\n};\n\nvar listener = function (event) {\n run(event.data);\n};\n\nvar post = function (id) {\n // old engines have not location.origin\n global.postMessage(id + '', location.protocol + '//' + location.host);\n};\n\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!set || !clear) {\n set = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(undefined, args);\n };\n defer(counter);\n return counter;\n };\n clear = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (classof(process) == 'process') {\n defer = function (id) {\n process.nextTick(runner(id));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(runner(id));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = bind(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts && !fails(post)) {\n defer = post;\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in createElement('script')) {\n defer = function (id) {\n html.appendChild(createElement('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(runner(id), 0);\n };\n }\n}\n\nmodule.exports = {\n set: set,\n clear: clear\n};\n","var toInteger = require('../internals/to-integer');\n\nvar max = Math.max;\nvar min = Math.min;\n\n// Helper for a popular repeating case of the spec:\n// Let integer be ? ToInteger(index).\n// If integer < 0, let result be max((length + integer), 0); else let result be min(length, length).\nmodule.exports = function (index, length) {\n var integer = toInteger(index);\n return integer < 0 ? max(integer + length, 0) : min(integer, length);\n};\n","// toObject with fallback for non-array-like ES3 strings\nvar IndexedObject = require('../internals/indexed-object');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (it) {\n return IndexedObject(requireObjectCoercible(it));\n};\n","var ceil = Math.ceil;\nvar floor = Math.floor;\n\n// `ToInteger` abstract operation\n// https://tc39.github.io/ecma262/#sec-tointeger\nmodule.exports = function (argument) {\n return isNaN(argument = +argument) ? 0 : (argument > 0 ? floor : ceil)(argument);\n};\n","var toInteger = require('../internals/to-integer');\n\nvar min = Math.min;\n\n// `ToLength` abstract operation\n// https://tc39.github.io/ecma262/#sec-tolength\nmodule.exports = function (argument) {\n return argument > 0 ? min(toInteger(argument), 0x1FFFFFFFFFFFFF) : 0; // 2 ** 53 - 1 == 9007199254740991\n};\n","var requireObjectCoercible = require('../internals/require-object-coercible');\n\n// `ToObject` abstract operation\n// https://tc39.github.io/ecma262/#sec-toobject\nmodule.exports = function (argument) {\n return Object(requireObjectCoercible(argument));\n};\n","var isObject = require('../internals/is-object');\n\n// 7.1.1 ToPrimitive(input [, PreferredType])\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","var id = 0;\nvar postfix = Math.random();\n\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + postfix).toString(36));\n};\n","var global = require('../internals/global');\n\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var isObject = require('../internals/is-object');\nvar anObject = require('../internals/an-object');\n\nmodule.exports = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) {\n throw TypeError(\"Can't set \" + String(proto) + ' as a prototype');\n }\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('../internals/is-regexp');\nvar requireObjectCoercible = require('../internals/require-object-coercible');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) {\n throw TypeError('String.prototype.' + NAME + \" doesn't accept regex\");\n } return String(requireObjectCoercible(that));\n};\n","var global = require('../internals/global');\nvar shared = require('../internals/shared');\nvar uid = require('../internals/uid');\nvar NATIVE_SYMBOL = require('../internals/native-symbol');\n\nvar Symbol = global.Symbol;\nvar store = shared('wks');\n\nmodule.exports = function (name) {\n return store[name] || (store[name] = NATIVE_SYMBOL && Symbol[name]\n || (NATIVE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n","exports.f = require('../internals/well-known-symbol');\n","'use strict';\nvar $ = require('../internals/export');\nvar arrayMethods = require('../internals/array-methods');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar internalFind = arrayMethods(5);\nvar FIND = 'find';\nvar SKIPS_HOLES = true;\n\n// Shouldn't skip holes\nif (FIND in []) Array(1)[FIND](function () { SKIPS_HOLES = false; });\n\n// `Array.prototype.find` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.find\n$({ target: 'Array', proto: true, forced: SKIPS_HOLES }, {\n find: function find(callbackfn /* , that = undefined */) {\n return internalFind(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables(FIND);\n","var $ = require('../internals/export');\nvar from = require('../internals/array-from');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\n\nvar INCORRECT_ITERATION = !checkCorrectnessOfIteration(function (iterable) {\n Array.from(iterable);\n});\n\n// `Array.from` method\n// https://tc39.github.io/ecma262/#sec-array.from\n$({ target: 'Array', stat: true, forced: INCORRECT_ITERATION }, {\n from: from\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar arrayIncludes = require('../internals/array-includes');\nvar addToUnscopables = require('../internals/add-to-unscopables');\n\nvar internalIncludes = arrayIncludes(true);\n\n// `Array.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.includes\n$({ target: 'Array', proto: true }, {\n includes: function includes(el /* , fromIndex = 0 */) {\n return internalIncludes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('includes');\n","'use strict';\nvar toIndexedObject = require('../internals/to-indexed-object');\nvar addToUnscopables = require('../internals/add-to-unscopables');\nvar Iterators = require('../internals/iterators');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar ARRAY_ITERATOR = 'Array Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(ARRAY_ITERATOR);\n\n// `Array.prototype.entries` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.entries\n// `Array.prototype.keys` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.keys\n// `Array.prototype.values` method\n// https://tc39.github.io/ecma262/#sec-array.prototype.values\n// `Array.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@iterator\n// `CreateArrayIterator` internal method\n// https://tc39.github.io/ecma262/#sec-createarrayiterator\nmodule.exports = defineIterator(Array, 'Array', function (iterated, kind) {\n setInternalState(this, {\n type: ARRAY_ITERATOR,\n target: toIndexedObject(iterated), // target\n index: 0, // next index\n kind: kind // kind\n });\n// `%ArrayIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%arrayiteratorprototype%.next\n}, function () {\n var state = getInternalState(this);\n var target = state.target;\n var kind = state.kind;\n var index = state.index++;\n if (!target || index >= target.length) {\n state.target = undefined;\n return { value: undefined, done: true };\n }\n if (kind == 'keys') return { value: index, done: false };\n if (kind == 'values') return { value: target[index], done: false };\n return { value: [index, target[index]], done: false };\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values%\n// https://tc39.github.io/ecma262/#sec-createunmappedargumentsobject\n// https://tc39.github.io/ecma262/#sec-createmappedargumentsobject\nIterators.Arguments = Iterators.Array;\n\n// https://tc39.github.io/ecma262/#sec-array.prototype-@@unscopables\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","var $ = require('../internals/export');\nvar assign = require('../internals/object-assign');\n\n// `Object.assign` method\n// https://tc39.github.io/ecma262/#sec-object.assign\n$({ target: 'Object', stat: true, forced: Object.assign !== assign }, {\n assign: assign\n});\n","var redefine = require('../internals/redefine');\nvar toString = require('../internals/object-to-string');\n\nvar ObjectPrototype = Object.prototype;\n\n// `Object.prototype.toString` method\n// https://tc39.github.io/ecma262/#sec-object.prototype.tostring\nif (toString !== ObjectPrototype.toString) {\n redefine(ObjectPrototype, 'toString', toString, { unsafe: true });\n}\n","'use strict';\nvar $ = require('../internals/export');\nvar getBuiltIn = require('../internals/get-built-in');\nvar speciesConstructor = require('../internals/species-constructor');\nvar promiseResolve = require('../internals/promise-resolve');\n\n// `Promise.prototype.finally` method\n// https://tc39.github.io/ecma262/#sec-promise.prototype.finally\n$({ target: 'Promise', proto: true, real: true }, {\n 'finally': function (onFinally) {\n var C = speciesConstructor(this, getBuiltIn('Promise'));\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar IS_PURE = require('../internals/is-pure');\nvar global = require('../internals/global');\nvar path = require('../internals/path');\nvar redefineAll = require('../internals/redefine-all');\nvar setToStringTag = require('../internals/set-to-string-tag');\nvar setSpecies = require('../internals/set-species');\nvar isObject = require('../internals/is-object');\nvar aFunction = require('../internals/a-function');\nvar anInstance = require('../internals/an-instance');\nvar classof = require('../internals/classof-raw');\nvar iterate = require('../internals/iterate');\nvar checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration');\nvar speciesConstructor = require('../internals/species-constructor');\nvar task = require('../internals/task').set;\nvar microtask = require('../internals/microtask');\nvar promiseResolve = require('../internals/promise-resolve');\nvar hostReportErrors = require('../internals/host-report-errors');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar userAgent = require('../internals/user-agent');\nvar InternalStateModule = require('../internals/internal-state');\nvar isForced = require('../internals/is-forced');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar SPECIES = wellKnownSymbol('species');\nvar PROMISE = 'Promise';\nvar getInternalState = InternalStateModule.get;\nvar setInternalState = InternalStateModule.set;\nvar getInternalPromiseState = InternalStateModule.getterFor(PROMISE);\nvar PromiseConstructor = global[PROMISE];\nvar TypeError = global.TypeError;\nvar document = global.document;\nvar process = global.process;\nvar $fetch = global.fetch;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar newPromiseCapability = newPromiseCapabilityModule.f;\nvar newGenericPromiseCapability = newPromiseCapability;\nvar IS_NODE = classof(process) == 'process';\nvar DISPATCH_EVENT = !!(document && document.createEvent && global.dispatchEvent);\nvar UNHANDLED_REJECTION = 'unhandledrejection';\nvar REJECTION_HANDLED = 'rejectionhandled';\nvar PENDING = 0;\nvar FULFILLED = 1;\nvar REJECTED = 2;\nvar HANDLED = 1;\nvar UNHANDLED = 2;\nvar Internal, OwnPromiseCapability, PromiseWrapper;\n\nvar FORCED = isForced(PROMISE, function () {\n // correct subclassing with @@species support\n var promise = PromiseConstructor.resolve(1);\n var empty = function () { /* empty */ };\n var FakePromise = (promise.constructor = {})[SPECIES] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return !((IS_NODE || typeof PromiseRejectionEvent == 'function')\n && (!IS_PURE || promise['finally'])\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1);\n});\n\nvar INCORRECT_ITERATION = FORCED || !checkCorrectnessOfIteration(function (iterable) {\n PromiseConstructor.all(iterable)['catch'](function () { /* empty */ });\n});\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\n\nvar notify = function (promise, state, isReject) {\n if (state.notified) return;\n state.notified = true;\n var chain = state.reactions;\n microtask(function () {\n var value = state.value;\n var ok = state.state == FULFILLED;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (state.rejection === UNHANDLED) onHandleUnhandled(promise, state);\n state.rejection = HANDLED;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (error) {\n if (domain && !exited) domain.exit();\n reject(error);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n state.reactions = [];\n state.notified = false;\n if (isReject && !state.rejection) onUnhandled(promise, state);\n });\n};\n\nvar dispatchEvent = function (name, promise, reason) {\n var event, handler;\n if (DISPATCH_EVENT) {\n event = document.createEvent('Event');\n event.promise = promise;\n event.reason = reason;\n event.initEvent(name, false, true);\n global.dispatchEvent(event);\n } else event = { promise: promise, reason: reason };\n if (handler = global['on' + name]) handler(event);\n else if (name === UNHANDLED_REJECTION) hostReportErrors('Unhandled promise rejection', reason);\n};\n\nvar onUnhandled = function (promise, state) {\n task.call(global, function () {\n var value = state.value;\n var IS_UNHANDLED = isUnhandled(state);\n var result;\n if (IS_UNHANDLED) {\n result = perform(function () {\n if (IS_NODE) {\n process.emit('unhandledRejection', value, promise);\n } else dispatchEvent(UNHANDLED_REJECTION, promise, value);\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n state.rejection = IS_NODE || isUnhandled(state) ? UNHANDLED : HANDLED;\n if (result.error) throw result.value;\n }\n });\n};\n\nvar isUnhandled = function (state) {\n return state.rejection !== HANDLED && !state.parent;\n};\n\nvar onHandleUnhandled = function (promise, state) {\n task.call(global, function () {\n if (IS_NODE) {\n process.emit('rejectionHandled', promise);\n } else dispatchEvent(REJECTION_HANDLED, promise, state.value);\n });\n};\n\nvar bind = function (fn, promise, state, unwrap) {\n return function (value) {\n fn(promise, state, value, unwrap);\n };\n};\n\nvar internalReject = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n state.value = value;\n state.state = REJECTED;\n notify(promise, state, true);\n};\n\nvar internalResolve = function (promise, state, value, unwrap) {\n if (state.done) return;\n state.done = true;\n if (unwrap) state = unwrap;\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n var then = isThenable(value);\n if (then) {\n microtask(function () {\n var wrapper = { done: false };\n try {\n then.call(value,\n bind(internalResolve, promise, wrapper, state),\n bind(internalReject, promise, wrapper, state)\n );\n } catch (error) {\n internalReject(promise, wrapper, error, state);\n }\n });\n } else {\n state.value = value;\n state.state = FULFILLED;\n notify(promise, state, false);\n }\n } catch (error) {\n internalReject(promise, { done: false }, error, state);\n }\n};\n\n// constructor polyfill\nif (FORCED) {\n // 25.4.3.1 Promise(executor)\n PromiseConstructor = function Promise(executor) {\n anInstance(this, PromiseConstructor, PROMISE);\n aFunction(executor);\n Internal.call(this);\n var state = getInternalState(this);\n try {\n executor(bind(internalResolve, this, state), bind(internalReject, this, state));\n } catch (error) {\n internalReject(this, state, error);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n setInternalState(this, {\n type: PROMISE,\n done: false,\n notified: false,\n parent: false,\n reactions: [],\n rejection: false,\n state: PENDING,\n value: undefined\n });\n };\n Internal.prototype = redefineAll(PromiseConstructor.prototype, {\n // `Promise.prototype.then` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.then\n then: function then(onFulfilled, onRejected) {\n var state = getInternalPromiseState(this);\n var reaction = newPromiseCapability(speciesConstructor(this, PromiseConstructor));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = IS_NODE ? process.domain : undefined;\n state.parent = true;\n state.reactions.push(reaction);\n if (state.state != PENDING) notify(this, state, false);\n return reaction.promise;\n },\n // `Promise.prototype.catch` method\n // https://tc39.github.io/ecma262/#sec-promise.prototype.catch\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n var state = getInternalState(promise);\n this.promise = promise;\n this.resolve = bind(internalResolve, promise, state);\n this.reject = bind(internalReject, promise, state);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === PromiseConstructor || C === PromiseWrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n\n // wrap fetch result\n if (!IS_PURE && typeof $fetch == 'function') $({ global: true, enumerable: true, forced: true }, {\n // eslint-disable-next-line no-unused-vars\n fetch: function fetch(input) {\n return promiseResolve(PromiseConstructor, $fetch.apply(global, arguments));\n }\n });\n}\n\n$({ global: true, wrap: true, forced: FORCED }, {\n Promise: PromiseConstructor\n});\n\nsetToStringTag(PromiseConstructor, PROMISE, false, true);\nsetSpecies(PROMISE);\n\nPromiseWrapper = path[PROMISE];\n\n// statics\n$({ target: PROMISE, stat: true, forced: FORCED }, {\n // `Promise.reject` method\n // https://tc39.github.io/ecma262/#sec-promise.reject\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n capability.reject.call(undefined, r);\n return capability.promise;\n }\n});\n\n$({ target: PROMISE, stat: true, forced: IS_PURE || FORCED }, {\n // `Promise.resolve` method\n // https://tc39.github.io/ecma262/#sec-promise.resolve\n resolve: function resolve(x) {\n return promiseResolve(IS_PURE && this === PromiseWrapper ? PromiseConstructor : this, x);\n }\n});\n\n$({ target: PROMISE, stat: true, forced: INCORRECT_ITERATION }, {\n // `Promise.all` method\n // https://tc39.github.io/ecma262/#sec-promise.all\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n $promiseResolve.call(C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n },\n // `Promise.race` method\n // https://tc39.github.io/ecma262/#sec-promise.race\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n var $promiseResolve = aFunction(C.resolve);\n iterate(iterable, function (promise) {\n $promiseResolve.call(C, promise).then(capability.resolve, reject);\n });\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar validateArguments = require('../internals/validate-string-method-arguments');\nvar correctIsRegExpLogic = require('../internals/correct-is-regexp-logic');\n\n// `String.prototype.includes` method\n// https://tc39.github.io/ecma262/#sec-string.prototype.includes\n$({ target: 'String', proto: true, forced: !correctIsRegExpLogic('includes') }, {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~validateArguments(this, searchString, 'includes')\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\nvar codePointAt = require('../internals/string-at');\nvar InternalStateModule = require('../internals/internal-state');\nvar defineIterator = require('../internals/define-iterator');\n\nvar STRING_ITERATOR = 'String Iterator';\nvar setInternalState = InternalStateModule.set;\nvar getInternalState = InternalStateModule.getterFor(STRING_ITERATOR);\n\n// `String.prototype[@@iterator]` method\n// https://tc39.github.io/ecma262/#sec-string.prototype-@@iterator\ndefineIterator(String, 'String', function (iterated) {\n setInternalState(this, {\n type: STRING_ITERATOR,\n string: String(iterated),\n index: 0\n });\n// `%StringIteratorPrototype%.next` method\n// https://tc39.github.io/ecma262/#sec-%stringiteratorprototype%.next\n}, function next() {\n var state = getInternalState(this);\n var string = state.string;\n var index = state.index;\n var point;\n if (index >= string.length) return { value: undefined, done: true };\n point = codePointAt(string, index, true);\n state.index += point.length;\n return { value: point, done: false };\n});\n","var defineWellKnownSymbol = require('../internals/define-well-known-symbol');\n\n// `Symbol.iterator` well-known symbol\n// https://tc39.github.io/ecma262/#sec-symbol.iterator\ndefineWellKnownSymbol('iterator');\n","var $ = require('../internals/export');\nvar getPrototypeOf = require('../internals/object-get-prototype-of');\nvar setPrototypeOf = require('../internals/object-set-prototype-of');\nvar create = require('../internals/object-create');\nvar createPropertyDescriptor = require('../internals/create-property-descriptor');\nvar iterate = require('../internals/iterate');\nvar hide = require('../internals/hide');\n\nvar $AggregateError = function AggregateError(errors, message) {\n var that = this;\n if (!(that instanceof $AggregateError)) return new $AggregateError(errors, message);\n if (setPrototypeOf) {\n that = setPrototypeOf(new Error(message), getPrototypeOf(that));\n }\n var errorsArray = [];\n iterate(errors, errorsArray.push, errorsArray);\n that.errors = errorsArray;\n if (message !== undefined) hide(that, 'message', String(message));\n return that;\n};\n\n$AggregateError.prototype = create(Error.prototype, {\n constructor: createPropertyDescriptor(5, $AggregateError),\n name: createPropertyDescriptor(5, 'AggregateError')\n});\n\n$({ global: true }, {\n AggregateError: $AggregateError\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aFunction = require('../internals/a-function');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\n\n// `Promise.allSettled` method\n// https://github.com/tc39/proposal-promise-allSettled\n$({ target: 'Promise', stat: true }, {\n allSettled: function allSettled(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aFunction(C.resolve);\n var values = [];\n var counter = 0;\n var remaining = 1;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n promiseResolve.call(C, promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'fulfilled', value: value };\n --remaining || resolve(values);\n }, function (e) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[index] = { status: 'rejected', reason: e };\n --remaining || resolve(values);\n });\n });\n --remaining || resolve(values);\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar aFunction = require('../internals/a-function');\nvar getBuiltIn = require('../internals/get-built-in');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\nvar iterate = require('../internals/iterate');\n\nvar PROMISE_ANY_ERROR = 'No one promise resolved';\n\n// `Promise.any` method\n// https://github.com/tc39/proposal-promise-any\n$({ target: 'Promise', stat: true }, {\n any: function any(iterable) {\n var C = this;\n var capability = newPromiseCapabilityModule.f(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var promiseResolve = aFunction(C.resolve);\n var errors = [];\n var counter = 0;\n var remaining = 1;\n var alreadyResolved = false;\n iterate(iterable, function (promise) {\n var index = counter++;\n var alreadyRejected = false;\n errors.push(undefined);\n remaining++;\n promiseResolve.call(C, promise).then(function (value) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyResolved = true;\n resolve(value);\n }, function (e) {\n if (alreadyRejected || alreadyResolved) return;\n alreadyRejected = true;\n errors[index] = e;\n --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR));\n });\n });\n --remaining || reject(new (getBuiltIn('AggregateError'))(errors, PROMISE_ANY_ERROR));\n });\n if (result.error) reject(result.value);\n return capability.promise;\n }\n});\n","'use strict';\nvar $ = require('../internals/export');\nvar newPromiseCapabilityModule = require('../internals/new-promise-capability');\nvar perform = require('../internals/perform');\n\n// `Promise.try` method\n// https://github.com/tc39/proposal-promise-try\n$({ target: 'Promise', stat: true }, {\n 'try': function (callbackfn) {\n var promiseCapability = newPromiseCapabilityModule.f(this);\n var result = perform(callbackfn);\n (result.error ? promiseCapability.reject : promiseCapability.resolve)(result.value);\n return promiseCapability.promise;\n }\n});\n","var global = require('../internals/global');\nvar DOMIterables = require('../internals/dom-iterables');\nvar ArrayIteratorMethods = require('../modules/es.array.iterator');\nvar hide = require('../internals/hide');\nvar wellKnownSymbol = require('../internals/well-known-symbol');\n\nvar ITERATOR = wellKnownSymbol('iterator');\nvar TO_STRING_TAG = wellKnownSymbol('toStringTag');\nvar ArrayValues = ArrayIteratorMethods.values;\n\nfor (var COLLECTION_NAME in DOMIterables) {\n var Collection = global[COLLECTION_NAME];\n var CollectionPrototype = Collection && Collection.prototype;\n if (CollectionPrototype) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[ITERATOR] !== ArrayValues) try {\n hide(CollectionPrototype, ITERATOR, ArrayValues);\n } catch (error) {\n CollectionPrototype[ITERATOR] = ArrayValues;\n }\n if (!CollectionPrototype[TO_STRING_TAG]) hide(CollectionPrototype, TO_STRING_TAG, COLLECTION_NAME);\n if (DOMIterables[COLLECTION_NAME]) for (var METHOD_NAME in ArrayIteratorMethods) {\n // some Chrome versions have non-configurable methods on DOMTokenList\n if (CollectionPrototype[METHOD_NAME] !== ArrayIteratorMethods[METHOD_NAME]) try {\n hide(CollectionPrototype, METHOD_NAME, ArrayIteratorMethods[METHOD_NAME]);\n } catch (error) {\n CollectionPrototype[METHOD_NAME] = ArrayIteratorMethods[METHOD_NAME];\n }\n }\n }\n}\n","/**\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(function() {\n'use strict';\n\n// Exit early if we're not running in a browser.\nif (typeof window !== 'object') {\n return;\n}\n\n// Exit 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 * Returns the embedding frame element, if any.\n * @param {!Document} doc\n * @return {!Element}\n */\nfunction getFrameElement(doc) {\n try {\n return doc.defaultView && doc.defaultView.frameElement || null;\n } catch (e) {\n // Ignore the error.\n return null;\n }\n}\n\n/**\n * A local reference to the root document.\n */\nvar document = (function(startDoc) {\n var doc = startDoc;\n var frame = getFrameElement(doc);\n while (frame) {\n doc = frame.ownerDocument;\n frame = getFrameElement(doc);\n }\n return doc;\n})(window.document);\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 * The signal updater for cross-origin intersection. When not null, it means\n * that the polyfill is configured to work in a cross-origin mode.\n * @type {function(DOMRect|ClientRect, DOMRect|ClientRect)}\n */\nvar crossOriginUpdater = null;\n\n/**\n * The current cross-origin intersection. Only used in the cross-origin mode.\n * @type {DOMRect|ClientRect}\n */\nvar crossOriginRect = null;\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 = ensureDOMRect(entry.rootBounds);\n this.boundingClientRect = ensureDOMRect(entry.boundingClientRect);\n this.intersectionRect = ensureDOMRect(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 /** @private @const {!Array} */\n this._monitoringDocuments = [];\n /** @private @const {!Array} */\n this._monitoringUnsubscribes = [];\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 * Sets up the polyfill in the cross-origin mode. The result is the\n * updater function that accepts two arguments: `boundingClientRect` and\n * `intersectionRect` - just as these fields would be available to the\n * parent via `IntersectionObserverEntry`. This function should be called\n * each time the iframe receives intersection information from the parent\n * window, e.g. via messaging.\n * @return {function(DOMRect|ClientRect, DOMRect|ClientRect)}\n */\nIntersectionObserver._setupCrossOriginUpdater = function() {\n if (!crossOriginUpdater) {\n /**\n * @param {DOMRect|ClientRect} boundingClientRect\n * @param {DOMRect|ClientRect} intersectionRect\n */\n crossOriginUpdater = function(boundingClientRect, intersectionRect) {\n if (!boundingClientRect || !intersectionRect) {\n crossOriginRect = getEmptyRect();\n } else {\n crossOriginRect = convertFromParentRect(boundingClientRect, intersectionRect);\n }\n registry.forEach(function(observer) {\n observer._checkForIntersections();\n });\n };\n }\n return crossOriginUpdater;\n};\n\n\n/**\n * Resets the cross-origin mode.\n */\nIntersectionObserver._resetCrossOriginUpdater = function() {\n crossOriginUpdater = null;\n crossOriginRect = null;\n};\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(target.ownerDocument);\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 return item.element != target;\n });\n this._unmonitorIntersections(target.ownerDocument);\n if (this._observationTargets.length == 0) {\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._unmonitorAllIntersections();\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} 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 * @param {!Document} doc\n * @private\n */\nIntersectionObserver.prototype._monitorIntersections = function(doc) {\n var win = doc.defaultView;\n if (!win) {\n // Already destroyed.\n return;\n }\n if (this._monitoringDocuments.indexOf(doc) != -1) {\n // Already monitoring.\n return;\n }\n\n // Private state for monitoring.\n var callback = this._checkForIntersections;\n var monitoringInterval = null;\n var domObserver = null;\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 monitoringInterval = win.setInterval(callback, this.POLL_INTERVAL);\n } else {\n addEvent(win, 'resize', callback, true);\n addEvent(doc, 'scroll', callback, true);\n if (this.USE_MUTATION_OBSERVER && 'MutationObserver' in win) {\n domObserver = new win.MutationObserver(callback);\n domObserver.observe(doc, {\n attributes: true,\n childList: true,\n characterData: true,\n subtree: true\n });\n }\n }\n\n this._monitoringDocuments.push(doc);\n this._monitoringUnsubscribes.push(function() {\n // Get the window object again. When a friendly iframe is destroyed, it\n // will be null.\n var win = doc.defaultView;\n\n if (win) {\n if (monitoringInterval) {\n win.clearInterval(monitoringInterval);\n }\n removeEvent(win, 'resize', callback, true);\n }\n\n removeEvent(doc, 'scroll', callback, true);\n if (domObserver) {\n domObserver.disconnect();\n }\n });\n\n // Also monitor the parent.\n if (doc != (this.root && this.root.ownerDocument || document)) {\n var frame = getFrameElement(doc);\n if (frame) {\n this._monitorIntersections(frame.ownerDocument);\n }\n }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @param {!Document} doc\n * @private\n */\nIntersectionObserver.prototype._unmonitorIntersections = function(doc) {\n var index = this._monitoringDocuments.indexOf(doc);\n if (index == -1) {\n return;\n }\n\n var rootDoc = (this.root && this.root.ownerDocument || document);\n\n // Check if any dependent targets are still remaining.\n var hasDependentTargets =\n this._observationTargets.some(function(item) {\n var itemDoc = item.element.ownerDocument;\n // Target is in this context.\n if (itemDoc == doc) {\n return true;\n }\n // Target is nested in this context.\n while (itemDoc && itemDoc != rootDoc) {\n var frame = getFrameElement(itemDoc);\n itemDoc = frame && frame.ownerDocument;\n if (itemDoc == doc) {\n return true;\n }\n }\n return false;\n });\n if (hasDependentTargets) {\n return;\n }\n\n // Unsubscribe.\n var unsubscribe = this._monitoringUnsubscribes[index];\n this._monitoringDocuments.splice(index, 1);\n this._monitoringUnsubscribes.splice(index, 1);\n unsubscribe();\n\n // Also unmonitor the parent.\n if (doc != rootDoc) {\n var frame = getFrameElement(doc);\n if (frame) {\n this._unmonitorIntersections(frame.ownerDocument);\n }\n }\n};\n\n\n/**\n * Stops polling for intersection changes.\n * @param {!Document} doc\n * @private\n */\nIntersectionObserver.prototype._unmonitorAllIntersections = function() {\n var unsubscribes = this._monitoringUnsubscribes.slice(0);\n this._monitoringDocuments.length = 0;\n this._monitoringUnsubscribes.length = 0;\n for (var i = 0; i < unsubscribes.length; i++) {\n unsubscribes[i]();\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 if (!this.root && crossOriginUpdater && !crossOriginRect) {\n // Cross origin monitoring, but no initial data available yet.\n return;\n }\n\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, targetRect, rootRect);\n\n var newEntry = item.entry = new IntersectionObserverEntry({\n time: now(),\n target: target,\n boundingClientRect: targetRect,\n rootBounds: crossOriginUpdater && !this.root ? null : 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} targetRect The bounding rect of the target.\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, targetRect, rootRect) {\n // If the element isn't displayed, an intersection can't happen.\n if (window.getComputedStyle(target).display == 'none') return;\n\n var intersectionRect = targetRect;\n var parent = getParentNode(target);\n var atRoot = false;\n\n while (!atRoot && parent) {\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 null;\n\n if (parent == this.root || parent.nodeType == /* DOCUMENT */ 9) {\n atRoot = true;\n if (parent == this.root || parent == document) {\n if (crossOriginUpdater && !this.root) {\n if (!crossOriginRect ||\n crossOriginRect.width == 0 && crossOriginRect.height == 0) {\n // A 0-size cross-origin intersection means no-intersection.\n parent = null;\n parentRect = null;\n intersectionRect = null;\n } else {\n parentRect = crossOriginRect;\n }\n } else {\n parentRect = rootRect;\n }\n } else {\n // Check if there's a frame that can be navigated to.\n var frame = getParentNode(parent);\n var frameRect = frame && getBoundingClientRect(frame);\n var frameIntersect =\n frame &&\n this._computeTargetAndRootIntersection(frame, frameRect, rootRect);\n if (frameRect && frameIntersect) {\n parent = frame;\n parentRect = convertFromParentRect(frameRect, frameIntersect);\n } else {\n parent = null;\n intersectionRect = null;\n }\n }\n } else {\n // If the element has a non-visible overflow, and it's not the \n // or element, update the intersection rect.\n // Note: and cannot be clipped to a rect that's not also\n // the document rect, so no need to compute a new intersection.\n var doc = parent.ownerDocument;\n if (parent != doc.body &&\n parent != doc.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 parent = 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 {ClientRect} 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 / 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 {DOMRect|ClientRect} rect The rect object to expand.\n * @return {ClientRect} 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 (!this.root || this.root.ownerDocument == target.ownerDocument);\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|?ClientRect} The intersection rect or undefined if no\n * intersection 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 } || null;\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 {DOMRect|ClientRect} 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 {ClientRect} 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/**\n * Ensure that the result has all of the necessary fields of the DOMRect.\n * Specifically this ensures that `x` and `y` fields are set.\n *\n * @param {?DOMRect|?ClientRect} rect\n * @return {?DOMRect}\n */\nfunction ensureDOMRect(rect) {\n // A `DOMRect` object has `x` and `y` fields.\n if (!rect || 'x' in rect) {\n return rect;\n }\n // A IE's `ClientRect` type does not have `x` and `y`. The same is the case\n // for internally calculated Rect objects. For the purposes of\n // `IntersectionObserver`, it's sufficient to simply mirror `left` and `top`\n // for these fields.\n return {\n top: rect.top,\n y: rect.top,\n bottom: rect.bottom,\n left: rect.left,\n x: rect.left,\n right: rect.right,\n width: rect.width,\n height: rect.height\n };\n}\n\n\n/**\n * Inverts the intersection and bounding rect from the parent (frame) BCR to\n * the local BCR space.\n * @param {DOMRect|ClientRect} parentBoundingRect The parent's bound client rect.\n * @param {DOMRect|ClientRect} parentIntersectionRect The parent's own intersection rect.\n * @return {ClientRect} The local root bounding rect for the parent's children.\n */\nfunction convertFromParentRect(parentBoundingRect, parentIntersectionRect) {\n var top = parentIntersectionRect.top - parentBoundingRect.top;\n var left = parentIntersectionRect.left - parentBoundingRect.left;\n return {\n top: top,\n left: left,\n height: parentIntersectionRect.height,\n width: parentIntersectionRect.width,\n bottom: top + parentIntersectionRect.height,\n right: left + parentIntersectionRect.width\n };\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 (node.nodeType == /* DOCUMENT */ 9 && node != document) {\n // If this node is a document node, look for the embedding frame.\n return getFrameElement(node);\n }\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\n if (parent && parent.assignedSlot) {\n // If the parent is distributed in a , return the parent of a slot.\n return parent.assignedSlot.parentNode;\n }\n\n return parent;\n}\n\n\n// Exposes the constructors globally.\nwindow.IntersectionObserver = IntersectionObserver;\nwindow.IntersectionObserverEntry = IntersectionObserverEntry;\n\n}());\n","(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse {\n\t\tvar a = factory();\n\t\tfor(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];\n\t}\n})(typeof self !== 'undefined' ? self : this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(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, __webpack_require__);\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__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, {\n/******/ \t\t\t\tconfigurable: false,\n/******/ \t\t\t\tenumerable: true,\n/******/ \t\t\t\tget: getter\n/******/ \t\t\t});\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.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__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 7);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\n\nvar _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; /* globals jQuery */\n\nexports.lory = lory;\n\nvar _detectPrefixes = __webpack_require__(1);\n\nvar _detectPrefixes2 = _interopRequireDefault(_detectPrefixes);\n\nvar _detectSupportsPassive = __webpack_require__(2);\n\nvar _detectSupportsPassive2 = _interopRequireDefault(_detectSupportsPassive);\n\nvar _dispatchEvent = __webpack_require__(3);\n\nvar _dispatchEvent2 = _interopRequireDefault(_dispatchEvent);\n\nvar _defaults = __webpack_require__(6);\n\nvar _defaults2 = _interopRequireDefault(_defaults);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nvar slice = Array.prototype.slice;\n\nfunction lory(slider, opts) {\n var position = void 0;\n var slidesWidth = void 0;\n var frameWidth = void 0;\n var slides = void 0;\n\n /**\n * slider DOM elements\n */\n var frame = void 0;\n var slideContainer = void 0;\n var prevCtrl = void 0;\n var nextCtrl = void 0;\n var prefixes = void 0;\n var transitionEndCallback = void 0;\n\n var index = 0;\n var options = {};\n var touchEventParams = (0, _detectSupportsPassive2.default)() ? { passive: true } : false;\n\n /**\n * if object is jQuery convert to native DOM element\n */\n if (typeof jQuery !== 'undefined' && slider instanceof jQuery) {\n slider = slider[0];\n }\n\n /**\n * private\n * set active class to element which is the current slide\n */\n function setActiveElement(slides, currentIndex) {\n var _options = options,\n classNameActiveSlide = _options.classNameActiveSlide;\n\n\n slides.forEach(function (element, index) {\n if (element.classList.contains(classNameActiveSlide)) {\n element.classList.remove(classNameActiveSlide);\n }\n });\n\n slides[currentIndex].classList.add(classNameActiveSlide);\n }\n\n /**\n * private\n * setupInfinite: function to setup if infinite is set\n *\n * @param {array} slideArray\n * @return {array} array of updated slideContainer elements\n */\n function setupInfinite(slideArray) {\n var _options2 = options,\n infinite = _options2.infinite;\n\n\n var front = slideArray.slice(0, infinite);\n var back = slideArray.slice(slideArray.length - infinite, slideArray.length);\n\n front.forEach(function (element) {\n var cloned = element.cloneNode(true);\n\n slideContainer.appendChild(cloned);\n });\n\n back.reverse().forEach(function (element) {\n var cloned = element.cloneNode(true);\n\n slideContainer.insertBefore(cloned, slideContainer.firstChild);\n });\n\n slideContainer.addEventListener(prefixes.transitionEnd, onTransitionEnd);\n\n return slice.call(slideContainer.children);\n }\n\n /**\n * [dispatchSliderEvent description]\n * @return {[type]} [description]\n */\n function dispatchSliderEvent(phase, type, detail) {\n (0, _dispatchEvent2.default)(slider, phase + '.lory.' + type, detail);\n }\n\n /**\n * translates to a given position in a given time in milliseconds\n *\n * @to {number} number in pixels where to translate to\n * @duration {number} time in milliseconds for the transistion\n * @ease {string} easing css property\n */\n function translate(to, duration, ease) {\n var style = slideContainer && slideContainer.style;\n\n if (style) {\n style[prefixes.transition + 'TimingFunction'] = ease;\n style[prefixes.transition + 'Duration'] = duration + 'ms';\n style[prefixes.transform] = 'translateX(' + to + 'px)';\n }\n }\n\n /**\n * returns an element's width\n */\n function elementWidth(element) {\n return element.getBoundingClientRect().width || element.offsetWidth;\n }\n\n /**\n * slidefunction called by prev, next & touchend\n *\n * determine nextIndex and slide to next postion\n * under restrictions of the defined options\n *\n * @direction {boolean}\n */\n function slide(nextIndex, direction) {\n var _options3 = options,\n slideSpeed = _options3.slideSpeed,\n slidesToScroll = _options3.slidesToScroll,\n infinite = _options3.infinite,\n rewind = _options3.rewind,\n rewindPrev = _options3.rewindPrev,\n rewindSpeed = _options3.rewindSpeed,\n ease = _options3.ease,\n classNameActiveSlide = _options3.classNameActiveSlide,\n _options3$classNameDi = _options3.classNameDisabledNextCtrl,\n classNameDisabledNextCtrl = _options3$classNameDi === undefined ? 'disabled' : _options3$classNameDi,\n _options3$classNameDi2 = _options3.classNameDisabledPrevCtrl,\n classNameDisabledPrevCtrl = _options3$classNameDi2 === undefined ? 'disabled' : _options3$classNameDi2;\n\n\n var duration = slideSpeed;\n\n var nextSlide = direction ? index + 1 : index - 1;\n var maxOffset = Math.round(slidesWidth - frameWidth);\n\n dispatchSliderEvent('before', 'slide', {\n index: index,\n nextSlide: nextSlide\n });\n\n /**\n * Reset control classes\n */\n if (prevCtrl) {\n prevCtrl.classList.remove(classNameDisabledPrevCtrl);\n }\n if (nextCtrl) {\n nextCtrl.classList.remove(classNameDisabledNextCtrl);\n }\n\n if (typeof nextIndex !== 'number') {\n if (direction) {\n if (infinite && index + infinite * 2 !== slides.length) {\n nextIndex = index + (infinite - index % infinite);\n } else {\n nextIndex = index + slidesToScroll;\n }\n } else {\n if (infinite && index % infinite !== 0) {\n nextIndex = index - index % infinite;\n } else {\n nextIndex = index - slidesToScroll;\n }\n }\n }\n\n nextIndex = Math.min(Math.max(nextIndex, 0), slides.length - 1);\n\n if (infinite && direction === undefined) {\n nextIndex += infinite;\n }\n\n if (rewindPrev && Math.abs(position.x) === 0 && direction === false) {\n nextIndex = slides.length - 1;\n duration = rewindSpeed;\n }\n\n var nextOffset = Math.min(Math.max(slides[nextIndex].offsetLeft * -1, maxOffset * -1), 0);\n\n if (rewind && Math.abs(position.x) === maxOffset && direction) {\n nextOffset = 0;\n nextIndex = 0;\n duration = rewindSpeed;\n }\n\n /**\n * translate to the nextOffset by a defined duration and ease function\n */\n translate(nextOffset, duration, ease);\n\n /**\n * update the position with the next position\n */\n position.x = nextOffset;\n\n /**\n * update the index with the nextIndex only if\n * the offset of the nextIndex is in the range of the maxOffset\n */\n if (slides[nextIndex].offsetLeft <= maxOffset) {\n index = nextIndex;\n }\n\n if (infinite && (nextIndex === slides.length - infinite || nextIndex === slides.length - slides.length % infinite || nextIndex === 0)) {\n if (direction) {\n index = infinite;\n }\n\n if (!direction) {\n index = slides.length - infinite * 2;\n }\n\n position.x = slides[index].offsetLeft * -1;\n\n transitionEndCallback = function transitionEndCallback() {\n translate(slides[index].offsetLeft * -1, 0, undefined);\n };\n }\n\n if (classNameActiveSlide) {\n setActiveElement(slice.call(slides), index);\n }\n\n /**\n * update classes for next and prev arrows\n * based on user settings\n */\n if (prevCtrl && !infinite && !rewindPrev && nextIndex === 0) {\n prevCtrl.classList.add(classNameDisabledPrevCtrl);\n }\n\n if (nextCtrl && !infinite && !rewind && nextIndex + 1 === slides.length) {\n nextCtrl.classList.add(classNameDisabledNextCtrl);\n }\n\n dispatchSliderEvent('after', 'slide', {\n currentSlide: index\n });\n }\n\n /**\n * public\n * setup function\n */\n function setup() {\n dispatchSliderEvent('before', 'init');\n\n prefixes = (0, _detectPrefixes2.default)();\n options = _extends({}, _defaults2.default, opts);\n\n var _options4 = options,\n classNameFrame = _options4.classNameFrame,\n classNameSlideContainer = _options4.classNameSlideContainer,\n classNamePrevCtrl = _options4.classNamePrevCtrl,\n classNameNextCtrl = _options4.classNameNextCtrl,\n _options4$classNameDi = _options4.classNameDisabledNextCtrl,\n classNameDisabledNextCtrl = _options4$classNameDi === undefined ? 'disabled' : _options4$classNameDi,\n _options4$classNameDi2 = _options4.classNameDisabledPrevCtrl,\n classNameDisabledPrevCtrl = _options4$classNameDi2 === undefined ? 'disabled' : _options4$classNameDi2,\n enableMouseEvents = _options4.enableMouseEvents,\n classNameActiveSlide = _options4.classNameActiveSlide,\n initialIndex = _options4.initialIndex;\n\n\n index = initialIndex;\n frame = slider.getElementsByClassName(classNameFrame)[0];\n slideContainer = frame.getElementsByClassName(classNameSlideContainer)[0];\n prevCtrl = slider.getElementsByClassName(classNamePrevCtrl)[0];\n nextCtrl = slider.getElementsByClassName(classNameNextCtrl)[0];\n\n position = {\n x: slideContainer.offsetLeft,\n y: slideContainer.offsetTop\n };\n\n if (options.infinite) {\n slides = setupInfinite(slice.call(slideContainer.children));\n } else {\n slides = slice.call(slideContainer.children);\n\n if (prevCtrl && !options.rewindPrev) {\n prevCtrl.classList.add(classNameDisabledPrevCtrl);\n }\n\n if (nextCtrl && slides.length === 1 && !options.rewind) {\n nextCtrl.classList.add(classNameDisabledNextCtrl);\n }\n }\n\n reset();\n\n if (classNameActiveSlide) {\n setActiveElement(slides, index);\n }\n\n if (prevCtrl && nextCtrl) {\n prevCtrl.addEventListener('click', prev);\n nextCtrl.addEventListener('click', next);\n }\n\n frame.addEventListener('touchstart', onTouchstart, touchEventParams);\n\n if (enableMouseEvents) {\n frame.addEventListener('mousedown', onTouchstart);\n frame.addEventListener('click', onClick);\n }\n\n options.window.addEventListener('resize', onResize);\n\n dispatchSliderEvent('after', 'init');\n }\n\n /**\n * public\n * reset function: called on resize\n */\n function reset() {\n var _options5 = options,\n infinite = _options5.infinite,\n ease = _options5.ease,\n rewindSpeed = _options5.rewindSpeed,\n rewindOnResize = _options5.rewindOnResize,\n classNameActiveSlide = _options5.classNameActiveSlide,\n initialIndex = _options5.initialIndex;\n\n\n slidesWidth = elementWidth(slideContainer);\n frameWidth = elementWidth(frame);\n\n if (frameWidth === slidesWidth) {\n slidesWidth = slides.reduce(function (previousValue, slide) {\n return previousValue + elementWidth(slide);\n }, 0);\n }\n\n if (rewindOnResize) {\n index = initialIndex;\n } else {\n ease = null;\n rewindSpeed = 0;\n }\n\n if (infinite) {\n translate(slides[index + infinite].offsetLeft * -1, 0, null);\n\n index = index + infinite;\n position.x = slides[index].offsetLeft * -1;\n } else {\n translate(slides[index].offsetLeft * -1, rewindSpeed, ease);\n position.x = slides[index].offsetLeft * -1;\n }\n\n if (classNameActiveSlide) {\n setActiveElement(slice.call(slides), index);\n }\n }\n\n /**\n * public\n * slideTo: called on clickhandler\n */\n function slideTo(index) {\n slide(index);\n }\n\n /**\n * public\n * returnIndex function: called on clickhandler\n */\n function returnIndex() {\n return index - options.infinite || 0;\n }\n\n /**\n * public\n * prev function: called on clickhandler\n */\n function prev() {\n slide(false, false);\n }\n\n /**\n * public\n * next function: called on clickhandler\n */\n function next() {\n slide(false, true);\n }\n\n /**\n * public\n * destroy function: called to gracefully destroy the lory instance\n */\n function destroy() {\n dispatchSliderEvent('before', 'destroy');\n\n // remove event listeners\n frame.removeEventListener(prefixes.transitionEnd, onTransitionEnd);\n frame.removeEventListener('touchstart', onTouchstart, touchEventParams);\n frame.removeEventListener('touchmove', onTouchmove, touchEventParams);\n frame.removeEventListener('touchend', onTouchend);\n frame.removeEventListener('mousemove', onTouchmove);\n frame.removeEventListener('mousedown', onTouchstart);\n frame.removeEventListener('mouseup', onTouchend);\n frame.removeEventListener('mouseleave', onTouchend);\n frame.removeEventListener('click', onClick);\n\n options.window.removeEventListener('resize', onResize);\n\n if (prevCtrl) {\n prevCtrl.removeEventListener('click', prev);\n }\n\n if (nextCtrl) {\n nextCtrl.removeEventListener('click', next);\n }\n\n // remove cloned slides if infinite is set\n if (options.infinite) {\n Array.apply(null, Array(options.infinite)).forEach(function () {\n slideContainer.removeChild(slideContainer.firstChild);\n slideContainer.removeChild(slideContainer.lastChild);\n });\n }\n\n dispatchSliderEvent('after', 'destroy');\n }\n\n // event handling\n\n var touchOffset = void 0;\n var delta = void 0;\n var isScrolling = void 0;\n\n function onTransitionEnd() {\n if (transitionEndCallback) {\n transitionEndCallback();\n\n transitionEndCallback = undefined;\n }\n }\n\n function onTouchstart(event) {\n var _options6 = options,\n enableMouseEvents = _options6.enableMouseEvents;\n\n var touches = event.touches ? event.touches[0] : event;\n\n if (enableMouseEvents) {\n frame.addEventListener('mousemove', onTouchmove);\n frame.addEventListener('mouseup', onTouchend);\n frame.addEventListener('mouseleave', onTouchend);\n }\n\n frame.addEventListener('touchmove', onTouchmove, touchEventParams);\n frame.addEventListener('touchend', onTouchend);\n\n var pageX = touches.pageX,\n pageY = touches.pageY;\n\n\n touchOffset = {\n x: pageX,\n y: pageY,\n time: Date.now()\n };\n\n isScrolling = undefined;\n\n delta = {};\n\n dispatchSliderEvent('on', 'touchstart', {\n event: event\n });\n }\n\n function onTouchmove(event) {\n var touches = event.touches ? event.touches[0] : event;\n var pageX = touches.pageX,\n pageY = touches.pageY;\n\n\n delta = {\n x: pageX - touchOffset.x,\n y: pageY - touchOffset.y\n };\n\n if (typeof isScrolling === 'undefined') {\n isScrolling = !!(isScrolling || Math.abs(delta.x) < Math.abs(delta.y));\n }\n\n if (!isScrolling && touchOffset) {\n translate(position.x + delta.x, 0, null);\n }\n\n // may be\n dispatchSliderEvent('on', 'touchmove', {\n event: event\n });\n }\n\n function onTouchend(event) {\n /**\n * time between touchstart and touchend in milliseconds\n * @duration {number}\n */\n var duration = touchOffset ? Date.now() - touchOffset.time : undefined;\n\n /**\n * is valid if:\n *\n * -> swipe attempt time is over 300 ms\n * and\n * -> swipe distance is greater than 25px\n * or\n * -> swipe distance is more then a third of the swipe area\n *\n * @isValidSlide {Boolean}\n */\n var isValid = Number(duration) < 300 && Math.abs(delta.x) > 25 || Math.abs(delta.x) > frameWidth / 3;\n\n /**\n * is out of bounds if:\n *\n * -> index is 0 and delta x is greater than 0\n * or\n * -> index is the last slide and delta is smaller than 0\n *\n * @isOutOfBounds {Boolean}\n */\n var isOutOfBounds = !index && delta.x > 0 || index === slides.length - 1 && delta.x < 0;\n\n var direction = delta.x < 0;\n\n if (!isScrolling) {\n if (isValid && !isOutOfBounds) {\n slide(false, direction);\n } else {\n translate(position.x, options.snapBackSpeed);\n }\n }\n\n touchOffset = undefined;\n\n /**\n * remove eventlisteners after swipe attempt\n */\n frame.removeEventListener('touchmove', onTouchmove);\n frame.removeEventListener('touchend', onTouchend);\n frame.removeEventListener('mousemove', onTouchmove);\n frame.removeEventListener('mouseup', onTouchend);\n frame.removeEventListener('mouseleave', onTouchend);\n\n dispatchSliderEvent('on', 'touchend', {\n event: event\n });\n }\n\n function onClick(event) {\n if (delta.x) {\n event.preventDefault();\n }\n }\n\n function onResize(event) {\n if (frameWidth !== elementWidth(frame)) {\n reset();\n\n dispatchSliderEvent('on', 'resize', {\n event: event\n });\n }\n }\n\n // trigger initial setup\n setup();\n\n // expose public api\n return {\n setup: setup,\n reset: reset,\n slideTo: slideTo,\n returnIndex: returnIndex,\n prev: prev,\n next: next,\n destroy: destroy\n };\n}\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = detectPrefixes;\n/**\n * Detecting prefixes for saving time and bytes\n */\nfunction detectPrefixes() {\n var transform = void 0;\n var transition = void 0;\n var transitionEnd = void 0;\n\n (function () {\n var el = document.createElement('_');\n var style = el.style;\n\n var prop = void 0;\n\n if (style[prop = 'webkitTransition'] === '') {\n transitionEnd = 'webkitTransitionEnd';\n transition = prop;\n }\n\n if (style[prop = 'transition'] === '') {\n transitionEnd = 'transitionend';\n transition = prop;\n }\n\n if (style[prop = 'webkitTransform'] === '') {\n transform = prop;\n }\n\n if (style[prop = 'msTransform'] === '') {\n transform = prop;\n }\n\n if (style[prop = 'transform'] === '') {\n transform = prop;\n }\n\n document.body.insertBefore(el, null);\n style[transform] = 'translateX(0)';\n document.body.removeChild(el);\n })();\n\n return {\n transform: transform,\n transition: transition,\n transitionEnd: transitionEnd\n };\n}\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = detectSupportsPassive;\nfunction detectSupportsPassive() {\n var supportsPassive = false;\n\n try {\n var opts = Object.defineProperty({}, 'passive', {\n get: function get() {\n supportsPassive = true;\n }\n });\n\n window.addEventListener('testPassive', null, opts);\n window.removeEventListener('testPassive', null, opts);\n } catch (e) {}\n\n return supportsPassive;\n}\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = dispatchEvent;\n\nvar _customEvent = __webpack_require__(4);\n\nvar _customEvent2 = _interopRequireDefault(_customEvent);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\n/**\n * dispatch custom events\n *\n * @param {element} el slideshow element\n * @param {string} type custom event name\n * @param {object} detail custom detail information\n */\nfunction dispatchEvent(target, type, detail) {\n var event = new _customEvent2.default(type, {\n bubbles: true,\n cancelable: true,\n detail: detail\n });\n\n target.dispatchEvent(event);\n}\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/* WEBPACK VAR INJECTION */(function(global) {\nvar NativeCustomEvent = global.CustomEvent;\n\nfunction useNative () {\n try {\n var p = new NativeCustomEvent('cat', { detail: { foo: 'bar' } });\n return 'cat' === p.type && 'bar' === p.detail.foo;\n } catch (e) {\n }\n return false;\n}\n\n/**\n * Cross-browser `CustomEvent` constructor.\n *\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent.CustomEvent\n *\n * @public\n */\n\nmodule.exports = useNative() ? NativeCustomEvent :\n\n// IE >= 9\n'undefined' !== typeof document && 'function' === typeof document.createEvent ? function CustomEvent (type, params) {\n var e = document.createEvent('CustomEvent');\n if (params) {\n e.initCustomEvent(type, params.bubbles, params.cancelable, params.detail);\n } else {\n e.initCustomEvent(type, false, false, void 0);\n }\n return e;\n} :\n\n// IE <= 8\nfunction CustomEvent (type, params) {\n var e = document.createEventObject();\n e.type = type;\n if (params) {\n e.bubbles = Boolean(params.bubbles);\n e.cancelable = Boolean(params.cancelable);\n e.detail = params.detail;\n } else {\n e.bubbles = false;\n e.cancelable = false;\n e.detail = void 0;\n }\n return e;\n}\n\n/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(5)))\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports) {\n\nvar g;\r\n\r\n// This works in non-strict mode\r\ng = (function() {\r\n\treturn this;\r\n})();\r\n\r\ntry {\r\n\t// This works if eval is allowed (see CSP)\r\n\tg = g || Function(\"return this\")() || (1,eval)(\"this\");\r\n} catch(e) {\r\n\t// This works if the window reference is available\r\n\tif(typeof window === \"object\")\r\n\t\tg = window;\r\n}\r\n\r\n// g can still be undefined, but nothing to do about it...\r\n// We return undefined, instead of nothing here, so it's\r\n// easier to handle this case. if(!global) { ...}\r\n\r\nmodule.exports = g;\r\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n value: true\n});\nexports.default = {\n /**\n * slides scrolled at once\n * @slidesToScroll {Number}\n */\n slidesToScroll: 1,\n\n /**\n * time in milliseconds for the animation of a valid slide attempt\n * @slideSpeed {Number}\n */\n slideSpeed: 300,\n\n /**\n * time in milliseconds for the animation of the rewind after the last slide\n * @rewindSpeed {Number}\n */\n rewindSpeed: 600,\n\n /**\n * time for the snapBack of the slider if the slide attempt was not valid\n * @snapBackSpeed {Number}\n */\n snapBackSpeed: 200,\n\n /**\n * Basic easing functions: https://developer.mozilla.org/de/docs/Web/CSS/transition-timing-function\n * cubic bezier easing functions: http://easings.net/de\n * @ease {String}\n */\n ease: 'ease',\n\n /**\n * if slider reached the last slide, with next click the slider goes back to the startindex.\n * use infinite or rewind, not both\n * @rewind {Boolean}\n */\n rewind: false,\n\n /**\n * number of visible slides or false\n * use infinite or rewind, not both\n * @infinite {number}\n */\n infinite: false,\n\n /**\n * the slide index to show when the slider is initialized.\n * @initialIndex {number}\n */\n initialIndex: 0,\n\n /**\n * class name for slider frame\n * @classNameFrame {string}\n */\n classNameFrame: 'js_frame',\n\n /**\n * class name for slides container\n * @classNameSlideContainer {string}\n */\n classNameSlideContainer: 'js_slides',\n\n /**\n * class name for slider prev control\n * @classNamePrevCtrl {string}\n */\n classNamePrevCtrl: 'js_prev',\n\n /**\n * class name for slider next control\n * @classNameNextCtrl {string}\n */\n classNameNextCtrl: 'js_next',\n\n /**\n * class name for current active slide\n * if emptyString then no class is set\n * @classNameActiveSlide {string}\n */\n classNameActiveSlide: 'active',\n\n /**\n * enables mouse events for swiping on desktop devices\n * @enableMouseEvents {boolean}\n */\n enableMouseEvents: false,\n\n /**\n * window instance\n * @window {object}\n */\n window: typeof window !== 'undefined' ? window : null,\n\n /**\n * If false, slides lory to the first slide on window resize.\n * @rewindOnResize {boolean}\n */\n rewindOnResize: true\n};\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\nmodule.exports = __webpack_require__(0);\n\n\n/***/ })\n/******/ ]);\n});","if (window.NodeList && !NodeList.prototype.forEach) {\r\n NodeList.prototype.forEach = function (callback, thisArg) {\r\n thisArg = thisArg || window;\r\n for (var i = 0; i < this.length; i++) {\r\n callback.call(thisArg, this[i], i, this);\r\n }\r\n };\r\n}\r\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","'use strict';\n\nvar replace = String.prototype.replace;\nvar percentTwenties = /%20/g;\n\nmodule.exports = {\n 'default': 'RFC3986',\n formatters: {\n RFC1738: function (value) {\n return replace.call(value, percentTwenties, '+');\n },\n RFC3986: function (value) {\n return value;\n }\n },\n RFC1738: 'RFC1738',\n RFC3986: 'RFC3986'\n};\n","'use strict';\n\nvar stringify = require('./stringify');\nvar parse = require('./parse');\nvar formats = require('./formats');\n\nmodule.exports = {\n formats: formats,\n parse: parse,\n stringify: stringify\n};\n","'use strict';\n\nvar utils = require('./utils');\n\nvar has = Object.prototype.hasOwnProperty;\n\nvar defaults = {\n allowDots: false,\n allowPrototypes: false,\n arrayLimit: 20,\n charset: 'utf-8',\n charsetSentinel: false,\n comma: false,\n decoder: utils.decode,\n delimiter: '&',\n depth: 5,\n ignoreQueryPrefix: false,\n interpretNumericEntities: false,\n parameterLimit: 1000,\n parseArrays: true,\n plainObjects: false,\n strictNullHandling: false\n};\n\nvar interpretNumericEntities = function (str) {\n return str.replace(/&#(\\d+);/g, function ($0, numberStr) {\n return String.fromCharCode(parseInt(numberStr, 10));\n });\n};\n\n// This is what browsers will submit when the ✓ character occurs in an\n// application/x-www-form-urlencoded body and the encoding of the page containing\n// the form is iso-8859-1, or when the submitted form has an accept-charset\n// attribute of iso-8859-1. Presumably also with other charsets that do not contain\n// the ✓ character, such as us-ascii.\nvar isoSentinel = 'utf8=%26%2310003%3B'; // encodeURIComponent('✓')\n\n// These are the percent-encoded utf-8 octets representing a checkmark, indicating that the request actually is utf-8 encoded.\nvar charsetSentinel = 'utf8=%E2%9C%93'; // encodeURIComponent('✓')\n\nvar parseValues = function parseQueryStringValues(str, options) {\n var obj = {};\n var cleanStr = options.ignoreQueryPrefix ? str.replace(/^\\?/, '') : str;\n var limit = options.parameterLimit === Infinity ? undefined : options.parameterLimit;\n var parts = cleanStr.split(options.delimiter, limit);\n var skipIndex = -1; // Keep track of where the utf8 sentinel was found\n var i;\n\n var charset = options.charset;\n if (options.charsetSentinel) {\n for (i = 0; i < parts.length; ++i) {\n if (parts[i].indexOf('utf8=') === 0) {\n if (parts[i] === charsetSentinel) {\n charset = 'utf-8';\n } else if (parts[i] === isoSentinel) {\n charset = 'iso-8859-1';\n }\n skipIndex = i;\n i = parts.length; // The eslint settings do not allow break;\n }\n }\n }\n\n for (i = 0; i < parts.length; ++i) {\n if (i === skipIndex) {\n continue;\n }\n var part = parts[i];\n\n var bracketEqualsPos = part.indexOf(']=');\n var pos = bracketEqualsPos === -1 ? part.indexOf('=') : bracketEqualsPos + 1;\n\n var key, val;\n if (pos === -1) {\n key = options.decoder(part, defaults.decoder, charset);\n val = options.strictNullHandling ? null : '';\n } else {\n key = options.decoder(part.slice(0, pos), defaults.decoder, charset);\n val = options.decoder(part.slice(pos + 1), defaults.decoder, charset);\n }\n\n if (val && options.interpretNumericEntities && charset === 'iso-8859-1') {\n val = interpretNumericEntities(val);\n }\n\n if (val && options.comma && val.indexOf(',') > -1) {\n val = val.split(',');\n }\n\n if (has.call(obj, key)) {\n obj[key] = utils.combine(obj[key], val);\n } else {\n obj[key] = val;\n }\n }\n\n return obj;\n};\n\nvar parseObject = function (chain, val, options) {\n var leaf = val;\n\n for (var i = chain.length - 1; i >= 0; --i) {\n var obj;\n var root = chain[i];\n\n if (root === '[]' && options.parseArrays) {\n obj = [].concat(leaf);\n } else {\n obj = options.plainObjects ? Object.create(null) : {};\n var cleanRoot = root.charAt(0) === '[' && root.charAt(root.length - 1) === ']' ? root.slice(1, -1) : root;\n var index = parseInt(cleanRoot, 10);\n if (!options.parseArrays && cleanRoot === '') {\n obj = { 0: leaf };\n } else if (\n !isNaN(index)\n && root !== cleanRoot\n && String(index) === cleanRoot\n && index >= 0\n && (options.parseArrays && index <= options.arrayLimit)\n ) {\n obj = [];\n obj[index] = leaf;\n } else {\n obj[cleanRoot] = leaf;\n }\n }\n\n leaf = obj;\n }\n\n return leaf;\n};\n\nvar parseKeys = function parseQueryStringKeys(givenKey, val, options) {\n if (!givenKey) {\n return;\n }\n\n // Transform dot notation to bracket notation\n var key = options.allowDots ? givenKey.replace(/\\.([^.[]+)/g, '[$1]') : givenKey;\n\n // The regex chunks\n\n var brackets = /(\\[[^[\\]]*])/;\n var child = /(\\[[^[\\]]*])/g;\n\n // Get the parent\n\n var segment = brackets.exec(key);\n var parent = segment ? key.slice(0, segment.index) : key;\n\n // Stash the parent if it exists\n\n var keys = [];\n if (parent) {\n // If we aren't using plain objects, optionally prefix keys that would overwrite object prototype properties\n if (!options.plainObjects && has.call(Object.prototype, parent)) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n\n keys.push(parent);\n }\n\n // Loop through children appending to the array until we hit depth\n\n var i = 0;\n while ((segment = child.exec(key)) !== null && i < options.depth) {\n i += 1;\n if (!options.plainObjects && has.call(Object.prototype, segment[1].slice(1, -1))) {\n if (!options.allowPrototypes) {\n return;\n }\n }\n keys.push(segment[1]);\n }\n\n // If there's a remainder, just add whatever is left\n\n if (segment) {\n keys.push('[' + key.slice(segment.index) + ']');\n }\n\n return parseObject(keys, val, options);\n};\n\nvar normalizeParseOptions = function normalizeParseOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (opts.decoder !== null && opts.decoder !== undefined && typeof opts.decoder !== 'function') {\n throw new TypeError('Decoder has to be a function.');\n }\n\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new Error('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n var charset = typeof opts.charset === 'undefined' ? defaults.charset : opts.charset;\n\n return {\n allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,\n allowPrototypes: typeof opts.allowPrototypes === 'boolean' ? opts.allowPrototypes : defaults.allowPrototypes,\n arrayLimit: typeof opts.arrayLimit === 'number' ? opts.arrayLimit : defaults.arrayLimit,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n comma: typeof opts.comma === 'boolean' ? opts.comma : defaults.comma,\n decoder: typeof opts.decoder === 'function' ? opts.decoder : defaults.decoder,\n delimiter: typeof opts.delimiter === 'string' || utils.isRegExp(opts.delimiter) ? opts.delimiter : defaults.delimiter,\n depth: typeof opts.depth === 'number' ? opts.depth : defaults.depth,\n ignoreQueryPrefix: opts.ignoreQueryPrefix === true,\n interpretNumericEntities: typeof opts.interpretNumericEntities === 'boolean' ? opts.interpretNumericEntities : defaults.interpretNumericEntities,\n parameterLimit: typeof opts.parameterLimit === 'number' ? opts.parameterLimit : defaults.parameterLimit,\n parseArrays: opts.parseArrays !== false,\n plainObjects: typeof opts.plainObjects === 'boolean' ? opts.plainObjects : defaults.plainObjects,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n };\n};\n\nmodule.exports = function (str, opts) {\n var options = normalizeParseOptions(opts);\n\n if (str === '' || str === null || typeof str === 'undefined') {\n return options.plainObjects ? Object.create(null) : {};\n }\n\n var tempObj = typeof str === 'string' ? parseValues(str, options) : str;\n var obj = options.plainObjects ? Object.create(null) : {};\n\n // Iterate over the keys and setup the new object\n\n var keys = Object.keys(tempObj);\n for (var i = 0; i < keys.length; ++i) {\n var key = keys[i];\n var newObj = parseKeys(key, tempObj[key], options);\n obj = utils.merge(obj, newObj, options);\n }\n\n return utils.compact(obj);\n};\n","'use strict';\n\nvar utils = require('./utils');\nvar formats = require('./formats');\nvar has = Object.prototype.hasOwnProperty;\n\nvar arrayPrefixGenerators = {\n brackets: function brackets(prefix) { // eslint-disable-line func-name-matching\n return prefix + '[]';\n },\n comma: 'comma',\n indices: function indices(prefix, key) { // eslint-disable-line func-name-matching\n return prefix + '[' + key + ']';\n },\n repeat: function repeat(prefix) { // eslint-disable-line func-name-matching\n return prefix;\n }\n};\n\nvar isArray = Array.isArray;\nvar push = Array.prototype.push;\nvar pushToArray = function (arr, valueOrArray) {\n push.apply(arr, isArray(valueOrArray) ? valueOrArray : [valueOrArray]);\n};\n\nvar toISO = Date.prototype.toISOString;\n\nvar defaults = {\n addQueryPrefix: false,\n allowDots: false,\n charset: 'utf-8',\n charsetSentinel: false,\n delimiter: '&',\n encode: true,\n encoder: utils.encode,\n encodeValuesOnly: false,\n formatter: formats.formatters[formats['default']],\n // deprecated\n indices: false,\n serializeDate: function serializeDate(date) { // eslint-disable-line func-name-matching\n return toISO.call(date);\n },\n skipNulls: false,\n strictNullHandling: false\n};\n\nvar stringify = function stringify( // eslint-disable-line func-name-matching\n object,\n prefix,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly,\n charset\n) {\n var obj = object;\n if (typeof filter === 'function') {\n obj = filter(prefix, obj);\n } else if (obj instanceof Date) {\n obj = serializeDate(obj);\n } else if (generateArrayPrefix === 'comma' && isArray(obj)) {\n obj = obj.join(',');\n }\n\n if (obj === null) {\n if (strictNullHandling) {\n return encoder && !encodeValuesOnly ? encoder(prefix, defaults.encoder, charset) : prefix;\n }\n\n obj = '';\n }\n\n if (typeof obj === 'string' || typeof obj === 'number' || typeof obj === 'boolean' || utils.isBuffer(obj)) {\n if (encoder) {\n var keyValue = encodeValuesOnly ? prefix : encoder(prefix, defaults.encoder, charset);\n return [formatter(keyValue) + '=' + formatter(encoder(obj, defaults.encoder, charset))];\n }\n return [formatter(prefix) + '=' + formatter(String(obj))];\n }\n\n var values = [];\n\n if (typeof obj === 'undefined') {\n return values;\n }\n\n var objKeys;\n if (isArray(filter)) {\n objKeys = filter;\n } else {\n var keys = Object.keys(obj);\n objKeys = sort ? keys.sort(sort) : keys;\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (skipNulls && obj[key] === null) {\n continue;\n }\n\n if (isArray(obj)) {\n pushToArray(values, stringify(\n obj[key],\n typeof generateArrayPrefix === 'function' ? generateArrayPrefix(prefix, key) : prefix,\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly,\n charset\n ));\n } else {\n pushToArray(values, stringify(\n obj[key],\n prefix + (allowDots ? '.' + key : '[' + key + ']'),\n generateArrayPrefix,\n strictNullHandling,\n skipNulls,\n encoder,\n filter,\n sort,\n allowDots,\n serializeDate,\n formatter,\n encodeValuesOnly,\n charset\n ));\n }\n }\n\n return values;\n};\n\nvar normalizeStringifyOptions = function normalizeStringifyOptions(opts) {\n if (!opts) {\n return defaults;\n }\n\n if (opts.encoder !== null && opts.encoder !== undefined && typeof opts.encoder !== 'function') {\n throw new TypeError('Encoder has to be a function.');\n }\n\n var charset = opts.charset || defaults.charset;\n if (typeof opts.charset !== 'undefined' && opts.charset !== 'utf-8' && opts.charset !== 'iso-8859-1') {\n throw new TypeError('The charset option must be either utf-8, iso-8859-1, or undefined');\n }\n\n var format = formats['default'];\n if (typeof opts.format !== 'undefined') {\n if (!has.call(formats.formatters, opts.format)) {\n throw new TypeError('Unknown format option provided.');\n }\n format = opts.format;\n }\n var formatter = formats.formatters[format];\n\n var filter = defaults.filter;\n if (typeof opts.filter === 'function' || isArray(opts.filter)) {\n filter = opts.filter;\n }\n\n return {\n addQueryPrefix: typeof opts.addQueryPrefix === 'boolean' ? opts.addQueryPrefix : defaults.addQueryPrefix,\n allowDots: typeof opts.allowDots === 'undefined' ? defaults.allowDots : !!opts.allowDots,\n charset: charset,\n charsetSentinel: typeof opts.charsetSentinel === 'boolean' ? opts.charsetSentinel : defaults.charsetSentinel,\n delimiter: typeof opts.delimiter === 'undefined' ? defaults.delimiter : opts.delimiter,\n encode: typeof opts.encode === 'boolean' ? opts.encode : defaults.encode,\n encoder: typeof opts.encoder === 'function' ? opts.encoder : defaults.encoder,\n encodeValuesOnly: typeof opts.encodeValuesOnly === 'boolean' ? opts.encodeValuesOnly : defaults.encodeValuesOnly,\n filter: filter,\n formatter: formatter,\n serializeDate: typeof opts.serializeDate === 'function' ? opts.serializeDate : defaults.serializeDate,\n skipNulls: typeof opts.skipNulls === 'boolean' ? opts.skipNulls : defaults.skipNulls,\n sort: typeof opts.sort === 'function' ? opts.sort : null,\n strictNullHandling: typeof opts.strictNullHandling === 'boolean' ? opts.strictNullHandling : defaults.strictNullHandling\n };\n};\n\nmodule.exports = function (object, opts) {\n var obj = object;\n var options = normalizeStringifyOptions(opts);\n\n var objKeys;\n var filter;\n\n if (typeof options.filter === 'function') {\n filter = options.filter;\n obj = filter('', obj);\n } else if (isArray(options.filter)) {\n filter = options.filter;\n objKeys = filter;\n }\n\n var keys = [];\n\n if (typeof obj !== 'object' || obj === null) {\n return '';\n }\n\n var arrayFormat;\n if (opts && opts.arrayFormat in arrayPrefixGenerators) {\n arrayFormat = opts.arrayFormat;\n } else if (opts && 'indices' in opts) {\n arrayFormat = opts.indices ? 'indices' : 'repeat';\n } else {\n arrayFormat = 'indices';\n }\n\n var generateArrayPrefix = arrayPrefixGenerators[arrayFormat];\n\n if (!objKeys) {\n objKeys = Object.keys(obj);\n }\n\n if (options.sort) {\n objKeys.sort(options.sort);\n }\n\n for (var i = 0; i < objKeys.length; ++i) {\n var key = objKeys[i];\n\n if (options.skipNulls && obj[key] === null) {\n continue;\n }\n pushToArray(keys, stringify(\n obj[key],\n key,\n generateArrayPrefix,\n options.strictNullHandling,\n options.skipNulls,\n options.encode ? options.encoder : null,\n options.filter,\n options.sort,\n options.allowDots,\n options.serializeDate,\n options.formatter,\n options.encodeValuesOnly,\n options.charset\n ));\n }\n\n var joined = keys.join(options.delimiter);\n var prefix = options.addQueryPrefix === true ? '?' : '';\n\n if (options.charsetSentinel) {\n if (options.charset === 'iso-8859-1') {\n // encodeURIComponent('✓'), the \"numeric entity\" representation of a checkmark\n prefix += 'utf8=%26%2310003%3B&';\n } else {\n // encodeURIComponent('✓')\n prefix += 'utf8=%E2%9C%93&';\n }\n }\n\n return joined.length > 0 ? prefix + joined : '';\n};\n","'use strict';\n\nvar has = Object.prototype.hasOwnProperty;\nvar isArray = Array.isArray;\n\nvar hexTable = (function () {\n var array = [];\n for (var i = 0; i < 256; ++i) {\n array.push('%' + ((i < 16 ? '0' : '') + i.toString(16)).toUpperCase());\n }\n\n return array;\n}());\n\nvar compactQueue = function compactQueue(queue) {\n while (queue.length > 1) {\n var item = queue.pop();\n var obj = item.obj[item.prop];\n\n if (isArray(obj)) {\n var compacted = [];\n\n for (var j = 0; j < obj.length; ++j) {\n if (typeof obj[j] !== 'undefined') {\n compacted.push(obj[j]);\n }\n }\n\n item.obj[item.prop] = compacted;\n }\n }\n};\n\nvar arrayToObject = function arrayToObject(source, options) {\n var obj = options && options.plainObjects ? Object.create(null) : {};\n for (var i = 0; i < source.length; ++i) {\n if (typeof source[i] !== 'undefined') {\n obj[i] = source[i];\n }\n }\n\n return obj;\n};\n\nvar merge = function merge(target, source, options) {\n if (!source) {\n return target;\n }\n\n if (typeof source !== 'object') {\n if (isArray(target)) {\n target.push(source);\n } else if (target && typeof target === 'object') {\n if ((options && (options.plainObjects || options.allowPrototypes)) || !has.call(Object.prototype, source)) {\n target[source] = true;\n }\n } else {\n return [target, source];\n }\n\n return target;\n }\n\n if (!target || typeof target !== 'object') {\n return [target].concat(source);\n }\n\n var mergeTarget = target;\n if (isArray(target) && !isArray(source)) {\n mergeTarget = arrayToObject(target, options);\n }\n\n if (isArray(target) && isArray(source)) {\n source.forEach(function (item, i) {\n if (has.call(target, i)) {\n var targetItem = target[i];\n if (targetItem && typeof targetItem === 'object' && item && typeof item === 'object') {\n target[i] = merge(targetItem, item, options);\n } else {\n target.push(item);\n }\n } else {\n target[i] = item;\n }\n });\n return target;\n }\n\n return Object.keys(source).reduce(function (acc, key) {\n var value = source[key];\n\n if (has.call(acc, key)) {\n acc[key] = merge(acc[key], value, options);\n } else {\n acc[key] = value;\n }\n return acc;\n }, mergeTarget);\n};\n\nvar assign = function assignSingleSource(target, source) {\n return Object.keys(source).reduce(function (acc, key) {\n acc[key] = source[key];\n return acc;\n }, target);\n};\n\nvar decode = function (str, decoder, charset) {\n var strWithoutPlus = str.replace(/\\+/g, ' ');\n if (charset === 'iso-8859-1') {\n // unescape never throws, no try...catch needed:\n return strWithoutPlus.replace(/%[0-9a-f]{2}/gi, unescape);\n }\n // utf-8\n try {\n return decodeURIComponent(strWithoutPlus);\n } catch (e) {\n return strWithoutPlus;\n }\n};\n\nvar encode = function encode(str, defaultEncoder, charset) {\n // This code was originally written by Brian White (mscdex) for the io.js core querystring library.\n // It has been adapted here for stricter adherence to RFC 3986\n if (str.length === 0) {\n return str;\n }\n\n var string = typeof str === 'string' ? str : String(str);\n\n if (charset === 'iso-8859-1') {\n return escape(string).replace(/%u[0-9a-f]{4}/gi, function ($0) {\n return '%26%23' + parseInt($0.slice(2), 16) + '%3B';\n });\n }\n\n var out = '';\n for (var i = 0; i < string.length; ++i) {\n var c = string.charCodeAt(i);\n\n if (\n c === 0x2D // -\n || c === 0x2E // .\n || c === 0x5F // _\n || c === 0x7E // ~\n || (c >= 0x30 && c <= 0x39) // 0-9\n || (c >= 0x41 && c <= 0x5A) // a-z\n || (c >= 0x61 && c <= 0x7A) // A-Z\n ) {\n out += string.charAt(i);\n continue;\n }\n\n if (c < 0x80) {\n out = out + hexTable[c];\n continue;\n }\n\n if (c < 0x800) {\n out = out + (hexTable[0xC0 | (c >> 6)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n if (c < 0xD800 || c >= 0xE000) {\n out = out + (hexTable[0xE0 | (c >> 12)] + hexTable[0x80 | ((c >> 6) & 0x3F)] + hexTable[0x80 | (c & 0x3F)]);\n continue;\n }\n\n i += 1;\n c = 0x10000 + (((c & 0x3FF) << 10) | (string.charCodeAt(i) & 0x3FF));\n out += hexTable[0xF0 | (c >> 18)]\n + hexTable[0x80 | ((c >> 12) & 0x3F)]\n + hexTable[0x80 | ((c >> 6) & 0x3F)]\n + hexTable[0x80 | (c & 0x3F)];\n }\n\n return out;\n};\n\nvar compact = function compact(value) {\n var queue = [{ obj: { o: value }, prop: 'o' }];\n var refs = [];\n\n for (var i = 0; i < queue.length; ++i) {\n var item = queue[i];\n var obj = item.obj[item.prop];\n\n var keys = Object.keys(obj);\n for (var j = 0; j < keys.length; ++j) {\n var key = keys[j];\n var val = obj[key];\n if (typeof val === 'object' && val !== null && refs.indexOf(val) === -1) {\n queue.push({ obj: obj, prop: key });\n refs.push(val);\n }\n }\n }\n\n compactQueue(queue);\n\n return value;\n};\n\nvar isRegExp = function isRegExp(obj) {\n return Object.prototype.toString.call(obj) === '[object RegExp]';\n};\n\nvar isBuffer = function isBuffer(obj) {\n if (!obj || typeof obj !== 'object') {\n return false;\n }\n\n return !!(obj.constructor && obj.constructor.isBuffer && obj.constructor.isBuffer(obj));\n};\n\nvar combine = function combine(a, b) {\n return [].concat(a, b);\n};\n\nmodule.exports = {\n arrayToObject: arrayToObject,\n assign: assign,\n combine: combine,\n compact: compact,\n decode: decode,\n encode: encode,\n isBuffer: isBuffer,\n isRegExp: isRegExp,\n merge: merge\n};\n",";/*! showdown v 2.1.0 - 21-04-2022 */\r\n(function(){\r\n/**\n * Created by Tivie on 13-07-2015.\n */\n\nfunction getDefaultOpts (simple) {\n 'use strict';\n\n var defaultOptions = {\n omitExtraWLInCodeBlocks: {\n defaultValue: false,\n describe: 'Omit the default extra whiteline added to code blocks',\n type: 'boolean'\n },\n noHeaderId: {\n defaultValue: false,\n describe: 'Turn on/off generated header id',\n type: 'boolean'\n },\n prefixHeaderId: {\n defaultValue: false,\n describe: 'Add a prefix to the generated header ids. Passing a string will prefix that string to the header id. Setting to true will add a generic \\'section-\\' prefix',\n type: 'string'\n },\n rawPrefixHeaderId: {\n defaultValue: false,\n describe: 'Setting this option to true will prevent showdown from modifying the prefix. This might result in malformed IDs (if, for instance, the \" char is used in the prefix)',\n type: 'boolean'\n },\n ghCompatibleHeaderId: {\n defaultValue: false,\n describe: 'Generate header ids compatible with github style (spaces are replaced with dashes, a bunch of non alphanumeric chars are removed)',\n type: 'boolean'\n },\n rawHeaderId: {\n defaultValue: false,\n describe: 'Remove only spaces, \\' and \" from generated header ids (including prefixes), replacing them with dashes (-). WARNING: This might result in malformed ids',\n type: 'boolean'\n },\n headerLevelStart: {\n defaultValue: false,\n describe: 'The header blocks level start',\n type: 'integer'\n },\n parseImgDimensions: {\n defaultValue: false,\n describe: 'Turn on/off image dimension parsing',\n type: 'boolean'\n },\n simplifiedAutoLink: {\n defaultValue: false,\n describe: 'Turn on/off GFM autolink style',\n type: 'boolean'\n },\n excludeTrailingPunctuationFromURLs: {\n defaultValue: false,\n describe: 'Excludes trailing punctuation from links generated with autoLinking',\n type: 'boolean'\n },\n literalMidWordUnderscores: {\n defaultValue: false,\n describe: 'Parse midword underscores as literal underscores',\n type: 'boolean'\n },\n literalMidWordAsterisks: {\n defaultValue: false,\n describe: 'Parse midword asterisks as literal asterisks',\n type: 'boolean'\n },\n strikethrough: {\n defaultValue: false,\n describe: 'Turn on/off strikethrough support',\n type: 'boolean'\n },\n tables: {\n defaultValue: false,\n describe: 'Turn on/off tables support',\n type: 'boolean'\n },\n tablesHeaderId: {\n defaultValue: false,\n describe: 'Add an id to table headers',\n type: 'boolean'\n },\n ghCodeBlocks: {\n defaultValue: true,\n describe: 'Turn on/off GFM fenced code blocks support',\n type: 'boolean'\n },\n tasklists: {\n defaultValue: false,\n describe: 'Turn on/off GFM tasklist support',\n type: 'boolean'\n },\n smoothLivePreview: {\n defaultValue: false,\n describe: 'Prevents weird effects in live previews due to incomplete input',\n type: 'boolean'\n },\n smartIndentationFix: {\n defaultValue: false,\n describe: 'Tries to smartly fix indentation in es6 strings',\n type: 'boolean'\n },\n disableForced4SpacesIndentedSublists: {\n defaultValue: false,\n describe: 'Disables the requirement of indenting nested sublists by 4 spaces',\n type: 'boolean'\n },\n simpleLineBreaks: {\n defaultValue: false,\n describe: 'Parses simple line breaks as
    (GFM Style)',\n type: 'boolean'\n },\n requireSpaceBeforeHeadingText: {\n defaultValue: false,\n describe: 'Makes adding a space between `#` and the header text mandatory (GFM Style)',\n type: 'boolean'\n },\n ghMentions: {\n defaultValue: false,\n describe: 'Enables github @mentions',\n type: 'boolean'\n },\n ghMentionsLink: {\n defaultValue: 'https://github.com/{u}',\n describe: 'Changes the link generated by @mentions. Only applies if ghMentions option is enabled.',\n type: 'string'\n },\n encodeEmails: {\n defaultValue: true,\n describe: 'Encode e-mail addresses through the use of Character Entities, transforming ASCII e-mail addresses into its equivalent decimal entities',\n type: 'boolean'\n },\n openLinksInNewWindow: {\n defaultValue: false,\n describe: 'Open all links in new windows',\n type: 'boolean'\n },\n backslashEscapesHTMLTags: {\n defaultValue: false,\n describe: 'Support for HTML Tag escaping. ex: \\
    foo\\
    ',\n type: 'boolean'\n },\n emoji: {\n defaultValue: false,\n describe: 'Enable emoji support. Ex: `this is a :smile: emoji`',\n type: 'boolean'\n },\n underline: {\n defaultValue: false,\n describe: 'Enable support for underline. Syntax is double or triple underscores: `__underline word__`. With this option enabled, underscores no longer parses into `` and ``',\n type: 'boolean'\n },\n ellipsis: {\n defaultValue: true,\n describe: 'Replaces three dots with the ellipsis unicode character',\n type: 'boolean'\n },\n completeHTMLDocument: {\n defaultValue: false,\n describe: 'Outputs a complete html document, including ``, `` and `` tags',\n type: 'boolean'\n },\n metadata: {\n defaultValue: false,\n describe: 'Enable support for document metadata (defined at the top of the document between `«««` and `»»»` or between `---` and `---`).',\n type: 'boolean'\n },\n splitAdjacentBlockquotes: {\n defaultValue: false,\n describe: 'Split adjacent blockquote blocks',\n type: 'boolean'\n }\n };\n if (simple === false) {\n return JSON.parse(JSON.stringify(defaultOptions));\n }\n var ret = {};\n for (var opt in defaultOptions) {\n if (defaultOptions.hasOwnProperty(opt)) {\n ret[opt] = defaultOptions[opt].defaultValue;\n }\n }\n return ret;\n}\n\nfunction allOptionsOn () {\n 'use strict';\n var options = getDefaultOpts(true),\n ret = {};\n for (var opt in options) {\n if (options.hasOwnProperty(opt)) {\n ret[opt] = true;\n }\n }\n return ret;\n}\n\r\n/**\n * Created by Tivie on 06-01-2015.\n */\n\n// Private properties\nvar showdown = {},\n parsers = {},\n extensions = {},\n globalOptions = getDefaultOpts(true),\n setFlavor = 'vanilla',\n flavor = {\n github: {\n omitExtraWLInCodeBlocks: true,\n simplifiedAutoLink: true,\n excludeTrailingPunctuationFromURLs: true,\n literalMidWordUnderscores: true,\n strikethrough: true,\n tables: true,\n tablesHeaderId: true,\n ghCodeBlocks: true,\n tasklists: true,\n disableForced4SpacesIndentedSublists: true,\n simpleLineBreaks: true,\n requireSpaceBeforeHeadingText: true,\n ghCompatibleHeaderId: true,\n ghMentions: true,\n backslashEscapesHTMLTags: true,\n emoji: true,\n splitAdjacentBlockquotes: true\n },\n original: {\n noHeaderId: true,\n ghCodeBlocks: false\n },\n ghost: {\n omitExtraWLInCodeBlocks: true,\n parseImgDimensions: true,\n simplifiedAutoLink: true,\n excludeTrailingPunctuationFromURLs: true,\n literalMidWordUnderscores: true,\n strikethrough: true,\n tables: true,\n tablesHeaderId: true,\n ghCodeBlocks: true,\n tasklists: true,\n smoothLivePreview: true,\n simpleLineBreaks: true,\n requireSpaceBeforeHeadingText: true,\n ghMentions: false,\n encodeEmails: true\n },\n vanilla: getDefaultOpts(true),\n allOn: allOptionsOn()\n };\n\n/**\n * helper namespace\n * @type {{}}\n */\nshowdown.helper = {};\n\n/**\n * TODO LEGACY SUPPORT CODE\n * @type {{}}\n */\nshowdown.extensions = {};\n\n/**\n * Set a global option\n * @static\n * @param {string} key\n * @param {*} value\n * @returns {showdown}\n */\nshowdown.setOption = function (key, value) {\n 'use strict';\n globalOptions[key] = value;\n return this;\n};\n\n/**\n * Get a global option\n * @static\n * @param {string} key\n * @returns {*}\n */\nshowdown.getOption = function (key) {\n 'use strict';\n return globalOptions[key];\n};\n\n/**\n * Get the global options\n * @static\n * @returns {{}}\n */\nshowdown.getOptions = function () {\n 'use strict';\n return globalOptions;\n};\n\n/**\n * Reset global options to the default values\n * @static\n */\nshowdown.resetOptions = function () {\n 'use strict';\n globalOptions = getDefaultOpts(true);\n};\n\n/**\n * Set the flavor showdown should use as default\n * @param {string} name\n */\nshowdown.setFlavor = function (name) {\n 'use strict';\n if (!flavor.hasOwnProperty(name)) {\n throw Error(name + ' flavor was not found');\n }\n showdown.resetOptions();\n var preset = flavor[name];\n setFlavor = name;\n for (var option in preset) {\n if (preset.hasOwnProperty(option)) {\n globalOptions[option] = preset[option];\n }\n }\n};\n\n/**\n * Get the currently set flavor\n * @returns {string}\n */\nshowdown.getFlavor = function () {\n 'use strict';\n return setFlavor;\n};\n\n/**\n * Get the options of a specified flavor. Returns undefined if the flavor was not found\n * @param {string} name Name of the flavor\n * @returns {{}|undefined}\n */\nshowdown.getFlavorOptions = function (name) {\n 'use strict';\n if (flavor.hasOwnProperty(name)) {\n return flavor[name];\n }\n};\n\n/**\n * Get the default options\n * @static\n * @param {boolean} [simple=true]\n * @returns {{}}\n */\nshowdown.getDefaultOptions = function (simple) {\n 'use strict';\n return getDefaultOpts(simple);\n};\n\n/**\n * Get or set a subParser\n *\n * subParser(name) - Get a registered subParser\n * subParser(name, func) - Register a subParser\n * @static\n * @param {string} name\n * @param {function} [func]\n * @returns {*}\n */\nshowdown.subParser = function (name, func) {\n 'use strict';\n if (showdown.helper.isString(name)) {\n if (typeof func !== 'undefined') {\n parsers[name] = func;\n } else {\n if (parsers.hasOwnProperty(name)) {\n return parsers[name];\n } else {\n throw Error('SubParser named ' + name + ' not registered!');\n }\n }\n }\n};\n\n/**\n * Gets or registers an extension\n * @static\n * @param {string} name\n * @param {object|object[]|function=} ext\n * @returns {*}\n */\nshowdown.extension = function (name, ext) {\n 'use strict';\n\n if (!showdown.helper.isString(name)) {\n throw Error('Extension \\'name\\' must be a string');\n }\n\n name = showdown.helper.stdExtName(name);\n\n // Getter\n if (showdown.helper.isUndefined(ext)) {\n if (!extensions.hasOwnProperty(name)) {\n throw Error('Extension named ' + name + ' is not registered!');\n }\n return extensions[name];\n\n // Setter\n } else {\n // Expand extension if it's wrapped in a function\n if (typeof ext === 'function') {\n ext = ext();\n }\n\n // Ensure extension is an array\n if (!showdown.helper.isArray(ext)) {\n ext = [ext];\n }\n\n var validExtension = validate(ext, name);\n\n if (validExtension.valid) {\n extensions[name] = ext;\n } else {\n throw Error(validExtension.error);\n }\n }\n};\n\n/**\n * Gets all extensions registered\n * @returns {{}}\n */\nshowdown.getAllExtensions = function () {\n 'use strict';\n return extensions;\n};\n\n/**\n * Remove an extension\n * @param {string} name\n */\nshowdown.removeExtension = function (name) {\n 'use strict';\n delete extensions[name];\n};\n\n/**\n * Removes all extensions\n */\nshowdown.resetExtensions = function () {\n 'use strict';\n extensions = {};\n};\n\n/**\n * Validate extension\n * @param {array} extension\n * @param {string} name\n * @returns {{valid: boolean, error: string}}\n */\nfunction validate (extension, name) {\n 'use strict';\n\n var errMsg = (name) ? 'Error in ' + name + ' extension->' : 'Error in unnamed extension',\n ret = {\n valid: true,\n error: ''\n };\n\n if (!showdown.helper.isArray(extension)) {\n extension = [extension];\n }\n\n for (var i = 0; i < extension.length; ++i) {\n var baseMsg = errMsg + ' sub-extension ' + i + ': ',\n ext = extension[i];\n if (typeof ext !== 'object') {\n ret.valid = false;\n ret.error = baseMsg + 'must be an object, but ' + typeof ext + ' given';\n return ret;\n }\n\n if (!showdown.helper.isString(ext.type)) {\n ret.valid = false;\n ret.error = baseMsg + 'property \"type\" must be a string, but ' + typeof ext.type + ' given';\n return ret;\n }\n\n var type = ext.type = ext.type.toLowerCase();\n\n // normalize extension type\n if (type === 'language') {\n type = ext.type = 'lang';\n }\n\n if (type === 'html') {\n type = ext.type = 'output';\n }\n\n if (type !== 'lang' && type !== 'output' && type !== 'listener') {\n ret.valid = false;\n ret.error = baseMsg + 'type ' + type + ' is not recognized. Valid values: \"lang/language\", \"output/html\" or \"listener\"';\n return ret;\n }\n\n if (type === 'listener') {\n if (showdown.helper.isUndefined(ext.listeners)) {\n ret.valid = false;\n ret.error = baseMsg + '. Extensions of type \"listener\" must have a property called \"listeners\"';\n return ret;\n }\n } else {\n if (showdown.helper.isUndefined(ext.filter) && showdown.helper.isUndefined(ext.regex)) {\n ret.valid = false;\n ret.error = baseMsg + type + ' extensions must define either a \"regex\" property or a \"filter\" method';\n return ret;\n }\n }\n\n if (ext.listeners) {\n if (typeof ext.listeners !== 'object') {\n ret.valid = false;\n ret.error = baseMsg + '\"listeners\" property must be an object but ' + typeof ext.listeners + ' given';\n return ret;\n }\n for (var ln in ext.listeners) {\n if (ext.listeners.hasOwnProperty(ln)) {\n if (typeof ext.listeners[ln] !== 'function') {\n ret.valid = false;\n ret.error = baseMsg + '\"listeners\" property must be an hash of [event name]: [callback]. listeners.' + ln +\n ' must be a function but ' + typeof ext.listeners[ln] + ' given';\n return ret;\n }\n }\n }\n }\n\n if (ext.filter) {\n if (typeof ext.filter !== 'function') {\n ret.valid = false;\n ret.error = baseMsg + '\"filter\" must be a function, but ' + typeof ext.filter + ' given';\n return ret;\n }\n } else if (ext.regex) {\n if (showdown.helper.isString(ext.regex)) {\n ext.regex = new RegExp(ext.regex, 'g');\n }\n if (!(ext.regex instanceof RegExp)) {\n ret.valid = false;\n ret.error = baseMsg + '\"regex\" property must either be a string or a RegExp object, but ' + typeof ext.regex + ' given';\n return ret;\n }\n if (showdown.helper.isUndefined(ext.replace)) {\n ret.valid = false;\n ret.error = baseMsg + '\"regex\" extensions must implement a replace string or function';\n return ret;\n }\n }\n }\n return ret;\n}\n\n/**\n * Validate extension\n * @param {object} ext\n * @returns {boolean}\n */\nshowdown.validateExtension = function (ext) {\n 'use strict';\n\n var validateExtension = validate(ext, null);\n if (!validateExtension.valid) {\n console.warn(validateExtension.error);\n return false;\n }\n return true;\n};\n\r\n/**\n * showdownjs helper functions\n */\n\nif (!showdown.hasOwnProperty('helper')) {\n showdown.helper = {};\n}\n\n/**\n * Check if var is string\n * @static\n * @param {string} a\n * @returns {boolean}\n */\nshowdown.helper.isString = function (a) {\n 'use strict';\n return (typeof a === 'string' || a instanceof String);\n};\n\n/**\n * Check if var is a function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isFunction = function (a) {\n 'use strict';\n var getType = {};\n return a && getType.toString.call(a) === '[object Function]';\n};\n\n/**\n * isArray helper function\n * @static\n * @param {*} a\n * @returns {boolean}\n */\nshowdown.helper.isArray = function (a) {\n 'use strict';\n return Array.isArray(a);\n};\n\n/**\n * Check if value is undefined\n * @static\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is `undefined`, else `false`.\n */\nshowdown.helper.isUndefined = function (value) {\n 'use strict';\n return typeof value === 'undefined';\n};\n\n/**\n * ForEach helper function\n * Iterates over Arrays and Objects (own properties only)\n * @static\n * @param {*} obj\n * @param {function} callback Accepts 3 params: 1. value, 2. key, 3. the original array/object\n */\nshowdown.helper.forEach = function (obj, callback) {\n 'use strict';\n // check if obj is defined\n if (showdown.helper.isUndefined(obj)) {\n throw new Error('obj param is required');\n }\n\n if (showdown.helper.isUndefined(callback)) {\n throw new Error('callback param is required');\n }\n\n if (!showdown.helper.isFunction(callback)) {\n throw new Error('callback param must be a function/closure');\n }\n\n if (typeof obj.forEach === 'function') {\n obj.forEach(callback);\n } else if (showdown.helper.isArray(obj)) {\n for (var i = 0; i < obj.length; i++) {\n callback(obj[i], i, obj);\n }\n } else if (typeof (obj) === 'object') {\n for (var prop in obj) {\n if (obj.hasOwnProperty(prop)) {\n callback(obj[prop], prop, obj);\n }\n }\n } else {\n throw new Error('obj does not seem to be an array or an iterable object');\n }\n};\n\n/**\n * Standardidize extension name\n * @static\n * @param {string} s extension name\n * @returns {string}\n */\nshowdown.helper.stdExtName = function (s) {\n 'use strict';\n return s.replace(/[_?*+\\/\\\\.^-]/g, '').replace(/\\s/g, '').toLowerCase();\n};\n\nfunction escapeCharactersCallback (wholeMatch, m1) {\n 'use strict';\n var charCodeToEscape = m1.charCodeAt(0);\n return '¨E' + charCodeToEscape + 'E';\n}\n\n/**\n * Callback used to escape characters when passing through String.replace\n * @static\n * @param {string} wholeMatch\n * @param {string} m1\n * @returns {string}\n */\nshowdown.helper.escapeCharactersCallback = escapeCharactersCallback;\n\n/**\n * Escape characters in a string\n * @static\n * @param {string} text\n * @param {string} charsToEscape\n * @param {boolean} afterBackslash\n * @returns {XML|string|void|*}\n */\nshowdown.helper.escapeCharacters = function (text, charsToEscape, afterBackslash) {\n 'use strict';\n // First we have to escape the escape characters so that\n // we can build a character class out of them\n var regexString = '([' + charsToEscape.replace(/([\\[\\]\\\\])/g, '\\\\$1') + '])';\n\n if (afterBackslash) {\n regexString = '\\\\\\\\' + regexString;\n }\n\n var regex = new RegExp(regexString, 'g');\n text = text.replace(regex, escapeCharactersCallback);\n\n return text;\n};\n\n/**\n * Unescape HTML entities\n * @param txt\n * @returns {string}\n */\nshowdown.helper.unescapeHTMLEntities = function (txt) {\n 'use strict';\n\n return txt\n .replace(/"/g, '\"')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/&/g, '&');\n};\n\nvar rgxFindMatchPos = function (str, left, right, flags) {\n 'use strict';\n var f = flags || '',\n g = f.indexOf('g') > -1,\n x = new RegExp(left + '|' + right, 'g' + f.replace(/g/g, '')),\n l = new RegExp(left, f.replace(/g/g, '')),\n pos = [],\n t, s, m, start, end;\n\n do {\n t = 0;\n while ((m = x.exec(str))) {\n if (l.test(m[0])) {\n if (!(t++)) {\n s = x.lastIndex;\n start = s - m[0].length;\n }\n } else if (t) {\n if (!--t) {\n end = m.index + m[0].length;\n var obj = {\n left: {start: start, end: s},\n match: {start: s, end: m.index},\n right: {start: m.index, end: end},\n wholeMatch: {start: start, end: end}\n };\n pos.push(obj);\n if (!g) {\n return pos;\n }\n }\n }\n }\n } while (t && (x.lastIndex = s));\n\n return pos;\n};\n\n/**\n * matchRecursiveRegExp\n *\n * (c) 2007 Steven Levithan \n * MIT License\n *\n * Accepts a string to search, a left and right format delimiter\n * as regex patterns, and optional regex flags. Returns an array\n * of matches, allowing nested instances of left/right delimiters.\n * Use the \"g\" flag to return all matches, otherwise only the\n * first is returned. Be careful to ensure that the left and\n * right format delimiters produce mutually exclusive matches.\n * Backreferences are not supported within the right delimiter\n * due to how it is internally combined with the left delimiter.\n * When matching strings whose format delimiters are unbalanced\n * to the left or right, the output is intentionally as a\n * conventional regex library with recursion support would\n * produce, e.g. \"<\" and \">\" both produce [\"x\"] when using\n * \"<\" and \">\" as the delimiters (both strings contain a single,\n * balanced instance of \"\").\n *\n * examples:\n * matchRecursiveRegExp(\"test\", \"\\\\(\", \"\\\\)\")\n * returns: []\n * matchRecursiveRegExp(\">>t<>\", \"<\", \">\", \"g\")\n * returns: [\"t<>\", \"\"]\n * matchRecursiveRegExp(\"
    test
    \", \"]*>\", \"\", \"gi\")\n * returns: [\"test\"]\n */\nshowdown.helper.matchRecursiveRegExp = function (str, left, right, flags) {\n 'use strict';\n\n var matchPos = rgxFindMatchPos (str, left, right, flags),\n results = [];\n\n for (var i = 0; i < matchPos.length; ++i) {\n results.push([\n str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n str.slice(matchPos[i].match.start, matchPos[i].match.end),\n str.slice(matchPos[i].left.start, matchPos[i].left.end),\n str.slice(matchPos[i].right.start, matchPos[i].right.end)\n ]);\n }\n return results;\n};\n\n/**\n *\n * @param {string} str\n * @param {string|function} replacement\n * @param {string} left\n * @param {string} right\n * @param {string} flags\n * @returns {string}\n */\nshowdown.helper.replaceRecursiveRegExp = function (str, replacement, left, right, flags) {\n 'use strict';\n\n if (!showdown.helper.isFunction(replacement)) {\n var repStr = replacement;\n replacement = function () {\n return repStr;\n };\n }\n\n var matchPos = rgxFindMatchPos(str, left, right, flags),\n finalStr = str,\n lng = matchPos.length;\n\n if (lng > 0) {\n var bits = [];\n if (matchPos[0].wholeMatch.start !== 0) {\n bits.push(str.slice(0, matchPos[0].wholeMatch.start));\n }\n for (var i = 0; i < lng; ++i) {\n bits.push(\n replacement(\n str.slice(matchPos[i].wholeMatch.start, matchPos[i].wholeMatch.end),\n str.slice(matchPos[i].match.start, matchPos[i].match.end),\n str.slice(matchPos[i].left.start, matchPos[i].left.end),\n str.slice(matchPos[i].right.start, matchPos[i].right.end)\n )\n );\n if (i < lng - 1) {\n bits.push(str.slice(matchPos[i].wholeMatch.end, matchPos[i + 1].wholeMatch.start));\n }\n }\n if (matchPos[lng - 1].wholeMatch.end < str.length) {\n bits.push(str.slice(matchPos[lng - 1].wholeMatch.end));\n }\n finalStr = bits.join('');\n }\n return finalStr;\n};\n\n/**\n * Returns the index within the passed String object of the first occurrence of the specified regex,\n * starting the search at fromIndex. Returns -1 if the value is not found.\n *\n * @param {string} str string to search\n * @param {RegExp} regex Regular expression to search\n * @param {int} [fromIndex = 0] Index to start the search\n * @returns {Number}\n * @throws InvalidArgumentError\n */\nshowdown.helper.regexIndexOf = function (str, regex, fromIndex) {\n 'use strict';\n if (!showdown.helper.isString(str)) {\n throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n }\n if (regex instanceof RegExp === false) {\n throw 'InvalidArgumentError: second parameter of showdown.helper.regexIndexOf function must be an instance of RegExp';\n }\n var indexOf = str.substring(fromIndex || 0).search(regex);\n return (indexOf >= 0) ? (indexOf + (fromIndex || 0)) : indexOf;\n};\n\n/**\n * Splits the passed string object at the defined index, and returns an array composed of the two substrings\n * @param {string} str string to split\n * @param {int} index index to split string at\n * @returns {[string,string]}\n * @throws InvalidArgumentError\n */\nshowdown.helper.splitAtIndex = function (str, index) {\n 'use strict';\n if (!showdown.helper.isString(str)) {\n throw 'InvalidArgumentError: first parameter of showdown.helper.regexIndexOf function must be a string';\n }\n return [str.substring(0, index), str.substring(index)];\n};\n\n/**\n * Obfuscate an e-mail address through the use of Character Entities,\n * transforming ASCII characters into their equivalent decimal or hex entities.\n *\n * Since it has a random component, subsequent calls to this function produce different results\n *\n * @param {string} mail\n * @returns {string}\n */\nshowdown.helper.encodeEmailAddress = function (mail) {\n 'use strict';\n var encode = [\n function (ch) {\n return '&#' + ch.charCodeAt(0) + ';';\n },\n function (ch) {\n return '&#x' + ch.charCodeAt(0).toString(16) + ';';\n },\n function (ch) {\n return ch;\n }\n ];\n\n mail = mail.replace(/./g, function (ch) {\n if (ch === '@') {\n // this *must* be encoded. I insist.\n ch = encode[Math.floor(Math.random() * 2)](ch);\n } else {\n var r = Math.random();\n // roughly 10% raw, 45% hex, 45% dec\n ch = (\n r > 0.9 ? encode[2](ch) : r > 0.45 ? encode[1](ch) : encode[0](ch)\n );\n }\n return ch;\n });\n\n return mail;\n};\n\n/**\n *\n * @param str\n * @param targetLength\n * @param padString\n * @returns {string}\n */\nshowdown.helper.padEnd = function padEnd (str, targetLength, padString) {\n 'use strict';\n /*jshint bitwise: false*/\n // eslint-disable-next-line space-infix-ops\n targetLength = targetLength>>0; //floor if number or convert non-number to 0;\n /*jshint bitwise: true*/\n padString = String(padString || ' ');\n if (str.length > targetLength) {\n return String(str);\n } else {\n targetLength = targetLength - str.length;\n if (targetLength > padString.length) {\n padString += padString.repeat(targetLength / padString.length); //append to original to ensure we are longer than needed\n }\n return String(str) + padString.slice(0,targetLength);\n }\n};\n\n/**\n * POLYFILLS\n */\n// use this instead of builtin is undefined for IE8 compatibility\nif (typeof (console) === 'undefined') {\n console = {\n warn: function (msg) {\n 'use strict';\n alert(msg);\n },\n log: function (msg) {\n 'use strict';\n alert(msg);\n },\n error: function (msg) {\n 'use strict';\n throw msg;\n }\n };\n}\n\n/**\n * Common regexes.\n * We declare some common regexes to improve performance\n */\nshowdown.helper.regexes = {\n asteriskDashAndColon: /([*_:~])/g\n};\n\n/**\n * EMOJIS LIST\n */\nshowdown.helper.emojis = {\n '+1':'\\ud83d\\udc4d',\n '-1':'\\ud83d\\udc4e',\n '100':'\\ud83d\\udcaf',\n '1234':'\\ud83d\\udd22',\n '1st_place_medal':'\\ud83e\\udd47',\n '2nd_place_medal':'\\ud83e\\udd48',\n '3rd_place_medal':'\\ud83e\\udd49',\n '8ball':'\\ud83c\\udfb1',\n 'a':'\\ud83c\\udd70\\ufe0f',\n 'ab':'\\ud83c\\udd8e',\n 'abc':'\\ud83d\\udd24',\n 'abcd':'\\ud83d\\udd21',\n 'accept':'\\ud83c\\ude51',\n 'aerial_tramway':'\\ud83d\\udea1',\n 'airplane':'\\u2708\\ufe0f',\n 'alarm_clock':'\\u23f0',\n 'alembic':'\\u2697\\ufe0f',\n 'alien':'\\ud83d\\udc7d',\n 'ambulance':'\\ud83d\\ude91',\n 'amphora':'\\ud83c\\udffa',\n 'anchor':'\\u2693\\ufe0f',\n 'angel':'\\ud83d\\udc7c',\n 'anger':'\\ud83d\\udca2',\n 'angry':'\\ud83d\\ude20',\n 'anguished':'\\ud83d\\ude27',\n 'ant':'\\ud83d\\udc1c',\n 'apple':'\\ud83c\\udf4e',\n 'aquarius':'\\u2652\\ufe0f',\n 'aries':'\\u2648\\ufe0f',\n 'arrow_backward':'\\u25c0\\ufe0f',\n 'arrow_double_down':'\\u23ec',\n 'arrow_double_up':'\\u23eb',\n 'arrow_down':'\\u2b07\\ufe0f',\n 'arrow_down_small':'\\ud83d\\udd3d',\n 'arrow_forward':'\\u25b6\\ufe0f',\n 'arrow_heading_down':'\\u2935\\ufe0f',\n 'arrow_heading_up':'\\u2934\\ufe0f',\n 'arrow_left':'\\u2b05\\ufe0f',\n 'arrow_lower_left':'\\u2199\\ufe0f',\n 'arrow_lower_right':'\\u2198\\ufe0f',\n 'arrow_right':'\\u27a1\\ufe0f',\n 'arrow_right_hook':'\\u21aa\\ufe0f',\n 'arrow_up':'\\u2b06\\ufe0f',\n 'arrow_up_down':'\\u2195\\ufe0f',\n 'arrow_up_small':'\\ud83d\\udd3c',\n 'arrow_upper_left':'\\u2196\\ufe0f',\n 'arrow_upper_right':'\\u2197\\ufe0f',\n 'arrows_clockwise':'\\ud83d\\udd03',\n 'arrows_counterclockwise':'\\ud83d\\udd04',\n 'art':'\\ud83c\\udfa8',\n 'articulated_lorry':'\\ud83d\\ude9b',\n 'artificial_satellite':'\\ud83d\\udef0',\n 'astonished':'\\ud83d\\ude32',\n 'athletic_shoe':'\\ud83d\\udc5f',\n 'atm':'\\ud83c\\udfe7',\n 'atom_symbol':'\\u269b\\ufe0f',\n 'avocado':'\\ud83e\\udd51',\n 'b':'\\ud83c\\udd71\\ufe0f',\n 'baby':'\\ud83d\\udc76',\n 'baby_bottle':'\\ud83c\\udf7c',\n 'baby_chick':'\\ud83d\\udc24',\n 'baby_symbol':'\\ud83d\\udebc',\n 'back':'\\ud83d\\udd19',\n 'bacon':'\\ud83e\\udd53',\n 'badminton':'\\ud83c\\udff8',\n 'baggage_claim':'\\ud83d\\udec4',\n 'baguette_bread':'\\ud83e\\udd56',\n 'balance_scale':'\\u2696\\ufe0f',\n 'balloon':'\\ud83c\\udf88',\n 'ballot_box':'\\ud83d\\uddf3',\n 'ballot_box_with_check':'\\u2611\\ufe0f',\n 'bamboo':'\\ud83c\\udf8d',\n 'banana':'\\ud83c\\udf4c',\n 'bangbang':'\\u203c\\ufe0f',\n 'bank':'\\ud83c\\udfe6',\n 'bar_chart':'\\ud83d\\udcca',\n 'barber':'\\ud83d\\udc88',\n 'baseball':'\\u26be\\ufe0f',\n 'basketball':'\\ud83c\\udfc0',\n 'basketball_man':'\\u26f9\\ufe0f',\n 'basketball_woman':'\\u26f9\\ufe0f‍\\u2640\\ufe0f',\n 'bat':'\\ud83e\\udd87',\n 'bath':'\\ud83d\\udec0',\n 'bathtub':'\\ud83d\\udec1',\n 'battery':'\\ud83d\\udd0b',\n 'beach_umbrella':'\\ud83c\\udfd6',\n 'bear':'\\ud83d\\udc3b',\n 'bed':'\\ud83d\\udecf',\n 'bee':'\\ud83d\\udc1d',\n 'beer':'\\ud83c\\udf7a',\n 'beers':'\\ud83c\\udf7b',\n 'beetle':'\\ud83d\\udc1e',\n 'beginner':'\\ud83d\\udd30',\n 'bell':'\\ud83d\\udd14',\n 'bellhop_bell':'\\ud83d\\udece',\n 'bento':'\\ud83c\\udf71',\n 'biking_man':'\\ud83d\\udeb4',\n 'bike':'\\ud83d\\udeb2',\n 'biking_woman':'\\ud83d\\udeb4‍\\u2640\\ufe0f',\n 'bikini':'\\ud83d\\udc59',\n 'biohazard':'\\u2623\\ufe0f',\n 'bird':'\\ud83d\\udc26',\n 'birthday':'\\ud83c\\udf82',\n 'black_circle':'\\u26ab\\ufe0f',\n 'black_flag':'\\ud83c\\udff4',\n 'black_heart':'\\ud83d\\udda4',\n 'black_joker':'\\ud83c\\udccf',\n 'black_large_square':'\\u2b1b\\ufe0f',\n 'black_medium_small_square':'\\u25fe\\ufe0f',\n 'black_medium_square':'\\u25fc\\ufe0f',\n 'black_nib':'\\u2712\\ufe0f',\n 'black_small_square':'\\u25aa\\ufe0f',\n 'black_square_button':'\\ud83d\\udd32',\n 'blonde_man':'\\ud83d\\udc71',\n 'blonde_woman':'\\ud83d\\udc71‍\\u2640\\ufe0f',\n 'blossom':'\\ud83c\\udf3c',\n 'blowfish':'\\ud83d\\udc21',\n 'blue_book':'\\ud83d\\udcd8',\n 'blue_car':'\\ud83d\\ude99',\n 'blue_heart':'\\ud83d\\udc99',\n 'blush':'\\ud83d\\ude0a',\n 'boar':'\\ud83d\\udc17',\n 'boat':'\\u26f5\\ufe0f',\n 'bomb':'\\ud83d\\udca3',\n 'book':'\\ud83d\\udcd6',\n 'bookmark':'\\ud83d\\udd16',\n 'bookmark_tabs':'\\ud83d\\udcd1',\n 'books':'\\ud83d\\udcda',\n 'boom':'\\ud83d\\udca5',\n 'boot':'\\ud83d\\udc62',\n 'bouquet':'\\ud83d\\udc90',\n 'bowing_man':'\\ud83d\\ude47',\n 'bow_and_arrow':'\\ud83c\\udff9',\n 'bowing_woman':'\\ud83d\\ude47‍\\u2640\\ufe0f',\n 'bowling':'\\ud83c\\udfb3',\n 'boxing_glove':'\\ud83e\\udd4a',\n 'boy':'\\ud83d\\udc66',\n 'bread':'\\ud83c\\udf5e',\n 'bride_with_veil':'\\ud83d\\udc70',\n 'bridge_at_night':'\\ud83c\\udf09',\n 'briefcase':'\\ud83d\\udcbc',\n 'broken_heart':'\\ud83d\\udc94',\n 'bug':'\\ud83d\\udc1b',\n 'building_construction':'\\ud83c\\udfd7',\n 'bulb':'\\ud83d\\udca1',\n 'bullettrain_front':'\\ud83d\\ude85',\n 'bullettrain_side':'\\ud83d\\ude84',\n 'burrito':'\\ud83c\\udf2f',\n 'bus':'\\ud83d\\ude8c',\n 'business_suit_levitating':'\\ud83d\\udd74',\n 'busstop':'\\ud83d\\ude8f',\n 'bust_in_silhouette':'\\ud83d\\udc64',\n 'busts_in_silhouette':'\\ud83d\\udc65',\n 'butterfly':'\\ud83e\\udd8b',\n 'cactus':'\\ud83c\\udf35',\n 'cake':'\\ud83c\\udf70',\n 'calendar':'\\ud83d\\udcc6',\n 'call_me_hand':'\\ud83e\\udd19',\n 'calling':'\\ud83d\\udcf2',\n 'camel':'\\ud83d\\udc2b',\n 'camera':'\\ud83d\\udcf7',\n 'camera_flash':'\\ud83d\\udcf8',\n 'camping':'\\ud83c\\udfd5',\n 'cancer':'\\u264b\\ufe0f',\n 'candle':'\\ud83d\\udd6f',\n 'candy':'\\ud83c\\udf6c',\n 'canoe':'\\ud83d\\udef6',\n 'capital_abcd':'\\ud83d\\udd20',\n 'capricorn':'\\u2651\\ufe0f',\n 'car':'\\ud83d\\ude97',\n 'card_file_box':'\\ud83d\\uddc3',\n 'card_index':'\\ud83d\\udcc7',\n 'card_index_dividers':'\\ud83d\\uddc2',\n 'carousel_horse':'\\ud83c\\udfa0',\n 'carrot':'\\ud83e\\udd55',\n 'cat':'\\ud83d\\udc31',\n 'cat2':'\\ud83d\\udc08',\n 'cd':'\\ud83d\\udcbf',\n 'chains':'\\u26d3',\n 'champagne':'\\ud83c\\udf7e',\n 'chart':'\\ud83d\\udcb9',\n 'chart_with_downwards_trend':'\\ud83d\\udcc9',\n 'chart_with_upwards_trend':'\\ud83d\\udcc8',\n 'checkered_flag':'\\ud83c\\udfc1',\n 'cheese':'\\ud83e\\uddc0',\n 'cherries':'\\ud83c\\udf52',\n 'cherry_blossom':'\\ud83c\\udf38',\n 'chestnut':'\\ud83c\\udf30',\n 'chicken':'\\ud83d\\udc14',\n 'children_crossing':'\\ud83d\\udeb8',\n 'chipmunk':'\\ud83d\\udc3f',\n 'chocolate_bar':'\\ud83c\\udf6b',\n 'christmas_tree':'\\ud83c\\udf84',\n 'church':'\\u26ea\\ufe0f',\n 'cinema':'\\ud83c\\udfa6',\n 'circus_tent':'\\ud83c\\udfaa',\n 'city_sunrise':'\\ud83c\\udf07',\n 'city_sunset':'\\ud83c\\udf06',\n 'cityscape':'\\ud83c\\udfd9',\n 'cl':'\\ud83c\\udd91',\n 'clamp':'\\ud83d\\udddc',\n 'clap':'\\ud83d\\udc4f',\n 'clapper':'\\ud83c\\udfac',\n 'classical_building':'\\ud83c\\udfdb',\n 'clinking_glasses':'\\ud83e\\udd42',\n 'clipboard':'\\ud83d\\udccb',\n 'clock1':'\\ud83d\\udd50',\n 'clock10':'\\ud83d\\udd59',\n 'clock1030':'\\ud83d\\udd65',\n 'clock11':'\\ud83d\\udd5a',\n 'clock1130':'\\ud83d\\udd66',\n 'clock12':'\\ud83d\\udd5b',\n 'clock1230':'\\ud83d\\udd67',\n 'clock130':'\\ud83d\\udd5c',\n 'clock2':'\\ud83d\\udd51',\n 'clock230':'\\ud83d\\udd5d',\n 'clock3':'\\ud83d\\udd52',\n 'clock330':'\\ud83d\\udd5e',\n 'clock4':'\\ud83d\\udd53',\n 'clock430':'\\ud83d\\udd5f',\n 'clock5':'\\ud83d\\udd54',\n 'clock530':'\\ud83d\\udd60',\n 'clock6':'\\ud83d\\udd55',\n 'clock630':'\\ud83d\\udd61',\n 'clock7':'\\ud83d\\udd56',\n 'clock730':'\\ud83d\\udd62',\n 'clock8':'\\ud83d\\udd57',\n 'clock830':'\\ud83d\\udd63',\n 'clock9':'\\ud83d\\udd58',\n 'clock930':'\\ud83d\\udd64',\n 'closed_book':'\\ud83d\\udcd5',\n 'closed_lock_with_key':'\\ud83d\\udd10',\n 'closed_umbrella':'\\ud83c\\udf02',\n 'cloud':'\\u2601\\ufe0f',\n 'cloud_with_lightning':'\\ud83c\\udf29',\n 'cloud_with_lightning_and_rain':'\\u26c8',\n 'cloud_with_rain':'\\ud83c\\udf27',\n 'cloud_with_snow':'\\ud83c\\udf28',\n 'clown_face':'\\ud83e\\udd21',\n 'clubs':'\\u2663\\ufe0f',\n 'cocktail':'\\ud83c\\udf78',\n 'coffee':'\\u2615\\ufe0f',\n 'coffin':'\\u26b0\\ufe0f',\n 'cold_sweat':'\\ud83d\\ude30',\n 'comet':'\\u2604\\ufe0f',\n 'computer':'\\ud83d\\udcbb',\n 'computer_mouse':'\\ud83d\\uddb1',\n 'confetti_ball':'\\ud83c\\udf8a',\n 'confounded':'\\ud83d\\ude16',\n 'confused':'\\ud83d\\ude15',\n 'congratulations':'\\u3297\\ufe0f',\n 'construction':'\\ud83d\\udea7',\n 'construction_worker_man':'\\ud83d\\udc77',\n 'construction_worker_woman':'\\ud83d\\udc77‍\\u2640\\ufe0f',\n 'control_knobs':'\\ud83c\\udf9b',\n 'convenience_store':'\\ud83c\\udfea',\n 'cookie':'\\ud83c\\udf6a',\n 'cool':'\\ud83c\\udd92',\n 'policeman':'\\ud83d\\udc6e',\n 'copyright':'\\u00a9\\ufe0f',\n 'corn':'\\ud83c\\udf3d',\n 'couch_and_lamp':'\\ud83d\\udecb',\n 'couple':'\\ud83d\\udc6b',\n 'couple_with_heart_woman_man':'\\ud83d\\udc91',\n 'couple_with_heart_man_man':'\\ud83d\\udc68‍\\u2764\\ufe0f‍\\ud83d\\udc68',\n 'couple_with_heart_woman_woman':'\\ud83d\\udc69‍\\u2764\\ufe0f‍\\ud83d\\udc69',\n 'couplekiss_man_man':'\\ud83d\\udc68‍\\u2764\\ufe0f‍\\ud83d\\udc8b‍\\ud83d\\udc68',\n 'couplekiss_man_woman':'\\ud83d\\udc8f',\n 'couplekiss_woman_woman':'\\ud83d\\udc69‍\\u2764\\ufe0f‍\\ud83d\\udc8b‍\\ud83d\\udc69',\n 'cow':'\\ud83d\\udc2e',\n 'cow2':'\\ud83d\\udc04',\n 'cowboy_hat_face':'\\ud83e\\udd20',\n 'crab':'\\ud83e\\udd80',\n 'crayon':'\\ud83d\\udd8d',\n 'credit_card':'\\ud83d\\udcb3',\n 'crescent_moon':'\\ud83c\\udf19',\n 'cricket':'\\ud83c\\udfcf',\n 'crocodile':'\\ud83d\\udc0a',\n 'croissant':'\\ud83e\\udd50',\n 'crossed_fingers':'\\ud83e\\udd1e',\n 'crossed_flags':'\\ud83c\\udf8c',\n 'crossed_swords':'\\u2694\\ufe0f',\n 'crown':'\\ud83d\\udc51',\n 'cry':'\\ud83d\\ude22',\n 'crying_cat_face':'\\ud83d\\ude3f',\n 'crystal_ball':'\\ud83d\\udd2e',\n 'cucumber':'\\ud83e\\udd52',\n 'cupid':'\\ud83d\\udc98',\n 'curly_loop':'\\u27b0',\n 'currency_exchange':'\\ud83d\\udcb1',\n 'curry':'\\ud83c\\udf5b',\n 'custard':'\\ud83c\\udf6e',\n 'customs':'\\ud83d\\udec3',\n 'cyclone':'\\ud83c\\udf00',\n 'dagger':'\\ud83d\\udde1',\n 'dancer':'\\ud83d\\udc83',\n 'dancing_women':'\\ud83d\\udc6f',\n 'dancing_men':'\\ud83d\\udc6f‍\\u2642\\ufe0f',\n 'dango':'\\ud83c\\udf61',\n 'dark_sunglasses':'\\ud83d\\udd76',\n 'dart':'\\ud83c\\udfaf',\n 'dash':'\\ud83d\\udca8',\n 'date':'\\ud83d\\udcc5',\n 'deciduous_tree':'\\ud83c\\udf33',\n 'deer':'\\ud83e\\udd8c',\n 'department_store':'\\ud83c\\udfec',\n 'derelict_house':'\\ud83c\\udfda',\n 'desert':'\\ud83c\\udfdc',\n 'desert_island':'\\ud83c\\udfdd',\n 'desktop_computer':'\\ud83d\\udda5',\n 'male_detective':'\\ud83d\\udd75\\ufe0f',\n 'diamond_shape_with_a_dot_inside':'\\ud83d\\udca0',\n 'diamonds':'\\u2666\\ufe0f',\n 'disappointed':'\\ud83d\\ude1e',\n 'disappointed_relieved':'\\ud83d\\ude25',\n 'dizzy':'\\ud83d\\udcab',\n 'dizzy_face':'\\ud83d\\ude35',\n 'do_not_litter':'\\ud83d\\udeaf',\n 'dog':'\\ud83d\\udc36',\n 'dog2':'\\ud83d\\udc15',\n 'dollar':'\\ud83d\\udcb5',\n 'dolls':'\\ud83c\\udf8e',\n 'dolphin':'\\ud83d\\udc2c',\n 'door':'\\ud83d\\udeaa',\n 'doughnut':'\\ud83c\\udf69',\n 'dove':'\\ud83d\\udd4a',\n 'dragon':'\\ud83d\\udc09',\n 'dragon_face':'\\ud83d\\udc32',\n 'dress':'\\ud83d\\udc57',\n 'dromedary_camel':'\\ud83d\\udc2a',\n 'drooling_face':'\\ud83e\\udd24',\n 'droplet':'\\ud83d\\udca7',\n 'drum':'\\ud83e\\udd41',\n 'duck':'\\ud83e\\udd86',\n 'dvd':'\\ud83d\\udcc0',\n 'e-mail':'\\ud83d\\udce7',\n 'eagle':'\\ud83e\\udd85',\n 'ear':'\\ud83d\\udc42',\n 'ear_of_rice':'\\ud83c\\udf3e',\n 'earth_africa':'\\ud83c\\udf0d',\n 'earth_americas':'\\ud83c\\udf0e',\n 'earth_asia':'\\ud83c\\udf0f',\n 'egg':'\\ud83e\\udd5a',\n 'eggplant':'\\ud83c\\udf46',\n 'eight_pointed_black_star':'\\u2734\\ufe0f',\n 'eight_spoked_asterisk':'\\u2733\\ufe0f',\n 'electric_plug':'\\ud83d\\udd0c',\n 'elephant':'\\ud83d\\udc18',\n 'email':'\\u2709\\ufe0f',\n 'end':'\\ud83d\\udd1a',\n 'envelope_with_arrow':'\\ud83d\\udce9',\n 'euro':'\\ud83d\\udcb6',\n 'european_castle':'\\ud83c\\udff0',\n 'european_post_office':'\\ud83c\\udfe4',\n 'evergreen_tree':'\\ud83c\\udf32',\n 'exclamation':'\\u2757\\ufe0f',\n 'expressionless':'\\ud83d\\ude11',\n 'eye':'\\ud83d\\udc41',\n 'eye_speech_bubble':'\\ud83d\\udc41‍\\ud83d\\udde8',\n 'eyeglasses':'\\ud83d\\udc53',\n 'eyes':'\\ud83d\\udc40',\n 'face_with_head_bandage':'\\ud83e\\udd15',\n 'face_with_thermometer':'\\ud83e\\udd12',\n 'fist_oncoming':'\\ud83d\\udc4a',\n 'factory':'\\ud83c\\udfed',\n 'fallen_leaf':'\\ud83c\\udf42',\n 'family_man_woman_boy':'\\ud83d\\udc6a',\n 'family_man_boy':'\\ud83d\\udc68‍\\ud83d\\udc66',\n 'family_man_boy_boy':'\\ud83d\\udc68‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_man_girl':'\\ud83d\\udc68‍\\ud83d\\udc67',\n 'family_man_girl_boy':'\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_man_girl_girl':'\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_man_man_boy':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc66',\n 'family_man_man_boy_boy':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_man_man_girl':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc67',\n 'family_man_man_girl_boy':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_man_man_girl_girl':'\\ud83d\\udc68‍\\ud83d\\udc68‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_man_woman_boy_boy':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_man_woman_girl':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc67',\n 'family_man_woman_girl_boy':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_man_woman_girl_girl':'\\ud83d\\udc68‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_woman_boy':'\\ud83d\\udc69‍\\ud83d\\udc66',\n 'family_woman_boy_boy':'\\ud83d\\udc69‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_woman_girl':'\\ud83d\\udc69‍\\ud83d\\udc67',\n 'family_woman_girl_boy':'\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_woman_girl_girl':'\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'family_woman_woman_boy':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc66',\n 'family_woman_woman_boy_boy':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc66‍\\ud83d\\udc66',\n 'family_woman_woman_girl':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc67',\n 'family_woman_woman_girl_boy':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc66',\n 'family_woman_woman_girl_girl':'\\ud83d\\udc69‍\\ud83d\\udc69‍\\ud83d\\udc67‍\\ud83d\\udc67',\n 'fast_forward':'\\u23e9',\n 'fax':'\\ud83d\\udce0',\n 'fearful':'\\ud83d\\ude28',\n 'feet':'\\ud83d\\udc3e',\n 'female_detective':'\\ud83d\\udd75\\ufe0f‍\\u2640\\ufe0f',\n 'ferris_wheel':'\\ud83c\\udfa1',\n 'ferry':'\\u26f4',\n 'field_hockey':'\\ud83c\\udfd1',\n 'file_cabinet':'\\ud83d\\uddc4',\n 'file_folder':'\\ud83d\\udcc1',\n 'film_projector':'\\ud83d\\udcfd',\n 'film_strip':'\\ud83c\\udf9e',\n 'fire':'\\ud83d\\udd25',\n 'fire_engine':'\\ud83d\\ude92',\n 'fireworks':'\\ud83c\\udf86',\n 'first_quarter_moon':'\\ud83c\\udf13',\n 'first_quarter_moon_with_face':'\\ud83c\\udf1b',\n 'fish':'\\ud83d\\udc1f',\n 'fish_cake':'\\ud83c\\udf65',\n 'fishing_pole_and_fish':'\\ud83c\\udfa3',\n 'fist_raised':'\\u270a',\n 'fist_left':'\\ud83e\\udd1b',\n 'fist_right':'\\ud83e\\udd1c',\n 'flags':'\\ud83c\\udf8f',\n 'flashlight':'\\ud83d\\udd26',\n 'fleur_de_lis':'\\u269c\\ufe0f',\n 'flight_arrival':'\\ud83d\\udeec',\n 'flight_departure':'\\ud83d\\udeeb',\n 'floppy_disk':'\\ud83d\\udcbe',\n 'flower_playing_cards':'\\ud83c\\udfb4',\n 'flushed':'\\ud83d\\ude33',\n 'fog':'\\ud83c\\udf2b',\n 'foggy':'\\ud83c\\udf01',\n 'football':'\\ud83c\\udfc8',\n 'footprints':'\\ud83d\\udc63',\n 'fork_and_knife':'\\ud83c\\udf74',\n 'fountain':'\\u26f2\\ufe0f',\n 'fountain_pen':'\\ud83d\\udd8b',\n 'four_leaf_clover':'\\ud83c\\udf40',\n 'fox_face':'\\ud83e\\udd8a',\n 'framed_picture':'\\ud83d\\uddbc',\n 'free':'\\ud83c\\udd93',\n 'fried_egg':'\\ud83c\\udf73',\n 'fried_shrimp':'\\ud83c\\udf64',\n 'fries':'\\ud83c\\udf5f',\n 'frog':'\\ud83d\\udc38',\n 'frowning':'\\ud83d\\ude26',\n 'frowning_face':'\\u2639\\ufe0f',\n 'frowning_man':'\\ud83d\\ude4d‍\\u2642\\ufe0f',\n 'frowning_woman':'\\ud83d\\ude4d',\n 'middle_finger':'\\ud83d\\udd95',\n 'fuelpump':'\\u26fd\\ufe0f',\n 'full_moon':'\\ud83c\\udf15',\n 'full_moon_with_face':'\\ud83c\\udf1d',\n 'funeral_urn':'\\u26b1\\ufe0f',\n 'game_die':'\\ud83c\\udfb2',\n 'gear':'\\u2699\\ufe0f',\n 'gem':'\\ud83d\\udc8e',\n 'gemini':'\\u264a\\ufe0f',\n 'ghost':'\\ud83d\\udc7b',\n 'gift':'\\ud83c\\udf81',\n 'gift_heart':'\\ud83d\\udc9d',\n 'girl':'\\ud83d\\udc67',\n 'globe_with_meridians':'\\ud83c\\udf10',\n 'goal_net':'\\ud83e\\udd45',\n 'goat':'\\ud83d\\udc10',\n 'golf':'\\u26f3\\ufe0f',\n 'golfing_man':'\\ud83c\\udfcc\\ufe0f',\n 'golfing_woman':'\\ud83c\\udfcc\\ufe0f‍\\u2640\\ufe0f',\n 'gorilla':'\\ud83e\\udd8d',\n 'grapes':'\\ud83c\\udf47',\n 'green_apple':'\\ud83c\\udf4f',\n 'green_book':'\\ud83d\\udcd7',\n 'green_heart':'\\ud83d\\udc9a',\n 'green_salad':'\\ud83e\\udd57',\n 'grey_exclamation':'\\u2755',\n 'grey_question':'\\u2754',\n 'grimacing':'\\ud83d\\ude2c',\n 'grin':'\\ud83d\\ude01',\n 'grinning':'\\ud83d\\ude00',\n 'guardsman':'\\ud83d\\udc82',\n 'guardswoman':'\\ud83d\\udc82‍\\u2640\\ufe0f',\n 'guitar':'\\ud83c\\udfb8',\n 'gun':'\\ud83d\\udd2b',\n 'haircut_woman':'\\ud83d\\udc87',\n 'haircut_man':'\\ud83d\\udc87‍\\u2642\\ufe0f',\n 'hamburger':'\\ud83c\\udf54',\n 'hammer':'\\ud83d\\udd28',\n 'hammer_and_pick':'\\u2692',\n 'hammer_and_wrench':'\\ud83d\\udee0',\n 'hamster':'\\ud83d\\udc39',\n 'hand':'\\u270b',\n 'handbag':'\\ud83d\\udc5c',\n 'handshake':'\\ud83e\\udd1d',\n 'hankey':'\\ud83d\\udca9',\n 'hatched_chick':'\\ud83d\\udc25',\n 'hatching_chick':'\\ud83d\\udc23',\n 'headphones':'\\ud83c\\udfa7',\n 'hear_no_evil':'\\ud83d\\ude49',\n 'heart':'\\u2764\\ufe0f',\n 'heart_decoration':'\\ud83d\\udc9f',\n 'heart_eyes':'\\ud83d\\ude0d',\n 'heart_eyes_cat':'\\ud83d\\ude3b',\n 'heartbeat':'\\ud83d\\udc93',\n 'heartpulse':'\\ud83d\\udc97',\n 'hearts':'\\u2665\\ufe0f',\n 'heavy_check_mark':'\\u2714\\ufe0f',\n 'heavy_division_sign':'\\u2797',\n 'heavy_dollar_sign':'\\ud83d\\udcb2',\n 'heavy_heart_exclamation':'\\u2763\\ufe0f',\n 'heavy_minus_sign':'\\u2796',\n 'heavy_multiplication_x':'\\u2716\\ufe0f',\n 'heavy_plus_sign':'\\u2795',\n 'helicopter':'\\ud83d\\ude81',\n 'herb':'\\ud83c\\udf3f',\n 'hibiscus':'\\ud83c\\udf3a',\n 'high_brightness':'\\ud83d\\udd06',\n 'high_heel':'\\ud83d\\udc60',\n 'hocho':'\\ud83d\\udd2a',\n 'hole':'\\ud83d\\udd73',\n 'honey_pot':'\\ud83c\\udf6f',\n 'horse':'\\ud83d\\udc34',\n 'horse_racing':'\\ud83c\\udfc7',\n 'hospital':'\\ud83c\\udfe5',\n 'hot_pepper':'\\ud83c\\udf36',\n 'hotdog':'\\ud83c\\udf2d',\n 'hotel':'\\ud83c\\udfe8',\n 'hotsprings':'\\u2668\\ufe0f',\n 'hourglass':'\\u231b\\ufe0f',\n 'hourglass_flowing_sand':'\\u23f3',\n 'house':'\\ud83c\\udfe0',\n 'house_with_garden':'\\ud83c\\udfe1',\n 'houses':'\\ud83c\\udfd8',\n 'hugs':'\\ud83e\\udd17',\n 'hushed':'\\ud83d\\ude2f',\n 'ice_cream':'\\ud83c\\udf68',\n 'ice_hockey':'\\ud83c\\udfd2',\n 'ice_skate':'\\u26f8',\n 'icecream':'\\ud83c\\udf66',\n 'id':'\\ud83c\\udd94',\n 'ideograph_advantage':'\\ud83c\\ude50',\n 'imp':'\\ud83d\\udc7f',\n 'inbox_tray':'\\ud83d\\udce5',\n 'incoming_envelope':'\\ud83d\\udce8',\n 'tipping_hand_woman':'\\ud83d\\udc81',\n 'information_source':'\\u2139\\ufe0f',\n 'innocent':'\\ud83d\\ude07',\n 'interrobang':'\\u2049\\ufe0f',\n 'iphone':'\\ud83d\\udcf1',\n 'izakaya_lantern':'\\ud83c\\udfee',\n 'jack_o_lantern':'\\ud83c\\udf83',\n 'japan':'\\ud83d\\uddfe',\n 'japanese_castle':'\\ud83c\\udfef',\n 'japanese_goblin':'\\ud83d\\udc7a',\n 'japanese_ogre':'\\ud83d\\udc79',\n 'jeans':'\\ud83d\\udc56',\n 'joy':'\\ud83d\\ude02',\n 'joy_cat':'\\ud83d\\ude39',\n 'joystick':'\\ud83d\\udd79',\n 'kaaba':'\\ud83d\\udd4b',\n 'key':'\\ud83d\\udd11',\n 'keyboard':'\\u2328\\ufe0f',\n 'keycap_ten':'\\ud83d\\udd1f',\n 'kick_scooter':'\\ud83d\\udef4',\n 'kimono':'\\ud83d\\udc58',\n 'kiss':'\\ud83d\\udc8b',\n 'kissing':'\\ud83d\\ude17',\n 'kissing_cat':'\\ud83d\\ude3d',\n 'kissing_closed_eyes':'\\ud83d\\ude1a',\n 'kissing_heart':'\\ud83d\\ude18',\n 'kissing_smiling_eyes':'\\ud83d\\ude19',\n 'kiwi_fruit':'\\ud83e\\udd5d',\n 'koala':'\\ud83d\\udc28',\n 'koko':'\\ud83c\\ude01',\n 'label':'\\ud83c\\udff7',\n 'large_blue_circle':'\\ud83d\\udd35',\n 'large_blue_diamond':'\\ud83d\\udd37',\n 'large_orange_diamond':'\\ud83d\\udd36',\n 'last_quarter_moon':'\\ud83c\\udf17',\n 'last_quarter_moon_with_face':'\\ud83c\\udf1c',\n 'latin_cross':'\\u271d\\ufe0f',\n 'laughing':'\\ud83d\\ude06',\n 'leaves':'\\ud83c\\udf43',\n 'ledger':'\\ud83d\\udcd2',\n 'left_luggage':'\\ud83d\\udec5',\n 'left_right_arrow':'\\u2194\\ufe0f',\n 'leftwards_arrow_with_hook':'\\u21a9\\ufe0f',\n 'lemon':'\\ud83c\\udf4b',\n 'leo':'\\u264c\\ufe0f',\n 'leopard':'\\ud83d\\udc06',\n 'level_slider':'\\ud83c\\udf9a',\n 'libra':'\\u264e\\ufe0f',\n 'light_rail':'\\ud83d\\ude88',\n 'link':'\\ud83d\\udd17',\n 'lion':'\\ud83e\\udd81',\n 'lips':'\\ud83d\\udc44',\n 'lipstick':'\\ud83d\\udc84',\n 'lizard':'\\ud83e\\udd8e',\n 'lock':'\\ud83d\\udd12',\n 'lock_with_ink_pen':'\\ud83d\\udd0f',\n 'lollipop':'\\ud83c\\udf6d',\n 'loop':'\\u27bf',\n 'loud_sound':'\\ud83d\\udd0a',\n 'loudspeaker':'\\ud83d\\udce2',\n 'love_hotel':'\\ud83c\\udfe9',\n 'love_letter':'\\ud83d\\udc8c',\n 'low_brightness':'\\ud83d\\udd05',\n 'lying_face':'\\ud83e\\udd25',\n 'm':'\\u24c2\\ufe0f',\n 'mag':'\\ud83d\\udd0d',\n 'mag_right':'\\ud83d\\udd0e',\n 'mahjong':'\\ud83c\\udc04\\ufe0f',\n 'mailbox':'\\ud83d\\udceb',\n 'mailbox_closed':'\\ud83d\\udcea',\n 'mailbox_with_mail':'\\ud83d\\udcec',\n 'mailbox_with_no_mail':'\\ud83d\\udced',\n 'man':'\\ud83d\\udc68',\n 'man_artist':'\\ud83d\\udc68‍\\ud83c\\udfa8',\n 'man_astronaut':'\\ud83d\\udc68‍\\ud83d\\ude80',\n 'man_cartwheeling':'\\ud83e\\udd38‍\\u2642\\ufe0f',\n 'man_cook':'\\ud83d\\udc68‍\\ud83c\\udf73',\n 'man_dancing':'\\ud83d\\udd7a',\n 'man_facepalming':'\\ud83e\\udd26‍\\u2642\\ufe0f',\n 'man_factory_worker':'\\ud83d\\udc68‍\\ud83c\\udfed',\n 'man_farmer':'\\ud83d\\udc68‍\\ud83c\\udf3e',\n 'man_firefighter':'\\ud83d\\udc68‍\\ud83d\\ude92',\n 'man_health_worker':'\\ud83d\\udc68‍\\u2695\\ufe0f',\n 'man_in_tuxedo':'\\ud83e\\udd35',\n 'man_judge':'\\ud83d\\udc68‍\\u2696\\ufe0f',\n 'man_juggling':'\\ud83e\\udd39‍\\u2642\\ufe0f',\n 'man_mechanic':'\\ud83d\\udc68‍\\ud83d\\udd27',\n 'man_office_worker':'\\ud83d\\udc68‍\\ud83d\\udcbc',\n 'man_pilot':'\\ud83d\\udc68‍\\u2708\\ufe0f',\n 'man_playing_handball':'\\ud83e\\udd3e‍\\u2642\\ufe0f',\n 'man_playing_water_polo':'\\ud83e\\udd3d‍\\u2642\\ufe0f',\n 'man_scientist':'\\ud83d\\udc68‍\\ud83d\\udd2c',\n 'man_shrugging':'\\ud83e\\udd37‍\\u2642\\ufe0f',\n 'man_singer':'\\ud83d\\udc68‍\\ud83c\\udfa4',\n 'man_student':'\\ud83d\\udc68‍\\ud83c\\udf93',\n 'man_teacher':'\\ud83d\\udc68‍\\ud83c\\udfeb',\n 'man_technologist':'\\ud83d\\udc68‍\\ud83d\\udcbb',\n 'man_with_gua_pi_mao':'\\ud83d\\udc72',\n 'man_with_turban':'\\ud83d\\udc73',\n 'tangerine':'\\ud83c\\udf4a',\n 'mans_shoe':'\\ud83d\\udc5e',\n 'mantelpiece_clock':'\\ud83d\\udd70',\n 'maple_leaf':'\\ud83c\\udf41',\n 'martial_arts_uniform':'\\ud83e\\udd4b',\n 'mask':'\\ud83d\\ude37',\n 'massage_woman':'\\ud83d\\udc86',\n 'massage_man':'\\ud83d\\udc86‍\\u2642\\ufe0f',\n 'meat_on_bone':'\\ud83c\\udf56',\n 'medal_military':'\\ud83c\\udf96',\n 'medal_sports':'\\ud83c\\udfc5',\n 'mega':'\\ud83d\\udce3',\n 'melon':'\\ud83c\\udf48',\n 'memo':'\\ud83d\\udcdd',\n 'men_wrestling':'\\ud83e\\udd3c‍\\u2642\\ufe0f',\n 'menorah':'\\ud83d\\udd4e',\n 'mens':'\\ud83d\\udeb9',\n 'metal':'\\ud83e\\udd18',\n 'metro':'\\ud83d\\ude87',\n 'microphone':'\\ud83c\\udfa4',\n 'microscope':'\\ud83d\\udd2c',\n 'milk_glass':'\\ud83e\\udd5b',\n 'milky_way':'\\ud83c\\udf0c',\n 'minibus':'\\ud83d\\ude90',\n 'minidisc':'\\ud83d\\udcbd',\n 'mobile_phone_off':'\\ud83d\\udcf4',\n 'money_mouth_face':'\\ud83e\\udd11',\n 'money_with_wings':'\\ud83d\\udcb8',\n 'moneybag':'\\ud83d\\udcb0',\n 'monkey':'\\ud83d\\udc12',\n 'monkey_face':'\\ud83d\\udc35',\n 'monorail':'\\ud83d\\ude9d',\n 'moon':'\\ud83c\\udf14',\n 'mortar_board':'\\ud83c\\udf93',\n 'mosque':'\\ud83d\\udd4c',\n 'motor_boat':'\\ud83d\\udee5',\n 'motor_scooter':'\\ud83d\\udef5',\n 'motorcycle':'\\ud83c\\udfcd',\n 'motorway':'\\ud83d\\udee3',\n 'mount_fuji':'\\ud83d\\uddfb',\n 'mountain':'\\u26f0',\n 'mountain_biking_man':'\\ud83d\\udeb5',\n 'mountain_biking_woman':'\\ud83d\\udeb5‍\\u2640\\ufe0f',\n 'mountain_cableway':'\\ud83d\\udea0',\n 'mountain_railway':'\\ud83d\\ude9e',\n 'mountain_snow':'\\ud83c\\udfd4',\n 'mouse':'\\ud83d\\udc2d',\n 'mouse2':'\\ud83d\\udc01',\n 'movie_camera':'\\ud83c\\udfa5',\n 'moyai':'\\ud83d\\uddff',\n 'mrs_claus':'\\ud83e\\udd36',\n 'muscle':'\\ud83d\\udcaa',\n 'mushroom':'\\ud83c\\udf44',\n 'musical_keyboard':'\\ud83c\\udfb9',\n 'musical_note':'\\ud83c\\udfb5',\n 'musical_score':'\\ud83c\\udfbc',\n 'mute':'\\ud83d\\udd07',\n 'nail_care':'\\ud83d\\udc85',\n 'name_badge':'\\ud83d\\udcdb',\n 'national_park':'\\ud83c\\udfde',\n 'nauseated_face':'\\ud83e\\udd22',\n 'necktie':'\\ud83d\\udc54',\n 'negative_squared_cross_mark':'\\u274e',\n 'nerd_face':'\\ud83e\\udd13',\n 'neutral_face':'\\ud83d\\ude10',\n 'new':'\\ud83c\\udd95',\n 'new_moon':'\\ud83c\\udf11',\n 'new_moon_with_face':'\\ud83c\\udf1a',\n 'newspaper':'\\ud83d\\udcf0',\n 'newspaper_roll':'\\ud83d\\uddde',\n 'next_track_button':'\\u23ed',\n 'ng':'\\ud83c\\udd96',\n 'no_good_man':'\\ud83d\\ude45‍\\u2642\\ufe0f',\n 'no_good_woman':'\\ud83d\\ude45',\n 'night_with_stars':'\\ud83c\\udf03',\n 'no_bell':'\\ud83d\\udd15',\n 'no_bicycles':'\\ud83d\\udeb3',\n 'no_entry':'\\u26d4\\ufe0f',\n 'no_entry_sign':'\\ud83d\\udeab',\n 'no_mobile_phones':'\\ud83d\\udcf5',\n 'no_mouth':'\\ud83d\\ude36',\n 'no_pedestrians':'\\ud83d\\udeb7',\n 'no_smoking':'\\ud83d\\udead',\n 'non-potable_water':'\\ud83d\\udeb1',\n 'nose':'\\ud83d\\udc43',\n 'notebook':'\\ud83d\\udcd3',\n 'notebook_with_decorative_cover':'\\ud83d\\udcd4',\n 'notes':'\\ud83c\\udfb6',\n 'nut_and_bolt':'\\ud83d\\udd29',\n 'o':'\\u2b55\\ufe0f',\n 'o2':'\\ud83c\\udd7e\\ufe0f',\n 'ocean':'\\ud83c\\udf0a',\n 'octopus':'\\ud83d\\udc19',\n 'oden':'\\ud83c\\udf62',\n 'office':'\\ud83c\\udfe2',\n 'oil_drum':'\\ud83d\\udee2',\n 'ok':'\\ud83c\\udd97',\n 'ok_hand':'\\ud83d\\udc4c',\n 'ok_man':'\\ud83d\\ude46‍\\u2642\\ufe0f',\n 'ok_woman':'\\ud83d\\ude46',\n 'old_key':'\\ud83d\\udddd',\n 'older_man':'\\ud83d\\udc74',\n 'older_woman':'\\ud83d\\udc75',\n 'om':'\\ud83d\\udd49',\n 'on':'\\ud83d\\udd1b',\n 'oncoming_automobile':'\\ud83d\\ude98',\n 'oncoming_bus':'\\ud83d\\ude8d',\n 'oncoming_police_car':'\\ud83d\\ude94',\n 'oncoming_taxi':'\\ud83d\\ude96',\n 'open_file_folder':'\\ud83d\\udcc2',\n 'open_hands':'\\ud83d\\udc50',\n 'open_mouth':'\\ud83d\\ude2e',\n 'open_umbrella':'\\u2602\\ufe0f',\n 'ophiuchus':'\\u26ce',\n 'orange_book':'\\ud83d\\udcd9',\n 'orthodox_cross':'\\u2626\\ufe0f',\n 'outbox_tray':'\\ud83d\\udce4',\n 'owl':'\\ud83e\\udd89',\n 'ox':'\\ud83d\\udc02',\n 'package':'\\ud83d\\udce6',\n 'page_facing_up':'\\ud83d\\udcc4',\n 'page_with_curl':'\\ud83d\\udcc3',\n 'pager':'\\ud83d\\udcdf',\n 'paintbrush':'\\ud83d\\udd8c',\n 'palm_tree':'\\ud83c\\udf34',\n 'pancakes':'\\ud83e\\udd5e',\n 'panda_face':'\\ud83d\\udc3c',\n 'paperclip':'\\ud83d\\udcce',\n 'paperclips':'\\ud83d\\udd87',\n 'parasol_on_ground':'\\u26f1',\n 'parking':'\\ud83c\\udd7f\\ufe0f',\n 'part_alternation_mark':'\\u303d\\ufe0f',\n 'partly_sunny':'\\u26c5\\ufe0f',\n 'passenger_ship':'\\ud83d\\udef3',\n 'passport_control':'\\ud83d\\udec2',\n 'pause_button':'\\u23f8',\n 'peace_symbol':'\\u262e\\ufe0f',\n 'peach':'\\ud83c\\udf51',\n 'peanuts':'\\ud83e\\udd5c',\n 'pear':'\\ud83c\\udf50',\n 'pen':'\\ud83d\\udd8a',\n 'pencil2':'\\u270f\\ufe0f',\n 'penguin':'\\ud83d\\udc27',\n 'pensive':'\\ud83d\\ude14',\n 'performing_arts':'\\ud83c\\udfad',\n 'persevere':'\\ud83d\\ude23',\n 'person_fencing':'\\ud83e\\udd3a',\n 'pouting_woman':'\\ud83d\\ude4e',\n 'phone':'\\u260e\\ufe0f',\n 'pick':'\\u26cf',\n 'pig':'\\ud83d\\udc37',\n 'pig2':'\\ud83d\\udc16',\n 'pig_nose':'\\ud83d\\udc3d',\n 'pill':'\\ud83d\\udc8a',\n 'pineapple':'\\ud83c\\udf4d',\n 'ping_pong':'\\ud83c\\udfd3',\n 'pisces':'\\u2653\\ufe0f',\n 'pizza':'\\ud83c\\udf55',\n 'place_of_worship':'\\ud83d\\uded0',\n 'plate_with_cutlery':'\\ud83c\\udf7d',\n 'play_or_pause_button':'\\u23ef',\n 'point_down':'\\ud83d\\udc47',\n 'point_left':'\\ud83d\\udc48',\n 'point_right':'\\ud83d\\udc49',\n 'point_up':'\\u261d\\ufe0f',\n 'point_up_2':'\\ud83d\\udc46',\n 'police_car':'\\ud83d\\ude93',\n 'policewoman':'\\ud83d\\udc6e‍\\u2640\\ufe0f',\n 'poodle':'\\ud83d\\udc29',\n 'popcorn':'\\ud83c\\udf7f',\n 'post_office':'\\ud83c\\udfe3',\n 'postal_horn':'\\ud83d\\udcef',\n 'postbox':'\\ud83d\\udcee',\n 'potable_water':'\\ud83d\\udeb0',\n 'potato':'\\ud83e\\udd54',\n 'pouch':'\\ud83d\\udc5d',\n 'poultry_leg':'\\ud83c\\udf57',\n 'pound':'\\ud83d\\udcb7',\n 'rage':'\\ud83d\\ude21',\n 'pouting_cat':'\\ud83d\\ude3e',\n 'pouting_man':'\\ud83d\\ude4e‍\\u2642\\ufe0f',\n 'pray':'\\ud83d\\ude4f',\n 'prayer_beads':'\\ud83d\\udcff',\n 'pregnant_woman':'\\ud83e\\udd30',\n 'previous_track_button':'\\u23ee',\n 'prince':'\\ud83e\\udd34',\n 'princess':'\\ud83d\\udc78',\n 'printer':'\\ud83d\\udda8',\n 'purple_heart':'\\ud83d\\udc9c',\n 'purse':'\\ud83d\\udc5b',\n 'pushpin':'\\ud83d\\udccc',\n 'put_litter_in_its_place':'\\ud83d\\udeae',\n 'question':'\\u2753',\n 'rabbit':'\\ud83d\\udc30',\n 'rabbit2':'\\ud83d\\udc07',\n 'racehorse':'\\ud83d\\udc0e',\n 'racing_car':'\\ud83c\\udfce',\n 'radio':'\\ud83d\\udcfb',\n 'radio_button':'\\ud83d\\udd18',\n 'radioactive':'\\u2622\\ufe0f',\n 'railway_car':'\\ud83d\\ude83',\n 'railway_track':'\\ud83d\\udee4',\n 'rainbow':'\\ud83c\\udf08',\n 'rainbow_flag':'\\ud83c\\udff3\\ufe0f‍\\ud83c\\udf08',\n 'raised_back_of_hand':'\\ud83e\\udd1a',\n 'raised_hand_with_fingers_splayed':'\\ud83d\\udd90',\n 'raised_hands':'\\ud83d\\ude4c',\n 'raising_hand_woman':'\\ud83d\\ude4b',\n 'raising_hand_man':'\\ud83d\\ude4b‍\\u2642\\ufe0f',\n 'ram':'\\ud83d\\udc0f',\n 'ramen':'\\ud83c\\udf5c',\n 'rat':'\\ud83d\\udc00',\n 'record_button':'\\u23fa',\n 'recycle':'\\u267b\\ufe0f',\n 'red_circle':'\\ud83d\\udd34',\n 'registered':'\\u00ae\\ufe0f',\n 'relaxed':'\\u263a\\ufe0f',\n 'relieved':'\\ud83d\\ude0c',\n 'reminder_ribbon':'\\ud83c\\udf97',\n 'repeat':'\\ud83d\\udd01',\n 'repeat_one':'\\ud83d\\udd02',\n 'rescue_worker_helmet':'\\u26d1',\n 'restroom':'\\ud83d\\udebb',\n 'revolving_hearts':'\\ud83d\\udc9e',\n 'rewind':'\\u23ea',\n 'rhinoceros':'\\ud83e\\udd8f',\n 'ribbon':'\\ud83c\\udf80',\n 'rice':'\\ud83c\\udf5a',\n 'rice_ball':'\\ud83c\\udf59',\n 'rice_cracker':'\\ud83c\\udf58',\n 'rice_scene':'\\ud83c\\udf91',\n 'right_anger_bubble':'\\ud83d\\uddef',\n 'ring':'\\ud83d\\udc8d',\n 'robot':'\\ud83e\\udd16',\n 'rocket':'\\ud83d\\ude80',\n 'rofl':'\\ud83e\\udd23',\n 'roll_eyes':'\\ud83d\\ude44',\n 'roller_coaster':'\\ud83c\\udfa2',\n 'rooster':'\\ud83d\\udc13',\n 'rose':'\\ud83c\\udf39',\n 'rosette':'\\ud83c\\udff5',\n 'rotating_light':'\\ud83d\\udea8',\n 'round_pushpin':'\\ud83d\\udccd',\n 'rowing_man':'\\ud83d\\udea3',\n 'rowing_woman':'\\ud83d\\udea3‍\\u2640\\ufe0f',\n 'rugby_football':'\\ud83c\\udfc9',\n 'running_man':'\\ud83c\\udfc3',\n 'running_shirt_with_sash':'\\ud83c\\udfbd',\n 'running_woman':'\\ud83c\\udfc3‍\\u2640\\ufe0f',\n 'sa':'\\ud83c\\ude02\\ufe0f',\n 'sagittarius':'\\u2650\\ufe0f',\n 'sake':'\\ud83c\\udf76',\n 'sandal':'\\ud83d\\udc61',\n 'santa':'\\ud83c\\udf85',\n 'satellite':'\\ud83d\\udce1',\n 'saxophone':'\\ud83c\\udfb7',\n 'school':'\\ud83c\\udfeb',\n 'school_satchel':'\\ud83c\\udf92',\n 'scissors':'\\u2702\\ufe0f',\n 'scorpion':'\\ud83e\\udd82',\n 'scorpius':'\\u264f\\ufe0f',\n 'scream':'\\ud83d\\ude31',\n 'scream_cat':'\\ud83d\\ude40',\n 'scroll':'\\ud83d\\udcdc',\n 'seat':'\\ud83d\\udcba',\n 'secret':'\\u3299\\ufe0f',\n 'see_no_evil':'\\ud83d\\ude48',\n 'seedling':'\\ud83c\\udf31',\n 'selfie':'\\ud83e\\udd33',\n 'shallow_pan_of_food':'\\ud83e\\udd58',\n 'shamrock':'\\u2618\\ufe0f',\n 'shark':'\\ud83e\\udd88',\n 'shaved_ice':'\\ud83c\\udf67',\n 'sheep':'\\ud83d\\udc11',\n 'shell':'\\ud83d\\udc1a',\n 'shield':'\\ud83d\\udee1',\n 'shinto_shrine':'\\u26e9',\n 'ship':'\\ud83d\\udea2',\n 'shirt':'\\ud83d\\udc55',\n 'shopping':'\\ud83d\\udecd',\n 'shopping_cart':'\\ud83d\\uded2',\n 'shower':'\\ud83d\\udebf',\n 'shrimp':'\\ud83e\\udd90',\n 'signal_strength':'\\ud83d\\udcf6',\n 'six_pointed_star':'\\ud83d\\udd2f',\n 'ski':'\\ud83c\\udfbf',\n 'skier':'\\u26f7',\n 'skull':'\\ud83d\\udc80',\n 'skull_and_crossbones':'\\u2620\\ufe0f',\n 'sleeping':'\\ud83d\\ude34',\n 'sleeping_bed':'\\ud83d\\udecc',\n 'sleepy':'\\ud83d\\ude2a',\n 'slightly_frowning_face':'\\ud83d\\ude41',\n 'slightly_smiling_face':'\\ud83d\\ude42',\n 'slot_machine':'\\ud83c\\udfb0',\n 'small_airplane':'\\ud83d\\udee9',\n 'small_blue_diamond':'\\ud83d\\udd39',\n 'small_orange_diamond':'\\ud83d\\udd38',\n 'small_red_triangle':'\\ud83d\\udd3a',\n 'small_red_triangle_down':'\\ud83d\\udd3b',\n 'smile':'\\ud83d\\ude04',\n 'smile_cat':'\\ud83d\\ude38',\n 'smiley':'\\ud83d\\ude03',\n 'smiley_cat':'\\ud83d\\ude3a',\n 'smiling_imp':'\\ud83d\\ude08',\n 'smirk':'\\ud83d\\ude0f',\n 'smirk_cat':'\\ud83d\\ude3c',\n 'smoking':'\\ud83d\\udeac',\n 'snail':'\\ud83d\\udc0c',\n 'snake':'\\ud83d\\udc0d',\n 'sneezing_face':'\\ud83e\\udd27',\n 'snowboarder':'\\ud83c\\udfc2',\n 'snowflake':'\\u2744\\ufe0f',\n 'snowman':'\\u26c4\\ufe0f',\n 'snowman_with_snow':'\\u2603\\ufe0f',\n 'sob':'\\ud83d\\ude2d',\n 'soccer':'\\u26bd\\ufe0f',\n 'soon':'\\ud83d\\udd1c',\n 'sos':'\\ud83c\\udd98',\n 'sound':'\\ud83d\\udd09',\n 'space_invader':'\\ud83d\\udc7e',\n 'spades':'\\u2660\\ufe0f',\n 'spaghetti':'\\ud83c\\udf5d',\n 'sparkle':'\\u2747\\ufe0f',\n 'sparkler':'\\ud83c\\udf87',\n 'sparkles':'\\u2728',\n 'sparkling_heart':'\\ud83d\\udc96',\n 'speak_no_evil':'\\ud83d\\ude4a',\n 'speaker':'\\ud83d\\udd08',\n 'speaking_head':'\\ud83d\\udde3',\n 'speech_balloon':'\\ud83d\\udcac',\n 'speedboat':'\\ud83d\\udea4',\n 'spider':'\\ud83d\\udd77',\n 'spider_web':'\\ud83d\\udd78',\n 'spiral_calendar':'\\ud83d\\uddd3',\n 'spiral_notepad':'\\ud83d\\uddd2',\n 'spoon':'\\ud83e\\udd44',\n 'squid':'\\ud83e\\udd91',\n 'stadium':'\\ud83c\\udfdf',\n 'star':'\\u2b50\\ufe0f',\n 'star2':'\\ud83c\\udf1f',\n 'star_and_crescent':'\\u262a\\ufe0f',\n 'star_of_david':'\\u2721\\ufe0f',\n 'stars':'\\ud83c\\udf20',\n 'station':'\\ud83d\\ude89',\n 'statue_of_liberty':'\\ud83d\\uddfd',\n 'steam_locomotive':'\\ud83d\\ude82',\n 'stew':'\\ud83c\\udf72',\n 'stop_button':'\\u23f9',\n 'stop_sign':'\\ud83d\\uded1',\n 'stopwatch':'\\u23f1',\n 'straight_ruler':'\\ud83d\\udccf',\n 'strawberry':'\\ud83c\\udf53',\n 'stuck_out_tongue':'\\ud83d\\ude1b',\n 'stuck_out_tongue_closed_eyes':'\\ud83d\\ude1d',\n 'stuck_out_tongue_winking_eye':'\\ud83d\\ude1c',\n 'studio_microphone':'\\ud83c\\udf99',\n 'stuffed_flatbread':'\\ud83e\\udd59',\n 'sun_behind_large_cloud':'\\ud83c\\udf25',\n 'sun_behind_rain_cloud':'\\ud83c\\udf26',\n 'sun_behind_small_cloud':'\\ud83c\\udf24',\n 'sun_with_face':'\\ud83c\\udf1e',\n 'sunflower':'\\ud83c\\udf3b',\n 'sunglasses':'\\ud83d\\ude0e',\n 'sunny':'\\u2600\\ufe0f',\n 'sunrise':'\\ud83c\\udf05',\n 'sunrise_over_mountains':'\\ud83c\\udf04',\n 'surfing_man':'\\ud83c\\udfc4',\n 'surfing_woman':'\\ud83c\\udfc4‍\\u2640\\ufe0f',\n 'sushi':'\\ud83c\\udf63',\n 'suspension_railway':'\\ud83d\\ude9f',\n 'sweat':'\\ud83d\\ude13',\n 'sweat_drops':'\\ud83d\\udca6',\n 'sweat_smile':'\\ud83d\\ude05',\n 'sweet_potato':'\\ud83c\\udf60',\n 'swimming_man':'\\ud83c\\udfca',\n 'swimming_woman':'\\ud83c\\udfca‍\\u2640\\ufe0f',\n 'symbols':'\\ud83d\\udd23',\n 'synagogue':'\\ud83d\\udd4d',\n 'syringe':'\\ud83d\\udc89',\n 'taco':'\\ud83c\\udf2e',\n 'tada':'\\ud83c\\udf89',\n 'tanabata_tree':'\\ud83c\\udf8b',\n 'taurus':'\\u2649\\ufe0f',\n 'taxi':'\\ud83d\\ude95',\n 'tea':'\\ud83c\\udf75',\n 'telephone_receiver':'\\ud83d\\udcde',\n 'telescope':'\\ud83d\\udd2d',\n 'tennis':'\\ud83c\\udfbe',\n 'tent':'\\u26fa\\ufe0f',\n 'thermometer':'\\ud83c\\udf21',\n 'thinking':'\\ud83e\\udd14',\n 'thought_balloon':'\\ud83d\\udcad',\n 'ticket':'\\ud83c\\udfab',\n 'tickets':'\\ud83c\\udf9f',\n 'tiger':'\\ud83d\\udc2f',\n 'tiger2':'\\ud83d\\udc05',\n 'timer_clock':'\\u23f2',\n 'tipping_hand_man':'\\ud83d\\udc81‍\\u2642\\ufe0f',\n 'tired_face':'\\ud83d\\ude2b',\n 'tm':'\\u2122\\ufe0f',\n 'toilet':'\\ud83d\\udebd',\n 'tokyo_tower':'\\ud83d\\uddfc',\n 'tomato':'\\ud83c\\udf45',\n 'tongue':'\\ud83d\\udc45',\n 'top':'\\ud83d\\udd1d',\n 'tophat':'\\ud83c\\udfa9',\n 'tornado':'\\ud83c\\udf2a',\n 'trackball':'\\ud83d\\uddb2',\n 'tractor':'\\ud83d\\ude9c',\n 'traffic_light':'\\ud83d\\udea5',\n 'train':'\\ud83d\\ude8b',\n 'train2':'\\ud83d\\ude86',\n 'tram':'\\ud83d\\ude8a',\n 'triangular_flag_on_post':'\\ud83d\\udea9',\n 'triangular_ruler':'\\ud83d\\udcd0',\n 'trident':'\\ud83d\\udd31',\n 'triumph':'\\ud83d\\ude24',\n 'trolleybus':'\\ud83d\\ude8e',\n 'trophy':'\\ud83c\\udfc6',\n 'tropical_drink':'\\ud83c\\udf79',\n 'tropical_fish':'\\ud83d\\udc20',\n 'truck':'\\ud83d\\ude9a',\n 'trumpet':'\\ud83c\\udfba',\n 'tulip':'\\ud83c\\udf37',\n 'tumbler_glass':'\\ud83e\\udd43',\n 'turkey':'\\ud83e\\udd83',\n 'turtle':'\\ud83d\\udc22',\n 'tv':'\\ud83d\\udcfa',\n 'twisted_rightwards_arrows':'\\ud83d\\udd00',\n 'two_hearts':'\\ud83d\\udc95',\n 'two_men_holding_hands':'\\ud83d\\udc6c',\n 'two_women_holding_hands':'\\ud83d\\udc6d',\n 'u5272':'\\ud83c\\ude39',\n 'u5408':'\\ud83c\\ude34',\n 'u55b6':'\\ud83c\\ude3a',\n 'u6307':'\\ud83c\\ude2f\\ufe0f',\n 'u6708':'\\ud83c\\ude37\\ufe0f',\n 'u6709':'\\ud83c\\ude36',\n 'u6e80':'\\ud83c\\ude35',\n 'u7121':'\\ud83c\\ude1a\\ufe0f',\n 'u7533':'\\ud83c\\ude38',\n 'u7981':'\\ud83c\\ude32',\n 'u7a7a':'\\ud83c\\ude33',\n 'umbrella':'\\u2614\\ufe0f',\n 'unamused':'\\ud83d\\ude12',\n 'underage':'\\ud83d\\udd1e',\n 'unicorn':'\\ud83e\\udd84',\n 'unlock':'\\ud83d\\udd13',\n 'up':'\\ud83c\\udd99',\n 'upside_down_face':'\\ud83d\\ude43',\n 'v':'\\u270c\\ufe0f',\n 'vertical_traffic_light':'\\ud83d\\udea6',\n 'vhs':'\\ud83d\\udcfc',\n 'vibration_mode':'\\ud83d\\udcf3',\n 'video_camera':'\\ud83d\\udcf9',\n 'video_game':'\\ud83c\\udfae',\n 'violin':'\\ud83c\\udfbb',\n 'virgo':'\\u264d\\ufe0f',\n 'volcano':'\\ud83c\\udf0b',\n 'volleyball':'\\ud83c\\udfd0',\n 'vs':'\\ud83c\\udd9a',\n 'vulcan_salute':'\\ud83d\\udd96',\n 'walking_man':'\\ud83d\\udeb6',\n 'walking_woman':'\\ud83d\\udeb6‍\\u2640\\ufe0f',\n 'waning_crescent_moon':'\\ud83c\\udf18',\n 'waning_gibbous_moon':'\\ud83c\\udf16',\n 'warning':'\\u26a0\\ufe0f',\n 'wastebasket':'\\ud83d\\uddd1',\n 'watch':'\\u231a\\ufe0f',\n 'water_buffalo':'\\ud83d\\udc03',\n 'watermelon':'\\ud83c\\udf49',\n 'wave':'\\ud83d\\udc4b',\n 'wavy_dash':'\\u3030\\ufe0f',\n 'waxing_crescent_moon':'\\ud83c\\udf12',\n 'wc':'\\ud83d\\udebe',\n 'weary':'\\ud83d\\ude29',\n 'wedding':'\\ud83d\\udc92',\n 'weight_lifting_man':'\\ud83c\\udfcb\\ufe0f',\n 'weight_lifting_woman':'\\ud83c\\udfcb\\ufe0f‍\\u2640\\ufe0f',\n 'whale':'\\ud83d\\udc33',\n 'whale2':'\\ud83d\\udc0b',\n 'wheel_of_dharma':'\\u2638\\ufe0f',\n 'wheelchair':'\\u267f\\ufe0f',\n 'white_check_mark':'\\u2705',\n 'white_circle':'\\u26aa\\ufe0f',\n 'white_flag':'\\ud83c\\udff3\\ufe0f',\n 'white_flower':'\\ud83d\\udcae',\n 'white_large_square':'\\u2b1c\\ufe0f',\n 'white_medium_small_square':'\\u25fd\\ufe0f',\n 'white_medium_square':'\\u25fb\\ufe0f',\n 'white_small_square':'\\u25ab\\ufe0f',\n 'white_square_button':'\\ud83d\\udd33',\n 'wilted_flower':'\\ud83e\\udd40',\n 'wind_chime':'\\ud83c\\udf90',\n 'wind_face':'\\ud83c\\udf2c',\n 'wine_glass':'\\ud83c\\udf77',\n 'wink':'\\ud83d\\ude09',\n 'wolf':'\\ud83d\\udc3a',\n 'woman':'\\ud83d\\udc69',\n 'woman_artist':'\\ud83d\\udc69‍\\ud83c\\udfa8',\n 'woman_astronaut':'\\ud83d\\udc69‍\\ud83d\\ude80',\n 'woman_cartwheeling':'\\ud83e\\udd38‍\\u2640\\ufe0f',\n 'woman_cook':'\\ud83d\\udc69‍\\ud83c\\udf73',\n 'woman_facepalming':'\\ud83e\\udd26‍\\u2640\\ufe0f',\n 'woman_factory_worker':'\\ud83d\\udc69‍\\ud83c\\udfed',\n 'woman_farmer':'\\ud83d\\udc69‍\\ud83c\\udf3e',\n 'woman_firefighter':'\\ud83d\\udc69‍\\ud83d\\ude92',\n 'woman_health_worker':'\\ud83d\\udc69‍\\u2695\\ufe0f',\n 'woman_judge':'\\ud83d\\udc69‍\\u2696\\ufe0f',\n 'woman_juggling':'\\ud83e\\udd39‍\\u2640\\ufe0f',\n 'woman_mechanic':'\\ud83d\\udc69‍\\ud83d\\udd27',\n 'woman_office_worker':'\\ud83d\\udc69‍\\ud83d\\udcbc',\n 'woman_pilot':'\\ud83d\\udc69‍\\u2708\\ufe0f',\n 'woman_playing_handball':'\\ud83e\\udd3e‍\\u2640\\ufe0f',\n 'woman_playing_water_polo':'\\ud83e\\udd3d‍\\u2640\\ufe0f',\n 'woman_scientist':'\\ud83d\\udc69‍\\ud83d\\udd2c',\n 'woman_shrugging':'\\ud83e\\udd37‍\\u2640\\ufe0f',\n 'woman_singer':'\\ud83d\\udc69‍\\ud83c\\udfa4',\n 'woman_student':'\\ud83d\\udc69‍\\ud83c\\udf93',\n 'woman_teacher':'\\ud83d\\udc69‍\\ud83c\\udfeb',\n 'woman_technologist':'\\ud83d\\udc69‍\\ud83d\\udcbb',\n 'woman_with_turban':'\\ud83d\\udc73‍\\u2640\\ufe0f',\n 'womans_clothes':'\\ud83d\\udc5a',\n 'womans_hat':'\\ud83d\\udc52',\n 'women_wrestling':'\\ud83e\\udd3c‍\\u2640\\ufe0f',\n 'womens':'\\ud83d\\udeba',\n 'world_map':'\\ud83d\\uddfa',\n 'worried':'\\ud83d\\ude1f',\n 'wrench':'\\ud83d\\udd27',\n 'writing_hand':'\\u270d\\ufe0f',\n 'x':'\\u274c',\n 'yellow_heart':'\\ud83d\\udc9b',\n 'yen':'\\ud83d\\udcb4',\n 'yin_yang':'\\u262f\\ufe0f',\n 'yum':'\\ud83d\\ude0b',\n 'zap':'\\u26a1\\ufe0f',\n 'zipper_mouth_face':'\\ud83e\\udd10',\n 'zzz':'\\ud83d\\udca4',\n\n /* special emojis :P */\n 'octocat': '\":octocat:\"',\n 'showdown': 'S'\n};\n\r\n/**\n * Created by Estevao on 31-05-2015.\n */\n\n/**\n * Showdown Converter class\n * @class\n * @param {object} [converterOptions]\n * @returns {Converter}\n */\nshowdown.Converter = function (converterOptions) {\n 'use strict';\n\n var\n /**\n * Options used by this converter\n * @private\n * @type {{}}\n */\n options = {},\n\n /**\n * Language extensions used by this converter\n * @private\n * @type {Array}\n */\n langExtensions = [],\n\n /**\n * Output modifiers extensions used by this converter\n * @private\n * @type {Array}\n */\n outputModifiers = [],\n\n /**\n * Event listeners\n * @private\n * @type {{}}\n */\n listeners = {},\n\n /**\n * The flavor set in this converter\n */\n setConvFlavor = setFlavor,\n\n /**\n * Metadata of the document\n * @type {{parsed: {}, raw: string, format: string}}\n */\n metadata = {\n parsed: {},\n raw: '',\n format: ''\n };\n\n _constructor();\n\n /**\n * Converter constructor\n * @private\n */\n function _constructor () {\n converterOptions = converterOptions || {};\n\n for (var gOpt in globalOptions) {\n if (globalOptions.hasOwnProperty(gOpt)) {\n options[gOpt] = globalOptions[gOpt];\n }\n }\n\n // Merge options\n if (typeof converterOptions === 'object') {\n for (var opt in converterOptions) {\n if (converterOptions.hasOwnProperty(opt)) {\n options[opt] = converterOptions[opt];\n }\n }\n } else {\n throw Error('Converter expects the passed parameter to be an object, but ' + typeof converterOptions +\n ' was passed instead.');\n }\n\n if (options.extensions) {\n showdown.helper.forEach(options.extensions, _parseExtension);\n }\n }\n\n /**\n * Parse extension\n * @param {*} ext\n * @param {string} [name='']\n * @private\n */\n function _parseExtension (ext, name) {\n\n name = name || null;\n // If it's a string, the extension was previously loaded\n if (showdown.helper.isString(ext)) {\n ext = showdown.helper.stdExtName(ext);\n name = ext;\n\n // LEGACY_SUPPORT CODE\n if (showdown.extensions[ext]) {\n console.warn('DEPRECATION WARNING: ' + ext + ' is an old extension that uses a deprecated loading method.' +\n 'Please inform the developer that the extension should be updated!');\n legacyExtensionLoading(showdown.extensions[ext], ext);\n return;\n // END LEGACY SUPPORT CODE\n\n } else if (!showdown.helper.isUndefined(extensions[ext])) {\n ext = extensions[ext];\n\n } else {\n throw Error('Extension \"' + ext + '\" could not be loaded. It was either not found or is not a valid extension.');\n }\n }\n\n if (typeof ext === 'function') {\n ext = ext();\n }\n\n if (!showdown.helper.isArray(ext)) {\n ext = [ext];\n }\n\n var validExt = validate(ext, name);\n if (!validExt.valid) {\n throw Error(validExt.error);\n }\n\n for (var i = 0; i < ext.length; ++i) {\n switch (ext[i].type) {\n\n case 'lang':\n langExtensions.push(ext[i]);\n break;\n\n case 'output':\n outputModifiers.push(ext[i]);\n break;\n }\n if (ext[i].hasOwnProperty('listeners')) {\n for (var ln in ext[i].listeners) {\n if (ext[i].listeners.hasOwnProperty(ln)) {\n listen(ln, ext[i].listeners[ln]);\n }\n }\n }\n }\n\n }\n\n /**\n * LEGACY_SUPPORT\n * @param {*} ext\n * @param {string} name\n */\n function legacyExtensionLoading (ext, name) {\n if (typeof ext === 'function') {\n ext = ext(new showdown.Converter());\n }\n if (!showdown.helper.isArray(ext)) {\n ext = [ext];\n }\n var valid = validate(ext, name);\n\n if (!valid.valid) {\n throw Error(valid.error);\n }\n\n for (var i = 0; i < ext.length; ++i) {\n switch (ext[i].type) {\n case 'lang':\n langExtensions.push(ext[i]);\n break;\n case 'output':\n outputModifiers.push(ext[i]);\n break;\n default:// should never reach here\n throw Error('Extension loader error: Type unrecognized!!!');\n }\n }\n }\n\n /**\n * Listen to an event\n * @param {string} name\n * @param {function} callback\n */\n function listen (name, callback) {\n if (!showdown.helper.isString(name)) {\n throw Error('Invalid argument in converter.listen() method: name must be a string, but ' + typeof name + ' given');\n }\n\n if (typeof callback !== 'function') {\n throw Error('Invalid argument in converter.listen() method: callback must be a function, but ' + typeof callback + ' given');\n }\n\n if (!listeners.hasOwnProperty(name)) {\n listeners[name] = [];\n }\n listeners[name].push(callback);\n }\n\n function rTrimInputText (text) {\n var rsp = text.match(/^\\s*/)[0].length,\n rgx = new RegExp('^\\\\s{0,' + rsp + '}', 'gm');\n return text.replace(rgx, '');\n }\n\n /**\n * Dispatch an event\n * @private\n * @param {string} evtName Event name\n * @param {string} text Text\n * @param {{}} options Converter Options\n * @param {{}} globals\n * @returns {string}\n */\n this._dispatch = function dispatch (evtName, text, options, globals) {\n if (listeners.hasOwnProperty(evtName)) {\n for (var ei = 0; ei < listeners[evtName].length; ++ei) {\n var nText = listeners[evtName][ei](evtName, text, this, options, globals);\n if (nText && typeof nText !== 'undefined') {\n text = nText;\n }\n }\n }\n return text;\n };\n\n /**\n * Listen to an event\n * @param {string} name\n * @param {function} callback\n * @returns {showdown.Converter}\n */\n this.listen = function (name, callback) {\n listen(name, callback);\n return this;\n };\n\n /**\n * Converts a markdown string into HTML\n * @param {string} text\n * @returns {*}\n */\n this.makeHtml = function (text) {\n //check if text is not falsy\n if (!text) {\n return text;\n }\n\n var globals = {\n gHtmlBlocks: [],\n gHtmlMdBlocks: [],\n gHtmlSpans: [],\n gUrls: {},\n gTitles: {},\n gDimensions: {},\n gListLevel: 0,\n hashLinkCounts: {},\n langExtensions: langExtensions,\n outputModifiers: outputModifiers,\n converter: this,\n ghCodeBlocks: [],\n metadata: {\n parsed: {},\n raw: '',\n format: ''\n }\n };\n\n // This lets us use ¨ trema as an escape char to avoid md5 hashes\n // The choice of character is arbitrary; anything that isn't\n // magic in Markdown will work.\n text = text.replace(/¨/g, '¨T');\n\n // Replace $ with ¨D\n // RegExp interprets $ as a special character\n // when it's in a replacement string\n text = text.replace(/\\$/g, '¨D');\n\n // Standardize line endings\n text = text.replace(/\\r\\n/g, '\\n'); // DOS to Unix\n text = text.replace(/\\r/g, '\\n'); // Mac to Unix\n\n // Stardardize line spaces\n text = text.replace(/\\u00A0/g, ' ');\n\n if (options.smartIndentationFix) {\n text = rTrimInputText(text);\n }\n\n // Make sure text begins and ends with a couple of newlines:\n text = '\\n\\n' + text + '\\n\\n';\n\n // detab\n text = showdown.subParser('detab')(text, options, globals);\n\n /**\n * Strip any lines consisting only of spaces and tabs.\n * This makes subsequent regexs easier to write, because we can\n * match consecutive blank lines with /\\n+/ instead of something\n * contorted like /[ \\t]*\\n+/\n */\n text = text.replace(/^[ \\t]+$/mg, '');\n\n //run languageExtensions\n showdown.helper.forEach(langExtensions, function (ext) {\n text = showdown.subParser('runExtension')(ext, text, options, globals);\n });\n\n // run the sub parsers\n text = showdown.subParser('metadata')(text, options, globals);\n text = showdown.subParser('hashPreCodeTags')(text, options, globals);\n text = showdown.subParser('githubCodeBlocks')(text, options, globals);\n text = showdown.subParser('hashHTMLBlocks')(text, options, globals);\n text = showdown.subParser('hashCodeTags')(text, options, globals);\n text = showdown.subParser('stripLinkDefinitions')(text, options, globals);\n text = showdown.subParser('blockGamut')(text, options, globals);\n text = showdown.subParser('unhashHTMLSpans')(text, options, globals);\n text = showdown.subParser('unescapeSpecialChars')(text, options, globals);\n\n // attacklab: Restore dollar signs\n text = text.replace(/¨D/g, '$$');\n\n // attacklab: Restore tremas\n text = text.replace(/¨T/g, '¨');\n\n // render a complete html document instead of a partial if the option is enabled\n text = showdown.subParser('completeHTMLDocument')(text, options, globals);\n\n // Run output modifiers\n showdown.helper.forEach(outputModifiers, function (ext) {\n text = showdown.subParser('runExtension')(ext, text, options, globals);\n });\n\n // update metadata\n metadata = globals.metadata;\n return text;\n };\n\n /**\n * Converts an HTML string into a markdown string\n * @param src\n * @param [HTMLParser] A WHATWG DOM and HTML parser, such as JSDOM. If none is supplied, window.document will be used.\n * @returns {string}\n */\n this.makeMarkdown = this.makeMd = function (src, HTMLParser) {\n\n // replace \\r\\n with \\n\n src = src.replace(/\\r\\n/g, '\\n');\n src = src.replace(/\\r/g, '\\n'); // old macs\n\n // due to an edge case, we need to find this: > <\n // to prevent removing of non silent white spaces\n // ex: this is sparta\n src = src.replace(/>[ \\t]+¨NBSP;<');\n\n if (!HTMLParser) {\n if (window && window.document) {\n HTMLParser = window.document;\n } else {\n throw new Error('HTMLParser is undefined. If in a webworker or nodejs environment, you need to provide a WHATWG DOM and HTML such as JSDOM');\n }\n }\n\n var doc = HTMLParser.createElement('div');\n doc.innerHTML = src;\n\n var globals = {\n preList: substitutePreCodeTags(doc)\n };\n\n // remove all newlines and collapse spaces\n clean(doc);\n\n // some stuff, like accidental reference links must now be escaped\n // TODO\n // doc.innerHTML = doc.innerHTML.replace(/\\[[\\S\\t ]]/);\n\n var nodes = doc.childNodes,\n mdDoc = '';\n\n for (var i = 0; i < nodes.length; i++) {\n mdDoc += showdown.subParser('makeMarkdown.node')(nodes[i], globals);\n }\n\n function clean (node) {\n for (var n = 0; n < node.childNodes.length; ++n) {\n var child = node.childNodes[n];\n if (child.nodeType === 3) {\n if (!/\\S/.test(child.nodeValue) && !/^[ ]+$/.test(child.nodeValue)) {\n node.removeChild(child);\n --n;\n } else {\n child.nodeValue = child.nodeValue.split('\\n').join(' ');\n child.nodeValue = child.nodeValue.replace(/(\\s)+/g, '$1');\n }\n } else if (child.nodeType === 1) {\n clean(child);\n }\n }\n }\n\n // find all pre tags and replace contents with placeholder\n // we need this so that we can remove all indentation from html\n // to ease up parsing\n function substitutePreCodeTags (doc) {\n\n var pres = doc.querySelectorAll('pre'),\n presPH = [];\n\n for (var i = 0; i < pres.length; ++i) {\n\n if (pres[i].childElementCount === 1 && pres[i].firstChild.tagName.toLowerCase() === 'code') {\n var content = pres[i].firstChild.innerHTML.trim(),\n language = pres[i].firstChild.getAttribute('data-language') || '';\n\n // if data-language attribute is not defined, then we look for class language-*\n if (language === '') {\n var classes = pres[i].firstChild.className.split(' ');\n for (var c = 0; c < classes.length; ++c) {\n var matches = classes[c].match(/^language-(.+)$/);\n if (matches !== null) {\n language = matches[1];\n break;\n }\n }\n }\n\n // unescape html entities in content\n content = showdown.helper.unescapeHTMLEntities(content);\n\n presPH.push(content);\n pres[i].outerHTML = '';\n } else {\n presPH.push(pres[i].innerHTML);\n pres[i].innerHTML = '';\n pres[i].setAttribute('prenum', i.toString());\n }\n }\n return presPH;\n }\n\n return mdDoc;\n };\n\n /**\n * Set an option of this Converter instance\n * @param {string} key\n * @param {*} value\n */\n this.setOption = function (key, value) {\n options[key] = value;\n };\n\n /**\n * Get the option of this Converter instance\n * @param {string} key\n * @returns {*}\n */\n this.getOption = function (key) {\n return options[key];\n };\n\n /**\n * Get the options of this Converter instance\n * @returns {{}}\n */\n this.getOptions = function () {\n return options;\n };\n\n /**\n * Add extension to THIS converter\n * @param {{}} extension\n * @param {string} [name=null]\n */\n this.addExtension = function (extension, name) {\n name = name || null;\n _parseExtension(extension, name);\n };\n\n /**\n * Use a global registered extension with THIS converter\n * @param {string} extensionName Name of the previously registered extension\n */\n this.useExtension = function (extensionName) {\n _parseExtension(extensionName);\n };\n\n /**\n * Set the flavor THIS converter should use\n * @param {string} name\n */\n this.setFlavor = function (name) {\n if (!flavor.hasOwnProperty(name)) {\n throw Error(name + ' flavor was not found');\n }\n var preset = flavor[name];\n setConvFlavor = name;\n for (var option in preset) {\n if (preset.hasOwnProperty(option)) {\n options[option] = preset[option];\n }\n }\n };\n\n /**\n * Get the currently set flavor of this converter\n * @returns {string}\n */\n this.getFlavor = function () {\n return setConvFlavor;\n };\n\n /**\n * Remove an extension from THIS converter.\n * Note: This is a costly operation. It's better to initialize a new converter\n * and specify the extensions you wish to use\n * @param {Array} extension\n */\n this.removeExtension = function (extension) {\n if (!showdown.helper.isArray(extension)) {\n extension = [extension];\n }\n for (var a = 0; a < extension.length; ++a) {\n var ext = extension[a];\n for (var i = 0; i < langExtensions.length; ++i) {\n if (langExtensions[i] === ext) {\n langExtensions.splice(i, 1);\n }\n }\n for (var ii = 0; ii < outputModifiers.length; ++ii) {\n if (outputModifiers[ii] === ext) {\n outputModifiers.splice(ii, 1);\n }\n }\n }\n };\n\n /**\n * Get all extension of THIS converter\n * @returns {{language: Array, output: Array}}\n */\n this.getAllExtensions = function () {\n return {\n language: langExtensions,\n output: outputModifiers\n };\n };\n\n /**\n * Get the metadata of the previously parsed document\n * @param raw\n * @returns {string|{}}\n */\n this.getMetadata = function (raw) {\n if (raw) {\n return metadata.raw;\n } else {\n return metadata.parsed;\n }\n };\n\n /**\n * Get the metadata format of the previously parsed document\n * @returns {string}\n */\n this.getMetadataFormat = function () {\n return metadata.format;\n };\n\n /**\n * Private: set a single key, value metadata pair\n * @param {string} key\n * @param {string} value\n */\n this._setMetadataPair = function (key, value) {\n metadata.parsed[key] = value;\n };\n\n /**\n * Private: set metadata format\n * @param {string} format\n */\n this._setMetadataFormat = function (format) {\n metadata.format = format;\n };\n\n /**\n * Private: set metadata raw text\n * @param {string} raw\n */\n this._setMetadataRaw = function (raw) {\n metadata.raw = raw;\n };\n};\n\r\n/**\n * Turn Markdown link shortcuts into XHTML tags.\n */\nshowdown.subParser('anchors', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('anchors.before', text, options, globals);\n\n var writeAnchorTag = function (wholeMatch, linkText, linkId, url, m5, m6, title) {\n if (showdown.helper.isUndefined(title)) {\n title = '';\n }\n linkId = linkId.toLowerCase();\n\n // Special case for explicit empty url\n if (wholeMatch.search(/\\(? ?(['\"].*['\"])?\\)$/m) > -1) {\n url = '';\n } else if (!url) {\n if (!linkId) {\n // lower-case and turn embedded newlines into spaces\n linkId = linkText.toLowerCase().replace(/ ?\\n/g, ' ');\n }\n url = '#' + linkId;\n\n if (!showdown.helper.isUndefined(globals.gUrls[linkId])) {\n url = globals.gUrls[linkId];\n if (!showdown.helper.isUndefined(globals.gTitles[linkId])) {\n title = globals.gTitles[linkId];\n }\n } else {\n return wholeMatch;\n }\n }\n\n //url = showdown.helper.escapeCharacters(url, '*_', false); // replaced line to improve performance\n url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n\n var result = '';\n\n return result;\n };\n\n // First, handle reference-style links: [link text] [id]\n text = text.replace(/\\[((?:\\[[^\\]]*]|[^\\[\\]])*)] ?(?:\\n *)?\\[(.*?)]()()()()/g, writeAnchorTag);\n\n // Next, inline-style links: [link text](url \"optional title\")\n // cases with crazy urls like ./image/cat1).png\n text = text.replace(/\\[((?:\\[[^\\]]*]|[^\\[\\]])*)]()[ \\t]*\\([ \\t]?<([^>]*)>(?:[ \\t]*(([\"'])([^\"]*?)\\5))?[ \\t]?\\)/g,\n writeAnchorTag);\n\n // normal cases\n text = text.replace(/\\[((?:\\[[^\\]]*]|[^\\[\\]])*)]()[ \\t]*\\([ \\t]??(?:[ \\t]*(([\"'])([^\"]*?)\\5))?[ \\t]?\\)/g,\n writeAnchorTag);\n\n // handle reference-style shortcuts: [link text]\n // These must come last in case you've also got [link test][1]\n // or [link test](/foo)\n text = text.replace(/\\[([^\\[\\]]+)]()()()()()/g, writeAnchorTag);\n\n // Lastly handle GithubMentions if option is enabled\n if (options.ghMentions) {\n text = text.replace(/(^|\\s)(\\\\)?(@([a-z\\d]+(?:[a-z\\d.-]+?[a-z\\d]+)*))/gmi, function (wm, st, escape, mentions, username) {\n if (escape === '\\\\') {\n return st + mentions;\n }\n\n //check if options.ghMentionsLink is a string\n if (!showdown.helper.isString(options.ghMentionsLink)) {\n throw new Error('ghMentionsLink option must be a string');\n }\n var lnk = options.ghMentionsLink.replace(/\\{u}/g, username),\n target = '';\n if (options.openLinksInNewWindow) {\n target = ' rel=\"noopener noreferrer\" target=\"¨E95Eblank\"';\n }\n return st + '' + mentions + '';\n });\n }\n\n text = globals.converter._dispatch('anchors.after', text, options, globals);\n return text;\n});\n\r\n// url allowed chars [a-z\\d_.~:/?#[]@!$&'()*+,;=-]\n\nvar simpleURLRegex = /([*~_]+|\\b)(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+?\\.[^'\">\\s]+?)()(\\1)?(?=\\s|$)(?![\"<>])/gi,\n simpleURLRegex2 = /([*~_]+|\\b)(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+\\.[^'\">\\s]+?)([.!?,()\\[\\]])?(\\1)?(?=\\s|$)(?![\"<>])/gi,\n delimUrlRegex = /()<(((https?|ftp|dict):\\/\\/|www\\.)[^'\">\\s]+)()>()/gi,\n simpleMailRegex = /(^|\\s)(?:mailto:)?([A-Za-z0-9!#$%&'*+-/=?^_`{|}~.]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)(?=$|\\s)/gmi,\n delimMailRegex = /<()(?:mailto:)?([-.\\w]+@[-a-z0-9]+(\\.[-a-z0-9]+)*\\.[a-z]+)>/gi,\n\n replaceLink = function (options) {\n 'use strict';\n return function (wm, leadingMagicChars, link, m2, m3, trailingPunctuation, trailingMagicChars) {\n link = link.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n var lnkTxt = link,\n append = '',\n target = '',\n lmc = leadingMagicChars || '',\n tmc = trailingMagicChars || '';\n if (/^www\\./i.test(link)) {\n link = link.replace(/^www\\./i, 'http://www.');\n }\n if (options.excludeTrailingPunctuationFromURLs && trailingPunctuation) {\n append = trailingPunctuation;\n }\n if (options.openLinksInNewWindow) {\n target = ' rel=\"noopener noreferrer\" target=\"¨E95Eblank\"';\n }\n return lmc + '' + lnkTxt + '' + append + tmc;\n };\n },\n\n replaceMail = function (options, globals) {\n 'use strict';\n return function (wholeMatch, b, mail) {\n var href = 'mailto:';\n b = b || '';\n mail = showdown.subParser('unescapeSpecialChars')(mail, options, globals);\n if (options.encodeEmails) {\n href = showdown.helper.encodeEmailAddress(href + mail);\n mail = showdown.helper.encodeEmailAddress(mail);\n } else {\n href = href + mail;\n }\n return b + '' + mail + '';\n };\n };\n\nshowdown.subParser('autoLinks', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('autoLinks.before', text, options, globals);\n\n text = text.replace(delimUrlRegex, replaceLink(options));\n text = text.replace(delimMailRegex, replaceMail(options, globals));\n\n text = globals.converter._dispatch('autoLinks.after', text, options, globals);\n\n return text;\n});\n\nshowdown.subParser('simplifiedAutoLinks', function (text, options, globals) {\n 'use strict';\n\n if (!options.simplifiedAutoLink) {\n return text;\n }\n\n text = globals.converter._dispatch('simplifiedAutoLinks.before', text, options, globals);\n\n if (options.excludeTrailingPunctuationFromURLs) {\n text = text.replace(simpleURLRegex2, replaceLink(options));\n } else {\n text = text.replace(simpleURLRegex, replaceLink(options));\n }\n text = text.replace(simpleMailRegex, replaceMail(options, globals));\n\n text = globals.converter._dispatch('simplifiedAutoLinks.after', text, options, globals);\n\n return text;\n});\n\r\n/**\n * These are all the transformations that form block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('blockGamut', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('blockGamut.before', text, options, globals);\n\n // we parse blockquotes first so that we can have headings and hrs\n // inside blockquotes\n text = showdown.subParser('blockQuotes')(text, options, globals);\n text = showdown.subParser('headers')(text, options, globals);\n\n // Do Horizontal Rules:\n text = showdown.subParser('horizontalRule')(text, options, globals);\n\n text = showdown.subParser('lists')(text, options, globals);\n text = showdown.subParser('codeBlocks')(text, options, globals);\n text = showdown.subParser('tables')(text, options, globals);\n\n // We already ran _HashHTMLBlocks() before, in Markdown(), but that\n // was to escape raw HTML in the original Markdown source. This time,\n // we're escaping the markup we've just created, so that we don't wrap\n //

    tags around block-level tags.\n text = showdown.subParser('hashHTMLBlocks')(text, options, globals);\n text = showdown.subParser('paragraphs')(text, options, globals);\n\n text = globals.converter._dispatch('blockGamut.after', text, options, globals);\n\n return text;\n});\n\r\nshowdown.subParser('blockQuotes', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('blockQuotes.before', text, options, globals);\n\n // add a couple extra lines after the text and endtext mark\n text = text + '\\n\\n';\n\n var rgx = /(^ {0,3}>[ \\t]?.+\\n(.+\\n)*\\n*)+/gm;\n\n if (options.splitAdjacentBlockquotes) {\n rgx = /^ {0,3}>[\\s\\S]*?(?:\\n\\n)/gm;\n }\n\n text = text.replace(rgx, function (bq) {\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n bq = bq.replace(/^[ \\t]*>[ \\t]?/gm, ''); // trim one level of quoting\n\n // attacklab: clean up hack\n bq = bq.replace(/¨0/g, '');\n\n bq = bq.replace(/^[ \\t]+$/gm, ''); // trim whitespace-only lines\n bq = showdown.subParser('githubCodeBlocks')(bq, options, globals);\n bq = showdown.subParser('blockGamut')(bq, options, globals); // recurse\n\n bq = bq.replace(/(^|\\n)/g, '$1 ');\n // These leading spaces screw with

     content, so we need to fix that:\n    bq = bq.replace(/(\\s*
    [^\\r]+?<\\/pre>)/gm, function (wholeMatch, m1) {\n      var pre = m1;\n      // attacklab: hack around Konqueror 3.5.4 bug:\n      pre = pre.replace(/^  /mg, '¨0');\n      pre = pre.replace(/¨0/g, '');\n      return pre;\n    });\n\n    return showdown.subParser('hashBlock')('
    \\n' + bq + '\\n
    ', options, globals);\n });\n\n text = globals.converter._dispatch('blockQuotes.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Process Markdown `
    ` blocks.\n */\nshowdown.subParser('codeBlocks', function (text, options, globals) {\n  'use strict';\n\n  text = globals.converter._dispatch('codeBlocks.before', text, options, globals);\n\n  // sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n  text += '¨0';\n\n  var pattern = /(?:\\n\\n|^)((?:(?:[ ]{4}|\\t).*\\n+)+)(\\n*[ ]{0,3}[^ \\t\\n]|(?=¨0))/g;\n  text = text.replace(pattern, function (wholeMatch, m1, m2) {\n    var codeblock = m1,\n        nextChar = m2,\n        end = '\\n';\n\n    codeblock = showdown.subParser('outdent')(codeblock, options, globals);\n    codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);\n    codeblock = showdown.subParser('detab')(codeblock, options, globals);\n    codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n    codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing newlines\n\n    if (options.omitExtraWLInCodeBlocks) {\n      end = '';\n    }\n\n    codeblock = '
    ' + codeblock + end + '
    ';\n\n return showdown.subParser('hashBlock')(codeblock, options, globals) + nextChar;\n });\n\n // strip sentinel\n text = text.replace(/¨0/, '');\n\n text = globals.converter._dispatch('codeBlocks.after', text, options, globals);\n return text;\n});\n\r\n/**\n *\n * * Backtick quotes are used for spans.\n *\n * * You can use multiple backticks as the delimiters if you want to\n * include literal backticks in the code span. So, this input:\n *\n * Just type ``foo `bar` baz`` at the prompt.\n *\n * Will translate to:\n *\n *

    Just type foo `bar` baz at the prompt.

    \n *\n * There's no arbitrary limit to the number of backticks you\n * can use as delimters. If you need three consecutive backticks\n * in your code, use four for delimiters, etc.\n *\n * * You can use spaces to get literal backticks at the edges:\n *\n * ... type `` `bar` `` ...\n *\n * Turns to:\n *\n * ... type `bar` ...\n */\nshowdown.subParser('codeSpans', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('codeSpans.before', text, options, globals);\n\n if (typeof (text) === 'undefined') {\n text = '';\n }\n text = text.replace(/(^|[^\\\\])(`+)([^\\r]*?[^`])\\2(?!`)/gm,\n function (wholeMatch, m1, m2, m3) {\n var c = m3;\n c = c.replace(/^([ \\t]*)/g, '');\t// leading whitespace\n c = c.replace(/[ \\t]*$/g, '');\t// trailing whitespace\n c = showdown.subParser('encodeCode')(c, options, globals);\n c = m1 + '' + c + '';\n c = showdown.subParser('hashHTMLSpans')(c, options, globals);\n return c;\n }\n );\n\n text = globals.converter._dispatch('codeSpans.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Create a full HTML document from the processed markdown\n */\nshowdown.subParser('completeHTMLDocument', function (text, options, globals) {\n 'use strict';\n\n if (!options.completeHTMLDocument) {\n return text;\n }\n\n text = globals.converter._dispatch('completeHTMLDocument.before', text, options, globals);\n\n var doctype = 'html',\n doctypeParsed = '\\n',\n title = '',\n charset = '\\n',\n lang = '',\n metadata = '';\n\n if (typeof globals.metadata.parsed.doctype !== 'undefined') {\n doctypeParsed = '\\n';\n doctype = globals.metadata.parsed.doctype.toString().toLowerCase();\n if (doctype === 'html' || doctype === 'html5') {\n charset = '';\n }\n }\n\n for (var meta in globals.metadata.parsed) {\n if (globals.metadata.parsed.hasOwnProperty(meta)) {\n switch (meta.toLowerCase()) {\n case 'doctype':\n break;\n\n case 'title':\n title = '' + globals.metadata.parsed.title + '\\n';\n break;\n\n case 'charset':\n if (doctype === 'html' || doctype === 'html5') {\n charset = '\\n';\n } else {\n charset = '\\n';\n }\n break;\n\n case 'language':\n case 'lang':\n lang = ' lang=\"' + globals.metadata.parsed[meta] + '\"';\n metadata += '\\n';\n break;\n\n default:\n metadata += '\\n';\n }\n }\n }\n\n text = doctypeParsed + '\\n\\n' + title + charset + metadata + '\\n\\n' + text.trim() + '\\n\\n';\n\n text = globals.converter._dispatch('completeHTMLDocument.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Convert all tabs to spaces\n */\nshowdown.subParser('detab', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('detab.before', text, options, globals);\n\n // expand first n-1 tabs\n text = text.replace(/\\t(?=\\t)/g, ' '); // g_tab_width\n\n // replace the nth with two sentinels\n text = text.replace(/\\t/g, '¨A¨B');\n\n // use the sentinel to anchor our regex so it doesn't explode\n text = text.replace(/¨B(.+?)¨A/g, function (wholeMatch, m1) {\n var leadingText = m1,\n numSpaces = 4 - leadingText.length % 4; // g_tab_width\n\n // there *must* be a better way to do this:\n for (var i = 0; i < numSpaces; i++) {\n leadingText += ' ';\n }\n\n return leadingText;\n });\n\n // clean up sentinels\n text = text.replace(/¨A/g, ' '); // g_tab_width\n text = text.replace(/¨B/g, '');\n\n text = globals.converter._dispatch('detab.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('ellipsis', function (text, options, globals) {\n 'use strict';\n\n if (!options.ellipsis) {\n return text;\n }\n\n text = globals.converter._dispatch('ellipsis.before', text, options, globals);\n\n text = text.replace(/\\.\\.\\./g, '…');\n\n text = globals.converter._dispatch('ellipsis.after', text, options, globals);\n\n return text;\n});\n\r\n/**\n * Turn emoji codes into emojis\n *\n * List of supported emojis: https://github.com/showdownjs/showdown/wiki/Emojis\n */\nshowdown.subParser('emoji', function (text, options, globals) {\n 'use strict';\n\n if (!options.emoji) {\n return text;\n }\n\n text = globals.converter._dispatch('emoji.before', text, options, globals);\n\n var emojiRgx = /:([\\S]+?):/g;\n\n text = text.replace(emojiRgx, function (wm, emojiCode) {\n if (showdown.helper.emojis.hasOwnProperty(emojiCode)) {\n return showdown.helper.emojis[emojiCode];\n }\n return wm;\n });\n\n text = globals.converter._dispatch('emoji.after', text, options, globals);\n\n return text;\n});\n\r\n/**\n * Smart processing for ampersands and angle brackets that need to be encoded.\n */\nshowdown.subParser('encodeAmpsAndAngles', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('encodeAmpsAndAngles.before', text, options, globals);\n\n // Ampersand-encoding based entirely on Nat Irons's Amputator MT plugin:\n // http://bumppo.net/projects/amputator/\n text = text.replace(/&(?!#?[xX]?(?:[0-9a-fA-F]+|\\w+);)/g, '&');\n\n // Encode naked <'s\n text = text.replace(/<(?![a-z\\/?$!])/gi, '<');\n\n // Encode <\n text = text.replace(/\n text = text.replace(/>/g, '>');\n\n text = globals.converter._dispatch('encodeAmpsAndAngles.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Returns the string, with after processing the following backslash escape sequences.\n *\n * attacklab: The polite way to do this is with the new escapeCharacters() function:\n *\n * text = escapeCharacters(text,\"\\\\\",true);\n * text = escapeCharacters(text,\"`*_{}[]()>#+-.!\",true);\n *\n * ...but we're sidestepping its use of the (slow) RegExp constructor\n * as an optimization for Firefox. This function gets called a LOT.\n */\nshowdown.subParser('encodeBackslashEscapes', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('encodeBackslashEscapes.before', text, options, globals);\n\n text = text.replace(/\\\\(\\\\)/g, showdown.helper.escapeCharactersCallback);\n text = text.replace(/\\\\([`*_{}\\[\\]()>#+.!~=|:-])/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('encodeBackslashEscapes.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Encode/escape certain characters inside Markdown code runs.\n * The point is that in code, these characters are literals,\n * and lose their special Markdown meanings.\n */\nshowdown.subParser('encodeCode', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('encodeCode.before', text, options, globals);\n\n // Encode all ampersands; HTML entities are not\n // entities within a Markdown code span.\n text = text\n .replace(/&/g, '&')\n // Do the angle bracket song and dance:\n .replace(//g, '>')\n // Now, escape characters that are magic in Markdown:\n .replace(/([*_{}\\[\\]\\\\=~-])/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('encodeCode.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Within tags -- meaning between < and > -- encode [\\ ` * _ ~ =] so they\n * don't conflict with their use in Markdown for code, italics and strong.\n */\nshowdown.subParser('escapeSpecialCharsWithinTagAttributes', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.before', text, options, globals);\n\n // Build a regex to find HTML tags.\n var tags = /<\\/?[a-z\\d_:-]+(?:[\\s]+[\\s\\S]+?)?>/gi,\n comments = /-]|-[^>])(?:[^-]|-[^-])*)--)>/gi;\n\n text = text.replace(tags, function (wholeMatch) {\n return wholeMatch\n .replace(/(.)<\\/?code>(?=.)/g, '$1`')\n .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n });\n\n text = text.replace(comments, function (wholeMatch) {\n return wholeMatch\n .replace(/([\\\\`*_~=|])/g, showdown.helper.escapeCharactersCallback);\n });\n\n text = globals.converter._dispatch('escapeSpecialCharsWithinTagAttributes.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Handle github codeblocks prior to running HashHTML so that\n * HTML contained within the codeblock gets escaped properly\n * Example:\n * ```ruby\n * def hello_world(x)\n * puts \"Hello, #{x}\"\n * end\n * ```\n */\nshowdown.subParser('githubCodeBlocks', function (text, options, globals) {\n 'use strict';\n\n // early exit if option is not enabled\n if (!options.ghCodeBlocks) {\n return text;\n }\n\n text = globals.converter._dispatch('githubCodeBlocks.before', text, options, globals);\n\n text += '¨0';\n\n text = text.replace(/(?:^|\\n)(?: {0,3})(```+|~~~+)(?: *)([^\\s`~]*)\\n([\\s\\S]*?)\\n(?: {0,3})\\1/g, function (wholeMatch, delim, language, codeblock) {\n var end = (options.omitExtraWLInCodeBlocks) ? '' : '\\n';\n\n // First parse the github code block\n codeblock = showdown.subParser('encodeCode')(codeblock, options, globals);\n codeblock = showdown.subParser('detab')(codeblock, options, globals);\n codeblock = codeblock.replace(/^\\n+/g, ''); // trim leading newlines\n codeblock = codeblock.replace(/\\n+$/g, ''); // trim trailing whitespace\n\n codeblock = '
    ' + codeblock + end + '
    ';\n\n codeblock = showdown.subParser('hashBlock')(codeblock, options, globals);\n\n // Since GHCodeblocks can be false positives, we need to\n // store the primitive text and the parsed text in a global var,\n // and then return a token\n return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n });\n\n // attacklab: strip sentinel\n text = text.replace(/¨0/, '');\n\n return globals.converter._dispatch('githubCodeBlocks.after', text, options, globals);\n});\n\r\nshowdown.subParser('hashBlock', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashBlock.before', text, options, globals);\n text = text.replace(/(^\\n+|\\n+$)/g, '');\n text = '\\n\\n¨K' + (globals.gHtmlBlocks.push(text) - 1) + 'K\\n\\n';\n text = globals.converter._dispatch('hashBlock.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Hash and escape elements that should not be parsed as markdown\n */\nshowdown.subParser('hashCodeTags', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashCodeTags.before', text, options, globals);\n\n var repFunc = function (wholeMatch, match, left, right) {\n var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;\n return '¨C' + (globals.gHtmlSpans.push(codeblock) - 1) + 'C';\n };\n\n // Hash naked \n text = showdown.helper.replaceRecursiveRegExp(text, repFunc, ']*>', '', 'gim');\n\n text = globals.converter._dispatch('hashCodeTags.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('hashElement', function (text, options, globals) {\n 'use strict';\n\n return function (wholeMatch, m1) {\n var blockText = m1;\n\n // Undo double lines\n blockText = blockText.replace(/\\n\\n/g, '\\n');\n blockText = blockText.replace(/^\\n/, '');\n\n // strip trailing blank lines\n blockText = blockText.replace(/\\n+$/g, '');\n\n // Replace the element text with a marker (\"¨KxK\" where x is its key)\n blockText = '\\n\\n¨K' + (globals.gHtmlBlocks.push(blockText) - 1) + 'K\\n\\n';\n\n return blockText;\n };\n});\n\r\nshowdown.subParser('hashHTMLBlocks', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashHTMLBlocks.before', text, options, globals);\n\n var blockTags = [\n 'pre',\n 'div',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'blockquote',\n 'table',\n 'dl',\n 'ol',\n 'ul',\n 'script',\n 'noscript',\n 'form',\n 'fieldset',\n 'iframe',\n 'math',\n 'style',\n 'section',\n 'header',\n 'footer',\n 'nav',\n 'article',\n 'aside',\n 'address',\n 'audio',\n 'canvas',\n 'figure',\n 'hgroup',\n 'output',\n 'video',\n 'p'\n ],\n repFunc = function (wholeMatch, match, left, right) {\n var txt = wholeMatch;\n // check if this html element is marked as markdown\n // if so, it's contents should be parsed as markdown\n if (left.search(/\\bmarkdown\\b/) !== -1) {\n txt = left + globals.converter.makeHtml(match) + right;\n }\n return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n };\n\n if (options.backslashEscapesHTMLTags) {\n // encode backslash escaped HTML tags\n text = text.replace(/\\\\<(\\/?[^>]+?)>/g, function (wm, inside) {\n return '<' + inside + '>';\n });\n }\n\n // hash HTML Blocks\n for (var i = 0; i < blockTags.length; ++i) {\n\n var opTagPos,\n rgx1 = new RegExp('^ {0,3}(<' + blockTags[i] + '\\\\b[^>]*>)', 'im'),\n patLeft = '<' + blockTags[i] + '\\\\b[^>]*>',\n patRight = '';\n // 1. Look for the first position of the first opening HTML tag in the text\n while ((opTagPos = showdown.helper.regexIndexOf(text, rgx1)) !== -1) {\n\n // if the HTML tag is \\ escaped, we need to escape it and break\n\n\n //2. Split the text in that position\n var subTexts = showdown.helper.splitAtIndex(text, opTagPos),\n //3. Match recursively\n newSubText1 = showdown.helper.replaceRecursiveRegExp(subTexts[1], repFunc, patLeft, patRight, 'im');\n\n // prevent an infinite loop\n if (newSubText1 === subTexts[1]) {\n break;\n }\n text = subTexts[0].concat(newSubText1);\n }\n }\n // HR SPECIAL CASE\n text = text.replace(/(\\n {0,3}(<(hr)\\b([^<>])*?\\/?>)[ \\t]*(?=\\n{2,}))/g,\n showdown.subParser('hashElement')(text, options, globals));\n\n // Special case for standalone HTML comments\n text = showdown.helper.replaceRecursiveRegExp(text, function (txt) {\n return '\\n\\n¨K' + (globals.gHtmlBlocks.push(txt) - 1) + 'K\\n\\n';\n }, '^ {0,3}', 'gm');\n\n // PHP and ASP-style processor instructions ( and <%...%>)\n text = text.replace(/(?:\\n\\n)( {0,3}(?:<([?%])[^\\r]*?\\2>)[ \\t]*(?=\\n{2,}))/g,\n showdown.subParser('hashElement')(text, options, globals));\n\n text = globals.converter._dispatch('hashHTMLBlocks.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Hash span elements that should not be parsed as markdown\n */\nshowdown.subParser('hashHTMLSpans', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('hashHTMLSpans.before', text, options, globals);\n\n function hashHTMLSpan (html) {\n return '¨C' + (globals.gHtmlSpans.push(html) - 1) + 'C';\n }\n\n // Hash Self Closing tags\n text = text.replace(/<[^>]+?\\/>/gi, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n // Hash tags without properties\n text = text.replace(/<([^>]+?)>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n // Hash tags with properties\n text = text.replace(/<([^>]+?)\\s[^>]+?>[\\s\\S]*?<\\/\\1>/g, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n // Hash self closing tags without />\n text = text.replace(/<[^>]+?>/gi, function (wm) {\n return hashHTMLSpan(wm);\n });\n\n /*showdown.helper.matchRecursiveRegExp(text, ']*>', '', 'gi');*/\n\n text = globals.converter._dispatch('hashHTMLSpans.after', text, options, globals);\n return text;\n});\n\n/**\n * Unhash HTML spans\n */\nshowdown.subParser('unhashHTMLSpans', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('unhashHTMLSpans.before', text, options, globals);\n\n for (var i = 0; i < globals.gHtmlSpans.length; ++i) {\n var repText = globals.gHtmlSpans[i],\n // limiter to prevent infinite loop (assume 10 as limit for recurse)\n limit = 0;\n\n while (/¨C(\\d+)C/.test(repText)) {\n var num = RegExp.$1;\n repText = repText.replace('¨C' + num + 'C', globals.gHtmlSpans[num]);\n if (limit === 10) {\n console.error('maximum nesting of 10 spans reached!!!');\n break;\n }\n ++limit;\n }\n text = text.replace('¨C' + i + 'C', repText);\n }\n\n text = globals.converter._dispatch('unhashHTMLSpans.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Hash and escape
     elements that should not be parsed as markdown\n */\nshowdown.subParser('hashPreCodeTags', function (text, options, globals) {\n  'use strict';\n  text = globals.converter._dispatch('hashPreCodeTags.before', text, options, globals);\n\n  var repFunc = function (wholeMatch, match, left, right) {\n    // encode html entities\n    var codeblock = left + showdown.subParser('encodeCode')(match, options, globals) + right;\n    return '\\n\\n¨G' + (globals.ghCodeBlocks.push({text: wholeMatch, codeblock: codeblock}) - 1) + 'G\\n\\n';\n  };\n\n  // Hash 
    \n  text = showdown.helper.replaceRecursiveRegExp(text, repFunc, '^ {0,3}]*>\\\\s*]*>', '^ {0,3}\\\\s*
    ', 'gim');\n\n text = globals.converter._dispatch('hashPreCodeTags.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('headers', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('headers.before', text, options, globals);\n\n var headerLevelStart = (isNaN(parseInt(options.headerLevelStart))) ? 1 : parseInt(options.headerLevelStart),\n\n // Set text-style headers:\n //\tHeader 1\n //\t========\n //\n //\tHeader 2\n //\t--------\n //\n setextRegexH1 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n={2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n=+[ \\t]*\\n+/gm,\n setextRegexH2 = (options.smoothLivePreview) ? /^(.+)[ \\t]*\\n-{2,}[ \\t]*\\n+/gm : /^(.+)[ \\t]*\\n-+[ \\t]*\\n+/gm;\n\n text = text.replace(setextRegexH1, function (wholeMatch, m1) {\n\n var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),\n hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n hLevel = headerLevelStart,\n hashBlock = '' + spanGamut + '';\n return showdown.subParser('hashBlock')(hashBlock, options, globals);\n });\n\n text = text.replace(setextRegexH2, function (matchFound, m1) {\n var spanGamut = showdown.subParser('spanGamut')(m1, options, globals),\n hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m1) + '\"',\n hLevel = headerLevelStart + 1,\n hashBlock = '' + spanGamut + '';\n return showdown.subParser('hashBlock')(hashBlock, options, globals);\n });\n\n // atx-style headers:\n // # Header 1\n // ## Header 2\n // ## Header 2 with closing hashes ##\n // ...\n // ###### Header 6\n //\n var atxStyle = (options.requireSpaceBeforeHeadingText) ? /^(#{1,6})[ \\t]+(.+?)[ \\t]*#*\\n+/gm : /^(#{1,6})[ \\t]*(.+?)[ \\t]*#*\\n+/gm;\n\n text = text.replace(atxStyle, function (wholeMatch, m1, m2) {\n var hText = m2;\n if (options.customizedHeaderId) {\n hText = m2.replace(/\\s?\\{([^{]+?)}\\s*$/, '');\n }\n\n var span = showdown.subParser('spanGamut')(hText, options, globals),\n hID = (options.noHeaderId) ? '' : ' id=\"' + headerId(m2) + '\"',\n hLevel = headerLevelStart - 1 + m1.length,\n header = '' + span + '';\n\n return showdown.subParser('hashBlock')(header, options, globals);\n });\n\n function headerId (m) {\n var title,\n prefix;\n\n // It is separate from other options to allow combining prefix and customized\n if (options.customizedHeaderId) {\n var match = m.match(/\\{([^{]+?)}\\s*$/);\n if (match && match[1]) {\n m = match[1];\n }\n }\n\n title = m;\n\n // Prefix id to prevent causing inadvertent pre-existing style matches.\n if (showdown.helper.isString(options.prefixHeaderId)) {\n prefix = options.prefixHeaderId;\n } else if (options.prefixHeaderId === true) {\n prefix = 'section-';\n } else {\n prefix = '';\n }\n\n if (!options.rawPrefixHeaderId) {\n title = prefix + title;\n }\n\n if (options.ghCompatibleHeaderId) {\n title = title\n .replace(/ /g, '-')\n // replace previously escaped chars (&, ¨ and $)\n .replace(/&/g, '')\n .replace(/¨T/g, '')\n .replace(/¨D/g, '')\n // replace rest of the chars (&~$ are repeated as they might have been escaped)\n // borrowed from github's redcarpet (some they should produce similar results)\n .replace(/[&+$,\\/:;=?@\"#{}|^¨~\\[\\]`\\\\*)(%.!'<>]/g, '')\n .toLowerCase();\n } else if (options.rawHeaderId) {\n title = title\n .replace(/ /g, '-')\n // replace previously escaped chars (&, ¨ and $)\n .replace(/&/g, '&')\n .replace(/¨T/g, '¨')\n .replace(/¨D/g, '$')\n // replace \" and '\n .replace(/[\"']/g, '-')\n .toLowerCase();\n } else {\n title = title\n .replace(/[^\\w]/g, '')\n .toLowerCase();\n }\n\n if (options.rawPrefixHeaderId) {\n title = prefix + title;\n }\n\n if (globals.hashLinkCounts[title]) {\n title = title + '-' + (globals.hashLinkCounts[title]++);\n } else {\n globals.hashLinkCounts[title] = 1;\n }\n return title;\n }\n\n text = globals.converter._dispatch('headers.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Turn Markdown link shortcuts into XHTML tags.\n */\nshowdown.subParser('horizontalRule', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('horizontalRule.before', text, options, globals);\n\n var key = showdown.subParser('hashBlock')('
    ', options, globals);\n text = text.replace(/^ {0,2}( ?-){3,}[ \\t]*$/gm, key);\n text = text.replace(/^ {0,2}( ?\\*){3,}[ \\t]*$/gm, key);\n text = text.replace(/^ {0,2}( ?_){3,}[ \\t]*$/gm, key);\n\n text = globals.converter._dispatch('horizontalRule.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Turn Markdown image shortcuts into tags.\n */\nshowdown.subParser('images', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('images.before', text, options, globals);\n\n var inlineRegExp = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]??(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n crazyRegExp = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]?<([^>]*)>(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:(?:([\"'])([^\"]*?)\\6))?[ \\t]?\\)/g,\n base64RegExp = /!\\[([^\\]]*?)][ \\t]*()\\([ \\t]??(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*(?:([\"'])([^\"]*?)\\6)?[ \\t]?\\)/g,\n referenceRegExp = /!\\[([^\\]]*?)] ?(?:\\n *)?\\[([\\s\\S]*?)]()()()()()/g,\n refShortcutRegExp = /!\\[([^\\[\\]]+)]()()()()()/g;\n\n function writeImageTagBase64 (wholeMatch, altText, linkId, url, width, height, m5, title) {\n url = url.replace(/\\s/g, '');\n return writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title);\n }\n\n function writeImageTag (wholeMatch, altText, linkId, url, width, height, m5, title) {\n\n var gUrls = globals.gUrls,\n gTitles = globals.gTitles,\n gDims = globals.gDimensions;\n\n linkId = linkId.toLowerCase();\n\n if (!title) {\n title = '';\n }\n // Special case for explicit empty url\n if (wholeMatch.search(/\\(? ?(['\"].*['\"])?\\)$/m) > -1) {\n url = '';\n\n } else if (url === '' || url === null) {\n if (linkId === '' || linkId === null) {\n // lower-case and turn embedded newlines into spaces\n linkId = altText.toLowerCase().replace(/ ?\\n/g, ' ');\n }\n url = '#' + linkId;\n\n if (!showdown.helper.isUndefined(gUrls[linkId])) {\n url = gUrls[linkId];\n if (!showdown.helper.isUndefined(gTitles[linkId])) {\n title = gTitles[linkId];\n }\n if (!showdown.helper.isUndefined(gDims[linkId])) {\n width = gDims[linkId].width;\n height = gDims[linkId].height;\n }\n } else {\n return wholeMatch;\n }\n }\n\n altText = altText\n .replace(/\"/g, '"')\n //altText = showdown.helper.escapeCharacters(altText, '*_', false);\n .replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n //url = showdown.helper.escapeCharacters(url, '*_', false);\n url = url.replace(showdown.helper.regexes.asteriskDashAndColon, showdown.helper.escapeCharactersCallback);\n var result = '\"'x \"optional title\")\n\n // base64 encoded images\n text = text.replace(base64RegExp, writeImageTagBase64);\n\n // cases with crazy urls like ./image/cat1).png\n text = text.replace(crazyRegExp, writeImageTag);\n\n // normal cases\n text = text.replace(inlineRegExp, writeImageTag);\n\n // handle reference-style shortcuts: ![img text]\n text = text.replace(refShortcutRegExp, writeImageTag);\n\n text = globals.converter._dispatch('images.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('italicsAndBold', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('italicsAndBold.before', text, options, globals);\n\n // it's faster to have 3 separate regexes for each case than have just one\n // because of backtracing, in some cases, it could lead to an exponential effect\n // called \"catastrophic backtrace\". Ominous!\n\n function parseInside (txt, left, right) {\n /*\n if (options.simplifiedAutoLink) {\n txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);\n }\n */\n return left + txt + right;\n }\n\n // Parse underscores\n if (options.literalMidWordUnderscores) {\n text = text.replace(/\\b___(\\S[\\s\\S]*?)___\\b/g, function (wm, txt) {\n return parseInside (txt, '', '');\n });\n text = text.replace(/\\b__(\\S[\\s\\S]*?)__\\b/g, function (wm, txt) {\n return parseInside (txt, '', '');\n });\n text = text.replace(/\\b_(\\S[\\s\\S]*?)_\\b/g, function (wm, txt) {\n return parseInside (txt, '', '');\n });\n } else {\n text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/_([^\\s_][\\s\\S]*?)_/g, function (wm, m) {\n // !/^_[^_]/.test(m) - test if it doesn't start with __ (since it seems redundant, we removed it)\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n }\n\n // Now parse asterisks\n if (options.literalMidWordAsterisks) {\n text = text.replace(/([^*]|^)\\B\\*\\*\\*(\\S[\\s\\S]*?)\\*\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n return parseInside (txt, lead + '', '');\n });\n text = text.replace(/([^*]|^)\\B\\*\\*(\\S[\\s\\S]*?)\\*\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n return parseInside (txt, lead + '', '');\n });\n text = text.replace(/([^*]|^)\\B\\*(\\S[\\s\\S]*?)\\*\\B(?!\\*)/g, function (wm, lead, txt) {\n return parseInside (txt, lead + '', '');\n });\n } else {\n text = text.replace(/\\*\\*\\*(\\S[\\s\\S]*?)\\*\\*\\*/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/\\*\\*(\\S[\\s\\S]*?)\\*\\*/g, function (wm, m) {\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n text = text.replace(/\\*([^\\s*][\\s\\S]*?)\\*/g, function (wm, m) {\n // !/^\\*[^*]/.test(m) - test if it doesn't start with ** (since it seems redundant, we removed it)\n return (/\\S$/.test(m)) ? parseInside (m, '', '') : wm;\n });\n }\n\n\n text = globals.converter._dispatch('italicsAndBold.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Form HTML ordered (numbered) and unordered (bulleted) lists.\n */\nshowdown.subParser('lists', function (text, options, globals) {\n 'use strict';\n\n /**\n * Process the contents of a single ordered or unordered list, splitting it\n * into individual list items.\n * @param {string} listStr\n * @param {boolean} trimTrailing\n * @returns {string}\n */\n function processListItems (listStr, trimTrailing) {\n // The $g_list_level global keeps track of when we're inside a list.\n // Each time we enter a list, we increment it; when we leave a list,\n // we decrement. If it's zero, we're not in a list anymore.\n //\n // We do this because when we're not inside a list, we want to treat\n // something like this:\n //\n // I recommend upgrading to version\n // 8. Oops, now this line is treated\n // as a sub-list.\n //\n // As a single paragraph, despite the fact that the second line starts\n // with a digit-period-space sequence.\n //\n // Whereas when we're inside a list (or sub-list), that line will be\n // treated as the start of a sub-list. What a kludge, huh? This is\n // an aspect of Markdown's syntax that's hard to parse perfectly\n // without resorting to mind-reading. Perhaps the solution is to\n // change the syntax rules such that sub-lists must start with a\n // starting cardinal number; e.g. \"1.\" or \"a.\".\n globals.gListLevel++;\n\n // trim trailing blank lines:\n listStr = listStr.replace(/\\n{2,}$/, '\\n');\n\n // attacklab: add sentinel to emulate \\z\n listStr += '¨0';\n\n var rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[(x|X| )?])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0| {0,3}([*+-]|\\d+[.])[ \\t]+))/gm,\n isParagraphed = (/\\n[ \\t]*\\n(?!¨0)/.test(listStr));\n\n // Since version 1.5, nesting sublists requires 4 spaces (or 1 tab) indentation,\n // which is a syntax breaking change\n // activating this option reverts to old behavior\n if (options.disableForced4SpacesIndentedSublists) {\n rgx = /(\\n)?(^ {0,3})([*+-]|\\d+[.])[ \\t]+((\\[(x|X| )?])?[ \\t]*[^\\r]+?(\\n{1,2}))(?=\\n*(¨0|\\2([*+-]|\\d+[.])[ \\t]+))/gm;\n }\n\n listStr = listStr.replace(rgx, function (wholeMatch, m1, m2, m3, m4, taskbtn, checked) {\n checked = (checked && checked.trim() !== '');\n\n var item = showdown.subParser('outdent')(m4, options, globals),\n bulletStyle = '';\n\n // Support for github tasklists\n if (taskbtn && options.tasklists) {\n bulletStyle = ' class=\"task-list-item\" style=\"list-style-type: none;\"';\n item = item.replace(/^[ \\t]*\\[(x|X| )?]/m, function () {\n var otp = '
  • a
  • \n // instead of:\n //
    • - - a
    \n // So, to prevent it, we will put a marker (¨A)in the beginning of the line\n // Kind of hackish/monkey patching, but seems more effective than overcomplicating the list parser\n item = item.replace(/^([-*+]|\\d\\.)[ \\t]+[\\S\\n ]*/g, function (wm2) {\n return '¨A' + wm2;\n });\n\n // m1 - Leading line or\n // Has a double return (multi paragraph) or\n // Has sublist\n if (m1 || (item.search(/\\n{2,}/) > -1)) {\n item = showdown.subParser('githubCodeBlocks')(item, options, globals);\n item = showdown.subParser('blockGamut')(item, options, globals);\n } else {\n // Recursion for sub-lists:\n item = showdown.subParser('lists')(item, options, globals);\n item = item.replace(/\\n$/, ''); // chomp(item)\n item = showdown.subParser('hashHTMLBlocks')(item, options, globals);\n\n // Colapse double linebreaks\n item = item.replace(/\\n\\n+/g, '\\n\\n');\n if (isParagraphed) {\n item = showdown.subParser('paragraphs')(item, options, globals);\n } else {\n item = showdown.subParser('spanGamut')(item, options, globals);\n }\n }\n\n // now we need to remove the marker (¨A)\n item = item.replace('¨A', '');\n // we can finally wrap the line in list item tags\n item = '' + item + '\\n';\n\n return item;\n });\n\n // attacklab: strip sentinel\n listStr = listStr.replace(/¨0/g, '');\n\n globals.gListLevel--;\n\n if (trimTrailing) {\n listStr = listStr.replace(/\\s+$/, '');\n }\n\n return listStr;\n }\n\n function styleStartNumber (list, listType) {\n // check if ol and starts by a number different than 1\n if (listType === 'ol') {\n var res = list.match(/^ *(\\d+)\\./);\n if (res && res[1] !== '1') {\n return ' start=\"' + res[1] + '\"';\n }\n }\n return '';\n }\n\n /**\n * Check and parse consecutive lists (better fix for issue #142)\n * @param {string} list\n * @param {string} listType\n * @param {boolean} trimTrailing\n * @returns {string}\n */\n function parseConsecutiveLists (list, listType, trimTrailing) {\n // check if we caught 2 or more consecutive lists by mistake\n // we use the counterRgx, meaning if listType is UL we look for OL and vice versa\n var olRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?\\d+\\.[ \\t]/gm : /^ {0,3}\\d+\\.[ \\t]/gm,\n ulRgx = (options.disableForced4SpacesIndentedSublists) ? /^ ?[*+-][ \\t]/gm : /^ {0,3}[*+-][ \\t]/gm,\n counterRxg = (listType === 'ul') ? olRgx : ulRgx,\n result = '';\n\n if (list.search(counterRxg) !== -1) {\n (function parseCL (txt) {\n var pos = txt.search(counterRxg),\n style = styleStartNumber(list, listType);\n if (pos !== -1) {\n // slice\n result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt.slice(0, pos), !!trimTrailing) + '\\n';\n\n // invert counterType and listType\n listType = (listType === 'ul') ? 'ol' : 'ul';\n counterRxg = (listType === 'ul') ? olRgx : ulRgx;\n\n //recurse\n parseCL(txt.slice(pos));\n } else {\n result += '\\n\\n<' + listType + style + '>\\n' + processListItems(txt, !!trimTrailing) + '\\n';\n }\n })(list);\n } else {\n var style = styleStartNumber(list, listType);\n result = '\\n\\n<' + listType + style + '>\\n' + processListItems(list, !!trimTrailing) + '\\n';\n }\n\n return result;\n }\n\n /** Start of list parsing **/\n text = globals.converter._dispatch('lists.before', text, options, globals);\n // add sentinel to hack around khtml/safari bug:\n // http://bugs.webkit.org/show_bug.cgi?id=11231\n text += '¨0';\n\n if (globals.gListLevel) {\n text = text.replace(/^(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n function (wholeMatch, list, m2) {\n var listType = (m2.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n return parseConsecutiveLists(list, listType, true);\n }\n );\n } else {\n text = text.replace(/(\\n\\n|^\\n?)(( {0,3}([*+-]|\\d+[.])[ \\t]+)[^\\r]+?(¨0|\\n{2,}(?=\\S)(?![ \\t]*(?:[*+-]|\\d+[.])[ \\t]+)))/gm,\n function (wholeMatch, m1, list, m3) {\n var listType = (m3.search(/[*+-]/g) > -1) ? 'ul' : 'ol';\n return parseConsecutiveLists(list, listType, false);\n }\n );\n }\n\n // strip sentinel\n text = text.replace(/¨0/, '');\n text = globals.converter._dispatch('lists.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Parse metadata at the top of the document\n */\nshowdown.subParser('metadata', function (text, options, globals) {\n 'use strict';\n\n if (!options.metadata) {\n return text;\n }\n\n text = globals.converter._dispatch('metadata.before', text, options, globals);\n\n function parseMetadataContents (content) {\n // raw is raw so it's not changed in any way\n globals.metadata.raw = content;\n\n // escape chars forbidden in html attributes\n // double quotes\n content = content\n // ampersand first\n .replace(/&/g, '&')\n // double quotes\n .replace(/\"/g, '"');\n\n content = content.replace(/\\n {4}/g, ' ');\n content.replace(/^([\\S ]+): +([\\s\\S]+?)$/gm, function (wm, key, value) {\n globals.metadata.parsed[key] = value;\n return '';\n });\n }\n\n text = text.replace(/^\\s*«««+(\\S*?)\\n([\\s\\S]+?)\\n»»»+\\n/, function (wholematch, format, content) {\n parseMetadataContents(content);\n return '¨M';\n });\n\n text = text.replace(/^\\s*---+(\\S*?)\\n([\\s\\S]+?)\\n---+\\n/, function (wholematch, format, content) {\n if (format) {\n globals.metadata.format = format;\n }\n parseMetadataContents(content);\n return '¨M';\n });\n\n text = text.replace(/¨M/g, '');\n\n text = globals.converter._dispatch('metadata.after', text, options, globals);\n return text;\n});\n\r\n/**\n * Remove one level of line-leading tabs or spaces\n */\nshowdown.subParser('outdent', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('outdent.before', text, options, globals);\n\n // attacklab: hack around Konqueror 3.5.4 bug:\n // \"----------bug\".replace(/^-/g,\"\") == \"bug\"\n text = text.replace(/^(\\t|[ ]{1,4})/gm, '¨0'); // attacklab: g_tab_width\n\n // attacklab: clean up hack\n text = text.replace(/¨0/g, '');\n\n text = globals.converter._dispatch('outdent.after', text, options, globals);\n return text;\n});\n\r\n/**\n *\n */\nshowdown.subParser('paragraphs', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('paragraphs.before', text, options, globals);\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, '');\n text = text.replace(/\\n+$/g, '');\n\n var grafs = text.split(/\\n{2,}/g),\n grafsOut = [],\n end = grafs.length; // Wrap

    tags\n\n for (var i = 0; i < end; i++) {\n var str = grafs[i];\n // if this is an HTML marker, copy it\n if (str.search(/¨(K|G)(\\d+)\\1/g) >= 0) {\n grafsOut.push(str);\n\n // test for presence of characters to prevent empty lines being parsed\n // as paragraphs (resulting in undesired extra empty paragraphs)\n } else if (str.search(/\\S/) >= 0) {\n str = showdown.subParser('spanGamut')(str, options, globals);\n str = str.replace(/^([ \\t]*)/g, '

    ');\n str += '

    ';\n grafsOut.push(str);\n }\n }\n\n /** Unhashify HTML blocks */\n end = grafsOut.length;\n for (i = 0; i < end; i++) {\n var blockText = '',\n grafsOutIt = grafsOut[i],\n codeFlag = false;\n // if this is a marker for an html block...\n // use RegExp.test instead of string.search because of QML bug\n while (/¨(K|G)(\\d+)\\1/.test(grafsOutIt)) {\n var delim = RegExp.$1,\n num = RegExp.$2;\n\n if (delim === 'K') {\n blockText = globals.gHtmlBlocks[num];\n } else {\n // we need to check if ghBlock is a false positive\n if (codeFlag) {\n // use encoded version of all text\n blockText = showdown.subParser('encodeCode')(globals.ghCodeBlocks[num].text, options, globals);\n } else {\n blockText = globals.ghCodeBlocks[num].codeblock;\n }\n }\n blockText = blockText.replace(/\\$/g, '$$$$'); // Escape any dollar signs\n\n grafsOutIt = grafsOutIt.replace(/(\\n\\n)?¨(K|G)\\d+\\2(\\n\\n)?/, blockText);\n // Check if grafsOutIt is a pre->code\n if (/^]*>\\s*]*>/.test(grafsOutIt)) {\n codeFlag = true;\n }\n }\n grafsOut[i] = grafsOutIt;\n }\n text = grafsOut.join('\\n');\n // Strip leading and trailing lines:\n text = text.replace(/^\\n+/g, '');\n text = text.replace(/\\n+$/g, '');\n return globals.converter._dispatch('paragraphs.after', text, options, globals);\n});\n\r\n/**\n * Run extension\n */\nshowdown.subParser('runExtension', function (ext, text, options, globals) {\n 'use strict';\n\n if (ext.filter) {\n text = ext.filter(text, globals.converter, options);\n\n } else if (ext.regex) {\n // TODO remove this when old extension loading mechanism is deprecated\n var re = ext.regex;\n if (!(re instanceof RegExp)) {\n re = new RegExp(re, 'g');\n }\n text = text.replace(re, ext.replace);\n }\n\n return text;\n});\n\r\n/**\n * These are all the transformations that occur *within* block-level\n * tags like paragraphs, headers, and list items.\n */\nshowdown.subParser('spanGamut', function (text, options, globals) {\n 'use strict';\n\n text = globals.converter._dispatch('spanGamut.before', text, options, globals);\n text = showdown.subParser('codeSpans')(text, options, globals);\n text = showdown.subParser('escapeSpecialCharsWithinTagAttributes')(text, options, globals);\n text = showdown.subParser('encodeBackslashEscapes')(text, options, globals);\n\n // Process anchor and image tags. Images must come first,\n // because ![foo][f] looks like an anchor.\n text = showdown.subParser('images')(text, options, globals);\n text = showdown.subParser('anchors')(text, options, globals);\n\n // Make links out of things like ``\n // Must come after anchors, because you can use < and >\n // delimiters in inline links like [this]().\n text = showdown.subParser('autoLinks')(text, options, globals);\n text = showdown.subParser('simplifiedAutoLinks')(text, options, globals);\n text = showdown.subParser('emoji')(text, options, globals);\n text = showdown.subParser('underline')(text, options, globals);\n text = showdown.subParser('italicsAndBold')(text, options, globals);\n text = showdown.subParser('strikethrough')(text, options, globals);\n text = showdown.subParser('ellipsis')(text, options, globals);\n\n // we need to hash HTML tags inside spans\n text = showdown.subParser('hashHTMLSpans')(text, options, globals);\n\n // now we encode amps and angles\n text = showdown.subParser('encodeAmpsAndAngles')(text, options, globals);\n\n // Do hard breaks\n if (options.simpleLineBreaks) {\n // GFM style hard breaks\n // only add line breaks if the text does not contain a block (special case for lists)\n if (!/\\n\\n¨K/.test(text)) {\n text = text.replace(/\\n+/g, '
    \\n');\n }\n } else {\n // Vanilla hard breaks\n text = text.replace(/ +\\n/g, '
    \\n');\n }\n\n text = globals.converter._dispatch('spanGamut.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('strikethrough', function (text, options, globals) {\n 'use strict';\n\n function parseInside (txt) {\n if (options.simplifiedAutoLink) {\n txt = showdown.subParser('simplifiedAutoLinks')(txt, options, globals);\n }\n return '' + txt + '';\n }\n\n if (options.strikethrough) {\n text = globals.converter._dispatch('strikethrough.before', text, options, globals);\n text = text.replace(/(?:~){2}([\\s\\S]+?)(?:~){2}/g, function (wm, txt) { return parseInside(txt); });\n text = globals.converter._dispatch('strikethrough.after', text, options, globals);\n }\n\n return text;\n});\n\r\n/**\n * Strips link definitions from text, stores the URLs and titles in\n * hash references.\n * Link defs are in the form: ^[id]: url \"optional title\"\n */\nshowdown.subParser('stripLinkDefinitions', function (text, options, globals) {\n 'use strict';\n\n var regex = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*\\s]+)>?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n+|(?=¨0))/gm,\n base64Regex = /^ {0,3}\\[([^\\]]+)]:[ \\t]*\\n?[ \\t]*?(?: =([*\\d]+[A-Za-z%]{0,4})x([*\\d]+[A-Za-z%]{0,4}))?[ \\t]*\\n?[ \\t]*(?:(\\n*)[\"|'(](.+?)[\"|')][ \\t]*)?(?:\\n\\n|(?=¨0)|(?=\\n\\[))/gm;\n\n // attacklab: sentinel workarounds for lack of \\A and \\Z, safari\\khtml bug\n text += '¨0';\n\n var replaceFunc = function (wholeMatch, linkId, url, width, height, blankLines, title) {\n\n // if there aren't two instances of linkId it must not be a reference link so back out\n linkId = linkId.toLowerCase();\n if (text.toLowerCase().split(linkId).length - 1 < 2) {\n return wholeMatch;\n }\n if (url.match(/^data:.+?\\/.+?;base64,/)) {\n // remove newlines\n globals.gUrls[linkId] = url.replace(/\\s/g, '');\n } else {\n globals.gUrls[linkId] = showdown.subParser('encodeAmpsAndAngles')(url, options, globals); // Link IDs are case-insensitive\n }\n\n if (blankLines) {\n // Oops, found blank lines, so it's not a title.\n // Put back the parenthetical statement we stole.\n return blankLines + title;\n\n } else {\n if (title) {\n globals.gTitles[linkId] = title.replace(/\"|'/g, '"');\n }\n if (options.parseImgDimensions && width && height) {\n globals.gDimensions[linkId] = {\n width: width,\n height: height\n };\n }\n }\n // Completely remove the definition from the text\n return '';\n };\n\n // first we try to find base64 link references\n text = text.replace(base64Regex, replaceFunc);\n\n text = text.replace(regex, replaceFunc);\n\n // attacklab: strip sentinel\n text = text.replace(/¨0/, '');\n\n return text;\n});\n\r\nshowdown.subParser('tables', function (text, options, globals) {\n 'use strict';\n\n if (!options.tables) {\n return text;\n }\n\n var tableRgx = /^ {0,3}\\|?.+\\|.+\\n {0,3}\\|?[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[\\s\\S]+?(?:\\n\\n|¨0)/gm,\n //singeColTblRgx = /^ {0,3}\\|.+\\|\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n(?: {0,3}\\|.+\\|\\n)+(?:\\n\\n|¨0)/gm;\n singeColTblRgx = /^ {0,3}\\|.+\\|[ \\t]*\\n {0,3}\\|[ \\t]*:?[ \\t]*(?:[-=]){2,}[ \\t]*:?[ \\t]*\\|[ \\t]*\\n( {0,3}\\|.+\\|[ \\t]*\\n)*(?:\\n|¨0)/gm;\n\n function parseStyles (sLine) {\n if (/^:[ \\t]*--*$/.test(sLine)) {\n return ' style=\"text-align:left;\"';\n } else if (/^--*[ \\t]*:[ \\t]*$/.test(sLine)) {\n return ' style=\"text-align:right;\"';\n } else if (/^:[ \\t]*--*[ \\t]*:$/.test(sLine)) {\n return ' style=\"text-align:center;\"';\n } else {\n return '';\n }\n }\n\n function parseHeaders (header, style) {\n var id = '';\n header = header.trim();\n // support both tablesHeaderId and tableHeaderId due to error in documentation so we don't break backwards compatibility\n if (options.tablesHeaderId || options.tableHeaderId) {\n id = ' id=\"' + header.replace(/ /g, '_').toLowerCase() + '\"';\n }\n header = showdown.subParser('spanGamut')(header, options, globals);\n\n return '' + header + '\\n';\n }\n\n function parseCells (cell, style) {\n var subText = showdown.subParser('spanGamut')(cell, options, globals);\n return '' + subText + '\\n';\n }\n\n function buildTable (headers, cells) {\n var tb = '\\n\\n\\n',\n tblLgn = headers.length;\n\n for (var i = 0; i < tblLgn; ++i) {\n tb += headers[i];\n }\n tb += '\\n\\n\\n';\n\n for (i = 0; i < cells.length; ++i) {\n tb += '\\n';\n for (var ii = 0; ii < tblLgn; ++ii) {\n tb += cells[i][ii];\n }\n tb += '\\n';\n }\n tb += '\\n
    \\n';\n return tb;\n }\n\n function parseTable (rawTable) {\n var i, tableLines = rawTable.split('\\n');\n\n for (i = 0; i < tableLines.length; ++i) {\n // strip wrong first and last column if wrapped tables are used\n if (/^ {0,3}\\|/.test(tableLines[i])) {\n tableLines[i] = tableLines[i].replace(/^ {0,3}\\|/, '');\n }\n if (/\\|[ \\t]*$/.test(tableLines[i])) {\n tableLines[i] = tableLines[i].replace(/\\|[ \\t]*$/, '');\n }\n // parse code spans first, but we only support one line code spans\n tableLines[i] = showdown.subParser('codeSpans')(tableLines[i], options, globals);\n }\n\n var rawHeaders = tableLines[0].split('|').map(function (s) { return s.trim();}),\n rawStyles = tableLines[1].split('|').map(function (s) { return s.trim();}),\n rawCells = [],\n headers = [],\n styles = [],\n cells = [];\n\n tableLines.shift();\n tableLines.shift();\n\n for (i = 0; i < tableLines.length; ++i) {\n if (tableLines[i].trim() === '') {\n continue;\n }\n rawCells.push(\n tableLines[i]\n .split('|')\n .map(function (s) {\n return s.trim();\n })\n );\n }\n\n if (rawHeaders.length < rawStyles.length) {\n return rawTable;\n }\n\n for (i = 0; i < rawStyles.length; ++i) {\n styles.push(parseStyles(rawStyles[i]));\n }\n\n for (i = 0; i < rawHeaders.length; ++i) {\n if (showdown.helper.isUndefined(styles[i])) {\n styles[i] = '';\n }\n headers.push(parseHeaders(rawHeaders[i], styles[i]));\n }\n\n for (i = 0; i < rawCells.length; ++i) {\n var row = [];\n for (var ii = 0; ii < headers.length; ++ii) {\n if (showdown.helper.isUndefined(rawCells[i][ii])) {\n\n }\n row.push(parseCells(rawCells[i][ii], styles[ii]));\n }\n cells.push(row);\n }\n\n return buildTable(headers, cells);\n }\n\n text = globals.converter._dispatch('tables.before', text, options, globals);\n\n // find escaped pipe characters\n text = text.replace(/\\\\(\\|)/g, showdown.helper.escapeCharactersCallback);\n\n // parse multi column tables\n text = text.replace(tableRgx, parseTable);\n\n // parse one column tables\n text = text.replace(singeColTblRgx, parseTable);\n\n text = globals.converter._dispatch('tables.after', text, options, globals);\n\n return text;\n});\n\r\nshowdown.subParser('underline', function (text, options, globals) {\n 'use strict';\n\n if (!options.underline) {\n return text;\n }\n\n text = globals.converter._dispatch('underline.before', text, options, globals);\n\n if (options.literalMidWordUnderscores) {\n text = text.replace(/\\b___(\\S[\\s\\S]*?)___\\b/g, function (wm, txt) {\n return '' + txt + '';\n });\n text = text.replace(/\\b__(\\S[\\s\\S]*?)__\\b/g, function (wm, txt) {\n return '' + txt + '';\n });\n } else {\n text = text.replace(/___(\\S[\\s\\S]*?)___/g, function (wm, m) {\n return (/\\S$/.test(m)) ? '' + m + '' : wm;\n });\n text = text.replace(/__(\\S[\\s\\S]*?)__/g, function (wm, m) {\n return (/\\S$/.test(m)) ? '' + m + '' : wm;\n });\n }\n\n // escape remaining underscores to prevent them being parsed by italic and bold\n text = text.replace(/(_)/g, showdown.helper.escapeCharactersCallback);\n\n text = globals.converter._dispatch('underline.after', text, options, globals);\n\n return text;\n});\n\r\n/**\n * Swap back in all the special characters we've hidden.\n */\nshowdown.subParser('unescapeSpecialChars', function (text, options, globals) {\n 'use strict';\n text = globals.converter._dispatch('unescapeSpecialChars.before', text, options, globals);\n\n text = text.replace(/¨E(\\d+)E/g, function (wholeMatch, m1) {\n var charCodeToReplace = parseInt(m1);\n return String.fromCharCode(charCodeToReplace);\n });\n\n text = globals.converter._dispatch('unescapeSpecialChars.after', text, options, globals);\n return text;\n});\n\r\nshowdown.subParser('makeMarkdown.blockquote', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n var children = node.childNodes,\n childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; ++i) {\n var innerTxt = showdown.subParser('makeMarkdown.node')(children[i], globals);\n\n if (innerTxt === '') {\n continue;\n }\n txt += innerTxt;\n }\n }\n // cleanup\n txt = txt.trim();\n txt = '> ' + txt.split('\\n').join('\\n> ');\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.codeBlock', function (node, globals) {\n 'use strict';\n\n var lang = node.getAttribute('language'),\n num = node.getAttribute('precodenum');\n return '```' + lang + '\\n' + globals.preList[num] + '\\n```';\n});\n\r\nshowdown.subParser('makeMarkdown.codeSpan', function (node) {\n 'use strict';\n\n return '`' + node.innerHTML + '`';\n});\n\r\nshowdown.subParser('makeMarkdown.emphasis', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n txt += '*';\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '*';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.header', function (node, globals, headerLevel) {\n 'use strict';\n\n var headerMark = new Array(headerLevel + 1).join('#'),\n txt = '';\n\n if (node.hasChildNodes()) {\n txt = headerMark + ' ';\n var children = node.childNodes,\n childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.hr', function () {\n 'use strict';\n\n return '---';\n});\n\r\nshowdown.subParser('makeMarkdown.image', function (node) {\n 'use strict';\n\n var txt = '';\n if (node.hasAttribute('src')) {\n txt += '![' + node.getAttribute('alt') + '](';\n txt += '<' + node.getAttribute('src') + '>';\n if (node.hasAttribute('width') && node.hasAttribute('height')) {\n txt += ' =' + node.getAttribute('width') + 'x' + node.getAttribute('height');\n }\n\n if (node.hasAttribute('title')) {\n txt += ' \"' + node.getAttribute('title') + '\"';\n }\n txt += ')';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.links', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes() && node.hasAttribute('href')) {\n var children = node.childNodes,\n childrenLength = children.length;\n txt = '[';\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '](';\n txt += '<' + node.getAttribute('href') + '>';\n if (node.hasAttribute('title')) {\n txt += ' \"' + node.getAttribute('title') + '\"';\n }\n txt += ')';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.list', function (node, globals, type) {\n 'use strict';\n\n var txt = '';\n if (!node.hasChildNodes()) {\n return '';\n }\n var listItems = node.childNodes,\n listItemsLenght = listItems.length,\n listNum = node.getAttribute('start') || 1;\n\n for (var i = 0; i < listItemsLenght; ++i) {\n if (typeof listItems[i].tagName === 'undefined' || listItems[i].tagName.toLowerCase() !== 'li') {\n continue;\n }\n\n // define the bullet to use in list\n var bullet = '';\n if (type === 'ol') {\n bullet = listNum.toString() + '. ';\n } else {\n bullet = '- ';\n }\n\n // parse list item\n txt += bullet + showdown.subParser('makeMarkdown.listItem')(listItems[i], globals);\n ++listNum;\n }\n\n // add comment at the end to prevent consecutive lists to be parsed as one\n txt += '\\n\\n';\n return txt.trim();\n});\n\r\nshowdown.subParser('makeMarkdown.listItem', function (node, globals) {\n 'use strict';\n\n var listItemTxt = '';\n\n var children = node.childNodes,\n childrenLenght = children.length;\n\n for (var i = 0; i < childrenLenght; ++i) {\n listItemTxt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n // if it's only one liner, we need to add a newline at the end\n if (!/\\n$/.test(listItemTxt)) {\n listItemTxt += '\\n';\n } else {\n // it's multiparagraph, so we need to indent\n listItemTxt = listItemTxt\n .split('\\n')\n .join('\\n ')\n .replace(/^ {4}$/gm, '')\n .replace(/\\n\\n+/g, '\\n\\n');\n }\n\n return listItemTxt;\n});\n\r\n\n\nshowdown.subParser('makeMarkdown.node', function (node, globals, spansOnly) {\n 'use strict';\n\n spansOnly = spansOnly || false;\n\n var txt = '';\n\n // edge case of text without wrapper paragraph\n if (node.nodeType === 3) {\n return showdown.subParser('makeMarkdown.txt')(node, globals);\n }\n\n // HTML comment\n if (node.nodeType === 8) {\n return '\\n\\n';\n }\n\n // process only node elements\n if (node.nodeType !== 1) {\n return '';\n }\n\n var tagName = node.tagName.toLowerCase();\n\n switch (tagName) {\n\n //\n // BLOCKS\n //\n case 'h1':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 1) + '\\n\\n'; }\n break;\n case 'h2':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 2) + '\\n\\n'; }\n break;\n case 'h3':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 3) + '\\n\\n'; }\n break;\n case 'h4':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 4) + '\\n\\n'; }\n break;\n case 'h5':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 5) + '\\n\\n'; }\n break;\n case 'h6':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.header')(node, globals, 6) + '\\n\\n'; }\n break;\n\n case 'p':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.paragraph')(node, globals) + '\\n\\n'; }\n break;\n\n case 'blockquote':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.blockquote')(node, globals) + '\\n\\n'; }\n break;\n\n case 'hr':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.hr')(node, globals) + '\\n\\n'; }\n break;\n\n case 'ol':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ol') + '\\n\\n'; }\n break;\n\n case 'ul':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.list')(node, globals, 'ul') + '\\n\\n'; }\n break;\n\n case 'precode':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.codeBlock')(node, globals) + '\\n\\n'; }\n break;\n\n case 'pre':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.pre')(node, globals) + '\\n\\n'; }\n break;\n\n case 'table':\n if (!spansOnly) { txt = showdown.subParser('makeMarkdown.table')(node, globals) + '\\n\\n'; }\n break;\n\n //\n // SPANS\n //\n case 'code':\n txt = showdown.subParser('makeMarkdown.codeSpan')(node, globals);\n break;\n\n case 'em':\n case 'i':\n txt = showdown.subParser('makeMarkdown.emphasis')(node, globals);\n break;\n\n case 'strong':\n case 'b':\n txt = showdown.subParser('makeMarkdown.strong')(node, globals);\n break;\n\n case 'del':\n txt = showdown.subParser('makeMarkdown.strikethrough')(node, globals);\n break;\n\n case 'a':\n txt = showdown.subParser('makeMarkdown.links')(node, globals);\n break;\n\n case 'img':\n txt = showdown.subParser('makeMarkdown.image')(node, globals);\n break;\n\n default:\n txt = node.outerHTML + '\\n\\n';\n }\n\n // common normalization\n // TODO eventually\n\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.paragraph', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n }\n\n // some text normalization\n txt = txt.trim();\n\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.pre', function (node, globals) {\n 'use strict';\n\n var num = node.getAttribute('prenum');\n return '
    ' + globals.preList[num] + '
    ';\n});\n\r\nshowdown.subParser('makeMarkdown.strikethrough', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n txt += '~~';\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '~~';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.strong', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (node.hasChildNodes()) {\n txt += '**';\n var children = node.childNodes,\n childrenLength = children.length;\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals);\n }\n txt += '**';\n }\n return txt;\n});\n\r\nshowdown.subParser('makeMarkdown.table', function (node, globals) {\n 'use strict';\n\n var txt = '',\n tableArray = [[], []],\n headings = node.querySelectorAll('thead>tr>th'),\n rows = node.querySelectorAll('tbody>tr'),\n i, ii;\n for (i = 0; i < headings.length; ++i) {\n var headContent = showdown.subParser('makeMarkdown.tableCell')(headings[i], globals),\n allign = '---';\n\n if (headings[i].hasAttribute('style')) {\n var style = headings[i].getAttribute('style').toLowerCase().replace(/\\s/g, '');\n switch (style) {\n case 'text-align:left;':\n allign = ':---';\n break;\n case 'text-align:right;':\n allign = '---:';\n break;\n case 'text-align:center;':\n allign = ':---:';\n break;\n }\n }\n tableArray[0][i] = headContent.trim();\n tableArray[1][i] = allign;\n }\n\n for (i = 0; i < rows.length; ++i) {\n var r = tableArray.push([]) - 1,\n cols = rows[i].getElementsByTagName('td');\n\n for (ii = 0; ii < headings.length; ++ii) {\n var cellContent = ' ';\n if (typeof cols[ii] !== 'undefined') {\n cellContent = showdown.subParser('makeMarkdown.tableCell')(cols[ii], globals);\n }\n tableArray[r].push(cellContent);\n }\n }\n\n var cellSpacesCount = 3;\n for (i = 0; i < tableArray.length; ++i) {\n for (ii = 0; ii < tableArray[i].length; ++ii) {\n var strLen = tableArray[i][ii].length;\n if (strLen > cellSpacesCount) {\n cellSpacesCount = strLen;\n }\n }\n }\n\n for (i = 0; i < tableArray.length; ++i) {\n for (ii = 0; ii < tableArray[i].length; ++ii) {\n if (i === 1) {\n if (tableArray[i][ii].slice(-1) === ':') {\n tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii].slice(-1), cellSpacesCount - 1, '-') + ':';\n } else {\n tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount, '-');\n }\n } else {\n tableArray[i][ii] = showdown.helper.padEnd(tableArray[i][ii], cellSpacesCount);\n }\n }\n txt += '| ' + tableArray[i].join(' | ') + ' |\\n';\n }\n\n return txt.trim();\n});\n\r\nshowdown.subParser('makeMarkdown.tableCell', function (node, globals) {\n 'use strict';\n\n var txt = '';\n if (!node.hasChildNodes()) {\n return '';\n }\n var children = node.childNodes,\n childrenLength = children.length;\n\n for (var i = 0; i < childrenLength; ++i) {\n txt += showdown.subParser('makeMarkdown.node')(children[i], globals, true);\n }\n return txt.trim();\n});\n\r\nshowdown.subParser('makeMarkdown.txt', function (node) {\n 'use strict';\n\n var txt = node.nodeValue;\n\n // multiple spaces are collapsed\n txt = txt.replace(/ +/g, ' ');\n\n // replace the custom ¨NBSP; with a space\n txt = txt.replace(/¨NBSP;/g, ' ');\n\n // \", <, > and & should replace escaped html entities\n txt = showdown.helper.unescapeHTMLEntities(txt);\n\n // escape markdown magic characters\n // emphasis, strong and strikethrough - can appear everywhere\n // we also escape pipe (|) because of tables\n // and escape ` because of code blocks and spans\n txt = txt.replace(/([*_~|`])/g, '\\\\$1');\n\n // escape > because of blockquotes\n txt = txt.replace(/^(\\s*)>/g, '\\\\$1>');\n\n // hash character, only troublesome at the beginning of a line because of headers\n txt = txt.replace(/^#/gm, '\\\\#');\n\n // horizontal rules\n txt = txt.replace(/^(\\s*)([-=]{3,})(\\s*)$/, '$1\\\\$2$3');\n\n // dot, because of ordered lists, only troublesome at the beginning of a line when preceded by an integer\n txt = txt.replace(/^( {0,3}\\d+)\\./gm, '$1\\\\.');\n\n // +, * and -, at the beginning of a line becomes a list, so we need to escape them also (asterisk was already escaped)\n txt = txt.replace(/^( {0,3})([+-])/gm, '$1\\\\$2');\n\n // images and links, ] followed by ( is problematic, so we escape it\n txt = txt.replace(/]([\\s]*)\\(/g, '\\\\]$1\\\\(');\n\n // reference URIs must also be escaped\n txt = txt.replace(/^ {0,3}\\[([\\S \\t]*?)]:/gm, '\\\\[$1]:');\n\n return txt;\n});\n\r\nvar root = this;\n\n// AMD Loader\nif (typeof define === 'function' && define.amd) {\n define(function () {\n 'use strict';\n return showdown;\n });\n\n// CommonJS/nodeJS Loader\n} else if (typeof module !== 'undefined' && module.exports) {\n module.exports = showdown;\n\n// Regular Browser loader\n} else {\n root.showdown = showdown;\n}\n}).call(this);\r\n\n//# sourceMappingURL=showdown.js.map\r\n","var nextTick = require('process/browser.js').nextTick;\nvar apply = Function.prototype.apply;\nvar slice = Array.prototype.slice;\nvar immediateIds = {};\nvar nextImmediateId = 0;\n\n// DOM APIs, for completeness\n\nexports.setTimeout = function() {\n return new Timeout(apply.call(setTimeout, window, arguments), clearTimeout);\n};\nexports.setInterval = function() {\n return new Timeout(apply.call(setInterval, window, arguments), clearInterval);\n};\nexports.clearTimeout =\nexports.clearInterval = function(timeout) { timeout.close(); };\n\nfunction Timeout(id, clearFn) {\n this._id = id;\n this._clearFn = clearFn;\n}\nTimeout.prototype.unref = Timeout.prototype.ref = function() {};\nTimeout.prototype.close = function() {\n this._clearFn.call(window, this._id);\n};\n\n// Does not start the time, just sets up the members needed.\nexports.enroll = function(item, msecs) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = msecs;\n};\n\nexports.unenroll = function(item) {\n clearTimeout(item._idleTimeoutId);\n item._idleTimeout = -1;\n};\n\nexports._unrefActive = exports.active = function(item) {\n clearTimeout(item._idleTimeoutId);\n\n var msecs = item._idleTimeout;\n if (msecs >= 0) {\n item._idleTimeoutId = setTimeout(function onTimeout() {\n if (item._onTimeout)\n item._onTimeout();\n }, msecs);\n }\n};\n\n// That's not how node.js implements it but the exposed api is the same.\nexports.setImmediate = typeof setImmediate === \"function\" ? setImmediate : function(fn) {\n var id = nextImmediateId++;\n var args = arguments.length < 2 ? false : slice.call(arguments, 1);\n\n immediateIds[id] = true;\n\n nextTick(function onNextTick() {\n if (immediateIds[id]) {\n // fn.call() is faster so we optimize for the common use-case\n // @see http://jsperf.com/call-apply-segu\n if (args) {\n fn.apply(null, args);\n } else {\n fn.call(null);\n }\n // Prevent ids from leaking\n exports.clearImmediate(id);\n }\n });\n\n return id;\n};\n\nexports.clearImmediate = typeof clearImmediate === \"function\" ? clearImmediate : function(id) {\n delete immediateIds[id];\n};","/**!\n* tippy.js v6.2.6\n* (c) 2017-2020 atomiks\n* MIT License\n*/\n'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar core = require('@popperjs/core');\n\nvar ROUND_ARROW = '';\nvar BOX_CLASS = \"tippy-box\";\nvar CONTENT_CLASS = \"tippy-content\";\nvar BACKDROP_CLASS = \"tippy-backdrop\";\nvar ARROW_CLASS = \"tippy-arrow\";\nvar SVG_ARROW_CLASS = \"tippy-svg-arrow\";\nvar TOUCH_OPTIONS = {\n passive: true,\n capture: true\n};\n\nfunction hasOwnProperty(obj, key) {\n return {}.hasOwnProperty.call(obj, key);\n}\nfunction getValueAtIndexOrReturn(value, index, defaultValue) {\n if (Array.isArray(value)) {\n var v = value[index];\n return v == null ? Array.isArray(defaultValue) ? defaultValue[index] : defaultValue : v;\n }\n\n return value;\n}\nfunction isType(value, type) {\n var str = {}.toString.call(value);\n return str.indexOf('[object') === 0 && str.indexOf(type + \"]\") > -1;\n}\nfunction invokeWithArgsOrReturn(value, args) {\n return typeof value === 'function' ? value.apply(void 0, args) : value;\n}\nfunction debounce(fn, ms) {\n // Avoid wrapping in `setTimeout` if ms is 0 anyway\n if (ms === 0) {\n return fn;\n }\n\n var timeout;\n return function (arg) {\n clearTimeout(timeout);\n timeout = setTimeout(function () {\n fn(arg);\n }, ms);\n };\n}\nfunction removeProperties(obj, keys) {\n var clone = Object.assign({}, obj);\n keys.forEach(function (key) {\n delete clone[key];\n });\n return clone;\n}\nfunction splitBySpaces(value) {\n return value.split(/\\s+/).filter(Boolean);\n}\nfunction normalizeToArray(value) {\n return [].concat(value);\n}\nfunction pushIfUnique(arr, value) {\n if (arr.indexOf(value) === -1) {\n arr.push(value);\n }\n}\nfunction unique(arr) {\n return arr.filter(function (item, index) {\n return arr.indexOf(item) === index;\n });\n}\nfunction getBasePlacement(placement) {\n return placement.split('-')[0];\n}\nfunction arrayFrom(value) {\n return [].slice.call(value);\n}\nfunction removeUndefinedProps(obj) {\n return Object.keys(obj).reduce(function (acc, key) {\n if (obj[key] !== undefined) {\n acc[key] = obj[key];\n }\n\n return acc;\n }, {});\n}\n\nfunction div() {\n return document.createElement('div');\n}\nfunction isElement(value) {\n return ['Element', 'Fragment'].some(function (type) {\n return isType(value, type);\n });\n}\nfunction isNodeList(value) {\n return isType(value, 'NodeList');\n}\nfunction isMouseEvent(value) {\n return isType(value, 'MouseEvent');\n}\nfunction isReferenceElement(value) {\n return !!(value && value._tippy && value._tippy.reference === value);\n}\nfunction getArrayOfElements(value) {\n if (isElement(value)) {\n return [value];\n }\n\n if (isNodeList(value)) {\n return arrayFrom(value);\n }\n\n if (Array.isArray(value)) {\n return value;\n }\n\n return arrayFrom(document.querySelectorAll(value));\n}\nfunction setTransitionDuration(els, value) {\n els.forEach(function (el) {\n if (el) {\n el.style.transitionDuration = value + \"ms\";\n }\n });\n}\nfunction setVisibilityState(els, state) {\n els.forEach(function (el) {\n if (el) {\n el.setAttribute('data-state', state);\n }\n });\n}\nfunction getOwnerDocument(elementOrElements) {\n var _normalizeToArray = normalizeToArray(elementOrElements),\n element = _normalizeToArray[0];\n\n return element ? element.ownerDocument || document : document;\n}\nfunction isCursorOutsideInteractiveBorder(popperTreeData, event) {\n var clientX = event.clientX,\n clientY = event.clientY;\n return popperTreeData.every(function (_ref) {\n var popperRect = _ref.popperRect,\n popperState = _ref.popperState,\n props = _ref.props;\n var interactiveBorder = props.interactiveBorder;\n var basePlacement = getBasePlacement(popperState.placement);\n var offsetData = popperState.modifiersData.offset;\n\n if (!offsetData) {\n return true;\n }\n\n var topDistance = basePlacement === 'bottom' ? offsetData.top.y : 0;\n var bottomDistance = basePlacement === 'top' ? offsetData.bottom.y : 0;\n var leftDistance = basePlacement === 'right' ? offsetData.left.x : 0;\n var rightDistance = basePlacement === 'left' ? offsetData.right.x : 0;\n var exceedsTop = popperRect.top - clientY + topDistance > interactiveBorder;\n var exceedsBottom = clientY - popperRect.bottom - bottomDistance > interactiveBorder;\n var exceedsLeft = popperRect.left - clientX + leftDistance > interactiveBorder;\n var exceedsRight = clientX - popperRect.right - rightDistance > interactiveBorder;\n return exceedsTop || exceedsBottom || exceedsLeft || exceedsRight;\n });\n}\nfunction updateTransitionEndListener(box, action, listener) {\n var method = action + \"EventListener\"; // some browsers apparently support `transition` (unprefixed) but only fire\n // `webkitTransitionEnd`...\n\n ['transitionend', 'webkitTransitionEnd'].forEach(function (event) {\n box[method](event, listener);\n });\n}\n\nvar currentInput = {\n isTouch: false\n};\nvar lastMouseMoveTime = 0;\n/**\n * When a `touchstart` event is fired, it's assumed the user is using touch\n * input. We'll bind a `mousemove` event listener to listen for mouse input in\n * the future. This way, the `isTouch` property is fully dynamic and will handle\n * hybrid devices that use a mix of touch + mouse input.\n */\n\nfunction onDocumentTouchStart() {\n if (currentInput.isTouch) {\n return;\n }\n\n currentInput.isTouch = true;\n\n if (window.performance) {\n document.addEventListener('mousemove', onDocumentMouseMove);\n }\n}\n/**\n * When two `mousemove` event are fired consecutively within 20ms, it's assumed\n * the user is using mouse input again. `mousemove` can fire on touch devices as\n * well, but very rarely that quickly.\n */\n\nfunction onDocumentMouseMove() {\n var now = performance.now();\n\n if (now - lastMouseMoveTime < 20) {\n currentInput.isTouch = false;\n document.removeEventListener('mousemove', onDocumentMouseMove);\n }\n\n lastMouseMoveTime = now;\n}\n/**\n * When an element is in focus and has a tippy, leaving the tab/window and\n * returning causes it to show again. For mouse users this is unexpected, but\n * for keyboard use it makes sense.\n * TODO: find a better technique to solve this problem\n */\n\nfunction onWindowBlur() {\n var activeElement = document.activeElement;\n\n if (isReferenceElement(activeElement)) {\n var instance = activeElement._tippy;\n\n if (activeElement.blur && !instance.state.isVisible) {\n activeElement.blur();\n }\n }\n}\nfunction bindGlobalEventListeners() {\n document.addEventListener('touchstart', onDocumentTouchStart, TOUCH_OPTIONS);\n window.addEventListener('blur', onWindowBlur);\n}\n\nvar isBrowser = typeof window !== 'undefined' && typeof document !== 'undefined';\nvar ua = isBrowser ? navigator.userAgent : '';\nvar isIE = /MSIE |Trident\\//.test(ua);\n\nfunction createMemoryLeakWarning(method) {\n var txt = method === 'destroy' ? 'n already-' : ' ';\n return [method + \"() was called on a\" + txt + \"destroyed instance. This is a no-op but\", 'indicates a potential memory leak.'].join(' ');\n}\nfunction clean(value) {\n var spacesAndTabs = /[ \\t]{2,}/g;\n var lineStartWithSpaces = /^[ \\t]*/gm;\n return value.replace(spacesAndTabs, ' ').replace(lineStartWithSpaces, '').trim();\n}\n\nfunction getDevMessage(message) {\n return clean(\"\\n %ctippy.js\\n\\n %c\" + clean(message) + \"\\n\\n %c\\uD83D\\uDC77\\u200D This is a development-only message. It will be removed in production.\\n \");\n}\n\nfunction getFormattedMessage(message) {\n return [getDevMessage(message), // title\n 'color: #00C584; font-size: 1.3em; font-weight: bold;', // message\n 'line-height: 1.5', // footer\n 'color: #a6a095;'];\n} // Assume warnings and errors never have the same message\n\nvar visitedMessages;\n\nif (\"development\" !== \"production\") {\n resetVisitedMessages();\n}\n\nfunction resetVisitedMessages() {\n visitedMessages = new Set();\n}\nfunction warnWhen(condition, message) {\n if (condition && !visitedMessages.has(message)) {\n var _console;\n\n visitedMessages.add(message);\n\n (_console = console).warn.apply(_console, getFormattedMessage(message));\n }\n}\nfunction errorWhen(condition, message) {\n if (condition && !visitedMessages.has(message)) {\n var _console2;\n\n visitedMessages.add(message);\n\n (_console2 = console).error.apply(_console2, getFormattedMessage(message));\n }\n}\nfunction validateTargets(targets) {\n var didPassFalsyValue = !targets;\n var didPassPlainObject = Object.prototype.toString.call(targets) === '[object Object]' && !targets.addEventListener;\n errorWhen(didPassFalsyValue, ['tippy() was passed', '`' + String(targets) + '`', 'as its targets (first) argument. Valid types are: String, Element,', 'Element[], or NodeList.'].join(' '));\n errorWhen(didPassPlainObject, ['tippy() was passed a plain object which is not supported as an argument', 'for virtual positioning. Use props.getReferenceClientRect instead.'].join(' '));\n}\n\nvar pluginProps = {\n animateFill: false,\n followCursor: false,\n inlinePositioning: false,\n sticky: false\n};\nvar renderProps = {\n allowHTML: false,\n animation: 'fade',\n arrow: true,\n content: '',\n inertia: false,\n maxWidth: 350,\n role: 'tooltip',\n theme: '',\n zIndex: 9999\n};\nvar defaultProps = Object.assign({\n appendTo: function appendTo() {\n return document.body;\n },\n aria: {\n content: 'auto',\n expanded: 'auto'\n },\n delay: 0,\n duration: [300, 250],\n getReferenceClientRect: null,\n hideOnClick: true,\n ignoreAttributes: false,\n interactive: false,\n interactiveBorder: 2,\n interactiveDebounce: 0,\n moveTransition: '',\n offset: [0, 10],\n onAfterUpdate: function onAfterUpdate() {},\n onBeforeUpdate: function onBeforeUpdate() {},\n onCreate: function onCreate() {},\n onDestroy: function onDestroy() {},\n onHidden: function onHidden() {},\n onHide: function onHide() {},\n onMount: function onMount() {},\n onShow: function onShow() {},\n onShown: function onShown() {},\n onTrigger: function onTrigger() {},\n onUntrigger: function onUntrigger() {},\n onClickOutside: function onClickOutside() {},\n placement: 'top',\n plugins: [],\n popperOptions: {},\n render: null,\n showOnCreate: false,\n touch: true,\n trigger: 'mouseenter focus',\n triggerTarget: null\n}, pluginProps, {}, renderProps);\nvar defaultKeys = Object.keys(defaultProps);\nvar setDefaultProps = function setDefaultProps(partialProps) {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n validateProps(partialProps, []);\n }\n\n var keys = Object.keys(partialProps);\n keys.forEach(function (key) {\n defaultProps[key] = partialProps[key];\n });\n};\nfunction getExtendedPassedProps(passedProps) {\n var plugins = passedProps.plugins || [];\n var pluginProps = plugins.reduce(function (acc, plugin) {\n var name = plugin.name,\n defaultValue = plugin.defaultValue;\n\n if (name) {\n acc[name] = passedProps[name] !== undefined ? passedProps[name] : defaultValue;\n }\n\n return acc;\n }, {});\n return Object.assign({}, passedProps, {}, pluginProps);\n}\nfunction getDataAttributeProps(reference, plugins) {\n var propKeys = plugins ? Object.keys(getExtendedPassedProps(Object.assign({}, defaultProps, {\n plugins: plugins\n }))) : defaultKeys;\n var props = propKeys.reduce(function (acc, key) {\n var valueAsString = (reference.getAttribute(\"data-tippy-\" + key) || '').trim();\n\n if (!valueAsString) {\n return acc;\n }\n\n if (key === 'content') {\n acc[key] = valueAsString;\n } else {\n try {\n acc[key] = JSON.parse(valueAsString);\n } catch (e) {\n acc[key] = valueAsString;\n }\n }\n\n return acc;\n }, {});\n return props;\n}\nfunction evaluateProps(reference, props) {\n var out = Object.assign({}, props, {\n content: invokeWithArgsOrReturn(props.content, [reference])\n }, props.ignoreAttributes ? {} : getDataAttributeProps(reference, props.plugins));\n out.aria = Object.assign({}, defaultProps.aria, {}, out.aria);\n out.aria = {\n expanded: out.aria.expanded === 'auto' ? props.interactive : out.aria.expanded,\n content: out.aria.content === 'auto' ? props.interactive ? null : 'describedby' : out.aria.content\n };\n return out;\n}\nfunction validateProps(partialProps, plugins) {\n if (partialProps === void 0) {\n partialProps = {};\n }\n\n if (plugins === void 0) {\n plugins = [];\n }\n\n var keys = Object.keys(partialProps);\n keys.forEach(function (prop) {\n var nonPluginProps = removeProperties(defaultProps, Object.keys(pluginProps));\n var didPassUnknownProp = !hasOwnProperty(nonPluginProps, prop); // Check if the prop exists in `plugins`\n\n if (didPassUnknownProp) {\n didPassUnknownProp = plugins.filter(function (plugin) {\n return plugin.name === prop;\n }).length === 0;\n }\n\n warnWhen(didPassUnknownProp, [\"`\" + prop + \"`\", \"is not a valid prop. You may have spelled it incorrectly, or if it's\", 'a plugin, forgot to pass it in an array as props.plugins.', '\\n\\n', 'All props: https://atomiks.github.io/tippyjs/v6/all-props/\\n', 'Plugins: https://atomiks.github.io/tippyjs/v6/plugins/'].join(' '));\n });\n}\n\nvar innerHTML = function innerHTML() {\n return 'innerHTML';\n};\n\nfunction dangerouslySetInnerHTML(element, html) {\n element[innerHTML()] = html;\n}\n\nfunction createArrowElement(value) {\n var arrow = div();\n\n if (value === true) {\n arrow.className = ARROW_CLASS;\n } else {\n arrow.className = SVG_ARROW_CLASS;\n\n if (isElement(value)) {\n arrow.appendChild(value);\n } else {\n dangerouslySetInnerHTML(arrow, value);\n }\n }\n\n return arrow;\n}\n\nfunction setContent(content, props) {\n if (isElement(props.content)) {\n dangerouslySetInnerHTML(content, '');\n content.appendChild(props.content);\n } else if (typeof props.content !== 'function') {\n if (props.allowHTML) {\n dangerouslySetInnerHTML(content, props.content);\n } else {\n content.textContent = props.content;\n }\n }\n}\nfunction getChildren(popper) {\n var box = popper.firstElementChild;\n var boxChildren = arrayFrom(box.children);\n return {\n box: box,\n content: boxChildren.find(function (node) {\n return node.classList.contains(CONTENT_CLASS);\n }),\n arrow: boxChildren.find(function (node) {\n return node.classList.contains(ARROW_CLASS) || node.classList.contains(SVG_ARROW_CLASS);\n }),\n backdrop: boxChildren.find(function (node) {\n return node.classList.contains(BACKDROP_CLASS);\n })\n };\n}\nfunction render(instance) {\n var popper = div();\n var box = div();\n box.className = BOX_CLASS;\n box.setAttribute('data-state', 'hidden');\n box.setAttribute('tabindex', '-1');\n var content = div();\n content.className = CONTENT_CLASS;\n content.setAttribute('data-state', 'hidden');\n setContent(content, instance.props);\n popper.appendChild(box);\n box.appendChild(content);\n onUpdate(instance.props, instance.props);\n\n function onUpdate(prevProps, nextProps) {\n var _getChildren = getChildren(popper),\n box = _getChildren.box,\n content = _getChildren.content,\n arrow = _getChildren.arrow;\n\n if (nextProps.theme) {\n box.setAttribute('data-theme', nextProps.theme);\n } else {\n box.removeAttribute('data-theme');\n }\n\n if (typeof nextProps.animation === 'string') {\n box.setAttribute('data-animation', nextProps.animation);\n } else {\n box.removeAttribute('data-animation');\n }\n\n if (nextProps.inertia) {\n box.setAttribute('data-inertia', '');\n } else {\n box.removeAttribute('data-inertia');\n }\n\n box.style.maxWidth = typeof nextProps.maxWidth === 'number' ? nextProps.maxWidth + \"px\" : nextProps.maxWidth;\n\n if (nextProps.role) {\n box.setAttribute('role', nextProps.role);\n } else {\n box.removeAttribute('role');\n }\n\n if (prevProps.content !== nextProps.content || prevProps.allowHTML !== nextProps.allowHTML) {\n setContent(content, instance.props);\n }\n\n if (nextProps.arrow) {\n if (!arrow) {\n box.appendChild(createArrowElement(nextProps.arrow));\n } else if (prevProps.arrow !== nextProps.arrow) {\n box.removeChild(arrow);\n box.appendChild(createArrowElement(nextProps.arrow));\n }\n } else if (arrow) {\n box.removeChild(arrow);\n }\n }\n\n return {\n popper: popper,\n onUpdate: onUpdate\n };\n} // Runtime check to identify if the render function is the default one; this\n// way we can apply default CSS transitions logic and it can be tree-shaken away\n\nrender.$$tippy = true;\n\nvar idCounter = 1;\nvar mouseMoveListeners = []; // Used by `hideAll()`\n\nvar mountedInstances = [];\nfunction createTippy(reference, passedProps) {\n var props = evaluateProps(reference, Object.assign({}, defaultProps, {}, getExtendedPassedProps(removeUndefinedProps(passedProps)))); // ===========================================================================\n // 🔒 Private members\n // ===========================================================================\n\n var showTimeout;\n var hideTimeout;\n var scheduleHideAnimationFrame;\n var isVisibleFromClick = false;\n var didHideDueToDocumentMouseDown = false;\n var didTouchMove = false;\n var ignoreOnFirstUpdate = false;\n var lastTriggerEvent;\n var currentTransitionEndListener;\n var onFirstUpdate;\n var listeners = [];\n var debouncedOnMouseMove = debounce(onMouseMove, props.interactiveDebounce);\n var currentTarget;\n var doc = getOwnerDocument(props.triggerTarget || reference); // ===========================================================================\n // 🔑 Public members\n // ===========================================================================\n\n var id = idCounter++;\n var popperInstance = null;\n var plugins = unique(props.plugins);\n var state = {\n // Is the instance currently enabled?\n isEnabled: true,\n // Is the tippy currently showing and not transitioning out?\n isVisible: false,\n // Has the instance been destroyed?\n isDestroyed: false,\n // Is the tippy currently mounted to the DOM?\n isMounted: false,\n // Has the tippy finished transitioning in?\n isShown: false\n };\n var instance = {\n // properties\n id: id,\n reference: reference,\n popper: div(),\n popperInstance: popperInstance,\n props: props,\n state: state,\n plugins: plugins,\n // methods\n clearDelayTimeouts: clearDelayTimeouts,\n setProps: setProps,\n setContent: setContent,\n show: show,\n hide: hide,\n hideWithInteractivity: hideWithInteractivity,\n enable: enable,\n disable: disable,\n unmount: unmount,\n destroy: destroy\n }; // TODO: Investigate why this early return causes a TDZ error in the tests —\n // it doesn't seem to happen in the browser\n\n /* istanbul ignore if */\n\n if (!props.render) {\n if (\"development\" !== \"production\") {\n errorWhen(true, 'render() function has not been supplied.');\n }\n\n return instance;\n } // ===========================================================================\n // Initial mutations\n // ===========================================================================\n\n\n var _props$render = props.render(instance),\n popper = _props$render.popper,\n onUpdate = _props$render.onUpdate;\n\n popper.setAttribute('data-tippy-root', '');\n popper.id = \"tippy-\" + instance.id;\n instance.popper = popper;\n reference._tippy = instance;\n popper._tippy = instance;\n var pluginsHooks = plugins.map(function (plugin) {\n return plugin.fn(instance);\n });\n var hasAriaExpanded = reference.hasAttribute('aria-expanded');\n addListeners();\n handleAriaExpandedAttribute();\n handleStyles();\n invokeHook('onCreate', [instance]);\n\n if (props.showOnCreate) {\n scheduleShow();\n } // Prevent a tippy with a delay from hiding if the cursor left then returned\n // before it started hiding\n\n\n popper.addEventListener('mouseenter', function () {\n if (instance.props.interactive && instance.state.isVisible) {\n instance.clearDelayTimeouts();\n }\n });\n popper.addEventListener('mouseleave', function (event) {\n if (instance.props.interactive && instance.props.trigger.indexOf('mouseenter') >= 0) {\n doc.addEventListener('mousemove', debouncedOnMouseMove);\n debouncedOnMouseMove(event);\n }\n });\n return instance; // ===========================================================================\n // 🔒 Private methods\n // ===========================================================================\n\n function getNormalizedTouchSettings() {\n var touch = instance.props.touch;\n return Array.isArray(touch) ? touch : [touch, 0];\n }\n\n function getIsCustomTouchBehavior() {\n return getNormalizedTouchSettings()[0] === 'hold';\n }\n\n function getIsDefaultRenderFn() {\n var _instance$props$rende;\n\n // @ts-ignore\n return !!((_instance$props$rende = instance.props.render) == null ? void 0 : _instance$props$rende.$$tippy);\n }\n\n function getCurrentTarget() {\n return currentTarget || reference;\n }\n\n function getDefaultTemplateChildren() {\n return getChildren(popper);\n }\n\n function getDelay(isShow) {\n // For touch or keyboard input, force `0` delay for UX reasons\n // Also if the instance is mounted but not visible (transitioning out),\n // ignore delay\n if (instance.state.isMounted && !instance.state.isVisible || currentInput.isTouch || lastTriggerEvent && lastTriggerEvent.type === 'focus') {\n return 0;\n }\n\n return getValueAtIndexOrReturn(instance.props.delay, isShow ? 0 : 1, defaultProps.delay);\n }\n\n function handleStyles() {\n popper.style.pointerEvents = instance.props.interactive && instance.state.isVisible ? '' : 'none';\n popper.style.zIndex = \"\" + instance.props.zIndex;\n }\n\n function invokeHook(hook, args, shouldInvokePropsHook) {\n if (shouldInvokePropsHook === void 0) {\n shouldInvokePropsHook = true;\n }\n\n pluginsHooks.forEach(function (pluginHooks) {\n if (pluginHooks[hook]) {\n pluginHooks[hook].apply(void 0, args);\n }\n });\n\n if (shouldInvokePropsHook) {\n var _instance$props;\n\n (_instance$props = instance.props)[hook].apply(_instance$props, args);\n }\n }\n\n function handleAriaContentAttribute() {\n var aria = instance.props.aria;\n\n if (!aria.content) {\n return;\n }\n\n var attr = \"aria-\" + aria.content;\n var id = popper.id;\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n var currentValue = node.getAttribute(attr);\n\n if (instance.state.isVisible) {\n node.setAttribute(attr, currentValue ? currentValue + \" \" + id : id);\n } else {\n var nextValue = currentValue && currentValue.replace(id, '').trim();\n\n if (nextValue) {\n node.setAttribute(attr, nextValue);\n } else {\n node.removeAttribute(attr);\n }\n }\n });\n }\n\n function handleAriaExpandedAttribute() {\n if (hasAriaExpanded || !instance.props.aria.expanded) {\n return;\n }\n\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n if (instance.props.interactive) {\n node.setAttribute('aria-expanded', instance.state.isVisible && node === getCurrentTarget() ? 'true' : 'false');\n } else {\n node.removeAttribute('aria-expanded');\n }\n });\n }\n\n function cleanupInteractiveMouseListeners() {\n doc.removeEventListener('mousemove', debouncedOnMouseMove);\n mouseMoveListeners = mouseMoveListeners.filter(function (listener) {\n return listener !== debouncedOnMouseMove;\n });\n }\n\n function onDocumentPress(event) {\n // Moved finger to scroll instead of an intentional tap outside\n if (currentInput.isTouch) {\n if (didTouchMove || event.type === 'mousedown') {\n return;\n }\n } // Clicked on interactive popper\n\n\n if (instance.props.interactive && popper.contains(event.target)) {\n return;\n } // Clicked on the event listeners target\n\n\n if (getCurrentTarget().contains(event.target)) {\n if (currentInput.isTouch) {\n return;\n }\n\n if (instance.state.isVisible && instance.props.trigger.indexOf('click') >= 0) {\n return;\n }\n } else {\n invokeHook('onClickOutside', [instance, event]);\n }\n\n if (instance.props.hideOnClick === true) {\n instance.clearDelayTimeouts();\n instance.hide(); // `mousedown` event is fired right before `focus` if pressing the\n // currentTarget. This lets a tippy with `focus` trigger know that it\n // should not show\n\n didHideDueToDocumentMouseDown = true;\n setTimeout(function () {\n didHideDueToDocumentMouseDown = false;\n }); // The listener gets added in `scheduleShow()`, but this may be hiding it\n // before it shows, and hide()'s early bail-out behavior can prevent it\n // from being cleaned up\n\n if (!instance.state.isMounted) {\n removeDocumentPress();\n }\n }\n }\n\n function onTouchMove() {\n didTouchMove = true;\n }\n\n function onTouchStart() {\n didTouchMove = false;\n }\n\n function addDocumentPress() {\n doc.addEventListener('mousedown', onDocumentPress, true);\n doc.addEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.addEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.addEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function removeDocumentPress() {\n doc.removeEventListener('mousedown', onDocumentPress, true);\n doc.removeEventListener('touchend', onDocumentPress, TOUCH_OPTIONS);\n doc.removeEventListener('touchstart', onTouchStart, TOUCH_OPTIONS);\n doc.removeEventListener('touchmove', onTouchMove, TOUCH_OPTIONS);\n }\n\n function onTransitionedOut(duration, callback) {\n onTransitionEnd(duration, function () {\n if (!instance.state.isVisible && popper.parentNode && popper.parentNode.contains(popper)) {\n callback();\n }\n });\n }\n\n function onTransitionedIn(duration, callback) {\n onTransitionEnd(duration, callback);\n }\n\n function onTransitionEnd(duration, callback) {\n var box = getDefaultTemplateChildren().box;\n\n function listener(event) {\n if (event.target === box) {\n updateTransitionEndListener(box, 'remove', listener);\n callback();\n }\n } // Make callback synchronous if duration is 0\n // `transitionend` won't fire otherwise\n\n\n if (duration === 0) {\n return callback();\n }\n\n updateTransitionEndListener(box, 'remove', currentTransitionEndListener);\n updateTransitionEndListener(box, 'add', listener);\n currentTransitionEndListener = listener;\n }\n\n function on(eventType, handler, options) {\n if (options === void 0) {\n options = false;\n }\n\n var nodes = normalizeToArray(instance.props.triggerTarget || reference);\n nodes.forEach(function (node) {\n node.addEventListener(eventType, handler, options);\n listeners.push({\n node: node,\n eventType: eventType,\n handler: handler,\n options: options\n });\n });\n }\n\n function addListeners() {\n if (getIsCustomTouchBehavior()) {\n on('touchstart', onTrigger, {\n passive: true\n });\n on('touchend', onMouseLeave, {\n passive: true\n });\n }\n\n splitBySpaces(instance.props.trigger).forEach(function (eventType) {\n if (eventType === 'manual') {\n return;\n }\n\n on(eventType, onTrigger);\n\n switch (eventType) {\n case 'mouseenter':\n on('mouseleave', onMouseLeave);\n break;\n\n case 'focus':\n on(isIE ? 'focusout' : 'blur', onBlurOrFocusOut);\n break;\n\n case 'focusin':\n on('focusout', onBlurOrFocusOut);\n break;\n }\n });\n }\n\n function removeListeners() {\n listeners.forEach(function (_ref) {\n var node = _ref.node,\n eventType = _ref.eventType,\n handler = _ref.handler,\n options = _ref.options;\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function onTrigger(event) {\n var _lastTriggerEvent;\n\n var shouldScheduleClickHide = false;\n\n if (!instance.state.isEnabled || isEventListenerStopped(event) || didHideDueToDocumentMouseDown) {\n return;\n }\n\n var wasFocused = ((_lastTriggerEvent = lastTriggerEvent) == null ? void 0 : _lastTriggerEvent.type) === 'focus';\n lastTriggerEvent = event;\n currentTarget = event.currentTarget;\n handleAriaExpandedAttribute();\n\n if (!instance.state.isVisible && isMouseEvent(event)) {\n // If scrolling, `mouseenter` events can be fired if the cursor lands\n // over a new target, but `mousemove` events don't get fired. This\n // causes interactive tooltips to get stuck open until the cursor is\n // moved\n mouseMoveListeners.forEach(function (listener) {\n return listener(event);\n });\n } // Toggle show/hide when clicking click-triggered tooltips\n\n\n if (event.type === 'click' && (instance.props.trigger.indexOf('mouseenter') < 0 || isVisibleFromClick) && instance.props.hideOnClick !== false && instance.state.isVisible) {\n shouldScheduleClickHide = true;\n } else {\n scheduleShow(event);\n }\n\n if (event.type === 'click') {\n isVisibleFromClick = !shouldScheduleClickHide;\n }\n\n if (shouldScheduleClickHide && !wasFocused) {\n scheduleHide(event);\n }\n }\n\n function onMouseMove(event) {\n var target = event.target;\n var isCursorOverReferenceOrPopper = getCurrentTarget().contains(target) || popper.contains(target);\n\n if (event.type === 'mousemove' && isCursorOverReferenceOrPopper) {\n return;\n }\n\n var popperTreeData = getNestedPopperTree().concat(popper).map(function (popper) {\n var _instance$popperInsta;\n\n var instance = popper._tippy;\n var state = (_instance$popperInsta = instance.popperInstance) == null ? void 0 : _instance$popperInsta.state;\n\n if (state) {\n return {\n popperRect: popper.getBoundingClientRect(),\n popperState: state,\n props: props\n };\n }\n\n return null;\n }).filter(Boolean);\n\n if (isCursorOutsideInteractiveBorder(popperTreeData, event)) {\n cleanupInteractiveMouseListeners();\n scheduleHide(event);\n }\n }\n\n function onMouseLeave(event) {\n var shouldBail = isEventListenerStopped(event) || instance.props.trigger.indexOf('click') >= 0 && isVisibleFromClick;\n\n if (shouldBail) {\n return;\n }\n\n if (instance.props.interactive) {\n instance.hideWithInteractivity(event);\n return;\n }\n\n scheduleHide(event);\n }\n\n function onBlurOrFocusOut(event) {\n if (instance.props.trigger.indexOf('focusin') < 0 && event.target !== getCurrentTarget()) {\n return;\n } // If focus was moved to within the popper\n\n\n if (instance.props.interactive && event.relatedTarget && popper.contains(event.relatedTarget)) {\n return;\n }\n\n scheduleHide(event);\n }\n\n function isEventListenerStopped(event) {\n return currentInput.isTouch ? getIsCustomTouchBehavior() !== event.type.indexOf('touch') >= 0 : false;\n }\n\n function createPopperInstance() {\n destroyPopperInstance();\n var _instance$props2 = instance.props,\n popperOptions = _instance$props2.popperOptions,\n placement = _instance$props2.placement,\n offset = _instance$props2.offset,\n getReferenceClientRect = _instance$props2.getReferenceClientRect,\n moveTransition = _instance$props2.moveTransition;\n var arrow = getIsDefaultRenderFn() ? getChildren(popper).arrow : null;\n var computedReference = getReferenceClientRect ? {\n getBoundingClientRect: getReferenceClientRect,\n contextElement: getReferenceClientRect.contextElement || getCurrentTarget()\n } : reference;\n var tippyModifier = {\n name: '$$tippy',\n enabled: true,\n phase: 'beforeWrite',\n requires: ['computeStyles'],\n fn: function fn(_ref2) {\n var state = _ref2.state;\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh.box;\n\n ['placement', 'reference-hidden', 'escaped'].forEach(function (attr) {\n if (attr === 'placement') {\n box.setAttribute('data-placement', state.placement);\n } else {\n if (state.attributes.popper[\"data-popper-\" + attr]) {\n box.setAttribute(\"data-\" + attr, '');\n } else {\n box.removeAttribute(\"data-\" + attr);\n }\n }\n });\n state.attributes.popper = {};\n }\n }\n };\n var modifiers = [{\n name: 'offset',\n options: {\n offset: offset\n }\n }, {\n name: 'preventOverflow',\n options: {\n padding: {\n top: 2,\n bottom: 2,\n left: 5,\n right: 5\n }\n }\n }, {\n name: 'flip',\n options: {\n padding: 5\n }\n }, {\n name: 'computeStyles',\n options: {\n adaptive: !moveTransition\n }\n }, tippyModifier];\n\n if (getIsDefaultRenderFn() && arrow) {\n modifiers.push({\n name: 'arrow',\n options: {\n element: arrow,\n padding: 3\n }\n });\n }\n\n modifiers.push.apply(modifiers, (popperOptions == null ? void 0 : popperOptions.modifiers) || []);\n instance.popperInstance = core.createPopper(computedReference, popper, Object.assign({}, popperOptions, {\n placement: placement,\n onFirstUpdate: onFirstUpdate,\n modifiers: modifiers\n }));\n }\n\n function destroyPopperInstance() {\n if (instance.popperInstance) {\n instance.popperInstance.destroy();\n instance.popperInstance = null;\n }\n }\n\n function mount() {\n var appendTo = instance.props.appendTo;\n var parentNode; // By default, we'll append the popper to the triggerTargets's parentNode so\n // it's directly after the reference element so the elements inside the\n // tippy can be tabbed to\n // If there are clipping issues, the user can specify a different appendTo\n // and ensure focus management is handled correctly manually\n\n var node = getCurrentTarget();\n\n if (instance.props.interactive && appendTo === defaultProps.appendTo || appendTo === 'parent') {\n parentNode = node.parentNode;\n } else {\n parentNode = invokeWithArgsOrReturn(appendTo, [node]);\n } // The popper element needs to exist on the DOM before its position can be\n // updated as Popper needs to read its dimensions\n\n\n if (!parentNode.contains(popper)) {\n parentNode.appendChild(popper);\n }\n\n createPopperInstance();\n /* istanbul ignore else */\n\n if (\"development\" !== \"production\") {\n // Accessibility check\n warnWhen(instance.props.interactive && appendTo === defaultProps.appendTo && node.nextElementSibling !== popper, ['Interactive tippy element may not be accessible via keyboard', 'navigation because it is not directly after the reference element', 'in the DOM source order.', '\\n\\n', 'Using a wrapper
    or tag around the reference element', 'solves this by creating a new parentNode context.', '\\n\\n', 'Specifying `appendTo: document.body` silences this warning, but it', 'assumes you are using a focus management solution to handle', 'keyboard navigation.', '\\n\\n', 'See: https://atomiks.github.io/tippyjs/v6/accessibility/#interactivity'].join(' '));\n }\n }\n\n function getNestedPopperTree() {\n return arrayFrom(popper.querySelectorAll('[data-tippy-root]'));\n }\n\n function scheduleShow(event) {\n instance.clearDelayTimeouts();\n\n if (event) {\n invokeHook('onTrigger', [instance, event]);\n }\n\n addDocumentPress();\n var delay = getDelay(true);\n\n var _getNormalizedTouchSe = getNormalizedTouchSettings(),\n touchValue = _getNormalizedTouchSe[0],\n touchDelay = _getNormalizedTouchSe[1];\n\n if (currentInput.isTouch && touchValue === 'hold' && touchDelay) {\n delay = touchDelay;\n }\n\n if (delay) {\n showTimeout = setTimeout(function () {\n instance.show();\n }, delay);\n } else {\n instance.show();\n }\n }\n\n function scheduleHide(event) {\n instance.clearDelayTimeouts();\n invokeHook('onUntrigger', [instance, event]);\n\n if (!instance.state.isVisible) {\n removeDocumentPress();\n return;\n } // For interactive tippies, scheduleHide is added to a document.body handler\n // from onMouseLeave so must intercept scheduled hides from mousemove/leave\n // events when trigger contains mouseenter and click, and the tip is\n // currently shown as a result of a click.\n\n\n if (instance.props.trigger.indexOf('mouseenter') >= 0 && instance.props.trigger.indexOf('click') >= 0 && ['mouseleave', 'mousemove'].indexOf(event.type) >= 0 && isVisibleFromClick) {\n return;\n }\n\n var delay = getDelay(false);\n\n if (delay) {\n hideTimeout = setTimeout(function () {\n if (instance.state.isVisible) {\n instance.hide();\n }\n }, delay);\n } else {\n // Fixes a `transitionend` problem when it fires 1 frame too\n // late sometimes, we don't want hide() to be called.\n scheduleHideAnimationFrame = requestAnimationFrame(function () {\n instance.hide();\n });\n }\n } // ===========================================================================\n // 🔑 Public methods\n // ===========================================================================\n\n\n function enable() {\n instance.state.isEnabled = true;\n }\n\n function disable() {\n // Disabling the instance should also hide it\n // https://github.com/atomiks/tippy.js-react/issues/106\n instance.hide();\n instance.state.isEnabled = false;\n }\n\n function clearDelayTimeouts() {\n clearTimeout(showTimeout);\n clearTimeout(hideTimeout);\n cancelAnimationFrame(scheduleHideAnimationFrame);\n }\n\n function setProps(partialProps) {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('setProps'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n invokeHook('onBeforeUpdate', [instance, partialProps]);\n removeListeners();\n var prevProps = instance.props;\n var nextProps = evaluateProps(reference, Object.assign({}, instance.props, {}, partialProps, {\n ignoreAttributes: true\n }));\n instance.props = nextProps;\n addListeners();\n\n if (prevProps.interactiveDebounce !== nextProps.interactiveDebounce) {\n cleanupInteractiveMouseListeners();\n debouncedOnMouseMove = debounce(onMouseMove, nextProps.interactiveDebounce);\n } // Ensure stale aria-expanded attributes are removed\n\n\n if (prevProps.triggerTarget && !nextProps.triggerTarget) {\n normalizeToArray(prevProps.triggerTarget).forEach(function (node) {\n node.removeAttribute('aria-expanded');\n });\n } else if (nextProps.triggerTarget) {\n reference.removeAttribute('aria-expanded');\n }\n\n handleAriaExpandedAttribute();\n handleStyles();\n\n if (onUpdate) {\n onUpdate(prevProps, nextProps);\n }\n\n if (instance.popperInstance) {\n createPopperInstance(); // Fixes an issue with nested tippies if they are all getting re-rendered,\n // and the nested ones get re-rendered first.\n // https://github.com/atomiks/tippyjs-react/issues/177\n // TODO: find a cleaner / more efficient solution(!)\n\n getNestedPopperTree().forEach(function (nestedPopper) {\n // React (and other UI libs likely) requires a rAF wrapper as it flushes\n // its work in one\n requestAnimationFrame(nestedPopper._tippy.popperInstance.forceUpdate);\n });\n }\n\n invokeHook('onAfterUpdate', [instance, partialProps]);\n }\n\n function setContent(content) {\n instance.setProps({\n content: content\n });\n }\n\n function show() {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('show'));\n } // Early bail-out\n\n\n var isAlreadyVisible = instance.state.isVisible;\n var isDestroyed = instance.state.isDestroyed;\n var isDisabled = !instance.state.isEnabled;\n var isTouchAndTouchDisabled = currentInput.isTouch && !instance.props.touch;\n var duration = getValueAtIndexOrReturn(instance.props.duration, 0, defaultProps.duration);\n\n if (isAlreadyVisible || isDestroyed || isDisabled || isTouchAndTouchDisabled) {\n return;\n } // Normalize `disabled` behavior across browsers.\n // Firefox allows events on disabled elements, but Chrome doesn't.\n // Using a wrapper element (i.e. ) is recommended.\n\n\n if (getCurrentTarget().hasAttribute('disabled')) {\n return;\n }\n\n invokeHook('onShow', [instance], false);\n\n if (instance.props.onShow(instance) === false) {\n return;\n }\n\n instance.state.isVisible = true;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'visible';\n }\n\n handleStyles();\n addDocumentPress();\n\n if (!instance.state.isMounted) {\n popper.style.transition = 'none';\n } // If flipping to the opposite side after hiding at least once, the\n // animation will use the wrong placement without resetting the duration\n\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh2 = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh2.box,\n content = _getDefaultTemplateCh2.content;\n\n setTransitionDuration([box, content], 0);\n }\n\n onFirstUpdate = function onFirstUpdate() {\n if (!instance.state.isVisible || ignoreOnFirstUpdate) {\n return;\n }\n\n ignoreOnFirstUpdate = true; // reflow\n\n void popper.offsetHeight;\n popper.style.transition = instance.props.moveTransition;\n\n if (getIsDefaultRenderFn() && instance.props.animation) {\n var _getDefaultTemplateCh3 = getDefaultTemplateChildren(),\n _box = _getDefaultTemplateCh3.box,\n _content = _getDefaultTemplateCh3.content;\n\n setTransitionDuration([_box, _content], duration);\n setVisibilityState([_box, _content], 'visible');\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n pushIfUnique(mountedInstances, instance);\n instance.state.isMounted = true;\n invokeHook('onMount', [instance]);\n\n if (instance.props.animation && getIsDefaultRenderFn()) {\n onTransitionedIn(duration, function () {\n instance.state.isShown = true;\n invokeHook('onShown', [instance]);\n });\n }\n };\n\n mount();\n }\n\n function hide() {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hide'));\n } // Early bail-out\n\n\n var isAlreadyHidden = !instance.state.isVisible;\n var isDestroyed = instance.state.isDestroyed;\n var isDisabled = !instance.state.isEnabled;\n var duration = getValueAtIndexOrReturn(instance.props.duration, 1, defaultProps.duration);\n\n if (isAlreadyHidden || isDestroyed || isDisabled) {\n return;\n }\n\n invokeHook('onHide', [instance], false);\n\n if (instance.props.onHide(instance) === false) {\n return;\n }\n\n instance.state.isVisible = false;\n instance.state.isShown = false;\n ignoreOnFirstUpdate = false;\n isVisibleFromClick = false;\n\n if (getIsDefaultRenderFn()) {\n popper.style.visibility = 'hidden';\n }\n\n cleanupInteractiveMouseListeners();\n removeDocumentPress();\n handleStyles();\n\n if (getIsDefaultRenderFn()) {\n var _getDefaultTemplateCh4 = getDefaultTemplateChildren(),\n box = _getDefaultTemplateCh4.box,\n content = _getDefaultTemplateCh4.content;\n\n if (instance.props.animation) {\n setTransitionDuration([box, content], duration);\n setVisibilityState([box, content], 'hidden');\n }\n }\n\n handleAriaContentAttribute();\n handleAriaExpandedAttribute();\n\n if (instance.props.animation) {\n if (getIsDefaultRenderFn()) {\n onTransitionedOut(duration, instance.unmount);\n }\n } else {\n instance.unmount();\n }\n }\n\n function hideWithInteractivity(event) {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('hideWithInteractivity'));\n }\n\n doc.addEventListener('mousemove', debouncedOnMouseMove);\n pushIfUnique(mouseMoveListeners, debouncedOnMouseMove);\n debouncedOnMouseMove(event);\n }\n\n function unmount() {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('unmount'));\n }\n\n if (instance.state.isVisible) {\n instance.hide();\n }\n\n if (!instance.state.isMounted) {\n return;\n }\n\n destroyPopperInstance(); // If a popper is not interactive, it will be appended outside the popper\n // tree by default. This seems mainly for interactive tippies, but we should\n // find a workaround if possible\n\n getNestedPopperTree().forEach(function (nestedPopper) {\n nestedPopper._tippy.unmount();\n });\n\n if (popper.parentNode) {\n popper.parentNode.removeChild(popper);\n }\n\n mountedInstances = mountedInstances.filter(function (i) {\n return i !== instance;\n });\n instance.state.isMounted = false;\n invokeHook('onHidden', [instance]);\n }\n\n function destroy() {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n warnWhen(instance.state.isDestroyed, createMemoryLeakWarning('destroy'));\n }\n\n if (instance.state.isDestroyed) {\n return;\n }\n\n instance.clearDelayTimeouts();\n instance.unmount();\n removeListeners();\n delete reference._tippy;\n instance.state.isDestroyed = true;\n invokeHook('onDestroy', [instance]);\n }\n}\n\nfunction tippy(targets, optionalProps) {\n if (optionalProps === void 0) {\n optionalProps = {};\n }\n\n var plugins = defaultProps.plugins.concat(optionalProps.plugins || []);\n /* istanbul ignore else */\n\n if (\"development\" !== \"production\") {\n validateTargets(targets);\n validateProps(optionalProps, plugins);\n }\n\n bindGlobalEventListeners();\n var passedProps = Object.assign({}, optionalProps, {\n plugins: plugins\n });\n var elements = getArrayOfElements(targets);\n /* istanbul ignore else */\n\n if (\"development\" !== \"production\") {\n var isSingleContentElement = isElement(passedProps.content);\n var isMoreThanOneReferenceElement = elements.length > 1;\n warnWhen(isSingleContentElement && isMoreThanOneReferenceElement, ['tippy() was passed an Element as the `content` prop, but more than', 'one tippy instance was created by this invocation. This means the', 'content element will only be appended to the last tippy instance.', '\\n\\n', 'Instead, pass the .innerHTML of the element, or use a function that', 'returns a cloned version of the element instead.', '\\n\\n', '1) content: element.innerHTML\\n', '2) content: () => element.cloneNode(true)'].join(' '));\n }\n\n var instances = elements.reduce(function (acc, reference) {\n var instance = reference && createTippy(reference, passedProps);\n\n if (instance) {\n acc.push(instance);\n }\n\n return acc;\n }, []);\n return isElement(targets) ? instances[0] : instances;\n}\n\ntippy.defaultProps = defaultProps;\ntippy.setDefaultProps = setDefaultProps;\ntippy.currentInput = currentInput;\nvar hideAll = function hideAll(_temp) {\n var _ref = _temp === void 0 ? {} : _temp,\n excludedReferenceOrInstance = _ref.exclude,\n duration = _ref.duration;\n\n mountedInstances.forEach(function (instance) {\n var isExcluded = false;\n\n if (excludedReferenceOrInstance) {\n isExcluded = isReferenceElement(excludedReferenceOrInstance) ? instance.reference === excludedReferenceOrInstance : instance.popper === excludedReferenceOrInstance.popper;\n }\n\n if (!isExcluded) {\n var originalDuration = instance.props.duration;\n instance.setProps({\n duration: duration\n });\n instance.hide();\n\n if (!instance.state.isDestroyed) {\n instance.setProps({\n duration: originalDuration\n });\n }\n }\n });\n};\n\nvar createSingleton = function createSingleton(tippyInstances, optionalProps) {\n if (optionalProps === void 0) {\n optionalProps = {};\n }\n\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n errorWhen(!Array.isArray(tippyInstances), ['The first argument passed to createSingleton() must be an array of', 'tippy instances. The passed value was', String(tippyInstances)].join(' '));\n }\n\n var mutTippyInstances = tippyInstances;\n var references = [];\n var currentTarget;\n var overrides = optionalProps.overrides;\n\n function setReferences() {\n references = mutTippyInstances.map(function (instance) {\n return instance.reference;\n });\n }\n\n function enableInstances(isEnabled) {\n mutTippyInstances.forEach(function (instance) {\n if (isEnabled) {\n instance.enable();\n } else {\n instance.disable();\n }\n });\n }\n\n enableInstances(false);\n setReferences();\n var singleton = {\n fn: function fn() {\n return {\n onDestroy: function onDestroy() {\n enableInstances(true);\n },\n onTrigger: function onTrigger(instance, event) {\n var target = event.currentTarget;\n var index = references.indexOf(target); // bail-out\n\n if (target === currentTarget) {\n return;\n }\n\n currentTarget = target;\n var overrideProps = (overrides || []).concat('content').reduce(function (acc, prop) {\n acc[prop] = mutTippyInstances[index].props[prop];\n return acc;\n }, {});\n instance.setProps(Object.assign({}, overrideProps, {\n getReferenceClientRect: function getReferenceClientRect() {\n return target.getBoundingClientRect();\n }\n }));\n }\n };\n }\n };\n var instance = tippy(div(), Object.assign({}, removeProperties(optionalProps, ['overrides']), {\n plugins: [singleton].concat(optionalProps.plugins || []),\n triggerTarget: references\n }));\n var originalSetProps = instance.setProps;\n\n instance.setProps = function (props) {\n overrides = props.overrides || overrides;\n originalSetProps(props);\n };\n\n instance.setInstances = function (nextInstances) {\n enableInstances(true);\n mutTippyInstances = nextInstances;\n enableInstances(false);\n setReferences();\n instance.setProps({\n triggerTarget: references\n });\n };\n\n return instance;\n};\n\nvar BUBBLING_EVENTS_MAP = {\n mouseover: 'mouseenter',\n focusin: 'focus',\n click: 'click'\n};\n/**\n * Creates a delegate instance that controls the creation of tippy instances\n * for child elements (`target` CSS selector).\n */\n\nfunction delegate(targets, props) {\n /* istanbul ignore else */\n if (\"development\" !== \"production\") {\n errorWhen(!(props && props.target), ['You must specity a `target` prop indicating a CSS selector string matching', 'the target elements that should receive a tippy.'].join(' '));\n }\n\n var listeners = [];\n var childTippyInstances = [];\n var target = props.target;\n var nativeProps = removeProperties(props, ['target']);\n var parentProps = Object.assign({}, nativeProps, {\n trigger: 'manual',\n touch: false\n });\n var childProps = Object.assign({}, nativeProps, {\n showOnCreate: true\n });\n var returnValue = tippy(targets, parentProps);\n var normalizedReturnValue = normalizeToArray(returnValue);\n\n function onTrigger(event) {\n if (!event.target) {\n return;\n }\n\n var targetNode = event.target.closest(target);\n\n if (!targetNode) {\n return;\n } // Get relevant trigger with fallbacks:\n // 1. Check `data-tippy-trigger` attribute on target node\n // 2. Fallback to `trigger` passed to `delegate()`\n // 3. Fallback to `defaultProps.trigger`\n\n\n var trigger = targetNode.getAttribute('data-tippy-trigger') || props.trigger || defaultProps.trigger; // @ts-ignore\n\n if (targetNode._tippy) {\n return;\n }\n\n if (event.type === 'touchstart' && typeof childProps.touch === 'boolean') {\n return;\n }\n\n if (event.type !== 'touchstart' && trigger.indexOf(BUBBLING_EVENTS_MAP[event.type]) < 0) {\n return;\n }\n\n var instance = tippy(targetNode, childProps);\n\n if (instance) {\n childTippyInstances = childTippyInstances.concat(instance);\n }\n }\n\n function on(node, eventType, handler, options) {\n if (options === void 0) {\n options = false;\n }\n\n node.addEventListener(eventType, handler, options);\n listeners.push({\n node: node,\n eventType: eventType,\n handler: handler,\n options: options\n });\n }\n\n function addEventListeners(instance) {\n var reference = instance.reference;\n on(reference, 'touchstart', onTrigger);\n on(reference, 'mouseover', onTrigger);\n on(reference, 'focusin', onTrigger);\n on(reference, 'click', onTrigger);\n }\n\n function removeEventListeners() {\n listeners.forEach(function (_ref) {\n var node = _ref.node,\n eventType = _ref.eventType,\n handler = _ref.handler,\n options = _ref.options;\n node.removeEventListener(eventType, handler, options);\n });\n listeners = [];\n }\n\n function applyMutations(instance) {\n var originalDestroy = instance.destroy;\n\n instance.destroy = function (shouldDestroyChildInstances) {\n if (shouldDestroyChildInstances === void 0) {\n shouldDestroyChildInstances = true;\n }\n\n if (shouldDestroyChildInstances) {\n childTippyInstances.forEach(function (instance) {\n instance.destroy();\n });\n }\n\n childTippyInstances = [];\n removeEventListeners();\n originalDestroy();\n };\n\n addEventListeners(instance);\n }\n\n normalizedReturnValue.forEach(applyMutations);\n return returnValue;\n}\n\nvar animateFill = {\n name: 'animateFill',\n defaultValue: false,\n fn: function fn(instance) {\n var _instance$props$rende;\n\n // @ts-ignore\n if (!((_instance$props$rende = instance.props.render) == null ? void 0 : _instance$props$rende.$$tippy)) {\n if (\"development\" !== \"production\") {\n errorWhen(instance.props.animateFill, 'The `animateFill` plugin requires the default render function.');\n }\n\n return {};\n }\n\n var _getChildren = getChildren(instance.popper),\n box = _getChildren.box,\n content = _getChildren.content;\n\n var backdrop = instance.props.animateFill ? createBackdropElement() : null;\n return {\n onCreate: function onCreate() {\n if (backdrop) {\n box.insertBefore(backdrop, box.firstElementChild);\n box.setAttribute('data-animatefill', '');\n box.style.overflow = 'hidden';\n instance.setProps({\n arrow: false,\n animation: 'shift-away'\n });\n }\n },\n onMount: function onMount() {\n if (backdrop) {\n var transitionDuration = box.style.transitionDuration;\n var duration = Number(transitionDuration.replace('ms', '')); // The content should fade in after the backdrop has mostly filled the\n // tooltip element. `clip-path` is the other alternative but is not\n // well-supported and is buggy on some devices.\n\n content.style.transitionDelay = Math.round(duration / 10) + \"ms\";\n backdrop.style.transitionDuration = transitionDuration;\n setVisibilityState([backdrop], 'visible');\n }\n },\n onShow: function onShow() {\n if (backdrop) {\n backdrop.style.transitionDuration = '0ms';\n }\n },\n onHide: function onHide() {\n if (backdrop) {\n setVisibilityState([backdrop], 'hidden');\n }\n }\n };\n }\n};\n\nfunction createBackdropElement() {\n var backdrop = div();\n backdrop.className = BACKDROP_CLASS;\n setVisibilityState([backdrop], 'hidden');\n return backdrop;\n}\n\nvar mouseCoords = {\n clientX: 0,\n clientY: 0\n};\nvar activeInstances = [];\n\nfunction storeMouseCoords(_ref) {\n var clientX = _ref.clientX,\n clientY = _ref.clientY;\n mouseCoords = {\n clientX: clientX,\n clientY: clientY\n };\n}\n\nfunction addMouseCoordsListener(doc) {\n doc.addEventListener('mousemove', storeMouseCoords);\n}\n\nfunction removeMouseCoordsListener(doc) {\n doc.removeEventListener('mousemove', storeMouseCoords);\n}\n\nvar followCursor = {\n name: 'followCursor',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference;\n var doc = getOwnerDocument(instance.props.triggerTarget || reference);\n var isInternalUpdate = false;\n var wasFocusEvent = false;\n var isUnmounted = true;\n var prevProps = instance.props;\n\n function getIsInitialBehavior() {\n return instance.props.followCursor === 'initial' && instance.state.isVisible;\n }\n\n function addListener() {\n doc.addEventListener('mousemove', onMouseMove);\n }\n\n function removeListener() {\n doc.removeEventListener('mousemove', onMouseMove);\n }\n\n function unsetGetReferenceClientRect() {\n isInternalUpdate = true;\n instance.setProps({\n getReferenceClientRect: null\n });\n isInternalUpdate = false;\n }\n\n function onMouseMove(event) {\n // If the instance is interactive, avoid updating the position unless it's\n // over the reference element\n var isCursorOverReference = event.target ? reference.contains(event.target) : true;\n var followCursor = instance.props.followCursor;\n var clientX = event.clientX,\n clientY = event.clientY;\n var rect = reference.getBoundingClientRect();\n var relativeX = clientX - rect.left;\n var relativeY = clientY - rect.top;\n\n if (isCursorOverReference || !instance.props.interactive) {\n instance.setProps({\n getReferenceClientRect: function getReferenceClientRect() {\n var rect = reference.getBoundingClientRect();\n var x = clientX;\n var y = clientY;\n\n if (followCursor === 'initial') {\n x = rect.left + relativeX;\n y = rect.top + relativeY;\n }\n\n var top = followCursor === 'horizontal' ? rect.top : y;\n var right = followCursor === 'vertical' ? rect.right : x;\n var bottom = followCursor === 'horizontal' ? rect.bottom : y;\n var left = followCursor === 'vertical' ? rect.left : x;\n return {\n width: right - left,\n height: bottom - top,\n top: top,\n right: right,\n bottom: bottom,\n left: left\n };\n }\n });\n }\n }\n\n function create() {\n if (instance.props.followCursor) {\n activeInstances.push({\n instance: instance,\n doc: doc\n });\n addMouseCoordsListener(doc);\n }\n }\n\n function destroy() {\n activeInstances = activeInstances.filter(function (data) {\n return data.instance !== instance;\n });\n\n if (activeInstances.filter(function (data) {\n return data.doc === doc;\n }).length === 0) {\n removeMouseCoordsListener(doc);\n }\n }\n\n return {\n onCreate: create,\n onDestroy: destroy,\n onBeforeUpdate: function onBeforeUpdate() {\n prevProps = instance.props;\n },\n onAfterUpdate: function onAfterUpdate(_, _ref2) {\n var followCursor = _ref2.followCursor;\n\n if (isInternalUpdate) {\n return;\n }\n\n if (followCursor !== undefined && prevProps.followCursor !== followCursor) {\n destroy();\n\n if (followCursor) {\n create();\n\n if (instance.state.isMounted && !wasFocusEvent && !getIsInitialBehavior()) {\n addListener();\n }\n } else {\n removeListener();\n unsetGetReferenceClientRect();\n }\n }\n },\n onMount: function onMount() {\n if (instance.props.followCursor && !wasFocusEvent) {\n if (isUnmounted) {\n onMouseMove(mouseCoords);\n isUnmounted = false;\n }\n\n if (!getIsInitialBehavior()) {\n addListener();\n }\n }\n },\n onTrigger: function onTrigger(_, event) {\n if (isMouseEvent(event)) {\n mouseCoords = {\n clientX: event.clientX,\n clientY: event.clientY\n };\n }\n\n wasFocusEvent = event.type === 'focus';\n },\n onHidden: function onHidden() {\n if (instance.props.followCursor) {\n unsetGetReferenceClientRect();\n removeListener();\n isUnmounted = true;\n }\n }\n };\n }\n};\n\nfunction getProps(props, modifier) {\n var _props$popperOptions;\n\n return {\n popperOptions: Object.assign({}, props.popperOptions, {\n modifiers: [].concat((((_props$popperOptions = props.popperOptions) == null ? void 0 : _props$popperOptions.modifiers) || []).filter(function (_ref) {\n var name = _ref.name;\n return name !== modifier.name;\n }), [modifier])\n })\n };\n}\n\nvar inlinePositioning = {\n name: 'inlinePositioning',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference;\n\n function isEnabled() {\n return !!instance.props.inlinePositioning;\n }\n\n var placement;\n var cursorRectIndex = -1;\n var isInternalUpdate = false;\n var modifier = {\n name: 'tippyInlinePositioning',\n enabled: true,\n phase: 'afterWrite',\n fn: function fn(_ref2) {\n var state = _ref2.state;\n\n if (isEnabled()) {\n if (placement !== state.placement) {\n instance.setProps({\n getReferenceClientRect: function getReferenceClientRect() {\n return _getReferenceClientRect(state.placement);\n }\n });\n }\n\n placement = state.placement;\n }\n }\n };\n\n function _getReferenceClientRect(placement) {\n return getInlineBoundingClientRect(getBasePlacement(placement), reference.getBoundingClientRect(), arrayFrom(reference.getClientRects()), cursorRectIndex);\n }\n\n function setInternalProps(partialProps) {\n isInternalUpdate = true;\n instance.setProps(partialProps);\n isInternalUpdate = false;\n }\n\n function addModifier() {\n if (!isInternalUpdate) {\n setInternalProps(getProps(instance.props, modifier));\n }\n }\n\n return {\n onCreate: addModifier,\n onAfterUpdate: addModifier,\n onTrigger: function onTrigger(_, event) {\n if (isMouseEvent(event)) {\n var rects = arrayFrom(instance.reference.getClientRects());\n var cursorRect = rects.find(function (rect) {\n return rect.left - 2 <= event.clientX && rect.right + 2 >= event.clientX && rect.top - 2 <= event.clientY && rect.bottom + 2 >= event.clientY;\n });\n cursorRectIndex = rects.indexOf(cursorRect);\n }\n },\n onUntrigger: function onUntrigger() {\n cursorRectIndex = -1;\n }\n };\n }\n};\nfunction getInlineBoundingClientRect(currentBasePlacement, boundingRect, clientRects, cursorRectIndex) {\n // Not an inline element, or placement is not yet known\n if (clientRects.length < 2 || currentBasePlacement === null) {\n return boundingRect;\n } // There are two rects and they are disjoined\n\n\n if (clientRects.length === 2 && cursorRectIndex >= 0 && clientRects[0].left > clientRects[1].right) {\n return clientRects[cursorRectIndex] || boundingRect;\n }\n\n switch (currentBasePlacement) {\n case 'top':\n case 'bottom':\n {\n var firstRect = clientRects[0];\n var lastRect = clientRects[clientRects.length - 1];\n var isTop = currentBasePlacement === 'top';\n var top = firstRect.top;\n var bottom = lastRect.bottom;\n var left = isTop ? firstRect.left : lastRect.left;\n var right = isTop ? firstRect.right : lastRect.right;\n var width = right - left;\n var height = bottom - top;\n return {\n top: top,\n bottom: bottom,\n left: left,\n right: right,\n width: width,\n height: height\n };\n }\n\n case 'left':\n case 'right':\n {\n var minLeft = Math.min.apply(Math, clientRects.map(function (rects) {\n return rects.left;\n }));\n var maxRight = Math.max.apply(Math, clientRects.map(function (rects) {\n return rects.right;\n }));\n var measureRects = clientRects.filter(function (rect) {\n return currentBasePlacement === 'left' ? rect.left === minLeft : rect.right === maxRight;\n });\n var _top = measureRects[0].top;\n var _bottom = measureRects[measureRects.length - 1].bottom;\n var _left = minLeft;\n var _right = maxRight;\n\n var _width = _right - _left;\n\n var _height = _bottom - _top;\n\n return {\n top: _top,\n bottom: _bottom,\n left: _left,\n right: _right,\n width: _width,\n height: _height\n };\n }\n\n default:\n {\n return boundingRect;\n }\n }\n}\n\nvar sticky = {\n name: 'sticky',\n defaultValue: false,\n fn: function fn(instance) {\n var reference = instance.reference,\n popper = instance.popper;\n\n function getReference() {\n return instance.popperInstance ? instance.popperInstance.state.elements.reference : reference;\n }\n\n function shouldCheck(value) {\n return instance.props.sticky === true || instance.props.sticky === value;\n }\n\n var prevRefRect = null;\n var prevPopRect = null;\n\n function updatePosition() {\n var currentRefRect = shouldCheck('reference') ? getReference().getBoundingClientRect() : null;\n var currentPopRect = shouldCheck('popper') ? popper.getBoundingClientRect() : null;\n\n if (currentRefRect && areRectsDifferent(prevRefRect, currentRefRect) || currentPopRect && areRectsDifferent(prevPopRect, currentPopRect)) {\n if (instance.popperInstance) {\n instance.popperInstance.update();\n }\n }\n\n prevRefRect = currentRefRect;\n prevPopRect = currentPopRect;\n\n if (instance.state.isMounted) {\n requestAnimationFrame(updatePosition);\n }\n }\n\n return {\n onMount: function onMount() {\n if (instance.props.sticky) {\n updatePosition();\n }\n }\n };\n }\n};\n\nfunction areRectsDifferent(rectA, rectB) {\n if (rectA && rectB) {\n return rectA.top !== rectB.top || rectA.right !== rectB.right || rectA.bottom !== rectB.bottom || rectA.left !== rectB.left;\n }\n\n return true;\n}\n\ntippy.setDefaultProps({\n render: render\n});\n\nexports.animateFill = animateFill;\nexports.createSingleton = createSingleton;\nexports.default = tippy;\nexports.delegate = delegate;\nexports.followCursor = followCursor;\nexports.hideAll = hideAll;\nexports.inlinePositioning = inlinePositioning;\nexports.roundArrow = ROUND_ARROW;\nexports.sticky = sticky;\n//# sourceMappingURL=tippy.cjs.js.map\n","!function(t,e){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=e():\"function\"==typeof define&&define.amd?define([],e):\"object\"==typeof exports?exports[\"vue-js-modal\"]=e():t[\"vue-js-modal\"]=e()}(window,function(){return i={},o.m=n=[function(t,e,n){var i=n(7);\"string\"==typeof i&&(i=[[t.i,i,\"\"]]),i.locals&&(t.exports=i.locals);(0,n(4).default)(\"d763679c\",i,!1,{})},function(t,e,n){var i=n(10);\"string\"==typeof i&&(i=[[t.i,i,\"\"]]),i.locals&&(t.exports=i.locals);(0,n(4).default)(\"6b9cc0e0\",i,!1,{})},function(t,e,n){var i=n(12);\"string\"==typeof i&&(i=[[t.i,i,\"\"]]),i.locals&&(t.exports=i.locals);(0,n(4).default)(\"663c004e\",i,!1,{})},function(t,e){t.exports=function(n){var a=[];return a.toString=function(){return this.map(function(t){var e=function(t,e){var n=t[1]||\"\",i=t[3];if(!i)return n;if(e&&\"function\"==typeof btoa){var o=function(t){return\"/*# sourceMappingURL=data:application/json;charset=utf-8;base64,\"+btoa(unescape(encodeURIComponent(JSON.stringify(t))))+\" */\"}(i),r=i.sources.map(function(t){return\"/*# sourceURL=\"+i.sourceRoot+t+\" */\"});return[n].concat(r).concat([o]).join(\"\\n\")}return[n].join(\"\\n\")}(t,n);return t[2]?\"@media \"+t[2]+\"{\"+e+\"}\":e}).join(\"\")},a.i=function(t,e){\"string\"==typeof t&&(t=[[null,t,\"\"]]);for(var n={},i=0;in.parts.length&&(i.parts.length=n.parts.length)}else{var r=[];for(o=0;o=this.viewportHeight?Math.max(this.minHeight,this.viewportHeight)+\"px\":\"auto\"},containerClass:function(){return[\"vm--container\",this.scrollable&&this.isAutoHeight&&\"scrollable\"]},modalClass:function(){return[\"vm--modal\",this.classes]},stylesProp:function(){return\"string\"==typeof this.styles?l(this.styles):this.styles},modalStyle:function(){return[this.stylesProp,{top:this.position.top+\"px\",left:this.position.left+\"px\",width:this.trueModalWidth+\"px\",height:this.isAutoHeight?this.autoHeight:this.trueModalHeight+\"px\"}]},isComponentReadyToBeDestroyed:function(){return this.overlayTransitionState===j&&this.modalTransitionState===j}},watch:{isComponentReadyToBeDestroyed:function(t){t&&(this.visible=!1)}},methods:{startTransitionEnter:function(){this.visibility.overlay=!0,this.visibility.modal=!0},startTransitionLeave:function(){this.visibility.overlay=!1,this.visibility.modal=!1},beforeOverlayTransitionEnter:function(){this.overlayTransitionState=C},afterOverlayTransitionEnter:function(){this.overlayTransitionState=A},beforeOverlayTransitionLeave:function(){this.overlayTransitionState=R},afterOverlayTransitionLeave:function(){this.overlayTransitionState=j},beforeModalTransitionEnter:function(){var t=this;this.modalTransitionState=C,this.$nextTick(function(){t.resizeObserver.observe(t.$refs.modal)})},afterModalTransitionEnter:function(){this.modalTransitionState=A,this.draggable&&this.addDraggableListeners(),this.focusTrap&&this.$focusTrap.enable(this.$refs.modal);var t=this.createModalEvent({state:\"opened\"});this.$emit(\"opened\",t)},beforeModalTransitionLeave:function(){this.modalTransitionState=R,this.resizeObserver.unobserve(this.$refs.modal),this.$focusTrap.enabled()&&this.$focusTrap.disable()},afterModalTransitionLeave:function(){this.modalTransitionState=j;var t=this.createModalEvent({state:\"closed\"});this.$emit(\"closed\",t)},onToggle:function(t,e,n){if(this.name===t){var i=void 0===e?!this.visible:e;this.toggle(i,n)}},setInitialSize:function(){var t=y(this.width),e=y(this.height);this.modal.width=t.value,this.modal.widthType=t.type,this.modal.height=e.value,this.modal.heightType=e.type},onEscapeKeyUp:function(t){27===t.which&&this.visible&&this.$modal.hide(this.name)},onWindowResize:function(){this.viewportWidth=s(),this.viewportHeight=window.innerHeight,this.ensureShiftInWindowBounds()},createModalEvent:function(t){var e=0=0&&Math.floor(t)===t&&isFinite(e)}function u(e){return n(e)&&\"function\"==typeof e.then&&\"function\"==typeof e.catch}function l(e){return null==e?\"\":Array.isArray(e)||s(e)&&e.toString===a?JSON.stringify(e,null,2):String(e)}function f(e){var t=parseFloat(e);return isNaN(t)?e:t}function p(e,t){for(var n=Object.create(null),r=e.split(\",\"),i=0;i-1)return e.splice(n,1)}}var m=Object.prototype.hasOwnProperty;function y(e,t){return m.call(e,t)}function g(e){var t=Object.create(null);return function(n){return t[n]||(t[n]=e(n))}}var _=/-(\\w)/g,b=g(function(e){return e.replace(_,function(e,t){return t?t.toUpperCase():\"\"})}),$=g(function(e){return e.charAt(0).toUpperCase()+e.slice(1)}),w=/\\B([A-Z])/g,C=g(function(e){return e.replace(w,\"-$1\").toLowerCase()});var x=Function.prototype.bind?function(e,t){return e.bind(t)}:function(e,t){function n(n){var r=arguments.length;return r?r>1?e.apply(t,arguments):e.call(t,n):e.call(t)}return n._length=e.length,n};function k(e,t){t=t||0;for(var n=e.length-t,r=new Array(n);n--;)r[n]=e[n+t];return r}function A(e,t){for(var n in t)e[n]=t[n];return e}function O(e){for(var t={},n=0;n0,Z=J&&J.indexOf(\"edge/\")>0,G=(J&&J.indexOf(\"android\"),J&&/iphone|ipad|ipod|ios/.test(J)||\"ios\"===K),X=(J&&/chrome\\/\\d+/.test(J),J&&/phantomjs/.test(J),J&&J.match(/firefox\\/(\\d+)/)),Y={}.watch,Q=!1;if(z)try{var ee={};Object.defineProperty(ee,\"passive\",{get:function(){Q=!0}}),window.addEventListener(\"test-passive\",null,ee)}catch(e){}var te=function(){return void 0===B&&(B=!z&&!V&&\"undefined\"!=typeof global&&(global.process&&\"server\"===global.process.env.VUE_ENV)),B},ne=z&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__;function re(e){return\"function\"==typeof e&&/native code/.test(e.toString())}var ie,oe=\"undefined\"!=typeof Symbol&&re(Symbol)&&\"undefined\"!=typeof Reflect&&re(Reflect.ownKeys);ie=\"undefined\"!=typeof Set&&re(Set)?Set:function(){function e(){this.set=Object.create(null)}return e.prototype.has=function(e){return!0===this.set[e]},e.prototype.add=function(e){this.set[e]=!0},e.prototype.clear=function(){this.set=Object.create(null)},e}();var ae=S,se=0,ce=function(){this.id=se++,this.subs=[]};ce.prototype.addSub=function(e){this.subs.push(e)},ce.prototype.removeSub=function(e){h(this.subs,e)},ce.prototype.depend=function(){ce.target&&ce.target.addDep(this)},ce.prototype.notify=function(){for(var e=this.subs.slice(),t=0,n=e.length;t-1)if(o&&!y(i,\"default\"))a=!1;else if(\"\"===a||a===C(e)){var c=Pe(String,i.type);(c<0||s0&&(st((u=e(u,(a||\"\")+\"_\"+c))[0])&&st(f)&&(s[l]=he(f.text+u[0].text),u.shift()),s.push.apply(s,u)):i(u)?st(f)?s[l]=he(f.text+u):\"\"!==u&&s.push(he(u)):st(u)&&st(f)?s[l]=he(f.text+u.text):(r(o._isVList)&&n(u.tag)&&t(u.key)&&n(a)&&(u.key=\"__vlist\"+a+\"_\"+c+\"__\"),s.push(u)));return s}(e):void 0}function st(e){return n(e)&&n(e.text)&&!1===e.isComment}function ct(e,t){if(e){for(var n=Object.create(null),r=oe?Reflect.ownKeys(e):Object.keys(e),i=0;i0,a=t?!!t.$stable:!o,s=t&&t.$key;if(t){if(t._normalized)return t._normalized;if(a&&r&&r!==e&&s===r.$key&&!o&&!r.$hasNormal)return r;for(var c in i={},t)t[c]&&\"$\"!==c[0]&&(i[c]=pt(n,c,t[c]))}else i={};for(var u in n)u in i||(i[u]=dt(n,u));return t&&Object.isExtensible(t)&&(t._normalized=i),R(i,\"$stable\",a),R(i,\"$key\",s),R(i,\"$hasNormal\",o),i}function pt(e,t,n){var r=function(){var e=arguments.length?n.apply(null,arguments):n({});return(e=e&&\"object\"==typeof e&&!Array.isArray(e)?[e]:at(e))&&(0===e.length||1===e.length&&e[0].isComment)?void 0:e};return n.proxy&&Object.defineProperty(e,t,{get:r,enumerable:!0,configurable:!0}),r}function dt(e,t){return function(){return e[t]}}function vt(e,t){var r,i,a,s,c;if(Array.isArray(e)||\"string\"==typeof e)for(r=new Array(e.length),i=0,a=e.length;idocument.createEvent(\"Event\").timeStamp&&(sn=function(){return cn.now()})}function un(){var e,t;for(an=sn(),rn=!0,Qt.sort(function(e,t){return e.id-t.id}),on=0;onon&&Qt[n].id>e.id;)n--;Qt.splice(n+1,0,e)}else Qt.push(e);nn||(nn=!0,Ye(un))}}(this)},fn.prototype.run=function(){if(this.active){var e=this.get();if(e!==this.value||o(e)||this.deep){var t=this.value;if(this.value=e,this.user)try{this.cb.call(this.vm,e,t)}catch(e){Re(e,this.vm,'callback for watcher \"'+this.expression+'\"')}else this.cb.call(this.vm,e,t)}}},fn.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},fn.prototype.depend=function(){for(var e=this.deps.length;e--;)this.deps[e].depend()},fn.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||h(this.vm._watchers,this);for(var e=this.deps.length;e--;)this.deps[e].removeSub(this);this.active=!1}};var pn={enumerable:!0,configurable:!0,get:S,set:S};function dn(e,t,n){pn.get=function(){return this[t][n]},pn.set=function(e){this[t][n]=e},Object.defineProperty(e,n,pn)}function vn(e){e._watchers=[];var t=e.$options;t.props&&function(e,t){var n=e.$options.propsData||{},r=e._props={},i=e.$options._propKeys=[];e.$parent&&$e(!1);var o=function(o){i.push(o);var a=Me(o,t,n,e);xe(r,o,a),o in e||dn(e,\"_props\",o)};for(var a in t)o(a);$e(!0)}(e,t.props),t.methods&&function(e,t){e.$options.props;for(var n in t)e[n]=\"function\"!=typeof t[n]?S:x(t[n],e)}(e,t.methods),t.data?function(e){var t=e.$options.data;s(t=e._data=\"function\"==typeof t?function(e,t){le();try{return e.call(t,t)}catch(e){return Re(e,t,\"data()\"),{}}finally{fe()}}(t,e):t||{})||(t={});var n=Object.keys(t),r=e.$options.props,i=(e.$options.methods,n.length);for(;i--;){var o=n[i];r&&y(r,o)||(a=void 0,36!==(a=(o+\"\").charCodeAt(0))&&95!==a&&dn(e,\"_data\",o))}var a;Ce(t,!0)}(e):Ce(e._data={},!0),t.computed&&function(e,t){var n=e._computedWatchers=Object.create(null),r=te();for(var i in t){var o=t[i],a=\"function\"==typeof o?o:o.get;r||(n[i]=new fn(e,a||S,S,hn)),i in e||mn(e,i,o)}}(e,t.computed),t.watch&&t.watch!==Y&&function(e,t){for(var n in t){var r=t[n];if(Array.isArray(r))for(var i=0;i-1:\"string\"==typeof e?e.split(\",\").indexOf(t)>-1:(n=e,\"[object RegExp]\"===a.call(n)&&e.test(t));var n}function An(e,t){var n=e.cache,r=e.keys,i=e._vnode;for(var o in n){var a=n[o];if(a){var s=xn(a.componentOptions);s&&!t(s)&&On(n,o,r,i)}}}function On(e,t,n,r){var i=e[t];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),e[t]=null,h(n,t)}!function(t){t.prototype._init=function(t){var n=this;n._uid=bn++,n._isVue=!0,t&&t._isComponent?function(e,t){var n=e.$options=Object.create(e.constructor.options),r=t._parentVnode;n.parent=t.parent,n._parentVnode=r;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,t.render&&(n.render=t.render,n.staticRenderFns=t.staticRenderFns)}(n,t):n.$options=De($n(n.constructor),t||{},n),n._renderProxy=n,n._self=n,function(e){var t=e.$options,n=t.parent;if(n&&!t.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(e)}e.$parent=n,e.$root=n?n.$root:e,e.$children=[],e.$refs={},e._watcher=null,e._inactive=null,e._directInactive=!1,e._isMounted=!1,e._isDestroyed=!1,e._isBeingDestroyed=!1}(n),function(e){e._events=Object.create(null),e._hasHookEvent=!1;var t=e.$options._parentListeners;t&&qt(e,t)}(n),function(t){t._vnode=null,t._staticTrees=null;var n=t.$options,r=t.$vnode=n._parentVnode,i=r&&r.context;t.$slots=ut(n._renderChildren,i),t.$scopedSlots=e,t._c=function(e,n,r,i){return Pt(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Pt(t,e,n,r,i,!0)};var o=r&&r.data;xe(t,\"$attrs\",o&&o.attrs||e,null,!0),xe(t,\"$listeners\",n._parentListeners||e,null,!0)}(n),Yt(n,\"beforeCreate\"),function(e){var t=ct(e.$options.inject,e);t&&($e(!1),Object.keys(t).forEach(function(n){xe(e,n,t[n])}),$e(!0))}(n),vn(n),function(e){var t=e.$options.provide;t&&(e._provided=\"function\"==typeof t?t.call(e):t)}(n),Yt(n,\"created\"),n.$options.el&&n.$mount(n.$options.el)}}(wn),function(e){var t={get:function(){return this._data}},n={get:function(){return this._props}};Object.defineProperty(e.prototype,\"$data\",t),Object.defineProperty(e.prototype,\"$props\",n),e.prototype.$set=ke,e.prototype.$delete=Ae,e.prototype.$watch=function(e,t,n){if(s(t))return _n(this,e,t,n);(n=n||{}).user=!0;var r=new fn(this,e,t,n);if(n.immediate)try{t.call(this,r.value)}catch(e){Re(e,this,'callback for immediate watcher \"'+r.expression+'\"')}return function(){r.teardown()}}}(wn),function(e){var t=/^hook:/;e.prototype.$on=function(e,n){var r=this;if(Array.isArray(e))for(var i=0,o=e.length;i1?k(t):t;for(var n=k(arguments,1),r='event handler for \"'+e+'\"',i=0,o=t.length;iparseInt(this.max)&&On(a,s[0],s,this._vnode)),t.data.keepAlive=!0}return t||e&&e[0]}}};!function(e){var t={get:function(){return F}};Object.defineProperty(e,\"config\",t),e.util={warn:ae,extend:A,mergeOptions:De,defineReactive:xe},e.set=ke,e.delete=Ae,e.nextTick=Ye,e.observable=function(e){return Ce(e),e},e.options=Object.create(null),M.forEach(function(t){e.options[t+\"s\"]=Object.create(null)}),e.options._base=e,A(e.options.components,Tn),function(e){e.use=function(e){var t=this._installedPlugins||(this._installedPlugins=[]);if(t.indexOf(e)>-1)return this;var n=k(arguments,1);return n.unshift(this),\"function\"==typeof e.install?e.install.apply(e,n):\"function\"==typeof e&&e.apply(null,n),t.push(e),this}}(e),function(e){e.mixin=function(e){return this.options=De(this.options,e),this}}(e),Cn(e),function(e){M.forEach(function(t){e[t]=function(e,n){return n?(\"component\"===t&&s(n)&&(n.name=n.name||e,n=this.options._base.extend(n)),\"directive\"===t&&\"function\"==typeof n&&(n={bind:n,update:n}),this.options[t+\"s\"][e]=n,n):this.options[t+\"s\"][e]}})}(e)}(wn),Object.defineProperty(wn.prototype,\"$isServer\",{get:te}),Object.defineProperty(wn.prototype,\"$ssrContext\",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Object.defineProperty(wn,\"FunctionalRenderContext\",{value:Tt}),wn.version=\"2.6.11\";var En=p(\"style,class\"),Nn=p(\"input,textarea,option,select,progress\"),jn=function(e,t,n){return\"value\"===n&&Nn(e)&&\"button\"!==t||\"selected\"===n&&\"option\"===e||\"checked\"===n&&\"input\"===e||\"muted\"===n&&\"video\"===e},Dn=p(\"contenteditable,draggable,spellcheck\"),Ln=p(\"events,caret,typing,plaintext-only\"),Mn=function(e,t){return Hn(t)||\"false\"===t?\"false\":\"contenteditable\"===e&&Ln(t)?t:\"true\"},In=p(\"allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible\"),Fn=\"http://www.w3.org/1999/xlink\",Pn=function(e){return\":\"===e.charAt(5)&&\"xlink\"===e.slice(0,5)},Rn=function(e){return Pn(e)?e.slice(6,e.length):\"\"},Hn=function(e){return null==e||!1===e};function Bn(e){for(var t=e.data,r=e,i=e;n(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(t=Un(i.data,t));for(;n(r=r.parent);)r&&r.data&&(t=Un(t,r.data));return function(e,t){if(n(e)||n(t))return zn(e,Vn(t));return\"\"}(t.staticClass,t.class)}function Un(e,t){return{staticClass:zn(e.staticClass,t.staticClass),class:n(e.class)?[e.class,t.class]:t.class}}function zn(e,t){return e?t?e+\" \"+t:e:t||\"\"}function Vn(e){return Array.isArray(e)?function(e){for(var t,r=\"\",i=0,o=e.length;i-1?hr(e,t,n):In(t)?Hn(n)?e.removeAttribute(t):(n=\"allowfullscreen\"===t&&\"EMBED\"===e.tagName?\"true\":t,e.setAttribute(t,n)):Dn(t)?e.setAttribute(t,Mn(t,n)):Pn(t)?Hn(n)?e.removeAttributeNS(Fn,Rn(t)):e.setAttributeNS(Fn,t,n):hr(e,t,n)}function hr(e,t,n){if(Hn(n))e.removeAttribute(t);else{if(q&&!W&&\"TEXTAREA\"===e.tagName&&\"placeholder\"===t&&\"\"!==n&&!e.__ieph){var r=function(t){t.stopImmediatePropagation(),e.removeEventListener(\"input\",r)};e.addEventListener(\"input\",r),e.__ieph=!0}e.setAttribute(t,n)}}var mr={create:dr,update:dr};function yr(e,r){var i=r.elm,o=r.data,a=e.data;if(!(t(o.staticClass)&&t(o.class)&&(t(a)||t(a.staticClass)&&t(a.class)))){var s=Bn(r),c=i._transitionClasses;n(c)&&(s=zn(s,Vn(c))),s!==i._prevClass&&(i.setAttribute(\"class\",s),i._prevClass=s)}}var gr,_r,br,$r,wr,Cr,xr={create:yr,update:yr},kr=/[\\w).+\\-_$\\]]/;function Ar(e){var t,n,r,i,o,a=!1,s=!1,c=!1,u=!1,l=0,f=0,p=0,d=0;for(r=0;r=0&&\" \"===(h=e.charAt(v));v--);h&&kr.test(h)||(u=!0)}}else void 0===i?(d=r+1,i=e.slice(0,r).trim()):m();function m(){(o||(o=[])).push(e.slice(d,r).trim()),d=r+1}if(void 0===i?i=e.slice(0,r).trim():0!==d&&m(),o)for(r=0;r-1?{exp:e.slice(0,$r),key:'\"'+e.slice($r+1)+'\"'}:{exp:e,key:null};_r=e,$r=wr=Cr=0;for(;!zr();)Vr(br=Ur())?Jr(br):91===br&&Kr(br);return{exp:e.slice(0,wr),key:e.slice(wr+1,Cr)}}(e);return null===n.key?e+\"=\"+t:\"$set(\"+n.exp+\", \"+n.key+\", \"+t+\")\"}function Ur(){return _r.charCodeAt(++$r)}function zr(){return $r>=gr}function Vr(e){return 34===e||39===e}function Kr(e){var t=1;for(wr=$r;!zr();)if(Vr(e=Ur()))Jr(e);else if(91===e&&t++,93===e&&t--,0===t){Cr=$r;break}}function Jr(e){for(var t=e;!zr()&&(e=Ur())!==t;);}var qr,Wr=\"__r\",Zr=\"__c\";function Gr(e,t,n){var r=qr;return function i(){null!==t.apply(null,arguments)&&Qr(e,i,n,r)}}var Xr=Ve&&!(X&&Number(X[1])<=53);function Yr(e,t,n,r){if(Xr){var i=an,o=t;t=o._wrapper=function(e){if(e.target===e.currentTarget||e.timeStamp>=i||e.timeStamp<=0||e.target.ownerDocument!==document)return o.apply(this,arguments)}}qr.addEventListener(e,t,Q?{capture:n,passive:r}:n)}function Qr(e,t,n,r){(r||qr).removeEventListener(e,t._wrapper||t,n)}function ei(e,r){if(!t(e.data.on)||!t(r.data.on)){var i=r.data.on||{},o=e.data.on||{};qr=r.elm,function(e){if(n(e[Wr])){var t=q?\"change\":\"input\";e[t]=[].concat(e[Wr],e[t]||[]),delete e[Wr]}n(e[Zr])&&(e.change=[].concat(e[Zr],e.change||[]),delete e[Zr])}(i),rt(i,o,Yr,Qr,Gr,r.context),qr=void 0}}var ti,ni={create:ei,update:ei};function ri(e,r){if(!t(e.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=e.data.domProps||{},c=r.data.domProps||{};for(i in n(c.__ob__)&&(c=r.data.domProps=A({},c)),s)i in c||(a[i]=\"\");for(i in c){if(o=c[i],\"textContent\"===i||\"innerHTML\"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if(\"value\"===i&&\"PROGRESS\"!==a.tagName){a._value=o;var u=t(o)?\"\":String(o);ii(a,u)&&(a.value=u)}else if(\"innerHTML\"===i&&qn(a.tagName)&&t(a.innerHTML)){(ti=ti||document.createElement(\"div\")).innerHTML=\"\"+o+\"\";for(var l=ti.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;l.firstChild;)a.appendChild(l.firstChild)}else if(o!==s[i])try{a[i]=o}catch(e){}}}}function ii(e,t){return!e.composing&&(\"OPTION\"===e.tagName||function(e,t){var n=!0;try{n=document.activeElement!==e}catch(e){}return n&&e.value!==t}(e,t)||function(e,t){var r=e.value,i=e._vModifiers;if(n(i)){if(i.number)return f(r)!==f(t);if(i.trim)return r.trim()!==t.trim()}return r!==t}(e,t))}var oi={create:ri,update:ri},ai=g(function(e){var t={},n=/:(.+)/;return e.split(/;(?![^(]*\\))/g).forEach(function(e){if(e){var r=e.split(n);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t});function si(e){var t=ci(e.style);return e.staticStyle?A(e.staticStyle,t):t}function ci(e){return Array.isArray(e)?O(e):\"string\"==typeof e?ai(e):e}var ui,li=/^--/,fi=/\\s*!important$/,pi=function(e,t,n){if(li.test(t))e.style.setProperty(t,n);else if(fi.test(n))e.style.setProperty(C(t),n.replace(fi,\"\"),\"important\");else{var r=vi(t);if(Array.isArray(n))for(var i=0,o=n.length;i-1?t.split(yi).forEach(function(t){return e.classList.add(t)}):e.classList.add(t);else{var n=\" \"+(e.getAttribute(\"class\")||\"\")+\" \";n.indexOf(\" \"+t+\" \")<0&&e.setAttribute(\"class\",(n+t).trim())}}function _i(e,t){if(t&&(t=t.trim()))if(e.classList)t.indexOf(\" \")>-1?t.split(yi).forEach(function(t){return e.classList.remove(t)}):e.classList.remove(t),e.classList.length||e.removeAttribute(\"class\");else{for(var n=\" \"+(e.getAttribute(\"class\")||\"\")+\" \",r=\" \"+t+\" \";n.indexOf(r)>=0;)n=n.replace(r,\" \");(n=n.trim())?e.setAttribute(\"class\",n):e.removeAttribute(\"class\")}}function bi(e){if(e){if(\"object\"==typeof e){var t={};return!1!==e.css&&A(t,$i(e.name||\"v\")),A(t,e),t}return\"string\"==typeof e?$i(e):void 0}}var $i=g(function(e){return{enterClass:e+\"-enter\",enterToClass:e+\"-enter-to\",enterActiveClass:e+\"-enter-active\",leaveClass:e+\"-leave\",leaveToClass:e+\"-leave-to\",leaveActiveClass:e+\"-leave-active\"}}),wi=z&&!W,Ci=\"transition\",xi=\"animation\",ki=\"transition\",Ai=\"transitionend\",Oi=\"animation\",Si=\"animationend\";wi&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(ki=\"WebkitTransition\",Ai=\"webkitTransitionEnd\"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Oi=\"WebkitAnimation\",Si=\"webkitAnimationEnd\"));var Ti=z?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(e){return e()};function Ei(e){Ti(function(){Ti(e)})}function Ni(e,t){var n=e._transitionClasses||(e._transitionClasses=[]);n.indexOf(t)<0&&(n.push(t),gi(e,t))}function ji(e,t){e._transitionClasses&&h(e._transitionClasses,t),_i(e,t)}function Di(e,t,n){var r=Mi(e,t),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===Ci?Ai:Si,c=0,u=function(){e.removeEventListener(s,l),n()},l=function(t){t.target===e&&++c>=a&&u()};setTimeout(function(){c0&&(n=Ci,l=a,f=o.length):t===xi?u>0&&(n=xi,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?Ci:xi:null)?n===Ci?o.length:c.length:0,{type:n,timeout:l,propCount:f,hasTransform:n===Ci&&Li.test(r[ki+\"Property\"])}}function Ii(e,t){for(;e.length1}function Ui(e,t){!0!==t.data.show&&Pi(t)}var zi=function(e){var o,a,s={},c=e.modules,u=e.nodeOps;for(o=0;ov?_(e,t(i[y+1])?null:i[y+1].elm,i,d,y,o):d>y&&$(r,p,v)}(p,h,y,o,l):n(y)?(n(e.text)&&u.setTextContent(p,\"\"),_(p,null,y,0,y.length-1,o)):n(h)?$(h,0,h.length-1):n(e.text)&&u.setTextContent(p,\"\"):e.text!==i.text&&u.setTextContent(p,i.text),n(v)&&n(d=v.hook)&&n(d=d.postpatch)&&d(e,i)}}}function k(e,t,i){if(r(i)&&n(e.parent))e.parent.data.pendingInsert=t;else for(var o=0;o-1,a.selected!==o&&(a.selected=o);else if(N(Wi(a),r))return void(e.selectedIndex!==s&&(e.selectedIndex=s));i||(e.selectedIndex=-1)}}function qi(e,t){return t.every(function(t){return!N(t,e)})}function Wi(e){return\"_value\"in e?e._value:e.value}function Zi(e){e.target.composing=!0}function Gi(e){e.target.composing&&(e.target.composing=!1,Xi(e.target,\"input\"))}function Xi(e,t){var n=document.createEvent(\"HTMLEvents\");n.initEvent(t,!0,!0),e.dispatchEvent(n)}function Yi(e){return!e.componentInstance||e.data&&e.data.transition?e:Yi(e.componentInstance._vnode)}var Qi={model:Vi,show:{bind:function(e,t,n){var r=t.value,i=(n=Yi(n)).data&&n.data.transition,o=e.__vOriginalDisplay=\"none\"===e.style.display?\"\":e.style.display;r&&i?(n.data.show=!0,Pi(n,function(){e.style.display=o})):e.style.display=r?o:\"none\"},update:function(e,t,n){var r=t.value;!r!=!t.oldValue&&((n=Yi(n)).data&&n.data.transition?(n.data.show=!0,r?Pi(n,function(){e.style.display=e.__vOriginalDisplay}):Ri(n,function(){e.style.display=\"none\"})):e.style.display=r?e.__vOriginalDisplay:\"none\")},unbind:function(e,t,n,r,i){i||(e.style.display=e.__vOriginalDisplay)}}},eo={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]};function to(e){var t=e&&e.componentOptions;return t&&t.Ctor.options.abstract?to(zt(t.children)):e}function no(e){var t={},n=e.$options;for(var r in n.propsData)t[r]=e[r];var i=n._parentListeners;for(var o in i)t[b(o)]=i[o];return t}function ro(e,t){if(/\\d-keep-alive$/.test(t.tag))return e(\"keep-alive\",{props:t.componentOptions.propsData})}var io=function(e){return e.tag||Ut(e)},oo=function(e){return\"show\"===e.name},ao={name:\"transition\",props:eo,abstract:!0,render:function(e){var t=this,n=this.$slots.default;if(n&&(n=n.filter(io)).length){var r=this.mode,o=n[0];if(function(e){for(;e=e.parent;)if(e.data.transition)return!0}(this.$vnode))return o;var a=to(o);if(!a)return o;if(this._leaving)return ro(e,o);var s=\"__transition-\"+this._uid+\"-\";a.key=null==a.key?a.isComment?s+\"comment\":s+a.tag:i(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=no(this),u=this._vnode,l=to(u);if(a.data.directives&&a.data.directives.some(oo)&&(a.data.show=!0),l&&l.data&&!function(e,t){return t.key===e.key&&t.tag===e.tag}(a,l)&&!Ut(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=A({},c);if(\"out-in\"===r)return this._leaving=!0,it(f,\"afterLeave\",function(){t._leaving=!1,t.$forceUpdate()}),ro(e,o);if(\"in-out\"===r){if(Ut(a))return u;var p,d=function(){p()};it(c,\"afterEnter\",d),it(c,\"enterCancelled\",d),it(f,\"delayLeave\",function(e){p=e})}}return o}}},so=A({tag:String,moveClass:String},eo);function co(e){e.elm._moveCb&&e.elm._moveCb(),e.elm._enterCb&&e.elm._enterCb()}function uo(e){e.data.newPos=e.elm.getBoundingClientRect()}function lo(e){var t=e.data.pos,n=e.data.newPos,r=t.left-n.left,i=t.top-n.top;if(r||i){e.data.moved=!0;var o=e.elm.style;o.transform=o.WebkitTransform=\"translate(\"+r+\"px,\"+i+\"px)\",o.transitionDuration=\"0s\"}}delete so.mode;var fo={Transition:ao,TransitionGroup:{props:so,beforeMount:function(){var e=this,t=this._update;this._update=function(n,r){var i=Zt(e);e.__patch__(e._vnode,e.kept,!1,!0),e._vnode=e.kept,i(),t.call(e,n,r)}},render:function(e){for(var t=this.tag||this.$vnode.data.tag||\"span\",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=no(this),s=0;s-1?Gn[e]=t.constructor===window.HTMLUnknownElement||t.constructor===window.HTMLElement:Gn[e]=/HTMLUnknownElement/.test(t.toString())},A(wn.options.directives,Qi),A(wn.options.components,fo),wn.prototype.__patch__=z?zi:S,wn.prototype.$mount=function(e,t){return function(e,t,n){var r;return e.$el=t,e.$options.render||(e.$options.render=ve),Yt(e,\"beforeMount\"),r=function(){e._update(e._render(),n)},new fn(e,r,S,{before:function(){e._isMounted&&!e._isDestroyed&&Yt(e,\"beforeUpdate\")}},!0),n=!1,null==e.$vnode&&(e._isMounted=!0,Yt(e,\"mounted\")),e}(this,e=e&&z?Yn(e):void 0,t)},z&&setTimeout(function(){F.devtools&&ne&&ne.emit(\"init\",wn)},0);var po=/\\{\\{((?:.|\\r?\\n)+?)\\}\\}/g,vo=/[-.*+?^${}()|[\\]\\/\\\\]/g,ho=g(function(e){var t=e[0].replace(vo,\"\\\\$&\"),n=e[1].replace(vo,\"\\\\$&\");return new RegExp(t+\"((?:.|\\\\n)+?)\"+n,\"g\")});var mo={staticKeys:[\"staticClass\"],transformNode:function(e,t){t.warn;var n=Fr(e,\"class\");n&&(e.staticClass=JSON.stringify(n));var r=Ir(e,\"class\",!1);r&&(e.classBinding=r)},genData:function(e){var t=\"\";return e.staticClass&&(t+=\"staticClass:\"+e.staticClass+\",\"),e.classBinding&&(t+=\"class:\"+e.classBinding+\",\"),t}};var yo,go={staticKeys:[\"staticStyle\"],transformNode:function(e,t){t.warn;var n=Fr(e,\"style\");n&&(e.staticStyle=JSON.stringify(ai(n)));var r=Ir(e,\"style\",!1);r&&(e.styleBinding=r)},genData:function(e){var t=\"\";return e.staticStyle&&(t+=\"staticStyle:\"+e.staticStyle+\",\"),e.styleBinding&&(t+=\"style:(\"+e.styleBinding+\"),\"),t}},_o=function(e){return(yo=yo||document.createElement(\"div\")).innerHTML=e,yo.textContent},bo=p(\"area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr\"),$o=p(\"colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source\"),wo=p(\"address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track\"),Co=/^\\s*([^\\s\"'<>\\/=]+)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/,xo=/^\\s*((?:v-[\\w-]+:|@|:|#)\\[[^=]+\\][^\\s\"'<>\\/=]*)(?:\\s*(=)\\s*(?:\"([^\"]*)\"+|'([^']*)'+|([^\\s\"'=<>`]+)))?/,ko=\"[a-zA-Z_][\\\\-\\\\.0-9_a-zA-Z\"+P.source+\"]*\",Ao=\"((?:\"+ko+\"\\\\:)?\"+ko+\")\",Oo=new RegExp(\"^<\"+Ao),So=/^\\s*(\\/?)>/,To=new RegExp(\"^<\\\\/\"+Ao+\"[^>]*>\"),Eo=/^]+>/i,No=/^\",\""\":'\"',\"&\":\"&\",\" \":\"\\n\",\" \":\"\\t\",\"'\":\"'\"},Io=/&(?:lt|gt|quot|amp|#39);/g,Fo=/&(?:lt|gt|quot|amp|#39|#10|#9);/g,Po=p(\"pre,textarea\",!0),Ro=function(e,t){return e&&Po(e)&&\"\\n\"===t[0]};function Ho(e,t){var n=t?Fo:Io;return e.replace(n,function(e){return Mo[e]})}var Bo,Uo,zo,Vo,Ko,Jo,qo,Wo,Zo=/^@|^v-on:/,Go=/^v-|^@|^:|^#/,Xo=/([\\s\\S]*?)\\s+(?:in|of)\\s+([\\s\\S]*)/,Yo=/,([^,\\}\\]]*)(?:,([^,\\}\\]]*))?$/,Qo=/^\\(|\\)$/g,ea=/^\\[.*\\]$/,ta=/:(.*)$/,na=/^:|^\\.|^v-bind:/,ra=/\\.[^.\\]]+(?=[^\\]]*$)/g,ia=/^v-slot(:|$)|^#/,oa=/[\\r\\n]/,aa=/\\s+/g,sa=g(_o),ca=\"_empty_\";function ua(e,t,n){return{type:1,tag:e,attrsList:t,attrsMap:ma(t),rawAttrsMap:{},parent:n,children:[]}}function la(e,t){Bo=t.warn||Sr,Jo=t.isPreTag||T,qo=t.mustUseProp||T,Wo=t.getTagNamespace||T;t.isReservedTag;zo=Tr(t.modules,\"transformNode\"),Vo=Tr(t.modules,\"preTransformNode\"),Ko=Tr(t.modules,\"postTransformNode\"),Uo=t.delimiters;var n,r,i=[],o=!1!==t.preserveWhitespace,a=t.whitespace,s=!1,c=!1;function u(e){if(l(e),s||e.processed||(e=fa(e,t)),i.length||e===n||n.if&&(e.elseif||e.else)&&da(n,{exp:e.elseif,block:e}),r&&!e.forbidden)if(e.elseif||e.else)a=e,(u=function(e){var t=e.length;for(;t--;){if(1===e[t].type)return e[t];e.pop()}}(r.children))&&u.if&&da(u,{exp:a.elseif,block:a});else{if(e.slotScope){var o=e.slotTarget||'\"default\"';(r.scopedSlots||(r.scopedSlots={}))[o]=e}r.children.push(e),e.parent=r}var a,u;e.children=e.children.filter(function(e){return!e.slotScope}),l(e),e.pre&&(s=!1),Jo(e.tag)&&(c=!1);for(var f=0;f]*>)\",\"i\")),p=e.replace(f,function(e,n,r){return u=r.length,Do(l)||\"noscript\"===l||(n=n.replace(//g,\"$1\").replace(//g,\"$1\")),Ro(l,n)&&(n=n.slice(1)),t.chars&&t.chars(n),\"\"});c+=e.length-p.length,e=p,A(l,c-u,c)}else{var d=e.indexOf(\"<\");if(0===d){if(No.test(e)){var v=e.indexOf(\"--\\x3e\");if(v>=0){t.shouldKeepComment&&t.comment(e.substring(4,v),c,c+v+3),C(v+3);continue}}if(jo.test(e)){var h=e.indexOf(\"]>\");if(h>=0){C(h+2);continue}}var m=e.match(Eo);if(m){C(m[0].length);continue}var y=e.match(To);if(y){var g=c;C(y[0].length),A(y[1],g,c);continue}var _=x();if(_){k(_),Ro(_.tagName,e)&&C(1);continue}}var b=void 0,$=void 0,w=void 0;if(d>=0){for($=e.slice(d);!(To.test($)||Oo.test($)||No.test($)||jo.test($)||(w=$.indexOf(\"<\",1))<0);)d+=w,$=e.slice(d);b=e.substring(0,d)}d<0&&(b=e),b&&C(b.length),t.chars&&b&&t.chars(b,c-b.length,c)}if(e===n){t.chars&&t.chars(e);break}}function C(t){c+=t,e=e.substring(t)}function x(){var t=e.match(Oo);if(t){var n,r,i={tagName:t[1],attrs:[],start:c};for(C(t[0].length);!(n=e.match(So))&&(r=e.match(xo)||e.match(Co));)r.start=c,C(r[0].length),r.end=c,i.attrs.push(r);if(n)return i.unarySlash=n[1],C(n[0].length),i.end=c,i}}function k(e){var n=e.tagName,c=e.unarySlash;o&&(\"p\"===r&&wo(n)&&A(r),s(n)&&r===n&&A(n));for(var u=a(n)||!!c,l=e.attrs.length,f=new Array(l),p=0;p=0&&i[a].lowerCasedTag!==s;a--);else a=0;if(a>=0){for(var u=i.length-1;u>=a;u--)t.end&&t.end(i[u].tag,n,o);i.length=a,r=a&&i[a-1].tag}else\"br\"===s?t.start&&t.start(e,[],!0,n,o):\"p\"===s&&(t.start&&t.start(e,[],!1,n,o),t.end&&t.end(e,n,o))}A()}(e,{warn:Bo,expectHTML:t.expectHTML,isUnaryTag:t.isUnaryTag,canBeLeftOpenTag:t.canBeLeftOpenTag,shouldDecodeNewlines:t.shouldDecodeNewlines,shouldDecodeNewlinesForHref:t.shouldDecodeNewlinesForHref,shouldKeepComment:t.comments,outputSourceRange:t.outputSourceRange,start:function(e,o,a,l,f){var p=r&&r.ns||Wo(e);q&&\"svg\"===p&&(o=function(e){for(var t=[],n=0;nc&&(s.push(o=e.slice(c,i)),a.push(JSON.stringify(o)));var u=Ar(r[1].trim());a.push(\"_s(\"+u+\")\"),s.push({\"@binding\":u}),c=i+r[0].length}return c-1\"+(\"true\"===o?\":(\"+t+\")\":\":_q(\"+t+\",\"+o+\")\")),Mr(e,\"change\",\"var $$a=\"+t+\",$$el=$event.target,$$c=$$el.checked?(\"+o+\"):(\"+a+\");if(Array.isArray($$a)){var $$v=\"+(r?\"_n(\"+i+\")\":i)+\",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&(\"+Br(t,\"$$a.concat([$$v])\")+\")}else{$$i>-1&&(\"+Br(t,\"$$a.slice(0,$$i).concat($$a.slice($$i+1))\")+\")}}else{\"+Br(t,\"$$c\")+\"}\",null,!0)}(e,r,i);else if(\"input\"===o&&\"radio\"===a)!function(e,t,n){var r=n&&n.number,i=Ir(e,\"value\")||\"null\";Er(e,\"checked\",\"_q(\"+t+\",\"+(i=r?\"_n(\"+i+\")\":i)+\")\"),Mr(e,\"change\",Br(t,i),null,!0)}(e,r,i);else if(\"input\"===o||\"textarea\"===o)!function(e,t,n){var r=e.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&\"range\"!==r,u=o?\"change\":\"range\"===r?Wr:\"input\",l=\"$event.target.value\";s&&(l=\"$event.target.value.trim()\"),a&&(l=\"_n(\"+l+\")\");var f=Br(t,l);c&&(f=\"if($event.target.composing)return;\"+f),Er(e,\"value\",\"(\"+t+\")\"),Mr(e,u,f,null,!0),(s||a)&&Mr(e,\"blur\",\"$forceUpdate()\")}(e,r,i);else if(!F.isReservedTag(o))return Hr(e,r,i),!1;return!0},text:function(e,t){t.value&&Er(e,\"textContent\",\"_s(\"+t.value+\")\",t)},html:function(e,t){t.value&&Er(e,\"innerHTML\",\"_s(\"+t.value+\")\",t)}},isPreTag:function(e){return\"pre\"===e},isUnaryTag:bo,mustUseProp:jn,canBeLeftOpenTag:$o,isReservedTag:Wn,getTagNamespace:Zn,staticKeys:function(e){return e.reduce(function(e,t){return e.concat(t.staticKeys||[])},[]).join(\",\")}(ba)},xa=g(function(e){return p(\"type,tag,attrsList,attrsMap,plain,parent,children,attrs,start,end,rawAttrsMap\"+(e?\",\"+e:\"\"))});function ka(e,t){e&&($a=xa(t.staticKeys||\"\"),wa=t.isReservedTag||T,function e(t){t.static=function(e){if(2===e.type)return!1;if(3===e.type)return!0;return!(!e.pre&&(e.hasBindings||e.if||e.for||d(e.tag)||!wa(e.tag)||function(e){for(;e.parent;){if(\"template\"!==(e=e.parent).tag)return!1;if(e.for)return!0}return!1}(e)||!Object.keys(e).every($a)))}(t);if(1===t.type){if(!wa(t.tag)&&\"slot\"!==t.tag&&null==t.attrsMap[\"inline-template\"])return;for(var n=0,r=t.children.length;n|^function(?:\\s+[\\w$]+)?\\s*\\(/,Oa=/\\([^)]*?\\);*$/,Sa=/^[A-Za-z_$][\\w$]*(?:\\.[A-Za-z_$][\\w$]*|\\['[^']*?']|\\[\"[^\"]*?\"]|\\[\\d+]|\\[[A-Za-z_$][\\w$]*])*$/,Ta={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},Ea={esc:[\"Esc\",\"Escape\"],tab:\"Tab\",enter:\"Enter\",space:[\" \",\"Spacebar\"],up:[\"Up\",\"ArrowUp\"],left:[\"Left\",\"ArrowLeft\"],right:[\"Right\",\"ArrowRight\"],down:[\"Down\",\"ArrowDown\"],delete:[\"Backspace\",\"Delete\",\"Del\"]},Na=function(e){return\"if(\"+e+\")return null;\"},ja={stop:\"$event.stopPropagation();\",prevent:\"$event.preventDefault();\",self:Na(\"$event.target !== $event.currentTarget\"),ctrl:Na(\"!$event.ctrlKey\"),shift:Na(\"!$event.shiftKey\"),alt:Na(\"!$event.altKey\"),meta:Na(\"!$event.metaKey\"),left:Na(\"'button' in $event && $event.button !== 0\"),middle:Na(\"'button' in $event && $event.button !== 1\"),right:Na(\"'button' in $event && $event.button !== 2\")};function Da(e,t){var n=t?\"nativeOn:\":\"on:\",r=\"\",i=\"\";for(var o in e){var a=La(e[o]);e[o]&&e[o].dynamic?i+=o+\",\"+a+\",\":r+='\"'+o+'\":'+a+\",\"}return r=\"{\"+r.slice(0,-1)+\"}\",i?n+\"_d(\"+r+\",[\"+i.slice(0,-1)+\"])\":n+r}function La(e){if(!e)return\"function(){}\";if(Array.isArray(e))return\"[\"+e.map(function(e){return La(e)}).join(\",\")+\"]\";var t=Sa.test(e.value),n=Aa.test(e.value),r=Sa.test(e.value.replace(Oa,\"\"));if(e.modifiers){var i=\"\",o=\"\",a=[];for(var s in e.modifiers)if(ja[s])o+=ja[s],Ta[s]&&a.push(s);else if(\"exact\"===s){var c=e.modifiers;o+=Na([\"ctrl\",\"shift\",\"alt\",\"meta\"].filter(function(e){return!c[e]}).map(function(e){return\"$event.\"+e+\"Key\"}).join(\"||\"))}else a.push(s);return a.length&&(i+=function(e){return\"if(!$event.type.indexOf('key')&&\"+e.map(Ma).join(\"&&\")+\")return null;\"}(a)),o&&(i+=o),\"function($event){\"+i+(t?\"return \"+e.value+\"($event)\":n?\"return (\"+e.value+\")($event)\":r?\"return \"+e.value:e.value)+\"}\"}return t||n?e.value:\"function($event){\"+(r?\"return \"+e.value:e.value)+\"}\"}function Ma(e){var t=parseInt(e,10);if(t)return\"$event.keyCode!==\"+t;var n=Ta[e],r=Ea[e];return\"_k($event.keyCode,\"+JSON.stringify(e)+\",\"+JSON.stringify(n)+\",$event.key,\"+JSON.stringify(r)+\")\"}var Ia={on:function(e,t){e.wrapListeners=function(e){return\"_g(\"+e+\",\"+t.value+\")\"}},bind:function(e,t){e.wrapData=function(n){return\"_b(\"+n+\",'\"+e.tag+\"',\"+t.value+\",\"+(t.modifiers&&t.modifiers.prop?\"true\":\"false\")+(t.modifiers&&t.modifiers.sync?\",true\":\"\")+\")\"}},cloak:S},Fa=function(e){this.options=e,this.warn=e.warn||Sr,this.transforms=Tr(e.modules,\"transformCode\"),this.dataGenFns=Tr(e.modules,\"genData\"),this.directives=A(A({},Ia),e.directives);var t=e.isReservedTag||T;this.maybeComponent=function(e){return!!e.component||!t(e.tag)},this.onceId=0,this.staticRenderFns=[],this.pre=!1};function Pa(e,t){var n=new Fa(t);return{render:\"with(this){return \"+(e?Ra(e,n):'_c(\"div\")')+\"}\",staticRenderFns:n.staticRenderFns}}function Ra(e,t){if(e.parent&&(e.pre=e.pre||e.parent.pre),e.staticRoot&&!e.staticProcessed)return Ha(e,t);if(e.once&&!e.onceProcessed)return Ba(e,t);if(e.for&&!e.forProcessed)return za(e,t);if(e.if&&!e.ifProcessed)return Ua(e,t);if(\"template\"!==e.tag||e.slotTarget||t.pre){if(\"slot\"===e.tag)return function(e,t){var n=e.slotName||'\"default\"',r=qa(e,t),i=\"_t(\"+n+(r?\",\"+r:\"\"),o=e.attrs||e.dynamicAttrs?Ga((e.attrs||[]).concat(e.dynamicAttrs||[]).map(function(e){return{name:b(e.name),value:e.value,dynamic:e.dynamic}})):null,a=e.attrsMap[\"v-bind\"];!o&&!a||r||(i+=\",null\");o&&(i+=\",\"+o);a&&(i+=(o?\"\":\",null\")+\",\"+a);return i+\")\"}(e,t);var n;if(e.component)n=function(e,t,n){var r=t.inlineTemplate?null:qa(t,n,!0);return\"_c(\"+e+\",\"+Va(t,n)+(r?\",\"+r:\"\")+\")\"}(e.component,e,t);else{var r;(!e.plain||e.pre&&t.maybeComponent(e))&&(r=Va(e,t));var i=e.inlineTemplate?null:qa(e,t,!0);n=\"_c('\"+e.tag+\"'\"+(r?\",\"+r:\"\")+(i?\",\"+i:\"\")+\")\"}for(var o=0;o>>0}(a):\"\")+\")\"}(e,e.scopedSlots,t)+\",\"),e.model&&(n+=\"model:{value:\"+e.model.value+\",callback:\"+e.model.callback+\",expression:\"+e.model.expression+\"},\"),e.inlineTemplate){var o=function(e,t){var n=e.children[0];if(n&&1===n.type){var r=Pa(n,t.options);return\"inlineTemplate:{render:function(){\"+r.render+\"},staticRenderFns:[\"+r.staticRenderFns.map(function(e){return\"function(){\"+e+\"}\"}).join(\",\")+\"]}\"}}(e,t);o&&(n+=o+\",\")}return n=n.replace(/,$/,\"\")+\"}\",e.dynamicAttrs&&(n=\"_b(\"+n+',\"'+e.tag+'\",'+Ga(e.dynamicAttrs)+\")\"),e.wrapData&&(n=e.wrapData(n)),e.wrapListeners&&(n=e.wrapListeners(n)),n}function Ka(e){return 1===e.type&&(\"slot\"===e.tag||e.children.some(Ka))}function Ja(e,t){var n=e.attrsMap[\"slot-scope\"];if(e.if&&!e.ifProcessed&&!n)return Ua(e,t,Ja,\"null\");if(e.for&&!e.forProcessed)return za(e,t,Ja);var r=e.slotScope===ca?\"\":String(e.slotScope),i=\"function(\"+r+\"){return \"+(\"template\"===e.tag?e.if&&n?\"(\"+e.if+\")?\"+(qa(e,t)||\"undefined\")+\":undefined\":qa(e,t)||\"undefined\":Ra(e,t))+\"}\",o=r?\"\":\",proxy:true\";return\"{key:\"+(e.slotTarget||'\"default\"')+\",fn:\"+i+o+\"}\"}function qa(e,t,n,r,i){var o=e.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&\"template\"!==a.tag&&\"slot\"!==a.tag){var s=n?t.maybeComponent(a)?\",1\":\",0\":\"\";return\"\"+(r||Ra)(a,t)+s}var c=n?function(e,t){for(var n=0,r=0;r':'
    ',ts.innerHTML.indexOf(\" \")>0}var os=!!z&&is(!1),as=!!z&&is(!0),ss=g(function(e){var t=Yn(e);return t&&t.innerHTML}),cs=wn.prototype.$mount;return wn.prototype.$mount=function(e,t){if((e=e&&Yn(e))===document.body||e===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if(\"string\"==typeof r)\"#\"===r.charAt(0)&&(r=ss(r));else{if(!r.nodeType)return this;r=r.innerHTML}else e&&(r=function(e){if(e.outerHTML)return e.outerHTML;var t=document.createElement(\"div\");return t.appendChild(e.cloneNode(!0)),t.innerHTML}(e));if(r){var i=rs(r,{outputSourceRange:!1,shouldDecodeNewlines:os,shouldDecodeNewlinesForHref:as,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return cs.call(this,e,t)},wn.compile=rs,wn});","/*!\n * vuex v3.4.0\n * (c) 2020 Evan You\n * @license MIT\n */\n'use strict';\n\nfunction applyMixin (Vue) {\n var version = Number(Vue.version.split('.')[0]);\n\n if (version >= 2) {\n Vue.mixin({ beforeCreate: vuexInit });\n } else {\n // override init and inject vuex init procedure\n // for 1.x backwards compatibility.\n var _init = Vue.prototype._init;\n Vue.prototype._init = function (options) {\n if ( options === void 0 ) options = {};\n\n options.init = options.init\n ? [vuexInit].concat(options.init)\n : vuexInit;\n _init.call(this, options);\n };\n }\n\n /**\n * Vuex init hook, injected into each instances init hooks list.\n */\n\n function vuexInit () {\n var options = this.$options;\n // store injection\n if (options.store) {\n this.$store = typeof options.store === 'function'\n ? options.store()\n : options.store;\n } else if (options.parent && options.parent.$store) {\n this.$store = options.parent.$store;\n }\n }\n}\n\nvar target = typeof window !== 'undefined'\n ? window\n : typeof global !== 'undefined'\n ? global\n : {};\nvar devtoolHook = target.__VUE_DEVTOOLS_GLOBAL_HOOK__;\n\nfunction devtoolPlugin (store) {\n if (!devtoolHook) { return }\n\n store._devtoolHook = devtoolHook;\n\n devtoolHook.emit('vuex:init', store);\n\n devtoolHook.on('vuex:travel-to-state', function (targetState) {\n store.replaceState(targetState);\n });\n\n store.subscribe(function (mutation, state) {\n devtoolHook.emit('vuex:mutation', mutation, state);\n }, { prepend: true });\n\n store.subscribeAction(function (action, state) {\n devtoolHook.emit('vuex:action', action, state);\n }, { prepend: true });\n}\n\n/**\n * Get the first item that pass the test\n * by second argument function\n *\n * @param {Array} list\n * @param {Function} f\n * @return {*}\n */\n\n/**\n * forEach for object\n */\nfunction forEachValue (obj, fn) {\n Object.keys(obj).forEach(function (key) { return fn(obj[key], key); });\n}\n\nfunction isObject (obj) {\n return obj !== null && typeof obj === 'object'\n}\n\nfunction isPromise (val) {\n return val && typeof val.then === 'function'\n}\n\nfunction assert (condition, msg) {\n if (!condition) { throw new Error((\"[vuex] \" + msg)) }\n}\n\nfunction partial (fn, arg) {\n return function () {\n return fn(arg)\n }\n}\n\n// Base data struct for store's module, package with some attribute and method\nvar Module = function Module (rawModule, runtime) {\n this.runtime = runtime;\n // Store some children item\n this._children = Object.create(null);\n // Store the origin module object which passed by programmer\n this._rawModule = rawModule;\n var rawState = rawModule.state;\n\n // Store the origin module's state\n this.state = (typeof rawState === 'function' ? rawState() : rawState) || {};\n};\n\nvar prototypeAccessors = { namespaced: { configurable: true } };\n\nprototypeAccessors.namespaced.get = function () {\n return !!this._rawModule.namespaced\n};\n\nModule.prototype.addChild = function addChild (key, module) {\n this._children[key] = module;\n};\n\nModule.prototype.removeChild = function removeChild (key) {\n delete this._children[key];\n};\n\nModule.prototype.getChild = function getChild (key) {\n return this._children[key]\n};\n\nModule.prototype.hasChild = function hasChild (key) {\n return key in this._children\n};\n\nModule.prototype.update = function update (rawModule) {\n this._rawModule.namespaced = rawModule.namespaced;\n if (rawModule.actions) {\n this._rawModule.actions = rawModule.actions;\n }\n if (rawModule.mutations) {\n this._rawModule.mutations = rawModule.mutations;\n }\n if (rawModule.getters) {\n this._rawModule.getters = rawModule.getters;\n }\n};\n\nModule.prototype.forEachChild = function forEachChild (fn) {\n forEachValue(this._children, fn);\n};\n\nModule.prototype.forEachGetter = function forEachGetter (fn) {\n if (this._rawModule.getters) {\n forEachValue(this._rawModule.getters, fn);\n }\n};\n\nModule.prototype.forEachAction = function forEachAction (fn) {\n if (this._rawModule.actions) {\n forEachValue(this._rawModule.actions, fn);\n }\n};\n\nModule.prototype.forEachMutation = function forEachMutation (fn) {\n if (this._rawModule.mutations) {\n forEachValue(this._rawModule.mutations, fn);\n }\n};\n\nObject.defineProperties( Module.prototype, prototypeAccessors );\n\nvar ModuleCollection = function ModuleCollection (rawRootModule) {\n // register root module (Vuex.Store options)\n this.register([], rawRootModule, false);\n};\n\nModuleCollection.prototype.get = function get (path) {\n return path.reduce(function (module, key) {\n return module.getChild(key)\n }, this.root)\n};\n\nModuleCollection.prototype.getNamespace = function getNamespace (path) {\n var module = this.root;\n return path.reduce(function (namespace, key) {\n module = module.getChild(key);\n return namespace + (module.namespaced ? key + '/' : '')\n }, '')\n};\n\nModuleCollection.prototype.update = function update$1 (rawRootModule) {\n update([], this.root, rawRootModule);\n};\n\nModuleCollection.prototype.register = function register (path, rawModule, runtime) {\n var this$1 = this;\n if ( runtime === void 0 ) runtime = true;\n\n if ((\"development\" !== 'production')) {\n assertRawModule(path, rawModule);\n }\n\n var newModule = new Module(rawModule, runtime);\n if (path.length === 0) {\n this.root = newModule;\n } else {\n var parent = this.get(path.slice(0, -1));\n parent.addChild(path[path.length - 1], newModule);\n }\n\n // register nested modules\n if (rawModule.modules) {\n forEachValue(rawModule.modules, function (rawChildModule, key) {\n this$1.register(path.concat(key), rawChildModule, runtime);\n });\n }\n};\n\nModuleCollection.prototype.unregister = function unregister (path) {\n var parent = this.get(path.slice(0, -1));\n var key = path[path.length - 1];\n if (!parent.getChild(key).runtime) { return }\n\n parent.removeChild(key);\n};\n\nModuleCollection.prototype.isRegistered = function isRegistered (path) {\n var parent = this.get(path.slice(0, -1));\n var key = path[path.length - 1];\n\n return parent.hasChild(key)\n};\n\nfunction update (path, targetModule, newModule) {\n if ((\"development\" !== 'production')) {\n assertRawModule(path, newModule);\n }\n\n // update target module\n targetModule.update(newModule);\n\n // update nested modules\n if (newModule.modules) {\n for (var key in newModule.modules) {\n if (!targetModule.getChild(key)) {\n if ((\"development\" !== 'production')) {\n console.warn(\n \"[vuex] trying to add a new module '\" + key + \"' on hot reloading, \" +\n 'manual reload is needed'\n );\n }\n return\n }\n update(\n path.concat(key),\n targetModule.getChild(key),\n newModule.modules[key]\n );\n }\n }\n}\n\nvar functionAssert = {\n assert: function (value) { return typeof value === 'function'; },\n expected: 'function'\n};\n\nvar objectAssert = {\n assert: function (value) { return typeof value === 'function' ||\n (typeof value === 'object' && typeof value.handler === 'function'); },\n expected: 'function or object with \"handler\" function'\n};\n\nvar assertTypes = {\n getters: functionAssert,\n mutations: functionAssert,\n actions: objectAssert\n};\n\nfunction assertRawModule (path, rawModule) {\n Object.keys(assertTypes).forEach(function (key) {\n if (!rawModule[key]) { return }\n\n var assertOptions = assertTypes[key];\n\n forEachValue(rawModule[key], function (value, type) {\n assert(\n assertOptions.assert(value),\n makeAssertionMessage(path, key, type, value, assertOptions.expected)\n );\n });\n });\n}\n\nfunction makeAssertionMessage (path, key, type, value, expected) {\n var buf = key + \" should be \" + expected + \" but \\\"\" + key + \".\" + type + \"\\\"\";\n if (path.length > 0) {\n buf += \" in module \\\"\" + (path.join('.')) + \"\\\"\";\n }\n buf += \" is \" + (JSON.stringify(value)) + \".\";\n return buf\n}\n\nvar Vue; // bind on install\n\nvar Store = function Store (options) {\n var this$1 = this;\n if ( options === void 0 ) options = {};\n\n // Auto install if it is not done yet and `window` has `Vue`.\n // To allow users to avoid auto-installation in some cases,\n // this code should be placed here. See #731\n if (!Vue && typeof window !== 'undefined' && window.Vue) {\n install(window.Vue);\n }\n\n if ((\"development\" !== 'production')) {\n assert(Vue, \"must call Vue.use(Vuex) before creating a store instance.\");\n assert(typeof Promise !== 'undefined', \"vuex requires a Promise polyfill in this browser.\");\n assert(this instanceof Store, \"store must be called with the new operator.\");\n }\n\n var plugins = options.plugins; if ( plugins === void 0 ) plugins = [];\n var strict = options.strict; if ( strict === void 0 ) strict = false;\n\n // store internal state\n this._committing = false;\n this._actions = Object.create(null);\n this._actionSubscribers = [];\n this._mutations = Object.create(null);\n this._wrappedGetters = Object.create(null);\n this._modules = new ModuleCollection(options);\n this._modulesNamespaceMap = Object.create(null);\n this._subscribers = [];\n this._watcherVM = new Vue();\n this._makeLocalGettersCache = Object.create(null);\n\n // bind commit and dispatch to self\n var store = this;\n var ref = this;\n var dispatch = ref.dispatch;\n var commit = ref.commit;\n this.dispatch = function boundDispatch (type, payload) {\n return dispatch.call(store, type, payload)\n };\n this.commit = function boundCommit (type, payload, options) {\n return commit.call(store, type, payload, options)\n };\n\n // strict mode\n this.strict = strict;\n\n var state = this._modules.root.state;\n\n // init root module.\n // this also recursively registers all sub-modules\n // and collects all module getters inside this._wrappedGetters\n installModule(this, state, [], this._modules.root);\n\n // initialize the store vm, which is responsible for the reactivity\n // (also registers _wrappedGetters as computed properties)\n resetStoreVM(this, state);\n\n // apply plugins\n plugins.forEach(function (plugin) { return plugin(this$1); });\n\n var useDevtools = options.devtools !== undefined ? options.devtools : Vue.config.devtools;\n if (useDevtools) {\n devtoolPlugin(this);\n }\n};\n\nvar prototypeAccessors$1 = { state: { configurable: true } };\n\nprototypeAccessors$1.state.get = function () {\n return this._vm._data.$$state\n};\n\nprototypeAccessors$1.state.set = function (v) {\n if ((\"development\" !== 'production')) {\n assert(false, \"use store.replaceState() to explicit replace store state.\");\n }\n};\n\nStore.prototype.commit = function commit (_type, _payload, _options) {\n var this$1 = this;\n\n // check object-style commit\n var ref = unifyObjectStyle(_type, _payload, _options);\n var type = ref.type;\n var payload = ref.payload;\n var options = ref.options;\n\n var mutation = { type: type, payload: payload };\n var entry = this._mutations[type];\n if (!entry) {\n if ((\"development\" !== 'production')) {\n console.error((\"[vuex] unknown mutation type: \" + type));\n }\n return\n }\n this._withCommit(function () {\n entry.forEach(function commitIterator (handler) {\n handler(payload);\n });\n });\n\n this._subscribers\n .slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe\n .forEach(function (sub) { return sub(mutation, this$1.state); });\n\n if (\n (\"development\" !== 'production') &&\n options && options.silent\n ) {\n console.warn(\n \"[vuex] mutation type: \" + type + \". Silent option has been removed. \" +\n 'Use the filter functionality in the vue-devtools'\n );\n }\n};\n\nStore.prototype.dispatch = function dispatch (_type, _payload) {\n var this$1 = this;\n\n // check object-style dispatch\n var ref = unifyObjectStyle(_type, _payload);\n var type = ref.type;\n var payload = ref.payload;\n\n var action = { type: type, payload: payload };\n var entry = this._actions[type];\n if (!entry) {\n if ((\"development\" !== 'production')) {\n console.error((\"[vuex] unknown action type: \" + type));\n }\n return\n }\n\n try {\n this._actionSubscribers\n .slice() // shallow copy to prevent iterator invalidation if subscriber synchronously calls unsubscribe\n .filter(function (sub) { return sub.before; })\n .forEach(function (sub) { return sub.before(action, this$1.state); });\n } catch (e) {\n if ((\"development\" !== 'production')) {\n console.warn(\"[vuex] error in before action subscribers: \");\n console.error(e);\n }\n }\n\n var result = entry.length > 1\n ? Promise.all(entry.map(function (handler) { return handler(payload); }))\n : entry[0](payload);\n\n return new Promise(function (resolve, reject) {\n result.then(function (res) {\n try {\n this$1._actionSubscribers\n .filter(function (sub) { return sub.after; })\n .forEach(function (sub) { return sub.after(action, this$1.state); });\n } catch (e) {\n if ((\"development\" !== 'production')) {\n console.warn(\"[vuex] error in after action subscribers: \");\n console.error(e);\n }\n }\n resolve(res);\n }, function (error) {\n try {\n this$1._actionSubscribers\n .filter(function (sub) { return sub.error; })\n .forEach(function (sub) { return sub.error(action, this$1.state, error); });\n } catch (e) {\n if ((\"development\" !== 'production')) {\n console.warn(\"[vuex] error in error action subscribers: \");\n console.error(e);\n }\n }\n reject(error);\n });\n })\n};\n\nStore.prototype.subscribe = function subscribe (fn, options) {\n return genericSubscribe(fn, this._subscribers, options)\n};\n\nStore.prototype.subscribeAction = function subscribeAction (fn, options) {\n var subs = typeof fn === 'function' ? { before: fn } : fn;\n return genericSubscribe(subs, this._actionSubscribers, options)\n};\n\nStore.prototype.watch = function watch (getter, cb, options) {\n var this$1 = this;\n\n if ((\"development\" !== 'production')) {\n assert(typeof getter === 'function', \"store.watch only accepts a function.\");\n }\n return this._watcherVM.$watch(function () { return getter(this$1.state, this$1.getters); }, cb, options)\n};\n\nStore.prototype.replaceState = function replaceState (state) {\n var this$1 = this;\n\n this._withCommit(function () {\n this$1._vm._data.$$state = state;\n });\n};\n\nStore.prototype.registerModule = function registerModule (path, rawModule, options) {\n if ( options === void 0 ) options = {};\n\n if (typeof path === 'string') { path = [path]; }\n\n if ((\"development\" !== 'production')) {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n assert(path.length > 0, 'cannot register the root module by using registerModule.');\n }\n\n this._modules.register(path, rawModule);\n installModule(this, this.state, path, this._modules.get(path), options.preserveState);\n // reset store to update getters...\n resetStoreVM(this, this.state);\n};\n\nStore.prototype.unregisterModule = function unregisterModule (path) {\n var this$1 = this;\n\n if (typeof path === 'string') { path = [path]; }\n\n if ((\"development\" !== 'production')) {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n }\n\n this._modules.unregister(path);\n this._withCommit(function () {\n var parentState = getNestedState(this$1.state, path.slice(0, -1));\n Vue.delete(parentState, path[path.length - 1]);\n });\n resetStore(this);\n};\n\nStore.prototype.hasModule = function hasModule (path) {\n if (typeof path === 'string') { path = [path]; }\n\n if ((\"development\" !== 'production')) {\n assert(Array.isArray(path), \"module path must be a string or an Array.\");\n }\n\n return this._modules.isRegistered(path)\n};\n\nStore.prototype.hotUpdate = function hotUpdate (newOptions) {\n this._modules.update(newOptions);\n resetStore(this, true);\n};\n\nStore.prototype._withCommit = function _withCommit (fn) {\n var committing = this._committing;\n this._committing = true;\n fn();\n this._committing = committing;\n};\n\nObject.defineProperties( Store.prototype, prototypeAccessors$1 );\n\nfunction genericSubscribe (fn, subs, options) {\n if (subs.indexOf(fn) < 0) {\n options && options.prepend\n ? subs.unshift(fn)\n : subs.push(fn);\n }\n return function () {\n var i = subs.indexOf(fn);\n if (i > -1) {\n subs.splice(i, 1);\n }\n }\n}\n\nfunction resetStore (store, hot) {\n store._actions = Object.create(null);\n store._mutations = Object.create(null);\n store._wrappedGetters = Object.create(null);\n store._modulesNamespaceMap = Object.create(null);\n var state = store.state;\n // init all modules\n installModule(store, state, [], store._modules.root, true);\n // reset vm\n resetStoreVM(store, state, hot);\n}\n\nfunction resetStoreVM (store, state, hot) {\n var oldVm = store._vm;\n\n // bind store public getters\n store.getters = {};\n // reset local getters cache\n store._makeLocalGettersCache = Object.create(null);\n var wrappedGetters = store._wrappedGetters;\n var computed = {};\n forEachValue(wrappedGetters, function (fn, key) {\n // use computed to leverage its lazy-caching mechanism\n // direct inline function use will lead to closure preserving oldVm.\n // using partial to return function with only arguments preserved in closure environment.\n computed[key] = partial(fn, store);\n Object.defineProperty(store.getters, key, {\n get: function () { return store._vm[key]; },\n enumerable: true // for local getters\n });\n });\n\n // use a Vue instance to store the state tree\n // suppress warnings just in case the user has added\n // some funky global mixins\n var silent = Vue.config.silent;\n Vue.config.silent = true;\n store._vm = new Vue({\n data: {\n $$state: state\n },\n computed: computed\n });\n Vue.config.silent = silent;\n\n // enable strict mode for new vm\n if (store.strict) {\n enableStrictMode(store);\n }\n\n if (oldVm) {\n if (hot) {\n // dispatch changes in all subscribed watchers\n // to force getter re-evaluation for hot reloading.\n store._withCommit(function () {\n oldVm._data.$$state = null;\n });\n }\n Vue.nextTick(function () { return oldVm.$destroy(); });\n }\n}\n\nfunction installModule (store, rootState, path, module, hot) {\n var isRoot = !path.length;\n var namespace = store._modules.getNamespace(path);\n\n // register in namespace map\n if (module.namespaced) {\n if (store._modulesNamespaceMap[namespace] && (\"development\" !== 'production')) {\n console.error((\"[vuex] duplicate namespace \" + namespace + \" for the namespaced module \" + (path.join('/'))));\n }\n store._modulesNamespaceMap[namespace] = module;\n }\n\n // set state\n if (!isRoot && !hot) {\n var parentState = getNestedState(rootState, path.slice(0, -1));\n var moduleName = path[path.length - 1];\n store._withCommit(function () {\n if ((\"development\" !== 'production')) {\n if (moduleName in parentState) {\n console.warn(\n (\"[vuex] state field \\\"\" + moduleName + \"\\\" was overridden by a module with the same name at \\\"\" + (path.join('.')) + \"\\\"\")\n );\n }\n }\n Vue.set(parentState, moduleName, module.state);\n });\n }\n\n var local = module.context = makeLocalContext(store, namespace, path);\n\n module.forEachMutation(function (mutation, key) {\n var namespacedType = namespace + key;\n registerMutation(store, namespacedType, mutation, local);\n });\n\n module.forEachAction(function (action, key) {\n var type = action.root ? key : namespace + key;\n var handler = action.handler || action;\n registerAction(store, type, handler, local);\n });\n\n module.forEachGetter(function (getter, key) {\n var namespacedType = namespace + key;\n registerGetter(store, namespacedType, getter, local);\n });\n\n module.forEachChild(function (child, key) {\n installModule(store, rootState, path.concat(key), child, hot);\n });\n}\n\n/**\n * make localized dispatch, commit, getters and state\n * if there is no namespace, just use root ones\n */\nfunction makeLocalContext (store, namespace, path) {\n var noNamespace = namespace === '';\n\n var local = {\n dispatch: noNamespace ? store.dispatch : function (_type, _payload, _options) {\n var args = unifyObjectStyle(_type, _payload, _options);\n var payload = args.payload;\n var options = args.options;\n var type = args.type;\n\n if (!options || !options.root) {\n type = namespace + type;\n if ((\"development\" !== 'production') && !store._actions[type]) {\n console.error((\"[vuex] unknown local action type: \" + (args.type) + \", global type: \" + type));\n return\n }\n }\n\n return store.dispatch(type, payload)\n },\n\n commit: noNamespace ? store.commit : function (_type, _payload, _options) {\n var args = unifyObjectStyle(_type, _payload, _options);\n var payload = args.payload;\n var options = args.options;\n var type = args.type;\n\n if (!options || !options.root) {\n type = namespace + type;\n if ((\"development\" !== 'production') && !store._mutations[type]) {\n console.error((\"[vuex] unknown local mutation type: \" + (args.type) + \", global type: \" + type));\n return\n }\n }\n\n store.commit(type, payload, options);\n }\n };\n\n // getters and state object must be gotten lazily\n // because they will be changed by vm update\n Object.defineProperties(local, {\n getters: {\n get: noNamespace\n ? function () { return store.getters; }\n : function () { return makeLocalGetters(store, namespace); }\n },\n state: {\n get: function () { return getNestedState(store.state, path); }\n }\n });\n\n return local\n}\n\nfunction makeLocalGetters (store, namespace) {\n if (!store._makeLocalGettersCache[namespace]) {\n var gettersProxy = {};\n var splitPos = namespace.length;\n Object.keys(store.getters).forEach(function (type) {\n // skip if the target getter is not match this namespace\n if (type.slice(0, splitPos) !== namespace) { return }\n\n // extract local getter type\n var localType = type.slice(splitPos);\n\n // Add a port to the getters proxy.\n // Define as getter property because\n // we do not want to evaluate the getters in this time.\n Object.defineProperty(gettersProxy, localType, {\n get: function () { return store.getters[type]; },\n enumerable: true\n });\n });\n store._makeLocalGettersCache[namespace] = gettersProxy;\n }\n\n return store._makeLocalGettersCache[namespace]\n}\n\nfunction registerMutation (store, type, handler, local) {\n var entry = store._mutations[type] || (store._mutations[type] = []);\n entry.push(function wrappedMutationHandler (payload) {\n handler.call(store, local.state, payload);\n });\n}\n\nfunction registerAction (store, type, handler, local) {\n var entry = store._actions[type] || (store._actions[type] = []);\n entry.push(function wrappedActionHandler (payload) {\n var res = handler.call(store, {\n dispatch: local.dispatch,\n commit: local.commit,\n getters: local.getters,\n state: local.state,\n rootGetters: store.getters,\n rootState: store.state\n }, payload);\n if (!isPromise(res)) {\n res = Promise.resolve(res);\n }\n if (store._devtoolHook) {\n return res.catch(function (err) {\n store._devtoolHook.emit('vuex:error', err);\n throw err\n })\n } else {\n return res\n }\n });\n}\n\nfunction registerGetter (store, type, rawGetter, local) {\n if (store._wrappedGetters[type]) {\n if ((\"development\" !== 'production')) {\n console.error((\"[vuex] duplicate getter key: \" + type));\n }\n return\n }\n store._wrappedGetters[type] = function wrappedGetter (store) {\n return rawGetter(\n local.state, // local state\n local.getters, // local getters\n store.state, // root state\n store.getters // root getters\n )\n };\n}\n\nfunction enableStrictMode (store) {\n store._vm.$watch(function () { return this._data.$$state }, function () {\n if ((\"development\" !== 'production')) {\n assert(store._committing, \"do not mutate vuex store state outside mutation handlers.\");\n }\n }, { deep: true, sync: true });\n}\n\nfunction getNestedState (state, path) {\n return path.reduce(function (state, key) { return state[key]; }, state)\n}\n\nfunction unifyObjectStyle (type, payload, options) {\n if (isObject(type) && type.type) {\n options = payload;\n payload = type;\n type = type.type;\n }\n\n if ((\"development\" !== 'production')) {\n assert(typeof type === 'string', (\"expects string as the type, but found \" + (typeof type) + \".\"));\n }\n\n return { type: type, payload: payload, options: options }\n}\n\nfunction install (_Vue) {\n if (Vue && _Vue === Vue) {\n if ((\"development\" !== 'production')) {\n console.error(\n '[vuex] already installed. Vue.use(Vuex) should be called only once.'\n );\n }\n return\n }\n Vue = _Vue;\n applyMixin(Vue);\n}\n\n/**\n * Reduce the code which written in Vue.js for getting the state.\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} states # Object's item can be a function which accept state and getters for param, you can do something for state and getters in it.\n * @param {Object}\n */\nvar mapState = normalizeNamespace(function (namespace, states) {\n var res = {};\n if ((\"development\" !== 'production') && !isValidMap(states)) {\n console.error('[vuex] mapState: mapper parameter must be either an Array or an Object');\n }\n normalizeMap(states).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedState () {\n var state = this.$store.state;\n var getters = this.$store.getters;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapState', namespace);\n if (!module) {\n return\n }\n state = module.context.state;\n getters = module.context.getters;\n }\n return typeof val === 'function'\n ? val.call(this, state, getters)\n : state[val]\n };\n // mark vuex getter for devtools\n res[key].vuex = true;\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for committing the mutation\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} mutations # Object's item can be a function which accept `commit` function as the first param, it can accept anthor params. You can commit mutation and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapMutations = normalizeNamespace(function (namespace, mutations) {\n var res = {};\n if ((\"development\" !== 'production') && !isValidMap(mutations)) {\n console.error('[vuex] mapMutations: mapper parameter must be either an Array or an Object');\n }\n normalizeMap(mutations).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedMutation () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // Get the commit method from store\n var commit = this.$store.commit;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapMutations', namespace);\n if (!module) {\n return\n }\n commit = module.context.commit;\n }\n return typeof val === 'function'\n ? val.apply(this, [commit].concat(args))\n : commit.apply(this.$store, [val].concat(args))\n };\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for getting the getters\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} getters\n * @return {Object}\n */\nvar mapGetters = normalizeNamespace(function (namespace, getters) {\n var res = {};\n if ((\"development\" !== 'production') && !isValidMap(getters)) {\n console.error('[vuex] mapGetters: mapper parameter must be either an Array or an Object');\n }\n normalizeMap(getters).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n // The namespace has been mutated by normalizeNamespace\n val = namespace + val;\n res[key] = function mappedGetter () {\n if (namespace && !getModuleByNamespace(this.$store, 'mapGetters', namespace)) {\n return\n }\n if ((\"development\" !== 'production') && !(val in this.$store.getters)) {\n console.error((\"[vuex] unknown getter: \" + val));\n return\n }\n return this.$store.getters[val]\n };\n // mark vuex getter for devtools\n res[key].vuex = true;\n });\n return res\n});\n\n/**\n * Reduce the code which written in Vue.js for dispatch the action\n * @param {String} [namespace] - Module's namespace\n * @param {Object|Array} actions # Object's item can be a function which accept `dispatch` function as the first param, it can accept anthor params. You can dispatch action and do any other things in this function. specially, You need to pass anthor params from the mapped function.\n * @return {Object}\n */\nvar mapActions = normalizeNamespace(function (namespace, actions) {\n var res = {};\n if ((\"development\" !== 'production') && !isValidMap(actions)) {\n console.error('[vuex] mapActions: mapper parameter must be either an Array or an Object');\n }\n normalizeMap(actions).forEach(function (ref) {\n var key = ref.key;\n var val = ref.val;\n\n res[key] = function mappedAction () {\n var args = [], len = arguments.length;\n while ( len-- ) args[ len ] = arguments[ len ];\n\n // get dispatch function from store\n var dispatch = this.$store.dispatch;\n if (namespace) {\n var module = getModuleByNamespace(this.$store, 'mapActions', namespace);\n if (!module) {\n return\n }\n dispatch = module.context.dispatch;\n }\n return typeof val === 'function'\n ? val.apply(this, [dispatch].concat(args))\n : dispatch.apply(this.$store, [val].concat(args))\n };\n });\n return res\n});\n\n/**\n * Rebinding namespace param for mapXXX function in special scoped, and return them by simple object\n * @param {String} namespace\n * @return {Object}\n */\nvar createNamespacedHelpers = function (namespace) { return ({\n mapState: mapState.bind(null, namespace),\n mapGetters: mapGetters.bind(null, namespace),\n mapMutations: mapMutations.bind(null, namespace),\n mapActions: mapActions.bind(null, namespace)\n}); };\n\n/**\n * Normalize the map\n * normalizeMap([1, 2, 3]) => [ { key: 1, val: 1 }, { key: 2, val: 2 }, { key: 3, val: 3 } ]\n * normalizeMap({a: 1, b: 2, c: 3}) => [ { key: 'a', val: 1 }, { key: 'b', val: 2 }, { key: 'c', val: 3 } ]\n * @param {Array|Object} map\n * @return {Object}\n */\nfunction normalizeMap (map) {\n if (!isValidMap(map)) {\n return []\n }\n return Array.isArray(map)\n ? map.map(function (key) { return ({ key: key, val: key }); })\n : Object.keys(map).map(function (key) { return ({ key: key, val: map[key] }); })\n}\n\n/**\n * Validate whether given map is valid or not\n * @param {*} map\n * @return {Boolean}\n */\nfunction isValidMap (map) {\n return Array.isArray(map) || isObject(map)\n}\n\n/**\n * Return a function expect two param contains namespace and map. it will normalize the namespace and then the param's function will handle the new namespace and the map.\n * @param {Function} fn\n * @return {Function}\n */\nfunction normalizeNamespace (fn) {\n return function (namespace, map) {\n if (typeof namespace !== 'string') {\n map = namespace;\n namespace = '';\n } else if (namespace.charAt(namespace.length - 1) !== '/') {\n namespace += '/';\n }\n return fn(namespace, map)\n }\n}\n\n/**\n * Search a special module from store by namespace. if module not exist, print error message.\n * @param {Object} store\n * @param {String} helper\n * @param {String} namespace\n * @return {Object}\n */\nfunction getModuleByNamespace (store, helper, namespace) {\n var module = store._modulesNamespaceMap[namespace];\n if ((\"development\" !== 'production') && !module) {\n console.error((\"[vuex] module namespace not found in \" + helper + \"(): \" + namespace));\n }\n return module\n}\n\nvar index_cjs = {\n Store: Store,\n install: install,\n version: '3.4.0',\n mapState: mapState,\n mapMutations: mapMutations,\n mapGetters: mapGetters,\n mapActions: mapActions,\n createNamespacedHelpers: createNamespacedHelpers\n};\n\nmodule.exports = index_cjs;\n","module.exports = \"
    {{b.label}} {{b.mobileLabel}}
    {{disabledMessage}}
    \";\n","module.exports = \"
    {{data.loadingMessage}}
    \";\n","module.exports = \"
    \";\n","module.exports = \"

    {{title}}

    \";\n","module.exports = \"
    \";\n","module.exports = \"

    {{title}}

    {{switcherField.left.label}} {{switcherField.right.label}}
    {{description}}
    {{inputErrorMessage}}
    \";\n","module.exports = \"
    \";\n","module.exports = \"\";\n","module.exports = \"\";\n","module.exports = \"
    • {{s.label}}{{s.selectedValue}}
    \";\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvYm9va21hcmtzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2NvbXBvbmVudC1tb2R1bGUuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvY29udGFjdC11cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9jdGEtYmFyLWJvdHRvbS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9jdGEtYmFyLXRvcC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9kb2N1bWVudGF0aW9uLWNvbnRleHR1YWwuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvZG9jdW1lbnRhdGlvbi5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9kcmF3ZXIuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvZXZlbnQtYnVzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2ZldGNoZXIuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvZmlsdGVyLWNvbXBvbmVudHMuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvZm9vdGVyLXVuaXRzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2Z3LW1lZGlhLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2dlbmVyaWMtbW9kYWwuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvaGVyby1wcm9kdWN0cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9ob21lLWhlcm8uanMiLCJhc3NldHMvc2NyaXB0cy9saWIvaG93LWl0LXdvcmtzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2ludGVybmFsLXNlYXJjaC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9sZWdhbC1jb21wbGlhbmNlLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL2xpdC1vcmRlci5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tYXJrZXQtYXBwbGljYXRpb25zLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21lZ2FtZW51LmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21lbnUtdG9wLWJhci5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tZXRlci1zZWxlY3Rvci9idXR0b24tc2V0LmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21ldGVyLXNlbGVjdG9yL2ZyYW1lLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21ldGVyLXNlbGVjdG9yL2lucHV0LWJveC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tZXRlci1zZWxlY3Rvci9zdGVwLWJhci5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9taXNjLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21vZGFsLXRyaWdnZXIuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvbW9kYWxzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21vZHVsZXMvYWZmaWxpYXRlcy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL2ZpbmQtZGlzdHJpYnV0b3IuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvbW9kdWxlcy9nbG9iYWwtbWVzc2FnZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL2luZGV4LmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21vZHVsZXMvbG9jYXRpb25zLW1hcC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL21ldGVyLXNlbGVjdG9yLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL21vZHVsZXMvbXktc2F2ZWQtcGFnZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL3JlY2VudC1wb3N0cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9tb2R1bGVzL3NvbHV0aW9uLWFyZWEuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvcGFyZG90LWZvcm0uanMiLCJhc3NldHMvc2NyaXB0cy9saWIvcGF0ZW50cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9wcm9kdWN0LWNhdGFsb2cuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvcHJvZHVjdHMtYWNjZXNzb3JpZXMuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvcXVpY2stbGlua3MuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc2VhcmNoLXJlc3VsdHMuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc2xpZGVzaG93LmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL3NvZnR3YXJlLWNhcmQuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc29mdHdhcmUtZmlybXdhcmUuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc3BlYy10YWJsZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9zcGVjaWZpY2F0aW9ucy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi9zdG9yYWdlLW1hbmFnZXIuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc3RvcmUuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvc3ViLW5hdi5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90YWJzLmpzIiwiYXNzZXRzL3NjcmlwdHMvbGliL3RlbXBsYXRlLXN0cmluZ3MvbXktc2F2ZWQtcGFnZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90ZW1wbGF0ZS1zdHJpbmdzL3JlY2VudC1wb3N0cy5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90ZW1wbGF0ZS1zdHJpbmdzL3NvbHV0aW9uLWFyZWEuanMiLCJhc3NldHMvc2NyaXB0cy9saWIvdGVtcGxhdGUtc3RyaW5ncy90YWJzLWNvbXBvbmVudC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90ZXN0aW1vbmlhbC5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi90aW1lbGluZS5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi92aWRlby1wbGF5ZXItbGluay5qcyIsImFzc2V0cy9zY3JpcHRzL2xpYi92aWRlby1wbGF5ZXIuanMiLCJhc3NldHMvc2NyaXB0cy9tYWluLmpzIiwiYXNzZXRzL3NjcmlwdHMvcG9seWZpbGxzL2VsZW1lbnQuY2xvc2VzdC5qcyIsImFzc2V0cy9zY3JpcHRzL3BvbHlmaWxscy9tYXRjaE1lZGlhLmpzIiwiZGIuanNvbiIsIm5vZGVfbW9kdWxlcy9AcG9wcGVyanMvY29yZS9kaXN0L2Nqcy9wb3BwZXIuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2FkYXB0ZXJzL3hoci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvYXhpb3MuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NhbmNlbC9DYW5jZWxUb2tlbi5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY2FuY2VsL2lzQ2FuY2VsLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0F4aW9zLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL0ludGVyY2VwdG9yTWFuYWdlci5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9idWlsZEZ1bGxQYXRoLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2NyZWF0ZUVycm9yLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL2Rpc3BhdGNoUmVxdWVzdC5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvY29yZS9lbmhhbmNlRXJyb3IuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvbWVyZ2VDb25maWcuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2NvcmUvc2V0dGxlLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9jb3JlL3RyYW5zZm9ybURhdGEuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2RlZmF1bHRzLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2JpbmQuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvYnVpbGRVUkwuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29tYmluZVVSTHMuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL2hlbHBlcnMvY29va2llcy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9pc0Fic29sdXRlVVJMLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL2lzVVJMU2FtZU9yaWdpbi5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9ub3JtYWxpemVIZWFkZXJOYW1lLmpzIiwibm9kZV9tb2R1bGVzL2F4aW9zL2xpYi9oZWxwZXJzL3BhcnNlSGVhZGVycy5qcyIsIm5vZGVfbW9kdWxlcy9heGlvcy9saWIvaGVscGVycy9zcHJlYWQuanMiLCJub2RlX21vZHVsZXMvYXhpb3MvbGliL3V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvYXJyYXkvZmluZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL2FycmF5L2Zyb20uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9lcy9hcnJheS9pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzL29iamVjdC9hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9lcy9wcm9taXNlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3RyaW5nL2luY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvZXMvc3ltYm9sL2l0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvZmVhdHVyZXMvcHJvbWlzZS9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hLWZ1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1pbnN0YW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hbi1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvYXJyYXktZnJvbS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9hcnJheS1tZXRob2RzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2FycmF5LXNwZWNpZXMtY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2JpbmQtY29udGV4dC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi1yYXcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jb3B5LWNvbnN0cnVjdG9yLXByb3BlcnRpZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1pcy1yZWdleHAtbG9naWMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvY29ycmVjdC1wcm90b3R5cGUtZ2V0dGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2NyZWF0ZS1pdGVyYXRvci1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2RlZmluZS13ZWxsLWtub3duLXN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9kb20taXRlcmFibGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2VudHJ5LXVuYmluZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2V4cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mYWlscy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9mdW5jdGlvbi10by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hhcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRkZW4ta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2hvc3QtcmVwb3J0LWVycm9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9odG1sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2luZGV4ZWQtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLWFycmF5LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1hcnJheS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9pcy1mb3JjZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2lzLXB1cmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXMtcmVnZXhwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL2l0ZXJhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvaXRlcmF0b3JzLWNvcmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25hdGl2ZS1zeW1ib2wuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvbmF0aXZlLXdlYWstbWFwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWFzc2lnbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydGllcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy1pbnRlcm5hbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtcHJvcGVydHktaXMtZW51bWVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3Qtc2V0LXByb3RvdHlwZS1vZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9vYmplY3QtdG8tc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL293bi1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3BhdGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcGVyZm9ybS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9wcm9taXNlLXJlc29sdmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy9zZXQtZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NldC10by1zdHJpbmctdGFnLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NoYXJlZC1rZXkuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvc3RyaW5nLWF0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8taW50ZWdlci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy90by1sZW5ndGguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvaW50ZXJuYWxzL3RvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy91aWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9pbnRlcm5hbHMvdXNlci1hZ2VudC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1zZXQtcHJvdG90eXBlLW9mLWFyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2ludGVybmFscy93cmFwcGVkLXdlbGwta25vd24tc3ltYm9sLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5maW5kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5mcm9tLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuYXJyYXkuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC5hc3NpZ24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnByb21pc2UuZmluYWxseS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMucHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXMuc3RyaW5nLmluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LmFnZ3JlZ2F0ZS1lcnJvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYWxsLXNldHRsZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFueS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXNuZXh0LnByb21pc2UudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2ludGVyc2VjdGlvbi1vYnNlcnZlci9pbnRlcnNlY3Rpb24tb2JzZXJ2ZXIuanMiLCJub2RlX21vZHVsZXMvbG9yeS5qcy9kaXN0L2xvcnkuanMiLCJub2RlX21vZHVsZXMvbm9kZWxpc3QtZm9yZWFjaC1wb2x5ZmlsbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wcm9jZXNzL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvcXMvbGliL2Zvcm1hdHMuanMiLCJub2RlX21vZHVsZXMvcXMvbGliL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3FzL2xpYi9wYXJzZS5qcyIsIm5vZGVfbW9kdWxlcy9xcy9saWIvc3RyaW5naWZ5LmpzIiwibm9kZV9tb2R1bGVzL3FzL2xpYi91dGlscy5qcyIsIm5vZGVfbW9kdWxlcy9zaG93ZG93bi9kaXN0L3Nob3dkb3duLmpzIiwibm9kZV9tb2R1bGVzL3RpbWVycy1icm93c2VyaWZ5L21haW4uanMiLCJub2RlX21vZHVsZXMvdGlwcHkuanMvZGlzdC90aXBweS5janMuanMiLCJub2RlX21vZHVsZXMvdnVlLWpzLW1vZGFsL2Rpc3QvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdnVlL2Rpc3QvdnVlLm1pbi5qcyIsIm5vZGVfbW9kdWxlcy92dWV4L2Rpc3QvdnVleC5jb21tb24uanMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItYnV0dG9uLXNldC5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItY29udGVudC5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItZnJhbWUtcXVlc3Rpb24uaGJzIiwidmlld3MvcGFydGlhbHMvc2hhcmVkL21ldGVyLXNlbGVjdG9yLWZyYW1lLXNlcGFyYXRvci5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItZnJhbWUuaGJzIiwidmlld3MvcGFydGlhbHMvc2hhcmVkL21ldGVyLXNlbGVjdG9yLWlucHV0LWJveC5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItcGFnaW5hdG9yLmhicyIsInZpZXdzL3BhcnRpYWxzL3NoYXJlZC9tZXRlci1zZWxlY3Rvci1wcm9kdWN0LWl0ZW0taC5oYnMiLCJ2aWV3cy9wYXJ0aWFscy9zaGFyZWQvbWV0ZXItc2VsZWN0b3ItcHJvZHVjdC1pdGVtLXYuaGJzIiwidmlld3MvcGFydGlhbHMvc2hhcmVkL21ldGVyLXNlbGVjdG9yLXN0ZXAtYmFyLmhicyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7QUNBQTs7QUFDQTs7OztBQUVBLElBQU0sU0FBUyxHQUFHLFNBQVosU0FBWSxHQUFNO0FBRXBCLE1BQUksYUFBYSxHQUFHLFFBQVEsQ0FBQyxnQkFBVCxDQUEwQixxQkFBMUIsQ0FBcEI7O0FBRUEsTUFBSSxtQkFBbUIsR0FBRyxTQUF0QixtQkFBc0IsQ0FBQyxFQUFELEVBQVE7QUFDOUIsdUJBQUksU0FBSixDQUFjLFVBQWQsRUFBMEI7QUFDdEIsTUFBQSxLQUFLLEVBQUUsQ0FBQyxNQUFELENBRGU7QUFFdEIsTUFBQSxJQUFJLEVBQUUsZ0JBQVc7QUFDYixlQUFPO0FBQ0gsVUFBQSxZQUFZLEVBQUUsS0FEWDtBQUVILFVBQUEsRUFBRSxFQUFFLElBRkQ7QUFHSCxVQUFBLElBQUksRUFBRTtBQUhILFNBQVA7QUFLSCxPQVJxQjtBQVN0QixNQUFBLFFBQVEsRUFBRTtBQUNOLFFBQUEsS0FBSyxFQUFFLGlCQUFXO0FBQ2QsaUJBQU8sa0JBQU0sS0FBTixDQUFZLFNBQVosV0FBeUIsS0FBSyxJQUE5QixFQUFQO0FBQ0g7QUFISyxPQVRZO0FBY3RCLE1BQUEsS0FBSyxFQUFFO0FBQ0gsUUFBQSxLQUFLLEVBQUUsaUJBQVc7QUFDZCxlQUFLLFlBQUwsR0FBb0IsS0FBSyxLQUFMLENBQVcsUUFBWCxDQUFvQixLQUFLLEVBQXpCLElBQStCLElBQS9CLEdBQXNDLEtBQTFEO0FBQ0g7QUFIRSxPQWRlO0FBbUJ0QixNQUFBLE9BQU8sRUFBRTtBQUNMLFFBQUEsY0FESyw0QkFDWTtBQUNiLDRCQUFNLE1BQU4sQ0FBYSxpQkFBYixFQUFnQztB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QTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzM4REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3B6REE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcExBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9FQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeFZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25HQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDYkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BXQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzE5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuZ0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNyaUtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0VBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwdUVBO0FBQ0E7OztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDcmtDQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcblxuY29uc3QgYm9va21hcmtzID0gKCkgPT4ge1xuXG4gICAgbGV0IGJvb2ttYXJrSXRlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuYm9va21hcmstY29udGFpbmVyJyk7XG5cbiAgICBsZXQgYm9va21hcmtDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdib29rbWFyaycsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzW2Ake3RoaXMudHlwZX1gXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNwYXRjaCgnY2hlY2tGYXZvcml0ZXMnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnByb2R1Y3RJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuYXJ0aWNsZUlkID8gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA6IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkID8gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgPyBcInByb2R1Y3RJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA/IFwiYXJ0aWNsZUlkXCIgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZCA/IFwiZG9jdW1lbnRJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQgPyBcInNvZnR3YXJlSWRcIiA6IG51bGw7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzYXZlZFwiLHRoaXMuc2F2ZWQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAuYm9va21hcmstY29udGFpbmVyLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAuYm9va21hcmstY29udGFpbmVyLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGJvb2ttYXJrSXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICBib29rbWFya0l0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYGJvb2ttYXJrLWNvbnRhaW5lci0ke2luZGV4fWApO1xuICAgICAgICAgICAgYm9va21hcmtDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGJvb2ttYXJrczsiLCIvKlxuICAgIE1FVEhPRFM6XG5cbiAgICAjIENvbXBvbmVudE1vZHVsZS5BZGRNb2R1bGUodGFyZ2V0LCBvcHRpb25zKVxuICAgICAgICAqIEFyZ3VtZW50czpcbiAgICAgICAgICAgIC0ge3N0cmluZ30gdGFyZ2V0XG4gICAgICAgICAgICAtIHtPYmplY3R9IG9wdGlvbnNcbiAgICAgICAgKiBVc2FnZTpcbiAgICAgICAgICAgUmVnaXN0ZXIgYSBNb2R1bGUuIFJlZ2lzdHJhdGlvbiBhbGxvd3Mgc3RhcnRpbmcgYSBuZXcgVnVlIGluc3RhbmNlIHdpdGggdGhlIGNvbmZpZ3VyYXRpb24gdGhhdCB5b3UgcHJvdmlkZSBpbiAnb3B0aW9ucycgb2JqZWN0LiAndGFyZ2V0JyBhcmd1bWVudCBpcyB1c2VkIHRvIGZpbmQgdGhlIGVsZW1lbnRzIGluIHRoZSBET00gYW5kIHByb3ZpZGVzIHRoZSBWdWUgaW5zdGFuY2UgYW4gZXhpc3RpbmcgRE9NIGVsZW1lbnQgdG8gbW91bnQgb24uIEl0IGNhbiBiZSBhIENTUyBzZWxlY3RvciBzdHJpbmcuXG5cbiAgICAjIENvbXBvbmVudE1vZHVsZS5Jbml0OlxuICAgICAgICBUaGUgZnVuY3Rpb24gdGhhdCBpbml0aWFsaXplcyBldmVyeSBNb2R1bGUgYWRkZWQuXG5cbiAgICBPQkpFQ1RTOlxuXG4gICAgIyBPcHRpb25zXG4gICAgICAgIFdpdGggdGhlICdvcHRpb25zJyBhcmd1bWVudCBjYW4gcGFzcyB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBWdWUgKGh0dHBzOi8vdnVlanMub3JnL3YyL2FwaS8jT3B0aW9ucy1EYXRhKSBleGNlcHQgJ2VsJyBhbmQgJ2NvbXBvbmVudHMnIG9wdGlvbnMsIGFuZCBhZGRpdGlvbmFsbHkgdGhlIG5leHQgb3B0aW9uczpcblxuICAgICAgICAtIHthcnJheVtvYmplY3RdfSBjb21wb25lbnRzOlxuICAgICAgICAgIHRoaXMgd29ya3MgbGlrZSBMb2NhbCBSZWdpc3RyYXRpb24gQ29tcG9uZW50IGluIFZldSAoaHR0cHM6Ly92dWVqcy5vcmcvdjIvZ3VpZGUvY29tcG9uZW50cy1yZWdpc3RyYXRpb24uaHRtbCksIGp1c3QgaXMgYW4gYXJyYXkgaW4gcGxhY2Ugb2YgYW4gb2JqZWN0IGFuZCB0aGUgaWQgY29tcG9uZW50IG11c3QgYmUgaW4gdGhlICduYW1lJyBwYXJhbWV0ZXIuIGkuZTpcblxuICAgICAgICAgIFtEaXJlY3RseSBpbiBWVUVdOlxuXG4gICAgICAgICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgICAgIGVsOiAnI2FwcCcsXG4gICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICAgICAnY29tcG9uZW50LWEnOiBDb21wb25lbnRBLFxuICAgICAgICAgICAgICAgICAgICAnY29tcG9uZW50LWInOiBDb21wb25lbnRCXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgIFtIRVJFXTpcblxuICAgICAgICAgICAgICAuLi5cbiAgICAgICAgICAgICAgY29tcG9uZW50czogWyB7IG5hbWU6ICdjb21wb25lbnQtYScsIC4uLkNvbXBvbmVudEEgfSwgeyBuYW1lOiAnY29tcG9uZW50LWInLCAuLi5Db21wb25lbnRCIH0gXSxcbiAgICAgICAgICAgICAgLi4uXG5cbiAgICAgICAgLSB7c3RyaW5nfSBwcmVmaXg6XG4gICAgICAgICAgICB0aGlzIHdpbGwgYmUgYWRkZWQgdG8gZXZlcnkgaWQgY29tcG9uZW50IGFzIHByZWZpeCwgaS5lOlxuICAgICAgICAgICAgcHJlZml4ID0gXCJjb21wX1wiIGFuZCBjb21wb25lbnQubmFtZSA9IFwiZm9ybVwiLiBTbyB0aGUgZmluYWwgcmVzdWx0IHdpbGwgYmUgJ2NvbXBfZm9ybScgYXMgaWQgY29tcG9uZW50LlxuXG4gICAgICAgIC0ge3N0cmluZ30gaW5pdEZ1bmM6XG4gICAgICAgICAgICB0aGlzIGlzIGp1c3QgYSBzaW1wbGUgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgYmVmb3JlIHRvIGNyZWF0ZSB0aGUgVnVlIGluc3RhbmNlLCBmb3IgdGhlIHByZWNvbmRpdGlvbnNcblxuICAgICAgICAtIHtib29sZWFufSBtb3VudDpcbiAgICAgICAgICAgIHRoaXMgdmFsdWUgaXMgdHJ1ZSBieSBkZWZhdWx0LiBJZiB0aGUgdmFsdWUgaXMgdHJ1ZSwgd2lsbCBmb3JjZSB0aGUgaHlkcmF0aW9uIG9mIHRoZSBtb2R1bGUuXG5cbiovXG5cbmltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IENvbXBvbmVudE1vZHVsZSA9IHtcbiAgICBBZGRNb2R1bGU6ICh0YXJnZXQsIG9wdGlvbnMpID0+IHtcbiAgICAgICAgQ29tcG9uZW50TW9kdWxlLl9tb2R1bGVzLnB1c2goe3RhcmdldCwgLi4ub3B0aW9uc30pO1xuICAgIH0sXG5cbiAgICBJbml0OiAoKSA9PiB7XG4gICAgICAgIENvbXBvbmVudE1vZHVsZS5fbW9kdWxlcy5mb3JFYWNoKCh7IHByZWZpeCwgY29tcG9uZW50cywgaW5pdEZ1bmMsIHRhcmdldCwgdGVtcGxhdGUsIG1vdW50ID0gdHJ1ZSwgLi4udnVlT3B0aW9ucyB9KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBfcHJmeCA9IHByZWZpeCB8fCAnJztcbiAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0YXJnZXQpO1xuICAgICAgICAgICAgZm91bmQuZm9yRWFjaChlbCA9PiB7XG4gICAgICAgICAgICAgICAgaW5pdEZ1bmMgJiYgaW5pdEZ1bmMoVnVlKTtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBWdWUoe1xuICAgICAgICAgICAgICAgICAgICBlbDogIXRlbXBsYXRlICYmIGVsLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHM/LnJlZHVjZSgob2JqLCB7bmFtZSwgLi4ub3B0aW9uc30pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ialtfcHJmeCtuYW1lXSA9IG9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqO1xuICAgICAgICAgICAgICAgICAgICB9LCB7fSksXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAuLi52dWVPcHRpb25zLFxuICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICBtb3VudCAmJiBpbnN0YW5jZS4kbW91bnQoZWwsIHRydWUpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG59O1xuXG5Db21wb25lbnRNb2R1bGUuX21vZHVsZXMgPSBbXTtcblxuZXhwb3J0IGRlZmF1bHQgQ29tcG9uZW50TW9kdWxlO1xuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG4vLyBpbXBvcnQgeyBjb250YWN0TW9kYWwgfSBmcm9tIFwiLi9tb2RhbHNcIjtcblxuY29uc3QgQ29udGFjdFVzID0gKCkgPT4ge1xuICAgIFZ1ZS51c2UoVk1vZGFsKTtcblxuICAgIFZ1ZS5jb21wb25lbnQoJ2NvbnRhY3QtdXMnLCB7XG4gICAgICAgIHByb3BzOiBbJ2NvbnRhY3RPcGVuJ10sXG4gICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIHRvZ2dsZU1vZGFsKCkge1xuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdjbG9zZS1jb250YWN0Jyk7XG5cbiAgICAgICAgICAgICAgICAvLyB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgIC8vICAgICBjb250YWN0TW9kYWwudGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgLy8gICAgIGNvbnRhY3RNb2RhbC5uYW1lLFxuICAgICAgICAgICAgICAgIC8vICAgICBjb250YWN0TW9kYWwub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAvLyAgICAgY29udGFjdE1vZGFsLmV2ZW50c1xuICAgICAgICAgICAgICAgIC8vIClcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgIH1cbiAgICB9KTtcblxufVxuXG5leHBvcnQgZGVmYXVsdCBDb250YWN0VXM7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cydcbmltcG9ydCBDb250YWN0VXMgZnJvbSAnLi9jb250YWN0LXVzJztcblxuY29uc3QgY3RhQmFyQm90dG9tID0gKCkgPT4ge1xuICAgIGNvbnN0IGN0YUJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZXJzaXN0ZW50LWN0YS0tYm90dG9tJyk7XG5cbiAgICBsZXQgY3RhQmFyQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnY3RhLWJhci1ib3R0b20tdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpc1N0aWNreTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBzdG9yZS5zdGF0ZS5pc01vYmlsZSxcbiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc0ZpbmFsUG9zaXRpb246IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBvYnNlcnZlcjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbXB1dGVkSXNNb2JpbGUgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U2hvdygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRlY3RGb290ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSB0cnVlO1xuICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdzdGljay1uYXYnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3RpY2t5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCd1bnN0aWNrLW5hdicsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNGaW5hbFBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IHJldHVybjsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01vYmlsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9mZignc3RpY2stbmF2Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb2ZmKCd1bnN0aWNrLW5hdicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBlcnNpc3RlbnQtY3RhLS1ib3R0b20tZmluYWwnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wZXJzaXN0ZW50LWN0YS0tYm90dG9tJykuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZvb3RlcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlci5kaXNjb25uZWN0KHRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBpc1N0aWNreTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuY29udGFjdE9wZW4gPSB0aGlzLmlzU3RpY2t5ID8gdGhpcy5jb250YWN0T3BlbiA6IGZhbHNlOyBcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZUNvbnRhY3QoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdE9wZW4gPSAhdGhpcy5jb250YWN0T3BlbjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0aWNreU5hdigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykgJiYgIXRoaXMuaXNTdGlja3kgJiYgdGhpcy5jb21wdXRlZElzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5hZGQoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1bnN0aWNreU5hdigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNTdGlja3kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LnJlbW92ZShcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFNob3coKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNob3cgYm90dG9tIGFmdGVyIDMgc2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDMwMDApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGV0ZWN0Rm9vdGVyKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucz0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RNYXJnaW46ICcwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiAwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlU3RpY2t5ID0gKGNoYW5nZXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaChjaGFuZ2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKGNoYW5nZS5pbnRlcnNlY3Rpb25SYXRpbyA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNGaW5hbFBvc2l0aW9uID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5wZXJzaXN0ZW50LWN0YS0tYm90dG9tJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0ZpbmFsUG9zaXRpb24gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcucGVyc2lzdGVudC1jdGEtLWJvdHRvbScpLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoaGFuZGxlU3RpY2t5LCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlciA9IG9ic2VydmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmZvb3RlcicpO1xuXG4gICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3N0aWNrLW5hdicsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N0aWNreSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbigndW5zdGljay1uYXYnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc0ZpbmFsUG9zaXRpb24pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdGlja3lOYXYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNTdGlja3kgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyByZXR1cm47IH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2Nsb3NlLWNvbnRhY3QnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRTaG93KCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0Rm9vdGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBDb250YWN0VXMoKTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLnBlcnNpc3RlbnQtY3RhLS1ib3R0b20tJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICB9KS4kbW91bnQoYC5wZXJzaXN0ZW50LWN0YS0tYm90dG9tLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGN0YUJhci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGN0YUJhci5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBwZXJzaXN0ZW50LWN0YS0tYm90dG9tLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBjdGFCYXJDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGN0YUJhckJvdHRvbTsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcbmltcG9ydCBDb250YWN0VXMgZnJvbSAnLi9jb250YWN0LXVzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbi8vIGltcG9ydCB7cXVvdGVNb2RhbH0gZnJvbSAnLi9tb2RhbHMnO1xuXG5jb25zdCBjdGFCYXJUb3AgPSAoKSA9PiB7XG4gICAgY29uc3QgY3RhQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBlcnNpc3RlbnQtY3RhLS10b3AnKTtcbiAgICBWdWUudXNlKFZNb2RhbCk7XG5cbiAgICBsZXQgY3RhQmFyQ29uc3RydWN0b3IgPSAoKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2N0YS1iYXItdG9wLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6IHN0b3JlLnN0YXRlLnBhZ2VUaXRsZSB8fCAnJyxcbiAgICAgICAgICAgICAgICAgICAgc2hvd1RpdGxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgYW5jaG9yTGlua3M6IHt0ZXN0OiAndGVzdCd9LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50QW5jaG9yOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZTogc3RvcmUsIC8vZm9yIHRlc3Rpbmcgb25seVxuICAgICAgICAgICAgICAgICAgICBoYXNBbmNob3JzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRhY3RPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgY29udGFjdE9wZW5UZXh0OiAnJyxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuaGFuZGxlU2Nyb2xsKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVNjcm9sbCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlc3Ryb3llZDogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5oYW5kbGVTY3JvbGwpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSB0aGlzLmNvbXB1dGVkSXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuc2Nyb2xsRGlyZWN0aW9uKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxEaXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zY3JvbGxEaXIgPT0gXCJ1cFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0aWNreU5hdigpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc2Nyb2xsRGlyID09IFwiZG93blwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3RpY2t5TmF2KCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5zY3JvbGxEaXIgPT0gXCJ0b3BcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucGFyZW50Tm9kZS5jbGFzc0xpc3QucmVtb3ZlKFwiYWN0aXZlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb250YWN0T3BlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGFjdE9wZW5UZXh0ID0gdGhpcy5jb250YWN0T3BlbiA/ICcnIDogdGhpcy4kcmVmcy5jb250YWN0QnRuLnF1ZXJ5U2VsZWN0b3IoJy5idXR0b24tdGV4dCcpLmRhdGFzZXQub3BlblRleHQ7IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlU2Nyb2xsKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuJHBhcmVudC4kZWw7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdUb3AgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsVG9wIHx8IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlVG9wID0gdGhpcy5wYXJlbnRUb3AgfHwgZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudFRvcCA9PT0gbnVsbCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhcmVudFRvcCA9IGVUb3A7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAod1RvcCA+IGVUb3ApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsLmNsYXNzTGlzdC5hZGQoXCJwZXJzaXN0ZW50LWN0YS0tdG9wLWZpeGVkXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWwuY2xhc3NMaXN0LnJlbW92ZShcInBlcnNpc3RlbnQtY3RhLS10b3AtZml4ZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvZ2dsZUNvbnRhY3QoZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRhY3RPcGVuID0gIXRoaXMuY29udGFjdE9wZW47XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIHRvZ2dsZU1vZGFsKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgcXVvdGVNb2RhbC50ZW1wbGF0ZSgpLFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgcXVvdGVNb2RhbC5uYW1lLCBcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHF1b3RlTW9kYWwub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHF1b3RlTW9kYWwuZXZlbnRzXG4gICAgICAgICAgICAgICAgLy8gICAgIClcbiAgICAgICAgICAgICAgICAvLyB9LFxuXG4gICAgICAgICAgICAgICAgc2V0VGl0bGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDEnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhZ2VUaXRsZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2gxJykuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVUaXRsZScsIHBhZ2VUaXRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gc3RvcmUuc3RhdGUucGFnZVRpdGxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZXRlY3RIZXJvKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb3B0aW9ucz0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RNYXJnaW46ICcwcHgnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiAwXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9nZ2xlVGl0bGUgPSAoY2hhbmdlcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoKGNoYW5nZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY2hhbmdlLmludGVyc2VjdGlvblJhdGlvID4gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2hlcm8gTk9UIHZpc2libGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VGl0bGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdoZXJvIHZpc2libGUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93VGl0bGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBJbnRlcnNlY3Rpb25PYnNlcnZlcih0b2dnbGVUaXRsZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAoZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaDEnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2gxJykucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtyZXR1cm47fVxuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRBbmNob3JzKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYW5jaG9yQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnN1Yi1uYXZfX2xpc3QtY29udGFpbmVyIGxpIGEnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2hvcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNBbmNob3JzID0gYW5jaG9yQ29udGFpbmVyLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGFzQW5jaG9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGV0IHRlc3QgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIGNvbnNvbGUubG9nKFwiY2xpY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yQ29udGFpbmVyLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9ycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5pbm5lclRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogaXRlbS5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zdWJzdHIoMSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgaXRlbS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgY29uc29sZS5sb2coXCJDTElDS0VEXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICB9LCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB9KVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGFuY2hvcnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3JMaW5rcyA9IGFuY2hvcnM7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgnc2V0UGFnZUFuY2hvcnMnLCBhbmNob3JzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9ic2VydmVBbmNob3JzKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0TW9iaWxlKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTW9iaWxlID0gc3RvcmUuc3RhdGUuaXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxEaXJlY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzY3JvbGxQb3MgPSAwO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZVNjcm9sbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLmNvbXB1dGVkSXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLnRvcCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nyb2xsRGlyID0gXCJ0b3BcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS50b3AgPiBzY3JvbGxQb3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3Vuc3RpY2stbmF2Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2Nyb2xsRGlyID0gXCJ1cFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnN0aWNreU5hdigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzdGljay1uYXYnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zY3JvbGxEaXIgPSBcImRvd25cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51bnN0aWNreU5hdigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxQb3MgPSAoZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkudG9wO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCBoYW5kbGVTY3JvbGwsIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHN0aWNreU5hdigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZChcImFjdGl2ZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVuc3RpY2t5TmF2KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5yZW1vdmUoXCJhY3RpdmVcIik7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvYnNlcnZlQW5jaG9ycygpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByb290OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcm9vdE1hcmdpbjogJzBweCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aHJlc2hvbGQ6IC4yNVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhyZXNob2xkOiBbMCwgLjEsIC4yLCAuMywgLjQsIC41LCAuNiwgLjcsIC44LCAuOSwgMV1cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1vcmUgdGhyZXNob2xkcyA9IG1vcmUgYWNjdXJhY3lcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldEN1cnJlbnRBbmNob3IgPSAoZW50cmllcykgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LnRhcmdldC5faW50ZXJzZWN0aW9uSGVpZ2h0ID0gZW50cnkuaW50ZXJzZWN0aW9uUmVjdC5oZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBhcmUgdmlzaWJpbGl0eSBvZiBzZWN0aW9ucyhhbGwpIGFmdGVyIGV2ZXJ5IGludGVyc2VjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9zdFZpc2libGVTZWN0aW9uID0gdGFyZ2V0cy5yZWR1Y2UoKHByZXYsIGN1cnJlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50Ll9pbnRlcnNlY3Rpb25IZWlnaHQgPiAocHJldiA/IHByZXYuX2ludGVyc2VjdGlvbkhlaWdodCA6IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSwgbnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobW9zdFZpc2libGVTZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50QW5jaG9yID0gbW9zdFZpc2libGVTZWN0aW9uLmRhdGFzZXQuaWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIoc2V0Q3VycmVudEFuY2hvciwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXRzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3JMaW5rcy5mb3JFYWNoKChhbmNob3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0YXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGBbZGF0YS1pZD1cIiR7YW5jaG9yLmtleX1cIl1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQpIHsgdGFyZ2V0cy5wdXNoKHRhcmdldCk7IH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRhcmdldHMpO1xuICAgICAgICAgICAgICAgICAgICB0YXJnZXRzLmZvckVhY2goKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuJGVsKVxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGl0bGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRldGVjdEhlcm8oKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldEFuY2hvcnMoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRNb2JpbGUoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERpcmVjdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWN0T3BlblRleHQgPSB0aGlzLiRyZWZzLmNvbnRhY3RCdG4ucXVlcnlTZWxlY3RvcignLmJ1dHRvbi10ZXh0JykuZGF0YXNldC5vcGVuVGV4dDsgXG4gICAgICAgICAgICAgICAgLy8gZm9yIG9wZW5pbmcgdGhlIGNvbnRhY3QgdG9vbHRpcCBmcm9tIG90aGVyIG1vZHVsZXNcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oYG9wZW4tY29udGFjdGAsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0T3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gZm9yIHRvZ2dsaW5nIHRoZSBjb250YWN0IHRvb2x0aXAgaW4gdGhlIGN0YSB0b3AgYmFyIG9ubHlcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3RvZ2dsZS1jb250YWN0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZUNvbnRhY3QoKTtcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignY2xvc2UtY29udGFjdCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250YWN0T3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgXG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2FuY2hvci1kcm9wZG93bicsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2FuY2hvckxpbmtzJywgJ3Nob3dUaXRsZScsICdoYXNBbmNob3JzJywgJ2lzTW9iaWxlJywgJ2N1cnJlbnRBbmNob3InXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNob3dBbmNob3JzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgZHJvcGRvd25BbmNob3I6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgLy8gc2hvd1RvcEJhcjogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZEN1cnJlbnRBbmNob3I6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50QW5jaG9yO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiY3VycmVudEFuY2hvclwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcm9wZG93bkFuY2hvciA9IHRoaXMuY3VycmVudEFuY2hvcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHNob3dUb3BCYXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgdG9wQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnBlcnNpc3RlbnQtY3RhLS10b3AnKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGlmICh0aGlzLnNob3dUb3BCYXIgPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIHRvcEJhci5jbGFzc0xpc3QucmVtb3ZlKCdoaWRlLWJhcicpO1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNob3dUb3BCYXIgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICB0b3BCYXIuY2xhc3NMaXN0LmFkZCgnaGlkZS1iYXInKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAgICAgaGFzQW5jaG9yczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGV0ZWN0QW5jaG9ycygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwicGFnZVNlY3Rpb25cIiBjbGFzcz1cInBlcnNpc3RlbnQtY3RhX19kcm9wZG93blwiIDphbmNob3ItbGlua3M9YW5jaG9yTGlua3Mgdi1vbjpjaGFuZ2U9XCJqdW1wXCIgdi1pZj1cInNob3dBbmNob3JzXCIgdi1tb2RlbD1cImRyb3Bkb3duQW5jaG9yXCI+XG4gICAgICAgICAgICAgICAgPGFuY2hvci1kcm9wZG93bi1pdGVtIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBhbmNob3JMaW5rc1wiIDprZXk9XCJpbmRleFwiIDpkYXRhPVwiaXRlbVwiLz5cbiAgICAgICAgICAgIDwvc2VsZWN0PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBqdW1wKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJqdW1wXCIpO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaGFzaCA9IGAjJHtlLnRhcmdldC52YWx1ZX1gO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlLnRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkZXRlY3RBbmNob3JzKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgc3ViTmF2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5zdWItbmF2XCIpO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInNjcm9sbFwiLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LnNjcm9sbFkgPiBzdWJOYXYub2Zmc2V0VG9wICl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaG93QW5jaG9ycyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2hvd0FuY2hvcnMgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaGFzQW5jaG9ycykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRlY3RBbmNob3JzKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnYW5jaG9yLWRyb3Bkb3duLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgICAgIDxvcHRpb24gOnZhbHVlPVwiZGF0YS5rZXlcIj57e2RhdGEubmFtZX19PC9vcHRpb24+XG4gICAgICAgICAgICBgLFxuICAgICAgICB9KTtcblxuICAgICAgICBDb250YWN0VXMoKTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiAnLnBlcnNpc3RlbnQtY3RhLS10b3AnLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICB9KS4kbW91bnQoJy5wZXJzaXN0ZW50LWN0YS0tdG9wJywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYoY3RhQmFyKSB7XG4gICAgICAgIGN0YUJhckNvbnN0cnVjdG9yKCk7XG4gICAgfSBcblxufVxuXG5leHBvcnQgZGVmYXVsdCBjdGFCYXJUb3A7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcblxuY29uc3QgZG9jdW1lbnRhdGlvbkNvbnRleHR1YWwgPSAoKSA9PiB7XG5cbiAgICBsZXQgZG9jcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kb2MtY29uJyk7XG5cbiAgICBsZXQgZG9jdW1lbnRhdGlvbkNvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2RvY3VtZW50YXRpb24tY29udGV4dHVhbC10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGVtYWlsRG9jczogW10sIC8vZm9yIGVtYWlsaW5nLFxuICAgICAgICAgICAgICAgICAgICBtYWlsdG86IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG1haWx0b0FsbDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxJdGVtczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXRlbXM6IFtdLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiZW1haWxEb2NzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZW1haWxEb2NzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWlsdG8gPSBgJHttYWlsdG99JHtlbmNvZGVVUklDb21wb25lbnQoaXRlbS5uYW1lKX06JTIwJHtpdGVtLnVybH0lMEQlMEFgO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWlsdG8gPSBtYWlsdG87XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIml0ZW1zXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYXJlQWxsKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRW1haWxEb2NzKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmVtYWlsRG9jcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT0gZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYWlsRG9jcyA9IFsuLi50aGlzLmVtYWlsRG9jcywgZGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtYWlsRG9jcy5zcGxpY2UodGhpcy5lbWFpbERvY3MuaW5kZXhPZihpdGVtKSwxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlSXRlbXMoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLnB1c2goZGF0YSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaGFyZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1haWx0byA9IFwibWFpbHRvOj9zdWJqZWN0PUJhZGdlciUyME1ldGVyJTIwRG9jdW1lbnQlMjBMaW5rcyZib2R5PVwiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYWlsdG8gPSBgJHttYWlsdG99JHtlbmNvZGVVUklDb21wb25lbnQoaXRlbS5uYW1lKX06ICR7aXRlbS51cmx9JTBEJTBBYDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWFpbHRvQWxsID0gbWFpbHRvO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2VtYWlsLWRvY3MnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVtYWlsRG9jcyhkYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZS1pdGVtcycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlSXRlbXMoZGF0YSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaGFyZUFsbCgpOyAvL2luaXQgc2hhcmUgYWxsXG5cbiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSBBcnJheS5mcm9tKHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5kb2MtY2FyZCcpKS5sZW5ndGg7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2RvYy1jb24taXRlbScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImRvY3VtZW50SWRcIixcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdXJsOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGw6IG51bGwsIC8vaXMgXCJzZWUgYWxsXCIgZmVhdHVyZSBlbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxPcGVuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxMYWJlbDogbnVsbCwvL2xhYmVsXG4gICAgICAgICAgICAgICAgICAgIG1vcmVDb250ZW50OiBudWxsLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlc1tgJHt0aGlzLnR5cGV9YF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXModGhpcy5pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInNlZUFsbFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbExhYmVsID0gdGhpcy5zZWVBbGxPcGVuID8gd2luZG93LnNlZUxlc3NMYWJlbCA6IHdpbmRvdy5zZWVBbGxMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJzZWVBbGxPcGVuXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVBbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsTGFiZWwgPSB0aGlzLnNlZUFsbE9wZW4gPyB3aW5kb3cuc2VlTGVzc0xhYmVsIDogd2luZG93LnNlZUFsbExhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBlbWFpbERvYygpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ2VtYWlsLWRvY3MnLCB7XCJuYW1lXCI6IHRoaXMubmFtZSwgXCJ1cmxcIjogdGhpcy51cmwsIFwiaWRcIjogdGhpcy5pZH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgndXBkYXRlRmF2b3JpdGVzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuaXNCb29rbWFya2VkID8gXCJyZW1vdmVcIiA6IFwiYWRkXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbE9wZW4gPSAhdGhpcy5zZWVBbGxPcGVuO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRldGFpbHMgPSB0aGlzLiRyZWZzLnNlZUFsbENvbnRlbnQuaW5uZXJIVE1MLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbCA9IGRldGFpbHMubGVuZ3RoID4gMyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRydW5jYXRlZERldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDAsMykuam9pbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vcmVEZXRhaWxzID0gZGV0YWlscy5zbGljZSgzKS5qb2luKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9yZUNvbnRlbnQgPSBtb3JlRGV0YWlscztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwgPSBgJHt0cnVuY2F0ZWREZXRhaWxzfSxgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyhgJHt0aGlzLmlkfWApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMuJHJlZnMubmFtZS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy51cmwgPSB0aGlzLiRyZWZzLm5hbWUuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlLWl0ZW1zJywge1wibmFtZVwiOiB0aGlzLm5hbWUsIFwidXJsXCI6IHRoaXMudXJsLCBcImlkXCI6IHRoaXMuaWR9KVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNlZUFsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmRvYy1jb24tJHtpZH1gLFxuICAgICAgICB9KS4kbW91bnQoYC5kb2MtY29uLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGRvY3MubGVuZ3RoID4gMCkge1xuICAgICAgICBkb2NzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYGRvYy1jb24tJHtpbmRleH1gKTtcbiAgICAgICAgICAgIGRvY3VtZW50YXRpb25Db25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IGRvY3VtZW50YXRpb25Db250ZXh0dWFsOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBmcG9kYiBmcm9tICcuLi8uLi8uLi9kYi5qc29uJztcbmltcG9ydCB7IEFjY29yZGlvbiwgU2VsZWN0ZWRGaWx0ZXJzQ29tcG9uZW50LCBDaGVja2JveCwgUGFnaW5hdGlvbiB9IGZyb20gJy4vZmlsdGVyLWNvbXBvbmVudHMnO1xuXG5jb25zdCBzYWZlU3RyaW5nID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKTtcbn1cblxuY29uc3QgRG9jdW1lbnRhdGlvbiA9ICgpID0+IHtcblxuICAgIGxldCBkb2N1bWVudGF0aW9uID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRvY3VtZW50YXRpb24nKTtcblxuICAgIGNvbnN0IGRvY3VtZW50YXRpb25Db25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdkb2N1bWVudGF0aW9uLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IDEsIC8vY3VycmVudCBwYWdlICNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUGFnZXM6IG51bGwsIC8vdG90YWwgcmV0dXJucyBwYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZXN1bHRzOiBudWxsLCAvL3RvdGFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3duUmVzdWx0czogbnVsbCwgLy90b3RhbCBzaG93biBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1Zpc2libGU6IG51bGwsIC8vYXJlIGZpbHRlcnMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxEb2NzOiBbXSwgLy9mb3IgZW1haWxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jczogW10sIC8vYm9va21hcmtlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzTGFiZWw6IG51bGwsIC8vbGFiZWwgZm9yIHNhdmVkIGRvY3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3NPbmx5OiBudWxsLCAvL2lzIHNhdmVkIGRvY3Mgb25seSBjaGVja2VkP1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0QWN0aXZlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwaVVybDogbnVsbCwgLy9mb3IgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhcmFtczogbnVsbCwgLy9mb3IgZGVlcGxpbmtpbmcgaW4tYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVBbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IG51bGwsIC8vc2VhcmNoIHF1ZXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnZG9jdW1lbnRhdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1R5cGU6ICdkb2N1bWVudCdcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNMb2FkaW5nOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnZmlsdGVyLWFjY29yZGlvbi10ZW1wbGF0ZSc6IEFjY29yZGlvbixcbiAgICAgICAgICAgICAgICAnc2VsZWN0ZWRGaWx0ZXJzJzogU2VsZWN0ZWRGaWx0ZXJzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICdjaGVja2JveC1pdGVtJzogQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgJ3BhZ2luYXRpb24nOiBQYWdpbmF0aW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwYWdlUmFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDEtJHt0aGlzLmRhdGEuc2hvd25SZXN1bHRzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLmRhdGEudG90YWxQYWdlcyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAtIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgKyAxfS0ke3RoaXMuZGF0YS50b3RhbFJlc3VsdHN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyh0aGlzLmRhdGEuc2hvd25SZXN1bHRzICogKHRoaXMuZGF0YS5jdXJyZW50UGFnZSAtIDEpKSArIDF9LSR7dGhpcy5kYXRhLnNob3duUmVzdWx0cyAqIHRoaXMuZGF0YS5jdXJyZW50UGFnZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93blJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGFuZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5jdXJyZW50TGFuZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3MgPSB0aGlzLnNhdmVkO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzYXZlZCBvbmx5IGZpbHRlciBpZiBubyBzYXZlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zYXZlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YoJ3NhdmVkRG9jdW1lbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHRoaXMuY29tcHV0ZWRJc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuY29tcHV0ZWRJc01vYmlsZSA/IHRydWUgOiB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEuZmlsdGVyc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpOyAvLyBoYW5kbGUgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVIaXN0b3J5KCk7IC8vIGhhbmRsZSBoaXN0b3J5IHJlY29yZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxOyAvL3Jlc2V0IHBhZ2UgdG8gMVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzID0gW107XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgaWYgYnJhbmQgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5kcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudHlwZSA9PSBcImJyYW5kXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChicmFuZHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVByb2R1Y3RzKGJyYW5kcyk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBub3QgYnJhbmQgc2VsZWN0ZWQsIGVtcHR5IHRoZSBwcm9kdWN0cyBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByb2R1Y3RzID0gW107IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIHByb2R1Y3QgZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudHlwZSA9PSBcInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcih0aGlzLmRhdGEuY2xhc3MsIGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc2F2ZWREb2NzT25seSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZERvY3VtZW50c1wiO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzT25seSA9IHNhdmVkT25seSA/IHNhdmVkT25seS52YWx1ZSA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudXBkYXRlSGlzdG9yeSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLnRvdGFsUmVzdWx0c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UGFnZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZUZpbHRlcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9ICF0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy9hYm9ydCBpZiBub3QgZG9jdW1lbnRhdGlvbiBtb2R1bGVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHNhZmVTdHJpbmcoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGUuY3VycmVudFRhcmdldC5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJzYXZlZERvY3VtZW50c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIHtcInZhbHVlXCI6IHZhbHVlLCBcInR5cGVcIjogdHlwZSwgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCB7XCJ2YWx1ZVwiOiBjaGVja2VkLCBcInR5cGVcIjogdHlwZSwgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2codGhpcy5kYXRhLmZpbHRlcnMpXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHNwZWNpZmljIGZpbHRlclxuICAgICAgICAgICAgICAgIHJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBjbGVhcnMgZmlsdGVyc1xuICAgICAgICAgICAgICAgIHJlbW92ZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsgLy9yZXNldCBwYWdlIHRvIDFcbiAgICAgICAgICAgICAgICB9LCAgXG4gICAgICAgICAgICAgICAgcG9wdWxhdGVQcm9kdWN0cyhicmFuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5kU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGJyYW5kcy5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpVXJsID0gYC9hcGkvR2V0RG9jdW1lbnRQcm9kdWN0c0J5QnJhbmRgO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvcHJvZHVjdHNCeUJyYW5kXCI7IC8vZnJvbSBqc29uLXNlcnZlclxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgYXhpb3MuZ2V0KGFwaVVybCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZDogYnJhbmRTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmc6IHRoaXMubGFuZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wcm9kdWN0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0czsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZ2V0VXJsKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRQYXJhbXMgPSB0aGlzLmRhdGEuc2F2ZWREb2NzLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeT0gdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcm9kdWN0XCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmdQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwibGFuZ1wiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBicmFuZFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJicmFuZFwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBkb2NUeXBlUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcImRvY1R5cGVcIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhdmVkT25seSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNhdmVkRG9jdW1lbnRzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZE9ubHkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlUGFyYW1zID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudXJsUGFyYW1zID0gXCI/XCJcbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudXJsUGFyYW1zICs9XCJxPVwiK2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnVybFBhcmFtcyArPSBgJHtwcm9kdWN0UGFyYW1zICE9PSBcIlwiID8gXCImcHJvZHVjdD1cIiArIHByb2R1Y3RQYXJhbXMgOiBcIlwifSR7bGFuZ1BhcmFtcyAhPT0gXCJcIiA/IFwiJmxhbmc9XCIgKyBsYW5nUGFyYW1zIDogXCJcIn0ke2JyYW5kUGFyYW1zICE9PSBcIlwiID8gXCImYnJhbmQ9XCIgKyBicmFuZFBhcmFtcyA6IFwiXCJ9JHtkb2NUeXBlUGFyYW1zICE9PSBcIlwiID8gXCImZG9jVHlwZT1cIiArIGRvY1R5cGVQYXJhbXMgOiBcIlwifSZzYXZlZERvY3VtZW50cz0ke3NhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpfSZwYWdlPSR7cGFnZVBhcmFtc31gO1xuXG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGRpZFlvdU1lYW4oZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcl9fcGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcl9fZGlkeW91bWVhbicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IGUudGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeTtcblxuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dCcpLnZhbHVlID0gcXVlcnk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhZGRMb2FkaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZpZWxkLmNsYXNzTGlzdC5hZGQoJ2xvYWRpbmcnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RmllbGQpXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZpZWxkLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHMocXVlcnkpIHtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeSA9PT0gbnVsbCA/IG51bGwgOiBxdWVyeSA/IHF1ZXJ5IDogdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSBxdWVyeSA/IDEgOiB0aGlzLmRhdGEuY3VycmVudFBhZ2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRVcmwoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2VVcmwgPSB3aW5kb3cuZG9jdW1lbnRBUElVcmw7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGlVcmwgPSBgJHtiYXNlVXJsfSR7YmFzZVVybC5pbmRleE9mKCc/JykgPiAtMSA/ICcnIDogJz8nfWA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9kb2N1bWVudGF0aW9uXCI7IC8vZnJvbSBqc29uLXNlcnZlclxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsVGVzdCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL2RvY3VtZW50YXRpb25UZXN0XCI7IC8vZnJvbSBqc29uLXNlcnZlclxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhdmVkT25seSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNhdmVkRG9jdW1lbnRzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZHVjdCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGFuZyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgYnJhbmQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGRvY1R5cGUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChpdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHJvZHVjdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsYW5nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmcucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcImJyYW5kXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkb2NUeXBlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY1R5cGUucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdFN0ciA9IGRlY29kZVVSSUNvbXBvbmVudChwcm9kdWN0LmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYW5nU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGxhbmcuam9pbignfCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5kU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGJyYW5kLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb2NUeXBlU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGRvY1R5cGUuam9pbignfCcpKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXhpb3NQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxOiB0aGlzLmRhdGEucXVlcnkgPyB0aGlzLmRhdGEucXVlcnkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6ICh0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKSkgPT0gXCJcIiA/IG51bGwgOiB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5jaGFyQXQoMCkgPT0gXCIsXCIgPyB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5zbGljZSgxKSA6IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpLCAvL0BUT0RPIG1ha2UgdGhpcyBsZXNzIGluc2FuZS4gU2VuZCBOVUxMIGlmIGVtcHR5IHN0cmluZy4gUmVtb3ZlIGxlYWRpbmcgY29tbWEgaWYgcHJlc2VudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6IHByb2R1Y3RTdHIgPT0gXCJcIiA/IG51bGwgOiBwcm9kdWN0U3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmdTdHIgPT0gXCJcIiA/IG51bGwgOiBsYW5nU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmQ6IGJyYW5kU3RyID09IFwiXCIgPyBudWxsIDogYnJhbmRTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2NUeXBlOiBkb2NUeXBlU3RyID09IFwiXCIgPyBudWxsIDogZG9jVHlwZVN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jdW1lbnRzOiBzYXZlZERvY3VtZW50c1RydWVQYXJhbXMoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuZGF0YS5jdXJyZW50UGFnZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBzZWFyY2hUZXJtID0gdGhpcy5kYXRhLnF1ZXJ5O1xuXG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldChhcGlVcmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYXhpb3NQYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gRGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljIGZyb20gZXBpc2VydmVyIGZpbmQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5FbCwgZGlkeW91bWVhbkNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5yZXN1bHRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXJfX2RpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcl9fcGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuZGlkWW91TWVhbiAmJiByZXNwb25zZS5kYXRhLmRpZFlvdU1lYW4ubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxsRWxlbWVudHMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5kaWRZb3VNZWFuLmZvckVhY2goZHltID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbmNob3JFbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudC5ocmVmPVwiI1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudC5pbm5lclRleHQgPSBkeW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kaWRZb3VNZWFuKGFuY2hvckVsZW1lbnQuaW5uZXJUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsRWxlbWVudHMucHVzaChhbmNob3JFbGVtZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jbGVhciBvdXQgYWxsIHByZXZpb3VzIGVsZW1lbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbC5mb3JFYWNoKHBhcmVudCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlQ2hpbGQocGFyZW50LmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGk8YWxsRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbC5mb3JFYWNoKGVsID0+IGVsLmFwcGVuZChhbGxFbGVtZW50c1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgYWxsRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1hRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFFbC5zdHlsZS5wYWRkaW5nTGVmdCA9IFwiN3B4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsLmZvckVhY2goZWwgPT4gZWwuYXBwZW5kKGNvbW1hRWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBFbmQgb2YgZGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVE0gVEFHR0lOR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hUZXJtICYmIHNlYXJjaFRlcm0ubGVuZ3RoID4gMCAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllclt3aW5kb3cuZGF0YUxheWVyLmxlbmd0aC0xXS5ldmVudCAhPSBcInNlYXJjaC1yZXN1bHRzXCIgLy8gaGFjayB0byBhdm9pZCBkb3VibGUgZW50cnkuICB0aGlzIHJ1bnMgdHdpY2UgZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeyAvLyBvbmx5IHB1c2ggaWYgdGhpcyBpcyBhIHF1ZXJ5LCBub3QgYSBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkb2N1bWVudGF0aW9uXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogXCJTZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogc2VhcmNoVGVybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiByZXNwb25zZS5kYXRhLnRvdGFsUmVzdWx0cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU0VUIFJFU1VMVFNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEucmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0czsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS50b3RhbFJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuc2hvd25SZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEudHJhY2tJZCA9IHJlc3BvbnNlLmRhdGEudHJhY2tJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUxvYWRpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hhbmdlUGFnZShkaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBcInByZXZcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZS0tO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpciA9PSBcIm5leHRcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UrKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzY3JvbGwtdG8tdG9wJywgdGhpcy5kYXRhLmNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlRW1haWxEb2NzKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmRhdGEuZW1haWxEb2NzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pZCA9PSBkYXRhLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MgPSBbLi4udGhpcy5kYXRhLmVtYWlsRG9jcywgZGF0YV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzLnNwbGljZSh0aGlzLmRhdGEuZW1haWxEb2NzLmluZGV4T2YoaXRlbSksMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vdXBkYXRlIGhpc3RvcnkgcmVjb3JkIHdoZW4gZmlsdGVycyBjaGFuZ2VcbiAgICAgICAgICAgICAgICB1cGRhdGVIaXN0b3J5KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVybCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYCR7d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lfSR7dGhpcy5kYXRhLnVybFBhcmFtc31gO1xuICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZShcIlwiLFwiXCIsdXJsKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBkZWVwIGxpbmtpbmcgb24gaGlzdG9yeSBjaGFuZ2VcbiAgICAgICAgICAgICAgICBkZWVwbGluaygpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXJfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXJfX2RpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtcyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2guc3Vic3RyKDEpLnNwbGl0KFwiJlwiKS5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSAhPSBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbml0RmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHBhcmFtLnNsaWNlKDAsIHBhcmFtLmluZGV4T2YoJz0nKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IHBhcmFtLnNsaWNlKHBhcmFtLmluZGV4T2YoJz0nKSArIDEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJwYWdlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlID0gcGFyc2VJbnQoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJzYXZlZERvY3VtZW50c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT0gXCJmYWxzZVwiIHx8IGNvbnRlbnQgPT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogdGhpcy5kYXRhLnNhdmVkRG9jc0xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmluaXRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29udGVudC5pbmRleE9mKCcsJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50QXJyYXkgPSBjb250ZW50LnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFycmF5LmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IGl0ZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmluaXRGaWx0ZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlLnRvTG9jYWxlTG93ZXJDYXNlKCkgPT0gXCJtYW51YWxzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9jVHlwZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IFwiTWFudWFscyUyMCUyNiUyMEd1aWRlc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogXCJNYW51YWxzICYgR3VpZGVzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW5pdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodHlwZS50b0xvY2FsZUxvd2VyQ2FzZSgpICE9IFwibWFudWFsc1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBkZWNvZGVVUklDb21wb25lbnQoY29udGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW5pdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IGluaXRGaWx0ZXJzO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFnZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IHBhZ2U7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNjcm9sbFRvVG9wKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7cmV0dXJuO31cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5kb2N1bWVudGF0aW9uX19hcmVhLWNhcmRzJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFkgLSAxMDA7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0UGFnZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRvdGFsIHJlc3VsdCBjb3VudCwgZGl2aWRlIGJ5IDEwIHRvIGdldCB0b3RhbCBwYWdlcyBuZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0aCBjZWlsIHRvIHJvdW5kIHVwXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBhY3RpdmUgZm9yIHByZXYvbmV4dCBiYXNlZCBvbiBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAvIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IDEgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSB0aGlzLmRhdGEudG90YWxQYWdlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzID0gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWRbMF0gPT0gXCJcIiA/IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5kb2N1bWVudElkLnNsaWNlKDEpIDogc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9IHRoaXMuZGF0YS5pc01vYmlsZSA/IGZhbHNlIDogdHJ1ZTsgLy9pbml0IHNob3cvaGlkZSBmaWx0ZXJzIGlmL2lzIG1vYmlsZVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWx0ZXIgdXBkYXRlcyBpbiBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZUZpbHRlcnMnLCAoZWwsIGUsIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVycyhlbCwgZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3JlbW92ZS1maWx0ZXInLCAoZWwsIHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdjaGFuZ2UtcGFnZS10bycsIChlbCwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gbnVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignZW1haWwtZG9jcycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVtYWlsRG9jcyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignaW50ZXJuYWwtc2VhcmNoJywgKHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcImRvY3VtZW50YXRpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcy51cGRhdGVIaXN0b3J5KHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3Njcm9sbC10by10b3AnLCAoZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Ub3AoZWwpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBpbml0IHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbERvY3VtZW50YXRpb25BcGlSZXN1bHRzLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbERvY3VtZW50YXRpb25BcGlSZXN1bHRzLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNob3duUmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsRG9jdW1lbnRhdGlvbkFwaVJlc3VsdHMucmVzdWx0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5yZXN1bHRzID0gZnBvZGIuZG9jdW1lbnRhdGlvbi5yZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEudG90YWxSZXN1bHRzID0gZnBvZGIuZG9jdW1lbnRhdGlvbi50b3RhbFJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSBmcG9kYi5kb2N1bWVudGF0aW9uLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gaGlkZSBmaWx0ZXJzIGlmIGxlc3MgdGhlbiAxMCBpbml0aWFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlckFyZWFWaXNpYmxlID0gcGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gMTAgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZW5hYmxlIFwic2hhcmUgYWxsXCIgaWYgNSBvZiBsZXNzIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNoYXJlQWxsID0gcGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gNSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9ucG9wc3RhdGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWVwbGluaygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5tYW51YWxzQW5kR3VpZGVzRmlsdGVyICYmIHdpbmRvdy5oYXNNYW51YWxzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywge1widmFsdWVcIjogd2luZG93Lm1hbnVhbHNBbmRHdWlkZXNGaWx0ZXJWYWx1ZSwgXCJ0eXBlXCI6IFwiZG9jVHlwZVwiLCBcIm5hbWVcIjogd2luZG93Lm1hbnVhbHNBbmRHdWlkZXNGaWx0ZXJOYW1lfV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xuICAgICAgICAgICAgICAgIC8vIGZvciBkZWVwbGlua2luZ1xuICAgICAgICAgICAgICAgIC8vIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZGVlcGxpbmsoKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgfSk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnZG9jLXByb2R1Y3RzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdjYXRlZ29yeSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwcm9kdWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICdjaGVja2JveC1pdGVtJzogQ2hlY2tib3hcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvY3VtZW50YXRpb25fX3Byb2R1Y3RzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8Y2hlY2tib3gtaXRlbSB2LWZvcj1cIihwcm9kdWN0SXRlbSwgaSkgaW4gZGF0YS5wcm9kdWN0c1wiIDprZXk9aSA6dHlwZT1cInR5cGVcIiA6bGFiZWw9XCJwcm9kdWN0SXRlbS52YWx1ZVwiIDp2YWx1ZT1cInByb2R1Y3RJdGVtLmtleVwiIDpkYXRhPVwiZGF0YVwiIDpjYXRlZ29yeT1cImNhdGVnb3J5XCIvPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIHJlc3VsdHMgbGlzdFxuICAgICAgICBWdWUuY29tcG9uZW50KCdkb2MtcmVzdWx0cy1saXN0Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdpc0xvYWRpbmcnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicHJvZHVjdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jdW1lbnRhdGlvbl9fY2FyZHMtY29udGVudFwiIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgIDxkb2MtcmVzdWx0cy1pdGVtIHYtZm9yPVwiKHJlc3VsdCwgaW5kZXgpIGluIGRhdGEucmVzdWx0c1wiIDpjb250ZW50PVwicmVzdWx0XCIgOmlzU2VsZWN0ZWQ9XCJpc1NlbGVjdGVkKHJlc3VsdClcIiA6a2V5PVwicmVzdWx0LmlkXCIgOmRhdGE9XCJkYXRhXCIgOmlzTG9hZGluZz1cImlzTG9hZGluZ1wiIC8+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaXNTZWxlY3RlZChyZXN1bHQpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmVtYWlsRG9jcy5maW5kKGkgPT4gaS5pZCA9PSByZXN1bHQuaWQpICE9PSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBzaW5nbGUgcmVzdWx0cyBpdGVtXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2RvYy1yZXN1bHRzLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2NvbnRlbnQnLCAnaXNTZWxlY3RlZCcsICdpc0xvYWRpbmcnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQ2hlY2tlZDogdGhpcy5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBpc0Jvb2ttYXJrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsOiBudWxsLCAvL2lzIFwic2VlIGFsbFwiIGZlYXR1cmUgZW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsT3BlbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsTGFiZWw6IG51bGwsLy9sYWJlbFxuICAgICAgICAgICAgICAgICAgICBtb3JlQ29udGVudDogbnVsbCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuZG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVuY29kZWRVcmw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHRoaXMuY29udGVudC51cmwpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbmV3VGFiTGluazogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQudXJsID8gdGhpcy5jb250ZW50LnVybC5yZXBsYWNlKCdkb3dubG9hZD10cnVlJywgJ2Rvd25sb2FkPWZhbHNlJykgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnTWV0YUJvZHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9jdW1lbnRcIiwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IHRoaXMuY29udGVudC5leWVicm93LnNwbGl0KFwifFwiKVswXS50cmltKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IHRoaXMuY29udGVudC5uYW1lLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicHJvZHVjdExpbmVcIjogdGhpcy5jb250ZW50LmRldGFpbHMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYW5ndWFnZVwiOiB0aGlzLmNvbnRlbnQubGFuZ3VhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImRvY3VtZW50SWRcIjogdGhpcy5jb250ZW50LmRvY3VtZW50SWRcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5lbWFpbERvY3NcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5lbWFpbERvY3MubGVuZ3RoID09PSAwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNDaGVja2VkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiY29udGVudFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIGlkIHdoZW4gY29udGVudCBjaGFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyhgJHt0aGlzLmlkfWApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJzZWVBbGxcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZUFsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxMYWJlbCA9IHRoaXMuc2VlQWxsT3BlbiA/IHdpbmRvdy5zZWVMZXNzTGFiZWwgOiB3aW5kb3cuc2VlQWxsTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwic2VlQWxsT3BlblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbExhYmVsID0gdGhpcy5zZWVBbGxPcGVuID8gd2luZG93LnNlZUxlc3NMYWJlbCA6IHdpbmRvdy5zZWVBbGxMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkIGRvYy1jYXJkLS1jaGVja2JveFwiIDpjbGFzcz1cInsnaGlkZS1ib29rbWFyayc6IChkYXRhLnNhdmVkRG9jc09ubHkgPT09IHRydWUpICYmIChpc0Jvb2ttYXJrZWQgPT09IGZhbHNlKX1cIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiA6ZGF0YS10YWctbWV0YT0ndGFnTWV0YUJvZHknPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fd3JhcHBlclwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19hcmVhIGRvYy1jYXJkX19hcmVhLWNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxhYmVsIGNsYXNzPVwiY2hlY2tib3hfX2xhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVja2JveF9faW5wdXRcIiA6dmFsdWU9XCJjb250ZW50LmlkXCIgdi1vbjpjaGFuZ2U9XCJlbWFpbERvY1wiIHYtbW9kZWw9XCJpc0NoZWNrZWRcIiA6Y2hlY2tlZD1cImlzQ2hlY2tlZFwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJkb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIlNlbGVjdFwifSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrYm94X19jaGVja21hcmtcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19hcmVhIGRvYy1jYXJkX19hcmVhLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX2FyZWEgZG9jLWNhcmRfX2FyZWEtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX2V5ZWJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jLWNhcmRfX2V5ZWJyb3dfX2RldGFpbHNcIiByZWY9XCJzZWVBbGxDb250ZW50XCI+e3tjb250ZW50LmV5ZWJyb3d9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jLWNhcmRfX3N1YnRpdGxlLW1vcmVcIiB2LWlmPVwic2VlQWxsICYmIHNlZUFsbE9wZW5cIj5cXHt7bW9yZUNvbnRlbnR9fTwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIHYtb246Y2xpY2sucHJldmVudD1cInRvZ2dsZVNlZUFsbFwiIHYtaWY9XCJzZWVBbGxcIj5cXHt7c2VlQWxsTGFiZWx9fTwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwibmV3VGFiTGlua1wiIGNsYXNzPVwiZG9jLWNhcmRfX3RpdGxlXCIgdGFyZ2V0PVwiX2JsYW5rXCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcImRvY3VtZW50XCIsIFwiYWN0aW9uXCI6IFwiUHJldmlld1wifSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnQubmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPCEtLVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkb2MtY2FyZF9fc3VidGl0bGUtY29udGVudFwiIHJlZj1cInNlZUFsbENvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udGVudC5kZXRhaWxzfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19zdWJ0aXRsZS1tb3JlXCIgdi1pZj1cInNlZUFsbCAmJiBzZWVBbGxPcGVuXCI+XFx7e21vcmVDb250ZW50fX08L3NwYW4+IDxhIGhyZWY9XCIjXCIgdi1vbjpjbGljay5wcmV2ZW50PVwidG9nZ2xlU2VlQWxsXCIgdi1pZj1cInNlZUFsbFwiPlxce3tzZWVBbGxMYWJlbH19PC9hPiB8IHt7Y29udGVudC5sYW5ndWFnZX19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj4gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fYXJlYSBkb2MtY2FyZF9fYXJlYS1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cImRvYy1jYXJkX19pY29uIGRvYy1jYXJkX19pY29uLWRvd25sb2FkXCIgOmhyZWY9XCJjb250ZW50LnVybFwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJkb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIkRvd25sb2FkXCJ9Jz48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tZW1haWxcIiA6aHJlZj1cIidtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9JyArIGVuY29kZVVSSUNvbXBvbmVudChjb250ZW50Lm5hbWUpICsgJzogJyArIHRoaXMuZW5jb2RlZFVybFwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJkb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIkVtYWlsXCJ9Jz48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tYm9va21hcmtcIiA6ZGF0YS1kb2N1bWVudC1pZD1cImNvbnRlbnQuaWRcIiByZWY9XCJib29rbWFya1wiIHYtb246Y2xpY2s9XCJoYW5kbGVCb29rbWFya1wiIDpjbGFzcz1cInthY3RpdmU6IGlzQm9va21hcmtlZH1cIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwiZG9jdW1lbnRcIiwgXCJhY3Rpb25cIjogXCJGYXZvcml0ZVwifSc+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgZW1haWxEb2MoKSB7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdlbWFpbC1kb2NzJywge1wibmFtZVwiOiB0aGlzLmNvbnRlbnQubmFtZSwgXCJ1cmxcIjogdGhpcy5jb250ZW50LnVybCwgXCJpZFwiOiB0aGlzLmNvbnRlbnQuaWR9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkb2N1bWVudElkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuaXNCb29rbWFya2VkID8gXCJyZW1vdmVcIiA6IFwiYWRkXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbE9wZW4gPSAhdGhpcy5zZWVBbGxPcGVuO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9sZXQgZGV0YWlscyA9IHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwuc3BsaXQoL1ssO10rLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGV0YWlscyA9IHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwucmVwbGFjZShcIiA7IFwiLCBcIiwgXCIpLnNwbGl0KC9bLF0rLyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbCA9IGRldGFpbHMubGVuZ3RoID4gMyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRydW5jYXRlZERldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDAsMykuam9pbigpLnJlcGxhY2UoLyAsL2csICcsJyk7O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vcmVEZXRhaWxzID0gZGV0YWlscy5zbGljZSgzKS5qb2luKCkucmVwbGFjZSgvICwvZywgJywnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3JlQ29udGVudCA9IG1vcmVEZXRhaWxzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5zZWVBbGxDb250ZW50LmlubmVySFRNTCA9IGAke3RydW5jYXRlZERldGFpbHN9JHttb3JlRGV0YWlscyA9PSBcIlwiID8gJycgOiAnLCd9YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWVBbGwoKTtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFja0lkID0gc2VsZi5kYXRhLnRyYWNrSWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRJZCA9IHNlbGYuY29udGVudC5oaXRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeSA9IHNlbGYuZGF0YS5xdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgL2FwaS9TZWFyY2hIaXQ/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9Jmg9JHtlbmNvZGVVUklDb21wb25lbnQoaGl0SWQpfSZ0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyYWNrSWQpfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxBbmNob3JzID0gc2VsZi4kZWwucXVlcnlTZWxlY3RvckFsbCgnYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsQW5jaG9ycy5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldCh1cmwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdlbWFpbC1kb2NzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbHRvOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyBtYWlsdG9BbGw6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBcImRhdGEuZW1haWxEb2NzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haWx0byA9IGAke21haWx0b30ke2VuY29kZVVSSUNvbXBvbmVudChpdGVtLm5hbWUpfTogJHtlbmNvZGVVUklDb21wb25lbnQoaXRlbS51cmwpfSUwRCUwQWA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haWx0byA9IG1haWx0bztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIC8vIHNoYXJlQWxsKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGF0YS5yZXN1bHRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBtYWlsdG8gPSBgJHttYWlsdG99JHtpdGVtLm5hbWV9OiAke2l0ZW0udXJsfSUwRCUwQWA7XG4gICAgICAgICAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLm1haWx0b0FsbCA9IG1haWx0bztcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiAocGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gNSkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLnNoYXJlQWxsKCk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmRvY3VtZW50YXRpb24tJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgIH0pLiRtb3VudChgLmRvY3VtZW50YXRpb24tJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoZG9jdW1lbnRhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIGRvY3VtZW50YXRpb24uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgZG9jdW1lbnRhdGlvbi0ke2luZGV4fWApO1xuICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkNvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICAvLyB3aW5kb3cuc2VlTGVzc0xhYmVsID0gXCJzZWUgbGVzc1wiO1xuICAgIC8vIHdpbmRvdy5zZWVBbGxMYWJlbCA9IFwic2VlIG1vcmVcIjtcblxufVxuXG5leHBvcnQgZGVmYXVsdCBEb2N1bWVudGF0aW9uO1xuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQge3BhcmRvdEZvcm1JbnN0YW5jZX0gZnJvbSBcIi4vcGFyZG90LWZvcm1cIjtcblxuY29uc3QgRHJhd2VyID0gKCkgPT4ge1xuICAgIGNvbnN0IGRyYXdlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJhd2VyX193cmFwcGVyJyk7XG4gICAgXG4gICAgbGV0IGRyYXdlckNvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIC8vIG1haW4gY29tcG9uZW50IHdyYXBwZXJcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnZHJhd2VyLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlVGFiOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IHN0b3JlLnN0YXRlLmlzTW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBtb2JpbGVTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBtb2JpbGVTdGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSB0aGlzLm1vYmlsZVN0YXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgc2V0QWN0aXZlVGFiKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSBlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlVGFiKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhYlRhcmdldCA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YWJUYXJnZXQgIT09IHRoaXMuYWN0aXZlVGFiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRlcnBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYih0YWJUYXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmRyYXdlcl9fdGFiLWl0ZW0uYWN0aXZlJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKGBbZGF0YS10YXJnZXQ9JHt0YWJUYXJnZXR9XWApLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRSZXNwb25zaXZlKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbmxpbmUgc3R5bGVzIGZyb20gYWNjb3JkaW9uc1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFjY29yZGlvbkNvbnRhaW5lcnMgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yQWxsKCcuZHJhd2VyX19kcmF3ZXItY29udGVudC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjY29yZGlvbkNvbnRhaW5lcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHNldCB0aGUgZmlyc3QgdGFiIHRvIGFjdGl2ZVxuICAgICAgICAgICAgICAgIGluaXREZXNrdG9wKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7IC8vdW5kZXIgNzY4cHhcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy9vdmVyIDc2OHB4XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBkZXNrdG9wLCBjaGVjayBmb3IgZGVza3RvcCBidXR0b25zIGFuZCBzZXQgaW5pdGlhbCB0YWJcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbml0aWFsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFyZ2V0XScpLmRhdGFzZXQudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSBpbml0aWFsO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFyZ2V0XScpLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coc3RvcmUuc3RhdGUuaXNNb2JpbGUpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdERlc2t0b3AoKTsgLy9zZXQgdGhlIGZpcnN0IHRhYiB0byBhY3RpdmUgb24gaW5pdFxuICAgICAgICAgICAgICAgIC8vbGlzdGVuIGZvciBjaGlsZCBjbGljayBldmVudHMgb24gdGhlIGxhYmVscyBhbmQgcGFzcyB0YXJnZXRzIHRvIHBhcmVudFxuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignaGFuZGxlLW1vYmlsZScsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiKGUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdoYW5kbGUtZGVza3RvcCcsIChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0QWN0aXZlVGFiKGUpO1xuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIGRlc2t0b3AgbGFiZWxzXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2RyYXdlci10YWItbGFiZWwnLCB7XG4gICAgICAgICAgICBwcm9wczogWydhY3RpdmVUYWInLCAnaXNNb2JpbGUnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHRhYlRhcmdldDogJycsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGFjdGl2ZVRhYjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLmFjdGl2ZVRhYiA9PSB0aGlzLnRhYlRhcmdldCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGhhbmRsZVRhYihlKSB7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdoYW5kbGUtZGVza3RvcCcsIHRoaXMudGFiVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYlRhcmdldCA9IHRoaXMuJGVsLmRhdGFzZXQudGFyZ2V0O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBtb2JpbGUgYWNjb3JkaW9uIGNvbnRhaW5lcnMgJiBsYWJlbHNcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnZHJhd2VyLWNvbnRlbnQtdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBwcm9wczogWydhY3RpdmVUYWInLCAnaXNNb2JpbGUnXSwgLy9hY3RpdmUgdGFiIFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGFiTmFtZTogJycsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSwgLy9pcyBjdXJyZW50IHRhYiB0aGUgc2VsZWN0ZWQgdGFiICdhY3RpdmVUYWInXG4gICAgICAgICAgICAgICAgICAgIGlzT3BlbjogZmFsc2UsIC8vaXMgdGFiIG9wZW5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBhY3RpdmVUYWI6IGZ1bmN0aW9uKHRhYikge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy50YWJOYW1lID09IHRhYiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlOyAvL3NldCBhY2NvZGlvbiB0byBjbG9zZSB3aGVuIG5vdCB0aGUgYWN0aXZlIGl0ZW1cblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGFjY29yZGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRBcmVhID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmRyYXdlcl9fZHJhd2VyLWNvbnRlbnQtY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5kcmF3ZXJfX2RyYXdlci1jb250ZW50LWlubmVyJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY29udGVudCBhcmVhIGhlaWdodCB0byBjb250ZW50IGhlaWdodCB0byBwcmV2ZW50IHRyYW5zaXRpb25pbmcgZnJvbSBhdXRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0aGUgZWxlbWVudCB0cmFuc2l0aW9uIHRvIGhlaWdodDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgYWN0aXZlIHRhYiwgc2V0IGlzT3BlbiB0byB0cnVlIHdoZW4gaXNBY3RpdmUgaXMgdHJ1ZSB0byBwcmUgb3BlbiB0aGUgdGFiIG9uIG1vYmlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVNb2JpbGUoZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbW9iaWxlVGFyZ2V0ID0gZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUuZGF0YXNldC50YWJJZDtcblxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnaGFuZGxlLW1vYmlsZScsIG1vYmlsZVRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvZ2dsZSB0aGUgYWNjb3JkaW9uXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUFjY29yZGlvbihlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gdG9nZ2xlIGFjY29yZGlvbnNcbiAgICAgICAgICAgICAgICBoYW5kbGVBY2NvcmRpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEFyZWEgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuZHJhd2VyX19kcmF3ZXItY29udGVudC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuZHJhd2VyX19kcmF3ZXItY29udGVudC1pbm5lcicpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc09wZW4gPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbnRlbnQgYXJlYSBoZWlnaHQgdG8gY29udGVudCBoZWlnaHQgdG8gcHJldmVudCB0cmFuc2l0aW9uaW5nIGZyb20gYXV0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbiB0byBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxUb1RvcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsbU9mZnNldCA9IHRoaXMuJGVsLm9mZnNldFRvcDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbE9mZnNldCA9IHdpbmRvdy5zY3JvbGxZO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsXCIsZWxtT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ3aW5kb3dcIixzY3JvbGxPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxtT2Zmc2V0IDwgc2Nyb2xsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxtUG9zID0gdGhpcy4kZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogKGVsbVBvcyAtIDcwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgaW5pdE1vYmlsZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXMgbW9iaWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJub3QgbW9iaWxlXCIpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGlubGluZSBzdHlsZXMgZm9yIGFjY29yZGlvbnMgb24gZGVza3RvcFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRDb250YWluZXJzID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmRyYXdlcl9fZHJhd2VyLWNvbnRlbnQtY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50Q29udGFpbmVycy5mb3JFYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHZhciBpbml0aWFsVGFiID0gdGhpcy4kZWwuZGF0YXNldC50YWJJZDtcbiAgICAgICAgICAgICAgICB0aGlzLnRhYk5hbWUgPSBpbml0aWFsVGFiO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdE1vYmlsZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBpbXBvcnQgcGFyZG90IGZvcm0gY29tcG9uZW50IGluc3RhbmNlXG4gICAgICAgIHBhcmRvdEZvcm1JbnN0YW5jZTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmRyYXdlci0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAuZHJhd2VyLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGRyYXdlcnMubGVuZ3RoID4gMCkge1xuICAgICAgICBkcmF3ZXJzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYGRyYXdlci0ke2luZGV4fWApO1xuICAgICAgICAgICAgZHJhd2VyQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRHJhd2VyOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5cbmNvbnN0IEV2ZW50QnVzID0gbmV3IFZ1ZSgpO1xuXG5leHBvcnQgZGVmYXVsdCBFdmVudEJ1czsiLCIvKlxuICAgIEZldGNoZXIgaXMgYSBkZWNvcmF0b3IgZnVuY3Rpb24gdG8gYWRkIHRoZSBWdWUgRmV0Y2hlciBjb21wb25lbnQuXG4gICAgICAgICogQXJndW1lbnRzOlxuICAgICAgICAgICAgLSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICAgICAgICAtIHtPYmplY3R9IGNvbmZcbiAgICAgICAgKiBVc2FnZTpcbiAgICAgICAgICAgVGhlICdvcHRpb25zJyBhcmd1bWVudCBpcyB0aGUgc2FtZSBjb25maWd1cmF0aW9uIGZvciBhIFZ1ZSBDb21wb25lbnQuIGluIGFkZGl0aW9uLCB0aGUgbmV4dCBvcHRpb25zOlxuXG4gICAgICAgICAgIC0gbmFtZSBbc3RyaW5nXTogbmFtZSB1c2VkIGZvciBGZXRjaGVyIGNvbXBvbmVudCBpbiBWdWUuIChieSBkZWZhdWx0IGlzICdmZXRjaCcuIFJlbWVtYmVyIGNvbnNpZGVyaW5nIHRoZSBwcmVmaXggb3B0aW9uLilcblxuICAgICAgICAgICBpbiB0aGUgJ2NvbmYnIGFyZ3VtZW50IHlvdSBjYW4gcHJvdmlkZSB0aGUgbmV4dCBvcHRpb25zOlxuXG4gICAgICAgICAgIC0gZmV0Y2hPbkNyZWF0ZWQgW2Jvb2xlYW5dOiBieSBkZWZhdWx0IGlzICd0cnVlJywgaWYgdGhlIHZhbHVlIGlzICd0cnVlJyB0aGlzIHdpbGwgZG8gYSBjYWxsIGZvciBmZXRjaGluZyBmcm9tIHRoZSBzdGFydFxuICAgICAgICAgICAtIGZldGNoT25VcGRhdGVQYXJhbXMgW2Jvb2xlYW5dOiBieSBkZWZhdWx0IGlzICd0cnVlJywgaWYgdGhlIHZhbHVlIGlzICd0cnVlJyB0aGlzIHdpbGwgZG8gYSBjYWxsIGZvciBmZXRjaGluZyB3aGVuIHRoZSBwYXJhbXMgYXJlIHVwZGF0ZWRcbiAgICAgICAgICAgLSBmZXRjaE9uVXBkYXRlUG9zdERhdGEgW2Jvb2xlYW5dOiBieSBkZWZhdWx0IGlzICd0cnVlJywgaWYgdGhlIHZhbHVlIGlzICd0cnVlJyB0aGlzIHdpbGwgZG8gYSBjYWxsIGZvciBmZXRjaGluZyB3aGVuIHRoZSAncG9zdCBkYXRhJyBvYmplY3QgaXMgdXBkYXRlZFxuICAgICAgICAgICAtIHVybCBbc3RyaW5nXTogaXMgdGhlIHNlcnZlciBVUkwgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRoZSByZXF1ZXN0XG4gICAgICAgICAgIC0gbWV0aG9kIFtzdHJpbmddOiBieSBkZWZhdWx0IGlzICdHRVQnLCBpcyB0aGUgcmVxdWVzdCBtZXRob2QgdG8gYmUgdXNlZCB3aGVuIG1ha2luZyB0aGUgcmVxdWVzdFxuICAgICAgICAgICAtIGZldGNoT3B0aW9ucyBbb2JqZWN0XTogaXMgdGhlIEF4aW9zIGNvbmZpZyAoaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zKVxuICAgICAgICAgICAtIGRlYm91bmNlV2FpdCBbaW50ZWdlcl06IHRpbWUgdG8gd2FpdCBiZXR3ZWVuIGV2ZXJ5IGNhbGwgdG8gdGhlIGZldGNoIGZ1bmN0aW9uLCBpdCB1c2VzIGZvciBjaGFuZ2VzIGluIGZpZWxkcyBmb3Igdm9pZGluZyBtdWx0aXBsZSBjYWxscyB0byB0aGUgQVBJIHdoZW4gdGhlIHVzZXIgaXMgdHlwaW5nICggdGltZSBpbiBtaWxsaXNlY29uZHMuIGJ5IGRlZmF1bHQ6IDUwMCBtaWxsaXNlY29uZHMpXG5cbiAgICAgICAgICAgSnVzdCBQcm9wczpcblxuICAgICAgICAgICAtIHVybC1wcm9wIFtzdHJpbmddOiByZXBsYWNlIHRoZSB1cmwgb3B0aW9uXG4gICAgICAgICAgIC0gbWV0aG9kLXByb3AgW3N0cmluZ106IHJlcGxhY2UgdGhlIG1ldGhvZCBvcHRpb25cbiAgICAgICAgICAgLSBmZXRjaC1vbi1jcmVhdGVkLXByb3AgW2Jvb2xlYW5dOiByZXBsYWNlIHRoZSBmZXRjaE9uQ3JlYXRlZCBvcHRpb25cbiAgICAgICAgICAgLSBmZXRjaC1vbi11cGRhdGUtcG9zdC1kYXRhLXByb3AgW2Jvb2xlYW5dOiByZXBsYWNlIHRoZSBmZXRjaE9uVXBkYXRlUG9zdERhdGEgb3B0aW9uXG4gICAgICAgICAgIC0gZmV0Y2gtb24tdXBkYXRlLXBhcmFtcy1wcm9wIFtib29sZWFuXTogcmVwbGFjZSB0aGUgZmV0Y2hPblVwZGF0ZVBhcmFtc0RhdGEgb3B0aW9uXG5cbiAgICAgICAgICAgTWV0aG9kczpcblxuICAgICAgICAgICBmZXRjaChzdWNjZXNzRnVuYyBbZnVuY3Rpb25dLCBvcHRpb25zIFtPYmplY3RdKTogeW91IGNhbiBjYWxsIHRoZSBmZXRjaCBmdW5jdGlvbiBmb3IgZG9pbmcgYSBjYWxsIHRvIHRoZSBzZXJ2aWNlIG9yIEFQSS4gYWxzbyB5b3UgY2FuIHBhc3MgdGhlIHN1Y2Nlc3NGdW5jIGZ1bmN0aW9uIGZvciBhbHRlcmluZyBwcm9jZXNzIGJ5IGRlZmF1bHQgd2hlbiB0aGUgcmVzcG9uc2UgaXMgc3VjY2Vzc2Z1bCwgYW5kIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGlzIGZvciBjaGFuZ2luZyBvciBtb2RpZnlpbmcgdGhlIEF4aW9zIGNvbmZpZyAoaHR0cHM6Ly9naXRodWIuY29tL2F4aW9zL2F4aW9zKVxuXG4gICAgICAgICAgIE90aGVyczpcblxuICAgICAgICAgICBQYXJhbXMgKCdwYXJhbXMnKTogaXMgYW4gb2JqZWN0IHdpdGggR0VUIHBhcmFtZXRlcnMgZm9yIHRoZSByZXF1ZXN0LCB5b3UgY2FuIHVzZSBpdCBhcyBhbiBvYmplY3QgaW4gdGhlIFZ1ZSBEYXRhICh3aXRoIHYtbW9kZWwgb3IgYXMgVnVlIHZhcmlhYmxlKS5cblxuICAgICAgICAgICBQb3N0IERhdGEgKCdwb3N0RGF0YScpOiBpcyBhbiBvYmplY3Qgd2l0aCBQT1NUIGRhdGEgcGFyYW1ldGVycyBmb3IgdGhlIHJlcXVlc3QsIHlvdSBjYW4gdXNlIGl0IGFzIGFuIG9iamVjdCBpbiB0aGUgVnVlIERhdGEgKHdpdGggdi1tb2RlbCBvciBhcyBWdWUgdmFyaWFibGUpLlxuXG4qL1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnbGliL21pc2MnO1xuXG5jb25zdCBmZXRjaGVyID0gKHtuYW1lID0gJ2ZldGNoJywgcHJvcHMsIGRhdGE6IGRhdGFQcm9wLCBjcmVhdGVkLCB3YXRjaCwgbWV0aG9kcywgLi4ub3B0aW9uc30sIGNvbmYgPSB7fSkgPT4ge1xuICAgIGNvbnN0IHtcbiAgICAgICAgZmV0Y2hPbkNyZWF0ZWQgPSB0cnVlLFxuICAgICAgICBmZXRjaE9uVXBkYXRlUG9zdERhdGEgPSB0cnVlLFxuICAgICAgICBmZXRjaE9uVXBkYXRlUGFyYW1zID0gdHJ1ZSxcbiAgICAgICAgdXJsLFxuICAgICAgICBtZXRob2QgPSAnR0VUJyxcbiAgICAgICAgZmV0Y2hPcHRpb25zOiBfZmV0Y2hPcHRpb25zID0ge30sXG4gICAgICAgIGZldGNoVHJpZ2dlcixcbiAgICAgICAgZGVib3VuY2VXYWl0ID0gNTAwXG4gICAgfSA9IGNvbmY7XG5cbiAgICBjb25zdCB7IGRhdGE6IHBvc3REYXRhID0ge30sIHBhcmFtcyA9IHt9LCBmZXRjaE9wdGlvbnMgfSA9IF9mZXRjaE9wdGlvbnM7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdXJsUHJvcDogU3RyaW5nLFxuICAgICAgICAgICAgbWV0aG9kUHJvcDogU3RyaW5nLFxuICAgICAgICAgICAgZmV0Y2hPbkNyZWF0ZWRQcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgZmV0Y2hPblVwZGF0ZVBvc3REYXRhUHJvcDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgIGZldGNoT25VcGRhdGVQYXJhbXNQcm9wOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgLi4ucHJvcHNcbiAgICAgICAgfSxcbiAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjb25zdCBfZGF0YVByb3AgPSBkYXRhUHJvcCAmJiBkYXRhUHJvcC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgdXJsOiB0aGlzLnVybFByb3AgfHwgdXJsLFxuICAgICAgICAgICAgICAgIG1ldGhvZDogdGhpcy5tZXRob2RQcm9wIHx8IG1ldGhvZCxcbiAgICAgICAgICAgICAgICBmZXRjaE9wdGlvbnMsXG4gICAgICAgICAgICAgICAgZmV0Y2hPbkNyZWF0ZWQsXG4gICAgICAgICAgICAgICAgZmV0Y2hPblVwZGF0ZVBhcmFtcyxcbiAgICAgICAgICAgICAgICBmZXRjaE9uVXBkYXRlUG9zdERhdGEsXG4gICAgICAgICAgICAgICAgZmV0Y2hUcmlnZ2VyOiB0aGlzLmZldGNoVHJpZ2dlclByb3AgfHwgZmV0Y2hUcmlnZ2VyLFxuICAgICAgICAgICAgICAgIGRhdGE6IG51bGwsXG4gICAgICAgICAgICAgICAgcGFyYW1zLFxuICAgICAgICAgICAgICAgIHBvc3REYXRhLFxuICAgICAgICAgICAgICAgIC4uLl9kYXRhUHJvcCxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmZldGNoT25DcmVhdGVkUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5mZXRjaE9uQ3JlYXRlZCA9IHRoaXMuZmV0Y2hPbkNyZWF0ZWRQcm9wO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5mZXRjaE9uVXBkYXRlUGFyYW1zUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5mZXRjaE9uVXBkYXRlUGFyYW1zID0gdGhpcy5mZXRjaE9uVXBkYXRlUGFyYW1zUHJvcDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZmV0Y2hPblVwZGF0ZVBvc3REYXRhUHJvcCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5mZXRjaE9uVXBkYXRlUG9zdERhdGEgPSB0aGlzLmZldGNoT25VcGRhdGVQb3N0RGF0YVByb3A7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNyZWF0ZWQgJiYgY3JlYXRlZC5jYWxsKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZmV0Y2hPbkNyZWF0ZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICBwYXJhbXM6e1xuICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKCnCoHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZmV0Y2hPblVwZGF0ZVBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZUZldGNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlZXA6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBwb3N0RGF0YTrCoHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyOiBmdW5jdGlvbigpwqB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmZldGNoT25VcGRhdGVQb3N0RGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZUZldGNoKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRlZXA6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi53YXRjaFxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICBkZWJvdW5jZUZldGNoOiBkZWJvdW5jZShmdW5jdGlvbigpeyB0aGlzLmZldGNoKCkgfSwgZGVib3VuY2VXYWl0KSxcbiAgICAgICAgICAgIGZldGNoOiBmdW5jdGlvbihzdWNjZXNzRnVuYywgb3B0aW9ucynCoHtcbiAgICAgICAgICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy51cmwgfHwgdGhpcy5mZXRjaE9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF4aW9zKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdGhpcy51cmwsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHRoaXMubWV0aG9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB0aGlzLnBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHRoaXMucG9zdERhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmZldGNoT3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3VjY2Vzc0Z1bmMgfHwgc3VjY2Vzc0Z1bmMocmVzcG9uc2UpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5kYXRhID0gcmVzcG9uc2UuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC4uLm1ldGhvZHNcbiAgICAgICAgfSxcbiAgICAgICAgLi4ub3B0aW9uc1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZldGNoZXI7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcblxuZXhwb3J0IGNvbnN0IENoZWNrYm94ID0ge1xuICAgIHByb3BzOiBbJ2RhdGEnLCAnbGFiZWwnLCAndmFsdWUnLCAndHlwZScsICdjYXRlZ29yeSddLFxuICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICBpc0NoZWNrZWQ6IGZhbHNlLFxuICAgICAgICB9XG4gICAgfSxcbiAgICAvLyB0ZW1wbGF0ZSBmb3IgcHJvZHVjdCBjaGVja2JveGVzIG9ubHlcbiAgICAvLyBzdGF0aWMgY2hlY2tib3hlcyBhcmUgaW5saW5lIHRlbXBsYXRlcyBcbiAgICB0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiY2hlY2tib3hcIj5cbiAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94X19sYWJlbFwiPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBjbGFzcz1cImNoZWNrYm94X19pbnB1dFwiIHJlZj1cImlucHV0XCIgdi1vbjpjaGFuZ2U9XCJ1cGRhdGVGaWx0ZXJzKGRhdGEuY2xhc3MsICRldmVudCwgdHlwZSlcIiBcbiAgICAgICAgICAgICAgICA6dmFsdWU9XCJ2YWx1ZVwiIFxuICAgICAgICAgICAgICAgIDpjaGVja2VkPVwiaXNDaGVja2VkXCIgXG4gICAgICAgICAgICAgICAgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgXG4gICAgICAgICAgICAgICAgOmRhdGEtdGFnLW1ldGE9XCJ0YWdnaW5nTWV0YVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiY2hlY2tib3hfX2NoZWNrbWFya1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrYm94X19sYWJlbC10ZXh0XCIgdi1odG1sPVwibGFiZWxcIj48L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICAgIHdhdGNoOiB7XG4gICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5jaGVja1N0YXRlKCk7XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YS5wcm9kdWN0c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tQcm9kdWN0U3RhdGUoKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICBcInR5cGVcIjogdGhpcy5kYXRhLnRyYWNraW5nVHlwZSwgXG4gICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogdGhpcy5jYXRlZ29yeSB8fCBudWxsLCBcbiAgICAgICAgICAgICAgICBcImxhYmVsXCI6IGRlY29kZVVSSUNvbXBvbmVudCh0aGlzLmlkKVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgICB1cGRhdGVGaWx0ZXJzKGVsLCBlLCB0eXBlKSB7XG4gICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlRmlsdGVycycsIGVsLCBlLCB0eXBlKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tTdGF0ZSgpIHtcbiAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChlbCA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGVsLnZhbHVlID09IHRoaXMuaWQ7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHRoaXMuaXNDaGVja2VkID0gaXRlbSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfSxcbiAgICAgICAgY2hlY2tQcm9kdWN0U3RhdGUoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSBcInByb2R1Y3RcIikge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXMgcHJvZHVjdFwiKTtcbiAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsXCIsIGVsLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpZFwiLCB0aGlzLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnZhbHVlID09IHRoaXMuaWQ7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSBpdGVtID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuaXNDaGVja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy5pZCA9IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLiRyZWZzLmlucHV0LnZhbHVlKTtcbiAgICAgICAgLy8gdGhpcy5jYXRlZ29yeSA9IG51bGw7XG4gICAgICAgIHRoaXMuY2hlY2tTdGF0ZSgpO1xuICAgICAgICAvLyBpZiBoYXMgc2F2ZWQgZG9jcyBmaWx0ZXIsIGdldCB0aGUgbGFiZWxcbiAgICAgICAgaWYgKHRoaXMuJHJlZnMuaW5wdXQuZGF0YXNldC5zYXZlZExhYmVsKSB7XG4gICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzTGFiZWwgPSB0aGlzLiRyZWZzLmlucHV0LmRhdGFzZXQuc2F2ZWRMYWJlbDtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBBY2NvcmRpb24gPSB7XG4gICAgcHJvcHM6IFsnZGF0YScsICdkZWZhdWx0b3BlbiddLFxuICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgJ2NoZWNrYm94LWl0ZW0nOiBDaGVja2JveFxuICAgIH0sICAgICAgXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc09wZW46ICh0aGlzLmRlZmF1bHRvcGVuID8gdHJ1ZSA6IGZhbHNlKSwgLy9pcyB0aGUgYWNjb3JkaW9uIG9wZW5cbiAgICAgICAgICAgIGlzVHJ1bmNhdGVkOiBudWxsLCAvL2lzIGFjY29yZGlvbiBjb250ZW50IHRydW5jYXRlZCBcbiAgICAgICAgICAgIG9wZW5UZXh0OiBudWxsLFxuICAgICAgICAgICAgY2xvc2VUZXh0OiBudWxsLFxuICAgICAgICAgICAgc2VlQWxsVHlwZXNUZXh0OiBmYWxzZVxuICAgICAgICB9XG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgICBpc1RydW5jYXRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1RydW5jYXRlZCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVuVGV4dCA9IHRoaXMuJHJlZnMuZXhwYW5kVGV4dC5kYXRhc2V0LmV4cGFuZFRleHQ7XG4gICAgICAgICAgICAgICAgdGhpcy5jbG9zZVRleHQgPSB0aGlzLiRyZWZzLmV4cGFuZFRleHQuZGF0YXNldC5jb2xsYXBzZVRleHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIFwiZGF0YS5wcm9kdWN0c1wiOiB7XG4gICAgICAgICAgICBkZWVwOiB0cnVlLFxuICAgICAgICAgICAgaGFuZGxlcigpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcnVuY2F0ZWQgPSB0aGlzLmRhdGEucHJvZHVjdHMubGVuZ3RoID4gMCA/IHRoaXMuaXNUcnVuY2F0ZWQgOiBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmNoZWNrYm94Om50aC1vZi10eXBlKDYpJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlVHJ1bmNhdGlvbih0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNUcnVuY2F0ZWQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgfSk7ICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICAgIGhhbmRsZUNsaWNrKCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVBY2NvcmRpb24oKTtcbiAgICAgICAgfSxcblxuICAgICAgICB0b2dnbGVBY2NvcmRpb24oKSB7XG4gICAgICAgICAgICBsZXQgY29udGVudEFyZWEgPSB0aGlzLiRyZWZzLm91dGVyQ29udGFpbmVyO1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSB0aGlzLiRyZWZzLmlubmVyQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvL3NldCBjb250ZW50IGFyZWEgaGVpZ2h0IHRvIGNvbnRlbnQgaGVpZ2h0IHRvIHByZXZlbnQgdHJhbnNpdGlvbmluZyBmcm9tIGF1dG9cbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbiB0byBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSBjb250ZW50SGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICdub25lJztcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgdGhpcy5zZWVBbGxUeXBlc1RleHQgPSAhdGhpcy5zZWVBbGxUeXBlc1RleHRcbiAgICAgICAgfSxcbiAgICAgICAgdG9nZ2xlVHJ1bmNhdGlvbihzdGF0ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0cnVuY2F0ZSB0aGlzXCIpO1xuICAgICAgICAgICAgaWYgKHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc1RydW5jYXRlZCA9IHN0YXRlO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlzVHJ1bmNhdGVkID0gdGhpcy5pc1RydW5jYXRlZCA9PSBudWxsID8gdHJ1ZSA6ICF0aGlzLmlzVHJ1bmNhdGVkO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdHJ1bmNIZWlnaHQgPSAwO1xuICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IHRoaXMuJHJlZnMuaW5uZXJDb250YWluZXI7XG5cbiAgICAgICAgICAgIGNvbnN0IHRydW5jYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgNjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoYC5jaGVja2JveDpudGgtb2YtdHlwZSgke2l9KWApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbUhlaWdodCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsU3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWwpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbU1hcmdpbiA9IHBhcnNlRmxvYXQoZWxTdHlsZXMubWFyZ2luQm90dG9tKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnVuY0hlaWdodCA9IHRydW5jSGVpZ2h0ICsgaXRlbUhlaWdodCArIGl0ZW1NYXJnaW47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRydW5jSGVpZ2h0ID0gdHJ1bmNIZWlnaHQgKyA1OyAvL2xpdHRsZSBiaXQgb2Ygd2lnZ2xlcm9vbVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0cnVuY2F0ZSgpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc1RydW5jYXRlZCA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLnN0eWxlLm1heEhlaWdodCA9IHRydW5jSGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuc3R5bGUubWF4SGVpZ2h0ID0gJ25vbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgIFxuICAgIH1cbn07XG5cbmV4cG9ydCBjb25zdCBTZWxlY3RlZEZpbHRlcnNDb21wb25lbnQgPSB7XG4gICAgcHJvcHM6IFsnZGF0YSddLFxuICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICB9XG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgICBjbGFzc05hbWU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuZGF0YS5jbGFzc31fX3NlbGVjdGVkLWZpbHRlcnNgO1xuICAgICAgICB9IFxuICAgIH0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPGRpdiA6Y2xhc3M9XCJjbGFzc05hbWVcIiA6ZGF0YT1cImRhdGFcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmaWx0ZXItbGFiZWxcIiB2LWZvcj1cImZpbHRlciBpbiBkYXRhLmZpbHRlcnNcIiA6a2V5PVwiZmlsdGVyLnZhbHVlXCIgOmRhdGEtdmFsdWU9XCJmaWx0ZXIudmFsdWVcIiA6ZGF0YS10eXBlPVwiZmlsdGVyLnR5cGVcIiB2LW9uOmNsaWNrPVwicmVtb3ZlRmlsdGVyKCRldmVudClcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWxhYmVsX193cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZmlsdGVyLWxhYmVsX19pY29uXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImZpbHRlci1sYWJlbF9fdGV4dFwiPnt7ZmlsdGVyLm5hbWV9fTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICBgLFxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgcmVtb3ZlRmlsdGVyKGUpIHtcbiAgICAgICAgICAgIGxldCB0eXBlID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQudHlwZTtcbiAgICAgICAgICAgIGxldCB2YWx1ZSA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnZhbHVlO1xuICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsIHZhbHVlLCB0eXBlKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgXG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IFBhZ2VOdW0gPSB7XG4gICAgcHJvcHM6IFsnZGF0YScsICdudW0nXSxcbiAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhZ2U6IG51bGwsXG4gICAgICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICBpc1NwYWNlcjogZmFsc2VcbiAgICAgICAgfVxuICAgIH0sXG4gICAgd2F0Y2g6IHtcbiAgICAgICAgXCJkYXRhLmN1cnJlbnRQYWdlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLm51bSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgdGVtcGxhdGU6IGBcbiAgICAgICAgPHNwYW4gOmNsYXNzPVwie2FjdGl2ZTogaXNBY3RpdmV9XCIgdi1vbjpjbGljaz1cImNoYW5nZVBhZ2VUbyhudW0pXCI+e3tudW19fTwvc3Bhbj5cbiAgICBgLFxuICAgIG1ldGhvZHM6IHtcbiAgICAgICAgY2hhbmdlUGFnZVRvKG51bSkge1xuICAgICAgICAgICAgaWYobnVtICE9PSBcIi4uLlwiKSB7XG4gICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ2NoYW5nZS1wYWdlLXRvJywgdGhpcy5kYXRhLmNsYXNzLCBudW0pO1xuICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzY3JvbGwtdG8tdG9wJywgdGhpcy5kYXRhLmNsYXNzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLm51bSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgUGFnaW5hdGlvbiA9IHtcbiAgICBwcm9wczogWydkYXRhJ10sXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwYWdlTnVtczogW10sXG4gICAgICAgIH1cbiAgICB9LFxuICAgIGNvbXB1dGVkOiB7XG4gICAgICAgIGNsYXNzTmFtZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRhLmNsYXNzfV9fcGFnaW5hdGlvbi1udW1zYDtcbiAgICAgICAgfVxuICAgIH0sICBcbiAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICdwYWdlLW51bSc6IFBhZ2VOdW1cbiAgICB9LFxuICAgIHdhdGNoOiB7XG4gICAgICAgIFwiZGF0YS5jdXJyZW50UGFnZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZU51bXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID4gdGhpcy5kYXRhLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnY2hhbmdlLXBhZ2UtdG8nLCB0aGlzLmRhdGEuY2xhc3MsIDEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBcImRhdGEudG90YWxQYWdlc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMucGFnZU51bXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnY2hhbmdlLXBhZ2UtdG8nLCB0aGlzLmRhdGEuY2xhc3MsIDEpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgOmNsYXNzPVwiY2xhc3NOYW1lXCI+XG4gICAgICAgIDxwYWdlLW51bSB2LWZvcj1cIihudW0sIGluZGV4KSBpbiBwYWdlTnVtc1wiIDpudW09XCJudW1cIiA6ZGF0YT1cImRhdGFcIiA6a2V5PVwiaW5kZXhcIi8+XG4gICAgPC9kaXY+XG4gICAgYCxcbiAgICBtZXRob2RzOiB7XG4gICAgICAgIGluaXRQYWdlcygpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmRhdGEudG90YWxQYWdlcyA8PSA2KSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgbGVzcyB0aGFuIDYgcGFnZXMsIGxpc3QgYWxsIHBhZ2VzXG4gICAgICAgICAgICAgICAgZm9yKGxldCBwYWdlID0gMTsgcGFnZSA8IHRoaXMuZGF0YS50b3RhbFBhZ2VzICsgMTsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZU51bXMucHVzaChwYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA+IHRoaXMuZGF0YS50b3RhbFBhZ2VzIC0gNikge1xuICAgICAgICAgICAgICAgICAgICAvLyBvbiB0aGUgbGFzdCA2IHBhZ2VzLCBkbyBub3QgYWRkIGVsbGlwc2lzXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgcGFnZSA9IHRoaXMuZGF0YS50b3RhbFBhZ2VzIC0gNTsgcGFnZSA8IHRoaXMuZGF0YS5jdXJyZW50UGFnZSArIDYgJiYgcGFnZSA8IHRoaXMuZGF0YS50b3RhbFBhZ2VzICsgMTsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VOdW1zLnB1c2gocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhwYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgb24gdGhlIGxhc3QgNiBwYWdlcywgYWRkIGVsbHBpc2lzXG4gICAgICAgICAgICAgICAgICAgIGZvcihsZXQgcGFnZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZTsgcGFnZSA8IHRoaXMuZGF0YS5jdXJyZW50UGFnZSArIDMgJiYgcGFnZSA8IHRoaXMuZGF0YS50b3RhbFBhZ2VzIC0gMTsgcGFnZSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VOdW1zLnB1c2gocGFnZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlTnVtcy5wdXNoKFwiLi4uXCIpO1xuICAgICAgICAgICAgICAgICAgICBmb3IobGV0IHBhZ2UgPSB0aGlzLmRhdGEudG90YWxQYWdlcyAtIDE7IHBhZ2UgPCB0aGlzLmRhdGEudG90YWxQYWdlcyArIDE7IHBhZ2UrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlTnVtcy5wdXNoKHBhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkKCkge1xuICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xuICAgIH1cbn07XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuXG5jb25zdCBGb290ZXJVbml0cyA9ICgpID0+IHtcblxuICAgIGxldCBmb290ZXJVbml0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5mb290ZXJfX3VuaXRzLWNvbnRhaW5lcicpO1xuXG4gICAgbGV0IEZvb3RlclVuaXRzQ29uc3RydWN0b3IgPSAoKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2Zvb3Rlci11bml0LXRvZ2dsZXInLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFVuaXQ6IHN0b3JlLnN0YXRlLnVuaXRzLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFVuaXRUZXh0OiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgdW5pdHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUudW5pdHM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJjdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJQcmVmZXJlbmNlXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBcIlVuaXQgb2YgbWVhc3VyZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLnNlbGVjdGVkVW5pdFRleHRcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICB1bml0czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVbml0ID0gdGhpcy51bml0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRUYWdzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVDaGFuZ2UoZSkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3NldFVuaXRzJywgZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFdpZHRoKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRUYWdzKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ID0gdGhpcy4kcmVmcy5zZWxlY3Q7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHNlbGVjdCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZFRleHQgPSBzZWxlY3Qub3B0aW9uc1tzZWxlY3Quc2VsZWN0ZWRJbmRleF0gPyBzZWxlY3Qub3B0aW9uc1tzZWxlY3Quc2VsZWN0ZWRJbmRleF0udGV4dCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVbml0VGV4dCA9IHNlbGVjdGVkVGV4dDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXRUYWdzKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7c3RvcmUuc3RhdGUudW5pdHN9XCJdYCkgPyB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke3N0b3JlLnN0YXRlLnVuaXRzfVwiXWApLmlubmVyVGV4dCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVbml0VGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRXaWR0aCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdCA9IHRoaXMuJHJlZnMuc2VsZWN0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGAkeyhzZWxlY3RlZFRleHQubGVuZ3RoIC8gMikgKyAyfWVtYDsgLy9hc3N1bWVzIGVhY2ggY2hhcmEgaXMgfi41ZW0gd2lkdGgsICsyZW0gYnVmZmVyXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdC5zdHlsZS5tYXhXaWR0aCA9IHdpZHRoO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0VGFncygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFdpZHRoKCk7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRhZ3MoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnZm9vdGVyLWxhbmctdG9nZ2xlcicsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTGFuZzogc3RvcmUuc3RhdGUuY3VycmVudExhbmcsXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTGFuZ1RleHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlczogW10sXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlOiBzdG9yZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHRhZ2dpbmdNZXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImN0YVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlByZWZlcmVuY2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiTGFuZ3VhZ2VcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5zZWxlY3RlZExhbmdUZXh0XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQ2hhbmdlKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGUudGFyZ2V0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZWwgPSB0aGlzLiRyZWZzLnNlbGVjdDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmcgPSBlbC5vcHRpb25zW2VsLnNlbGVjdGVkSW5kZXhdLmRhdGFzZXQubGFuZztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGxhbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmNvb2tpZSA9IGBzZWxlY3RlZExhbmd1YWdlPSR7bGFuZ307IHBhdGg9LzsgbWF4LWFnZT0zMTUzNjAwMDtgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB1cmw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRUYWdzKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoYG9wdGlvblt2YWx1ZT1cIiR7c3RvcmUuc3RhdGUuY3VycmVudExhbmd9XCJdYCkgPyB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKGBvcHRpb25bdmFsdWU9XCIke3N0b3JlLnN0YXRlLmN1cnJlbnRMYW5nfVwiXWApLmlubmVyVGV4dCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRMYW5nVGV4dCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRXaWR0aCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdCA9IHRoaXMuJHJlZnMuc2VsZWN0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRUZXh0ID0gc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLnRleHQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IGAkeyhzZWxlY3RlZFRleHQubGVuZ3RoIC8gMikgKyAyfWVtYDsvL2Fzc3VtZXMgZWFjaCBjaGFyYSBpcyB+LjVlbSB3aWR0aCwgKzJlbSBidWZmZXJcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0LnN0eWxlLm1heFdpZHRoID0gd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFRhZ3MoKTtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0V2lkdGgoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5mb290ZXJfX3VuaXRzLWNvbnRhaW5lcmAsXG4gICAgICAgIH0pLiRtb3VudChgLmZvb3Rlcl9fdW5pdHMtY29udGFpbmVyYCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGZvb3RlclVuaXRzKSB7XG4gICAgICAgIEZvb3RlclVuaXRzQ29uc3RydWN0b3IoKTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgRm9vdGVyVW5pdHM7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7dmlkZW9Nb2RhbH0gZnJvbSAnLi9tb2RhbHMnO1xuXG5jb25zdCBGV01lZGlhID0gKCkgPT4ge1xuXG4gICAgbGV0IG1lZGlhID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmZ3LW1lZGlhLS12aWRlbycpO1xuICAgIFZ1ZS51c2UoVk1vZGFsKTtcblxuICAgIGxldCBtZWRpYUNvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2Z3LW1lZGlhLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9Vcmw6ICcnLFxuICAgICAgICAgICAgICAgICAgICB2aWRlb05hbWU6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGxhdW5jaFZpZGVvKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICB2aWRlb01vZGFsLnRlbXBsYXRlKHRoaXMudmlkZW9VcmwsIHRoaXMudmlkZW9OYW1lKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwub3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb1VybCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5mdy1tZWRpYV9fcGxheS1idXR0b24nKS5kYXRhc2V0LnZpZGVvVXJsO1xuICAgICAgICAgICAgICAgIHRoaXMudmlkZW9OYW1lID0gdGhpcy4kcmVmcy5uYW1lID8gdGhpcy4kcmVmcy5uYW1lLmlubmVySFRNTCA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIFxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmZ3LW1lZGlhLXZpZGVvLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAuZnctbWVkaWEtdmlkZW8tJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAobWVkaWEubGVuZ3RoID4gMCkge1xuICAgICAgICBtZWRpYS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBmdy1tZWRpYS12aWRlby0ke2luZGV4fWApO1xuICAgICAgICAgICAgbWVkaWFDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBGV01lZGlhOyIsIi8qIFxuQWxsb3dzIGZvciBpbmxpbmUgdGV4dCBsaW5rcyB0byB0cmlnZ2VyIHZ1ZSBtb2RhbHMgd2l0aCBhbnkgY29udGVudFxuKi9cblxuaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7Z2VuZXJpY01vZGFsfSBmcm9tICcuL21vZGFscyc7XG5cblZ1ZS51c2UoVk1vZGFsKTtcblxuY29uc3QgZ2VuZXJpY01vZGFscyA9ICgpID0+IHtcbiAgICBsZXQgaW5zdGFuY2UgPSBuZXcgVnVlKHtcbiAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgdHJpZ2dlck1vZGFsKGNvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgICAgICBnZW5lcmljTW9kYWwudGVtcGxhdGUoY29udGVudCksXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNNb2RhbC5uYW1lLCBcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJpY01vZGFsLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGdlbmVyaWNNb2RhbC5ldmVudHNcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBsZXQgbW9kYWxEYXRhID0gW107XG5cbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2VuLW1vZGFsJykuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICBsZXQgZGF0YSA9IHtcbiAgICAgICAgICAgIFwiaGFzaHRhZ1wiOiBpdGVtLmRhdGFzZXQuaGFzaHRhZyxcbiAgICAgICAgICAgIFwiY29udGVudFwiOiBpdGVtLmlubmVySFRNTFxuICAgICAgICB9XG4gICAgICAgIG1vZGFsRGF0YS5wdXNoKGRhdGEpO1xuICAgIH0pO1xuXG4gICAgaWYgKG1vZGFsRGF0YSkge1xuICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICBpZiAoZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG4gICAgXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbW9kYWxEYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaW5jbHVkZXMoYCMke21vZGFsRGF0YVtpXS5oYXNodGFnfWApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS50cmlnZ2VyTW9kYWwobW9kYWxEYXRhW2ldLmNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBnZW5lcmljTW9kYWxzOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQge3NwZWNzVGFibGVUZW1wbGF0ZX0gZnJvbSAnLi9zcGVjLXRhYmxlJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IEhlcm9Qcm9kdWN0ID0gKCkgPT4ge1xuXG4gICAgY29uc3QgaGVyb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVyby1wcm9kdWN0cycpO1xuXG4gICAgY29uc3QgaGVyb1Byb2R1Y3RDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdoZXJvLXByb2R1Y3QtdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzaXplU2VsZWN0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB2aWV3Q29uZmlnOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBnYWxsZXJ5SXRlbXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEltYWdlOiAxLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW06IG51bGwgLy9wcm9kdWN0IG5hbWUgZm9yIHBhc3NpbmcgdG8gY2hpbGQgc3BlYyB0YWJsZSBjb21wb25lbnRcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEltYWdlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGFzc2lnbiB1bmlxdWUgSUQgdG8gZWFjaCBnYWxsZXJ5IGl0ZW1cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbXVsdGlwbGUgaW1hZ2VzLCBzZXQgZ2FsbGVyeSBhcnJheVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tcHJvZHVjdHNfX2dhbGxlcnktaW1hZ2UnKS5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdhbGxlcnkgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBwdXNoIGltYWdlcyBhbmQgdGhlaXIgaGVpZ2h0cyB0byBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tcHJvZHVjdHNfX2dhbGxlcnktaW1hZ2UnKS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZGF0YXNldC5pZCA9IGluZGV4ICsgMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhpdGVtLmNsaWVudEhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nYWxsZXJ5SXRlbXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzogaXRlbS5zcmMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG9ubHkgb25lIGltYWdlLCBzZXQgaWQgdG8gMSAodGhlIGRlZmF1bHQgc2VsZWN0ZWQgaW1hZ2UgaWQpXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuaGVyby1wcm9kdWN0c19fZ2FsbGVyeS1pbWFnZScpLmRhdGFzZXQuaWQgPSAxO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW0gPSB0aGlzLiRyZWZzLnRpdGxlID8gdGhpcy4kcmVmcy50aXRsZS5pbm5lclRleHQgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlSW1hZ2VTZWxlY3QoaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEltYWdlID0gaWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIC8vIHJlY2lldmUgc2VsZWN0ZWQgZ2FsbGVyeSBpdGVtIGZyb20gY2hpbGRcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3NlbGVjdGVkSW1hZ2UnLCAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVJbWFnZVNlbGVjdChpZCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2hlcm8tcHJvZHVjdHMtaW1hZ2UnLCB7XG4gICAgICAgICAgICBwcm9wczogWydzZWxlY3RlZEltYWdlJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJbWFnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnNlbGVjdGVkSW1hZ2UgPT0gdGhpcy5pZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRlbC5kYXRhc2V0LmlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy5zZWxlY3RlZEltYWdlID09IHRoaXMuaWQgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2hlcm8tcHJvZHVjdHMtdGh1bWJuYWlscycsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2dhbGxlcnlJdGVtcycsICdzZWxlY3RlZEltYWdlJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPHVsIGNsYXNzPVwiaGVyby1wcm9kdWN0c19fdGh1bWJuYWlsLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgIDxoZXJvLXByb2R1Y3RzLXRodW1ibmFpbC1pdGVtIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBnYWxsZXJ5SXRlbXNcIiA6aW1hZ2U9XCJpdGVtLnNyY1wiIDppZD1cImluZGV4ICsgMVwiIDpzZWxlY3RlZC1pbWFnZT1cInNlbGVjdGVkSW1hZ2VcIiA6a2V5PVwiaW5kZXhcIi8+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnaGVyby1wcm9kdWN0cy10aHVtYm5haWwtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2ltYWdlJywgJ2lkJywgJ3NlbGVjdGVkSW1hZ2UnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIGltYWdlVXJsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGB1cmwoJyR7dGhpcy5pbWFnZX0nKWBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZEltYWdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuc2VsZWN0ZWRJbWFnZSA9PSB0aGlzLmlkID8gdHJ1ZSA6IGZhbHNlIDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cImhlcm8tcHJvZHVjdHNfX3RodW1ibmFpbC1pdGVtXCIgdi1iaW5kOnN0eWxlPVwie2JhY2tncm91bmRJbWFnZTogaW1hZ2VVcmx9XCIgdi1vbjpjbGljaz1cInNlbGVjdEltYWdlXCIgOmNsYXNzPVwie2FjdGl2ZTogaXNBY3RpdmV9XCI+PC9saT5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0SW1hZ2UoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGVtaXQgaWQgb2YgY2xpY2tlZCBlbGVtZW50IHRvIHBhcmVudFxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2VsZWN0ZWRJbWFnZScsIHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnNlbGVjdGVkSW1hZ2UgPT0gdGhpcy5pZCA/IHRydWUgOiBmYWxzZSA7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAuaGVyby1wcm9kdWN0cy0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAuaGVyby1wcm9kdWN0cy0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIHNwZWNzVGFibGVUZW1wbGF0ZSgpO1xuXG4gICAgaWYgKGhlcm9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgaGVyb3MuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgaGVyby1wcm9kdWN0cy0ke2luZGV4fWApO1xuICAgICAgICAgICAgaGVyb1Byb2R1Y3RDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IEhlcm9Qcm9kdWN0OyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IGhvbWVIZXJvID0gKCkgPT4ge1xuXG4gICAgY29uc3QgY29tcG9uZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhvbWUtaGVybycpO1xuXG4gICAgbGV0IGhlcm9Db25zdHJ1Y3RvciA9ICgpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnaG9tZS1oZXJvJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICBzZWxlY3RlZElkOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy4kb24oJ3NlbGVjdC1zZWN0aW9uJywgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJZCA9IGlkO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdoZXJvLXNlY3Rpb24nLCB7XG4gICAgICAgICAgICBwcm9wczogWydzZWxlY3RlZElkJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICBpc0hvdmVyZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgIGlkOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLnNlbGVjdGVkSWQgPT0gdGhpcy5pZCA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlzSG92ZXJlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzSG92ZXJlZCB8fCB0aGlzLmlzQWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYXlWaWRlbygpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXVzZVZpZGVvKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNBY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxheVZpZGVvKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdXNlVmlkZW8oKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgIHRvZ2dsZUV4cGFuZCgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC4kZW1pdCgnc2VsZWN0LXNlY3Rpb24nLCB0aGlzLmlzQWN0aXZlID8gbnVsbCA6IHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuaXNBY3RpdmUgPSAhdGhpcy5pc0FjdGl2ZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgbW91c2VvdmVyKCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibW91c2VkIG92ZXJcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0hvdmVyZWQgPSB0cnVlO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBtb3VzZWxlYXZlKCkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibW91c2UgbGVhdmVcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0hvdmVyZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgcGxheVZpZGVvKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMudmlkZW8ucGxheSgpO1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBwYXVzZVZpZGVvKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMudmlkZW8ucGF1c2UoKTtcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5ob21lLWhlcm9fX2FyZWEnKSkuaW5kZXhPZih0aGlzLiRlbCk7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5ob21lLWhlcm9gLFxuICAgICAgICB9KS4kbW91bnQoYC5ob21lLWhlcm9gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoY29tcG9uZW50KSB7XG4gICAgICAgIGhlcm9Db25zdHJ1Y3RvcigpO1xuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBob21lSGVybztcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuXG5leHBvcnQgY29uc3QgdGVtcGxhdGUgPSB7XG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhY3RpdmVUYWI6ICcnLFxuICAgICAgICAgICAgaXNNb2JpbGU6IG51bGxcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgICBzZXRBY3RpdmVUYWIoZSkge1xuICAgICAgICAgICAgdGhpcy5hY3RpdmVUYWIgPSBlO1xuICAgICAgICB9LFxuICAgICAgICBoYW5kbGVUYWIoZSkge1xuICAgICAgICAgICAgbGV0IHRhYlRhcmdldCA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0LnRhcmdldDtcblxuICAgICAgICAgICAgaWYgKHRhYlRhcmdldCAhPT0gdGhpcy5hY3RpdmVUYWIpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImRlcnBcIik7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVUYWIodGFiVGFyZ2V0KTtcbiAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuaGl3X190YWItaXRlbS5hY3RpdmUnKS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoYFtkYXRhLXRhcmdldD0ke3RhYlRhcmdldH1dYCkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHNldFJlc3BvbnNpdmUobXFsKSB7XG4gICAgICAgICAgICB0aGlzLmlzTW9iaWxlID0gbXFsLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgaW5saW5lIHN0eWxlcyBmcm9tIGFjY29yZGlvbnNcbiAgICAgICAgICAgICAgICBsZXQgYWNjb3JkaW9uQ29udGFpbmVycyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaXdfX2hpdy1jb250ZW50LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgIGFjY29yZGlvbkNvbnRhaW5lcnMuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlID0gbnVsbDtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgLy8gc2V0IHRoZSBmaXJzdCB0YWIgdG8gYWN0aXZlXG4gICAgICAgIGluaXREZXNrdG9wKCkge1xuICAgICAgICAgICAgLy8gdGhpcyBpcyBjaGVja2luZyBmb3IgYSBicmVha3BvaW50ICpzbWFsbGVyKiB0aGFuXG4gICAgICAgICAgICAvLyB2YXIgaXNNb2JpbGUgaW4gc3RvcmUuanNcbiAgICAgICAgICAgIHZhciBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogNjUwcHgpJyk7XG4gICAgICAgICAgICB0aGlzLmlzTW9iaWxlID0gbXFsLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgIG1xbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlc3BvbnNpdmUobXFsKTtcbiAgICAgICAgICAgIH0pO1xuICAgIFxuXG4gICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkgeyAvL3VuZGVyIDY1MHB4XG4gICAgICAgICAgICAgICAgbGV0IGluaXRpYWwgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YXJnZXRdJykgPyB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YXJnZXRdJykuZGF0YXNldC50YXJnZXQgOiBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGFiID0gaW5pdGlhbDtcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vb3ZlciA2NTBweFxuICAgICAgICAgICAgICAgIC8vIGlmIGRlc2t0b3AsIGNoZWNrIGZvciBkZXNrdG9wIGJ1dHRvbnMgYW5kIHNldCBpbml0aWFsIHRhYlxuICAgICAgICAgICAgICAgIGxldCBpbml0aWFsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFyZ2V0XScpID8gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignW2RhdGEtdGFyZ2V0XScpLmRhdGFzZXQudGFyZ2V0IDogbnVsbDtcbiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVRhYiA9IGluaXRpYWw7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJ1tkYXRhLXRhcmdldF0nKSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCdbZGF0YS10YXJnZXRdJykuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkKCkge1xuICAgICAgICB0aGlzLmluaXREZXNrdG9wKCk7IC8vc2V0IHRoZSBmaXJzdCB0YWIgdG8gYWN0aXZlIG9uIGluaXRcbiAgICAgICAgLy9saXN0ZW4gZm9yIGNoaWxkIGNsaWNrIGV2ZW50cyBvbiB0aGUgbGFiZWxzIGFuZCBwYXNzIHRhcmdldHMgdG8gcGFyZW50XG4gICAgICAgIEV2ZW50QnVzLiRvbignaGFuZGxlLW1vYmlsZScsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYihlKTtcbiAgICAgICAgfSlcbiAgICAgICAgRXZlbnRCdXMuJG9uKCdoYW5kbGUtZGVza3RvcCcsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNldEFjdGl2ZVRhYihlKTtcbiAgICAgICAgfSlcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgdGFiTGFiZWwgPSB7XG4gICAgcHJvcHM6IFsnYWN0aXZlVGFiJywgJ2lzTW9iaWxlJ10sXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWJUYXJnZXQ6ICcnLFxuICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgaW5kZXg6IG51bGwsXG4gICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICB9XG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkRyYXdlclwiLFxuICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiT3BlblwiLFxuICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sYWJlbCxcbiAgICAgICAgICAgICAgICBcIm5vXCI6IHRoaXMuaW5kZXggPCAxMCA/IGAwJHt0aGlzLmluZGV4fWAgOiBgJHt0aGlzLmluZGV4fWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgICBhY3RpdmVUYWI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuYWN0aXZlVGFiID09IHRoaXMudGFiVGFyZ2V0ID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBtZXRob2RzOiB7XG4gICAgICAgIGhhbmRsZVRhYihlKSB7XG4gICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnaGFuZGxlLWRlc2t0b3AnLCB0aGlzLnRhYlRhcmdldCk7XG4gICAgICAgIH0sXG4gICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICB0aGlzLmxhYmVsID0gdGhpcy4kZWwuaW5uZXJUZXh0O1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coKVxuICAgICAgICAgICAgdGhpcy5pbmRleCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaXdfX3RhYi1sYWJlbHMgbGknKSkuaW5kZXhPZih0aGlzLiRlbCkgKyAxO1xuICAgICAgICB9LFxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy50YWJUYXJnZXQgPSB0aGlzLiRlbC5kYXRhc2V0LnRhcmdldDtcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGNvbnN0IGNvbnRlbnRUZW1wbGF0ZSA9IHtcbiAgICBwcm9wczogWydhY3RpdmVUYWInLCAnaXNNb2JpbGUnXSwgLy9hY3RpdmUgdGFiXG4gICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0YWJOYW1lOiAnJyxcbiAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZSwgLy9pcyBjdXJyZW50IHRhYiB0aGUgc2VsZWN0ZWQgdGFiICdhY3RpdmVUYWInXG4gICAgICAgICAgICBpc09wZW46IGZhbHNlLCAvL2lzIHRhYiBvcGVubVxuICAgICAgICAgICAgbGFiZWw6IG51bGwsXG4gICAgICAgICAgICBpbmRleDogbnVsbFxuICAgICAgICB9XG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsXG4gICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkRyYXdlclwiLFxuICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiT3BlblwiLFxuICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sYWJlbCxcbiAgICAgICAgICAgICAgICBcIm5vXCI6IHRoaXMuaW5kZXggPCAxMCA/IGAwJHt0aGlzLmluZGV4fWAgOiBgJHt0aGlzLmluZGV4fWBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcbiAgICB3YXRjaDoge1xuICAgICAgICBhY3RpdmVUYWI6IGZ1bmN0aW9uKHRhYikge1xuICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMudGFiTmFtZSA9PSB0YWIgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgIH0sXG4gICAgICAgIGlzQWN0aXZlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7IC8vc2V0IGFjY29kaW9uIHRvIGNsb3NlIHdoZW4gbm90IHRoZSBhY3RpdmUgaXRlbVxuXG4gICAgICAgICAgICAgICAgLy8gY2xvc2UgdGhlIGFjY29yZGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7XG5cbiAgICAgICAgICAgICAgICBsZXQgY29udGVudEFyZWEgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuaGl3X19oaXctY29udGVudC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5oaXdfX2hpdy1jb250ZW50LWlubmVyJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvL3NldCBjb250ZW50IGFyZWEgaGVpZ2h0IHRvIGNvbnRlbnQgaGVpZ2h0IHRvIHByZXZlbnQgdHJhbnNpdGlvbmluZyBmcm9tIGF1dG9cbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbiB0byBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1RvcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgdGhpcyBpcyB0aGUgYWN0aXZlIHRhYiwgc2V0IGlzT3BlbiB0byB0cnVlIHdoZW4gaXNBY3RpdmUgaXMgdHJ1ZSB0byBwcmUgb3BlbiB0aGUgdGFiIG9uIG1vYmlsZVxuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgICBoYW5kbGVNb2JpbGUoZSkge1xuICAgICAgICAgICAgbGV0IG1vYmlsZVRhcmdldCA9IGUuY3VycmVudFRhcmdldC5wYXJlbnROb2RlLmRhdGFzZXQudGFiSWQ7XG5cbiAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdoYW5kbGUtbW9iaWxlJywgbW9iaWxlVGFyZ2V0KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAvLyB0b2dnbGUgdGhlIGFjY29yZGlvblxuICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlQWNjb3JkaW9uKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBzY3JvbGxUb1RvcCgpIHtcbiAgICAgICAgICAgIGxldCBlbG1PZmZzZXQgPSB0aGlzLiRlbC5vZmZzZXRUb3A7XG4gICAgICAgICAgICBsZXQgc2Nyb2xsT2Zmc2V0ID0gd2luZG93LnNjcm9sbFk7XG4gICAgICAgICAgICBpZiAoZWxtT2Zmc2V0IDwgc2Nyb2xsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsbVBvcyA9IHRoaXMuJGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIHdpbmRvdy5zY3JvbGxZO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b3A6IChlbG1Qb3MgLSA3MCksXG4gICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSw1MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAvLyB0b2dnbGUgYWNjb3JkaW9uc1xuICAgICAgICBoYW5kbGVBY2NvcmRpb24oZSkge1xuICAgICAgICAgICAgbGV0IGNvbnRlbnRBcmVhID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmhpd19faGl3LWNvbnRlbnQtY29udGFpbmVyJyk7XG4gICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5oaXdfX2hpdy1jb250ZW50LWlubmVyJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc09wZW4gPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbnRlbnQgYXJlYSBoZWlnaHQgdG8gY29udGVudCBoZWlnaHQgdG8gcHJldmVudCB0cmFuc2l0aW9uaW5nIGZyb20gYXV0b1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSBjb250ZW50SGVpZ2h0ICsgJ3B4JztcbiAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0aGUgZWxlbWVudCB0cmFuc2l0aW9uIHRvIGhlaWdodDogMFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnMHB4JztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJ25vbmUnO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGluaXRNb2JpbGUoKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXMgbW9iaWxlXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIm5vdCBtb2JpbGVcIik7XG5cbiAgICAgICAgICAgICAgICAvLyByZW1vdmUgYWxsIGlubGluZSBzdHlsZXMgZm9yIGFjY29yZGlvbnMgb24gZGVza3RvcFxuICAgICAgICAgICAgICAgIGxldCBjb250ZW50Q29udGFpbmVycyA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaXdfX2hpdy1jb250ZW50LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgIGNvbnRlbnRDb250YWluZXJzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZSA9ICcnXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICB0aGlzLmluZGV4ID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhpd19fYXJlYS1jb250ZW50IC5oaXdfX2hpdy1jb250YWluZXInKSkuaW5kZXhPZih0aGlzLiRlbCkgKyAxO1xuICAgICAgICAgICAgdGhpcy5sYWJlbCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5oaXdfX3RhYi1sYWJlbHMgbGknKSlbKHRoaXMuaW5kZXggLSAxKV0uaW5uZXJUZXh0O1xuICAgICAgICB9XG4gICAgfSxcbiAgICBtb3VudGVkKCkge1xuICAgICAgICB2YXIgaW5pdGlhbFRhYiA9IHRoaXMuJGVsLmRhdGFzZXQudGFiSWQ7XG4gICAgICAgIHRoaXMudGFiTmFtZSA9IGluaXRpYWxUYWI7XG4gICAgICAgIHRoaXMuaW5pdE1vYmlsZSgpO1xuICAgICAgICB0aGlzLmluaXQoKTtcbiAgICB9XG59O1xuXG5cbmNvbnN0IEhvd0l0V29ya3MgPSAoKSA9PiB7XG4gICAgY29uc3QgaW5zdGFuY2VzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhpd19fd3JhcHBlcicpO1xuXG4gICAgbGV0IGhpd0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIC8vIG1haW4gY29tcG9uZW50IHdyYXBwZXJcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnaGl3LXRlbXBsYXRlJywgdGVtcGxhdGUpO1xuXG4gICAgICAgIC8vIGRlc2t0b3AgbGFiZWxzXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2hpdy10YWItbGFiZWwnLCB0YWJMYWJlbCk7XG5cbiAgICAgICAgLy8gbW9iaWxlIGFjY29yZGlvbiBjb250YWluZXJzICYgbGFiZWxzXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2hpdy1jb250ZW50LXRlbXBsYXRlJywgY29udGVudFRlbXBsYXRlKTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmhpdy0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAuaGl3LSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGluc3RhbmNlcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBoaXctJHtpbmRleH1gKTtcbiAgICAgICAgICAgIGhpd0NvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEhvd0l0V29ya3M7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcblxuY29uc3QgaW50ZXJuYWxTZWFyY2ggPSAoKSA9PiB7XG5cbiAgICBsZXQgc2VhcmNoQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gnKTtcblxuICAgIGxldCBpbnRlcm5hbFNlYXJjaENvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2ludGVybmFsLXNlYXJjaCcsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMudmFsdWUgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIm5vIHZhbHVlXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnaW50ZXJuYWwtc2VhcmNoJywgbnVsbCwgdGhpcy50eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlU3VibWl0KGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdGhpcy52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IHNlYXJjaCBxdWVyeSB0byBkb2N1bWVudGF0aW9uIGFuZCBzb2Z0d2FyZSBtb2R1bGVzXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdpbnRlcm5hbC1zZWFyY2gnLCB2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50eXBlID0gdGhpcy4kcmVmcy5mb3JtLmRhdGFzZXQudHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5pbnRlcm5hbC1zZWFyY2gtJHtpZH1gLFxuICAgICAgICB9KS4kbW91bnQoYC5pbnRlcm5hbC1zZWFyY2gtJHtpZH1gLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgaWYgKHNlYXJjaEJhci5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNlYXJjaEJhci5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBpbnRlcm5hbC1zZWFyY2gtJHtpbmRleH1gKTtcbiAgICAgICAgICAgIGludGVybmFsU2VhcmNoQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBpbnRlcm5hbFNlYXJjaDsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQgZnBvZGIgZnJvbSAnLi4vLi4vLi4vZGIuanNvbic7XG5pbXBvcnQgeyBBY2NvcmRpb24sIFNlbGVjdGVkRmlsdGVyc0NvbXBvbmVudCwgQ2hlY2tib3gsIFBhZ2luYXRpb24gfSBmcm9tICcuL2ZpbHRlci1jb21wb25lbnRzJztcblxuY29uc3Qgc2FmZVN0cmluZyA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cik7XG59XG5cbmNvbnN0IExlZ2FsID0gKCkgPT4ge1xuXG4gICAgbGV0IGxlZ2FsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxlZ2FsJyk7XG5cbiAgICBjb25zdCBsZWdhbENvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2xlZ2FsLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IDEsIC8vY3VycmVudCBwYWdlICNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUGFnZXM6IG51bGwsIC8vdG90YWwgcmV0dXJucyBwYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZXN1bHRzOiBudWxsLCAvL3RvdGFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3duUmVzdWx0czogbnVsbCwgLy90b3RhbCBzaG93biBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1Zpc2libGU6IG51bGwsIC8vYXJlIGZpbHRlcnMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxEb2NzOiBbXSwgLy9mb3IgZW1haWxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jczogW10sIC8vYm9va21hcmtlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzTGFiZWw6IG51bGwsIC8vbGFiZWwgZm9yIHNhdmVkIGRvY3MsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3NPbmx5OiBudWxsLCAvL2lzIHNhdmVkIGRvY3Mgb25seSBjaGVja2VkP1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0QWN0aXZlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwaVVybDogbnVsbCwgLy9mb3IgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhcmFtczogbnVsbCwgLy9mb3IgZGVlcGxpbmtpbmcgaW4tYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVBbGw6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdsZWdhbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1R5cGU6ICdkb2N1bWVudCdcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlOiBzdG9yZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnZmlsdGVyLWFjY29yZGlvbi10ZW1wbGF0ZSc6IEFjY29yZGlvbixcbiAgICAgICAgICAgICAgICAnc2VsZWN0ZWRGaWx0ZXJzJzogU2VsZWN0ZWRGaWx0ZXJzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICdjaGVja2JveC1pdGVtJzogQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgJ3BhZ2luYXRpb24nOiBQYWdpbmF0aW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmxlZ2FsRG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2VSYW5nZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEudG90YWxSZXN1bHRzID4gMTApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgMS0ke3RoaXMuZGF0YS5zaG93blJlc3VsdHN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IHRoaXMuZGF0YS50b3RhbFBhZ2VzICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmRhdGEudG90YWxSZXN1bHRzIC0gdGhpcy5kYXRhLnNob3duUmVzdWx0cyArIDF9LSR7dGhpcy5kYXRhLnRvdGFsUmVzdWx0c31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7KHRoaXMuZGF0YS5zaG93blJlc3VsdHMgKiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlIC0gMSkpICsgMX0tJHt0aGlzLmRhdGEuc2hvd25SZXN1bHRzICogdGhpcy5kYXRhLmN1cnJlbnRQYWdlfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnNob3duUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuY3VycmVudFBhZ2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzID0gdGhpcy5zYXZlZDtcblxuICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgc2F2ZWQgb25seSBmaWx0ZXIgaWYgbm8gc2F2ZWQgaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2F2ZWQubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKCdzYXZlZERvY3VtZW50cycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaXNNb2JpbGUgPSB0aGlzLmNvbXB1dGVkSXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9ICF0aGlzLmNvbXB1dGVkSXNNb2JpbGUgPyB0cnVlIDogdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLmZpbHRlcnNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpOyAvLyBoYW5kbGUgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVIaXN0b3J5KCk7IC8vIGhhbmRsZSBoaXN0b3J5IHJlY29yZFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxOyAvL3Jlc2V0IHBhZ2UgdG8gMVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzID0gW107XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgaWYgYnJhbmQgaXMgc2VsZWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJyYW5kcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudHlwZSA9PSBcImJyYW5kXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChlbCA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBzYXZlZERvY3NPbmx5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZE9ubHkgPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNhdmVkRG9jdW1lbnRzXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3NPbmx5ID0gc2F2ZWRPbmx5ID8gc2F2ZWRPbmx5LnZhbHVlIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucHJldkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucHJldkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVIaXN0b3J5KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEudG90YWxSZXN1bHRzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgdG9nZ2xlRmlsdGVycygpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjbGlja2VkXCIpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlzIG1vYmlsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9ICF0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc2FmZVN0cmluZyhlLmN1cnJlbnRUYXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBlLmN1cnJlbnRUYXJnZXQucGFyZW50Tm9kZS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGVja2VkID0gZS5jdXJyZW50VGFyZ2V0LmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwidHlwZVwiLCB0eXBlKVxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ2YWx1ZVwiLCBzYWZlU3RyaW5nKGUudGFyZ2V0LnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hlY2tlZFwiLGUudGFyZ2V0LmNoZWNrZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJzYXZlZERvY3VtZW50c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIHtcInZhbHVlXCI6IHZhbHVlLCBcInR5cGVcIjogdHlwZSwgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCB7XCJ2YWx1ZVwiOiBjaGVja2VkLCBcInR5cGVcIjogdHlwZSwgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIklOREVYXCIsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlcyBzcGVjaWZpYyBmaWx0ZXJcbiAgICAgICAgICAgICAgICByZW1vdmVGaWx0ZXIoZWwsIHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7cmV0dXJuOyB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGNsZWFycyBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgcmVtb3ZlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxOyAvL3Jlc2V0IHBhZ2UgdG8gMVxuICAgICAgICAgICAgICAgIH0sICBcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICBnZXRVcmwoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZFBhcmFtcyA9IHRoaXMuZGF0YS5zYXZlZERvY3MudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgY2VydFR5cGVQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwiY2VydFR5cGVcIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFuZ1BhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJsYW5nXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGRvY1R5cGVQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwiZG9jVHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWdpb25QYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwicmVnaW9uXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYXZlZE9ubHkgPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZERvY3VtZW50c1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2F2ZWRPbmx5LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZVBhcmFtcyA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudXJsUGFyYW1zID0gYD8ke2NlcnRUeXBlUGFyYW1zICE9PSBcIlwiID8gXCImY2VydGlmaWNhdGlvblR5cGU9XCIgKyBjZXJ0VHlwZVBhcmFtcyA6IFwiXCJ9JHtsYW5nUGFyYW1zICE9PSBcIlwiID8gXCImbGFuZz1cIiArIGxhbmdQYXJhbXMgOiBcIlwifSR7cmVnaW9uUGFyYW1zICE9PSBcIlwiID8gXCImcmVnaW9uPVwiICsgcmVnaW9uUGFyYW1zIDogXCJcIn0ke2RvY1R5cGVQYXJhbXMgIT09IFwiXCIgPyBcIiZkb2NUeXBlPVwiICsgZG9jVHlwZVBhcmFtcyA6IFwiXCJ9JnNhdmVkRG9jdW1lbnRzPSR7c2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zKCl9JnBhZ2U9JHtwYWdlUGFyYW1zfWA7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHMocXVlcnkpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiYXBpL2RvY3VtZW50cz9cIjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gcXVlcnkgPyAxIDogdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVybCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZVVybCA9IHdpbmRvdy5sZWdhbEFQSVVybDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaVVybCA9IGAke2Jhc2VVcmx9JHtiYXNlVXJsLmluZGV4T2YoJz8nKSA+IC0xID8gJycgOiAnPyd9YDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL2xlZ2FsXCI7IC8vZnJvbSBqc29uLXNlcnZlclxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhdmVkT25seSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNhdmVkRG9jdW1lbnRzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgY2VydFR5cGUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlZ2lvbiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgZG9jVHlwZSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJjZXJ0VHlwZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZXJ0VHlwZS5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGFuZ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5nLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJyZWdpb25cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaW9uLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkb2NUeXBlXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY1R5cGUucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgY2VydFR5cGVTdHIgPSBkZWNvZGVVUklDb21wb25lbnQoY2VydFR5cGUuam9pbignfCcpKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmdTdHIgPSBkZWNvZGVVUklDb21wb25lbnQobGFuZy5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmVnaW9uU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KHJlZ2lvbi5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG9jVHlwZVN0ciA9IGRlY29kZVVSSUNvbXBvbmVudChkb2NUeXBlLmpvaW4oJ3wnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGF4aW9zUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcTogcXVlcnkgPyBxdWVyeSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZDogKHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpKSA9PSBcIlwiID8gbnVsbCA6IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpLmNoYXJBdCgwKSA9PSBcIixcIiA/IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpLnNsaWNlKDEpIDogdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JyksIC8vQFRPRE8gbWFrZSB0aGlzIGxlc3MgaW5zYW5lLiBTZW5kIE5VTEwgaWYgZW1wdHkgc3RyaW5nLiBSZW1vdmUgbGVhZGluZyBjb21tYSBpZiBwcmVzZW50LlxuICAgICAgICAgICAgICAgICAgICAgICAgY2VydGlmaWNhdGlvblR5cGU6IGNlcnRUeXBlU3RyID09IFwiXCIgPyBudWxsIDogY2VydFR5cGVTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZTogbGFuZ1N0ciA9PSBcIlwiID8gbnVsbCA6IGxhbmdTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWdpb246IHJlZ2lvblN0ciA9PSBcIlwiID8gbnVsbCA6IHJlZ2lvblN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY1R5cGU6IGRvY1R5cGVTdHIgPT0gXCJcIiA/IG51bGwgOiBkb2NUeXBlU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2N1bWVudHM6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5kYXRhLmN1cnJlbnRQYWdlLFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYXhpb3NQYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYXBpVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmF4aW9zUGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5yZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnRvdGFsUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEudG90YWxSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5zaG93blJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VQYWdlKGRpcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IFwicHJldlwiICYmIHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlLS07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyID09IFwibmV4dFwiICYmIHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzY3JvbGwtdG8tdG9wJywgdGhpcy5kYXRhLmNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1cGRhdGVFbWFpbERvY3MoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZGF0YS5lbWFpbERvY3MuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkID09IGRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmVtYWlsRG9jcyA9IFsuLi50aGlzLmRhdGEuZW1haWxEb2NzLCBkYXRhXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3Muc3BsaWNlKHRoaXMuZGF0YS5lbWFpbERvY3MuaW5kZXhPZihpdGVtKSwxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy91cGRhdGUgaGlzdG9yeSByZWNvcmQgd2hlbiBmaWx0ZXJzIGNoYW5nZVxuICAgICAgICAgICAgICAgIHVwZGF0ZUhpc3RvcnkoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgJHt3aW5kb3cubG9jYXRpb24ucGF0aG5hbWV9JHt0aGlzLmRhdGEudXJsUGFyYW1zfWA7XG4gICAgICAgICAgICAgICAgICAgIGhpc3RvcnkucHVzaFN0YXRlKFwiXCIsXCJcIix1cmwpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlIGRlZXAgbGlua2luZyBvbiBoaXN0b3J5IGNoYW5nZVxuICAgICAgICAgICAgICAgIGRlZXBsaW5rKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaC5zdWJzdHIoMSkuc3BsaXQoXCImXCIpLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtICE9IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHBhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5maWx0ZXJzID0gW107IC8vY2xlYXIgZmlsdGVycyBhcnJheSBmaXJzdFxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBpbml0RmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFnZTtcblxuICAgICAgICAgICAgICAgICAgICBwYXJhbXMuZm9yRWFjaChwYXJhbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHBhcmFtLnNsaWNlKDAsIHBhcmFtLmluZGV4T2YoJz0nKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudCA9IHBhcmFtLnNsaWNlKHBhcmFtLmluZGV4T2YoJz0nKSArIDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJUWVBFXCIsdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkNPTlRFTlRcIiwgY29udGVudCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbnRyeSA9IHt9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcInBhZ2VcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUEFHRVwiLCBwYXJzZUludChjb250ZW50KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gcGFyc2VJbnQoY29udGVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFnZSA9IHBhcnNlSW50KGNvbnRlbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IFwic2F2ZWREb2N1bWVudHNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ID09IFwiZmFsc2VcIiB8fCBjb250ZW50ID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IHRoaXMuZGF0YS5zYXZlZERvY3NMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pbml0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnQuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEFycmF5ID0gY29udGVudC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcnJheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IGRlY29kZVVSSUNvbXBvbmVudChpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pbml0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBkZWNvZGVVUklDb21wb25lbnQoY29udGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW5pdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IGluaXRGaWx0ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5pbml0RmlsdGVycyk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gcGFnZTtcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2Nyb2xsVG9Ub3AoZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtyZXR1cm47fVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9wID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmxlZ2FsX19hcmVhLWNhcmRzJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFkgLSAxMDA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRvcCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0UGFnZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRvdGFsIHJlc3VsdCBjb3VudCwgZGl2aWRlIGJ5IDEwIHRvIGdldCB0b3RhbCBwYWdlcyBuZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0aCBjZWlsIHRvIHJvdW5kIHVwXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBhY3RpdmUgZm9yIHByZXYvbmV4dCBiYXNlZCBvbiBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAvIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IDEgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSB0aGlzLmRhdGEudG90YWxQYWdlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzID0gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmxlZ2FsRG9jdW1lbnRJZFswXSA9PSBcIlwiID8gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmxlZ2FsRG9jdW1lbnRJZC5zbGljZSgxKSA6IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5sZWdhbERvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9IHRoaXMuZGF0YS5pc01vYmlsZSA/IGZhbHNlIDogdHJ1ZTsgLy9pbml0IHNob3cvaGlkZSBmaWx0ZXJzIGlmL2lzIG1vYmlsZVxuICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIGZpbHRlciB1cGRhdGVzIGluIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbigndXBkYXRlRmlsdGVycycsIChlbCwgZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzKGVsLCBlLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbigncmVtb3ZlLWZpbHRlcicsIChlbCwgdmFsdWUsIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRmlsdGVyKGVsICx2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2NoYW5nZS1wYWdlLXRvJywgKGVsLCBudW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7cmV0dXJuO307XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignZW1haWwtZG9jcycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVtYWlsRG9jcyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignaW50ZXJuYWwtc2VhcmNoJywgKHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcImRvY3VtZW50YXRpb25cIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cyh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3Njcm9sbC10by10b3AnLCAoZWwpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9Ub3AoZWwpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5yZXN1bHRzID0gd2luZG93LmluaXRpYWxMZWdhbEFwaVJlc3VsdHMucmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsTGVnYWxBcGlSZXN1bHRzLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNob3duUmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsTGVnYWxBcGlSZXN1bHRzLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEucmVzdWx0cyA9IGZwb2RiLmxlZ2FsLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPSBmcG9kYi5sZWdhbC50b3RhbFJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSBmcG9kYi5sZWdhbC5yZXN1bHRzLmxlbmd0aDtcblxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZmlsdGVycyBpZiBsZXNzIHRoZW4gMTAgaW5pdGlhbCByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJBcmVhVmlzaWJsZSA9IHBhcnNlSW50KHRoaXMuZGF0YS50b3RhbFJlc3VsdHMpIDw9IDEwID8gZmFsc2UgOiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBcInNoYXJlIGFsbFwiIGlmIDUgb2YgbGVzcyByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zaGFyZUFsbCA9IHBhcnNlSW50KHRoaXMuZGF0YS50b3RhbFJlc3VsdHMpIDw9IDUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5vbnBvcHN0YXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5kZWVwbGluaygpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0UGFnZXMoKTtcbiAgICAgICAgICAgICAgICAvLyBmb3IgZGVlcGxpbmtpbmdcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZXBsaW5rKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgXG4gICAgICAgIC8vIHJlc3VsdHMgbGlzdFxuICAgICAgICBWdWUuY29tcG9uZW50KCdsZWdhbC1yZXN1bHRzLWxpc3QnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiBcInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxlZ2FsX19jYXJkcy1jb250ZW50XCIgOmRhdGE9XCJkYXRhXCI+XG4gICAgICAgICAgICAgICAgPGxlZ2FsLXJlc3VsdHMtaXRlbSB2LWZvcj1cIihyZXN1bHQsIGluZGV4KSBpbiBkYXRhLnJlc3VsdHNcIiA6Y29udGVudD1cInJlc3VsdFwiIDppc1NlbGVjdGVkPVwiaXNTZWxlY3RlZChyZXN1bHQpXCIgOmtleT1cInJlc3VsdC5pZFwiIDpkYXRhPVwiZGF0YVwiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkKHJlc3VsdCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuZW1haWxEb2NzLmZpbmQoaSA9PiBpLmlkID09IHJlc3VsdC5pZCkgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIHNpbmdsZSByZXN1bHRzIGl0ZW1cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbGVnYWwtcmVzdWx0cy1pdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdjb250ZW50JywgJ2lzU2VsZWN0ZWQnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzQ2hlY2tlZDogdGhpcy5pc1NlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICBpc0Jvb2ttYXJrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsOiBudWxsLCAvL2lzIFwic2VlIGFsbFwiIGZlYXR1cmUgZW5hYmxlZCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsT3BlbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsTGFiZWw6IG51bGwsLy9sYWJlbFxuICAgICAgICAgICAgICAgICAgICBtb3JlQ29udGVudDogbnVsbCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMubGVnYWxEb2N1bWVudElkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZW5jb2RlZFVybDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQodGhpcy5jb250ZW50LnVybCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXdUYWJMaW5rOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC51cmwucmVwbGFjZSgnZG93bmxvYWQ9dHJ1ZScsICdkb3dubG9hZD1mYWxzZScpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnTWV0YUJvZHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwibGVnYWxEb2N1bWVudFwiLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogdGhpcy5jb250ZW50LmV5ZWJyb3csIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmNvbnRlbnQubmFtZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhbmd1YWdlXCI6IHRoaXMuY29udGVudC5sYW5ndWFnZVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKHRoaXMuaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLmVtYWlsRG9jc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYodGhpcy5kYXRhLmVtYWlsRG9jcy5sZW5ndGggPT09IDApe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJjb250ZW50XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaWQgd2hlbiBjb250ZW50IGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5sZWdhbERvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwic2VlQWxsXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVBbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsTGFiZWwgPSB0aGlzLnNlZUFsbE9wZW4gPyB3aW5kb3cuc2VlTGVzc0xhYmVsIDogd2luZG93LnNlZUFsbExhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInNlZUFsbE9wZW5cIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZUFsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxMYWJlbCA9IHRoaXMuc2VlQWxsT3BlbiA/IHdpbmRvdy5zZWVMZXNzTGFiZWwgOiB3aW5kb3cuc2VlQWxsTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZCBkb2MtY2FyZC0tY2hlY2tib3hcIiA6ZGF0YT1cImRhdGFcIiA6Y2xhc3M9XCJ7J2hpZGUtYm9va21hcmsnOiAoZGF0YS5zYXZlZERvY3NPbmx5ID09PSB0cnVlKSAmJiAoaXNCb29rbWFya2VkID09PSBmYWxzZSl9XCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgOmRhdGEtdGFnLW1ldGE9J3RhZ01ldGFCb2R5Jz5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX3dyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fYXJlYSBkb2MtY2FyZF9fYXJlYS1jaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94X19sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwiY2hlY2tib3hfX2lucHV0XCIgOnZhbHVlPVwiY29udGVudC5pZFwiIHYtb246Y2hhbmdlPVwiZW1haWxEb2NcIiB2LW1vZGVsPVwiaXNDaGVja2VkXCIgOmNoZWNrZWQ9XCJpc0NoZWNrZWRcIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwibGVnYWxEb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIlNlbGVjdFwifSc+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrYm94X19jaGVja21hcmtcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvbGFiZWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19hcmVhIGRvYy1jYXJkX19hcmVhLWluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX2FyZWEgZG9jLWNhcmRfX2FyZWEtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19leWVicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnQuZXllYnJvd319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgOmhyZWY9XCJuZXdUYWJMaW5rXCIgY2xhc3M9XCJkb2MtY2FyZF9fdGl0bGVcIiB0YXJnZXQ9XCJfYmxhbmtcIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwibGVnYWxEb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIlByZXZpZXdcIn0nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb250ZW50Lm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZG9jLWNhcmRfX3N1YnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19zdWJ0aXRsZS1jb250ZW50XCIgcmVmPVwic2VlQWxsQ29udGVudFwiPnt7Y29udGVudC5kZXRhaWxzfX08L3NwYW4+IDxzcGFuIGNsYXNzPVwiZG9jLWNhcmRfX3N1YnRpdGxlLW1vcmVcIiB2LWlmPVwic2VlQWxsICYmIHNlZUFsbE9wZW5cIj5cXHt7bW9yZUNvbnRlbnR9fTwvc3Bhbj4gPGEgaHJlZj1cIiNcIiB2LW9uOmNsaWNrLnByZXZlbnQ9XCJ0b2dnbGVTZWVBbGxcIiB2LWlmPVwic2VlQWxsXCI+XFx7e3NlZUFsbExhYmVsfX08L2E+IHwge3tjb250ZW50Lmxhbmd1YWdlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX2FyZWEgZG9jLWNhcmRfX2FyZWEtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJkb2MtY2FyZF9faWNvbiBkb2MtY2FyZF9faWNvbi1kb3dubG9hZFwiIDpocmVmPVwiY29udGVudC51cmxcIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwibGVnYWxEb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIkRvd25sb2FkXCJ9Jz48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tZW1haWxcIiA6aHJlZj1cIidtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9JyArIGNvbnRlbnQubmFtZSArICc6ICcgKyB0aGlzLmVuY29kZWRVcmxcIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwibGVnYWxEb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIkVtYWlsXCJ9Jz48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tYm9va21hcmtcIiA6ZGF0YS1sZWdhbC1kb2N1bWVudC1pZD1cImNvbnRlbnQuaWRcIiByZWY9XCJib29rbWFya1wiIHYtb246Y2xpY2s9XCJoYW5kbGVCb29rbWFya1wiIDpjbGFzcz1cInthY3RpdmU6IGlzQm9va21hcmtlZH1cIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwibGVnYWxEb2N1bWVudFwiLCBcImFjdGlvblwiOiBcIkZhdm9yaXRlXCJ9Jz48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBlbWFpbERvYygpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ2VtYWlsLWRvY3MnLCB7XCJuYW1lXCI6IHRoaXMuY29udGVudC5uYW1lLCBcInVybFwiOiB0aGlzLmNvbnRlbnQudXJsLCBcImlkXCI6IHRoaXMuY29udGVudC5pZH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgndXBkYXRlRmF2b3JpdGVzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBcImxlZ2FsRG9jdW1lbnRJZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNwYXRjaCgnY2hlY2tGYXZvcml0ZXMnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvZ2dsZVNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxPcGVuID0gIXRoaXMuc2VlQWxsT3BlbjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXRTZWVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRyZWZzLnNlZUFsbENvbnRlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxzID0gdGhpcy4kcmVmcy5zZWVBbGxDb250ZW50LmlubmVySFRNTC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGwgPSBkZXRhaWxzLmxlbmd0aCA+IDMgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0cnVuY2F0ZWREZXRhaWxzID0gZGV0YWlscy5zbGljZSgwLDMpLmpvaW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtb3JlRGV0YWlscyA9IGRldGFpbHMuc2xpY2UoMykuam9pbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vcmVDb250ZW50ID0gbW9yZURldGFpbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnNlZUFsbENvbnRlbnQuaW5uZXJIVE1MID0gYCR7dHJ1bmNhdGVkRGV0YWlsc30ke21vcmVEZXRhaWxzID09IFwiXCIgPyAnJyA6ICcsJ31gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5sZWdhbERvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzYXZlZFwiLHRoaXMuc2F2ZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFNlZUFsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdlbWFpbC1kb2NzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbHRvOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyBtYWlsdG9BbGw6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBcImRhdGEuZW1haWxEb2NzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haWx0byA9IGAke21haWx0b30ke2VuY29kZVVSSUNvbXBvbmVudChpdGVtLm5hbWUpfTogJHtlbmNvZGVVUklDb21wb25lbnQoaXRlbS51cmwpfSUwRCUwQWA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haWx0byA9IG1haWx0bztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIC8vIHNoYXJlQWxsKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGF0YS5yZXN1bHRzLmZvckVhY2goaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBtYWlsdG8gPSBgJHttYWlsdG99JHtpdGVtLm5hbWV9OiAke2l0ZW0udXJsfSUwRCUwQWA7XG4gICAgICAgICAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLm1haWx0b0FsbCA9IG1haWx0bztcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAvLyBpZiAocGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gNSkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLnNoYXJlQWxsKCk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLmxlZ2FsLSR7aWR9YCxcbiAgICAgICAgICAgIHN0b3JlOiBzdG9yZVxuICAgICAgICB9KS4kbW91bnQoYC5sZWdhbC0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChsZWdhbC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxlZ2FsLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYGxlZ2FsLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBsZWdhbENvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICB3aW5kb3cuc2VlTGVzc0xhYmVsID0gXCJzZWUgbGVzc1wiO1xuICAgIHdpbmRvdy5zZWVBbGxMYWJlbCA9IFwic2VlIG1vcmVcIjtcblxufVxuXG5leHBvcnQgZGVmYXVsdCBMZWdhbDtcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBmcG9kYiBmcm9tICcuLi8uLi8uLi9kYi5qc29uJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7IGluc3RhbmNlIH0gZnJvbSBcIi4vbW9kYWwtdHJpZ2dlclwiO1xuaW1wb3J0IHsgQWNjb3JkaW9uLCBTZWxlY3RlZEZpbHRlcnNDb21wb25lbnQsIENoZWNrYm94LCBQYWdpbmF0aW9uIH0gZnJvbSAnLi9maWx0ZXItY29tcG9uZW50cyc7XG5cblZ1ZS51c2UoVk1vZGFsKTtcblxuY29uc3Qgc2FmZVN0cmluZyA9IChzdHIpID0+IHtcbiAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHN0cik7XG59XG5cbmNvbnN0IExpdE9yZGVyID0gKCkgPT4ge1xuXG4gICAgbGV0IGxpdE9yZGVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmxpdC1vcmRlcicpO1xuXG4gICAgY29uc3QgbGl0T3JkZXJDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdsaXQtb3JkZXItdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZTogMSwgLy9jdXJyZW50IHBhZ2UgI1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxQYWdlczogbnVsbCwgLy90b3RhbCByZXR1cm5zIHBhZ2VzXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFJlc3VsdHM6IG51bGwsIC8vdG90YWwgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd25SZXN1bHRzOiBudWxsLCAvL3RvdGFsIHNob3duIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzVmlzaWJsZTogbnVsbCwgLy9hcmUgZmlsdGVycyB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJBcmVhVmlzaWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0czogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBlbWFpbERvY3M6IFtdLCAvL2ZvciBlbWFpbGluZ1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzOiBbXSwgLy9ib29rbWFya2VkIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3NMYWJlbDogbnVsbCwgLy9sYWJlbCBmb3Igc2F2ZWQgZG9jcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jc09ubHk6IG51bGwsIC8vaXMgc2F2ZWQgZG9jcyBvbmx5IGNoZWNrZWQ/XG4gICAgICAgICAgICAgICAgICAgICAgICBpc01vYmlsZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBY3RpdmU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2QWN0aXZlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBpVXJsOiBudWxsLCAvL2ZvciBhcGkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1zOiBudWxsLCAvL2ZvciBkZWVwbGlua2luZyBpbi1icm93c2VyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZUFsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogbnVsbCwgLy9zZWFyY2ggcXVlcnksXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZEl0ZW1zOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FydENvbnRlbnRzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNTdWJtaXR0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWxUYXJnZXQ6IG51bGwsIC8vbW9kYWwgaGFzaCBmb3IgbGl0IG9yZGVyIGZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzOiAnbGl0LW9yZGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNraW5nVHlwZTogJ2RvY3VtZW50J1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnZmlsdGVyLWFjY29yZGlvbi10ZW1wbGF0ZSc6IEFjY29yZGlvbixcbiAgICAgICAgICAgICAgICAnc2VsZWN0ZWRGaWx0ZXJzJzogU2VsZWN0ZWRGaWx0ZXJzQ29tcG9uZW50LFxuICAgICAgICAgICAgICAgICdjaGVja2JveC1pdGVtJzogQ2hlY2tib3gsXG4gICAgICAgICAgICAgICAgJ3BhZ2luYXRpb24nOiBQYWdpbmF0aW9uXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBwYWdlUmFuZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA+IDEwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDEtJHt0aGlzLmRhdGEuc2hvd25SZXN1bHRzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLmRhdGEudG90YWxQYWdlcyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAtIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgKyAxfS0ke3RoaXMuZGF0YS50b3RhbFJlc3VsdHN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyh0aGlzLmRhdGEuc2hvd25SZXN1bHRzICogKHRoaXMuZGF0YS5jdXJyZW50UGFnZSAtIDEpKSArIDF9LSR7dGhpcy5kYXRhLnNob3duUmVzdWx0cyAqIHRoaXMuZGF0YS5jdXJyZW50UGFnZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93blJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2U6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGFuZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5jdXJyZW50TGFuZztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3MgPSB0aGlzLnNhdmVkO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzYXZlZCBvbmx5IGZpbHRlciBpZiBubyBzYXZlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zYXZlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YoJ3NhdmVkRG9jdW1lbnRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHRoaXMuY29tcHV0ZWRJc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuY29tcHV0ZWRJc01vYmlsZSA/IHRydWUgOiB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEuZmlsdGVyc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7IC8vIGhhbmRsZSBhcGkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZUhpc3RvcnkoKTsgLy8gaGFuZGxlIGhpc3RvcnkgcmVjb3JkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7IC8vcmVzZXQgcGFnZSB0byAxXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBpZiBicmFuZCBpcyBzZWxlY3RlZFxuICAgICAgICAgICAgICAgICAgICBsZXQgYnJhbmRzID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC50eXBlID09IFwiYnJhbmRcIjtcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGJyYW5kcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBvcHVsYXRlUHJvZHVjdHMoYnJhbmRzKTsgXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2lmIG5vdCBicmFuZCBzZWxlY3RlZCwgZW1wdHkgdGhlIHByb2R1Y3RzIGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucHJvZHVjdHMgPSBbXTsgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgc2VsZWN0ZWQgcHJvZHVjdCBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC50eXBlID09IFwicHJvZHVjdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRmlsdGVyKHRoaXMuZGF0YS5jbGFzcywgaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBzYXZlZERvY3NPbmx5IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZE9ubHkgPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNhdmVkRG9jdW1lbnRzXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3NPbmx5ID0gc2F2ZWRPbmx5ID8gc2F2ZWRPbmx5LnZhbHVlIDogbnVsbDtcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFnZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucHJldkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucHJldkFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVIaXN0b3J5KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEudG90YWxSZXN1bHRzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLmVtYWlsRG9jc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVMaXRPcmRlckNhcnQnLCB0aGlzLmRhdGEuZW1haWxEb2NzKTsgLy9zdG9yZSBjYXJ0IGluIHN0b3JlXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0IGRhdGEgc3RyaW5nIGZvciBwYXNzaW5nIHNlbGVjdGVkIGRvY3MgdG8gcGFyZG90XG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtc1N0cjtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0ciA9IGBET0NVTUVOVCBJRDogJHtpdGVtLnBhcnROdW1iZXJ9IHwgRE9DVU1FTlQgTkFNRTogJHtpdGVtLm5hbWV9IHwgUVVBTlRJVFk6ICR7aXRlbS5xdHl9IHwgUFJFLVBVTkNIRUQ6ICR7aXRlbS5wcmVQdW5jaGVkID09IHRydWUgPyBcInllc1wiIDogXCJub1wifWA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbXNTdHIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtc1N0ciA9IHN0ciA/IGAke2l0ZW1zU3RyfSB8fCAke3N0cn1gIDogYCR7aXRlbXNTdHJ9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNTdHIgPSBzdHIgPyBzdHIgOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZEl0ZW1zID0gaXRlbXNTdHI7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGNhcnQgXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIC8vIGNvbnNvbGUubG9nKHRoaXMuJHJlZnMuY2FydC4kZWwpO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgLy8gY29uc29sZS5sb2codGhpcy4kcmVmcy5jYXJ0LiRlbC5vdXRlckhUTUwpO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgbGV0IGNhcnQgPSB0aGlzLiRyZWZzLmNhcnQuJGVsLm91dGVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGF0YS5jYXJ0Q29udGVudHMgPSBjYXJ0O1xuICAgICAgICAgICAgICAgICAgICAvLyB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgb3BlbkNhcnQoZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IG9wZW5pbmcgY2FydCBpZiBpdHMgZW1wdHlcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5lbWFpbERvY3MubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvZ2dsZUZpbHRlcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2xpY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpcyBtb2JpbGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSAhdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1cGRhdGVGaWx0ZXJzKGVsLCBlLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciB0eXBlID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc2FmZVN0cmluZyhlLmN1cnJlbnRUYXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbGFiZWwgPSBlLmN1cnJlbnRUYXJnZXQucGFyZW50Tm9kZS5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBjaGVja2VkID0gZS5jdXJyZW50VGFyZ2V0LmNoZWNrZWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwidHlwZVwiLCB0eXBlKVxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhlKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ2YWx1ZVwiLCBzYWZlU3RyaW5nKGUudGFyZ2V0LnZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2hlY2tlZFwiLGUudGFyZ2V0LmNoZWNrZWQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSAhPT0gXCJzYXZlZERvY3VtZW50c1wiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIHtcInZhbHVlXCI6IHZhbHVlLCBcInR5cGVcIjogdHlwZSwgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCB7XCJ2YWx1ZVwiOiBjaGVja2VkLCBcInR5cGVcIjogdHlwZSwgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIklOREVYXCIsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlcyBzcGVjaWZpYyBmaWx0ZXJcbiAgICAgICAgICAgICAgICByZW1vdmVGaWx0ZXIoZWwsIHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBjbGVhcnMgZmlsdGVyc1xuICAgICAgICAgICAgICAgIHJlbW92ZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsgLy9yZXNldCBwYWdlIHRvIDFcbiAgICAgICAgICAgICAgICB9LCAgXG4gICAgICAgICAgICAgICAgcG9wdWxhdGVQcm9kdWN0cyhicmFuZHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjb25jYXQgb3B0aW9ucyBmcm9tIGFsbCBzZWxlY3RlZCBicmFuZHMgYW5kIHJlbW92ZSBvcHRpb25zIHdoZW4gYnJhbmRzIGFyZSB1bnNlbGVjdGVkIFxuICAgICAgICAgICAgICAgICAgICBsZXQgYnJhbmRTdHIgPSBkZWNvZGVVUklDb21wb25lbnQoYnJhbmRzLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIC8vIGNvbnNvbGUubG9nKGJyYW5kU3RyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaVVybCA9IGAvYXBpL0dldERvY3VtZW50UHJvZHVjdHNCeUJyYW5kYDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL3Byb2R1Y3RzQnlCcmFuZFwiOyAvL2Zyb20ganNvbi1zZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldChhcGlVcmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJhbmQ6IGJyYW5kU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5nOiB0aGlzLmxhbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnByb2R1Y3RzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHMocXVlcnkpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJhcGkvZG9jdW1lbnRzP1wiO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIlFVRVJZXCIsIHF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnF1ZXJ5ID0gcXVlcnkgPT09IG51bGwgPyBudWxsIDogcXVlcnkgPyBxdWVyeSA6IHRoaXMuZGF0YS5xdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gcXVlcnkgPyAxIDogdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0VXJsKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gd2luZG93LmRvY3VtZW50QVBJVXJsO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpVXJsID0gYCR7YmFzZVVybH0ke2Jhc2VVcmwuaW5kZXhPZignPycpID4gLTEgPyAnJyA6ICc/J31gO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvZG9jdW1lbnRhdGlvblwiOyAvL2Zyb20ganNvbi1zZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybFRlc3QgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9kb2N1bWVudGF0aW9uVGVzdFwiOyAvL2Zyb20ganNvbi1zZXJ2ZXJcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYXZlZE9ubHkgPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZERvY3VtZW50c1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2R1Y3QgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGJyYW5kID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBkb2NUeXBlID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2goaXRlbS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInByb2R1Y3RcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdC5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwibGFuZ1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5nLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJicmFuZFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmFuZC5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwiZG9jVHlwZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2NUeXBlLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RTdHIgPSBkZWNvZGVVUklDb21wb25lbnQocHJvZHVjdC5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IGRlY29kZVVSSUNvbXBvbmVudChsYW5nLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBicmFuZFN0ciA9IGRlY29kZVVSSUNvbXBvbmVudChicmFuZC5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG9jVHlwZVN0ciA9IGRlY29kZVVSSUNvbXBvbmVudChkb2NUeXBlLmpvaW4oJ3wnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGF4aW9zUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcTogdGhpcy5kYXRhLnF1ZXJ5ID8gdGhpcy5kYXRhLnF1ZXJ5IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkOiAodGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JykpID09IFwiXCIgPyBudWxsIDogdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JykuY2hhckF0KDApID09IFwiLFwiID8gdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8Jykuc2xpY2UoMSkgOiB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKSwgLy9AVE9ETyBtYWtlIHRoaXMgbGVzcyBpbnNhbmUuIFNlbmQgTlVMTCBpZiBlbXB0eSBzdHJpbmcuIFJlbW92ZSBsZWFkaW5nIGNvbW1hIGlmIHByZXNlbnQuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0OiBwcm9kdWN0U3RyID09IFwiXCIgPyBudWxsIDogcHJvZHVjdFN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBsYW5nU3RyID09IFwiXCIgPyBudWxsIDogbGFuZ1N0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kOiBicmFuZFN0ciA9PSBcIlwiID8gbnVsbCA6IGJyYW5kU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jVHlwZTogZG9jVHlwZVN0ciA9PSBcIlwiID8gbnVsbCA6IGRvY1R5cGVTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3VtZW50czogc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLmRhdGEuY3VycmVudFBhZ2UsXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhheGlvc1BhcmFtcyk7XG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldChhcGlVcmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYXhpb3NQYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnJlc3VsdHM7ICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEudG90YWxSZXN1bHRzID0gcmVzcG9uc2UuZGF0YS50b3RhbFJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnNob3duUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhyZXNwb25zZS5kYXRhKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hhbmdlUGFnZShkaXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpciA9PSBcInByZXZcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZS0tO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpciA9PSBcIm5leHRcIiAmJiB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UrKztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2Nyb2xsLXRvLXRvcCcsIHRoaXMuZGF0YS5jbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gdXBkYXRlRW1haWxEb2NzKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy8gYWRkIG9yIHJlbW92ZSBpdGVtcyB0byBlbWFpbFxuICAgICAgICAgICAgICAgIC8vICAgICBsZXQgaXRlbSA9IHRoaXMuZGF0YS5lbWFpbERvY3MuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHJldHVybiBpdGVtLmlkID09IGRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgLy8gICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5kYXRhLmVtYWlsRG9jcyA9IFsuLi50aGlzLmRhdGEuZW1haWxEb2NzLCBkYXRhXTtcbiAgICAgICAgICAgICAgICAvLyAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3Muc3BsaWNlKHRoaXMuZGF0YS5lbWFpbERvY3MuaW5kZXhPZihpdGVtKSwxKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlRW1haWxEb2NEYXRhKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nID0gdGhpcy5kYXRhLmVtYWlsRG9jcy5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkID09IGRhdGEuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXBkYXRlZERhdGE7XG4gICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGF0YSA9IHRoaXMuZGF0YS5lbWFpbERvY3MubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuaWQgPT0gaXRlbS5pZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkRGF0YSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmRhdGEuZW1haWxEb2NzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFcbiAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzID0gdXBkYXRlZERhdGE7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW1vdmVDYXJ0SXRlbShpZCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZW1haWxEb2NzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuIGUuaWRcbiAgICAgICAgICAgICAgICAgICAgLy8gfSkuaW5kZXhPZihpZCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmRhdGEuZW1haWxEb2NzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MgPSB0aGlzLmRhdGEuZW1haWxEb2NzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgIT09IGlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIHNjcm9sbFRvVG9wKGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7cmV0dXJuO31cbiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5saXQtb3JkZXJfX2FyZWEtY2FyZHMnKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtMTAwO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0b3ApO1xuICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWhhdmlvcjogJ3Ntb290aCdcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFBhZ2VzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBiYXNlZCBvbiB0b3RhbCByZXN1bHQgY291bnQsIGRpdmlkZSBieSAxMCB0byBnZXQgdG90YWwgcGFnZXMgbmVlZGVkXG4gICAgICAgICAgICAgICAgICAgIC8vIG1hdGggY2VpbCB0byByb3VuZCB1cFxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYWN0aXZlIGZvciBwcmV2L25leHQgYmFzZWQgb24gY3VycmVudCBwYWdlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS50b3RhbFBhZ2VzID0gTWF0aC5jZWlsKHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgLyAxMCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSAxID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoYW5kbGVTdWJtaXQoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5tb2RhbE5hbWUgPT0gdGhpcy5kYXRhLm1vZGFsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaXNTdWJtaXR0ZWQgdG8gdHJ1ZSB3aGVuIGZvcm0gaXMgc3VibWl0dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaXNTdWJtaXR0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoYW5kbGVDbG9zZShkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgoZGF0YS5tb2RhbE5hbWUgPT0gdGhpcy5kYXRhLm1vZGFsVGFyZ2V0KSAmJiB0aGlzLmRhdGEuaXNTdWJtaXR0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MgPSBbXTsgLy9lbXB0eSBjYXJ0IGNvbnRlbnRzIGFycmF5IG9uIG1vZGFsIGNsb3NlIChvbmx5IGlmIGZvcm0gaXMgc3VibWl0dGVkKVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlzU3VibWl0dGVkID0gZmFsc2U7IC8vc2V0IGlzIHN1Ym1pdHRlZCBiYWNrIHRvIGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzID0gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWRbMF0gPT0gXCJcIiA/IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5kb2N1bWVudElkLnNsaWNlKDEpIDogc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9IHRoaXMuZGF0YS5pc01vYmlsZSA/IGZhbHNlIDogdHJ1ZTsgLy9pbml0IHNob3cvaGlkZSBmaWx0ZXJzIGlmL2lzIG1vYmlsZVxuICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW4gZm9yIGZpbHRlciB1cGRhdGVzIGluIGNoaWxkcmVuXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbigndXBkYXRlRmlsdGVycycsIChlbCwgZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzKGVsLCBlLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbigncmVtb3ZlLWZpbHRlcicsIChlbCwgdmFsdWUsIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlRmlsdGVyKGVsLCB2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2NoYW5nZS1wYWdlLXRvJywgKGVsLCBudW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7cmV0dXJuO307XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSBudW07XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIEV2ZW50QnVzLiRvbignZW1haWwtZG9jcycsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLnVwZGF0ZUVtYWlsRG9jcyhkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbigndXBkYXRlLWVtYWlsLWRvYy1kYXRhJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRW1haWxEb2NEYXRhKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdpbnRlcm5hbC1zZWFyY2gnLCAodmFsdWUsIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFwiZG9jdW1lbnRhdGlvblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignc2Nyb2xsLXRvLXRvcCcsIChlbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1RvcChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3JlbW92ZS1jYXJ0LWl0ZW0nLCAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2FydEl0ZW0oaWQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdmb3JtLXN1Ym1pdHRlZCcsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVN1Ym1pdChkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignZm9ybS1jbG9zZWQnLCAoZGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVDbG9zZShkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5yZXN1bHRzID0gd2luZG93LmluaXRpYWxEb2N1bWVudGF0aW9uQXBpUmVzdWx0cy5yZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudG90YWxSZXN1bHRzID0gd2luZG93LmluaXRpYWxEb2N1bWVudGF0aW9uQXBpUmVzdWx0cy50b3RhbFJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbERvY3VtZW50YXRpb25BcGlSZXN1bHRzLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEucmVzdWx0cyA9IGZwb2RiLmRvY3VtZW50YXRpb24ucmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA9IGZwb2RiLmRvY3VtZW50YXRpb24udG90YWxSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEuc2hvd25SZXN1bHRzID0gZnBvZGIuZG9jdW1lbnRhdGlvbi5yZXN1bHRzLmxlbmd0aDtcblxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGhpZGUgZmlsdGVycyBpZiBsZXNzIHRoZW4gMTAgaW5pdGlhbCByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJBcmVhVmlzaWJsZSA9IHBhcnNlSW50KHRoaXMuZGF0YS50b3RhbFJlc3VsdHMpIDw9IDEwID8gZmFsc2UgOiB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGVuYWJsZSBcInNoYXJlIGFsbFwiIGlmIDUgb2YgbGVzcyByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zaGFyZUFsbCA9IHBhcnNlSW50KHRoaXMuZGF0YS50b3RhbFJlc3VsdHMpIDw9IDUgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5vbnBvcHN0YXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5kZWVwbGluaygpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG5cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5tb2RhbFRhcmdldCA9IHRoaXMuJHJlZnMuY2FydEJ1dHRvbi5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5zdWJzdHJpbmcoMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBkeW5hbWljIGNhcnQgY29tcG9uZW50IGNvbnRhaW5lciBmb3IgcGFzc2luZyB0byBnZW5lcmljIGZvcm0gbW9kYWwgXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY2FydENvbnRlbnRzID0gYDxkaXYgY2xhc3M9XCJsaXQtb3JkZXJfX2NhcmRzLWNvbnRlbnQgbGl0LW9yZGVyX19jYXJkcy1jb250ZW50LWNhcnRcIiBpcz1cImNhcnRcIiByZWY9XCJjYXJ0XCIgbW9kYWwtdGFyZ2V0PVwiJHt0aGlzLmRhdGEubW9kYWxUYXJnZXR9XCI+PC9kaXY+YDtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRQYWdlcygpO1xuXG4gICAgICAgICAgICAgICAgLy8gZm9yIGRlZXBsaW5raW5nXG4gICAgICAgICAgICAgICAgLy8gaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5kZWVwbGluaygpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFxuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2xpdC1wcm9kdWN0cycsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwicHJvZHVjdFwiXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnY2hlY2tib3gtaXRlbSc6IENoZWNrYm94XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtb3JkZXJfX3Byb2R1Y3RzLWNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICA8Y2hlY2tib3gtaXRlbSB2LWZvcj1cIihwcm9kdWN0SXRlbSwgaSkgaW4gZGF0YS5wcm9kdWN0c1wiIDprZXk9aSA6dHlwZT1cInR5cGVcIiA6bGFiZWw9XCJwcm9kdWN0SXRlbS52YWx1ZVwiIDp2YWx1ZT1cInByb2R1Y3RJdGVtLmtleVwiIDpkYXRhPVwiZGF0YVwiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyByZXN1bHRzIGxpc3RcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbGl0LXJlc3VsdHMtbGlzdCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwiZG9jdW1lbnRcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpdC1vcmRlcl9fY2FyZHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxsaXQtcmVzdWx0cy1pdGVtIHYtZm9yPVwiKHJlc3VsdCwgaW5kZXgpIGluIGRhdGEucmVzdWx0c1wiIDpjb250ZW50PVwicmVzdWx0XCIgOmlzU2VsZWN0ZWQ9XCJpc1NlbGVjdGVkKHJlc3VsdClcIiA6cXR5RGF0YT1cInF0eURhdGEocmVzdWx0KVwiIDprZXk9XCJyZXN1bHQuaWRcIiA6ZGF0YT1cImRhdGFcIiA6Y2FydFZlcnNpb249XCJmYWxzZVwiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpc1NlbGVjdGVkKHJlc3VsdCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuZW1haWxEb2NzLmZpbmQoaSA9PiBpLmlkID09IHJlc3VsdC5pZCkgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHF0eURhdGEocmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZCA9IHRoaXMuZGF0YS5lbWFpbERvY3MuZmluZChpID0+IGkuaWQgPT0gcmVzdWx0LmlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdHk6IHNhdmVkLnF0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVQdW5jaGVkOiBzYXZlZC5wcmVQdW5jaGVkIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc2luZ2xlIHJlc3VsdHMgaXRlbVxuICAgICAgICBWdWUuY29tcG9uZW50KCdsaXQtcmVzdWx0cy1pdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdjb250ZW50JywgJ2lzU2VsZWN0ZWQnLCAncXR5RGF0YScsICdjYXJ0VmVyc2lvbiddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkOiB0aGlzLmlzU2VsZWN0ZWQsXG4gICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGw6IG51bGwsIC8vaXMgXCJzZWUgYWxsXCIgZmVhdHVyZSBlbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxPcGVuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxMYWJlbDogbnVsbCwvL2xhYmVsXG4gICAgICAgICAgICAgICAgICAgIG1vcmVDb250ZW50OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBwcmVQdW5jaGVkOiB0aGlzLnF0eURhdGEgPyB0aGlzLnF0eURhdGEucHJlUHVuY2hlZCA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHF0eTogdGhpcy5xdHlEYXRhID8gdGhpcy5xdHlEYXRhLnF0eSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHZhbGlkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBpc0luQ2FydDogdGhpcy5jYXJ0VmVyc2lvbiA/IHRydWUgOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlbmNvZGVkVXJsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLmNvbnRlbnQudXJsKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5ld1RhYkxpbms6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250ZW50LnVybC5yZXBsYWNlKCdkb3dubG9hZD10cnVlJywgJ2Rvd25sb2FkPWZhbHNlJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBlcnJvck1zZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuZW50ZXJWYWxpZFF1YW50aXR5TGFiZWw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXdUYWJMaW5rOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC51cmwgPyB0aGlzLmNvbnRlbnQudXJsLnJlcGxhY2UoJ2Rvd25sb2FkPXRydWUnLCAnZG93bmxvYWQ9ZmFsc2UnKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXModGhpcy5pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImNhcnRWZXJzaW9uXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJ0VmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0luQ2FydCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5lbWFpbERvY3NcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuZGF0YS5lbWFpbERvY3MuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS5pZCA9PSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0luQ2FydCA9IG1hdGNoLmxlbmd0aCA+IDAgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnF0eSA9IG1hdGNoWzBdLnF0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlUHVuY2hlZCA9IG1hdGNoWzBdLnByZVB1bmNoZWQ7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgICAgIC8vIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5xdHkgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy5wcmVQdW5jaGVkID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJjb250ZW50XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaWQgd2hlbiBjb250ZW50IGNoYW5nZXNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInNlZUFsbFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbExhYmVsID0gdGhpcy5zZWVBbGxPcGVuID8gd2luZG93LnNlZUxlc3NMYWJlbCA6IHdpbmRvdy5zZWVBbGxMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJzZWVBbGxPcGVuXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVBbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsTGFiZWwgPSB0aGlzLnNlZUFsbE9wZW4gPyB3aW5kb3cuc2VlTGVzc0xhYmVsIDogd2luZG93LnNlZUFsbExhYmVsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInF0eVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmNhcnRWZXJzaW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBlbXB0eSBxdHkgdmFsdWUgaWYgbm90IGluIGNhcnRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWQgPSB0aGlzLnF0eS5tYXRjaCgvXlxcZCskLykgJiYgcGFyc2VJbnQodGhpcy5xdHkpID49IDUgPyB0cnVlIDogdGhpcy5xdHkgPT0gXCJcIiA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGlzIGluIGNhcnQsIGVtcHR5IHZhbHVlcyBhcmUgaW52YWxpZFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRoaXMucXR5Lm1hdGNoKC9eXFxkKyQvKSAmJiBwYXJzZUludCh0aGlzLnF0eSkgPj0gNSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHF0eSBpcyB2YWxpZCwgdXBkYXRlIHRoZSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy52YWxpZCAmJiB0aGlzLnF0eSAhPT0gXCJcIiAmJiB0aGlzLmlzSW5DYXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3VwZGF0ZS1lbWFpbC1kb2MtZGF0YScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuY29udGVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcjogdGhpcy5jb250ZW50LmRvY3VtZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV5ZWJyb3c6IHRoaXMuY29udGVudC5leWVicm93LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmNvbnRlbnQuZGV0YWlscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb250ZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF0eTogdGhpcy5xdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZVB1bmNoZWQ6IHRoaXMucHJlUHVuY2hlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmNvbnRlbnQudXJsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdmFsaWRhdGUgdmFsdWVzIGlmIHF0eSBpcyB1cGRhdGVkIGluIGNhcnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNJbkNhcnQgJiYgdGhpcy5jYXJ0VmVyc2lvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ2NoZWNrLWVycm9ycycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInByZVB1bmNoZWRcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnZhbGlkICYmIHRoaXMucXR5ICE9PSBcIlwiICYmIHRoaXMuaXNJbkNhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCd1cGRhdGUtZW1haWwtZG9jLWRhdGEnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuY29udGVudC5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TnVtYmVyOiB0aGlzLmNvbnRlbnQuZG9jdW1lbnRJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleWVicm93OiB0aGlzLmNvbnRlbnQuZXllYnJvdyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXRhaWxzOiB0aGlzLmNvbnRlbnQuZGV0YWlscyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiB0aGlzLmNvbnRlbnQubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdHk6IHRoaXMucXR5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZVB1bmNoZWQ6IHRoaXMucHJlUHVuY2hlZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHRoaXMuY29udGVudC51cmxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInF0eURhdGFcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNsZWFyIHF0eSBhbmQgcHJlcHVuY2hlZCBkYXRhIGlmIG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnF0eURhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXR5ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlUHVuY2hlZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtY2FyZCBsaXQtY2FyZC0tY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGl0LWNhcmRfX3dyYXBwZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpdC1jYXJkX19yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtY2FyZF9fYXJlYSBsaXQtY2FyZF9fYXJlYS1jaGVja2JveFwiIDpjbGFzcz1cIntoaWRkZW46IGNhcnRWZXJzaW9ufVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwibGl0LWNhcmRfX2ljb24gbGl0LWNhcmRfX2ljb24tYm9va21hcmtcIiByZWY9XCJib29rbWFya1wiIDpkYXRhLWRvY3VtZW50LWlkPVwiY29udGVudC5pZFwiIHYtb246Y2xpY2sucHJldmVudD1cImhhbmRsZUJvb2ttYXJrXCIgOmNsYXNzPVwie2FjdGl2ZTogaXNCb29rbWFya2VkfVwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJhcHBcIiwgXCJhY3Rpb25cIjogXCJGYXZvcml0ZVwifSc+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtY2FyZF9fYXJlYSBsaXQtY2FyZF9fYXJlYS1pbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpdC1jYXJkX19hcmVhIGxpdC1jYXJkX19hcmVhLWxlZnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaXQtY2FyZF9fZXllYnJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb250ZW50LmV5ZWJyb3d9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwibmV3VGFiTGlua1wiIGNsYXNzPVwibGl0LWNhcmRfX3RpdGxlXCIgcmVmPVwibmFtZVwiIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb250ZW50Lm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwibGl0LWNhcmRfX3N1YnRpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpdC1jYXJkX19zdWJ0aXRsZS1jb250ZW50XCIgcmVmPVwic2VlQWxsQ29udGVudFwiPnt7Y29udGVudC5kZXRhaWxzfX08L3NwYW4+IDxzcGFuIGNsYXNzPVwibGl0LWNhcmRfX3N1YnRpdGxlLW1vcmVcIiB2LWlmPVwic2VlQWxsICYmIHNlZUFsbE9wZW5cIj5cXHt7bW9yZUNvbnRlbnR9fTwvc3Bhbj4gPGEgaHJlZj1cIiNcIiB2LW9uOmNsaWNrLnByZXZlbnQ9XCJ0b2dnbGVTZWVBbGxcIiB2LWlmPVwic2VlQWxsXCI+XFx7e3NlZUFsbExhYmVsfX08L2E+IHwge3tjb250ZW50Lmxhbmd1YWdlfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGl0LWNhcmRfX2FyZWEgbGl0LWNhcmRfX2FyZWEtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpdC1jYXJkX19xdHktY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgY2xhc3M9XCJsaXQtY2FyZF9fcXR5LWlucHV0XCIgdi1tb2RlbD1cInF0eVwiIDpjbGFzcz1cIntpbnZhbGlkOiAhdmFsaWQgJiYgdmFsaWQgIT09IG51bGx9XCIgcGxhY2Vob2xkZXI9XCJRVFlcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJsaXQtY2FyZF9fYnV0dG9uXCIgdi1vbjpjbGljay5wcmV2ZW50PVwiYWRkVG9DYXJ0XCIgdi1pZj1cIiFjYXJ0VmVyc2lvblwiPkFkZDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgY2xhc3M9XCJsaXQtY2FyZF9fYnV0dG9uIGxpdC1jYXJkX19idXR0b24tcmVtb3ZlXCIgdi1vbjpjbGljay5wcmV2ZW50PVwicmVtb3ZlRnJvbUNhcnRcIiB2LWlmPVwiY2FydFZlcnNpb25cIj48c3BhbiBjbGFzcz1cImxpdC1jYXJkX19yZW1vdmVcIj48L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxpdC1jYXJkX19lcnJvclwiIHYtaWY9XCIhdmFsaWRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwPnt7ZXJyb3JNc2d9fTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaXQtY2FyZF9fY2hlY2tib3gtY29udGFpbmVyIGNoZWNrYm94XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGFiZWwgY2xhc3M9XCJsaXQtY2FyZF9fY2hlY2tib3gtbGFiZWwgY2hlY2tib3hfX2xhYmVsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9XCJjaGVja2JveFwiIGNsYXNzPVwibGl0LWNhcmRfX2NoZWNrYm94IGNoZWNrYm94X19pbnB1dFwiIHYtbW9kZWw9XCJwcmVQdW5jaGVkXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaXQtY2FyZF9fY2hlY2tib3gtY2hlY2ttYXJrIGNoZWNrYm94X19jaGVja21hcmtcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaXQtY2FyZF9fY2hlY2tib3gtdGV4dCBjaGVja2JveF9fdGV4dFwiPlByZS1wdW5jaGVkPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIC8vIGVtYWlsRG9jKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICBFdmVudEJ1cy4kZW1pdCgnZW1haWwtZG9jcycsIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIFwibmFtZVwiOiB0aGlzLmNvbnRlbnQubmFtZSwgXG4gICAgICAgICAgICAgICAgLy8gICAgICAgICBcInVybFwiOiB0aGlzLmNvbnRlbnQudXJsLCBcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIFwiaWRcIjogdGhpcy5jb250ZW50LmlkLCBcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIFwicXR5XCI6IHRoaXMucXR5LFxuICAgICAgICAgICAgICAgIC8vICAgICAgICAgXCJwcmVQdW5jaGVkXCI6IHRoaXMucHJlUHVuY2hlZCxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIFwiZXllYnJvd1wiOiB0aGlzLmNvbnRlbnQuZXllYnJvdyxcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIFwiZGV0YWlsc1wiOiB0aGlzLmNvbnRlbnQuZGV0YWlsc1xuICAgICAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJkb2N1bWVudElkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuaXNCb29rbWFya2VkID8gXCJyZW1vdmVcIiA6IFwiYWRkXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbE9wZW4gPSAhdGhpcy5zZWVBbGxPcGVuO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRldGFpbHMgPSB0aGlzLiRyZWZzLnNlZUFsbENvbnRlbnQuaW5uZXJIVE1MLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbCA9IGRldGFpbHMubGVuZ3RoID4gMyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRydW5jYXRlZERldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDAsMykuam9pbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vcmVEZXRhaWxzID0gZGV0YWlscy5zbGljZSgzKS5qb2luKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9yZUNvbnRlbnQgPSBtb3JlRGV0YWlscztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwgPSBgJHt0cnVuY2F0ZWREZXRhaWxzfSR7bW9yZURldGFpbHMgPT0gXCJcIiA/ICcnIDogJywnfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFkZFRvQ2FydCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnF0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlSW50KHRoaXMucXR5KSA8IDUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmNvbnRlbnQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFydE51bWJlcjogdGhpcy5jb250ZW50LmRvY3VtZW50SWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXllYnJvdzogdGhpcy5jb250ZW50LmV5ZWJyb3csXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsczogdGhpcy5jb250ZW50LmRldGFpbHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogdGhpcy5jb250ZW50Lm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXR5OiB0aGlzLnF0eSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVQdW5jaGVkOiB0aGlzLnByZVB1bmNoZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB0aGlzLmNvbnRlbnQudXJsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlLWVtYWlsLWRvYy1kYXRhJywgZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlbW92ZUZyb21DYXJ0KCkge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWNhcnQtaXRlbScsIHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZDtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInNhdmVkXCIsdGhpcy5zYXZlZCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0U2VlQWxsKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBpZiBpdGVtIGlzIGV4cGxpY2l0bHkgcmVtb3ZlZCBmcm9tIGNhcnQsIGNsZWFyIGl0cyBpbnB1dCB2YWx1ZXNcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3JlbW92ZS1jYXJ0LWl0ZW0nLCAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlkID09IHRoaXMuaWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucXR5ID0gXCJcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlUHVuY2hlZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gY2FydFxuICAgICAgICBWdWUuY29tcG9uZW50KCdjYXJ0Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnbW9kYWxUYXJnZXQnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yczogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY2FydEhhc2g6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlzU3VibWl0dGVkOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIGNhcnRDb250ZW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmxpdE9yZGVyQ2FydDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yTXNnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5lbnRlclZhbGlkUXVhbnRpdHlMYWJlbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBoYXNFcnJvcnM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNFcnJvcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudE5vZGUuY2xhc3NMaXN0LmFkZCgnaGFzRXJyb3JzJyk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5wYXJlbnROb2RlLmNsYXNzTGlzdC5yZW1vdmUoJ2hhc0Vycm9ycycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjYXJ0Q29udGVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhcnRDb250ZW50Lmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5jbG9zZU1vZGFsKHRoaXMuY2FydEhhc2gpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBmb3Igc2hvd2luZy9oaWRpbmcgY2FydCBtb2R1bGUuIGhpZGUgaWYgc3VibWl0dGVkLlxuICAgICAgICAgICAgICAgIGlzU3VibWl0dGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuc3R5bGUuZGlzcGxheSA9IHRoaXMuaXNTdWJtaXR0ZWQgPyAnbm9uZScgOiAnYmxvY2snO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICA8bGl0LXJlc3VsdHMtaXRlbSB2LWZvcj1cIihyZXN1bHQsIGluZGV4KSBpbiBjYXJ0Q29udGVudFwiIDpjb250ZW50PVwicmVzdWx0XCIgOmtleT1cInJlc3VsdC5pZFwiIDpjYXJ0VmVyc2lvbj1cInRydWVcIiA6cXR5RGF0YT1cInF0eURhdGEocmVzdWx0KVwiIC8+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJsaXQtY2FyZF9fZXJyb3JcIiB2LWlmPVwiaGFzRXJyb3JzXCI+e3tlcnJvck1zZ319PHAvPlxuICAgICAgICAgICAgPC9kaXY+YCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBxdHlEYXRhKHJlc3VsdCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWQgPSB0aGlzLmNhcnRDb250ZW50LmZpbmQoaSA9PiBpLmlkID09IHJlc3VsdC5pZCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcXR5OiBzYXZlZC5xdHksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlUHVuY2hlZDogc2F2ZWQucHJlUHVuY2hlZCBcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoZWNrRXJyb3JzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNoZWNraW5nXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW52YWxpZEVudHJ5ID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLmxpdC1jYXJkX19xdHktaW5wdXQuaW52YWxpZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNFcnJvcnMgPSBpbnZhbGlkRW50cnkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKGludmFsaWRFbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRIYXNoKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhcnRIYXNoID0gdGhpcy4kZWwuY2xvc2VzdCgnLmJtaS1tb2RhbF9fd3JhcHBlcicpID8gdGhpcy4kZWwuY2xvc2VzdCgnLmJtaS1tb2RhbF9fd3JhcHBlcicpLmdldEF0dHJpYnV0ZSgnbmFtZScpIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZVN1Ym1pdChkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm1vZGFsTmFtZSA9PSB0aGlzLm1vZGFsVGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU3VibWl0dGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlQ2xvc2UoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoKGRhdGEubW9kYWxOYW1lID09IHRoaXMubW9kYWxUYXJnZXQpICYmIHRoaXMuaXNTdWJtaXR0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1N1Ym1pdHRlZCA9IGZhbHNlOyAvL3NldCBpcyBzdWJtaXR0ZWQgYmFjayB0byBmYWxzZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2Zvcm0tc3VibWl0dGVkJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlU3VibWl0KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdmb3JtLWNsb3NlZCcsIChkYXRhKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUNsb3NlKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ2NoZWNrLWVycm9ycycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0Vycm9ycygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuZ2V0SGFzaCgpOyBcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5saXQtb3JkZXItJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgIH0pLiRtb3VudChgLmxpdC1vcmRlci0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChsaXRPcmRlci5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpdE9yZGVyLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYGxpdC1vcmRlci0ke2luZGV4fWApO1xuICAgICAgICAgICAgbGl0T3JkZXJDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgLy8gd2luZG93LmVudGVyVmFsaWRRdWFudGl0eUxhYmVsID0gXCJlcnJvciB0ZXN0XCI7XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTGl0T3JkZXI7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHsgbG9yeSB9IGZyb20gJ2xvcnkuanMnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcblxuLy8gKipOT1RFKipcbi8vIDEgaW5kZXhcblxuY29uc3QgTWFya2V0QXBwcyA9ICgpID0+IHtcblxuICAgIGNvbnN0IGFwcHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWFya2V0LWFwcHMnKTtcblxuICAgIGNvbnN0IG1hcmtldEFwcHNDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ21hcmtldC1hcHBzLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc2xpZGVyRWw6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZyYW1lOiAnbWFya2V0LWFwcHNfX2ZyYW1lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU1vdXNlRXZlbnRzOiB0cnVlXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGxvcnk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGxlbmd0aDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNsaWRlOiAxLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaW5pdExvcnkoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubG9yeSA9IGxvcnkodGhpcy5zbGlkZXJFbCwgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXRMaXN0ZW5lcigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbGlkZXJFbC5hZGRFdmVudExpc3RlbmVyKCdhZnRlci5sb3J5LnNsaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSB0aGlzLmxvcnkucmV0dXJuSW5kZXgoKSArIDE7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignc2VsZWN0LXNsaWRlJywgKHRhcmdldCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U2xpZGUgPSB0YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvcnkuc2xpZGVUbyh0YXJnZXQgLSAxKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0VGFncygpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ3MgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJsYXllclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlByZXZpZXcgQ2FyZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJPcGVuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5vXCI6IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlckVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2xpJykuZm9yRWFjaCgoc2xpZGUsIGkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNsaWRlLmRhdGFzZXQudGFnTWV0YSA9IEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50YWdzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnLm1hcmtldC1hcHBzX19uYXYtaXRlbSBhJylbaV0uaW5uZXJUZXh0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibm9cIjogKGkgKyAxKSA8IDEwID8gYDAke2kgKyAxfWAgOiBgJHtpICsgMX1gXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlckVsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLm1hcmtldC1hcHBzX19zbGlkZXInKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXJrZXQtYXBwc19fc2xpZGUnKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0TG9yeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdExpc3RlbmVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0VGFncygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdtYXJrZXQtYXBwcy1uYXYtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2N1cnJlbnRTbGlkZSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IG51bGxcbiAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJsYXllclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlByZXZpZXcgQ2FyZFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJPcGVuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IHRoaXMubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBcIm5vXCI6IHRoaXMudGFyZ2V0IDwgMTAgPyBgMCR7dGhpcy50YXJnZXR9YCA6IHRoaXMudGFyZ2V0LnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgY3VycmVudFNsaWRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMudGFyZ2V0ID09IHRoaXMuY3VycmVudFNsaWRlID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRhcmdldCBpZCBiYXNlZCBvbiBub2RlIHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFyZ2V0ID0gW10uaW5kZXhPZi5jYWxsKHRoaXMuJGVsLnBhcmVudE5vZGUuY2hpbGRyZW4sIHRoaXMuJGVsKSArIDE7ICAgXG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMudGFyZ2V0ID09IHRoaXMuY3VycmVudFNsaWRlID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignYScpLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdFNsaWRlKCkge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2VsZWN0LXNsaWRlJywgdGhpcy50YXJnZXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLm1hcmtldC1hcHBzLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAubWFya2V0LWFwcHMtJHtpZH1gLCB0cnVlKTtcblxuICAgIH1cblxuICAgIGlmIChhcHBzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgYXBwcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBtYXJrZXQtYXBwcy0ke2luZGV4fWApO1xuICAgICAgICAgICAgbWFya2V0QXBwc0NvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgTWFya2V0QXBwczsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IEV2ZW50QnVzIGZyb20gJy4vZXZlbnQtYnVzJztcbmltcG9ydCB7IGRlYm91bmNlIH0gZnJvbSAnbGliL21pc2MnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBmcG9kYiBmcm9tICcuLi8uLi8uLi9kYi5qc29uJztcblxuLy8gTk9URVM6XG4vLyBtZW51IGlzIGJyb2tlbiBkb3duIGludG8gcHJpbWFyeSwgMm5kIGxldmVsLCBhbmQgM3JkIGxldmVsIFwicGFuZWxzXCIgXG4vLyBwcmltYXJ5OiB0b3AgbGV2ZWwgbWVudSBjYXRlZ29yeSAoZS5nLiBtdW5pY2lwYWwgd2F0ZXIgc29sdXRpb25zLCBpbmR1c3RyaWFsIG1lYXN1cmVtZW50IHNvbHV0aW9ucylcbi8vIDJuZCBsdmw6IGNhdGVnb3JpZXMgdW5kZXIgdGhlIHByaW1hcnkgY2F0ZWdvcnkgKGUuZy4gcHJvZHVjdHMsIHByb2R1Y3QgbGluZXMpXG4vLyAzcmQgbHZsOiBjb250ZW50IGluc2lkZSB0aGUgMm5kIGxldmVsIGNhdGVnb3J5IChlLmcuIG1ldGVycywgbWV0ZXIgY29tcG9uZW50cywgZW5kcG9pbnRzKVxuXG4vLyBcInByaW1hcnlcIiBhbmQgXCJzZWNvbmRhcnlcIiBtZW51IHBhbmVscy9pdGVtcyBhcmUgYmFzZWQgb24gdGhlIFxuLy8gbWVnYW1lbnUgRE9NIG9yZGVyIGluIG1lZ2FtZW51Lmhicy4gXG5cbi8vIG9uIG1vYmlsZSwgcHJpbWFyeS1tZW51LWl0ZW0gSUQgaXMgZGV0ZXJtaW5lZCBieSBET00gb3JkZXIuIChlLmcuIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBkb20gaXMgcHJpbWFyeS0xLCB0aGUgc2Vjb25kIGlzIHByaW1hcnktMiwgZXRjLilcbi8vIHNlbGVjdGVkU2Vjb25kYXJ5SWQgaXMgY29uc3RydWN0ZWQgZnJvbSB0aGUgc2Vjb25kYXJ5IGxldmVsIElEIGFuZCBpdHMgcGFyZW50LCB0aGUgc2VsZWN0ZWQgcHJpbWFyeSBJZCAoZS5nLiBzZWNvbmRhcnktMS1wcmltYXJ5LTIgcmVmZXJzIHRvIHRoZSAxc3Qgc2Vjb25kYXJ5IGNhdGVnb3J5IGluIHRoZSAybmQgcHJpbWFyeSBjYXRlZ29yeSlcblxuXG5jb25zdCBNZWdhbWVudSA9ICgpID0+IHtcblxuICAgIGNvbnN0IG1lbnUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVnYW1lbnUnKTtcbiAgICBsZXQgaGlzdG9yeUFyciA9IFtdXG4gICAgbGV0IGhpZ2hlc3RUaWVyT3BlbiAgID0gMDtcblxuICAgIGNvbnN0IGNsZWFyTW9iaWxlTWVudSA9IGZ1bmN0aW9uKClcbiAgICAgICAge1xuICAgICAgICBoaXN0b3J5QXJyLmxlbmd0aCA9IDA7XG4gICAgICAgIGhpZ2hlc3RUaWVyT3BlbiAgID0gMDtcbiAgICAgICAgY29uc3QgbWVnYVRpZXJzICAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FfX2NvbnRlbnQgLm1lZ2FfX3RpZXJzJyk7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJzV3JhcCAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tZWdhX190cmlnZ2VycycpO1xuICAgICAgICBjb25zdCBvcGVuVGllcnMgICAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9iaWxlQWN0aXZlVGllcicpIFxuICAgICAgICBjb25zdCBvcGVuQ29scyAgICAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubW9iaWxlQWN0aXZlQ29sJykgXG4gICAgICAgIFxuICAgICAgICBmb3IobGV0IGk9MDsgaTwgb3BlblRpZXJzLmxlbmd0aDsgaSsrKSAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIGFsbCBvcGVuIG1vYmlsZSB0aWVycyAobW9yZSB0aGFuIG9uZSBtaWdodCBoYXZlIGJlZW4gb3BlbmVkIGJ5IGRlc2t0b3AgbWVudSlcbiAgICAgICAgICAgIHtvcGVuVGllcnNbaV0uY2xhc3NMaXN0LnJlbW92ZSgnbW9iaWxlQWN0aXZlVGllcicpfVxuICAgICAgICAgICAgICAgIFxuICAgICAgICBmb3IobGV0IGk9MDsgaTwgb3BlbkNvbHMubGVuZ3RoOyBpKyspICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIGFsbCBvcGVuIG1vYmlsZSBDb2xzIChtb3JlIHRoYW4gb25lIG1pZ2h0IGhhdmUgYmVlbiBvcGVuZWQgYnkgZGVza3RvcCBtZW51KVxuICAgICAgICAgICAge29wZW5Db2xzW2ldLmNsYXNzTGlzdC5yZW1vdmUoJ21vYmlsZUFjdGl2ZVRpZXInKX1cblxuICAgICAgICBtZWdhVGllcnMuY2xhc3NMaXN0LmFkZCgnbW9iaWxlSGlkZScpICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgbWVudSB0byBkZWZhdWx0IHNldHRpbmdcbiAgICAgICAgdHJpZ2dlcnNXcmFwLmNsYXNzTGlzdC5hZGQoJ21vYmlsZUFjdGl2ZVRpZXInKVxuICAgICAgICB9XG5cblxuICAgIGNvbnN0IG1lZ2FtZW51Q29uc3RydWN0b3IgPSAoKSA9PiB7ICAgICAgICAgXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ21lZ2FtZW51LXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IHN0b3JlLnN0YXRlLmlzTW9iaWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRQcmltYXJ5SWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNlY29uZGFyeUlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUb3BiYXJJZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vYmlsZU1lbnVPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvcGJhck1lbnVPcGVuOiBmYWxzZSwgLy90b3BiYXIgbWVudSBJTlNJREUgdGhlIG1lZ2FtZW51LCBub3QgdGhlIG9uZSBvdXRzaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5TWVudU9wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5TWVudU9wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVudURhdGE6IHN0b3JlLnN0YXRlLm1lbnVLZXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoT3BlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxEaXI6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRNZW51RGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5tZW51S2V5cztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHRoaXMuY29tcHV0ZWRJc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsb3NlIG1vYmlsZSBtZW51IGlmIGRlc2t0b3BcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5tb2JpbGVNZW51T3BlbiA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IFxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uTWVudSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRNZW51RGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5tZW51RGF0YSA9IHRoaXMuY29tcHV0ZWRNZW51RGF0YTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBjbG9zaW5nIG1lZ2FtZW51IG9uIG91dHNpZGUgY2xpY2tcbiAgICAgICAgICAgICAgICBcImRhdGEuc2VsZWN0ZWRQcmltYXJ5SWRcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kYXRhLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLnNlbGVjdGVkUHJpbWFyeUlkICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm91dHNpZGVDbGljayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5vdXRzaWRlQ2xpY2spO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm91dHNpZGVDbGljayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5zY3JvbGxEaXJcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZW51Q29udGFpbmVyID0gdGhpcy4kZWwucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cobWVudUNvbnRhaW5lcik7XG4gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5kYXRhLnNjcm9sbERpcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInRvcFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJ1cFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVDb250YWluZXIuY2xhc3NMaXN0LnJlbW92ZShcImhpZGRlblwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkb3duXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVudUNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKFwiaGlkZGVuXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZU1vYmlsZU1lbnUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5tb2JpbGVNZW51T3BlbiA9ICF0aGlzLmRhdGEubW9iaWxlTWVudU9wZW47IC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNPcGVuID0gdGhpcy5kYXRhLm1vYmlsZU1lbnVPcGVuIFxuICAgICAgICAgICAgICAgICAgICBpZihpc09wZW4gPT0gdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIHtkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5hZGQoJ21vYmlsZS1vcGVuJyk7fVxuICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICB7ZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QucmVtb3ZlKCdtb2JpbGUtb3BlbicpO31cbiAgICAgICAgICAgICAgICAgICAgY2xlYXJNb2JpbGVNZW51KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvdXRzaWRlQ2xpY2soZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCBtZWdhbWVudSA9IHRoaXMuJGVsO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIW1lZ2FtZW51LmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZFByaW1hcnlJZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uTWVudSgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbFBvcyA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZVNjcm9sbCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoZG9jdW1lbnQuYm9keS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSkudG9wID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2Nyb2xsRGlyID0gXCJ0b3BcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGRvY3VtZW50LmJvZHkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpLnRvcCA+IHNjcm9sbFBvcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zY3JvbGxEaXIgPSBcInVwXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zY3JvbGxEaXIgPSBcImRvd25cIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFBvcyA9IChkb2N1bWVudC5ib2R5LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpKS50b3A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMuZGF0YS5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIiwgaGFuZGxlU2Nyb2xsKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCBoYW5kbGVTY3JvbGwpO1xuICAgICAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3NldFRvcGJhclNlbGVjdGlvbicsIChpZCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNlbGVjdGVkVG9wYmFySWQgPSBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS50b3BiYXJNZW51T3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucHJpbWFyeU1lbnVPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIC8qXG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignYmFjaycsIChvYmopID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleXMuZm9yRWFjaCgoaXRlbSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YVtpdGVtXSA9IG9ialtpdGVtXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3NldFByaW1hcnlTZWxlY3Rpb24nLCAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZFByaW1hcnlJZCA9IGlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByaW1hcnlNZW51T3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudG9wYmFyTWVudU9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdzZXRTZWNvbmRhcnlTZWxlY3Rpb24nLCAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZFNlY29uZGFyeUlkID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAqL1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb25NZW51KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAgXG5cbiAgICAgICAgLy8gd3JhcHBlciBmb3IgdG9wIGxldmVsIHN1Ym1lbnVzXG4gICAgICAgIC8vIGUuZy4gTXVuaWNpcGFsIHdhdGVyIHNvbHV0aW9ucywgSW5kdXN0cmlhbCBtZWFzdXJlbWVudCBzb2x1dGlvbnNcbiAgICAgICAgLypcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbWVnYW1lbnUtc3VibWVudScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpc09wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICdkYXRhLnNlbGVjdGVkUHJpbWFyeUlkJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdGhpcy5pZCA9PSB0aGlzLmRhdGEuc2VsZWN0ZWRQcmltYXJ5SWQgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7IFxuICAgICAgICAgICAgICAgIC8vIHNldCBjdXJyZW50IHN1Ym1lbnUgSUQgYmFzZWQgb24gMSBpbmRleFxuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBcInN1Ym1lbnUtXCIgKyAoW10uaW5kZXhPZi5jYWxsKHRoaXMuJGVsLnBhcmVudE5vZGUuY2hpbGRyZW4sIHRoaXMuJGVsKSk7ICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAqL1xuICAgICAgIC8qXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ21vYmlsZS1wYW5lbCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAqL1xuICAgICAgICAvKlxuICAgICAgICBWdWUuY29tcG9uZW50KCdwcmltYXJ5LW1lbnUtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2lzTW9iaWxlJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICAgICAgICAgICAgICBzdWZmaXg6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICBzZXQgPWlkXG4gICAgICAgICAgICAgICAgICAgIGxldCBtZW51SXRlbXMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZWdhbWVudV9fbW9iaWxlLWl0ZW0tLW1haW4nKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBcInByaW1hcnktXCIgKyAobWVudUl0ZW1zLmluZGV4T2YodGhpcy4kZWwpICsgMSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3VmZml4ID0gbWVudUl0ZW1zLmluZGV4T2YodGhpcy4kZWwpICsgMTtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRpdGxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGl0bGUgPSB0aGlzLiRlbC5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgndXBkYXRlTWVudScsIHsnaWQnOiB0aGlzLmlkLCAndGl0bGUnOiB0aGlzLnRpdGxlfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0RXZlbnRzKCk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGluaXRFdmVudHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVNb2JpbGVFdmVudHMoZSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5oYW5kbGVEZXNrdG9wRXZlbnRzKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gaGFuZGxlRGVza3RvcEV2ZW50cyhlKSB7XG4gICAgICAgICAgICAgICAgLy8gICAgIEV2ZW50QnVzLiRlbWl0KCdzZXRTZWNvbmRhcnlTZWxlY3Rpb24nLCBgc2Vjb25kYXJ5LTEtcHJpbWFyeS0ke3RoaXMuc3VmZml4fWApO1xuICAgICAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAgICAgaGFuZGxlTW9iaWxlRXZlbnRzKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjbGlja2VkXCIpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2V0UHJpbWFyeVNlbGVjdGlvbicsdGhpcy5pZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgKi9cbiAgICAgICAvKlxuICAgICAgICBWdWUuY29tcG9uZW50KCdwcmltYXJ5LW1lbnUtaXRlbS1kZXNrdG9wJywge1xuICAgICAgICAgICAgcHJvcHM6IFsncGFyZW50LWlkJywgJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgcGFyZW50SWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gXCJwcmltYXJ5LVwiICsgdGhpcy5wYXJlbnRJZC5zbGljZSg4KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3VibWVudSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ2RhdGEuc2VsZWN0ZWRQcmltYXJ5SWQnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMucGFyZW50SWQgPT0gdGhpcy5kYXRhLnNlbGVjdGVkUHJpbWFyeUlkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaW5pdFN1Ym1lbnUoZSkge1xuICAgICAgICAgICAgICAgICAgICBpZihlKSB7ZS5wcmV2ZW50RGVmYXVsdCgpO31cbiAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMuZGF0YS5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3NldFNlY29uZGFyeVNlbGVjdGlvbicsIGBzZWNvbmRhcnktMS0ke3RoaXMuaWR9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdE1lbnUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmVudElkID09IHRoaXMuZGF0YS5zZWxlY3RlZFByaW1hcnlJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3NldFByaW1hcnlTZWxlY3Rpb24nLCBudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzZXRQcmltYXJ5U2VsZWN0aW9uJywgYCR7dGhpcy5wYXJlbnRJZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCF0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2V0U2Vjb25kYXJ5U2VsZWN0aW9uJywgYHNlY29uZGFyeS0xLSR7dGhpcy5pZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICovXG4gICAgICAgLypcbiAgICAgICAgVnVlLmNvbXBvbmVudCgncHJpbWFyeS1wYW5lbCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ3BhcmVudC1pZCcsICdkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICcnLFxuICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZTogZmFsc2VcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZElkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZWxlY3RlZFByaW1hcnlJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZElkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuc2VsZWN0ZWRJZCA9PSB0aGlzLmlkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHByaW1hcnlQYW5lbHMgPSBBcnJheS5mcm9tKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZWdhbWVudV9fc3VibWVudS1hcmVhLWxlZnQnKSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBcInByaW1hcnktXCIgKyAocHJpbWFyeVBhbmVscy5pbmRleE9mKHRoaXMuJGVsKSArIDEpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0VGl0bGUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGJhY2soZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnYmFjaycpO1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdiYWNrJywge1wicHJpbWFyeU1lbnVPcGVuXCI6IGZhbHNlfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRUaXRsZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5kYXRhLm1lbnVEYXRhLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIml0ZW1cIiwgaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlkXCIsIHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT09IHRoaXMuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gbWF0Y2gudGl0bGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICovXG4gICAgICAgIC8qXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NlY29uZGFyeS1wYW5lbCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ3BhcmVudC1pZCcsICdkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgKi9cbiAgICAgICAgLypcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnc2Vjb25kYXJ5LWNvbnRlbnQnLCB7XG4gICAgICAgICAgICBwcm9wczogWydwYXJlbnRJZCcsICdkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc3VmZml4OiAnJyxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2VsZWN0ZWRTZWNvbmRhcnlJZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgcGFyZW50SWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN1ZmZpeCA9IHRoaXMucGFyZW50SWQuc3Vic3RyaW5nKDgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy5zZWxlY3RlZElkID09IHRoaXMuaWQgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyAnZGF0YS5tZW51RGF0YSc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLmdldEVsZW1lbnRzKCk7XG4gICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgaWRcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLiRlbC5wYXJlbnROb2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZWdhbWVudV9fc3VibWVudS1jb250ZW50JykpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gXCJzZWNvbmRhcnktXCIgKyAoaXRlbXMuaW5kZXhPZih0aGlzLiRlbCkgKyAxKSArIFwiLXByaW1hcnktXCIgKyB0aGlzLnN1ZmZpeDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuZGF0YXNldC5pZCA9IHRoaXMuaWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBnZXRFbGVtZW50cygpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgbGV0IGlubmVyQ29udGVudCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5tZWdhbWVudV9faW5uZXItYXJlYScpO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgKi9cbiAgICAgICAgLypcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnc2Vjb25kYXJ5LW1lbnUtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ3BhcmVudElkJywgJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnNlbGVjdGVkU2Vjb25kYXJ5SWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIHdhaXQgdW50aWwgcGFyZW50IGhhcyBhbmQgSUQgdG8gYXNzaWduIGNoaWxkIGlkXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHBhcmVudElkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZWxlY3RlZElkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuc2VsZWN0ZWRJZCA9PSB0aGlzLmlkID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGlkXG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IEFycmF5LmZyb20odGhpcy4kZWwucGFyZW50Tm9kZS5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYW1lbnVfX3N1Ym1lbnUtaXRlbScpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IFwic2Vjb25kYXJ5LVwiICsgKGl0ZW1zLmluZGV4T2YodGhpcy4kZWwpICsgMSkgKyBcIi1cIiArIHRoaXMucGFyZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5uZXJDb250ZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgZGl2W2RhdGEtaWQ9XCIke3RoaXMuaWR9XCJdYCkuY2xvbmVOb2RlKHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy4kZWwuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVNZW51Jywge1wiaWRcIjogdGhpcy5pZCxcInRpdGxlXCI6dGhpcy50aXRsZSwgXCJlbFwiOmlubmVyQ29udGVudH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgdGl0bGVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhbmRsZURlc2t0b3AoZSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2xpY2tlZCBkZXNrdG9wXCIpO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2V0U2Vjb25kYXJ5U2VsZWN0aW9uJywgdGhpcy5pZCk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGhhbmRsZU1vYmlsZShlKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjbGlja2VkIG1vYmlsZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9ICF0aGlzLmlzQWN0aXZlO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnc2V0U2Vjb25kYXJ5U2VsZWN0aW9uJywgdGhpcy5pZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0RXZlbnRzKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcubWVnYW1lbnVfX3N1Ym1lbnUtaXRlbS1saW5rJykuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlTW9iaWxlKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZURlc2t0b3AoZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgKi9cbiAgICAgICAgLypcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnc2Vjb25kYXJ5LWlubmVyLWNvbnRlbnQnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2lkJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICdkYXRhLm1lbnVEYXRhJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdENvbnRlbnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXRDb250ZW50KCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgb2JqID0gdGhpcy5kYXRhLm1lbnVEYXRhLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkID09IHRoaXMuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAob2JqKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWwgPSBvYmouZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLmlubmVyLmFwcGVuZENoaWxkKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5pdENvbnRlbnQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgICovXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3RvcGJhci1wYW5lbCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3RvcGJhci1jb250ZW50Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWVudURhdGE6IHN0b3JlLnN0YXRlLm1lbnVLZXlzLFxuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2VsZWN0ZWRJZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2VsZWN0ZWRUb3BiYXJJZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZWRNZW51RGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5tZW51S2V5cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAvLyBvbmx5IHdhdGNoIHRoZSBzZWxlY3RlZCB0b3BiYXIgY29udGVudCBpZFxuICAgICAgICAgICAgICAgIHNlbGVjdGVkSWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy5pZCA9PSB0aGlzLnNlbGVjdGVkSWQgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1cGRhdGVkTWVudURhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbnVEYXRhID0gc3RvcmUuc3RhdGUubWVudUtleXM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgYmFjayhlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCdiYWNrJyk7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ2JhY2snLCB7XCJ0b3BiYXJNZW51T3BlblwiOiBmYWxzZX0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWF0Y2ggPSB0aGlzLm1lbnVEYXRhLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIml0ZW1cIiwgaXRlbS5pZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImlkXCIsIHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT09IHRoaXMuaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gbWF0Y2gudGl0bGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBsZXQgbWVudUl0ZW1zID0gQXJyYXkuZnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYW1lbnVfX21vYmlsZS10b3BiYXInKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pZCA9IFwidG9wYmFyLVwiICsgKG1lbnVJdGVtcy5pbmRleE9mKHRoaXMuJGVsKSArIDEpO1xuXG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5tZW51RGF0YSk7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0ZXN0XCIsdGVzdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3RvcGJhci1tZW51LWl0ZW0nLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpc01vYmlsZTogc3RvcmUuc3RhdGUuaXNNb2JpbGUsXG4gICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01vYmlsZSA9IHRoaXMuY29tcHV0ZWRJc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGV2ZW50IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUV2ZW50cyhlKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRpdGxlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUV2ZW50cyhlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBoYW5kbGVFdmVudHMoZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwiY2xpY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3NldFRvcGJhclNlbGVjdGlvbicsdGhpcy5pZCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBzZXQgc2VjdGlvbiB0aXRsZSB0byBwYXNzIHRvIHNlY3Rpb24gbWVudVxuICAgICAgICAgICAgICAgIHNldFRpdGxlKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRpdGxlID0gdGhpcy4kZWwuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZU1lbnUnLCB7XCJpZFwiOiB0aGlzLmlkLFwidGl0bGVcIjp0aGlzLnRpdGxlfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1lbnVJdGVtcyA9IEFycmF5LmZyb20oZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1lZ2FtZW51X19tb2JpbGUtaXRlbS0tdG9wYmFyJykpO1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBcInRvcGJhci1cIiArIChtZW51SXRlbXMuaW5kZXhPZih0aGlzLiRlbCkgKyAxKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbGFuZy1zZWxlY3RvcicsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUxhbmc6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGFsbExhbmdzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdsYW5nLXNlbGVjdG9yLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydhbGxMYW5ncycsJ2FjdGl2ZUxhbmcnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxhbmc6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGFjdGl2ZUxhbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy5hY3RpdmVMYW5nID09PSB0aGlzLmxhbmcgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAvLyBjaGFuZ2VMYW5nKGUpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgLy8gdGhpcy5hY3RpdmVMYW5nID0gdGhpcy5sYW5nO1xuICAgICAgICAgICAgICAgIC8vICAgICBFdmVudEJ1cy4kZW1pdCgnc2V0LWxhbmcnLCB0aGlzLmxhbmcpO1xuICAgICAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0TGFuZyhlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuYWN0aXZlTGFuZyA9IHRoaXMubGFuZztcbiAgICAgICAgICAgICAgICAgICAgLy8gRXZlbnRCdXMuJGVtaXQoJ3NldC1sYW5nJywgdGhpcy5sYW5nKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhbmcgPSBlLmN1cnJlbnRUYXJnZXQuZGF0YXNldC5sYW5nO1xuICAgICAgICAgICAgICAgICAgICBpZiAobGFuZykge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gYHNlbGVjdGVkTGFuZ3VhZ2U9JHtsYW5nfTsgcGF0aD0vOyBtYXgtYWdlPTMxNTM2MDAwO2A7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMubGFuZyA9IHRoaXMuJGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9IHRoaXMuYWN0aXZlTGFuZyA9PSB0aGlzLmxhbmcgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NlYXJjaCcsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzT3BlbjogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIHByZWRpY3RpdmVTZWFyY2hPcGVuOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgc2VhcmNoVGVybTogbnVsbCwgLy9mcm9tIGlucHV0IGZvciB2LW1vZGVsXG4gICAgICAgICAgICAgICAgICAgIHNlYXJjaFRlcm1WaXM6IG51bGwsIC8vZGlzcGxheWVkIHNlYXJjaCB0ZXJtXG4gICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0czogbnVsbCxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzZWFyY2hUZXJtOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCBzZWFyY2ggaWYgc2VhcmNoIHRlcm0gaXMgbG9uZ2VyIHRoYW4gMSBjaGFyYWN0ZXIgYW5kIG5vdCBzcGFjZXNcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWFyY2hUZXJtICYmIHRoaXMuc2VhcmNoVGVybS5yZXBsYWNlKC9cXHMrL2csICcnKSAhPT0gXCJcIiAmJiB0aGlzLnNlYXJjaFRlcm0ubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wcmVkaWN0aXZlU2VhcmNoT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRlYm91bmNlKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZGljdGl2ZVNlYXJjaE9wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXNPcGVuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5nbG9iYWxTZWFyY2guZm9jdXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgLy8gaW5jbHVkZXMgdXJsIHBhcmFtcyBmb3IgYXV0byBmaWx0ZXJpbmcgb24gc2VhcmNoIHJlc3VsdHMgcGFnZVxuICAgICAgICAgICAgICAgIC8vIGZpbHRlcnMgcGFyYW1zIGFyZSBieSBmaWx0ZXIgSURcbiAgICAgICAgICAgICAgICBzZWFyY2hVcmw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7d2luZG93LmJhc2VTZWFyY2hVcmx9P3E9JHt0aGlzLnNlYXJjaFRlcm1WaXN9YDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHByb2R1Y3RVcmw6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7d2luZG93LmJhc2VQcm9kdWN0VXJsfSZxPSR7dGhpcy5zZWFyY2hUZXJtVmlzfWA7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uVXJsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3dpbmRvdy5iYXNlRG9jdW1lbnRhdGlvblVybH0mcT0ke3RoaXMuc2VhcmNoVGVybVZpc31gO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgVGVjaG5vbG9neVVybDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHt3aW5kb3cuYmFzZVRlY2hub2xvZ3lVcmx9JnE9JHt0aGlzLnNlYXJjaFRlcm1WaXN9YDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmN1cnJlbnRMYW5nXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJTZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiS2V5d29yZHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5zZWFyY2hUZXJtVmlzID8gdGhpcy5zZWFyY2hUZXJtVmlzIDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiZmlsdGVyTmFtZVwiOiBcImZpbHRlcm5hbWVcIlxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgYWRkTG9hZGluZygpIHtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FtZW51X19zZWFyY2gtaW5wdXQnKS5jbGFzc0xpc3QuYWRkKCdsb2FkaW5nJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVnYW1lbnVfX3NlYXJjaC1pbnB1dCcpLmNsYXNzTGlzdC5yZW1vdmUoJ2xvYWRpbmcnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvZ2dsZVNlYXJjaCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzOiBkZWJvdW5jZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VhcmNoVGVybVZpcyA9IHRoaXMuc2VhcmNoVGVybTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaVVybCA9IFwiL2FwaS9wcm9kdWN0c1wiO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvcHJvZHVjdHNcIjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYXBpVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBxOiB0aGlzLnNlYXJjaFRlcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogdGhpcy5sYW5ndWFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHJlcy5kYXRhLnJlc3VsdHMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pc0xvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzdWx0cyA9IHJlcy5kYXRhLnJlc3VsdHMuc2xpY2UoMCwgMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUxvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sIDEwMDApIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3ByZWRpY3RpdmUtcmVzdWx0cycsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ3Jlc3VsdHMnLCAnaXNMb2FkaW5nJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPHJlc3VsdC1pdGVtIHYtZm9yPVwiKHJlc3VsdCwgaW5kZXgpIGluIHJlc3VsdHNcIiA6a2V5PVwiaW5kZXhcIiA6Y29udGVudD1cInJlc3VsdFwiIDppc0xvYWRpbmc9XCJpc0xvYWRpbmdcIj48L3Jlc3VsdC1pdGVtPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdyZXN1bHQtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2NvbnRlbnQnLCAnaXNMb2FkaW5nJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWdhbWVudV9fcHJlc2VhcmNoLWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibWVnYW1lbnVfX3ByZXNlYXJjaC1pdGVtLWltYWdlXCIgdi1pZj1cImNvbnRlbnQucHJvZHVjdEltYWdlVXJsXCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwiY29udGVudC51cmxcIj48aW1nIDpzcmM9XCJjb250ZW50LnByb2R1Y3RJbWFnZVVybFwiIDphbHQ9XCJjb250ZW50LnByb2R1Y3RJbWFnZVVybEFsdFRleHRcIj48L2E+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIm1lZ2FtZW51X19wcmVzZWFyY2gtaXRlbS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwiY29udGVudC51cmxcIiBjbGFzcz1cIm1lZ2FtZW51X19wcmVzZWFyY2gtaXRlbS1saW5rXCI+PHNwYW4gY2xhc3M9XCJtZWdhbWVudV9fcHJlc2VhcmNoLWl0ZW0tZXllYnJvd1wiPlxuICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnQuYnJhbmR9fVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtZWdhbWVudV9fcHJlc2VhcmNoLWl0ZW0tdGl0bGVcIiB2LWh0bWw9XCJjb250ZW50LnByb2R1Y3ROYW1lXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PjwvYT5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLm1lZ2FtZW51YCxcbiAgICAgICAgICAgIHN0b3JlOiBzdG9yZVxuICAgICAgICB9KS4kbW91bnQoYC5tZWdhbWVudWAsIHRydWUpO1xuICAgIH1cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4gICAgaWYgKG1lbnUpIFxuICAgICAgICB7XG4gICAgICAgIG1lZ2FtZW51Q29uc3RydWN0b3IoKTtcbiAgICAgICAgbGV0IGhvdmVyVGltZXIgICAgICAgID0gbnVsbDtcbiAgICAgICAgY29uc3QgdHJpZ2dlcnNXcmFwICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FfX3RyaWdnZXJzJyk7XG4gICAgICAgIGNvbnN0IHRyaWdnZXJzICAgICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZWdhX190cmlnZ2VycyAuaXMtdHJpZ2dlcicpO1xuICAgICAgICBjb25zdCBtZWdhQ29udGVudCAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVnYV9fY29udGVudCcpO1xuICAgICAgICBjb25zdCBtZWdhVGllcnMgICAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcubWVnYV9fY29udGVudCAubWVnYV9fdGllcnMnKTtcbiAgICAgICAgY29uc3QgY29sVHJpZ2dlcnMgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLm1lZ2FfX2NvbnRlbnQgLnRyaWdnZXInKTtcbiAgICAgICAgY29uc3QgbW9iaWxlQmFjayAgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21lZ2FfX21vYmlsZV9fdGllcl9fYmFjaycpO1xuICAgICAgICBjb25zdCBtb2JpbGVIZWFkaW5nICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbWVnYV9fbW9iaWxlX190aWVyX19oZWFkaW5nJyk7XG5cbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGNsaWNrIG9mZiBtZW51IFxuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBlID0+IFxuICAgIHtcbiAgICAvLyBjb25zdCBjbGlja2VkQXJlYSA9IFxuICAgIGlmICghbWVnYUNvbnRlbnQuY29udGFpbnMoZS50YXJnZXQpICYmICF0cmlnZ2Vyc1dyYXAuY29udGFpbnMoZS50YXJnZXQpICYmIG1lZ2FDb250ZW50LmNsYXNzTGlzdC5jb250YWlucygnYWN0aXZlJykpXG4gICAgICAgIHtcbiAgICAgICAgbWVnYUNvbnRlbnQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJylcbiAgICAgICAgdHJpZ2dlcnNXcmFwLmNsYXNzTGlzdC5yZW1vdmUoJ21lZ2FtZW51VHJpZ2dlcmVkJylcbiAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FfX3RyaWdnZXJzIC5pcy10cmlnZ2VyLmFjdGl2ZScpLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpXG4gICAgICAgIH1cbiAgICB9KVxuLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gYmFjayBidXR0b24gZm9yIG1vYmlsZSBcbiAgICAgICAgbW9iaWxlQmFjay5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsZnVuY3Rpb24oZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGNvbnN0IGhpc3RvcnlTaXplID0gaGlzdG9yeUFyci5sZW5ndGg7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNhbiBhbHNvIGJlIHRoZSBoZWlnaGVzdCB0aWVyIG9wZW4uIFxuICAgICAgICAgICAgY29uc3QgY3VySW5kZXggICAgPSBoaXN0b3J5U2l6ZSAtMTtcblxuICAgICAgICAgICAgLy8gc2hvdWxkIG9ubHkgd29yayBpZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgaXRlbSBpbiBoaXN0b3J5XG4gICAgICAgICAgICBpZiggaGlzdG9yeVNpemUgPiAxIClcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgY29uc3QgcHJldlBsYWNlID0gaGlzdG9yeUFycltjdXJJbmRleCAtMV1cbiAgICAgICAgICAgICAgICAvLyBjbG9zZSBjdXJyZW50IG9wZW4gdGllciwgYW5kIG9wZW4gVUxcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGllci0ke2hpc3RvcnlTaXplfWApLmNsYXNzTGlzdC5yZW1vdmUoJ21vYmlsZUFjdGl2ZVRpZXInKSBcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGllci0ke2hpc3RvcnlTaXplfSAubW9iaWxlQWN0aXZlQ29sYCkuY2xhc3NMaXN0LnJlbW92ZSgnbW9iaWxlQWN0aXZlQ29sJylcbiAgICAgICAgICAgICAgICAvLyBvcGVuICBwcmV2aW91cyAoaW4gaGlzdG9yeSlcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGllci0ke2N1ckluZGV4fWApLmNsYXNzTGlzdC5hZGQoJ21vYmlsZUFjdGl2ZVRpZXInKVxuICAgICAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC50aWVyLSR7Y3VySW5kZXh9IC5tb2JpbGVBY3RpdmVDb2xgKS5jbGFzc0xpc3QuYWRkKCdtb2JpbGVBY3RpdmVDb2wnKVxuICAgICAgICAgICAgICAgIG1vYmlsZUhlYWRpbmcuaW5uZXJUZXh0ID0gcHJldlBsYWNlLnR4dFxuICAgICAgICAgICAgICAgIGhpc3RvcnlBcnIubGVuZ3RoICA9IGhpc3RvcnlTaXplIC0xO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYoaGlzdG9yeVNpemUgPT0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpc3RvcnkgaXMgYmFjayB0byBkZWZhdWx0IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIG1lZ2FUaWVycy5jbGFzc0xpc3QuYWRkKCdtb2JpbGVIaWRlJylcbiAgICAgICAgICAgICAgICB0cmlnZ2Vyc1dyYXAuY2xhc3NMaXN0LmFkZCgnbW9iaWxlQWN0aXZlVGllcicpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkgXG5cblxuXG5cblxuXG5cbiAgICAgICAgICAgIFxuXG4vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBvcGVuIGFjdGl2ZSB0aWVyIGZvciBtb2JpbGVcbiAgICAgICAgY29uc3Qgc2V0TW9iaWxlVGllciA9IGZ1bmN0aW9uKHRpZXIsIHBvcywgaGlzdG9yeVRleHQpXG4gICAgICAgICAgICB7ICAgXG4gICAgICAgICAgICBjb25zdCBjdXJyZW50QWN0aXZlICAgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5tb2JpbGVBY3RpdmVUaWVyJylcbiAgICAgICAgICAgIGNvbnN0IGhpZ2hlc3RUaWVyRWwgICAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRpZXItJHt0aWVyfWApXG4gICAgICAgICAgICBjb25zdCBhY3RpdmVDb2xJblRpZXIgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYC50aWVyLSR7dGllcn0gLm1vYmlsZUFjdGl2ZUNvbGApXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIC8vIG5vIHRpZXIgbG93ZXIgdGhhbiAwXG4gICAgICAgICAgICBpZih0aWVyID49MCApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGhpZ2hlc3RUaWVyT3Blbj0gdGllcjtcbiAgICAgICAgICAgICAgICBjdXJyZW50QWN0aXZlLmNsYXNzTGlzdC5yZW1vdmUoJ21vYmlsZUFjdGl2ZVRpZXInKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGNsb3NlIGFueSBhY3RpdmUgY29sc1xuICAgICAgICAgICAgaWYoYWN0aXZlQ29sSW5UaWVyICE9IHVuZGVmaW5lZCAmJiBhY3RpdmVDb2xJblRpZXIubGVuZ3RoPjApXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGZvcihsZXQgaT0wO2k8YWN0aXZlQ29sSW5UaWVyLmxlbmd0aDtpKyspXG4gICAgICAgICAgICAgICAgICAgIHthY3RpdmVDb2xJblRpZXJbaV0uY2xhc3NMaXN0LnJlbW92ZSgnbW9iaWxlQWN0aXZlQ29sJyl9XG4gICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgIC8vIGlmIHRpZXIgaXMgYmlnZ2VyIHRoYW4gemVybyBzaG93IG1lZ2Fjb250ZW50ICh3aGVyZSB0aWVycy9jb2x1bW5zIGFyZSlcbiAgICAgICAgICAgIC8vIGFuZCBoaWRlIHRoZSB0cmlnZ2VyIGJ1dHRvbnNcbiAgICAgICAgICAgIGlmKHRpZXIgPjAgKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoaWdoZXN0VGllck9wZW49IHRpZXI7XG4gICAgICAgICAgICAgICAgdHJpZ2dlcnNXcmFwLmNsYXNzTGlzdC5yZW1vdmUoJ21vYmlsZUFjdGl2ZVRpZXInKVxuICAgICAgICAgICAgICAgIG1lZ2FUaWVycy5jbGFzc0xpc3QucmVtb3ZlKCdtb2JpbGVIaWRlJyk7XG4gICAgICAgICAgICAgICAgaGlzdG9yeUFyclt0aWVyLTFdID0ge3R4dDogaGlzdG9yeVRleHQsIGNvbFBvczpwb3N9O1xuXG4gICAgICAgICAgICAgICAgaWYocG9zICE9IFwiZnJvbUJhY2tCdXR0b25cIilcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGllci0ke3RpZXJ9IC5wb3MtJHtwb3N9YCkuY2xhc3NMaXN0LmFkZCgnbW9iaWxlQWN0aXZlQ29sJylcbiAgICAgICAgICAgICAgICAgICAgbW9iaWxlSGVhZGluZy5pbm5lclRleHQgPSBoaXN0b3J5VGV4dFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGllciA9PSAwKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBoaWdoZXN0VGllck9wZW49MFxuICAgICAgICAgICAgICAgIHRyaWdnZXJzV3JhcC5jbGFzc0xpc3QuYWRkKCdtb2JpbGVBY3RpdmVUaWVyJyk7XG4gICAgICAgICAgICAgICAgbWVnYVRpZXJzLmNsYXNzTGlzdC5hZGQoJ21vYmlsZUhpZGUnKTsgICAgXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgaGlnaGVzdFRpZXJFbC5jbGFzc0xpc3QuYWRkKCdtb2JpbGVBY3RpdmVUaWVyJylcbiAgICAgICAgICAgIH1cblxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG9wZW4gdGllcnMvY29sdW1uIGxvZ2ljXG4gICAgICAgIGNvbnN0IG9wZW5UaWVyPSh0cmlnZ2VyVGllciwgcG9zSW5UaWVyLCBlbENsaWNrZWQpPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgIGNvbnN0IG1heERlcHRoICAgICAgICAgICA9IDRcbiAgICAgICAgICAgIGNvbnN0IHRoaXNUaWVyICAgICAgICAgICA9IHBhcnNlSW50KHRyaWdnZXJUaWVyKVxuICAgICAgICAgICAgaGlnaGVzdFRpZXJPcGVuICAgICAgICAgID0gdGhpc1RpZXIgKyAxXG4gICAgICAgICAgICBjb25zdCBuZXh0VGllciAgICAgICAgICAgPSBcIi50aWVyLVwiICsgaGlnaGVzdFRpZXJPcGVuXG4gICAgICAgICAgICBjb25zdCBwb3MgICAgICAgICAgICAgICAgPSBcIi5wb3MtXCIgKyBwb3NJblRpZXI7XG4gICAgICAgICAgICBjb25zdCBjdXJyZW50UG9zICAgICAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAke25leHRUaWVyfSAuYWN0aXZlYClcbiAgICAgICAgICAgIGNvbnN0IGxpbmtPcGVuU2FtZVRpZXIgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC50aWVyLSR7dGhpc1RpZXJ9IC5pc09wZW5gKVxuICAgICAgICAgICAgY29uc3QgbGlua09wZW5OZXh0VGllciAgID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLnRpZXItJHt0aGlzVGllcisxfSAuaXNPcGVuYClcbiAgICAgICAgICAgIGNvbnN0IHR4dCAgICAgICAgICAgICAgICA9IGVsQ2xpY2tlZC5pbm5lclRleHQ7XG4gICAgICAgIFxuICAgICAgICAgICAgLy8gaGlkZSBhbnkgb3BlbmVkIGl0ZW1zIC0gaW4gU2FtZSB0aWVyXG4gICAgICAgICAgICBpZihjdXJyZW50UG9zICE9IHVuZGVmaW5lZCkgXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGN1cnJlbnRQb3MuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgLy8gc2FtZSB0aWVyIGxpbmsgbmVlZHMgdG8gYmUgY2xlYXJlZFxuICAgICAgICAgICAgICAgIGlmKGxpbmtPcGVuU2FtZVRpZXIgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7bGlua09wZW5TYW1lVGllci5jbGFzc0xpc3QucmVtb3ZlKCdpc09wZW4nKTt9XG4gICAgICAgICAgICAgICAgLy8gbmV4dCB0aWVyIGxpbmsgbmVlZHMgdG8gYmUgY2xlYXJlZFxuICAgICAgICAgICAgICAgIGlmKGxpbmtPcGVuTmV4dFRpZXIgIT0gdW5kZWZpbmVkKVxuICAgICAgICAgICAgICAgICAgICB7bGlua09wZW5OZXh0VGllci5jbGFzc0xpc3QucmVtb3ZlKCdpc09wZW4nKX1cbiAgICAgICAgXG4gICAgICAgICAgICAgICAgLy8gaGlkZSBhbnkgZGVlcGVyIGNvbHVtbnMgKHRpZXJzKVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAodGhpc1RpZXIrMSkgOyBpPD0gbWF4RGVwdGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAudGllci0ke2l9YCkuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJylcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICAvLyBvcGVuL3JlLW9wZW4gc2VsZWN0aW9uXG4gICAgICAgICAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKG5leHRUaWVyKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKVxuICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgJHtuZXh0VGllcn0gJHtwb3N9YCkuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJylcbiAgICAgICAgICAgIGVsQ2xpY2tlZC5jbGFzc0xpc3QuYWRkKCdpc09wZW4nKVxuICAgICAgICAgICAgc2V0TW9iaWxlVGllcihoaWdoZXN0VGllck9wZW4sIHBvc0luVGllciwgdHh0KTsgXG4gICAgICAgICAgICB9XG5cbi8qIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gIEVWRU5UUyAqLyBcbi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG9wZW5pbmcgbWVnYW1lbnUgbG9naWNcbiAgICAgICAgZm9yKGxldCBpPTA7aTx0cmlnZ2Vycy5sZW5ndGg7aSsrKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgdHJpZ2dlcnNbaV0uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpXG4gICAgICAgICAgICAgICAgICAgIC8vIGRlc2t0b3AgbG9naWNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5pbm5lcldpZHRoID4gMTIwMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGUudGFyZ2V0LmNsYXNzTGlzdC5jb250YWlucyhcImFjdGl2ZVwiKSApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVnYUNvbnRlbnQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnNXcmFwLmNsYXNzTGlzdC5yZW1vdmUoJ21lZ2FtZW51VHJpZ2dlcmVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlnaGVzdFRpZXJPcGVuID0gMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxBY3RpdmVzICAgICAgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcubWVnYV9fY29udGVudCAuYWN0aXZlJykgICAgICAgICAgICAgIC8vIHNlbGVjdCBhbGwgb3BlbiBjb2x1bW5zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsbG9wZW5BcnJvd3MgICA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5tZWdhX19jb250ZW50IC5pc09wZW4nKSAgICAgICAgICAgICAgLy8gbXkgbGlua3MgdGhhdCBwb2ludCB0byBvcGVuIGNvbHVtbnMgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFNlbGVjdGVkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FfX3RyaWdnZXJzID4gbGkgYS5hY3RpdmUnKSAgICAgICAgICAvLyBzZWxlY3Qgb3BlbiBtYWluIHRhYlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlLnRhcmdldC5kYXRhc2V0LnRhcmdldDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IGJ5IGhpZGluZyBhbGwgdGllcnMgMCAtIDRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yKGxldCBpPTA7aTwgYWxsQWN0aXZlcy5sZW5ndGg7IGkrKylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7YWxsQWN0aXZlc1tpXS5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKX1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciB0aGUgbWFpbiBtZW51IHRvb1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjdXJyZW50U2VsZWN0ZWQgIT0gbnVsbClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTZWxlY3RlZC5jbGFzc0xpc3QucmVtb3ZlKCdhY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGVhciBsaW5rcyB0byBwb2ludCB0byBvcGVuZWQgY29sdW1uc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IobGV0IGk9MDtpPCBhbGxvcGVuQXJyb3dzLmxlbmd0aDsgaSsrKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2FsbG9wZW5BcnJvd3NbaV0uY2xhc3NMaXN0LnJlbW92ZSgnaXNPcGVuJyl9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS50YXJnZXQuY2xhc3NMaXN0LmFkZCgnYWN0aXZlJykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhpZ2hsaWdodCBjbGlja2VkIHRpZXIgMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWdhQ29udGVudC5jbGFzc0xpc3QuYWRkKCdhY3RpdmUnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3BlbiBtZWdhIG1lbnVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpZ2dlcnNXcmFwLmNsYXNzTGlzdC5hZGQoJ21lZ2FtZW51VHJpZ2dlcmVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgLm1lZ2FfX2NvbnRlbnQgLnRpZXItMSAucG9zLSR7dGFyZ2V0fWApLmNsYXNzTGlzdC5hZGQoJ2FjdGl2ZScpIC8vIG9wZW4gdGllci0xXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIG1vYmlsZSBsb2dpY1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL21vYmlsZUhlYWRpbmcuaW5uZXJUZXh0ID0gZS50YXJnZXQuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gZS50YXJnZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRQb3MgPSBlbC5kYXRhc2V0LnRhcmdldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE1vYmlsZVRpZXIoMSwgdGFyZ2V0UG9zICwgZWwuaW5uZXJUZXh0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG1vYmlsZSB0aGVyZSBpcyBubyB0b2dnbGUsIHRoaXMgYnV0dG9uIGFsd2F5cyBvcGVucyB0aGUgbmV4dCB0aWVyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KSAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHN1Ym1lbnUgY29sdW1ucyBsb2dpY1xuICAgICAgICBmb3IobGV0IGk9MDtpPGNvbFRyaWdnZXJzLmxlbmd0aDtpKyspXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICBjb2xUcmlnZ2Vyc1tpXS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW92ZXInLGZ1bmN0aW9uKGUpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0aGlzVGllciAgPSBlLnRhcmdldC5wYXJlbnROb2RlLnBhcmVudE5vZGUucGFyZW50Tm9kZS5kYXRhc2V0LnRpZXI7ICAvLyBiYWNrd2FyZHM6IHN0YXJ0aW5nIGZyb20gbGluayBjbGlja2VkIHRvIDwgbGkgPCB1bCA8IHRpZXItI1xuICAgICAgICAgICAgICAgIGNvbnN0IHBvc0luVGFyZ2V0VGllciA9IGUudGFyZ2V0LmRhdGFzZXQudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGNvbnN0IGVsQ2xpY2tlZCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgIGlmKHdpbmRvdy5pbm5lcldpZHRoID4gMTIwMClcbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBob3ZlclRpbWVyID0gc2V0VGltZW91dChmdW5jdGlvbigpIFxuICAgICAgICAgICAgICAgICAgICAgICAge29wZW5UaWVyKCB0aGlzVGllciwgcG9zSW5UYXJnZXRUaWVyLCBlbENsaWNrZWQpIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KSBcblxuICAgICAgICAgICAgLy8gY2FuY2VsIHRpbWVyIG5lZWRlZCBcbiAgICAgICAgICAgIGNvbFRyaWdnZXJzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlb3V0JyxmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgIHsgICBjbGVhclRpbWVvdXQoaG92ZXJUaW1lcik7IH0pICAgXG5cbiAgICAgICAgICAgIC8vIGNsaWNrIGlzIG9rIGZvciBtb2JpbGVcbiAgICAgICAgICAgIGNvbFRyaWdnZXJzW2ldLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJyxmdW5jdGlvbihlKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgY29uc3QgdGhpc1RpZXIgID0gZS50YXJnZXQucGFyZW50Tm9kZS5wYXJlbnROb2RlLnBhcmVudE5vZGUuZGF0YXNldC50aWVyOyAgLy8gYmFja3dhcmRzOiBzdGFydGluZyBmcm9tIGxpbmsgY2xpY2tlZCB0byA8IGxpIDwgdWwgPCB0aWVyLSNcbiAgICAgICAgICAgICAgICBjb25zdCBwb3NJblRhcmdldFRpZXIgPSBlLnRhcmdldC5kYXRhc2V0LnRhcmdldDtcbiAgICAgICAgICAgICAgICBjb25zdCBlbENsaWNrZWQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgICAgICBvcGVuVGllciggdGhpc1RpZXIsIHBvc0luVGFyZ2V0VGllciwgZWxDbGlja2VkKVxuICAgICAgICAgICAgICAgIH0pICAgXG4gICAgICAgICAgICB9XG4gIFxuICAgICAgICB9XG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuICAgIC8vIHdpbmRvdy5iYXNlRG9jdW1lbnRhdGlvblVybCA9ICcvc2VhcmNoLXJlc3VsdHM/ZmlsdGVycz0xMTEnO1xuICAgIC8vIHdpbmRvdy5iYXNlUHJvZHVjdFVybCA9ICcvc2VhcmNoLXJlc3VsdHM/ZmlsdGVycz0yMjInO1xuICAgIC8vIHdpbmRvdy5iYXNlVGVjaG5vbG9neVVybCA9ICcvc2VhcmNoLXJlc3VsdHM/ZmlsdGVycz0zMzMnO1xuICAgIC8vIHdpbmRvdy5iYXNlU2VhcmNoVXJsID0gJy9zZWFyY2gtcmVzdWx0cyc7IFxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IE1lZ2FtZW51O1xuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cydcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcblxuY29uc3QgTWVudVRvcEJhciA9ICgpID0+IHtcbiAgICBsZXQgdG9wQmFyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcC1iYXInKTtcblxuICAgIGxldCBNZW51VG9wQmFyQ29uc3RydWN0b3IgPSAoKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3RvcC1iYXInLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmVOYXY6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlzT3BlbjogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGlzT3BlbjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBjbG9zaW5nIHN1Ym5hdiBvbiBvdXRzaWRlIGNsaWNrXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIHRoaXMub3V0c2lkZUNsaWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCB0aGlzLm91dHNpZGVDbGljayk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHNldE5hdihpZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU5hdiA9IGlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb3V0c2lkZUNsaWNrKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgdG9wbmF2ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcC1iYXInKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3BuYXYuY29udGFpbnModGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlTmF2ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIC8vZ2l2ZSBlYWNoIG5hdiBpdGVtIGFuIGlkIGlmIGl0IGhhcyBhIHN1Ym5hdlxuICAgICAgICAgICAgICAgIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy50b3AtYmFyX19pdGVtJykuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0ucXVlcnlTZWxlY3RvcignLnRvcC1iYXJfX3N1Ym5hdicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmRhdGFzZXQuaWQgPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgY2xpY2sgZXZlbnRzIGZyb20gbmF2IGl0ZW1zXG4gICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdzZXROYXYnLCAoaWQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXROYXYoaWQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIHJlY2lldmUgb3BlbiBzdGF0ZSBmcm9tIGNoaWxkcmVuIHRvIGhhbmRsZSBjbG9zaW5nIG9uIG91dHNpZGUgY2xpY2tcbiAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ29wZW5TdGF0ZScsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzT3BlbiA9IHN0YXRlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgndG9wLWJhci1pdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnYWN0aXZlTmF2J10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBuYXZJZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBoYXNTdWJOYXY6IGZhbHNlXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgYWN0aXZlTmF2OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0FjdGl2ZSA9ICgodGhpcy5hY3RpdmVOYXYgPT0gdGhpcy5uYXZJZCkgJiYgdGhpcy5uYXZJZCAhPT0gbnVsbCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpc0FjdGl2ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgb3BlbiBzdGF0ZSB0byBwYXJlbnQgdG8gaGFuZGxlIGNsb3Npbmcgb24gb3V0c2lkZSBjbGlja1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnb3BlblN0YXRlJywgdGhpcy5pc0FjdGl2ZSA/IHRydWUgOiBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAvLyBlbWl0IGNsaWNrIGV2ZW50IHRvIHBhcmVudFxuICAgICAgICAgICAgICAgIGhhbmRsZUNsaWNrKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9zZXQgYWN0aXZlIHN0YXRlIG9ubHkgaWYgaXRlbSBoYXMgc3VibmF2XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSB0aGlzLmhhc1N1Yk5hdiA/ICF0aGlzLmlzQWN0aXZlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzZXROYXYnLCB0aGlzLm5hdklkKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgLy8gd2FpdCB0aWxsIG5leHQgcmVuZGVyIHRvIGdldCBpZCB0aGF0J3MgYWRkZWQgYnkgcGFyZW50XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5hdklkID0gdGhpcy4kZWwuZGF0YXNldC5pZCB8fCBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmhhc1N1Yk5hdiA9IHRoaXMuJGVsLmRhdGFzZXQuaWQgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2xhbmctc2VsZWN0b3InLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmVMYW5nOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBhbGxMYW5nczogW10sXG4gICAgICAgICAgICAgICAgICAgIHN0b3JlOiBzdG9yZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdsYW5nLXNlbGVjdG9yLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydhbGxMYW5ncycsJ2FjdGl2ZUxhbmcnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxhbmc6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlzQWN0aXZlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAvLyB3YXRjaDoge1xuICAgICAgICAgICAgLy8gICAgIGFjdGl2ZUxhbmc6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgLy8gICAgICAgICB0aGlzLmlzQWN0aXZlID0gdGhpcy5hY3RpdmVMYW5nID09PSB0aGlzLmxhbmcgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAvLyAgICAgfVxuICAgICAgICAgICAgLy8gfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICBzZWxlY3RMYW5nKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5hY3RpdmVMYW5nID0gdGhpcy5sYW5nO1xuICAgICAgICAgICAgICAgICAgICAvLyBFdmVudEJ1cy4kZW1pdCgnc2V0LWxhbmcnLCB0aGlzLmxhbmcpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFuZyA9IGUuY3VycmVudFRhcmdldC5kYXRhc2V0Lmxhbmc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYW5nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgc2VsZWN0ZWRMYW5ndWFnZT0ke2xhbmd9OyBwYXRoPS87IG1heC1hZ2U9MzE1MzYwMDA7YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMubGFuZyA9IHRoaXMuJGVsLmdldEF0dHJpYnV0ZSgnaHJlZicpLnNsaWNlKDEpLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pc0FjdGl2ZSA9IHRoaXMuYWN0aXZlTGFuZyA9PSB0aGlzLmxhbmcgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAudG9wLWJhcmAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAudG9wLWJhcmAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICh0b3BCYXIpIHtcbiAgICAgICAgTWVudVRvcEJhckNvbnN0cnVjdG9yKCk7XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBNZW51VG9wQmFyOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgdGVtcGxhdGUgZnJvbSAnc2hhcmVkL21ldGVyLXNlbGVjdG9yLWJ1dHRvbi1zZXQuaGJzJztcblxuVnVlLmNvbXBvbmVudChcbiAgICBcIm1zLWJ1dHRvbi1zZXRcIixcbiAgICB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBidXR0b25zOiBBcnJheSxcbiAgICAgICAgICAgIG11bHRpcGxlOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sIFxuICAgICAgICAgICAgb3ZhbEJ1dHRvbjogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LCBcbiAgICAgICAgICAgIG9uQ2hhbmdlOiBGdW5jdGlvbixcbiAgICAgICAgICAgIGRpc2FibGVkTWVzc2FnZTogU3RyaW5nLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB7IHR5cGU6IEFycmF5LCBkZWZhdWx0OiBbXSB9LFxuICAgICAgICAgICAgb25UcmlnZ2VyRXZlbnQ6IEZ1bmN0aW9uXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGEoKXtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWVzOiB0aGlzLmJ1dHRvbnMgJiYgdGhpcy5idXR0b25zLm1hcCh2ID0+ICF2LmRpc2FibGVkICYmIHYudmFsdWUgKS5tYXAodiA9PiB0aGlzLmRlZmF1bHRWYWx1ZS5pbmRleE9mKHYpID49IDApLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgIHZhbHVlczoge1xuICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBoYW5kbGVyKHYpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjdHggPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICB2LnJlZHVjZSgobywgZSwgaSkgPT4geyBpZiAoIWUpIHsgcmV0dXJuIG87IH0gcmV0dXJuIFsuLi5vLCBjdHguYnV0dG9uc1tpXV07IH0gLCBbXSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DaGFuZ2UgICYmIHRoaXMub25DaGFuZ2UodmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgY29tcHV0ZWQ6ICB7XG4gICAgICAgIH0sXG4gICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgIH0sXG4gICAgICAgIGJlZm9yZVVubW91bnQoKSB7XG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIGNoYW5nZShpKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSAgdGhpcy52YWx1ZXNbaV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMub25UcmlnZ2VyRXZlbnQoeyB2YWx1ZTogdGhpcy5idXR0b25zW2ldIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBcbiAgICAgICAgdGVtcGxhdGVcbiAgICB9XG4pO1xuIiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCB0ZW1wbGF0ZSBmcm9tICdzaGFyZWQvbWV0ZXItc2VsZWN0b3ItZnJhbWUuaGJzJztcbmltcG9ydCBzZXBhcmF0b3JUZW1wbGF0ZSBmcm9tICdzaGFyZWQvbWV0ZXItc2VsZWN0b3ItZnJhbWUtc2VwYXJhdG9yLmhicyc7XG5pbXBvcnQgcXVlc3Rpb25UZW1wbGF0ZSBmcm9tICdzaGFyZWQvbWV0ZXItc2VsZWN0b3ItZnJhbWUtcXVlc3Rpb24uaGJzJztcblxuVnVlLmNvbXBvbmVudChcbiAgICBcIm1zLWZyYW1lXCIsXG4gICAge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgaXNMYXRlcmFsQmFyOiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB0cmFuc3BhcmVudDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiB0cnVlIH0sXG4gICAgICAgICAgICBjbG9zZUJ1dHRvbkxhYmVsOiBTdHJpbmcsXG4gICAgICAgICAgICBidXR0b25MYWJlbDogU3RyaW5nLFxuICAgICAgICAgICAgY2FuY2VsQnV0dG9uTGFiZWw6IFN0cmluZyxcbiAgICAgICAgICAgIGRpc2FibGVCdXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICAgICAgICAgIHRpdGxlOiBTdHJpbmcsXG4gICAgICAgICAgICBvbkNhbmNlbDogRnVuY3Rpb24sXG4gICAgICAgICAgICBvbkNsaWNrQnV0dG9uOiBGdW5jdGlvbixcbiAgICAgICAgICAgIGhhc1BhcmFtZXRlcnNCdXR0b246IHsgdHlwZTogQm9vbGVhbiwgZGVmYXVsdDogZmFsc2UgfSxcbiAgICAgICAgICAgIGNvbnRhY3RCdXR0b246IE9iamVjdCxcbiAgICAgICAgICAgIG1lc3NhZ2U6IFN0cmluZyxcbiAgICAgICAgICAgIG5vdGljZTogU3RyaW5nLFxuICAgICAgICB9LFxuICAgICAgICBkYXRhKCl7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGlzT3BlbjogZmFsc2VcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICBpc09wZW4odikge1xuICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVDbGFzcyA9ICdtcy1mcmFtZV9vcGVuZWQtbGF0ZXJhbC1iYXInO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyTmFtZUNsYXNzID0gJ21zLWZyYW1lX21vYmlsZS1sYXllcic7XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2JvZHknKTtcblxuICAgICAgICAgICAgICAgIGlmKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKG5hbWVDbGFzcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxheWVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyLmNsYXNzTGlzdC5hZGQobGF5ZXJOYW1lQ2xhc3MpO1xuICAgICAgICAgICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKGxheWVyKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXllciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYC4ke2xheWVyTmFtZUNsYXNzfWApO1xuXG4gICAgICAgICAgICAgICAgICAgIGxheWVyICYmIGJvZHkucmVtb3ZlQ2hpbGQobGF5ZXIpO1xuICAgICAgICAgICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUobmFtZUNsYXNzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXB1dGVkOiAge1xuICAgICAgICAgICAgaGFzQnV0dG9uKCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5idXR0b25MYWJlbCkgJiYgIUJvb2xlYW4odGhpcy5ub3RpY2UpXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW9iaWxlQnV0dG9uTGFiZWwoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvc2VCdXR0b25MYWJlbDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNDb250YWN0QnV0dG9uKCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5jb250YWN0QnV0dG9uKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBoYXNCdXR0b25zKCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzQnV0dG9uIHx8ICB0aGlzLmhhc0NvbnRhY3RCdXR0b247XG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICB9LFxuICAgICAgICBiZWZvcmVVbm1vdW50KCkge1xuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICBjbGlja0J1dHRvbigpe1xuICAgICAgICAgICAgICAgIHRoaXMub25DbGlja0J1dHRvbiAmJiB0aGlzLm9uQ2xpY2tCdXR0b24oKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvcGVuKCl7XG4gICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2FuY2VsKCl7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNhbmNlbCAmJiB0aGlzLm9uQ2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIFxuICAgICAgICB0ZW1wbGF0ZVxuICAgIH1cbik7XG5cblZ1ZS5jb21wb25lbnQoXG4gICAgXCJtcy1mcmFtZS1zZXBhcmF0b3JcIixcbiAgICB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICB0aXRsZTogU3RyaW5nLFxuICAgICAgICB9LFxuICAgICAgICB0ZW1wbGF0ZTogc2VwYXJhdG9yVGVtcGxhdGVcbiAgICB9XG4pO1xuXG5WdWUuY29tcG9uZW50KFxuICAgIFwibXMtZnJhbWUtcXVlc3Rpb25cIixcbiAgICB7XG4gICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICBpbmRleDogTnVtYmVyLFxuICAgICAgICAgICAgb3B0aW9uczogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IHt9IH0sXG4gICAgICAgICAgICB2YWx1ZTogT2JqZWN0LFxuICAgICAgICAgICAgc2VsZWN0ZWRVbml0OiBTdHJpbmcsXG4gICAgICAgICAgICBvblRyaWdnZXJFdmVudDogRnVuY3Rpb25cbiAgICAgICAgfSxcbiAgICAgICAgZGF0YSgpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgc2hvd1RpdGxlKCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5idXR0b24gJiYgdGhpcy5pbmRleCA+IDAgJiYgdGhpcy5vcHRpb25zLnF1ZXN0aW9uO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRyb3Bkb3duT3B0aW9ucygpe1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuZHJvcGRvd247XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXQoKXtcbiAgICAgICAgICAgICAgICBjb25zdCBpbnB1dHMgPSB0aGlzLm9wdGlvbnMuaW5wdXQ7XG4gICAgICAgICAgICAgICAgaWYgKCFpbnB1dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY29uc3QgaW5wdXQgPSBpbnB1dHNbMF07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyB0aXRsZTogaW5wdXQubGFiZWwsIHBsYWNlaG9sZGVyOiBpbnB1dC5wbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRlZmF1bHRWYWx1ZXMoKXtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmJ1dHRvbikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZGVmYXVsdFZhbHVlIHx8ICF0aGlzLmRlZmF1bHRWYWx1ZS52YWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB0aGlzLmRlZmF1bHRWYWx1ZS52YWx1ZSA9PT0gJ29iamVjdCcgPyB0aGlzLmRlZmF1bHRWYWx1ZS52YWx1ZSA6IFt0aGlzLmRlZmF1bHRWYWx1ZS52YWx1ZV07XG4gICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kZWZhdWx0VmFsdWUgfHwgIXRoaXMuZGVmYXVsdFZhbHVlLmlucHV0VmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZiA9IHt9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RlZFVuaXQgJiYgdGhpcy5vcHRpb25zLm9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWYuc3dpdGNoZXIgPSB7IHZhbHVlOiB0aGlzLnNlbGVjdGVkVW5pdCB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFZhbHVlLmlucHV0VmFsdWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGtleSgpe1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm9wdGlvbnMuYXBpUXVlcnkuam9pbigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICBvbkNoYW5nZSh2KXtcbiAgICAgICAgICAgICAgICBjb25zdCB7IGluZGV4LCBzdGVwSWQ6IGlkLCBhcGlRdWVyeSwgZmlsdGVyTmFtZTpsYWJlbCA9ICcnIH0gPSB0aGlzLm9wdGlvbnM7XG4gICAgICAgICAgICAgICAgbGV0IGlucHV0ID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdi5tYXAobyA9PiBvLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm90aWNlID0gKHYuZmluZChvID0+IEJvb2xlYW4oby5zZWxlY3RlZExhYmVsKSkgfHwge30pLnNlbGVjdGVkTGFiZWwgfHwgJyc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5TmFtZSA9IGFwaVF1ZXJ5ICYmIGFwaVF1ZXJ5WzBdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBxdWVyeSA9IHsgW3F1ZXJ5TmFtZV06IHZhbHVlLmxlbmd0aCA9PT0gMSA/IHZhbHVlWzBdIDogdmFsdWUgfTtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSB2YWx1ZS5sZW5ndGggPT09IDAgPyBudWxsIDogeyBpbmRleCwgaWQsIHZhbHVlLCBxdWVyeSwgbm90aWNlLCBsYWJlbCB9O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaW5wdXQ6IGlucHV0VmFsdWUsIGRyb3Bkb3duLCBzd2l0Y2hlciB9ID0gdjtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzSW5wdXQgPSBCb29sZWFuKHRoaXMub3B0aW9ucy5pbnB1dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaW5wdXQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogaW5wdXRWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0VmFsdWU6IHYsXG4gICAgICAgICAgICAgICAgICAgICAgICBvcHRpb246IHN3aXRjaGVyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxcbiAgICAgICAgICAgICAgICAgICAgfTsgXG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlcnlOYW1lID0gYXBpUXVlcnkgJiYgYXBpUXVlcnlbMF07XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0geyBbcXVlcnlOYW1lXTogaW5wdXQudmFsdWUgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYXBpUXVlcnkgJiYgYXBpUXVlcnkubGVuZ3RoID4gMSAmJiAoc3dpdGNoZXIgfHwgZHJvcGRvd24pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bml0TmFtZSA9IGFwaVF1ZXJ5W2FwaVF1ZXJ5Lmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlbdW5pdE5hbWVdID0gZHJvcGRvd24gPyBkcm9wZG93bi52YWx1ZSA6IHN3aXRjaGVyLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNFbXB0eSA9IGlucHV0LnZhbHVlID09PSAnJyB8fCBpbnB1dC52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IGlucHV0LnZhbHVlID09PSBudWxsO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dCA9ICFpc0VtcHR5ID8geyAuLi5pbnB1dCwgaW5kZXgsIGlkLCBxdWVyeSB9IDogbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLiRlbWl0KCdpbnB1dCcsIGlucHV0KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvblRyaWdnZXJBbnN3ZXJFdmVudChkYXRhKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblRyaWdnZXJFdmVudCh7IC4uLmRhdGEsIHF1ZXN0aW9uSW5kZXg6IHRoaXMuaW5kZXggfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIHRlbXBsYXRlOiBxdWVzdGlvblRlbXBsYXRlXG4gICAgfVxuKTtcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgdGVtcGxhdGUgZnJvbSAnc2hhcmVkL21ldGVyLXNlbGVjdG9yLWlucHV0LWJveC5oYnMnO1xuXG5WdWUuY29tcG9uZW50KFxuICAgIFwibXMtaW5wdXQtYm94XCIsXG4gICAge1xuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgdGl0bGU6IFN0cmluZyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBTdHJpbmcsXG4gICAgICAgICAgICBzd2l0Y2hlcjogT2JqZWN0LFxuICAgICAgICAgICAgaW5wdXQ6IE9iamVjdCxcbiAgICAgICAgICAgIGRyb3Bkb3duOiBPYmplY3QsXG4gICAgICAgICAgICBkcm9wZG93bk9wdGlvbnM6IEFycmF5LFxuICAgICAgICAgICAgb25DaGFuZ2U6IEZ1bmN0aW9uLFxuICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB7IHR5cGU6IE9iamVjdCwgZGVmYXVsdDoge30gfSxcbiAgICAgICAgICAgIG9uVHJpZ2dlckV2ZW50OiBGdW5jdGlvblxuICAgICAgICB9LFxuICAgICAgICBkYXRhKCl7XG4gICAgICAgICAgICBjb25zdCBkYXRhID0ge1xuICAgICAgICAgICAgICAgIHN3aXRjaGVyVmFsdWU6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGRyb3Bkb3duVmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgIGlucHV0VmFsdWU6ICcnLFxuICAgICAgICAgICAgICAgIHN3aXRjaGVyRmllbGQ6IHRoaXMuc3dpdGNoZXIsXG4gICAgICAgICAgICAgICAgaW5wdXRGaWVsZDogdGhpcy5pbnB1dCxcbiAgICAgICAgICAgICAgICBjaGFuZ2luZ01lbW86IHRoaXMuZGVmYXVsdFZhbHVlLFxuICAgICAgICAgICAgICAgIGlucHV0RXJyb3JNZXNzYWdlOiBudWxsLCBcbiAgICAgICAgICAgICAgICB0YWdnaW5nSW5wdXRWYWx1ZTogJycsXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0VmFsdWUuc3dpdGNoZXIpIHtcbiAgICAgICAgICAgICAgICBkYXRhLnN3aXRjaGVyVmFsdWUgPSB0aGlzLnN3aXRjaGVyLnJpZ2h0LnZhbHVlID09PSB0aGlzLmRlZmF1bHRWYWx1ZS5zd2l0Y2hlci52YWx1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuZGVmYXVsdFZhbHVlLmRyb3Bkb3duKSB7XG4gICAgICAgICAgICAgICAgZGF0YS5kcm9wZG93blZhbHVlID0gdGhpcy5kZWZhdWx0VmFsdWUuZHJvcGRvd24udmFsdWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmRlZmF1bHRWYWx1ZS5pbnB1dCkge1xuICAgICAgICAgICAgICAgIGRhdGEuaW5wdXRWYWx1ZSA9IHRoaXMuZGVmYXVsdFZhbHVlLmlucHV0LnRvU3RyaW5nKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRhdGEudGFnZ2luZ0lucHV0VmFsdWUgPSBkYXRhLmlucHV0VmFsdWU7XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgc3dpdGNoZXJWYWx1ZToge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIodiwgYSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc3dpdGNoZXJGaWVsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbiA9IHYgPyB0aGlzLnN3aXRjaGVyLnJpZ2h0IDogdGhpcy5zd2l0Y2hlci5sZWZ0O1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdpbmdNZW1vID0gIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuY2hhbmdpbmdNZW1vLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoZXI6IG9wdGlvbixcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoKGEgIT09IHVuZGVmaW5lZCB8fCB0aGlzLmRyb3Bkb3duVmFsdWUgPT09ICcnKSAmJiBvcHRpb24gJiYgdGhpcy5kcm9wZG93bk9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duT3B0aW9uc1tvcHRpb24udmFsdWVdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHJvcGRvd25PcHRpb24gPSB0aGlzLmRyb3Bkb3duT3B0aW9uc1tvcHRpb24udmFsdWVdWzBdIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd25WYWx1ZSA9IGRyb3Bkb3duT3B0aW9uLnZhbHVlIHx8ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkcm9wZG93blZhbHVlOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlcih2KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5kcm9wZG93bkZpZWxkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5naW5nTWVtbyA9ICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmNoYW5naW5nTWVtbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duOiB0aGlzLmRyb3Bkb3duRmllbGQub3B0aW9ucy5maW5kKG8gPT4gby52YWx1ZSA9PT0gdiksXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGlucHV0VmFsdWU6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlucHV0RmllbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbm9OZWdhdGl2ZSwgZGVjaW1hbHMgPSAyIH0gPSB0aGlzLmlucHV0O1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGFzaGVzID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvaW50cyA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gdi5yZXBsYWNlKC9bXjAtOS5dfFxcLi9nLCBmdW5jdGlvbigkMCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoIW5vTmVnYXRpdmUgJiYgJDAgPT09ICctJyAmJiB2LmluZGV4T2YoJy0nKSA9PT0gMCAmJiAhKGRhc2hlcysrKSkgfHwgKGRlY2ltYWxzID4gMCAmJiAkMCA9PT0gJy4nICYmICEocG9pbnRzKyspKSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkcCA9IHZhbHVlLmluZGV4T2YoJy4nKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRwID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB2YWx1ZS5sZW5ndGggLSBkcCAtIDEgLSBkZWNpbWFscztcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnN1YnN0cmluZygwLCB2YWx1ZS5sZW5ndGggLSBkaWZmKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0RXJyb3JNZXNzYWdlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pbnB1dC52YWxpZGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7ZXJyb3IsIG1pbiA9IG51bGwsIG1heH0gPSB0aGlzLmlucHV0LnZhbGlkYXRpb247XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWluICE9PSBudWxsICYmIG1pbiA+IHZhbHVlKSB8fCAobWF4ICYmIG1heCA8IHZhbHVlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0RXJyb3JNZXNzYWdlID0gZXJyb3I7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmlucHV0VmFsdWUgPSB2YWx1ZTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5naW5nTWVtbyA9ICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLmNoYW5naW5nTWVtbyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0OiB2YWx1ZSA9PT0gJycgPyAnJyA6IHBhcnNlRmxvYXQodmFsdWUpLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW1tZWRpYXRlOiB0cnVlXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY2hhbmdpbmdNZW1vKHYpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmhhc0NoYW5nZSgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRhZ2dpbmdWYWx1ZSgpe1xuICAgICAgICAgICAgICAgIHRoaXMub25UcmlnZ2VyRXZlbnQoeyB2YWx1ZTogdGhpcy50YWdnaW5nVmFsdWUgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGNvbXB1dGVkOiAge1xuICAgICAgICAgICAgdGFnZ2luZ1ZhbHVlKCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFnZ2luZ0lucHV0VmFsdWUgKyAodGhpcy5vcHRpb24gPyAnICcgKyAodGhpcy5vcHRpb24ubGFiZWwgfHwgdGhpcy5vcHRpb24udmFsdWUpIDogJycpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGRyb3Bkb3duRmllbGQoKXtcbiAgICAgICAgICAgICAgICBpZighdGhpcy5kcm9wZG93bk9wdGlvbnMpe1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSAodGhpcy5zd2l0Y2hlclZhbHVlID8gdGhpcy5zd2l0Y2hlci5yaWdodCA6IHRoaXMuc3dpdGNoZXIubGVmdCkgfHwge307XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBvcHRpb25zOiB0aGlzLmRyb3Bkb3duT3B0aW9uc1tvcHRpb24udmFsdWVdIHx8IFtdIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaW5wdXRUaXRsZSgpe1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbjogT2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYDxzcGFuPiR7Y3R4LmlucHV0RmllbGQudGl0bGV9PC9zcGFuPmBcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgb3B0aW9uKCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZHJvcGRvd25GaWVsZCA/IHRoaXMuY2hhbmdpbmdNZW1vLmRyb3Bkb3duIDogdGhpcy5jaGFuZ2luZ01lbW8uc3dpdGNoZXI7XG4gICAgICAgICAgICB9IFxuICAgICAgICB9LFxuICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgdGhpcy5oYXNDaGFuZ2UoKTtcbiAgICAgICAgfSxcbiAgICAgICAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICAgICAgfSxcbiAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgXG4gICAgICAgICAgICBoYXNDaGFuZ2UoKXtcbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlICYmIHRoaXMub25DaGFuZ2UodGhpcy5jaGFuZ2luZ01lbW8pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9uQmx1cklucHV0KCl7XG4gICAgICAgICAgICAgICAgdGhpcy50YWdnaW5nSW5wdXRWYWx1ZSA9IHRoaXMuaW5wdXRWYWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgXG4gICAgICAgIHRlbXBsYXRlXG4gICAgfVxuKTtcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgdGVtcGxhdGUgZnJvbSAnc2hhcmVkL21ldGVyLXNlbGVjdG9yLXN0ZXAtYmFyLmhicyc7XG5cblZ1ZS5jb21wb25lbnQoXG4gICAgXCJtcy1zdGVwLWJhclwiLFxuICAgIHtcbiAgICAgICAgcHJvcHM6IHtcbiAgICAgICAgICAgIHN0ZXBzOiBBcnJheSwgXG4gICAgICAgICAgICBvbkNoYW5nZTogRnVuY3Rpb24sXG4gICAgICAgICAgICBjdXJyZW50OiBOdW1iZXIsXG4gICAgICAgICAgICBzZWxlY3RlZFZhbHVlczogeyB0eXBlOiBBcnJheSwgZGVmYXVsdDogW10gfSxcbiAgICAgICAgICAgIG9mZnNldDogeyB0eXBlOiBOdW1iZXIsIGRlZmF1bHQ6IDUwIH0sXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGEoKXtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgcm9vdENsYXNzZXM6ICB7XG4gICAgICAgICAgICAgICAgICAgICdub0NlbnRlckFsaWduJyA6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uUmVzaXplRmxhZzogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNNb3VzZURvd246IGZhbHNlLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgIGN1cnJlbnQ6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVyKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUmVzaXplKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbW1lZGlhdGU6IHRydWVcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzdGVwczoge1xuICAgICAgICAgICAgICAgIGhhbmRsZXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25SZXNpemVGbGFnID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGltbWVkaWF0ZTogdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBjb21wdXRlZDogIHtcbiAgICAgICAgICAgIGdldFN0ZXBzKCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGN0eCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RlcHMubWFwKChzLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAnbXMtc3RlcC1iYXJfaXRlbScgOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21zLXN0ZXAtYmFyX2l0ZW0tLXNlbGVjdGVkJyA6IGkgPT09IGN0eC5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgJ21zLXN0ZXAtYmFyX2l0ZW0tLWNoZWNrZWQnIDogaSA8PSBjdHgubWF4U3RlcFxuICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4ucywgc2VsZWN0ZWRWYWx1ZTogY3R4LnNlbGVjdGVkVmFsdWVzW2ldLCBjbGFzc2VzIH07XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtYXhTdGVwKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAodGhpcy5zZWxlY3RlZFZhbHVlcyAmJiB0aGlzLnNlbGVjdGVkVmFsdWVzLmxlbmd0aCkgfHwgMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplKTtcblxuICAgICAgICAgICAgdGhpcy4kcmVmcy5saXN0LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLnN0YXJ0RHJhZyk7XG4gICAgICAgICAgICB0aGlzLiRyZWZzLmxpc3QuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5zdGFydERyYWcpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5lbmREcmFnKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5lbmREcmFnKTtcblxuICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3ZlRHJhZyk7XG4gICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm1vdmVEcmFnKTtcbiAgICAgICAgfSxcbiAgICAgICAgYmVmb3JlVW5tb3VudCgpIHtcbiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLm9uUmVzaXplKTtcblxuICAgICAgICAgICAgdGhpcy4kcmVmcy5saXN0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLnN0YXJ0RHJhZyk7XG4gICAgICAgICAgICB0aGlzLiRyZWZzLmxpc3QucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5zdGFydERyYWcpO1xuXG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5lbmREcmFnKTtcbiAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5lbmREcmFnKTtcblxuICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5tb3ZlRHJhZyk7XG4gICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLm1vdmVEcmFnKTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlZCgpe1xuICAgICAgICAgICAgaWYgKHRoaXMub25SZXNpemVGbGFnKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vblJlc2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMub25SZXNpemVGbGFnID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIG9uUmVzaXplKCl7XG4gICAgICAgICAgICAgICAgbGV0IGRpZmYgPSAwO1xuXG4gICAgICAgICAgICAgICAgY29uc3QgdyA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxpc3QgPSB0aGlzLiRyZWZzLmxpc3Q7XG4gICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSAobGlzdCAmJiBsaXN0LmNoaWxkTm9kZXMpIHx8IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBsYXN0ID8gKGxhc3Qub2Zmc2V0V2lkdGggKyBsYXN0Lm9mZnNldExlZnQgKyB0aGlzLm9mZnNldCkgOiAwO1xuXG4gICAgICAgICAgICAgICAgaWYgKHcgPCBlbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGRpZmYgPSAgKGVuZCAtIHcpICogLSAxO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG13ID0gdyAvIDI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gY2hpbGRyZW5bdGhpcy5jdXJyZW50XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRFbmQgPSBzZWxlY3RlZCAmJiBzZWxlY3RlZC5vZmZzZXRXaWR0aCArIHNlbGVjdGVkLm9mZnNldExlZnQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkICYmIG13IDwgc2VsZWN0ZWRFbmQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgPSAoc2VsZWN0ZWRFbmQgLSBtdykgKiAtMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChsZGlmZiA+IGRpZmYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpZmYgPSBsZGlmZiBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChsaXN0KSB7XG4gICAgICAgICAgICAgICAgICBsaXN0LnN0eWxlLnRyYW5zZm9ybSA9IGB0cmFuc2xhdGVYKCR7ZGlmZn1weClgO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMucm9vdENsYXNzZXMgPSAge1xuICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnJvb3RDbGFzc2VzLFxuICAgICAgICAgICAgICAgICAgICAnbm9DZW50ZXJBbGlnbic6IGVuZCA9PT0gMCA/IHRydWUgOiB3IDwgZW5kLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgaGFzU2VsZWN0ZWRWYWx1ZShpKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZFZhbHVlcyAmJiB0aGlzLnNlbGVjdGVkVmFsdWVzW2ldO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHJlc2V0KGRlZmF1bHRDdXJyZW50ID0gMCl7XG4gICAgICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSAmJiB0aGlzLm9uQ2hhbmdlKGRlZmF1bHRDdXJyZW50KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBvbkNsaWNrU3RlcChpKXtcbiAgICAgICAgICAgICAgICBpZiAoaSA+IHRoaXMubWF4U3RlcCl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlICYmIHRoaXMub25DaGFuZ2UoaSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3RhcnREcmFnKCl7XG4gICAgICAgICAgICAgICAgdGhpcy5pc01vdXNlRG93biA9IHRydWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZW5kRHJhZygpe1xuICAgICAgICAgICAgICAgIHRoaXMuaXNNb3VzZURvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3ZlRHJhZyhlKXtcbiAgICAgICAgICAgICAgICBjb25zdCBlbG0gPSB0aGlzLiRyZWZzLmxpc3Q7XG4gICAgICAgICAgICAgICAgaWYgKCFlbG0gfHwgIXRoaXMuaXNNb3VzZURvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGNsaWVudFggPSBlLmNsaWVudFggfHwgKGUudG91Y2hlc1swXSB8fCBlLmNoYW5nZWRUb3VjaGVzWzBdIHx8IHt9KS5wYWdlWDtcblxuICAgICAgICAgICAgICAgIGlmIChlbG0ucHJldmlvdXNDbGllbnRYICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGlmZiA9IGNsaWVudFggLSBlbG0ucHJldmlvdXNDbGllbnRYO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZUZvdW5kID0gZWxtLnN0eWxlLnRyYW5zZm9ybS5tYXRjaCgvdHJhbnNsYXRlWFxcKCguKilweFxcKS9pKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeCA9IHN0eWxlRm91bmRbMV0gPyBwYXJzZUludChzdHlsZUZvdW5kWzFdKSA6IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hpbGRyZW4gPSBlbG0uY2hpbGROb2RlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdCA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB3ID0gd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IGxhc3QgPyAobGFzdC5vZmZzZXRXaWR0aCArIGxhc3Qub2Zmc2V0TGVmdCArIHRoaXMub2Zmc2V0KSA6IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heFggPSAoZW5kIC0gdykgKiAtMTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGQgPSAgMTA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBueCA9IHg7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBueCA9IHgrYWRkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnggPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRpZmYgPCAwICYmIG1heFggPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBueCA9IHgtYWRkO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobnggPCBtYXhYKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnggPSBtYXhYO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtU3R5bGUgPSBgdHJhbnNsYXRlWCgke254fXB4KWA7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHN0eWxlRm91bmRbMF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsbS5zdHlsZS50cmFuc2Zvcm0gPSBlbG0uc3R5bGUudHJhbnNmb3JtLnJlcGxhY2Uoc3R5bGVGb3VuZFswXSwgdHJhbnNmb3JtU3R5bGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxtLnN0eWxlLnRyYW5zZm9ybSArPSBcdHRyYW5zZm9ybVN0eWxlICsgJzsnIDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGVsbS5wcmV2aW91c0NsaWVudFggPSBjbGllbnRYO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCBcbiAgICAgICAgdGVtcGxhdGVcbiAgICB9XG4pO1xuIiwiXG4vKlxuICAgIERlYm91bmNlIGlzIGEgZGVjb3JhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0LFxuICAgIGFzIGxvbmcgYXMgaXQgY29udGludWVzIGJlIGludm9rZWQsIHdpbGwgbm90IGJlIHRyaWdnZXJlZC5cbiAgICBUaGUgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgaXQgc3RvcHMgYmVpbmcgY2FsbGVkIGZvciBOIG1pbGxpc2Vjb25kcyAoc2V0IGluIHRoZSAnd2FpdCcgcGFyYW1ldGVyKS4gXG4qL1xuZXhwb3J0IGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQpIHtcblx0bGV0IHRpbWVvdXQ7XG5cdHJldHVybiBmdW5jdGlvbigpIHtcblx0XHRjb25zdCBjb250ZXh0ID0gdGhpcztcbiAgICAgICAgY29uc3QgYXJncyA9IGFyZ3VtZW50cztcblx0XHRjb25zdCBsYXRlciA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGltZW91dCA9IG51bGw7XG5cdFx0XHRmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuXHRcdH07XG5cdFx0Y2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuXHRcdHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCB3YWl0KTtcblx0fTtcbn07XG5cbi8vIGdldCB2YWx1ZSBvZiB1cmwgcGFyYW0gYnkgbmFtZVxuZXhwb3J0IGNvbnN0IGdldFVybFBhcmFtZXRlciA9IChzUGFyYW0pID0+IHtcbiAgICB2YXIgc1BhZ2VVUkwgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cmluZygxKSxcbiAgICAgICAgc1VSTFZhcmlhYmxlcyA9IHNQYWdlVVJMLnNwbGl0KCcmJyksXG4gICAgICAgIHNQYXJhbWV0ZXJOYW1lLFxuICAgICAgICBpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHNVUkxWYXJpYWJsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgc1BhcmFtZXRlck5hbWUgPSBzVVJMVmFyaWFibGVzW2ldLnNwbGl0KCc9Jyk7XG5cbiAgICAgICAgaWYgKHNQYXJhbWV0ZXJOYW1lWzBdID09PSBzUGFyYW0pIHtcbiAgICAgICAgICAgIHJldHVybiBzUGFyYW1ldGVyTmFtZVsxXSA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IGRlY29kZVVSSUNvbXBvbmVudChzUGFyYW1ldGVyTmFtZVsxXSk7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG4vLyBnZXQgY29va2llIHZhbHVlIGJ5IG5hbWVcbmV4cG9ydCBmdW5jdGlvbiBnZXRDb29raWVWYWx1ZShhKSB7XG5cdHZhciBiID0gZG9jdW1lbnQuY29va2llLm1hdGNoKCcoXnw7KVxcXFxzKicgKyBhICsgJ1xcXFxzKj1cXFxccyooW147XSspJyk7XG5cdHJldHVybiBiID8gYi5wb3AoKSA6ICcnO1xufSIsIi8qIFxuQWxsb3dzIGZvciBpbmxpbmUgdGV4dCBsaW5rcyB0byB0cmlnZ2VyIHNwZWNpZmllZCBWdWUgbW9kYWxzXG5cbiovXG5cbmltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgVk1vZGFsIGZyb20gJ3Z1ZS1qcy1tb2RhbCc7XG5pbXBvcnQge2Zvcm1Nb2RhbCwgZXhpdE1vZGFsfSBmcm9tICcuL21vZGFscyc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuXG5WdWUudXNlKFZNb2RhbCk7XG5cbmNvbnN0IGluc3RhbmNlID0gbmV3IFZ1ZSh7XG4gICAgbWV0aG9kczoge1xuICAgICAgICB0cmlnZ2VyQ29udGFjdFRvb2x0aXAoKSB7XG4gICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndG9nZ2xlLWNvbnRhY3QnKTtcbiAgICAgICAgfSxcblxuICAgICAgICB0cmlnZ2VyRm9ybShkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgIGZvcm1Nb2RhbC50ZW1wbGF0ZShkYXRhLmNvbnRlbnQpLFxuICAgICAgICAgICAgICAgIGZvcm1Nb2RhbC5uYW1lKGRhdGEubmFtZSksIFxuICAgICAgICAgICAgICAgIGZvcm1Nb2RhbC5vcHRpb25zKGRhdGEub3B0aW9ucyksXG4gICAgICAgICAgICAgICAgZm9ybU1vZGFsLmV2ZW50cyhkYXRhLmRhdGEpXG4gICAgICAgICAgICApXG4gICAgICAgIH0sXG5cbiAgICAgICAgdHJpZ2dlckV4aXQoZGF0YSkge1xuICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdyhcbiAgICAgICAgICAgICAgICBleGl0TW9kYWwudGVtcGxhdGUoZGF0YSksXG4gICAgICAgICAgICAgICAgZXhpdE1vZGFsLm5hbWUsIFxuICAgICAgICAgICAgICAgIGV4aXRNb2RhbC5vcHRpb25zLFxuICAgICAgICAgICAgICAgIGV4aXRNb2RhbC5ldmVudHNcbiAgICAgICAgICAgIClcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VNb2RhbChuYW1lKSB7XG4gICAgICAgICAgICAvLyB0aGlzLiRtb2RhbC5oaWRlKG5hbWUpO1xuICAgICAgICAgICAgdGhpcy4kbW9kYWwuaGlkZUFsbCgpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbmNvbnN0IHRyaWdnZXIgPSAoKSA9PiB7ICAgICAgICBcbiAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiB7IFxuICAgICAgICBpZiAoZS50YXJnZXQuZ2V0QXR0cmlidXRlKCdocmVmJykpIHtcbiAgICAgICAgICAgIHZhciBocmVmSGFzaCA9IGUudGFyZ2V0LmdldEF0dHJpYnV0ZSgnaHJlZicpLnNwbGl0KFwiI1wiKVsxXTsgICAgICAgICAgICBcbiAgICAgICAgICAgIGlmICghZS50YXJnZXQuY2xhc3NMaXN0LmNvbnRhaW5zKFwibGVhdmluZ1NpdGVDbGlja0V2ZW50QWRkZWRcIikgJiYgaHJlZkhhc2gpIHtcblxuICAgICAgICAgICAgICAgIGlmIChocmVmSGFzaCA9PT0gXCJjb250YWN0dXN0aXBcIikge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnRyaWdnZXJDb250YWN0VG9vbHRpcCgpO1xuICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5tb2RhbEhhc2h0YWdzKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5tb2RhbEhhc2h0YWdzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChocmVmSGFzaCA9PT0gaXRlbS5oYXNodGFnbmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRVcmwgPSBlLnRhcmdldC5kYXRhc2V0LmRvd25sb2FkVXJsIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRvd25sb2FkTmFtZSA9IGUudGFyZ2V0LmRhdGFzZXQuZG93bmxvYWROYW1lIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkUHJvZHVjdHMgPSBlLnRhcmdldC5kYXRhc2V0LnF1b3RlUHJvZHVjdHMgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbGl0ZXJhdHVyZU9yZGVyZWQgPSBlLnRhcmdldC5kYXRhc2V0LmxpdGVyYXR1cmVPcmRlcmVkIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBlLnRhcmdldC5kYXRhc2V0LmNvbnRlbnQgfHwgbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29tbWVudHMgPSBlLnRhcmdldC5kYXRhc2V0LmNvbW1lbnRzIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGV4aXN0aW5nUXVlcnlQYXJhbXMgPSBsb2NhdGlvbi5zZWFyY2g7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUXVlcnlQYXJhbXMgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG93bmxvYWRVcmwgJiYgZG93bmxvYWRVcmwgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdRdWVyeVBhcmFtcyA9IFwiJlwiICsgZXhpc3RpbmdRdWVyeVBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUXVlcnlQYXJhbXMgPSBleGlzdGluZ1F1ZXJ5UGFyYW1zLnJlcGxhY2UoXCImJlwiLFwiJlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1F1ZXJ5UGFyYW1zLnN0YXJ0c1dpdGgoXCI/XCIpKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGlzdGluZ1F1ZXJ5UGFyYW1zID0gZXhpc3RpbmdRdWVyeVBhcmFtcy5zbGljZSgxKTsgLy8gcmVtb3ZlIHRoZSBxdWVzdGlvbiBtYXJrXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS51cmwuaW5kZXhPZihcIj9cIikgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nUXVlcnlQYXJhbXMgPSBcIiZcIiArIGV4aXN0aW5nUXVlcnlQYXJhbXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdRdWVyeVBhcmFtcyA9IGV4aXN0aW5nUXVlcnlQYXJhbXMucmVwbGFjZShcIiYmXCIsXCImXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuZ2V0Rmlyc3RUb3VjaENvb2tpZXMpIHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSAgZnVuY3Rpb24gYHdpbmRvdy5nZXRGaXJzdFRvdWNoQ29va2llc2Agd2lsbCBvbmx5IGJlIGF2YWlsYWJsZSBpZiB0aGUgdXNlciBhY2NlcHRlZCBjb29raWVzLiBUaGlzIHNjcmlwdCBpcyBpbiB0aGUgQkFDS0VORCBDT0RFIE9OTFkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBpcyBpbiB0aGUgYmFja2VuZCBwcm9qZWN0IG9ubHkgYmVjYXVzZSBpdCdzIGNvb2tpZSBjb2RlIGFuZCBoYXMgdG8gYmUgZGlzYWJsZWQgYnkgYW4gb3B0YW5vbi1jYXRlZ29yeSBmcm9tIE9uZVRydXN0IGlmIHRoZSB1c2VyIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2VzIG5vdCBhY2NlcHQgY29va2llcy5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IEZUQ29va2llcyA9IHdpbmRvdy5nZXRGaXJzdFRvdWNoQ29va2llcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgTFRDb29raWVzID0gd2luZG93LmdldExhc3RUb3VjaENvb2tpZXMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gcmVuYW1lUHJvcGVydHkob2JqZWN0LCBvbGROYW1lLCBuZXdOYW1lKSB7IC8vIC5sZW5ndGggb2YgZnVuY3Rpb24gaXMgMlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZE5hbWUgPT09IG5ld05hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iamVjdC5oYXNPd25Qcm9wZXJ0eShvbGROYW1lKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdFtuZXdOYW1lXSA9IG9iamVjdFtvbGROYW1lXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgb2JqZWN0W29sZE5hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVQcm9wZXJ0eShGVENvb2tpZXMsICd1dG1fY2FtcGFpZ25fRlQnLCAnVVRNX0NhbXBhaWduX0ZUJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KEZUQ29va2llcywgJ3V0bV9jb250ZW50X0ZUJywgJ1VUTV9Db250ZW50X0ZUJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KEZUQ29va2llcywgJ3V0bV9tZWRpdW1fRlQnLCAnVVRNX01lZGl1bV9GVCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVQcm9wZXJ0eShGVENvb2tpZXMsICd1dG1fc291cmNlX0ZUJywgJ1VUTV9Tb3VyY2VfRlQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkoRlRDb29raWVzLCAndXRtX2NhbXBhaWduX0lEX0ZUJywgJ1VUTV9DYW1wYWlnbl9JRF9GVCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkoTFRDb29raWVzLCAndXRtX2NhbXBhaWduX0xUJywgJ1VUTV9DYW1wYWlnbl9MVCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVQcm9wZXJ0eShMVENvb2tpZXMsICd1dG1fY29udGVudF9MVCcsICdVVE1fQ29udGVudF9MVCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWVQcm9wZXJ0eShMVENvb2tpZXMsICd1dG1fbWVkaXVtX0xUJywgJ1VUTV9NZWRpdW1fTFQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVuYW1lUHJvcGVydHkoTFRDb29raWVzLCAndXRtX3NvdXJjZV9MVCcsICdVVE1fU291cmNlX0xUJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmFtZVByb3BlcnR5KExUQ29va2llcywgJ3V0bV9jYW1wYWlnbl9JRF9MVCcsICdVVE1fQ2FtcGFpZ25fSURfTFQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29va2llUXVlcnlTdHJpbmcgPSBcIlwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZnRLZXlzID0gT2JqZWN0LmtleXMoRlRDb29raWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGx0S2V5cyA9IE9iamVjdC5rZXlzKExUQ29va2llcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llUXVlcnlTdHJpbmcgPSBmdEtleXMuZmlsdGVyKHggPT4geCAhPSBcIkhhc1ZhbHVlc1wiKS5tYXAoa2V5ID0+IGAke2tleX09JHtGVENvb2tpZXNba2V5XX1gKS5qb2luKFwiJlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29va2llUXVlcnlTdHJpbmcgKz0gXCImXCIgKyBsdEtleXMuZmlsdGVyKHggPT4geCAhPSBcIkhhc1ZhbHVlc1wiKS5tYXAoa2V5ID0+IGAke2tleX09JHtMVENvb2tpZXNba2V5XX1gKS5qb2luKFwiJlwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nUXVlcnlQYXJhbXMgIT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdRdWVyeVBhcmFtcyArPSBcIiZcIiArIGNvb2tpZVF1ZXJ5U3RyaW5nO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdRdWVyeVBhcmFtcyA9IFwiP1wiICsgY29va2llUXVlcnlTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJjb29raWVRdWVyeVN0cmluZ1wiLCBjb29raWVRdWVyeVN0cmluZyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbW1lbnRzIHx8IHNlbGVjdGVkUHJvZHVjdHMgfHwgbGl0ZXJhdHVyZU9yZGVyZWQgfHwgZG93bmxvYWRVcmwgfHwgZG93bmxvYWROYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnRyaWdnZXJGb3JtKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IGRvd25sb2FkVXJsICYmIGRvd25sb2FkVXJsICE9PSBcIlwiID8gKGAke2l0ZW0udXJsfT9yZWRpcmVjdF91cmw9JHtkb3dubG9hZFVybH1gICsgZXhpc3RpbmdRdWVyeVBhcmFtcykgOiAoaXRlbS51cmwgKyBleGlzdGluZ1F1ZXJ5UGFyYW1zKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3B5OiBgJHtjb250ZW50ID8gY29udGVudCA6IGBgfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBpdGVtLmhhc2h0YWduYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1wiY2xhc3Nlc1wiOiBgYm1pLW1vZGFsIGJtaS1tb2RhbC0tZm9ybSBibWktbW9kYWwtLSR7aXRlbS5oYXNodGFnbmFtZX1gfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3NlbGVjdGlvbnM6IHNlbGVjdGVkUHJvZHVjdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kYWxOYW1lOiBpdGVtLmhhc2h0YWduYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvd25sb2FkTmFtZTogZG93bmxvYWROYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdGVyYXR1cmVPcmRlcmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOiBjb21tZW50cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS50cmlnZ2VyRm9ybSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiBpdGVtLnVybCArIGV4aXN0aW5nUXVlcnlQYXJhbXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weTogYCR7Y29udGVudCA/IGNvbnRlbnQgOiBgYH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogaXRlbS5oYXNodGFnbmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHtcImNsYXNzZXNcIjogYGJtaS1tb2RhbCBibWktbW9kYWwtLWZvcm0gYm1pLW1vZGFsLS0ke2l0ZW0uaGFzaHRhZ25hbWV9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zb2xlLmxvZygnZS50YXJnZXQnLCBlLnRhcmdldCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgbGV0IGxlYXZpbmdTaXRlQ2xpY2sgPSAgKGUpID0+ICB7IFxuICAgICAgICBpZiAod2luZG93LmxlYXZpbmdTaXRlKSB7XG4gICAgICAgICAgICB2YXIgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICBcImNvcHlcIjogd2luZG93LmxlYXZpbmdTaXRlLm1vZGFsQ29udGVudCxcbiAgICAgICAgICAgICAgICBcIm9rXCI6IHdpbmRvdy5sZWF2aW5nU2l0ZS5va0xhYmVsLFxuICAgICAgICAgICAgICAgIFwiY2xvc2VcIjogd2luZG93LmxlYXZpbmdTaXRlLmNsb3NlTGFiZWwsXG4gICAgICAgICAgICB9IFxuICAgICAgICAgICAgdmFyIGxpbmsgPSBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDtcbiAgICAgICAgICAgIHZhciBtb2RhbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ibWktbW9kYWwtLWV4aXQnKTtcbiAgICAgICAgICAgIFxuICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgd2luZG93LmxlYXZpbmdTaXRlLnNpdGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNpdGUgPSB3aW5kb3cubGVhdmluZ1NpdGUuc2l0ZXNbaV07XG4gICAgICAgICAgICAgICAgaWYgKG1vZGFsICYmIG1vZGFsLmNvbnRhaW5zKHRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsaW5rLmluY2x1ZGVzKGAke3NpdGV9YCkpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxpbmtcIjogbGlua1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnRyaWdnZXJFeGl0KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbigpIHtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ2FbaHJlZl0nKS5mb3JFYWNoKGwgPT4geyAgICBcbiAgICAgICAgICAgICAgICBpZiAobC5ocmVmLnRvTG93ZXJDYXNlKCkuaW5kZXhPZihcImh0dHBcIikgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jaGVjayBpZiAnZXZlbnRBZGRlZCcgY2xhc3MgdG8gdGhlIGVsZW1lbnRcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsLmNsYXNzTGlzdC5jb250YWlucyhcImxlYXZpbmdTaXRlQ2xpY2tFdmVudEFkZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsLmNsYXNzTGlzdC5hZGQoXCJsZWF2aW5nU2l0ZUNsaWNrRXZlbnRBZGRlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGwuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBsZWF2aW5nU2l0ZUNsaWNrKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LCA1MDApO1xuICAgIH0pO1xuXG4gICAgLy8gaW4gb3JkZXIgZm9yIHRoZSByZXR1cm4gZmFsc2UvZS5wcmV2ZW50RGVmYXVsdCgpIHRvIGFjdHVhbGx5IHdvcmssIHlvdSBtdXN0IGF0dGFjaCB0aGlzIHRvIHRoZSBhbmNob3IgdGFnIGl0c2VsZiwgbm90IGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXJcbiAgICAvLyBsaWtlIGl0IHdhcyBwcmV2aW91c2x5LiBUaGUgcHJvYmxlbSBpcyB0aGF0IHRoaXMgb25seSB3b3JrcyBmb3IgYW55dGhpbmcgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbiB0aGUgRE9NLlxuICAgIC8vIFRoZSBhYm92ZSBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCkgd2lsbCBhZGQgaXQgZm9yIGFueXRoaW5nIHRoYXQncyBpbmplY3RlZCBpbnRvIHRoZSBET00sIHF1ZXJ5aW5nIHRoZSBkb20gNTAwbXMgYWZ0ZXIgdGhlIGNsaWNrLlxuICAgIC8vIHRoaXMgaXMgbm90IGlkZWFsLCBidXQgdGhlcmUncyBub3QgcmVhbGx5IGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy5cbiAgICBcbiAgICBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdhW2hyZWZdJykuZm9yRWFjaChsID0+IHtcbiAgICAgICAgLy9hZGQgYSAnZXZlbnRBZGRlZCcgY2xhc3MgdG8gdGhlIGVsZW1lbnRcbiAgICAgICAgaWYgKGwuaHJlZi50b0xvd2VyQ2FzZSgpLmluZGV4T2YoXCJodHRwXCIpID09IC0xKSB7XG4gICAgICAgICAgICAvL2NoZWNrIGlmICdldmVudEFkZGVkJyBjbGFzcyB0byB0aGUgZWxlbWVudFxuICAgICAgICAgICAgaWYgKCFsLmNsYXNzTGlzdC5jb250YWlucyhcImxlYXZpbmdTaXRlQ2xpY2tFdmVudEFkZGVkXCIpKSB7XG4gICAgICAgICAgICAgICAgbC5jbGFzc0xpc3QuYWRkKFwibGVhdmluZ1NpdGVDbGlja0V2ZW50QWRkZWRcIik7XG4gICAgICAgICAgICAgICAgbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIGxlYXZpbmdTaXRlQ2xpY2spO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG59XG5cbi8vIGV4cG9ydCBkZWZhdWx0IHRyaWdnZXI7XG5leHBvcnQgeyBpbnN0YW5jZSwgdHJpZ2dlcn07XG4iLCJpbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuXG5sZXQgZGVmYXVsdE9wdGlvbnMgPSB7XG4gIGhlaWdodDogXCJhdXRvXCIsXG4gIHNjcm9sbGFibGU6IGZhbHNlLFxuICBhZGFwdGl2ZTogdHJ1ZSxcbiAgZm9jdXNUcmFwOiB0cnVlLFxuICBjbGFzc2VzOiBcImJtaS1tb2RhbFwiLFxuICB3aWR0aDogXCI5MDBweFwiLFxufTtcblxubGV0IGRlZmF1bHRUZW1wbGF0ZSA9IChjb250ZW50LCB0YWdOYW1lKSA9PiB7XG4gICAgcmV0dXJuICB7dGVtcGxhdGU6IGBcbiAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX193cmFwcGVyXCIgZGF0YS10YWctdHJpZ2dlcj1cInZpc2libGVcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwib3ZlcmxheVwiLCBcInRpdGxlXCI6IFwiJHt0YWdOYW1lID8gdGFnTmFtZSA6IGBDb250ZXh0dWFsIE92ZXJsYXlgfVwiLCBcIm5hbWVcIjogXCJDb250ZXh0dWFsIE92ZXJsYXlcIiwgXCJub1wiOiBcIjAxXCJ9Jz5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJtaS1tb2RhbF9fY2xvc2VcIiBAY2xpY2s9XCIkZW1pdCgnY2xvc2UnKVwiPjwvYnV0dG9uPlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJibWktbW9kYWxfX3Jvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fYXJlYSBibWktbW9kYWxfX2FyZWEtYm9keVwiPlxuICAgICAgICAgICAgICAgICR7Y29udGVudH1cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBgfVxufTtcblxubGV0IHZpZGVvVGVtcGxhdGUgPSAoaWQsIHRpdGxlKSA9PiB7XG4gICAgcmV0dXJuIHt0ZW1wbGF0ZTogYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX193cmFwcGVyXCIgZGF0YS10YWctdHJpZ2dlcj1cInZpc2libGVcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwib3ZlcmxheVwiLCBcInRpdGxlXCI6IFwiVmlkZW8gT3ZlcmxheVwiLCBcIm5hbWVcIjogXCJDb250ZXh0dWFsIE92ZXJsYXlcIiwgXCJub1wiOiBcIjAxXCJ9Jz5cbiAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJtaS1tb2RhbF9fY2xvc2VcIiBAY2xpY2s9XCIkZW1pdCgnY2xvc2UnKVwiPjwvYnV0dG9uPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fY29udGVudFwiPlxuICAgICAgICAgICAgICAgICR7dGl0bGUgPyBgPHAgY2xhc3M9XCJibWktbW9kYWxfX3ZpZGVvLXRpdGxlXCI+JHt0aXRsZX08L3A+YCA6IGBgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJibWktbW9kYWxfX3ZpZGVvLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICA8aWZyYW1lIHdpZHRoPVwiNTYwXCIgaGVpZ2h0PVwiMzE1XCIgc3JjPVwiaHR0cHM6Ly93d3cueW91dHViZS5jb20vZW1iZWQvJHtpZH1cIiBmcmFtZWJvcmRlcj1cIjBcIlxuICAgICAgICAgICAgICAgICAgICBhbGxvdz1cImFjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBlbmNyeXB0ZWQtbWVkaWE7IGd5cm9zY29wZTsgcGljdHVyZS1pbi1waWN0dXJlXCJcbiAgICAgICAgICAgICAgICAgICAgYWxsb3dmdWxsc2NyZWVuPjwvaWZyYW1lPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIGB9XG59O1xuXG5jb25zdCBtb2RhbENvbnN0cnVjdG9yID0gKFRlbXBsYXRlLCBOYW1lLCBPcHRpb25zLCBFdmVudHMpID0+IChcbiAgICB7XG4gICAgICAgIHRlbXBsYXRlOiBUZW1wbGF0ZSxcbiAgICAgICAgbmFtZToge25hbWU6IE5hbWV9LFxuICAgICAgICBvcHRpb25zOiB7XG4gICAgICAgICAgICBuYW1lOiBOYW1lLFxuICAgICAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgICAgICAuLi5PcHRpb25zXG4gICAgICAgIH0sXG4gICAgICAgIGV2ZW50czogRXZlbnRzXG4gICAgfVxuKVxuXG5jb25zdCB2aWRlb01vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAoaWQsIHRpdGxlKSA9PiAgdmlkZW9UZW1wbGF0ZShpZCwgdGl0bGUpLFxuICAgIFwidmlkZW9cIixcbiAgICB7Y2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLXZpZGVvJ30sXG4pXG5cbmNvbnN0IHJlbGVhc2VOb3Rlc01vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAoY29udGVudCkgPT4gZGVmYXVsdFRlbXBsYXRlKGAke2NvbnRlbnR9YCwgJ1JlbGVhc2UgTm90ZXMgT3ZlcmxheScpLFxuICAgIFwicmVsZWFzZU5vdGVzXCIsXG4gICAge2NsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1yZWxlYXNlLW5vdGVzJ31cbilcblxuY29uc3QgYXBwbGljYXRpb25zTW9kYWwgPSBtb2RhbENvbnN0cnVjdG9yKFxuICAgIGRlZmF1bHRUZW1wbGF0ZSgnJywgJ01hcmtldCBBcHBsaWNhdGlvbnMgT3ZlcmxheScpLFxuICAgIFwiYXBwbGljYXRpb25zXCIsXG4gICAge2NsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1hcHBsaWNhdGlvbnMnfSxcbiAgICAoYXBwcykgPT4gKHtcbiAgICAgICAgJ29wZW5lZCc6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImJlZm9yZSBvcGVuXCIpO1xuICAgICAgICAgICAgICAgIGxldCBjb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYm1pLW1vZGFsLS1hcHBsaWNhdGlvbnMgLmJtaS1tb2RhbF9fYXJlYS1ib2R5Jyk7XG4gICAgICAgICAgICAgICAgY29udGFpbmVyLmFwcGVuZENoaWxkKGFwcHMpO1xuICAgICAgICAgICAgfVxuICAgIH0pLFxuKVxuXG5jb25zdCBxdWlja0xpbmtzTW9kYWwgPSBtb2RhbENvbnN0cnVjdG9yKFxuICAgIGRlZmF1bHRUZW1wbGF0ZSgnJywgJ1F1aWNrIExpbmtzIE92ZXJsYXknKSxcbiAgICBcInF1aWNrTGlua3NcIixcbiAgICB7Y2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLXF1aWNrLWxpbmtzJ30sXG4gICAgKGxpbmtzKSA9PiAoe1xuICAgICAgICAnb3BlbmVkJzogKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiYmVmb3JlIG9wZW5cIik7XG4gICAgICAgICAgICAgICAgbGV0IGNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5ibWktbW9kYWwtLXF1aWNrLWxpbmtzIC5ibWktbW9kYWxfX2FyZWEtYm9keScpO1xuICAgICAgICAgICAgICAgIGNvbnRhaW5lci5hcHBlbmRDaGlsZChsaW5rcyk7XG4gICAgICAgICAgICB9XG4gICAgfSksXG4pXG5cbmNvbnN0IHBhdGVudHNNb2RhbCA9IG1vZGFsQ29uc3RydWN0b3IoXG4gICAgZGVmYXVsdFRlbXBsYXRlKCcnLCAnUGF0ZW50cyBPdmVybGF5JyksXG4gICAgXCJwYXRlbnRzXCIsXG4gICAge2NsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1wYXRlbnRzJ30sXG4gICAgKGNvbnRlbnQpID0+ICh7XG4gICAgICAgICdvcGVuZWQnOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJiZWZvcmUgb3BlblwiKTtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhjb250ZW50KTtcbiAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmJtaS1tb2RhbC0tcGF0ZW50cyAuYm1pLW1vZGFsX19hcmVhLWJvZHknKTtcbiAgICAgICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gICAgICAgICAgICB9XG4gICAgfSksXG4pXG5cbmNvbnN0IHRvb2x0aXBNb2RhbCA9IG1vZGFsQ29uc3RydWN0b3IoXG4gICAgKGNvbnRlbnQpID0+IGRlZmF1bHRUZW1wbGF0ZShgJHtjb250ZW50fWAsICdUb29sdGlwIE92ZXJsYXknKSxcbiAgICBcInRvb2x0aXBcIixcbiAgICB7Y2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLXRvb2x0aXAnfVxuKTtcblxuY29uc3QgZm9ybU1vZGFsID0ge1xuICAgIHRlbXBsYXRlOiAoY29udGVudCkgPT4gZGVmYXVsdFRlbXBsYXRlKFxuICAgICAgICAgICAgYCR7Y29udGVudC5jb3B5ID8gYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fY29weVwiPlxuICAgICAgICAgICAgICAgICR7Y29udGVudC5jb3B5fVxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgIDogYGB9XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX19mb3JtXCI+XG4gICAgICAgICAgICA8aWZyYW1lIHNyYz1cIiR7Y29udGVudC51cmx9XCIgd2lkdGg9XCIxMDAlXCIgaGVpZ2h0PVwiNTAwXCIgdHlwZT1cInRleHQvaHRtbFwiIGZyYW1lYm9yZGVyPVwiMFwiIGFsbG93VHJhbnNwYXJlbmN5PVwidHJ1ZVwiIHN0eWxlPVwiYm9yZGVyOiAwXCI+PC9pZnJhbWU+XG4gICAgICAgICAgICA8L2Rpdj5gLCAnRm9ybSBPdmVybGF5J1xuICAgICAgICApLFxuICAgIG5hbWU6ICh2YWx1ZSkgPT4gKHtcIm5hbWVcIjogdmFsdWV9KSxcbiAgICBvcHRpb25zOiAoZGF0YSkgPT4gKHtcbiAgICAgICAgLi4uZGVmYXVsdE9wdGlvbnMsXG4gICAgICAgIGNsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1mb3JtJyxcbiAgICAgICAgLi4uZGF0YVxuICAgIH0pLFxuICAgIGV2ZW50czogKGRhdGEpID0+ICh7XG4gICAgICAgICdvcGVuZWQnOiAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgaWQgPSBzdG9yZS5zdGF0ZS5HQUlEO1xuXG4gICAgICAgICAgICB2YXIgaWZyYW1lID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcIi5ibWktbW9kYWxfX2Zvcm0gaWZyYW1lXCIpO1xuICAgICAgICAgICAgbGV0IHNyYyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCIuYm1pLW1vZGFsX19mb3JtIGlmcmFtZVwiKS5nZXRBdHRyaWJ1dGUoJ3NyYycpO1xuICAgICAgICAgICAgbGV0IHBhcmFtRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAuLi5kYXRhLFxuICAgICAgICAgICAgICAgIEdBSUQ6IGlkXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZXZlbnQpO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW4gPT0gXCJodHRwczovL2luZm8uYmFkZ2VybWV0ZXIuY29tXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgc2l6ZUlmcmFtZShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIHBvc3REYXRhKGV2ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZURhdGEoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBwb3N0RGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChpZnJhbWUuY29udGVudFdpbmRvdykge1xuICAgICAgICAgICAgICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZShKU09OLnN0cmluZ2lmeShwYXJhbURhdGEpLCAnKicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHBhcmFtRGF0YSksICcqJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgY29uc3Qgc2l6ZUlmcmFtZSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gdHlwZW9mIGV2ZW50LmRhdGEgPT09ICdvYmplY3QnID8gZXZlbnQuZGF0YSA6IEpTT04ucGFyc2UoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5mb3JtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHNyYy5pbmNsdWRlcyhkYXRhLmZvcm0pICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtkYXRhLmNvbnRlbnQgKyAyMH1weGA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IGNvbnNvbGUubG9nKFwiVW5leHBlY3RlZCBtZXNzYWdlXCIsIGUpOyB9XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBjb25zdCByZWNlaXZlRGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBldmVudERhdGEgPSB0eXBlb2YgZXZlbnQuZGF0YSA9PT0gJ29iamVjdCcgPyBldmVudC5kYXRhIDogSlNPTi5wYXJzZShldmVudC5kYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLCAvL3Bhc3MgZGF0YSBmcm9tIHBvc3RtZXNzYWdlIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5kYXRhIC8vYWxzbyBwYXNzIGRhdGEgZnJvbSBtb2RhbCB0cmlnZ2VyIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50RGF0YS5ldmVudERhdGEuc3VibWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWl0IHN1Ym1pdHRlZCBldmVudCB3aGVuZXZlciBhIGZvcm0gaXMgc3VibWl0dGVkXG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgnZm9ybS1zdWJtaXR0ZWQnLCBldmVudERhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBjb25zb2xlLmxvZyhcIlVuZXhwZWN0ZWQgbWVzc2FnZVwiLCBlKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICAnY2xvc2VkJyA6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVtaXQgZm9ybSBjbG9zZWQgZXZlbnQgd2hlbmV2ZXIgZm9ybSBpcyBjbG9zZWRcbiAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdmb3JtLWNsb3NlZCcsIGRhdGEpO1xuICAgICAgICB9XG4gICAgfSlcbn1cblxuY29uc3QgaW5mb01vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAgKHRpdGxlLCBjb250ZW50KSA9PiBkZWZhdWx0VGVtcGxhdGUoYFxuICAgICAgICA8aDIgY2xhc3M9XCJibWktbW9kYWxfX3RpdGxlXCI+XG4gICAgICAgICAgICAke3RpdGxlfVxuICAgICAgICA8L2gyPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX19jb3B5XCI+XG4gICAgICAgICAgICAke2NvbnRlbnR9XG4gICAgICAgIDwvZGl2PlxuICAgIGAsICdJbmZvIE92ZXJsYXknKSxcbiAgICBcImNvbnRhY3RcIixcbiAgICB7IHdpZHRoOidub25lJywgaGVpZ2h0OiAnbm9uZScsIHNoaWZ0WTogMCwgY2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLWluZm8nfSxcbiAgICB7XG4gICAgICAgIG9wZW5lZDogKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgYm9keSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoXCJib2R5XCIpO1xuICAgICAgICAgICAgYm9keS5jbGFzc0xpc3QuYWRkKCdibWktbW9kYWxfX2JvZHknKTtcbiAgICAgICAgfSxcbiAgICAgICAgY2xvc2VkOiAoKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBib2R5ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcImJvZHlcIik7XG4gICAgICAgICAgICBib2R5LmNsYXNzTGlzdC5yZW1vdmUoJ2JtaS1tb2RhbF9fYm9keScpO1xuICAgICAgICB9XG4gICAgfVxuKTtcblxuY29uc3QgZ2VuZXJpY01vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAoY29udGVudCkgPT4gIGRlZmF1bHRUZW1wbGF0ZShjb250ZW50LCBcIkNvbnRlbnQgT3ZlcmxheVwiKSxcbiAgICBcImdlbmVyaWNcIixcbiAgICB7Y2xhc3NlczogJ2JtaS1tb2RhbCBibWktbW9kYWwtLWdlbmVyaWMnfSxcbilcblxuY29uc3QgZXhpdE1vZGFsID0gbW9kYWxDb25zdHJ1Y3RvcihcbiAgICAoY29udGVudCkgPT4gIHtyZXR1cm4ge3RlbXBsYXRlOiBgXG4gICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fd3JhcHBlclwiIGRhdGEtdGFnLXRyaWdnZXI9XCJ2aXNpYmxlXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcIm92ZXJsYXlcIiwgXCJ0aXRsZVwiOiBcIkV4dGVybmFsIExpbmsgT3ZlcmxheVwiLCBcIm5hbWVcIjogXCJDb250ZXh0dWFsIE92ZXJsYXlcIiwgXCJub1wiOiBcIjAxXCJ9Jz5cbiAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm1pLW1vZGFsX19hcmVhIGJtaS1tb2RhbF9fYXJlYS1ib2R5XCI+XG4gICAgICAgICAgICAgICAgJHtjb250ZW50LmNvcHl9XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJibWktbW9kYWxfX3Jvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJtaS1tb2RhbF9fYXJlYSBibWktbW9kYWxfX2FyZWEtYnV0dG9uc1wiPlxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIke2NvbnRlbnQubGlua31cIiBjbGFzcz1cImJ1dHRvbiBwcmltYXJ5LWJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9uLXRleHRcIj48L3NwYW4+JHtjb250ZW50Lm9rfTxzcGFuIGNsYXNzPVwiYnV0dG9uLWljb25cIj48L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIjXCIgdi1vbjpjbGljay5wcmV2ZW50PVwiJGVtaXQoJ2Nsb3NlJylcIiBjbGFzcz1cImJ1dHRvbiBzZWNvbmRhcnktYnV0dG9uIHNlY29uZGFyeS1idXR0b24tLTFcIj48c3BhbiBjbGFzcz1cImJ1dHRvbi10ZXh0XCI+PC9zcGFuPiR7Y29udGVudC5jbG9zZX08c3BhbiBjbGFzcz1cImJ1dHRvbi1pY29uXCI+PC9zcGFuPjwvYT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICBgfX0sXG4gICAgXCJleGl0XCIsXG4gICAge2NsYXNzZXM6ICdibWktbW9kYWwgYm1pLW1vZGFsLS1leGl0J30sXG4pXG5cblxuZXhwb3J0IHsgdmlkZW9Nb2RhbCwgcmVsZWFzZU5vdGVzTW9kYWwsIGFwcGxpY2F0aW9uc01vZGFsLCBxdWlja0xpbmtzTW9kYWwsIGluZm9Nb2RhbCwgcGF0ZW50c01vZGFsLCB0b29sdGlwTW9kYWwsIGZvcm1Nb2RhbCwgZ2VuZXJpY01vZGFsLCBleGl0TW9kYWwgfTtcbiIsImltcG9ydCBDb21wb25lbnRNb2R1bGUgZnJvbSAnbGliL2NvbXBvbmVudC1tb2R1bGUnO1xuaW1wb3J0IHsgbG9yeSB9IGZyb20gJ2xvcnkuanMnO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICcuLi9taXNjJztcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLmFmZmlsaWF0ZXMnLCB7XG4gICAgcHJlZml4OiAnYWZmaWxpYXRlcy0nLFxuICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3RlbXBsYXRlJyxcbiAgICAgICAgICAgIGRhdGEoKXtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBsb3J5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBkaXY6IFtdLFxuICAgICAgICAgICAgICAgICAgICBpc01vYmlsZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdG90YWxTbGlkZXM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTbGlkZTogMCxcbiAgICAgICAgICAgICAgICAgICAgZGVzYzogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNMYXN0OiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc01vYmlsZSgpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2V0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbml0TG9yeSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3J5ID0gbG9yeSh0aGlzLiRlbCwgeyBcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZUZyYW1lOiAnYWZmaWxpYXRlc19fY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVTbGlkZUNvbnRhaW5lcjogICdhZmZpbGlhdGVzX19saXN0JywgXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWVQcmV2Q3RybDogJ2FmZmlsaWF0ZXNfX3ByZXYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lTmV4dEN0cmw6ICdhZmZpbGlhdGVzX19uZXh0JywgXG4gICAgICAgICAgICAgICAgICAgICAgICBzbGlkZXNUb1Njcm9sbDogMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZU1vdXNlRXZlbnRzOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRlbC5hZGRFdmVudExpc3RlbmVyKCdhZnRlci5sb3J5LnNsaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gdGhpcy5sb3J5LnJldHVybkluZGV4KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFudWFsbHkgY2hlY2sgZm9yIGxhc3Qgc2xpZGUgYmVjYXVzZSBsb3J5IGpzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleCBkb2Vzbid0IHdvcmsgd2l0aCB2YXJpYWJsZSB3aWR0aCBzbGlkZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5hZmZpbGlhdGVzX19saXN0JykuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrTGFzdFNsaWRlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0xhc3RTbGlkZSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVzaXplOiBkZWJvdW5jZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja0xhc3RTbGlkZSgpO1xuICAgICAgICAgICAgICAgIH0sIDUwMCksXG4gICAgICAgICAgICAgICAgY2hlY2tMYXN0U2xpZGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjb250YWluZXJPZmZzZXQgPSBwYXJzZUludCh3aW5kb3cuaW5uZXJXaWR0aCAtIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3IoJy5hZmZpbGlhdGVzX19saXN0LWNvbnRhaW5lcicpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0KTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdFNsaWRlT2Zmc2V0ID0gcGFyc2VJbnQod2luZG93LmlubmVyV2lkdGggLSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcuYWZmaWxpYXRlc19fbGlzdCBsaTpsYXN0LWNoaWxkJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpO1xuICAgICAgICAgICAgICAgICAgICAvLyBcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0xhc3QgPSBjb250YWluZXJPZmZzZXQgPT0gbGFzdFNsaWRlT2Zmc2V0IHx8IChsYXN0U2xpZGVPZmZzZXQgPj0gY29udGFpbmVyT2Zmc2V0IC0gMSAmJiBsYXN0U2xpZGVPZmZzZXQgPD0gY29udGFpbmVyT2Zmc2V0ICsgMSkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXRJc01vYmlsZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1xbCA9IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA2NTBweCknKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc01vYmlsZSA9IG1xbC5tYXRjaGVzID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIG1xbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSBtcWwubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXNldCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuZGVzYy5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLiRyZWZzLmRlc2MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMubGlzdC5wcmVwZW5kKHRoaXMuZGVzYyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3J5LnNldHVwKCk7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZGVzYyA9IHRoaXMuJHJlZnMuZGVzYztcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRMb3J5KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRJc01vYmlsZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLCB0aGlzLnJlc2l6ZSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdW5tb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMucmVzaXplKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF1cbn0pO1xuIiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICdsaWIvY29tcG9uZW50LW1vZHVsZSc7XG5pbXBvcnQgZmV0Y2hlciBmcm9tICdsaWIvZmV0Y2hlcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnbGliL3N0b3JlJztcbmltcG9ydCB7XG4gICAgdGVtcGxhdGUgYXMgaGl3VGVtcGxhdGUsXG4gICAgdGFiTGFiZWwgYXMgaGl3VGFiTGFiZWwsXG4gICAgY29udGVudFRlbXBsYXRlIGFzIGhpd0NvbnRlbnRUZW1wbGF0ZVxufSBmcm9tICdsaWIvaG93LWl0LXdvcmtzJztcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLmZpbmQtZGlzdHJpYnV0b3InLCB7XG4gICAgcHJlZml4OiAnZmluZC1kaXN0cmlidXRvci0nLFxuICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgZmV0Y2hlcih7XG4gICAgICAgICAgICBuYW1lOiAndGVtcGxhdGUnLFxuICAgICAgICAgICAgZGF0YSgpe1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGxpc3Q6IHsgdGVtcGxhdGU6ICc8ZGl2PjxzbG90Pjwvc2xvdD48L2Rpdj4nIH0sXG4gICAgICAgICAgICAgICAgICAgIGxpc3RWaXNpYmxlOiBmYWxzZVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGdldERpc3RyaWJ1dG9ycygpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhcmFtcy5jb3VudHJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3RWaXNpYmxlID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaChmdW5jdGlvbihyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdCB0ZW1wbGF0ZSA9IHNlbGYuZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IHJlcy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiUkVTXCIsIHJlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5saXN0ID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hpdy10ZW1wbGF0ZSc6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5oaXdUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaXctdGFiLWxhYmVsJzogaGl3VGFiTGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoaXctY29udGVudC10ZW1wbGF0ZSc6IGhpd0NvbnRlbnRUZW1wbGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5saXN0VmlzaWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHtcbiAgICAgICAgICAgIGZldGNoT25VcGRhdGVQYXJhbXM6IGZhbHNlXG4gICAgICAgIH0pXG4gICAgXSxcbiAgICBzdG9yZTogc3RvcmVcbn0pO1xuIiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICcuLi9jb21wb25lbnQtbW9kdWxlJztcbmltcG9ydCBTdG9yYWdlTWFuYWdlciwgeyBMb2NhbFN0b3JhZ2VNYW5hZ2VyIH0gZnJvbSAnLi4vc3RvcmFnZS1tYW5hZ2VyJztcbmltcG9ydCB7IGdldENvb2tpZVZhbHVlIH0gZnJvbSAnLi4vbWlzYyc7XG5cbmNvbnN0IHN0b3JhZ2VNYW5hZ2VyID0gU3RvcmFnZU1hbmFnZXIoTG9jYWxTdG9yYWdlTWFuYWdlcik7XG5cbmNvbnN0IEdMT0JBTF9NRVNTQUdFX1NFU1NJT04gPSAnZ2xvYmFsLW1lc3NzYWdlJztcblxuY29uc3QgZ2V0TmFtZVNlc3Npb24gPSBpZCA9PiB7XG4gICAgcmV0dXJuIEdMT0JBTF9NRVNTQUdFX1NFU1NJT04rJyMnK2lkO1xufVxuXG5jb25zdCBnZXRUaW1lc1Nob3dlZCA9IGlkID0+IHtcbiAgICByZXR1cm4gcGFyc2VJbnQoc3RvcmFnZU1hbmFnZXIuZ2V0KGdldE5hbWVTZXNzaW9uKGlkKSkgfHwgMCk7XG59XG5cbmNvbnN0IGFkZFRpbWVTaG93ZWQgPSAoaWQpID0+IHtcbiAgICBzdG9yYWdlTWFuYWdlci5hZGRUaW1lcyhnZXROYW1lU2Vzc2lvbihpZCkpO1xufVxuXG5Db21wb25lbnRNb2R1bGUuQWRkTW9kdWxlKCcuZ2xvYmFsLW1lc3NhZ2UnLCB7XG4gICAgcHJlZml4OiAnZ2xvYmFsLW1lc3NhZ2UtJyxcbiAgICBjb21wb25lbnRzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgc2hvd1RpbWVzOiBOdW1iZXJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuYW1lOiAndGVtcGxhdGUnLFxuICAgICAgICAgICAgZGF0YTogKCkgPT4gKHtcbiAgICAgICAgICAgICAgICBpc1Nob3c6IGZhbHNlLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICBtb3VudGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuJHBhcmVudC4kZWw7XG5cbiAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UgJiYgZWwuY2xhc3NOYW1lLmluY2x1ZGVzKFwiX19zaG93LXRpbWVzXCIpICYmIGVsLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRpbWVzID0gZ2V0VGltZXNTaG93ZWQoZWwuaWQpO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG93VGltZXMgPSB0aGlzLnNob3dUaW1lcyB8fCAxO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGltZXMgPj0gc2hvd1RpbWVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzU2hvdyA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja09uZVRydXN0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Nob3cgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrT25lVHJ1c3QoKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGNsb3NlKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuJHBhcmVudC4kZWw7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1Nob3cgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblN0b3JhZ2UgJiYgZWwuY2xhc3NOYW1lLmluY2x1ZGVzKFwiX19zaG93LXRpbWVzXCIpICYmIGVsLmlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhZGRUaW1lU2hvd2VkKGVsLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEV2ZW50KCdjbG9zZUdsb2JhbEFsZXJ0Jyk7XG4gICAgICAgICAgICAgICAgICAgIGVsLmRpc3BhdGNoRXZlbnQoZXZlbnQpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hlY2tPbmVUcnVzdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9uZVRydXN0Q29va2llID0gZ2V0Q29va2llVmFsdWUoJ09wdGFub25BbGVydEJveENsb3NlZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyh0aGlzLiRlbCk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvbmVUcnVzdENvb2tpZSA9PSAnJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgMTAwMCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBjbG9zZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNvbmV0cnVzdC1jbG9zZS1idG4tY29udGFpbmVyJyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy4kcGFyZW50LiRlbDtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BlbkV2ZW50ID0gbmV3IEV2ZW50KCdvcGVuR2xvYmFsQWxlcnQnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNsb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbG9zZS5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KG9wZW5FdmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIF1cbn0pO1xuXG4iLCJpbXBvcnQgJy4vcmVjZW50LXBvc3RzJztcbmltcG9ydCAnLi9teS1zYXZlZC1wYWdlJztcbmltcG9ydCAnLi9zb2x1dGlvbi1hcmVhJztcbmltcG9ydCAnLi9tZXRlci1zZWxlY3Rvcic7XG5pbXBvcnQgJy4vZ2xvYmFsLW1lc3NhZ2UnO1xuaW1wb3J0ICcuL2ZpbmQtZGlzdHJpYnV0b3InO1xuaW1wb3J0ICcuL2FmZmlsaWF0ZXMnO1xuaW1wb3J0ICcuL2xvY2F0aW9ucy1tYXAnO1xuIiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICdsaWIvY29tcG9uZW50LW1vZHVsZSc7XG5pbXBvcnQgdGlwcHkgZnJvbSAndGlwcHkuanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4uL3N0b3JlJztcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLmxvY2F0aW9ucy1tYXAnLCB7XG4gICAgcHJlZml4OiAnbG9jYXRpb25zLW1hcC0nLFxuICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgbmFtZTogJ3RlbXBsYXRlJyxcbiAgICAgICAgICAgIGRhdGEoKXtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZWdpb246IDAsXG4gICAgICAgICAgICAgICAgICAgIHJlc2l6ZVRpbWVvdXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG9wZW5lZElkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbnM6IFtdLFxuICAgICAgICAgICAgICAgICAgICByZWdpb25zOiB3aW5kb3cubG9jYXRpb25zTWFwRGF0YS5yZWdpb25zLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB3aW5kb3cubG9jYXRpb25zTWFwRGF0YS5sb2NhdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgIGZ1bGxzY3JlZW5Ub29sdGlwQ29udGFpbmVyOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgaXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuaXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgbG9jYXRpb25zKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBlbG1zID0gdGhpcy4kZWwuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgnbG9jYXRpb25zLW1hcF9fbG9jYXRpb24tcGluJyk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWxtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZSA9IGVsbXNbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBsID0gdGhpcy5sb2NhdGlvbnNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcmVnaW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvUmVnaW9uKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsY3VsYXRlUG9zaXRpb24oKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9wZW5lZElkKCl7XG4gICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3BlbmVkSWQgPT09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDb250ZW50VG9vbHRpcFJlZmVyZW5jZShudWxsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hcCA9IHRoaXMuJGVsLnBhcmVudE5vZGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuc3R5bGUucmVtb3ZlUHJvcGVydHkoJ2hlaWdodCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsIHRoaXMucmVzaXplKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkZXN0cm95ZWQoKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIiwgdGhpcy5yZXNpemUpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBzZXRDb250ZW50VG9vbHRpcFJlZmVyZW5jZShjb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wZW5lZElkID09PSBudWxsICYmIHRoaXMuZnVsbHNjcmVlblRvb2x0aXBDb250YWluZXIpe1xuICAgICAgICAgICAgICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZCh0aGlzLmZ1bGxzY3JlZW5Ub29sdGlwQ29udGFpbmVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZnVsbHNjcmVlblRvb2x0aXBDb250YWluZXIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbnRlbnQgPT09IG51bGwpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXYgPSB0aGlzLmZ1bGxzY3JlZW5Ub29sdGlwQ29udGFpbmVyIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICAgICAgICAgICAgICBib2R5LmFwcGVuZENoaWxkKGRpdik7XG4gICAgICAgICAgICAgICAgICAgIGRpdi5jbGFzc0xpc3QuYWRkKCdsb2NhdGlvbnMtbWFwX190b29sdGlwLWZ1bGxzY3JlZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZnVsbHNjcmVlblRvb2x0aXBDb250YWluZXIgPSBkaXY7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRQcmVmaXhDc3MoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsICcnKSxcbiAgICAgICAgICAgICAgICAgICAgcHJlID0gKEFycmF5LnByb3RvdHlwZS5zbGljZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5jYWxsKHN0eWxlcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuam9pbignJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWF0Y2goLy0obW96fHdlYmtpdHxtcyktLykgfHwgKHN0eWxlcy5PTGluayA9PT0gJycgJiYgWycnLCAnbyddKVxuICAgICAgICAgICAgICAgICAgICAgICAgICApWzFdLFxuICAgICAgICAgICAgICAgICAgICBkb20gPSAoJ1dlYktpdHxNb3p8TVN8TycpLm1hdGNoKG5ldyBSZWdFeHAoJygnICsgcHJlICsgJyknLCAnaScpKVsxXTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvbTogZG9tLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXJjYXNlOiBwcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjc3M6ICctJyArIHByZSArICctJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpzOiBwcmVbMF0udG9VcHBlckNhc2UoKSArIHByZS5zdWJzdHIoMSlcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldFN0eWxlV2l0aFByZWZpeChlbCwgc3R5bGUsIHZhbHVlKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBjc3MgfSA9IHRoaXMuZ2V0UHJlZml4Q3NzKCk7XG4gICAgICAgICAgICAgICAgICAgIGVsLnN0eWxlW2NzcytzdHlsZV0gPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZURpZmYoKXtcblxuICAgICAgICAgICAgICAgICAgICBpZighdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxjdWxhdGVIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBcblxuICAgICAgICAgICAgICAgICAgICBsZXQgcmVhbFdpZHRoID0gMDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlYWxIZWlnaHQgPSAwO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxXaWR0aCA9IDE2MTA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxIZWlnaHQgPSA3NzA7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxSYXRpbyA9IGZ1bGxXaWR0aC9mdWxsSGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJXaWR0aCA9IHRoaXMuJGVsLnBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckhlaWdodCA9IHRoaXMuJGVsLnBhcmVudEVsZW1lbnQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJSYXRpb24gPSBjb250YWluZXJXaWR0aC9jb250YWluZXJIZWlnaHQ7XG5cblxuICAgICAgICAgICAgICAgICAgICBpZihjb250YWluZXJSYXRpb24gPiBmdWxsUmF0aW8pe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFdpZHRoID0gY29udGFpbmVyV2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICByZWFsSGVpZ2h0ID0gY29udGFpbmVyV2lkdGgvZnVsbFJhdGlvO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVhbFdpZHRoID0gY29udGFpbmVySGVpZ2h0KmZ1bGxSYXRpbztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlYWxIZWlnaHQgPSBjb250YWluZXJIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdzogcmVhbFdpZHRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgaDogcmVhbEhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHg6IHJlYWxXaWR0aC9mdWxsV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgICAgICB5OiByZWFsSGVpZ2h0L2Z1bGxIZWlnaHRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1vdmVUb1JlZ2lvbigpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgbCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ID0gMDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWdpb24gIT09IG51bGwgJiYgd2luZG93LmlubmVyV2lkdGggPCA4MzUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB4OnhEaWZmLCB5OnlEaWZmLCB3IH0gPSB0aGlzLmNhbGN1bGF0ZURpZmYoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2lvbiA9IHRoaXMucmVnaW9uc1t0aGlzLnJlZ2lvbl07XG4gICAgICAgICAgICAgICAgICAgICAgICBsID0gcmVnaW9uLmNvb3JkaW5hdGVzWzBdICogeERpZmYgKiAtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSByZWdpb24uY29vcmRpbmF0ZXNbMV0gKiB5RGlmZiAqIC0xO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRXaWR0aCA9IHRoaXMuJGVsLnBhcmVudEVsZW1lbnQub2Zmc2V0V2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXRIZWlnaHQgPSB0aGlzLiRlbC5wYXJlbnRFbGVtZW50Lm9mZnNldEhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWluTGVmdCA9ICh3IC0gb2Zmc2V0V2lkdGgpICogLTE7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtaW5Ub3AgPSAodyAtIG9mZnNldEhlaWdodCkgKiAtMTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGwgPCBtaW5MZWZ0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbCA9IG1pbkxlZnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IDwgbWluVG9wKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdCA9IG1pblRvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnBhcmVudEVsZW1lbnQuc3R5bGVbJ2JhY2tncm91bmQtcG9zaXRpb24nXSA9IGAke2x9cHggJHt0fXB4YDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5sb2NhdGlvbnNDb250YWluZXIuc3R5bGUubGVmdCA9IGAke2x9cHhgO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLmxvY2F0aW9uc0NvbnRhaW5lci5zdHlsZS50b3AgPSBgJHt0fXB4YDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9wZW4oaWQpe1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5lZElkID0gaWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZXNpemUoKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMucmVzaXplVGltZW91dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMucmVzaXplVGltZW91dCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlc2l6ZVRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jYWxjdWxhdGVQb3NpdGlvbigpO1xuICAgICAgICAgICAgICAgICAgICB9LCA1MDApO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW92ZVRvUmVnaW9uKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjYWxjdWxhdGVQb3NpdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHg6eERpZmYsIHk6eURpZmYgfSA9IHRoaXMuY2FsY3VsYXRlRGlmZigpO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZm9yRWFjaChpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFtsLCB0XSA9IGkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBfdG9wID0gTWF0aC5yb3VuZCh0ICogeURpZmYpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgX2xlZnQgPSBNYXRoLnJvdW5kKGwgKiB4RGlmZik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9ucy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBbYCR7X2xlZnR9cHhgLCBgJHtfdG9wfXB4YF0sXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9ucyA9IGxvY2F0aW9ucztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNhbGN1bGF0ZUhlaWdodCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZ1bGxXaWR0aCA9IDE2MTA7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmdWxsSGVpZ2h0ID0gNzcwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZnVsbFJhdGlvID0gZnVsbFdpZHRoL2Z1bGxIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aW5kb3dXaWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY2FsY0hlaWdodCA9IE1hdGgucm91bmQod2luZG93V2lkdGggLyBmdWxsUmF0aW8pO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFwID0gdGhpcy4kZWwucGFyZW50Tm9kZTtcbiAgICAgICAgICAgICAgICAgICAgbWFwLnN0eWxlLmhlaWdodCA9IGAke2NhbGNIZWlnaHR9cHhgO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgJ2NvbnRlbnQtdG9vbHRpcCc6IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2NvbnRlbnQtdG9vbHRpcCcsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2lkJywgJ2RhdGEnLCAnb3BlbicsICdpc09wZW4nLCAnc2V0Q29udGVudFRvb2x0aXBSZWZlcmVuY2UnXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YSgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXBweUluc3RhbmNlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRDaGlsZDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJQcmV2aWV3IENhcmRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJPcGVuXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5kYXRhLm5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9iaWxlTW9kZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGlwcHlJbnN0YW5jZS5zZXRDb250ZW50KCcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBpc09wZW4oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vYmlsZU1vZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpcHB5SW5zdGFuY2Uuc2V0Q29udGVudCgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNPcGVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlYXNlIHotaW5kZXggb2YgY3VycmVudGx5IG9wZW4gdG9vbHRpcFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGlwcHlUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjdGlwcHktJHt0aGlzLmlkICsgMX1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlwcHlUYXJnZXQuc3R5bGUuekluZGV4ID0gMTAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgb25PcGVuKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuKHRoaXMuaWQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uQ2xvc2UoKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW4obnVsbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9iaWxlTW9kZSgpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3BlbiAmJiB3aW5kb3cuaW5uZXJXaWR0aCA8IDY1MCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29udGVudFRvb2x0aXBSZWZlcmVuY2UodGhpcy5jb250ZW50Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0VG9vbHRpcENvbnRlbnQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgc2V0VG9vbHRpcENvbnRlbnQoKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRpcHB5SW5zdGFuY2UucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoJy50aXBweS1jb250ZW50JykuYXBwZW5kQ2hpbGQodGhpcy5jb250ZW50Q2hpbGQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRlbnRDaGlsZCA9IHRoaXMuJGVsLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSB0aXBweSh0aGlzLiRlbCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnQ6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFdpZHRoOiAnbm9uZScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dIVE1MOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyYWN0aXZlOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudDogdGhpcy5kYXRhLnBsYWNlbWVudCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiAnbWFudWFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDk5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQ3JlYXRlKGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQudGlwcHlJbnN0YW5jZSA9IGluc3RhbmNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnNldFRvb2x0aXBDb250ZW50KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlLnNob3coKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uSGlkZShpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICBdXG59KTtcbiIsImltcG9ydCBxcyBmcm9tICdxcyc7XG5cbmltcG9ydCBDb21wb25lbnRNb2R1bGUgZnJvbSAnbGliL2NvbXBvbmVudC1tb2R1bGUnO1xuaW1wb3J0IGZldGNoZXIgZnJvbSAnbGliL2ZldGNoZXInO1xuXG5pbXBvcnQgc3RvcmUgZnJvbSAnLi4vc3RvcmUnO1xuaW1wb3J0IHsgaW5mb01vZGFsIGFzIG1vZGFsIH0gZnJvbSAnLi4vbW9kYWxzJztcblxuLy8gTWV0ZXIgc2VsZWN0b3IgY29tcG9uZW50c1xuaW1wb3J0ICdsaWIvbWV0ZXItc2VsZWN0b3Ivc3RlcC1iYXInO1xuaW1wb3J0ICdsaWIvbWV0ZXItc2VsZWN0b3IvaW5wdXQtYm94JztcbmltcG9ydCAnbGliL21ldGVyLXNlbGVjdG9yL2J1dHRvbi1zZXQnO1xuaW1wb3J0ICdsaWIvbWV0ZXItc2VsZWN0b3IvZnJhbWUnO1xuXG4vLyBNZXRlciBzZWxlY3RvciB0ZW1wbGF0ZXNcbmltcG9ydCBtZXRlclNlbGVjdG9yQ29udGVudFRlbXBsYXRlIGZyb20gJ3NoYXJlZC9tZXRlci1zZWxlY3Rvci1jb250ZW50Lmhicyc7XG5pbXBvcnQgbWV0ZXJTZWxlY3RvclBhZ2luYXRvclRlbXBsYXRlIGZyb20gJ3NoYXJlZC9tZXRlci1zZWxlY3Rvci1wYWdpbmF0b3IuaGJzJztcbmltcG9ydCBwcm9kdWN0SXRlbVZUZW1wbGF0ZSBmcm9tICdzaGFyZWQvbWV0ZXItc2VsZWN0b3ItcHJvZHVjdC1pdGVtLXYuaGJzJztcbmltcG9ydCBwcm9kdWN0SXRlbUhUZW1wbGF0ZSBmcm9tICdzaGFyZWQvbWV0ZXItc2VsZWN0b3ItcHJvZHVjdC1pdGVtLWguaGJzJztcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLm1ldGVyLXNlbGVjdG9yJywge1xuICAgIHByZWZpeDogJ21ldGVyLXNlbGVjdG9yLScsXG4gICAgY29tcG9uZW50czogW1xuICAgICAgICBmZXRjaGVyKHtcbiAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgZGVmYXVsdENvdW50OiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMCB9LFxuICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB7IHR5cGU6IE51bWJlciwgZGVmYXVsdDogMTIgfSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0UXVvdGVCdXR0b246IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnW2hyZWY9XCIjbWV0ZXJzZWxlY3RvclwiXScgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGdsb2JhbFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiB7fSxcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgY291bnQ6IHRoaXMuZGVmYXVsdENvdW50LFxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHF1ZXN0aW9uc1xuICAgICAgICAgICAgICAgICAgICBzdGVwczogW10sIFxuICAgICAgICAgICAgICAgICAgICBzdGVwTnVtYmVyOiAwLFxuICAgICAgICAgICAgICAgICAgICBhbnN3ZXJNZW1vOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHF1ZXN0aW9uczogW10sXG4gICAgICAgICAgICAgICAgICAgIGFuc3dlck1vZGVsOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRDb250aW51ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgbm90aWNlOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgZGVib3VuY2U6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHN0ZXBWYWx1ZXM6IFtdLFxuICAgICAgICAgICAgICAgICAgICBpc1Jlc3VsdHNQYWdlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgdGFnU3RlcEZsYWc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzZWxlY3RlZFVuaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS51bml0cztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZpbHRlcnMoKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVycyA9IHRoaXMuYW5zd2VyTWVtby5maWx0ZXIoKF8sIGkpID0+IGkgPCB0aGlzLnN0ZXBOdW1iZXIgKS5yZWR1Y2UoKGEsIGF3KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWF3KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5ID0gYXcucmVkdWNlKChhZSwgZSkgPT4gKHsuLi5hZSwgLi4uZS5xdWVyeSB9KSwge30pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLmEsIC4uLnF1ZXJ5IH07XG4gICAgICAgICAgICAgICAgICAgIH0gLHt9KTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmlsdGVycztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhhc0J1dHRvbnMoKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZXN1bHRzUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25zID0gdGhpcy5nZXRRdWVzdGlvbnModGhpcy5zdGVwTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4ocXVlc3Rpb25zLmZpbmQocSA9PiBxLmJ1dHRvbiApKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGlzVHJhbnNwYXJlbnQoKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNSZXN1bHRzUGFnZSB8fCB0aGlzLnF1ZXN0aW9ucy5sZW5ndGggPT09IDAgfHwgdGhpcy5oYXNCdXR0b25zO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGl0bGUoKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZXN1bHRzUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0aXRsZSB9ID0gKHRoaXMuZGF0YSkgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGl0bGU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWIgPSB0aGlzLmdldFRhYih0aGlzLnN0ZXBOdW1iZXIpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHRhYiAmJiB0YWIudGFiVGl0bGUpIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlKCl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgY29udGVudCB9ID0gKHRoaXMuZGF0YSkgfHwge307XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZW50O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2xvc2VMYWJlbCgpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5kYXRhLnNlYXJjaFJlc3VsdHMgfHwge307XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLkNsb3NlTGFiZWw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuZXh0TGFiZWwoKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0cy5BZGp1c3RQYXJhbXNMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLk5leHRMYWJlbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNraXBMYWJlbCgpe1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2VhcmNoUmVzdWx0cyAmJiB0aGlzLmRhdGEuc2VhcmNoUmVzdWx0cy5Ta2lwRm9yTm93TGFiZWw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBsb2FkaW5nTWVzc2FnZSgpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHRzID0gdGhpcy5kYXRhLnNlYXJjaFJlc3VsdHMgfHwge307XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzLkxvYWRpbmdMYWJlbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNvbnRhY3RCdXR0b24oKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzUmVzdWx0c1BhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzICYmIHsgbGFiZWw6IHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzLkNvbnRhY3RQcm9kdWN0RXhwZXJ0TGFiZWwgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc1Jlc3VsdHNQYWdlKCl7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHRhYnMgPSBbXSB9ID0gdGhpcy5kYXRhO1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXJNZW1vID0gdGhpcy5hbnN3ZXJNZW1vO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9ucyA9IHRhYnMucmVkdWNlKChhLCB0LCBpdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0LnF1ZXN0aW9ucyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9ucyA9IHQucXVlc3Rpb25zLm1hcCgocSxpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsuLi5xLCBxdWVzdGlvbkluZGV4OiBpLCB0YWJJbmRleDogaXQgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmZpbHRlcihxID0+ICFxLmJ1dHRvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbLi4uYSwgLi4ucXVlc3Rpb25zXTtcbiAgICAgICAgICAgICAgICAgICAgfSwgW10pOyBcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlck1vZGVsID0gcXVlc3Rpb25zLm1hcCgocSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0YWJJbmRleCwgcXVlc3Rpb25JbmRleCwgLi4ucmVzdH0gPSBxO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFuc3dlck1lbW9bcS50YWJJbmRleF0gJiYgYW5zd2VyTWVtb1txLnRhYkluZGV4XVtxLnF1ZXN0aW9uSW5kZXhdOyBcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnMgPSBxdWVzdGlvbnM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhbnN3ZXJNb2RlbCh2KXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSZXN1bHRzUGFnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VkQW5zd2VyTWVtb09uUmVzdWx0UGFnZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRpbnVlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGljZSA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBlbmFibGVOZXh0V2hlbiB9ID0gdGhpcy5nZXRUYWIodGhpcy5zdGVwTnVtYmVyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXN0aW9ucyA9IHRoaXMuZ2V0UXVlc3Rpb25zKHRoaXMuc3RlcE51bWJlcik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFxdWVzdGlvbnMpICB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBxdWVzdGlvbnMgPSBxdWVzdGlvbnMubWFwKChxLCBpKSA9PiAoeyAuLi5xLCBpbmRleDogaSB9KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5zd2VycyA9IHRoaXMuYW5zd2VyTW9kZWwuZmlsdGVyKGEgPT4gYSk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlcnNWYWx1ZXMgPSBhbnN3ZXJzLnJlZHVjZSgobywgYSkgPT4gKHsgLi4ubywgW2EuaWRdOiBhLnZhbHVlIH0pLCB7fSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnMgPSBxdWVzdGlvbnMuZmlsdGVyKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFxLnNob3dJZlF1ZXN0aW9uKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYSA9IGFuc3dlcnNWYWx1ZXNbcS5zaG93SWZRdWVzdGlvbl07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhICYmICh0eXBlb2YgYSA9PT0gJ3N0cmluZycgPyBhID09PSBxLnNob3dJZlZhbHVlIDogYS5pbmRleE9mKHEuc2hvd0lmVmFsdWUpID49IDApO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleGVzID0gdGhpcy5xdWVzdGlvbnMubWFwKHEgPT4gcS5pbmRleCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkQW5zd2VycyA9IGFuc3dlcnMuZmlsdGVyKGEgPT4gaW5kZXhlcy5pbmRleE9mKGEuaW5kZXgpID49IDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgY29tcGFyaXNvblR5cGUgPSAnREVGQVVMVCcsIHN0ZXBJZHMgPSBbXSB9ID0gZW5hYmxlTmV4dFdoZW4gfHwge307XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmlzb25UeXBlID09PSAnQU5ZJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRpbnVlID0gISgoZmlsdGVyZWRBbnN3ZXJzLmZpbmQoYSA9PiBzdGVwSWRzLmluZGV4T2YoYS5pZCkgPj0gMCkgfHwgZmFsc2UpICYmIHRydWUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmlzb25UeXBlID09PSAnQUxMJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRpbnVlID0gZmlsdGVyZWRBbnN3ZXJzLmZpbHRlcihhID0+IHN0ZXBJZHMuaW5kZXhPZihhLmlkKSA+PSAwKS5sZW5ndGggIT09IHN0ZXBJZHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZENvbnRpbnVlID0gdGhpcy5xdWVzdGlvbnMubGVuZ3RoICE9PSBmaWx0ZXJlZEFuc3dlcnMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpY2UgPSAoZmlsdGVyZWRBbnN3ZXJzLmZpbmQoYSA9PiBhLm5vdGljZSkgfHwge30pLm5vdGljZSB8fCAnJztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZpbHRlcnM6IHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcjogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkaW5nTWVzc2FnZTogdGhpcy5pc1Jlc3VsdHNQYWdlICYmIHRoaXMubG9hZGluZ01lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlYm91bmNlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5kZWJvdW5jZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc1Jlc3VsdHNQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRGF0YSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJvdW5jZSA9IHNldFRpbWVvdXQodGhpcy5sb2FkRGF0YSwgNjAwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZWVwOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgICAgIGhhbmRsZXI6IGZ1bmN0aW9uKGQpe1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkIHx8ICFkLnNlYXJjaFJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgVG90YWxSZXN1bHRzLCByZW1haW5pbmcsIFNob3dMYXN0UGFnZSB9ID0gZC5zZWFyY2hSZXN1bHRzIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFicyA9IGQudGFicyB8fCBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgZm91bmQgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFRvdGFsUmVzdWx0cyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IFRvdGFsUmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcGFnaW5hdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgIXJlbWFpbmluZyAmJiB0aGlzLnNldERhdGEoZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcHMgPSB0YWJzLm1hcCh0ID0+ICh7IGxhYmVsOiB0LnRhYlRpdGxlU2hvcnQgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoU2hvd0xhc3RQYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwTnVtYmVyID0gdGhpcy5zdGVwcy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZXN1bHRzUGFnZSA9IHRoaXMuc3RlcHMubGVuZ3RoIDw9IHRoaXMuc3RlcE51bWJlcjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkZWVwOiB0cnVlXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGVwTnVtYmVyKGkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50YWdTdGVwRmxhZyA9ICB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWRWaWV3KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdGVwQW5zd2Vycyh2KXtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgYmFycyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wZXJzaXN0ZW50LWN0YScpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmFycy5sZW5ndGg7IGkrKyl7IGNvbnN0IGUgPSBiYXJzW2ldOyBlLmNsYXNzTGlzdC5hZGQoJ3BlcnNpc3RlbnQtY3RhLS1tcycpOyB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdXBkYXRlZCgpe1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVzdWx0c1BhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyRm9ybSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgLy8gRmV0Y2hzIHRoZSByZW1vdGUgZGF0YVxuICAgICAgICAgICAgICAgIGxvYWREYXRhOiBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmaWx0ZXJzID0gey4uLnRoaXMuZmlsdGVyc307XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaChmdW5jdGlvbihyZXNwb25zZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5zZXREYXRhKHJlc3BvbnNlLmRhdGEgfHwge30pO1xuICAgICAgICAgICAgICAgICAgICB9LCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50aGlzLnBhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWdlOiB0aGlzLnBhZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXNTZXJpYWxpemVyOiBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHFzLnN0cmluZ2lmeShwYXJhbXMsIHthcnJheUZvcm1hdDogJ3JlcGVhdCd9KVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIC8vIFBhZ2luYXRpb24gbWV0aG9kc1xuICAgICAgICAgICAgICAgIGxvYWRNb3JlOiBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXREYXRhKHRoaXMuZGF0YSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzZXREYXRhOiBmdW5jdGlvbihkYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBzZWFyY2hSZXN1bHRzOiB7IFJlc3VsdHMgPSBbXSwgcmVtYWluaW5nLCAuLi5fc2VhcmNoUmVzdWx0cyB9LCAuLi5yZXMgfSA9IGRhdGE7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWFyY2hSZXN1bHRzID0ge307XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFyZW1haW5pbmcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaFJlc3VsdHMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzdWx0czogW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5SZXN1bHRzLmZpbHRlcigoXywgaSkgPT4gaSA8IHRoaXMucGFnZVNpemUgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nOiBSZXN1bHRzLmZpbHRlcigoXywgaSkgPT4gaSA+PSB0aGlzLnBhZ2VTaXplICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uX3NlYXJjaFJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25UcmlnZ2VyU3RlcEV2ZW50KGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VhcmNoUmVzdWx0cyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLlJlc3VsdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnJlbWFpbmluZy5maWx0ZXIoKF8sIGkpID0+IGkgPCB0aGlzLnBhZ2VTaXplIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZzogcmVtYWluaW5nLmZpbHRlcigoXywgaSkgPT4gaSA+PSB0aGlzLnBhZ2VTaXplICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uX3NlYXJjaFJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWFyY2hSZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV4dFBhZ2U6IHNlYXJjaFJlc3VsdHMucmVtYWluaW5nLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgLy8gU3RlcCBtZXRob2RzXG4gICAgICAgICAgICAgICAgZ2V0VGFiKHN0ZXBOdW1iZXIsIGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFicyA9IChkYXRhICYmIGRhdGEudGFicykgfHwgIHRoaXMuZGF0YS50YWJzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFic1tzdGVwTnVtYmVyXSB8fCB7fTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGdldFF1ZXN0aW9ucyhzdGVwTnVtYmVyLCBkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYiA9IHRoaXMuZ2V0VGFiKHN0ZXBOdW1iZXIsIGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiLnF1ZXN0aW9ucyB8fCBbXTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGxvYWRWaWV3KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0ZXBWYWx1ZXMoKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc1Jlc3VsdHNQYWdlKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5zd2VyTW9kZWwgPSB0aGlzLmFuc3dlck1lbW9bdGhpcy5zdGVwTnVtYmVyXSA/IFsuLi50aGlzLmFuc3dlck1lbW9bdGhpcy5zdGVwTnVtYmVyXV0gOiBbXTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldFN0ZXBWYWx1ZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYnMgPSB0aGlzLmRhdGEudGFicyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhYnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBhbnN3ZXJNZW1vID0gdGhpcy5hbnN3ZXJNZW1vO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcFZhbHVlcyA9IGFuc3dlck1lbW8ubWFwKChhLCBpKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWIgPSB0YWJzW2ldIHx8IHt9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFiLnRhYlZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhYi50YWJWYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgPj0gdGhpcy5zdGVwTnVtYmVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhYmVsID0gYS5tYXAoZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBlLnZhbHVlID09PSAnb2JqZWN0Jyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgTW9yZUxhYmVsID0gJycgfSA9IHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZS52YWx1ZS5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWUuam9pbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gZS52YWx1ZS5sZW5ndGgtMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVbMF0gKyBgICsgJHtjb3VudH0gYCArIE1vcmVMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmpvaW4oJyAnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBvbkNsaWNrTmV4dEJ1dHRvbihza2lwPWZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzUmVzdWx0c1BhZ2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2xpZGVCYXIub3BlbigpOyBcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5zd2VyTWVtbyA9IFsuLi50aGlzLmFuc3dlck1lbW9dO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ZXMgPSB0aGlzLnF1ZXN0aW9ucy5tYXAocSA9PiBxLmluZGV4KTtcblxuICAgICAgICAgICAgICAgICAgICBpZihza2lwKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYW5zd2VyTWVtb1t0aGlzLnN0ZXBOdW1iZXJdID0gdGhpcy5xdWVzdGlvbnMubWFwKHEgPT4gdGhpcy5xdWVzdGlvblNraXBSZXN1bHQocSkpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW53cyA9IHRoaXMuYW5zd2VyTW9kZWwucmVkdWNlKChhLCBlKSA9PiAoIWUgPyBhIDogey4uLmEsIFtlLmluZGV4XTogZX0pLCB7fSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlck1lbW9bdGhpcy5zdGVwTnVtYmVyXSA9IGluZGV4ZXMubWFwKGkgPT4gYW53c1tpXSB8fCB7fSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFuc3dlck1vZGVsID0gW107XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RlcE51bWJlciArPSAxO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgb25DbGlja1NraXBCdXR0b24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub25DbGlja05leHRCdXR0b24odHJ1ZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VTdGVwTnVtYmVyKHN0ZXBOdW1iZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGVwTnVtYmVyID0gc3RlcE51bWJlcjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGNoYW5nZWRBbnN3ZXJNZW1vT25SZXN1bHRQYWdlKCl7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuc3dlck1lbW8gPSBbLi4udGhpcy5hbnN3ZXJNZW1vXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5xdWVzdGlvbnMuZm9yRWFjaCgocSwgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0YWJJbmRleCwgcXVlc3Rpb25JbmRleCwgLi4ucmVzdH0gPSBxO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbnN3ZXJNZW1vW3RhYkluZGV4XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlck1lbW9bdGFiSW5kZXhdID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5hbnN3ZXJNb2RlbFtpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuc3dlck1lbW9bdGFiSW5kZXhdW3F1ZXN0aW9uSW5kZXhdID0gdGhpcy5xdWVzdGlvblNraXBSZXN1bHQocSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBhbnN3ZXJNZW1vW3RhYkluZGV4XVtxdWVzdGlvbkluZGV4XSA9IHRoaXMuYW5zd2VyTW9kZWxbaV07XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5zd2VyTWVtbyA9IGFuc3dlck1lbW87XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBxdWVzdGlvblNraXBSZXN1bHQocSl7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHF1ZXJ5OiBxLmFwaVF1ZXJ5LnJlZHVjZSgoYSwgZSkgPT4gKHsgLi4uYSwgW2VdOiAnc2tpcCcgfSksIHt9KSB9O1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdHJpZ2dlclRhZ2dpbmdFdmVudChkYXRhLCB0eXBlKXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFkYXRhKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFPYmplY3QgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBldmVudDogJ1RGLU1ldGVyLVNlbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAndG9vbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogJ01ldGVyIFNlbGVjdG9yJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLmRhdGFcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT09ICdpbW11dGFibGUnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmltbXV0YWJsZURhdGFMYXllclB1c2goZGF0YU9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5jdXN0b21NdXRhYmxlRGF0YUxheWVyUHVzaChkYXRhT2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChlcnIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdBbmFseXRpY3MgZnJhbWV3b3JrIGVycm9yOiAnLCBlcnIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uVHJpZ2dlclF1ZXN0aW9uRXZlbnQoZGF0YSA9IHt9KXtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFOdW1iZXIuaXNJbnRlZ2VyKGRhdGEucXVlc3Rpb25JbmRleCkpe1xuICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEgfHwgZGF0YS52YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWdnaW5nIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhYiA9IHRoaXMuZ2V0VGFiKHRoaXMuc3RlcE51bWJlcik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXN0aW9uID0gdGhpcy5xdWVzdGlvbnNbZGF0YS5xdWVzdGlvbkluZGV4XTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcXVlc3Rpb25UaXRsZSA9IHF1ZXN0aW9uLnF1ZXN0aW9uIHx8IHRhYi50YWJUaXRsZTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaXNCdXR0b24gPSBCb29sZWFuKHF1ZXN0aW9uLmJ1dHRvbik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyVGFnZ2luZ0V2ZW50KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogaXNCdXR0b24gPyBxdWVzdGlvblRpdGxlIDogcXVlc3Rpb24uZmlsdGVyTmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiBpc0J1dHRvbiA/IGRhdGEudmFsdWUubGFiZWwgOiBkYXRhLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFR5cGU6IGlzQnV0dG9uID8gJ2J1dHRvbicgOiAnaW5wdXQnLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uVHJpZ2dlclN0ZXBFdmVudChkYXRhID0ge30pe1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMudGFnU3RlcEZsYWcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGFnU3RlcEZsYWcgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0YWdnaW5nIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGkgPSB0aGlzLnN0ZXBOdW1iZXI7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBObyA9IHRoaXMucGFkU3RhcnQoU3RyaW5nKGkgKyAxKSwgMik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoQ291bnQgPSBkYXRhLnNlYXJjaFJlc3VsdHMgJiYgdGhpcy5wYWRTdGFydChTdHJpbmcoZGF0YS5zZWFyY2hSZXN1bHRzLlRvdGFsUmVzdWx0cyksIDMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpIDwgdGhpcy5zdGVwcy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlclRhZ2dpbmdFdmVudCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5vLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoQ291bnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcE5hbWU6IHRoaXMuc3RlcHNbaV0ubGFiZWxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sICdpbW11dGFibGUnKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpID49IHRoaXMuc3RlcHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJUYWdnaW5nRXZlbnQoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBObyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaENvdW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXBOYW1lOiAnQ09NUExFVEUnXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAnaW1tdXRhYmxlJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFkU3RhcnQodmFsdWUsIHBhZFNpemUgPSAyKXtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG4gPSAgU3RyaW5nKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG4ubGVuZ3RoIDwgcGFkU2l6ZSkge24gPSBcIjBcIiArIG47fVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gbjtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRyaWdnZXJGb3JtKCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBidXR0b25zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCh0aGlzLnJlcXVlc3RRdW90ZUJ1dHRvbik7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRzID0gdGhpcy5hbnN3ZXJNZW1vLnJlZHVjZSgoYSwgbywgaSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvKSAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBxYSA9IG8uZmlsdGVyKGUgPT4gQm9vbGVhbihlLmxhYmVsKSkubWFwKGUgPT4gKHsgbGFiZWw6IGUubGFiZWwgKyAoZS5vcHRpb24gJiYgZS5vcHRpb24ubGFiZWwgPyAnIGluICcgKyBlLm9wdGlvbi5sYWJlbCA6ICcnKSwgdmFsdWU6IGUudmFsdWUgfSkpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcWEubGVuZ3RoID4gMCA/IFsuLi5hLCAuLi5xYV0gOiBhO1xuICAgICAgICAgICAgICAgICAgICB9ICwgW10pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRzVGV4dCA9IGNvbW1lbnRzLmZpbHRlcihvID0+IEJvb2xlYW4oby52YWx1ZSkpLm1hcChvID0+IG8ubGFiZWwudG9VcHBlckNhc2UoKSArICc6ICcgKyAoQXJyYXkuaXNBcnJheShvLnZhbHVlKSA/IG8udmFsdWUuam9pbignLCAnKSA6IG8udmFsdWUudG9TdHJpbmcoKSkpLmpvaW4oJyB8ICcpO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBidXR0b24gPSBidXR0b25zW2ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmRhdGFzZXQuY29tbWVudHMgPSBjb21tZW50c1RleHQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnbWV0ZXItc2VsZWN0b3ItcGFnaW5hdG9yJyA6IHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdpc1Nob3cnXSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IG1ldGVyU2VsZWN0b3JQYWdpbmF0b3JUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICdtZXRlci1zZWxlY3Rvci1jb250ZW50JyA6IHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdjb3VudCcsICdpc01hdGNoJywgJ3NlbGVjdGVkVW5pdCddLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmlld1Byb2R1Y3RMYWJlbDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zZWFyY2hSZXN1bHRzLlZpZXdQcm9kdWN0TGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50KCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNNYXRjaCAmJiB0aGlzLmNvdW50ID09PSAxID8gJ3Byb2R1Y3QtaXRlbS1oJyA6ICdwcm9kdWN0LWl0ZW0tdic7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwicHJvZHVjdC1pdGVtLXZcIjoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2l0ZW0nLCAnc2VsZWN0ZWRVbml0JywgJ3ZpZXdQcm9kdWN0TGFiZWwnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogcHJvZHVjdEl0ZW1WVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImJvb2ttYXJrXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2l0ZW0nXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzW2Ake3RoaXMudHlwZX1gXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5kaXNwYXRjaCgnY2hlY2tGYXZvcml0ZXMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnByb2R1Y3RJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuYXJ0aWNsZUlkID8gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA6IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkID8gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgPyBcInByb2R1Y3RJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA/IFwiYXJ0aWNsZUlkXCIgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZCA/IFwiZG9jdW1lbnRJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQgPyBcInNvZnR3YXJlSWRcIiA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcInByb2R1Y3QtaXRlbS1oXCI6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogWydpdGVtJywgJ3NlbGVjdGVkVW5pdCcsICd2aWV3UHJvZHVjdExhYmVsJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IHByb2R1Y3RJdGVtSFRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJib29rbWFya1wiOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogWydpdGVtJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Jvb2ttYXJrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlc1tgJHt0aGlzLnR5cGV9YF07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXModGhpcy5pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCb29rbWFyaygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVGYXZvcml0ZXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcy5pc0Jvb2ttYXJrZWQgPyBcInJlbW92ZVwiIDogXCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goJ2NoZWNrRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQgPyB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQucHJvZHVjdElkIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmFydGljbGVJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5hcnRpY2xlSWQgOiB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuZG9jdW1lbnRJZCA/IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5kb2N1bWVudElkIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQgPyB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZCA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQucHJvZHVjdElkID8gXCJwcm9kdWN0SWRcIiA6IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5hcnRpY2xlSWQgPyBcImFydGljbGVJZFwiIDogdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQgPyBcImRvY3VtZW50SWRcIiA6IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkID8gXCJzb2Z0d2FyZUlkXCIgOiBudWxsO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IG1ldGVyU2VsZWN0b3JDb250ZW50VGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAnbWV0ZXItc2VsZWN0b3ItdG90YWwnOiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2NvdW50J10sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICBdIFxufSk7XG4iLCJpbXBvcnQgQ29tcG9uZW50TW9kdWxlIGZyb20gJ2xpYi9jb21wb25lbnQtbW9kdWxlJztcbmltcG9ydCB0YWJzIGZyb20gJ2xpYi90YWJzJztcbmltcG9ydCB7XG4gICAgdGFiU2VsZWN0TW9iaWxlIGFzIHRhYlNlbGVjdE1vYmlsZVRlbXBsYXRlLFxuICAgIHByb2R1Y3RJdGVtIGFzIHByb2R1Y3RJdGVtVGVtcGxhdGUsXG4gICAgZG9jdW1lbnRJdGVtIGFzIGRvY3VtZW50SXRlbVRlbXBsYXRlLFxuICAgIHNvZnR3YXJlSXRlbSBhcyBzb2Z0d2FyZUl0ZW1UZW1wbGF0ZSxcbiAgICBhcnRpY2xlSXRlbSBhcyBhcnRpY2xlSXRlbVRlbXBsYXRlXG59IGZyb20gJ2xpYi90ZW1wbGF0ZS1zdHJpbmdzL215LXNhdmVkLXBhZ2UnO1xuaW1wb3J0IHN0b3JlIGZyb20gXCIuLi9zdG9yZVwiO1xuLy8gaW1wb3J0IGF4aW9zIGZyb20gXCJheGlvc1wiXG4vLyBpbXBvcnQgZnBvZGIgZnJvbSAnLi4vLi4vLi4vLi4vZGIuanNvbic7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi4vZXZlbnQtYnVzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7cmVsZWFzZU5vdGVzTW9kYWx9IGZyb20gJy4vLi4vbW9kYWxzJztcbmltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5cblZ1ZS51c2UoVk1vZGFsKTtcblxuQ29tcG9uZW50TW9kdWxlLkFkZE1vZHVsZSgnLm15LXNhdmVkLXBhZ2UnLCB7XG4gICAgcHJlZml4OiAnbXktc2F2ZWQtcGFnZS0nLFxuICAgIGNvbXBvbmVudHM6IFtcbiAgICAgICAgdGFicyh7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzYXZlZElkczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNvZnR3YXJlOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFydGljbGVzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlZ2FsRG9jdW1lbnRzOiBbXVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWRQcm9kdWN0czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMucHJvZHVjdElkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWREb2N1bWVudHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzYXZlZFNvZnR3YXJlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWRBcnRpY2xlczogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuYXJ0aWNsZUlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWRMZWdhbERvY3VtZW50czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMubGVnYWxEb2N1bWVudElkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZFByb2R1Y3RzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlZElkcy5wcm9kdWN0cyA9IHRoaXMuc2F2ZWRQcm9kdWN0c1swXSA9PSBcIlwiID8gdGhpcy5zYXZlZFByb2R1Y3RzLnNoaWZ0KCkgOiB0aGlzLnNhdmVkUHJvZHVjdHM7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzYXZlZERvY3VtZW50czogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZWRJZHMuZG9jdW1lbnRzID0gdGhpcy5zYXZlZERvY3VtZW50c1swXSA9PSBcIlwiID8gdGhpcy5zYXZlZERvY3VtZW50cy5zaGlmdCgpIDogdGhpcy5zYXZlZERvY3VtZW50cztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkU29mdHdhcmU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkSWRzLnNvZnR3YXJlID0gdGhpcy5zYXZlZFNvZnR3YXJlWzBdID09IFwiXCIgPyB0aGlzLnNhdmVkU29mdHdhcmUuc2hpZnQoKSA6IHRoaXMuc2F2ZWRTb2Z0d2FyZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkQXJ0aWNsZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkSWRzLmFydGljbGVzID0gdGhpcy5zYXZlZEFydGljbGVzWzBdID09IFwiXCIgPyB0aGlzLnNhdmVkQXJ0aWNsZXMuc2hpZnQoKSA6IHRoaXMuc2F2ZWRBcnRpY2xlcztcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkTGVnYWxEb2N1bWVudHM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkSWRzLmxlZ2FsRG9jdW1lbnRzID0gdGhpcy5zYXZlZExlZ2FsRG9jdW1lbnRzWzBdID09IFwiXCIgPyB0aGlzLnNhdmVkTGVnYWxEb2N1bWVudHMuc2hpZnQoKSA6IHRoaXMuc2F2ZWRMZWdhbERvY3VtZW50cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXRTYXZlZElkcygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlZElkcy5wcm9kdWN0cyA9IHRoaXMuc2F2ZWRQcm9kdWN0c1swXSA9PSBcIlwiID8gdGhpcy5zYXZlZFByb2R1Y3RzLnNoaWZ0KCkgOiB0aGlzLnNhdmVkUHJvZHVjdHM7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZWRJZHMuZG9jdW1lbnRzID0gdGhpcy5zYXZlZERvY3VtZW50c1swXSA9PSBcIlwiID8gdGhpcy5zYXZlZERvY3VtZW50cy5zaGlmdCgpIDogdGhpcy5zYXZlZERvY3VtZW50cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYXZlZElkcy5zb2Z0d2FyZSA9IHRoaXMuc2F2ZWRTb2Z0d2FyZVswXSA9PSBcIlwiID8gdGhpcy5zYXZlZFNvZnR3YXJlLnNoaWZ0KCkgOiB0aGlzLnNhdmVkU29mdHdhcmU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2F2ZWRJZHMuYXJ0aWNsZXMgPSB0aGlzLnNhdmVkQXJ0aWNsZXNbMF0gPT0gXCJcIiA/IHRoaXMuc2F2ZWRBcnRpY2xlcy5zaGlmdCgpIDogdGhpcy5zYXZlZEFydGljbGVzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNhdmVkSWRzLmxlZ2FsRG9jdW1lbnRzID0gdGhpcy5zYXZlZExlZ2FsRG9jdW1lbnRzWzBdID09IFwiXCIgPyB0aGlzLnNhdmVkTGVnYWxEb2N1bWVudHMuc2hpZnQoKSA6IHRoaXMuc2F2ZWRMZWdhbERvY3VtZW50cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY3JlYXRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTYXZlZElkcygpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgIHRhYlNlbGVjdE1vYmlsZToge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAndGFiLXNlbGVjdC1tb2JpbGUnLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogdGFiU2VsZWN0TW9iaWxlVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VGFiOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0Q2xhc3M6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnbXktc2F2ZWQtcGFnZV9fdGFiLXNlbGVjdCcgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZVRhYjogRnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERhdGE6IE9iamVjdFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRTbG90cyA9IHRoaXMuJHNsb3RzLmRlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFNsb3QgPSBkZWZhdWx0U2xvdHMgJiYgZGVmYXVsdFNsb3RzWzBdXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IGNoaWxkU2xvdCAmJiBjaGlsZFNsb3QuY2hpbGRyZW47XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGRyZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZHJlbi5mb3JFYWNoKGMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gYy5jb21wb25lbnRPcHRpb25zO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdGlvbnMgfHwgb3B0aW9ucy50YWcgIT09ICd0YWInKXtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gb3B0aW9ucy5wcm9wc0RhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwYW4gPSBvcHRpb25zLmNoaWxkcmVuWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0ID0gc3BhbiAmJiBzcGFuLmNoaWxkcmVuWzBdICYmIHNwYW4uY2hpbGRyZW5bMF0udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaWQgPSBwcm9wcy5pZFRhYjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucHVzaCh7aWQsIHRleHR9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlOiBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VUYWIoZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzYXZlZFByb2R1Y3RzOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzYXZlZC1wcm9kdWN0cycsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ3NhdmVkSWRzJ10sXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkU3RyOiBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcImNoZWNrZWRcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja2VkU3RyID0gdGhpcy5jaGVja2VkLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7aXRlbS5uYW1lfWBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5qb2luKGBcXG5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdEl0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiAncHJvZHVjdC1pdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZTogcHJvZHVjdEl0ZW1UZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wczogWydjaGVja2VkJywgJ3NhdmVkSWRzJ10sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hlY2tlZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAncHJvZHVjdElkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0NoZWNrZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmFtID0gdGhpcy5pc0NoZWNrZWQgPyBcImFkZFwiIDogXCJyZW1vdmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB0aGlzLiRyZWZzLnVybC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gdGhpcy4kcmVmcy51cmwuaW5uZXJUZXh0O1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpZCc6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VybCc6IHVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbmFtZSc6IG5hbWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3VwZGF0ZS1jaGVja2VkJywgcGFyYW0sIG9iaik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwic2F2ZWRJZHMucHJvZHVjdHNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMucHJvZHVjdHMuaW5jbHVkZXModGhpcy5pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmNoZWNrYm94LmRhdGFzZXQucHJvZHVjdElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMucHJvZHVjdHMuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGhpcy5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RhcXVvdGUoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJSRVFVRVNUIEEgUVVPVEVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZS1jaGVja2VkJywgKHBhcmFtLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGFyYW0gPT0gXCJhZGRcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrZWQucHVzaCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5jaGVja2VkLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkID09IHZhbHVlLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuY2hlY2tlZC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKHZhbHVlLmlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrZWQuc3BsaWNlKHRoaXMuY2hlY2tlZC5pbmRleE9mKGluZGV4KSwgMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgIFxuICAgICAgICAgICAgICAgIGRvY0l0ZW06IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ2RvYy1pdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnc2F2ZWRJZHMnXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ2RvY3VtZW50SWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZUFsbDogbnVsbCwgLy9pcyBcInNlZSBhbGxcIiBmZWF0dXJlIGVuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlQWxsT3BlbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVBbGxMYWJlbDogbnVsbCwvL2xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZUNvbnRlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcblxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJzYXZlZElkcy5kb2N1bWVudHNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkSWRzLmRvY3VtZW50cy5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBcInNlZUFsbFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zZWVBbGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxMYWJlbCA9IHRoaXMuc2VlQWxsT3BlbiA/IHdpbmRvdy5zZWVMZXNzTGFiZWwgOiB3aW5kb3cuc2VlQWxsTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVTZWVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxPcGVuID0gIXRoaXMuc2VlQWxsT3BlbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCb29rbWFyaygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goJ2NoZWNrRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5pdFNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy4kcmVmcy5zZWVBbGxDb250ZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkZXRhaWxzID0gdGhpcy4kcmVmcy5zZWVBbGxDb250ZW50LmlubmVySFRNTC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbCA9IGRldGFpbHMubGVuZ3RoID4gMyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJ1bmNhdGVkRGV0YWlscyA9IGRldGFpbHMuc2xpY2UoMCwzKS5qb2luKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtb3JlRGV0YWlscyA9IGRldGFpbHMuc2xpY2UoMykuam9pbigpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9yZUNvbnRlbnQgPSBtb3JlRGV0YWlscztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5zZWVBbGxDb250ZW50LmlubmVySFRNTCA9IGAke3RydW5jYXRlZERldGFpbHN9JHttb3JlRGV0YWlscyA9PSBcIlwiID8gJycgOiAnLCd9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LmRvY3VtZW50SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMuZG9jdW1lbnRzLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWVBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbGVnYWxEb2NJdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdsZWdhbC1kb2MtaXRlbScsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ3NhdmVkSWRzJ10sXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Jvb2ttYXJrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdsZWdhbERvY3VtZW50SWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlZUFsbDogbnVsbCwgLy9pcyBcInNlZSBhbGxcIiBmZWF0dXJlIGVuYWJsZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VlQWxsT3BlbjogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVBbGxMYWJlbDogbnVsbCwvL2xhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9yZUNvbnRlbnQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcblxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJzYXZlZElkcy5sZWdhbERvY3VtZW50c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMubGVnYWxEb2N1bWVudHMuaW5jbHVkZXModGhpcy5pZCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJzZWVBbGxcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsTGFiZWwgPSB0aGlzLnNlZUFsbE9wZW4gPyB3aW5kb3cuc2VlTGVzc0xhYmVsIDogd2luZG93LnNlZUFsbExhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsT3BlbiA9ICF0aGlzLnNlZUFsbE9wZW47XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVGYXZvcml0ZXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcy5pc0Jvb2ttYXJrZWQgPyBcInJlbW92ZVwiIDogXCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGluaXRTZWVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGV0YWlscyA9IHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwuc3BsaXQoJywnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGwgPSBkZXRhaWxzLmxlbmd0aCA+IDMgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRydW5jYXRlZERldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDAsMykuam9pbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbW9yZURldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDMpLmpvaW4oKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vcmVDb250ZW50ID0gbW9yZURldGFpbHM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwgPSBgJHt0cnVuY2F0ZWREZXRhaWxzfSxgO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQubGVnYWxEb2N1bWVudElkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkSWRzLmxlZ2FsRG9jdW1lbnRzLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWVBbGwoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc29mdHdhcmVJdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdzb2Z0d2FyZS1pdGVtJyxcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnc2F2ZWRJZHMnXSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQm9va21hcmtlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NvZnR3YXJlSWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRzOiB7XG5cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwic2F2ZWRJZHMuc29mdHdhcmVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkSWRzLnNvZnR3YXJlLmluY2x1ZGVzKHRoaXMuaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVCb29rbWFyaygpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uOiB0aGlzLmlzQm9va21hcmtlZCA/IFwicmVtb3ZlXCIgOiBcImFkZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goJ2NoZWNrRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlTW9kYWwoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbGVhc2VOb3RlcyA9IHRoaXMuJHJlZnMucmVsZWFzZU5vdGVzLmlubmVySFRNTDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTm90ZXNNb2RhbC50ZW1wbGF0ZShyZWxlYXNlTm90ZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTm90ZXNNb2RhbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTm90ZXNNb2RhbC5vcHRpb25zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkSWRzLnNvZnR3YXJlLmluY2x1ZGVzKGAke3RoaXMuaWR9YCkgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFydGljbGVJdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhcnRpY2xlLWl0ZW0nLFxuICAgICAgICAgICAgICAgICAgICBwcm9wczogWydzYXZlZElkcyddLFxuICAgICAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNCb29rbWFya2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnYXJ0aWNsZUlkJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50czoge1xuXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInNhdmVkSWRzLmFydGljbGVzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZElkcy5hcnRpY2xlcy5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCd1cGRhdGVGYXZvcml0ZXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcy5pc0Jvb2ttYXJrZWQgPyBcInJlbW92ZVwiIDogXCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5hcnRpY2xlSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWRJZHMuYXJ0aWNsZXMuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWJQcm9wczoge1xuICAgICAgICAgICAgICAgIHNhdmVkSWRzOiBPYmplY3RcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWJPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgdGFiQ29udGVudE9wdGlvbnM6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgIFxuICAgICAgICAgICAgY29udGVudFByb3BzOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWRJZHM6IE9iamVjdFxuICAgICAgICAgICAgfVxuICAgICAgICB9KSxcbiAgICAgICAgXG4gICAgXVxufSk7XG5cbi8vIHdpbmRvdy5zZWVMZXNzTGFiZWwgPSBcInNlZSBsZXNzXCI7XG4vLyB3aW5kb3cuc2VlQWxsTGFiZWwgPSBcInNlZSBtb3JlXCI7IiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICdsaWIvY29tcG9uZW50LW1vZHVsZSc7XG5pbXBvcnQgZmV0Y2hlciBmcm9tICdsaWIvZmV0Y2hlcic7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi4vc3RvcmUnO1xuXG5pbXBvcnQge1xuICAgIGNvbnRlbnQgYXMgcmVjZW50UG9zdHNDb250ZW50VGVtcGxhdGUsXG4gICAgcGFnaW5hdG9yIGFzIHJlY2VudFBvc3RzUGFnaW5hdG9yVGVtcGxhdGUsXG59IGZyb20gJ2xpYi90ZW1wbGF0ZS1zdHJpbmdzL3JlY2VudC1wb3N0cyc7XG5cbkNvbXBvbmVudE1vZHVsZS5BZGRNb2R1bGUoJy5yZWNlbnQtcG9zdHMnLCB7XG4gICAgcHJlZml4OiAncmVjZW50LXBvc3RzLScsXG4gICAgY29tcG9uZW50czogW1xuICAgICAgICBmZXRjaGVyKHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RMb2FkOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAga2VlcENvbnRlbnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlOiBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmN1cnJlbnRMYW5nO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGFNYXJrZXQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZHJvcGRvd25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJEcm9wZG93blwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogdGhpcy5wYXJhbXMubWFya2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIk1hcmtldFwiLFxuICAgICAgICAgICAgICAgICAgICB9KTsgICAgICAgIFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGFUZWNobm9sb2d5OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImRyb3Bkb3duXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRHJvcGRvd25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHRoaXMucGFyYW1zLnRlY2hub2xvZ3ksXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVjaG5vbG9neVwiLFxuICAgICAgICAgICAgICAgICAgICB9KTsgICAgICAgIFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGFQcm9kdWN0TGluZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJkcm9wZG93blwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkRyb3Bkb3duXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiB0aGlzLnBhcmFtcy5wcm9kdWN0TGluZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCJQb3N0IFR5cGVcIixcbiAgICAgICAgICAgICAgICAgICAgfSk7ICAgICAgICBcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFyYW1zLmxhbmcgPSB0aGlzLmxhbmd1YWdlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgbG9hZE1vcmU6IGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZXRjaChmdW5jdGlvbihyZXNwb25zZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgX3Jlc3VsdHMgPSAgW107XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQga2VlcENvbnRlbnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzdWx0cywgLi4uZGF0YSB9ID0gcmVzcG9uc2UuZGF0YSB8fCB7fTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuZGF0YSAmJiBfdGhpcy5kYXRhLnJlc3VsdHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcmVzdWx0cyA9IF90aGlzLmRhdGEucmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwQ29udGVudCA9IF90aGlzLmRhdGEua2VlcENvbnRlbnQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmRhdGEgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uZGF0YSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzOiBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLl9yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5yZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2VlcENvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvd1BhZ2luYXRvcjogZGF0YS5jdXJyZW50UGFnZSA8IGRhdGEudG90YWxQYWdlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIH0sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMucGFyYW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6ICh0aGlzLmRhdGEgJiYgdGhpcy5kYXRhLm5leHRQYWdlKSB8fCAyLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiA4LFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAncmVjZW50LXBvc3RzLXBhZ2luYXRvcicgOiB7XG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnaXNTaG93J10sXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiByZWNlbnRQb3N0c1BhZ2luYXRvclRlbXBsYXRlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgJ3JlY2VudC1wb3N0cy1jb250ZW50JyA6IHtcbiAgICAgICAgICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogcmVjZW50UG9zdHNDb250ZW50VGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgIF1cbn0pO1xuIiwiaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICdsaWIvY29tcG9uZW50LW1vZHVsZSc7XG5pbXBvcnQgdGFicyBmcm9tICdsaWIvdGFicyc7XG5pbXBvcnQge1xuICAgIGNvbnRlbnRBcHBsaWNhdGlvbnMgYXMgY29udGVudEFwcGxpY2F0aW9uc1RlbXBsYXRlLFxufSBmcm9tICdsaWIvdGVtcGxhdGUtc3RyaW5ncy9zb2x1dGlvbi1hcmVhJztcbmltcG9ydCB7IGFwcGxpY2F0aW9uc01vZGFsIH0gZnJvbSBcIi4uL21vZGFsc1wiO1xuaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCBzdG9yZSBmcm9tIFwiLi4vc3RvcmVcIjtcblxuVnVlLnVzZShWTW9kYWwpO1xuXG5Db21wb25lbnRNb2R1bGUuQWRkTW9kdWxlKCcuc29sdXRpb24tYXJlYScsIHtcbiAgICBwcmVmaXg6ICdzb2x1dGlvbi1hcmVhLScsXG4gICAgY29tcG9uZW50czogW1xuICAgICAgICB0YWJzKHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuaGlkZSgnYXBwbGljYXRpb25zJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGNoYW5nZVRhYjogZnVuY3Rpb24oaWQpe1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VGFiICE9IGlkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSBpZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xvc2UgdGFiIGlmIGNsaWNrZWQgYWdhaW5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaG93TW9kYWwoKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGFwcHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuc29sdXRpb24tYXJlYV9fYXBwbGljYXRpb25zLWl0ZW0uYWN0aXZlJykuY2xvbmVOb2RlKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhhcHBsaWNhdGlvbnNNb2RhbC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uc01vZGFsLnRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb25zTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uc01vZGFsLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBhcHBsaWNhdGlvbnNNb2RhbC5ldmVudHMoYXBwcylcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaGlkZUFwcGxpY2F0aW9ucyA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuaGlkZSgnYXBwbGljYXRpb25zJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGVja0lzTW9iaWxlKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGlzIGNoZWNraW5nIGZvciBhIGJyZWFrcG9pbnQgKnNtYWxsZXIqIHRoYW5cbiAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGlzTW9iaWxlIGluIHN0b3JlLmpzXG4gICAgICAgICAgICAgICAgICAgIHZhciBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogNjUwcHgpJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSBtcWwubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIG1xbC5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSBtcWwubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxUb1RvcCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLnNvbHV0aW9uLWFyZWFfX2NvbnRlbnQtaXRlbS5hY3RpdmUnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGVsbU9mZnNldCA9IGVsLm9mZnNldFRvcDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNjcm9sbE9mZnNldCA9IHdpbmRvdy5zY3JvbGxZO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImVsXCIsZWxtT2Zmc2V0KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ3aW5kb3dcIixzY3JvbGxPZmZzZXQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWxtT2Zmc2V0IDwgc2Nyb2xsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWxtUG9zID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogKGVsbVBvcyAtIDcwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LDUwMCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICAgICAnYXBwbGljYXRpb25zLWNvbnRlbnQnOiB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdhcHBsaWNhdGlvbnMtY29udGVudCcsXG4gICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBjb250ZW50QXBwbGljYXRpb25zVGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgIHByb3BzOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZFRhYjogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUYWI6IFtTdHJpbmcsIE51bWJlcl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVDbGFzczoge3R5cGU6IFN0cmluZywgZGVmYXVsdDogJ2FjdGl2ZSd9LFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2U6IEZ1bmN0aW9uXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsIC8vc3RhdGljIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRHJhd2VyXCIsIC8vc3RhdGljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiT3BlblwiLCAvLyBzdGF0aWNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmxhYmVsLCAvLyBUYWIgbGFiZWwgZS5nLiBEaXN0cmljdCBzeXN0ZW0gYmFsYW5jaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibm9cIjogdGhpcy5pZFRhYiA8IDEwID8gYDAke3RoaXMuaWRUYWJ9YCA6IGAke3RoaXMuaWRUYWJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhYmVsID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNvbHV0aW9uLWFyZWFfX3RhYnMgbGknKSlbKHRoaXMuaWRUYWIgLSAxKV0uaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWJEYXRhOiB7XG4gICAgICAgICAgICAgICAgbGFiZWw6IG51bGxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0YWJPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJsYXllclwiLCAvL3N0YXRpYyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRHJhd2VyXCIsIC8vc3RhdGljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJPcGVuXCIsIC8vIHN0YXRpY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sYWJlbCwgLy8gVGFiIGxhYmVsIGUuZy4gRGlzdHJpY3Qgc3lzdGVtIGJhbGFuY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibm9cIjogdGhpcy5pZFRhYiA8IDEwID8gYDAke3RoaXMuaWRUYWJ9YCA6IGAke3RoaXMuaWRUYWJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuJGVsLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGFiQ29udGVudERhdGE6IHtcbiAgICAgICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRhYkNvbnRlbnRPcHRpb25zOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJsYXllclwiLCAvL3N0YXRpYyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRHJhd2VyXCIsIC8vc3RhdGljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogXCJPcGVuXCIsIC8vIHN0YXRpY1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5sYWJlbCwgLy8gVGFiIGxhYmVsIGUuZy4gRGlzdHJpY3Qgc3lzdGVtIGJhbGFuY2luZ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibm9cIjogdGhpcy5pZFRhYiA8IDEwID8gYDAke3RoaXMuaWRUYWJ9YCA6IGAke3RoaXMuaWRUYWJ9YFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zb2x1dGlvbi1hcmVhX190YWJzIGxpJykpWyh0aGlzLmlkVGFiIC0gMSldLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrSXNNb2JpbGUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICBdXG59KTtcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5cbmNvbnN0IHBhcmRvdEZvcm1JbnN0YW5jZSA9IFZ1ZS5jb21wb25lbnQoJ3BhcmRvdC1mb3JtJywge1xuICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICB9XG4gICAgfSxcbiAgICBjb21wdXRlZDoge1xuICAgICAgICBwYXJhbURhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgcmV0dXJuICh7XG4gICAgICAgICAgICAgICAgR0FJRDogc3RvcmUuc3RhdGUuR0FJRFxuICAgICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgIH0sXG4gICAgbWV0aG9kczoge1xuICAgICAgICBoYW5kbGVJZnJhbWUoKSB7XG4gICAgICAgICAgICBsZXQgaWZyYW1lID0gdGhpcy4kZWw7XG4gICAgICAgICAgICBsZXQgc3JjID0gdGhpcy4kZWwuZ2V0QXR0cmlidXRlKCdzcmMnKTtcblxuICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJtZXNzYWdlXCIsIChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5vcmlnaW4gPT0gXCJodHRwczovL2luZm8uYmFkZ2VybWV0ZXIuY29tXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZUlmcmFtZShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3N0RGF0YShldmVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBjb25zdCBwb3N0RGF0YSA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRoaXMucGFyYW1EYXRhKTtcbiAgICAgICAgICAgICAgICBpZiAoaWZyYW1lLmNvbnRlbnRXaW5kb3cpIHtcbiAgICAgICAgICAgICAgICAgICAgaWZyYW1lLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkodGhpcy5wYXJhbURhdGEpLCAnKicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmcmFtZS5vbmxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5jb250ZW50V2luZG93LnBvc3RNZXNzYWdlKEpTT04uc3RyaW5naWZ5KHRoaXMucGFyYW1EYXRhKSwgJyonKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgXG4gICAgICAgICAgICBjb25zdCBzaXplSWZyYW1lID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGRhdGEpO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLmZvcm0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCBzcmMuaW5jbHVkZXMoZGF0YS5mb3JtKSApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmcmFtZS5zdHlsZS5oZWlnaHQgPSBgJHtkYXRhLmNvbnRlbnQgKyAyMH1weGA7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YS5zdWJtaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU2Nyb2xsKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIFxuICAgICAgICB9LFxuICAgICAgICBjaGVja1Njcm9sbCgpIHtcbiAgICAgICAgICAgIGxldCBpZnJhbWUgPSB0aGlzLiRlbDtcbiAgICAgICAgICAgIGxldCBpZnJhbWVQb3MgPSBpZnJhbWUub2Zmc2V0VG9wO1xuICAgICAgICAgICAgbGV0IHNjcm9sbE9mZnNldCA9IHdpbmRvdy5zY3JvbGxZO1xuXG4gICAgICAgICAgICBpZiAoaWZyYW1lUG9zIDwgc2Nyb2xsT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVsbVBvcyA9IGlmcmFtZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cuc2Nyb2xsWSAtIDEwMDtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAoZWxtUG9zIC0gNzApLFxuICAgICAgICAgICAgICAgICAgICAgICAgYmVoYXZpb3I6ICdzbW9vdGgnXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sNTAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG4gICAgbW91bnRlZCgpIHtcbiAgICAgICAgdGhpcy5oYW5kbGVJZnJhbWUoKTtcbiAgICB9XG59KTtcblxuY29uc3QgcGFyZG90Rm9ybSA9ICgpID0+IHtcblxuICAgIGxldCBmb3JtcyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wYXJkb3QtZm9ybScpO1xuXG4gICAgbGV0IGZvcm1Db25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBwYXJkb3RGb3JtSW5zdGFuY2U7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5wYXJkb3QtZm9ybS0ke2lkfWAsXG4gICAgICAgIH0pLiRtb3VudChgLnBhcmRvdC1mb3JtLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKGZvcm1zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9ybXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgcGFyZG90LWZvcm0tJHtpbmRleH1gKTtcbiAgICAgICAgICAgIGZvcm1Db25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCB7cGFyZG90Rm9ybSwgcGFyZG90Rm9ybUluc3RhbmNlfTsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IFZNb2RhbCBmcm9tICd2dWUtanMtbW9kYWwnO1xuaW1wb3J0IHtwYXRlbnRzTW9kYWx9IGZyb20gJy4vbW9kYWxzJztcblxuVnVlLnVzZShWTW9kYWwpO1xuXG5jb25zdCBwYXRlbnRzID0gKCkgPT4ge1xuXG4gICAgbGV0IHBhdGVudEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBhdGVudHMnKTtcblxuICAgIGxldCBwYXRlbnRzQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgncGF0ZW50cycsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgYWxsUGF0ZW50czogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgdHJpZ2dlck1vZGFsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0ZW50c01vZGFsLnRlbXBsYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0ZW50c01vZGFsLm5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgcGF0ZW50c01vZGFsLm9wdGlvbnMsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXRlbnRzTW9kYWwuZXZlbnRzKHRoaXMuYWxsUGF0ZW50cylcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxQYXRlbnRzID0gdGhpcy4kcmVmcy5hbGxQYXRlbnRzO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5wYXRlbnRzLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAucGF0ZW50cy0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChwYXRlbnRJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHBhdGVudEl0ZW1zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHBhdGVudHMtJHtpbmRleH1gKTtcbiAgICAgICAgICAgIHBhdGVudHNDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IHBhdGVudHM7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcbmltcG9ydCBFdmVudEJ1cyBmcm9tICcuL2V2ZW50LWJ1cyc7XG5pbXBvcnQgYXhpb3MgZnJvbSAnYXhpb3MnO1xuaW1wb3J0IGZwb2RiIGZyb20gJy4uLy4uLy4uL2RiLmpzb24nO1xuaW1wb3J0IHsgZGVib3VuY2UgfSBmcm9tICcuL21pc2MnO1xuaW1wb3J0IHsgQWNjb3JkaW9uLCBTZWxlY3RlZEZpbHRlcnNDb21wb25lbnQsIENoZWNrYm94LCBQYWdpbmF0aW9uIH0gZnJvbSAnLi9maWx0ZXItY29tcG9uZW50cyc7XG5cbmNvbnN0IFByb2R1Y3RDYXRhbG9nID0gKCkgPT4ge1xuXG4gICAgbGV0IGNhdGFsb2cgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1jYXRhbG9nJyk7XG5cbiAgICBjb25zdCBwcm9kdWN0Q2F0YWxvZ0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3Byb2R1Y3QtY2F0YWxvZy10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRQYWdlOiAxLCAvL2N1cnJlbnQgcGFnZSAjXG4gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbFBhZ2VzOiBudWxsLCAvL3RvdGFsIHJldHVybnMgcGFnZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUmVzdWx0czogbnVsbCwgLy90b3RhbCByZXN1bHRzXG4gICAgICAgICAgICAgICAgICAgICAgICBzaG93blJlc3VsdHM6IG51bGwsIC8vdG90YWwgc2hvd24gaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnNWaXNpYmxlOiBudWxsLCAvL2FyZSBmaWx0ZXJzIHZpc2libGVcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlckFyZWFWaXNpYmxlOiB0cnVlLCAvL2lzIGZpbHRlciBhcmVhIChpbmNsdWRpbmcgdW5pdCB0b2dnbGVyIGFuZCBidG5zKSB2aXNpYmxlXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW1haWxEb2NzOiBbXSwgLy9mb3IgZW1haWxpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jczogW10sIC8vYm9va21hcmtlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzTGFiZWw6IG51bGwsIC8vbGFiZWwgZm9yIHNhdmVkIGRvY3NcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkRG9jc09ubHk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc01vYmlsZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5leHRBY3RpdmU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBwcmV2QWN0aXZlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXBpVXJsOiBudWxsLCAvL2ZvciBhcGkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAgICAgdXJsUGFyYW1zOiBudWxsLCAvL2ZvciBkZWVwbGlua2luZyBpbi1icm93c2VyXG4gICAgICAgICAgICAgICAgICAgICAgICBzaGFyZUFsbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFVuaXQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c0xhYmVsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY0xhYmVsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JlOiBzdG9yZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXdQcm9kdWN0TGFiZWw6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzczogJ3Byb2R1Y3QtY2F0YWxvZycsXG5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgJ2ZpbHRlci1hY2NvcmRpb24tdGVtcGxhdGUnOiBBY2NvcmRpb24sXG4gICAgICAgICAgICAgICAgJ3NlbGVjdGVkRmlsdGVycyc6IFNlbGVjdGVkRmlsdGVyc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAnY2hlY2tib3gtaXRlbSc6IENoZWNrYm94LFxuICAgICAgICAgICAgICAgICdwYWdpbmF0aW9uJzogUGFnaW5hdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5wcm9kdWN0SWRbMF0gPT0gXCJcIiA/IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5wcm9kdWN0SWQuc2xpY2UoMSkgOiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMucHJvZHVjdElkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRVbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLnVuaXRzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFnZVJhbmdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPiA5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYDEtJHt0aGlzLmRhdGEuc2hvd25SZXN1bHRzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLmRhdGEudG90YWxQYWdlcyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYCR7dGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAtIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgKyAxfS0ke3RoaXMuZGF0YS50b3RhbFJlc3VsdHN9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAkeyh0aGlzLmRhdGEuc2hvd25SZXN1bHRzICogKHRoaXMuZGF0YS5jdXJyZW50UGFnZSAtIDEpKSArIDF9LSR7dGhpcy5kYXRhLnNob3duUmVzdWx0cyAqIHRoaXMuZGF0YS5jdXJyZW50UGFnZX1gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5zaG93blJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRVbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNlbGVjdGVkVW5pdCA9IHRoaXMuY29tcHV0ZWRVbml0O1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInVuaXQgY2hhbmdlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRVcmwoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy51cGRhdGVIaXN0b3J5KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3MgPSB0aGlzLnNhdmVkO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzYXZlZCBvbmx5IGZpbHRlciBpZiBubyBzYXZlZCBpdGVtc1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5zYXZlZC5sZW5ndGggPT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YoJ3NhdmVkRG93bmxvYWRzJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHRoaXMuY29tcHV0ZWRJc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuY29tcHV0ZWRJc01vYmlsZSA/IHRydWUgOiB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEuZmlsdGVyc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7IC8vIGhhbmRsZSBhcGkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZUhpc3RvcnkoKTsgLy8gaGFuZGxlIGhpc3RvcnkgcmVjb3JkXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc2V0IHNhdmVkRG9jc09ubHkgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNhdmVkT25seSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2F2ZWRQcm9kdWN0c1wiO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jc09ubHkgPSBzYXZlZE9ubHkgPyBzYXZlZE9ubHkudmFsdWUgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLmN1cnJlbnRQYWdlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kYXRhLmN1cnJlbnRQYWdlID09IHRoaXMuZGF0YS50b3RhbFBhZ2VzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMudXBkYXRlSGlzdG9yeSgpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJkYXRhLnRvdGFsUmVzdWx0c1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0UGFnZXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZUZpbHRlcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiY2xpY2tlZFwiKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJpcyBtb2JpbGVcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSAhdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB1cGRhdGVGaWx0ZXJzKGVsLCBlLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gZS5jdXJyZW50VGFyZ2V0LnBhcmVudE5vZGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgY2hlY2tlZCA9IGUuY3VycmVudFRhcmdldC5jaGVja2VkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxOyAvL3Jlc2V0IHBhZ2UgdG8gMVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChjaGVja2VkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtZWFzdXJpbmdNZWRpdW1cIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lYXN1cmVGaWx0ZXIgPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG1lYXN1cmVGaWx0ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWVhc3VyZUZpbHRlci5pbmRleE9mKCdtZWFzdXJpbmdNZWRpdW0nKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSBtZWFzdXJlRmlsdGVyLmluZGV4T2YoJ21lYXN1cmluZ01lZGl1bScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcInZhbHVlXCI6IHZhbHVlLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogdHlwZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IGxhYmVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XCJ2YWx1ZVwiOiB2YWx1ZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHR5cGUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJzYXZlZFByb2R1Y3RzXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtcInZhbHVlXCI6IGNoZWNrZWQsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IHR5cGUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IGxhYmVsfV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XCJ2YWx1ZVwiOiB2YWx1ZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogdHlwZSwgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcIm5hbWVcIjogbGFiZWx9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJJTkRFWFwiLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coXCJ1cGRhdGVGaWx0ZXJzIC0gdGhpcy5kYXRhLmZpbHRlcnM9XCIsIHRoaXMuZGF0YS5maWx0ZXJzKTtcblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlUmFuZ2VGaWx0ZXIoZW50cnkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsgLy9yZXNldCBwYWdlIHRvIDEgd2hlbiBmaWx0ZXJzIGNoYW5nZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZW50cnkpO1xuICAgICAgICAgICAgICAgICAgICAvLyBhbGxvdyBvbmx5IG9uY2UgaW5zdGFuY2Ugb2YgZmlsdGVyIHR5cGUgYXQgb25jZSBmb3IgcmFuZ2VzXG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlcyA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudHlwZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVzLmluZGV4T2YoZW50cnkudHlwZSkgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdHlwZXMuaW5kZXhPZihlbnRyeS50eXBlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5maWx0ZXJzW2luZGV4XS52YWx1ZSA9PSBlbnRyeS52YWx1ZSAmJiB0aGlzLmRhdGEuZmlsdGVyc1tpbmRleF0udHlwZSA9PSBlbnRyeS50eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgb2xkIGFuZCBuZXcgZW50cmllcyBhcmUgdGhlIHNhbWUsIGRvIG5vdGhpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXBkYXRlIGZpbHRlcnMgaWYgbmV3IGVudHJ5IHZhbHVlcyBkaWZmZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIGVudHJ5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIGVudHJ5XTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywgZW50cnldO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlcyBzcGVjaWZpYyBmaWx0ZXJcbiAgICAgICAgICAgICAgICByZW1vdmVGaWx0ZXIoZWwsIHZhbHVlLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbCAhPT0gdGhpcy5kYXRhLmNsYXNzKSB7IHJldHVybjsgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudHlwZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwicmVtb3ZlXCIsIGluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBjbGVhcnMgZmlsdGVyc1xuICAgICAgICAgICAgICAgIHJlbW92ZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsgLy9yZXNldCBwYWdlIHRvIDFcbiAgICAgICAgICAgICAgICB9LCAgXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZ2V0VXJsKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRQYXJhbXMgPSB0aGlzLmRhdGEuc2F2ZWREb2NzLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1bml0UGFyYW1zID0gdGhpcy5jb21wdXRlZFVuaXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG1hcmtldFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJtYXJrZXRcIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdENhdFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcm9kdWN0Q2F0ZWdvcnlcIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN1YnBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzdWJwYXJhbVwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0VHlwZVBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcm9kdWN0VHlwZVwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0TGluZVBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcm9kdWN0TGluZVwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBtZWFzdXJpbmdQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwibWVhc3VyaW5nTWVkaXVtXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcyA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzYXZlZE9ubHkgPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZFByb2R1Y3RzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNhdmVkT25seSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzYXZlZE9ubHkudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYWdlUGFyYW1zID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzaXplTWluUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNpemVNaW5cIlxuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemVNYXhQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2l6ZU1heFwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wTWluUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInRlbXBlcmF0dXJlTWluXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wTWF4UGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInRlbXBlcmF0dXJlTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByZXNzdXJlTWluUGFyYW1zID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInByZXNzdXJlTWluXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcmVzc3VyZU1heFBhcmFtcyA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbHRlcihpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJwcmVzc3VyZU1heFwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KS50b1N0cmluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG93UmFuZ2VNaW5QYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwiZmxvd1JhbmdlTWluXCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG93UmFuZ2VNYXhQYXJhbXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwiZmxvd1JhbmdlTWF4XCJcbiAgICAgICAgICAgICAgICAgICAgfSkubWFwKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBmbG93UmFuZ2VUeXBlID0gdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcImZsb3dSYW5nZU1heFwiIHx8IGl0ZW0udHlwZSA9PSBcImZsb3dSYW5nZU1pblwiXG4gICAgICAgICAgICAgICAgICAgIH0pLm1hcChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLmZsb3dSYW5nZVR5cGU7XG4gICAgICAgICAgICAgICAgICAgIH0pLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnVybFBhcmFtcyA9IGAke3VuaXRQYXJhbXMgIT09IFwiXCIgPyBcIiZ1bml0cz1cIiArIHVuaXRQYXJhbXMgOiBcIlwifSR7bWFya2V0UGFyYW1zICE9PSBcIlwiID8gXCImbWFya2V0PVwiICsgbWFya2V0UGFyYW1zIDogXCJcIn0ke3Byb2R1Y3RDYXRQYXJhbXMgIT09IFwiXCIgPyBcIiZwcm9kdWN0Q2F0ZWdvcnk9XCIgKyBwcm9kdWN0Q2F0UGFyYW1zIDogXCJcIn0ke3Byb2R1Y3RUeXBlUGFyYW1zICE9PSBcIlwiID8gXCImcHJvZHVjdFR5cGU9XCIgKyBwcm9kdWN0VHlwZVBhcmFtcyA6IFwiXCJ9JHtwcm9kdWN0TGluZVBhcmFtcyAhPT0gXCJcIiA/IFwiJnByb2R1Y3RMaW5lPVwiICsgcHJvZHVjdExpbmVQYXJhbXMgOiBcIlwifSR7bWVhc3VyaW5nUGFyYW1zICE9PSBcIlwiID8gXCImbWVhc3VyaW5nTWVkaXVtPVwiICsgbWVhc3VyaW5nUGFyYW1zIDogXCJcIn0mc2F2ZWRQcm9kdWN0cz0ke3NhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpfSR7c3VicGFyYW1zICE9PSBcIlwiID8gXCImc3VicGFyYW09XCIgKyBzdWJwYXJhbXMgOiBcIlwifSZwYWdlPSR7cGFnZVBhcmFtc31gO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGFwaVVybCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5hcGlVcmwgPSBhcGlVcmw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJhcGkvZG9jdW1lbnRzP1wiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFVybCgpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZVVybCA9IHdpbmRvdy5wcm9kdWN0Q2F0YWxvZ0FQSVVybDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaVVybCA9IGAke2Jhc2VVcmx9JHtiYXNlVXJsLmluZGV4T2YoJz8nKSA+IC0xID8gJycgOiAnPyd9YDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL3Byb2R1Y3RzXCI7IC8vZnJvbSBqc29uLXNlcnZlclxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvcHJvZHVjdHNUZXN0XCI7IC8vZnJvbSBqc29uLXNlcnZlclxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNhdmVkT25seSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoaXRlbSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSBcInNhdmVkUHJvZHVjdHNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXJrZXQgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2R1Y3RDYXRlZ29yeSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB2YXIgcHJvZHVjdFR5cGUgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2R1Y3RMaW5lID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBzdWJwYXJhbSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGl0ZW0udHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJtYXJrZXRcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0LnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJwcm9kdWN0Q2F0ZWdvcnlcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdENhdGVnb3J5LnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJwcm9kdWN0TGluZVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0TGluZS5wdXNoKGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHJvZHVjdFR5cGVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGUucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInN1YnBhcmFtXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnBhcmFtLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRWYWx1ZSA9IChwYXJhbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlciA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09PSBwYXJhbTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlciA/IGZpbHRlci52YWx1ZSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBjb25zdCBnZXRGbG93UmFuZ2VUeXBlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlciA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09PSBcImZsb3dSYW5nZU1pblwiIHx8IGl0ZW0udHlwZSA9PT0gXCJmbG93UmFuZ2VNYXhcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlciA/IGZpbHRlci5mbG93UmFuZ2VUeXBlIDogbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGxldCBheGlvc1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxhbmd1YWdlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHM6IHRoaXMuY29tcHV0ZWRVbml0LFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFya2V0OiBtYXJrZXQuam9pbignfCcpID09IFwiXCIgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KG1hcmtldC5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdENhdGVnb3J5OiBwcm9kdWN0Q2F0ZWdvcnkuam9pbignfCcpID09IFwiXCIgPyBudWxsIDogZGVjb2RlVVJJQ29tcG9uZW50KHByb2R1Y3RDYXRlZ29yeS5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdFR5cGU6IHByb2R1Y3RUeXBlLmpvaW4oJ3wnKSA9PSBcIlwiID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChwcm9kdWN0VHlwZS5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdExpbmU6IHByb2R1Y3RMaW5lLmpvaW4oJ3wnKSA9PSBcIlwiID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChwcm9kdWN0TGluZS5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZU1pbjogZ2V0VmFsdWUoJ3NpemVNaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpemVNYXg6IGdldFZhbHVlKCdzaXplTWF4JyksXG4gICAgICAgICAgICAgICAgICAgICAgICBmbG93UmFuZ2VUeXBlOiBnZXRGbG93UmFuZ2VUeXBlKCksXG4gICAgICAgICAgICAgICAgICAgICAgICBmbG93UmFuZ2VNaW46IGdldFZhbHVlKCdmbG93UmFuZ2VNaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZsb3dSYW5nZU1heDogZ2V0VmFsdWUoJ2Zsb3dSYW5nZU1heCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyaW5nTWVkaXVtOiBnZXRWYWx1ZSgnbWVhc3VyaW5nTWVkaXVtJykgPT0gbnVsbCA/IG51bGwgOiBkZWNvZGVVUklDb21wb25lbnQoZ2V0VmFsdWUoJ21lYXN1cmluZ01lZGl1bScpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlTWluOiBnZXRWYWx1ZSgndGVtcGVyYXR1cmVNaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBlcmF0dXJlTWF4OiBnZXRWYWx1ZSgndGVtcGVyYXR1cmVNYXgnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzdXJlTWluOiBnZXRWYWx1ZSgncHJlc3N1cmVNaW4nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByZXNzdXJlTWF4OiBnZXRWYWx1ZSgncHJlc3N1cmVNYXgnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkUHJvZHVjdHM6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc3VicGFyYW06IHN1YnBhcmFtLmpvaW4oJ3wnKSA9PSBcIlwiID8gbnVsbCA6IGRlY29kZVVSSUNvbXBvbmVudChzdWJwYXJhbS5qb2luKCd8JykpLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpID09IFwiXCIgPyBudWxsIDogdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JykuY2hhckF0KDApID09IFwiLFwiID8gdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8Jykuc2xpY2UoMSkgOiB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuZGF0YS5jdXJyZW50UGFnZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplOiA5LFxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYXhpb3NQYXJhbXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldChhcGlVcmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmF4aW9zUGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnJlc3VsdHM7ICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEudG90YWxSZXN1bHRzID0gcmVzcG9uc2UuZGF0YS50b3RhbFJlc3VsdHMgPyByZXNwb25zZS5kYXRhLnRvdGFsUmVzdWx0cyA6IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnNob3duUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0cyA/IHJlc3BvbnNlLmRhdGEucmVzdWx0cy5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS52aWV3UHJvZHVjdExhYmVsID0gcmVzcG9uc2UuZGF0YS52aWV3UHJvZHVjdExhYmVsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNhdGNoKGZ1bmN0aW9uKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VQYWdlKGRpcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IFwicHJldlwiICYmIHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlLS07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyID09IFwibmV4dFwiICYmIHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzY3JvbGwtdG8tdG9wJywgdGhpcy5kYXRhLmNsYXNzKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUVtYWlsRG9jcyhkYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpdGVtID0gdGhpcy5kYXRhLmVtYWlsRG9jcy5maW5kKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uaWQgPT0gZGF0YS5pZDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFpdGVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZW1haWxEb2NzID0gWy4uLnRoaXMuZGF0YS5lbWFpbERvY3MsIGRhdGFdO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmVtYWlsRG9jcy5zcGxpY2UodGhpcy5kYXRhLmVtYWlsRG9jcy5pbmRleE9mKGl0ZW0pLDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvL3VwZGF0ZSBoaXN0b3J5IHJlY29yZCB3aGVuIGZpbHRlcnMgY2hhbmdlXG4gICAgICAgICAgICAgICAgdXBkYXRlSGlzdG9yeSgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHVybCA9IGAke3dpbmRvdy5sb2NhdGlvbi5wYXRobmFtZX0/JHt0aGlzLmRhdGEudXJsUGFyYW1zfWA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoaXN0b3J5LnN0YXRlID09IG51bGwgfHwgaGlzdG9yeS5zdGF0ZSAhPT0gdXJsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnB1c2hTdGF0ZSh1cmwsXCJcIix1cmwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBoYW5kbGUgZGVlcCBsaW5raW5nIG9uIGhpc3RvcnkgY2hhbmdlXG4gICAgICAgICAgICAgICAgZGVlcGxpbmsoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnN1YnN0cigxKS5zcGxpdChcIiZcIikuZmlsdGVyKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gIT0gXCJcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLmZpbHRlcnMgPSBbXTsgLy9jbGVhciBmaWx0ZXJzIGFycmF5IGZpcnN0XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGluaXRGaWx0ZXJzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLmZvckVhY2gocGFyYW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHR5cGUgPSBwYXJhbS5zbGljZSgwLCBwYXJhbS5pbmRleE9mKCc9JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBwYXJhbS5zbGljZShwYXJhbS5pbmRleE9mKCc9JykgKyAxKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiVFlQRVwiLHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJDT05URU5UXCIsIGNvbnRlbnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7fVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gXCJwYWdlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSBwYXJzZUludChjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInVuaXRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0ID0gY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBcInNhdmVkUHJvZHVjdHNcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50ID09IFwiZmFsc2VcIiB8fCBjb250ZW50ID09IGZhbHNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IHRoaXMuZGF0YS5zYXZlZERvY3NMYWJlbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pbml0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbnRlbnQuaW5kZXhPZignLCcpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEFycmF5ID0gY29udGVudC5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcnJheS5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ2YWx1ZVwiOiBpdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJuYW1lXCI6IGRlY29kZVVSSUNvbXBvbmVudChpdGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEZpbHRlcnMgPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pbml0RmlsdGVycyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiB0eXBlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInZhbHVlXCI6IGNvbnRlbnQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBkZWNvZGVVUklDb21wb25lbnQoY29udGVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0RmlsdGVycyA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uaW5pdEZpbHRlcnMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IGluaXRGaWx0ZXJzO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLmluaXRGaWx0ZXJzKTtcblxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRvZ2dsZVVuaXRzKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3NldFVuaXRzJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzY3JvbGxUb1RvcChlbCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9XG4gICAgICAgICAgICAgICAgICAgIGxldCB0b3AgPSB0aGlzLiRlbC5xdWVyeVNlbGVjdG9yKCcucHJvZHVjdC1jYXRhbG9nX19hcmVhLWNhcmRzJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFkgLSAxMDA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRvcCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0UGFnZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRvdGFsIHJlc3VsdCBjb3VudCwgZGl2aWRlIGJ5IDEwIHRvIGdldCB0b3RhbCBwYWdlcyBuZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0aCBjZWlsIHRvIHJvdW5kIHVwXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBhY3RpdmUgZm9yIHByZXYvbmV4dCBiYXNlZCBvbiBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgLy8gOSA9IHBhZ2Ugc2l6ZVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudG90YWxQYWdlcyA9IE1hdGguY2VpbCh0aGlzLmRhdGEudG90YWxSZXN1bHRzIC8gOSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSAxID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbml0IGRhdGEgdmFyaWFibGVzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2F2ZWREb2NzID0gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLnByb2R1Y3RJZFswXSA9PSBcIlwiID8gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLnByb2R1Y3RJZC5zbGljZSgxKSA6IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5wcm9kdWN0SWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zZWxlY3RlZFVuaXQgPSBzdG9yZS5zdGF0ZS51bml0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gdGhpcy5kYXRhLmlzTW9iaWxlID8gZmFsc2UgOiB0cnVlOyAvL2luaXQgc2hvdy9oaWRlIGZpbHRlcnMgaWYvaXMgbW9iaWxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJBcmVhVmlzaWJsZSA9IHBhcnNlSW50KHRoaXMuZGF0YS50b3RhbFJlc3VsdHMpIDw9IDEwID8gZmFsc2UgOiB0cnVlOyAvLyBoaWRlIGZpbHRlcnMgaWYgbGVzcyB0aGVuIDEwIGluaXRpYWwgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2hhcmVBbGwgPSBwYXJzZUludCh0aGlzLmRhdGEudG90YWxSZXN1bHRzKSA8PSA1ID8gdHJ1ZSA6IGZhbHNlOyAvLyBlbmFibGUgXCJzaGFyZSBhbGxcIiBpZiA1IG9mIGxlc3MgcmVzdWx0c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudXNMYWJlbCA9IHRoaXMuJHJlZnMudW5pdFRvZ2dsZXIuZGF0YXNldC51c0xhYmVsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubWV0cmljTGFiZWwgPSB0aGlzLiRyZWZzLnVuaXRUb2dnbGVyLmRhdGFzZXQubWV0cmljTGFiZWw7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCBldmVudGJ1cyBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCd1cGRhdGVGaWx0ZXJzJywgKGVsLCBlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCd1cGRhdGVSYW5nZUZpbHRlcicsIChlbnRyeSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVSYW5nZUZpbHRlcihlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3JlbW92ZS1maWx0ZXInLCAoZWwsIHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdjaGFuZ2UtcGFnZS10bycsIChlbCwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gbnVtO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdlbWFpbC1kb2NzJywgKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRW1haWxEb2NzKGRhdGEpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdzY3JvbGwtdG8tdG9wJywgKGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvVG9wKGVsKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCBpbml0aWFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5kZWZhdWx0RmlsdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5wdXNoKHdpbmRvdy5kZWZhdWx0RmlsdGVyKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsUHJvZHVjdEFwaVJlc3VsdHMucmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA9IHdpbmRvdy5pbml0aWFsUHJvZHVjdEFwaVJlc3VsdHMgPyB3aW5kb3cuaW5pdGlhbFByb2R1Y3RBcGlSZXN1bHRzLnRvdGFsUmVzdWx0cyA6IDA7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbFByb2R1Y3RBcGlSZXN1bHRzLnJlc3VsdHMgPyB3aW5kb3cuaW5pdGlhbFByb2R1Y3RBcGlSZXN1bHRzLnJlc3VsdHMubGVuZ3RoIDogMDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnZpZXdQcm9kdWN0TGFiZWwgPSB3aW5kb3cuaW5pdGlhbFByb2R1Y3RBcGlSZXN1bHRzID8gd2luZG93LmluaXRpYWxQcm9kdWN0QXBpUmVzdWx0cy52aWV3UHJvZHVjdExhYmVsIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEucmVzdWx0cyA9IGZwb2RiLnByb2R1Y3RzLnJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPSBmcG9kYi5wcm9kdWN0cy50b3RhbFJlc3VsdHM7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5zaG93blJlc3VsdHMgPSBmcG9kYi5wcm9kdWN0cy5yZXN1bHRzID8gZnBvZGIucHJvZHVjdHMucmVzdWx0cy5sZW5ndGggOiAwO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEudmlld1Byb2R1Y3RMYWJlbCA9IGZwb2RiLnByb2R1Y3RzLnZpZXdQcm9kdWN0TGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3cub25wb3BzdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGVlcGxpbmsoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICAgICAgLy8gZm9yIGRlZXBsaW5raW5nXG4gICAgICAgICAgICAgICAgLy8gaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5kZWVwbGluaygpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgLy8gcmVzdWx0cyBsaXN0XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3Byb2R1Y3QtcmVzdWx0cy1saXN0Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwcm9kdWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhdGFsb2dfX2NhcmRzLWNvbnRlbnRcIiA6ZGF0YT1cImRhdGFcIj5cbiAgICAgICAgICAgICAgICA8cHJvZHVjdC1yZXN1bHRzLWl0ZW0gdi1mb3I9XCIocmVzdWx0LCBpbmRleCkgaW4gZGF0YS5yZXN1bHRzXCIgOmNvbnRlbnQ9XCJyZXN1bHRcIiA6a2V5PVwiaW5kZXhcIiA6aW5kZXg9XCJpbmRleFwiIDpkYXRhPVwiZGF0YVwiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc2luZ2xlIHJlc3VsdHMgaXRlbVxuICAgICAgICBWdWUuY29tcG9uZW50KCdwcm9kdWN0LXJlc3VsdHMtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnY29udGVudCcsICdpbmRleCddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXNCb29rbWFya2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuY29udGVudC5pZCB8fCBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzLnByb2R1Y3RJZDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRhZ2dpbmdNZXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImxheWVyXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiUHJldmlldyBDYXJkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInByb2R1Y3RMaW5lXCI6IHRoaXMuY29udGVudC5icmFuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5jb250ZW50LnByb2R1Y3ROYW1lID8gdGhpcy5jb250ZW50LnByb2R1Y3ROYW1lLnJlcGxhY2UoJzxwPicsICcnKS5yZXBsYWNlKCc8L3A+JywnJykgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJub1wiOiB0aGlzLmluZGV4IDwgMTAgPyBgMCR7dGhpcy5pbmRleCArIDF9YCA6ICh0aGlzLmluZGV4ICsgMSkudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKHRoaXMuaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJjb250ZW50XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5jb250ZW50LmlkIHx8IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyh0aGlzLmlkKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRhbG9nLWNhcmRcIiA6ZGF0YT1cImRhdGFcIiA6Y2xhc3M9XCJ7J2hpZGUtYm9va21hcmsnOiAoZGF0YS5zYXZlZERvY3NPbmx5ID09PSB0cnVlKSAmJiAoaXNCb29rbWFya2VkID09PSBmYWxzZSl9XCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgOmRhdGEtdGFnLW1ldGE9XCJ0YWdnaW5nTWV0YVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRhbG9nLWNhcmRfX3Jvd1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0YWxvZy1jYXJkX19hcmVhIGNhdGFsb2ctY2FyZF9fYXJlYS11dGlsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0YWxvZy1jYXJkX191dGlsLWJvb2ttYXJrXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJjYXRhbG9nLWNhcmRfX2Jvb2ttYXJrXCIgOmNsYXNzPVwie2FjdGl2ZTogaXNCb29rbWFya2VkfVwiIDpkYXRhLXByb2R1Y3QtaWQ9XCJjb250ZW50LmlkXCIgcmVmPVwiYm9va21hcmtcIiB2LW9uOmNsaWNrPVwiaGFuZGxlQm9va21hcmtcIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwibGF5ZXJcIiwgXCJjYXRlZ29yeVwiOiBcIlByb2R1Y3RcIiwgXCJhY3Rpb25cIjogXCJGYXZvcml0ZVwifSc+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGFsb2ctY2FyZF9fYXJlYSBjYXRhbG9nLWNhcmRfX2FyZWEtaGVhZGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0YWxvZy1jYXJkX19pbWFnZS1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cImNvbnRlbnQudXJsXCIgY2xhc3M9XCJjYXRhbG9nLWNhcmRfX2xpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBjbGFzcz1cImNhdGFsb2ctY2FyZF9faW1hZ2VcIiA6c3JjPVwiY29udGVudC5wcm9kdWN0SW1hZ2VVcmxcIiA6YWx0PVwiY29udGVudC5wcm9kdWN0SW1hZ2VVcmxBbHRUZXh0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIDpzcmM9XCJjb250ZW50LmJyYW5kSW1hZ2VVcmxcIiA6YWx0PVwiY29udGVudC5icmFuZEltYWdlVXJsQWx0VGV4dFwiIGNsYXNzPVwiY2F0YWxvZy1jYXJkX19sb2dvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSA6aHJlZj1cImNvbnRlbnQudXJsXCIgdi1odG1sPVwiY29udGVudC5wcm9kdWN0TmFtZVwiIGNsYXNzPVwiY2F0YWxvZy1jYXJkX190aXRsZVwiPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGFsb2ctY2FyZF9fYXJlYSBjYXRhbG9nLWNhcmRfX2FyZWEtc3RhdHNcIj5cblxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGFsb2ctY2FyZF9fc3RhdFwiIHYtZm9yPVwiKHNwZWMsIGluZGV4KSBpbiBjb250ZW50LnN0YXRzXCIgOmtleT1cImluZGV4XCIgOmRhdGE9XCJkYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhdGFsb2ctY2FyZF9fc3RhdC1sYWJlbFwiIHYtaHRtbD1cInNwZWMubGFiZWxcIj57e3NwZWMubGFiZWx9fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYXRhbG9nLWNhcmRfX3N0YXQtdmFsdWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVuaXQtbWV0cmljIFwiIHYtaWY9XCJkYXRhLnNlbGVjdGVkVW5pdCA9PT0gJ21ldHJpYydcIiB2LWh0bWw9XCJzcGVjLnZhbHVlTWV0cmljXCI+e3tzcGVjLnZhbHVlTWV0cmljfX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInVuaXQtdXNcIiB2LWlmPVwiZGF0YS5zZWxlY3RlZFVuaXQgPT09ICd1cydcIiB2LWh0bWw9XCJzcGVjLnZhbHVlSW1wZXJpYWxcIj57e3NwZWMudmFsdWVJbXBlcmlhbH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2F0YWxvZy1jYXJkX19hcmVhIGNhdGFsb2ctY2FyZF9fYXJlYS1jdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwiY29udGVudC51cmxcIiBjbGFzcz1cImJ1dHRvbiB0ZXJ0aWFyeS1idXR0b25cIj48c3BhbiBjbGFzcz1cImJ1dHRvbi10ZXh0XCI+e3tkYXRhLnZpZXdQcm9kdWN0TGFiZWx9fTwvc3Bhbj4gPHNwYW4gY2xhc3M9XCJidXR0b24taWNvblwiPjwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwcm9kdWN0SWRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogdGhpcy5pc0Jvb2ttYXJrZWQgPyBcInJlbW92ZVwiIDogXCJhZGRcIlxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgc3RvcmUuZGlzcGF0Y2goJ2NoZWNrRmF2b3JpdGVzJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5wcm9kdWN0SWQ7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJzYXZlZFwiLHRoaXMuc2F2ZWQpO1xuICAgICAgICAgICAgICAgIHRoaXMuaXNCb29rbWFya2VkID0gdGhpcy5zYXZlZC5pbmNsdWRlcyhgJHt0aGlzLmlkfWApID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdlbWFpbC1kb2NzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWFpbHRvOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBtYWlsdG9BbGw6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBcImRhdGEuZW1haWxEb2NzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWFpbHRvID0gXCJtYWlsdG86P3N1YmplY3Q9QmFkZ2VyJTIwTWV0ZXIlMjBEb2N1bWVudCUyMExpbmtzJmJvZHk9XCI7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5lbWFpbERvY3MuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1haWx0byA9IGAke21haWx0b30ke2VuY29kZVVSSUNvbXBvbmVudChpdGVtLm5hbWUpfTogJHtpdGVtLnVybH0lMEQlMEFgO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYWlsdG8gPSBtYWlsdG87XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBzaGFyZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG1haWx0byA9IFwibWFpbHRvOj9zdWJqZWN0PUJhZGdlciUyME1ldGVyJTIwRG9jdW1lbnQlMjBMaW5rcyZib2R5PVwiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucmVzdWx0cy5mb3JFYWNoKGl0ZW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFpbHRvID0gYCR7bWFpbHRvfSR7ZW5jb2RlVVJJQ29tcG9uZW50KGl0ZW0ubmFtZSl9OiAke2l0ZW0udXJsfSUwRCUwQWA7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1haWx0b0FsbCA9IG1haWx0bztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQodGhpcy5kYXRhLnRvdGFsUmVzdWx0cykgPD0gNSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNoYXJlQWxsKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdtaW4tbWF4Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWU6IG51bGwsIC8vZmluYWwgdmFsdWVzIHRvIHNlbmQgdG8gYXBpXG4gICAgICAgICAgICAgICAgICAgIG1pblZhbHVlUmFuZ2U6IG51bGwsIC8vIG1vZGVsIGZvciByYW5nZSBzbGlkZXJcbiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWVJbnB1dDogbnVsbCwgLy8gbW9kZWwgZm9yIGlucHV0IGZpZWxkXG4gICAgICAgICAgICAgICAgICAgIG1heFZhbHVlOiBudWxsLCAvL2ZpbmFsIHZhbHVlcyB0byBzZW5kIHRvIGFwaVxuICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZVJhbmdlOiBudWxsLCAvLyBtb2RlbCBmb3IgcmFuZ2Ugc2xpZGVyXG4gICAgICAgICAgICAgICAgICAgIG1heFZhbHVlSW5wdXQ6IG51bGwsIC8vIG1vZGVsIGZvciBpbnB1dCBmaWVsZFxuXG4gICAgICAgICAgICAgICAgICAgIHVzTWluOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICB1c01heDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgdXNTdGVwOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBtZXRyaWNNaW46IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG1ldHJpY01heDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgbWV0cmljU3RlcDogbnVsbCxcblxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWluOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWF4OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBudWxsLFxuXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRVbml0OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHlwZXMgPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnR5cGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHR5cGVzLmluZGV4T2YoYCR7dGhpcy50eXBlfU1pbmApID4gLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoISh0eXBlcy5pbmRleE9mKGAke3RoaXMudHlwZX1NYXhgKSA+IC0xKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5zZWxlY3RlZFVuaXRcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEN1cnJlbnRVbml0cygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRVbml0TGFiZWwoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXQgc2VsZWN0b3JzIHdoZW4gdW5pdHMgY2hhbmdlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZVJhbmdlID0gdGhpcy5jdXJyZW50TWluO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlUmFuZ2UgPSB0aGlzLmN1cnJlbnRNYXg7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgaW5wdXRzIGFuZCBpbnB1dCBmaWx0ZXJzIHdoZW4gY2hhbmdpbmcgdW5pdHNcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsIG51bGwsIGAke3RoaXMudHlwZX1NaW5gKTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsIG51bGwsIGAke3RoaXMudHlwZX1NYXhgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwibWluVmFsdWVcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIGF0IG1heCB2YWx1ZSwgc2V0IHRvIG51bGwgZm9yICdubyBtaW4nIGFuZCByZW1vdmUgZmlsdGVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGlmIHZhbHVlIGV4Y2VlZHMgbWluIG9yIG1heCByYW5nZSwgc2V0IHRvIG9uZSBzdGVwIHVuZGVyIG1heCB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5WYWx1ZSA9PSB0aGlzLmN1cnJlbnRNaW4gfHwgdGhpcy5taW5WYWx1ZSA9PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdyZW1vdmUtZmlsdGVyJywgdGhpcy5kYXRhLmNsYXNzLCBudWxsLCBgJHt0aGlzLnR5cGV9TWluYCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyc2VGbG9hdCh0aGlzLm1pblZhbHVlKSA8IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50TWluKSB8fCBwYXJzZUZsb2F0KHRoaXMubWluVmFsdWUpID4gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRNYXgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLm1pblZhbHVlID0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRNaW4pID09PSAwID8gMCA6IChwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1pbikgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgYCR7dGhpcy50eXBlfU1pbmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzKFwiTWluXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlUmFuZ2UgPSB0aGlzLm1pblZhbHVlID09IG51bGwgPyB0aGlzLmN1cnJlbnRNaW4gOiB0aGlzLm1pblZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlSW5wdXQgPSB0aGlzLm1pblZhbHVlO1xuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcIm1heFZhbHVlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpZiBhdCBtYXggdmFsdWUsIHNldCB0byBudWxsIGZvciAnbm8gbWF4JyBhbmQgcmVtb3ZlIGZpbHRlclxuICAgICAgICAgICAgICAgICAgICAvLyBpZiB2YWx1ZSBleGNlZWRzIG1pbiBvciBtYXggcmFuZ2UsIHNldCB0byBvbmUgc3RlcCB1bmRlciBtYXggdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF4VmFsdWUgPT0gdGhpcy5jdXJyZW50TWF4IHx8IHRoaXMubWF4VmFsdWUgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgYCR7dGhpcy50eXBlfU1heGApO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlRmxvYXQodGhpcy5tYXhWYWx1ZSkgPiBwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1heCkgfHwgcGFyc2VGbG9hdCh0aGlzLm1heFZhbHVlKSA8IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50TWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5tYXhWYWx1ZSA9IChwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1heCkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgYCR7dGhpcy50eXBlfU1heGApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVGaWx0ZXJzKFwiTWF4XCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlUmFuZ2UgPSB0aGlzLm1heFZhbHVlID09IG51bGwgPyB0aGlzLmN1cnJlbnRNYXggOiB0aGlzLm1heFZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlSW5wdXQgPSB0aGlzLm1heFZhbHVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJtYXhWYWx1ZVJhbmdlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25kaXRpb24gdG8gcHJldmVudCBkcmFnZ2luZyBzbGlkZXIgYmV5b25kIHRoZSB2YWxpZCByYW5nZVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdCh0aGlzLm1heFZhbHVlUmFuZ2UpIDw9IHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZVJhbmdlID0gKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSArIHBhcnNlRmxvYXQodGhpcy5jdXJyZW50U3RlcCkpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlSW5wdXQgPSB0aGlzLm1heFZhbHVlUmFuZ2UgPT0gdGhpcy5jdXJyZW50TWF4ID8gbnVsbCA6IHRoaXMubWF4VmFsdWVSYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3R5bGVzKCk7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwibWluVmFsdWVSYW5nZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uZGl0aW9uIHRvIHByZXZlbnQgZHJhZ2dpbmcgc2xpZGVyIGJleW9uZCB0aGUgdmFsaWQgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSA+PSBwYXJzZUZsb2F0KHRoaXMubWF4VmFsdWVSYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWVSYW5nZSA9IChwYXJzZUZsb2F0KHRoaXMubWF4VmFsdWVSYW5nZSkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZUlucHV0ID0gdGhpcy5taW5WYWx1ZVJhbmdlID09IHRoaXMuY3VycmVudE1pbiA/IG51bGwgOiB0aGlzLm1pblZhbHVlUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFN0eWxlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRmlsdGVyczogZGVib3VuY2UoZnVuY3Rpb24odHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInR5cGU6XCIsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZW50cnkgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBgJHt0eXBlfSAke3RoaXMubGFiZWx9OiAke3R5cGUgPT0gXCJNaW5cIiA/IHRoaXMubWluVmFsdWUgOiB0aGlzLm1heFZhbHVlfSAke3RoaXMuY3VycmVudFVuaXR9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0eXBlID09IFwiTWluXCIgPyB0aGlzLm1pblZhbHVlIDogdGhpcy5tYXhWYWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IGAke3RoaXMudHlwZX0ke3R5cGV9YFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlUmFuZ2VGaWx0ZXInLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0sIDUwMCksXG4gICAgICAgICAgICAgICAgaGFuZGxlUmFuZ2U6IGRlYm91bmNlKGZ1bmN0aW9uKGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBfdCA9IGUudGFyZ2V0O1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG1pbiA9IHR5cGUgPT0gXCJtaW5cIiA/IF90LnZhbHVlIDogdGhpcy5taW5WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSB0eXBlID09IFwibWF4XCIgPyBfdC52YWx1ZSA6IHRoaXMubWF4VmFsdWU7ICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJNQVhcIiwgbWF4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IFwibWluXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtaW4pID49IHBhcnNlRmxvYXQobWF4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4gPSAocGFyc2VGbG9hdChtYXgpIC0gcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTdGVwKSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXJzZUZsb2F0KG1heCkgPD0gcGFyc2VGbG9hdChtaW4pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IChwYXJzZUZsb2F0KG1pbikgKyBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG1pbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBtYXg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWVJbnB1dCA9IHRoaXMubWluVmFsdWVJbnB1dCAhPT0gdGhpcy5taW5WYWx1ZSAmJiB0aGlzLm1pblZhbHVlICE9PSBudWxsID8gdGhpcy5taW5WYWx1ZSA6IHRoaXMubWluVmFsdWVJbnB1dDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWVJbnB1dCA9IHRoaXMubWF4VmFsdWVJbnB1dCAhPT0gdGhpcy5tYXhWYWx1ZSAmJiB0aGlzLm1heFZhbHVlICE9PSBudWxsID8gdGhpcy5tYXhWYWx1ZSA6IHRoaXMubWF4VmFsdWVJbnB1dDtcblxuICAgICAgICAgICAgICAgICAgICB9LCA1MDApLFxuICAgICAgICAgICAgICAgIGluaXRFdmVudHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMucmFuZ2VNaW4uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmFuZ2UoZSwgJ21pbicpO1xuICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnJhbmdlTWF4LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJhbmdlKGUsICdtYXgnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0TWluTWF4KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBVU1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzTWluID0gdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0LnVzTWluO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzTWF4ID0gdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0LnVzTWF4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVzU3RlcCA9IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC51c1N0ZXA7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTUVUUklDXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWV0cmljTWluID0gdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0Lm1ldHJpY01pbjtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXRyaWNNYXggPSB0aGlzLiRyZWZzLnJhbmdlTWluLmRhdGFzZXQubWV0cmljTWF4O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1ldHJpY1N0ZXAgPSB0aGlzLiRyZWZzLnJhbmdlTWluLmRhdGFzZXQubWV0cmljU3RlcDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRDdXJyZW50VW5pdHMoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXRDdXJyZW50VW5pdHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIENVUlJFTlQgVU5JVFNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50TWluID0gdGhpcy5kYXRhLnNlbGVjdGVkVW5pdCA9PSAndXMnID8gdGhpcy51c01pbiA6IHRoaXMubWV0cmljTWluO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNYXggPSB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0ID09ICd1cycgPyB0aGlzLnVzTWF4IDogdGhpcy5tZXRyaWNNYXg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFN0ZXAgPSB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0ID09ICd1cycgPyB0aGlzLnVzU3RlcCA6IHRoaXMubWV0cmljU3RlcDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3R5bGVzKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0VW5pdExhYmVsKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdW5pdExhYmVscyA9IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC51bml0cyA/IEpTT04ucGFyc2UodGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0LnVuaXRzKSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFVuaXQgPSB1bml0TGFiZWxzW3RoaXMuZGF0YS5zZWxlY3RlZFVuaXRdO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFN0eWxlcygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHlsZXMgPSBgLS1hOiAke3RoaXMubWluVmFsdWVSYW5nZSA9PT0gbnVsbCA/IHRoaXMuY3VycmVudE1pbiA6IHRoaXMubWluVmFsdWVSYW5nZX07IC0tYjogJHt0aGlzLm1heFZhbHVlUmFuZ2UgPT09IG51bGwgPyB0aGlzLmN1cnJlbnRNYXggOiB0aGlzLm1heFZhbHVlUmFuZ2V9OyAtLW1pbjogJHt0aGlzLmN1cnJlbnRNaW59OyAtLW1heDogJHt0aGlzLmN1cnJlbnRNYXh9YDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0TWluTWF4KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0RXZlbnRzKCk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5pbml0VW5pdExhYmVsKCk7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4geyAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXQgc2xpZGVyIHBvc2l0aW9uc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlUmFuZ2UgPSB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0ID09IFwidXNcIiA/IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC51c01pbiA6IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC5tZXRyaWNNaW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWVSYW5nZSA9IHRoaXMuZGF0YS5zZWxlY3RlZFVuaXQgPT0gXCJ1c1wiID8gdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0LnVzTWF4IDogdGhpcy4kcmVmcy5yYW5nZU1pbi5kYXRhc2V0Lm1ldHJpY01heDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0aGlzLiRyZWZzLnJhbmdlTWluLmRhdGFzZXQudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC5sYWJlbDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIFxuXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnbWluLW1heC1mbG93cmFuZ2UnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBtaW5WYWx1ZTogbnVsbCwgLy9maW5hbCB2YWx1ZXNcbiAgICAgICAgICAgICAgICAgICAgbWluVmFsdWVSYW5nZTogbnVsbCwgLy8gbW9kZWwgZm9yIHJhbmdlIHNsaWRlclxuICAgICAgICAgICAgICAgICAgICBtaW5WYWx1ZUlucHV0OiBudWxsLCAvLyBtb2RlbCBmb3IgaW5wdXQgZmllbGRcbiAgICAgICAgICAgICAgICAgICAgbWF4VmFsdWU6IG51bGwsIC8vZmluYWwgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgIG1heFZhbHVlUmFuZ2U6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIG1heFZhbHVlSW5wdXQ6IG51bGwsXG5cbiAgICAgICAgICAgICAgICAgICAgbWluOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyBncG1NYXg6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIC8vIGdwbVN0ZXA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIC8vIG1oTWF4OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAvLyBtaFN0ZXA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIC8vIGxwbU1heDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgLy8gbHBtU3RlcDogbnVsbCxcblxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWluOiAwLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWF4OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50U3RlcDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBudWxsLFxuXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRVbml0OiBudWxsLFxuXG4gICAgICAgICAgICAgICAgICAgIG1lZGl1bTogbnVsbCwgLy9zZWxlY3RlZCBtZWFzdXJpbmcgbWVkaXVtXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBudWxsIC8vIGRpc3BsYXkgbmFtZSBmb3IgZmlsdGVyXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgXCJkYXRhLmZpbHRlcnNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlcyA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudHlwZVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEodHlwZXMuaW5kZXhPZihgJHt0aGlzLnR5cGV9TWluYCkgPiAtMSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHR5cGVzLmluZGV4T2YoYCR7dGhpcy50eXBlfU1heGApID4gLTEpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZXMuaW5kZXhPZignbWVhc3VyaW5nTWVkaXVtJykgPiAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tZWRpdW0gPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnbWVhc3VyaW5nTWVkaXVtJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLm5hbWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWVkaXVtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sIFxuICAgICAgICAgICAgICAgIFwibWVkaXVtXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVbml0ID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsICBudWxsLCAnZmxvd1JhbmdlTWluJyk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdyZW1vdmUtZmlsdGVyJywgdGhpcy5kYXRhLmNsYXNzLCAgbnVsbCwgJ2Zsb3dSYW5nZU1heCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRPcHRpb25zKCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImN1cnJlbnRVbml0XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jdXJyZW50VW5pdCAhPT0gXCJudWxsXCIgJiYgdGhpcy5jdXJyZW50VW5pdCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5pdE1pbk1heCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFN0eWxlcygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdEV2ZW50cygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudHlwZSA9IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC50eXBlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgZmluYWwgdmFsdWVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBzbGlkZSByYW5nZSBwb3NpdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlUmFuZ2UgPSB0aGlzLm1pbjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlUmFuZ2UgPSB0aGlzLmN1cnJlbnRNYXg7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZygnaW5pdCcsdGhpcy5sYWJlbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMubGFiZWwgIT09IG51bGwgPyB0aGlzLmxhYmVsIDogdGhpcy4kcmVmcy5yYW5nZU1pbiA/IHRoaXMuJHJlZnMucmFuZ2VNaW4uZGF0YXNldC5sYWJlbCA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coJ2ZpbmFsJyx0aGlzLmxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyB1bml0IHNlbGVjdGVkLCByZW1vdmUgZmxvdyByYW5nZSBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1pbicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3JlbW92ZS1maWx0ZXInLCB0aGlzLmRhdGEuY2xhc3MsIG51bGwsICdmbG93UmFuZ2VNYXgnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJtaW5WYWx1ZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWluVmFsdWUgPT0gdGhpcy5jdXJyZW50TWluIHx8IHRoaXMubWluVmFsdWUgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1pbicpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZSkgPCBwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1pbikgfHwgcGFyc2VGbG9hdCh0aGlzLm1pblZhbHVlKSA+IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50TWF4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5taW5WYWx1ZSA9IChwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1pbikgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1pbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5pbml0U3R5bGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWVSYW5nZSA9IHRoaXMubWluVmFsdWUgPT0gbnVsbCA/IHRoaXMubWluIDogdGhpcy5taW5WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZUlucHV0ID0gdGhpcy5taW5WYWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWluVmFsdWUgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVycyhcIk1pblwiKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJtYXhWYWx1ZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWF4VmFsdWUgPT0gdGhpcy5jdXJyZW50TWF4IHx8IHRoaXMubWF4VmFsdWUgPT0gXCJcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1heCcpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBhcnNlRmxvYXQodGhpcy5tYXhWYWx1ZSkgPiBwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1heCkgfHwgcGFyc2VGbG9hdCh0aGlzLm1heFZhbHVlKSA8IHBhcnNlRmxvYXQodGhpcy5jdXJyZW50TWluKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5tYXhWYWx1ZSA9IChwYXJzZUZsb2F0KHRoaXMuY3VycmVudE1heCkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgncmVtb3ZlLWZpbHRlcicsIHRoaXMuZGF0YS5jbGFzcywgbnVsbCwgJ2Zsb3dSYW5nZU1heCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5pbml0U3R5bGVzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWVSYW5nZSA9IHRoaXMubWF4VmFsdWUgPT0gbnVsbCA/IHRoaXMuY3VycmVudE1heCA6IHRoaXMubWF4VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWVJbnB1dCA9IHRoaXMubWF4VmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLm1heFZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnMoXCJNYXhcIik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGdsb2JhbGx5IHNlbGVjdGVkIHVzL21ldHJpYyB1bml0XG4gICAgICAgICAgICAgICAgXCJkYXRhLnNlbGVjdGVkVW5pdFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY2xlYXIgY3VycmVudCBmbG93IHJhbmdlIHNlbGVjdGlvblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRVbml0ID0gXCJudWxsXCI7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdy9oaWRlIG9wdGlvbnMgZm9yIHJlbGV2YW50IHVuaXRzXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5pdFVuaXRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgXCJtYXhWYWx1ZVJhbmdlXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25kaXRpb24gdG8gcHJldmVudCBkcmFnZ2luZyBzbGlkZXIgYmV5b25kIHRoZSB2YWxpZCByYW5nZVxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdCh0aGlzLm1heFZhbHVlUmFuZ2UpIDw9IHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZVJhbmdlID0gKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSArIHBhcnNlRmxvYXQodGhpcy5jdXJyZW50U3RlcCkpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlSW5wdXQgPSB0aGlzLm1heFZhbHVlUmFuZ2UgPT0gdGhpcy5jdXJyZW50TWF4ID8gbnVsbCA6IHRoaXMubWF4VmFsdWVSYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3R5bGVzKCk7XG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwibWluVmFsdWVSYW5nZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uZGl0aW9uIHRvIHByZXZlbnQgZHJhZ2dpbmcgc2xpZGVyIGJleW9uZCB0aGUgdmFsaWQgcmFuZ2VcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQodGhpcy5taW5WYWx1ZVJhbmdlKSA+PSBwYXJzZUZsb2F0KHRoaXMubWF4VmFsdWVSYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWVSYW5nZSA9IChwYXJzZUZsb2F0KHRoaXMubWF4VmFsdWVSYW5nZSkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZUlucHV0ID0gdGhpcy5taW5WYWx1ZVJhbmdlID09IHRoaXMuY3VycmVudE1pbiA/IG51bGwgOiB0aGlzLm1pblZhbHVlUmFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFN0eWxlcygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgdXBkYXRlRmlsdGVyczogZGVib3VuY2UoZnVuY3Rpb24odHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwidHlwZTpcIiwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBlbnRyeSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGAke3R5cGV9ICR7dGhpcy5sYWJlbH06ICR7dHlwZSA9PSBcIk1pblwiID8gdGhpcy5taW5WYWx1ZSA6IHRoaXMubWF4VmFsdWV9ICR7dGhpcy5jdXJyZW50VW5pdH1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGUgPT0gXCJNaW5cIiA/IHRoaXMubWluVmFsdWUgOiB0aGlzLm1heFZhbHVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYCR7dGhpcy50eXBlfSR7dHlwZX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgZmxvd1JhbmdlVHlwZTogdGhpcy5jdXJyZW50VW5pdFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGVudHJ5KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndXBkYXRlUmFuZ2VGaWx0ZXInLCBlbnRyeSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0sIDUwMCksXG4gICAgICAgICAgICAgICAgaGFuZGxlUmFuZ2U6IGRlYm91bmNlKGZ1bmN0aW9uKGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IF90ID0gZS50YXJnZXQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtaW4gPSB0eXBlID09IFwibWluXCIgPyBfdC52YWx1ZSA6IHRoaXMubWluVmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtYXggPSB0eXBlID09IFwibWF4XCIgPyBfdC52YWx1ZSA6IHRoaXMubWF4VmFsdWU7ICAgIFxuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcIm1pblwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VGbG9hdChtaW4pID49IHBhcnNlRmxvYXQobWF4KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbiA9IChwYXJzZUZsb2F0KG1heCkgLSBwYXJzZUZsb2F0KHRoaXMuY3VycmVudFN0ZXApKS50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gXCJtYXhcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlRmxvYXQobWF4KSA8PSBwYXJzZUZsb2F0KG1pbikpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXggPSAocGFyc2VGbG9hdChtaW4pICsgcGFyc2VGbG9hdCh0aGlzLmN1cnJlbnRTdGVwKSkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWUgPSBtaW47XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWF4VmFsdWUgPSBtYXg7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5taW5WYWx1ZUlucHV0ID0gdGhpcy5taW5WYWx1ZUlucHV0ICE9PSB0aGlzLm1pblZhbHVlICYmIHRoaXMubWluVmFsdWUgIT09IG51bGwgPyB0aGlzLm1pblZhbHVlIDogdGhpcy5taW5WYWx1ZUlucHV0O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1heFZhbHVlSW5wdXQgPSB0aGlzLm1heFZhbHVlSW5wdXQgIT09IHRoaXMubWF4VmFsdWUgJiYgdGhpcy5tYXhWYWx1ZSAhPT0gbnVsbCA/IHRoaXMubWF4VmFsdWUgOiB0aGlzLm1heFZhbHVlSW5wdXQ7XG4gICAgICAgICAgICAgICAgfSw1MDApLFxuICAgICAgICAgICAgICAgIGluaXRFdmVudHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMucmFuZ2VNaW4uYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCBlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGFuZGxlUmFuZ2UoZSwgJ21pbicpO1xuICAgICAgICAgICAgICAgICAgICAgIH0sIGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnJhbmdlTWF4LmFkZEV2ZW50TGlzdGVuZXIoJ2lucHV0JywgZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZVJhbmdlKGUsICdtYXgnKTtcbiAgICAgICAgICAgICAgICAgICAgICB9LCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0T3B0aW9ucygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZWwucXVlcnlTZWxlY3RvckFsbCgnb3B0aW9uJykuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHVuaXQgPSBpdGVtLmRhdGFzZXQudW5pdFR5cGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmxvdyA9IGl0ZW0uZGF0YXNldC5mbG93VHlwZSA/IGl0ZW0uZGF0YXNldC5mbG93VHlwZS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWVkaXVtID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS5nZXRBdHRyaWJ1dGUoJ3ZhbHVlJykgPT0gXCJudWxsXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodW5pdCA9PSB0aGlzLmRhdGEuc2VsZWN0ZWRVbml0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuZGlzcGxheSA9IFwiYmxvY2tcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLmdldEF0dHJpYnV0ZSgndmFsdWUnKSA9PSBcIm51bGxcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmbG93LmluY2x1ZGVzKHRoaXMubWVkaXVtKSAmJiB1bml0ID09IHRoaXMuZGF0YS5zZWxlY3RlZFVuaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0U3R5bGVzKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0eWxlcyA9IGAtLWE6ICR7dGhpcy5taW5WYWx1ZVJhbmdlID09PSBudWxsID8gdGhpcy5jdXJyZW50TWluIDogdGhpcy5taW5WYWx1ZVJhbmdlfTsgLS1iOiAke3RoaXMubWF4VmFsdWVSYW5nZSA9PT0gbnVsbCA/IHRoaXMuY3VycmVudE1heCA6IHRoaXMubWF4VmFsdWVSYW5nZX07IC0tbWluOiAke3RoaXMuY3VycmVudE1pbn07IC0tbWF4OiAke3RoaXMuY3VycmVudE1heH1gO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0VW5pdChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFVuaXQgPSBlLnRhcmdldC52YWx1ZSA9PSBcIm51bGxcIiA/IG51bGwgOiBlLnRhcmdldC52YWx1ZTsgLy9zZXQgc2VsZWN0ZWQgdW5pdFxuICAgICAgICAgICAgICAgICAgICBpZiAoZS50YXJnZXQudmFsdWUgIT09IFwibnVsbFwiICYmIGUudGFyZ2V0LnZhbHVlICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UodGhpcy4kZWwucXVlcnlTZWxlY3Rvcihgb3B0aW9uW3ZhbHVlPVwiJHtlLnRhcmdldC52YWx1ZX1cIl1gKS5kYXRhc2V0LmZsb3dEYXRhKTsgLy9nZXQgbWluL21heCBkYXRhIGZvciBzZWxlY3RlZCB1bml0XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgbWluL21heCBkYXRhIGZvciBjdXJyZW50IHVuaXRcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWluID0gZGF0YS5taW47XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRNYXggPSBkYXRhLm1heDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudE1pbiA9IGRhdGEubWluO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RlcCA9IGRhdGEuc3RlcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0VW5pdHMoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1bml0ID0gdGhpcy5kYXRhLnNlbGVjdGVkVW5pdDtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2codW5pdCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoYG9wdGlvbmApLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uZ2V0QXR0cmlidXRlKCd2YWx1ZScpID09IFwibnVsbFwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpdGVtLmRhdGFzZXQudW5pdFR5cGUgIT09IHVuaXQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLnN0eWxlLmRpc3BsYXkgPSBcIm5vbmVcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zdHlsZS5kaXNwbGF5ID0gXCJibG9ja1wiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuaW5pdFVuaXRzKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdE9wdGlvbnMoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5sYWJlbCA9IHRoaXMuJHJlZnMucmFuZ2VNaW4gPyB0aGlzLiRyZWZzLnJhbmdlTWluLmRhdGFzZXQubGFiZWwgOiBudWxsO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdyYWRpby1pdGVtJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJtZWFzdXJpbmdNZWRpdW1cIixcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGlzQ2hlY2tlZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSYWRpbzogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU3RhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJlXCIsIGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInR5cGVcIiwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCd1cGRhdGVGaWx0ZXJzJywgZWwsIGUsIHR5cGUpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY2hlY2tTdGF0ZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC52YWx1ZSA9PSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSBpdGVtID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkUmFkaW8gPSBpdGVtID8gZGVjb2RlVVJJQ29tcG9uZW50KGl0ZW0udmFsdWUpIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pZCA9IGVuY29kZVVSSUNvbXBvbmVudCh0aGlzLiRyZWZzLmlucHV0LnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5wcm9kdWN0LWNhdGFsb2ctJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlXG4gICAgICAgIH0pLiRtb3VudChgLnByb2R1Y3QtY2F0YWxvZy0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIC8vIG11bHRpSGFuZGxlUmFuZ2UoKTtcbiAgICBpZiAoY2F0YWxvZy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNhdGFsb2cuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgcHJvZHVjdC1jYXRhbG9nLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBwcm9kdWN0Q2F0YWxvZ0NvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvZHVjdENhdGFsb2c7IiwiaW1wb3J0IFZ1ZSBmcm9tICd2dWUvZGlzdC92dWUubWluLmpzJztcbmltcG9ydCBzdG9yZSBmcm9tICcuL3N0b3JlJztcblxuY29uc3QgUHJvZHVjdHNBY2Nlc3NvcmllcyA9ICgpID0+IHtcbiAgICBjb25zdCBwcm9kdWN0cyA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5wcm9kdWN0cy1hY2NfX3dyYXBwZXInKTtcblxuICAgIGxldCBwcm9kdWN0c0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3Byb2R1Y3RzLWFjY2Vzc29yaWVzLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgcGFnaW5hdGVkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBvcGVuVGV4dDogJycsXG4gICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlVGV4dDogJycsXG4gICAgICAgICAgICAgICAgICAgIGlzRXhwYW5kZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB0b3RhbEl0ZW1zOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpbml0aWFsSXRlbXM6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvblRleHQ6ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgaXNFeHBhbmRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uVGV4dCA9IHRoaXMuaXNFeHBhbmRlZCA/IHRoaXMuY29sbGFwc2VUZXh0IDogdGhpcy5vcGVuVGV4dDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHBhZ2luYXRlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlblRleHQgPSB0aGlzLiRyZWZzLm9wZW5CdXR0b24uZGF0YXNldC5vcGVuVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlVGV4dCA9IHRoaXMuJHJlZnMub3BlbkJ1dHRvbi5kYXRhc2V0LmNvbGxhcHNlVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvblRleHQgPSB0aGlzLmlzRXhwYW5kZWQgPyB0aGlzLmNvbGxhcHNlVGV4dCA6IHRoaXMub3BlblRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBoYW5kbGVDbGljaygpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRBcmVhID0gdGhpcy4kcmVmcy5jb250ZW50Q29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGVudEhlaWdodCA9IHRoaXMuJHJlZnMuY29udGVudElubmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0V4cGFuZGVkID09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNFeHBhbmRlZCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9zZXQgY29udGVudCBhcmVhIGhlaWdodCB0byBjb250ZW50IGhlaWdodCB0byBwcmV2ZW50IHRyYW5zaXRpb25pbmcgZnJvbSBhdXRvXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0aGUgZWxlbWVudCB0cmFuc2l0aW9uIHRvIGhlaWdodDogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0V4cGFuZGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbml0IGNvdW50c1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxJdGVtcyA9IHRoaXMuJHJlZnMuaW5pdGlhbENvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnLnByb2R1Y3QtY2FyZCcpLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tb3JlSXRlbXMgPSB0aGlzLiRyZWZzLmNvbnRlbnRJbm5lci5xdWVyeVNlbGVjdG9yQWxsKCcucHJvZHVjdC1jYXJkJykubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsSXRlbXMgPSB0aGlzLmluaXRpYWxJdGVtcyArIHRoaXMubW9yZUl0ZW1zO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGVkID0gdGhpcy5tb3JlSXRlbXMgPiAwID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXQgYnV0dG9uIG9ubHkgaWYgcGFnaW5hdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhZ2luYXRlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub3BlblRleHQgPSB0aGlzLiRyZWZzLm9wZW5CdXR0b24uZGF0YXNldC5vcGVuVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbGxhcHNlVGV4dCA9IHRoaXMuJHJlZnMub3BlbkJ1dHRvbi5kYXRhc2V0LmNvbGxhcHNlVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1dHRvblRleHQgPSB0aGlzLmlzRXhwYW5kZWQgPyB0aGlzLmNvbGxhcHNlVGV4dCA6IHRoaXMub3BlblRleHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAucHJvZHVjdHMtYWNjZXNzb3JpZXMtJHtpZH1gLFxuICAgICAgICAgICAgc3RvcmU6IHN0b3JlLFxuICAgICAgICB9KS4kbW91bnQoYC5wcm9kdWN0cy1hY2Nlc3Nvcmllcy0ke2lkfWAsIHRydWUpO1xuXG4gICAgfVxuXG4gICAgaWYgKHByb2R1Y3RzLmxlbmd0aCA+IDAgKSB7XG4gICAgICAgIHByb2R1Y3RzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHByb2R1Y3RzLWFjY2Vzc29yaWVzLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBwcm9kdWN0c0NvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgUHJvZHVjdHNBY2Nlc3NvcmllczsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IFZNb2RhbCBmcm9tICd2dWUtanMtbW9kYWwnO1xuaW1wb3J0IHsgcXVpY2tMaW5rc01vZGFsIH0gZnJvbSBcIi4vbW9kYWxzXCI7XG5pbXBvcnQgc3RvcmUgZnJvbSBcIi4vc3RvcmVcIjtcblxuY29uc3QgcXVpY2tMaW5rcyA9ICgpID0+IHtcblxuICAgIGNvbnN0IGxpbmtzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnF1aWNrLWxpbmtzJyk7XG5cbiAgICBWdWUudXNlKFZNb2RhbCk7XG5cbiAgICBsZXQgcXVpY2tMaW5rc0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3F1aWNrLWxpbmtzJywge1xuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBpc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBpc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuaGlkZSgncXVpY2tMaW5rcycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICB0cmlnZ2VyTW9kYWwoKSB7ICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmtzID0gdGhpcy4kcmVmcy5saW5rcy5jbG9uZU5vZGUodHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWlja0xpbmtzTW9kYWwudGVtcGxhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWlja0xpbmtzTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1aWNrTGlua3NNb2RhbC5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVpY2tMaW5rc01vZGFsLmV2ZW50cyhsaW5rcylcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAucXVpY2stbGlua3MtJHtpZH1gLFxuICAgICAgICB9KS4kbW91bnQoYC5xdWljay1saW5rcy0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmIChsaW5rcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGxpbmtzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHF1aWNrLWxpbmtzLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBxdWlja0xpbmtzQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBxdWlja0xpbmtzOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBmcG9kYiBmcm9tICcuLi8uLi8uLi9kYi5qc29uJztcbmltcG9ydCB7IGdldFVybFBhcmFtZXRlciB9IGZyb20gJy4vbWlzYyc7XG5pbXBvcnQgc2hvd2Rvd24gZnJvbSAnc2hvd2Rvd24nO1xuXG5jb25zdCBzZWFyY2hSZXN1bHRzID0gKCkgPT4ge1xuXG4gICAgbGV0IHNlYXJjaCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWFyY2gtcmVzdWx0cycpO1xuICAgIFxuICAgIGNvbnN0IHNlYXJjaFJlc3VsdHNDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdzZWFyY2gtcmVzdWx0cy10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UXVlcnk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBvbGRJbnB1dFF1ZXJ5OiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnk6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50UGFnZTogMSwgLy9jdXJyZW50IHBhZ2UgI1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1Zpc2libGU6IG51bGwsIC8vYXJlIGZpbHRlcnMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZXN1bHRzOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzOiBbXSwgLy9ib29rbWFya2VkIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3NMYWJlbDogbnVsbCwgLy9sYWJlbCBmb3Igc2F2ZWQgZG9jc1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICB1cmxQYXJhbXM6IG51bGwsIC8vZm9yIGRlZXBsaW5raW5nIGluLWJyb3dzZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50czoge30sXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkaWRZb3VNZWFuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1JldHVybmVkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdzZWFyY2gtcmVzdWx0cycsXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9yZWxhdGVkX3F1ZXN0aW9uczogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zb3VyY2VzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3NvdXJjZXNfZGVza3RvcDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zb3VyY2VzX2FsbDogW10sXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9jaGF0X2RvY19pZDogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3Jlc3BvbnNlOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlfZGlzY2xhaW1lcjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3N0YXR1c19haV9zdG9wOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlfc3RhdHVzX2ZpcnN0X2NhbGxfZmFpbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zdGF0dXNfc2Vjb25kX2NhbGxfZmFpbDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zdGF0dXNfc2hvd19tb3JlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3N0YXR1c19zaG93X2RvY3M6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlfc3RhdHVzX2NsaWNrZWRfdW5saWtlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpX3N0YXR1c19jbGlja2VkX2xpa2U6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlfc3RhdHVzX3ByZWZpbmFsX3Jlc3VsdDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBhaV9zdGF0dXNfZmluYWxfcmVzdWx0OiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFpU2VhcmNoRGVzY0hlaWdodDogLTEsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXJlbmRlclNob3dNb3JlOiAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFuYWdlTm9SZXN1bHRzT25GaXJzdExvYWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICAgICAgYWlTZWFyY2hFbmFibGVkOiB3aW5kb3cuYWlTZWFyY2hFbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBpc0xvYWRpbmc6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc2F2ZWQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuZmF2b3JpdGVzO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ01ldGFMMTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlNlYXJjaFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogdGhpcy5kYXRhLnF1ZXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmRhdGEudG90YWxSZXN1bHRzIHx8IDAsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImNvbnRlbnRcIjogXCJIZXJvXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcInRpdGxlXCI6IFwiU2VhcmNoIFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibmFtZVwiOiBcIkhlcm8gLSBTZWFyY2ggUmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJub1wiOiBcIjAxXCJcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHRhZ2dpbmdNZXRhTDI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2VhcmNoLXJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJTZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHRoaXMuZGF0YS5xdWVyeSxcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5kYXRhLnRvdGFsUmVzdWx0cyB8fCAwLFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnZ2luZ1RyaWdnZXI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhLnJlc3VsdHNSZXR1cm5lZCA/IFwidHJpZ2dlclwiIDogbnVsbFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhbGxTYXZlZCA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWQgPSBzdG9yZS5zdGF0ZS5mYXZvcml0ZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzYXZlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsU2F2ZWQgPSBbLi4uYWxsU2F2ZWQsIC4uLnNhdmVkW3Byb3BdXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3MgPSBhbGxTYXZlZC5maWx0ZXIoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtICE9PSBcIlwiXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHRoaXMuY29tcHV0ZWRJc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuY29tcHV0ZWRJc01vYmlsZSA/IHRydWUgOiB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3VibWl0KCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEuZmlsdGVyc1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyh0aGlzLmRhdGEuZmlsdGVycyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7IC8vcmVzZXQgcGFnZSB0byAxXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTsgLy8gaGFuZGxlIGFwaSBjYWxsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcImRhdGEucXVlcnlcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7IC8vcmVzZXQgcGFnZSB0byAxIHdoZW4gcXVlcnkgY2hhbmdlc1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmdldFJlc3VsdHModGhpcy5kYXRhLnF1ZXJ5KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHRvZ2dsZUZpbHRlcnMoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9ICF0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGU7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSAnc2VhcmNoJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBlbmNvZGVVUklDb21wb25lbnQoZS5jdXJyZW50VGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrZWQgPSBlLmN1cnJlbnRUYXJnZXQuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0eXBlXCIsIHR5cGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUuY3VycmVudFRhcmdldC5uYW1lKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ2YWx1ZVwiLCBlbmNvZGVVUklDb21wb25lbnQoZS50YXJnZXQudmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja2VkXCIsZS50YXJnZXQuY2hlY2tlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSBcInNhdmVkRG9jdW1lbnRzXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywge1widmFsdWVcIjogdmFsdWUsIFwidHlwZVwiOiB0eXBlLCBcIm5hbWVcIjogZS5jdXJyZW50VGFyZ2V0Lm5hbWV9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMgPSBbLi4udGhpcy5kYXRhLmZpbHRlcnMsIHtcInZhbHVlXCI6IGNoZWNrZWQsIFwidHlwZVwiOiB0eXBlLCBcIm5hbWVcIjogZS5jdXJyZW50VGFyZ2V0Lm5hbWV9XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlLnZhbHVlXG4gICAgICAgICAgICAgICAgICAgICAgICB9KS5pbmRleE9mKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiSU5ERVhcIiwgaW5kZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyByZW1vdmVzIHNwZWNpZmljIGZpbHRlclxuICAgICAgICAgICAgICAgIHJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtyZXR1cm47fTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcInJlbW92ZVwiLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGNsZWFycyBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgcmVtb3ZlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgICAgIH0sICBcbiAgICAgICAgICAgICAgICBhZGRMb2FkaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VhcmNoLXJlc3VsdHNfX2lucHV0LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dEZpZWxkLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ2xvYWRpbmcnKSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICByZW1vdmVMb2FkaW5nKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTG9hZGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dEZpZWxkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlYXJjaC1yZXN1bHRzX19pbnB1dC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRGaWVsZC5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJykpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gQUkgU0VBUkNIXG4gICAgICAgICAgICAgICAgYWlTaG93TW9yZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZXZlbnRcIjogXCJjbGlja1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImFjY29yZGlvblwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJTaG93IE1vcmVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBcIkFJIFNlYXJjaCBCb3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiRXhwYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJBSSBSZXNwb25zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc3RhdHVzX3Nob3dfbW9yZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBhaVZpZXdBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImV2ZW50XCI6IFwiY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJhY2NvcmRpb25cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiVmlldyBBbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBcIkFJIFNlYXJjaCBCb3hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiRXhwYW5kXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJBSSBSZXNwb25zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc291cmNlcyA9IHRoaXMuZGF0YS5haV9zb3VyY2VzX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3NvdXJjZXNfZGVza3RvcCA9IHRoaXMuZGF0YS5haV9zb3VyY2VzX2FsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19zaG93X2RvY3MgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWlGZWVkYmFja1VubGlrZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5haUZlZWRiYWNrQ2FsbCgxLCAxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFpRmVlZGJhY2tMaWtlKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFpRmVlZGJhY2tDYWxsKDUsIDIpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgYWlGZWVkYmFja0NhbGwocmF0aW5nLCB0eXBlKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBiZWFjb25GZWVkYmFjayA9IFwiL2FwaS9iZWFjb25mZWVkYmFja1wiO1xuICAgICAgICAgICAgICAgICAgICAvLyB2YXIgYmVhY29uRmVlZGJhY2sgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9iZWFjb25mZWVkYmFja1wiO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfY2xpY2tlZF91bmxpa2UgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19jbGlja2VkX2xpa2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlID09IDIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfY2xpY2tlZF9saWtlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfY2xpY2tlZF91bmxpa2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLnBhdGNoKGJlYWNvbkZlZWRiYWNrLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkb2NJZDogdGhpcy5kYXRhLmFpX2NoYXRfZG9jX2lkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nOiByYXRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICBmZWVkYmFjazogXCJcIlxuICAgICAgICAgICAgICAgICAgICB9KS50aGVuKGZ1bmN0aW9uIChyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKHJlc3BvbnNlLmRhdGEuc3VjY2Vzcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImV2ZW50XCI6IFwiY2xpY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImZlZWRiYWNrXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiRmVlZGJhY2tcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHJhdGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogcmF0aW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJBSSBSZXNwb25zZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVhY29uIGZlZWRiYWNrIHJlcXVlc3QgZXJyb3IgbWVzc2FnZTogXCIgKyByZXNwb25zZS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KS5jYXRjaChmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiVW5hYmxlIHRvIHN1Ym1pdCB1c2VyIGZlZWRiYWNrOiBcIiArIGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBnZXRSZXN1bHRzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBSSBTZWFyY2ggLSBhdm9pZCBzaG93aW5nIHRpcCBhbmQgZ2VuZXJhdGluZyBhdCBsb2FkaW5nIHdpdGhvdXQgYSBwcmV2aW91cyBzZWFyY2hcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19haV9zdG9wID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLnF1ZXJ5ID0gcXVlcnkgPyBxdWVyeSA6IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5yZXN1bHRzUmV0dXJuZWQgPSB0cnVlOyAvL3NldCB0aGlzIG9uY2UgYWZ0ZXIgaW5pdGlhbCByZXN1bHRzIHJldHVybmVkXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gd2luZG93LnNlYXJjaEFQSVVybDtcbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaW5wdXRRdWVyeSA9PSAndGVzdCBubyByZXN1bHRzJykgeyAvLyBGT1IgVEVTVElORyBPTkxZXG4gICAgICAgICAgICAgICAgICAgICAgICBiYXNlVXJsID0gJ2h0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9zZWFyY2hSZXN1bHRzTm9uZSc7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpVXJsID0gYCR7YmFzZVVybH0ke2Jhc2VVcmwuaW5kZXhPZignPycpID4gLTEgPyAnJyA6ICc/J31gO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvc2VhcmNoUmVzdWx0c1wiOyAvL2Zyb20ganNvbi1zZXJ2ZXJcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZERvY3VtZW50c1RydWVQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2F2ZWREb2N1bWVudHNcIjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2F2ZWRPbmx5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBmaWx0ZXJzID0gW107XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMubWFwKChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS52YWx1ZSAhPT0gdHJ1ZSAmJiBpdGVtLnZhbHVlICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcnNTdHIgPSBkZWNvZGVVUklDb21wb25lbnQoZmlsdGVycy5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhmaWx0ZXJzU3RyKTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgYXhpb3NQYXJhbXMgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxOiB0aGlzLmRhdGEuaW5wdXRRdWVyeSA/IHRoaXMuZGF0YS5pbnB1dFF1ZXJ5IDogdGhpcy5kYXRhLnF1ZXJ5ID8gdGhpcy5kYXRhLnF1ZXJ5IDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnM6IGZpbHRlcnNTdHIgPT0gXCJcIiA/IG51bGwgOiBmaWx0ZXJzU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2N1bWVudHM6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpID8gc2F2ZWREb2N1bWVudHNUcnVlUGFyYW1zKCkgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWQ6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpID8gdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JykgOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5kYXRhLmN1cnJlbnRQYWdlXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYXhpb3NQYXJhbXMgPSBheGlvc1BhcmFtcztcblxuICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoVGVybSA9IGF4aW9zUGFyYW1zLnE7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYXhpb3NQYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYXBpVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmF4aW9zUGFyYW1zXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8vXG4gICAgICAgICAgICAgICAgICAgICAgICAvLy8gRGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljIGZyb20gZXBpc2VydmVyIGZpbmQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuRWwsIGRpZHlvdW1lYW5Db250YWluZXI7XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnJlc3VsdHMubGVuZ3RoID09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2xvYmFsX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWFyY2gtcmVzdWx0c19faW5wdXQtY29udGFpbmVyX19kaWR5b3VtZWFuJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuZmlsdGVyQXJlYVZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbG9iYWxfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VhcmNoLXJlc3VsdHNfX2lucHV0LWNvbnRhaW5lcl9fcGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuZmlsdGVyQXJlYVZpc2libGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuZGlkWW91TWVhbiAmJiByZXNwb25zZS5kYXRhLmRpZFlvdU1lYW4ubGVuZ3RoID4gMCkgXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFsbEVsZW1lbnRzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZGF0YS5kaWRZb3VNZWFuLmZvckVhY2goZHltID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckVsZW1lbnQuaHJlZj1gP3E9JHtkeW19YDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5jaG9yRWxlbWVudC5pbm5lclRleHQgPSBkeW07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5jaG9yRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgc2VsZi5kaWRZb3VNZWFuKGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbEVsZW1lbnRzLnB1c2goYW5jaG9yRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NsZWFyIG91dCBhbGwgcHJldmlvdXMgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwuZm9yRWFjaChwYXJlbnQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50LmZpcnN0Q2hpbGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsbEVsZW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbC5mb3JFYWNoKGVsID0+IHsgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYW5jaG9yRWxlbWVudCA9IGFsbEVsZW1lbnRzW2ldLmNsb25lTm9kZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpZFlvdU1lYW4oZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9kaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWwuYXBwZW5kKGFuY2hvckVsZW1lbnQpOyBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpICsgMSA8IGFsbEVsZW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1hRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbW1hRWwuaW5uZXJUZXh0ID0gJyAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFFbC5zdHlsZS5wYWRkaW5nTGVmdCA9IFwiN3B4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwuZm9yRWFjaChlbCA9PiB7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLmFwcGVuZChjb21tYUVsLmNsb25lTm9kZSh0cnVlKSk7IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBFbmQgb2YgZGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgICAvLy9cblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEucmVzdWx0cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0cnVjdCBzaXRlIHNlY3Rpb24gbGFiZWwgaW50byB0aGUgdGl0bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEucmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0cy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0udGl0bGUgJiYgaXRlbS5maWx0ZXJUZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50aXRsZS5pbmRleE9mKFwiPHA+XCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aXRsZVwiOiBgPHA+JHtpdGVtLnRpdGxlLnJlcGxhY2UoXCI8cD5cIiwgXCJcIil9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyYXdUaXRsZVwiOiBpdGVtLnRpdGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi5pdGVtLCBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0aXRsZVwiOiBgJHtpdGVtLnRpdGxlfWAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicmF3VGl0bGVcIjogaXRlbS50aXRsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uaXRlbX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaWYgKCEocmVzcG9uc2UuZGF0YS5yZXN1bHRzLmxlbmd0aCA+IDApKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2VsZi5kYXRhLmRpZFlvdU1lYW4gPSByZXNwb25zZS5kYXRhLmRpZFlvdU1lYW47XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuZGlkWW91TWVhbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy99XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLm1hbmFnZU5vUmVzdWx0c09uRmlyc3RMb2FkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnJlc3VsdHMgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5tYW5hZ2VOb1Jlc3VsdHNPbkZpcnN0TG9hZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdUTSBUQUdHSU5HXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VhcmNoVGVybSAmJiBzZWFyY2hUZXJtLmxlbmd0aCA+IDAgJiYgd2luZG93LmRhdGFMYXllciAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXJbd2luZG93LmRhdGFMYXllci5sZW5ndGgtMV0uZXZlbnQgIT0gXCJzZWFyY2gtcmVzdWx0c1wiIC8vIGhhY2sgdG8gYXZvaWQgZG91YmxlIGVudHJ5LiAgdGhpcyBydW5zIHR3aWNlIGZvciBzb21lIHJlYXNvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeyAvLyBvbmx5IHB1c2ggaWYgdGhpcyBpcyBhIHF1ZXJ5LCBub3QgYSBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuZGF0YUxheWVyLnB1c2goIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQ6IFwic2VhcmNoLXJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJnbG9iYWxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IFwiU2VhcmNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbjogc2VhcmNoVGVybSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHJlc3BvbnNlLmRhdGEudG90YWxSZXN1bHRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWxmLmRhdGEucmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0cyA/IHJlc3BvbnNlLmRhdGEucmVzdWx0cyA6IG51bGw7IFxuICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnRvdGFsUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEudG90YWxSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgY291bnRzIG9mIHNlYXJjaCByZXN1bHQgdHlwZXNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5jb3VudHMgPSByZXNwb25zZS5kYXRhLmZpbHRlckNvdW50UmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS50cmFja0lkID0gcmVzcG9uc2UuZGF0YS50cmFja0lkO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UuZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmFpU2VhcmNoRW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5vbGRJbnB1dFF1ZXJ5ICE9IHRoaXMuZGF0YS5pbnB1dFF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQUkgU0VBUkNIXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb21wdCA9IHRoaXMuZGF0YS5pbnB1dFF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBhaVJlZnMgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYWlEb2NzID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJlYWNvbnJlZnMgPSBcIi9hcGkvYmVhY29uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGJlYWNvbmRvY3MgPSBcIi9hcGkvYmVhY29uXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGJlYWNvbnJlZnMgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9iZWFjb25yZWZzXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyIGJlYWNvbmRvY3MgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9iZWFjb25kb2NzXCI7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVzZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc3RhdHVzX2ZpcnN0X2NhbGxfZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfc2Vjb25kX2NhbGxfZmFpbCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfc2hvd19tb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19zaG93X2RvY3MgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc3RhdHVzX2NsaWNrZWRfdW5saWtlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3N0YXR1c19jbGlja2VkX2xpa2UgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc3RhdHVzX3ByZWZpbmFsX3Jlc3VsdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9zdGF0dXNfZmluYWxfcmVzdWx0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpU2VhcmNoRGVzY0hlaWdodCA9IC0xO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZnMgY2FsbCAoMSBlcXVhbHMgdG8gcmVmcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYmVhY29ucmVmcywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21wdDogcHJvbXB0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogMVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkudGhlbihmdW5jdGlvbiAocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmRhdGEuc3VjY2Vzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJldmVudFwiOiBcInNlYXJjaC1yZXN1bHRzLWFpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicGFnZVRlbXBsYXRlXCI6IFwiU2VhcmNoUmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiU2VhcmNoIFJlc3VsdHMgQUlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogcHJvbXB0LnJlcGxhY2VBbGwoJ1xcXCInLCcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkFJIFJlc3VsdFwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlc3BvbnNlVHlwZVwiOiBcIkFJIFJlc3BvbnNlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haV9zdGF0dXNfcHJlZmluYWxfcmVzdWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFpUmVmcyA9IHJlc3BvbnNlLmRhdGEuY29udGVudDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuc2V0QUlSZWZzVmFsdWVzKGFpUmVmcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlYWNvbiByZWZzIHJlcXVlc3QgZXJyb3IgbWVzc2FnZTogXCIgKyByZXNwb25zZS5kYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZGF0YUxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJldmVudFwiOiBcInNlYXJjaC1yZXN1bHRzLWFpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicGFnZVRlbXBsYXRlXCI6IFwiU2VhcmNoUmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiU2VhcmNoIFJlc3VsdHMgQUkgRXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJhY3Rpb25cIjogcHJvbXB0LnJlcGxhY2VBbGwoJ1xcXCInLCcnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJTZWFyY2ggUmVzdWx0IG5vIEFJXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haV9zdGF0dXNfZmlyc3RfY2FsbF9mYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmNhdGNoKGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhcIkJlYWNvbiByZWZzIGF4aW9zIGVycm9yIG1lc3NhZ2U6IFwiICsgZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93ICYmIHdpbmRvdy5kYXRhTGF5ZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJldmVudFwiOiBcInNlYXJjaC1yZXN1bHRzLWFpXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJwYWdlVGVtcGxhdGVcIjogXCJTZWFyY2hSZXN1bHRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2VhcmNoLXJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiU2VhcmNoIFJlc3VsdHMgQUkgRXJyb3JcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBwcm9tcHQucmVwbGFjZUFsbCgnXFxcIicsJycpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXNwb25zZVR5cGVcIjogXCJTZWFyY2ggUmVzdWx0IG5vIEFJXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haV9zdGF0dXNfZmlyc3RfY2FsbF9mYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb2NzIGNhbGwgKDIgZXF1YWxzIHRvIGRvY3MpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXhpb3MuZ2V0KGJlYWNvbmRvY3MsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9tcHQ6IHByb21wdCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IDJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5kYXRhLnN1Y2Nlc3MpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haV9zdGF0dXNfc2hvd19tb3JlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuYWlfc3RhdHVzX3Nob3dfZG9jcyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLmFpX3N0YXR1c19maW5hbF9yZXN1bHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWlEb2NzID0gcmVzcG9uc2UuZGF0YS5jb250ZW50O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRBSURvY3NWYWx1ZXMoYWlEb2NzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5kYXRhTGF5ZXIucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiZXZlbnRcIjogXCJzZWFyY2gtcmVzdWx0cy1haVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBhZ2VUZW1wbGF0ZVwiOiBcIlNlYXJjaFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwic2VhcmNoLXJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlNlYXJjaCBSZXN1bHRzIEFJIEVycm9yXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHByb21wdC5yZXBsYWNlQWxsKCdcXFwiJywnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCIwXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicmVzcG9uc2VUeXBlXCI6IFwiU2VhcmNoIFJlc3VsdCBubyBBSVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRhdGEuYWlfc3RhdHVzX3NlY29uZF9jYWxsX2ZhaWwgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKFwiQmVhY29uIGRvY3MgYXhpb3MgZXJyb3IgbWVzc2FnZTogXCIgKyBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cgJiYgd2luZG93LmRhdGFMYXllcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImV2ZW50XCI6IFwic2VhcmNoLXJlc3VsdHMtYWlcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInBhZ2VUZW1wbGF0ZVwiOiBcIlNlYXJjaFJlc3VsdHNcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJTZWFyY2ggUmVzdWx0cyBBSSBFcnJvclwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IHByb21wdC5yZXBsYWNlQWxsKCdcXFwiJywnJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIjBcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInJlc3BvbnNlVHlwZVwiOiBcIlNlYXJjaCBSZXN1bHQgbm8gQUlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLmFpX3N0YXR1c19zZWNvbmRfY2FsbF9mYWlsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm9sZElucHV0UXVlcnkgPSB0aGlzLmRhdGEuaW5wdXRRdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgc2V0QUlSZWZzVmFsdWVzKGFpKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgc2F2ZSBkb2N1bWVudHMgYW5kIGRvY0lkXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haV9jaGF0X2RvY19pZCA9IGFpLmNoYXRfZG9jX2lkLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWkuc291cmNlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgYWkuc291cmNlc1tpXS5zb3VyY2VfdGl0bGUgPSBhaS5zb3VyY2VzW2ldLnNvdXJjZV90aXRsZS5yZXBsYWNlKC9cXFxcL2csICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBsZXQgc291cmNlcyA9IGFpLnNvdXJjZXMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfc291cmNlcyA9IGFpLnNvdXJjZXMuc2xpY2UoMCwgKHNvdXJjZXMgPiAyID8gMiA6IHNvdXJjZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3NvdXJjZXNfZGVza3RvcCA9IGFpLnNvdXJjZXMuc2xpY2UoMCwgKHNvdXJjZXMgPiA0ID8gNCA6IHNvdXJjZXMpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3NvdXJjZXNfYWxsID0gYWkuc291cmNlcztcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgc2V0QUlEb2NzVmFsdWVzKGFpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlciA9IG5ldyBzaG93ZG93bi5Db252ZXJ0ZXIoe2Rpc2FibGVGb3JjZWQ0U3BhY2VzSW5kZW50ZWRTdWJsaXN0czogdHJ1ZSwgb3BlbkxpbmtzSW5OZXdXaW5kb3c6IHRydWV9KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX3Jlc3BvbnNlID0gY29udmVydGVyLm1ha2VIdG1sKGFpLnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmFpX2Rpc2NsYWltZXIgPSBhaS5kaXNjbGFpbWVyO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuYWlfcmVsYXRlZF9xdWVzdGlvbnMgPSBhaS5yZWxhdGVkX3F1ZXN0aW9ucztcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgbG9hZE1vcmUoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwibG9hZCBtb3JlXCIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSB0aGlzLmRhdGEuY3VycmVudFBhZ2UgKyAxO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5heGlvc1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZGF0YS5heGlvc1BhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhZ2U6IHRoaXMuZGF0YS5jdXJyZW50UGFnZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2codGhpcy5kYXRhLmF4aW9zUGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gd2luZG93LnNlYXJjaEFQSVVybDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFwaVVybCA9IGAke2Jhc2VVcmx9JHtiYXNlVXJsLmluZGV4T2YoJz8nKSA+IC0xID8gJycgOiAnPyd9YDtcbiAgICAgICAgICAgICAgICAgICAgLy8gbGV0IGFwaVVybCA9IFwiaHR0cDovL2xvY2FsaG9zdDozMDAzL3NlYXJjaFJlc3VsdHMyXCI7IC8vZnJvbSBqc29uLXNlcnZlclxuXG4gICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldChhcGlVcmwsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnRoaXMuZGF0YS5heGlvc1BhcmFtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlbGYuZGF0YS5yZXN1bHRzLnB1c2goLi4ucmVzcG9uc2UuZGF0YS5yZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzLm1hcCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtLnRpdGxlICYmIGl0ZW0uZmlsdGVyVGV4dCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50aXRsZS5pbmRleE9mKFwiPHA+XCIpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uaXRlbSwgXCJ0aXRsZVwiOiBgPHA+JHtpdGVtLnRpdGxlLnJlcGxhY2UoXCI8cD5cIiwgXCJcIil9YH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7Li4uaXRlbSwgXCJ0aXRsZVwiOiBgJHtpdGVtLnRpdGxlfWB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gey4uLml0ZW19XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkxPQUQgTU9SRVwiLCByZXN1bHRzKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdHMpIHtzZWxmLmRhdGEucmVzdWx0cy5wdXNoKC4uLnJlc3VsdHMpfVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzdWJtaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2xvYmFsX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlYXJjaC1yZXN1bHRzX19pbnB1dC1jb250YWluZXJfX2RpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbG9iYWxfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNlYXJjaC1yZXN1bHRzX19pbnB1dC1jb250YWluZXJfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVIaXN0b3J5KHRoaXMuZGF0YS5pbnB1dFF1ZXJ5KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnF1ZXJ5ID0gdGhpcy5kYXRhLmlucHV0UXVlcnk7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNldCBsb2FkaW5nIGljb24gc3RhdGVzXG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHJlZmlsdGVyKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcGFyYW1zID0gZ2V0VXJsUGFyYW1ldGVyKCdmaWx0ZXJzJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbXNBcnJheSA9IHBhcmFtcy5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcnMgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGhhcyBmaWx0ZXIgcGFyYW1zLCBkdW1wIHRoZW0gaW50byBmaWx0ZXJzIGFycmF5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zQXJyYXkuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFt2YWx1ZT1cIiR7aXRlbX1cIl1gKSA/IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYFt2YWx1ZT1cIiR7aXRlbX1cIl1gKS5nZXRBdHRyaWJ1dGUoJ25hbWUnKSA6IG51bGw7XG4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYCR7aXRlbX1gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IGZpbHRlcnM7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlkWW91TWVhbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coJ2RpZFlvdU1lYW4oJyxlLCcpJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IGUudGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWVyeSA9ICcsIHF1ZXJ5LCAnZSA9ICcsIGUsIGUudGFyZ2V0KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlucHV0UXVlcnkgPSBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHVwZGF0ZUhpc3RvcnkocSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudFBhcmFtID0gXCI/cT1cIiArIGdldFVybFBhcmFtZXRlcigncScpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmV3VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWYucmVwbGFjZShjdXJyZW50UGFyYW0sIFwiP3E9XCIrZW5jb2RlVVJJQ29tcG9uZW50KHEpKTtcbiAgICAgICAgICAgICAgICAgICAgaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgJycsIG5ld1VybCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBuYXZIaXN0b3J5KCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcXVlcnkgPSBnZXRVcmxQYXJhbWV0ZXIoJ3EnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpbHRlcnMgPSBnZXRVcmxQYXJhbWV0ZXIoJ2ZpbHRlcnMnKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5nbG9iYWxfX3Blb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkNvbnRhaW5lciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zZWFyY2gtcmVzdWx0c19faW5wdXQtY29udGFpbmVyX19wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZ2xvYmFsX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc2VhcmNoLXJlc3VsdHNfX2lucHV0LWNvbnRhaW5lcl9fZGlkeW91bWVhbicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaW5wdXRRdWVyeSA9IHF1ZXJ5LnJlcGxhY2UoL1xcKy9nLCBcIiBcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9cXCsvZywgXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG5cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGluaXQgaXMgbW9iaWxlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5pc01vYmlsZSA9IHN0b3JlLnN0YXRlLmlzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICAvLyBpbml0IHNhdmVkIGRvY3NcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFsbFNhdmVkID0gW107XG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZCA9IHN0b3JlLnN0YXRlLmZhdm9yaXRlcztcblxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHNhdmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbGxTYXZlZCA9IFsuLi5hbGxTYXZlZCwgLi4uc2F2ZWRbcHJvcF1dO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jcyA9IGFsbFNhdmVkLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0gIT09IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaW5pdCBmaWx0ZXJzIHN0YXRlXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZSA9IHRoaXMuZGF0YS5pc01vYmlsZSA/IGZhbHNlIDogdHJ1ZTsgLy9pbml0IFxuICAgICAgICAgICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLnNlYXJjaCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXJ5ID0gZ2V0VXJsUGFyYW1ldGVyKCdxJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgZmlsdGVycyA9IGdldFVybFBhcmFtZXRlcignZmlsdGVycycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlucHV0UXVlcnkgPSBxdWVyeS5yZXBsYWNlKC9cXCsvZywgXCIgXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnF1ZXJ5ID0gcXVlcnkucmVwbGFjZSgvXFwrL2csIFwiIFwiKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgYXBpIGNhbGwgZm9yIHJlc3VsdHMgaWYgbm8gZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGRhdGEuZmlsdGVyc1tdIHdpbGwgdXBkYXRlIGFuZCB0aGUgd2F0Y2hlciB3aWxsIHRyaWdnZXIgXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhbm90aGVyIGFwaSBjYWxsXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVlcnkgJiYgIWZpbHRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5vbnBvcHN0YXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5uYXZIaXN0b3J5KCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbiBmb3IgZmlsdGVyIHVwZGF0ZXMgaW4gY2hpbGRyZW5cbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCd1cGRhdGVGaWx0ZXJzJywgKGVsLCBlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdyZW1vdmUtZmlsdGVyJywgKGVsLCB2YWx1ZSwgdHlwZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVGaWx0ZXIoZWwsIHZhbHVlLCB0eXBlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0U3VibWl0KCk7XG5cblxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFN1Ym1pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhLmlzTW9iaWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLiRyZWZzLnNlYXJjaEJhck1vYmlsZS5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2VhcmNoQmFyRGVza3RvcC5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIiwgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cubG9jYXRpb24uc2VhcmNoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucHJlZmlsdGVyKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLiRyZWZzICYmIHRoaXMuJHJlZnMuYWlTZWFyY2hEZXNjKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5haVNlYXJjaERlc2NIZWlnaHQgPSB0aGlzLiRyZWZzLmFpU2VhcmNoRGVzYy5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHVwZGF0ZWQoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzZWxmLiRyZWZzICYmIHNlbGYuJHJlZnMuYWlTZWFyY2hEZXNjKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgb2xkaGVpZ2h0ID0gc2VsZi5kYXRhLmFpU2VhcmNoRGVzY0hlaWdodDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5haVNlYXJjaERlc2NIZWlnaHQgPSBzZWxmLiRyZWZzLmFpU2VhcmNoRGVzYy5vZmZzZXRIZWlnaHQ7XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9sZGhlaWdodCAhPSBzZWxmLmRhdGEuYWlTZWFyY2hEZXNjSGVpZ2h0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5yZXJlbmRlclNob3dNb3JlKys7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAxMDAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnY2hlY2tib3gtaXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnLCAnbmFtZScsICd0eXBlJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgaXNDaGVja2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaXNBY3RpdmU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIGNvdW50OiAwLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNoZWNrU3RhdGUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5jb3VudHNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q291bnQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICB0YWdnaW5nTWV0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh7XG4gICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJzZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJTZWFyY2hcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiYWN0aW9uXCI6IFwiRmlsdGVyc1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJyZXN1bHRDb3VudFwiOiB0aGlzLmNvdW50ID8gdGhpcy5jb3VudCA6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHVwZGF0ZUZpbHRlcnMoZWwsIGUsIHR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3VwZGF0ZUZpbHRlcnMnLCBlbCwgZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGVja1N0YXRlKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pZCA9PSBcIlNhdmVkJTIwZG9jdW1lbnRzJTIwb25seVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuZGF0YS5maWx0ZXJzLmZpbmQoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoZWwubmFtZSkgPT0gdGhpcy5pZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0NoZWNrZWQgPSBpdGVtID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGl0ZW0gPSB0aGlzLmRhdGEuZmlsdGVycy5maW5kKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KGVsLnZhbHVlKSA9PSB0aGlzLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQ2hlY2tlZCA9IGl0ZW0gPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNldENvdW50KCkge1xuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKFwic2V0IGNvdW50XCIpXG4gICAgICAgICAgICAgICAgICAgIGxldCBwYXJhbU5hbWUgPSB0aGlzLiRyZWZzLmlucHV0LnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICBsZXQgY291bnRPYmogPSB0aGlzLmRhdGEuY291bnRzLmZpbHRlcigoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW0uZmlsdGVyVmFsdWUudG9TdHJpbmcoKSA9PT0gcGFyYW1OYW1lO1xuICAgICAgICAgICAgICAgICAgICB9KVswXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50T2JqID8gY291bnRPYmouY291bnQgOiAwO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbCA9IHRoaXMuJHJlZnMubGFiZWwuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaWQgPSBlbmNvZGVVUklDb21wb25lbnQodGhpcy4kcmVmcy5pbnB1dC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jaGVja1N0YXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRDb3VudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIEFJIFNlYXJjaFxuICAgICAgICAvLyBWdWUuY29tcG9uZW50KCdhaS1kZXNjJywge1xuICAgICAgICAvLyAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAvLyAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgLy8gICAgICAgICB9XG4gICAgICAgIC8vICAgICB9LFxuICAgICAgICAvLyAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgLy8gICAgIDxkaXYgdi1odG1sPVwiZGF0YS5haV9yZXNwb25zZVwiIHJlZj1cImFpU2VhcmNoRGVzY1wiPjwvZGl2PlxuICAgICAgICAvLyAgICAgYCxcbiAgICAgICAgICAgIFxuICAgICAgICAvLyAgICAgdXBkYXRlZCgpIHtcbiAgICAgICAgLy8gICAgICAgICB0aGlzLmRhdGEuYWlTZWFyY2hEZXNjSGVpZ2h0ID0gdGhpcy4kcmVmcy5haVNlYXJjaERlc2Mub2Zmc2V0SGVpZ2h0O1xuICAgICAgICAvLyAgICAgICAgIGNvbnNvbGUubG9nKFwidGhpcy5kYXRhID0gXCIsdGhpcy5kYXRhKTtcbiAgICAgICAgLy8gICAgICAgICBjb25zb2xlLmxvZygnLS0tLS0tLS0tLS0tLT4gb2Zmc2V0SGVpZ2h0ID0gJywgdGhpcy5kYXRhLmFpU2VhcmNoRGVzY0hlaWdodCk7XG4gICAgICAgIC8vICAgICB9XG4gICAgICAgIC8vIH0pO1xuICAgICAgICBcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnYWktZGlzY2xhaW1lcicsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHRlbXBsYXRlOiBgXG4gICAgICAgICAgICA8ZGl2Pnt7ZGF0YS5haV9kaXNjbGFpbWVyfX08L2Rpdj5cbiAgICAgICAgICAgIGBcbiAgICAgICAgfSk7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2FpLXJlbGF0ZWQtcXVlc3Rpb25zJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1xdWVzdGlvblwiIHYtZm9yPVwiaXRlbSBpbiBkYXRhLmFpX3JlbGF0ZWRfcXVlc3Rpb25zXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgdi1vbjpjbGljaz1cInNlYXJjaFJlbGF0ZWRRdWVzdGlvbigkZXZlbnQpXCI+e3tpdGVtfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBzZWFyY2hSZWxhdGVkUXVlc3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaW5wdXRRdWVyeSA9IGUuY3VycmVudFRhcmdldC5pbm5lclRleHQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHBhcmVudC5zdWJtaXQoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICBWdWUuY29tcG9uZW50KCdhaS1zb3VyY2VzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1kb2MtaXRlbVwiIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBkYXRhLmFpX3NvdXJjZXNcIiA6a2V5PVwiaW5kZXhcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1kb2MtaXRlbS1pbWFnZVwiIHYtb246Y2xpY2s9XCJpbWFnZVJlZGlyZWN0KGl0ZW0uc291cmNlX3VybClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpbWcgOnNyYz1cIml0ZW0uc291cmNlX3RodW1ibmFpbFwiIC8+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8cD5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7aXRlbS5zb3VyY2VfdGl0bGV9fSBbe3tpbmRleCArIDF9fV1cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhaS1zZWFyY2gtZG9jLWl0ZW1cIiB2LWZvcj1cIihpdGVtKSBpbiAoKE1hdGguY2VpbChkYXRhLmFpX3NvdXJjZXMubGVuZ3RoLzIpICogMikgLSBkYXRhLmFpX3NvdXJjZXMubGVuZ3RoKVwiPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbWFnZVJlZGlyZWN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnYWktc291cmNlcy1kZXNrdG9wJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1kb2MtaXRlbVwiIHYtZm9yPVwiKGl0ZW0sIGluZGV4KSBpbiBkYXRhLmFpX3NvdXJjZXNfZGVza3RvcFwiIDprZXk9XCJpbmRleFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYWktc2VhcmNoLWRvYy1pdGVtLWltYWdlXCIgdi1vbjpjbGljaz1cImltYWdlUmVkaXJlY3QoaXRlbS5zb3VyY2VfdXJsKVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGltZyA6c3JjPVwiaXRlbS5zb3VyY2VfdGh1bWJuYWlsXCIgLz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxwPlxuICAgICAgICAgICAgICAgICAgICAgICAge3tpdGVtLnNvdXJjZV90aXRsZX19IFt7e2luZGV4ICsgMX19XVxuICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFpLXNlYXJjaC1kb2MtaXRlbVwiIHYtZm9yPVwiKGl0ZW0pIGluICgoTWF0aC5jZWlsKGRhdGEuYWlfc291cmNlc19kZXNrdG9wLmxlbmd0aC80KSAqIDQpIC0gZGF0YS5haV9zb3VyY2VzX2Rlc2t0b3AubGVuZ3RoKVwiPlxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbWFnZVJlZGlyZWN0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgXG4gICAgICAgIC8vIHJlc3VsdHMgbGlzdFxuICAgICAgICBWdWUuY29tcG9uZW50KCdyZXN1bHRzLWxpc3QnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2lzTG9hZGluZyddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtcmVzdWx0c19fY2FyZHMtY29udGVudFwiPlxuICAgICAgICAgICAgICAgIDxyZXN1bHRzLWl0ZW0gdi1mb3I9XCIocmVzdWx0LCBpbmRleCkgaW4gZGF0YS5yZXN1bHRzXCIgOmNvbnRlbnQ9XCJyZXN1bHRcIiAgOmtleT1cImluZGV4XCIgOmRhdGE9XCJkYXRhXCIgOmlzTG9hZGluZz1cImlzTG9hZGluZ1wiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc2luZ2xlIHJlc3VsdHMgaXRlbVxuICAgICAgICBWdWUuY29tcG9uZW50KCdyZXN1bHRzLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2NvbnRlbnQnLCAnaXNMb2FkaW5nJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHRUeXBlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGw6IG51bGwsIC8vaXMgXCJzZWUgYWxsXCIgZmVhdHVyZSBlbmFibGVkLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxPcGVuOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWVBbGxMYWJlbDogbnVsbCwvL2xhYmVsXG4gICAgICAgICAgICAgICAgICAgIG1vcmVDb250ZW50OiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgXCJzZWVBbGxcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlZUFsbCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWVBbGxMYWJlbCA9IHRoaXMuc2VlQWxsT3BlbiA/IHdpbmRvdy5zZWVMZXNzTGFiZWwgOiB3aW5kb3cuc2VlQWxsTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwic2VlQWxsT3BlblwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VlQWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbExhYmVsID0gdGhpcy5zZWVBbGxPcGVuID8gd2luZG93LnNlZUxlc3NMYWJlbCA6IHdpbmRvdy5zZWVBbGxMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBcImhpZ2hsaWdodGVkQ29weVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLmRhdGEucXVlcnksIFwiZ2lcIilcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudC5kZXNjcmlwdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VUZXh0ID0gdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybk1hdGNoID0gdGhpcy5jb250ZW50LmRlc2NyaXB0aW9uLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuTWF0Y2ggIT09IG51bGwgJiYgcGF0dGVybk1hdGNoLmxlbmd0aCA+IDApIHsgcmVwbGFjZVRleHQgPSBwYXR0ZXJuTWF0Y2hbMF19XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQuZGVzY3JpcHRpb24ucmVwbGFjZShyZWdleCxgPHNwYW4gY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2NvcHktLWhpZ2hsaWdodGVkXCI+JHtyZXBsYWNlVGV4dH08L3NwYW4+YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiaGlnaGxpZ2h0ZWRUaXRsZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0aGlzLmRhdGEucXVlcnksIFwiZ2lcIilcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udGVudC50aXRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIlRFU1QgVEVTVFwiLCB0aGlzLmNvbnRlbnQudGl0bGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlcGxhY2VUZXh0ID0gdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0dGVybk1hdGNoID0gdGhpcy5jb250ZW50LnRpdGxlLm1hdGNoKHJlZ2V4KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuTWF0Y2ggIT09IG51bGwgJiYgcGF0dGVybk1hdGNoLmxlbmd0aCA+IDApIHsgcmVwbGFjZVRleHQgPSBwYXR0ZXJuTWF0Y2hbMF19XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRlbnQudGl0bGUucmVwbGFjZShyZWdleCxgPHNwYW4gY2xhc3M9XCJyZXN1bHRzLWNhcmRfX3RpdGxlLS1oaWdobGlnaHRlZFwiPiR7cmVwbGFjZVRleHR9PC9zcGFuPmApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC50aXRsZTsgLy8gZmFsbGJhY2ssIGRlZmF1bHQgdG8ganVzdCB0aXRsZVxuICAgICAgICAgICAgICAgIH0sICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIFwibmV3VGFiTGlua1wiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udGVudC5saW5rVXJsID8gdGhpcy5jb250ZW50LmxpbmtVcmwucmVwbGFjZSgnZG93bmxvYWQ9dHJ1ZScsICdkb3dubG9hZD1mYWxzZScpIDogbnVsbDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiaHJlZlRhcmdldFwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmV3VGFiTGluaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubmV3VGFiTGluay5pbmNsdWRlcygnZG93bmxvYWQ9ZmFsc2UnKSA/ICdfYmxhbmsnIDogJ19zZWxmJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJ0cmlnZ2VyXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHJhY2thYmxlO1xuICAgICAgICAgICAgICAgICAgICAvLyBmb3IgKGxldCBwcm9wIGluIHdpbmRvdy5zZWFyY2hGaWx0ZXJWYWx1ZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIGlmICh3aW5kb3cuc2VhcmNoRmlsdGVyVmFsdWVzW3Byb3BdID09IHRoaXMuY29udGVudC5maWx0ZXJWYWx1ZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRyYWNrYWJsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRyYWNrYWJsZSA/IFwiY2xpY2tcIiA6IG51bGw7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBcInRhZ2dpbmdNZXRhXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbWV0YTsgICBcbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgKHRoaXMucmVzdWx0VHlwZSkge1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3dpdGNoICh0aGlzLnJlc3VsdFR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjYXNlICdkb2N1bWVudGF0aW9uJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbWV0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwidHlwZVwiOiBcImRvY3VtZW50XCIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcInByb2R1Y3RMaW5lXCI6IFwiXCIsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcImxhbmd1YWdlXCI6IFwiXCJcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBjYXNlICdzb2Z0d2FyZSc6XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG1ldGEgPSB7XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJhcHBcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwibGFiZWxcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwicHJvZHVjdExpbmVcIjogXCJcIixcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgIFwibGFuZ3VhZ2VcIjogXCJcIlxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIGNhc2UgJ3Byb2R1Y3RzJzpcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgbWV0YSA9IHsgICAgXG4gICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJsYXllclwiLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIlByZXZpZXcgQ2FyZFwiLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgXCJwcm9kdWN0TGluZVwiOiBcIlwiLFxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLmNvbnRlbnQucmF3VGl0bGVcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIC8vICAgICB9XG4gICAgICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXRhID8gSlNPTi5zdHJpbmdpZnkobWV0YSkgOiBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdHMtY2FyZFwiPlxuICAgICAgICAgICAgPGEgOmhyZWY9XCJuZXdUYWJMaW5rXCIgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2xpbmtcIiA6dGFyZ2V0PVwiaHJlZlRhcmdldFwiIDpkYXRhLXRhZy10cmlnZ2VyPVwidHJpZ2dlclwiIDpkYXRhLXRhZy1tZXRhPVwidGFnZ2luZ01ldGFcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdWx0cy1jYXJkX193cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX3Jvd1wiIDpjbGFzcz1cIntpc3Byb2R1Y3Q6IGNvbnRlbnQuaXNQcm9kdWN0fVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdHMtY2FyZF9fYXJlYSByZXN1bHRzLWNhcmRfX2FyZWEtaW1hZ2VcIiB2LWlmPVwiY29udGVudC5pbWFnZVVybFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2ltYWdlLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW1nIDpzcmM9XCJjb250ZW50LmltYWdlVXJsXCIgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2ltYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyZXN1bHRzLWNhcmRfX2FyZWEgcmVzdWx0cy1jYXJkX19hcmVhLWNvcHlcIj5cblxuXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicmVzdWx0cy1jYXJkX190aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc3VsdHMtY2FyZF9fdGl0bGUtY29udGVudFwiIHJlZj1cInNlZUFsbENvbnRlbnRcIiB2LWh0bWw9XCJoaWdobGlnaHRlZFRpdGxlXCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInJlc3VsdHMtY2FyZF9fdGl0bGUtbW9yZVwiIHYtaWY9XCJzZWVBbGwgJiYgc2VlQWxsT3BlblwiIHYtaHRtbD1cIm1vcmVDb250ZW50XCI+PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIHYtb246Y2xpY2sucHJldmVudD1cInRvZ2dsZVNlZUFsbFwiIHYtaWY9XCJzZWVBbGxcIiB2LWh0bWw9XCJzZWVBbGxMYWJlbFwiPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJlc3VsdHMtY2FyZF9fY29weVwiIHYtaHRtbD1cImhpZ2hsaWdodGVkQ29weVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXQoKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gd2luZG93LnNlYXJjaEZpbHRlclZhbHVlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5zZWFyY2hGaWx0ZXJWYWx1ZXNbcHJvcF0gPT0gdGhpcy5jb250ZW50LmZpbHRlclZhbHVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRUeXBlID0gcHJvcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9nZ2xlU2VlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbE9wZW4gPSAhdGhpcy5zZWVBbGxPcGVuO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaW5pdFNlZUFsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRldGFpbHMgPSB0aGlzLiRyZWZzLnNlZUFsbENvbnRlbnQuaW5uZXJIVE1MLnNwbGl0KCcsJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlZUFsbCA9IGRldGFpbHMubGVuZ3RoID4gMyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRydW5jYXRlZERldGFpbHMgPSBkZXRhaWxzLnNsaWNlKDAsMykuam9pbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1vcmVEZXRhaWxzID0gZGV0YWlscy5zbGljZSgzKS5qb2luKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9yZUNvbnRlbnQgPSBtb3JlRGV0YWlscztcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuJHJlZnMuc2VlQWxsQ29udGVudC5pbm5lckhUTUwgPSBgJHt0cnVuY2F0ZWREZXRhaWxzfSR7bW9yZURldGFpbHMgPT0gXCJcIiA/ICcnIDogJywnfWA7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmluaXQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRTZWVBbGwoKTtcblxuICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcbiAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0cmFja0lkID0gc2VsZi5kYXRhLnRyYWNrSWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBoaXRJZCA9IHNlbGYuY29udGVudC5oaXRJZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeSA9IHNlbGYuZGF0YS5xdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBgL2FwaS9TZWFyY2hIaXQ/cT0ke2VuY29kZVVSSUNvbXBvbmVudChxdWVyeSl9Jmg9JHtlbmNvZGVVUklDb21wb25lbnQoaGl0SWQpfSZ0PSR7ZW5jb2RlVVJJQ29tcG9uZW50KHRyYWNrSWQpfWBcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxBbmNob3JzID0gc2VsZi4kZWwucXVlcnlTZWxlY3RvckFsbCgnYScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxsQW5jaG9ycy5mb3JFYWNoKGVsID0+IGVsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF4aW9zLmdldCh1cmwpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZyhcIi0tPiBUcmFja2luZyByZXNwb25zZTogXCIsIHJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdzZWxlY3RlZEZpbHRlcnMnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzZWFyY2gtcmVzdWx0c19fc2VsZWN0ZWQtZmlsdGVyc1wiIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWxhYmVsXCIgdi1mb3I9XCJmaWx0ZXIgaW4gZGF0YS5maWx0ZXJzXCIgOmtleT1cImZpbHRlci52YWx1ZVwiIDpkYXRhLXZhbHVlPVwiZmlsdGVyLnZhbHVlXCIgOmRhdGEtdHlwZT1cImZpbHRlci50eXBlXCIgdi1vbjpjbGljaz1cInJlbW92ZUZpbHRlcigkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmlsdGVyLWxhYmVsX193cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWx0ZXItbGFiZWxfX2ljb25cIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJmaWx0ZXItbGFiZWxfX3RleHRcIj57e2ZpbHRlci5uYW1lfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHJlbW92ZUZpbHRlcihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB0eXBlID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZS5jdXJyZW50VGFyZ2V0LmRhdGFzZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUuY3VycmVudFRhcmdldCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdyZW1vdmUtZmlsdGVyJywgdGhpcy5kYXRhLmNsYXNzLCB2YWx1ZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ2ZpbHRlci1hY2NvcmRpb24tdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2RlZmF1bHRvcGVuJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpc09wZW46ICh0aGlzLmRlZmF1bHRvcGVuID8gdHJ1ZSA6IGZhbHNlKSwgLy9pcyB0aGUgYWNjb3JkaW9uIG9wZW5cbiAgICAgICAgICAgICAgICAgICAgc2VlQWxsVHlwZXNUZXh0OiBmYWxzZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHByb2R1Y3RGaWx0ZXJzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YS5wcm9kdWN0cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQ2xpY2soKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG9nZ2xlQWNjb3JkaW9uKCk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIHRvZ2dsZUFjY29yZGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRBcmVhID0gdGhpcy4kcmVmcy5vdXRlckNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSB0aGlzLiRyZWZzLmlubmVyQ29udGFpbmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmhlaWdodDtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc09wZW4gPT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc2V0IGNvbnRlbnQgYXJlYSBoZWlnaHQgdG8gY29udGVudCBoZWlnaHQgdG8gcHJldmVudCB0cmFuc2l0aW9uaW5nIGZyb20gYXV0b1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyAncHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbiB0byBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICcwcHgnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzAnO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9IGNvbnRlbnRIZWlnaHQgKyBcInB4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0b2dnbGVTZWVBbGwoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VlQWxsVHlwZXNUZXh0ID0gIXRoaXMuc2VlQWxsVHlwZXNUZXh0XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5zZWFyY2gtcmVzdWx0cy0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAuc2VhcmNoLXJlc3VsdHMtJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoc2VhcmNoLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc2VhcmNoLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHNlYXJjaC1yZXN1bHRzLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBzZWFyY2hSZXN1bHRzQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxuICAgIC8vIHdpbmRvdy5zZWFyY2hGaWx0ZXJWYWx1ZXMgPSB7XG4gICAgLy8gICAgIGRvY3VtZW50YXRpb246IDE1NyxcbiAgICAvLyAgICAgc29mdHdhcmU6IDU5LFxuICAgIC8vICAgICBwcm9kdWN0czogMTU4XG4gICAgLy8gfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IHNlYXJjaFJlc3VsdHM7XG4iLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xyXG5pbXBvcnQgVk1vZGFsIGZyb20gJ3Z1ZS1qcy1tb2RhbCc7XHJcbmltcG9ydCB7IHZpZGVvTW9kYWwgfSBmcm9tICcuL21vZGFscyc7XHJcblxyXG5cclxuXHJcbmNvbnN0IFNsaWRlc2hvdyA9ICgpID0+IHtcclxuICAgIGNvbnN0IHNsaWRlc2hvd0VsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3NsaWRlc2hvdy1zbGlkZXInKVxyXG4gICAgaWYgKCFzbGlkZXNob3dFbCkgcmV0dXJuO1xyXG4gICAgY29uc3Qgc2xpZGVzRWwgPSBzbGlkZXNob3dFbC5xdWVyeVNlbGVjdG9yQWxsKCcuc2xpZGVyLXNsaWRlcyAuc2xpZGUnKTtcclxuXHJcbiAgICBjb25zdCBTbGlkZXNob3dDb25zdHJ1Y3RvciA9ICgpID0+IHtcclxuICAgICAgICBsZXQgYWN0aXZlU2xpZGUgPSAxO1xyXG4gICAgICAgIGNvbnN0IGFycm93TCA9IHNsaWRlc2hvd0VsLnF1ZXJ5U2VsZWN0b3IoJy5zbGlkZXItY29udHJvbHMgLmFycm93LkwnKTtcclxuICAgICAgICBjb25zdCBhcnJvd1IgPSBzbGlkZXNob3dFbC5xdWVyeVNlbGVjdG9yKCcuc2xpZGVyLWNvbnRyb2xzIC5hcnJvdy5SJyk7XHJcbiAgICAgICAgY29uc3QgcGF1c2VQbGF5ID0gc2xpZGVzaG93RWwucXVlcnlTZWxlY3RvcignLnNsaWRlci1jb250cm9scyAuY2lyY3VsYXItcHJvZ3Jlc3MnKTtcclxuICAgICAgICBjb25zdCB0b3RhbFNsaWRlcyA9IHNsaWRlc0VsLmxlbmd0aDtcclxuICAgICAgICBjb25zdCBzbGlkZXNWaWRlb3MgPSBzbGlkZXNob3dFbC5xdWVyeVNlbGVjdG9yQWxsKCd2aWRlbycpO1xyXG4gICAgICAgIGNvbnN0IG1vZGFsVHJpZ2dlcnMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudmlkZW8tcGxheWVyLWxpbmsgYnV0dG9uJylcclxuXHJcbiAgICAgICAgY29uc3QgY2lyY2xlID0gc2xpZGVzaG93RWwucXVlcnlTZWxlY3RvcignLnNsaWRlci1jb250cm9scyBjaXJjbGUuZmcnKTtcclxuICAgICAgICBjb25zdCBjaXJjbGVTaXplID0gMzA7IC8vIHRoaXMgaXMgdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2Ygc3ZnIChzaG91bGQgYmUgYSBzcXVhcmUgdGhhdCBmaXRzIHRoZSBjaXJjbGUpXHJcbiAgICAgICAgY29uc3Qgc3Ryb2tlVyA9IDJcclxuICAgICAgICBjb25zdCByYWRpdXMgPSAoY2lyY2xlU2l6ZSAtIHN0cm9rZVcpIC8gMlxyXG4gICAgICAgIGNvbnN0IGNpcmN1bWZlcmVuY2UgPSByYWRpdXMgKiBNYXRoLlBJICogMjtcclxuXHJcbiAgICAgICAgY29uc3QgbWF4VGltZSA9IDEwMDAwOyAvLyBpbiBtaWxpc2Vjb25kc1xyXG4gICAgICAgIGNvbnN0IHRpbWVzUGVyU2VjID0gMTAwXHJcbiAgICAgICAgXHJcbiAgICAgICAgbGV0IHNsaWRlckludGVydmFsICAgICAgPSBudWxsXHJcbiAgICAgICAgbGV0IHRpbWVFbGFwc2VkICAgICAgICAgPSAwXHJcbiAgICAgICAgbGV0IGlzQXV0b1BsYXlpbmcgICAgICAgPSB0cnVlO1xyXG4gICAgICAgIGxldCBwbGF5aW5nQmVmb3JNb2RhbCAgID0gdHJ1ZTtcclxuICAgICAgICBsZXQgcmVzaXplVGltZW91dCAgICAgICA9IG51bGw7XHJcbiAgICAgICAgbGV0IGxhc3RTY3JlZW5XICAgICAgICAgPSAwO1xyXG5cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gdXBkYXRlIG1vYmlsZS9kZXNrdG9wIHZpZGVvIGJhY2tncm91bmQgaWYgYW55XHJcbiAgICAgICAgY29uc3QgcmVzcG9uc2l2ZVZpZGVvVXBkYXRlID0gZnVuY3Rpb24gKCkge1xyXG4gICAgICAgICAgICBpZiAoc2xpZGVzVmlkZW9zLmxlbmd0aCA+IDAgJiYgd2luZG93LmlubmVyV2lkdGggICE9IGxhc3RTY3JlZW5XKSBcclxuICAgICAgICAgICAgICAgIHtcclxuICAgICAgICAgICAgICAgIGxhc3RTY3JlZW5XID0gd2luZG93LmlubmVyV2lkdGggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgdG8gbWFrZSBzdXJlIG9ubHkgd2lkdGggaXMgY2hhbmdpbmcuIG1vYmlsZSBkZXZpY2VzIGFkIGEgbWVudSB0aGF0IG1ha2VzIHRoZSB3aW5kb3cgc21hbGxlciB2ZXJ0aWNhbGx5XHJcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmlubmVyV2lkdGggPD0gOTAwKSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGlkZXNWaWRlb3MubGVuZ3RoOyBpKyspIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZCA9IHNsaWRlc1ZpZGVvc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdmlkLmRhdGFzZXQubW9iO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsICE9IFwibm9uZVwiKSB7IHZpZC5zcmMgPSB1cmwgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgZWxzZSBcclxuICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzbGlkZXNWaWRlb3MubGVuZ3RoOyBpKyspIFxyXG4gICAgICAgICAgICAgICAgICAgICAgICB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZCA9IHNsaWRlc1ZpZGVvc1tpXTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdmlkLmRhdGFzZXQuZGVzaztcclxuICAgICAgICAgICAgICAgICAgICAgICAgdmlkLnNyYyA9IHVybDtcclxuICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgICAgIH1cclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyBzdG9wIHZpZGVvc1xyXG4gICAgICAgIGNvbnN0IHBsYXlBbGxWaWRzID0gZnVuY3Rpb24gKHdpbGxQbGF5KSB7XHJcbiAgICAgICAgICAgIGxldCB2aWRzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgndmlkZW8nKVxyXG5cclxuICAgICAgICAgICAgaWYgKHdpbGxQbGF5KSB7XHJcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZHMubGVuZ3RoOyBpKyspIHsgdmlkc1tpXS5wbGF5KCk7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHtcclxuICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdmlkcy5sZW5ndGg7IGkrKykgeyB2aWRzW2ldLnBhdXNlKCk7IH1cclxuICAgICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHZpZGVvIGNvbnRyb2xzIGZvciB3aGVuIHBvcHVwIG9wZW5zL2Nsb3Nlc1xyXG4gICAgICAgIGlmIChzbGlkZXNWaWRlb3MubGVuZ3RoID4gMCAmJiBtb2RhbFRyaWdnZXJzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICAgICAgLy8gbW9kYWwgdHJpZ2dlciBidXR0b25zIGluIHNsaWRlc2hvdyBzdG9wIGFsbCB2aWRlb3NcclxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb2RhbFRyaWdnZXJzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgICAgICBtb2RhbFRyaWdnZXJzW2ldLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICAgICAgICAgIHBsYXlBbGxWaWRzKGZhbHNlKTtcclxuICAgICAgICAgICAgICAgICAgICBpc0F1dG9QbGF5aW5nID0gZmFsc2VcclxuICAgICAgICAgICAgICAgICAgICB0b2dnbGVJbnRlcnZhbChpc0F1dG9QbGF5aW5nKVxyXG4gICAgICAgICAgICAgICAgfSk7XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgLyogbm90IG5lZWRlZCBiZWNhdXNlIHRoZSBvYnNlcnZlciBzZWVzIHdoZW4gbW9kYWwgZGlzYXBlYXJzIGluc3RlYWQgb2Ygd2hlbiBjbG9zZSBidXR0b24gaXMgcHJlc3NlZCAqL1xyXG4gICAgICAgICAgICAvLyB0aGUgbW9kYWwgYnV0dG9ucyBzaG91bGQgc3RhcnQgdGhlIHZpZGVvcyBhZ2Fpbi4gYnV0IG1vZGFsIGlzIGNyZWF0ZWQgZHluYW1pY2FsbHkgc28gd2UgbmVlZCB0aGlzOlxyXG4gICAgICAgICAgICAvLyBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24oZSl7XHJcbiAgICAgICAgICAgIC8vICAgICBjb25zdCBjbG9zZUJ1dHRvbiA9IGUudGFyZ2V0LmNsb3Nlc3QoXCIuYm1pLW1vZGFsX19jbG9zZVwiKTsgIFxyXG4gICAgICAgICAgICAvLyAgICAgY29uc3QgbW9kYWxXaW5kb3cgPSBlLnRhcmdldC5jbG9zZXN0KFwiLnZtLS1vdmVybGF5XCIpOyAgXHJcbiAgICAgICAgICAgIC8vICAgICBpZihtb2RhbFdpbmRvdyB8fCBjbG9zZUJ1dHRvbilcclxuICAgICAgICAgICAgLy8gICAgICAgICB7cGxheUFsbFZpZHModHJ1ZSk7fVxyXG4gICAgICAgICAgICAvLyAgIH0pO1xyXG5cclxuICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIG1vZGFsIG9ic2VydmVyXHJcbiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyQ29uZmlnID0geyBzdWJ0cmVlOiB0cnVlLCBhdHRyaWJ1dGVzOiB0cnVlLCBjaGlsZExpc3Q6IHRydWUgfVxyXG4gICAgICAgICAgICBjb25zdCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uIChtdXRhdGlvbkxpc3QpIHtcclxuICAgICAgICAgICAgICAgIGNvbnN0IHdhdGNoZWRUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcjbW9kYWxzLWNvbnRhaW5lciAudm0tLWNvbnRhaW5lcicpXHJcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG11dGF0aW9uIG9mIG11dGF0aW9uTGlzdCkge1xyXG4gICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0Jykge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod2F0Y2hlZFRhcmdldCA9PSBudWxsKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5QWxsVmlkcyh0cnVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwbGF5aW5nQmVmb3JNb2RhbCA9PSB0cnVlKSB7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNBdXRvUGxheWluZyA9IHRydWU7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChzbGlkZXJJbnRlcnZhbCk7ICAvLyBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHRvZ2dsZS4uLiBvciBtdWx0aXBsZSBpbnRlcnZhbHMgd2lsbCBiZSBhZGRlZC5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGVJbnRlcnZhbCh0cnVlKVxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9KTtcclxuICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShkb2N1bWVudC5ib2R5LCBvYnNlcnZlckNvbmZpZyk7XHJcblxyXG4gICAgICAgIH1cclxuXHJcblxyXG5cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gc2hvdyBwZXJjZW50IHByb2dyZXNzXHJcbiAgICAgICAgY29uc3QgdXBkYXRlUHJvZ3Jlc3MgPSAoKSA9PiB7XHJcbiAgICAgICAgICAgIHRpbWVFbGFwc2VkICs9IHRpbWVzUGVyU2VjO1xyXG4gICAgICAgICAgICBjb25zdCBwcm9ncmVzcyA9IHRpbWVFbGFwc2VkIC8gbWF4VGltZTtcclxuICAgICAgICAgICAgY29uc3QgZGFzaCA9IHByb2dyZXNzICogY2lyY3VtZmVyZW5jZVxyXG4gICAgICAgICAgICBjaXJjbGUuc2V0QXR0cmlidXRlKFwic3Ryb2tlLWRhc2hhcnJheVwiLCBgJHtkYXNofSAgJHtjaXJjdW1mZXJlbmNlIC0gZGFzaH1gKTtcclxuXHJcbiAgICAgICAgICAgIGlmIChwcm9ncmVzcyA+PSAxKSB7IHNob3dTbGlkZSgxKSB9XHJcbiAgICAgICAgfVxyXG5cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gdG9nZ2xlIGludGVydmFsXHJcbiAgICAgICAgY29uc3QgdG9nZ2xlSW50ZXJ2YWwgPSBmdW5jdGlvbiAoaXNPbikge1xyXG4gICAgICAgICAgICBpZiAoaXNPbiA9PT0gdHJ1ZSkge1xyXG4gICAgICAgICAgICAgICAgc2xpZGVySW50ZXJ2YWwgPSB3aW5kb3cuc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKCkgeyB1cGRhdGVQcm9ncmVzcygpIH0sIHRpbWVzUGVyU2VjKTtcclxuICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICBlbHNlIHsgY2xlYXJJbnRlcnZhbChzbGlkZXJJbnRlcnZhbCkgfVxyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIGNhbGxlZCBvbiBhcnJvdyBjbGljayBhbmQgd2l0aCBhdXRvIHBsYXlcclxuICAgICAgICBjb25zdCBzaG93U2xpZGUgPSBmdW5jdGlvbiAoZGlyZWN0aW9uKSB7XHJcbiAgICAgICAgICAgIHRpbWVFbGFwc2VkID0gMFxyXG4gICAgICAgICAgICBhY3RpdmVTbGlkZSArPSBkaXJlY3Rpb25cclxuXHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVTbGlkZSA+IHRvdGFsU2xpZGVzKSB7IGFjdGl2ZVNsaWRlID0gMSB9XHJcbiAgICAgICAgICAgIGlmIChhY3RpdmVTbGlkZSA8IDEpIHsgYWN0aXZlU2xpZGUgPSB0b3RhbFNsaWRlcyB9XHJcblxyXG4gICAgICAgICAgICBzbGlkZXNob3dFbC5xdWVyeVNlbGVjdG9yKCcuc2xpZGUuYWN0aXZlLXNsaWRlJykuY2xhc3NMaXN0LnJlbW92ZSgnYWN0aXZlLXNsaWRlJylcclxuICAgICAgICAgICAgc2xpZGVzaG93RWwucXVlcnlTZWxlY3RvcihgLnNsaWRlOm50aC1jaGlsZCgke2FjdGl2ZVNsaWRlfSlgKS5jbGFzc0xpc3QuYWRkKCdhY3RpdmUtc2xpZGUnKVxyXG4gICAgICAgIH1cclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gYXJyb3dzXHJcbiAgICAgICAgYXJyb3dMLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHNob3dTbGlkZSgtMSk7XHJcbiAgICAgICAgfSk7XHJcbiAgICAgICAgYXJyb3dSLmFkZEV2ZW50TGlzdGVuZXIoXCJjbGlja1wiLCBmdW5jdGlvbiAoZSkge1xyXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgICAgICAgIHNob3dTbGlkZSgxKVxyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIHBhdXNlUGxheS5hZGRFdmVudExpc3RlbmVyKFwiY2xpY2tcIiwgZnVuY3Rpb24gKGUpIHtcclxuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xyXG4gICAgICAgICAgICBwYXVzZVBsYXkuY2xhc3NMaXN0LnRvZ2dsZSgncGxheWluZycpXHJcbiAgICAgICAgICAgIGlzQXV0b1BsYXlpbmcgPSAhaXNBdXRvUGxheWluZ1xyXG4gICAgICAgICAgICB0b2dnbGVJbnRlcnZhbChpc0F1dG9QbGF5aW5nKTtcclxuXHJcbiAgICAgICAgICAgIHBsYXlpbmdCZWZvck1vZGFsID0gaXNBdXRvUGxheWluZzsgLy8gdXNlZCB3aGVuIGNsb3NpbmcgbW9kYWxcclxuICAgICAgICB9KTtcclxuXHJcbiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIHN0YXJ0IGludGVydmFsIGFzIHNvb24gYXMgc2NyaXB0IGxvYWRzXHJcbiAgICAgICAgdG9nZ2xlSW50ZXJ2YWwodHJ1ZSlcclxuICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gdXBkYXRlIG1vYmlsZSB2aWRlb3MgaWYgdGhlcmUgYXJlIGFueVxyXG4gICAgICAgIHJlc3BvbnNpdmVWaWRlb1VwZGF0ZSgpO1xyXG4gICAgICAgIHdpbmRvdy5vbnJlc2l6ZSA9IGZ1bmN0aW9uICgpIFxyXG4gICAgICAgICAgICB7XHJcbiAgICAgICAgICAgIGNsZWFyVGltZW91dChyZXNpemVUaW1lb3V0KTtcclxuICAgICAgICAgICAgcmVzaXplVGltZW91dCA9IHNldFRpbWVvdXQocmVzcG9uc2l2ZVZpZGVvVXBkYXRlLCAxMDAwKTsgICAgICAgICAgICAgLy8gYWRkIHNob3J0IGRlbGF5IHNvIHRoYXQgdmlkZW8gaXMgb25seSB1cGRhdGVkIHdoZW4gdXNlciBzdG9wcyByZXNpemluZzsgICAgICAgICAgICAgXHJcbiAgICAgICAgICAgIH07XHJcbiAgICB9XHJcblxyXG5cclxuICAgIGlmIChzbGlkZXNob3dFbCkge1xyXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG1vcmUgdGhhbiBvbmUgc2xpZGUgc3RhcnQgc2xpZGVzaG93IGF1dG8gcGxheSBhbmQgaXRzIHRpbWVyXHJcbiAgICAgICAgaWYgKHNsaWRlc0VsLmxlbmd0aCA+IDEpIHsgU2xpZGVzaG93Q29uc3RydWN0b3IoKTsgfVxyXG4gICAgICAgIC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lIGRvbnQgc3RhcnQgdGhlIHRpbWVyIGFuZCBoaWRlIHRoZSBjb250cm9scyBmb3IgbW92aW5nL3BcclxuICAgICAgICBlbHNlIHsgc2xpZGVzaG93RWwucXVlcnlTZWxlY3RvcignLnNsaWRlci1jb250cm9scycpLmNsYXNzTGlzdC5hZGQoJ2hpZGUnKTsgfVxyXG4gICAgfVxyXG59XHJcblxyXG5leHBvcnQgZGVmYXVsdCBTbGlkZXNob3c7XHJcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgVk1vZGFsIGZyb20gJ3Z1ZS1qcy1tb2RhbCc7XG5pbXBvcnQgeyByZWxlYXNlTm90ZXNNb2RhbCB9IGZyb20gXCIuL21vZGFsc1wiO1xuXG5jb25zdCBzb2Z0d2FyZUNhcmQgPSAoKSA9PiB7XG4gICAgVnVlLnVzZShWTW9kYWwpO1xuICAgIGxldCBzb2Z0d2FyZSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5zb2Z0d2FyZC1jYXJkLS1ub2ZpbHRlcicpO1xuXG4gICAgbGV0IHNvZnR3YXJlQ2FyZENvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NvZnR3YXJlLWNhcmQtc2luZ2xlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgaXNCb29rbWFya2VkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICBzYXZlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5mYXZvcml0ZXNbYCR7dGhpcy50eXBlfWBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKHRoaXMuaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaGFuZGxlQm9va21hcmsoKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgndXBkYXRlRmF2b3JpdGVzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHRoaXMuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuaXNCb29rbWFya2VkID8gXCJyZW1vdmVcIiA6IFwiYWRkXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdG9nZ2xlTW9kYWwoKSB7ICAgXG4gICAgICAgICAgICAgICAgICAgIGxldCByZWxlYXNlTm90ZXMgPSB0aGlzLiRyZWZzLnJlbGVhc2VOb3Rlcy5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJG1vZGFsLnNob3coXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTm90ZXNNb2RhbC50ZW1wbGF0ZShyZWxlYXNlTm90ZXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZU5vdGVzTW9kYWwubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VOb3Rlc01vZGFsLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQgPyB0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZCA6IG51bGw7XG5cbiAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSBcInNvZnR3YXJlSWRcIjtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5zb2Z0d2FyZS1jYXJkLS1ub2ZpbHRlci0ke2lkfWAsXG4gICAgICAgIH0pLiRtb3VudChgLnNvZnR3YXJlLWNhcmQtLW5vZmlsdGVyLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHNvZnR3YXJlLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc29mdHdhcmUuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgc29mdHdhcmUtY2FyZC0tbm9maWx0ZXItJHtpbmRleH1gKTtcbiAgICAgICAgICAgIHNvZnR3YXJlQ2FyZENvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgc29mdHdhcmVDYXJkOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuaW1wb3J0IGF4aW9zIGZyb20gJ2F4aW9zJztcbmltcG9ydCBmcG9kYiBmcm9tICcuLi8uLi8uLi9kYi5qc29uJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7cmVsZWFzZU5vdGVzTW9kYWx9IGZyb20gJy4vbW9kYWxzJztcbmltcG9ydCB7IEFjY29yZGlvbiwgU2VsZWN0ZWRGaWx0ZXJzQ29tcG9uZW50LCBDaGVja2JveCwgUGFnaW5hdGlvbiB9IGZyb20gJy4vZmlsdGVyLWNvbXBvbmVudHMnO1xuXG5jb25zdCBzYWZlU3RyaW5nID0gKHN0cikgPT4ge1xuICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyKTtcbn1cblxuY29uc3QgU29mdHdhcmUgPSAoKSA9PiB7XG5cbiAgICBsZXQgc29mdHdhcmUgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc29mdHdhcmUnKTtcbiAgICBWdWUudXNlKFZNb2RhbCk7XG5cbiAgICBjb25zdCBzb2Z0d2FyZUNvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NvZnR3YXJlLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBhZ2U6IDEsIC8vY3VycmVudCBwYWdlICNcbiAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsUGFnZXM6IG51bGwsIC8vdG90YWwgcmV0dXJucyBwYWdlc1xuICAgICAgICAgICAgICAgICAgICAgICAgdG90YWxSZXN1bHRzOiBudWxsLCAvL3RvdGFsIHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgICAgIHNob3duUmVzdWx0czogbnVsbCwgLy90b3RhbCBzaG93biBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyc1Zpc2libGU6IG51bGwsIC8vYXJlIGZpbHRlcnMgdmlzaWJsZVxuICAgICAgICAgICAgICAgICAgICAgICAgZmlsdGVyQXJlYVZpc2libGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXJzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RzOiBbXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHM6IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzOiBbXSwgLy9ib29rbWFya2VkIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZERvY3NMYWJlbDogbnVsbCwgLy9sYWJlbCBmb3Igc2F2ZWQgZG9jc1xuICAgICAgICAgICAgICAgICAgICAgICAgc2F2ZWREb2NzT25seTogbnVsbCwgLy9pcyBzYXZlZCBkb2NzIG9ubHkgY2hlY2tlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaXNNb2JpbGU6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0QWN0aXZlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJldkFjdGl2ZTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFwaVVybDogbnVsbCwgLy9mb3IgYXBpIGNhbGxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVybFBhcmFtczogbnVsbCwgLy9mb3IgZGVlcGxpbmtpbmcgaW4tYnJvd3NlclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RvcmU6IHN0b3JlXG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VOb3Rlc0xhYmVsOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdzb2Z0d2FyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFja2luZ1R5cGU6ICdhcHAnXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzTG9hZGluZzogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wb25lbnRzOiB7XG4gICAgICAgICAgICAgICAgJ2ZpbHRlci1hY2NvcmRpb24tdGVtcGxhdGUnOiBBY2NvcmRpb24sXG4gICAgICAgICAgICAgICAgJ3NlbGVjdGVkRmlsdGVycyc6IFNlbGVjdGVkRmlsdGVyc0NvbXBvbmVudCxcbiAgICAgICAgICAgICAgICAnY2hlY2tib3gtaXRlbSc6IENoZWNrYm94LFxuICAgICAgICAgICAgICAgICdwYWdpbmF0aW9uJzogUGFnaW5hdGlvblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNvbXB1dGVkOiB7XG4gICAgICAgICAgICAgICAgY29tcHV0ZWRJc01vYmlsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkWzBdID09IFwiXCIgPyBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuc29mdHdhcmVJZC5zbGljZSgxKSA6IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcGFnZVJhbmdlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS50b3RhbFJlc3VsdHMgPiAxMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAxLSR7dGhpcy5kYXRhLnNob3duUmVzdWx0c31gO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuZGF0YS50b3RhbFJlc3VsdHMgLSB0aGlzLmRhdGEuc2hvd25SZXN1bHRzICsgMX0tJHt0aGlzLmRhdGEudG90YWxSZXN1bHRzfWA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHsodGhpcy5kYXRhLnNob3duUmVzdWx0cyAqICh0aGlzLmRhdGEuY3VycmVudFBhZ2UgLSAxKSkgKyAxfS0ke3RoaXMuZGF0YS5zaG93blJlc3VsdHMgKiB0aGlzLmRhdGEuY3VycmVudFBhZ2V9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuc2hvd25SZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBzaXRlTGFuZzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS5jdXJyZW50TGFuZztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jcyA9IHRoaXMuc2F2ZWQ7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNhdmVkIG9ubHkgZmlsdGVyIGlmIG5vIHNhdmVkIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNhdmVkLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5kZXggPSB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZS52YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZignc2F2ZWREb3dubG9hZHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuc3BsaWNlKGluZGV4LDEpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjb21wdXRlZElzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmlzTW9iaWxlID0gdGhpcy5jb21wdXRlZElzTW9iaWxlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSAhdGhpcy5jb21wdXRlZElzTW9iaWxlID8gdHJ1ZSA6IHRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5maWx0ZXJzXCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7IC8vIGhhbmRsZSBhcGkgY2FsbFxuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZUhpc3RvcnkoKTsgLy8gaGFuZGxlIGhpc3RvcnkgcmVjb3JkXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9IDE7IC8vcmVzZXQgcGFnZSB0byAxXG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGlmIHByb2R1Y3RsaW5lIGlzIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0TGluZXMgPSB0aGlzLmRhdGEuZmlsdGVycy5maWx0ZXIoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnR5cGUgPT0gXCJwcm9kdWN0bGluZVwiO1xuICAgICAgICAgICAgICAgICAgICB9KS5tYXAoZWwgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBzZXQgc2F2ZWREb2NzT25seSB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICBsZXQgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdGVtLnR5cGUgPT0gXCJzYXZlZFNvZnR3YXJlXCI7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5zYXZlZERvY3NPbmx5ID0gc2F2ZWRPbmx5ID8gc2F2ZWRPbmx5LnZhbHVlIDogbnVsbDtcblxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9kdWN0TGluZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3B1bGF0ZVByb2R1Y3RzKHByb2R1Y3RMaW5lcyk7IFxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9pZiBub3QgYnJhbmQgc2VsZWN0ZWQsIGVtcHR5IHRoZSBwcm9kdWN0cyBhcnJheVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByb2R1Y3RzID0gW107IFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIHByb2R1Y3QgZmlsdGVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnMuZmlsdGVyKGVsID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwudHlwZSA9PSBcInByb2R1Y3RcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSkuZm9yRWFjaChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcih0aGlzLmRhdGEuY2xhc3MsIGl0ZW0udmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS5jdXJyZW50UGFnZVwiOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEubmV4dEFjdGl2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucHJldkFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGF0YS5jdXJyZW50UGFnZSA9PSB0aGlzLmRhdGEudG90YWxQYWdlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLm5leHRBY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5wcmV2QWN0aXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0UmVzdWx0cygpO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLnVwZGF0ZUhpc3RvcnkoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIFwiZGF0YS50b3RhbFJlc3VsdHNcIjogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICB0b2dnbGVGaWx0ZXJzKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNsaWNrZWRcIik7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRhdGEuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwiaXMgbW9iaWxlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmZpbHRlcnNWaXNpYmxlID0gIXRoaXMuZGF0YS5maWx0ZXJzVmlzaWJsZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdXBkYXRlRmlsdGVycyhlbCwgZSwgdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHR5cGUgPSB0eXBlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBzYWZlU3RyaW5nKGUuY3VycmVudFRhcmdldC52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsYWJlbCA9IGUuY3VycmVudFRhcmdldC5wYXJlbnROb2RlLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGNoZWNrZWQgPSBlLmN1cnJlbnRUYXJnZXQuY2hlY2tlZDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gMTsvL3Jlc2V0IHBhZ2UgdG8gMSB3aGVuIG5ldyBmaWx0ZXJzIGFkZGVkL3JlbW92ZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJ0eXBlXCIsIHR5cGUpXG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGUpO1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcInZhbHVlXCIsIHNhZmVTdHJpbmcoZS50YXJnZXQudmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJjaGVja2VkXCIsZS50YXJnZXQuY2hlY2tlZCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSBcInNhdmVkU29mdHdhcmVcIikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzID0gWy4uLnRoaXMuZGF0YS5maWx0ZXJzLCB7XCJ2YWx1ZVwiOiB2YWx1ZSwgXCJ0eXBlXCI6IHR5cGUsIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFsuLi50aGlzLmRhdGEuZmlsdGVycywge1widmFsdWVcIjogY2hlY2tlZCwgXCJ0eXBlXCI6IHR5cGUsIFwibmFtZVwiOiBsYWJlbH1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5kYXRhLmZpbHRlcnMubWFwKChlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLmluZGV4T2YodmFsdWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJJTkRFWFwiLCBpbmRleCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5zcGxpY2UoaW5kZXgsMSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZXMgc3BlY2lmaWMgZmlsdGVyXG4gICAgICAgICAgICAgICAgcmVtb3ZlRmlsdGVyKGVsLCB2YWx1ZSwgdHlwZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHRoaXMuZGF0YS5maWx0ZXJzLm1hcCgoZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUudmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfSkuaW5kZXhPZih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5maWx0ZXJzLnNwbGljZShpbmRleCwxKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC8vIGNsZWFycyBmaWx0ZXJzXG4gICAgICAgICAgICAgICAgcmVtb3ZlQWxsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSAxOyAvL3Jlc2V0IHBhZ2UgdG8gMVxuICAgICAgICAgICAgICAgIH0sICBcbiAgICAgICAgICAgICAgICBwb3B1bGF0ZVByb2R1Y3RzKHByb2R1Y3RMaW5lcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcHJvZHVjdExpbmVTdHIgPSBkZWNvZGVVUklDb21wb25lbnQocHJvZHVjdExpbmVzLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGJyYW5kU3RyKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2VVcmwgPSB3aW5kb3cuc29mdHdhcmVBUElVcmw7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhcGlVcmwgPSBgL2FwaS9HZXRTb2Z0d2FyZVByb2R1Y3RzQnlCcmFuZGA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy9wcm9kdWN0c0J5QnJhbmRcIjsgLy9mcm9tIGpzb24tc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYXBpVXJsLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyYW5kOiBwcm9kdWN0TGluZVN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogdGhpcy5zaXRlTGFuZyAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2cocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5wcm9kdWN0cyA9IHJlc3BvbnNlLmRhdGEucmVzdWx0czsgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgZGlkWW91TWVhbihlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcucGVvcGxlYWxzb3NlYXJjaGVkZm9yJyk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuRWwgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuZGlkeW91bWVhbicpO1xuICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIuZm9yRWFjaChlbGVtZW50ID0+IGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnc2hvdycpKTtcbiAgICAgICAgICAgICAgICAgICAgLy9jb25zb2xlLmxvZygnZGlkWW91TWVhbicsZSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGUudGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBxdWVyeSA9IGUudGFyZ2V0LmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5ID0gZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCdxdWVyeSA9ICcscXVlcnksICdlID0gJywgZSwgZS50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeTtcbiAgICAgICAgICAgICAgICAgICAgLy90aGlzLnVwZGF0ZUhpc3RvcnkoKTtcbiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQnKS52YWx1ZSA9IHF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZExvYWRpbmcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKCk7XG4gICAgICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgICAgIGdldFJlc3VsdHMocXVlcnkpIHtcblxuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJhcGkvZG9jdW1lbnRzP1wiO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEucXVlcnkgPSBxdWVyeSA9PT0gbnVsbCA/IG51bGwgOiBxdWVyeSA/IHF1ZXJ5IDogdGhpcy5kYXRhLnF1ZXJ5O1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuY3VycmVudFBhZ2UgPSBxdWVyeSA/IDEgOiB0aGlzLmRhdGEuY3VycmVudFBhZ2U7XG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZ2V0VXJsKCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlVXJsID0gd2luZG93LnNvZnR3YXJlQVBJVXJsO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYXBpVXJsID0gYCR7YmFzZVVybH0ke2Jhc2VVcmwuaW5kZXhPZignPycpID4gLTEgPyAnJyA6ICc/J31gO1xuICAgICAgICAgICAgICAgICAgICAvLyBsZXQgYXBpVXJsID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvc29mdHdhcmVcIjsgLy9mcm9tIGpzb24tc2VydmVyXG4gICAgICAgICAgICAgICAgICAgIC8vIGxldCBhcGlVcmxUZXN0ID0gXCJodHRwOi8vbG9jYWxob3N0OjMwMDMvZG9jdW1lbnRhdGlvblRlc3RcIjsgLy9mcm9tIGpzb24tc2VydmVyXG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHNlbGYgPSB0aGlzO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBzYXZlZERvY3VtZW50c1RydWVQYXJhbXMgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc2F2ZWRPbmx5ID0gdGhpcy5kYXRhLmZpbHRlcnMuZmluZChpdGVtID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbS50eXBlID09IFwic2F2ZWRTb2Z0d2FyZVwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzYXZlZE9ubHkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2R1Y3QgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhbmcgPSBbXTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2R1Y3RMaW5lID0gW107XG4gICAgICAgICAgICAgICAgICAgIHZhciBkb3dubG9hZFR5cGUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVycy5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaChpdGVtLnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwicHJvZHVjdFwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0LnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJsYW5nXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmcucHVzaChpdGVtLnZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInByb2R1Y3RsaW5lXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3RMaW5lLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgXCJkb3dubG9hZFR5cGVcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG93bmxvYWRUeXBlLnB1c2goaXRlbS52YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IHByb2R1Y3RTdHIgPSBkZWNvZGVVUklDb21wb25lbnQocHJvZHVjdC5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFuZ1N0ciA9IGRlY29kZVVSSUNvbXBvbmVudChsYW5nLmpvaW4oJ3wnKSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBwcm9kdWN0TGluZVN0ciA9IGRlY29kZVVSSUNvbXBvbmVudChwcm9kdWN0TGluZS5qb2luKCd8JykpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRUeXBlU3RyID0gZGVjb2RlVVJJQ29tcG9uZW50KGRvd25sb2FkVHlwZS5qb2luKCd8JykpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBheGlvc1BhcmFtcyA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHE6IHRoaXMuZGF0YS5xdWVyeSA/IHRoaXMuZGF0YS5xdWVyeSA6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICBzYXZlZDogdGhpcy5kYXRhLnNhdmVkRG9jcy5qb2luKCd8JykgPT0gXCJcIiA/IG51bGwgOiB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5jaGFyQXQoMCkgPT0gXCIsXCIgPyB0aGlzLmRhdGEuc2F2ZWREb2NzLmpvaW4oJ3wnKS5zbGljZSgxKSA6IHRoaXMuZGF0YS5zYXZlZERvY3Muam9pbignfCcpLCAvL0BUT0RPIG1ha2UgdGhpcyBsZXNzIGluc2FuZS4gU2VuZCBOVUxMIGlmIGVtcHR5IHN0cmluZy4gUmVtb3ZlIGxlYWRpbmcgY29tbWEgaWYgcHJlc2VudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Q6IHByb2R1Y3RTdHIgPT0gXCJcIiA/IG51bGwgOiBwcm9kdWN0U3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IGxhbmdTdHIgPT0gXCJcIiA/IG51bGwgOiBsYW5nU3RyLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdExpbmU6IHByb2R1Y3RMaW5lU3RyID09IFwiXCIgPyBudWxsIDogcHJvZHVjdExpbmVTdHIsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb3dubG9hZFR5cGU6IGRvd25sb2FkVHlwZVN0ciA9PSBcIlwiID8gbnVsbCA6IGRvd25sb2FkVHlwZVN0cixcbiAgICAgICAgICAgICAgICAgICAgICAgIHNhdmVkU29mdHdhcmU6IHNhdmVkRG9jdW1lbnRzVHJ1ZVBhcmFtcygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFnZTogdGhpcy5kYXRhLmN1cnJlbnRQYWdlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbGFuZzogdGhpcy5zaXRlTGFuZ1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYXhpb3NQYXJhbXMpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgc2VhcmNoVGVybSA9IHRoaXMuZGF0YS5xdWVyeTtcblxuICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQoYXBpVXJsLHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uYXhpb3NQYXJhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhyZXNwb25zZSk7XG4vLy9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gRGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljIGZyb20gZXBpc2VydmVyIGZpbmQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRpZHlvdW1lYW5FbCwgZGlkeW91bWVhbkNvbnRhaW5lcjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5yZXN1bHRzLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy5kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5Db250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXJfX2RpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UuZGF0YS5kaWRZb3VNZWFuICYmIHJlc3BvbnNlLmRhdGEuZGlkWW91TWVhbi5sZW5ndGggPiAwKSBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhbGxFbGVtZW50cyA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5kYXRhLmRpZFlvdU1lYW4uZm9yRWFjaChkeW0gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFuY2hvckVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JFbGVtZW50LmhyZWY9XCIjXCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JFbGVtZW50LmlubmVyVGV4dCA9IGR5bTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuY2hvckVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcImNsaWNrXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmRpZFlvdU1lYW4oYW5jaG9yRWxlbWVudC5pbm5lclRleHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxFbGVtZW50cy5wdXNoKGFuY2hvckVsZW1lbnQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NsZWFyIG91dCBhbGwgcHJldmlvdXMgZWxlbWVudHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsLmZvckVhY2gocGFyZW50ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChwYXJlbnQuZmlyc3RDaGlsZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChwYXJlbnQuZmlyc3RDaGlsZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2NvbnNvbGUubG9nKCcgIC0tPiBBcHBlbmRpbmcgdG8gJywgZGlkeW91bWVhbkVsKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGk8YWxsRWxlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZHlvdW1lYW5FbC5mb3JFYWNoKGVsID0+IGVsLmFwcGVuZChhbGxFbGVtZW50c1tpXSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGkgKyAxIDwgYWxsRWxlbWVudHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbW1hRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzcGFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFFbC5zdHlsZS5wYWRkaW5nTGVmdCA9IFwiN3B4XCI7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsLmZvckVhY2goZWwgPT4gZWwuYXBwZW5kKGNvbW1hRWwpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ3Nob3cnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vL1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBFbmQgb2YgZGlkIHlvdSBtZWFuIHF1ZXJ5IGxvZ2ljXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vXG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVE0gVEFHR0lOR1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWFyY2hUZXJtICYmIHNlYXJjaFRlcm0ubGVuZ3RoID4gMCAmJiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllclt3aW5kb3cuZGF0YUxheWVyLmxlbmd0aC0xXS5ldmVudCAhPSBcInNlYXJjaC1yZXN1bHRzXCIgLy8gaGFjayB0byBhdm9pZCBkb3VibGUgZW50cnkuICB0aGlzIHJ1bnMgdHdpY2UgZm9yIHNvbWUgcmVhc29uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgeyAvLyBvbmx5IHB1c2ggaWYgdGhpcyBpcyBhIHF1ZXJ5LCBub3QgYSBmaWx0ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmRhdGFMYXllci5wdXNoKCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudDogXCJzZWFyY2gtcmVzdWx0c1wiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb2Z0d2FyZVwiLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0ZWdvcnk6IFwiU2VhcmNoXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHNlYXJjaFRlcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogcmVzcG9uc2UuZGF0YS50b3RhbFJlc3VsdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5yZXN1bHRzID0gcmVzcG9uc2UuZGF0YS5yZXN1bHRzOyAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5kYXRhLnRvdGFsUmVzdWx0cyA9IHJlc3BvbnNlLmRhdGEudG90YWxSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS5zaG93blJlc3VsdHMgPSByZXNwb25zZS5kYXRhLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZGF0YS50cmFja0lkID0gcmVzcG9uc2UuZGF0YS50cmFja0lkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVtb3ZlTG9hZGluZygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGVycm9yKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnJlbW92ZUxvYWRpbmcoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBjaGFuZ2VQYWdlKGRpcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZGlyID09IFwicHJldlwiICYmIHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlLS07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGlyID09IFwibmV4dFwiICYmIHRoaXMuZGF0YS5jdXJyZW50UGFnZSAhPT0gdGhpcy5kYXRhLnRvdGFsUGFnZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5jdXJyZW50UGFnZSsrO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRlbWl0KCdzY3JvbGwtdG8tdG9wJywgdGhpcy5kYXRhLmNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2V0UmVzdWx0cygpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgc2Nyb2xsVG9Ub3AoZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGVsICE9PSB0aGlzLmRhdGEuY2xhc3MpIHtyZXR1cm47fVxuICAgICAgICAgICAgICAgICAgICBsZXQgdG9wID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLnNvZnR3YXJlX19hcmVhLWNhcmRzJykuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnNjcm9sbFkgLSAxMDA7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKHRvcCk7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlaGF2aW9yOiAnc21vb3RoJ1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0UGFnZXMoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGJhc2VkIG9uIHRvdGFsIHJlc3VsdCBjb3VudCwgZGl2aWRlIGJ5IDEwIHRvIGdldCB0b3RhbCBwYWdlcyBuZWVkZWRcbiAgICAgICAgICAgICAgICAgICAgLy8gbWF0aCBjZWlsIHRvIHJvdW5kIHVwXG4gICAgICAgICAgICAgICAgICAgIC8vIHNldCBhY3RpdmUgZm9yIHByZXYvbmV4dCBiYXNlZCBvbiBjdXJyZW50IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnRvdGFsUGFnZXMgPSBNYXRoLmNlaWwodGhpcy5kYXRhLnRvdGFsUmVzdWx0cyAvIDEwKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnByZXZBY3RpdmUgPSB0aGlzLmRhdGEuY3VycmVudFBhZ2UgIT09IDEgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5uZXh0QWN0aXZlID0gdGhpcy5kYXRhLmN1cnJlbnRQYWdlICE9PSB0aGlzLmRhdGEudG90YWxQYWdlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGFkZExvYWRpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXRGaWVsZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5oZXJvLWNlbnRlcl9fc2VhcmNoLWlucHV0LWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgICAgICAgICBpbnB1dEZpZWxkLmNsYXNzTGlzdC5hZGQoJ2xvYWRpbmcnKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHJlbW92ZUxvYWRpbmcoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNMb2FkaW5nID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IGlucHV0RmllbGQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuaGVyby1jZW50ZXJfX3NlYXJjaC1pbnB1dC1jb250YWluZXInKTtcbiAgICAgICAgICAgICAgICAgICAgaW5wdXRGaWVsZC5jbGFzc0xpc3QucmVtb3ZlKCdsb2FkaW5nJyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuaXNNb2JpbGUgPSBzdG9yZS5zdGF0ZS5pc01vYmlsZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnNhdmVkRG9jcyA9IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkWzBdID09IFwiXCIgPyBzdG9yZS5zdGF0ZS5mYXZvcml0ZXMuc29mdHdhcmVJZC5zbGljZSgxKSA6IHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyc1Zpc2libGUgPSB0aGlzLmRhdGEuaXNNb2JpbGUgPyBmYWxzZSA6IHRydWU7IC8vaW5pdCBzaG93L2hpZGUgZmlsdGVycyBpZi9pcyBtb2JpbGVcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdGVuIGZvciBmaWx0ZXIgdXBkYXRlcyBpbiBjaGlsZHJlblxuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3VwZGF0ZUZpbHRlcnMnLCAoZWwsIGUsIHR5cGUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRmlsdGVycyhlbCwgZSwgdHlwZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kb24oJ3JlbW92ZS1maWx0ZXInLCAoZWwsIHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUZpbHRlcihlbCwgdmFsdWUsIHR5cGUpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJG9uKCdjaGFuZ2UtcGFnZS10bycsIChlbCwgbnVtKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWwgIT09IHRoaXMuZGF0YS5jbGFzcykge3JldHVybjt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLmN1cnJlbnRQYWdlID0gbnVtO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRMb2FkaW5nKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmdldFJlc3VsdHMoKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignaW50ZXJuYWwtc2VhcmNoJywgKHZhbHVlLCB0eXBlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSBcInNvZnR3YXJlXCIpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnBlb3BsZWFsc29zZWFyY2hlZGZvcicpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19wZW9wbGVhbHNvc2VhcmNoZWRmb3InKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyLmZvckVhY2goZWxlbWVudCA9PiBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ3Nob3cnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmRpZHlvdW1lYW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWR5b3VtZWFuQ29udGFpbmVyID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLmhlcm8tY2VudGVyX19zZWFyY2gtaW5wdXQtY29udGFpbmVyX19kaWR5b3VtZWFuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlkeW91bWVhbkNvbnRhaW5lci5mb3JFYWNoKGVsZW1lbnQgPT4gZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdzaG93JykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTG9hZGluZygpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5nZXRSZXN1bHRzKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbignc2Nyb2xsLXRvLXRvcCcsIChlbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb1RvcChlbCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAvLyBpbml0IHJlc3VsdHNcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kYXRhLnJlc3VsdHMgPSB3aW5kb3cuaW5pdGlhbFNvZnR3YXJlQXBpUmVzdWx0cy5yZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEudG90YWxSZXN1bHRzID0gd2luZG93LmluaXRpYWxTb2Z0d2FyZUFwaVJlc3VsdHMudG90YWxSZXN1bHRzO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuc2hvd25SZXN1bHRzID0gd2luZG93LmluaXRpYWxTb2Z0d2FyZUFwaVJlc3VsdHMucmVzdWx0cy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YS5yZWxlYXNlTm90ZXNMYWJlbCA9IHdpbmRvdy5pbml0aWFsU29mdHdhcmVBcGlSZXN1bHRzLnJlbGVhc2VOb3Rlc0xhYmVsO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMuZGF0YS5yZXN1bHRzID0gZnBvZGIuc29mdHdhcmUucmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLnRvdGFsUmVzdWx0cyA9IGZwb2RiLnNvZnR3YXJlLnRvdGFsUmVzdWx0cztcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5kYXRhLnNob3duUmVzdWx0cyA9IGZwb2RiLnNvZnR3YXJlLnJlc3VsdHMubGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmRhdGEucmVsZWFzZU5vdGVzTGFiZWwgPSBmcG9kYi5zb2Z0d2FyZS5yZWxlYXNlTm90ZXNMYWJlbDtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGEuZmlsdGVyQXJlYVZpc2libGUgPSBwYXJzZUludCh0aGlzLmRhdGEudG90YWxSZXN1bHRzKSA8PSAxMCA/IGZhbHNlIDogdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3cub25wb3BzdGF0ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gICAgIHRoaXMuZGVlcGxpbmsoKTtcbiAgICAgICAgICAgICAgICAgICAgLy8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdFBhZ2VzKCk7XG4gICAgICAgICAgICAgICAgLy8gZm9yIGRlZXBsaW5raW5nXG4gICAgICAgICAgICAgICAgLy8gaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vICAgICAgICAgdGhpcy5kZWVwbGluaygpO1xuICAgICAgICAgICAgICAgIC8vICAgICB9KTtcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NvZnR3YXJlLXByb2R1Y3RzJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdjYXRlZ29yeSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJwcm9kdWN0XCJcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcG9uZW50czoge1xuICAgICAgICAgICAgICAgICdjaGVja2JveC1pdGVtJzogQ2hlY2tib3hcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvZnR3YXJlX19wcm9kdWN0cy1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGNoZWNrYm94LWl0ZW0gdi1mb3I9XCIocHJvZHVjdEl0ZW0sIGkpIGluIGRhdGEucHJvZHVjdHNcIiA6a2V5PWkgOnR5cGU9XCJ0eXBlXCIgOmxhYmVsPVwicHJvZHVjdEl0ZW0udmFsdWVcIiA6dmFsdWU9XCJwcm9kdWN0SXRlbS5rZXlcIiA6ZGF0YT1cImRhdGFcIiA6Y2F0ZWdvcnk9XCJjYXRlZ29yeVwiLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAvLyByZXN1bHRzIGxpc3RcbiAgICAgICAgVnVlLmNvbXBvbmVudCgnc29mdHdhcmUtcmVzdWx0cy1saXN0Jywge1xuICAgICAgICAgICAgcHJvcHM6IFsnZGF0YScsICdpc0xvYWRpbmcnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFwic29mdHdhcmVcIlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvZnR3YXJlX19jYXJkcy1jb250ZW50XCIgOmRhdGE9XCJkYXRhXCI+XG4gICAgICAgICAgICAgICAgPHNvZnR3YXJlLXJlc3VsdHMtaXRlbSB2LWZvcj1cIihyZXN1bHQsIGluZGV4KSBpbiBkYXRhLnJlc3VsdHNcIiA6Y29udGVudD1cInJlc3VsdFwiICA6a2V5PVwiaW5kZXhcIiA6ZGF0YT1cImRhdGFcIiA6aXNMb2FkaW5nPVwiaXNMb2FkaW5nXCIgLz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gc2luZ2xlIHJlc3VsdHMgaXRlbVxuICAgICAgICBWdWUuY29tcG9uZW50KCdzb2Z0d2FyZS1yZXN1bHRzLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydkYXRhJywgJ2NvbnRlbnQnLCAnaXNMb2FkaW5nJ10sXG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAvLyBpc0NoZWNrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpc0Jvb2ttYXJrZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBpZDogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgdGFnTWV0YUJvZHk6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiYXBwXCIsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJjYXRlZ29yeVwiOiB0aGlzLmNvbnRlbnQuZG93bmxvYWRUeXBlLCBcbiAgICAgICAgICAgICAgICAgICAgICAgIFwibGFiZWxcIjogdGhpcy5jb250ZW50Lm5hbWUsIFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJwcm9kdWN0TGluZVwiOiB0aGlzLmNvbnRlbnQuZXllYnJvdywgXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhbmd1YWdlXCI6IHRoaXMuY29udGVudC5sYW5ndWFnZXMudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIHNhdmVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pc0Jvb2ttYXJrZWQgPSB0aGlzLnNhdmVkLmluY2x1ZGVzKHRoaXMuaWQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXCJjb250ZW50XCI6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRuZXh0VGljaygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyh0aGlzLiRyZWZzLmJvb2ttYXJrLmRhdGFzZXQuc29mdHdhcmVJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy4kcmVmcy5ib29rbWFyay5kYXRhc2V0LnNvZnR3YXJlSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzb2Z0d2FyZS1yZXN1bHRzLWl0ZW0gLSB3YXRjaCgpIGNvbnRlbnQgLT4gdGhpcycsIHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvZnR3YXJlLWNhcmRcIiA6ZGF0YT1cImRhdGFcIiA6Y2xhc3M9XCJ7J2hpZGUtYm9va21hcmsnOiAoZGF0YS5zYXZlZERvY3NPbmx5ID09PSB0cnVlKSAmJiAoaXNCb29rbWFya2VkID09PSBmYWxzZSl9XCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgOmRhdGEtdGFnLW1ldGE9XCJ0YWdNZXRhQm9keVwiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX193cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19yb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19hcmVhIHNvZnR3YXJlLWNhcmRfX2FyZWEtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29mdHdhcmUtY2FyZF9fZXllYnJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7e2NvbnRlbnQuZXllYnJvd319XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIDpocmVmPVwiY29udGVudC52aWV3RGV0YWlsc1VybFwiIGNsYXNzPVwic29mdHdhcmUtY2FyZF9fdGl0bGVcIiB2LWlmPVwiY29udGVudC52aWV3RGV0YWlsc1VybFwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJhcHBcIiwgXCJhY3Rpb25cIjogXCJEZXRhaWxzXCJ9Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb250ZW50Lm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic29mdHdhcmUtY2FyZF9fdGl0bGVcIiB2LWlmPVwiIWNvbnRlbnQudmlld0RldGFpbHNVcmxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3tjb250ZW50Lm5hbWV9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic29mdHdhcmUtY2FyZF9fc3VidGl0bGVcIiByZWY9XCJkZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7Y29udGVudC5kZXRhaWxzfX0gPHNwYW4gdi1pZj1cImNvbnRlbnQucmVsZWFzZU5vdGVzXCI+fCA8L3NwYW4+PGEgaHJlZj1cIiNcIiB2LW9uOmNsaWNrLnByZXZlbnQ9XCJ0cmlnZ2VyTW9kYWxcIiB2LWlmPVwiY29udGVudC5yZWxlYXNlTm90ZXNcIj57e2RhdGEucmVsZWFzZU5vdGVzTGFiZWx9fSA8c3BhbiBjbGFzcz1cInJlbGVhc2Utbm90ZXNcIiByZWY9XCJyZWxlYXNlTm90ZXNcIj57e2NvbnRlbnQucmVsZWFzZU5vdGVzfX08L3NwYW4+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX2FyZWEgc29mdHdhcmUtY2FyZF9fYXJlYS1yaWdodFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwic29mdHdhcmUtY2FyZF9faWNvbiBzb2Z0d2FyZS1jYXJkX19pY29uLWRvd25sb2FkXCIgOmRhdGEtZG93bmxvYWQtdXJsPVwiY29udGVudC5kb3dubG9hZFVybFwiIDpkYXRhLWRvd25sb2FkLW5hbWU9XCJjb250ZW50Lm5hbWVcIiA6aHJlZj1cImNvbnRlbnQuZG93bmxvYWRIcmVmXCIgZGF0YS10YWctdHJpZ2dlcj1cImNsaWNrXCIgZGF0YS10YWctbWV0YT0ne1widHlwZVwiOiBcImFwcFwiLCBcImFjdGlvblwiOiBcIkRvd25sb2FkXCJ9Jz48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19pY29uIHNvZnR3YXJlLWNhcmRfX2ljb24tYm9va21hcmtcIiByZWY9XCJib29rbWFya1wiIDpkYXRhLXNvZnR3YXJlLWlkPVwiY29udGVudC5pZFwiIHYtb246Y2xpY2sucHJldmVudD1cImhhbmRsZUJvb2ttYXJrXCIgOmNsYXNzPVwie2FjdGl2ZTogaXNCb29rbWFya2VkfVwiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIGRhdGEtdGFnLW1ldGE9J3tcInR5cGVcIjogXCJhcHBcIiwgXCJhY3Rpb25cIjogXCJGYXZvcml0ZVwifSc+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwic29mdHdhcmUtY2FyZF9faWNvbiBzb2Z0d2FyZS1jYXJkX19pY29uLWFycm93XCIgOmNsYXNzPVwie2luYWN0aXZlOiBjb250ZW50LnZpZXdEZXRhaWxzVXJsID09IHVuZGVmaW5lZH1cIiA6aHJlZj1cImNvbnRlbnQudmlld0RldGFpbHNVcmxcIiBkYXRhLXRhZy10cmlnZ2VyPVwiY2xpY2tcIiBkYXRhLXRhZy1tZXRhPSd7XCJ0eXBlXCI6IFwiYXBwXCIsIFwiYWN0aW9uXCI6IFwiRGV0YWlsc1wifSc+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgLFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGhhbmRsZUJvb2ttYXJrKCkge1xuICAgICAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3VwZGF0ZUZhdm9yaXRlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aGlzLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogXCJzb2Z0d2FyZUlkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb246IHRoaXMuaXNCb29rbWFya2VkID8gXCJyZW1vdmVcIiA6IFwiYWRkXCJcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLy8gaW5pdFJlbGVhc2VOb3RlcygpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgdGhpcy4kcmVmcy5kZXRhaWxzLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAvLyAgICAgICAgIHRoaXMudHJpZ2dlck1vZGFsKCk7XG4gICAgICAgICAgICAgICAgLy8gICAgIH0pO1xuICAgICAgICAgICAgICAgIC8vIH0sXG4gICAgICAgICAgICAgICAgdHJpZ2dlck1vZGFsKCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLiRtb2RhbC5zaG93KFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZU5vdGVzTW9kYWwudGVtcGxhdGUodGhpcy5jb250ZW50LnJlbGVhc2VOb3RlcyksXG4gICAgICAgICAgICAgICAgICAgICAgICByZWxlYXNlTm90ZXNNb2RhbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZU5vdGVzTW9kYWwub3B0aW9uc1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuJHJlZnMuYm9va21hcmsuZGF0YXNldC5zb2Z0d2FyZUlkO1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKFwic2F2ZWRcIix0aGlzLnNhdmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmlzQm9va21hcmtlZCA9IHRoaXMuc2F2ZWQuaW5jbHVkZXMoYCR7dGhpcy5pZH1gKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICAvLyB0aGlzLmluaXRSZWxlYXNlTm90ZXMoKTtcbiAgICAgICAgICAgICAgICBsZXQgc2VsZiA9IHRoaXM7XG4gICAgICAgICAgICAgICAgdGhpcy4kbmV4dFRpY2soKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdHJhY2tJZCA9IHNlbGYuZGF0YS50cmFja0lkO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFja0lkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaGl0SWQgPSBzZWxmLmNvbnRlbnQuaGl0SWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgcXVlcnkgPSBzZWxmLmRhdGEucXVlcnk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gYC9hcGkvU2VhcmNoSGl0P3E9JHtlbmNvZGVVUklDb21wb25lbnQocXVlcnkpfSZoPSR7ZW5jb2RlVVJJQ29tcG9uZW50KGhpdElkKX0mdD0ke2VuY29kZVVSSUNvbXBvbmVudCh0cmFja0lkKX1gXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgYWxsQW5jaG9ycyA9IHNlbGYuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2EnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbEFuY2hvcnMuZm9yRWFjaChlbCA9PiBlbC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIChlKSA9PiBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBheGlvcy5nZXQodXJsKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coXCItLT4gVHJhY2tpbmcgcmVzcG9uc2U6IFwiLCByZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5zb2Z0d2FyZS0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmVcbiAgICAgICAgfSkuJG1vdW50KGAuc29mdHdhcmUtJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAoc29mdHdhcmUubGVuZ3RoID4gMCkge1xuICAgICAgICBzb2Z0d2FyZS5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4ge1xuICAgICAgICAgICAgaXRlbS5jbGFzc0xpc3QuYWRkKGBzb2Z0d2FyZS0ke2luZGV4fWApO1xuICAgICAgICAgICAgc29mdHdhcmVDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFNvZnR3YXJlOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnO1xuXG4vLyBjb25zdCBTcGVjVGFibGUgPSAoKSA9PiB7XG5cbiAgICAvLyBjb25zdCB0YWJsZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3BlYy10YWJsZScpO1xuXG4gICAgLy8gY29uc3Qgc3BlY1RhYmxlQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgY29uc3Qgc3BlY3NUYWJsZVRlbXBsYXRlID0gKCkgPT4ge1xuICAgICAgICAgICAgVnVlLmNvbXBvbmVudCgnc3BlYy10YWJsZS10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgICAgICBwcm9wczogWydzZWxlY3RlZEl0ZW0nXSxcbiAgICAgICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVW5pdDogc3RvcmUuc3RhdGUudW5pdHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB1c0xhYmVsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY0xhYmVsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsVGV4dDogJycsXG4gICAgICAgICAgICAgICAgICAgICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2hUb1RleHQ6ICcnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9hZE1vcmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBpc09wZW46IG51bGxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWRVbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yZS5zdGF0ZS51bml0cztcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgdGFnZ2luZ01ldGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInR5cGVcIjogXCJjdGFcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiVmlldyBhbGxcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBcIlNwZWNpZmljYXRpb25zXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJsYWJlbFwiOiB0aGlzLnNlbGVjdGVkSXRlbSA/IHRoaXMuc2VsZWN0ZWRJdGVtIDogXCJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgd2F0Y2g6IHtcbiAgICAgICAgICAgICAgICAgICAgY29tcHV0ZWRVbml0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRVbml0ID0gdGhpcy5jb21wdXRlZFVuaXQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldExhYmVscygpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZVVuaXRzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmUuY29tbWl0KCdzZXRVbml0cycpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgc2V0TGFiZWxzKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYWJlbFRleHQgPSB0aGlzLnNlbGVjdGVkVW5pdCA9PSAndXMnID8gdGhpcy51c0xhYmVsIDogdGhpcy5tZXRyaWNMYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3dpdGNoVG9UZXh0ID0gdGhpcy5zZWxlY3RlZFVuaXQgPT0gJ3VzJyA/IHRoaXMubWV0cmljTGFiZWwgOiB0aGlzLnVzTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICBoYW5kbGVWaWV3QWxsKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kcmVmcy5sb2FkTW9yZS52aWV3QWxsKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBnZXQgbGFiZWxzIGZyb20gbWFyayB1cCB0byBhY2NvbW9kYXRlIG11bHRpIGxhbmdcbiAgICAgICAgICAgICAgICAgICAgdGhpcy51c0xhYmVsID0gdGhpcy4kcmVmcy51bml0VG9nZ2xlci5kYXRhc2V0LnVzTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubWV0cmljTGFiZWwgPSB0aGlzLiRyZWZzLnVuaXRUb2dnbGVyLmRhdGFzZXQubWV0cmljTGFiZWw7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0TGFiZWxzKCk7XG4gICAgICAgICAgICAgICAgICAgIEV2ZW50QnVzLiRvbigndG9nZ2xlT3BlbicsIChzdGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc09wZW4gPSBzdGF0ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHNwZWNUYWJsZUxvYWRNb3JlID0gKCkgPT4ge1xuICAgICAgICAgICAgVnVlLmNvbXBvbmVudCgnc3BlY2lmaWNhdGlvbnMtbG9hZC1tb3JlJywge1xuICAgICAgICAgICAgICAgIHByb3BzOiBbJ2xhYmVsVGV4dCcsICdzd2l0Y2hUb1RleHQnLCAnc2VsZWN0ZWRVbml0JywgJ2lzT3BlbiddLFxuICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJIZWlnaHQ6IG51bGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBpc09wZW46IGZhbHNlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgdmlld0FsbCgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb250ZW50QXJlYSA9IHRoaXMuJHJlZnMuYWxsQ29udGFpbmVyO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnRIZWlnaHQgPSB0aGlzLmlubmVySGVpZ2h0O1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzT3BlbiA9PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEJ1cy4kZW1pdCgndG9nZ2xlT3BlbicsIGZhbHNlKTtcbiAgICAgICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3NldCBjb250ZW50IGFyZWEgaGVpZ2h0IHRvIGNvbnRlbnQgaGVpZ2h0IHRvIHByZXZlbnQgdHJhbnNpdGlvbmluZyBmcm9tIGF1dG9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gY29udGVudEhlaWdodCArICdweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhdmUgdGhlIGVsZW1lbnQgdHJhbnNpdGlvbiB0byBoZWlnaHQ6IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudEFyZWEuc3R5bGUubWF4SGVpZ2h0ID0gJzBweCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5hZGRFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSAnMCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCdXMuJGVtaXQoJ3RvZ2dsZU9wZW4nLCB0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50QXJlYS5zdHlsZS5tYXhIZWlnaHQgPSBjb250ZW50SGVpZ2h0ICsgXCJweFwiO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLmFkZEV2ZW50TGlzdGVuZXIoJ3RyYW5zaXRpb25lbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRlbnRBcmVhLnN0eWxlLm1heEhlaWdodCA9ICdub25lJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbm5lckhlaWdodCA9IHRoaXMuJHJlZnMuYWxsSW5uZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgXG5cbiAgICAgICAgLy8gbmV3IFZ1ZSh7XG4gICAgICAgIC8vICAgICBlbDogYC5zcGVjLXRhYmxlLSR7aWR9YCxcbiAgICAgICAgLy8gICAgIHN0b3JlOiBzdG9yZSxcbiAgICAgICAgLy8gfSkuJG1vdW50KGAuc3BlYy10YWJsZS0ke2lkfWAsIHRydWUpO1xuICAgIC8vIH1cbiAgICBcbiAgICAvLyBpZiAodGFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAvLyAgICAgdGFibGVzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgLy8gICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHNwZWMtdGFibGUtJHtpbmRleH1gKTtcbiAgICAvLyAgICAgICAgIHNwZWNUYWJsZUNvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAvLyAgICAgfSlcbiAgICAvLyB9XG5cbi8vIH1cblxuLy8gZXhwb3J0IGRlZmF1bHQgU3BlY1RhYmxlO1xuXG5leHBvcnQge3NwZWNzVGFibGVUZW1wbGF0ZSwgc3BlY1RhYmxlTG9hZE1vcmV9OyAiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHN0b3JlIGZyb20gJy4vc3RvcmUnO1xuaW1wb3J0IHtzcGVjc1RhYmxlVGVtcGxhdGUsIHNwZWNUYWJsZUxvYWRNb3JlfSBmcm9tICcuL3NwZWMtdGFibGUnO1xuXG5jb25zdCBTcGVjaWZpY2F0aW9ucyA9ICgpID0+IHtcblxuICAgIGNvbnN0IHNwZWNzID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnNwZWNzIC5wYWdlLXNlY3Rpb25fX3dyYXBwZXInKTtcblxuICAgIGxldCBzcGVjc0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3NwZWNpZmljYXRpb25zLXRlbXBsYXRlJywge1xuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZElkOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFVybDogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIHRhZ01ldGFTZWxlY3Q6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuICAgICAgICAgICAgICAgICAgICAgICAgXCJ0eXBlXCI6IFwiZG9jdW1lbnRcIixcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJQcm9kdWN0IERhdGEgU2hlZXRzXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImFjdGlvblwiOiBcIkRvd25sb2FkXCIsXG4gICAgICAgICAgICAgICAgICAgICAgICBcImxhYmVsXCI6IHRoaXMuc2VsZWN0ZWRJdGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJkb2N1bWVudElkXCI6IHRoaXMuc2VsZWN0ZWRJZFxuICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIHNlbGVjdEl0ZW0oZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ID0gdGhpcy4kcmVmcy5kcm9wZG93bjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHQgPSBzZWxlY3Qub3B0aW9uc1tzZWxlY3Quc2VsZWN0ZWRJbmRleF0udGV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGV0IElkID0gc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLmRhdGFzZXQuaWQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gdGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZElkID0gSWQ7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXJsID0gZS50YXJnZXQudmFsdWU7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkVXJsID0gc2VsZWN0Lm9wdGlvbnNbc2VsZWN0LnNlbGVjdGVkSW5kZXhdLnZhbHVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgc3VibWl0KGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coZS50YXJnZXQpO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cub3Blbih0aGlzLnNlbGVjdGVkVXJsLCAnX2JsYW5rJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RJdGVtKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC5zcGVjcy0ke2lkfWAsXG4gICAgICAgICAgICBzdG9yZTogc3RvcmUsXG4gICAgICAgIH0pLiRtb3VudChgLnNwZWNzLSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgc3BlY3NUYWJsZVRlbXBsYXRlKCk7XG4gICAgc3BlY1RhYmxlTG9hZE1vcmUoKTtcblxuICAgIGlmIChzcGVjcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHNwZWNzLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHNwZWNzLSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBzcGVjc0NvbnN0cnVjdG9yKGluZGV4KTtcbiAgICAgICAgfSlcbiAgICB9XG5cbn1cblxuZXhwb3J0IGRlZmF1bHQgU3BlY2lmaWNhdGlvbnM7IiwiLypcbiAgICAjU3RvcmFnZU1hbmFnZXJcbiAgICAgICBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgdG8gY29udHJvbCBhbmQgc3RvcmUgdGhlIGluZm9ybWF0aW9uIHdpdGggZGlmZmVyZW50IGtpbmRzIG9mIHN0b3JhZ2UuIEJ5IGRlZmF1bHQgdXNlIFNlc3Npb25TdG9yYWdlTWFuYWdlciAoU2Vzc2lvblN0b3JhZ2UpLlxuXG4gICAgICAgICMgZ2V0OlxuICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyBmb3IgcmVhZGluZyBhIHZhbHVlIHN0b3JlZFxuXG4gICAgICAgICMgc2V0OlxuICAgICAgICAgICBUaGlzIG1ldGhvZCBpcyB0byBzdG9yZSBhIHZhbHVlXG5cbiAgICAgICAgIyByZW1vdmU6XG4gICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHRvIHJlbW92ZSBhIHZhbHVlIHN0b3JlZFxuXG4gICAgICAgICMgYWRkVGltZXM6XG4gICAgICAgICAgIFRoaXMgbWV0aG9kIGlzIHRvIGFkZCBhIG51bWJlciB0byBhIGludGVnZXIgdmFsdWUgc3RvcmVkXG5cbiAgICAgICAgIyBzdWJUaW1lczpcbiAgICAgICAgICAgVGhpcyBtZXRob2QgaXMgdG8gc3VidHJhY3QgYSBudW1iZXIgdG8gYSBpbnRlZ2VyIHZhbHVlIHN0b3JlZFxuKi9cblxuY29uc3QgU3RvcmFnZU1hbmFnZXIgPSBtYW5hZ2VyID0+IHtcbiAgICBjb25zdCBpbnN0YW5jZSA9IHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5fbWFuYWdlci5fZ2V0KGtleSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gaW5zdGFuY2UuX21hbmFnZXIuX3NldChrZXksIHZhbHVlKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkge1xuICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlLl9tYW5hZ2VyLl9yZW1vdmUoa2V5KTtcbiAgICAgICAgfSxcblxuICAgICAgICBhZGRUaW1lczogZnVuY3Rpb24oa2V5LCBudW0pIHtcbiAgICAgICAgICAgIGNvbnN0IGFkZCA9IHBhcnNlSW50KG51bSB8fCAxKTtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5fbWFuYWdlci5fYWRkKGtleSwgYWRkKTtcbiAgICAgICAgfSxcblxuICAgICAgICBzdWJUaW1lczogZnVuY3Rpb24oa2V5LCBudW0pIHtcbiAgICAgICAgICAgIGNvbnN0IHN1YiA9IHBhcnNlSW50KG51bSB8fCAxKTtcbiAgICAgICAgICAgIHJldHVybiBpbnN0YW5jZS5fbWFuYWdlci5fc3ViKGtleSwgc3ViKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBpbnN0YW5jZS5fbWFuYWdlciA9IG1hbmFnZXIgfHwgU2Vzc2lvblN0b3JhZ2VNYW5hZ2VyO1xuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xufTtcblxuZXhwb3J0IGNvbnN0IFNlc3Npb25TdG9yYWdlTWFuYWdlciA9IHtcbiAgICBfZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIHNlc3Npb25TdG9yYWdlLmdldEl0ZW0oa2V5KTtcbiAgICB9LFxuXG4gICAgX3NldDogZnVuY3Rpb24oa2V5LCB2YWx1ZSkge1xuICAgICAgICByZXR1cm4gc2Vzc2lvblN0b3JhZ2Uuc2V0SXRlbShrZXksIHZhbHVlKTtcbiAgICB9LFxuXG4gICAgX3JlbW92ZTogZnVuY3Rpb24oa2V5KSB7XG4gICAgICAgIHJldHVybiBzZXNzaW9uU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgfSxcblxuICAgIF9hZGQ6IGZ1bmN0aW9uKGtleSwgbnVtKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwYXJzZUludChTZXNzaW9uU3RvcmFnZU1hbmFnZXIuX2dldChrZXkpIHx8IDApO1xuICAgICAgICBTZXNzaW9uU3RvcmFnZU1hbmFnZXIuX3NldChrZXksIGN1cnJlbnQgKyBudW0pO1xuICAgIH0sXG5cbiAgICBfc3ViOiBmdW5jdGlvbihrZXksIG51bSkge1xuICAgICAgICBTZXNzaW9uU3RvcmFnZU1hbmFnZXIuX2FkZChrZXksIG51bSAqIC0xKTtcbiAgICB9XG59O1xuXG5leHBvcnQgY29uc3QgTG9jYWxTdG9yYWdlTWFuYWdlciA9IHtcbiAgICBfZ2V0OiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKGtleSk7XG4gICAgfSxcblxuICAgIF9zZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5zZXRJdGVtKGtleSwgdmFsdWUpO1xuICAgIH0sXG5cbiAgICBfcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGtleSk7XG4gICAgfSxcblxuICAgIF9hZGQ6IGZ1bmN0aW9uKGtleSwgbnVtKSB7XG4gICAgICAgIGNvbnN0IGN1cnJlbnQgPSBwYXJzZUludChMb2NhbFN0b3JhZ2VNYW5hZ2VyLl9nZXQoa2V5KSB8fCAwKTtcbiAgICAgICAgTG9jYWxTdG9yYWdlTWFuYWdlci5fc2V0KGtleSwgY3VycmVudCArIG51bSk7XG4gICAgfSxcblxuICAgIF9zdWI6IGZ1bmN0aW9uKGtleSwgbnVtKSB7XG4gICAgICAgIExvY2FsU3RvcmFnZU1hbmFnZXIuX2FkZChrZXksIG51bSAqIC0xKTtcbiAgICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBTdG9yYWdlTWFuYWdlcjtcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgVnVleCBmcm9tICd2dWV4JztcbmltcG9ydCBheGlvcyBmcm9tICdheGlvcyc7XG5pbXBvcnQge2dldENvb2tpZVZhbHVlfSBmcm9tICcuL21pc2MuanMnO1xuXG5WdWUudXNlKFZ1ZXgpO1xuXG5jb25zdCBzdG9yZSA9IG5ldyBWdWV4LlN0b3JlKHtcbiAgICBzdGF0ZToge1xuICAgICAgICBwYWdlVGl0bGU6ICcnLFxuICAgICAgICBpc01vYmlsZTogbnVsbCwgLy9pcyB2aWV3cG9ydCA8IDgzNXB4XG4gICAgICAgIGlzU21hbGxNb2JpbGU6IG51bGwsIC8vaXMgdmlld3BvcnQgPCA2NTBweFxuICAgICAgICBpc01kRGVza3RvcDogbnVsbCwgLy9pcyB2aWV3cG9ydCA8IDEwMjRweFxuICAgICAgICBwYWdlQW5jaG9yczogW10sXG4gICAgICAgIHNob3dJbmxpbmVBbmNob3JzOiBmYWxzZSxcbiAgICAgICAgdW5pdHM6IG51bGwsXG4gICAgICAgIG1lbnVLZXlzOiBbXSxcbiAgICAgICAgZmF2b3JpdGVzOiB7IC8vTk9URTogYWxsIGlkcyBzdG9yZWQgYXMgc3RyaW5nc1xuICAgICAgICAgICAgZG9jdW1lbnRJZDogW10sXG4gICAgICAgICAgICBzb2Z0d2FyZUlkOiBbXSxcbiAgICAgICAgICAgIGFydGljbGVJZDogW10sXG4gICAgICAgICAgICBwcm9kdWN0SWQ6IFtdLFxuICAgICAgICAgICAgbGVnYWxEb2N1bWVudElkOiBbXVxuICAgICAgICB9LFxuICAgICAgICBjdXJyZW50TGFuZzogbnVsbCxcbiAgICAgICAgbGl0T3JkZXJDYXJ0OiBbXSxcbiAgICAgICAgR0FJRDogbnVsbCBcbiAgICB9LFxuXG4gICAgbXV0YXRpb25zOiAge1xuICAgICAgICB1cGRhdGVUaXRsZShzdGF0ZSwgdGl0bGUpIHtcbiAgICAgICAgICAgIHN0YXRlLnBhZ2VUaXRsZSA9IHRpdGxlO1xuICAgICAgICB9LFxuICAgICAgICBzZXRNb2JpbGVTdGF0ZShzdGF0ZSwgbW9iaWxlU3RhdGUpIHtcbiAgICAgICAgICAgIHN0YXRlLmlzTW9iaWxlID0gbW9iaWxlU3RhdGU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldFNtYWxsTW9iaWxlU3RhdGUoc3RhdGUsIG1vYmlsZVN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS5pc1NtYWxsTW9iaWxlID0gbW9iaWxlU3RhdGU7XG4gICAgICAgIH0sXG4gICAgICAgIHNldE1kRGVza3RvcFN0YXRlKHN0YXRlLCBtb2JpbGVTdGF0ZSkge1xuICAgICAgICAgICAgc3RhdGUuaXNNZERlc2t0b3AgPSBtb2JpbGVTdGF0ZTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0UGFnZUFuY2hvcnMoc3RhdGUsIGFuY2hvcnMpIHtcbiAgICAgICAgICAgIHN0YXRlLnBhZ2VBbmNob3JzID0gYW5jaG9ycztcbiAgICAgICAgfSxcbiAgICAgICAgc2V0QW5jaG9yRHJvcGRvd25WaXMoc3RhdGUsIGFuY2hvclN0YXRlKSB7XG4gICAgICAgICAgICBzdGF0ZS5zaG93SW5saW5lQW5jaG9ycyA9IGFuY2hvclN0YXRlO1xuICAgICAgICB9LFxuICAgICAgICBzZXRVbml0cyhzdGF0ZSwgdW5pdHMpIHtcbiAgICAgICAgICAgIGlmICh1bml0cykge1xuICAgICAgICAgICAgICAgIHN0YXRlLnVuaXRzID0gdW5pdHM7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXRlLnVuaXRzID0gXG4gICAgICAgICAgICAgICAgICAgICBzdGF0ZS51bml0cyA9PSAndXMnID8gJ21ldHJpYydcbiAgICAgICAgICAgICAgICAgICAgOiBzdGF0ZS51bml0cyA9PSAnbWV0cmljJyA/ICd1cydcbiAgICAgICAgICAgICAgICAgICAgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVNZW51KHN0YXRlLCBvYmopIHtcbiAgICAgICAgICAgIHN0YXRlLm1lbnVLZXlzLnB1c2gob2JqKTtcbiAgICAgICAgfSxcbiAgICAgICAgdXBkYXRlRmF2b3JpdGVzKHN0YXRlLCBkYXRhKSB7XG4gICAgICAgICAgICAvLyBhZGQvcmVtb3ZlIGl0ZW1zIGZyb20gc3RvcmVzIGZhdm9yaXRlc1xuICAgICAgICAgICAgaWYgKGRhdGEuYWN0aW9uID09IFwiYWRkXCIpIHtcbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImFkZFwiKTtcbiAgICAgICAgICAgICAgICBzdGF0ZS5mYXZvcml0ZXNbZGF0YS50eXBlXS5wdXNoKGRhdGEuaWQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChkYXRhLmFjdGlvbiA9PSBcInJlbW92ZVwiKSB7XG4gICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJyZW1vdmVcIik7XG5cbiAgICAgICAgICAgICAgICBpZiAoc3RhdGUuZmF2b3JpdGVzW2RhdGEudHlwZV0uaW5jbHVkZXMoZGF0YS5pZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3RhdGUuZmF2b3JpdGVzW2RhdGEudHlwZV0uc3BsaWNlKHN0YXRlLmZhdm9yaXRlc1tkYXRhLnR5cGVdLmluZGV4T2YoZGF0YS5pZCksIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBpbml0RmF2b3JpdGVzKHN0YXRlLCBkYXRhKSB7XG4gICAgICAgICAgICBzdGF0ZS5mYXZvcml0ZXNbZGF0YS50eXBlXSA9IGRhdGEuYXJyO1xuICAgICAgICB9LFxuICAgICAgICBzYW5pdGl6ZUZhdm9yaXRlcyhzdGF0ZSwgcmVzdWx0cykge1xuICAgICAgICAgICAgLy8gc2FuaXRpc3plIGZhdm9yaXRlcyBiYXNlZCBvbiB2YWxpZCBmYXZzIHJldHVybmVkIGZyb20gYXBpXG4gICAgICAgICAgICBzdGF0ZS5mYXZvcml0ZXMuZG9jdW1lbnRJZCA9IHJlc3VsdHMuZG9jdW1lbnRJZHMubWFwKGkgPT4gYCR7aX1gKTtcbiAgICAgICAgICAgIHN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkID0gcmVzdWx0cy5zb2Z0d2FyZUlkcy5tYXAoaSA9PiBgJHtpfWApO1xuICAgICAgICAgICAgc3RhdGUuZmF2b3JpdGVzLmFydGljbGVJZCA9IHJlc3VsdHMuYXJ0aWNsZUlkcy5tYXAoaSA9PiBgJHtpfWApO1xuICAgICAgICAgICAgc3RhdGUuZmF2b3JpdGVzLnByb2R1Y3RJZCA9IHJlc3VsdHMucHJvZHVjdElkcy5tYXAoaSA9PiBgJHtpfWApO1xuICAgICAgICAgICAgc3RhdGUuZmF2b3JpdGVzLmxlZ2FsRG9jdW1lbnRJZCA9IHJlc3VsdHMubGVnYWxEb2N1bWVudElkcy5tYXAoaSA9PiBgJHtpfWApO1xuICAgICAgICB9LFxuICAgICAgICBzZXRDdXJyZW50TGFuZyhzdGF0ZSwgbGFuZykge1xuICAgICAgICAgICAgc3RhdGUuY3VycmVudExhbmcgPSBsYW5nO1xuICAgICAgICB9LFxuICAgICAgICB1cGRhdGVMaXRPcmRlckNhcnQoc3RhdGUsIGRhdGEpIHtcbiAgICAgICAgICAgIHN0YXRlLmxpdE9yZGVyQ2FydCA9IGRhdGE7XG4gICAgICAgIH0sXG4gICAgICAgIHNldEdBSUQoc3RhdGUsIGlkKSB7XG4gICAgICAgICAgICBzdGF0ZS5HQUlEID0gaWQ7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGFjdGlvbnM6IHtcbiAgICAgICAgY2hlY2tNb2JpbGUoY29udGV4dCkge1xuICAgICAgICAgICAgdmFyIG1xbE1kID0gd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDgzNXB4KScpO1xuICAgICAgICAgICAgdmFyIG1xbFNtID0gd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDY1MHB4KScpO1xuICAgICAgICAgICAgdmFyIG1xbE1kRGVza3RvcCA9IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiAxMDI0cHgpJyk7XG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKG1xbE1kLm1hdGNoZXMpO1xuICAgICAgICAgICAgdmFyIGlzTW9iaWxlID0gbXFsTWQubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnRleHQuY29tbWl0KCdzZXRNb2JpbGVTdGF0ZScsIGlzTW9iaWxlKTtcblxuICAgICAgICAgICAgbXFsTWQuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXNNb2JpbGUgPSBtcWxNZC5tYXRjaGVzID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgICAgIGNvbnRleHQuY29tbWl0KCdzZXRNb2JpbGVTdGF0ZScsIGlzTW9iaWxlKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB2YXIgaXNTbWFsbE1vYmlsZSA9IG1xbFNtLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgnc2V0U21hbGxNb2JpbGVTdGF0ZScsIGlzU21hbGxNb2JpbGUpO1xuXG4gICAgICAgICAgICBtcWxTbS5hZGRFdmVudExpc3RlbmVyKCdjaGFuZ2UnLCgpID0+IHtcbiAgICAgICAgICAgICAgICBpc1NtYWxsTW9iaWxlID0gbXFsU20ubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgnc2V0U21hbGxNb2JpbGVTdGF0ZScsIGlzU21hbGxNb2JpbGUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHZhciBpc01kRGVza3RvcCA9IG1xbE1kRGVza3RvcC5tYXRjaGVzID8gdHJ1ZSA6IGZhbHNlO1xuICAgICAgICAgICAgY29udGV4dC5jb21taXQoJ3NldE1kRGVza3RvcFN0YXRlJywgaXNNZERlc2t0b3ApO1xuXG4gICAgICAgICAgICBtcWxNZERlc2t0b3AuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKSA9PiB7XG4gICAgICAgICAgICAgICAgaXNNZERlc2t0b3AgPSBtcWxNZERlc2t0b3AubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgnc2V0TWREZXNrdG9wU3RhdGUnLCBpc01kRGVza3RvcCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5pdENvb2tpZXMoY29udGV4dCkge1xuICAgICAgICAgICAgLy8gY2hlY2sgZm9yIGN1cnJlbnQgY29va2llc1xuICAgICAgICAgICAgY29udGV4dC5jb21taXQoJ2luaXRGYXZvcml0ZXMnLCB7XCJ0eXBlXCI6J2RvY3VtZW50SWQnLCBhcnI6IGdldENvb2tpZVZhbHVlKCdkb2N1bWVudElkcycpLnNwbGl0KCcsJyl9ICk7XG4gICAgICAgICAgICBjb250ZXh0LmNvbW1pdCgnaW5pdEZhdm9yaXRlcycsIHtcInR5cGVcIjonc29mdHdhcmVJZCcsIGFycjogZ2V0Q29va2llVmFsdWUoJ3NvZnR3YXJlSWRzJykuc3BsaXQoJywnKX0gKTtcbiAgICAgICAgICAgIGNvbnRleHQuY29tbWl0KCdpbml0RmF2b3JpdGVzJywge1widHlwZVwiOidhcnRpY2xlSWQnLCBhcnI6IGdldENvb2tpZVZhbHVlKCdhcnRpY2xlSWRzJykuc3BsaXQoJywnKX0gKTtcbiAgICAgICAgICAgIGNvbnRleHQuY29tbWl0KCdpbml0RmF2b3JpdGVzJywge1widHlwZVwiOidwcm9kdWN0SWQnLCBhcnI6IGdldENvb2tpZVZhbHVlKCdwcm9kdWN0SWRzJykuc3BsaXQoJywnKX0gKTtcbiAgICAgICAgICAgIGNvbnRleHQuY29tbWl0KCdpbml0RmF2b3JpdGVzJywge1widHlwZVwiOidsZWdhbERvY3VtZW50SWQnLCBhcnI6IGdldENvb2tpZVZhbHVlKCdsZWdhbERvY3VtZW50SWRzJykuc3BsaXQoJywnKX0gKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coY29udGV4dC5zdGF0ZS5mYXZvcml0ZXMpO1xuXG4gICAgICAgICAgICBjb250ZXh0LmRpc3BhdGNoKCdjaGVja0Zhdm9yaXRlcycpO1xuICAgICAgICB9LFxuICAgICAgICBjb29raWVGYXZvcml0ZXMoY29udGV4dCkge1xuICAgICAgICAgICAgLy8gY29va2llIGN1cnJlbnQgc2F2ZWQgaXRlbXMgaW4gc3RvcmVcbiAgICAgICAgICAgIGxldCBkb2NTdHIgPSBjb250ZXh0LnN0YXRlLmZhdm9yaXRlcy5kb2N1bWVudElkLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBsZXQgc29mdHdhcmVTdHIgPSBjb250ZXh0LnN0YXRlLmZhdm9yaXRlcy5zb2Z0d2FyZUlkLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBsZXQgYXJ0aWNsZVN0ciA9IGNvbnRleHQuc3RhdGUuZmF2b3JpdGVzLmFydGljbGVJZC50b1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IHByb2R1Y3RTdHIgPSBjb250ZXh0LnN0YXRlLmZhdm9yaXRlcy5wcm9kdWN0SWQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBsZWdhbERvY1N0ciA9IGNvbnRleHQuc3RhdGUuZmF2b3JpdGVzLmxlZ2FsRG9jdW1lbnRJZC50b1N0cmluZygpO1xuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gYGRvY3VtZW50SWRzPSR7ZG9jU3RyfTsgbWF4LWFnZT0xMjA5NjAwOyBwYXRoPS9gO1xuICAgICAgICAgICAgZG9jdW1lbnQuY29va2llID0gYHNvZnR3YXJlSWRzPSR7c29mdHdhcmVTdHJ9OyBtYXgtYWdlPTEyMDk2MDA7IHBhdGg9L2A7XG4gICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgYXJ0aWNsZUlkcz0ke2FydGljbGVTdHJ9OyBtYXgtYWdlPTEyMDk2MDA7IHBhdGg9L2A7XG4gICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgcHJvZHVjdElkcz0ke3Byb2R1Y3RTdHJ9OyBtYXgtYWdlPTEyMDk2MDA7IHBhdGg9L2A7XG4gICAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBgbGVnYWxEb2N1bWVudElkcz0ke2xlZ2FsRG9jU3RyfTsgbWF4LWFnZT0xMjA5NjAwOyBwYXRoPS9gO1xuICAgICAgICB9LFxuICAgICAgICBjaGVja0Zhdm9yaXRlcyhjb250ZXh0KSB7XG4gICAgICAgICAgICAvLyB2YWxpZGF0ZSBjb29raWVzIHdpdGggYXBpXG4gICAgICAgICAgICBsZXQgZG9jU3RyID0gY29udGV4dC5zdGF0ZS5mYXZvcml0ZXMuZG9jdW1lbnRJZC50b1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IHNvZnR3YXJlU3RyID0gY29udGV4dC5zdGF0ZS5mYXZvcml0ZXMuc29mdHdhcmVJZC50b1N0cmluZygpO1xuICAgICAgICAgICAgbGV0IGFydGljbGVTdHIgPSBjb250ZXh0LnN0YXRlLmZhdm9yaXRlcy5hcnRpY2xlSWQudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGxldCBwcm9kdWN0U3RyID0gY29udGV4dC5zdGF0ZS5mYXZvcml0ZXMucHJvZHVjdElkLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBsZXQgbGVnYWxEb2NTdHIgPSBjb250ZXh0LnN0YXRlLmZhdm9yaXRlcy5sZWdhbERvY3VtZW50SWQudG9TdHJpbmcoKTtcblxuICAgICAgICAgICAgbGV0IGF4aW9zUGFyYW1zID0ge1xuICAgICAgICAgICAgICAgIGRvY3VtZW50SWQ6IGRvY1N0ciA9PSBcIlwiID8gbnVsbCA6IGRvY1N0ci5jaGFyQXQoMCkgPT0gXCIsXCIgPyBkb2NTdHIuc2xpY2UoMSkgOiBkb2NTdHIsXG4gICAgICAgICAgICAgICAgc29mdHdhcmVJZDogc29mdHdhcmVTdHIgPT0gXCJcIiA/IG51bGwgOiBzb2Z0d2FyZVN0ci5jaGFyQXQoMCkgPT0gXCIsXCIgPyBzb2Z0d2FyZVN0ci5zbGljZSgxKSA6IHNvZnR3YXJlU3RyLFxuICAgICAgICAgICAgICAgIGFydGljbGVJZDogYXJ0aWNsZVN0ciA9PSBcIlwiID8gbnVsbCA6IGFydGljbGVTdHIuY2hhckF0KDApID09IFwiLFwiID8gYXJ0aWNsZVN0ci5zbGljZSgxKSA6IGFydGljbGVTdHIsXG4gICAgICAgICAgICAgICAgcHJvZHVjdElkOiBwcm9kdWN0U3RyID09IFwiXCIgPyBudWxsIDogcHJvZHVjdFN0ci5jaGFyQXQoMCkgPT0gXCIsXCIgPyBwcm9kdWN0U3RyLnNsaWNlKDEpIDogcHJvZHVjdFN0cixcbiAgICAgICAgICAgICAgICBsZWdhbERvY3VtZW50SWQ6IGxlZ2FsRG9jU3RyID09IFwiXCIgPyBudWxsIDogbGVnYWxEb2NTdHIuY2hhckF0KDApID09IFwiLFwiID8gbGVnYWxEb2NTdHIuc2xpY2UoMSkgOiBsZWdhbERvY1N0clxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYXhpb3NQYXJhbXMpO1xuXG4gICAgICAgICAgICAvLyBjb25zdCBhcGlVcmwgPSBnZXRBcGlVcmwoKTtcbiAgICAgICAgICAgIGNvbnN0IGFwaVVybCA9IGAvYXBpL3ZhbGlkYXRlaWRzP2A7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhhcGlVcmwpO1xuICAgICAgICAgICAgLy8gbGV0IFRFU1RVUkwgPSBcImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMy92YWxpZGF0ZUlkc1wiO1xuICAgICAgICAgICAgYXhpb3MuZ2V0KGFwaVVybCwge1xuICAgICAgICAgICAgICAgIHBhcmFtczoge1xuICAgICAgICAgICAgICAgICAgICAuLi5heGlvc1BhcmFtc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbihmdW5jdGlvbihyZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgnc2FuaXRpemVGYXZvcml0ZXMnLCByZXNwb25zZS5kYXRhLnJlc3VsdHMpO1xuICAgICAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKCdjb29raWVGYXZvcml0ZXMnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goZnVuY3Rpb24oZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvcik7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgaW5pdFVuaXRzKGNvbnRleHQpIHtcbiAgICAgICAgICAgIGxldCBsYW5nID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcC1iYXJfX3N1Ym5hdi1saW5rLmFjdGl2ZScpID8gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLnRvcC1iYXJfX3N1Ym5hdi1saW5rLmFjdGl2ZScpLmRhdGFzZXQubGFuZyA6IG51bGw7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcIkxBTkdcIiwgbGFuZylcbiAgICAgICAgICAgIHN0b3JlLmNvbW1pdCgnc2V0Q3VycmVudExhbmcnLCBsYW5nKTtcbiAgICAgICAgICAgIGlmIChsYW5nICE9PSBcImVuLXVzXCIpIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3NldFVuaXRzJywgJ21ldHJpYycpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdG9yZS5jb21taXQoJ3NldFVuaXRzJywgJ3VzJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGluaXRHQUlEKGNvbnRleHQpIHtcbiAgICAgICAgICAgIGxldCBpZCA9IGdldENvb2tpZVZhbHVlKCdfZ2EnKSA9PSAnJyA/IG51bGwgOiBnZXRDb29raWVWYWx1ZSgnX2dhJykgO1xuICAgICAgICAgICAgc3RvcmUuY29tbWl0KCdzZXRHQUlEJywgaWQpO1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coaWQpO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IHN0b3JlOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgc3RvcmUgZnJvbSAnLi9zdG9yZSc7XG5pbXBvcnQgRXZlbnRCdXMgZnJvbSAnLi9ldmVudC1idXMnXG5cbmNvbnN0IFN1Ym5hdiA9ICgpID0+IHtcbiAgICBjb25zdCBzdWJuYXZEb20gPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcuc3ViLW5hdicpOyAgIFxuICAgIFxuICAgIGxldCBzdWJuYXZDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCdzdWJuYXYtdGVtcGxhdGUnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBpc01vYmlsZTogc3RvcmUuc3RhdGUuaXNNb2JpbGUsXG4gICAgICAgICAgICAgICAgICAgIGFuY2hvcnM6IHN0b3JlLnN0YXRlLnBhZ2VBbmNob3JzLFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb21wdXRlZDoge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXNNb2JpbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmUuc3RhdGUuaXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBjb21wdXRlZFNob3dBbmNob3JzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgcmV0dXJuIHN0b3JlLnN0YXRlLnNob3dJbmxpbmVBbmNob3JzO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGNvbXB1dGVkSXNNb2JpbGUoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSB0aGlzLmNvbXB1dGVkSXNNb2JpbGU7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAvLyBjb21wdXRlZFNob3dBbmNob3JzKCkge1xuICAgICAgICAgICAgICAgIC8vICAgICB0aGlzLnNob3dBbmNob3JzID0gdGhpcy5jb21wdXRlZFNob3dBbmNob3JzO1xuICAgICAgICAgICAgICAgIC8vIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgVnVlLmNvbXBvbmVudCgnc3VibmF2LWRlc2t0b3AnLCB7XG4gICAgICAgICAgICBwcm9wczogWydpc01vYmlsZSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG5cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3N1Ym5hdkRyb3Bkb3duJywge1xuICAgICAgICAgICAgcHJvcHM6IFsnYW5jaG9ycyddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcblxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB0ZW1wbGF0ZTogYFxuICAgICAgICAgICAgPHNlbGVjdCBuYW1lPVwicGFnZVNlY3Rpb25cIiBjbGFzcz1cInBlcnNpc3RlbnQtY3RhX19kcm9wZG93biBwZXJzaXN0ZW50LWN0YV9fZHJvcGRvd24tLWlubGluZVwiIDphbmNob3I9YW5jaG9ycyB2LW9uOmNoYW5nZT1cImp1bXBcIj5cbiAgICAgICAgICAgICAgICA8YW5jaG9yLWRyb3Bkb3duLWl0ZW0gdi1mb3I9XCIoaXRlbSwgaW5kZXgpIGluIGFuY2hvcnNcIiA6a2V5PVwiaW5kZXhcIiA6ZGF0YT1cIml0ZW1cIi8+XG4gICAgICAgICAgICA8L3NlbGVjdD5cbiAgICAgICAgICAgIGAsXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAganVtcChlKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gYCMke2UudGFyZ2V0LnZhbHVlfWA7XG4gICAgICAgICAgICAgICAgICAgIC8vY29uc29sZS5sb2coZS50YXJnZXQudmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBWdWUuY29tcG9uZW50KCdhbmNob3ItZHJvcGRvd24taXRlbScsIHtcbiAgICAgICAgICAgIHByb3BzOiBbJ2RhdGEnXSxcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG5cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgdGVtcGxhdGU6IGBcbiAgICAgICAgICAgICAgICA8b3B0aW9uIDp2YWx1ZT1cImRhdGEua2V5XCI+e3tkYXRhLm5hbWV9fTwvb3B0aW9uPlxuICAgICAgICAgICAgYCxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcblxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAuc3VibmF2LSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAuc3VibmF2LSR7aWR9YCwgdHJ1ZSk7XG4gICAgfVxuXG4gICAgaWYgKHN1Ym5hdkRvbS5sZW5ndGggPiAwICkge1xuICAgICAgICBzdWJuYXZEb20uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgc3VibmF2LSR7aW5kZXh9YCk7XG4gICAgICAgICAgICBzdWJuYXZDb25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxuXG59XG5cbmV4cG9ydCBkZWZhdWx0IFN1Ym5hdjsiLCIvKlxuICAgIFRhYnMgaXMgYSBkZWNvcmF0b3IgZnVuY3Rpb24gdG8gYWRkIHRoZSBWdWUgVGFicyBjb21wb25lbnQuXG4gICAgICAgICogQXJndW1lbnRzOlxuICAgICAgICAgICAgLSB7T2JqZWN0fSBvcHRpb25zXG4gICAgICAgICogVXNhZ2U6XG4gICAgICAgICAgIFRoZSAnb3B0aW9ucycgYXJndW1lbnQgaXMgdGhlIHNhbWUgY29uZmlndXJhdGlvbiBmb3IgYSBWdWUgQ29tcG9uZW50LiBpbiBhZGRpdGlvbiwgdGhlIG5leHQgb3B0aW9uczpcblxuICAgICAgICAgICAtIG5hbWUgW3N0cmluZ106IG5hbWUgdXNlZCBmb3IgVGFicyBjb21wb25lbnQgaW4gVnVlLiAoYnkgZGVmYXVsdCBpcyAndGFicycuIFJlbWVtYmVyIGNvbnNpZGVyaW5nIHRoZSBwcmVmaXggb3B0aW9uLilcblxuICAgICAgICAqIFByb3BzOlxuXG4gICAgICAgICAgICAtIGN1cnJlbnQtaWQtdGFiOiBzZXRzIHRoZSBmaXJzdCB0aGUgY3VycmVudGx5IGFjdGl2ZSB0YWIgKGJ5IGRlZmF1bHQgaXMgJzEnKS5cbiAgICAgICAgICAgIC0gYWN0aXZlLWNsYXNzOiBpcyBhIENTUyBjbGFzcywgdXNlcyB3aGVuIHRoZSB0YWIgaXMgYWN0aXZlLiB0aGlzIHVzZXMgZm9yIHBhc3NpbmcgdGhlIHNhbWUgdmFsdWUgdG8gdGhlIHRhYiBjb21wb25lbnRzLlxuXG4gICAgICAgICMgVGhlIFN1Yi1jb21wb25lbnRzOlxuXG4gICAgICAgICAgICAqIHRhYjogdGhlIHRhYiBjb21wb25lbnQgaXMgdGhlIHRhYiBidXR0b24sIHRoaXMgaGFzIHRoZSBuZXh0IHByb3BzOlxuICAgICAgICAgICAgICAgIC0gaWQtdGFiOiBpcyB0aGUgdGFiIGlkIHRoYXQgbGlua3Mgd2l0aCBpdHMgY29udGVudC5cbiAgICAgICAgICAgICAgICAtIGN1cnJlbnQtdGFiOiBpZGVudGlmaWVzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYiAoaXMgcmVxdWlyZWQgZm9yIHRoZSB0YWJzIGZ1bmN0aW9uYWxpdHkpLlxuICAgICAgICAgICAgICAgIC0gY2hhbmdlLXRhYjogaXMgdGhlIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgdGhlIHRhYiBjaGFuZ2luZyAoaXMgcmVxdWlyZWQgZm9yIHRoZSB0YWJzIGZ1bmN0aW9uYWxpdHkpLlxuICAgICAgICAgICAgICAgIC0gYWN0aXZlLWNsYXNzOiBpcyBhIENTUyBjbGFzcywgdXNlcyB3aGVuIHRoZSB0YWIgaXMgYWN0aXZlLiAoYnkgZGVmYXVsdCAnYWN0aXZlJylcblxuICAgICAgICAgICAgKiB0YWItY29udGVudDogdGhlIHRhYi1jb250ZW50IGNvbXBvbmVudCBpcyB0aGUgdGFiIGNvbnRlbnQsIHRoaXMgaGFzIHRoZSBuZXh0IHByb3BzOlxuICAgICAgICAgICAgICAgIC0gaWQtdGFiOiBpcyB0aGUgdGFiIGlkIHRoYXQgbGlua3Mgd2l0aCBpdHMgdGFiIGJ1dHRvbi5cbiAgICAgICAgICAgICAgICAtIGN1cnJlbnQtdGFiOiBpZGVudGlmaWVzIHRoZSBjdXJyZW50bHkgYWN0aXZlIHRhYiAoaXMgcmVxdWlyZWQgZm9yIHRoZSB0YWJzIGZ1bmN0aW9uYWxpdHkpLlxuICAgICAgICAgICAgICAgIC0gY2hhbmdlLXRhYjogaXMgdGhlIGZ1bmN0aW9uIHRoYXQgdHJpZ2dlcnMgdGhlIHRhYiBjaGFuZ2luZyAoaXMgcmVxdWlyZWQgZm9yIHRoZSB0YWJzIGZ1bmN0aW9uYWxpdHkgaW4gY2FzY2FkZSBtb2RlKS5cbiAgICAgICAgICAgICAgICAtIHRhYi1jbGFzczogaXMgYSBDU1MgY2xhc3MsIHVzZXMgd2hlbiB0aGUgdGFiIGJ1dHRvbiBzdHlsZXMuIChieSBkZWZhdWx0ICd0YWInLCBvbmx5IGluIGNhc2NhZGUgbW9kZSlcbiAgICAgICAgICAgICAgICAtIGFjdGl2ZS1jbGFzczogaXMgYSBDU1MgY2xhc3MsIHVzZXMgd2hlbiB0aGUgdGFiIGlzIGFjdGl2ZS4gKGJ5IGRlZmF1bHQgaXMgYWN0aXZlKVxuKi9cbmltcG9ydCB7XG4gICAgY29udGVudCBhcyBjb250ZW50VGVtcGxhdGUsXG4gICAgdGFiIGFzIHRhYlRlbXBsYXRlLFxufSBmcm9tICcuL3RlbXBsYXRlLXN0cmluZ3MvdGFicy1jb21wb25lbnQnO1xuXG5jb25zdCB0YWJzID0gKHsgbmFtZSA9ICd0YWJzJywgcHJvcHMsIGRhdGE6IGRhdGFQcm9wLCBtb3VudGVkLCBtZXRob2RzLCBjb21wb25lbnRzLCB0YWJQcm9wcywgY29udGVudFByb3BzLCB0YWJEYXRhLCB0YWJDb250ZW50RGF0YSwgdGFiT3B0aW9ucywgdGFiQ29udGVudE9wdGlvbnMsIC4uLm9wdGlvbnN9ID0ge30pID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBuYW1lLFxuICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgY3VycmVudElkVGFiOiBbU3RyaW5nLCBOdW1iZXJdLFxuICAgICAgICAgICAgYWN0aXZlQ2xhc3M6IFN0cmluZyxcbiAgICAgICAgICAgIC4uLnByb3BzXG4gICAgICAgIH0sXG4gICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgY29uc3QgX2RhdGFQcm9wID0gZGF0YVByb3AgJiYgZGF0YVByb3AoKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFRhYjogdGhpcy5jdXJyZW50SWRUYWIgfHwgMSxcbiAgICAgICAgICAgICAgICAuLi5fZGF0YVByb3BcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9LFxuICAgICAgICBtb3VudGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIG1vdW50ZWQgJiYgbW91bnRlZC5jYWxsKHRoaXMpO1xuXG4gICAgICAgICAgICBjb25zdCB0YWJDaGlsZHJlbiA9IHt9O1xuICAgICAgICAgICAgdGhpcy4kY2hpbGRyZW4uZm9yRWFjaChjID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSBjLiR2bm9kZS5jb21wb25lbnRPcHRpb25zLnRhZztcbiAgICAgICAgICAgICAgICBpZighWyd0YWInLCAndGFiLWNvbnRlbnQnXS5pbmNsdWRlcyh0YWcpKXtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNvbnN0IGlkID0gYy5pZFRhYjtcbiAgICAgICAgICAgICAgICBjb25zdCBlID0gdGFiQ2hpbGRyZW5baWRdO1xuXG4gICAgICAgICAgICAgICAgaWYoIWUpe1xuICAgICAgICAgICAgICAgICAgICB0YWJDaGlsZHJlbltpZF0gPSBjO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgYy5zZXRUYWJJbnN0YW5jZShlKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICBjaGFuZ2VUYWI6IGZ1bmN0aW9uKGlkKXtcbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRUYWIgPSBpZDtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAuLi5tZXRob2RzXG4gICAgICAgIH0sXG4gICAgICAgIGNvbXBvbmVudHM6IHtcbiAgICAgICAgICAgICd0YWInIDoge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd0YWInLFxuICAgICAgICAgICAgICAgIHRlbXBsYXRlOiB0YWJUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgICAgICBpZFRhYjogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlQ2xhc3M6IHt0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6ICdhY3RpdmUnfSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhYjogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgY2hhbmdlVGFiOiBGdW5jdGlvbixcbiAgICAgICAgICAgICAgICAgICAgLi4udGFiUHJvcHNcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGFiRGF0YSxcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgLi4udGFiT3B0aW9ucyxcbiAgICAgICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgICAgIG9uQ2xpY2s6IGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZVRhYih0aGlzLmlkVGFiKTtcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc2V0VGFiSW5zdGFuY2U6IGZ1bmN0aW9uKGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGUuc2V0VGFiRGVmYXVsdFNsb3QodGhpcy5nZXREZWZhdWx0U2xvdCgpKVxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBnZXREZWZhdWx0U2xvdDogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLiRzbG90cy5kZWZhdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAndGFiLWNvbnRlbnQnIDoge1xuICAgICAgICAgICAgICAgIG5hbWU6ICd0YWItY29udGVudCcsXG4gICAgICAgICAgICAgICAgdGVtcGxhdGU6IGNvbnRlbnRUZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICBwcm9wczoge1xuICAgICAgICAgICAgICAgICAgICBpZFRhYjogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFRhYjogW1N0cmluZywgTnVtYmVyXSxcbiAgICAgICAgICAgICAgICAgICAgdGFiQ2xhc3M6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiAndGFiJ30sXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZUNsYXNzOiB7dHlwZTogU3RyaW5nLCBkZWZhdWx0OiAnYWN0aXZlJ30sXG4gICAgICAgICAgICAgICAgICAgIGNoYW5nZVRhYjogRnVuY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIC4uLmNvbnRlbnRQcm9wc1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFiU2xvdDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgLi4udGFiQ29udGVudERhdGFcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIC4uLnRhYkNvbnRlbnRPcHRpb25zLFxuICAgICAgICAgICAgICAgIGJlZm9yZVVwZGF0ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHNsb3RzLnRhYiA9IHRoaXMudGFiU2xvdDtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICAgICAgb25DbGljazogZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlVGFiKHRoaXMuaWRUYWIpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBzZXRUYWJJbnN0YW5jZTogZnVuY3Rpb24oZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFRhYkRlZmF1bHRTbG90KGUuZ2V0RGVmYXVsdFNsb3QoKSlcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgc2V0VGFiRGVmYXVsdFNsb3Q6IGZ1bmN0aW9uKHNsb3Qpe1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50YWJTbG90ID0gc2xvdDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgLi4uY29tcG9uZW50c1xuICAgICAgICB9LFxuICAgICAgICAuLi5vcHRpb25zXG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgdGFicztcbiIsImV4cG9ydCBjb25zdCB0YWJTZWxlY3RNb2JpbGUgPSBgXG4gICAgPGRpdj5cbiAgICAgICAgPHNlbGVjdCA6dmFsdWU9XCJjdXJyZW50VGFiXCIgOmNsYXNzPVwic2VsZWN0Q2xhc3NcIiB2LW9uOmNoYW5nZT1cImNoYW5nZVwiPlxuICAgICAgICAgICAgPG9wdGlvbiB2LWZvcj1cIm8gaW4gb3B0aW9uc1wiIDp2YWx1ZT1cIm8uaWRcIj57e28udGV4dH19PC9vcHRpb24+XG4gICAgICAgIDwvc2VsZWN0PlxuICAgICAgICA8c2xvdD48L3Nsb3Q+XG4gICAgPC9kaXY+XG5gO1xuXG5leHBvcnQgY29uc3QgcHJvZHVjdEl0ZW0gPSBgXG4gICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JcIiA6Y2hlY2tlZD1cImNoZWNrZWRcIiA6ZGF0YT1cImRhdGFcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX3dyYXBwZXJcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX19yb3dcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkLWhvcl9fYXJlYSBwcm9kdWN0LWNhcmQtaG9yX19hcmVhLXV0aWxzXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX191dGlsIHByb2R1Y3QtY2FyZC1ob3JfX3V0aWwtY2hlY2tib3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsYWJlbCBjbGFzcz1cImNoZWNrYm94X19sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT1cImNoZWNrYm94XCIgY2xhc3M9XCJjaGVja2JveF9faW5wdXRcIiB2LW1vZGVsPVwiaXNDaGVja2VkXCIgOmRhdGEtcHJvZHVjdC1pZD1cImRhdGEuaWRcIiByZWY9XCJjaGVja2JveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImNoZWNrYm94X19jaGVja21hcmtcIj48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX3V0aWwgcHJvZHVjdC1jYXJkLWhvcl9fdXRpbC1ib29rbWFya1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtYm9va21hcmstY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHByb2R1Y3QtYm9va21hcmsgaW5saW5lLXRlbXBsYXRlIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX2Jvb2ttYXJrXCIgOmRhdGEtcHJvZHVjdC1pZD1cImRhdGEuaWRcIiByZWY9XCJib29rbWFya1wiIHYtb246Y2xpY2s9XCJoYW5kbGVCb29rbWFyaygpXCIgdi1iaW5kOmNsYXNzPVwiaXNCb29rbWFya2VkID8gJ2FjdGl2ZScgOiAnJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3Byb2R1Y3QtYm9va21hcms+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX2FyZWEgcHJvZHVjdC1jYXJkLWhvcl9fYXJlYS1pbWFnZVwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkLWhvcl9faW1hZ2UtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIDpzcmM9XCJkYXRhLnByb2R1Y3RJbWFnZVVybFwiIDphbHQ9XCJkYXRhLnByb2R1Y3RJbWFnZVVybEFsdFRleHRcIiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX2ltYWdlXCI+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX19hcmVhIHByb2R1Y3QtY2FyZC1ob3JfX2FyZWEtY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJwcm9kdWN0LWNhcmQtaG9yX19leWVicm93XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyA6c3JjPVwiZGF0YS5icmFuZEltYWdlVXJsXCIgOmFsdD1cImRhdGEuYnJhbmRJbWFnZVVybEFsdFRleHRcIiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX2V5ZWJyb3ctaW1hZ2VcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwicHJvZHVjdC1jYXJkLWhvcl9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXHt7ZGF0YS5wcm9kdWN0TmFtZX19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicHJvZHVjdC1jYXJkLWhvcl9fY29weVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFxce3tkYXRhLmRlc2NyaXB0aW9ufX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInByb2R1Y3QtY2FyZC1ob3JfX2N0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgOmhyZWY9XCJkYXRhLnVybFwiIGNsYXNzPVwiYnV0dG9uIHRlcnRpYXJ5LWJ1dHRvblwiPjxzcGFuIGNsYXNzPVwiYnV0dG9uLXRleHRcIj5WaWV3IHByb2R1Y3Q8L3NwYW4+PHNwYW4gY2xhc3M9XCJidXR0b24taWNvblwiPjwvc3Bhbj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuYDtcblxuZXhwb3J0IGNvbnN0IGRvY3VtZW50SXRlbSA9IGBcbjxkaXYgY2xhc3M9XCJkb2MtY2FyZFwiPlxuICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fd3JhcHBlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwiZG9jLWNhcmRfX3Jvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRvYy1jYXJkX19hcmVhIGRvYy1jYXJkX19hcmVhLWxlZnRcIj5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19leWVicm93XCI+XG4gICAgICAgICAgICAgICAgICAgIFxce3tkYXRhLmV5ZWJyb3d9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8YSBocmVmPVwiI1wiIGNsYXNzPVwiZG9jLWNhcmRfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgIFxce3tkYXRhLm5hbWV9fVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImRvYy1jYXJkX19zdWJ0aXRsZVwiPlxuICAgICAgICAgICAgICAgICAgICBcXHt7ZGF0YS5kZXRhaWxzfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkb2MtY2FyZF9fYXJlYSBkb2MtY2FyZF9fYXJlYS1yaWdodFwiPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tZG93bmxvYWRcIiA6aHJlZj1cImRhdGEudXJsXCI+PC9hPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tZW1haWxcIiA6aHJlZj1cIm1haWx0b1wiPjwvYT5cbiAgICAgICAgICAgICAgICA8ZG9jdW1lbnQtYm9va21hcmsgaW5saW5lLXRlbXBsYXRlIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiZG9jLWNhcmRfX2ljb24gZG9jLWNhcmRfX2ljb24tYm9va21hcmtcIiB2LW9uOmNsaWNrLnByZXZlbnQ9XCJoYW5kbGVCb29rbWFyaygpXCIgOmRhdGEtZG9jdW1lbnQtaWQ9XCJkYXRhLmlkXCIgcmVmPVwiYm9va21hcmtcIj48L2E+XG4gICAgICAgICAgICAgICAgPC9kb2N1bWVudC1ib29rbWFyaz5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuYDtcblxuZXhwb3J0IGNvbnN0IHNvZnR3YXJlSXRlbSA9IGBcbiAgICA8ZGl2IGNsYXNzPVwic29mdHdhcmUtY2FyZFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwic29mdHdhcmUtY2FyZF9fd3JhcHBlclwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX3Jvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19hcmVhIHNvZnR3YXJlLWNhcmRfX2FyZWEtbGVmdFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX2V5ZWJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgXFx7e2RhdGEuZXllYnJvd319XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiNcIiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX3RpdGxlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBcXHt7ZGF0YS5uYW1lfX1cbiAgICAgICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX3N1YnRpdGxlXCIgdi1odG1sPVwiZGF0YS5kZXRhaWxzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19hcmVhIHNvZnR3YXJlLWNhcmRfX2FyZWEtcmlnaHRcIj5cbiAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJzb2Z0d2FyZS1jYXJkX19pY29uIHNvZnR3YXJlLWNhcmRfX2ljb24tZG93bmxvYWRcIiA6aHJlZj1cImRhdGEuZG93bmxvYWRVcmxcIj48L2E+XG4gICAgICAgICAgICAgICAgICAgIDxzb2Z0d2FyZS1ib29rbWFyayBpbmxpbmUtdGVtcGxhdGUgOmRhdGE9XCJkYXRhXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX2ljb24gc29mdHdhcmUtY2FyZF9faWNvbi1ib29rbWFya1wiIGhyZWY9XCIjXCIgdi1vbjpjbGljay5wcmV2ZW50PVwiaGFuZGxlQm9va21hcmsoKVwiIDpkYXRhLXNvZnR3YXJlLWlkPVwiZGF0YS5pZFwiIHJlZj1cImJvb2ttYXJrXCI+PC9hPlxuICAgICAgICAgICAgICAgICAgICA8L3NvZnR3YXJlLWJvb2ttYXJrPlxuICAgICAgICAgICAgICAgICAgICA8YSBjbGFzcz1cInNvZnR3YXJlLWNhcmRfX2ljb24gc29mdHdhcmUtY2FyZF9faWNvbi1hcnJvd1wiIDpjbGFzcz1cIntpbmFjdGl2ZTogIWRhdGEudmlld0RldGFpbHNVcmx9XCIgOmhyZWY9XCJkYXRhLnZpZXdEZXRhaWxzVXJsXCI+PC9hPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuYDtcblxuZXhwb3J0IGNvbnN0IGFydGljbGVJdGVtID0gYFxuPGRpdiBjbGFzcz1cImFydGljbGUtY2FyZC1oXCI+XG4gICAgPGRpdiBjbGFzcz1cImFydGljbGUtY2FyZC1oX193cmFwcGVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcnRpY2xlLWNhcmQtaF9fcm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJ0aWNsZS1jYXJkLWhfX2FyZWEgYXJ0aWNsZS1jYXJkLWhfX2FyZWEtdXRpbHNcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYXJ0aWNsZS1jYXJkLWhfX3V0aWwgYXJ0aWNsZS1jYXJkLWhfX3V0aWwtYm9va21hcmtcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJvb2ttYXJrLWNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGFydGljbGUtYm9va21hcmsgaW5saW5lLXRlbXBsYXRlIDpkYXRhPVwiZGF0YVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiYXJ0aWNsZS1jYXJkLWhfX2Jvb2ttYXJrXCIgOmRhdGEtcHJvZHVjdC1pZD1cImRhdGEuaWRcIiByZWY9XCJib29rbWFya1wiIHYtb246Y2xpY2s9XCJoYW5kbGVCb29rbWFyaygpXCIgdi1iaW5kOmNsYXNzPVwiaXNCb29rbWFya2VkID8gJ2FjdGl2ZScgOiAnJ1wiPjwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYXJ0aWNsZS1ib29rbWFyaz5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnRpY2xlLWNhcmQtaF9fYXJlYSBhcnRpY2xlLWNhcmQtaF9fYXJlYS1pbWFnZVwiIHYtYmluZDpzdHlsZT1cInsgYmFja2dyb3VuZEltYWdlOiAndXJsKCcgKyBkYXRhLmFydGljbGVJbWFnZVVybCArICcpJyB9XCI+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJhcnRpY2xlLWNhcmQtaF9fYXJlYSBhcnRpY2xlLWNhcmQtaF9fYXJlYS1jb250ZW50XCI+XG4gICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhcnRpY2xlLWNhcmQtaF9fdGl0bGVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIFxce3tkYXRhLmFydGljbGVUaXRsZX19XG4gICAgICAgICAgICAgICAgICAgIDwvcD5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFydGljbGUtY2FyZC1oX19jb3B5XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8cD5cXHt7ZGF0YS5hcnRpY2xlRGV0YWlsc319PC9wPlxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbmA7IiwiZXhwb3J0IGNvbnN0IGNvbnRlbnQgPSBgXG48ZGl2PlxuICAgIDxzbG90IHYtaWY9XCJkYXRhLmtlZXBDb250ZW50XCI+PC9zbG90PlxuICAgIDxkaXYgdi1mb3I9XCJpdGVtIGluIGRhdGEucmVzdWx0c1wiIGNsYXNzPVwicmVjZW50LXBvc3RzX19jZWxsXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhcnRpY2xlLXRpbGVfX3dyYXBwZXJcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwiYXJ0aWNsZS10aWxlX19saW5rXCIgaHJlZj1cIiNcIiA6aHJlZj1cIml0ZW0udXJsXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImFydGljbGUtdGlsZV9faW1hZ2UtY29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxpbWcgc3JjPVwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMzA1eDE4MFwiIGNsYXNzPVwiYXJ0aWNsZS10aWxlX19pbWFnZVwiIDpzcmM9XCJpdGVtLmltYWdlXCIgOmFsdD1cIml0ZW0uaW1hZ2VBbHRUZXh0XCIgLz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8cCBjbGFzcz1cImFydGljbGUtdGlsZV9fdGl0bGVcIiB2LWh0bWw9XCJpdGVtLnRpdGxlXCI+PC9wPlxuICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwiYXJ0aWNsZS10aWxlX19pbmZvXCI+e3tpdGVtLnR5cGV9fSAvIHt7aXRlbS5pbmZvfX08L3A+XG4gICAgICAgICAgICA8L2E+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+XG5gO1xuXG5leHBvcnQgY29uc3QgcGFnaW5hdG9yID0gYFxuPGRpdiB2LWlmPVwiKGRhdGEuZmlyc3RMb2FkICYmIGlzU2hvdykgfHwgZGF0YS5uZXh0UGFnZVwiPlxuICAgIDxzbG90Pjwvc2xvdD5cbjwvZGl2PlxuYDtcbiIsImV4cG9ydCBjb25zdCBjb250ZW50QXBwbGljYXRpb25zID0gYFxuICAgIDxkaXYgdi1pZj1cImN1cnJlbnRUYWIgPT0gaWRUYWJcIiA6Y2xhc3M9XCJhY3RpdmVDbGFzc1wiIGRhdGEtdGFnLXRyaWdnZXI9XCJjbGlja1wiIDpkYXRhLXRhZy1tZXRhPVwidGFnZ2luZ01ldGFcIj5cbiAgICAgICAgPHNsb3Q+PC9zbG90PlxuICAgIDwvZGl2PlxuYDtcbiIsImV4cG9ydCBjb25zdCBjb250ZW50ID0gYFxuICAgIDxkaXYgOmNsYXNzPVwiY3VycmVudFRhYiA9PSBpZFRhYiAmJiBhY3RpdmVDbGFzc1wiIDpkYXRhLXRhZy1tZXRhPVwidGFnZ2luZ01ldGFcIj5cbiAgICAgICAgPGRpdiB2LWlmPVwiY2hhbmdlVGFiICYmIHRhYlNsb3RcIiB2LW9uOmNsaWNrPVwib25DbGlja1wiIDpjbGFzcz1cInRhYkNsYXNzXCI+XG4gICAgICAgICAgICA8c2xvdCBuYW1lPVwidGFiXCI+PC9zbG90PlxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPHNsb3Qgdi1pZj1cImN1cnJlbnRUYWIgPT0gaWRUYWJcIj48L3Nsb3Q+XG4gICAgPC9kaXY+XG5gO1xuXG5leHBvcnQgY29uc3QgdGFiID0gYFxuICAgIDxsaSB2LW9uOmNsaWNrPVwib25DbGlja1wiIDpjbGFzcz1cImN1cnJlbnRUYWIgPT0gaWRUYWIgJiYgYWN0aXZlQ2xhc3NcIiA6ZGF0YS10YWctbWV0YT1cInRhZ2dpbmdNZXRhXCI+XG4gICAgICAgIDxzbG90Pjwvc2xvdD5cbiAgICA8L2xpPlxuYDtcbiIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgeyBsb3J5IH0gZnJvbSAnbG9yeS5qcyc7XG5cbmNvbnN0IHRlc3RpbW9uaWFsID0gKCkgPT4ge1xuXG4gICAgbGV0IHRlc3RpbW9uaWFsSXRlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJy50ZXN0aW1vbmlhbCcpO1xuXG4gICAgbGV0IHRlc3RpbW9uaWFsQ29uc3RydWN0b3IgPSAoaWQpID0+IHtcbiAgICAgICAgVnVlLmNvbXBvbmVudCgndGVzdGltb25pYWwnLCB7XG4gICAgICAgICAgICBkYXRhOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBzbGlkZXJFbDogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lRnJhbWU6ICd0ZXN0aW1vbmlhbF9fZnJhbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlTW91c2VFdmVudHM6IHRydWVcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgbG9yeTogbnVsbCxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFNsaWRlOiAxLFxuICAgICAgICAgICAgICAgICAgICBsZW5ndGg6IG51bGxcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgY29tcHV0ZWQ6IHtcbiAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdhdGNoOiB7XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbWV0aG9kczoge1xuICAgICAgICAgICAgICAgIGluaXRMb3J5KCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvcnkgPSBsb3J5KHRoaXMuc2xpZGVyRWwsIHRoaXMub3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBpbml0TGlzdGVuZXIoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVyRWwuYWRkRXZlbnRMaXN0ZW5lcignYWZ0ZXIubG9yeS5zbGlkZScsICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFNsaWRlID0gdGhpcy5sb3J5LnJldHVybkluZGV4KCkgKyAxO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG5leHRTbGlkZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3J5Lm5leHQoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHByZXZTbGlkZSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb3J5LnByZXYoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlckVsID0gdGhpcy4kZWwucXVlcnlTZWxlY3RvcignLnRlc3RpbW9uaWFsX19zbGlkZXInKTtcbiAgICAgICAgICAgICAgICB0aGlzLmxlbmd0aCA9IHRoaXMuJGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJy50ZXN0aW1vbmlhbF9fc2xpZGUnKS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0TG9yeSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdExpc3RlbmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAudGVzdGltb25pYWwtJHtpZH1gLFxuICAgICAgICB9KS4kbW91bnQoYC50ZXN0aW1vbmlhbC0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICh0ZXN0aW1vbmlhbEl0ZW0ubGVuZ3RoID4gMCkge1xuICAgICAgICB0ZXN0aW1vbmlhbEl0ZW0uZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgdGVzdGltb25pYWwtJHtpbmRleH1gKTtcbiAgICAgICAgICAgIHRlc3RpbW9uaWFsQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCB0ZXN0aW1vbmlhbDsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IHRpcHB5IGZyb20gJ3RpcHB5LmpzJztcbmltcG9ydCBWTW9kYWwgZnJvbSAndnVlLWpzLW1vZGFsJztcbmltcG9ydCB7IHRvb2x0aXBNb2RhbCB9IGZyb20gXCIuL21vZGFsc1wiO1xuVnVlLnVzZShWTW9kYWwpO1xuXG5jb25zdCBUaW1lbGluZSA9ICgpID0+IHtcblxuICAgIGxldCB0aW1lbGluZUl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnRpbWVsaW5lJyk7XG5cbiAgICBsZXQgdGltZWxpbmVDb25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCd0aW1lbGluZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBudWxsLFxuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZTogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtZXRob2RzOiB7XG4gICAgICAgICAgICAgICAgaW5pdElzTW9iaWxlKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhcImNhbGMgdGhpc1wiLCB3aW5kb3cuaW5uZXJXaWR0aCk7XG4gICAgICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhpcyBpcyBjaGVja2luZyBmb3IgYSBzbWFsbGVyIHNjcmVlbiBzaXplIHRoYW4gdGhlIGlzTW9iaWxlIHZhbHVlIGluIHRoZSB2dWV4IHN0b3JlXG4gICAgICAgICAgICAgICAgICAgIHZhciBtcWwgPSB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogNjUwcHgpJyk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNNb2JpbGUgPSBtcWwubWF0Y2hlcyA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAgICAgICAgICAgICBtcWwuYWRkRXZlbnRMaXN0ZW5lcignY2hhbmdlJywoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzTW9iaWxlID0gbXFsLm1hdGNoZXMgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuaW5pdElzTW9iaWxlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3RpbWVsaW5lLWl0ZW0nLCB7XG4gICAgICAgICAgICBwcm9wczogWydpc01vYmlsZSddLFxuICAgICAgICAgICAgZGF0YTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZToge30sXG4gICAgICAgICAgICAgICAgICAgIGlzT3BlbjogbnVsbFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3YXRjaDoge1xuICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVRvb2x0aXBzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBpbml0VGlwcHkoKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzZWxmID0gdGhpcztcblxuICAgICAgICAgICAgICAgICAgICB0aXBweSh0aGlzLiRyZWZzLnRvb2x0aXAsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93SFRNTDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycm93OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlkZU9uQ2xpY2s6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyOiAnY2xpY2snLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJhY3RpdmU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB6SW5kZXg6IDk5LFxuICAgICAgICAgICAgICAgICAgICAgICAgb25TaG93KGluc3RhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCJPUEVORURcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pc09wZW4gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG9uSGlkZShpbnN0YW5jZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaXNPcGVuID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBtb2JpbGVUb29sdGlwKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5pc01vYmlsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbnRlbnQgPSBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRpbWVsaW5lX19pdGVtLWRhdGVcIj4ke3RoaXMubWVzc2FnZS5kYXRlfTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aW1lbGluZV9faXRlbS1kZXNjXCI+JHt0aGlzLm1lc3NhZ2UudGl0bGV9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj4ke3RoaXMubWVzc2FnZS5jb3B5fTwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgYDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b29sdGlwTW9kYWwudGVtcGxhdGUoY29udGVudCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcE1vZGFsLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9vbHRpcE1vZGFsLm9wdGlvbnNcbiAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzYWJsZVRvb2x0aXBzKCkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGFyZ2V0ID0gdGhpcy4kcmVmcy50b29sdGlwO1xuICAgICAgICAgICAgICAgICAgICBsZXQgaW5zdGFuY2UgPSB0YXJnZXQuX3RpcHB5O1xuICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS5kaXNhYmxlKCk7IC8vQFRPRE86IGZpZ3VyZSBvdXQgd2h5IGRpc2FibGUgbWV0aG9kIGlzbid0IHdvcmtpbmdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGluaXRNZXNzYWdlRGF0YSgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLmNvcHkgPSB0aGlzLiRyZWZzLnRvb2x0aXAuZ2V0QXR0cmlidXRlKCdkYXRhLXRpcHB5LWNvbnRlbnQnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLnRpdGxlID0gdGhpcy4kcmVmcy5kZXNjLmlubmVyVGV4dDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlLmRhdGUgPSB0aGlzLiRyZWZzLmRhdGUuaW5uZXJUZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBtb3VudGVkKCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJG5leHRUaWNrKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbml0VGlwcHkoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNNb2JpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZVRvb2x0aXBzKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0TWVzc2FnZURhdGEoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcblxuICAgICAgICBuZXcgVnVlKHtcbiAgICAgICAgICAgIGVsOiBgLnRpbWVsaW5lLSR7aWR9YCxcbiAgICAgICAgfSkuJG1vdW50KGAudGltZWxpbmUtJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAodGltZWxpbmVJdGVtcy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHRpbWVsaW5lSXRlbXMuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgdGltZWxpbmUtJHtpbmRleH1gKTtcbiAgICAgICAgICAgIHRpbWVsaW5lQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cblxufVxuXG5leHBvcnQgZGVmYXVsdCBUaW1lbGluZTsiLCJpbXBvcnQgVnVlIGZyb20gJ3Z1ZS9kaXN0L3Z1ZS5taW4uanMnO1xuaW1wb3J0IFZNb2RhbCBmcm9tICd2dWUtanMtbW9kYWwnO1xuaW1wb3J0IHt2aWRlb01vZGFsfSBmcm9tICcuL21vZGFscyc7XG5cbmNvbnN0IFZpZGVvUGxheWVyTGluayA9ICgpID0+IHtcblxuICAgIGxldCB2aWRlb3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCcudmlkZW8tcGxheWVyLWxpbmsnKTtcbiAgICBWdWUudXNlKFZNb2RhbCk7XG5cbiAgICBsZXQgVmlkZW9Db25zdHJ1Y3RvciA9IChpZCkgPT4ge1xuICAgICAgICBWdWUuY29tcG9uZW50KCd2aWRlby1wbGF5ZXItdGVtcGxhdGUtbGluaycsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvVXJsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9OYW1lOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBsYXVuY2hWaWRlbygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwudGVtcGxhdGUodGhpcy52aWRlb1VybCwgdGhpcy52aWRlb05hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Nb2RhbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Nb2RhbC5vcHRpb25zXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9ICxcbiAgICAgICAgICAgIG1vdW50ZWQoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb1VybCA9IHRoaXMuJHJlZnMub3ZlcmxheS5kYXRhc2V0LnZpZGVvSWQ7XG4gICAgICAgICAgICAgICAgdGhpcy52aWRlb05hbWUgPSAgbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgXG4gICAgICAgIG5ldyBWdWUoe1xuICAgICAgICAgICAgZWw6IGAudmlkZW8tcGxheWVyLWxpbmstJHtpZH1gLFxuICAgICAgICB9KS4kbW91bnQoYC52aWRlby1wbGF5ZXItbGluay0ke2lkfWAsIHRydWUpO1xuICAgIH1cblxuICAgIGlmICh2aWRlb3MubGVuZ3RoID4gMCkge1xuICAgICAgICB2aWRlb3MuZm9yRWFjaCgoaXRlbSwgaW5kZXgpID0+IHtcbiAgICAgICAgICAgIGl0ZW0uY2xhc3NMaXN0LmFkZChgdmlkZW8tcGxheWVyLWxpbmstJHtpbmRleH1gKTtcbiAgICAgICAgICAgIFZpZGVvQ29uc3RydWN0b3IoaW5kZXgpO1xuICAgICAgICB9KVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgVmlkZW9QbGF5ZXJMaW5rOyIsImltcG9ydCBWdWUgZnJvbSAndnVlL2Rpc3QvdnVlLm1pbi5qcyc7XG5pbXBvcnQgVk1vZGFsIGZyb20gJ3Z1ZS1qcy1tb2RhbCc7XG5pbXBvcnQge3ZpZGVvTW9kYWx9IGZyb20gJy4vbW9kYWxzJztcblxuY29uc3QgVmlkZW9QbGF5ZXIgPSAoKSA9PiB7XG5cbiAgICBsZXQgdmlkZW9zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCgnLnZpZGVvLXBsYXllcicpO1xuICAgIFZ1ZS51c2UoVk1vZGFsKTtcblxuICAgIGxldCBWaWRlb0NvbnN0cnVjdG9yID0gKGlkKSA9PiB7XG4gICAgICAgIFZ1ZS5jb21wb25lbnQoJ3ZpZGVvLXBsYXllci10ZW1wbGF0ZScsIHtcbiAgICAgICAgICAgIGRhdGE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvVXJsOiAnJyxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW9OYW1lOiBudWxsXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG1ldGhvZHM6IHtcbiAgICAgICAgICAgICAgICBsYXVuY2hWaWRlbygpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbW9kYWwuc2hvdyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvTW9kYWwudGVtcGxhdGUodGhpcy52aWRlb1VybCwgdGhpcy52aWRlb05hbWUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Nb2RhbC5uYW1lLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9Nb2RhbC5vcHRpb25zXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbW91bnRlZCgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvVXJsID0gdGhpcy4kcmVmcy5vdmVybGF5LmRhdGFzZXQudmlkZW9JZDtcbiAgICAgICAgICAgICAgICB0aGlzLnZpZGVvTmFtZSA9IHRoaXMuJHJlZnMubmFtZSA/IHRoaXMuJHJlZnMubmFtZS5pbm5lckhUTUwgOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICBcbiAgICAgICAgbmV3IFZ1ZSh7XG4gICAgICAgICAgICBlbDogYC52aWRlby1wbGF5ZXItJHtpZH1gLFxuICAgICAgICB9KS4kbW91bnQoYC52aWRlby1wbGF5ZXItJHtpZH1gLCB0cnVlKTtcbiAgICB9XG5cbiAgICBpZiAodmlkZW9zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgdmlkZW9zLmZvckVhY2goKGl0ZW0sIGluZGV4KSA9PiB7XG4gICAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5hZGQoYHZpZGVvLXBsYXllci0ke2luZGV4fWApO1xuICAgICAgICAgICAgVmlkZW9Db25zdHJ1Y3RvcihpbmRleCk7XG4gICAgICAgIH0pXG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBWaWRlb1BsYXllcjsiLCIvLyBQb2x5ZmlsbHMgZm9yIElFXG5pbXBvcnQgJy4vcG9seWZpbGxzL2VsZW1lbnQuY2xvc2VzdCc7XG5pbXBvcnQgJy4vcG9seWZpbGxzL21hdGNoTWVkaWEnO1xuaW1wb3J0ICdub2RlbGlzdC1mb3JlYWNoLXBvbHlmaWxsJztcbmltcG9ydCAnY29yZS1qcy9mZWF0dXJlcy9wcm9taXNlJztcbmltcG9ydCAnY29yZS1qcy9lcy9zeW1ib2wvaXRlcmF0b3InO1xuaW1wb3J0ICdjb3JlLWpzL2VzL29iamVjdC9hc3NpZ24nO1xuaW1wb3J0ICdjb3JlLWpzL2VzL2FycmF5L2ZpbmQnO1xuaW1wb3J0ICdjb3JlLWpzL2VzL2FycmF5L2Zyb20nO1xuaW1wb3J0ICdjb3JlLWpzL2VzL2FycmF5L2luY2x1ZGVzJztcbmltcG9ydCAnY29yZS1qcy9lcy9zdHJpbmcvaW5jbHVkZXMnO1xuaW1wb3J0ICdpbnRlcnNlY3Rpb24tb2JzZXJ2ZXInO1xuXG4vLyBpbXBvcnQgc2FtcGxlIGZyb20gJy4vbGliL3NhbXBsZS5qcyc7XG5pbXBvcnQgZHJhd2VyIGZyb20gJy4vbGliL2RyYXdlci5qcyc7XG5pbXBvcnQgcHJvZHVjdHNBY2Nlc3NvcmllcyBmcm9tICcuL2xpYi9wcm9kdWN0cy1hY2Nlc3Nvcmllcy5qcyc7XG5pbXBvcnQgY3RhQmFyVG9wIGZyb20gJy4vbGliL2N0YS1iYXItdG9wLmpzJztcbmltcG9ydCBjdGFCYXJCb3R0b20gZnJvbSAnLi9saWIvY3RhLWJhci1ib3R0b20uanMnO1xuaW1wb3J0IHN1Yk5hdiBmcm9tICcuL2xpYi9zdWItbmF2LmpzJztcbmltcG9ydCB0b3BCYXIgZnJvbSAnLi9saWIvbWVudS10b3AtYmFyLmpzJztcbmltcG9ydCBmd01lZGlhIGZyb20gJy4vbGliL2Z3LW1lZGlhLmpzJztcbmltcG9ydCBob3dJdFdvcmtzIGZyb20gJy4vbGliL2hvdy1pdC13b3Jrcy5qcyc7XG5pbXBvcnQgdmlkZW9QbGF5ZXIgZnJvbSAnLi9saWIvdmlkZW8tcGxheWVyLmpzJztcbmltcG9ydCB2aWRlb1BsYXllckxpbmsgZnJvbSAnLi9saWIvdmlkZW8tcGxheWVyLWxpbmsuanMnO1xuXG5pbXBvcnQgc3BlY2lmaWNhdGlvbnMgZnJvbSAnLi9saWIvc3BlY2lmaWNhdGlvbnMuanMnO1xuaW1wb3J0IGhlcm9Qcm9kdWN0cyBmcm9tICcuL2xpYi9oZXJvLXByb2R1Y3RzLmpzJztcbmltcG9ydCBtYXJrZXRBcHBzIGZyb20gJy4vbGliL21hcmtldC1hcHBsaWNhdGlvbnMuanMnO1xuaW1wb3J0IG1lZ2FtZW51IGZyb20gJy4vbGliL21lZ2FtZW51LmpzJztcblxuXG5cblxuXG5cblxuXG5pbXBvcnQgZm9vdGVyVW5pdFRvZ2dsZXIgZnJvbSAnLi9saWIvZm9vdGVyLXVuaXRzLmpzJztcbmltcG9ydCBkb2N1bWVudGF0aW9uIGZyb20gJy4vbGliL2RvY3VtZW50YXRpb24uanMnO1xuaW1wb3J0IHNvZnR3YXJlIGZyb20gJy4vbGliL3NvZnR3YXJlLWZpcm13YXJlLmpzJztcbmltcG9ydCBwcm9kdWN0Q2F0YWxvZyBmcm9tICcuL2xpYi9wcm9kdWN0LWNhdGFsb2cuanMnO1xuaW1wb3J0IGludGVybmFsU2VhcmNoIGZyb20gJy4vbGliL2ludGVybmFsLXNlYXJjaC5qcyc7XG5pbXBvcnQge3BhcmRvdEZvcm19IGZyb20gJy4vbGliL3BhcmRvdC1mb3JtLmpzJztcbmltcG9ydCBib29rbWFya3MgZnJvbSAnLi9saWIvYm9va21hcmtzLmpzJztcbmltcG9ydCB7IGluc3RhbmNlLCB0cmlnZ2VyfSBmcm9tICcuL2xpYi9tb2RhbC10cmlnZ2VyLmpzJztcblxuaW1wb3J0IGRvY3VtZW50YXRpb25Db250ZXh0dWFsIGZyb20gJy4vbGliL2RvY3VtZW50YXRpb24tY29udGV4dHVhbC5qcyc7XG5pbXBvcnQgc29mdHdhcmVDYXJkIGZyb20gJy4vbGliL3NvZnR3YXJlLWNhcmQuanMnOyAvL2ZvciBzb2Z0d2FyZS9maXJtd2FyZSBubyBmaWx0ZXJpbmcgdmVyc2lvblxuaW1wb3J0IHF1aWNrTGlua3MgZnJvbSAnLi9saWIvcXVpY2stbGlua3MuanMnO1xuaW1wb3J0IGhvbWVIZXJvIGZyb20gJy4vbGliL2hvbWUtaGVyby5qcyc7XG5pbXBvcnQgc2VhcmNoUmVzdWx0cyBmcm9tIFwiLi9saWIvc2VhcmNoLXJlc3VsdHNcIjtcbmltcG9ydCB0ZXN0aW1vbmlhbCBmcm9tIFwiLi9saWIvdGVzdGltb25pYWxcIjtcbmltcG9ydCBwYXRlbnRzIGZyb20gXCIuL2xpYi9wYXRlbnRzXCI7XG5pbXBvcnQgbGVnYWxDb21wbGlhbmNlIGZyb20gXCIuL2xpYi9sZWdhbC1jb21wbGlhbmNlXCI7XG5pbXBvcnQgdGltZWxpbmUgZnJvbSBcIi4vbGliL3RpbWVsaW5lXCI7XG5pbXBvcnQgbGl0ZXJhdHVyZU9yZGVyIGZyb20gXCIuL2xpYi9saXQtb3JkZXJcIjtcbmltcG9ydCBnZW5lcmljTW9kYWwgZnJvbSBcIi4vbGliL2dlbmVyaWMtbW9kYWxcIjtcbmltcG9ydCBzbGlkZXNob3cgZnJvbSAnLi9saWIvc2xpZGVzaG93LmpzJztcblxuaW1wb3J0IHN0b3JlIGZyb20gJy4vbGliL3N0b3JlJztcblxuLy8gaW1wb3J0aW5nIGxpYnJhcmllcyBmb3IgbW9kdWxlc1xuaW1wb3J0IENvbXBvbmVudE1vZHVsZSBmcm9tICcuL2xpYi9jb21wb25lbnQtbW9kdWxlJztcbmltcG9ydCAnLi9saWIvbW9kdWxlcyc7XG5cbmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCAoKSA9PiB7XG4gICAgZ2VuZXJpY01vZGFsKCk7XG4gICAgZHJhd2VyKCk7XG4gICAgcHJvZHVjdHNBY2Nlc3NvcmllcygpO1xuICAgIGN0YUJhclRvcCgpO1xuICAgIGN0YUJhckJvdHRvbSgpO1xuICAgIHN1Yk5hdigpO1xuICAgIHRvcEJhcigpO1xuICAgIGZ3TWVkaWEoKTtcbiAgICBob3dJdFdvcmtzKCk7XG4gICAgdmlkZW9QbGF5ZXIoKTtcbiAgICB2aWRlb1BsYXllckxpbmsoKTtcbiAgICBcbiAgICBzcGVjaWZpY2F0aW9ucygpO1xuICAgIGhlcm9Qcm9kdWN0cygpO1xuICAgIG1hcmtldEFwcHMoKTtcbiAgICBtZWdhbWVudSgpO1xuICAgIGZvb3RlclVuaXRUb2dnbGVyKCk7XG4gICAgZG9jdW1lbnRhdGlvbigpO1xuICAgIHNvZnR3YXJlKCk7XG4gICAgcHJvZHVjdENhdGFsb2coKTtcbiAgICBpbnRlcm5hbFNlYXJjaCgpO1xuICAgIHBhcmRvdEZvcm0oKTtcbiAgICBib29rbWFya3MoKTtcbiAgICAvLyBJbml0aWFsaXphdGlvbiBtb2R1bGVzXG4gICAgQ29tcG9uZW50TW9kdWxlLkluaXQoKTtcbiAgICBpbnN0YW5jZTtcbiAgICB0cmlnZ2VyKCk7XG4gICAgZG9jdW1lbnRhdGlvbkNvbnRleHR1YWwoKTtcbiAgICBzb2Z0d2FyZUNhcmQoKTtcbiAgICBxdWlja0xpbmtzKCk7XG4gICAgaG9tZUhlcm8oKTtcbiAgICBzZWFyY2hSZXN1bHRzKCk7XG4gICAgdGVzdGltb25pYWwoKTtcbiAgICBwYXRlbnRzKCk7XG4gICAgbGVnYWxDb21wbGlhbmNlKCk7XG4gICAgdGltZWxpbmUoKTtcbiAgICBsaXRlcmF0dXJlT3JkZXIoKTtcbiAgICBzbGlkZXNob3coKTtcblxuICAgIC8vIGFsd2F5cyBzY3JvbGwgbG9jayBib2R5IHdoZW4gbW9kYWwgb3IgbW9iaWxlIG1lZ2FtZW51IGlzIG9wZW5cbiAgICBsZXQgb2JzZXJ2ZXJUYXJnZXQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdib2R5Jyk7XG4gICAgbGV0IHNjcm9sbExvY2sgPSAoKSA9PiB7XG4gICAgICAgIGlmIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuYm1pLW1vZGFsJykgfHwgZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm1lZ2FtZW51X19tb2JpbGUtc3VibWVudS5hY3RpdmUnKSkge1xuICAgICAgICAgICAgb2JzZXJ2ZXJUYXJnZXQuY2xhc3NMaXN0LmFkZCgnc2Nyb2xsLWxvY2snKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIG9ic2VydmVyVGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoJ3Njcm9sbC1sb2NrJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgIHN1YnRyZWU6IHRydWUsXG4gICAgICAgIGNoaWxkTGlzdDogdHJ1ZVxuICAgIH1cbiAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihzY3JvbGxMb2NrKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKG9ic2VydmVyVGFyZ2V0LCBvcHRpb25zKTtcblxuICAgIC8vIGluaXQgdW5pdHMgdG8gdXMgb3IgbWV0cmljXG4gICAgc3RvcmUuZGlzcGF0Y2goJ2luaXRVbml0cycpO1xuICAgIC8vIGluaXQgZ2V0dGluZyBHQSBjbGllbnQgSURcbiAgICBzdG9yZS5kaXNwYXRjaCgnaW5pdEdBSUQnKTtcbn0pO1xuXG5zdG9yZS5kaXNwYXRjaCgnaW5pdENvb2tpZXMnKTsgLy9pbml0IGNvb2tpZXMgZm9yIGJvb2ttYXJrIGZlYXR1cmVcbnN0b3JlLmRpc3BhdGNoKCdjaGVja01vYmlsZScpOyBcbiIsImlmICghRWxlbWVudC5wcm90b3R5cGUubWF0Y2hlcykge1xuXHRFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzID0gRWxlbWVudC5wcm90b3R5cGUubXNNYXRjaGVzU2VsZWN0b3IgfHxcblx0XHRFbGVtZW50LnByb3RvdHlwZS53ZWJraXRNYXRjaGVzU2VsZWN0b3I7XG59XG5cbmlmICghRWxlbWVudC5wcm90b3R5cGUuY2xvc2VzdCkge1xuXHRFbGVtZW50LnByb3RvdHlwZS5jbG9zZXN0ID0gZnVuY3Rpb24gY2xvc2VzdChzKSB7XG5cdFx0Y29uc3QgZWwgPSB0aGlzO1xuXHRcdGxldCBhbmNlc3RvciA9IHRoaXM7XG5cdFx0aWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY29udGFpbnMoZWwpKSByZXR1cm4gbnVsbDtcblx0XHRkbyB7XG5cdFx0XHRpZiAoYW5jZXN0b3IubWF0Y2hlcyhzKSkgcmV0dXJuIGFuY2VzdG9yO1xuXHRcdFx0YW5jZXN0b3IgPSBhbmNlc3Rvci5wYXJlbnRFbGVtZW50O1xuXHRcdH0gd2hpbGUgKGFuY2VzdG9yICE9PSBudWxsKTtcblx0XHRyZXR1cm4gbnVsbDtcblx0fTtcbn1cbiIsIi8vIE1vZGVybml6ciBzdHlsZSB0ZXN0XG5pZiAoISh3aW5kb3cud2Via2l0TWF0Y2hNZWRpYSB8fCB3aW5kb3cubW96TWF0Y2hNZWRpYSB8fCB3aW5kb3cub01hdGNoTWVkaWEgfHwgd2luZG93Lm1zTWF0Y2hNZWRpYSB8fCB3aW5kb3cubWF0Y2hNZWRpYSkpIHtcblx0dmFyIHJvb3QgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSggJ2h0bWwnIClbMF07XG5cdHJvb3QuY2xhc3NOYW1lICs9ICcgbm8tbWF0Y2htZWRpYSc7XG59XG5cbi8qISBtYXRjaE1lZGlhKCkgcG9seWZpbGwgLSBUZXN0IGEgQ1NTIG1lZGlhIHR5cGUvcXVlcnkgaW4gSlMuIEF1dGhvcnMgJiBjb3B5cmlnaHQgKGMpIDIwMTI6IFNjb3R0IEplaGwsIFBhdWwgSXJpc2gsIE5pY2hvbGFzIFpha2FzLCBEYXZpZCBLbmlnaHQuIER1YWwgTUlUL0JTRCBsaWNlbnNlICovXG53aW5kb3cubWF0Y2hNZWRpYSB8fCAod2luZG93Lm1hdGNoTWVkaWEgPSBmdW5jdGlvbigpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIC8vIEZvciBicm93c2VycyB0aGF0IHN1cHBvcnQgbWF0Y2hNZWRpdW0gYXBpIHN1Y2ggYXMgSUUgOSBhbmQgd2Via2l0XG4gICAgdmFyIHN0eWxlTWVkaWEgPSAod2luZG93LnN0eWxlTWVkaWEgfHwgd2luZG93Lm1lZGlhKTtcblxuICAgIC8vIEZvciB0aG9zZSB0aGF0IGRvbid0IHN1cHBvcnQgbWF0Y2hNZWRpdW1cbiAgICBpZiAoIXN0eWxlTWVkaWEpIHtcbiAgICAgICAgdmFyIHN0eWxlICAgICAgID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSxcbiAgICAgICAgICAgIHNjcmlwdCAgICAgID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpWzBdLFxuICAgICAgICAgICAgaW5mbyAgICAgICAgPSBudWxsO1xuXG4gICAgICAgIHN0eWxlLnR5cGUgID0gJ3RleHQvY3NzJztcbiAgICAgICAgc3R5bGUuaWQgICAgPSAnbWF0Y2htZWRpYWpzLXRlc3QnO1xuXG4gICAgICAgIHNjcmlwdC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzdHlsZSwgc2NyaXB0KTtcblxuICAgICAgICAvLyAnc3R5bGUuY3VycmVudFN0eWxlJyBpcyB1c2VkIGJ5IElFIDw9IDggYW5kICd3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZScgZm9yIGFsbCBvdGhlciBicm93c2Vyc1xuICAgICAgICBpbmZvID0gKCdnZXRDb21wdXRlZFN0eWxlJyBpbiB3aW5kb3cpICYmIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHN0eWxlLCBudWxsKSB8fCBzdHlsZS5jdXJyZW50U3R5bGU7XG5cbiAgICAgICAgc3R5bGVNZWRpYSA9IHtcbiAgICAgICAgICAgIG1hdGNoTWVkaXVtOiBmdW5jdGlvbihtZWRpYSkge1xuICAgICAgICAgICAgICAgIHZhciB0ZXh0ID0gJ0BtZWRpYSAnICsgbWVkaWEgKyAneyAjbWF0Y2htZWRpYWpzLXRlc3QgeyB3aWR0aDogMXB4OyB9IH0nO1xuXG4gICAgICAgICAgICAgICAgLy8gJ3N0eWxlLnN0eWxlU2hlZXQnIGlzIHVzZWQgYnkgSUUgPD0gOCBhbmQgJ3N0eWxlLnRleHRDb250ZW50JyBmb3IgYWxsIG90aGVyIGJyb3dzZXJzXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnN0eWxlU2hlZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUuc3R5bGVTaGVldC5jc3NUZXh0ID0gdGV4dDtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVGVzdCBpZiBtZWRpYSBxdWVyeSBpcyB0cnVlIG9yIGZhbHNlXG4gICAgICAgICAgICAgICAgcmV0dXJuIGluZm8ud2lkdGggPT09ICcxcHgnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHJldHVybiBmdW5jdGlvbihtZWRpYSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWF0Y2hlczogc3R5bGVNZWRpYS5tYXRjaE1lZGl1bShtZWRpYSB8fCAnYWxsJyksXG4gICAgICAgICAgICBtZWRpYTogbWVkaWEgfHwgJ2FsbCdcbiAgICAgICAgfTtcbiAgICB9O1xufSgpKTtcblxuLyohIG1hdGNoTWVkaWEoKSBwb2x5ZmlsbCBhZGRFdmVudExpc3RlbmVyL3JlbW92ZUV2ZW50TGlzdGVuZXIgZXh0ZW5zaW9uLiBBdXRob3IgJiBjb3B5cmlnaHQgKGMpIDIwMTI6IFNjb3R0IEplaGwuIER1YWwgTUlUL0JTRCBsaWNlbnNlICovXG4oZnVuY3Rpb24oKXtcbiAgICAvLyBCYWlsIG91dCBmb3IgYnJvd3NlcnMgdGhhdCBoYXZlIGFkZEV2ZW50TGlzdGVuZXIgc3VwcG9ydFxuICAgIGlmICh3aW5kb3cubWF0Y2hNZWRpYSAmJiB3aW5kb3cubWF0Y2hNZWRpYSgnYWxsJykuYWRkRXZlbnRMaXN0ZW5lcikge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIGxvY2FsTWF0Y2hNZWRpYSA9IHdpbmRvdy5tYXRjaE1lZGlhLFxuICAgICAgICBoYXNNZWRpYVF1ZXJpZXMgPSBsb2NhbE1hdGNoTWVkaWEoJ29ubHkgYWxsJykubWF0Y2hlcyxcbiAgICAgICAgaXNMaXN0ZW5pbmcgICAgID0gZmFsc2UsXG4gICAgICAgIHRpbWVvdXRJRCAgICAgICA9IDAsICAgIC8vIHNldFRpbWVvdXQgZm9yIGRlYm91bmNpbmcgJ2hhbmRsZUNoYW5nZSdcbiAgICAgICAgcXVlcmllcyAgICAgICAgID0gW10sICAgLy8gQ29udGFpbnMgZWFjaCAnbXFsJyBhbmQgYXNzb2NpYXRlZCAnbGlzdGVuZXJzJyBpZiAnYWRkRXZlbnRMaXN0ZW5lcicgaXMgdXNlZFxuICAgICAgICBoYW5kbGVDaGFuZ2UgICAgPSBmdW5jdGlvbihldnQpIHtcbiAgICAgICAgICAgIC8vIERlYm91bmNlXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dElEKTtcblxuICAgICAgICAgICAgdGltZW91dElEID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgaWwgPSBxdWVyaWVzLmxlbmd0aDsgaSA8IGlsOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG1xbCAgICAgICAgID0gcXVlcmllc1tpXS5tcWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgICA9IHF1ZXJpZXNbaV0ubGlzdGVuZXJzIHx8IFtdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyAgICAgPSBsb2NhbE1hdGNoTWVkaWEobXFsLm1lZGlhKS5tYXRjaGVzO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBtcWwubWF0Y2hlcyB2YWx1ZSBhbmQgY2FsbCBsaXN0ZW5lcnNcbiAgICAgICAgICAgICAgICAgICAgLy8gRmlyZSBsaXN0ZW5lcnMgb25seSBpZiB0cmFuc2l0aW9uaW5nIHRvIG9yIGZyb20gbWF0Y2hlZCBzdGF0ZVxuICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAhPT0gbXFsLm1hdGNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1xbC5tYXRjaGVzID0gbWF0Y2hlcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDAsIGpsID0gbGlzdGVuZXJzLmxlbmd0aDsgaiA8IGpsOyBqKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnNbal0uY2FsbCh3aW5kb3csIG1xbCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCAzMCk7XG4gICAgICAgIH07XG5cbiAgICB3aW5kb3cubWF0Y2hNZWRpYSA9IGZ1bmN0aW9uKG1lZGlhKSB7XG4gICAgICAgIHZhciBtcWwgICAgICAgICA9IGxvY2FsTWF0Y2hNZWRpYShtZWRpYSksXG4gICAgICAgICAgICBsaXN0ZW5lcnMgICA9IFtdLFxuICAgICAgICAgICAgaW5kZXggICAgICAgPSAwO1xuXG4gICAgICAgIG1xbC5hZGRFdmVudExpc3RlbmVyID0gZnVuY3Rpb24obGlzdGVuZXIpIHtcbiAgICAgICAgICAgIC8vIENoYW5nZXMgd291bGQgbm90IG9jY3VyIHRvIGNzcyBtZWRpYSB0eXBlIHNvIHJldHVybiBub3cgKEFmZmVjdHMgSUUgPD0gOClcbiAgICAgICAgICAgIGlmICghaGFzTWVkaWFRdWVyaWVzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZXQgdXAgJ3Jlc2l6ZScgbGlzdGVuZXIgZm9yIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBDU1MzIG1lZGlhIHF1ZXJpZXMgKE5vdCBmb3IgSUUgPD0gOClcbiAgICAgICAgICAgIC8vIFRoZXJlIHNob3VsZCBvbmx5IGV2ZXIgYmUgMSByZXNpemUgbGlzdGVuZXIgcnVubmluZyBmb3IgcGVyZm9ybWFuY2VcbiAgICAgICAgICAgIGlmICghaXNMaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgICAgICBpc0xpc3RlbmluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGhhbmRsZUNoYW5nZSwgdHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFB1c2ggb2JqZWN0IG9ubHkgaWYgaXQgaGFzIG5vdCBiZWVuIHB1c2hlZCBhbHJlYWR5XG4gICAgICAgICAgICBpZiAoaW5kZXggPT09IDApIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IHF1ZXJpZXMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG1xbCAgICAgICAgIDogbXFsLFxuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lcnMgICA6IGxpc3RlbmVyc1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgIH07XG5cbiAgICAgICAgbXFsLnJlbW92ZUV2ZW50TGlzdGVuZXIgPSBmdW5jdGlvbihsaXN0ZW5lcikge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGlsID0gbGlzdGVuZXJzLmxlbmd0aDsgaSA8IGlsOyBpKyspe1xuICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcnNbaV0gPT09IGxpc3RlbmVyKXtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG1xbDtcbiAgICB9O1xufSgpKTtcbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgXCJtZXRlclNlbGVjdG9yXCI6IHtcbiAgICBcImFwaVF1ZXJ5XCI6IFtcbiAgICAgIFwiZmxvd1R5cGVcIlxuICAgIF0sXG4gICAgXCJxdWVzdGlvblwiOiBcIldoYXQgYXJlIHlvdSBtZWFzdXJpbmc/XCIsXG4gICAgXCJ0b3RhbFN0ZXBzXCI6IDksXG4gICAgXCJmaWx0ZXJOYW1lXCI6IFwiRmxvdyB0eXBlXCIsXG4gICAgXCJzdGVwSWRcIjogXCIwMS4wXCIsXG4gICAgXCJidXR0b25cIjogW1xuICAgICAge1xuICAgICAgICBcImxhYmVsXCI6IFwiV2F0ZXJcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIldhdGVyXCIsXG4gICAgICAgIFwiaWNvblwiOiBcIndhdGVyXCIsXG4gICAgICAgIFwidG90YWxQYWdlc1wiOiAxMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJsYWJlbFwiOiBcIk9pbFwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiT2lsXCIsXG4gICAgICAgIFwiaWNvblwiOiBcIm9pbFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImxhYmVsXCI6IFwiU3RlYW1cIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIlN0ZWFtXCIsXG4gICAgICAgIFwiaWNvblwiOiBcInN0ZWFtXCIsXG4gICAgICAgIFwidG90YWxQYWdlc1wiOiAxMFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJsYWJlbFwiOiBcIkFpciAvIEdhc1wiLFxuICAgICAgICBcInZhbHVlXCI6IFwiQWlyIC8gR2FzXCIsXG4gICAgICAgIFwiaWNvblwiOiBcImFpci1nYXNcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJsYWJlbFwiOiBcIk90aGVyIGxpcXVpZFwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiT3RoZXIgbGlxdWlkXCIsXG4gICAgICAgIFwiaWNvblwiOiBcIm90aGVyXCIsXG4gICAgICAgIFwic2VsZWN0ZWRMYWJlbFwiOiBcIkJhc2VkIG9uIHlvdXIgc2VsZWN0aW9uLCB3ZSByZWNvbW1lbmQgeW91IDxhIHRpdGxlPVxcXCJDb25uZWN0IHdpdGggYSBwcm9kdWN0IGV4cGVydFxcXCIgaHJlZj1cXFwiL21ldGVyLXNlbGVjdG9yLyNtZXRlcnNlbGVjdG9yXFxcIj5jb25uZWN0IHdpdGggYSBwcm9kdWN0IGV4cGVydDwvYT7CoGZvciBhc3Npc3RhbmNlIGZpbmRpbmcgdGhlIGFwcHJvcHJpYXRlIG1ldGVyIG9wdGlvbnMgZm9yIHlvdXIgYXBwbGljYXRpb24uXCIsXG4gICAgICAgIFwidG90YWxQYWdlc1wiOiAxMFxuICAgICAgfVxuICAgIF0sXG4gICAgXCJzZWFyY2hSZXN1bHRzXCI6IHtcbiAgICAgIFwiUmVzdWx0c1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvOWZmcnQ2MmZvYS9qcGVnL0FpciUyMGFuZCUyMENvbXByZXNzZWQlMjBHYXMlMjBNZXRlcnMlMjAlMjhsb3ctcmVzJTI5LnBuZz93PTYwMCZoPTYwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yYjczcGZcIixcbiAgICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3loZjBra3Rmc2QvcG5nL0hlZGxhbmQtTG9nb19TaW1wbGlmaWVkX0dyYXklMjAlMjhMb3clMjBSZXMlMjkucG5nP2g9MzYmcG9zaXRpb249YyZjb2xvcj1mZmZmZmYwMCZxdWFsaXR5PTgwJnU9dXptd2h2XCIsXG4gICAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkFpciBhbmQgQ29tcHJlc3NlZCBHYXMgTWV0ZXJcIixcbiAgICAgICAgICBcInVybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvdmFyaWFibGUtYXJlYS1mbG93LW1ldGVycy9haXItYW5kLWNvbXByZXNzZWQtZ2FzLW1ldGVyL1wiLFxuICAgICAgICAgIFwiaWRcIjogXCI5NFwiLFxuICAgICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiPHA+U2l6ZTwvcD5cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMS80Li4uMyBpbi5cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjYuLi44MCBtbVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiPHA+VGVtcGVyYXR1cmUgUmFuZ2U8L3A+XCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIi0yMC4uLjI0MCDCsEZcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIi0yOS4uLjExNiDCsENcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIjxwPkZsb3cgUmFuZ2U8L3A+XCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjAuNS4uLjIyMDAgc2NmbVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMC4yLi4uMTEzMCBsL3NlY1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiPHA+UHJlc3N1cmUgUmFuZ2U8L3A+XCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIlVwIHRvIDE1MDAgUFNJXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJVcCB0byAxMDMgYmFyXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibWFya2V0c1wiOiBbXG4gICAgICAgICAgICBcIkF1dG9tb3RpdmUgRmx1aWQgRGlzcGVuc2luZ1wiLFxuICAgICAgICAgICAgXCJBdmlhdGlvbiAmIEFlcm9zcGFjZVwiLFxuICAgICAgICAgICAgXCJNdW5pY2lwYWwgV2F0ZXIgVHJlYXRtZW50ICYgRGlzdHJpYnV0aW9uXCIsXG4gICAgICAgICAgICBcIk9pbCAmIEdhc1wiLFxuICAgICAgICAgICAgXCJQcm9jZXNzICYgR2VuZXJhbCBJbmR1c3RyeVwiLFxuICAgICAgICAgICAgXCJSZWZpbmluZywgQ2hlbWljYWwgJiBQZXRyb2NoZW1pY2FsXCIsXG4gICAgICAgICAgICBcIlRlc3QgRXF1aXBtZW50ICYgU2VydmljZXNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJNZXRlcnNcIixcbiAgICAgICAgICBcInByb2R1Y3RUeXBlXCI6IFwiVmFyaWFibGUgQXJlYSBGbG93IE1ldGVyc1wiLFxuICAgICAgICAgIFwiYnJhbmRcIjogXCJIZWRsYW5kXCIsXG4gICAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgICAgXCJBaXIgLyBHYXNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJndWlkXCI6IFwiY2EzMzExMzYtZmY2ZS00M2MxLWI1MTMtZDIwOWE0NTVlMTM4XCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9seTR1dnM0MmhlL2pwZWcvQWlyLUNhdXN0aWMlMjBhbmQlMjBDb3Jyb3NpdmUlMjBHYXMlMjBNZXRlcnMlMjAlMjhsb3ctcmVzJTI5LnBuZz93PTYwMCZoPTYwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yYjczcGZcIixcbiAgICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3loZjBra3Rmc2QvcG5nL0hlZGxhbmQtTG9nb19TaW1wbGlmaWVkX0dyYXklMjAlMjhMb3clMjBSZXMlMjkucG5nP2g9MzYmcG9zaXRpb249YyZjb2xvcj1mZmZmZmYwMCZxdWFsaXR5PTgwJnU9dXptd2h2XCIsXG4gICAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkNhdXN0aWMgYW5kIENvcnJvc2l2ZSBBaXIvR2FzIE1ldGVyXCIsXG4gICAgICAgICAgXCJ1cmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL3ZhcmlhYmxlLWFyZWEtZmxvdy1tZXRlcnMvY2F1c3RpYy1hbmQtY29ycm9zaXZlLWFpcmdhcy1tZXRlci9cIixcbiAgICAgICAgICBcImlkXCI6IFwiOTZcIixcbiAgICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMS804oCmMSAxLzIgaW4uXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI2Li4uNDAgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIiAtMjAuLi4yNDAgwrBGXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCItMjnigKYxMTYgwrBDXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJGbG93IFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjIuLi44MDAgc2NmbVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMeKApjM1MCBscG1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkFjY3VyYWN5XCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIsKxMiUgKDEvNCBpbi4gaXMgKzclKVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiwrEyJSAoMS80IGluLiBpcyArNyUpXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibWFya2V0c1wiOiBbXG4gICAgICAgICAgICBcIkF1dG9tb3RpdmUgRmx1aWQgRGlzcGVuc2luZ1wiLFxuICAgICAgICAgICAgXCJBdmlhdGlvbiAmIEFlcm9zcGFjZVwiLFxuICAgICAgICAgICAgXCJNdW5pY2lwYWwgV2F0ZXIgVHJlYXRtZW50ICYgRGlzdHJpYnV0aW9uXCIsXG4gICAgICAgICAgICBcIk9pbCAmIEdhc1wiLFxuICAgICAgICAgICAgXCJQcm9jZXNzICYgR2VuZXJhbCBJbmR1c3RyeVwiLFxuICAgICAgICAgICAgXCJSZWZpbmluZywgQ2hlbWljYWwgJiBQZXRyb2NoZW1pY2FsXCIsXG4gICAgICAgICAgICBcIlRlc3QgRXF1aXBtZW50ICYgU2VydmljZXNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJNZXRlcnNcIixcbiAgICAgICAgICBcInByb2R1Y3RUeXBlXCI6IFwiVmFyaWFibGUgQXJlYSBGbG93IE1ldGVyc1wiLFxuICAgICAgICAgIFwiYnJhbmRcIjogXCJIZWRsYW5kXCIsXG4gICAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgICAgXCJBaXIgLyBHYXNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJndWlkXCI6IFwiMzQ5MDc0ODYtMjc4My00MzAxLWJiZTgtZDI1NGUwMmUxOTdiXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC81bHJhd3V5cW5kL2pwZWcvQ09JTi1GRiUyMCUyOGxvdyUyMHJlcyUyOS5wbmc/dz00MDAmaD00MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96emhlbGp1c28wL3BuZy9QcmVzby1Mb2dvX1NpbXBsaWZpZWRfR3JheSUyMCUyOExvdyUyMFJlcyUyOS5wbmc/aD0zNiZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZjAwJnF1YWxpdHk9ODAmdT11em13aHZcIixcbiAgICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiQ09JTiBGRlwiLFxuICAgICAgICAgIFwidXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy9kaWZmZXJlbnRpYWwtcHJlc3N1cmUtZmxvdy1tZXRlcnMvY29pbi13ZWRnZS1mbGFuZ2UtcHJvY2Vzcy1ieS1mbGFuZ2UtaW5zdHJ1bWVudGF0aW9uLW1vZGVsLWZmLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgICAgXCJpZFwiOiBcIjEzOVwiLFxuICAgICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIxLzIuLi40OCBpbi5cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjEyLi4uMTIxOSBtbVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVtcGVyYXR1cmUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiVXAgdG8gMTUwMCDCsEZcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDgxNSDCsENcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByZXNzdXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIkRlcGVuZGVudCBvbiBmbGFuZ2UgcmF0aW5nXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJEZXBlbmRlbnQgb24gZmxhbmdlIHJhdGluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiQWNjdXJhY3lcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiKHVuY2FsaWJyYXRlZCkgwrEzJSAoY2FsaWJyYXRlZCkgwrEwLjUlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIodW5jYWxpYnJhdGVkKSDCsTMlIChjYWxpYnJhdGVkKSDCsTAuNSVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJtYXJrZXRzXCI6IFtcbiAgICAgICAgICAgIFwiT2lsICYgR2FzXCIsXG4gICAgICAgICAgICBcIlByb2Nlc3MgJiBHZW5lcmFsIEluZHVzdHJ5XCIsXG4gICAgICAgICAgICBcIlJlZmluaW5nLCBDaGVtaWNhbCAmIFBldHJvY2hlbWljYWxcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJNZXRlcnNcIixcbiAgICAgICAgICBcInByb2R1Y3RUeXBlXCI6IFwiRGlmZmVyZW50aWFsIFByZXNzdXJlIEZsb3cgTWV0ZXJzXCIsXG4gICAgICAgICAgXCJicmFuZFwiOiBcIlByZXNvXCIsXG4gICAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgICAgXCJPaWxcIixcbiAgICAgICAgICAgIFwiU3RlYW1cIixcbiAgICAgICAgICAgIFwiQWlyIC8gR2FzXCIsXG4gICAgICAgICAgICBcIldhdGVyXCIsXG4gICAgICAgICAgICBcIk90aGVyIGxpcXVpZFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcImd1aWRcIjogXCI1Nzg2OTA4Ny04Yzg3LTQ2ZTQtYjk2Mi1jMGE0MzI0NzYzMmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3M4aXltYm5xYzMvanBlZy9DT0lOLU5CLSUyOHdpdGgtd2VsZCUyOSUyMCUyOGxvdyUyMHJlcyUyOS5wbmc/dz00MDAmaD00MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96emhlbGp1c28wL3BuZy9QcmVzby1Mb2dvX1NpbXBsaWZpZWRfR3JheSUyMCUyOExvdyUyMFJlcyUyOS5wbmc/aD0zNiZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZjAwJnF1YWxpdHk9ODAmdT11em13aHZcIixcbiAgICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiQ09JTiBOQlwiLFxuICAgICAgICAgIFwidXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy9kaWZmZXJlbnRpYWwtcHJlc3N1cmUtZmxvdy1tZXRlcnMvY29pbi1idXR0LXdlbGQtd2VkZ2UtbW9kZWwtbmItZmxvdy1tZXRlci9cIixcbiAgICAgICAgICBcImlkXCI6IFwiMTM3XCIsXG4gICAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJTaXplXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjEvMi4uLjQgaW4uXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIxMi4uLjEwMSBtbVwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVtcGVyYXR1cmUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiVXAgdG8gODAwIMKwRlwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiVXAgdG8gNDI2IMKwQ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJlc3N1cmUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiRGVwZW5kZW50IG9uIGZsYW5nZSByYXRpbmdcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIkRlcGVuZGVudCBvbiBmbGFuZ2UgcmF0aW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJBY2N1cmFjeVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIodW5jYWxpYnJhdGVkKSDCsTMlIChjYWxpYnJhdGVkKSDCsTAuNSVcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIih1bmNhbGlicmF0ZWQpIMKxMyUgKGNhbGlicmF0ZWQpIMKxMC41JVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm1hcmtldHNcIjogW1xuICAgICAgICAgICAgXCJPaWwgJiBHYXNcIixcbiAgICAgICAgICAgIFwiUHJvY2VzcyAmIEdlbmVyYWwgSW5kdXN0cnlcIixcbiAgICAgICAgICAgIFwiUmVmaW5pbmcsIENoZW1pY2FsICYgUGV0cm9jaGVtaWNhbFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcInByb2R1Y3RDYXRlZ29yeVwiOiBcIk1ldGVyc1wiLFxuICAgICAgICAgIFwicHJvZHVjdFR5cGVcIjogXCJEaWZmZXJlbnRpYWwgUHJlc3N1cmUgRmxvdyBNZXRlcnNcIixcbiAgICAgICAgICBcImJyYW5kXCI6IFwiUHJlc29cIixcbiAgICAgICAgICBcImZsb3dUeXBlc1wiOiBbXG4gICAgICAgICAgICBcIk9pbFwiLFxuICAgICAgICAgICAgXCJTdGVhbVwiLFxuICAgICAgICAgICAgXCJBaXIgLyBHYXNcIixcbiAgICAgICAgICAgIFwiV2F0ZXJcIixcbiAgICAgICAgICAgIFwiT3RoZXIgbGlxdWlkXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwiZ3VpZFwiOiBcIjMxZmRmZTZiLWQwNDAtNDAxYS1hZDBiLTRlNjRlMDAxNjAxNlwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvbTh2ZXJwNXRuaS9qcGVnL0NPSU4tTkYlMjAlMjhsb3clMjByZXMlMjkucG5nP3c9NDAwJmg9NDAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJmMXNoa1wiLFxuICAgICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvenpoZWxqdXNvMC9wbmcvUHJlc28tTG9nb19TaW1wbGlmaWVkX0dyYXklMjAlMjhMb3clMjBSZXMlMjkucG5nP2g9MzYmcG9zaXRpb249YyZjb2xvcj1mZmZmZmYwMCZxdWFsaXR5PTgwJnU9dXptd2h2XCIsXG4gICAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkNPSU4gTkZcIixcbiAgICAgICAgICBcInVybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvZGlmZmVyZW50aWFsLXByZXNzdXJlLWZsb3ctbWV0ZXJzL2NvaW4tZmxhbmdlZC13aXRoLW5wdC1wcmVzc3VyZS10YXBzLW1vZGVsLW5mLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgICAgXCJpZFwiOiBcIjEzOFwiLFxuICAgICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIxLzIuLi40OCBpbi5cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjEyLi4uMSwyMTkgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkFjY3VyYWN5XCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIih1bmNhbGlicmF0ZWQpIMKxMyUgKGNhbGlicmF0ZWQpIMKxMC41JVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiKHVuY2FsaWJyYXRlZCkgwrEzJSAoY2FsaWJyYXRlZCkgwrEwLjUlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibWFya2V0c1wiOiBbXG4gICAgICAgICAgICBcIlByb2Nlc3MgJiBHZW5lcmFsIEluZHVzdHJ5XCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwicHJvZHVjdENhdGVnb3J5XCI6IFwiTWV0ZXJzXCIsXG4gICAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBcIkRpZmZlcmVudGlhbCBQcmVzc3VyZSBGbG93IE1ldGVyc1wiLFxuICAgICAgICAgIFwiYnJhbmRcIjogXCJQcmVzb1wiLFxuICAgICAgICAgIFwiZmxvd1R5cGVzXCI6IFtcbiAgICAgICAgICAgIFwiT2lsXCIsXG4gICAgICAgICAgICBcIkFpciAvIEdhc1wiLFxuICAgICAgICAgICAgXCJXYXRlclwiLFxuICAgICAgICAgICAgXCJPdGhlciBsaXF1aWRcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJndWlkXCI6IFwiZGNiN2JkNjUtYTFmYS00MzA5LWJiNGQtNjk3Mjc0YTE2MjNhXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC8zbml3YXo3dnByL2pwZWcvTk4lMjBCYWNrLXRvLUJhY2stV2VkZ2UtTWV0ZXIlMjAlMjhsb3clMjByZXMlMjkucG5nP3c9NDAwJmg9NDAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJmMXNoa1wiLFxuICAgICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvenpoZWxqdXNvMC9wbmcvUHJlc28tTG9nb19TaW1wbGlmaWVkX0dyYXklMjAlMjhMb3clMjBSZXMlMjkucG5nP2g9MzYmcG9zaXRpb249YyZjb2xvcj1mZmZmZmYwMCZxdWFsaXR5PTgwJnU9dXptd2h2XCIsXG4gICAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkNPSU4gTk5cIixcbiAgICAgICAgICBcInVybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvZGlmZmVyZW50aWFsLXByZXNzdXJlLWZsb3ctbWV0ZXJzL2NvaW4tYmFjay10by1iYWNrLXdlZGdlLW1vZGVsLW5uLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgICAgXCJpZFwiOiBcIjEzNlwiLFxuICAgICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIxLzIuLi42IGluLlwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMTIuLi4xNTIgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIlVwIHRvIDgwMCDCsEZcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDQyNiDCsENcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByZXNzdXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIkRlcGVuZGVudCBvbiBmbGFuZ2UgcmF0aW5nXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJEZXBlbmRlbnQgb24gZmxhbmdlIHJhdGluZ1wiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiQWNjdXJhY3lcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiKHVuY2FsaWJyYXRlZCkgwrEzJSAoY2FsaWJyYXRlZCkgwrEwLjUlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIodW5jYWxpYnJhdGVkKSDCsTMlIChjYWxpYnJhdGVkKSDCsTAuNSVcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJtYXJrZXRzXCI6IFtcbiAgICAgICAgICAgIFwiT2lsICYgR2FzXCIsXG4gICAgICAgICAgICBcIlByb2Nlc3MgJiBHZW5lcmFsIEluZHVzdHJ5XCIsXG4gICAgICAgICAgICBcIlJlZmluaW5nLCBDaGVtaWNhbCAmIFBldHJvY2hlbWljYWxcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJNZXRlcnNcIixcbiAgICAgICAgICBcInByb2R1Y3RUeXBlXCI6IFwiRGlmZmVyZW50aWFsIFByZXNzdXJlIEZsb3cgTWV0ZXJzXCIsXG4gICAgICAgICAgXCJicmFuZFwiOiBcIlByZXNvXCIsXG4gICAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgICAgXCJPaWxcIixcbiAgICAgICAgICAgIFwiU3RlYW1cIixcbiAgICAgICAgICAgIFwiQWlyIC8gR2FzXCIsXG4gICAgICAgICAgICBcIldhdGVyXCIsXG4gICAgICAgICAgICBcIk90aGVyIGxpcXVpZFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcImd1aWRcIjogXCIyYWNjMTkzYy1kYWQ3LTQ1ZTItYjJkYS1kNjY3MTVjOTliNmRcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3FpN201dHFjOTQvanBlZy9DT0lOLU5XJTIwJTI4bG93JTIwcmVzJTI5LnBuZz93PTQwMCZoPTQwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yZjFzaGtcIixcbiAgICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3p6aGVsanVzbzAvcG5nL1ByZXNvLUxvZ29fU2ltcGxpZmllZF9HcmF5JTIwJTI4TG93JTIwUmVzJTI5LnBuZz9oPTM2JnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmMDAmcXVhbGl0eT04MCZ1PXV6bXdodlwiLFxuICAgICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJDb2luIE5XXCIsXG4gICAgICAgICAgXCJ1cmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL2RpZmZlcmVudGlhbC1wcmVzc3VyZS1mbG93LW1ldGVycy9jb2luLXdlZGdlLXdhZmVyLW1vZGVsLW53LWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgICAgXCJpZFwiOiBcIjEzNVwiLFxuICAgICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIxLzIuLi40IGluLlwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMTMuLi4xMDEgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIFJhbmdlXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIlVwIHRvIDgwMCDCsEZcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDQyNiDCsENcIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByZXNzdXJlIFJhdGluZ1wiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJEZXBlbmRlbnQgb24gZmxhbmdlIHJhdGluZyBcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIkRlcGVuZGVudCBvbiBmbGFuZ2UgcmF0aW5nXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJBY2N1cmFjeVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIodW5jYWxpYnJhdGVkKSDCsTMlIChjYWxpYnJhdGVkKSDCsTAuNSVcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIih1bmNhbGlicmF0ZWQpIMKxMyUgKGNhbGlicmF0ZWQpIMKxMC41JVwiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm1hcmtldHNcIjogW1xuICAgICAgICAgICAgXCJPaWwgJiBHYXNcIixcbiAgICAgICAgICAgIFwiUHJvY2VzcyAmIEdlbmVyYWwgSW5kdXN0cnlcIixcbiAgICAgICAgICAgIFwiUmVmaW5pbmcsIENoZW1pY2FsICYgUGV0cm9jaGVtaWNhbFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcInByb2R1Y3RDYXRlZ29yeVwiOiBcIk1ldGVyc1wiLFxuICAgICAgICAgIFwicHJvZHVjdFR5cGVcIjogXCJEaWZmZXJlbnRpYWwgUHJlc3N1cmUgRmxvdyBNZXRlcnNcIixcbiAgICAgICAgICBcImJyYW5kXCI6IFwiUHJlc29cIixcbiAgICAgICAgICBcImZsb3dUeXBlc1wiOiBbXG4gICAgICAgICAgICBcIk9pbFwiLFxuICAgICAgICAgICAgXCJTdGVhbVwiLFxuICAgICAgICAgICAgXCJBaXIgLyBHYXNcIixcbiAgICAgICAgICAgIFwiV2F0ZXJcIixcbiAgICAgICAgICAgIFwiT3RoZXIgbGlxdWlkXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwiZ3VpZFwiOiBcImQ3YTcxMjFkLTM5MWEtNGY0Yy04MGY4LWQ2ODJiZjc2NjlkOFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvcHlmYm9nZms0bC9qcGVnLzIwMTlfQ29uZSUyME1ldGVyJTIwJTI4bG93JTIwcmVzJTI5LnBuZz93PTQwMCZoPTQwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yZjFzaGtcIixcbiAgICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3p6aGVsanVzbzAvcG5nL1ByZXNvLUxvZ29fU2ltcGxpZmllZF9HcmF5JTIwJTI4TG93JTIwUmVzJTI5LnBuZz9oPTM2JnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmMDAmcXVhbGl0eT04MCZ1PXV6bXdodlwiLFxuICAgICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJDb25lIERQIE1ldGVyc1wiLFxuICAgICAgICAgIFwidXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy9kaWZmZXJlbnRpYWwtcHJlc3N1cmUtZmxvdy1tZXRlcnMvY29uZS1kaWZmZXJlbnRpYWwtcHJlc3N1cmUtZmxvdy1tZXRlci9cIixcbiAgICAgICAgICBcImlkXCI6IFwiMTQwXCIsXG4gICAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJTaXplXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjEvMi4uLjI0IGluLlwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMTIuLi42MDkgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkFjY3VyYWN5XCIsXG4gICAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIsKxMC41JVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiwrEwLjUlXCJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICBdLFxuICAgICAgICAgIFwibWFya2V0c1wiOiBbXG4gICAgICAgICAgICBcIkF2aWF0aW9uICYgQWVyb3NwYWNlXCIsXG4gICAgICAgICAgICBcIkJ1aWxkaW5nIERlc2lnbiwgSFZBQywgJiBQbHVtYmluZ1wiLFxuICAgICAgICAgICAgXCJNdW5pY2lwYWwgV2F0ZXIgVHJlYXRtZW50ICYgRGlzdHJpYnV0aW9uXCIsXG4gICAgICAgICAgICBcIk9pbCAmIEdhc1wiLFxuICAgICAgICAgICAgXCJQcm9jZXNzICYgR2VuZXJhbCBJbmR1c3RyeVwiLFxuICAgICAgICAgICAgXCJSZWZpbmluZywgQ2hlbWljYWwgJiBQZXRyb2NoZW1pY2FsXCIsXG4gICAgICAgICAgICBcIlRlc3QgRXF1aXBtZW50ICYgU2VydmljZXNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJNZXRlcnNcIixcbiAgICAgICAgICBcInByb2R1Y3RUeXBlXCI6IFwiRGlmZmVyZW50aWFsIFByZXNzdXJlIEZsb3cgTWV0ZXJzXCIsXG4gICAgICAgICAgXCJicmFuZFwiOiBcIlByZXNvXCIsXG4gICAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgICAgXCJPaWxcIixcbiAgICAgICAgICAgIFwiU3RlYW1cIixcbiAgICAgICAgICAgIFwiQWlyIC8gR2FzXCIsXG4gICAgICAgICAgICBcIldhdGVyXCIsXG4gICAgICAgICAgICBcIk90aGVyIGxpcXVpZFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcImd1aWRcIjogXCJkM2JjYjJhOC1kYWIzLTQ1OWQtOGJlNi1iN2M3NDg5ZDYyOThcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3NhYnd2cDJ5c3MvanBlZy9Db3glMjBHYXMlMjBUdXJiaW5lJTIwTWV0ZXJzJTIwJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmI3M3BmXCIsXG4gICAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9pM2MwbW96MTVpL3BuZy9Db3gtTG9nb19TaW1wbGlmaWVkX0dyYXklMjAlMjhMb3clMjBSZXMlMjkucG5nP2g9MzYmcG9zaXRpb249YyZjb2xvcj1mZmZmZmYwMCZxdWFsaXR5PTgwJnU9dXptd2h2XCIsXG4gICAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIkNQRyAtIFByZWNpc2lvbiBNZXRlciBmb3IgR2FzZXNcIixcbiAgICAgICAgICBcInVybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvdHVyYmluZS1mbG93LW1ldGVycy9wcmVjaXNpb24tZ2FzLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgICAgXCJpZFwiOiBcIjE0OFwiLFxuICAgICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZSBSYW5nZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIwLjI1Li4uMiBpbi4gXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI2Li4uNTAgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkZsb3cgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMC40Li4uMjUwIHNjZm1cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjEuODkuLi4xMTggbHBzXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmVzc3VyZSBSYW5nZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJVcCB0byA1MDAwIFBTSVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiVXAgdG8gMzQ0IGJhclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVtcGVyYXR1cmUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiVXAgdG8gNTAwIMKwRlwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiVXAgdG8gMjYwIMKwQ1wiXG4gICAgICAgICAgICB9XG4gICAgICAgICAgXSxcbiAgICAgICAgICBcIm1hcmtldHNcIjogW1xuICAgICAgICAgICAgXCJBdmlhdGlvbiAmIEFlcm9zcGFjZVwiLFxuICAgICAgICAgICAgXCJQcm9jZXNzICYgR2VuZXJhbCBJbmR1c3RyeVwiLFxuICAgICAgICAgICAgXCJSZWZpbmluZywgQ2hlbWljYWwgJiBQZXRyb2NoZW1pY2FsXCIsXG4gICAgICAgICAgICBcIlRlc3QgRXF1aXBtZW50ICYgU2VydmljZXNcIlxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJNZXRlcnNcIixcbiAgICAgICAgICBcInByb2R1Y3RUeXBlXCI6IFwiVHVyYmluZSBGbG93IE1ldGVyc1wiLFxuICAgICAgICAgIFwiYnJhbmRcIjogXCJDb3hcIixcbiAgICAgICAgICBcImZsb3dUeXBlc1wiOiBbXG4gICAgICAgICAgICBcIkFpciAvIEdhc1wiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcImd1aWRcIjogXCJjZTBjM2IxMy1mODcwLTQxMTItYmFiYS1hODZlMWZjMDY0YzBcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3lsdzBsZDlrb2wvanBlZy9Db3glMjBQcmVjaXNpb24lMjBUdXJiaW5lJTIwTWV0ZXJzJTIwJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAma2VlcD1jJmNyb3A9eWVzJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yZjFzaGtcIixcbiAgICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2kzYzBtb3oxNWkvcG5nL0NveC1Mb2dvX1NpbXBsaWZpZWRfR3JheSUyMCUyOExvdyUyMFJlcyUyOS5wbmc/aD0zNiZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZjAwJnF1YWxpdHk9ODAmdT11em13aHZcIixcbiAgICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiQ1BUIC0gUHJlY2lzaW9uIFNpbmdsZSBSb3RvclwiLFxuICAgICAgICAgIFwidXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy90dXJiaW5lLWZsb3ctbWV0ZXJzL3ByZWNpc2lvbi10dXJiaW5lLW1ldGVyL1wiLFxuICAgICAgICAgIFwiaWRcIjogXCIxNDZcIixcbiAgICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMC4yNS4uLjIgaW4uXCIsXG4gICAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI2Li4uNTAgbW1cIlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkZsb3cgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMC4wNS4uLjMxMCBncG1cIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjAuMTkuLi4xMTczIGwvbWluXCJcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmVzc3VyZSBSYW5nZVwiLFxuICAgICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJVcCB0byA2MDAwIFBTSVwiLFxuICAgICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiVXAgdG8gNDA4IGJhclwiXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVtcGVyYXR1cmUgUmFuZ2VcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiVXAgdG8gNDUwIMKwRiBcIixcbiAgICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDIzMiDCsENcIlxuICAgICAgICAgICAgfVxuICAgICAgICAgIF0sXG4gICAgICAgICAgXCJtYXJrZXRzXCI6IFtcbiAgICAgICAgICAgIFwiQXZpYXRpb24gJiBBZXJvc3BhY2VcIixcbiAgICAgICAgICAgIFwiUHJvY2VzcyAmIEdlbmVyYWwgSW5kdXN0cnlcIixcbiAgICAgICAgICAgIFwiUmVmaW5pbmcsIENoZW1pY2FsICYgUGV0cm9jaGVtaWNhbFwiLFxuICAgICAgICAgICAgXCJUZXN0IEVxdWlwbWVudCAmIFNlcnZpY2VzXCJcbiAgICAgICAgICBdLFxuICAgICAgICAgIFwicHJvZHVjdENhdGVnb3J5XCI6IFwiTWV0ZXJzXCIsXG4gICAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBcIlR1cmJpbmUgRmxvdyBNZXRlcnNcIixcbiAgICAgICAgICBcImJyYW5kXCI6IFwiQ294XCIsXG4gICAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgICAgXCJPaWxcIixcbiAgICAgICAgICAgIFwiQWlyIC8gR2FzXCIsXG4gICAgICAgICAgICBcIldhdGVyXCIsXG4gICAgICAgICAgICBcIk90aGVyIGxpcXVpZFwiXG4gICAgICAgICAgXSxcbiAgICAgICAgICBcImd1aWRcIjogXCJmOWVmZDljZi0yYjAwLTQ2NjEtOTdhYy0yYzZlYmEwNGE5OTRcIlxuICAgICAgICB9XG4gICAgICBdLFxuICAgICAgXCJTYXZlZEl0ZW1zQ291bnRcIjogMCxcbiAgICAgIFwiVG90YWxSZXN1bHRzXCI6IDcsXG4gICAgICBcIlZpZXdQcm9kdWN0TGFiZWxcIjogXCJ2aWV3IHByb2R1Y3QgbGFiZWxcIlxuICAgIH1cbiAgfSxcbiAgXCJzZWFyY2hSZXN1bHRzXCI6IHtcbiAgICBcInJlc3VsdHNcIjogW1xuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiTTIwMDAgRWxlY3Ryb21hZ25ldGljIEZsb3cgTWV0ZXJcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPkNvbWJpbmluZyBhIGdlbmVyYWwtcHVycG9zZSBkZXRlY3RvciB3aXRoIGFuIGFtcGxpZmllciwgdGhlIE1vZE1BRzxzdXA+JnJlZzs8L3N1cD4gTTIwMDAgRWxlY3Ryb21hZ25ldGljIGZsb3cgbWV0ZXIgZmVhdHVyZXMgYW4gYWR2YW5jZWQsIHVzZXItZnJpZW5kbHkgZGVzaWduIHRoYXQgaXMgYnVpbHQgZm9yIGZpZWxkIHZlcmlmaWNhdGlvbiB0ZXN0aW5nIHdpdGggdGhlIHVzZSBvZiBhIHNpbXBsZSwgaGFuZGhlbGQgZGV2aWNlLjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvOTd2dW52M3Zzdi9qcGVnL01vZE1BRy1NMjAwMC0lMjhsb3ctcmVzJTI5LnBuZz93PTYwMCZoPTYwMCZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yZjFzaGtcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy9lbGVjdHJvbWFnbmV0aWMtZmxvdy1tZXRlcnMvbTIwMDAtZWxlY3Ryb21hZ25ldGljLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTksXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIlByb2R1Y3RzXCIsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0NhdGFsb2dfUHJvZHVjdFZhcmlhdGlvbi9DYXRhbG9nQ29udGVudF8xNjY2YTE2Mi0yZGZkLTQ0ZDctOWYzNC05YjM5ZjA5MGIyMjNfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIk01MDAwIEVsZWN0cm9tYWduZXRpYyBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgTW9kTUFHPHN1cD4mcmVnOzwvc3VwPiBNNTAwMCBFbGVjdHJvbWFnbmV0aWMgZmxvdyBtZXRlciBpcyBhbiBpZGVhbCBzb2x1dGlvbiBmb3IgcmVtb3RlIHBvdGFibGUgd2F0ZXIgYXBwbGljYXRpb25zLCBwcm92aWRpbmcgY29uc2lzdGVudGx5IHJlbGlhYmxlIGFuZCBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuPC9wPlwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC85eWloamJ1ZXB2L2pwZWcvTW9kTUFHLU01MDAwLSUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PWhka3B4cVwiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL2VsZWN0cm9tYWduZXRpYy1mbG93LW1ldGVycy9tNTAwMC1lbGVjdHJvbWFnbmV0aWMtZmxvdy1tZXRlci9cIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiA1OSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiUHJvZHVjdHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQ2F0YWxvZ19Qcm9kdWN0VmFyaWF0aW9uL0NhdGFsb2dDb250ZW50X2JmYjQyNjA1LWExMWEtNGM5Mi1hNThlLTgxMmQwNTUyN2QyOF9lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiPHA+VTUwMHcgVWx0cmFzb25pYyBGbG93IE1ldGVyPC9wPlwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIER5bmFzb25pY3M8c3VwPiZyZWc7PC9zdXA+IFU1MDB3IFVsdHJhc29uaWMgZmxvdyBtZXRlciB1c2VzIHNvbGlkLXN0YXRlIHRlY2hub2xvZ3kgaW4gYSBjb21wYWN0LCBjb21wbGV0ZWx5IGVuY2Fwc3VsYXRlZCBob3VzaW5nLCBzdWl0YWJsZSBmb3IgcmVzaWRlbnRpYWwgYW5kIGNvbW1lcmNpYWwgYXBwbGljYXRpb25zLjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvbnRoZWhzb2FibC9qcGVnL1U1MDB3JTIwVWx0cmFzb25pYyUyMEZsb3clMjBNZXRlcnMlMjAlMjhsb3clMjByZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PWhka3B4cVwiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL3VsdHJhc29uaWMtZmxvdy1tZXRlcnMvdTUwMHctdWx0cmFzb25pYy1mbG93LW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfMmVhZjZiYTktOTM0MC00ZjAyLWE1YmYtMjdlMGRhYjRiY2YyX2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJEWE4gUG9ydGFibGUgSHlicmlkIFVsdHJhc29uaWMgRmxvdyBNZXRlclwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIER5bmFzb25pY3M8c3VwPiZyZWc7PC9zdXA+IERYTiBQb3J0YWJsZSBIeWJyaWQgVWx0cmFzb25pYyBmbG93IG1ldGVyIGlzIGEgcG93ZXJmdWwgdG9vbCB1c2VkIGZvciB0cm91Ymxlc2hvb3RpbmcgZmxvdyBpc3N1ZXMsIHdoZXRoZXIgeW91IHdhbnQgdG8gcXVpY2tseSB2ZXJpZnkgdGhlIGZsb3cgcmVhZGluZyBvZiBhbm90aGVyIG1ldGVyIG9yIHRvIGRhdGEgbG9nIGZsb3cgc3lzdGVtIHZhbHVlcyBvdmVyIGFuIGV4dGVuZGVkIHBlcmlvZCBvZiB0aW1lLjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvMXV5ZTUwaXpiei9qcGVnL0h5YnJpZCUyMFVsdHJhc29uaWMlMjBGbG93JTIwTWV0ZXJzJTIwLSUyMERYTiUyMCUyOGxvdyUyMHJlcyUyOS5wbmc/dz02MDAmaD02MDAma2VlcD1jJmNyb3A9eWVzJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yZjFzaGtcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy91bHRyYXNvbmljLWZsb3ctbWV0ZXJzL2R4bi1wb3J0YWJsZS1oeWJyaWQtdWx0cmFzb25pYy1mbG93LW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfNTRiMzQ4M2ItMzNjNS00MTA2LWExMmItYTUzMGFmOGY1M2M2X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCIzODAgU2VyaWVzIEJUVSBTeXN0ZW0gTWV0ZXJcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBTZXJpZXMgMzgwIEJUVSBtZXRlciBpcyBhbiBhbGwtaW4tb25lIGVuZXJneSB1c2FnZSBwYWNrYWdlIGZvciBtb25pdG9yaW5nIGh5ZHJvbmljIGhlYXRpbmcgb3IgY29vbGluZyBzeXN0ZW1zLiBUaGlzIG1ldGVyIGFjY3VyYXRlbHkgbWVhc3VyZXMgZmxvdyBhbmQgdGVtcGVyYXR1cmUgZGlmZmVyZW50aWFsIHRvIGNvbXB1dGUgZW5lcmd5IGFuZCBjYW4gaW50ZXJmYWNlIHdpdGggbWFueSBleGlzdGluZyBjb250cm9sIHN5c3RlbXMuPC9wPlwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9zYnRkcGdjeHZkL2pwZWcvMzgwJTIwU2VyaWVzJTIwQnR1JTIwU3lzdGVtJTIwJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvaW1wZWxsZXItZmxvdy1wcm9kdWN0cy8zODAtc2VyaWVzLWJ0dS1zeXN0ZW0tbWV0ZXIvXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTksXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIlByb2R1Y3RzXCIsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0NhdGFsb2dfUHJvZHVjdFZhcmlhdGlvbi9DYXRhbG9nQ29udGVudF85ZDA4YTI5Zi1jNmE3LTQ3ODMtOWE4NS03NzRiMzY5ZGM4OWRfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIjxwPlByZWNpc2lvbiBUdXJiaW5lIE1ldGVyPC9wPlwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIENveDxzdXA+JnJlZzs8L3N1cD4gUHJlY2lzaW9uIFR1cmJpbmUgTWV0ZXIgaGFzIHVucHJlY2VkZW50ZWQgbWVjaGFuaWNhbCBsaW5lYXJpdHksIHJlc3VsdGluZyBpbiBtaW5pbWl6aW5nIG9yIG5lZ2F0aW5nIHRlbXBlcmF0dXJlIGluZHVjZWQgdmlzY29zaXR5IGluZmx1ZW5jZS48L3A+XCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3lsdzBsZDlrb2wvanBlZy9Db3glMjBQcmVjaXNpb24lMjBUdXJiaW5lJTIwTWV0ZXJzJTIwJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAma2VlcD1jJmNyb3A9eWVzJmNvbG9yPWZmZmZmZmZmJnF1YWxpdHk9ODAmdT1yZjFzaGtcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiL3Byb2R1Y3RzL21ldGVycy90dXJiaW5lLWZsb3ctbWV0ZXJzL3ByZWNpc2lvbi10dXJiaW5lLW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfZjllZmQ5Y2YtMmIwMC00NjYxLTk3YWMtMmM2ZWJhMDRhOTk0X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJCMTc1MCBQb3NpdGl2ZSBEaXNwbGFjZW1lbnQgTWV0ZXJcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBCbGFuY2V0dDxzdXA+JnJlZzs8L3N1cD4gQjE3NTAgUG9zaXRpdmUgRGlzcGxhY2VtZW50IG1ldGVyIHByb3ZpZGVzIGhpZ2ggbWVhc3VyZW1lbnQgYWNjdXJhY3kgZm9yIGZsdWlkcyBvdmVyIGEgd2lkZSB2aXNjb3NpdHkgcmFuZ2UuPC9wPlwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9pZHYzZXhtYnJqL2pwZWcvUG9zaXRpdmUlMjBEaXNwbGFjZW1lbnQlMjAtJTIwQjE3NTAlMjAlMjhsb3ctcmVzJTI5LnBuZz93PTYwMCZoPTYwMCZrZWVwPWMmY3JvcD15ZXMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJmMXNoa1wiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL3R1cmJpbmUtZmxvdy1tZXRlcnMvYjE3NTAtcG9zaXRpdmUtZGlzcGxhY2VtZW50LW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfMzk4YjY4YTktNTNhYS00ZjYwLThkYWQtODg5YzQ3NjQ0MzI0X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJCMTUwMCBUdXJiaW5lIEZsb3cgTWV0ZXJcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIjxwPlRoZSBCbGFuY2V0dDxzdXA+JnJlZzs8L3N1cD4gQjE1MDAgVHVyYmluZSBmbG93IG1ldGVyIGhhcyBleGNlcHRpb25hbCBtZWNoYW5pY2FsIGxpbmVhcml0eSwgcmVzdWx0aW5nIGluIG1pbmltaXppbmcgb3IgbmVnYXRpbmcgdGVtcGVyYXR1cmUgaW5kdWNlZCB2aXNjb3NpdHkgaW5mbHVlbmNlLjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvdmV2aXpiMnpwYy9qcGVnL0IxNTAwJTIwd2l0aCUyME1vbml0b3IlMjAlMjhsb3clMjByZXMlMjkucG5nP3c9NjAwJmg9NjAwJmtlZXA9YyZjcm9wPXllcyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvdHVyYmluZS1mbG93LW1ldGVycy9iMTUwMC10dXJiaW5lLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTksXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIlByb2R1Y3RzXCIsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0NhdGFsb2dfUHJvZHVjdFZhcmlhdGlvbi9DYXRhbG9nQ29udGVudF8xMzkyNjQ1YS1lNmRiLTRhZmUtYTgzYS03ZTJhYjhkOTU2NThfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIjkwMCBTZXJpZXMgRmxvdyBNZXRlclwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIEJsYW5jZXR0PHN1cD4mcmVnOzwvc3VwPiA5MDAgU2VyaWVzIGZsb3cgbWV0ZXIgaXMgcnVnZ2VkLCBsb3ctcHJpY2VkIGFuZCBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gbWVhc3VyZSBmbG9vZHdhdGVyIGxpbmUgZmxvdyBpbiBzZWNvbmRhcnkgb2lsIHJlY292ZXJ5IG9wZXJhdGlvbnMuPC9wPlwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC93Ym5iY2tjaHF1L2pwZWcvOTAwJTIwU2VyaWVzJTIwJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmI3M3BmXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvdHVyYmluZS1mbG93LW1ldGVycy85MDAtc2VyaWVzLWZsb3ctbWV0ZXIvXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTksXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIlByb2R1Y3RzXCIsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0NhdGFsb2dfUHJvZHVjdFZhcmlhdGlvbi9DYXRhbG9nQ29udGVudF8zZDM5OWUzYS0yZTk4LTQ4NGUtOGU3MS0zYmRmZjI0YmI2NWRfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIlBob3NwaGF0ZSBFc3RlciBGbHVpZCBNZXRlclwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiPHA+VGhlIEhlZGxhbmQ8c3VwPiZyZWc7PC9zdXA+IHBob3NwaGF0ZSBlc3RlciBmbHVpZCBtZXRlciBwcm92aWRlcyBhIG1lYXN1cmVtZW50IHNvbHV0aW9uIGZvciBmaXJlLXJlc2lzdGFudCBmbHVpZHMsIGF2aWF0aW9uIGh5ZHJhdWxpYyBmbHVpZCBhbmQgaW5kdXN0cmlhbCBsdWJyaWNhbnQsIHdoaWNoIGhhdmUgaGlnaCBpZ25pdGlvbiB0ZW1wZXJhdHVyZXMgYW5kIGxvdyB2YXBvciBwcmVzc3VyZXMuPC9wPlxcbjxwPjxhIHRpdGxlPVxcXCJEb3dubG9hZCBhIEhlZGxhbmQgUHJpY2UgTGlzdFxcXCIgaHJlZj1cXFwiL2xpbmsvY2EwOWIyNmEwNDA1NDRlMWI3NDI2Yzc5NWNjMjI3MDcuYXNweFxcXCIgdGFyZ2V0PVxcXCJfYmxhbmtcXFwiIHJlbD1cXFwibm9vcGVuZXJcXFwiPjxlbT5Eb3dubG9hZCBhIEhlZGxhbmQgUHJpY2UgTGlzdDwvZW0+PC9hPjwvcD5cIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvN2tldXQzYWlmeS9qcGVnL1Bob3NwaGF0ZSUyMEVzdGVyJTIwRmx1aWQlMjBNZXRlciUyMCUyOGxvdyUyMHJlcyUyOS5wbmc/dz02MDAmaD02MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmI3M3BmXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvdmFyaWFibGUtYXJlYS1mbG93LW1ldGVycy9waG9zcGhhdGUtZXN0ZXItZmx1aWQtbWV0ZXIvXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTksXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIlByb2R1Y3RzXCIsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0NhdGFsb2dfUHJvZHVjdFZhcmlhdGlvbi9DYXRhbG9nQ29udGVudF84MjI4NWMxNC0xNGI3LTRlNjUtOTg0OC0zYzY3YzZhMWMxZThfZW5cIlxuICAgICAgfVxuICAgIF0sXG4gICAgXCJzYXZlZEl0ZW1zQ291bnRcIjogMCxcbiAgICBcInRvdGFsUmVzdWx0c1wiOiAxNTQyLFxuICAgIFwidHJhY2tJZFwiOiBcIkpYa0pZcmR0cWhrRk55Q3RDckJuUHc9PVwiLFxuICAgIFwiZmlsdGVyQ291bnRSZXN1bHRzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiA1OSxcbiAgICAgICAgXCJjb3VudFwiOiAxOTZcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTYsXG4gICAgICAgIFwiY291bnRcIjogMjRcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMTU5LFxuICAgICAgICBcImNvdW50XCI6IDlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNjAsXG4gICAgICAgIFwiY291bnRcIjogMTBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMzYsXG4gICAgICAgIFwiY291bnRcIjogN1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAyMjIsXG4gICAgICAgIFwiY291bnRcIjogMTBcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMjA1LFxuICAgICAgICBcImNvdW50XCI6IDlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNjUsXG4gICAgICAgIFwiY291bnRcIjogMjNcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNjQsXG4gICAgICAgIFwiY291bnRcIjogMTlcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMzUsXG4gICAgICAgIFwiY291bnRcIjogMTA3OFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAxNjEsXG4gICAgICAgIFwiY291bnRcIjogMTFcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMTU3LFxuICAgICAgICBcImNvdW50XCI6IDU3XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDE1OCxcbiAgICAgICAgXCJjb3VudFwiOiAyMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAyMDEsXG4gICAgICAgIFwiY291bnRcIjogNDdcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTgsXG4gICAgICAgIFwiY291bnRcIjogMTRcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMTYwLFxuICAgICAgICBcImNvdW50XCI6IDdcbiAgICAgIH1cbiAgICBdLFxuICAgIFwiZGlkWW91TWVhblwiOiBbXG4gICAgICBcIm1ldGVyIHNwZWNpZmljYXRpb25cIixcbiAgICAgIFwic3RyYWluZXJcIixcbiAgICAgIFwicHVsc2UgbWV0ZXJcIixcbiAgICAgIFwibWV0ZXJzXCIsXG4gICAgICBcIm1ldGVyIFwiXG4gICAgXVxuICB9LFxuICBcInNlYXJjaFJlc3VsdHMyXCI6IHtcbiAgICBcInJlc3VsdHNcIjogW1xuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiU3BlY2lmaWNhdGlvbnMgLyBNb2RNQUdcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk1vZE1BR8KuIE0zMDAwXCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCIvc3RhdGljL2ltYWdlcy9kb2MtaWNvbi5zdmdcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC8weXR3aDUxcmFtL29yaWdpbmFsP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMzUsXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIkRvY3VtZW50c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19CbG9ja3NfRGF0YUJsb2Nrc19EQU1Eb2N1bWVudEJsb2NrL19jNjM1YjE4Mi04NjdkLTQ2YWItYmJhNi1jZmE0ZTgyYjNlNDlfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIk0yMDAwIEVsZWN0cm9tYWduZXRpYyBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5Db21iaW5pbmcgYSBnZW5lcmFsLXB1cnBvc2UgZGV0ZWN0b3Igd2l0aCBhbiBhbXBsaWZpZXIsIHRoZSBNb2RNQUc8c3VwPiZyZWc7PC9zdXA+IE0yMDAwIEVsZWN0cm9tYWduZXRpYyBmbG93IG1ldGVyIGZlYXR1cmVzIGFuIGFkdmFuY2VkLCB1c2VyLWZyaWVuZGx5IGRlc2lnbiB0aGF0IGlzIGJ1aWx0IGZvciBmaWVsZCB2ZXJpZmljYXRpb24gdGVzdGluZyB3aXRoIHRoZSB1c2Ugb2YgYSBzaW1wbGUsIGhhbmRoZWxkIGRldmljZS48L3A+XCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50Lzk3dnVudjN2c3YvanBlZy9Nb2RNQUctTTIwMDAtJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmYxc2hrXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcIi9wcm9kdWN0cy9tZXRlcnMvZWxlY3Ryb21hZ25ldGljLWZsb3ctbWV0ZXJzL20yMDAwLWVsZWN0cm9tYWduZXRpYy1mbG93LW1ldGVyL1wiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDU5LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJQcm9kdWN0c1wiLFxuICAgICAgICBcImlzUHJvZHVjdFwiOiB0cnVlLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19DYXRhbG9nX1Byb2R1Y3RWYXJpYXRpb24vQ2F0YWxvZ0NvbnRlbnRfMTY2NmExNjItMmRmZC00NGQ3LTlmMzQtOWIzOWYwOTBiMjIzX2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJQcm9kdWN0IERhdGEgU2hlZXRzIC8gTW9kTUFHXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJNLVNlcmllc8KuIE00MDAwXCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCIvc3RhdGljL2ltYWdlcy9wZGYtaWNvbi5zdmdcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9paWl3cnFseWRlL29yaWdpbmFsP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMzUsXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIkRvY3VtZW50c1wiLFxuICAgICAgICBcImlzUHJvZHVjdFwiOiBmYWxzZSxcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQmxvY2tzX0RhdGFCbG9ja3NfREFNRG9jdW1lbnRCbG9jay9fOTQ3Yzg5NDAtYjcwNC00MzFhLTljYjEtYWJlMThmODczZmU0X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJCcm9jaHVyZXMgLyBBcXVhQ1VFLCBEeW5hc29uaWNzLCBJbXBlbGxlciwgSW5kdXN0cmlhbCBPdmFsIEdlYXIgKElPRyksIE1vZE1BRywgUmVjb3JkYWxsLCBWb3J0ZXhcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk1vZE1BR8KuIE00MDAwXCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9wbnVvcXloazNmL29yaWdpbmFsP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMzUsXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIkRvY3VtZW50c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19CbG9ja3NfRGF0YUJsb2Nrc19EQU1Eb2N1bWVudEJsb2NrL19mN2Q4NmYzOC04YzVkLTQzNmYtYmNmNC0xZmU1Y2E1ZDJhMjNfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIjxwPkhvdyBNb2Rlcm4gVGVjaG5vbG9neSBhbmQgRGF0YSBBbmFseXRpY3MgQXJlIEVuYWJsaW5nIFRvdGFsIFZpc2liaWxpdHkgb2YgV2F0ZXIgVXNlPC9wPlwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiTW9kTUFHwq4gTTEwMDAsIE0yMDAwIGFuZCBNNTAwMCBGaWVsZCBWZXJpZmljYXRpb24gRGV2aWNlIE1hbnVhbFwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvZ3Y1NXphN2h6dy9vcmlnaW5hbD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM1LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJEb2N1bWVudHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQmxvY2tzX0RhdGFCbG9ja3NfREFNRG9jdW1lbnRCbG9jay9fYjQ3YzY1ODMtYjMxZC00NGU0LWJiZmItZTU5YzkwNjQyODA2X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCI8cD5CYWRnZXIgTWV0ZXIgSW1wcm92ZXMgT3BlcmF0aW5nIFJlbGlhYmlsaXR5IGluIEh5ZHJvbmljIEhlYXRpbmcgYW5kIENvb2xpbmcgQXBwbGljYXRpb25zPC9wPlwiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiTW9kTUFHwq4gTTUwMDAgT0lNTCBDZXJ0aWZpY2F0ZSBvZiBDb25mb3JtaXR5XCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC8xeThvajBraHdlL29yaWdpbmFsP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMzUsXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIkRvY3VtZW50c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19CbG9ja3NfRGF0YUJsb2Nrc19EQU1Eb2N1bWVudEJsb2NrL18xN2EyNzBlMi00MzNkLTQ0OTAtYjQ5Mi1jYTdhZjg3NmM2ZjZfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIk01MDAwIEVsZWN0cm9tYWduZXRpYyBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCI8cD5UaGUgTW9kTUFHPHN1cD4mcmVnOzwvc3VwPiBNNTAwMCBFbGVjdHJvbWFnbmV0aWMgZmxvdyBtZXRlciBpcyBhbiBpZGVhbCBzb2x1dGlvbiBmb3IgcmVtb3RlIHBvdGFibGUgd2F0ZXIgYXBwbGljYXRpb25zLCBwcm92aWRpbmcgY29uc2lzdGVudGx5IHJlbGlhYmxlIGFuZCBhY2N1cmF0ZSBtZWFzdXJlbWVudHMuPC9wPlwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC85eWloamJ1ZXB2L2pwZWcvTW9kTUFHLU01MDAwLSUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PWhka3B4cVwiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCIvcHJvZHVjdHMvbWV0ZXJzL2VsZWN0cm9tYWduZXRpYy1mbG93LW1ldGVycy9tNTAwMC1lbGVjdHJvbWFnbmV0aWMtZmxvdy1tZXRlci9cIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiA1OSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiUHJvZHVjdHNcIixcbiAgICAgICAgXCJpc1Byb2R1Y3RcIjogdHJ1ZSxcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQ2F0YWxvZ19Qcm9kdWN0VmFyaWF0aW9uL0NhdGFsb2dDb250ZW50X2JmYjQyNjA1LWExMWEtNGM5Mi1hNThlLTgxMmQwNTUyN2QyOF9lblwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInRpdGxlXCI6IFwiU3BlY2lmaWNhdGlvbnMgLyBNb2RNQUdcIixcbiAgICAgICAgXCJkZXNjcmlwdGlvblwiOiBcIk1vZE1BR8KuIE03NjAwIEVsZWN0cm9tYWduZXRpYyBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwiaW1hZ2VVcmxcIjogXCJcIixcbiAgICAgICAgXCJsaW5rVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC8xZmR3Z3k4ZWNyL29yaWdpbmFsP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogMzUsXG4gICAgICAgIFwiZmlsdGVyVGV4dFwiOiBcIkRvY3VtZW50c1wiLFxuICAgICAgICBcImhpdElkXCI6IFwiQmFkZ2VyTWV0ZXJfV2ViX01vZGVsc19CbG9ja3NfRGF0YUJsb2Nrc19EQU1Eb2N1bWVudEJsb2NrL19hZGM0M2YzMi0wMzZmLTQzYmMtYWE0Ni0zYTU3MTE2ZWYxMTRfZW5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJ0aXRsZVwiOiBcIlNwZWNpZmljYXRpb25zIC8gTW9kTUFHXCIsXG4gICAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJNb2RNQUfCriBNMTAwMFwiLFxuICAgICAgICBcImltYWdlVXJsXCI6IFwiXCIsXG4gICAgICAgIFwibGlua1VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvcmF5Zng1MWFhay9vcmlnaW5hbD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM1LFxuICAgICAgICBcImZpbHRlclRleHRcIjogXCJEb2N1bWVudHNcIixcbiAgICAgICAgXCJoaXRJZFwiOiBcIkJhZGdlck1ldGVyX1dlYl9Nb2RlbHNfQmxvY2tzX0RhdGFCbG9ja3NfREFNRG9jdW1lbnRCbG9jay9fOWU3M2Q1MDctZTdjZC00MmMxLWE1ZjMtZDQxN2YyZDcyNzM5X2VuXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwidGl0bGVcIjogXCJBcHBsaWNhdGlvbiBEYXRhIFNoZWV0cyAvIE1vZE1BR1wiLFxuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IFwiTW9kTUFHwq4gTTIwMDAgQ29ubmVjdGluZyBhIEJhZGdlciBNZXRlciBFbmRwb2ludCB0byB0aGUgTTIwMDBcIixcbiAgICAgICAgXCJpbWFnZVVybFwiOiBcIlwiLFxuICAgICAgICBcImxpbmtVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3Rtd3BtanJxa3gvb3JpZ2luYWw/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGlcIixcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAzNSxcbiAgICAgICAgXCJmaWx0ZXJUZXh0XCI6IFwiRG9jdW1lbnRzXCIsXG4gICAgICAgIFwiaGl0SWRcIjogXCJCYWRnZXJNZXRlcl9XZWJfTW9kZWxzX0Jsb2Nrc19EYXRhQmxvY2tzX0RBTURvY3VtZW50QmxvY2svX2VhZjE5Y2MzLTEyNzUtNDFjMi1hNDJjLWQwZDk0MzRhODI5OF9lblwiXG4gICAgICB9XG4gICAgXSxcbiAgICBcInNhdmVkSXRlbXNDb3VudFwiOiAwLFxuICAgIFwidG90YWxSZXN1bHRzXCI6IDEyMixcbiAgICBcInRyYWNrSWRcIjogXCJKWGtKWXJkdHFoa0ZOeUN0Q3JCblB3PT1cIixcbiAgICBcImZpbHRlckNvdW50UmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNTYsXG4gICAgICAgIFwiY291bnRcIjogMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAzNSxcbiAgICAgICAgXCJjb3VudFwiOiA5N1xuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiA1OSxcbiAgICAgICAgXCJjb3VudFwiOiA3XG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImZpbHRlclZhbHVlXCI6IDM2LFxuICAgICAgICBcImNvdW50XCI6IDNcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZmlsdGVyVmFsdWVcIjogNjQsXG4gICAgICAgIFwiY291bnRcIjogMlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAxNjEsXG4gICAgICAgIFwiY291bnRcIjogMVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAxNTcsXG4gICAgICAgIFwiY291bnRcIjogOVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJmaWx0ZXJWYWx1ZVwiOiAxNTgsXG4gICAgICAgIFwiY291bnRcIjogMlxuICAgICAgfVxuICAgIF0sXG4gICAgXCJkaWRZb3VNZWFuXCI6IFtcbiAgICAgIFwibW9kbWFnIG0yMDAwIG1hbnVhbFwiLFxuICAgICAgXCJtb2RtYWcgbTIwMDBcIixcbiAgICAgIFwibW9kbWFnIFwiLFxuICAgICAgXCJtb2RtYWcgbVwiXG4gICAgXVxuICB9LFxuICBcInNlYXJjaFJlc3VsdHNOb25lXCI6IHtcbiAgICBcInJlc3VsdHNcIjogW10sXG4gICAgXCJzYXZlZEl0ZW1zQ291bnRcIjogMCxcbiAgICBcInRvdGFsUmVzdWx0c1wiOiAwLFxuICAgIFwidHJhY2tJZFwiOiBcIjF2N3NKWDBPMW5vdEV1SjNNcEZsNXc9PVwiLFxuICAgIFwiZmlsdGVyQ291bnRSZXN1bHRzXCI6IFtdLFxuICAgIFwiZGlkWW91TWVhblwiOiBbXG4gICAgICBcIm1ldGVyc1wiXG4gICAgXVxuICB9LFxuICBcImRvY3VtZW50c0J5SWRcIjoge1xuICAgIFwicmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkFQUExJQ0FUSU9OIERBVEEgU0hFRVRcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiRWxlY3Ryb21hZ25ldGljIGZsb3cgbWV0ZXIgZGF0YSBzaGVldFwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkVuZ2xpc2hcIixcbiAgICAgICAgXCJ1cmxcIjogXCJodHRwczovL3dpZGVuLmJhZGdlcm1ldGVyLmNvbS9kYW1zdHVmZi9kb2N1bWVudC5kb2N4XCIsXG4gICAgICAgIFwiaWRcIjogXCIzNlwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJBUFBMSUNBVElPTiBEQVRBIFNIRUVUMlwiLFxuICAgICAgICBcIm5hbWVcIjogXCJFbGVjdHJvbWFnbmV0aWMgZmxvdyBtZXRlciBkYXRhIHNoZWV0XCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRW5nbGlzaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vd2lkZW4uYmFkZ2VybWV0ZXIuY29tL2RhbXN0dWZmL2RvY3VtZW50LmRvY3hcIixcbiAgICAgICAgXCJpZFwiOiBcIjM2XCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkFQUExJQ0FUSU9OIERBVEEgU0hFRVQzXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVsZWN0cm9tYWduZXRpYyBmbG93IG1ldGVyIGRhdGEgc2hlZXRcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwXCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIjogXCJFbmdsaXNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiMzZcIlxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAgXCJzb2Z0d2FyZUJ5SWRcIjoge1xuICAgIFwicmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkR5bmFzb25pY3NcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiPHA+RHluYXNvbmljcyBURlggVWx0cmEgLSBFbmdsaXNoIEZpcm13YXJlPHN1cD4mcmVnOzwvc3VwPjxwPlwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJGaXJtd2FyZSB8IFZlcnNpb24gRDAwNy0xMDQ1LTAxOF9SZXZUIHwgVXBkYXRlZCBKdWx5IDIzLCAyMDIwIHwgMTkwIEtCIHwgPGEgaHJlZj1cXFwiXFxcIj5TZWUgcmVsZWFzZSBub3RlczwvYT5cIixcbiAgICAgICAgXCJkb3dubG9hZFVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvdjR5dHk1bGR1di9vcmlnaW5hbC9EeW5hc29uaWNzJTIwVEZYJTIwVWx0cmElMjAtJTIwRW5nbGlzaCUyMEZpcm13YXJlLUQwMDctMTA0NS0wMThfUmV2VC56aXA/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGkmZXhwaXJlcz0xNTk1Njk1MDg5MjQwJnNpZ25hdHVyZS52ZXJzaW9uPVYzJnNpZ25hdHVyZT1hWS1jVTRBalRodHZPOTRES3BTUlJRclNoOVpDZ09MTlB4WkZfektGb1BRJTNEXCIsXG4gICAgICAgIFwidmlld0RldGFpbHNVcmxcIjogXCIvZW4vdGVzdC1zb2Z0d2FyZS1wYWdlLTEvXCIsXG4gICAgICAgIFwiaWRcIjogXCI3M1wiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJleWVicm93XCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkR5bmFzb25pY3MgVEZYIFVsdHJhIC0gRnJlbmNoIEZpcm13YXJlMlwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJGaXJtd2FyZSB8IFZlcnNpb24gRDAwNy0xMDQ1LTAyMF9SZXZVIHwgVXBkYXRlZCBKdWx5IDIzLCAyMDIwIHwgMTkwIEtCIHwgPGEgaHJlZj1cXFwiXFxcIj5TZWUgcmVsZWFzZSBub3RlczwvYT5cIixcbiAgICAgICAgXCJkb3dubG9hZFVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvcnJ1dHN4enE2OC9vcmlnaW5hbC9EeW5hc29uaWNzJTIwVEZYJTIwVWx0cmElMjAtJTIwRnJlbmNoJTIwRmlybXdhcmUtRDAwNy0xMDQ1LTAyMF9SZXZVLnppcD9kb3dubG9hZD10cnVlJnguYXBwPWFwaSZleHBpcmVzPTE1OTU2OTUwODkyNDAmc2lnbmF0dXJlLnZlcnNpb249VjMmc2lnbmF0dXJlPWY3NGRiUjJtTGtvUHZyd0NyQm1iSm0tczg5OVpmWHVrenIzaExSSnJfTHclM0RcIixcbiAgICAgICAgXCJ2aWV3RGV0YWlsc1VybFwiOiBudWxsLFxuICAgICAgICBcImlkXCI6IFwiNzRcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiRHluYXNvbmljc1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJEeW5hc29uaWNzIFRGWCBVbHRyYSBFdGhlck5ldC1JUCBlZHMgZmlsZVwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJTb2Z0d2FyZSB8IFZlcnNpb24gTi9BIHwgVXBkYXRlZCBKdWx5IDIzLCAyMDIwIHwgMjUgS0IgfCA8YSBocmVmPVxcXCJcXFwiPlNlZSByZWxlYXNlIG5vdGVzPC9hPlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC93OThqdHVmeWJ1L29yaWdpbmFsL0R5bmFzb25pY3MlMjBURlglMjBVbHRyYSUyMEV0aGVyTmV0LUlQJTIwZWRzJTIwZmlsZS5lZHM/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGkmZXhwaXJlcz0xNTk1Njk1MDg5MjQwJnNpZ25hdHVyZS52ZXJzaW9uPVYzJnNpZ25hdHVyZT1nYXBLRUd4V0szOGY2VmZBNTVlV3lZWlJaeHVlTFBRTVItaXV6ZmlqWnNZJTNEXCIsXG4gICAgICAgIFwidmlld0RldGFpbHNVcmxcIjogbnVsbCxcbiAgICAgICAgXCJpZFwiOiBcIjc1XCJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIFwicmVjZW50UG9zdHNcIjoge1xuICAgIFwic3VjY2Vzc1wiOiBcInRydWVcIixcbiAgICBcInBhZ2VcIjogMSxcbiAgICBcImNvdW50XCI6IDUwLFxuICAgIFwicHJldlBhZ2VcIjogbnVsbCxcbiAgICBcIm5leHRQYWdlXCI6IDMsXG4gICAgXCJwYWdlQ291bnRcIjogMyxcbiAgICBcInRvdGFsUGFnZXNcIjogNixcbiAgICBcImxpbWl0XCI6IDI0LFxuICAgIFwicmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiaW1hZ2VcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8zNTN4NTUwXCIsXG4gICAgICAgIFwidGl0bGVcIjogXCI8cD4xMCB3YXlzIGZsb3cgbWV0ZXJzIGFpZCBpbiB3YXRlciAmIHdhc3Rld2F0ZXIgdHJlYXRtZW50PC9wPlwiLFxuICAgICAgICBcInVybFwiOiBcIiNcIixcbiAgICAgICAgXCJ0eXBlXCI6IFwiQXJ0aWNsZVwiLFxuICAgICAgICBcImluZm9cIjogXCIyIG1pbiByZWFkXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiaW1hZ2VcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8zNTN4NTUwXCIsXG4gICAgICAgIFwidGl0bGVcIjogXCI8Yj5CbGFuY2V0dCBtZXRlcnM8L2I+IGhlbHAgaHlkcmF1bGljIGZyYWN0dXJpbmcgY29tcGFuaWVzXCIsXG4gICAgICAgIFwidXJsXCI6IFwiI1wiLFxuICAgICAgICBcInR5cGVcIjogXCJBcnRpY2xlXCIsXG4gICAgICAgIFwiaW5mb1wiOiBcIjIgbWluIHJlYWRcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJpbWFnZVwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzM1M3g1NTBcIixcbiAgICAgICAgXCJ0aXRsZVwiOiBcIjxzdHJvbmc+SGlnaCB0ZW1wZXJhdHVyZTwvc3Ryb25nPjxzdXA+wqk8L3N1cD4gZ2FzIGNvbnRyb2wgZm9yIGF1dG9tb3RpdmUgdGVzdCBjZWxsXCIsXG4gICAgICAgIFwidXJsXCI6IFwiI1wiLFxuICAgICAgICBcInR5cGVcIjogXCJBcnRpY2xlXCIsXG4gICAgICAgIFwiaW5mb1wiOiBcIjIgbWluIHJlYWRcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJpbWFnZVwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzM1M3g1NTBcIixcbiAgICAgICAgXCJ0aXRsZVwiOiBcIjxzcGFuIHN0eWxlPSdmb250LXdlaWdodDogNDAwO2ZvbnQtc2l6ZToyMHB4O2NvbG9yOiByZWQ7bGluZS1oZWlnaHQ6MzBweDsnPkhpZ2ggdGVtcGVyYXR1cmUgZ2FzIGNvbnRyb2wgZm9yIGF1dG9tb3RpdmUgdGVzdCBjZWxsPC9zcGFuPlwiLFxuICAgICAgICBcInVybFwiOiBcIiNcIixcbiAgICAgICAgXCJ0eXBlXCI6IFwiQXJ0aWNsZVwiLFxuICAgICAgICBcImluZm9cIjogXCIyIG1pbiByZWFkXCJcbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIFwicHJvZHVjdHNCeUJyYW5kXCI6IHtcbiAgICBcInN1Y2Nlc3NcIjogXCJ0cnVlXCIsXG4gICAgXCJyZXN1bHRzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJCMTUwMCBUdXJiaW5lIEZsb3cgTWV0ZXJcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIkIxNTAwIFR1cmJpbmUgRmxvdyBNZXRlclwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImtleVwiOiBcIkIxNzUwIFBvc2l0aXZlIERpc3BsYWNlbWVudCBNZXRlclwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiQjE3NTAgUG9zaXRpdmUgRGlzcGxhY2VtZW50IE1ldGVyXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiQjI5MDAgU2VyaWVzIEZsb3cgTW9uaXRvclwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiQjI5MDAgU2VyaWVzIEZsb3cgTW9uaXRvclwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImtleVwiOiBcIkIzMDAwIFNlcmllcyBGbG93IE1vbml0b3JcIixcbiAgICAgICAgXCJ2YWx1ZVwiOiBcIkIzMDAwIFNlcmllcyBGbG93IE1vbml0b3JcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJCMzEwMCBTZXJpZXMgRmxvdyBNb25pdG9yXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJCMzEwMCBTZXJpZXMgRmxvdyBNb25pdG9yXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiRmxvQ2xlYW4gU2FuaXRhcnkgVHVyYmluZSBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJGbG9DbGVhbiBTYW5pdGFyeSBUdXJiaW5lIEZsb3cgTWV0ZXJcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJJbnRlbGxpZ2VudCBGcmVxdWVuY3kgQ29udmVydGVyXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCI8cD5JbnRlbGxpZ2VudCBGcmVxdWVuY3kgQ29udmVydGVyPC9wPlwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImtleVwiOiBcIkstRmFjdG9yIFNjYWxlciAoQmxhbmNldHQpXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCI8cD5LLUZhY3RvciBTY2FsZXIgKEJsYW5jZXR0KTwvcD5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJNb2RlbCAxMTAwIFR1cmJpbmUgRmxvdyBNZXRlclwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiTW9kZWwgMTEwMCBUdXJiaW5lIEZsb3cgTWV0ZXJcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJNb2RlbCAxMjAwIEluLUxpbmUgVHVyYmluZSBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCJNb2RlbCAxMjAwIEluLUxpbmUgVHVyYmluZSBGbG93IE1ldGVyXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwia2V5XCI6IFwiTW9kZWwgOTAwIFNlcmllcyBGbG93IE1ldGVyXCIsXG4gICAgICAgIFwidmFsdWVcIjogXCI5MDAgU2VyaWVzIEZsb3cgTWV0ZXJcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJRdWlrU2VydCBHYXMgQjE0MlwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiPHA+QjE0MiBHYXMgUXVpa1NlcnQ8c3VwPiZyZWc7PC9zdXA+IFR1cmJpbmUgRmxvdyBNZXRlcjwvcD5cIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJrZXlcIjogXCJRdWlrU2VydCBJbi1MaW5lIFR1cmJpbmUgRmxvdyBNZXRlclwiLFxuICAgICAgICBcInZhbHVlXCI6IFwiPHA+UXVpa1NlcnQ8c3VwPiZyZWc7PC9zdXA+IEluLUxpbmUgVHVyYmluZSBGbG93IE1ldGVyPC9wPlwiXG4gICAgICB9XG4gICAgXVxuICB9LFxuICBcInByb2R1Y3RzXCI6IHtcbiAgICBcInN1Y2Nlc3NcIjogXCJ0cnVlXCIsXG4gICAgXCJ2aWV3UHJvZHVjdExhYmVsXCI6IFwiVmlldyBwcm9kdWN0IGxhYmVsXCIsXG4gICAgXCJ0b3RhbFJlc3VsdHNcIjogMTAsXG4gICAgXCJyZXN1bHRzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L29kdnZqZjV4bzcvanBlZy8xMCUyQzAwMCUyMHBzaSUyMC0lMjBIUC0xMCUyMCUyOGxvdy1yZXMlMjkucG5nP3c9NjAwJmg9NjAwJnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmZmYmcXVhbGl0eT04MCZ1PXJiNzNwZlwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50LzlwZGNpb2R1aW0vcG5nL1JDVi1Mb2dvX1NpbXBsaWZpZWRfR3JheSUyMCUyOExvdyUyMFJlcyUyOS5wbmc/aD0zNiZwb3NpdGlvbj1jJmNvbG9yPWZmZmZmZjAwJnF1YWxpdHk9ODAmdT11em13aHZcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIjxwPjEwLDAwMCBQU0kgVHlwZSBIUC0xMCBIaWdoIFByZXNzdXJlIENvbnRyb2wgVmFsdmU8L3A+XCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3Byb2R1Y3RzL3ZhbHZlcy8xMDAwMC1wc2ktdHlwZS1ocC0xMC1oaWdoLXByZXNzdXJlLWNvbnRyb2wtdmFsdmUvXCIsXG4gICAgICAgIFwiaWRcIjogXCI3MFwiLFxuICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMS80Li4uMS8yIGluLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjYuLi4xMiBtbVwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVtcGVyYXR1cmUgUmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjc14oCmMTAwMCDCsEZcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIyNOKApjUzOCDCsENcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIkZsb3cgUmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjDigKYyLjUgY3ZcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCIwLi4uMzUuNzUga3ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByZXNzdXJlIFJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJVcCB0byAxMCwwMDAgUFNJXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiVXAgdG8gNjg5IGJhclwiXG4gICAgICAgICAgfVxuICAgICAgICBdLFxuICAgICAgICBcIm1hcmtldHNcIjogW1xuICAgICAgICAgIFwiQXZpYXRpb24gJiBBZXJvc3BhY2VcIixcbiAgICAgICAgICBcIk9pbCAmIEdhc1wiLFxuICAgICAgICAgIFwiUHJvY2VzcyAmIEdlbmVyYWwgSW5kdXN0cnlcIixcbiAgICAgICAgICBcIlJlZmluaW5nLCBDaGVtaWNhbCAmIFBldHJvY2hlbWljYWxcIixcbiAgICAgICAgICBcIlRlc3QgRXF1aXBtZW50ICYgU2VydmljZXNcIlxuICAgICAgICBdLFxuICAgICAgICBcInByb2R1Y3RDYXRlZ29yeVwiOiBcIlZhbHZlc1wiLFxuICAgICAgICBcInByb2R1Y3RUeXBlXCI6IG51bGwsXG4gICAgICAgIFwiYnJhbmRcIjogXCJSZXNlYXJjaCBDb250cm9sIFZhbHZlc1wiLFxuICAgICAgICBcImZsb3dUeXBlc1wiOiBbXG4gICAgICAgICAgXCJPaWxcIixcbiAgICAgICAgICBcIlN0ZWFtXCIsXG4gICAgICAgICAgXCJBaXIgLyBHYXNcIixcbiAgICAgICAgICBcIldhdGVyXCIsXG4gICAgICAgICAgXCJPdGhlciBsaXF1aWRcIlxuICAgICAgICBdLFxuICAgICAgICBcImd1aWRcIjogXCJiNTE5ODNhZi03YzZlLTQ0ZDItODUwZC00NzdiZjk5NjhkYzVcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvNjJ4MjBcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIk1vZE1BRyA8c3VwPk0tU2VyaWVzPC9zdXA+IHNhbXBsZVwiLFxuICAgICAgICBcInVybFwiOiBcIi91cmwvdG8vcHJvZHVjdFwiLFxuICAgICAgICBcImlkXCI6IFwiN1wiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQyXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTaXplXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiNTQgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCI1NjM0IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVtcGVyYXR1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCAxMjNDXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCAxMjNGXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmFzc3VyZSByYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDEyMyBtZXRyaWNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDEyMyB1c1wiXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzIwMHgxNTBcIixcbiAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvNjJ4MjBcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMCBibGFoIGJsYWggYmxhaFwiLFxuICAgICAgICBcInVybFwiOiBcIi91cmwvdG8vcHJvZHVjdFwiLFxuICAgICAgICBcImlkXCI6IFwiOFwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCIxMlwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQ0XCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTaXplXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMS03IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMS80LTIgaW4uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJUZW1wZXJhdHVyZSByYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDAwMENcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDAwMEZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgMDAwIG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgMDAwIHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwIGJsYWggYmxhaCBibGFoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCI5XCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDNcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZyBlbHNlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiOTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIzNDM1IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzY1Q1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3RlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NzcgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzcgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjEwXCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDNcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZyBlbHNlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiOTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIzNDM1IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzY1Q1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3RlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NzcgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzcgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjExXCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDNcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZyBlbHNlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiOTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIzNDM1IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzY1Q1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3RlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NzcgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzcgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjE3XCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDNcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZyBlbHNlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiOTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIzNDM1IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzY1Q1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3RlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NzcgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzcgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjE4XCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDNcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZyBlbHNlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiOTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIzNDM1IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzY1Q1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3RlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NzcgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzcgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfVxuICAgIF1cbiAgfSxcbiAgXCJwcm9kdWN0c1Rlc3RcIjoge1xuICAgIFwic3VjY2Vzc1wiOiBcInRydWVcIixcbiAgICBcInZpZXdQcm9kdWN0TGFiZWxcIjogXCJWaWV3IHByb2R1Y3QgbGFiZWxcIixcbiAgICBcInRvdGFsUmVzdWx0c1wiOiAxMCxcbiAgICBcInJlc3VsdHNcIjogW1xuICAgICAge1xuICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvb2R2dmpmNXhvNy9qcGVnLzEwJTJDMDAwJTIwcHNpJTIwLSUyMEhQLTEwJTIwJTI4bG93LXJlcyUyOS5wbmc/dz02MDAmaD02MDAmcG9zaXRpb249YyZjb2xvcj1mZmZmZmZmZiZxdWFsaXR5PTgwJnU9cmI3M3BmXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvOXBkY2lvZHVpbS9wbmcvUkNWLUxvZ29fU2ltcGxpZmllZF9HcmF5JTIwJTI4TG93JTIwUmVzJTI5LnBuZz9oPTM2JnBvc2l0aW9uPWMmY29sb3I9ZmZmZmZmMDAmcXVhbGl0eT04MCZ1PXV6bXdodlwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiPHA+VGVzdDwvcD5cIixcbiAgICAgICAgXCJ1cmxcIjogXCIvcHJvZHVjdHMvdmFsdmVzLzEwMDAwLXBzaS10eXBlLWhwLTEwLWhpZ2gtcHJlc3N1cmUtY29udHJvbC12YWx2ZS9cIixcbiAgICAgICAgXCJpZFwiOiBcIjQ1NjFcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNpemVcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjEvNC4uLjEvMiBpbi5cIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI2Li4uMTIgbW1cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlRlbXBlcmF0dXJlIFJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCI3NeKApjEwMDAgwrBGXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMjTigKY1MzggwrBDXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJGbG93IFJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIw4oCmMi41IGN2XCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiMC4uLjM1Ljc1IGt2XCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmVzc3VyZSBSYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiVXAgdG8gMTAsMDAwIFBTSVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIlVwIHRvIDY4OSBiYXJcIlxuICAgICAgICAgIH1cbiAgICAgICAgXSxcbiAgICAgICAgXCJtYXJrZXRzXCI6IFtcbiAgICAgICAgICBcIkF2aWF0aW9uICYgQWVyb3NwYWNlXCIsXG4gICAgICAgICAgXCJPaWwgJiBHYXNcIixcbiAgICAgICAgICBcIlByb2Nlc3MgJiBHZW5lcmFsIEluZHVzdHJ5XCIsXG4gICAgICAgICAgXCJSZWZpbmluZywgQ2hlbWljYWwgJiBQZXRyb2NoZW1pY2FsXCIsXG4gICAgICAgICAgXCJUZXN0IEVxdWlwbWVudCAmIFNlcnZpY2VzXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJwcm9kdWN0Q2F0ZWdvcnlcIjogXCJWYWx2ZXNcIixcbiAgICAgICAgXCJwcm9kdWN0VHlwZVwiOiBudWxsLFxuICAgICAgICBcImJyYW5kXCI6IFwiUmVzZWFyY2ggQ29udHJvbCBWYWx2ZXNcIixcbiAgICAgICAgXCJmbG93VHlwZXNcIjogW1xuICAgICAgICAgIFwiT2lsXCIsXG4gICAgICAgICAgXCJTdGVhbVwiLFxuICAgICAgICAgIFwiQWlyIC8gR2FzXCIsXG4gICAgICAgICAgXCJXYXRlclwiLFxuICAgICAgICAgIFwiT3RoZXIgbGlxdWlkXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJndWlkXCI6IFwiYjUxOTgzYWYtN2M2ZS00NGQyLTg1MGQtNDc3YmY5OTY4ZGM1XCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgPHN1cD5NLVNlcmllczwvc3VwPiBzYW1wbGVcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjcwMFwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQyXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTaXplXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiNTQgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCI1NjM0IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVtcGVyYXR1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCAxMjNDXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCAxMjNGXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmFzc3VyZSByYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDEyMyBtZXRyaWNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDEyMyB1c1wiXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzIwMHgxNTBcIixcbiAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvNjJ4MjBcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcInRlc3QgdGVzdE1vZE1BRyBNLVNlcmllcyBNMjAwMCBibGFoIGJsYWggYmxhaFwiLFxuICAgICAgICBcInVybFwiOiBcIi91cmwvdG8vcHJvZHVjdFwiLFxuICAgICAgICBcImlkXCI6IFwiODAwXCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDNcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZyBlbHNlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiOTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIzNDM1IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzY1Q1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3RlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NzcgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzcgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjEyMDBcIixcbiAgICAgICAgXCJicmFuZFwiOiBcImJyYW5kNFwiLFxuICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU2l6ZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjEtNyBjbS5cIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjEvNC0yIGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiVGVtcGVyYXR1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCAwMDBDXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCAwMDBGXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmFzc3VyZSByYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDAwMCBtZXRyaWNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDAwMCB1c1wiXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzIwMHgxNTBcIixcbiAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvNjJ4MjBcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMCBibGFoIGJsYWggYmxhaFwiLFxuICAgICAgICBcInVybFwiOiBcIi91cmwvdG8vcHJvZHVjdFwiLFxuICAgICAgICBcImlkXCI6IFwiOTAwXCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDNcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZyBlbHNlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiOTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIzNDM1IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzY1Q1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3RlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NzcgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzcgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjUwMFwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwicHJvZHVjdEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvMjAweDE1MFwiLFxuICAgICAgICBcImJyYW5kSW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC82MngyMFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwIGJsYWggYmxhaCBibGFoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiL3VybC90by9wcm9kdWN0XCIsXG4gICAgICAgIFwiaWRcIjogXCI0MDBcIixcbiAgICAgICAgXCJicmFuZFwiOiBcImJyYW5kM1wiLFxuICAgICAgICBcInN0YXRzXCI6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nIGVsc2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCI5NyBjbS5cIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcIjM0MzUgaW4uXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmdcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NjVDXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzdGXCJcbiAgICAgICAgICB9LFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJQcmFzc3VyZSByYW5nZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc3NyBtZXRyaWNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3NyB1c1wiXG4gICAgICAgICAgfVxuICAgICAgICBdXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcInByb2R1Y3RJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzIwMHgxNTBcIixcbiAgICAgICAgXCJicmFuZEltYWdlVXJsXCI6IFwiaHR0cHM6Ly9wbGFjZWhvbGQuaXQvNjJ4MjBcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMCBibGFoIGJsYWggYmxhaFwiLFxuICAgICAgICBcInVybFwiOiBcIi91cmwvdG8vcHJvZHVjdFwiLFxuICAgICAgICBcImlkXCI6IFwiMTAwXCIsXG4gICAgICAgIFwiYnJhbmRcIjogXCJicmFuZDNcIixcbiAgICAgICAgXCJzdGF0c1wiOiBbXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZyBlbHNlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwiOTcgY20uXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCIzNDM1IGluLlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiU29tZXRoaW5nXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzY1Q1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3RlwiXG4gICAgICAgICAgfSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBcImxhYmVsXCI6IFwiUHJhc3N1cmUgcmFuZ2VcIixcbiAgICAgICAgICAgIFwidmFsdWVNZXRyaWNcIjogXCJ1cCB0cCA3NzcgbWV0cmljXCIsXG4gICAgICAgICAgICBcInZhbHVlSW1wZXJpYWxcIjogXCJ1cCB0cCA3NzcgdXNcIlxuICAgICAgICAgIH1cbiAgICAgICAgXVxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJwcm9kdWN0SW1hZ2VVcmxcIjogXCJodHRwczovL3BsYWNlaG9sZC5pdC8yMDB4MTUwXCIsXG4gICAgICAgIFwiYnJhbmRJbWFnZVVybFwiOiBcImh0dHBzOi8vcGxhY2Vob2xkLml0LzYyeDIwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDAgYmxhaCBibGFoIGJsYWhcIixcbiAgICAgICAgXCJ1cmxcIjogXCIvdXJsL3RvL3Byb2R1Y3RcIixcbiAgICAgICAgXCJpZFwiOiBcIjE1MFwiLFxuICAgICAgICBcImJyYW5kXCI6IFwiYnJhbmQzXCIsXG4gICAgICAgIFwic3RhdHNcIjogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIFwibGFiZWxcIjogXCJTb21ldGhpbmcgZWxzZVwiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcIjk3IGNtLlwiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwiMzQzNSBpbi5cIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlNvbWV0aGluZ1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZU1ldHJpY1wiOiBcInVwIHRwIDc2NUNcIixcbiAgICAgICAgICAgIFwidmFsdWVJbXBlcmlhbFwiOiBcInVwIHRwIDc3N0ZcIlxuICAgICAgICAgIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgXCJsYWJlbFwiOiBcIlByYXNzdXJlIHJhbmdlXCIsXG4gICAgICAgICAgICBcInZhbHVlTWV0cmljXCI6IFwidXAgdHAgNzc3IG1ldHJpY1wiLFxuICAgICAgICAgICAgXCJ2YWx1ZUltcGVyaWFsXCI6IFwidXAgdHAgNzc3IHVzXCJcbiAgICAgICAgICB9XG4gICAgICAgIF1cbiAgICAgIH1cbiAgICBdXG4gIH0sXG4gIFwic29mdHdhcmVcIjoge1xuICAgIFwicmVzdWx0c1wiOiBbXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkR5bmFzb25pY3NcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiTE1fTE0tT0dBLU9HVEFFUl9aVUxfTUlEXzAxXzIwMTJcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiRmlybXdhcmUgfCBWZXJzaW9uIEQwMDctMTA0NS0wMThfUmV2VCB8IFVwZGF0ZWQgSnVseSAyMywgMjAyMCB8IDE5MCBLQlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC92NHl0eTVsZHV2L29yaWdpbmFsL0R5bmFzb25pY3MlMjBURlglMjBVbHRyYSUyMEZpcm13YXJlJTIwJTVCRW5nbGlzaCU1RCUyMC0lMjBEMDA3LTEwNDUtMDE4X1JldlQuemlwP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZG93bmxvYWRIcmVmXCI6IFwiI2Rvd25sb2FkaHJlZlwiLFxuICAgICAgICBcInZpZXdEZXRhaWxzVXJsXCI6IG51bGwsXG4gICAgICAgIFwiaWRcIjogXCIyOTVcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBudWxsLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBbXG4gICAgICAgICAgXCJFbmdsaXNoXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJicmFuZFwiOiBcIkR5bmFzb25pY3NcIixcbiAgICAgICAgXCJicmFuZHNcIjogW1xuICAgICAgICAgIFwiRHluYXNvbmljc1wiXG4gICAgICAgIF0sXG4gICAgICAgIFwiZG93bmxvYWRUeXBlXCI6IFwiRmlybXdhcmVcIixcbiAgICAgICAgXCJkb2N1bWVudE5hbWVcIjogXCJEeW5hc29uaWNzIFRGWCBVbHRyYSBGaXJtd2FyZSBbRW5nbGlzaF1cIixcbiAgICAgICAgXCJyZWxlYXNlTm90ZXNcIjogXCJ0ZXN0IHRlc3QgdGVzdCB0ZXN0IHRlc3RcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiSW1wZWxsZXIvRGF0YSBJbmR1c3RyaWFsXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkltcGVsbGVyIDM0MExXIFNlcmllcyBMb25Xb3JrcyBDb25maWd1cmF0aW9uIFNvZnR3YXJlXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIlNvZnR3YXJlIHwgVXBkYXRlZCBBdWd1c3QgMTksIDIwMjAgfCAxIEtCXCIsXG4gICAgICAgIFwiZG93bmxvYWRVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2hsbnpsd2R2MHQvb3JpZ2luYWwvSW1wZWxsZXIlMjAzNDBMVyUyMFNlcmllcyUyMExvbldvcmtzJTIwQ29uZmlndXJhdGlvbiUyMFNvZnR3YXJlLnppcD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImRvd25sb2FkSHJlZlwiOiBcIiNkb3dubG9hZGhyZWZcIixcbiAgICAgICAgXCJ2aWV3RGV0YWlsc1VybFwiOiBcIi9zb2Z0d2FyZS1maXJtd2FyZS9JbXBlbGxlci0zNDBsdy1zZXJpZXMtbG9ud29ya3MtY29uZmlndXJhdGlvbi1zb2Z0d2FyZS9cIixcbiAgICAgICAgXCJpZFwiOiBcIjQzOFwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiVHlwZSAzNDAgTFctTG9uV29ya3MgQlRVIFRyYW5zbWl0dGVyXCIsXG4gICAgICAgIFwibGFuZ3VhZ2VzXCI6IFtcbiAgICAgICAgICBcIkVuZ2xpc2hcIlxuICAgICAgICBdLFxuICAgICAgICBcImJyYW5kXCI6IFwiSW1wZWxsZXIvRGF0YSBJbmR1c3RyaWFsXCIsXG4gICAgICAgIFwiYnJhbmRzXCI6IFtcbiAgICAgICAgICBcIkltcGVsbGVyL0RhdGEgSW5kdXN0cmlhbFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiZG93bmxvYWRUeXBlXCI6IFwiU29mdHdhcmVcIixcbiAgICAgICAgXCJkb2N1bWVudE5hbWVcIjogXCJJbXBlbGxlciAzNDBMVyBTZXJpZXMgTG9uV29ya3MgQ29uZmlndXJhdGlvbiBTb2Z0d2FyZVwiLFxuICAgICAgICBcInJlbGVhc2VOb3Rlc1wiOiBudWxsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNb2RNQUdcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiTW9kTWFnIEZpZWxkIFZlcmlmaWNhdGlvbiBEZXZpY2UgUEMgU29mdHdhcmVcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiU29mdHdhcmUgfCBWZXJzaW9uIHYxLjAuMTcgfCBVcGRhdGVkIEF1Z3VzdCAxOSwgMjAyMCB8IDcuMDIgTUJcIixcbiAgICAgICAgXCJkb3dubG9hZFVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvemp2cHBpZXczby9vcmlnaW5hbC9Nb2RNQUclMjBGaWVsZCUyMFZlcmlmaWNhdGlvbiUyMERldmljZSUyMFBDJTIwU29mdHdhcmUlMjAtJTIwdjEuMC4xNy56aXA/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGlcIixcbiAgICAgICAgXCJkb3dubG9hZEhyZWZcIjogXCIjZG93bmxvYWRocmVmXCIsXG4gICAgICAgIFwidmlld0RldGFpbHNVcmxcIjogXCIvc29mdHdhcmUtZmlybXdhcmUvbW9kbWFnLWZpZWxkLXZlcmlmaWNhdGlvbi1kZXZpY2UtcGMtc29mdHdhcmUvXCIsXG4gICAgICAgIFwiaWRcIjogXCI0NDZcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBudWxsLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBbXG4gICAgICAgICAgXCJFbmdsaXNoXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJicmFuZFwiOiBcIk1vZE1BR1wiLFxuICAgICAgICBcImJyYW5kc1wiOiBbXG4gICAgICAgICAgXCJNb2RNQUdcIlxuICAgICAgICBdLFxuICAgICAgICBcImRvd25sb2FkVHlwZVwiOiBcIlNvZnR3YXJlXCIsXG4gICAgICAgIFwiZG9jdW1lbnROYW1lXCI6IFwiTW9kTWFnIEZpZWxkIFZlcmlmaWNhdGlvbiBEZXZpY2UgUEMgU29mdHdhcmVcIixcbiAgICAgICAgXCJyZWxlYXNlTm90ZXNcIjogbnVsbFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiQmxhbmNldHRcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiQmxhbmNldHQgQjMxMDAgTW9uaXRvciBDb25maWd1cmF0aW9uIFNvZnR3YXJlXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIlNvZnR3YXJlIHwgVXBkYXRlZCBBdWd1c3QgMTksIDIwMjAgfCAxLjUxIE1CXCIsXG4gICAgICAgIFwiZG93bmxvYWRVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50LzV5MzR5cnFwcDYvb3JpZ2luYWwvQmxhbmNldHQlMjBCMzEwMCUyME1vbml0b3IlMjBDb25maWd1cmF0aW9uJTIwU29mdHdhcmUuemlwP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZG93bmxvYWRIcmVmXCI6IFwiI2Rvd25sb2FkaHJlZlwiLFxuICAgICAgICBcInZpZXdEZXRhaWxzVXJsXCI6IFwiL3NvZnR3YXJlLWZpcm13YXJlL2JsYW5jZXR0LWIzMTAwLW1vbml0b3ItY29uZmlndXJhdGlvbi1zb2Z0d2FyZS9cIixcbiAgICAgICAgXCJpZFwiOiBcIjQ1MlwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiQjMxMDAgU2VyaWVzIEZsb3cgTW9uaXRvclwiLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBbXG4gICAgICAgICAgXCJFbmdsaXNoXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJicmFuZFwiOiBcIkJsYW5jZXR0XCIsXG4gICAgICAgIFwiYnJhbmRzXCI6IFtcbiAgICAgICAgICBcIkJsYW5jZXR0XCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJkb3dubG9hZFR5cGVcIjogXCJTb2Z0d2FyZVwiLFxuICAgICAgICBcImRvY3VtZW50TmFtZVwiOiBcIkJsYW5jZXR0IEIzMTAwIE1vbml0b3IgQ29uZmlndXJhdGlvbiBTb2Z0d2FyZVwiLFxuICAgICAgICBcInJlbGVhc2VOb3Rlc1wiOiBcInRlc3RcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiQ294IDsgSW1wZWxsZXIvRGF0YSBJbmR1c3RyaWFsXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkZDLTUwMDAgRmlybXdhcmUgW0xlZ2FjeV1cIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiRmlybXdhcmUgfCBWZXJzaW9uIHYxLjIuNCB8IFVwZGF0ZWQgQXVndXN0IDE5LCAyMDIwIHwgMzc0IEtCXCIsXG4gICAgICAgIFwiZG93bmxvYWRVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2thNGpwYmt2bzAvb3JpZ2luYWwvRkMtNTAwMCUyMEZpcm13YXJlJTIwLSUyMExlZ2FjeSUyMDEuMi40LnppcD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImRvd25sb2FkSHJlZlwiOiBcIiNkb3dubG9hZGhyZWZcIixcbiAgICAgICAgXCJ2aWV3RGV0YWlsc1VybFwiOiBcIi9zb2Z0d2FyZS1maXJtd2FyZS9mYy01MDAwLWZpcm13YXJlLWxlZ2FjeS9cIixcbiAgICAgICAgXCJpZFwiOiBcIjQzNlwiLFxuICAgICAgICBcInByb2R1Y3ROYW1lXCI6IFwiRkMtNTAwMCBCVFUgTW9uaXRvciA7IEZDLTUwMDAgRmxvdyBDb21wdXRlciA7IEZDLTUwMDAgRmxvdyBEaXNwbGF5XCIsXG4gICAgICAgIFwibGFuZ3VhZ2VzXCI6IFtcbiAgICAgICAgICBcIkVuZ2xpc2hcIlxuICAgICAgICBdLFxuICAgICAgICBcImJyYW5kXCI6IFwiQ294LCBJbXBlbGxlci9EYXRhIEluZHVzdHJpYWxcIixcbiAgICAgICAgXCJicmFuZHNcIjogW1xuICAgICAgICAgIFwiQ294XCIsXG4gICAgICAgICAgXCJJbXBlbGxlci9EYXRhIEluZHVzdHJpYWxcIlxuICAgICAgICBdLFxuICAgICAgICBcImRvd25sb2FkVHlwZVwiOiBcIkZpcm13YXJlXCIsXG4gICAgICAgIFwiZG9jdW1lbnROYW1lXCI6IFwiRkMtNTAwMCBGaXJtd2FyZSBbTGVnYWN5XVwiLFxuICAgICAgICBcInJlbGVhc2VOb3Rlc1wiOiBudWxsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJDb3Jpb2xpc1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJDb3Jpb2xscyBSQ1RYIFRyYW5zbWl0dGVyIEV0aGVyTmV0L0lQIEVEU1wiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJTb2Z0d2FyZSB8IFVwZGF0ZWQgQXVndXN0IDE5LCAyMDIwIHwgMyBLQlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9iM2NzanUxeWZ0L29yaWdpbmFsL0NvcmlvbGxzJTIwRXRoZXJOZXRJUCUyMGVkcyUyMGZpbGUlMjBmb3IlMjBSQ1RYJTIwdHJhbnNtaXR0ZXIuemlwP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZG93bmxvYWRIcmVmXCI6IFwiI2Rvd25sb2FkaHJlZlwiLFxuICAgICAgICBcInZpZXdEZXRhaWxzVXJsXCI6IFwiL3NvZnR3YXJlLWZpcm13YXJlL2NvcmlvbGlzLWV0aGVybmV0LWlwLWVkcy1maWxlLWZvci1yY3R4LXRyYW5zbWl0dGVyL1wiLFxuICAgICAgICBcImlkXCI6IFwiNDUwXCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogbnVsbCxcbiAgICAgICAgXCJsYW5ndWFnZXNcIjogW1xuICAgICAgICAgIFwiRW5nbGlzaFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiYnJhbmRcIjogXCJDb3Jpb2xpc1wiLFxuICAgICAgICBcImJyYW5kc1wiOiBbXG4gICAgICAgICAgXCJDb3Jpb2xpc1wiXG4gICAgICAgIF0sXG4gICAgICAgIFwiZG93bmxvYWRUeXBlXCI6IFwiU29mdHdhcmVcIixcbiAgICAgICAgXCJkb2N1bWVudE5hbWVcIjogXCJDb3Jpb2xscyBSQ1RYIFRyYW5zbWl0dGVyIEV0aGVyTmV0L0lQIEVEU1wiLFxuICAgICAgICBcInJlbGVhc2VOb3Rlc1wiOiBudWxsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJEeW5hc29uaWNzXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkR5bmFjb25pY3MgRmxvdyBNZXRlciBUb29sXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIlNvZnR3YXJlIHwgVmVyc2lvbiB2MS42LjEwIHwgVXBkYXRlZCBBdWd1c3QgMTksIDIwMjAgfCAyLjI0IE1CXCIsXG4gICAgICAgIFwiZG93bmxvYWRVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3Aybno1cDV5bGovb3JpZ2luYWwvRHluYWNvbmljcyUyMEZsb3clMjBNZXRlciUyMFRvb2wlMjAtJTIwdjEuNi4xMC56aXA/ZG93bmxvYWQ9dHJ1ZSZ4LmFwcD1hcGlcIixcbiAgICAgICAgXCJkb3dubG9hZEhyZWZcIjogXCIjZG93bmxvYWRocmVmXCIsXG4gICAgICAgIFwidmlld0RldGFpbHNVcmxcIjogXCIvc29mdHdhcmUtZmlybXdhcmUvZHluYXNvbmljcy1pc29uaWMtNDAwMC1mbG93LW1ldGVyLXNvZnR3YXJlL1wiLFxuICAgICAgICBcImlkXCI6IFwiNDU1XCIsXG4gICAgICAgIFwicHJvZHVjdE5hbWVcIjogbnVsbCxcbiAgICAgICAgXCJsYW5ndWFnZXNcIjogW1xuICAgICAgICAgIFwiRW5nbGlzaFwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiYnJhbmRcIjogXCJEeW5hc29uaWNzXCIsXG4gICAgICAgIFwiYnJhbmRzXCI6IFtcbiAgICAgICAgICBcIkR5bmFzb25pY3NcIlxuICAgICAgICBdLFxuICAgICAgICBcImRvd25sb2FkVHlwZVwiOiBcIlNvZnR3YXJlXCIsXG4gICAgICAgIFwiZG9jdW1lbnROYW1lXCI6IFwiRHluYWNvbmljcyBGbG93IE1ldGVyIFRvb2xcIixcbiAgICAgICAgXCJyZWxlYXNlTm90ZXNcIjogbnVsbFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiUmVzZWFyY2ggQ29udHJvbCBWYWx2ZSAoUkNWKVwiLFxuICAgICAgICBcIm5hbWVcIjogXCJSQ1YgU0VWQSAxMDAgRXRoZXJOZXQvSVAgRHJpdmVyXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIlNvZnR3YXJlIHwgVXBkYXRlZCBBdWd1c3QgMTksIDIwMjAgfCAzIEtCXCIsXG4gICAgICAgIFwiZG93bmxvYWRVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3Jpd3puaW9zaGcvb3JpZ2luYWwvUkNWJTIwU0VWQSUyMDEwMCUyMEV0aGVyTmV0SVAlMjBEcml2ZXIuemlwP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZG93bmxvYWRIcmVmXCI6IFwiI2Rvd25sb2FkaHJlZlwiLFxuICAgICAgICBcInZpZXdEZXRhaWxzVXJsXCI6IFwiL3NvZnR3YXJlLWZpcm13YXJlL3Jjdi1zZXZhLTEwMC1ldGhlcm5ldC1pcC1kcml2ZXIvXCIsXG4gICAgICAgIFwiaWRcIjogXCI0NDRcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBudWxsLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBbXG4gICAgICAgICAgXCJFbmdsaXNoXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJicmFuZFwiOiBcIlJlc2VhcmNoIENvbnRyb2wgVmFsdmUgKFJDVilcIixcbiAgICAgICAgXCJicmFuZHNcIjogW1xuICAgICAgICAgIFwiUmVzZWFyY2ggQ29udHJvbCBWYWx2ZSAoUkNWKVwiXG4gICAgICAgIF0sXG4gICAgICAgIFwiZG93bmxvYWRUeXBlXCI6IFwiU29mdHdhcmVcIixcbiAgICAgICAgXCJkb2N1bWVudE5hbWVcIjogXCJSQ1YgU0VWQSAxMDAgRXRoZXJOZXQvSVAgRHJpdmVyXCIsXG4gICAgICAgIFwicmVsZWFzZU5vdGVzXCI6IG51bGxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIkNvcmlvbGlzXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkNvcmlvbGlzIFJDVCBDYWxjIFNlbGVjdGlvbiBUb29sXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIlNvZnR3YXJlIHwgVXBkYXRlZCBBdWd1c3QgMTksIDIwMjAgfCAyMS43MyBNQlwiLFxuICAgICAgICBcImRvd25sb2FkVXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9yeWwwZmNhZTZ2L29yaWdpbmFsL0NvcmlvbGlzJTIwUkNUJTIwQ2FsYyUyMFNlbGVjdGlvbiUyMFRvb2wuemlwP2Rvd25sb2FkPXRydWUmeC5hcHA9YXBpXCIsXG4gICAgICAgIFwiZG93bmxvYWRIcmVmXCI6IFwiI2Rvd25sb2FkaHJlZlwiLFxuICAgICAgICBcInZpZXdEZXRhaWxzVXJsXCI6IFwiL3NpemluZy1hbmQtc2VsZWN0aW9uLXRvb2xzL2NvcmlvbGlzLXJjdGNhbGMtc2VsZWN0aW9uLXRvb2wvXCIsXG4gICAgICAgIFwiaWRcIjogXCI0NjBcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBudWxsLFxuICAgICAgICBcImxhbmd1YWdlc1wiOiBbXG4gICAgICAgICAgXCJFbmdsaXNoXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJicmFuZFwiOiBcIkNvcmlvbGlzXCIsXG4gICAgICAgIFwiYnJhbmRzXCI6IFtcbiAgICAgICAgICBcIkNvcmlvbGlzXCJcbiAgICAgICAgXSxcbiAgICAgICAgXCJkb3dubG9hZFR5cGVcIjogXCJTb2Z0d2FyZVwiLFxuICAgICAgICBcImRvY3VtZW50TmFtZVwiOiBcIkNvcmlvbGlzIFJDVCBDYWxjIFNlbGVjdGlvbiBUb29sXCIsXG4gICAgICAgIFwicmVsZWFzZU5vdGVzXCI6IG51bGxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIk1vZE1BR1wiLFxuICAgICAgICBcIm5hbWVcIjogXCJNb2RNQUcgTTUwMDAgRmlybXdhcmVcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiRmlybXdhcmUgfCBWZXJzaW9uIHYyLjAuMjUgfCBVcGRhdGVkIEF1Z3VzdCAxOSwgMjAyMCB8IDUzIEtCXCIsXG4gICAgICAgIFwiZG93bmxvYWRVcmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50Lzc2N2tzY2x2Y28vb3JpZ2luYWwvTW9kTUFHJTIwTTUwMDAlMjBGaXJtd2FyZS12Mi4wLjI1LnppcD9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImRvd25sb2FkSHJlZlwiOiBcIiNkb3dubG9hZGhyZWZcIixcbiAgICAgICAgXCJ2aWV3RGV0YWlsc1VybFwiOiBcIi9zb2Z0d2FyZS1maXJtd2FyZS9tb2RtYWctbTUwMDAtZmlybXdhcmUvXCIsXG4gICAgICAgIFwiaWRcIjogXCI0NDJcIixcbiAgICAgICAgXCJwcm9kdWN0TmFtZVwiOiBcIk01MDAwXCIsXG4gICAgICAgIFwibGFuZ3VhZ2VzXCI6IFtcbiAgICAgICAgICBcIkVuZ2xpc2hcIlxuICAgICAgICBdLFxuICAgICAgICBcImJyYW5kXCI6IFwiTW9kTUFHXCIsXG4gICAgICAgIFwiYnJhbmRzXCI6IFtcbiAgICAgICAgICBcIk1vZE1BR1wiXG4gICAgICAgIF0sXG4gICAgICAgIFwiZG93bmxvYWRUeXBlXCI6IFwiRmlybXdhcmVcIixcbiAgICAgICAgXCJkb2N1bWVudE5hbWVcIjogXCJNb2RNQUcgTTUwMDAgRmlybXdhcmVcIixcbiAgICAgICAgXCJyZWxlYXNlTm90ZXNcIjogbnVsbFxuICAgICAgfVxuICAgIF0sXG4gICAgXCJzYXZlZEl0ZW1zQ291bnRcIjogMCxcbiAgICBcInRvdGFsUmVzdWx0c1wiOiA2MCxcbiAgICBcInJlbGVhc2VOb3Rlc0xhYmVsXCI6IFwicmVsZWFzZSBub3RlcyBsYWJlbFwiXG4gIH0sXG4gIFwiZG9jdW1lbnRhdGlvblwiOiB7XG4gICAgXCJyZXN1bHRzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiQVBQTElDQVRJT04gREFUQSBTSEVFVFwiLFxuICAgICAgICBcIm5hbWVcIjogXCJMTV9MTS1PR0EtT0dUQUVSX1pVTF9NSURfMDFfMjAxMlwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkVuZ2xpc2hcIixcbiAgICAgICAgXCJ1cmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2ZqY2RvcGNsM24vb3JpZ2luYWwvSU9HLVBTLTAwMTM3LUVOX0luZHVzdHJpYWwlMjBPdmFsJTIwR2VhciUyMElubGluZSUyMGFuZCUyMEZsYW5nZWQlMjBNZXRlcnMlMjBhbmQlMjBSZWdpc3RlciUyMFBhcnRzLnBkZj9kb3dubG9hZD10cnVlJnguYXBwPWFwaVwiLFxuICAgICAgICBcImlkXCI6IFwiMzVcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwiYWJjLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNQU5VQUxTICYgR1VJREVTXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVsZWN0cm9tYWduZXRpYyBmbG93IG1ldGVyIHVzZXIgbWFudWFsXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMCwgdGVzdDEsIHRlc3QyLHRlc3QzLCB0ZXN0NCwgdGVzdDVcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkZyZW5jaFwiLFxuICAgICAgICBcInVybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvaGl2N3ZkNjl1by9vcmlnaW5hbC9UVE0tU1MtMDMxMjUtRU5fRHluYXNvbmljcyBURlgtNTAwMCBGbG93IE1ldGVyIFNwZWNpZmljYXRpb25zLmRvY3g/ZG93bmxvYWQ9dHJ1ZVwiLFxuICAgICAgICBcImlkXCI6IFwiMzZcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwiZGVmLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNQU5VQUxTICYgR1VJREVTXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlRlc3QgaXRlbSAzXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRnJlbmNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiMzdcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwiZ2hpLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJBUFBMSUNBVElPTiBEQVRBIFNIRUVUXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVsZWN0cm9tYWduZXRpYyBmbG93IG1ldGVyIGRhdGEgc2hlZXRcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwLCB0ZXN0LCB0ZXN0LCB0ZXN0LCB0ZXN0LCB0ZXN0XCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIjogXCJFbmdsaXNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiMzhcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwiamtsLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNQU5VQUxTICYgR1VJREVTXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVsZWN0cm9tYWduZXRpYyBmbG93IG1ldGVyIHVzZXIgbWFudWFsXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRnJlbmNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiMzlcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwibW5vLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNQU5VQUxTICYgR1VJREVTXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlRlc3QgaXRlbSAzXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRnJlbmNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiNDBcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwicHJxLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNQU5VQUxTICYgR1VJREVTXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlRlc3QgaXRlbSAzXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRnJlbmNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiNDFcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwiYWJjLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNQU5VQUxTICYgR1VJREVTXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlRlc3QgaXRlbSAzXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRnJlbmNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiNDJcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwiYWJjLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNQU5VQUxTICYgR1VJREVTXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlRlc3QgaXRlbSAzXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRnJlbmNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiNDNcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwiYWJjLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJNQU5VQUxTICYgR1VJREVTXCIsXG4gICAgICAgIFwibmFtZVwiOiBcIlRlc3QgaXRlbSAzXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRnJlbmNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiNDRcIixcbiAgICAgICAgXCJkb2N1bWVudElkXCI6IFwiYWJjLTAwMC0wMDAwLTAwMFwiXG4gICAgICB9XG4gICAgXSxcbiAgICBcInRvdGFsUmVzdWx0c1wiOiA4OFxuICB9LFxuICBcImRvY3VtZW50YXRpb25UZXN0XCI6IHtcbiAgICBcInJlc3VsdHNcIjogW1xuICAgICAge1xuICAgICAgICBcImV5ZWJyb3dcIjogXCJBUFBMSUNBVElPTiBEQVRBIFNIRUVUIHRlc3RcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiRWxlY3Ryb21hZ25ldGljIGZsb3cgbWV0ZXIgZGF0YSBzaGVldFwiLFxuICAgICAgICBcImRldGFpbHNcIjogXCJNb2RNQUcgTS1TZXJpZXMgTTIwMDBcIixcbiAgICAgICAgXCJsYW5ndWFnZVwiOiBcIkVuZ2xpc2hcIixcbiAgICAgICAgXCJ1cmxcIjogXCJodHRwczovL3dpZGVuLmJhZGdlcm1ldGVyLmNvbS9kYW1zdHVmZi9kb2N1bWVudC5kb2N4XCIsXG4gICAgICAgIFwiaWRcIjogXCIzNTBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiTUFOVUFMUyAmIEdVSURFUyB0ZXN0XCIsXG4gICAgICAgIFwibmFtZVwiOiBcIkVsZWN0cm9tYWduZXRpYyBmbG93IG1ldGVyIHVzZXIgbWFudWFsXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk1vZE1BRyBNLVNlcmllcyBNMjAwMFwiLFxuICAgICAgICBcImxhbmd1YWdlXCI6IFwiRnJlbmNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiMzYwXCJcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIFwiZXllYnJvd1wiOiBcIk1BTlVBTFMgJiBHVUlERVNcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiVGVzdCBpdGVtIDNcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiTW9kTUFHIE0tU2VyaWVzIE0yMDAwXCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIjogXCJGcmVuY2hcIixcbiAgICAgICAgXCJ1cmxcIjogXCJodHRwczovL3dpZGVuLmJhZGdlcm1ldGVyLmNvbS9kYW1zdHVmZi9kb2N1bWVudC5kb2N4XCIsXG4gICAgICAgIFwiaWRcIjogXCIzNzBcIlxuICAgICAgfVxuICAgIF0sXG4gICAgXCJ0b3RhbFJlc3VsdHNcIjogMTFcbiAgfSxcbiAgXCJsZWdhbFwiOiB7XG4gICAgXCJyZXN1bHRzXCI6IFtcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiUHVyY2hhc2UgdGVybXNcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiUHVyY2hhc2Ugb3JkZXIgLSBnZW5lcmFsIHRlcm1zIGFuZCBjb25kaXRpb25zXCIsXG4gICAgICAgIFwiZGV0YWlsc1wiOiBcIk5vcnRoIEFtZXJpY2EsIHRlc3QyLCB0ZXN0MywgdGVzdDQsIHRlc3Q1XCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIjogXCJFbmdsaXNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiNDBcIlxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgXCJleWVicm93XCI6IFwiU2FsZXMgdGVybXNcIixcbiAgICAgICAgXCJuYW1lXCI6IFwiQmFkZ2VyIE1ldGVyIHNhbGVzIHRlcm1zIGFuZCBvbmRpdGlvbnNcIixcbiAgICAgICAgXCJkZXRhaWxzXCI6IFwiTm9ydGggQW1lcmljYSwgdGVzdDEsIHRlc3QyXCIsXG4gICAgICAgIFwibGFuZ3VhZ2VcIjogXCJFbmdsaXNoXCIsXG4gICAgICAgIFwidXJsXCI6IFwiaHR0cHM6Ly93aWRlbi5iYWRnZXJtZXRlci5jb20vZGFtc3R1ZmYvZG9jdW1lbnQuZG9jeFwiLFxuICAgICAgICBcImlkXCI6IFwiNzBcIlxuICAgICAgfVxuICAgIF0sXG4gICAgXCJ0b3RhbFJlc3VsdHNcIjogNjdcbiAgfSxcbiAgXCJ2YWxpZGF0ZUlkc1wiOiB7XG4gICAgXCJzdWNjZXNzXCI6IFwidHJ1ZVwiLFxuICAgIFwicmVzdWx0c1wiOiB7XG4gICAgICBcImludmFsaWRJZHNcIjogW1xuICAgICAgICAxMCxcbiAgICAgICAgNSxcbiAgICAgICAgMTEwLFxuICAgICAgICAyXG4gICAgICBdLFxuICAgICAgXCJkb2N1bWVudElkc1wiOiBbXG4gICAgICAgIDM1LFxuICAgICAgICA0MVxuICAgICAgXSxcbiAgICAgIFwic29mdHdhcmVJZHNcIjogW1xuICAgICAgICA3NFxuICAgICAgXSxcbiAgICAgIFwicHJvZHVjdElkc1wiOiBbXG4gICAgICAgIDExLFxuICAgICAgICAyMCxcbiAgICAgICAgMzUsXG4gICAgICAgIDhcbiAgICAgIF0sXG4gICAgICBcImFydGljbGVJZHNcIjogW11cbiAgICB9XG4gIH0sXG4gIFwiYmVhY29ucmVmc1wiOiB7XG4gICAgXCJzdWNjZXNzXCI6IHRydWUsXG4gICAgXCJjb250ZW50XCI6IHtcbiAgICAgIFwiY2hhdF9kb2NfaWRcIjogXCIyNWNmMTE3ZmVmMTU0MjFlODEzNzM5ZmY2MjA0Y2VkYlwiLFxuICAgICAgXCJwcm9tcHRfaW50ZW50XCI6IFwiR0VORVJBTF9RVUVTVElPTlwiLFxuICAgICAgXCJyZXNwb25zZVwiOiBcIlRoZSBmb2xsb3dpbmcgcmVmZXJlbmNlcyB3ZXJlIGlkZW50aWZpZWQgaW4gdGhlIHNlYXJjaDpcIixcbiAgICAgIFwic291cmNlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiQkFER0VSX01FVEVSX1NJVEVfREFNXCIsXG4gICAgICAgICAgXCJkYXRlX2NyZWF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQyKzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3B1Ymxpc2hlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDIrMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfdXBkYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDIrMDA6MDBcIixcbiAgICAgICAgICBcInNvdXJjZVwiOiBcIktOTlwiLFxuICAgICAgICAgIFwic291cmNlX2xhbmd1YWdlXCI6IFwiZW5cIixcbiAgICAgICAgICBcInNvdXJjZV9wYWdlX251bWJlclwiOiBudWxsLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L29uaWk1Y2R3N20vb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlfZnVsbFwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvb25paTVjZHc3bS9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGh1bWJuYWlsXCI6IFwiaHR0cHM6Ly9hcXVhZmxvLmJlYWNvbmFtYS1zdGFnaW5nLm5ldC92XzZfNC90aHVtYm5haWxzL2RhbS85YWM3ZDk2MmQ0ZTU4OGJkNzFiMzlmZDVhNDMxMjVhN2UzNTMwZDNkNmU4ZmFkNDkzMzcxZGEzNTk4ZDU1YzY3LnBuZ1wiLFxuICAgICAgICAgIFwic291cmNlX3RpdGxlXCI6IFwiUlRTLURTLTAwMzIwLUVOXFxcXF9SZWNvcmRhbGwgVHVyYm8gU2VyaWVzIE1ldGVycyBNb2RlbHMgMTYwLCAyMDAsIDQ1MCwgMTAwMCwgMjAwMCwgMzUwMCwgNTUwMCwgNjIwMFwiLFxuICAgICAgICAgIFwic291cmNlX3VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvb25paTVjZHc3bS9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkJBREdFUl9NRVRFUl9TSVRFXCIsXG4gICAgICAgICAgXCJkYXRlX2NyZWF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIyOjA3KzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3B1Ymxpc2hlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjI6MDcrMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfdXBkYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjI6MDcrMDA6MDBcIixcbiAgICAgICAgICBcInNvdXJjZVwiOiBcIktOTlwiLFxuICAgICAgICAgIFwic291cmNlX2xhbmd1YWdlXCI6IFwiZW5cIixcbiAgICAgICAgICBcInNvdXJjZV9wYWdlX251bWJlclwiOiBudWxsLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3ZvZGV0eGt5eGgvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlfZnVsbFwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvdm9kZXR4a3l4aC9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGh1bWJuYWlsXCI6IFwiaHR0cHM6Ly9hcXVhZmxvLmJlYWNvbmFtYS1zdGFnaW5nLm5ldC92XzZfNC90aHVtYm5haWxzL2Ntcy8yNGEyNzBhMjU5NzcyNmY0ZGNhNzEwN2EzYzBiNTNjMjE4ZmYwZmM3NTA4NGRjNmUxNTEzMzE5OGRlNjMxZmE0LnBuZ1wiLFxuICAgICAgICAgIFwic291cmNlX3RpdGxlXCI6IFwiXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC92b2RldHhreXhoL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiQkFER0VSX01FVEVSX1NJVEVcIixcbiAgICAgICAgICBcImRhdGVfY3JlYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjM6MzUrMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfcHVibGlzaGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMzozNSswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV91cGRhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMzozNSswMDowMFwiLFxuICAgICAgICAgIFwic291cmNlXCI6IFwiS05OXCIsXG4gICAgICAgICAgXCJzb3VyY2VfbGFuZ3VhZ2VcIjogXCJlblwiLFxuICAgICAgICAgIFwic291cmNlX3BhZ2VfbnVtYmVyXCI6IG51bGwsXG4gICAgICAgICAgXCJzb3VyY2Vfc3VtbWFyeVwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvYWllbHdxdGZmZS9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2Vfc3VtbWFyeV9mdWxsXCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9haWVsd3F0ZmZlL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV90aHVtYm5haWxcIjogXCJodHRwczovL2FxdWFmbG8uYmVhY29uYW1hLXN0YWdpbmcubmV0L3ZfNl80L3RodW1ibmFpbHMvY21zL2EyMzZjZWVjZWI5Nzg2MjI5NDYyM2UyOWE3NDk4YTY2OTgzN2U3ZDE2YTg1YjkyMDllZGZhMmIwMGI0NmRlYjQucG5nXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGl0bGVcIjogXCJcIixcbiAgICAgICAgICBcInNvdXJjZV91cmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2FpZWx3cXRmZmUvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJCQURHRVJfTUVURVJfU0lURV9EQU1cIixcbiAgICAgICAgICBcImRhdGVfY3JlYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDErMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfcHVibGlzaGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMTo0MSswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV91cGRhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMTo0MSswMDowMFwiLFxuICAgICAgICAgIFwic291cmNlXCI6IFwiS05OXCIsXG4gICAgICAgICAgXCJzb3VyY2VfbGFuZ3VhZ2VcIjogXCJlblwiLFxuICAgICAgICAgIFwic291cmNlX3BhZ2VfbnVtYmVyXCI6IG51bGwsXG4gICAgICAgICAgXCJzb3VyY2Vfc3VtbWFyeVwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvemprajcydGpzMi9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2Vfc3VtbWFyeV9mdWxsXCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96amtqNzJ0anMyL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV90aHVtYm5haWxcIjogXCJodHRwczovL2FxdWFmbG8uYmVhY29uYW1hLXN0YWdpbmcubmV0L3ZfNl80L3RodW1ibmFpbHMvZGFtLzM1ZTc4Yzg5ZjFmMjVlMzk2MzZmZDhkZTk4Mjg4NzQzYmM5ZDdhOGM3M2ZmZTEzNDg0YmZmM2MzNTAwMDkxYjcucG5nXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGl0bGVcIjogXCJPUklPTiBFbmRwb2ludCBVdGlsaXR5IDIuNy5YIGZvciBUcmltYmxlIFJhbmdlciAzIE1hbnVhbCAoT1JJLVVNLTAwODAyLUVOKS5wZGZcIixcbiAgICAgICAgICBcInNvdXJjZV91cmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3pqa2o3MnRqczIvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJCQURHRVJfTUVURVJfU0lURV9EQU1cIixcbiAgICAgICAgICBcImRhdGVfY3JlYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDErMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfcHVibGlzaGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMTo0MSswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV91cGRhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMTo0MSswMDowMFwiLFxuICAgICAgICAgIFwic291cmNlXCI6IFwiS05OXCIsXG4gICAgICAgICAgXCJzb3VyY2VfbGFuZ3VhZ2VcIjogXCJlblwiLFxuICAgICAgICAgIFwic291cmNlX3BhZ2VfbnVtYmVyXCI6IG51bGwsXG4gICAgICAgICAgXCJzb3VyY2Vfc3VtbWFyeVwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvemprajcydGpzMi9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2Vfc3VtbWFyeV9mdWxsXCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96amtqNzJ0anMyL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV90aHVtYm5haWxcIjogXCJodHRwczovL2FxdWFmbG8uYmVhY29uYW1hLXN0YWdpbmcubmV0L3ZfNl80L3RodW1ibmFpbHMvZGFtLzM1ZTc4Yzg5ZjFmMjVlMzk2MzZmZDhkZTk4Mjg4NzQzYmM5ZDdhOGM3M2ZmZTEzNDg0YmZmM2MzNTAwMDkxYjcucG5nXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGl0bGVcIjogXCJPUklPTiBFbmRwb2ludCBVdGlsaXR5IDIuNy5YIGZvciBUcmltYmxlIFJhbmdlciAzIE1hbnVhbCAoT1JJLVVNLTAwODAyLUVOKS5wZGZcIixcbiAgICAgICAgICBcInNvdXJjZV91cmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3pqa2o3MnRqczIvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpXCJcbiAgICAgICAgfVxuICAgICAgXSxcbiAgICAgIFwic3RhdHVzXCI6IFwiR0VORVJBVEVfQU5TV0VSX0VORFwiLFxuICAgICAgXCJ0b29rX3NlY3NcIjogMC41MyxcbiAgICAgIFwiYW5vbnltb3VzX2lkXCI6IFwiOTg2ZjdmYjI1ZWY5NGQ0M2EzNjMyMTA2OGQyZTAxYjRcIlxuICAgIH1cbiAgfSxcbiAgXCJiZWFjb25kb2NzXCI6IHtcbiAgICBcInN1Y2Nlc3NcIjogdHJ1ZSxcbiAgICBcImNvbnRlbnRcIjoge1xuICAgICAgXCJjaGF0X2RvY19pZFwiOiBcIjA4NjhiZWUxYjFlMjRmY2ZiZTQ1NzViODFhMmU5ZGZlXCIsXG4gICAgICBcImNvbmZpZGVuY2VfbGV2ZWxcIjogbnVsbCxcbiAgICAgIFwiZGlzY2xhaW1lclwiOiBcIlRoaXMgaW5mb3JtYXRpb24gd2FzIGdlbmVyYXRlZCBieSBhbiBBSSBzeXN0ZW0gYW5kIHNob3VsZCBub3QgYmUgc29sZWx5IHJlbGllZCB1cG9uIGZvciBkZWNpc2lvbi1tYWtpbmcuIEFsd2F5cyB2ZXJpZnkgaW5mb3JtYXRpb24gd2l0aCBjcmVkaWJsZSBzb3VyY2VzIGFuZCBjb25zdWx0IHdpdGggcmVsZXZhbnQgZXhwZXJ0cyBiZWZvcmUgdGFraW5nIGFueSBhY3Rpb24gYmFzZWQgb24gQUktZ2VuZXJhdGVkIGNvbnRlbnQuXCIsXG4gICAgICBcInByZWZlcnJlZF9sYW5ndWFnZVwiOiBcImVuXCIsXG4gICAgICBcInByb21wdF9pbnRlbnRcIjogXCJHRU5FUkFMX1FVRVNUSU9OXCIsXG4gICAgICBcInJlbGF0ZWRfcXVlc3Rpb25zXCI6IFtcbiAgICAgICAgXCJXaGF0IGFyZSB0aGUgc3RlcHMgdG8gY2xlYXIgYSB0YW1wZXIgY29uZGl0aW9uIG9uIGFuIGVuZHBvaW50P1wiLFxuICAgICAgICBcIkhvdyBjYW4gaSB0cm91Ymxlc2hvb3QgY29tbW9uIGlzc3VlcyByZWxhdGVkIHRvIGVuZHBvaW50IHRhbXBlcmluZz9cIlxuICAgICAgXSxcbiAgICAgIFwicmVzcG9uc2VcIjogXCJUaGUgTW9kTUFHIGRvY3VtZW50YXRpb24gcHJvdmlkZXMgZGV0YWlsZWQgaW5mb3JtYXRpb24gb24gdGhlIGluc3RhbGxhdGlvbiwgb3BlcmF0aW9uLCBhbmQgbWFpbnRlbmFuY2Ugb2YgQmFkZ2VyIE1ldGVyJ3MgTW9kTUFHIGZsb3cgbWV0ZXJzLiBIZXJlIGFyZSBzb21lIGtleSBwb2ludHMgZXh0cmFjdGVkIGZyb20gdGhlIGRvY3VtZW50YXRpb246XFxuXFxuMS4gKipJbnN0YWxsYXRpb24gUmVxdWlyZW1lbnRzKio6XFxuICAgLSBUZW1wZXJhdHVyZSBzZW5zb3JzIG11c3QgYmUgY29ubmVjdGVkIHRvIHNwZWNpZmljIGNsYW1wczogdGhlIGlubGV0IGZsb3cgdGVtcGVyYXR1cmUgc2Vuc29yIHRvIGNsYW1wcyA1IGFuZCA2LCBhbmQgdGhlIG91dGxldCBmbG93IHRlbXBlcmF0dXJlIHNlbnNvciB0byBjbGFtcHMgNyBhbmQgOC4gVGhlIGNvbG9yIG9mIHRoZSB3aXJlcyBkb2VzIG5vdCBtYXR0ZXIsIGJ1dCBjb25uZWN0aW9ucyBtdXN0IGJlIHRpZ2h0IFsqKjIqKl0uXFxuICAgLSBUaGUgcHVsc2Ugb3V0cHV0IG9mIHRoZSBmbG93IG1ldGVyIG11c3QgbWF0Y2ggdGhlIGNhbGN1bGF0b3IgaW5wdXQgcHVsc2UgdmFsdWUuIEZvciBmbG93IG1ldGVycyB3aXRoIG9wZW4gY29sbGVjdG9yIGNvbm5lY3Rpb25zLCBlbnN1cmUgdGhlIHBvbGFyaXR5IGlzIGNvcnJlY3QgWyoqMioqXS5cXG5cXG4yLiAqKkZsb3cgTWV0ZXIgU3BlY2lmaWNhdGlvbnMqKjpcXG4gICAtIEZsb3cgbWV0ZXJzIHNob3VsZCBjb21wbHkgd2l0aCBDbGFzcyBPQSAocmVlZCBjb250YWN0KSBhbmQgQ2xhc3MgT0MgKG9wZW4gY29sbGVjdG9yKSBzdGFuZGFyZHMgYWNjb3JkaW5nIHRvIEVOIDE0MzQtMjogMjAxNS4gVGhlIG1heGltdW0gaW5wdXQgZnJlcXVlbmN5IGlzIDEwIEh6LCB3aXRoIGEgcHVsc2UgbGVuZ3RoIG9mIGF0IGxlYXN0IDI1IG1zIGFuZCBhIHB1bHNlIHBhdXNlIG9mIGF0IGxlYXN0IDUwIG1zIFsqKjIqKl0uXFxuXFxuMy4gKipPcGVyYXRpb24gR3VpZGVsaW5lcyoqOlxcbiAgIC0gQmVmb3JlIHN0YXJ0aW5nIG9wZXJhdGlvbiwgZW5zdXJlIHRoYXQgdGhlIGZsb3cgbWV0ZXIgaXMgdGhlIGNvcnJlY3Qgc2l6ZSwgdGhlIGRpcmVjdGlvbmFsIGFycm93IG1hdGNoZXMgdGhlIGZsb3cgZGlyZWN0aW9uLCBhbmQgdGhlcmUgYXJlIG5vIGxlYWtzLiBBZGRpdGlvbmFsbHksIGNoZWNrIHRoYXQgdGhlIGhlYXRpbmcvY29vbGluZyBzeXN0ZW0gaXMgY2xlYXIgb2YgY2xvZ3MgWyoqMioqXS5cXG5cXG40LiAqKk1haW50ZW5hbmNlIFByb2NlZHVyZXMqKjpcXG4gICAtIFJlZ3VsYXIgY2xlYW5pbmcgb2YgdGhlIGZsb3cgdHViZSBhbmQgZWxlY3Ryb2RlcyBtYXkgYmUgbmVjZXNzYXJ5LCBkZXBlbmRpbmcgb24gdGhlIHByb3BlcnRpZXMgb2YgdGhlIHByb2Nlc3MgZmx1aWQuIFVzZSBpc29wcm9weWwgYWxjb2hvbCBvciBjbGVhbiB3YXRlciBmb3IgY2xlYW5pbmcsIGVuc3VyaW5nIGNvbXBhdGliaWxpdHkgd2l0aCB0aGUgbWVhc3VyZWQgZmx1aWQgWyoqNCoqXS5cXG4gICAtIEZ1c2UgcmVwbGFjZW1lbnQgc2hvdWxkIG9ubHkgYmUgcGVyZm9ybWVkIGJ5IGF1dGhvcml6ZWQgcGVyc29ubmVsLCBhbmQgdGhlIHNhbWUgdHlwZSBhbmQgcmF0aW5nIG9mIGZ1c2VzIG11c3QgYmUgdXNlZCBbKio0KipdLlxcblxcbjUuICoqVGVjaG5pY2FsIFN1cHBvcnQqKjpcXG4gICAtIElmIGlzc3VlcyBhcmlzZSB3aXRoIHRoZSBtZXRlciwgaXQgaXMgcmVjb21tZW5kZWQgdG8gY29udGFjdCBCYWRnZXIgTWV0ZXIncyB0ZWNobmljYWwgc3VwcG9ydCBmb3IgYXNzaXN0YW5jZSwgZXNwZWNpYWxseSBpZiBhIHByb2JsZW0gYXBwZWFycyB0byBvcmlnaW5hdGUgZnJvbSB0aGUgcHJpbnRlZCBjaXJjdWl0IGJvYXJkIChQQ0IpIFsqKjQqKl0uXFxuXFxuRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24sIGluY2x1ZGluZyBzcGVjaWZpYyBpbnN0YWxsYXRpb24gZGlhZ3JhbXMgYW5kIHRlY2huaWNhbCBzcGVjaWZpY2F0aW9ucywgeW91IGNhbiByZWZlciB0byB0aGUgb2ZmaWNpYWwgQmFkZ2VyIE1ldGVyIGRvY3VtZW50YXRpb24gYXZhaWxhYmxlIG9uIHRoZWlyIHdlYnNpdGUgWyoqMSoqXS5cXG5cXG5JZiB5b3UgaGF2ZSBzcGVjaWZpYyBhc3BlY3RzIG9mIHRoZSBNb2RNQUcgZG9jdW1lbnRhdGlvbiB5b3Ugd291bGQgbGlrZSB0byBleHBsb3JlIGZ1cnRoZXIsIHBsZWFzZSBsZXQgbWUga25vdyFcXG5cXG5cIixcbiAgICAgIFwic291cmNlc1wiOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiQkFER0VSX01FVEVSX1NJVEVfREFNXCIsXG4gICAgICAgICAgXCJkYXRlX2NyZWF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQyKzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3B1Ymxpc2hlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDIrMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfdXBkYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDIrMDA6MDBcIixcbiAgICAgICAgICBcInNvdXJjZVwiOiBcIktOTlwiLFxuICAgICAgICAgIFwic291cmNlX2xhbmd1YWdlXCI6IFwiZW5cIixcbiAgICAgICAgICBcInNvdXJjZV9wYWdlX251bWJlclwiOiBudWxsLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L29uaWk1Y2R3N20vb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlfZnVsbFwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvb25paTVjZHc3bS9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGh1bWJuYWlsXCI6IFwiaHR0cHM6Ly9hcXVhZmxvLmJlYWNvbmFtYS1zdGFnaW5nLm5ldC92XzZfNC90aHVtYm5haWxzL2RhbS85YWM3ZDk2MmQ0ZTU4OGJkNzFiMzlmZDVhNDMxMjVhN2UzNTMwZDNkNmU4ZmFkNDkzMzcxZGEzNTk4ZDU1YzY3LnBuZ1wiLFxuICAgICAgICAgIFwic291cmNlX3RpdGxlXCI6IFwiT1JJT04gRmllbGQgQXBwbGljYXRpb24gNC4zLjAgZm9yIFRyaW1ibGUgUmFuZ2VyIDMgd2l0aCBSZWFkQ2VudGVyIE1hbnVhbCAoT1JJLVVNLTAwMTg1LUVOKS5wZGZcIixcbiAgICAgICAgICBcInNvdXJjZV91cmxcIjogXCJodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L29uaWk1Y2R3N20vb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgIFwiY2F0ZWdvcnlcIjogXCJCQURHRVJfTUVURVJfU0lURVwiLFxuICAgICAgICAgIFwiZGF0ZV9jcmVhdGVkXCI6IFwiMjAyNC0wNi0yN1QxNToyMjowNyswMDowMFwiLFxuICAgICAgICAgIFwiZGF0ZV9wdWJsaXNoZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIyOjA3KzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3VwZGF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIyOjA3KzAwOjAwXCIsXG4gICAgICAgICAgXCJzb3VyY2VcIjogXCJLTk5cIixcbiAgICAgICAgICBcInNvdXJjZV9sYW5ndWFnZVwiOiBcImVuXCIsXG4gICAgICAgICAgXCJzb3VyY2VfcGFnZV9udW1iZXJcIjogbnVsbCxcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5XCI6IFwiW1JlYWQgbW9yZS4uLl0oaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC92b2RldHhreXhoL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaSlcIixcbiAgICAgICAgICBcInNvdXJjZV9zdW1tYXJ5X2Z1bGxcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3ZvZGV0eGt5eGgvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3RodW1ibmFpbFwiOiBcImh0dHBzOi8vYXF1YWZsby5iZWFjb25hbWEtc3RhZ2luZy5uZXQvdl82XzQvdGh1bWJuYWlscy9jbXMvMjRhMjcwYTI1OTc3MjZmNGRjYTcxMDdhM2MwYjUzYzIxOGZmMGZjNzUwODRkYzZlMTUxMzMxOThkZTYzMWZhNC5wbmdcIixcbiAgICAgICAgICBcInNvdXJjZV90aXRsZVwiOiBcIlwiLFxuICAgICAgICAgIFwic291cmNlX3VybFwiOiBcImh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvdm9kZXR4a3l4aC9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgXCJjYXRlZ29yeVwiOiBcIkJBREdFUl9NRVRFUl9TSVRFXCIsXG4gICAgICAgICAgXCJkYXRlX2NyZWF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIzOjM1KzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3B1Ymxpc2hlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjM6MzUrMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfdXBkYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjM6MzUrMDA6MDBcIixcbiAgICAgICAgICBcInNvdXJjZVwiOiBcIktOTlwiLFxuICAgICAgICAgIFwic291cmNlX2xhbmd1YWdlXCI6IFwiZW5cIixcbiAgICAgICAgICBcInNvdXJjZV9wYWdlX251bWJlclwiOiBudWxsLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L2FpZWx3cXRmZmUvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlfZnVsbFwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvYWllbHdxdGZmZS9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGh1bWJuYWlsXCI6IFwiaHR0cHM6Ly9hcXVhZmxvLmJlYWNvbmFtYS1zdGFnaW5nLm5ldC92XzZfNC90aHVtYm5haWxzL2Ntcy9hMjM2Y2VlY2ViOTc4NjIyOTQ2MjNlMjlhNzQ5OGE2Njk4MzdlN2QxNmE4NWI5MjA5ZWRmYTJiMDBiNDZkZWI0LnBuZ1wiLFxuICAgICAgICAgIFwic291cmNlX3RpdGxlXCI6IFwiXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC9haWVsd3F0ZmZlL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBcImNhdGVnb3J5XCI6IFwiQkFER0VSX01FVEVSX1NJVEVfREFNXCIsXG4gICAgICAgICAgXCJkYXRlX2NyZWF0ZWRcIjogXCIyMDI0LTA2LTI3VDE1OjIxOjQxKzAwOjAwXCIsXG4gICAgICAgICAgXCJkYXRlX3B1Ymxpc2hlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDErMDA6MDBcIixcbiAgICAgICAgICBcImRhdGVfdXBkYXRlZFwiOiBcIjIwMjQtMDYtMjdUMTU6MjE6NDErMDA6MDBcIixcbiAgICAgICAgICBcInNvdXJjZVwiOiBcIktOTlwiLFxuICAgICAgICAgIFwic291cmNlX2xhbmd1YWdlXCI6IFwiZW5cIixcbiAgICAgICAgICBcInNvdXJjZV9wYWdlX251bWJlclwiOiBudWxsLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlcIjogXCJbUmVhZCBtb3JlLi4uXShodHRwczovL2JhZGdlcm1ldGVyLndpZGVuLm5ldC9jb250ZW50L3pqa2o3MnRqczIvb3JpZ2luYWw/ZG93bmxvYWQ9ZmFsc2UmeC5hcHA9YXBpKVwiLFxuICAgICAgICAgIFwic291cmNlX3N1bW1hcnlfZnVsbFwiOiBcIltSZWFkIG1vcmUuLi5dKGh0dHBzOi8vYmFkZ2VybWV0ZXIud2lkZW4ubmV0L2NvbnRlbnQvemprajcydGpzMi9vcmlnaW5hbD9kb3dubG9hZD1mYWxzZSZ4LmFwcD1hcGkpXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdGh1bWJuYWlsXCI6IFwiaHR0cHM6Ly9hcXVhZmxvLmJlYWNvbmFtYS1zdGFnaW5nLm5ldC92XzZfNC90aHVtYm5haWxzL2RhbS8zNWU3OGM4OWYxZjI1ZTM5NjM2ZmQ4ZGU5ODI4ODc0M2JjOWQ3YThjNzNmZmUxMzQ4NGJmZjNjMzUwMDA5MWI3LnBuZ1wiLFxuICAgICAgICAgIFwic291cmNlX3RpdGxlXCI6IFwiT1JJT04gRW5kcG9pbnQgVXRpbGl0eSAyLjcuWCBmb3IgVHJpbWJsZSBSYW5nZXIgMyBNYW51YWwgKE9SSS1VTS0wMDgwMi1FTikucGRmXCIsXG4gICAgICAgICAgXCJzb3VyY2VfdXJsXCI6IFwiaHR0cHM6Ly9iYWRnZXJtZXRlci53aWRlbi5uZXQvY29udGVudC96amtqNzJ0anMyL29yaWdpbmFsP2Rvd25sb2FkPWZhbHNlJnguYXBwPWFwaVwiXG4gICAgICAgIH1cbiAgICAgIF0sXG4gICAgICBcInN0YXR1c1wiOiBcIkdFTkVSQVRFX0FOU1dFUl9FTkRcIixcbiAgICAgIFwidG9va19zZWNzXCI6IDYuMTMsXG4gICAgICBcImFub255bW91c19pZFwiOiBcImMyNGRiZTU2NDc2YTRiZGM5Mjc3ZjNjZjA0ZjExMzU3XCJcbiAgICB9XG4gIH0sXG4gIFwiYmVhY29uZmVlZGJhY2tcIjoge1xuICAgIFwic3VjY2Vzc1wiOiB0cnVlXG4gIH1cbn0iLCIvKipcbiAqIEBwb3BwZXJqcy9jb3JlIHYyLjQuNCAtIE1JVCBMaWNlbnNlXG4gKi9cblxuJ3VzZSBzdHJpY3QnO1xuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgJ19fZXNNb2R1bGUnLCB7IHZhbHVlOiB0cnVlIH0pO1xuXG5mdW5jdGlvbiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZWxlbWVudCkge1xuICB2YXIgcmVjdCA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHJlY3Qud2lkdGgsXG4gICAgaGVpZ2h0OiByZWN0LmhlaWdodCxcbiAgICB0b3A6IHJlY3QudG9wLFxuICAgIHJpZ2h0OiByZWN0LnJpZ2h0LFxuICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXG4gICAgbGVmdDogcmVjdC5sZWZ0LFxuICAgIHg6IHJlY3QubGVmdCxcbiAgICB5OiByZWN0LnRvcFxuICB9O1xufVxuXG4vKjo6IGltcG9ydCB0eXBlIHsgV2luZG93IH0gZnJvbSAnLi4vdHlwZXMnOyAqL1xuXG4vKjo6IGRlY2xhcmUgZnVuY3Rpb24gZ2V0V2luZG93KG5vZGU6IE5vZGUgfCBXaW5kb3cpOiBXaW5kb3c7ICovXG5mdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkge1xuICBpZiAobm9kZS50b1N0cmluZygpICE9PSAnW29iamVjdCBXaW5kb3ddJykge1xuICAgIHZhciBvd25lckRvY3VtZW50ID0gbm9kZS5vd25lckRvY3VtZW50O1xuICAgIHJldHVybiBvd25lckRvY3VtZW50ID8gb3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyA6IHdpbmRvdztcbiAgfVxuXG4gIHJldHVybiBub2RlO1xufVxuXG5mdW5jdGlvbiBnZXRXaW5kb3dTY3JvbGwobm9kZSkge1xuICB2YXIgd2luID0gZ2V0V2luZG93KG5vZGUpO1xuICB2YXIgc2Nyb2xsTGVmdCA9IHdpbi5wYWdlWE9mZnNldDtcbiAgdmFyIHNjcm9sbFRvcCA9IHdpbi5wYWdlWU9mZnNldDtcbiAgcmV0dXJuIHtcbiAgICBzY3JvbGxMZWZ0OiBzY3JvbGxMZWZ0LFxuICAgIHNjcm9sbFRvcDogc2Nyb2xsVG9wXG4gIH07XG59XG5cbi8qOjogZGVjbGFyZSBmdW5jdGlvbiBpc0VsZW1lbnQobm9kZTogbWl4ZWQpOiBib29sZWFuICVjaGVja3Mobm9kZSBpbnN0YW5jZW9mXG4gIEVsZW1lbnQpOyAqL1xuXG5mdW5jdGlvbiBpc0VsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5FbGVtZW50O1xuICByZXR1cm4gbm9kZSBpbnN0YW5jZW9mIE93bkVsZW1lbnQgfHwgbm9kZSBpbnN0YW5jZW9mIEVsZW1lbnQ7XG59XG4vKjo6IGRlY2xhcmUgZnVuY3Rpb24gaXNIVE1MRWxlbWVudChub2RlOiBtaXhlZCk6IGJvb2xlYW4gJWNoZWNrcyhub2RlIGluc3RhbmNlb2ZcbiAgSFRNTEVsZW1lbnQpOyAqL1xuXG5cbmZ1bmN0aW9uIGlzSFRNTEVsZW1lbnQobm9kZSkge1xuICB2YXIgT3duRWxlbWVudCA9IGdldFdpbmRvdyhub2RlKS5IVE1MRWxlbWVudDtcbiAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBPd25FbGVtZW50IHx8IG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDtcbn1cblxuZnVuY3Rpb24gZ2V0SFRNTEVsZW1lbnRTY3JvbGwoZWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIHNjcm9sbExlZnQ6IGVsZW1lbnQuc2Nyb2xsTGVmdCxcbiAgICBzY3JvbGxUb3A6IGVsZW1lbnQuc2Nyb2xsVG9wXG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldE5vZGVTY3JvbGwobm9kZSkge1xuICBpZiAobm9kZSA9PT0gZ2V0V2luZG93KG5vZGUpIHx8ICFpc0hUTUxFbGVtZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIGdldFdpbmRvd1Njcm9sbChub2RlKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gZ2V0SFRNTEVsZW1lbnRTY3JvbGwobm9kZSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZ2V0Tm9kZU5hbWUoZWxlbWVudCkge1xuICByZXR1cm4gZWxlbWVudCA/IChlbGVtZW50Lm5vZGVOYW1lIHx8ICcnKS50b0xvd2VyQ2FzZSgpIDogbnVsbDtcbn1cblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRFbGVtZW50KGVsZW1lbnQpIHtcbiAgLy8gJEZsb3dGaXhNZTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICByZXR1cm4gKGlzRWxlbWVudChlbGVtZW50KSA/IGVsZW1lbnQub3duZXJEb2N1bWVudCA6IGVsZW1lbnQuZG9jdW1lbnQpLmRvY3VtZW50RWxlbWVudDtcbn1cblxuZnVuY3Rpb24gZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSB7XG4gIC8vIElmIDxodG1sPiBoYXMgYSBDU1Mgd2lkdGggZ3JlYXRlciB0aGFuIHRoZSB2aWV3cG9ydCwgdGhlbiB0aGlzIHdpbGwgYmVcbiAgLy8gaW5jb3JyZWN0IGZvciBSVEwuXG4gIC8vIFBvcHBlciAxIGlzIGJyb2tlbiBpbiB0aGlzIGNhc2UgYW5kIG5ldmVyIGhhZCBhIGJ1ZyByZXBvcnQgc28gbGV0J3MgYXNzdW1lXG4gIC8vIGl0J3Mgbm90IGFuIGlzc3VlLiBJIGRvbid0IHRoaW5rIGFueW9uZSBldmVyIHNwZWNpZmllcyB3aWR0aCBvbiA8aHRtbD5cbiAgLy8gYW55d2F5LlxuICAvLyBCcm93c2VycyB3aGVyZSB0aGUgbGVmdCBzY3JvbGxiYXIgZG9lc24ndCBjYXVzZSBhbiBpc3N1ZSByZXBvcnQgYDBgIGZvclxuICAvLyB0aGlzIChlLmcuIEVkZ2UgMjAxOSwgSUUxMSwgU2FmYXJpKVxuICByZXR1cm4gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSkubGVmdCArIGdldFdpbmRvd1Njcm9sbChlbGVtZW50KS5zY3JvbGxMZWZ0O1xufVxuXG5mdW5jdGlvbiBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpIHtcbiAgcmV0dXJuIGdldFdpbmRvdyhlbGVtZW50KS5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xufVxuXG5mdW5jdGlvbiBpc1Njcm9sbFBhcmVudChlbGVtZW50KSB7XG4gIC8vIEZpcmVmb3ggd2FudHMgdXMgdG8gY2hlY2sgYC14YCBhbmQgYC15YCB2YXJpYXRpb25zIGFzIHdlbGxcbiAgdmFyIF9nZXRDb21wdXRlZFN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSxcbiAgICAgIG92ZXJmbG93ID0gX2dldENvbXB1dGVkU3R5bGUub3ZlcmZsb3csXG4gICAgICBvdmVyZmxvd1ggPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1gsXG4gICAgICBvdmVyZmxvd1kgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5vdmVyZmxvd1k7XG5cbiAgcmV0dXJuIC9hdXRvfHNjcm9sbHxvdmVybGF5fGhpZGRlbi8udGVzdChvdmVyZmxvdyArIG92ZXJmbG93WSArIG92ZXJmbG93WCk7XG59XG5cbi8vIENvbXBvc2l0ZSBtZWFucyBpdCB0YWtlcyBpbnRvIGFjY291bnQgdHJhbnNmb3JtcyBhcyB3ZWxsIGFzIGxheW91dC5cblxuZnVuY3Rpb24gZ2V0Q29tcG9zaXRlUmVjdChlbGVtZW50T3JWaXJ0dWFsRWxlbWVudCwgb2Zmc2V0UGFyZW50LCBpc0ZpeGVkKSB7XG4gIGlmIChpc0ZpeGVkID09PSB2b2lkIDApIHtcbiAgICBpc0ZpeGVkID0gZmFsc2U7XG4gIH1cblxuICB2YXIgZG9jdW1lbnRFbGVtZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KG9mZnNldFBhcmVudCk7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnRPclZpcnR1YWxFbGVtZW50KTtcbiAgdmFyIGlzT2Zmc2V0UGFyZW50QW5FbGVtZW50ID0gaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpO1xuICB2YXIgc2Nyb2xsID0ge1xuICAgIHNjcm9sbExlZnQ6IDAsXG4gICAgc2Nyb2xsVG9wOiAwXG4gIH07XG4gIHZhciBvZmZzZXRzID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIGlmIChpc09mZnNldFBhcmVudEFuRWxlbWVudCB8fCAhaXNPZmZzZXRQYXJlbnRBbkVsZW1lbnQgJiYgIWlzRml4ZWQpIHtcbiAgICBpZiAoZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSAhPT0gJ2JvZHknIHx8IC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wb3BwZXJqcy9wb3BwZXItY29yZS9pc3N1ZXMvMTA3OFxuICAgIGlzU2Nyb2xsUGFyZW50KGRvY3VtZW50RWxlbWVudCkpIHtcbiAgICAgIHNjcm9sbCA9IGdldE5vZGVTY3JvbGwob2Zmc2V0UGFyZW50KTtcbiAgICB9XG5cbiAgICBpZiAoaXNIVE1MRWxlbWVudChvZmZzZXRQYXJlbnQpKSB7XG4gICAgICBvZmZzZXRzID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KG9mZnNldFBhcmVudCk7XG4gICAgICBvZmZzZXRzLnggKz0gb2Zmc2V0UGFyZW50LmNsaWVudExlZnQ7XG4gICAgICBvZmZzZXRzLnkgKz0gb2Zmc2V0UGFyZW50LmNsaWVudFRvcDtcbiAgICB9IGVsc2UgaWYgKGRvY3VtZW50RWxlbWVudCkge1xuICAgICAgb2Zmc2V0cy54ID0gZ2V0V2luZG93U2Nyb2xsQmFyWChkb2N1bWVudEVsZW1lbnQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgeDogcmVjdC5sZWZ0ICsgc2Nyb2xsLnNjcm9sbExlZnQgLSBvZmZzZXRzLngsXG4gICAgeTogcmVjdC50b3AgKyBzY3JvbGwuc2Nyb2xsVG9wIC0gb2Zmc2V0cy55LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn1cblxuLy8gUmV0dXJucyB0aGUgbGF5b3V0IHJlY3Qgb2YgYW4gZWxlbWVudCByZWxhdGl2ZSB0byBpdHMgb2Zmc2V0UGFyZW50LiBMYXlvdXRcbi8vIG1lYW5zIGl0IGRvZXNuJ3QgdGFrZSBpbnRvIGFjY291bnQgdHJhbnNmb3Jtcy5cbmZ1bmN0aW9uIGdldExheW91dFJlY3QoZWxlbWVudCkge1xuICByZXR1cm4ge1xuICAgIHg6IGVsZW1lbnQub2Zmc2V0TGVmdCxcbiAgICB5OiBlbGVtZW50Lm9mZnNldFRvcCxcbiAgICB3aWR0aDogZWxlbWVudC5vZmZzZXRXaWR0aCxcbiAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0XG4gIH07XG59XG5cbmZ1bmN0aW9uIGdldFBhcmVudE5vZGUoZWxlbWVudCkge1xuICBpZiAoZ2V0Tm9kZU5hbWUoZWxlbWVudCkgPT09ICdodG1sJykge1xuICAgIHJldHVybiBlbGVtZW50O1xuICB9XG5cbiAgcmV0dXJuICgvLyAkRmxvd0ZpeE1lOiB0aGlzIGlzIGEgcXVpY2tlciAoYnV0IGxlc3MgdHlwZSBzYWZlKSB3YXkgdG8gc2F2ZSBxdWl0ZSBzb21lIGJ5dGVzIGZyb20gdGhlIGJ1bmRsZVxuICAgIGVsZW1lbnQuYXNzaWduZWRTbG90IHx8IC8vIHN0ZXAgaW50byB0aGUgc2hhZG93IERPTSBvZiB0aGUgcGFyZW50IG9mIGEgc2xvdHRlZCBub2RlXG4gICAgZWxlbWVudC5wYXJlbnROb2RlIHx8IC8vIERPTSBFbGVtZW50IGRldGVjdGVkXG4gICAgLy8gJEZsb3dGaXhNZTogbmVlZCBhIGJldHRlciB3YXkgdG8gaGFuZGxlIHRoaXMuLi5cbiAgICBlbGVtZW50Lmhvc3QgfHwgLy8gU2hhZG93Um9vdCBkZXRlY3RlZFxuICAgIC8vICRGbG93Rml4TWU6IEhUTUxFbGVtZW50IGlzIGEgTm9kZVxuICAgIGdldERvY3VtZW50RWxlbWVudChlbGVtZW50KSAvLyBmYWxsYmFja1xuXG4gICk7XG59XG5cbmZ1bmN0aW9uIGdldFNjcm9sbFBhcmVudChub2RlKSB7XG4gIGlmIChbJ2h0bWwnLCAnYm9keScsICcjZG9jdW1lbnQnXS5pbmRleE9mKGdldE5vZGVOYW1lKG5vZGUpKSA+PSAwKSB7XG4gICAgLy8gJEZsb3dGaXhNZTogYXNzdW1lIGJvZHkgaXMgYWx3YXlzIGF2YWlsYWJsZVxuICAgIHJldHVybiBub2RlLm93bmVyRG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIGlmIChpc0hUTUxFbGVtZW50KG5vZGUpICYmIGlzU2Nyb2xsUGFyZW50KG5vZGUpKSB7XG4gICAgcmV0dXJuIG5vZGU7XG4gIH1cblxuICByZXR1cm4gZ2V0U2Nyb2xsUGFyZW50KGdldFBhcmVudE5vZGUobm9kZSkpO1xufVxuXG4vKlxuZ2l2ZW4gYSBET00gZWxlbWVudCwgcmV0dXJuIHRoZSBsaXN0IG9mIGFsbCBzY3JvbGwgcGFyZW50cywgdXAgdGhlIGxpc3Qgb2YgYW5jZXNvcnNcbnVudGlsIHdlIGdldCB0byB0aGUgdG9wIHdpbmRvdyBvYmplY3QuIFRoaXMgbGlzdCBpcyB3aGF0IHdlIGF0dGFjaCBzY3JvbGwgbGlzdGVuZXJzXG50bywgYmVjYXVzZSBpZiBhbnkgb2YgdGhlc2UgcGFyZW50IGVsZW1lbnRzIHNjcm9sbCwgd2UnbGwgbmVlZCB0byByZS1jYWxjdWxhdGUgdGhlIFxucmVmZXJlbmNlIGVsZW1lbnQncyBwb3NpdGlvbi5cbiovXG5cbmZ1bmN0aW9uIGxpc3RTY3JvbGxQYXJlbnRzKGVsZW1lbnQsIGxpc3QpIHtcbiAgaWYgKGxpc3QgPT09IHZvaWQgMCkge1xuICAgIGxpc3QgPSBbXTtcbiAgfVxuXG4gIHZhciBzY3JvbGxQYXJlbnQgPSBnZXRTY3JvbGxQYXJlbnQoZWxlbWVudCk7XG4gIHZhciBpc0JvZHkgPSBnZXROb2RlTmFtZShzY3JvbGxQYXJlbnQpID09PSAnYm9keSc7XG4gIHZhciB3aW4gPSBnZXRXaW5kb3coc2Nyb2xsUGFyZW50KTtcbiAgdmFyIHRhcmdldCA9IGlzQm9keSA/IFt3aW5dLmNvbmNhdCh3aW4udmlzdWFsVmlld3BvcnQgfHwgW10sIGlzU2Nyb2xsUGFyZW50KHNjcm9sbFBhcmVudCkgPyBzY3JvbGxQYXJlbnQgOiBbXSkgOiBzY3JvbGxQYXJlbnQ7XG4gIHZhciB1cGRhdGVkTGlzdCA9IGxpc3QuY29uY2F0KHRhcmdldCk7XG4gIHJldHVybiBpc0JvZHkgPyB1cGRhdGVkTGlzdCA6IC8vICRGbG93Rml4TWU6IGlzQm9keSB0ZWxscyB1cyB0YXJnZXQgd2lsbCBiZSBhbiBIVE1MRWxlbWVudCBoZXJlXG4gIHVwZGF0ZWRMaXN0LmNvbmNhdChsaXN0U2Nyb2xsUGFyZW50cyhnZXRQYXJlbnROb2RlKHRhcmdldCkpKTtcbn1cblxuZnVuY3Rpb24gaXNUYWJsZUVsZW1lbnQoZWxlbWVudCkge1xuICByZXR1cm4gWyd0YWJsZScsICd0ZCcsICd0aCddLmluZGV4T2YoZ2V0Tm9kZU5hbWUoZWxlbWVudCkpID49IDA7XG59XG5cbmZ1bmN0aW9uIGdldFRydWVPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgLy8gaHR0cHM6Ly9naXRodWIuY29tL3BvcHBlcmpzL3BvcHBlci1jb3JlL2lzc3Vlcy84MzdcbiAgZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5wb3NpdGlvbiA9PT0gJ2ZpeGVkJykge1xuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9mZnNldFBhcmVudCA9IGVsZW1lbnQub2Zmc2V0UGFyZW50O1xuXG4gIGlmIChvZmZzZXRQYXJlbnQpIHtcbiAgICB2YXIgaHRtbCA9IGdldERvY3VtZW50RWxlbWVudChvZmZzZXRQYXJlbnQpO1xuXG4gICAgaWYgKGdldE5vZGVOYW1lKG9mZnNldFBhcmVudCkgPT09ICdib2R5JyAmJiBnZXRDb21wdXRlZFN0eWxlKG9mZnNldFBhcmVudCkucG9zaXRpb24gPT09ICdzdGF0aWMnICYmIGdldENvbXB1dGVkU3R5bGUoaHRtbCkucG9zaXRpb24gIT09ICdzdGF0aWMnKSB7XG4gICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gb2Zmc2V0UGFyZW50O1xufSAvLyBgLm9mZnNldFBhcmVudGAgcmVwb3J0cyBgbnVsbGAgZm9yIGZpeGVkIGVsZW1lbnRzLCB3aGlsZSBhYnNvbHV0ZSBlbGVtZW50c1xuLy8gcmV0dXJuIHRoZSBjb250YWluaW5nIGJsb2NrXG5cblxuZnVuY3Rpb24gZ2V0Q29udGFpbmluZ0Jsb2NrKGVsZW1lbnQpIHtcbiAgdmFyIGN1cnJlbnROb2RlID0gZ2V0UGFyZW50Tm9kZShlbGVtZW50KTtcblxuICB3aGlsZSAoaXNIVE1MRWxlbWVudChjdXJyZW50Tm9kZSkgJiYgWydodG1sJywgJ2JvZHknXS5pbmRleE9mKGdldE5vZGVOYW1lKGN1cnJlbnROb2RlKSkgPCAwKSB7XG4gICAgdmFyIGNzcyA9IGdldENvbXB1dGVkU3R5bGUoY3VycmVudE5vZGUpOyAvLyBUaGlzIGlzIG5vbi1leGhhdXN0aXZlIGJ1dCBjb3ZlcnMgdGhlIG1vc3QgY29tbW9uIENTUyBwcm9wZXJ0aWVzIHRoYXRcbiAgICAvLyBjcmVhdGUgYSBjb250YWluaW5nIGJsb2NrLlxuXG4gICAgaWYgKGNzcy50cmFuc2Zvcm0gIT09ICdub25lJyB8fCBjc3MucGVyc3BlY3RpdmUgIT09ICdub25lJyB8fCBjc3Mud2lsbENoYW5nZSAmJiBjc3Mud2lsbENoYW5nZSAhPT0gJ2F1dG8nKSB7XG4gICAgICByZXR1cm4gY3VycmVudE5vZGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbDtcbn0gLy8gR2V0cyB0aGUgY2xvc2VzdCBhbmNlc3RvciBwb3NpdGlvbmVkIGVsZW1lbnQuIEhhbmRsZXMgc29tZSBlZGdlIGNhc2VzLFxuLy8gc3VjaCBhcyB0YWJsZSBhbmNlc3RvcnMgYW5kIGNyb3NzIGJyb3dzZXIgYnVncy5cblxuXG5mdW5jdGlvbiBnZXRPZmZzZXRQYXJlbnQoZWxlbWVudCkge1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KGVsZW1lbnQpO1xuICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0VHJ1ZU9mZnNldFBhcmVudChlbGVtZW50KTtcblxuICB3aGlsZSAob2Zmc2V0UGFyZW50ICYmIGlzVGFibGVFbGVtZW50KG9mZnNldFBhcmVudCkgJiYgZ2V0Q29tcHV0ZWRTdHlsZShvZmZzZXRQYXJlbnQpLnBvc2l0aW9uID09PSAnc3RhdGljJykge1xuICAgIG9mZnNldFBhcmVudCA9IGdldFRydWVPZmZzZXRQYXJlbnQob2Zmc2V0UGFyZW50KTtcbiAgfVxuXG4gIGlmIChvZmZzZXRQYXJlbnQgJiYgZ2V0Tm9kZU5hbWUob2Zmc2V0UGFyZW50KSA9PT0gJ2JvZHknICYmIGdldENvbXB1dGVkU3R5bGUob2Zmc2V0UGFyZW50KS5wb3NpdGlvbiA9PT0gJ3N0YXRpYycpIHtcbiAgICByZXR1cm4gd2luZG93O1xuICB9XG5cbiAgcmV0dXJuIG9mZnNldFBhcmVudCB8fCBnZXRDb250YWluaW5nQmxvY2soZWxlbWVudCkgfHwgd2luZG93O1xufVxuXG52YXIgdG9wID0gJ3RvcCc7XG52YXIgYm90dG9tID0gJ2JvdHRvbSc7XG52YXIgcmlnaHQgPSAncmlnaHQnO1xudmFyIGxlZnQgPSAnbGVmdCc7XG52YXIgYXV0byA9ICdhdXRvJztcbnZhciBiYXNlUGxhY2VtZW50cyA9IFt0b3AsIGJvdHRvbSwgcmlnaHQsIGxlZnRdO1xudmFyIHN0YXJ0ID0gJ3N0YXJ0JztcbnZhciBlbmQgPSAnZW5kJztcbnZhciBjbGlwcGluZ1BhcmVudHMgPSAnY2xpcHBpbmdQYXJlbnRzJztcbnZhciB2aWV3cG9ydCA9ICd2aWV3cG9ydCc7XG52YXIgcG9wcGVyID0gJ3BvcHBlcic7XG52YXIgcmVmZXJlbmNlID0gJ3JlZmVyZW5jZSc7XG52YXIgdmFyaWF0aW9uUGxhY2VtZW50cyA9IC8qI19fUFVSRV9fKi9iYXNlUGxhY2VtZW50cy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgcGxhY2VtZW50KSB7XG4gIHJldHVybiBhY2MuY29uY2F0KFtwbGFjZW1lbnQgKyBcIi1cIiArIHN0YXJ0LCBwbGFjZW1lbnQgKyBcIi1cIiArIGVuZF0pO1xufSwgW10pO1xudmFyIHBsYWNlbWVudHMgPSAvKiNfX1BVUkVfXyovW10uY29uY2F0KGJhc2VQbGFjZW1lbnRzLCBbYXV0b10pLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIGFjYy5jb25jYXQoW3BsYWNlbWVudCwgcGxhY2VtZW50ICsgXCItXCIgKyBzdGFydCwgcGxhY2VtZW50ICsgXCItXCIgKyBlbmRdKTtcbn0sIFtdKTsgLy8gbW9kaWZpZXJzIHRoYXQgbmVlZCB0byByZWFkIHRoZSBET01cblxudmFyIGJlZm9yZVJlYWQgPSAnYmVmb3JlUmVhZCc7XG52YXIgcmVhZCA9ICdyZWFkJztcbnZhciBhZnRlclJlYWQgPSAnYWZ0ZXJSZWFkJzsgLy8gcHVyZS1sb2dpYyBtb2RpZmllcnNcblxudmFyIGJlZm9yZU1haW4gPSAnYmVmb3JlTWFpbic7XG52YXIgbWFpbiA9ICdtYWluJztcbnZhciBhZnRlck1haW4gPSAnYWZ0ZXJNYWluJzsgLy8gbW9kaWZpZXIgd2l0aCB0aGUgcHVycG9zZSB0byB3cml0ZSB0byB0aGUgRE9NIChvciB3cml0ZSBpbnRvIGEgZnJhbWV3b3JrIHN0YXRlKVxuXG52YXIgYmVmb3JlV3JpdGUgPSAnYmVmb3JlV3JpdGUnO1xudmFyIHdyaXRlID0gJ3dyaXRlJztcbnZhciBhZnRlcldyaXRlID0gJ2FmdGVyV3JpdGUnO1xudmFyIG1vZGlmaWVyUGhhc2VzID0gW2JlZm9yZVJlYWQsIHJlYWQsIGFmdGVyUmVhZCwgYmVmb3JlTWFpbiwgbWFpbiwgYWZ0ZXJNYWluLCBiZWZvcmVXcml0ZSwgd3JpdGUsIGFmdGVyV3JpdGVdO1xuXG5mdW5jdGlvbiBvcmRlcihtb2RpZmllcnMpIHtcbiAgdmFyIG1hcCA9IG5ldyBNYXAoKTtcbiAgdmFyIHZpc2l0ZWQgPSBuZXcgU2V0KCk7XG4gIHZhciByZXN1bHQgPSBbXTtcbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgbWFwLnNldChtb2RpZmllci5uYW1lLCBtb2RpZmllcik7XG4gIH0pOyAvLyBPbiB2aXNpdGluZyBvYmplY3QsIGNoZWNrIGZvciBpdHMgZGVwZW5kZW5jaWVzIGFuZCB2aXNpdCB0aGVtIHJlY3Vyc2l2ZWx5XG5cbiAgZnVuY3Rpb24gc29ydChtb2RpZmllcikge1xuICAgIHZpc2l0ZWQuYWRkKG1vZGlmaWVyLm5hbWUpO1xuICAgIHZhciByZXF1aXJlcyA9IFtdLmNvbmNhdChtb2RpZmllci5yZXF1aXJlcyB8fCBbXSwgbW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cyB8fCBbXSk7XG4gICAgcmVxdWlyZXMuZm9yRWFjaChmdW5jdGlvbiAoZGVwKSB7XG4gICAgICBpZiAoIXZpc2l0ZWQuaGFzKGRlcCkpIHtcbiAgICAgICAgdmFyIGRlcE1vZGlmaWVyID0gbWFwLmdldChkZXApO1xuXG4gICAgICAgIGlmIChkZXBNb2RpZmllcikge1xuICAgICAgICAgIHNvcnQoZGVwTW9kaWZpZXIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmVzdWx0LnB1c2gobW9kaWZpZXIpO1xuICB9XG5cbiAgbW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgaWYgKCF2aXNpdGVkLmhhcyhtb2RpZmllci5uYW1lKSkge1xuICAgICAgLy8gY2hlY2sgZm9yIHZpc2l0ZWQgb2JqZWN0XG4gICAgICBzb3J0KG1vZGlmaWVyKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBvcmRlck1vZGlmaWVycyhtb2RpZmllcnMpIHtcbiAgLy8gb3JkZXIgYmFzZWQgb24gZGVwZW5kZW5jaWVzXG4gIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXIobW9kaWZpZXJzKTsgLy8gb3JkZXIgYmFzZWQgb24gcGhhc2VcblxuICByZXR1cm4gbW9kaWZpZXJQaGFzZXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBoYXNlKSB7XG4gICAgcmV0dXJuIGFjYy5jb25jYXQob3JkZXJlZE1vZGlmaWVycy5maWx0ZXIoZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICByZXR1cm4gbW9kaWZpZXIucGhhc2UgPT09IHBoYXNlO1xuICAgIH0pKTtcbiAgfSwgW10pO1xufVxuXG5mdW5jdGlvbiBkZWJvdW5jZShmbikge1xuICB2YXIgcGVuZGluZztcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXBlbmRpbmcpIHtcbiAgICAgIHBlbmRpbmcgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSkge1xuICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBwZW5kaW5nID0gdW5kZWZpbmVkO1xuICAgICAgICAgIHJlc29sdmUoZm4oKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHBlbmRpbmc7XG4gIH07XG59XG5cbmZ1bmN0aW9uIGZvcm1hdChzdHIpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiA+IDEgPyBfbGVuIC0gMSA6IDApLCBfa2V5ID0gMTsgX2tleSA8IF9sZW47IF9rZXkrKykge1xuICAgIGFyZ3NbX2tleSAtIDFdID0gYXJndW1lbnRzW19rZXldO1xuICB9XG5cbiAgcmV0dXJuIFtdLmNvbmNhdChhcmdzKS5yZWR1Y2UoZnVuY3Rpb24gKHAsIGMpIHtcbiAgICByZXR1cm4gcC5yZXBsYWNlKC8lcy8sIGMpO1xuICB9LCBzdHIpO1xufVxuXG52YXIgSU5WQUxJRF9NT0RJRklFUl9FUlJPUiA9ICdQb3BwZXI6IG1vZGlmaWVyIFwiJXNcIiBwcm92aWRlZCBhbiBpbnZhbGlkICVzIHByb3BlcnR5LCBleHBlY3RlZCAlcyBidXQgZ290ICVzJztcbnZhciBNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IgPSAnUG9wcGVyOiBtb2RpZmllciBcIiVzXCIgcmVxdWlyZXMgXCIlc1wiLCBidXQgXCIlc1wiIG1vZGlmaWVyIGlzIG5vdCBhdmFpbGFibGUnO1xudmFyIFZBTElEX1BST1BFUlRJRVMgPSBbJ25hbWUnLCAnZW5hYmxlZCcsICdwaGFzZScsICdmbicsICdlZmZlY3QnLCAncmVxdWlyZXMnLCAnb3B0aW9ucyddO1xuZnVuY3Rpb24gdmFsaWRhdGVNb2RpZmllcnMobW9kaWZpZXJzKSB7XG4gIG1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChtb2RpZmllcikge1xuICAgIE9iamVjdC5rZXlzKG1vZGlmaWVyKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgIHN3aXRjaCAoa2V5KSB7XG4gICAgICAgIGNhc2UgJ25hbWUnOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIubmFtZSAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgJ1wibmFtZVwiJywgJ1wic3RyaW5nXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5uYW1lKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZW5hYmxlZCc6XG4gICAgICAgICAgaWYgKHR5cGVvZiBtb2RpZmllci5lbmFibGVkICE9PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcImVuYWJsZWRcIicsICdcImJvb2xlYW5cIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLmVuYWJsZWQpICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgY2FzZSAncGhhc2UnOlxuICAgICAgICAgIGlmIChtb2RpZmllclBoYXNlcy5pbmRleE9mKG1vZGlmaWVyLnBoYXNlKSA8IDApIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcInBoYXNlXCInLCBcImVpdGhlciBcIiArIG1vZGlmaWVyUGhhc2VzLmpvaW4oJywgJyksIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnBoYXNlKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnZm4nOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZm4gIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZm9ybWF0KElOVkFMSURfTU9ESUZJRVJfRVJST1IsIG1vZGlmaWVyLm5hbWUsICdcImZuXCInLCAnXCJmdW5jdGlvblwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIuZm4pICsgXCJcXFwiXCIpKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdlZmZlY3QnOlxuICAgICAgICAgIGlmICh0eXBlb2YgbW9kaWZpZXIuZWZmZWN0ICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJlZmZlY3RcIicsICdcImZ1bmN0aW9uXCInLCBcIlxcXCJcIiArIFN0cmluZyhtb2RpZmllci5mbikgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3JlcXVpcmVzJzpcbiAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobW9kaWZpZXIucmVxdWlyZXMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc1wiJywgJ1wiYXJyYXlcIicsIFwiXFxcIlwiICsgU3RyaW5nKG1vZGlmaWVyLnJlcXVpcmVzKSArIFwiXFxcIlwiKSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAncmVxdWlyZXNJZkV4aXN0cyc6XG4gICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG1vZGlmaWVyLnJlcXVpcmVzSWZFeGlzdHMpKSB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChJTlZBTElEX01PRElGSUVSX0VSUk9SLCBtb2RpZmllci5uYW1lLCAnXCJyZXF1aXJlc0lmRXhpc3RzXCInLCAnXCJhcnJheVwiJywgXCJcXFwiXCIgKyBTdHJpbmcobW9kaWZpZXIucmVxdWlyZXNJZkV4aXN0cykgKyBcIlxcXCJcIikpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ29wdGlvbnMnOlxuICAgICAgICBjYXNlICdkYXRhJzpcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXCJQb3BwZXJKUzogYW4gaW52YWxpZCBwcm9wZXJ0eSBoYXMgYmVlbiBwcm92aWRlZCB0byB0aGUgXFxcIlwiICsgbW9kaWZpZXIubmFtZSArIFwiXFxcIiBtb2RpZmllciwgdmFsaWQgcHJvcGVydGllcyBhcmUgXCIgKyBWQUxJRF9QUk9QRVJUSUVTLm1hcChmdW5jdGlvbiAocykge1xuICAgICAgICAgICAgcmV0dXJuIFwiXFxcIlwiICsgcyArIFwiXFxcIlwiO1xuICAgICAgICAgIH0pLmpvaW4oJywgJykgKyBcIjsgYnV0IFxcXCJcIiArIGtleSArIFwiXFxcIiB3YXMgcHJvdmlkZWQuXCIpO1xuICAgICAgfVxuXG4gICAgICBtb2RpZmllci5yZXF1aXJlcyAmJiBtb2RpZmllci5yZXF1aXJlcy5mb3JFYWNoKGZ1bmN0aW9uIChyZXF1aXJlbWVudCkge1xuICAgICAgICBpZiAobW9kaWZpZXJzLmZpbmQoZnVuY3Rpb24gKG1vZCkge1xuICAgICAgICAgIHJldHVybiBtb2QubmFtZSA9PT0gcmVxdWlyZW1lbnQ7XG4gICAgICAgIH0pID09IG51bGwpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKGZvcm1hdChNSVNTSU5HX0RFUEVOREVOQ1lfRVJST1IsIFN0cmluZyhtb2RpZmllci5uYW1lKSwgcmVxdWlyZW1lbnQsIHJlcXVpcmVtZW50KSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gdW5pcXVlQnkoYXJyLCBmbikge1xuICB2YXIgaWRlbnRpZmllcnMgPSBuZXcgU2V0KCk7XG4gIHJldHVybiBhcnIuZmlsdGVyKGZ1bmN0aW9uIChpdGVtKSB7XG4gICAgdmFyIGlkZW50aWZpZXIgPSBmbihpdGVtKTtcblxuICAgIGlmICghaWRlbnRpZmllcnMuaGFzKGlkZW50aWZpZXIpKSB7XG4gICAgICBpZGVudGlmaWVycy5hZGQoaWRlbnRpZmllcik7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnNwbGl0KCctJylbMF07XG59XG5cbmZ1bmN0aW9uIG1lcmdlQnlOYW1lKG1vZGlmaWVycykge1xuICB2YXIgbWVyZ2VkID0gbW9kaWZpZXJzLnJlZHVjZShmdW5jdGlvbiAobWVyZ2VkLCBjdXJyZW50KSB7XG4gICAgdmFyIGV4aXN0aW5nID0gbWVyZ2VkW2N1cnJlbnQubmFtZV07XG4gICAgbWVyZ2VkW2N1cnJlbnQubmFtZV0gPSBleGlzdGluZyA/IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZyksIGN1cnJlbnQpLCB7fSwge1xuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBleGlzdGluZy5vcHRpb25zKSwgY3VycmVudC5vcHRpb25zKSxcbiAgICAgIGRhdGE6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmcuZGF0YSksIGN1cnJlbnQuZGF0YSlcbiAgICB9KSA6IGN1cnJlbnQ7XG4gICAgcmV0dXJuIG1lcmdlZDtcbiAgfSwge30pOyAvLyBJRTExIGRvZXMgbm90IHN1cHBvcnQgT2JqZWN0LnZhbHVlc1xuXG4gIHJldHVybiBPYmplY3Qua2V5cyhtZXJnZWQpLm1hcChmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIG1lcmdlZFtrZXldO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0Vmlld3BvcnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIHdpbiA9IGdldFdpbmRvdyhlbGVtZW50KTtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB2aXN1YWxWaWV3cG9ydCA9IHdpbi52aXN1YWxWaWV3cG9ydDtcbiAgdmFyIHdpZHRoID0gaHRtbC5jbGllbnRXaWR0aDtcbiAgdmFyIGhlaWdodCA9IGh0bWwuY2xpZW50SGVpZ2h0O1xuICB2YXIgeCA9IDA7XG4gIHZhciB5ID0gMDsgLy8gTkI6IFRoaXMgaXNuJ3Qgc3VwcG9ydGVkIG9uIGlPUyA8PSAxMi4gSWYgdGhlIGtleWJvYXJkIGlzIG9wZW4sIHRoZSBwb3BwZXJcbiAgLy8gY2FuIGJlIG9ic2N1cmVkIHVuZGVybmVhdGggaXQuXG4gIC8vIEFsc28sIGBodG1sLmNsaWVudEhlaWdodGAgYWRkcyB0aGUgYm90dG9tIGJhciBoZWlnaHQgaW4gU2FmYXJpIGlPUywgZXZlblxuICAvLyBpZiBpdCBpc24ndCBvcGVuLCBzbyBpZiB0aGlzIGlzbid0IGF2YWlsYWJsZSwgdGhlIHBvcHBlciB3aWxsIGJlIGRldGVjdGVkXG4gIC8vIHRvIG92ZXJmbG93IHRoZSBib3R0b20gb2YgdGhlIHNjcmVlbiB0b28gZWFybHkuXG5cbiAgaWYgKHZpc3VhbFZpZXdwb3J0KSB7XG4gICAgd2lkdGggPSB2aXN1YWxWaWV3cG9ydC53aWR0aDtcbiAgICBoZWlnaHQgPSB2aXN1YWxWaWV3cG9ydC5oZWlnaHQ7IC8vIFVzZXMgTGF5b3V0IFZpZXdwb3J0IChsaWtlIENocm9tZTsgU2FmYXJpIGRvZXMgbm90IGN1cnJlbnRseSlcbiAgICAvLyBJbiBDaHJvbWUsIGl0IHJldHVybnMgYSB2YWx1ZSB2ZXJ5IGNsb3NlIHRvIDAgKCsvLSkgYnV0IGNvbnRhaW5zIHJvdW5kaW5nXG4gICAgLy8gZXJyb3JzIGR1ZSB0byBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIHByZWNpc2lvbi5cbiAgICAvLyBTYWZhcmkgcmV0dXJucyBhIG51bWJlciA8PSAwLCB1c3VhbGx5IDwgLTEgd2hlbiBwaW5jaC16b29tZWRcbiAgICAvLyBGZWF0dXJlIGRldGVjdGlvbiBmYWlscyBpbiBtb2JpbGUgZW11bGF0aW9uIG1vZGUgaW4gQ2hyb21lLlxuICAgIC8vIE1hdGguYWJzKHdpbi5pbm5lcldpZHRoIC8gdmlzdWFsVmlld3BvcnQuc2NhbGUgLSB2aXN1YWxWaWV3cG9ydC53aWR0aCkgPFxuICAgIC8vIDAuMDAxXG4gICAgLy8gRmFsbGJhY2sgaGVyZTogXCJOb3QgU2FmYXJpXCIgdXNlckFnZW50XG5cbiAgICBpZiAoIS9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkpIHtcbiAgICAgIHggPSB2aXN1YWxWaWV3cG9ydC5vZmZzZXRMZWZ0O1xuICAgICAgeSA9IHZpc3VhbFZpZXdwb3J0Lm9mZnNldFRvcDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4ge1xuICAgIHdpZHRoOiB3aWR0aCxcbiAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICB4OiB4ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KSxcbiAgICB5OiB5XG4gIH07XG59XG5cbi8vIG9mIHRoZSBgPGh0bWw+YCBhbmQgYDxib2R5PmAgcmVjdCBib3VuZHMgaWYgaG9yaXpvbnRhbGx5IHNjcm9sbGFibGVcblxuZnVuY3Rpb24gZ2V0RG9jdW1lbnRSZWN0KGVsZW1lbnQpIHtcbiAgdmFyIGh0bWwgPSBnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCk7XG4gIHZhciB3aW5TY3JvbGwgPSBnZXRXaW5kb3dTY3JvbGwoZWxlbWVudCk7XG4gIHZhciBib2R5ID0gZWxlbWVudC5vd25lckRvY3VtZW50LmJvZHk7XG4gIHZhciB3aWR0aCA9IE1hdGgubWF4KGh0bWwuc2Nyb2xsV2lkdGgsIGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LnNjcm9sbFdpZHRoIDogMCwgYm9keSA/IGJvZHkuY2xpZW50V2lkdGggOiAwKTtcbiAgdmFyIGhlaWdodCA9IE1hdGgubWF4KGh0bWwuc2Nyb2xsSGVpZ2h0LCBodG1sLmNsaWVudEhlaWdodCwgYm9keSA/IGJvZHkuc2Nyb2xsSGVpZ2h0IDogMCwgYm9keSA/IGJvZHkuY2xpZW50SGVpZ2h0IDogMCk7XG4gIHZhciB4ID0gLXdpblNjcm9sbC5zY3JvbGxMZWZ0ICsgZ2V0V2luZG93U2Nyb2xsQmFyWChlbGVtZW50KTtcbiAgdmFyIHkgPSAtd2luU2Nyb2xsLnNjcm9sbFRvcDtcblxuICBpZiAoZ2V0Q29tcHV0ZWRTdHlsZShib2R5IHx8IGh0bWwpLmRpcmVjdGlvbiA9PT0gJ3J0bCcpIHtcbiAgICB4ICs9IE1hdGgubWF4KGh0bWwuY2xpZW50V2lkdGgsIGJvZHkgPyBib2R5LmNsaWVudFdpZHRoIDogMCkgLSB3aWR0aDtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0LFxuICAgIHg6IHgsXG4gICAgeTogeVxuICB9O1xufVxuXG5mdW5jdGlvbiBjb250YWlucyhwYXJlbnQsIGNoaWxkKSB7XG4gIC8vICRGbG93Rml4TWU6IGhhc093blByb3BlcnR5IGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGluIHRlc3RzXG4gIHZhciBpc1NoYWRvdyA9IEJvb2xlYW4oY2hpbGQuZ2V0Um9vdE5vZGUgJiYgY2hpbGQuZ2V0Um9vdE5vZGUoKS5ob3N0KTsgLy8gRmlyc3QsIGF0dGVtcHQgd2l0aCBmYXN0ZXIgbmF0aXZlIG1ldGhvZFxuXG4gIGlmIChwYXJlbnQuY29udGFpbnMoY2hpbGQpKSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH0gLy8gdGhlbiBmYWxsYmFjayB0byBjdXN0b20gaW1wbGVtZW50YXRpb24gd2l0aCBTaGFkb3cgRE9NIHN1cHBvcnRcbiAgZWxzZSBpZiAoaXNTaGFkb3cpIHtcbiAgICAgIHZhciBuZXh0ID0gY2hpbGQ7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKG5leHQgJiYgcGFyZW50LmlzU2FtZU5vZGUobmV4dCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSAvLyAkRmxvd0ZpeE1lOiBuZWVkIGEgYmV0dGVyIHdheSB0byBoYW5kbGUgdGhpcy4uLlxuXG5cbiAgICAgICAgbmV4dCA9IG5leHQucGFyZW50Tm9kZSB8fCBuZXh0Lmhvc3Q7XG4gICAgICB9IHdoaWxlIChuZXh0KTtcbiAgICB9IC8vIEdpdmUgdXAsIHRoZSByZXN1bHQgaXMgZmFsc2VcblxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVjdFRvQ2xpZW50UmVjdChyZWN0KSB7XG4gIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY3QpLCB7fSwge1xuICAgIGxlZnQ6IHJlY3QueCxcbiAgICB0b3A6IHJlY3QueSxcbiAgICByaWdodDogcmVjdC54ICsgcmVjdC53aWR0aCxcbiAgICBib3R0b206IHJlY3QueSArIHJlY3QuaGVpZ2h0XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChlbGVtZW50KSB7XG4gIHZhciByZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KGVsZW1lbnQpO1xuICByZWN0LnRvcCA9IHJlY3QudG9wICsgZWxlbWVudC5jbGllbnRUb3A7XG4gIHJlY3QubGVmdCA9IHJlY3QubGVmdCArIGVsZW1lbnQuY2xpZW50TGVmdDtcbiAgcmVjdC5ib3R0b20gPSByZWN0LnRvcCArIGVsZW1lbnQuY2xpZW50SGVpZ2h0O1xuICByZWN0LnJpZ2h0ID0gcmVjdC5sZWZ0ICsgZWxlbWVudC5jbGllbnRXaWR0aDtcbiAgcmVjdC53aWR0aCA9IGVsZW1lbnQuY2xpZW50V2lkdGg7XG4gIHJlY3QuaGVpZ2h0ID0gZWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gIHJlY3QueCA9IHJlY3QubGVmdDtcbiAgcmVjdC55ID0gcmVjdC50b3A7XG4gIHJldHVybiByZWN0O1xufVxuXG5mdW5jdGlvbiBnZXRDbGllbnRSZWN0RnJvbU1peGVkVHlwZShlbGVtZW50LCBjbGlwcGluZ1BhcmVudCkge1xuICByZXR1cm4gY2xpcHBpbmdQYXJlbnQgPT09IHZpZXdwb3J0ID8gcmVjdFRvQ2xpZW50UmVjdChnZXRWaWV3cG9ydFJlY3QoZWxlbWVudCkpIDogaXNIVE1MRWxlbWVudChjbGlwcGluZ1BhcmVudCkgPyBnZXRJbm5lckJvdW5kaW5nQ2xpZW50UmVjdChjbGlwcGluZ1BhcmVudCkgOiByZWN0VG9DbGllbnRSZWN0KGdldERvY3VtZW50UmVjdChnZXREb2N1bWVudEVsZW1lbnQoZWxlbWVudCkpKTtcbn0gLy8gQSBcImNsaXBwaW5nIHBhcmVudFwiIGlzIGFuIG92ZXJmbG93YWJsZSBjb250YWluZXIgd2l0aCB0aGUgY2hhcmFjdGVyaXN0aWMgb2Zcbi8vIGNsaXBwaW5nIChvciBoaWRpbmcpIG92ZXJmbG93aW5nIGVsZW1lbnRzIHdpdGggYSBwb3NpdGlvbiBkaWZmZXJlbnQgZnJvbVxuLy8gYGluaXRpYWxgXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdQYXJlbnRzKGVsZW1lbnQpIHtcbiAgdmFyIGNsaXBwaW5nUGFyZW50cyA9IGxpc3RTY3JvbGxQYXJlbnRzKGdldFBhcmVudE5vZGUoZWxlbWVudCkpO1xuICB2YXIgY2FuRXNjYXBlQ2xpcHBpbmcgPSBbJ2Fic29sdXRlJywgJ2ZpeGVkJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLnBvc2l0aW9uKSA+PSAwO1xuICB2YXIgY2xpcHBlckVsZW1lbnQgPSBjYW5Fc2NhcGVDbGlwcGluZyAmJiBpc0hUTUxFbGVtZW50KGVsZW1lbnQpID8gZ2V0T2Zmc2V0UGFyZW50KGVsZW1lbnQpIDogZWxlbWVudDtcblxuICBpZiAoIWlzRWxlbWVudChjbGlwcGVyRWxlbWVudCkpIHtcbiAgICByZXR1cm4gW107XG4gIH0gLy8gJEZsb3dGaXhNZTogaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL2Zsb3cvaXNzdWVzLzE0MTRcblxuXG4gIHJldHVybiBjbGlwcGluZ1BhcmVudHMuZmlsdGVyKGZ1bmN0aW9uIChjbGlwcGluZ1BhcmVudCkge1xuICAgIHJldHVybiBpc0VsZW1lbnQoY2xpcHBpbmdQYXJlbnQpICYmIGNvbnRhaW5zKGNsaXBwaW5nUGFyZW50LCBjbGlwcGVyRWxlbWVudCkgJiYgZ2V0Tm9kZU5hbWUoY2xpcHBpbmdQYXJlbnQpICE9PSAnYm9keSc7XG4gIH0pO1xufSAvLyBHZXRzIHRoZSBtYXhpbXVtIGFyZWEgdGhhdCB0aGUgZWxlbWVudCBpcyB2aXNpYmxlIGluIGR1ZSB0byBhbnkgbnVtYmVyIG9mXG4vLyBjbGlwcGluZyBwYXJlbnRzXG5cblxuZnVuY3Rpb24gZ2V0Q2xpcHBpbmdSZWN0KGVsZW1lbnQsIGJvdW5kYXJ5LCByb290Qm91bmRhcnkpIHtcbiAgdmFyIG1haW5DbGlwcGluZ1BhcmVudHMgPSBib3VuZGFyeSA9PT0gJ2NsaXBwaW5nUGFyZW50cycgPyBnZXRDbGlwcGluZ1BhcmVudHMoZWxlbWVudCkgOiBbXS5jb25jYXQoYm91bmRhcnkpO1xuICB2YXIgY2xpcHBpbmdQYXJlbnRzID0gW10uY29uY2F0KG1haW5DbGlwcGluZ1BhcmVudHMsIFtyb290Qm91bmRhcnldKTtcbiAgdmFyIGZpcnN0Q2xpcHBpbmdQYXJlbnQgPSBjbGlwcGluZ1BhcmVudHNbMF07XG4gIHZhciBjbGlwcGluZ1JlY3QgPSBjbGlwcGluZ1BhcmVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2NSZWN0LCBjbGlwcGluZ1BhcmVudCkge1xuICAgIHZhciByZWN0ID0gZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgY2xpcHBpbmdQYXJlbnQpO1xuICAgIGFjY1JlY3QudG9wID0gTWF0aC5tYXgocmVjdC50b3AsIGFjY1JlY3QudG9wKTtcbiAgICBhY2NSZWN0LnJpZ2h0ID0gTWF0aC5taW4ocmVjdC5yaWdodCwgYWNjUmVjdC5yaWdodCk7XG4gICAgYWNjUmVjdC5ib3R0b20gPSBNYXRoLm1pbihyZWN0LmJvdHRvbSwgYWNjUmVjdC5ib3R0b20pO1xuICAgIGFjY1JlY3QubGVmdCA9IE1hdGgubWF4KHJlY3QubGVmdCwgYWNjUmVjdC5sZWZ0KTtcbiAgICByZXR1cm4gYWNjUmVjdDtcbiAgfSwgZ2V0Q2xpZW50UmVjdEZyb21NaXhlZFR5cGUoZWxlbWVudCwgZmlyc3RDbGlwcGluZ1BhcmVudCkpO1xuICBjbGlwcGluZ1JlY3Qud2lkdGggPSBjbGlwcGluZ1JlY3QucmlnaHQgLSBjbGlwcGluZ1JlY3QubGVmdDtcbiAgY2xpcHBpbmdSZWN0LmhlaWdodCA9IGNsaXBwaW5nUmVjdC5ib3R0b20gLSBjbGlwcGluZ1JlY3QudG9wO1xuICBjbGlwcGluZ1JlY3QueCA9IGNsaXBwaW5nUmVjdC5sZWZ0O1xuICBjbGlwcGluZ1JlY3QueSA9IGNsaXBwaW5nUmVjdC50b3A7XG4gIHJldHVybiBjbGlwcGluZ1JlY3Q7XG59XG5cbmZ1bmN0aW9uIGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5zcGxpdCgnLScpWzFdO1xufVxuXG5mdW5jdGlvbiBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBbJ3RvcCcsICdib3R0b20nXS5pbmRleE9mKHBsYWNlbWVudCkgPj0gMCA/ICd4JyA6ICd5Jztcbn1cblxuZnVuY3Rpb24gY29tcHV0ZU9mZnNldHMoX3JlZikge1xuICB2YXIgcmVmZXJlbmNlID0gX3JlZi5yZWZlcmVuY2UsXG4gICAgICBlbGVtZW50ID0gX3JlZi5lbGVtZW50LFxuICAgICAgcGxhY2VtZW50ID0gX3JlZi5wbGFjZW1lbnQ7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gcGxhY2VtZW50ID8gZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIHZhcmlhdGlvbiA9IHBsYWNlbWVudCA/IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpIDogbnVsbDtcbiAgdmFyIGNvbW1vblggPSByZWZlcmVuY2UueCArIHJlZmVyZW5jZS53aWR0aCAvIDIgLSBlbGVtZW50LndpZHRoIC8gMjtcbiAgdmFyIGNvbW1vblkgPSByZWZlcmVuY2UueSArIHJlZmVyZW5jZS5oZWlnaHQgLyAyIC0gZWxlbWVudC5oZWlnaHQgLyAyO1xuICB2YXIgb2Zmc2V0cztcblxuICBzd2l0Y2ggKGJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlIHRvcDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IGNvbW1vblgsXG4gICAgICAgIHk6IHJlZmVyZW5jZS55IC0gZWxlbWVudC5oZWlnaHRcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgYm90dG9tOlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogY29tbW9uWCxcbiAgICAgICAgeTogcmVmZXJlbmNlLnkgKyByZWZlcmVuY2UuaGVpZ2h0XG4gICAgICB9O1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlIHJpZ2h0OlxuICAgICAgb2Zmc2V0cyA9IHtcbiAgICAgICAgeDogcmVmZXJlbmNlLnggKyByZWZlcmVuY2Uud2lkdGgsXG4gICAgICAgIHk6IGNvbW1vbllcbiAgICAgIH07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgbGVmdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54IC0gZWxlbWVudC53aWR0aCxcbiAgICAgICAgeTogY29tbW9uWVxuICAgICAgfTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIG9mZnNldHMgPSB7XG4gICAgICAgIHg6IHJlZmVyZW5jZS54LFxuICAgICAgICB5OiByZWZlcmVuY2UueVxuICAgICAgfTtcbiAgfVxuXG4gIHZhciBtYWluQXhpcyA9IGJhc2VQbGFjZW1lbnQgPyBnZXRNYWluQXhpc0Zyb21QbGFjZW1lbnQoYmFzZVBsYWNlbWVudCkgOiBudWxsO1xuXG4gIGlmIChtYWluQXhpcyAhPSBudWxsKSB7XG4gICAgdmFyIGxlbiA9IG1haW5BeGlzID09PSAneScgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgICBzd2l0Y2ggKHZhcmlhdGlvbikge1xuICAgICAgY2FzZSBzdGFydDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBNYXRoLmZsb29yKG9mZnNldHNbbWFpbkF4aXNdKSAtIE1hdGguZmxvb3IocmVmZXJlbmNlW2xlbl0gLyAyIC0gZWxlbWVudFtsZW5dIC8gMik7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlIGVuZDpcbiAgICAgICAgb2Zmc2V0c1ttYWluQXhpc10gPSBNYXRoLmZsb29yKG9mZnNldHNbbWFpbkF4aXNdKSArIE1hdGguY2VpbChyZWZlcmVuY2VbbGVuXSAvIDIgLSBlbGVtZW50W2xlbl0gLyAyKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9mZnNldHM7XG59XG5cbmZ1bmN0aW9uIGdldEZyZXNoU2lkZU9iamVjdCgpIHtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IDAsXG4gICAgcmlnaHQ6IDAsXG4gICAgYm90dG9tOiAwLFxuICAgIGxlZnQ6IDBcbiAgfTtcbn1cblxuZnVuY3Rpb24gbWVyZ2VQYWRkaW5nT2JqZWN0KHBhZGRpbmdPYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ2V0RnJlc2hTaWRlT2JqZWN0KCkpLCBwYWRkaW5nT2JqZWN0KTtcbn1cblxuZnVuY3Rpb24gZXhwYW5kVG9IYXNoTWFwKHZhbHVlLCBrZXlzKSB7XG4gIHJldHVybiBrZXlzLnJlZHVjZShmdW5jdGlvbiAoaGFzaE1hcCwga2V5KSB7XG4gICAgaGFzaE1hcFtrZXldID0gdmFsdWU7XG4gICAgcmV0dXJuIGhhc2hNYXA7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIG9wdGlvbnMpIHtcbiAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIG9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICBfb3B0aW9ucyRwbGFjZW1lbnQgPSBfb3B0aW9ucy5wbGFjZW1lbnQsXG4gICAgICBwbGFjZW1lbnQgPSBfb3B0aW9ucyRwbGFjZW1lbnQgPT09IHZvaWQgMCA/IHN0YXRlLnBsYWNlbWVudCA6IF9vcHRpb25zJHBsYWNlbWVudCxcbiAgICAgIF9vcHRpb25zJGJvdW5kYXJ5ID0gX29wdGlvbnMuYm91bmRhcnksXG4gICAgICBib3VuZGFyeSA9IF9vcHRpb25zJGJvdW5kYXJ5ID09PSB2b2lkIDAgPyBjbGlwcGluZ1BhcmVudHMgOiBfb3B0aW9ucyRib3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zJHJvb3RCb3VuZGFyeSA9PT0gdm9pZCAwID8gdmlld3BvcnQgOiBfb3B0aW9ucyRyb290Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRlbGVtZW50Q29udGUgPSBfb3B0aW9ucy5lbGVtZW50Q29udGV4dCxcbiAgICAgIGVsZW1lbnRDb250ZXh0ID0gX29wdGlvbnMkZWxlbWVudENvbnRlID09PSB2b2lkIDAgPyBwb3BwZXIgOiBfb3B0aW9ucyRlbGVtZW50Q29udGUsXG4gICAgICBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9IF9vcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBfb3B0aW9ucyRhbHRCb3VuZGFyeSA9PT0gdm9pZCAwID8gZmFsc2UgOiBfb3B0aW9ucyRhbHRCb3VuZGFyeSxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgcGFkZGluZyA9IF9vcHRpb25zJHBhZGRpbmcgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyRwYWRkaW5nO1xuICB2YXIgcGFkZGluZ09iamVjdCA9IG1lcmdlUGFkZGluZ09iamVjdCh0eXBlb2YgcGFkZGluZyAhPT0gJ251bWJlcicgPyBwYWRkaW5nIDogZXhwYW5kVG9IYXNoTWFwKHBhZGRpbmcsIGJhc2VQbGFjZW1lbnRzKSk7XG4gIHZhciBhbHRDb250ZXh0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHJlZmVyZW5jZSA6IHBvcHBlcjtcbiAgdmFyIHJlZmVyZW5jZUVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgZWxlbWVudCA9IHN0YXRlLmVsZW1lbnRzW2FsdEJvdW5kYXJ5ID8gYWx0Q29udGV4dCA6IGVsZW1lbnRDb250ZXh0XTtcbiAgdmFyIGNsaXBwaW5nQ2xpZW50UmVjdCA9IGdldENsaXBwaW5nUmVjdChpc0VsZW1lbnQoZWxlbWVudCkgPyBlbGVtZW50IDogZWxlbWVudC5jb250ZXh0RWxlbWVudCB8fCBnZXREb2N1bWVudEVsZW1lbnQoc3RhdGUuZWxlbWVudHMucG9wcGVyKSwgYm91bmRhcnksIHJvb3RCb3VuZGFyeSk7XG4gIHZhciByZWZlcmVuY2VDbGllbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHJlZmVyZW5jZUVsZW1lbnQpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IGNvbXB1dGVPZmZzZXRzKHtcbiAgICByZWZlcmVuY2U6IHJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgZWxlbWVudDogcG9wcGVyUmVjdCxcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KTtcbiAgdmFyIHBvcHBlckNsaWVudFJlY3QgPSByZWN0VG9DbGllbnRSZWN0KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcG9wcGVyUmVjdCksIHBvcHBlck9mZnNldHMpKTtcbiAgdmFyIGVsZW1lbnRDbGllbnRSZWN0ID0gZWxlbWVudENvbnRleHQgPT09IHBvcHBlciA/IHBvcHBlckNsaWVudFJlY3QgOiByZWZlcmVuY2VDbGllbnRSZWN0OyAvLyBwb3NpdGl2ZSA9IG92ZXJmbG93aW5nIHRoZSBjbGlwcGluZyByZWN0XG4gIC8vIDAgb3IgbmVnYXRpdmUgPSB3aXRoaW4gdGhlIGNsaXBwaW5nIHJlY3RcblxuICB2YXIgb3ZlcmZsb3dPZmZzZXRzID0ge1xuICAgIHRvcDogY2xpcHBpbmdDbGllbnRSZWN0LnRvcCAtIGVsZW1lbnRDbGllbnRSZWN0LnRvcCArIHBhZGRpbmdPYmplY3QudG9wLFxuICAgIGJvdHRvbTogZWxlbWVudENsaWVudFJlY3QuYm90dG9tIC0gY2xpcHBpbmdDbGllbnRSZWN0LmJvdHRvbSArIHBhZGRpbmdPYmplY3QuYm90dG9tLFxuICAgIGxlZnQ6IGNsaXBwaW5nQ2xpZW50UmVjdC5sZWZ0IC0gZWxlbWVudENsaWVudFJlY3QubGVmdCArIHBhZGRpbmdPYmplY3QubGVmdCxcbiAgICByaWdodDogZWxlbWVudENsaWVudFJlY3QucmlnaHQgLSBjbGlwcGluZ0NsaWVudFJlY3QucmlnaHQgKyBwYWRkaW5nT2JqZWN0LnJpZ2h0XG4gIH07XG4gIHZhciBvZmZzZXREYXRhID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQ7IC8vIE9mZnNldHMgY2FuIGJlIGFwcGxpZWQgb25seSB0byB0aGUgcG9wcGVyIGVsZW1lbnRcblxuICBpZiAoZWxlbWVudENvbnRleHQgPT09IHBvcHBlciAmJiBvZmZzZXREYXRhKSB7XG4gICAgdmFyIG9mZnNldCA9IG9mZnNldERhdGFbcGxhY2VtZW50XTtcbiAgICBPYmplY3Qua2V5cyhvdmVyZmxvd09mZnNldHMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICAgICAgdmFyIG11bHRpcGx5ID0gW3JpZ2h0LCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gMSA6IC0xO1xuICAgICAgdmFyIGF4aXMgPSBbdG9wLCBib3R0b21dLmluZGV4T2Yoa2V5KSA+PSAwID8gJ3knIDogJ3gnO1xuICAgICAgb3ZlcmZsb3dPZmZzZXRzW2tleV0gKz0gb2Zmc2V0W2F4aXNdICogbXVsdGlwbHk7XG4gICAgfSk7XG4gIH1cblxuICByZXR1cm4gb3ZlcmZsb3dPZmZzZXRzO1xufVxuXG52YXIgSU5WQUxJRF9FTEVNRU5UX0VSUk9SID0gJ1BvcHBlcjogSW52YWxpZCByZWZlcmVuY2Ugb3IgcG9wcGVyIGFyZ3VtZW50IHByb3ZpZGVkLiBUaGV5IG11c3QgYmUgZWl0aGVyIGEgRE9NIGVsZW1lbnQgb3IgdmlydHVhbCBlbGVtZW50Lic7XG52YXIgSU5GSU5JVEVfTE9PUF9FUlJPUiA9ICdQb3BwZXI6IEFuIGluZmluaXRlIGxvb3AgaW4gdGhlIG1vZGlmaWVycyBjeWNsZSBoYXMgYmVlbiBkZXRlY3RlZCEgVGhlIGN5Y2xlIGhhcyBiZWVuIGludGVycnVwdGVkIHRvIHByZXZlbnQgYSBicm93c2VyIGNyYXNoLic7XG52YXIgREVGQVVMVF9PUFRJT05TID0ge1xuICBwbGFjZW1lbnQ6ICdib3R0b20nLFxuICBtb2RpZmllcnM6IFtdLFxuICBzdHJhdGVneTogJ2Fic29sdXRlJ1xufTtcblxuZnVuY3Rpb24gYXJlVmFsaWRFbGVtZW50cygpIHtcbiAgZm9yICh2YXIgX2xlbiA9IGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3MgPSBuZXcgQXJyYXkoX2xlbiksIF9rZXkgPSAwOyBfa2V5IDwgX2xlbjsgX2tleSsrKSB7XG4gICAgYXJnc1tfa2V5XSA9IGFyZ3VtZW50c1tfa2V5XTtcbiAgfVxuXG4gIHJldHVybiAhYXJncy5zb21lKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgcmV0dXJuICEoZWxlbWVudCAmJiB0eXBlb2YgZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QgPT09ICdmdW5jdGlvbicpO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gcG9wcGVyR2VuZXJhdG9yKGdlbmVyYXRvck9wdGlvbnMpIHtcbiAgaWYgKGdlbmVyYXRvck9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgIGdlbmVyYXRvck9wdGlvbnMgPSB7fTtcbiAgfVxuXG4gIHZhciBfZ2VuZXJhdG9yT3B0aW9ucyA9IGdlbmVyYXRvck9wdGlvbnMsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYgPSBfZ2VuZXJhdG9yT3B0aW9ucy5kZWZhdWx0TW9kaWZpZXJzLFxuICAgICAgZGVmYXVsdE1vZGlmaWVycyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZiA9PT0gdm9pZCAwID8gW10gOiBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYsXG4gICAgICBfZ2VuZXJhdG9yT3B0aW9ucyRkZWYyID0gX2dlbmVyYXRvck9wdGlvbnMuZGVmYXVsdE9wdGlvbnMsXG4gICAgICBkZWZhdWx0T3B0aW9ucyA9IF9nZW5lcmF0b3JPcHRpb25zJGRlZjIgPT09IHZvaWQgMCA/IERFRkFVTFRfT1BUSU9OUyA6IF9nZW5lcmF0b3JPcHRpb25zJGRlZjI7XG4gIHJldHVybiBmdW5jdGlvbiBjcmVhdGVQb3BwZXIocmVmZXJlbmNlLCBwb3BwZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZGVmYXVsdE9wdGlvbnM7XG4gICAgfVxuXG4gICAgdmFyIHN0YXRlID0ge1xuICAgICAgcGxhY2VtZW50OiAnYm90dG9tJyxcbiAgICAgIG9yZGVyZWRNb2RpZmllcnM6IFtdLFxuICAgICAgb3B0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBERUZBVUxUX09QVElPTlMpLCBkZWZhdWx0T3B0aW9ucyksXG4gICAgICBtb2RpZmllcnNEYXRhOiB7fSxcbiAgICAgIGVsZW1lbnRzOiB7XG4gICAgICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXI6IHBvcHBlclxuICAgICAgfSxcbiAgICAgIGF0dHJpYnV0ZXM6IHt9LFxuICAgICAgc3R5bGVzOiB7fVxuICAgIH07XG4gICAgdmFyIGVmZmVjdENsZWFudXBGbnMgPSBbXTtcbiAgICB2YXIgaXNEZXN0cm95ZWQgPSBmYWxzZTtcbiAgICB2YXIgaW5zdGFuY2UgPSB7XG4gICAgICBzdGF0ZTogc3RhdGUsXG4gICAgICBzZXRPcHRpb25zOiBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBzdGF0ZS5vcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRPcHRpb25zKSwgc3RhdGUub3B0aW9ucyksIG9wdGlvbnMpO1xuICAgICAgICBzdGF0ZS5zY3JvbGxQYXJlbnRzID0ge1xuICAgICAgICAgIHJlZmVyZW5jZTogaXNFbGVtZW50KHJlZmVyZW5jZSkgPyBsaXN0U2Nyb2xsUGFyZW50cyhyZWZlcmVuY2UpIDogcmVmZXJlbmNlLmNvbnRleHRFbGVtZW50ID8gbGlzdFNjcm9sbFBhcmVudHMocmVmZXJlbmNlLmNvbnRleHRFbGVtZW50KSA6IFtdLFxuICAgICAgICAgIHBvcHBlcjogbGlzdFNjcm9sbFBhcmVudHMocG9wcGVyKVxuICAgICAgICB9OyAvLyBPcmRlcnMgdGhlIG1vZGlmaWVycyBiYXNlZCBvbiB0aGVpciBkZXBlbmRlbmNpZXMgYW5kIGBwaGFzZWBcbiAgICAgICAgLy8gcHJvcGVydGllc1xuXG4gICAgICAgIHZhciBvcmRlcmVkTW9kaWZpZXJzID0gb3JkZXJNb2RpZmllcnMobWVyZ2VCeU5hbWUoW10uY29uY2F0KGRlZmF1bHRNb2RpZmllcnMsIHN0YXRlLm9wdGlvbnMubW9kaWZpZXJzKSkpOyAvLyBTdHJpcCBvdXQgZGlzYWJsZWQgbW9kaWZpZXJzXG5cbiAgICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycyA9IG9yZGVyZWRNb2RpZmllcnMuZmlsdGVyKGZ1bmN0aW9uIChtKSB7XG4gICAgICAgICAgcmV0dXJuIG0uZW5hYmxlZDtcbiAgICAgICAgfSk7IC8vIFZhbGlkYXRlIHRoZSBwcm92aWRlZCBtb2RpZmllcnMgc28gdGhhdCB0aGUgY29uc3VtZXIgd2lsbCBnZXQgd2FybmVkXG4gICAgICAgIC8vIGlmIG9uZSBvZiB0aGUgbW9kaWZpZXJzIGlzIGludmFsaWQgZm9yIGFueSByZWFzb25cblxuICAgICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgIHZhciBtb2RpZmllcnMgPSB1bmlxdWVCeShbXS5jb25jYXQob3JkZXJlZE1vZGlmaWVycywgc3RhdGUub3B0aW9ucy5tb2RpZmllcnMpLCBmdW5jdGlvbiAoX3JlZikge1xuICAgICAgICAgICAgdmFyIG5hbWUgPSBfcmVmLm5hbWU7XG4gICAgICAgICAgICByZXR1cm4gbmFtZTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICB2YWxpZGF0ZU1vZGlmaWVycyhtb2RpZmllcnMpO1xuXG4gICAgICAgICAgaWYgKGdldEJhc2VQbGFjZW1lbnQoc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQpID09PSBhdXRvKSB7XG4gICAgICAgICAgICB2YXIgZmxpcE1vZGlmaWVyID0gc3RhdGUub3JkZXJlZE1vZGlmaWVycy5maW5kKGZ1bmN0aW9uIChfcmVmMikge1xuICAgICAgICAgICAgICB2YXIgbmFtZSA9IF9yZWYyLm5hbWU7XG4gICAgICAgICAgICAgIHJldHVybiBuYW1lID09PSAnZmxpcCc7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCFmbGlwTW9kaWZpZXIpIHtcbiAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhdXRvXCIgcGxhY2VtZW50cyByZXF1aXJlIHRoZSBcImZsaXBcIiBtb2RpZmllciBiZScsICdwcmVzZW50IGFuZCBlbmFibGVkIHRvIHdvcmsuJ10uam9pbignICcpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICB2YXIgX2dldENvbXB1dGVkU3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKHBvcHBlciksXG4gICAgICAgICAgICAgIG1hcmdpblRvcCA9IF9nZXRDb21wdXRlZFN0eWxlLm1hcmdpblRvcCxcbiAgICAgICAgICAgICAgbWFyZ2luUmlnaHQgPSBfZ2V0Q29tcHV0ZWRTdHlsZS5tYXJnaW5SaWdodCxcbiAgICAgICAgICAgICAgbWFyZ2luQm90dG9tID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luQm90dG9tLFxuICAgICAgICAgICAgICBtYXJnaW5MZWZ0ID0gX2dldENvbXB1dGVkU3R5bGUubWFyZ2luTGVmdDsgLy8gV2Ugbm8gbG9uZ2VyIHRha2UgaW50byBhY2NvdW50IGBtYXJnaW5zYCBvbiB0aGUgcG9wcGVyLCBhbmQgaXQgY2FuXG4gICAgICAgICAgLy8gY2F1c2UgYnVncyB3aXRoIHBvc2l0aW9uaW5nLCBzbyB3ZSdsbCB3YXJuIHRoZSBjb25zdW1lclxuXG5cbiAgICAgICAgICBpZiAoW21hcmdpblRvcCwgbWFyZ2luUmlnaHQsIG1hcmdpbkJvdHRvbSwgbWFyZ2luTGVmdF0uc29tZShmdW5jdGlvbiAobWFyZ2luKSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyc2VGbG9hdChtYXJnaW4pO1xuICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBjb25zb2xlLndhcm4oWydQb3BwZXI6IENTUyBcIm1hcmdpblwiIHN0eWxlcyBjYW5ub3QgYmUgdXNlZCB0byBhcHBseSBwYWRkaW5nJywgJ2JldHdlZW4gdGhlIHBvcHBlciBhbmQgaXRzIHJlZmVyZW5jZSBlbGVtZW50IG9yIGJvdW5kYXJ5LicsICdUbyByZXBsaWNhdGUgbWFyZ2luLCB1c2UgdGhlIGBvZmZzZXRgIG1vZGlmaWVyLCBhcyB3ZWxsIGFzJywgJ3RoZSBgcGFkZGluZ2Agb3B0aW9uIGluIHRoZSBgcHJldmVudE92ZXJmbG93YCBhbmQgYGZsaXBgJywgJ21vZGlmaWVycy4nXS5qb2luKCcgJykpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJ1bk1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICB9LFxuICAgICAgLy8gU3luYyB1cGRhdGUg4oCTIGl0IHdpbGwgYWx3YXlzIGJlIGV4ZWN1dGVkLCBldmVuIGlmIG5vdCBuZWNlc3NhcnkuIFRoaXNcbiAgICAgIC8vIGlzIHVzZWZ1bCBmb3IgbG93IGZyZXF1ZW5jeSB1cGRhdGVzIHdoZXJlIHN5bmMgYmVoYXZpb3Igc2ltcGxpZmllcyB0aGVcbiAgICAgIC8vIGxvZ2ljLlxuICAgICAgLy8gRm9yIGhpZ2ggZnJlcXVlbmN5IHVwZGF0ZXMgKGUuZy4gYHJlc2l6ZWAgYW5kIGBzY3JvbGxgIGV2ZW50cyksIGFsd2F5c1xuICAgICAgLy8gcHJlZmVyIHRoZSBhc3luYyBQb3BwZXIjdXBkYXRlIG1ldGhvZFxuICAgICAgZm9yY2VVcGRhdGU6IGZ1bmN0aW9uIGZvcmNlVXBkYXRlKCkge1xuICAgICAgICBpZiAoaXNEZXN0cm95ZWQpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgX3N0YXRlJGVsZW1lbnRzID0gc3RhdGUuZWxlbWVudHMsXG4gICAgICAgICAgICByZWZlcmVuY2UgPSBfc3RhdGUkZWxlbWVudHMucmVmZXJlbmNlLFxuICAgICAgICAgICAgcG9wcGVyID0gX3N0YXRlJGVsZW1lbnRzLnBvcHBlcjsgLy8gRG9uJ3QgcHJvY2VlZCBpZiBgcmVmZXJlbmNlYCBvciBgcG9wcGVyYCBhcmUgbm90IHZhbGlkIGVsZW1lbnRzXG4gICAgICAgIC8vIGFueW1vcmVcblxuICAgICAgICBpZiAoIWFyZVZhbGlkRWxlbWVudHMocmVmZXJlbmNlLCBwb3BwZXIpKSB7XG4gICAgICAgICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH0gLy8gU3RvcmUgdGhlIHJlZmVyZW5jZSBhbmQgcG9wcGVyIHJlY3RzIHRvIGJlIHJlYWQgYnkgbW9kaWZpZXJzXG5cblxuICAgICAgICBzdGF0ZS5yZWN0cyA9IHtcbiAgICAgICAgICByZWZlcmVuY2U6IGdldENvbXBvc2l0ZVJlY3QocmVmZXJlbmNlLCBnZXRPZmZzZXRQYXJlbnQocG9wcGVyKSwgc3RhdGUub3B0aW9ucy5zdHJhdGVneSA9PT0gJ2ZpeGVkJyksXG4gICAgICAgICAgcG9wcGVyOiBnZXRMYXlvdXRSZWN0KHBvcHBlcilcbiAgICAgICAgfTsgLy8gTW9kaWZpZXJzIGhhdmUgdGhlIGFiaWxpdHkgdG8gcmVzZXQgdGhlIGN1cnJlbnQgdXBkYXRlIGN5Y2xlLiBUaGVcbiAgICAgICAgLy8gbW9zdCBjb21tb24gdXNlIGNhc2UgZm9yIHRoaXMgaXMgdGhlIGBmbGlwYCBtb2RpZmllciBjaGFuZ2luZyB0aGVcbiAgICAgICAgLy8gcGxhY2VtZW50LCB3aGljaCB0aGVuIG5lZWRzIHRvIHJlLXJ1biBhbGwgdGhlIG1vZGlmaWVycywgYmVjYXVzZSB0aGVcbiAgICAgICAgLy8gbG9naWMgd2FzIHByZXZpb3VzbHkgcmFuIGZvciB0aGUgcHJldmlvdXMgcGxhY2VtZW50IGFuZCBpcyB0aGVyZWZvcmVcbiAgICAgICAgLy8gc3RhbGUvaW5jb3JyZWN0XG5cbiAgICAgICAgc3RhdGUucmVzZXQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucGxhY2VtZW50ID0gc3RhdGUub3B0aW9ucy5wbGFjZW1lbnQ7IC8vIE9uIGVhY2ggdXBkYXRlIGN5Y2xlLCB0aGUgYG1vZGlmaWVyc0RhdGFgIHByb3BlcnR5IGZvciBlYWNoIG1vZGlmaWVyXG4gICAgICAgIC8vIGlzIGZpbGxlZCB3aXRoIHRoZSBpbml0aWFsIGRhdGEgc3BlY2lmaWVkIGJ5IHRoZSBtb2RpZmllci4gVGhpcyBtZWFuc1xuICAgICAgICAvLyBpdCBkb2Vzbid0IHBlcnNpc3QgYW5kIGlzIGZyZXNoIG9uIGVhY2ggdXBkYXRlLlxuICAgICAgICAvLyBUbyBlbnN1cmUgcGVyc2lzdGVudCBkYXRhLCB1c2UgYCR7bmFtZX0jcGVyc2lzdGVudGBcblxuICAgICAgICBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmZvckVhY2goZnVuY3Rpb24gKG1vZGlmaWVyKSB7XG4gICAgICAgICAgcmV0dXJuIHN0YXRlLm1vZGlmaWVyc0RhdGFbbW9kaWZpZXIubmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBtb2RpZmllci5kYXRhKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBfX2RlYnVnX2xvb3BzX18gPSAwO1xuXG4gICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBzdGF0ZS5vcmRlcmVkTW9kaWZpZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgICAgICBfX2RlYnVnX2xvb3BzX18gKz0gMTtcblxuICAgICAgICAgICAgaWYgKF9fZGVidWdfbG9vcHNfXyA+IDEwMCkge1xuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKElORklOSVRFX0xPT1BfRVJST1IpO1xuICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoc3RhdGUucmVzZXQgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHN0YXRlLnJlc2V0ID0gZmFsc2U7XG4gICAgICAgICAgICBpbmRleCA9IC0xO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgdmFyIF9zdGF0ZSRvcmRlcmVkTW9kaWZpZSA9IHN0YXRlLm9yZGVyZWRNb2RpZmllcnNbaW5kZXhdLFxuICAgICAgICAgICAgICBmbiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5mbixcbiAgICAgICAgICAgICAgX3N0YXRlJG9yZGVyZWRNb2RpZmllMiA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5vcHRpb25zLFxuICAgICAgICAgICAgICBfb3B0aW9ucyA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZTIgPT09IHZvaWQgMCA/IHt9IDogX3N0YXRlJG9yZGVyZWRNb2RpZmllMixcbiAgICAgICAgICAgICAgbmFtZSA9IF9zdGF0ZSRvcmRlcmVkTW9kaWZpZS5uYW1lO1xuXG4gICAgICAgICAgaWYgKHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc3RhdGUgPSBmbih7XG4gICAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgICAgb3B0aW9uczogX29wdGlvbnMsXG4gICAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICAgIGluc3RhbmNlOiBpbnN0YW5jZVxuICAgICAgICAgICAgfSkgfHwgc3RhdGU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgLy8gQXN5bmMgYW5kIG9wdGltaXN0aWNhbGx5IG9wdGltaXplZCB1cGRhdGUg4oCTIGl0IHdpbGwgbm90IGJlIGV4ZWN1dGVkIGlmXG4gICAgICAvLyBub3QgbmVjZXNzYXJ5IChkZWJvdW5jZWQgdG8gcnVuIGF0IG1vc3Qgb25jZS1wZXItdGljaylcbiAgICAgIHVwZGF0ZTogZGVib3VuY2UoZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5mb3JjZVVwZGF0ZSgpO1xuICAgICAgICAgIHJlc29sdmUoc3RhdGUpO1xuICAgICAgICB9KTtcbiAgICAgIH0pLFxuICAgICAgZGVzdHJveTogZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgICAgY2xlYW51cE1vZGlmaWVyRWZmZWN0cygpO1xuICAgICAgICBpc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgICB9XG4gICAgfTtcblxuICAgIGlmICghYXJlVmFsaWRFbGVtZW50cyhyZWZlcmVuY2UsIHBvcHBlcikpIHtcbiAgICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoSU5WQUxJRF9FTEVNRU5UX0VSUk9SKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIGluc3RhbmNlO1xuICAgIH1cblxuICAgIGluc3RhbmNlLnNldE9wdGlvbnMob3B0aW9ucykudGhlbihmdW5jdGlvbiAoc3RhdGUpIHtcbiAgICAgIGlmICghaXNEZXN0cm95ZWQgJiYgb3B0aW9ucy5vbkZpcnN0VXBkYXRlKSB7XG4gICAgICAgIG9wdGlvbnMub25GaXJzdFVwZGF0ZShzdGF0ZSk7XG4gICAgICB9XG4gICAgfSk7IC8vIE1vZGlmaWVycyBoYXZlIHRoZSBhYmlsaXR5IHRvIGV4ZWN1dGUgYXJiaXRyYXJ5IGNvZGUgYmVmb3JlIHRoZSBmaXJzdFxuICAgIC8vIHVwZGF0ZSBjeWNsZSBydW5zLiBUaGV5IHdpbGwgYmUgZXhlY3V0ZWQgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIHVwZGF0ZVxuICAgIC8vIGN5Y2xlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgbW9kaWZpZXIgYWRkcyBzb21lIHBlcnNpc3RlbnQgZGF0YSB0aGF0XG4gICAgLy8gb3RoZXIgbW9kaWZpZXJzIG5lZWQgdG8gdXNlLCBidXQgdGhlIG1vZGlmaWVyIGlzIHJ1biBhZnRlciB0aGUgZGVwZW5kZW50XG4gICAgLy8gb25lLlxuXG4gICAgZnVuY3Rpb24gcnVuTW9kaWZpZXJFZmZlY3RzKCkge1xuICAgICAgc3RhdGUub3JkZXJlZE1vZGlmaWVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmMykge1xuICAgICAgICB2YXIgbmFtZSA9IF9yZWYzLm5hbWUsXG4gICAgICAgICAgICBfcmVmMyRvcHRpb25zID0gX3JlZjMub3B0aW9ucyxcbiAgICAgICAgICAgIG9wdGlvbnMgPSBfcmVmMyRvcHRpb25zID09PSB2b2lkIDAgPyB7fSA6IF9yZWYzJG9wdGlvbnMsXG4gICAgICAgICAgICBlZmZlY3QgPSBfcmVmMy5lZmZlY3Q7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBlZmZlY3QgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YXIgY2xlYW51cEZuID0gZWZmZWN0KHtcbiAgICAgICAgICAgIHN0YXRlOiBzdGF0ZSxcbiAgICAgICAgICAgIG5hbWU6IG5hbWUsXG4gICAgICAgICAgICBpbnN0YW5jZTogaW5zdGFuY2UsXG4gICAgICAgICAgICBvcHRpb25zOiBvcHRpb25zXG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICB2YXIgbm9vcEZuID0gZnVuY3Rpb24gbm9vcEZuKCkge307XG5cbiAgICAgICAgICBlZmZlY3RDbGVhbnVwRm5zLnB1c2goY2xlYW51cEZuIHx8IG5vb3BGbik7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFudXBNb2RpZmllckVmZmVjdHMoKSB7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zLmZvckVhY2goZnVuY3Rpb24gKGZuKSB7XG4gICAgICAgIHJldHVybiBmbigpO1xuICAgICAgfSk7XG4gICAgICBlZmZlY3RDbGVhbnVwRm5zID0gW107XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9O1xufVxuXG52YXIgcGFzc2l2ZSA9IHtcbiAgcGFzc2l2ZTogdHJ1ZVxufTtcblxuZnVuY3Rpb24gZWZmZWN0KF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIGluc3RhbmNlID0gX3JlZi5pbnN0YW5jZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRzY3JvbGwgPSBvcHRpb25zLnNjcm9sbCxcbiAgICAgIHNjcm9sbCA9IF9vcHRpb25zJHNjcm9sbCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJHNjcm9sbCxcbiAgICAgIF9vcHRpb25zJHJlc2l6ZSA9IG9wdGlvbnMucmVzaXplLFxuICAgICAgcmVzaXplID0gX29wdGlvbnMkcmVzaXplID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkcmVzaXplO1xuICB2YXIgd2luZG93ID0gZ2V0V2luZG93KHN0YXRlLmVsZW1lbnRzLnBvcHBlcik7XG4gIHZhciBzY3JvbGxQYXJlbnRzID0gW10uY29uY2F0KHN0YXRlLnNjcm9sbFBhcmVudHMucmVmZXJlbmNlLCBzdGF0ZS5zY3JvbGxQYXJlbnRzLnBvcHBlcik7XG5cbiAgaWYgKHNjcm9sbCkge1xuICAgIHNjcm9sbFBhcmVudHMuZm9yRWFjaChmdW5jdGlvbiAoc2Nyb2xsUGFyZW50KSB7XG4gICAgICBzY3JvbGxQYXJlbnQuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9KTtcbiAgfVxuXG4gIGlmIChyZXNpemUpIHtcbiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHNjcm9sbCkge1xuICAgICAgc2Nyb2xsUGFyZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChzY3JvbGxQYXJlbnQpIHtcbiAgICAgICAgc2Nyb2xsUGFyZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIGluc3RhbmNlLnVwZGF0ZSwgcGFzc2l2ZSk7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAocmVzaXplKSB7XG4gICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgaW5zdGFuY2UudXBkYXRlLCBwYXNzaXZlKTtcbiAgICB9XG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgZXZlbnRMaXN0ZW5lcnMgPSB7XG4gIG5hbWU6ICdldmVudExpc3RlbmVycycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnd3JpdGUnLFxuICBmbjogZnVuY3Rpb24gZm4oKSB7fSxcbiAgZWZmZWN0OiBlZmZlY3QsXG4gIGRhdGE6IHt9XG59O1xuXG5mdW5jdGlvbiBwb3BwZXJPZmZzZXRzKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIC8vIE9mZnNldHMgYXJlIHRoZSBhY3R1YWwgcG9zaXRpb24gdGhlIHBvcHBlciBuZWVkcyB0byBoYXZlIHRvIGJlXG4gIC8vIHByb3Blcmx5IHBvc2l0aW9uZWQgbmVhciBpdHMgcmVmZXJlbmNlIGVsZW1lbnRcbiAgLy8gVGhpcyBpcyB0aGUgbW9zdCBiYXNpYyBwbGFjZW1lbnQsIGFuZCB3aWxsIGJlIGFkanVzdGVkIGJ5XG4gIC8vIHRoZSBtb2RpZmllcnMgaW4gdGhlIG5leHQgc3RlcFxuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gY29tcHV0ZU9mZnNldHMoe1xuICAgIHJlZmVyZW5jZTogc3RhdGUucmVjdHMucmVmZXJlbmNlLFxuICAgIGVsZW1lbnQ6IHN0YXRlLnJlY3RzLnBvcHBlcixcbiAgICBzdHJhdGVneTogJ2Fic29sdXRlJyxcbiAgICBwbGFjZW1lbnQ6IHN0YXRlLnBsYWNlbWVudFxuICB9KTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbnZhciBwb3BwZXJPZmZzZXRzJDEgPSB7XG4gIG5hbWU6ICdwb3BwZXJPZmZzZXRzJyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdyZWFkJyxcbiAgZm46IHBvcHBlck9mZnNldHMsXG4gIGRhdGE6IHt9XG59O1xuXG52YXIgdW5zZXRTaWRlcyA9IHtcbiAgdG9wOiAnYXV0bycsXG4gIHJpZ2h0OiAnYXV0bycsXG4gIGJvdHRvbTogJ2F1dG8nLFxuICBsZWZ0OiAnYXV0bydcbn07IC8vIFJvdW5kIHRoZSBvZmZzZXRzIHRvIHRoZSBuZWFyZXN0IHN1aXRhYmxlIHN1YnBpeGVsIGJhc2VkIG9uIHRoZSBEUFIuXG4vLyBab29taW5nIGNhbiBjaGFuZ2UgdGhlIERQUiwgYnV0IGl0IHNlZW1zIHRvIHJlcG9ydCBhIHZhbHVlIHRoYXQgd2lsbFxuLy8gY2xlYW5seSBkaXZpZGUgdGhlIHZhbHVlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdWJwaXhlbHMuXG5cbmZ1bmN0aW9uIHJvdW5kT2Zmc2V0cyhfcmVmKSB7XG4gIHZhciB4ID0gX3JlZi54LFxuICAgICAgeSA9IF9yZWYueTtcbiAgdmFyIHdpbiA9IHdpbmRvdztcbiAgdmFyIGRwciA9IHdpbi5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gIHJldHVybiB7XG4gICAgeDogTWF0aC5yb3VuZCh4ICogZHByKSAvIGRwciB8fCAwLFxuICAgIHk6IE1hdGgucm91bmQoeSAqIGRwcikgLyBkcHIgfHwgMFxuICB9O1xufVxuXG5mdW5jdGlvbiBtYXBUb1N0eWxlcyhfcmVmMikge1xuICB2YXIgX09iamVjdCRhc3NpZ24yO1xuXG4gIHZhciBwb3BwZXIgPSBfcmVmMi5wb3BwZXIsXG4gICAgICBwb3BwZXJSZWN0ID0gX3JlZjIucG9wcGVyUmVjdCxcbiAgICAgIHBsYWNlbWVudCA9IF9yZWYyLnBsYWNlbWVudCxcbiAgICAgIG9mZnNldHMgPSBfcmVmMi5vZmZzZXRzLFxuICAgICAgcG9zaXRpb24gPSBfcmVmMi5wb3NpdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9yZWYyLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGFkYXB0aXZlID0gX3JlZjIuYWRhcHRpdmU7XG5cbiAgdmFyIF9yb3VuZE9mZnNldHMgPSByb3VuZE9mZnNldHMob2Zmc2V0cyksXG4gICAgICB4ID0gX3JvdW5kT2Zmc2V0cy54LFxuICAgICAgeSA9IF9yb3VuZE9mZnNldHMueTtcblxuICB2YXIgaGFzWCA9IG9mZnNldHMuaGFzT3duUHJvcGVydHkoJ3gnKTtcbiAgdmFyIGhhc1kgPSBvZmZzZXRzLmhhc093blByb3BlcnR5KCd5Jyk7XG4gIHZhciBzaWRlWCA9IGxlZnQ7XG4gIHZhciBzaWRlWSA9IHRvcDtcbiAgdmFyIHdpbiA9IHdpbmRvdztcblxuICBpZiAoYWRhcHRpdmUpIHtcbiAgICB2YXIgb2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KHBvcHBlcik7XG5cbiAgICBpZiAob2Zmc2V0UGFyZW50ID09PSBnZXRXaW5kb3cocG9wcGVyKSkge1xuICAgICAgb2Zmc2V0UGFyZW50ID0gZ2V0RG9jdW1lbnRFbGVtZW50KHBvcHBlcik7XG4gICAgfSAvLyAkRmxvd0ZpeE1lOiBmb3JjZSB0eXBlIHJlZmluZW1lbnQsIHdlIGNvbXBhcmUgb2Zmc2V0UGFyZW50IHdpdGggd2luZG93IGFib3ZlLCBidXQgRmxvdyBkb2Vzbid0IGRldGVjdCBpdFxuXG4gICAgLyo6OiBvZmZzZXRQYXJlbnQgPSAob2Zmc2V0UGFyZW50OiBFbGVtZW50KTsgKi9cblxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gdG9wKSB7XG4gICAgICBzaWRlWSA9IGJvdHRvbTtcbiAgICAgIHkgLT0gb2Zmc2V0UGFyZW50LmNsaWVudEhlaWdodCAtIHBvcHBlclJlY3QuaGVpZ2h0O1xuICAgICAgeSAqPSBncHVBY2NlbGVyYXRpb24gPyAxIDogLTE7XG4gICAgfVxuXG4gICAgaWYgKHBsYWNlbWVudCA9PT0gbGVmdCkge1xuICAgICAgc2lkZVggPSByaWdodDtcbiAgICAgIHggLT0gb2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoIC0gcG9wcGVyUmVjdC53aWR0aDtcbiAgICAgIHggKj0gZ3B1QWNjZWxlcmF0aW9uID8gMSA6IC0xO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb21tb25TdHlsZXMgPSBPYmplY3QuYXNzaWduKHtcbiAgICBwb3NpdGlvbjogcG9zaXRpb25cbiAgfSwgYWRhcHRpdmUgJiYgdW5zZXRTaWRlcyk7XG5cbiAgaWYgKGdwdUFjY2VsZXJhdGlvbikge1xuICAgIHZhciBfT2JqZWN0JGFzc2lnbjtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbW1vblN0eWxlcyksIHt9LCAoX09iamVjdCRhc3NpZ24gPSB7fSwgX09iamVjdCRhc3NpZ25bc2lkZVldID0gaGFzWSA/ICcwJyA6ICcnLCBfT2JqZWN0JGFzc2lnbltzaWRlWF0gPSBoYXNYID8gJzAnIDogJycsIF9PYmplY3QkYXNzaWduLnRyYW5zZm9ybSA9ICh3aW4uZGV2aWNlUGl4ZWxSYXRpbyB8fCAxKSA8IDIgPyBcInRyYW5zbGF0ZShcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4KVwiIDogXCJ0cmFuc2xhdGUzZChcIiArIHggKyBcInB4LCBcIiArIHkgKyBcInB4LCAwKVwiLCBfT2JqZWN0JGFzc2lnbikpO1xuICB9XG5cbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzKSwge30sIChfT2JqZWN0JGFzc2lnbjIgPSB7fSwgX09iamVjdCRhc3NpZ24yW3NpZGVZXSA9IGhhc1kgPyB5ICsgXCJweFwiIDogJycsIF9PYmplY3QkYXNzaWduMltzaWRlWF0gPSBoYXNYID8geCArIFwicHhcIiA6ICcnLCBfT2JqZWN0JGFzc2lnbjIudHJhbnNmb3JtID0gJycsIF9PYmplY3QkYXNzaWduMikpO1xufVxuXG5mdW5jdGlvbiBjb21wdXRlU3R5bGVzKF9yZWYzKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYzLnN0YXRlLFxuICAgICAgb3B0aW9ucyA9IF9yZWYzLm9wdGlvbnM7XG4gIHZhciBfb3B0aW9ucyRncHVBY2NlbGVyYXQgPSBvcHRpb25zLmdwdUFjY2VsZXJhdGlvbixcbiAgICAgIGdwdUFjY2VsZXJhdGlvbiA9IF9vcHRpb25zJGdwdUFjY2VsZXJhdCA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJGdwdUFjY2VsZXJhdCxcbiAgICAgIF9vcHRpb25zJGFkYXB0aXZlID0gb3B0aW9ucy5hZGFwdGl2ZSxcbiAgICAgIGFkYXB0aXZlID0gX29wdGlvbnMkYWRhcHRpdmUgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhZGFwdGl2ZTtcblxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHZhciB0cmFuc2l0aW9uUHJvcGVydHkgPSBnZXRDb21wdXRlZFN0eWxlKHN0YXRlLmVsZW1lbnRzLnBvcHBlcikudHJhbnNpdGlvblByb3BlcnR5IHx8ICcnO1xuXG4gICAgaWYgKGFkYXB0aXZlICYmIFsndHJhbnNmb3JtJywgJ3RvcCcsICdyaWdodCcsICdib3R0b20nLCAnbGVmdCddLnNvbWUoZnVuY3Rpb24gKHByb3BlcnR5KSB7XG4gICAgICByZXR1cm4gdHJhbnNpdGlvblByb3BlcnR5LmluZGV4T2YocHJvcGVydHkpID49IDA7XG4gICAgfSkpIHtcbiAgICAgIGNvbnNvbGUud2FybihbJ1BvcHBlcjogRGV0ZWN0ZWQgQ1NTIHRyYW5zaXRpb25zIG9uIGF0IGxlYXN0IG9uZSBvZiB0aGUgZm9sbG93aW5nJywgJ0NTUyBwcm9wZXJ0aWVzOiBcInRyYW5zZm9ybVwiLCBcInRvcFwiLCBcInJpZ2h0XCIsIFwiYm90dG9tXCIsIFwibGVmdFwiLicsICdcXG5cXG4nLCAnRGlzYWJsZSB0aGUgXCJjb21wdXRlU3R5bGVzXCIgbW9kaWZpZXJcXCdzIGBhZGFwdGl2ZWAgb3B0aW9uIHRvIGFsbG93JywgJ2ZvciBzbW9vdGggdHJhbnNpdGlvbnMsIG9yIHJlbW92ZSB0aGVzZSBwcm9wZXJ0aWVzIGZyb20gdGhlIENTUycsICd0cmFuc2l0aW9uIGRlY2xhcmF0aW9uIG9uIHRoZSBwb3BwZXIgZWxlbWVudCBpZiBvbmx5IHRyYW5zaXRpb25pbmcnLCAnb3BhY2l0eSBvciBiYWNrZ3JvdW5kLWNvbG9yIGZvciBleGFtcGxlLicsICdcXG5cXG4nLCAnV2UgcmVjb21tZW5kIHVzaW5nIHRoZSBwb3BwZXIgZWxlbWVudCBhcyBhIHdyYXBwZXIgYXJvdW5kIGFuIGlubmVyJywgJ2VsZW1lbnQgdGhhdCBjYW4gaGF2ZSBhbnkgQ1NTIHByb3BlcnR5IHRyYW5zaXRpb25lZCBmb3IgYW5pbWF0aW9ucy4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjb21tb25TdHlsZXMgPSB7XG4gICAgcGxhY2VtZW50OiBnZXRCYXNlUGxhY2VtZW50KHN0YXRlLnBsYWNlbWVudCksXG4gICAgcG9wcGVyOiBzdGF0ZS5lbGVtZW50cy5wb3BwZXIsXG4gICAgcG9wcGVyUmVjdDogc3RhdGUucmVjdHMucG9wcGVyLFxuICAgIGdwdUFjY2VsZXJhdGlvbjogZ3B1QWNjZWxlcmF0aW9uXG4gIH07XG5cbiAgaWYgKHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyAhPSBudWxsKSB7XG4gICAgc3RhdGUuc3R5bGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3R5bGVzLnBvcHBlciksIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzKSwge30sIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cyxcbiAgICAgIHBvc2l0aW9uOiBzdGF0ZS5vcHRpb25zLnN0cmF0ZWd5LFxuICAgICAgYWRhcHRpdmU6IGFkYXB0aXZlXG4gICAgfSkpKTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLmFycm93ICE9IG51bGwpIHtcbiAgICBzdGF0ZS5zdHlsZXMuYXJyb3cgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnN0eWxlcy5hcnJvdyksIG1hcFRvU3R5bGVzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgY29tbW9uU3R5bGVzKSwge30sIHtcbiAgICAgIG9mZnNldHM6IHN0YXRlLm1vZGlmaWVyc0RhdGEuYXJyb3csXG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJyxcbiAgICAgIGFkYXB0aXZlOiBmYWxzZVxuICAgIH0pKSk7XG4gIH1cblxuICBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYXR0cmlidXRlcy5wb3BwZXIpLCB7fSwge1xuICAgICdkYXRhLXBvcHBlci1wbGFjZW1lbnQnOiBzdGF0ZS5wbGFjZW1lbnRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgY29tcHV0ZVN0eWxlcyQxID0ge1xuICBuYW1lOiAnY29tcHV0ZVN0eWxlcycsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnYmVmb3JlV3JpdGUnLFxuICBmbjogY29tcHV0ZVN0eWxlcyxcbiAgZGF0YToge31cbn07XG5cbi8vIGFuZCBhcHBsaWVzIHRoZW0gdG8gdGhlIEhUTUxFbGVtZW50cyBzdWNoIGFzIHBvcHBlciBhbmQgYXJyb3dcblxuZnVuY3Rpb24gYXBwbHlTdHlsZXMoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlO1xuICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBzdHlsZSA9IHN0YXRlLnN0eWxlc1tuYW1lXSB8fCB7fTtcbiAgICB2YXIgYXR0cmlidXRlcyA9IHN0YXRlLmF0dHJpYnV0ZXNbbmFtZV0gfHwge307XG4gICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTsgLy8gYXJyb3cgaXMgb3B0aW9uYWwgKyB2aXJ0dWFsIGVsZW1lbnRzXG5cbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGbG93IGRvZXNuJ3Qgc3VwcG9ydCB0byBleHRlbmQgdGhpcyBwcm9wZXJ0eSwgYnV0IGl0J3MgdGhlIG1vc3RcbiAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgIC8vICRGbG93Rml4TWVcblxuXG4gICAgT2JqZWN0LmFzc2lnbihlbGVtZW50LnN0eWxlLCBzdHlsZSk7XG4gICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIHZhbHVlID0gYXR0cmlidXRlc1tuYW1lXTtcblxuICAgICAgaWYgKHZhbHVlID09PSBmYWxzZSkge1xuICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShuYW1lKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlID09PSB0cnVlID8gJycgOiB2YWx1ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0pO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QkMShfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZTtcbiAgdmFyIGluaXRpYWxTdHlsZXMgPSB7XG4gICAgcG9wcGVyOiB7XG4gICAgICBwb3NpdGlvbjogc3RhdGUub3B0aW9ucy5zdHJhdGVneSxcbiAgICAgIGxlZnQ6ICcwJyxcbiAgICAgIHRvcDogJzAnLFxuICAgICAgbWFyZ2luOiAnMCdcbiAgICB9LFxuICAgIGFycm93OiB7XG4gICAgICBwb3NpdGlvbjogJ2Fic29sdXRlJ1xuICAgIH0sXG4gICAgcmVmZXJlbmNlOiB7fVxuICB9O1xuICBPYmplY3QuYXNzaWduKHN0YXRlLmVsZW1lbnRzLnBvcHBlci5zdHlsZSwgaW5pdGlhbFN0eWxlcy5wb3BwZXIpO1xuXG4gIGlmIChzdGF0ZS5lbGVtZW50cy5hcnJvdykge1xuICAgIE9iamVjdC5hc3NpZ24oc3RhdGUuZWxlbWVudHMuYXJyb3cuc3R5bGUsIGluaXRpYWxTdHlsZXMuYXJyb3cpO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBPYmplY3Qua2V5cyhzdGF0ZS5lbGVtZW50cykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgICAgdmFyIGVsZW1lbnQgPSBzdGF0ZS5lbGVtZW50c1tuYW1lXTtcbiAgICAgIHZhciBhdHRyaWJ1dGVzID0gc3RhdGUuYXR0cmlidXRlc1tuYW1lXSB8fCB7fTtcbiAgICAgIHZhciBzdHlsZVByb3BlcnRpZXMgPSBPYmplY3Qua2V5cyhzdGF0ZS5zdHlsZXMuaGFzT3duUHJvcGVydHkobmFtZSkgPyBzdGF0ZS5zdHlsZXNbbmFtZV0gOiBpbml0aWFsU3R5bGVzW25hbWVdKTsgLy8gU2V0IGFsbCB2YWx1ZXMgdG8gYW4gZW1wdHkgc3RyaW5nIHRvIHVuc2V0IHRoZW1cblxuICAgICAgdmFyIHN0eWxlID0gc3R5bGVQcm9wZXJ0aWVzLnJlZHVjZShmdW5jdGlvbiAoc3R5bGUsIHByb3BlcnR5KSB7XG4gICAgICAgIHN0eWxlW3Byb3BlcnR5XSA9ICcnO1xuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICB9LCB7fSk7IC8vIGFycm93IGlzIG9wdGlvbmFsICsgdmlydHVhbCBlbGVtZW50c1xuXG4gICAgICBpZiAoIWlzSFRNTEVsZW1lbnQoZWxlbWVudCkgfHwgIWdldE5vZGVOYW1lKGVsZW1lbnQpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH0gLy8gRmxvdyBkb2Vzbid0IHN1cHBvcnQgdG8gZXh0ZW5kIHRoaXMgcHJvcGVydHksIGJ1dCBpdCdzIHRoZSBtb3N0XG4gICAgICAvLyBlZmZlY3RpdmUgd2F5IHRvIGFwcGx5IHN0eWxlcyB0byBhbiBIVE1MRWxlbWVudFxuICAgICAgLy8gJEZsb3dGaXhNZVxuXG5cbiAgICAgIE9iamVjdC5hc3NpZ24oZWxlbWVudC5zdHlsZSwgc3R5bGUpO1xuICAgICAgT2JqZWN0LmtleXMoYXR0cmlidXRlcykuZm9yRWFjaChmdW5jdGlvbiAoYXR0cmlidXRlKSB7XG4gICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKGF0dHJpYnV0ZSk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgfTtcbn0gLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5cbnZhciBhcHBseVN0eWxlcyQxID0ge1xuICBuYW1lOiAnYXBwbHlTdHlsZXMnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ3dyaXRlJyxcbiAgZm46IGFwcGx5U3R5bGVzLFxuICBlZmZlY3Q6IGVmZmVjdCQxLFxuICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ11cbn07XG5cbmZ1bmN0aW9uIGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgcmVjdHMsIG9mZnNldCkge1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcbiAgdmFyIGludmVydERpc3RhbmNlID0gW2xlZnQsIHRvcF0uaW5kZXhPZihiYXNlUGxhY2VtZW50KSA+PSAwID8gLTEgOiAxO1xuXG4gIHZhciBfcmVmID0gdHlwZW9mIG9mZnNldCA9PT0gJ2Z1bmN0aW9uJyA/IG9mZnNldChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJlY3RzKSwge30sIHtcbiAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudFxuICB9KSkgOiBvZmZzZXQsXG4gICAgICBza2lkZGluZyA9IF9yZWZbMF0sXG4gICAgICBkaXN0YW5jZSA9IF9yZWZbMV07XG5cbiAgc2tpZGRpbmcgPSBza2lkZGluZyB8fCAwO1xuICBkaXN0YW5jZSA9IChkaXN0YW5jZSB8fCAwKSAqIGludmVydERpc3RhbmNlO1xuICByZXR1cm4gW2xlZnQsIHJpZ2h0XS5pbmRleE9mKGJhc2VQbGFjZW1lbnQpID49IDAgPyB7XG4gICAgeDogZGlzdGFuY2UsXG4gICAgeTogc2tpZGRpbmdcbiAgfSA6IHtcbiAgICB4OiBza2lkZGluZyxcbiAgICB5OiBkaXN0YW5jZVxuICB9O1xufVxuXG5mdW5jdGlvbiBvZmZzZXQoX3JlZjIpIHtcbiAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZjIub3B0aW9ucyxcbiAgICAgIG5hbWUgPSBfcmVmMi5uYW1lO1xuICB2YXIgX29wdGlvbnMkb2Zmc2V0ID0gb3B0aW9ucy5vZmZzZXQsXG4gICAgICBvZmZzZXQgPSBfb3B0aW9ucyRvZmZzZXQgPT09IHZvaWQgMCA/IFswLCAwXSA6IF9vcHRpb25zJG9mZnNldDtcbiAgdmFyIGRhdGEgPSBwbGFjZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICBhY2NbcGxhY2VtZW50XSA9IGRpc3RhbmNlQW5kU2tpZGRpbmdUb1hZKHBsYWNlbWVudCwgc3RhdGUucmVjdHMsIG9mZnNldCk7XG4gICAgcmV0dXJuIGFjYztcbiAgfSwge30pO1xuICB2YXIgX2RhdGEkc3RhdGUkcGxhY2VtZW50ID0gZGF0YVtzdGF0ZS5wbGFjZW1lbnRdLFxuICAgICAgeCA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC54LFxuICAgICAgeSA9IF9kYXRhJHN0YXRlJHBsYWNlbWVudC55O1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHMgIT0gbnVsbCkge1xuICAgIHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cy54ICs9IHg7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YS5wb3BwZXJPZmZzZXRzLnkgKz0geTtcbiAgfVxuXG4gIHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZV0gPSBkYXRhO1xufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxudmFyIG9mZnNldCQxID0ge1xuICBuYW1lOiAnb2Zmc2V0JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgcmVxdWlyZXM6IFsncG9wcGVyT2Zmc2V0cyddLFxuICBmbjogb2Zmc2V0XG59O1xuXG52YXIgaGFzaCA9IHtcbiAgbGVmdDogJ3JpZ2h0JyxcbiAgcmlnaHQ6ICdsZWZ0JyxcbiAgYm90dG9tOiAndG9wJyxcbiAgdG9wOiAnYm90dG9tJ1xufTtcbmZ1bmN0aW9uIGdldE9wcG9zaXRlUGxhY2VtZW50KHBsYWNlbWVudCkge1xuICByZXR1cm4gcGxhY2VtZW50LnJlcGxhY2UoL2xlZnR8cmlnaHR8Ym90dG9tfHRvcC9nLCBmdW5jdGlvbiAobWF0Y2hlZCkge1xuICAgIHJldHVybiBoYXNoW21hdGNoZWRdO1xuICB9KTtcbn1cblxudmFyIGhhc2gkMSA9IHtcbiAgc3RhcnQ6ICdlbmQnLFxuICBlbmQ6ICdzdGFydCdcbn07XG5mdW5jdGlvbiBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChwbGFjZW1lbnQpIHtcbiAgcmV0dXJuIHBsYWNlbWVudC5yZXBsYWNlKC9zdGFydHxlbmQvZywgZnVuY3Rpb24gKG1hdGNoZWQpIHtcbiAgICByZXR1cm4gaGFzaCQxW21hdGNoZWRdO1xuICB9KTtcbn1cblxuLyo6OiB0eXBlIE92ZXJmbG93c01hcCA9IHsgW0NvbXB1dGVkUGxhY2VtZW50XTogbnVtYmVyIH07ICovXG5cbi8qOzsgdHlwZSBPdmVyZmxvd3NNYXAgPSB7IFtrZXkgaW4gQ29tcHV0ZWRQbGFjZW1lbnRdOiBudW1iZXIgfTsgKi9cbmZ1bmN0aW9uIGNvbXB1dGVBdXRvUGxhY2VtZW50KHN0YXRlLCBvcHRpb25zKSB7XG4gIGlmIChvcHRpb25zID09PSB2b2lkIDApIHtcbiAgICBvcHRpb25zID0ge307XG4gIH1cblxuICB2YXIgX29wdGlvbnMgPSBvcHRpb25zLFxuICAgICAgcGxhY2VtZW50ID0gX29wdGlvbnMucGxhY2VtZW50LFxuICAgICAgYm91bmRhcnkgPSBfb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IF9vcHRpb25zLnJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmcgPSBfb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucy5mbGlwVmFyaWF0aW9ucyxcbiAgICAgIF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9IF9vcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cyxcbiAgICAgIGFsbG93ZWRBdXRvUGxhY2VtZW50cyA9IF9vcHRpb25zJGFsbG93ZWRBdXRvUCA9PT0gdm9pZCAwID8gcGxhY2VtZW50cyA6IF9vcHRpb25zJGFsbG93ZWRBdXRvUDtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihwbGFjZW1lbnQpO1xuICB2YXIgcGxhY2VtZW50cyQxID0gdmFyaWF0aW9uID8gZmxpcFZhcmlhdGlvbnMgPyB2YXJpYXRpb25QbGFjZW1lbnRzIDogdmFyaWF0aW9uUGxhY2VtZW50cy5maWx0ZXIoZnVuY3Rpb24gKHBsYWNlbWVudCkge1xuICAgIHJldHVybiBnZXRWYXJpYXRpb24ocGxhY2VtZW50KSA9PT0gdmFyaWF0aW9uO1xuICB9KSA6IGJhc2VQbGFjZW1lbnRzOyAvLyAkRmxvd0ZpeE1lXG5cbiAgdmFyIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cyQxLmZpbHRlcihmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgcmV0dXJuIGFsbG93ZWRBdXRvUGxhY2VtZW50cy5pbmRleE9mKHBsYWNlbWVudCkgPj0gMDtcbiAgfSk7XG5cbiAgaWYgKGFsbG93ZWRQbGFjZW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIGFsbG93ZWRQbGFjZW1lbnRzID0gcGxhY2VtZW50cyQxO1xuXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoWydQb3BwZXI6IFRoZSBgYWxsb3dlZEF1dG9QbGFjZW1lbnRzYCBvcHRpb24gZGlkIG5vdCBhbGxvdyBhbnknLCAncGxhY2VtZW50cy4gRW5zdXJlIHRoZSBgcGxhY2VtZW50YCBvcHRpb24gbWF0Y2hlcyB0aGUgdmFyaWF0aW9uJywgJ29mIHRoZSBhbGxvd2VkIHBsYWNlbWVudHMuJywgJ0ZvciBleGFtcGxlLCBcImF1dG9cIiBjYW5ub3QgYmUgdXNlZCB0byBhbGxvdyBcImJvdHRvbS1zdGFydFwiLicsICdVc2UgXCJhdXRvLXN0YXJ0XCIgaW5zdGVhZC4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfSAvLyAkRmxvd0ZpeE1lOiBGbG93IHNlZW1zIHRvIGhhdmUgcHJvYmxlbXMgd2l0aCB0d28gYXJyYXkgdW5pb25zLi4uXG5cblxuICB2YXIgb3ZlcmZsb3dzID0gYWxsb3dlZFBsYWNlbWVudHMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsYWNlbWVudCkge1xuICAgIGFjY1twbGFjZW1lbnRdID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5OiByb290Qm91bmRhcnksXG4gICAgICBwYWRkaW5nOiBwYWRkaW5nXG4gICAgfSlbZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpXTtcbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBPYmplY3Qua2V5cyhvdmVyZmxvd3MpLnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dzW2FdIC0gb3ZlcmZsb3dzW2JdO1xuICB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0RXhwYW5kZWRGYWxsYmFja1BsYWNlbWVudHMocGxhY2VtZW50KSB7XG4gIGlmIChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8pIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgb3Bwb3NpdGVQbGFjZW1lbnQgPSBnZXRPcHBvc2l0ZVBsYWNlbWVudChwbGFjZW1lbnQpO1xuICByZXR1cm4gW2dldE9wcG9zaXRlVmFyaWF0aW9uUGxhY2VtZW50KHBsYWNlbWVudCksIG9wcG9zaXRlUGxhY2VtZW50LCBnZXRPcHBvc2l0ZVZhcmlhdGlvblBsYWNlbWVudChvcHBvc2l0ZVBsYWNlbWVudCldO1xufVxuXG5mdW5jdGlvbiBmbGlwKF9yZWYpIHtcbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnMsXG4gICAgICBuYW1lID0gX3JlZi5uYW1lO1xuXG4gIGlmIChzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdLl9za2lwKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRhbHRBeGlzLFxuICAgICAgc3BlY2lmaWVkRmFsbGJhY2tQbGFjZW1lbnRzID0gb3B0aW9ucy5mYWxsYmFja1BsYWNlbWVudHMsXG4gICAgICBwYWRkaW5nID0gb3B0aW9ucy5wYWRkaW5nLFxuICAgICAgYm91bmRhcnkgPSBvcHRpb25zLmJvdW5kYXJ5LFxuICAgICAgcm9vdEJvdW5kYXJ5ID0gb3B0aW9ucy5yb290Qm91bmRhcnksXG4gICAgICBhbHRCb3VuZGFyeSA9IG9wdGlvbnMuYWx0Qm91bmRhcnksXG4gICAgICBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPSBvcHRpb25zLmZsaXBWYXJpYXRpb25zLFxuICAgICAgZmxpcFZhcmlhdGlvbnMgPSBfb3B0aW9ucyRmbGlwVmFyaWF0aW8gPT09IHZvaWQgMCA/IHRydWUgOiBfb3B0aW9ucyRmbGlwVmFyaWF0aW8sXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHMgPSBvcHRpb25zLmFsbG93ZWRBdXRvUGxhY2VtZW50cztcbiAgdmFyIHByZWZlcnJlZFBsYWNlbWVudCA9IHN0YXRlLm9wdGlvbnMucGxhY2VtZW50O1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocHJlZmVycmVkUGxhY2VtZW50KTtcbiAgdmFyIGlzQmFzZVBsYWNlbWVudCA9IGJhc2VQbGFjZW1lbnQgPT09IHByZWZlcnJlZFBsYWNlbWVudDtcbiAgdmFyIGZhbGxiYWNrUGxhY2VtZW50cyA9IHNwZWNpZmllZEZhbGxiYWNrUGxhY2VtZW50cyB8fCAoaXNCYXNlUGxhY2VtZW50IHx8ICFmbGlwVmFyaWF0aW9ucyA/IFtnZXRPcHBvc2l0ZVBsYWNlbWVudChwcmVmZXJyZWRQbGFjZW1lbnQpXSA6IGdldEV4cGFuZGVkRmFsbGJhY2tQbGFjZW1lbnRzKHByZWZlcnJlZFBsYWNlbWVudCkpO1xuICB2YXIgcGxhY2VtZW50cyA9IFtwcmVmZXJyZWRQbGFjZW1lbnRdLmNvbmNhdChmYWxsYmFja1BsYWNlbWVudHMpLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBwbGFjZW1lbnQpIHtcbiAgICByZXR1cm4gYWNjLmNvbmNhdChnZXRCYXNlUGxhY2VtZW50KHBsYWNlbWVudCkgPT09IGF1dG8gPyBjb21wdXRlQXV0b1BsYWNlbWVudChzdGF0ZSwge1xuICAgICAgcGxhY2VtZW50OiBwbGFjZW1lbnQsXG4gICAgICBib3VuZGFyeTogYm91bmRhcnksXG4gICAgICByb290Qm91bmRhcnk6IHJvb3RCb3VuZGFyeSxcbiAgICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgICBmbGlwVmFyaWF0aW9uczogZmxpcFZhcmlhdGlvbnMsXG4gICAgICBhbGxvd2VkQXV0b1BsYWNlbWVudHM6IGFsbG93ZWRBdXRvUGxhY2VtZW50c1xuICAgIH0pIDogcGxhY2VtZW50KTtcbiAgfSwgW10pO1xuICB2YXIgcmVmZXJlbmNlUmVjdCA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZTtcbiAgdmFyIHBvcHBlclJlY3QgPSBzdGF0ZS5yZWN0cy5wb3BwZXI7XG4gIHZhciBjaGVja3NNYXAgPSBuZXcgTWFwKCk7XG4gIHZhciBtYWtlRmFsbGJhY2tDaGVja3MgPSB0cnVlO1xuICB2YXIgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gcGxhY2VtZW50c1swXTtcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IHBsYWNlbWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgcGxhY2VtZW50ID0gcGxhY2VtZW50c1tpXTtcblxuICAgIHZhciBfYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KTtcblxuICAgIHZhciBpc1N0YXJ0VmFyaWF0aW9uID0gZ2V0VmFyaWF0aW9uKHBsYWNlbWVudCkgPT09IHN0YXJ0O1xuICAgIHZhciBpc1ZlcnRpY2FsID0gW3RvcCwgYm90dG9tXS5pbmRleE9mKF9iYXNlUGxhY2VtZW50KSA+PSAwO1xuICAgIHZhciBsZW4gPSBpc1ZlcnRpY2FsID8gJ3dpZHRoJyA6ICdoZWlnaHQnO1xuICAgIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgICBwbGFjZW1lbnQ6IHBsYWNlbWVudCxcbiAgICAgIGJvdW5kYXJ5OiBib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZzogcGFkZGluZ1xuICAgIH0pO1xuICAgIHZhciBtYWluVmFyaWF0aW9uU2lkZSA9IGlzVmVydGljYWwgPyBpc1N0YXJ0VmFyaWF0aW9uID8gcmlnaHQgOiBsZWZ0IDogaXNTdGFydFZhcmlhdGlvbiA/IGJvdHRvbSA6IHRvcDtcblxuICAgIGlmIChyZWZlcmVuY2VSZWN0W2xlbl0gPiBwb3BwZXJSZWN0W2xlbl0pIHtcbiAgICAgIG1haW5WYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIH1cblxuICAgIHZhciBhbHRWYXJpYXRpb25TaWRlID0gZ2V0T3Bwb3NpdGVQbGFjZW1lbnQobWFpblZhcmlhdGlvblNpZGUpO1xuICAgIHZhciBjaGVja3MgPSBbXTtcblxuICAgIGlmIChjaGVja01haW5BeGlzKSB7XG4gICAgICBjaGVja3MucHVzaChvdmVyZmxvd1tfYmFzZVBsYWNlbWVudF0gPD0gMCk7XG4gICAgfVxuXG4gICAgaWYgKGNoZWNrQWx0QXhpcykge1xuICAgICAgY2hlY2tzLnB1c2gob3ZlcmZsb3dbbWFpblZhcmlhdGlvblNpZGVdIDw9IDAsIG92ZXJmbG93W2FsdFZhcmlhdGlvblNpZGVdIDw9IDApO1xuICAgIH1cblxuICAgIGlmIChjaGVja3MuZXZlcnkoZnVuY3Rpb24gKGNoZWNrKSB7XG4gICAgICByZXR1cm4gY2hlY2s7XG4gICAgfSkpIHtcbiAgICAgIGZpcnN0Rml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudDtcbiAgICAgIG1ha2VGYWxsYmFja0NoZWNrcyA9IGZhbHNlO1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgY2hlY2tzTWFwLnNldChwbGFjZW1lbnQsIGNoZWNrcyk7XG4gIH1cblxuICBpZiAobWFrZUZhbGxiYWNrQ2hlY2tzKSB7XG4gICAgLy8gYDJgIG1heSBiZSBkZXNpcmVkIGluIHNvbWUgY2FzZXMg4oCTIHJlc2VhcmNoIGxhdGVyXG4gICAgdmFyIG51bWJlck9mQ2hlY2tzID0gZmxpcFZhcmlhdGlvbnMgPyAzIDogMTtcblxuICAgIHZhciBfbG9vcCA9IGZ1bmN0aW9uIF9sb29wKF9pKSB7XG4gICAgICB2YXIgZml0dGluZ1BsYWNlbWVudCA9IHBsYWNlbWVudHMuZmluZChmdW5jdGlvbiAocGxhY2VtZW50KSB7XG4gICAgICAgIHZhciBjaGVja3MgPSBjaGVja3NNYXAuZ2V0KHBsYWNlbWVudCk7XG5cbiAgICAgICAgaWYgKGNoZWNrcykge1xuICAgICAgICAgIHJldHVybiBjaGVja3Muc2xpY2UoMCwgX2kpLmV2ZXJ5KGZ1bmN0aW9uIChjaGVjaykge1xuICAgICAgICAgICAgcmV0dXJuIGNoZWNrO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgaWYgKGZpdHRpbmdQbGFjZW1lbnQpIHtcbiAgICAgICAgZmlyc3RGaXR0aW5nUGxhY2VtZW50ID0gZml0dGluZ1BsYWNlbWVudDtcbiAgICAgICAgcmV0dXJuIFwiYnJlYWtcIjtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgZm9yICh2YXIgX2kgPSBudW1iZXJPZkNoZWNrczsgX2kgPiAwOyBfaS0tKSB7XG4gICAgICB2YXIgX3JldCA9IF9sb29wKF9pKTtcblxuICAgICAgaWYgKF9yZXQgPT09IFwiYnJlYWtcIikgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKHN0YXRlLnBsYWNlbWVudCAhPT0gZmlyc3RGaXR0aW5nUGxhY2VtZW50KSB7XG4gICAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXS5fc2tpcCA9IHRydWU7XG4gICAgc3RhdGUucGxhY2VtZW50ID0gZmlyc3RGaXR0aW5nUGxhY2VtZW50O1xuICAgIHN0YXRlLnJlc2V0ID0gdHJ1ZTtcbiAgfVxufSAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLXVudXNlZC1tb2R1bGVzXG5cblxudmFyIGZsaXAkMSA9IHtcbiAgbmFtZTogJ2ZsaXAnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogZmxpcCxcbiAgcmVxdWlyZXNJZkV4aXN0czogWydvZmZzZXQnXSxcbiAgZGF0YToge1xuICAgIF9za2lwOiBmYWxzZVxuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRBbHRBeGlzKGF4aXMpIHtcbiAgcmV0dXJuIGF4aXMgPT09ICd4JyA/ICd5JyA6ICd4Jztcbn1cblxuZnVuY3Rpb24gd2l0aGluKG1pbiwgdmFsdWUsIG1heCkge1xuICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbih2YWx1ZSwgbWF4KSk7XG59XG5cbmZ1bmN0aW9uIHByZXZlbnRPdmVyZmxvdyhfcmVmKSB7XG4gIHZhciBzdGF0ZSA9IF9yZWYuc3RhdGUsXG4gICAgICBvcHRpb25zID0gX3JlZi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIF9vcHRpb25zJG1haW5BeGlzID0gb3B0aW9ucy5tYWluQXhpcyxcbiAgICAgIGNoZWNrTWFpbkF4aXMgPSBfb3B0aW9ucyRtYWluQXhpcyA9PT0gdm9pZCAwID8gdHJ1ZSA6IF9vcHRpb25zJG1haW5BeGlzLFxuICAgICAgX29wdGlvbnMkYWx0QXhpcyA9IG9wdGlvbnMuYWx0QXhpcyxcbiAgICAgIGNoZWNrQWx0QXhpcyA9IF9vcHRpb25zJGFsdEF4aXMgPT09IHZvaWQgMCA/IGZhbHNlIDogX29wdGlvbnMkYWx0QXhpcyxcbiAgICAgIGJvdW5kYXJ5ID0gb3B0aW9ucy5ib3VuZGFyeSxcbiAgICAgIHJvb3RCb3VuZGFyeSA9IG9wdGlvbnMucm9vdEJvdW5kYXJ5LFxuICAgICAgYWx0Qm91bmRhcnkgPSBvcHRpb25zLmFsdEJvdW5kYXJ5LFxuICAgICAgcGFkZGluZyA9IG9wdGlvbnMucGFkZGluZyxcbiAgICAgIF9vcHRpb25zJHRldGhlciA9IG9wdGlvbnMudGV0aGVyLFxuICAgICAgdGV0aGVyID0gX29wdGlvbnMkdGV0aGVyID09PSB2b2lkIDAgPyB0cnVlIDogX29wdGlvbnMkdGV0aGVyLFxuICAgICAgX29wdGlvbnMkdGV0aGVyT2Zmc2V0ID0gb3B0aW9ucy50ZXRoZXJPZmZzZXQsXG4gICAgICB0ZXRoZXJPZmZzZXQgPSBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQgPT09IHZvaWQgMCA/IDAgOiBfb3B0aW9ucyR0ZXRoZXJPZmZzZXQ7XG4gIHZhciBvdmVyZmxvdyA9IGRldGVjdE92ZXJmbG93KHN0YXRlLCB7XG4gICAgYm91bmRhcnk6IGJvdW5kYXJ5LFxuICAgIHJvb3RCb3VuZGFyeTogcm9vdEJvdW5kYXJ5LFxuICAgIHBhZGRpbmc6IHBhZGRpbmcsXG4gICAgYWx0Qm91bmRhcnk6IGFsdEJvdW5kYXJ5XG4gIH0pO1xuICB2YXIgYmFzZVBsYWNlbWVudCA9IGdldEJhc2VQbGFjZW1lbnQoc3RhdGUucGxhY2VtZW50KTtcbiAgdmFyIHZhcmlhdGlvbiA9IGdldFZhcmlhdGlvbihzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgaXNCYXNlUGxhY2VtZW50ID0gIXZhcmlhdGlvbjtcbiAgdmFyIG1haW5BeGlzID0gZ2V0TWFpbkF4aXNGcm9tUGxhY2VtZW50KGJhc2VQbGFjZW1lbnQpO1xuICB2YXIgYWx0QXhpcyA9IGdldEFsdEF4aXMobWFpbkF4aXMpO1xuICB2YXIgcG9wcGVyT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucG9wcGVyT2Zmc2V0cztcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgdGV0aGVyT2Zmc2V0VmFsdWUgPSB0eXBlb2YgdGV0aGVyT2Zmc2V0ID09PSAnZnVuY3Rpb24nID8gdGV0aGVyT2Zmc2V0KE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucmVjdHMpLCB7fSwge1xuICAgIHBsYWNlbWVudDogc3RhdGUucGxhY2VtZW50XG4gIH0pKSA6IHRldGhlck9mZnNldDtcbiAgdmFyIGRhdGEgPSB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG5cbiAgaWYgKCFwb3BwZXJPZmZzZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKGNoZWNrTWFpbkF4aXMpIHtcbiAgICB2YXIgbWFpblNpZGUgPSBtYWluQXhpcyA9PT0gJ3knID8gdG9wIDogbGVmdDtcbiAgICB2YXIgYWx0U2lkZSA9IG1haW5BeGlzID09PSAneScgPyBib3R0b20gOiByaWdodDtcbiAgICB2YXIgbGVuID0gbWFpbkF4aXMgPT09ICd5JyA/ICdoZWlnaHQnIDogJ3dpZHRoJztcbiAgICB2YXIgb2Zmc2V0ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc107XG4gICAgdmFyIG1pbiA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdICsgb3ZlcmZsb3dbbWFpblNpZGVdO1xuICAgIHZhciBtYXggPSBwb3BwZXJPZmZzZXRzW21haW5BeGlzXSAtIG92ZXJmbG93W2FsdFNpZGVdO1xuICAgIHZhciBhZGRpdGl2ZSA9IHRldGhlciA/IC1wb3BwZXJSZWN0W2xlbl0gLyAyIDogMDtcbiAgICB2YXIgbWluTGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IHJlZmVyZW5jZVJlY3RbbGVuXSA6IHBvcHBlclJlY3RbbGVuXTtcbiAgICB2YXIgbWF4TGVuID0gdmFyaWF0aW9uID09PSBzdGFydCA/IC1wb3BwZXJSZWN0W2xlbl0gOiAtcmVmZXJlbmNlUmVjdFtsZW5dOyAvLyBXZSBuZWVkIHRvIGluY2x1ZGUgdGhlIGFycm93IGluIHRoZSBjYWxjdWxhdGlvbiBzbyB0aGUgYXJyb3cgZG9lc24ndCBnb1xuICAgIC8vIG91dHNpZGUgdGhlIHJlZmVyZW5jZSBib3VuZHNcblxuICAgIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgICB2YXIgYXJyb3dSZWN0ID0gdGV0aGVyICYmIGFycm93RWxlbWVudCA/IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KSA6IHtcbiAgICAgIHdpZHRoOiAwLFxuICAgICAgaGVpZ2h0OiAwXG4gICAgfTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nT2JqZWN0ID0gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddID8gc3RhdGUubW9kaWZpZXJzRGF0YVsnYXJyb3cjcGVyc2lzdGVudCddLnBhZGRpbmcgOiBnZXRGcmVzaFNpZGVPYmplY3QoKTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWluID0gYXJyb3dQYWRkaW5nT2JqZWN0W21haW5TaWRlXTtcbiAgICB2YXIgYXJyb3dQYWRkaW5nTWF4ID0gYXJyb3dQYWRkaW5nT2JqZWN0W2FsdFNpZGVdOyAvLyBJZiB0aGUgcmVmZXJlbmNlIGxlbmd0aCBpcyBzbWFsbGVyIHRoYW4gdGhlIGFycm93IGxlbmd0aCwgd2UgZG9uJ3Qgd2FudFxuICAgIC8vIHRvIGluY2x1ZGUgaXRzIGZ1bGwgc2l6ZSBpbiB0aGUgY2FsY3VsYXRpb24uIElmIHRoZSByZWZlcmVuY2UgaXMgc21hbGxcbiAgICAvLyBhbmQgbmVhciB0aGUgZWRnZSBvZiBhIGJvdW5kYXJ5LCB0aGUgcG9wcGVyIGNhbiBvdmVyZmxvdyBldmVuIGlmIHRoZVxuICAgIC8vIHJlZmVyZW5jZSBpcyBub3Qgb3ZlcmZsb3dpbmcgYXMgd2VsbCAoZS5nLiB2aXJ0dWFsIGVsZW1lbnRzIHdpdGggbm9cbiAgICAvLyB3aWR0aCBvciBoZWlnaHQpXG5cbiAgICB2YXIgYXJyb3dMZW4gPSB3aXRoaW4oMCwgcmVmZXJlbmNlUmVjdFtsZW5dLCBhcnJvd1JlY3RbbGVuXSk7XG4gICAgdmFyIG1pbk9mZnNldCA9IGlzQmFzZVBsYWNlbWVudCA/IHJlZmVyZW5jZVJlY3RbbGVuXSAvIDIgLSBhZGRpdGl2ZSAtIGFycm93TGVuIC0gYXJyb3dQYWRkaW5nTWluIC0gdGV0aGVyT2Zmc2V0VmFsdWUgOiBtaW5MZW4gLSBhcnJvd0xlbiAtIGFycm93UGFkZGluZ01pbiAtIHRldGhlck9mZnNldFZhbHVlO1xuICAgIHZhciBtYXhPZmZzZXQgPSBpc0Jhc2VQbGFjZW1lbnQgPyAtcmVmZXJlbmNlUmVjdFtsZW5dIC8gMiArIGFkZGl0aXZlICsgYXJyb3dMZW4gKyBhcnJvd1BhZGRpbmdNYXggKyB0ZXRoZXJPZmZzZXRWYWx1ZSA6IG1heExlbiArIGFycm93TGVuICsgYXJyb3dQYWRkaW5nTWF4ICsgdGV0aGVyT2Zmc2V0VmFsdWU7XG4gICAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gc3RhdGUuZWxlbWVudHMuYXJyb3cgJiYgZ2V0T2Zmc2V0UGFyZW50KHN0YXRlLmVsZW1lbnRzLmFycm93KTtcbiAgICB2YXIgY2xpZW50T2Zmc2V0ID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBtYWluQXhpcyA9PT0gJ3knID8gYXJyb3dPZmZzZXRQYXJlbnQuY2xpZW50VG9wIHx8IDAgOiBhcnJvd09mZnNldFBhcmVudC5jbGllbnRMZWZ0IHx8IDAgOiAwO1xuICAgIHZhciBvZmZzZXRNb2RpZmllclZhbHVlID0gc3RhdGUubW9kaWZpZXJzRGF0YS5vZmZzZXQgPyBzdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldFtzdGF0ZS5wbGFjZW1lbnRdW21haW5BeGlzXSA6IDA7XG4gICAgdmFyIHRldGhlck1pbiA9IHBvcHBlck9mZnNldHNbbWFpbkF4aXNdICsgbWluT2Zmc2V0IC0gb2Zmc2V0TW9kaWZpZXJWYWx1ZSAtIGNsaWVudE9mZnNldDtcbiAgICB2YXIgdGV0aGVyTWF4ID0gcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gKyBtYXhPZmZzZXQgLSBvZmZzZXRNb2RpZmllclZhbHVlO1xuICAgIHZhciBwcmV2ZW50ZWRPZmZzZXQgPSB3aXRoaW4odGV0aGVyID8gTWF0aC5taW4obWluLCB0ZXRoZXJNaW4pIDogbWluLCBvZmZzZXQsIHRldGhlciA/IE1hdGgubWF4KG1heCwgdGV0aGVyTWF4KSA6IG1heCk7XG4gICAgcG9wcGVyT2Zmc2V0c1ttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVttYWluQXhpc10gPSBwcmV2ZW50ZWRPZmZzZXQgLSBvZmZzZXQ7XG4gIH1cblxuICBpZiAoY2hlY2tBbHRBeGlzKSB7XG4gICAgdmFyIF9tYWluU2lkZSA9IG1haW5BeGlzID09PSAneCcgPyB0b3AgOiBsZWZ0O1xuXG4gICAgdmFyIF9hbHRTaWRlID0gbWFpbkF4aXMgPT09ICd4JyA/IGJvdHRvbSA6IHJpZ2h0O1xuXG4gICAgdmFyIF9vZmZzZXQgPSBwb3BwZXJPZmZzZXRzW2FsdEF4aXNdO1xuXG4gICAgdmFyIF9taW4gPSBfb2Zmc2V0ICsgb3ZlcmZsb3dbX21haW5TaWRlXTtcblxuICAgIHZhciBfbWF4ID0gX29mZnNldCAtIG92ZXJmbG93W19hbHRTaWRlXTtcblxuICAgIHZhciBfcHJldmVudGVkT2Zmc2V0ID0gd2l0aGluKF9taW4sIF9vZmZzZXQsIF9tYXgpO1xuXG4gICAgcG9wcGVyT2Zmc2V0c1thbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQ7XG4gICAgZGF0YVthbHRBeGlzXSA9IF9wcmV2ZW50ZWRPZmZzZXQgLSBfb2Zmc2V0O1xuICB9XG5cbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IGRhdGE7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgcHJldmVudE92ZXJmbG93JDEgPSB7XG4gIG5hbWU6ICdwcmV2ZW50T3ZlcmZsb3cnLFxuICBlbmFibGVkOiB0cnVlLFxuICBwaGFzZTogJ21haW4nLFxuICBmbjogcHJldmVudE92ZXJmbG93LFxuICByZXF1aXJlc0lmRXhpc3RzOiBbJ29mZnNldCddXG59O1xuXG5mdW5jdGlvbiBhcnJvdyhfcmVmKSB7XG4gIHZhciBfc3RhdGUkbW9kaWZpZXJzRGF0YSQ7XG5cbiAgdmFyIHN0YXRlID0gX3JlZi5zdGF0ZSxcbiAgICAgIG5hbWUgPSBfcmVmLm5hbWU7XG4gIHZhciBhcnJvd0VsZW1lbnQgPSBzdGF0ZS5lbGVtZW50cy5hcnJvdztcbiAgdmFyIHBvcHBlck9mZnNldHMgPSBzdGF0ZS5tb2RpZmllcnNEYXRhLnBvcHBlck9mZnNldHM7XG4gIHZhciBiYXNlUGxhY2VtZW50ID0gZ2V0QmFzZVBsYWNlbWVudChzdGF0ZS5wbGFjZW1lbnQpO1xuICB2YXIgYXhpcyA9IGdldE1haW5BeGlzRnJvbVBsYWNlbWVudChiYXNlUGxhY2VtZW50KTtcbiAgdmFyIGlzVmVydGljYWwgPSBbbGVmdCwgcmlnaHRdLmluZGV4T2YoYmFzZVBsYWNlbWVudCkgPj0gMDtcbiAgdmFyIGxlbiA9IGlzVmVydGljYWwgPyAnaGVpZ2h0JyA6ICd3aWR0aCc7XG5cbiAgaWYgKCFhcnJvd0VsZW1lbnQgfHwgIXBvcHBlck9mZnNldHMpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcGFkZGluZ09iamVjdCA9IHN0YXRlLm1vZGlmaWVyc0RhdGFbbmFtZSArIFwiI3BlcnNpc3RlbnRcIl0ucGFkZGluZztcbiAgdmFyIGFycm93UmVjdCA9IGdldExheW91dFJlY3QoYXJyb3dFbGVtZW50KTtcbiAgdmFyIG1pblByb3AgPSBheGlzID09PSAneScgPyB0b3AgOiBsZWZ0O1xuICB2YXIgbWF4UHJvcCA9IGF4aXMgPT09ICd5JyA/IGJvdHRvbSA6IHJpZ2h0O1xuICB2YXIgZW5kRGlmZiA9IHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtsZW5dICsgc3RhdGUucmVjdHMucmVmZXJlbmNlW2F4aXNdIC0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnBvcHBlcltsZW5dO1xuICB2YXIgc3RhcnREaWZmID0gcG9wcGVyT2Zmc2V0c1theGlzXSAtIHN0YXRlLnJlY3RzLnJlZmVyZW5jZVtheGlzXTtcbiAgdmFyIGFycm93T2Zmc2V0UGFyZW50ID0gZ2V0T2Zmc2V0UGFyZW50KGFycm93RWxlbWVudCk7XG4gIHZhciBjbGllbnRTaXplID0gYXJyb3dPZmZzZXRQYXJlbnQgPyBheGlzID09PSAneScgPyBhcnJvd09mZnNldFBhcmVudC5jbGllbnRIZWlnaHQgfHwgMCA6IGFycm93T2Zmc2V0UGFyZW50LmNsaWVudFdpZHRoIHx8IDAgOiAwO1xuICB2YXIgY2VudGVyVG9SZWZlcmVuY2UgPSBlbmREaWZmIC8gMiAtIHN0YXJ0RGlmZiAvIDI7IC8vIE1ha2Ugc3VyZSB0aGUgYXJyb3cgZG9lc24ndCBvdmVyZmxvdyB0aGUgcG9wcGVyIGlmIHRoZSBjZW50ZXIgcG9pbnQgaXNcbiAgLy8gb3V0c2lkZSBvZiB0aGUgcG9wcGVyIGJvdW5kc1xuXG4gIHZhciBtaW4gPSBwYWRkaW5nT2JqZWN0W21pblByb3BdO1xuICB2YXIgbWF4ID0gY2xpZW50U2l6ZSAtIGFycm93UmVjdFtsZW5dIC0gcGFkZGluZ09iamVjdFttYXhQcm9wXTtcbiAgdmFyIGNlbnRlciA9IGNsaWVudFNpemUgLyAyIC0gYXJyb3dSZWN0W2xlbl0gLyAyICsgY2VudGVyVG9SZWZlcmVuY2U7XG4gIHZhciBvZmZzZXQgPSB3aXRoaW4obWluLCBjZW50ZXIsIG1heCk7IC8vIFByZXZlbnRzIGJyZWFraW5nIHN5bnRheCBoaWdobGlnaHRpbmcuLi5cblxuICB2YXIgYXhpc1Byb3AgPSBheGlzO1xuICBzdGF0ZS5tb2RpZmllcnNEYXRhW25hbWVdID0gKF9zdGF0ZSRtb2RpZmllcnNEYXRhJCA9IHt9LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSRbYXhpc1Byb3BdID0gb2Zmc2V0LCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQuY2VudGVyT2Zmc2V0ID0gb2Zmc2V0IC0gY2VudGVyLCBfc3RhdGUkbW9kaWZpZXJzRGF0YSQpO1xufVxuXG5mdW5jdGlvbiBlZmZlY3QkMihfcmVmMikge1xuICB2YXIgc3RhdGUgPSBfcmVmMi5zdGF0ZSxcbiAgICAgIG9wdGlvbnMgPSBfcmVmMi5vcHRpb25zLFxuICAgICAgbmFtZSA9IF9yZWYyLm5hbWU7XG4gIHZhciBfb3B0aW9ucyRlbGVtZW50ID0gb3B0aW9ucy5lbGVtZW50LFxuICAgICAgYXJyb3dFbGVtZW50ID0gX29wdGlvbnMkZWxlbWVudCA9PT0gdm9pZCAwID8gJ1tkYXRhLXBvcHBlci1hcnJvd10nIDogX29wdGlvbnMkZWxlbWVudCxcbiAgICAgIF9vcHRpb25zJHBhZGRpbmcgPSBvcHRpb25zLnBhZGRpbmcsXG4gICAgICBwYWRkaW5nID0gX29wdGlvbnMkcGFkZGluZyA9PT0gdm9pZCAwID8gMCA6IF9vcHRpb25zJHBhZGRpbmc7XG5cbiAgaWYgKGFycm93RWxlbWVudCA9PSBudWxsKSB7XG4gICAgcmV0dXJuO1xuICB9IC8vIENTUyBzZWxlY3RvclxuXG5cbiAgaWYgKHR5cGVvZiBhcnJvd0VsZW1lbnQgPT09ICdzdHJpbmcnKSB7XG4gICAgYXJyb3dFbGVtZW50ID0gc3RhdGUuZWxlbWVudHMucG9wcGVyLnF1ZXJ5U2VsZWN0b3IoYXJyb3dFbGVtZW50KTtcblxuICAgIGlmICghYXJyb3dFbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9XG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBpZiAoIWlzSFRNTEVsZW1lbnQoYXJyb3dFbGVtZW50KSkge1xuICAgICAgY29uc29sZS5lcnJvcihbJ1BvcHBlcjogXCJhcnJvd1wiIGVsZW1lbnQgbXVzdCBiZSBhbiBIVE1MRWxlbWVudCAobm90IGFuIFNWR0VsZW1lbnQpLicsICdUbyB1c2UgYW4gU1ZHIGFycm93LCB3cmFwIGl0IGluIGFuIEhUTUxFbGVtZW50IHRoYXQgd2lsbCBiZSB1c2VkIGFzJywgJ3RoZSBhcnJvdy4nXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxuXG4gIGlmICghY29udGFpbnMoc3RhdGUuZWxlbWVudHMucG9wcGVyLCBhcnJvd0VsZW1lbnQpKSB7XG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoWydQb3BwZXI6IFwiYXJyb3dcIiBtb2RpZmllclxcJ3MgYGVsZW1lbnRgIG11c3QgYmUgYSBjaGlsZCBvZiB0aGUgcG9wcGVyJywgJ2VsZW1lbnQuJ10uam9pbignICcpKTtcbiAgICB9XG5cbiAgICByZXR1cm47XG4gIH1cblxuICBzdGF0ZS5lbGVtZW50cy5hcnJvdyA9IGFycm93RWxlbWVudDtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lICsgXCIjcGVyc2lzdGVudFwiXSA9IHtcbiAgICBwYWRkaW5nOiBtZXJnZVBhZGRpbmdPYmplY3QodHlwZW9mIHBhZGRpbmcgIT09ICdudW1iZXInID8gcGFkZGluZyA6IGV4cGFuZFRvSGFzaE1hcChwYWRkaW5nLCBiYXNlUGxhY2VtZW50cykpXG4gIH07XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgYXJyb3ckMSA9IHtcbiAgbmFtZTogJ2Fycm93JyxcbiAgZW5hYmxlZDogdHJ1ZSxcbiAgcGhhc2U6ICdtYWluJyxcbiAgZm46IGFycm93LFxuICBlZmZlY3Q6IGVmZmVjdCQyLFxuICByZXF1aXJlczogWydwb3BwZXJPZmZzZXRzJ10sXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J11cbn07XG5cbmZ1bmN0aW9uIGdldFNpZGVPZmZzZXRzKG92ZXJmbG93LCByZWN0LCBwcmV2ZW50ZWRPZmZzZXRzKSB7XG4gIGlmIChwcmV2ZW50ZWRPZmZzZXRzID09PSB2b2lkIDApIHtcbiAgICBwcmV2ZW50ZWRPZmZzZXRzID0ge1xuICAgICAgeDogMCxcbiAgICAgIHk6IDBcbiAgICB9O1xuICB9XG5cbiAgcmV0dXJuIHtcbiAgICB0b3A6IG92ZXJmbG93LnRvcCAtIHJlY3QuaGVpZ2h0IC0gcHJldmVudGVkT2Zmc2V0cy55LFxuICAgIHJpZ2h0OiBvdmVyZmxvdy5yaWdodCAtIHJlY3Qud2lkdGggKyBwcmV2ZW50ZWRPZmZzZXRzLngsXG4gICAgYm90dG9tOiBvdmVyZmxvdy5ib3R0b20gLSByZWN0LmhlaWdodCArIHByZXZlbnRlZE9mZnNldHMueSxcbiAgICBsZWZ0OiBvdmVyZmxvdy5sZWZ0IC0gcmVjdC53aWR0aCAtIHByZXZlbnRlZE9mZnNldHMueFxuICB9O1xufVxuXG5mdW5jdGlvbiBpc0FueVNpZGVGdWxseUNsaXBwZWQob3ZlcmZsb3cpIHtcbiAgcmV0dXJuIFt0b3AsIHJpZ2h0LCBib3R0b20sIGxlZnRdLnNvbWUoZnVuY3Rpb24gKHNpZGUpIHtcbiAgICByZXR1cm4gb3ZlcmZsb3dbc2lkZV0gPj0gMDtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIGhpZGUoX3JlZikge1xuICB2YXIgc3RhdGUgPSBfcmVmLnN0YXRlLFxuICAgICAgbmFtZSA9IF9yZWYubmFtZTtcbiAgdmFyIHJlZmVyZW5jZVJlY3QgPSBzdGF0ZS5yZWN0cy5yZWZlcmVuY2U7XG4gIHZhciBwb3BwZXJSZWN0ID0gc3RhdGUucmVjdHMucG9wcGVyO1xuICB2YXIgcHJldmVudGVkT2Zmc2V0cyA9IHN0YXRlLm1vZGlmaWVyc0RhdGEucHJldmVudE92ZXJmbG93O1xuICB2YXIgcmVmZXJlbmNlT3ZlcmZsb3cgPSBkZXRlY3RPdmVyZmxvdyhzdGF0ZSwge1xuICAgIGVsZW1lbnRDb250ZXh0OiAncmVmZXJlbmNlJ1xuICB9KTtcbiAgdmFyIHBvcHBlckFsdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3coc3RhdGUsIHtcbiAgICBhbHRCb3VuZGFyeTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyA9IGdldFNpZGVPZmZzZXRzKHJlZmVyZW5jZU92ZXJmbG93LCByZWZlcmVuY2VSZWN0KTtcbiAgdmFyIHBvcHBlckVzY2FwZU9mZnNldHMgPSBnZXRTaWRlT2Zmc2V0cyhwb3BwZXJBbHRPdmVyZmxvdywgcG9wcGVyUmVjdCwgcHJldmVudGVkT2Zmc2V0cyk7XG4gIHZhciBpc1JlZmVyZW5jZUhpZGRlbiA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChyZWZlcmVuY2VDbGlwcGluZ09mZnNldHMpO1xuICB2YXIgaGFzUG9wcGVyRXNjYXBlZCA9IGlzQW55U2lkZUZ1bGx5Q2xpcHBlZChwb3BwZXJFc2NhcGVPZmZzZXRzKTtcbiAgc3RhdGUubW9kaWZpZXJzRGF0YVtuYW1lXSA9IHtcbiAgICByZWZlcmVuY2VDbGlwcGluZ09mZnNldHM6IHJlZmVyZW5jZUNsaXBwaW5nT2Zmc2V0cyxcbiAgICBwb3BwZXJFc2NhcGVPZmZzZXRzOiBwb3BwZXJFc2NhcGVPZmZzZXRzLFxuICAgIGlzUmVmZXJlbmNlSGlkZGVuOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICBoYXNQb3BwZXJFc2NhcGVkOiBoYXNQb3BwZXJFc2NhcGVkXG4gIH07XG4gIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hdHRyaWJ1dGVzLnBvcHBlciksIHt9LCB7XG4gICAgJ2RhdGEtcG9wcGVyLXJlZmVyZW5jZS1oaWRkZW4nOiBpc1JlZmVyZW5jZUhpZGRlbixcbiAgICAnZGF0YS1wb3BwZXItZXNjYXBlZCc6IGhhc1BvcHBlckVzY2FwZWRcbiAgfSk7XG59IC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBpbXBvcnQvbm8tdW51c2VkLW1vZHVsZXNcblxuXG52YXIgaGlkZSQxID0ge1xuICBuYW1lOiAnaGlkZScsXG4gIGVuYWJsZWQ6IHRydWUsXG4gIHBoYXNlOiAnbWFpbicsXG4gIHJlcXVpcmVzSWZFeGlzdHM6IFsncHJldmVudE92ZXJmbG93J10sXG4gIGZuOiBoaWRlXG59O1xuXG52YXIgZGVmYXVsdE1vZGlmaWVycyA9IFtldmVudExpc3RlbmVycywgcG9wcGVyT2Zmc2V0cyQxLCBjb21wdXRlU3R5bGVzJDEsIGFwcGx5U3R5bGVzJDEsIG9mZnNldCQxLCBmbGlwJDEsIHByZXZlbnRPdmVyZmxvdyQxLCBhcnJvdyQxLCBoaWRlJDFdO1xudmFyIGNyZWF0ZVBvcHBlciA9IC8qI19fUFVSRV9fKi9wb3BwZXJHZW5lcmF0b3Ioe1xuICBkZWZhdWx0TW9kaWZpZXJzOiBkZWZhdWx0TW9kaWZpZXJzXG59KTsgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby11bnVzZWQtbW9kdWxlc1xuXG5leHBvcnRzLmNyZWF0ZVBvcHBlciA9IGNyZWF0ZVBvcHBlcjtcbmV4cG9ydHMuZGVmYXVsdE1vZGlmaWVycyA9IGRlZmF1bHRNb2RpZmllcnM7XG5leHBvcnRzLmRldGVjdE92ZXJmbG93ID0gZGV0ZWN0T3ZlcmZsb3c7XG5leHBvcnRzLnBvcHBlckdlbmVyYXRvciA9IHBvcHBlckdlbmVyYXRvcjtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXBvcHBlci5qcy5tYXBcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9saWIvYXhpb3MnKTsiLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcbnZhciBzZXR0bGUgPSByZXF1aXJlKCcuLy4uL2NvcmUvc2V0dGxlJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvYnVpbGRVUkwnKTtcbnZhciBidWlsZEZ1bGxQYXRoID0gcmVxdWlyZSgnLi4vY29yZS9idWlsZEZ1bGxQYXRoJyk7XG52YXIgcGFyc2VIZWFkZXJzID0gcmVxdWlyZSgnLi8uLi9oZWxwZXJzL3BhcnNlSGVhZGVycycpO1xudmFyIGlzVVJMU2FtZU9yaWdpbiA9IHJlcXVpcmUoJy4vLi4vaGVscGVycy9pc1VSTFNhbWVPcmlnaW4nKTtcbnZhciBjcmVhdGVFcnJvciA9IHJlcXVpcmUoJy4uL2NvcmUvY3JlYXRlRXJyb3InKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiB4aHJBZGFwdGVyKGNvbmZpZykge1xuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gZGlzcGF0Y2hYaHJSZXF1ZXN0KHJlc29sdmUsIHJlamVjdCkge1xuICAgIHZhciByZXF1ZXN0RGF0YSA9IGNvbmZpZy5kYXRhO1xuICAgIHZhciByZXF1ZXN0SGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzO1xuXG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEocmVxdWVzdERhdGEpKSB7XG4gICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNbJ0NvbnRlbnQtVHlwZSddOyAvLyBMZXQgdGhlIGJyb3dzZXIgc2V0IGl0XG4gICAgfVxuXG4gICAgdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTtcblxuICAgIC8vIEhUVFAgYmFzaWMgYXV0aGVudGljYXRpb25cbiAgICBpZiAoY29uZmlnLmF1dGgpIHtcbiAgICAgIHZhciB1c2VybmFtZSA9IGNvbmZpZy5hdXRoLnVzZXJuYW1lIHx8ICcnO1xuICAgICAgdmFyIHBhc3N3b3JkID0gY29uZmlnLmF1dGgucGFzc3dvcmQgfHwgJyc7XG4gICAgICByZXF1ZXN0SGVhZGVycy5BdXRob3JpemF0aW9uID0gJ0Jhc2ljICcgKyBidG9hKHVzZXJuYW1lICsgJzonICsgcGFzc3dvcmQpO1xuICAgIH1cblxuICAgIHZhciBmdWxsUGF0aCA9IGJ1aWxkRnVsbFBhdGgoY29uZmlnLmJhc2VVUkwsIGNvbmZpZy51cmwpO1xuICAgIHJlcXVlc3Qub3Blbihjb25maWcubWV0aG9kLnRvVXBwZXJDYXNlKCksIGJ1aWxkVVJMKGZ1bGxQYXRoLCBjb25maWcucGFyYW1zLCBjb25maWcucGFyYW1zU2VyaWFsaXplciksIHRydWUpO1xuXG4gICAgLy8gU2V0IHRoZSByZXF1ZXN0IHRpbWVvdXQgaW4gTVNcbiAgICByZXF1ZXN0LnRpbWVvdXQgPSBjb25maWcudGltZW91dDtcblxuICAgIC8vIExpc3RlbiBmb3IgcmVhZHkgc3RhdGVcbiAgICByZXF1ZXN0Lm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uIGhhbmRsZUxvYWQoKSB7XG4gICAgICBpZiAoIXJlcXVlc3QgfHwgcmVxdWVzdC5yZWFkeVN0YXRlICE9PSA0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgLy8gVGhlIHJlcXVlc3QgZXJyb3JlZCBvdXQgYW5kIHdlIGRpZG4ndCBnZXQgYSByZXNwb25zZSwgdGhpcyB3aWxsIGJlXG4gICAgICAvLyBoYW5kbGVkIGJ5IG9uZXJyb3IgaW5zdGVhZFxuICAgICAgLy8gV2l0aCBvbmUgZXhjZXB0aW9uOiByZXF1ZXN0IHRoYXQgdXNpbmcgZmlsZTogcHJvdG9jb2wsIG1vc3QgYnJvd3NlcnNcbiAgICAgIC8vIHdpbGwgcmV0dXJuIHN0YXR1cyBhcyAwIGV2ZW4gdGhvdWdoIGl0J3MgYSBzdWNjZXNzZnVsIHJlcXVlc3RcbiAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMCAmJiAhKHJlcXVlc3QucmVzcG9uc2VVUkwgJiYgcmVxdWVzdC5yZXNwb25zZVVSTC5pbmRleE9mKCdmaWxlOicpID09PSAwKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIC8vIFByZXBhcmUgdGhlIHJlc3BvbnNlXG4gICAgICB2YXIgcmVzcG9uc2VIZWFkZXJzID0gJ2dldEFsbFJlc3BvbnNlSGVhZGVycycgaW4gcmVxdWVzdCA/IHBhcnNlSGVhZGVycyhyZXF1ZXN0LmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSA6IG51bGw7XG4gICAgICB2YXIgcmVzcG9uc2VEYXRhID0gIWNvbmZpZy5yZXNwb25zZVR5cGUgfHwgY29uZmlnLnJlc3BvbnNlVHlwZSA9PT0gJ3RleHQnID8gcmVxdWVzdC5yZXNwb25zZVRleHQgOiByZXF1ZXN0LnJlc3BvbnNlO1xuICAgICAgdmFyIHJlc3BvbnNlID0ge1xuICAgICAgICBkYXRhOiByZXNwb25zZURhdGEsXG4gICAgICAgIHN0YXR1czogcmVxdWVzdC5zdGF0dXMsXG4gICAgICAgIHN0YXR1c1RleHQ6IHJlcXVlc3Quc3RhdHVzVGV4dCxcbiAgICAgICAgaGVhZGVyczogcmVzcG9uc2VIZWFkZXJzLFxuICAgICAgICBjb25maWc6IGNvbmZpZyxcbiAgICAgICAgcmVxdWVzdDogcmVxdWVzdFxuICAgICAgfTtcblxuICAgICAgc2V0dGxlKHJlc29sdmUsIHJlamVjdCwgcmVzcG9uc2UpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gSGFuZGxlIGJyb3dzZXIgcmVxdWVzdCBjYW5jZWxsYXRpb24gKGFzIG9wcG9zZWQgdG8gYSBtYW51YWwgY2FuY2VsbGF0aW9uKVxuICAgIHJlcXVlc3Qub25hYm9ydCA9IGZ1bmN0aW9uIGhhbmRsZUFib3J0KCkge1xuICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cblxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKCdSZXF1ZXN0IGFib3J0ZWQnLCBjb25maWcsICdFQ09OTkFCT1JURUQnLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgbG93IGxldmVsIG5ldHdvcmsgZXJyb3JzXG4gICAgcmVxdWVzdC5vbmVycm9yID0gZnVuY3Rpb24gaGFuZGxlRXJyb3IoKSB7XG4gICAgICAvLyBSZWFsIGVycm9ycyBhcmUgaGlkZGVuIGZyb20gdXMgYnkgdGhlIGJyb3dzZXJcbiAgICAgIC8vIG9uZXJyb3Igc2hvdWxkIG9ubHkgZmlyZSBpZiBpdCdzIGEgbmV0d29yayBlcnJvclxuICAgICAgcmVqZWN0KGNyZWF0ZUVycm9yKCdOZXR3b3JrIEVycm9yJywgY29uZmlnLCBudWxsLCByZXF1ZXN0KSk7XG5cbiAgICAgIC8vIENsZWFuIHVwIHJlcXVlc3RcbiAgICAgIHJlcXVlc3QgPSBudWxsO1xuICAgIH07XG5cbiAgICAvLyBIYW5kbGUgdGltZW91dFxuICAgIHJlcXVlc3Qub250aW1lb3V0ID0gZnVuY3Rpb24gaGFuZGxlVGltZW91dCgpIHtcbiAgICAgIHZhciB0aW1lb3V0RXJyb3JNZXNzYWdlID0gJ3RpbWVvdXQgb2YgJyArIGNvbmZpZy50aW1lb3V0ICsgJ21zIGV4Y2VlZGVkJztcbiAgICAgIGlmIChjb25maWcudGltZW91dEVycm9yTWVzc2FnZSkge1xuICAgICAgICB0aW1lb3V0RXJyb3JNZXNzYWdlID0gY29uZmlnLnRpbWVvdXRFcnJvck1lc3NhZ2U7XG4gICAgICB9XG4gICAgICByZWplY3QoY3JlYXRlRXJyb3IodGltZW91dEVycm9yTWVzc2FnZSwgY29uZmlnLCAnRUNPTk5BQk9SVEVEJyxcbiAgICAgICAgcmVxdWVzdCkpO1xuXG4gICAgICAvLyBDbGVhbiB1cCByZXF1ZXN0XG4gICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgLy8gQWRkIHhzcmYgaGVhZGVyXG4gICAgLy8gVGhpcyBpcyBvbmx5IGRvbmUgaWYgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnQuXG4gICAgLy8gU3BlY2lmaWNhbGx5IG5vdCBpZiB3ZSdyZSBpbiBhIHdlYiB3b3JrZXIsIG9yIHJlYWN0LW5hdGl2ZS5cbiAgICBpZiAodXRpbHMuaXNTdGFuZGFyZEJyb3dzZXJFbnYoKSkge1xuICAgICAgdmFyIGNvb2tpZXMgPSByZXF1aXJlKCcuLy4uL2hlbHBlcnMvY29va2llcycpO1xuXG4gICAgICAvLyBBZGQgeHNyZiBoZWFkZXJcbiAgICAgIHZhciB4c3JmVmFsdWUgPSAoY29uZmlnLndpdGhDcmVkZW50aWFscyB8fCBpc1VSTFNhbWVPcmlnaW4oZnVsbFBhdGgpKSAmJiBjb25maWcueHNyZkNvb2tpZU5hbWUgP1xuICAgICAgICBjb29raWVzLnJlYWQoY29uZmlnLnhzcmZDb29raWVOYW1lKSA6XG4gICAgICAgIHVuZGVmaW5lZDtcblxuICAgICAgaWYgKHhzcmZWYWx1ZSkge1xuICAgICAgICByZXF1ZXN0SGVhZGVyc1tjb25maWcueHNyZkhlYWRlck5hbWVdID0geHNyZlZhbHVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBoZWFkZXJzIHRvIHRoZSByZXF1ZXN0XG4gICAgaWYgKCdzZXRSZXF1ZXN0SGVhZGVyJyBpbiByZXF1ZXN0KSB7XG4gICAgICB1dGlscy5mb3JFYWNoKHJlcXVlc3RIZWFkZXJzLCBmdW5jdGlvbiBzZXRSZXF1ZXN0SGVhZGVyKHZhbCwga2V5KSB7XG4gICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdERhdGEgPT09ICd1bmRlZmluZWQnICYmIGtleS50b0xvd2VyQ2FzZSgpID09PSAnY29udGVudC10eXBlJykge1xuICAgICAgICAgIC8vIFJlbW92ZSBDb250ZW50LVR5cGUgaWYgZGF0YSBpcyB1bmRlZmluZWRcbiAgICAgICAgICBkZWxldGUgcmVxdWVzdEhlYWRlcnNba2V5XTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyBPdGhlcndpc2UgYWRkIGhlYWRlciB0byB0aGUgcmVxdWVzdFxuICAgICAgICAgIHJlcXVlc3Quc2V0UmVxdWVzdEhlYWRlcihrZXksIHZhbCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCB3aXRoQ3JlZGVudGlhbHMgdG8gcmVxdWVzdCBpZiBuZWVkZWRcbiAgICBpZiAoIXV0aWxzLmlzVW5kZWZpbmVkKGNvbmZpZy53aXRoQ3JlZGVudGlhbHMpKSB7XG4gICAgICByZXF1ZXN0LndpdGhDcmVkZW50aWFscyA9ICEhY29uZmlnLndpdGhDcmVkZW50aWFscztcbiAgICB9XG5cbiAgICAvLyBBZGQgcmVzcG9uc2VUeXBlIHRvIHJlcXVlc3QgaWYgbmVlZGVkXG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVR5cGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJlcXVlc3QucmVzcG9uc2VUeXBlID0gY29uZmlnLnJlc3BvbnNlVHlwZTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gRXhwZWN0ZWQgRE9NRXhjZXB0aW9uIHRocm93biBieSBicm93c2VycyBub3QgY29tcGF0aWJsZSBYTUxIdHRwUmVxdWVzdCBMZXZlbCAyLlxuICAgICAgICAvLyBCdXQsIHRoaXMgY2FuIGJlIHN1cHByZXNzZWQgZm9yICdqc29uJyB0eXBlIGFzIGl0IGNhbiBiZSBwYXJzZWQgYnkgZGVmYXVsdCAndHJhbnNmb3JtUmVzcG9uc2UnIGZ1bmN0aW9uLlxuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVHlwZSAhPT0gJ2pzb24nKSB7XG4gICAgICAgICAgdGhyb3cgZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEhhbmRsZSBwcm9ncmVzcyBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIGNvbmZpZy5vbkRvd25sb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHJlcXVlc3QuYWRkRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBjb25maWcub25Eb3dubG9hZFByb2dyZXNzKTtcbiAgICB9XG5cbiAgICAvLyBOb3QgYWxsIGJyb3dzZXJzIHN1cHBvcnQgdXBsb2FkIGV2ZW50c1xuICAgIGlmICh0eXBlb2YgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MgPT09ICdmdW5jdGlvbicgJiYgcmVxdWVzdC51cGxvYWQpIHtcbiAgICAgIHJlcXVlc3QudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgY29uZmlnLm9uVXBsb2FkUHJvZ3Jlc3MpO1xuICAgIH1cblxuICAgIGlmIChjb25maWcuY2FuY2VsVG9rZW4pIHtcbiAgICAgIC8vIEhhbmRsZSBjYW5jZWxsYXRpb25cbiAgICAgIGNvbmZpZy5jYW5jZWxUb2tlbi5wcm9taXNlLnRoZW4oZnVuY3Rpb24gb25DYW5jZWxlZChjYW5jZWwpIHtcbiAgICAgICAgaWYgKCFyZXF1ZXN0KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcmVxdWVzdC5hYm9ydCgpO1xuICAgICAgICByZWplY3QoY2FuY2VsKTtcbiAgICAgICAgLy8gQ2xlYW4gdXAgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0ID0gbnVsbDtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0RGF0YSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXF1ZXN0RGF0YSA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gU2VuZCB0aGUgcmVxdWVzdFxuICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuL2hlbHBlcnMvYmluZCcpO1xudmFyIEF4aW9zID0gcmVxdWlyZSgnLi9jb3JlL0F4aW9zJyk7XG52YXIgbWVyZ2VDb25maWcgPSByZXF1aXJlKCcuL2NvcmUvbWVyZ2VDb25maWcnKTtcbnZhciBkZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgQXhpb3NcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZGVmYXVsdENvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICogQHJldHVybiB7QXhpb3N9IEEgbmV3IGluc3RhbmNlIG9mIEF4aW9zXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUluc3RhbmNlKGRlZmF1bHRDb25maWcpIHtcbiAgdmFyIGNvbnRleHQgPSBuZXcgQXhpb3MoZGVmYXVsdENvbmZpZyk7XG4gIHZhciBpbnN0YW5jZSA9IGJpbmQoQXhpb3MucHJvdG90eXBlLnJlcXVlc3QsIGNvbnRleHQpO1xuXG4gIC8vIENvcHkgYXhpb3MucHJvdG90eXBlIHRvIGluc3RhbmNlXG4gIHV0aWxzLmV4dGVuZChpbnN0YW5jZSwgQXhpb3MucHJvdG90eXBlLCBjb250ZXh0KTtcblxuICAvLyBDb3B5IGNvbnRleHQgdG8gaW5zdGFuY2VcbiAgdXRpbHMuZXh0ZW5kKGluc3RhbmNlLCBjb250ZXh0KTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59XG5cbi8vIENyZWF0ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSB0byBiZSBleHBvcnRlZFxudmFyIGF4aW9zID0gY3JlYXRlSW5zdGFuY2UoZGVmYXVsdHMpO1xuXG4vLyBFeHBvc2UgQXhpb3MgY2xhc3MgdG8gYWxsb3cgY2xhc3MgaW5oZXJpdGFuY2VcbmF4aW9zLkF4aW9zID0gQXhpb3M7XG5cbi8vIEZhY3RvcnkgZm9yIGNyZWF0aW5nIG5ldyBpbnN0YW5jZXNcbmF4aW9zLmNyZWF0ZSA9IGZ1bmN0aW9uIGNyZWF0ZShpbnN0YW5jZUNvbmZpZykge1xuICByZXR1cm4gY3JlYXRlSW5zdGFuY2UobWVyZ2VDb25maWcoYXhpb3MuZGVmYXVsdHMsIGluc3RhbmNlQ29uZmlnKSk7XG59O1xuXG4vLyBFeHBvc2UgQ2FuY2VsICYgQ2FuY2VsVG9rZW5cbmF4aW9zLkNhbmNlbCA9IHJlcXVpcmUoJy4vY2FuY2VsL0NhbmNlbCcpO1xuYXhpb3MuQ2FuY2VsVG9rZW4gPSByZXF1aXJlKCcuL2NhbmNlbC9DYW5jZWxUb2tlbicpO1xuYXhpb3MuaXNDYW5jZWwgPSByZXF1aXJlKCcuL2NhbmNlbC9pc0NhbmNlbCcpO1xuXG4vLyBFeHBvc2UgYWxsL3NwcmVhZFxuYXhpb3MuYWxsID0gZnVuY3Rpb24gYWxsKHByb21pc2VzKSB7XG4gIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7XG59O1xuYXhpb3Muc3ByZWFkID0gcmVxdWlyZSgnLi9oZWxwZXJzL3NwcmVhZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGF4aW9zO1xuXG4vLyBBbGxvdyB1c2Ugb2YgZGVmYXVsdCBpbXBvcnQgc3ludGF4IGluIFR5cGVTY3JpcHRcbm1vZHVsZS5leHBvcnRzLmRlZmF1bHQgPSBheGlvcztcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBBIGBDYW5jZWxgIGlzIGFuIG9iamVjdCB0aGF0IGlzIHRocm93biB3aGVuIGFuIG9wZXJhdGlvbiBpcyBjYW5jZWxlZC5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7c3RyaW5nPX0gbWVzc2FnZSBUaGUgbWVzc2FnZS5cbiAqL1xuZnVuY3Rpb24gQ2FuY2VsKG1lc3NhZ2UpIHtcbiAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTtcbn1cblxuQ2FuY2VsLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gJ0NhbmNlbCcgKyAodGhpcy5tZXNzYWdlID8gJzogJyArIHRoaXMubWVzc2FnZSA6ICcnKTtcbn07XG5cbkNhbmNlbC5wcm90b3R5cGUuX19DQU5DRUxfXyA9IHRydWU7XG5cbm1vZHVsZS5leHBvcnRzID0gQ2FuY2VsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgQ2FuY2VsID0gcmVxdWlyZSgnLi9DYW5jZWwnKTtcblxuLyoqXG4gKiBBIGBDYW5jZWxUb2tlbmAgaXMgYW4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVxdWVzdCBjYW5jZWxsYXRpb24gb2YgYW4gb3BlcmF0aW9uLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtGdW5jdGlvbn0gZXhlY3V0b3IgVGhlIGV4ZWN1dG9yIGZ1bmN0aW9uLlxuICovXG5mdW5jdGlvbiBDYW5jZWxUb2tlbihleGVjdXRvcikge1xuICBpZiAodHlwZW9mIGV4ZWN1dG9yICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZXhlY3V0b3IgbXVzdCBiZSBhIGZ1bmN0aW9uLicpO1xuICB9XG5cbiAgdmFyIHJlc29sdmVQcm9taXNlO1xuICB0aGlzLnByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbiBwcm9taXNlRXhlY3V0b3IocmVzb2x2ZSkge1xuICAgIHJlc29sdmVQcm9taXNlID0gcmVzb2x2ZTtcbiAgfSk7XG5cbiAgdmFyIHRva2VuID0gdGhpcztcbiAgZXhlY3V0b3IoZnVuY3Rpb24gY2FuY2VsKG1lc3NhZ2UpIHtcbiAgICBpZiAodG9rZW4ucmVhc29uKSB7XG4gICAgICAvLyBDYW5jZWxsYXRpb24gaGFzIGFscmVhZHkgYmVlbiByZXF1ZXN0ZWRcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB0b2tlbi5yZWFzb24gPSBuZXcgQ2FuY2VsKG1lc3NhZ2UpO1xuICAgIHJlc29sdmVQcm9taXNlKHRva2VuLnJlYXNvbik7XG4gIH0pO1xufVxuXG4vKipcbiAqIFRocm93cyBhIGBDYW5jZWxgIGlmIGNhbmNlbGxhdGlvbiBoYXMgYmVlbiByZXF1ZXN0ZWQuXG4gKi9cbkNhbmNlbFRva2VuLnByb3RvdHlwZS50aHJvd0lmUmVxdWVzdGVkID0gZnVuY3Rpb24gdGhyb3dJZlJlcXVlc3RlZCgpIHtcbiAgaWYgKHRoaXMucmVhc29uKSB7XG4gICAgdGhyb3cgdGhpcy5yZWFzb247XG4gIH1cbn07XG5cbi8qKlxuICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBhIG5ldyBgQ2FuY2VsVG9rZW5gIGFuZCBhIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLFxuICogY2FuY2VscyB0aGUgYENhbmNlbFRva2VuYC5cbiAqL1xuQ2FuY2VsVG9rZW4uc291cmNlID0gZnVuY3Rpb24gc291cmNlKCkge1xuICB2YXIgY2FuY2VsO1xuICB2YXIgdG9rZW4gPSBuZXcgQ2FuY2VsVG9rZW4oZnVuY3Rpb24gZXhlY3V0b3IoYykge1xuICAgIGNhbmNlbCA9IGM7XG4gIH0pO1xuICByZXR1cm4ge1xuICAgIHRva2VuOiB0b2tlbixcbiAgICBjYW5jZWw6IGNhbmNlbFxuICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDYW5jZWxUb2tlbjtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0NhbmNlbCh2YWx1ZSkge1xuICByZXR1cm4gISEodmFsdWUgJiYgdmFsdWUuX19DQU5DRUxfXyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG52YXIgYnVpbGRVUkwgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2J1aWxkVVJMJyk7XG52YXIgSW50ZXJjZXB0b3JNYW5hZ2VyID0gcmVxdWlyZSgnLi9JbnRlcmNlcHRvck1hbmFnZXInKTtcbnZhciBkaXNwYXRjaFJlcXVlc3QgPSByZXF1aXJlKCcuL2Rpc3BhdGNoUmVxdWVzdCcpO1xudmFyIG1lcmdlQ29uZmlnID0gcmVxdWlyZSgnLi9tZXJnZUNvbmZpZycpO1xuXG4vKipcbiAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBBeGlvc1xuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0YW5jZUNvbmZpZyBUaGUgZGVmYXVsdCBjb25maWcgZm9yIHRoZSBpbnN0YW5jZVxuICovXG5mdW5jdGlvbiBBeGlvcyhpbnN0YW5jZUNvbmZpZykge1xuICB0aGlzLmRlZmF1bHRzID0gaW5zdGFuY2VDb25maWc7XG4gIHRoaXMuaW50ZXJjZXB0b3JzID0ge1xuICAgIHJlcXVlc3Q6IG5ldyBJbnRlcmNlcHRvck1hbmFnZXIoKSxcbiAgICByZXNwb25zZTogbmV3IEludGVyY2VwdG9yTWFuYWdlcigpXG4gIH07XG59XG5cbi8qKlxuICogRGlzcGF0Y2ggYSByZXF1ZXN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHNwZWNpZmljIGZvciB0aGlzIHJlcXVlc3QgKG1lcmdlZCB3aXRoIHRoaXMuZGVmYXVsdHMpXG4gKi9cbkF4aW9zLnByb3RvdHlwZS5yZXF1ZXN0ID0gZnVuY3Rpb24gcmVxdWVzdChjb25maWcpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIC8vIEFsbG93IGZvciBheGlvcygnZXhhbXBsZS91cmwnWywgY29uZmlnXSkgYSBsYSBmZXRjaCBBUElcbiAgaWYgKHR5cGVvZiBjb25maWcgPT09ICdzdHJpbmcnKSB7XG4gICAgY29uZmlnID0gYXJndW1lbnRzWzFdIHx8IHt9O1xuICAgIGNvbmZpZy51cmwgPSBhcmd1bWVudHNbMF07XG4gIH0gZWxzZSB7XG4gICAgY29uZmlnID0gY29uZmlnIHx8IHt9O1xuICB9XG5cbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcblxuICAvLyBTZXQgY29uZmlnLm1ldGhvZFxuICBpZiAoY29uZmlnLm1ldGhvZCkge1xuICAgIGNvbmZpZy5tZXRob2QgPSBjb25maWcubWV0aG9kLnRvTG93ZXJDYXNlKCk7XG4gIH0gZWxzZSBpZiAodGhpcy5kZWZhdWx0cy5tZXRob2QpIHtcbiAgICBjb25maWcubWV0aG9kID0gdGhpcy5kZWZhdWx0cy5tZXRob2QudG9Mb3dlckNhc2UoKTtcbiAgfSBlbHNlIHtcbiAgICBjb25maWcubWV0aG9kID0gJ2dldCc7XG4gIH1cblxuICAvLyBIb29rIHVwIGludGVyY2VwdG9ycyBtaWRkbGV3YXJlXG4gIHZhciBjaGFpbiA9IFtkaXNwYXRjaFJlcXVlc3QsIHVuZGVmaW5lZF07XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKGNvbmZpZyk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVxdWVzdC5mb3JFYWNoKGZ1bmN0aW9uIHVuc2hpZnRSZXF1ZXN0SW50ZXJjZXB0b3JzKGludGVyY2VwdG9yKSB7XG4gICAgY2hhaW4udW5zaGlmdChpbnRlcmNlcHRvci5mdWxmaWxsZWQsIGludGVyY2VwdG9yLnJlamVjdGVkKTtcbiAgfSk7XG5cbiAgdGhpcy5pbnRlcmNlcHRvcnMucmVzcG9uc2UuZm9yRWFjaChmdW5jdGlvbiBwdXNoUmVzcG9uc2VJbnRlcmNlcHRvcnMoaW50ZXJjZXB0b3IpIHtcbiAgICBjaGFpbi5wdXNoKGludGVyY2VwdG9yLmZ1bGZpbGxlZCwgaW50ZXJjZXB0b3IucmVqZWN0ZWQpO1xuICB9KTtcblxuICB3aGlsZSAoY2hhaW4ubGVuZ3RoKSB7XG4gICAgcHJvbWlzZSA9IHByb21pc2UudGhlbihjaGFpbi5zaGlmdCgpLCBjaGFpbi5zaGlmdCgpKTtcbiAgfVxuXG4gIHJldHVybiBwcm9taXNlO1xufTtcblxuQXhpb3MucHJvdG90eXBlLmdldFVyaSA9IGZ1bmN0aW9uIGdldFVyaShjb25maWcpIHtcbiAgY29uZmlnID0gbWVyZ2VDb25maWcodGhpcy5kZWZhdWx0cywgY29uZmlnKTtcbiAgcmV0dXJuIGJ1aWxkVVJMKGNvbmZpZy51cmwsIGNvbmZpZy5wYXJhbXMsIGNvbmZpZy5wYXJhbXNTZXJpYWxpemVyKS5yZXBsYWNlKC9eXFw/LywgJycpO1xufTtcblxuLy8gUHJvdmlkZSBhbGlhc2VzIGZvciBzdXBwb3J0ZWQgcmVxdWVzdCBtZXRob2RzXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJywgJ29wdGlvbnMnXSwgZnVuY3Rpb24gZm9yRWFjaE1ldGhvZE5vRGF0YShtZXRob2QpIHtcbiAgLyplc2xpbnQgZnVuYy1uYW1lczowKi9cbiAgQXhpb3MucHJvdG90eXBlW21ldGhvZF0gPSBmdW5jdGlvbih1cmwsIGNvbmZpZykge1xuICAgIHJldHVybiB0aGlzLnJlcXVlc3QodXRpbHMubWVyZ2UoY29uZmlnIHx8IHt9LCB7XG4gICAgICBtZXRob2Q6IG1ldGhvZCxcbiAgICAgIHVybDogdXJsXG4gICAgfSkpO1xuICB9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIC8qZXNsaW50IGZ1bmMtbmFtZXM6MCovXG4gIEF4aW9zLnByb3RvdHlwZVttZXRob2RdID0gZnVuY3Rpb24odXJsLCBkYXRhLCBjb25maWcpIHtcbiAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KHV0aWxzLm1lcmdlKGNvbmZpZyB8fCB7fSwge1xuICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICB1cmw6IHVybCxcbiAgICAgIGRhdGE6IGRhdGFcbiAgICB9KSk7XG4gIH07XG59KTtcblxubW9kdWxlLmV4cG9ydHMgPSBBeGlvcztcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG5mdW5jdGlvbiBJbnRlcmNlcHRvck1hbmFnZXIoKSB7XG4gIHRoaXMuaGFuZGxlcnMgPSBbXTtcbn1cblxuLyoqXG4gKiBBZGQgYSBuZXcgaW50ZXJjZXB0b3IgdG8gdGhlIHN0YWNrXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZnVsZmlsbGVkIFRoZSBmdW5jdGlvbiB0byBoYW5kbGUgYHRoZW5gIGZvciBhIGBQcm9taXNlYFxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVqZWN0ZWQgVGhlIGZ1bmN0aW9uIHRvIGhhbmRsZSBgcmVqZWN0YCBmb3IgYSBgUHJvbWlzZWBcbiAqXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IEFuIElEIHVzZWQgdG8gcmVtb3ZlIGludGVyY2VwdG9yIGxhdGVyXG4gKi9cbkludGVyY2VwdG9yTWFuYWdlci5wcm90b3R5cGUudXNlID0gZnVuY3Rpb24gdXNlKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpIHtcbiAgdGhpcy5oYW5kbGVycy5wdXNoKHtcbiAgICBmdWxmaWxsZWQ6IGZ1bGZpbGxlZCxcbiAgICByZWplY3RlZDogcmVqZWN0ZWRcbiAgfSk7XG4gIHJldHVybiB0aGlzLmhhbmRsZXJzLmxlbmd0aCAtIDE7XG59O1xuXG4vKipcbiAqIFJlbW92ZSBhbiBpbnRlcmNlcHRvciBmcm9tIHRoZSBzdGFja1xuICpcbiAqIEBwYXJhbSB7TnVtYmVyfSBpZCBUaGUgSUQgdGhhdCB3YXMgcmV0dXJuZWQgYnkgYHVzZWBcbiAqL1xuSW50ZXJjZXB0b3JNYW5hZ2VyLnByb3RvdHlwZS5lamVjdCA9IGZ1bmN0aW9uIGVqZWN0KGlkKSB7XG4gIGlmICh0aGlzLmhhbmRsZXJzW2lkXSkge1xuICAgIHRoaXMuaGFuZGxlcnNbaWRdID0gbnVsbDtcbiAgfVxufTtcblxuLyoqXG4gKiBJdGVyYXRlIG92ZXIgYWxsIHRoZSByZWdpc3RlcmVkIGludGVyY2VwdG9yc1xuICpcbiAqIFRoaXMgbWV0aG9kIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHNraXBwaW5nIG92ZXIgYW55XG4gKiBpbnRlcmNlcHRvcnMgdGhhdCBtYXkgaGF2ZSBiZWNvbWUgYG51bGxgIGNhbGxpbmcgYGVqZWN0YC5cbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gY2FsbCBmb3IgZWFjaCBpbnRlcmNlcHRvclxuICovXG5JbnRlcmNlcHRvck1hbmFnZXIucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiBmb3JFYWNoKGZuKSB7XG4gIHV0aWxzLmZvckVhY2godGhpcy5oYW5kbGVycywgZnVuY3Rpb24gZm9yRWFjaEhhbmRsZXIoaCkge1xuICAgIGlmIChoICE9PSBudWxsKSB7XG4gICAgICBmbihoKTtcbiAgICB9XG4gIH0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBJbnRlcmNlcHRvck1hbmFnZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBpc0Fic29sdXRlVVJMID0gcmVxdWlyZSgnLi4vaGVscGVycy9pc0Fic29sdXRlVVJMJyk7XG52YXIgY29tYmluZVVSTHMgPSByZXF1aXJlKCcuLi9oZWxwZXJzL2NvbWJpbmVVUkxzJyk7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBiYXNlVVJMIHdpdGggdGhlIHJlcXVlc3RlZFVSTCxcbiAqIG9ubHkgd2hlbiB0aGUgcmVxdWVzdGVkVVJMIGlzIG5vdCBhbHJlYWR5IGFuIGFic29sdXRlIFVSTC5cbiAqIElmIHRoZSByZXF1ZXN0VVJMIGlzIGFic29sdXRlLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJlcXVlc3RlZFVSTCB1bnRvdWNoZWQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkwgVGhlIGJhc2UgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gcmVxdWVzdGVkVVJMIEFic29sdXRlIG9yIHJlbGF0aXZlIFVSTCB0byBjb21iaW5lXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgY29tYmluZWQgZnVsbCBwYXRoXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gYnVpbGRGdWxsUGF0aChiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpIHtcbiAgaWYgKGJhc2VVUkwgJiYgIWlzQWJzb2x1dGVVUkwocmVxdWVzdGVkVVJMKSkge1xuICAgIHJldHVybiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZXF1ZXN0ZWRVUkwpO1xuICB9XG4gIHJldHVybiByZXF1ZXN0ZWRVUkw7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZW5oYW5jZUVycm9yID0gcmVxdWlyZSgnLi9lbmhhbmNlRXJyb3InKTtcblxuLyoqXG4gKiBDcmVhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIGNvbmZpZywgZXJyb3IgY29kZSwgcmVxdWVzdCBhbmQgcmVzcG9uc2UuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgVGhlIGVycm9yIG1lc3NhZ2UuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGNyZWF0ZWQgZXJyb3IuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gY3JlYXRlRXJyb3IobWVzc2FnZSwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICB2YXIgZXJyb3IgPSBuZXcgRXJyb3IobWVzc2FnZSk7XG4gIHJldHVybiBlbmhhbmNlRXJyb3IoZXJyb3IsIGNvbmZpZywgY29kZSwgcmVxdWVzdCwgcmVzcG9uc2UpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xudmFyIHRyYW5zZm9ybURhdGEgPSByZXF1aXJlKCcuL3RyYW5zZm9ybURhdGEnKTtcbnZhciBpc0NhbmNlbCA9IHJlcXVpcmUoJy4uL2NhbmNlbC9pc0NhbmNlbCcpO1xudmFyIGRlZmF1bHRzID0gcmVxdWlyZSgnLi4vZGVmYXVsdHMnKTtcblxuLyoqXG4gKiBUaHJvd3MgYSBgQ2FuY2VsYCBpZiBjYW5jZWxsYXRpb24gaGFzIGJlZW4gcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZykge1xuICBpZiAoY29uZmlnLmNhbmNlbFRva2VuKSB7XG4gICAgY29uZmlnLmNhbmNlbFRva2VuLnRocm93SWZSZXF1ZXN0ZWQoKTtcbiAgfVxufVxuXG4vKipcbiAqIERpc3BhdGNoIGEgcmVxdWVzdCB0byB0aGUgc2VydmVyIHVzaW5nIHRoZSBjb25maWd1cmVkIGFkYXB0ZXIuXG4gKlxuICogQHBhcmFtIHtvYmplY3R9IGNvbmZpZyBUaGUgY29uZmlnIHRoYXQgaXMgdG8gYmUgdXNlZCBmb3IgdGhlIHJlcXVlc3RcbiAqIEByZXR1cm5zIHtQcm9taXNlfSBUaGUgUHJvbWlzZSB0byBiZSBmdWxmaWxsZWRcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBkaXNwYXRjaFJlcXVlc3QoY29uZmlnKSB7XG4gIHRocm93SWZDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoY29uZmlnKTtcblxuICAvLyBFbnN1cmUgaGVhZGVycyBleGlzdFxuICBjb25maWcuaGVhZGVycyA9IGNvbmZpZy5oZWFkZXJzIHx8IHt9O1xuXG4gIC8vIFRyYW5zZm9ybSByZXF1ZXN0IGRhdGFcbiAgY29uZmlnLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgIGNvbmZpZy5kYXRhLFxuICAgIGNvbmZpZy5oZWFkZXJzLFxuICAgIGNvbmZpZy50cmFuc2Zvcm1SZXF1ZXN0XG4gICk7XG5cbiAgLy8gRmxhdHRlbiBoZWFkZXJzXG4gIGNvbmZpZy5oZWFkZXJzID0gdXRpbHMubWVyZ2UoXG4gICAgY29uZmlnLmhlYWRlcnMuY29tbW9uIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzW2NvbmZpZy5tZXRob2RdIHx8IHt9LFxuICAgIGNvbmZpZy5oZWFkZXJzXG4gICk7XG5cbiAgdXRpbHMuZm9yRWFjaChcbiAgICBbJ2RlbGV0ZScsICdnZXQnLCAnaGVhZCcsICdwb3N0JywgJ3B1dCcsICdwYXRjaCcsICdjb21tb24nXSxcbiAgICBmdW5jdGlvbiBjbGVhbkhlYWRlckNvbmZpZyhtZXRob2QpIHtcbiAgICAgIGRlbGV0ZSBjb25maWcuaGVhZGVyc1ttZXRob2RdO1xuICAgIH1cbiAgKTtcblxuICB2YXIgYWRhcHRlciA9IGNvbmZpZy5hZGFwdGVyIHx8IGRlZmF1bHRzLmFkYXB0ZXI7XG5cbiAgcmV0dXJuIGFkYXB0ZXIoY29uZmlnKS50aGVuKGZ1bmN0aW9uIG9uQWRhcHRlclJlc29sdXRpb24ocmVzcG9uc2UpIHtcbiAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAvLyBUcmFuc2Zvcm0gcmVzcG9uc2UgZGF0YVxuICAgIHJlc3BvbnNlLmRhdGEgPSB0cmFuc2Zvcm1EYXRhKFxuICAgICAgcmVzcG9uc2UuZGF0YSxcbiAgICAgIHJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICBjb25maWcudHJhbnNmb3JtUmVzcG9uc2VcbiAgICApO1xuXG4gICAgcmV0dXJuIHJlc3BvbnNlO1xuICB9LCBmdW5jdGlvbiBvbkFkYXB0ZXJSZWplY3Rpb24ocmVhc29uKSB7XG4gICAgaWYgKCFpc0NhbmNlbChyZWFzb24pKSB7XG4gICAgICB0aHJvd0lmQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKGNvbmZpZyk7XG5cbiAgICAgIC8vIFRyYW5zZm9ybSByZXNwb25zZSBkYXRhXG4gICAgICBpZiAocmVhc29uICYmIHJlYXNvbi5yZXNwb25zZSkge1xuICAgICAgICByZWFzb24ucmVzcG9uc2UuZGF0YSA9IHRyYW5zZm9ybURhdGEoXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmRhdGEsXG4gICAgICAgICAgcmVhc29uLnJlc3BvbnNlLmhlYWRlcnMsXG4gICAgICAgICAgY29uZmlnLnRyYW5zZm9ybVJlc3BvbnNlXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UucmVqZWN0KHJlYXNvbik7XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBVcGRhdGUgYW4gRXJyb3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbmZpZywgZXJyb3IgY29kZSwgYW5kIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIFRoZSBlcnJvciB0byB1cGRhdGUuXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnIFRoZSBjb25maWcuXG4gKiBAcGFyYW0ge3N0cmluZ30gW2NvZGVdIFRoZSBlcnJvciBjb2RlIChmb3IgZXhhbXBsZSwgJ0VDT05OQUJPUlRFRCcpLlxuICogQHBhcmFtIHtPYmplY3R9IFtyZXF1ZXN0XSBUaGUgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBbcmVzcG9uc2VdIFRoZSByZXNwb25zZS5cbiAqIEByZXR1cm5zIHtFcnJvcn0gVGhlIGVycm9yLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGVuaGFuY2VFcnJvcihlcnJvciwgY29uZmlnLCBjb2RlLCByZXF1ZXN0LCByZXNwb25zZSkge1xuICBlcnJvci5jb25maWcgPSBjb25maWc7XG4gIGlmIChjb2RlKSB7XG4gICAgZXJyb3IuY29kZSA9IGNvZGU7XG4gIH1cblxuICBlcnJvci5yZXF1ZXN0ID0gcmVxdWVzdDtcbiAgZXJyb3IucmVzcG9uc2UgPSByZXNwb25zZTtcbiAgZXJyb3IuaXNBeGlvc0Vycm9yID0gdHJ1ZTtcblxuICBlcnJvci50b0pTT04gPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4ge1xuICAgICAgLy8gU3RhbmRhcmRcbiAgICAgIG1lc3NhZ2U6IHRoaXMubWVzc2FnZSxcbiAgICAgIG5hbWU6IHRoaXMubmFtZSxcbiAgICAgIC8vIE1pY3Jvc29mdFxuICAgICAgZGVzY3JpcHRpb246IHRoaXMuZGVzY3JpcHRpb24sXG4gICAgICBudW1iZXI6IHRoaXMubnVtYmVyLFxuICAgICAgLy8gTW96aWxsYVxuICAgICAgZmlsZU5hbWU6IHRoaXMuZmlsZU5hbWUsXG4gICAgICBsaW5lTnVtYmVyOiB0aGlzLmxpbmVOdW1iZXIsXG4gICAgICBjb2x1bW5OdW1iZXI6IHRoaXMuY29sdW1uTnVtYmVyLFxuICAgICAgc3RhY2s6IHRoaXMuc3RhY2ssXG4gICAgICAvLyBBeGlvc1xuICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZyxcbiAgICAgIGNvZGU6IHRoaXMuY29kZVxuICAgIH07XG4gIH07XG4gIHJldHVybiBlcnJvcjtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbi8qKlxuICogQ29uZmlnLXNwZWNpZmljIG1lcmdlLWZ1bmN0aW9uIHdoaWNoIGNyZWF0ZXMgYSBuZXcgY29uZmlnLW9iamVjdFxuICogYnkgbWVyZ2luZyB0d28gY29uZmlndXJhdGlvbiBvYmplY3RzIHRvZ2V0aGVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcxXG4gKiBAcGFyYW0ge09iamVjdH0gY29uZmlnMlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9iamVjdCByZXN1bHRpbmcgZnJvbSBtZXJnaW5nIGNvbmZpZzIgdG8gY29uZmlnMVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIG1lcmdlQ29uZmlnKGNvbmZpZzEsIGNvbmZpZzIpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gIGNvbmZpZzIgPSBjb25maWcyIHx8IHt9O1xuICB2YXIgY29uZmlnID0ge307XG5cbiAgdmFyIHZhbHVlRnJvbUNvbmZpZzJLZXlzID0gWyd1cmwnLCAnbWV0aG9kJywgJ3BhcmFtcycsICdkYXRhJ107XG4gIHZhciBtZXJnZURlZXBQcm9wZXJ0aWVzS2V5cyA9IFsnaGVhZGVycycsICdhdXRoJywgJ3Byb3h5J107XG4gIHZhciBkZWZhdWx0VG9Db25maWcyS2V5cyA9IFtcbiAgICAnYmFzZVVSTCcsICd1cmwnLCAndHJhbnNmb3JtUmVxdWVzdCcsICd0cmFuc2Zvcm1SZXNwb25zZScsICdwYXJhbXNTZXJpYWxpemVyJyxcbiAgICAndGltZW91dCcsICd3aXRoQ3JlZGVudGlhbHMnLCAnYWRhcHRlcicsICdyZXNwb25zZVR5cGUnLCAneHNyZkNvb2tpZU5hbWUnLFxuICAgICd4c3JmSGVhZGVyTmFtZScsICdvblVwbG9hZFByb2dyZXNzJywgJ29uRG93bmxvYWRQcm9ncmVzcycsXG4gICAgJ21heENvbnRlbnRMZW5ndGgnLCAndmFsaWRhdGVTdGF0dXMnLCAnbWF4UmVkaXJlY3RzJywgJ2h0dHBBZ2VudCcsXG4gICAgJ2h0dHBzQWdlbnQnLCAnY2FuY2VsVG9rZW4nLCAnc29ja2V0UGF0aCdcbiAgXTtcblxuICB1dGlscy5mb3JFYWNoKHZhbHVlRnJvbUNvbmZpZzJLZXlzLCBmdW5jdGlvbiB2YWx1ZUZyb21Db25maWcyKHByb3ApIHtcbiAgICBpZiAodHlwZW9mIGNvbmZpZzJbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcyW3Byb3BdO1xuICAgIH1cbiAgfSk7XG5cbiAgdXRpbHMuZm9yRWFjaChtZXJnZURlZXBQcm9wZXJ0aWVzS2V5cywgZnVuY3Rpb24gbWVyZ2VEZWVwUHJvcGVydGllcyhwcm9wKSB7XG4gICAgaWYgKHV0aWxzLmlzT2JqZWN0KGNvbmZpZzJbcHJvcF0pKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSB1dGlscy5kZWVwTWVyZ2UoY29uZmlnMVtwcm9wXSwgY29uZmlnMltwcm9wXSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnMltwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzJbcHJvcF07XG4gICAgfSBlbHNlIGlmICh1dGlscy5pc09iamVjdChjb25maWcxW3Byb3BdKSkge1xuICAgICAgY29uZmlnW3Byb3BdID0gdXRpbHMuZGVlcE1lcmdlKGNvbmZpZzFbcHJvcF0pO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGNvbmZpZzFbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBjb25maWdbcHJvcF0gPSBjb25maWcxW3Byb3BdO1xuICAgIH1cbiAgfSk7XG5cbiAgdXRpbHMuZm9yRWFjaChkZWZhdWx0VG9Db25maWcyS2V5cywgZnVuY3Rpb24gZGVmYXVsdFRvQ29uZmlnMihwcm9wKSB7XG4gICAgaWYgKHR5cGVvZiBjb25maWcyW3Byb3BdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnW3Byb3BdID0gY29uZmlnMltwcm9wXTtcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBjb25maWcxW3Byb3BdICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgY29uZmlnW3Byb3BdID0gY29uZmlnMVtwcm9wXTtcbiAgICB9XG4gIH0pO1xuXG4gIHZhciBheGlvc0tleXMgPSB2YWx1ZUZyb21Db25maWcyS2V5c1xuICAgIC5jb25jYXQobWVyZ2VEZWVwUHJvcGVydGllc0tleXMpXG4gICAgLmNvbmNhdChkZWZhdWx0VG9Db25maWcyS2V5cyk7XG5cbiAgdmFyIG90aGVyS2V5cyA9IE9iamVjdFxuICAgIC5rZXlzKGNvbmZpZzIpXG4gICAgLmZpbHRlcihmdW5jdGlvbiBmaWx0ZXJBeGlvc0tleXMoa2V5KSB7XG4gICAgICByZXR1cm4gYXhpb3NLZXlzLmluZGV4T2Yoa2V5KSA9PT0gLTE7XG4gICAgfSk7XG5cbiAgdXRpbHMuZm9yRWFjaChvdGhlcktleXMsIGZ1bmN0aW9uIG90aGVyS2V5c0RlZmF1bHRUb0NvbmZpZzIocHJvcCkge1xuICAgIGlmICh0eXBlb2YgY29uZmlnMltwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzJbcHJvcF07XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgY29uZmlnMVtwcm9wXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIGNvbmZpZ1twcm9wXSA9IGNvbmZpZzFbcHJvcF07XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gY29uZmlnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNyZWF0ZUVycm9yID0gcmVxdWlyZSgnLi9jcmVhdGVFcnJvcicpO1xuXG4vKipcbiAqIFJlc29sdmUgb3IgcmVqZWN0IGEgUHJvbWlzZSBiYXNlZCBvbiByZXNwb25zZSBzdGF0dXMuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gcmVzb2x2ZSBBIGZ1bmN0aW9uIHRoYXQgcmVzb2x2ZXMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSByZWplY3QgQSBmdW5jdGlvbiB0aGF0IHJlamVjdHMgdGhlIHByb21pc2UuXG4gKiBAcGFyYW0ge29iamVjdH0gcmVzcG9uc2UgVGhlIHJlc3BvbnNlLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHJlc3BvbnNlKSB7XG4gIHZhciB2YWxpZGF0ZVN0YXR1cyA9IHJlc3BvbnNlLmNvbmZpZy52YWxpZGF0ZVN0YXR1cztcbiAgaWYgKCF2YWxpZGF0ZVN0YXR1cyB8fCB2YWxpZGF0ZVN0YXR1cyhyZXNwb25zZS5zdGF0dXMpKSB7XG4gICAgcmVzb2x2ZShyZXNwb25zZSk7XG4gIH0gZWxzZSB7XG4gICAgcmVqZWN0KGNyZWF0ZUVycm9yKFxuICAgICAgJ1JlcXVlc3QgZmFpbGVkIHdpdGggc3RhdHVzIGNvZGUgJyArIHJlc3BvbnNlLnN0YXR1cyxcbiAgICAgIHJlc3BvbnNlLmNvbmZpZyxcbiAgICAgIG51bGwsXG4gICAgICByZXNwb25zZS5yZXF1ZXN0LFxuICAgICAgcmVzcG9uc2VcbiAgICApKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG4vKipcbiAqIFRyYW5zZm9ybSB0aGUgZGF0YSBmb3IgYSByZXF1ZXN0IG9yIGEgcmVzcG9uc2VcbiAqXG4gKiBAcGFyYW0ge09iamVjdHxTdHJpbmd9IGRhdGEgVGhlIGRhdGEgdG8gYmUgdHJhbnNmb3JtZWRcbiAqIEBwYXJhbSB7QXJyYXl9IGhlYWRlcnMgVGhlIGhlYWRlcnMgZm9yIHRoZSByZXF1ZXN0IG9yIHJlc3BvbnNlXG4gKiBAcGFyYW0ge0FycmF5fEZ1bmN0aW9ufSBmbnMgQSBzaW5nbGUgZnVuY3Rpb24gb3IgQXJyYXkgb2YgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyB7Kn0gVGhlIHJlc3VsdGluZyB0cmFuc2Zvcm1lZCBkYXRhXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gdHJhbnNmb3JtRGF0YShkYXRhLCBoZWFkZXJzLCBmbnMpIHtcbiAgLyplc2xpbnQgbm8tcGFyYW0tcmVhc3NpZ246MCovXG4gIHV0aWxzLmZvckVhY2goZm5zLCBmdW5jdGlvbiB0cmFuc2Zvcm0oZm4pIHtcbiAgICBkYXRhID0gZm4oZGF0YSwgaGVhZGVycyk7XG4gIH0pO1xuXG4gIHJldHVybiBkYXRhO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIG5vcm1hbGl6ZUhlYWRlck5hbWUgPSByZXF1aXJlKCcuL2hlbHBlcnMvbm9ybWFsaXplSGVhZGVyTmFtZScpO1xuXG52YXIgREVGQVVMVF9DT05URU5UX1RZUEUgPSB7XG4gICdDb250ZW50LVR5cGUnOiAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xufTtcblxuZnVuY3Rpb24gc2V0Q29udGVudFR5cGVJZlVuc2V0KGhlYWRlcnMsIHZhbHVlKSB7XG4gIGlmICghdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVycykgJiYgdXRpbHMuaXNVbmRlZmluZWQoaGVhZGVyc1snQ29udGVudC1UeXBlJ10pKSB7XG4gICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSB2YWx1ZTtcbiAgfVxufVxuXG5mdW5jdGlvbiBnZXREZWZhdWx0QWRhcHRlcigpIHtcbiAgdmFyIGFkYXB0ZXI7XG4gIGlmICh0eXBlb2YgWE1MSHR0cFJlcXVlc3QgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgLy8gRm9yIGJyb3dzZXJzIHVzZSBYSFIgYWRhcHRlclxuICAgIGFkYXB0ZXIgPSByZXF1aXJlKCcuL2FkYXB0ZXJzL3hocicpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBwcm9jZXNzICE9PSAndW5kZWZpbmVkJyAmJiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJykge1xuICAgIC8vIEZvciBub2RlIHVzZSBIVFRQIGFkYXB0ZXJcbiAgICBhZGFwdGVyID0gcmVxdWlyZSgnLi9hZGFwdGVycy9odHRwJyk7XG4gIH1cbiAgcmV0dXJuIGFkYXB0ZXI7XG59XG5cbnZhciBkZWZhdWx0cyA9IHtcbiAgYWRhcHRlcjogZ2V0RGVmYXVsdEFkYXB0ZXIoKSxcblxuICB0cmFuc2Zvcm1SZXF1ZXN0OiBbZnVuY3Rpb24gdHJhbnNmb3JtUmVxdWVzdChkYXRhLCBoZWFkZXJzKSB7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQWNjZXB0Jyk7XG4gICAgbm9ybWFsaXplSGVhZGVyTmFtZShoZWFkZXJzLCAnQ29udGVudC1UeXBlJyk7XG4gICAgaWYgKHV0aWxzLmlzRm9ybURhdGEoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQXJyYXlCdWZmZXIoZGF0YSkgfHxcbiAgICAgIHV0aWxzLmlzQnVmZmVyKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc1N0cmVhbShkYXRhKSB8fFxuICAgICAgdXRpbHMuaXNGaWxlKGRhdGEpIHx8XG4gICAgICB1dGlscy5pc0Jsb2IoZGF0YSlcbiAgICApIHtcbiAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNBcnJheUJ1ZmZlclZpZXcoZGF0YSkpIHtcbiAgICAgIHJldHVybiBkYXRhLmJ1ZmZlcjtcbiAgICB9XG4gICAgaWYgKHV0aWxzLmlzVVJMU2VhcmNoUGFyYW1zKGRhdGEpKSB7XG4gICAgICBzZXRDb250ZW50VHlwZUlmVW5zZXQoaGVhZGVycywgJ2FwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDtjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXR1cm4gZGF0YS50b1N0cmluZygpO1xuICAgIH1cbiAgICBpZiAodXRpbHMuaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgIHNldENvbnRlbnRUeXBlSWZVbnNldChoZWFkZXJzLCAnYXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04Jyk7XG4gICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZGF0YSk7XG4gICAgfVxuICAgIHJldHVybiBkYXRhO1xuICB9XSxcblxuICB0cmFuc2Zvcm1SZXNwb25zZTogW2Z1bmN0aW9uIHRyYW5zZm9ybVJlc3BvbnNlKGRhdGEpIHtcbiAgICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgICB0cnkge1xuICAgICAgICBkYXRhID0gSlNPTi5wYXJzZShkYXRhKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHsgLyogSWdub3JlICovIH1cbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG4gIH1dLFxuXG4gIC8qKlxuICAgKiBBIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzIHRvIGFib3J0IGEgcmVxdWVzdC4gSWYgc2V0IHRvIDAgKGRlZmF1bHQpIGFcbiAgICogdGltZW91dCBpcyBub3QgY3JlYXRlZC5cbiAgICovXG4gIHRpbWVvdXQ6IDAsXG5cbiAgeHNyZkNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJyxcbiAgeHNyZkhlYWRlck5hbWU6ICdYLVhTUkYtVE9LRU4nLFxuXG4gIG1heENvbnRlbnRMZW5ndGg6IC0xLFxuXG4gIHZhbGlkYXRlU3RhdHVzOiBmdW5jdGlvbiB2YWxpZGF0ZVN0YXR1cyhzdGF0dXMpIHtcbiAgICByZXR1cm4gc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDA7XG4gIH1cbn07XG5cbmRlZmF1bHRzLmhlYWRlcnMgPSB7XG4gIGNvbW1vbjoge1xuICAgICdBY2NlcHQnOiAnYXBwbGljYXRpb24vanNvbiwgdGV4dC9wbGFpbiwgKi8qJ1xuICB9XG59O1xuXG51dGlscy5mb3JFYWNoKFsnZGVsZXRlJywgJ2dldCcsICdoZWFkJ10sIGZ1bmN0aW9uIGZvckVhY2hNZXRob2ROb0RhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHt9O1xufSk7XG5cbnV0aWxzLmZvckVhY2goWydwb3N0JywgJ3B1dCcsICdwYXRjaCddLCBmdW5jdGlvbiBmb3JFYWNoTWV0aG9kV2l0aERhdGEobWV0aG9kKSB7XG4gIGRlZmF1bHRzLmhlYWRlcnNbbWV0aG9kXSA9IHV0aWxzLm1lcmdlKERFRkFVTFRfQ09OVEVOVF9UWVBFKTtcbn0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRlZmF1bHRzO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGJpbmQoZm4sIHRoaXNBcmcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHdyYXAoKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBhcmdzW2ldID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpc0FyZywgYXJncyk7XG4gIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbmZ1bmN0aW9uIGVuY29kZSh2YWwpIHtcbiAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudCh2YWwpLlxuICAgIHJlcGxhY2UoLyU0MC9naSwgJ0AnKS5cbiAgICByZXBsYWNlKC8lM0EvZ2ksICc6JykuXG4gICAgcmVwbGFjZSgvJTI0L2csICckJykuXG4gICAgcmVwbGFjZSgvJTJDL2dpLCAnLCcpLlxuICAgIHJlcGxhY2UoLyUyMC9nLCAnKycpLlxuICAgIHJlcGxhY2UoLyU1Qi9naSwgJ1snKS5cbiAgICByZXBsYWNlKC8lNUQvZ2ksICddJyk7XG59XG5cbi8qKlxuICogQnVpbGQgYSBVUkwgYnkgYXBwZW5kaW5nIHBhcmFtcyB0byB0aGUgZW5kXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHVybCBUaGUgYmFzZSBvZiB0aGUgdXJsIChlLmcuLCBodHRwOi8vd3d3Lmdvb2dsZS5jb20pXG4gKiBAcGFyYW0ge29iamVjdH0gW3BhcmFtc10gVGhlIHBhcmFtcyB0byBiZSBhcHBlbmRlZFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIGZvcm1hdHRlZCB1cmxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBidWlsZFVSTCh1cmwsIHBhcmFtcywgcGFyYW1zU2VyaWFsaXplcikge1xuICAvKmVzbGludCBuby1wYXJhbS1yZWFzc2lnbjowKi9cbiAgaWYgKCFwYXJhbXMpIHtcbiAgICByZXR1cm4gdXJsO1xuICB9XG5cbiAgdmFyIHNlcmlhbGl6ZWRQYXJhbXM7XG4gIGlmIChwYXJhbXNTZXJpYWxpemVyKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtc1NlcmlhbGl6ZXIocGFyYW1zKTtcbiAgfSBlbHNlIGlmICh1dGlscy5pc1VSTFNlYXJjaFBhcmFtcyhwYXJhbXMpKSB7XG4gICAgc2VyaWFsaXplZFBhcmFtcyA9IHBhcmFtcy50b1N0cmluZygpO1xuICB9IGVsc2Uge1xuICAgIHZhciBwYXJ0cyA9IFtdO1xuXG4gICAgdXRpbHMuZm9yRWFjaChwYXJhbXMsIGZ1bmN0aW9uIHNlcmlhbGl6ZSh2YWwsIGtleSkge1xuICAgICAgaWYgKHZhbCA9PT0gbnVsbCB8fCB0eXBlb2YgdmFsID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmICh1dGlscy5pc0FycmF5KHZhbCkpIHtcbiAgICAgICAga2V5ID0ga2V5ICsgJ1tdJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbCA9IFt2YWxdO1xuICAgICAgfVxuXG4gICAgICB1dGlscy5mb3JFYWNoKHZhbCwgZnVuY3Rpb24gcGFyc2VWYWx1ZSh2KSB7XG4gICAgICAgIGlmICh1dGlscy5pc0RhdGUodikpIHtcbiAgICAgICAgICB2ID0gdi50b0lTT1N0cmluZygpO1xuICAgICAgICB9IGVsc2UgaWYgKHV0aWxzLmlzT2JqZWN0KHYpKSB7XG4gICAgICAgICAgdiA9IEpTT04uc3RyaW5naWZ5KHYpO1xuICAgICAgICB9XG4gICAgICAgIHBhcnRzLnB1c2goZW5jb2RlKGtleSkgKyAnPScgKyBlbmNvZGUodikpO1xuICAgICAgfSk7XG4gICAgfSk7XG5cbiAgICBzZXJpYWxpemVkUGFyYW1zID0gcGFydHMuam9pbignJicpO1xuICB9XG5cbiAgaWYgKHNlcmlhbGl6ZWRQYXJhbXMpIHtcbiAgICB2YXIgaGFzaG1hcmtJbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG4gICAgaWYgKGhhc2htYXJrSW5kZXggIT09IC0xKSB7XG4gICAgICB1cmwgPSB1cmwuc2xpY2UoMCwgaGFzaG1hcmtJbmRleCk7XG4gICAgfVxuXG4gICAgdXJsICs9ICh1cmwuaW5kZXhPZignPycpID09PSAtMSA/ICc/JyA6ICcmJykgKyBzZXJpYWxpemVkUGFyYW1zO1xuICB9XG5cbiAgcmV0dXJuIHVybDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBVUkwgYnkgY29tYmluaW5nIHRoZSBzcGVjaWZpZWQgVVJMc1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJMIFRoZSBiYXNlIFVSTFxuICogQHBhcmFtIHtzdHJpbmd9IHJlbGF0aXZlVVJMIFRoZSByZWxhdGl2ZSBVUkxcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSBjb21iaW5lZCBVUkxcbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjb21iaW5lVVJMcyhiYXNlVVJMLCByZWxhdGl2ZVVSTCkge1xuICByZXR1cm4gcmVsYXRpdmVVUkxcbiAgICA/IGJhc2VVUkwucmVwbGFjZSgvXFwvKyQvLCAnJykgKyAnLycgKyByZWxhdGl2ZVVSTC5yZXBsYWNlKC9eXFwvKy8sICcnKVxuICAgIDogYmFzZVVSTDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAoXG4gIHV0aWxzLmlzU3RhbmRhcmRCcm93c2VyRW52KCkgP1xuXG4gIC8vIFN0YW5kYXJkIGJyb3dzZXIgZW52cyBzdXBwb3J0IGRvY3VtZW50LmNvb2tpZVxuICAgIChmdW5jdGlvbiBzdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUobmFtZSwgdmFsdWUsIGV4cGlyZXMsIHBhdGgsIGRvbWFpbiwgc2VjdXJlKSB7XG4gICAgICAgICAgdmFyIGNvb2tpZSA9IFtdO1xuICAgICAgICAgIGNvb2tpZS5wdXNoKG5hbWUgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQodmFsdWUpKTtcblxuICAgICAgICAgIGlmICh1dGlscy5pc051bWJlcihleHBpcmVzKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ2V4cGlyZXM9JyArIG5ldyBEYXRlKGV4cGlyZXMpLnRvR01UU3RyaW5nKCkpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhwYXRoKSkge1xuICAgICAgICAgICAgY29va2llLnB1c2goJ3BhdGg9JyArIHBhdGgpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICh1dGlscy5pc1N0cmluZyhkb21haW4pKSB7XG4gICAgICAgICAgICBjb29raWUucHVzaCgnZG9tYWluPScgKyBkb21haW4pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChzZWN1cmUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIGNvb2tpZS5wdXNoKCdzZWN1cmUnKTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkb2N1bWVudC5jb29raWUgPSBjb29raWUuam9pbignOyAnKTtcbiAgICAgICAgfSxcblxuICAgICAgICByZWFkOiBmdW5jdGlvbiByZWFkKG5hbWUpIHtcbiAgICAgICAgICB2YXIgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58O1xcXFxzKikoJyArIG5hbWUgKyAnKT0oW147XSopJykpO1xuICAgICAgICAgIHJldHVybiAobWF0Y2ggPyBkZWNvZGVVUklDb21wb25lbnQobWF0Y2hbM10pIDogbnVsbCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtb3ZlOiBmdW5jdGlvbiByZW1vdmUobmFtZSkge1xuICAgICAgICAgIHRoaXMud3JpdGUobmFtZSwgJycsIERhdGUubm93KCkgLSA4NjQwMDAwMCk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgfSkoKSA6XG5cbiAgLy8gTm9uIHN0YW5kYXJkIGJyb3dzZXIgZW52ICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAgIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB3cml0ZTogZnVuY3Rpb24gd3JpdGUoKSB7fSxcbiAgICAgICAgcmVhZDogZnVuY3Rpb24gcmVhZCgpIHsgcmV0dXJuIG51bGw7IH0sXG4gICAgICAgIHJlbW92ZTogZnVuY3Rpb24gcmVtb3ZlKCkge31cbiAgICAgIH07XG4gICAgfSkoKVxuKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGVcbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIFRoZSBVUkwgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHNwZWNpZmllZCBVUkwgaXMgYWJzb2x1dGUsIG90aGVyd2lzZSBmYWxzZVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQWJzb2x1dGVVUkwodXJsKSB7XG4gIC8vIEEgVVJMIGlzIGNvbnNpZGVyZWQgYWJzb2x1dGUgaWYgaXQgYmVnaW5zIHdpdGggXCI8c2NoZW1lPjovL1wiIG9yIFwiLy9cIiAocHJvdG9jb2wtcmVsYXRpdmUgVVJMKS5cbiAgLy8gUkZDIDM5ODYgZGVmaW5lcyBzY2hlbWUgbmFtZSBhcyBhIHNlcXVlbmNlIG9mIGNoYXJhY3RlcnMgYmVnaW5uaW5nIHdpdGggYSBsZXR0ZXIgYW5kIGZvbGxvd2VkXG4gIC8vIGJ5IGFueSBjb21iaW5hdGlvbiBvZiBsZXR0ZXJzLCBkaWdpdHMsIHBsdXMsIHBlcmlvZCwgb3IgaHlwaGVuLlxuICByZXR1cm4gL14oW2Etel1bYS16XFxkXFwrXFwtXFwuXSo6KT9cXC9cXC8vaS50ZXN0KHVybCk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLy4uL3V0aWxzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gKFxuICB1dGlscy5pc1N0YW5kYXJkQnJvd3NlckVudigpID9cblxuICAvLyBTdGFuZGFyZCBicm93c2VyIGVudnMgaGF2ZSBmdWxsIHN1cHBvcnQgb2YgdGhlIEFQSXMgbmVlZGVkIHRvIHRlc3RcbiAgLy8gd2hldGhlciB0aGUgcmVxdWVzdCBVUkwgaXMgb2YgdGhlIHNhbWUgb3JpZ2luIGFzIGN1cnJlbnQgbG9jYXRpb24uXG4gICAgKGZ1bmN0aW9uIHN0YW5kYXJkQnJvd3NlckVudigpIHtcbiAgICAgIHZhciBtc2llID0gLyhtc2llfHRyaWRlbnQpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTtcbiAgICAgIHZhciB1cmxQYXJzaW5nTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTtcbiAgICAgIHZhciBvcmlnaW5VUkw7XG5cbiAgICAgIC8qKlxuICAgICogUGFyc2UgYSBVUkwgdG8gZGlzY292ZXIgaXQncyBjb21wb25lbnRzXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHVybCBUaGUgVVJMIHRvIGJlIHBhcnNlZFxuICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAqL1xuICAgICAgZnVuY3Rpb24gcmVzb2x2ZVVSTCh1cmwpIHtcbiAgICAgICAgdmFyIGhyZWYgPSB1cmw7XG5cbiAgICAgICAgaWYgKG1zaWUpIHtcbiAgICAgICAgLy8gSUUgbmVlZHMgYXR0cmlidXRlIHNldCB0d2ljZSB0byBub3JtYWxpemUgcHJvcGVydGllc1xuICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIGhyZWYpO1xuICAgICAgICAgIGhyZWYgPSB1cmxQYXJzaW5nTm9kZS5ocmVmO1xuICAgICAgICB9XG5cbiAgICAgICAgdXJsUGFyc2luZ05vZGUuc2V0QXR0cmlidXRlKCdocmVmJywgaHJlZik7XG5cbiAgICAgICAgLy8gdXJsUGFyc2luZ05vZGUgcHJvdmlkZXMgdGhlIFVybFV0aWxzIGludGVyZmFjZSAtIGh0dHA6Ly91cmwuc3BlYy53aGF0d2cub3JnLyN1cmx1dGlsc1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIGhyZWY6IHVybFBhcnNpbmdOb2RlLmhyZWYsXG4gICAgICAgICAgcHJvdG9jb2w6IHVybFBhcnNpbmdOb2RlLnByb3RvY29sID8gdXJsUGFyc2luZ05vZGUucHJvdG9jb2wucmVwbGFjZSgvOiQvLCAnJykgOiAnJyxcbiAgICAgICAgICBob3N0OiB1cmxQYXJzaW5nTm9kZS5ob3N0LFxuICAgICAgICAgIHNlYXJjaDogdXJsUGFyc2luZ05vZGUuc2VhcmNoID8gdXJsUGFyc2luZ05vZGUuc2VhcmNoLnJlcGxhY2UoL15cXD8vLCAnJykgOiAnJyxcbiAgICAgICAgICBoYXNoOiB1cmxQYXJzaW5nTm9kZS5oYXNoID8gdXJsUGFyc2luZ05vZGUuaGFzaC5yZXBsYWNlKC9eIy8sICcnKSA6ICcnLFxuICAgICAgICAgIGhvc3RuYW1lOiB1cmxQYXJzaW5nTm9kZS5ob3N0bmFtZSxcbiAgICAgICAgICBwb3J0OiB1cmxQYXJzaW5nTm9kZS5wb3J0LFxuICAgICAgICAgIHBhdGhuYW1lOiAodXJsUGFyc2luZ05vZGUucGF0aG5hbWUuY2hhckF0KDApID09PSAnLycpID9cbiAgICAgICAgICAgIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lIDpcbiAgICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIG9yaWdpblVSTCA9IHJlc29sdmVVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpO1xuXG4gICAgICAvKipcbiAgICAqIERldGVybWluZSBpZiBhIFVSTCBzaGFyZXMgdGhlIHNhbWUgb3JpZ2luIGFzIHRoZSBjdXJyZW50IGxvY2F0aW9uXG4gICAgKlxuICAgICogQHBhcmFtIHtTdHJpbmd9IHJlcXVlc3RVUkwgVGhlIFVSTCB0byB0ZXN0XG4gICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiBVUkwgc2hhcmVzIHRoZSBzYW1lIG9yaWdpbiwgb3RoZXJ3aXNlIGZhbHNlXG4gICAgKi9cbiAgICAgIHJldHVybiBmdW5jdGlvbiBpc1VSTFNhbWVPcmlnaW4ocmVxdWVzdFVSTCkge1xuICAgICAgICB2YXIgcGFyc2VkID0gKHV0aWxzLmlzU3RyaW5nKHJlcXVlc3RVUkwpKSA/IHJlc29sdmVVUkwocmVxdWVzdFVSTCkgOiByZXF1ZXN0VVJMO1xuICAgICAgICByZXR1cm4gKHBhcnNlZC5wcm90b2NvbCA9PT0gb3JpZ2luVVJMLnByb3RvY29sICYmXG4gICAgICAgICAgICBwYXJzZWQuaG9zdCA9PT0gb3JpZ2luVVJMLmhvc3QpO1xuICAgICAgfTtcbiAgICB9KSgpIDpcblxuICAvLyBOb24gc3RhbmRhcmQgYnJvd3NlciBlbnZzICh3ZWIgd29ya2VycywgcmVhY3QtbmF0aXZlKSBsYWNrIG5lZWRlZCBzdXBwb3J0LlxuICAgIChmdW5jdGlvbiBub25TdGFuZGFyZEJyb3dzZXJFbnYoKSB7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gaXNVUkxTYW1lT3JpZ2luKCkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH07XG4gICAgfSkoKVxuKTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBub3JtYWxpemVIZWFkZXJOYW1lKGhlYWRlcnMsIG5vcm1hbGl6ZWROYW1lKSB7XG4gIHV0aWxzLmZvckVhY2goaGVhZGVycywgZnVuY3Rpb24gcHJvY2Vzc0hlYWRlcih2YWx1ZSwgbmFtZSkge1xuICAgIGlmIChuYW1lICE9PSBub3JtYWxpemVkTmFtZSAmJiBuYW1lLnRvVXBwZXJDYXNlKCkgPT09IG5vcm1hbGl6ZWROYW1lLnRvVXBwZXJDYXNlKCkpIHtcbiAgICAgIGhlYWRlcnNbbm9ybWFsaXplZE5hbWVdID0gdmFsdWU7XG4gICAgICBkZWxldGUgaGVhZGVyc1tuYW1lXTtcbiAgICB9XG4gIH0pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi8uLi91dGlscycpO1xuXG4vLyBIZWFkZXJzIHdob3NlIGR1cGxpY2F0ZXMgYXJlIGlnbm9yZWQgYnkgbm9kZVxuLy8gYy5mLiBodHRwczovL25vZGVqcy5vcmcvYXBpL2h0dHAuaHRtbCNodHRwX21lc3NhZ2VfaGVhZGVyc1xudmFyIGlnbm9yZUR1cGxpY2F0ZU9mID0gW1xuICAnYWdlJywgJ2F1dGhvcml6YXRpb24nLCAnY29udGVudC1sZW5ndGgnLCAnY29udGVudC10eXBlJywgJ2V0YWcnLFxuICAnZXhwaXJlcycsICdmcm9tJywgJ2hvc3QnLCAnaWYtbW9kaWZpZWQtc2luY2UnLCAnaWYtdW5tb2RpZmllZC1zaW5jZScsXG4gICdsYXN0LW1vZGlmaWVkJywgJ2xvY2F0aW9uJywgJ21heC1mb3J3YXJkcycsICdwcm94eS1hdXRob3JpemF0aW9uJyxcbiAgJ3JlZmVyZXInLCAncmV0cnktYWZ0ZXInLCAndXNlci1hZ2VudCdcbl07XG5cbi8qKlxuICogUGFyc2UgaGVhZGVycyBpbnRvIGFuIG9iamVjdFxuICpcbiAqIGBgYFxuICogRGF0ZTogV2VkLCAyNyBBdWcgMjAxNCAwODo1ODo0OSBHTVRcbiAqIENvbnRlbnQtVHlwZTogYXBwbGljYXRpb24vanNvblxuICogQ29ubmVjdGlvbjoga2VlcC1hbGl2ZVxuICogVHJhbnNmZXItRW5jb2Rpbmc6IGNodW5rZWRcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7U3RyaW5nfSBoZWFkZXJzIEhlYWRlcnMgbmVlZGluZyB0byBiZSBwYXJzZWRcbiAqIEByZXR1cm5zIHtPYmplY3R9IEhlYWRlcnMgcGFyc2VkIGludG8gYW4gb2JqZWN0XG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gcGFyc2VIZWFkZXJzKGhlYWRlcnMpIHtcbiAgdmFyIHBhcnNlZCA9IHt9O1xuICB2YXIga2V5O1xuICB2YXIgdmFsO1xuICB2YXIgaTtcblxuICBpZiAoIWhlYWRlcnMpIHsgcmV0dXJuIHBhcnNlZDsgfVxuXG4gIHV0aWxzLmZvckVhY2goaGVhZGVycy5zcGxpdCgnXFxuJyksIGZ1bmN0aW9uIHBhcnNlcihsaW5lKSB7XG4gICAgaSA9IGxpbmUuaW5kZXhPZignOicpO1xuICAgIGtleSA9IHV0aWxzLnRyaW0obGluZS5zdWJzdHIoMCwgaSkpLnRvTG93ZXJDYXNlKCk7XG4gICAgdmFsID0gdXRpbHMudHJpbShsaW5lLnN1YnN0cihpICsgMSkpO1xuXG4gICAgaWYgKGtleSkge1xuICAgICAgaWYgKHBhcnNlZFtrZXldICYmIGlnbm9yZUR1cGxpY2F0ZU9mLmluZGV4T2Yoa2V5KSA+PSAwKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGlmIChrZXkgPT09ICdzZXQtY29va2llJykge1xuICAgICAgICBwYXJzZWRba2V5XSA9IChwYXJzZWRba2V5XSA/IHBhcnNlZFtrZXldIDogW10pLmNvbmNhdChbdmFsXSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwYXJzZWRba2V5XSA9IHBhcnNlZFtrZXldID8gcGFyc2VkW2tleV0gKyAnLCAnICsgdmFsIDogdmFsO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIHBhcnNlZDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8qKlxuICogU3ludGFjdGljIHN1Z2FyIGZvciBpbnZva2luZyBhIGZ1bmN0aW9uIGFuZCBleHBhbmRpbmcgYW4gYXJyYXkgZm9yIGFyZ3VtZW50cy5cbiAqXG4gKiBDb21tb24gdXNlIGNhc2Ugd291bGQgYmUgdG8gdXNlIGBGdW5jdGlvbi5wcm90b3R5cGUuYXBwbHlgLlxuICpcbiAqICBgYGBqc1xuICogIGZ1bmN0aW9uIGYoeCwgeSwgeikge31cbiAqICB2YXIgYXJncyA9IFsxLCAyLCAzXTtcbiAqICBmLmFwcGx5KG51bGwsIGFyZ3MpO1xuICogIGBgYFxuICpcbiAqIFdpdGggYHNwcmVhZGAgdGhpcyBleGFtcGxlIGNhbiBiZSByZS13cml0dGVuLlxuICpcbiAqICBgYGBqc1xuICogIHNwcmVhZChmdW5jdGlvbih4LCB5LCB6KSB7fSkoWzEsIDIsIDNdKTtcbiAqICBgYGBcbiAqXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFja1xuICogQHJldHVybnMge0Z1bmN0aW9ufVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHNwcmVhZChjYWxsYmFjaykge1xuICByZXR1cm4gZnVuY3Rpb24gd3JhcChhcnIpIHtcbiAgICByZXR1cm4gY2FsbGJhY2suYXBwbHkobnVsbCwgYXJyKTtcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBiaW5kID0gcmVxdWlyZSgnLi9oZWxwZXJzL2JpbmQnKTtcblxuLypnbG9iYWwgdG9TdHJpbmc6dHJ1ZSovXG5cbi8vIHV0aWxzIGlzIGEgbGlicmFyeSBvZiBnZW5lcmljIGhlbHBlciBmdW5jdGlvbnMgbm9uLXNwZWNpZmljIHRvIGF4aW9zXG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheSwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXkodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgdW5kZWZpbmVkXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdGhlIHZhbHVlIGlzIHVuZGVmaW5lZCwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3VuZGVmaW5lZCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIEJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQnVmZmVyKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSBudWxsICYmICFpc1VuZGVmaW5lZCh2YWwpICYmIHZhbC5jb25zdHJ1Y3RvciAhPT0gbnVsbCAmJiAhaXNVbmRlZmluZWQodmFsLmNvbnN0cnVjdG9yKVxuICAgICYmIHR5cGVvZiB2YWwuY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgdmFsLmNvbnN0cnVjdG9yLmlzQnVmZmVyKHZhbCk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXIodmFsKSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbCkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGb3JtRGF0YVxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGFuIEZvcm1EYXRhLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGb3JtRGF0YSh2YWwpIHtcbiAgcmV0dXJuICh0eXBlb2YgRm9ybURhdGEgIT09ICd1bmRlZmluZWQnKSAmJiAodmFsIGluc3RhbmNlb2YgRm9ybURhdGEpO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlclxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgdmlldyBvbiBhbiBBcnJheUJ1ZmZlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzQXJyYXlCdWZmZXJWaWV3KHZhbCkge1xuICB2YXIgcmVzdWx0O1xuICBpZiAoKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcpICYmIChBcnJheUJ1ZmZlci5pc1ZpZXcpKSB7XG4gICAgcmVzdWx0ID0gQXJyYXlCdWZmZXIuaXNWaWV3KHZhbCk7XG4gIH0gZWxzZSB7XG4gICAgcmVzdWx0ID0gKHZhbCkgJiYgKHZhbC5idWZmZXIpICYmICh2YWwuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBTdHJpbmdcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIFN0cmluZywgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzU3RyaW5nKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ3N0cmluZyc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBOdW1iZXJcbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gdmFsIFRoZSB2YWx1ZSB0byB0ZXN0XG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB2YWx1ZSBpcyBhIE51bWJlciwgb3RoZXJ3aXNlIGZhbHNlXG4gKi9cbmZ1bmN0aW9uIGlzTnVtYmVyKHZhbCkge1xuICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ251bWJlcic7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYW4gT2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYW4gT2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7XG4gIHJldHVybiB2YWwgIT09IG51bGwgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBEYXRlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBEYXRlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNEYXRlKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGaWxlXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBGaWxlLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNGaWxlKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGaWxlXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBCbG9iXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBCbG9iLCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNCbG9iKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBCbG9iXSc7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBGdW5jdGlvblxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB2YWwgVGhlIHZhbHVlIHRvIHRlc3RcbiAqIEByZXR1cm5zIHtib29sZWFufSBUcnVlIGlmIHZhbHVlIGlzIGEgRnVuY3Rpb24sIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKHZhbCkge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWwpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xufVxuXG4vKipcbiAqIERldGVybWluZSBpZiBhIHZhbHVlIGlzIGEgU3RyZWFtXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBTdHJlYW0sIG90aGVyd2lzZSBmYWxzZVxuICovXG5mdW5jdGlvbiBpc1N0cmVhbSh2YWwpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHZhbCkgJiYgaXNGdW5jdGlvbih2YWwucGlwZSk7XG59XG5cbi8qKlxuICogRGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0XG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHZhbCBUaGUgdmFsdWUgdG8gdGVzdFxuICogQHJldHVybnMge2Jvb2xlYW59IFRydWUgaWYgdmFsdWUgaXMgYSBVUkxTZWFyY2hQYXJhbXMgb2JqZWN0LCBvdGhlcndpc2UgZmFsc2VcbiAqL1xuZnVuY3Rpb24gaXNVUkxTZWFyY2hQYXJhbXModmFsKSB7XG4gIHJldHVybiB0eXBlb2YgVVJMU2VhcmNoUGFyYW1zICE9PSAndW5kZWZpbmVkJyAmJiB2YWwgaW5zdGFuY2VvZiBVUkxTZWFyY2hQYXJhbXM7XG59XG5cbi8qKlxuICogVHJpbSBleGNlc3Mgd2hpdGVzcGFjZSBvZmYgdGhlIGJlZ2lubmluZyBhbmQgZW5kIG9mIGEgc3RyaW5nXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciBUaGUgU3RyaW5nIHRvIHRyaW1cbiAqIEByZXR1cm5zIHtTdHJpbmd9IFRoZSBTdHJpbmcgZnJlZWQgb2YgZXhjZXNzIHdoaXRlc3BhY2VcbiAqL1xuZnVuY3Rpb24gdHJpbShzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9eXFxzKi8sICcnKS5yZXBsYWNlKC9cXHMqJC8sICcnKTtcbn1cblxuLyoqXG4gKiBEZXRlcm1pbmUgaWYgd2UncmUgcnVubmluZyBpbiBhIHN0YW5kYXJkIGJyb3dzZXIgZW52aXJvbm1lbnRcbiAqXG4gKiBUaGlzIGFsbG93cyBheGlvcyB0byBydW4gaW4gYSB3ZWIgd29ya2VyLCBhbmQgcmVhY3QtbmF0aXZlLlxuICogQm90aCBlbnZpcm9ubWVudHMgc3VwcG9ydCBYTUxIdHRwUmVxdWVzdCwgYnV0IG5vdCBmdWxseSBzdGFuZGFyZCBnbG9iYWxzLlxuICpcbiAqIHdlYiB3b3JrZXJzOlxuICogIHR5cGVvZiB3aW5kb3cgLT4gdW5kZWZpbmVkXG4gKiAgdHlwZW9mIGRvY3VtZW50IC0+IHVuZGVmaW5lZFxuICpcbiAqIHJlYWN0LW5hdGl2ZTpcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnUmVhY3ROYXRpdmUnXG4gKiBuYXRpdmVzY3JpcHRcbiAqICBuYXZpZ2F0b3IucHJvZHVjdCAtPiAnTmF0aXZlU2NyaXB0JyBvciAnTlMnXG4gKi9cbmZ1bmN0aW9uIGlzU3RhbmRhcmRCcm93c2VyRW52KCkge1xuICBpZiAodHlwZW9mIG5hdmlnYXRvciAhPT0gJ3VuZGVmaW5lZCcgJiYgKG5hdmlnYXRvci5wcm9kdWN0ID09PSAnUmVhY3ROYXRpdmUnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdOYXRpdmVTY3JpcHQnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF2aWdhdG9yLnByb2R1Y3QgPT09ICdOUycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiAoXG4gICAgdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiZcbiAgICB0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnXG4gICk7XG59XG5cbi8qKlxuICogSXRlcmF0ZSBvdmVyIGFuIEFycmF5IG9yIGFuIE9iamVjdCBpbnZva2luZyBhIGZ1bmN0aW9uIGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgYG9iamAgaXMgYW4gQXJyYXkgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgcGFzc2luZ1xuICogdGhlIHZhbHVlLCBpbmRleCwgYW5kIGNvbXBsZXRlIGFycmF5IGZvciBlYWNoIGl0ZW0uXG4gKlxuICogSWYgJ29iaicgaXMgYW4gT2JqZWN0IGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHBhc3NpbmdcbiAqIHRoZSB2YWx1ZSwga2V5LCBhbmQgY29tcGxldGUgb2JqZWN0IGZvciBlYWNoIHByb3BlcnR5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBvYmogVGhlIG9iamVjdCB0byBpdGVyYXRlXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgY2FsbGJhY2sgdG8gaW52b2tlIGZvciBlYWNoIGl0ZW1cbiAqL1xuZnVuY3Rpb24gZm9yRWFjaChvYmosIGZuKSB7XG4gIC8vIERvbid0IGJvdGhlciBpZiBubyB2YWx1ZSBwcm92aWRlZFxuICBpZiAob2JqID09PSBudWxsIHx8IHR5cGVvZiBvYmogPT09ICd1bmRlZmluZWQnKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRm9yY2UgYW4gYXJyYXkgaWYgbm90IGFscmVhZHkgc29tZXRoaW5nIGl0ZXJhYmxlXG4gIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0Jykge1xuICAgIC8qZXNsaW50IG5vLXBhcmFtLXJlYXNzaWduOjAqL1xuICAgIG9iaiA9IFtvYmpdO1xuICB9XG5cbiAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgIC8vIEl0ZXJhdGUgb3ZlciBhcnJheSB2YWx1ZXNcbiAgICBmb3IgKHZhciBpID0gMCwgbCA9IG9iai5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgb2JqW2ldLCBpLCBvYmopO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBJdGVyYXRlIG92ZXIgb2JqZWN0IGtleXNcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkge1xuICAgICAgICBmbi5jYWxsKG51bGwsIG9ialtrZXldLCBrZXksIG9iaik7XG4gICAgICB9XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQWNjZXB0cyB2YXJhcmdzIGV4cGVjdGluZyBlYWNoIGFyZ3VtZW50IHRvIGJlIGFuIG9iamVjdCwgdGhlblxuICogaW1tdXRhYmx5IG1lcmdlcyB0aGUgcHJvcGVydGllcyBvZiBlYWNoIG9iamVjdCBhbmQgcmV0dXJucyByZXN1bHQuXG4gKlxuICogV2hlbiBtdWx0aXBsZSBvYmplY3RzIGNvbnRhaW4gdGhlIHNhbWUga2V5IHRoZSBsYXRlciBvYmplY3QgaW5cbiAqIHRoZSBhcmd1bWVudHMgbGlzdCB3aWxsIHRha2UgcHJlY2VkZW5jZS5cbiAqXG4gKiBFeGFtcGxlOlxuICpcbiAqIGBgYGpzXG4gKiB2YXIgcmVzdWx0ID0gbWVyZ2Uoe2ZvbzogMTIzfSwge2ZvbzogNDU2fSk7XG4gKiBjb25zb2xlLmxvZyhyZXN1bHQuZm9vKTsgLy8gb3V0cHV0cyA0NTZcbiAqIGBgYFxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmoxIE9iamVjdCB0byBtZXJnZVxuICogQHJldHVybnMge09iamVjdH0gUmVzdWx0IG9mIGFsbCBtZXJnZSBwcm9wZXJ0aWVzXG4gKi9cbmZ1bmN0aW9uIG1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKHR5cGVvZiByZXN1bHRba2V5XSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gbWVyZ2UocmVzdWx0W2tleV0sIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJlc3VsdFtrZXldID0gdmFsO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGZvckVhY2goYXJndW1lbnRzW2ldLCBhc3NpZ25WYWx1ZSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBGdW5jdGlvbiBlcXVhbCB0byBtZXJnZSB3aXRoIHRoZSBkaWZmZXJlbmNlIGJlaW5nIHRoYXQgbm8gcmVmZXJlbmNlXG4gKiB0byBvcmlnaW5hbCBvYmplY3RzIGlzIGtlcHQuXG4gKlxuICogQHNlZSBtZXJnZVxuICogQHBhcmFtIHtPYmplY3R9IG9iajEgT2JqZWN0IHRvIG1lcmdlXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBSZXN1bHQgb2YgYWxsIG1lcmdlIHByb3BlcnRpZXNcbiAqL1xuZnVuY3Rpb24gZGVlcE1lcmdlKC8qIG9iajEsIG9iajIsIG9iajMsIC4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge307XG4gIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKHR5cGVvZiByZXN1bHRba2V5XSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gZGVlcE1lcmdlKHJlc3VsdFtrZXldLCB2YWwpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcpIHtcbiAgICAgIHJlc3VsdFtrZXldID0gZGVlcE1lcmdlKHt9LCB2YWwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHRba2V5XSA9IHZhbDtcbiAgICB9XG4gIH1cblxuICBmb3IgKHZhciBpID0gMCwgbCA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICBmb3JFYWNoKGFyZ3VtZW50c1tpXSwgYXNzaWduVmFsdWUpO1xuICB9XG4gIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogRXh0ZW5kcyBvYmplY3QgYSBieSBtdXRhYmx5IGFkZGluZyB0byBpdCB0aGUgcHJvcGVydGllcyBvZiBvYmplY3QgYi5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gYSBUaGUgb2JqZWN0IHRvIGJlIGV4dGVuZGVkXG4gKiBAcGFyYW0ge09iamVjdH0gYiBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tXG4gKiBAcGFyYW0ge09iamVjdH0gdGhpc0FyZyBUaGUgb2JqZWN0IHRvIGJpbmQgZnVuY3Rpb24gdG9cbiAqIEByZXR1cm4ge09iamVjdH0gVGhlIHJlc3VsdGluZyB2YWx1ZSBvZiBvYmplY3QgYVxuICovXG5mdW5jdGlvbiBleHRlbmQoYSwgYiwgdGhpc0FyZykge1xuICBmb3JFYWNoKGIsIGZ1bmN0aW9uIGFzc2lnblZhbHVlKHZhbCwga2V5KSB7XG4gICAgaWYgKHRoaXNBcmcgJiYgdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgYVtrZXldID0gYmluZCh2YWwsIHRoaXNBcmcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBhW2tleV0gPSB2YWw7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGE7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBpc0FycmF5OiBpc0FycmF5LFxuICBpc0FycmF5QnVmZmVyOiBpc0FycmF5QnVmZmVyLFxuICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gIGlzRm9ybURhdGE6IGlzRm9ybURhdGEsXG4gIGlzQXJyYXlCdWZmZXJWaWV3OiBpc0FycmF5QnVmZmVyVmlldyxcbiAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICBpc051bWJlcjogaXNOdW1iZXIsXG4gIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkLFxuICBpc0RhdGU6IGlzRGF0ZSxcbiAgaXNGaWxlOiBpc0ZpbGUsXG4gIGlzQmxvYjogaXNCbG9iLFxuICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uLFxuICBpc1N0cmVhbTogaXNTdHJlYW0sXG4gIGlzVVJMU2VhcmNoUGFyYW1zOiBpc1VSTFNlYXJjaFBhcmFtcyxcbiAgaXNTdGFuZGFyZEJyb3dzZXJFbnY6IGlzU3RhbmRhcmRCcm93c2VyRW52LFxuICBmb3JFYWNoOiBmb3JFYWNoLFxuICBtZXJnZTogbWVyZ2UsXG4gIGRlZXBNZXJnZTogZGVlcE1lcmdlLFxuICBleHRlbmQ6IGV4dGVuZCxcbiAgdHJpbTogdHJpbVxufTtcbiIsInJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMuYXJyYXkuZmluZCcpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdBcnJheScsICdmaW5kJyk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5mcm9tJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5BcnJheS5mcm9tO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5hcnJheS5pbmNsdWRlcycpO1xudmFyIGVudHJ5VW5iaW5kID0gcmVxdWlyZSgnLi4vLi4vaW50ZXJuYWxzL2VudHJ5LXVuYmluZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGVudHJ5VW5iaW5kKCdBcnJheScsICdpbmNsdWRlcycpO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QuYXNzaWduJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5PYmplY3QuYXNzaWduO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy93ZWIuZG9tLWNvbGxlY3Rpb25zLml0ZXJhdG9yJyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnByb21pc2UnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXMucHJvbWlzZS5maW5hbGx5Jyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9wYXRoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0aC5Qcm9taXNlO1xuIiwicmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaW5jbHVkZXMnKTtcbnZhciBlbnRyeVVuYmluZCA9IHJlcXVpcmUoJy4uLy4uL2ludGVybmFscy9lbnRyeS11bmJpbmQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBlbnRyeVVuYmluZCgnU3RyaW5nJywgJ2luY2x1ZGVzJyk7XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzLnN5bWJvbC5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vLi4vbW9kdWxlcy9lcy5zdHJpbmcuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvd2ViLmRvbS1jb2xsZWN0aW9ucy5pdGVyYXRvcicpO1xudmFyIFdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi8uLi9pbnRlcm5hbHMvd3JhcHBlZC13ZWxsLWtub3duLXN5bWJvbCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUuZignaXRlcmF0b3InKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vLi4vZXMvcHJvbWlzZScpO1xuXG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5hZ2dyZWdhdGUtZXJyb3InKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnByb21pc2UuYWxsLXNldHRsZWQnKTtcbnJlcXVpcmUoJy4uLy4uL21vZHVsZXMvZXNuZXh0LnByb21pc2UudHJ5Jyk7XG5yZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2VzbmV4dC5wcm9taXNlLmFueScpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uJyk7XG4gIH0gcmV0dXJuIGl0O1xufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xuXG52YXIgVU5TQ09QQUJMRVMgPSB3ZWxsS25vd25TeW1ib2woJ3Vuc2NvcGFibGVzJyk7XG52YXIgQXJyYXlQcm90b3R5cGUgPSBBcnJheS5wcm90b3R5cGU7XG5cbi8vIEFycmF5LnByb3RvdHlwZVtAQHVuc2NvcGFibGVzXVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmlmIChBcnJheVByb3RvdHlwZVtVTlNDT1BBQkxFU10gPT0gdW5kZWZpbmVkKSB7XG4gIGhpZGUoQXJyYXlQcm90b3R5cGUsIFVOU0NPUEFCTEVTLCBjcmVhdGUobnVsbCkpO1xufVxuXG4vLyBhZGQgYSBrZXkgdG8gQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b3R5cGVbVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignSW5jb3JyZWN0ICcgKyAobmFtZSA/IG5hbWUgKyAnICcgOiAnJykgKyAnaW52b2NhdGlvbicpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB7XG4gICAgdGhyb3cgVHlwZUVycm9yKFN0cmluZyhpdCkgKyAnIGlzIG5vdCBhbiBvYmplY3QnKTtcbiAgfSByZXR1cm4gaXQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgY2FsbFdpdGhTYWZlSXRlcmF0aW9uQ2xvc2luZyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jYWxsLXdpdGgtc2FmZS1pdGVyYXRpb24tY2xvc2luZycpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHknKTtcbnZhciBnZXRJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG5cbi8vIGBBcnJheS5mcm9tYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LmZyb21cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gZnJvbShhcnJheUxpa2UgLyogLCBtYXBmbiA9IHVuZGVmaW5lZCwgdGhpc0FyZyA9IHVuZGVmaW5lZCAqLykge1xuICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gIHZhciBDID0gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheTtcbiAgdmFyIGFyZ3VtZW50c0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBtYXBmbiA9IGFyZ3VtZW50c0xlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQ7XG4gIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGl0ZXJhdG9yTWV0aG9kID0gZ2V0SXRlcmF0b3JNZXRob2QoTyk7XG4gIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gIGlmIChtYXBwaW5nKSBtYXBmbiA9IGJpbmQobWFwZm4sIGFyZ3VtZW50c0xlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQsIDIpO1xuICAvLyBpZiB0aGUgdGFyZ2V0IGlzIG5vdCBpdGVyYWJsZSBvciBpdCdzIGFuIGFycmF5IHdpdGggdGhlIGRlZmF1bHQgaXRlcmF0b3IgLSB1c2UgYSBzaW1wbGUgY2FzZVxuICBpZiAoaXRlcmF0b3JNZXRob2QgIT0gdW5kZWZpbmVkICYmICEoQyA9PSBBcnJheSAmJiBpc0FycmF5SXRlcmF0b3JNZXRob2QoaXRlcmF0b3JNZXRob2QpKSkge1xuICAgIGl0ZXJhdG9yID0gaXRlcmF0b3JNZXRob2QuY2FsbChPKTtcbiAgICByZXN1bHQgPSBuZXcgQygpO1xuICAgIGZvciAoOyEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZ1xuICAgICAgICA/IGNhbGxXaXRoU2FmZUl0ZXJhdGlvbkNsb3NpbmcoaXRlcmF0b3IsIG1hcGZuLCBbc3RlcC52YWx1ZSwgaW5kZXhdLCB0cnVlKVxuICAgICAgICA6IHN0ZXAudmFsdWVcbiAgICAgICk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICByZXN1bHQgPSBuZXcgQyhsZW5ndGgpO1xuICAgIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSB7XG4gICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gbWFwZm4oT1tpbmRleF0sIGluZGV4KSA6IE9baW5kZXhdKTtcbiAgICB9XG4gIH1cbiAgcmVzdWx0Lmxlbmd0aCA9IGluZGV4O1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciB0b0luZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8taW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tYWJzb2x1dGUtaW5kZXgnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGluZGV4T2YsIGluY2x1ZGVzIH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmRleG9mXG4vLyB0cnVlICAtPiBBcnJheSNpbmNsdWRlc1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmluY2x1ZGVzXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChJU19JTkNMVURFUykge1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBlbCwgZnJvbUluZGV4KSB7XG4gICAgdmFyIE8gPSB0b0luZGV4ZWRPYmplY3QoJHRoaXMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGZyb21JbmRleCwgbGVuZ3RoKTtcbiAgICB2YXIgdmFsdWU7XG4gICAgLy8gQXJyYXkjaW5jbHVkZXMgdXNlcyBTYW1lVmFsdWVaZXJvIGVxdWFsaXR5IGFsZ29yaXRobVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICBpZiAoSVNfSU5DTFVERVMgJiYgZWwgIT0gZWwpIHdoaWxlIChsZW5ndGggPiBpbmRleCkge1xuICAgICAgdmFsdWUgPSBPW2luZGV4KytdO1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgICAgaWYgKHZhbHVlICE9IHZhbHVlKSByZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSNpbmRleE9mIGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvciAoO2xlbmd0aCA+IGluZGV4OyBpbmRleCsrKSBpZiAoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTykge1xuICAgICAgaWYgKE9baW5kZXhdID09PSBlbCkgcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTtcbiIsInZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBhcnJheVNwZWNpZXNDcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS57IGZvckVhY2gsIG1hcCwgZmlsdGVyLCBzb21lLCBldmVyeSwgZmluZCwgZmluZEluZGV4IH1gIG1ldGhvZHMgaW1wbGVtZW50YXRpb25cbi8vIDAgLT4gQXJyYXkjZm9yRWFjaFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZvcmVhY2hcbi8vIDEgLT4gQXJyYXkjbWFwXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUubWFwXG4vLyAyIC0+IEFycmF5I2ZpbHRlclxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbHRlclxuLy8gMyAtPiBBcnJheSNzb21lXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheS5wcm90b3R5cGUuc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmV2ZXJ5XG4vLyA1IC0+IEFycmF5I2ZpbmRcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5maW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRJbmRleFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoVFlQRSwgc3BlY2lmaWNDcmVhdGUpIHtcbiAgdmFyIElTX01BUCA9IFRZUEUgPT0gMTtcbiAgdmFyIElTX0ZJTFRFUiA9IFRZUEUgPT0gMjtcbiAgdmFyIElTX1NPTUUgPSBUWVBFID09IDM7XG4gIHZhciBJU19FVkVSWSA9IFRZUEUgPT0gNDtcbiAgdmFyIElTX0ZJTkRfSU5ERVggPSBUWVBFID09IDY7XG4gIHZhciBOT19IT0xFUyA9IFRZUEUgPT0gNSB8fCBJU19GSU5EX0lOREVYO1xuICB2YXIgY3JlYXRlID0gc3BlY2lmaWNDcmVhdGUgfHwgYXJyYXlTcGVjaWVzQ3JlYXRlO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJbmRleGVkT2JqZWN0KE8pO1xuICAgIHZhciBib3VuZEZ1bmN0aW9uID0gYmluZChjYWxsYmFja2ZuLCB0aGF0LCAzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoc2VsZi5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIHRhcmdldCA9IElTX01BUCA/IGNyZWF0ZSgkdGhpcywgbGVuZ3RoKSA6IElTX0ZJTFRFUiA/IGNyZWF0ZSgkdGhpcywgMCkgOiB1bmRlZmluZWQ7XG4gICAgdmFyIHZhbHVlLCByZXN1bHQ7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWx1ZSA9IHNlbGZbaW5kZXhdO1xuICAgICAgcmVzdWx0ID0gYm91bmRGdW5jdGlvbih2YWx1ZSwgaW5kZXgsIE8pO1xuICAgICAgaWYgKFRZUEUpIHtcbiAgICAgICAgaWYgKElTX01BUCkgdGFyZ2V0W2luZGV4XSA9IHJlc3VsdDsgLy8gbWFwXG4gICAgICAgIGVsc2UgaWYgKHJlc3VsdCkgc3dpdGNoIChUWVBFKSB7XG4gICAgICAgICAgY2FzZSAzOiByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWx1ZTsgICAgICAgICAgICAgLy8gZmluZFxuICAgICAgICAgIGNhc2UgNjogcmV0dXJuIGluZGV4OyAgICAgICAgICAgICAvLyBmaW5kSW5kZXhcbiAgICAgICAgICBjYXNlIDI6IHRhcmdldC5wdXNoKHZhbHVlKTsgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgIC8vIGV2ZXJ5XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBJU19GSU5EX0lOREVYID8gLTEgOiBJU19TT01FIHx8IElTX0VWRVJZID8gSVNfRVZFUlkgOiB0YXJnZXQ7XG4gIH07XG59O1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLW9iamVjdCcpO1xudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtYXJyYXknKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxuLy8gYEFycmF5U3BlY2llc0NyZWF0ZWAgYWJzdHJhY3Qgb3BlcmF0aW9uXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1hcnJheXNwZWNpZXNjcmVhdGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsQXJyYXksIGxlbmd0aCkge1xuICB2YXIgQztcbiAgaWYgKGlzQXJyYXkob3JpZ2luYWxBcnJheSkpIHtcbiAgICBDID0gb3JpZ2luYWxBcnJheS5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgZWxzZSBpZiAoaXNPYmplY3QoQykpIHtcbiAgICAgIEMgPSBDW1NQRUNJRVNdO1xuICAgICAgaWYgKEMgPT09IG51bGwpIEMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9IHJldHVybiBuZXcgKEMgPT09IHVuZGVmaW5lZCA/IEFycmF5IDogQykobGVuZ3RoID09PSAwID8gMCA6IGxlbmd0aCk7XG59O1xuIiwidmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hLWZ1bmN0aW9uJyk7XG5cbi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZm4sIHRoYXQsIGxlbmd0aCkge1xuICBhRnVuY3Rpb24oZm4pO1xuICBpZiAodGhhdCA9PT0gdW5kZWZpbmVkKSByZXR1cm4gZm47XG4gIHN3aXRjaCAobGVuZ3RoKSB7XG4gICAgY2FzZSAwOiByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCk7XG4gICAgfTtcbiAgICBjYXNlIDE6IHJldHVybiBmdW5jdGlvbiAoYSkge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbiAoYSwgYikge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYik7XG4gICAgfTtcbiAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbiAoYSwgYiwgYykge1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSwgYiwgYyk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKC8qIC4uLmFyZ3MgKi8pIHtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3Jcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIEVOVFJJRVMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gRU5UUklFUyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHZhciByZXR1cm5NZXRob2QgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYgKHJldHVybk1ldGhvZCAhPT0gdW5kZWZpbmVkKSBhbk9iamVjdChyZXR1cm5NZXRob2QuY2FsbChpdGVyYXRvcikpO1xuICAgIHRocm93IGVycm9yO1xuICB9XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgU0FGRV9DTE9TSU5HID0gZmFsc2U7XG5cbnRyeSB7XG4gIHZhciBjYWxsZWQgPSAwO1xuICB2YXIgaXRlcmF0b3JXaXRoUmV0dXJuID0ge1xuICAgIG5leHQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiB7IGRvbmU6ICEhY2FsbGVkKysgfTtcbiAgICB9LFxuICAgICdyZXR1cm4nOiBmdW5jdGlvbiAoKSB7XG4gICAgICBTQUZFX0NMT1NJTkcgPSB0cnVlO1xuICAgIH1cbiAgfTtcbiAgaXRlcmF0b3JXaXRoUmV0dXJuW0lURVJBVE9SXSA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gdGhpcztcbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShpdGVyYXRvcldpdGhSZXR1cm4sIGZ1bmN0aW9uICgpIHsgdGhyb3cgMjsgfSk7XG59IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMsIFNLSVBfQ0xPU0lORykge1xuICBpZiAoIVNLSVBfQ0xPU0lORyAmJiAhU0FGRV9DTE9TSU5HKSByZXR1cm4gZmFsc2U7XG4gIHZhciBJVEVSQVRJT05fU1VQUE9SVCA9IGZhbHNlO1xuICB0cnkge1xuICAgIHZhciBvYmplY3QgPSB7fTtcbiAgICBvYmplY3RbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgbmV4dDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiB7IGRvbmU6IElURVJBVElPTl9TVVBQT1JUID0gdHJ1ZSB9O1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH07XG4gICAgZXhlYyhvYmplY3QpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiBJVEVSQVRJT05fU1VQUE9SVDtcbn07XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07XG4iLCJ2YXIgY2xhc3NvZlJhdyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQ09SUkVDVF9BUkdVTUVOVFMgPSBjbGFzc29mUmF3KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG59O1xuXG4vLyBnZXR0aW5nIHRhZyBmcm9tIEVTNisgYE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmdgXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgTywgdGFnLCByZXN1bHQ7XG4gIHJldHVybiBpdCA9PT0gdW5kZWZpbmVkID8gJ1VuZGVmaW5lZCcgOiBpdCA9PT0gbnVsbCA/ICdOdWxsJ1xuICAgIC8vIEBAdG9TdHJpbmdUYWcgY2FzZVxuICAgIDogdHlwZW9mICh0YWcgPSB0cnlHZXQoTyA9IE9iamVjdChpdCksIFRPX1NUUklOR19UQUcpKSA9PSAnc3RyaW5nJyA/IHRhZ1xuICAgIC8vIGJ1aWx0aW5UYWcgY2FzZVxuICAgIDogQ09SUkVDVF9BUkdVTUVOVFMgPyBjbGFzc29mUmF3KE8pXG4gICAgLy8gRVMzIGFyZ3VtZW50cyBmYWxsYmFja1xuICAgIDogKHJlc3VsdCA9IGNsYXNzb2ZSYXcoTykpID09ICdPYmplY3QnICYmIHR5cGVvZiBPLmNhbGxlZSA9PSAnZnVuY3Rpb24nID8gJ0FyZ3VtZW50cycgOiByZXN1bHQ7XG59O1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciBvd25LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL293bi1rZXlzJyk7XG52YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBrZXlzID0gb3duS2V5cyhzb3VyY2UpO1xuICB2YXIgZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mO1xuICB2YXIgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yTW9kdWxlLmY7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykge1xuICAgIHZhciBrZXkgPSBrZXlzW2ldO1xuICAgIGlmICghaGFzKHRhcmdldCwga2V5KSkgZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIGtleSkpO1xuICB9XG59O1xuIiwidmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgTUFUQ0ggPSB3ZWxsS25vd25TeW1ib2woJ21hdGNoJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE1FVEhPRF9OQU1FKSB7XG4gIHZhciByZWdleHAgPSAvLi87XG4gIHRyeSB7XG4gICAgJy8uLydbTUVUSE9EX05BTUVdKHJlZ2V4cCk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICB0cnkge1xuICAgICAgcmVnZXhwW01BVENIXSA9IGZhbHNlO1xuICAgICAgcmV0dXJuICcvLi8nW01FVEhPRF9OQU1FXShyZWdleHApO1xuICAgIH0gY2F0Y2ggKGYpIHsgLyogZW1wdHkgKi8gfVxuICB9IHJldHVybiBmYWxzZTtcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIEYucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbnVsbDtcbiAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihuZXcgRigpKSAhPT0gRi5wcm90b3R5cGU7XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMtY29yZScpLkl0ZXJhdG9yUHJvdG90eXBlO1xudmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtY3JlYXRlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICB2YXIgVE9fU1RSSU5HX1RBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgSXRlcmF0b3JDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yKDEsIG5leHQpIH0pO1xuICBzZXRUb1N0cmluZ1RhZyhJdGVyYXRvckNvbnN0cnVjdG9yLCBUT19TVFJJTkdfVEFHLCBmYWxzZSwgdHJ1ZSk7XG4gIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gIHJldHVybiBJdGVyYXRvckNvbnN0cnVjdG9yO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGJpdG1hcCwgdmFsdWUpIHtcbiAgcmV0dXJuIHtcbiAgICBlbnVtZXJhYmxlOiAhKGJpdG1hcCAmIDEpLFxuICAgIGNvbmZpZ3VyYWJsZTogIShiaXRtYXAgJiAyKSxcbiAgICB3cml0YWJsZTogIShiaXRtYXAgJiA0KSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgZGVmaW5lUHJvcGVydHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgdmFyIHByb3BlcnR5S2V5ID0gdG9QcmltaXRpdmUoa2V5KTtcbiAgaWYgKHByb3BlcnR5S2V5IGluIG9iamVjdCkgZGVmaW5lUHJvcGVydHlNb2R1bGUuZihvYmplY3QsIHByb3BlcnR5S2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMCwgdmFsdWUpKTtcbiAgZWxzZSBvYmplY3RbcHJvcGVydHlLZXldID0gdmFsdWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgY3JlYXRlSXRlcmF0b3JDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtaXRlcmF0b3ItY29uc3RydWN0b3InKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZ2V0LXByb3RvdHlwZS1vZicpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1zZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciBJdGVyYXRvcnNDb3JlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycy1jb3JlJyk7XG5cbnZhciBJdGVyYXRvclByb3RvdHlwZSA9IEl0ZXJhdG9yc0NvcmUuSXRlcmF0b3JQcm90b3R5cGU7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IEl0ZXJhdG9yc0NvcmUuQlVHR1lfU0FGQVJJX0lURVJBVE9SUztcbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBLRVlTID0gJ2tleXMnO1xudmFyIFZBTFVFUyA9ICd2YWx1ZXMnO1xudmFyIEVOVFJJRVMgPSAnZW50cmllcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoSXRlcmFibGUsIE5BTUUsIEl0ZXJhdG9yQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gIGNyZWF0ZUl0ZXJhdG9yQ29uc3RydWN0b3IoSXRlcmF0b3JDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCk7XG5cbiAgdmFyIGdldEl0ZXJhdGlvbk1ldGhvZCA9IGZ1bmN0aW9uIChLSU5EKSB7XG4gICAgaWYgKEtJTkQgPT09IERFRkFVTFQgJiYgZGVmYXVsdEl0ZXJhdG9yKSByZXR1cm4gZGVmYXVsdEl0ZXJhdG9yO1xuICAgIGlmICghQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBLSU5EIGluIEl0ZXJhYmxlUHJvdG90eXBlKSByZXR1cm4gSXRlcmFibGVQcm90b3R5cGVbS0lORF07XG4gICAgc3dpdGNoIChLSU5EKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IEl0ZXJhdG9yQ29uc3RydWN0b3IodGhpcywgS0lORCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgICAgY2FzZSBFTlRSSUVTOiByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMsIEtJTkQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBJdGVyYXRvckNvbnN0cnVjdG9yKHRoaXMpOyB9O1xuICB9O1xuXG4gIHZhciBUT19TVFJJTkdfVEFHID0gTkFNRSArICcgSXRlcmF0b3InO1xuICB2YXIgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gZmFsc2U7XG4gIHZhciBJdGVyYWJsZVByb3RvdHlwZSA9IEl0ZXJhYmxlLnByb3RvdHlwZTtcbiAgdmFyIG5hdGl2ZUl0ZXJhdG9yID0gSXRlcmFibGVQcm90b3R5cGVbSVRFUkFUT1JdXG4gICAgfHwgSXRlcmFibGVQcm90b3R5cGVbJ0BAaXRlcmF0b3InXVxuICAgIHx8IERFRkFVTFQgJiYgSXRlcmFibGVQcm90b3R5cGVbREVGQVVMVF07XG4gIHZhciBkZWZhdWx0SXRlcmF0b3IgPSAhQlVHR1lfU0FGQVJJX0lURVJBVE9SUyAmJiBuYXRpdmVJdGVyYXRvciB8fCBnZXRJdGVyYXRpb25NZXRob2QoREVGQVVMVCk7XG4gIHZhciBhbnlOYXRpdmVJdGVyYXRvciA9IE5BTUUgPT0gJ0FycmF5JyA/IEl0ZXJhYmxlUHJvdG90eXBlLmVudHJpZXMgfHwgbmF0aXZlSXRlcmF0b3IgOiBuYXRpdmVJdGVyYXRvcjtcbiAgdmFyIEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgbWV0aG9kcywgS0VZO1xuXG4gIC8vIGZpeCBuYXRpdmVcbiAgaWYgKGFueU5hdGl2ZUl0ZXJhdG9yKSB7XG4gICAgQ3VycmVudEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoYW55TmF0aXZlSXRlcmF0b3IuY2FsbChuZXcgSXRlcmFibGUoKSkpO1xuICAgIGlmIChJdGVyYXRvclByb3RvdHlwZSAhPT0gT2JqZWN0LnByb3RvdHlwZSAmJiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgaWYgKCFJU19QVVJFICYmIGdldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSkgIT09IEl0ZXJhdG9yUHJvdG90eXBlKSB7XG4gICAgICAgIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgICAgICAgIHNldFByb3RvdHlwZU9mKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSXRlcmF0b3JQcm90b3R5cGUpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBDdXJyZW50SXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICBoaWRlKEN1cnJlbnRJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBTZXQgQEB0b1N0cmluZ1RhZyB0byBuYXRpdmUgaXRlcmF0b3JzXG4gICAgICBzZXRUb1N0cmluZ1RhZyhDdXJyZW50SXRlcmF0b3JQcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIHRydWUsIHRydWUpO1xuICAgICAgaWYgKElTX1BVUkUpIEl0ZXJhdG9yc1tUT19TVFJJTkdfVEFHXSA9IHJldHVyblRoaXM7XG4gICAgfVxuICB9XG5cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGQVVMVCA9PSBWQUxVRVMgJiYgbmF0aXZlSXRlcmF0b3IgJiYgbmF0aXZlSXRlcmF0b3IubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgSU5DT1JSRUNUX1ZBTFVFU19OQU1FID0gdHJ1ZTtcbiAgICBkZWZhdWx0SXRlcmF0b3IgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuYXRpdmVJdGVyYXRvci5jYWxsKHRoaXMpOyB9O1xuICB9XG5cbiAgLy8gZGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUlTX1BVUkUgfHwgRk9SQ0VEKSAmJiBJdGVyYWJsZVByb3RvdHlwZVtJVEVSQVRPUl0gIT09IGRlZmF1bHRJdGVyYXRvcikge1xuICAgIGhpZGUoSXRlcmFibGVQcm90b3R5cGUsIElURVJBVE9SLCBkZWZhdWx0SXRlcmF0b3IpO1xuICB9XG4gIEl0ZXJhdG9yc1tOQU1FXSA9IGRlZmF1bHRJdGVyYXRvcjtcblxuICAvLyBleHBvcnQgYWRkaXRpb25hbCBtZXRob2RzXG4gIGlmIChERUZBVUxUKSB7XG4gICAgbWV0aG9kcyA9IHtcbiAgICAgIHZhbHVlczogZ2V0SXRlcmF0aW9uTWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiBJU19TRVQgPyBkZWZhdWx0SXRlcmF0b3IgOiBnZXRJdGVyYXRpb25NZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiBnZXRJdGVyYXRpb25NZXRob2QoRU5UUklFUylcbiAgICB9O1xuICAgIGlmIChGT1JDRUQpIGZvciAoS0VZIGluIG1ldGhvZHMpIHtcbiAgICAgIGlmIChCVUdHWV9TQUZBUklfSVRFUkFUT1JTIHx8IElOQ09SUkVDVF9WQUxVRVNfTkFNRSB8fCAhKEtFWSBpbiBJdGVyYWJsZVByb3RvdHlwZSkpIHtcbiAgICAgICAgcmVkZWZpbmUoSXRlcmFibGVQcm90b3R5cGUsIEtFWSwgbWV0aG9kc1tLRVldKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgJCh7IHRhcmdldDogTkFNRSwgcHJvdG86IHRydWUsIGZvcmNlZDogQlVHR1lfU0FGQVJJX0lURVJBVE9SUyB8fCBJTkNPUlJFQ1RfVkFMVUVTX05BTUUgfSwgbWV0aG9kcyk7XG4gIH1cblxuICByZXR1cm4gbWV0aG9kcztcbn07XG4iLCJ2YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdyYXBwZWRXZWxsS25vd25TeW1ib2xNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd3JhcHBlZC13ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKS5mO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChOQU1FKSB7XG4gIHZhciBTeW1ib2wgPSBwYXRoLlN5bWJvbCB8fCAocGF0aC5TeW1ib2wgPSB7fSk7XG4gIGlmICghaGFzKFN5bWJvbCwgTkFNRSkpIGRlZmluZVByb3BlcnR5KFN5bWJvbCwgTkFNRSwge1xuICAgIHZhbHVlOiB3cmFwcGVkV2VsbEtub3duU3ltYm9sTW9kdWxlLmYoTkFNRSlcbiAgfSk7XG59O1xuIiwidmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG5cbi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG5cbnZhciBkb2N1bWVudCA9IGdsb2JhbC5kb2N1bWVudDtcbi8vIHR5cGVvZiBkb2N1bWVudC5jcmVhdGVFbGVtZW50IGlzICdvYmplY3QnIGluIG9sZCBJRVxudmFyIGV4aXN0ID0gaXNPYmplY3QoZG9jdW1lbnQpICYmIGlzT2JqZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gZXhpc3QgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIi8vIGl0ZXJhYmxlIERPTSBjb2xsZWN0aW9uc1xuLy8gZmxhZyAtIGBpdGVyYWJsZWAgaW50ZXJmYWNlIC0gJ2VudHJpZXMnLCAna2V5cycsICd2YWx1ZXMnLCAnZm9yRWFjaCcgbWV0aG9kc1xubW9kdWxlLmV4cG9ydHMgPSB7XG4gIENTU1J1bGVMaXN0OiAwLFxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiAwLFxuICBDU1NWYWx1ZUxpc3Q6IDAsXG4gIENsaWVudFJlY3RMaXN0OiAwLFxuICBET01SZWN0TGlzdDogMCxcbiAgRE9NU3RyaW5nTGlzdDogMCxcbiAgRE9NVG9rZW5MaXN0OiAxLFxuICBEYXRhVHJhbnNmZXJJdGVtTGlzdDogMCxcbiAgRmlsZUxpc3Q6IDAsXG4gIEhUTUxBbGxDb2xsZWN0aW9uOiAwLFxuICBIVE1MQ29sbGVjdGlvbjogMCxcbiAgSFRNTEZvcm1FbGVtZW50OiAwLFxuICBIVE1MU2VsZWN0RWxlbWVudDogMCxcbiAgTWVkaWFMaXN0OiAwLFxuICBNaW1lVHlwZUFycmF5OiAwLFxuICBOYW1lZE5vZGVNYXA6IDAsXG4gIE5vZGVMaXN0OiAxLFxuICBQYWludFJlcXVlc3RMaXN0OiAwLFxuICBQbHVnaW46IDAsXG4gIFBsdWdpbkFycmF5OiAwLFxuICBTVkdMZW5ndGhMaXN0OiAwLFxuICBTVkdOdW1iZXJMaXN0OiAwLFxuICBTVkdQYXRoU2VnTGlzdDogMCxcbiAgU1ZHUG9pbnRMaXN0OiAwLFxuICBTVkdTdHJpbmdMaXN0OiAwLFxuICBTVkdUcmFuc2Zvcm1MaXN0OiAwLFxuICBTb3VyY2VCdWZmZXJMaXN0OiAwLFxuICBTdHlsZVNoZWV0TGlzdDogMCxcbiAgVGV4dFRyYWNrQ3VlTGlzdDogMCxcbiAgVGV4dFRyYWNrTGlzdDogMCxcbiAgVG91Y2hMaXN0OiAwXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xuXG52YXIgY2FsbCA9IEZ1bmN0aW9uLmNhbGw7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTlNUUlVDVE9SLCBNRVRIT0QsIGxlbmd0aCkge1xuICByZXR1cm4gYmluZChjYWxsLCBnbG9iYWxbQ09OU1RSVUNUT1JdLnByb3RvdHlwZVtNRVRIT0RdLCBsZW5ndGgpO1xufTtcbiIsIi8vIElFOC0gZG9uJ3QgZW51bSBidWcga2V5c1xubW9kdWxlLmV4cG9ydHMgPSBbXG4gICdjb25zdHJ1Y3RvcicsXG4gICdoYXNPd25Qcm9wZXJ0eScsXG4gICdpc1Byb3RvdHlwZU9mJyxcbiAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgJ3RvTG9jYWxlU3RyaW5nJyxcbiAgJ3RvU3RyaW5nJyxcbiAgJ3ZhbHVlT2YnXG5dO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIGNvcHlDb25zdHJ1Y3RvclByb3BlcnRpZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY29weS1jb25zdHJ1Y3Rvci1wcm9wZXJ0aWVzJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG5cbi8qXG4gIG9wdGlvbnMudGFyZ2V0ICAgICAgLSBuYW1lIG9mIHRoZSB0YXJnZXQgb2JqZWN0XG4gIG9wdGlvbnMuZ2xvYmFsICAgICAgLSB0YXJnZXQgaXMgdGhlIGdsb2JhbCBvYmplY3RcbiAgb3B0aW9ucy5zdGF0ICAgICAgICAtIGV4cG9ydCBhcyBzdGF0aWMgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5wcm90byAgICAgICAtIGV4cG9ydCBhcyBwcm90b3R5cGUgbWV0aG9kcyBvZiB0YXJnZXRcbiAgb3B0aW9ucy5yZWFsICAgICAgICAtIHJlYWwgcHJvdG90eXBlIG1ldGhvZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMuZm9yY2VkICAgICAgLSBleHBvcnQgZXZlbiBpZiB0aGUgbmF0aXZlIGZlYXR1cmUgaXMgYXZhaWxhYmxlXG4gIG9wdGlvbnMuYmluZCAgICAgICAgLSBiaW5kIG1ldGhvZHMgdG8gdGhlIHRhcmdldCwgcmVxdWlyZWQgZm9yIHRoZSBgcHVyZWAgdmVyc2lvblxuICBvcHRpb25zLndyYXAgICAgICAgIC0gd3JhcCBjb25zdHJ1Y3RvcnMgdG8gcHJldmVudGluZyBnbG9iYWwgcG9sbHV0aW9uLCByZXF1aXJlZCBmb3IgdGhlIGBwdXJlYCB2ZXJzaW9uXG4gIG9wdGlvbnMudW5zYWZlICAgICAgLSB1c2UgdGhlIHNpbXBsZSBhc3NpZ25tZW50IG9mIHByb3BlcnR5IGluc3RlYWQgb2YgZGVsZXRlICsgZGVmaW5lUHJvcGVydHlcbiAgb3B0aW9ucy5zaGFtICAgICAgICAtIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgb3B0aW9ucy5lbnVtZXJhYmxlICAtIGV4cG9ydCBhcyBlbnVtZXJhYmxlIHByb3BlcnR5XG4gIG9wdGlvbnMubm9UYXJnZXRHZXQgLSBwcmV2ZW50IGNhbGxpbmcgYSBnZXR0ZXIgb24gdGFyZ2V0XG4qL1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3B0aW9ucywgc291cmNlKSB7XG4gIHZhciBUQVJHRVQgPSBvcHRpb25zLnRhcmdldDtcbiAgdmFyIEdMT0JBTCA9IG9wdGlvbnMuZ2xvYmFsO1xuICB2YXIgU1RBVElDID0gb3B0aW9ucy5zdGF0O1xuICB2YXIgRk9SQ0VELCB0YXJnZXQsIGtleSwgdGFyZ2V0UHJvcGVydHksIHNvdXJjZVByb3BlcnR5LCBkZXNjcmlwdG9yO1xuICBpZiAoR0xPQkFMKSB7XG4gICAgdGFyZ2V0ID0gZ2xvYmFsO1xuICB9IGVsc2UgaWYgKFNUQVRJQykge1xuICAgIHRhcmdldCA9IGdsb2JhbFtUQVJHRVRdIHx8IHNldEdsb2JhbChUQVJHRVQsIHt9KTtcbiAgfSBlbHNlIHtcbiAgICB0YXJnZXQgPSAoZ2xvYmFsW1RBUkdFVF0gfHwge30pLnByb3RvdHlwZTtcbiAgfVxuICBpZiAodGFyZ2V0KSBmb3IgKGtleSBpbiBzb3VyY2UpIHtcbiAgICBzb3VyY2VQcm9wZXJ0eSA9IHNvdXJjZVtrZXldO1xuICAgIGlmIChvcHRpb25zLm5vVGFyZ2V0R2V0KSB7XG4gICAgICBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KTtcbiAgICAgIHRhcmdldFByb3BlcnR5ID0gZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlO1xuICAgIH0gZWxzZSB0YXJnZXRQcm9wZXJ0eSA9IHRhcmdldFtrZXldO1xuICAgIEZPUkNFRCA9IGlzRm9yY2VkKEdMT0JBTCA/IGtleSA6IFRBUkdFVCArIChTVEFUSUMgPyAnLicgOiAnIycpICsga2V5LCBvcHRpb25zLmZvcmNlZCk7XG4gICAgLy8gY29udGFpbmVkIGluIHRhcmdldFxuICAgIGlmICghRk9SQ0VEICYmIHRhcmdldFByb3BlcnR5ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGlmICh0eXBlb2Ygc291cmNlUHJvcGVydHkgPT09IHR5cGVvZiB0YXJnZXRQcm9wZXJ0eSkgY29udGludWU7XG4gICAgICBjb3B5Q29uc3RydWN0b3JQcm9wZXJ0aWVzKHNvdXJjZVByb3BlcnR5LCB0YXJnZXRQcm9wZXJ0eSk7XG4gICAgfVxuICAgIC8vIGFkZCBhIGZsYWcgdG8gbm90IGNvbXBsZXRlbHkgZnVsbCBwb2x5ZmlsbHNcbiAgICBpZiAob3B0aW9ucy5zaGFtIHx8ICh0YXJnZXRQcm9wZXJ0eSAmJiB0YXJnZXRQcm9wZXJ0eS5zaGFtKSkge1xuICAgICAgaGlkZShzb3VyY2VQcm9wZXJ0eSwgJ3NoYW0nLCB0cnVlKTtcbiAgICB9XG4gICAgLy8gZXh0ZW5kIGdsb2JhbFxuICAgIHJlZGVmaW5lKHRhcmdldCwga2V5LCBzb3VyY2VQcm9wZXJ0eSwgb3B0aW9ucyk7XG4gIH1cbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjKSB7XG4gIHRyeSB7XG4gICAgcmV0dXJuICEhZXhlYygpO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBzaGFyZWQoJ25hdGl2ZS1mdW5jdGlvbi10by1zdHJpbmcnLCBGdW5jdGlvbi50b1N0cmluZyk7XG4iLCJ2YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuXG52YXIgYUZ1bmN0aW9uID0gZnVuY3Rpb24gKHZhcmlhYmxlKSB7XG4gIHJldHVybiB0eXBlb2YgdmFyaWFibGUgPT0gJ2Z1bmN0aW9uJyA/IHZhcmlhYmxlIDogdW5kZWZpbmVkO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAobmFtZXNwYWNlLCBtZXRob2QpIHtcbiAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gYUZ1bmN0aW9uKHBhdGhbbmFtZXNwYWNlXSkgfHwgYUZ1bmN0aW9uKGdsb2JhbFtuYW1lc3BhY2VdKVxuICAgIDogcGF0aFtuYW1lc3BhY2VdICYmIHBhdGhbbmFtZXNwYWNlXVttZXRob2RdIHx8IGdsb2JhbFtuYW1lc3BhY2VdICYmIGdsb2JhbFtuYW1lc3BhY2VdW21ldGhvZF07XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pdGVyYXRvcnMnKTtcbnZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcblxudmFyIElURVJBVE9SID0gd2VsbEtub3duU3ltYm9sKCdpdGVyYXRvcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICBpZiAoaXQgIT0gdW5kZWZpbmVkKSByZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59O1xuIiwidmFyIE8gPSAnb2JqZWN0JztcbnZhciBjaGVjayA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgJiYgaXQuTWF0aCA9PSBNYXRoICYmIGl0O1xufTtcblxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzg2I2lzc3VlY29tbWVudC0xMTU3NTkwMjhcbm1vZHVsZS5leHBvcnRzID1cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIGNoZWNrKHR5cGVvZiBnbG9iYWxUaGlzID09IE8gJiYgZ2xvYmFsVGhpcykgfHxcbiAgY2hlY2sodHlwZW9mIHdpbmRvdyA9PSBPICYmIHdpbmRvdykgfHxcbiAgY2hlY2sodHlwZW9mIHNlbGYgPT0gTyAmJiBzZWxmKSB8fFxuICBjaGVjayh0eXBlb2YgZ2xvYmFsID09IE8gJiYgZ2xvYmFsKSB8fFxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwga2V5KSB7XG4gIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGl0LCBrZXkpO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIHJldHVybiBkZWZpbmVQcm9wZXJ0eU1vZHVsZS5mKG9iamVjdCwga2V5LCBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoMSwgdmFsdWUpKTtcbn0gOiBmdW5jdGlvbiAob2JqZWN0LCBrZXksIHZhbHVlKSB7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYSwgYikge1xuICB2YXIgY29uc29sZSA9IGdsb2JhbC5jb25zb2xlO1xuICBpZiAoY29uc29sZSAmJiBjb25zb2xlLmVycm9yKSB7XG4gICAgYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGNvbnNvbGUuZXJyb3IoYSkgOiBjb25zb2xlLmVycm9yKGEsIGIpO1xuICB9XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIGRvY3VtZW50ID0gZ2xvYmFsLmRvY3VtZW50O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGRvY3VtZW50ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG4vLyBUaGFuaydzIElFOCBmb3IgaGlzIGZ1bm55IGRlZmluZVByb3BlcnR5XG5tb2R1bGUuZXhwb3J0cyA9ICFERVNDUklQVE9SUyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KGNyZWF0ZUVsZW1lbnQoJ2RpdicpLCAnYScsIHtcbiAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH1cbiAgfSkuYSAhPSA3O1xufSk7XG4iLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xuXG52YXIgc3BsaXQgPSAnJy5zcGxpdDtcblxubW9kdWxlLmV4cG9ydHMgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIHRocm93cyBhbiBlcnJvciBpbiByaGlubywgc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tb3ppbGxhL3JoaW5vL2lzc3Vlcy8zNDZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICByZXR1cm4gIU9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApO1xufSkgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGNsYXNzb2YoaXQpID09ICdTdHJpbmcnID8gc3BsaXQuY2FsbChpdCwgJycpIDogT2JqZWN0KGl0KTtcbn0gOiBPYmplY3Q7XG4iLCJ2YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25hdGl2ZS13ZWFrLW1hcCcpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBvYmplY3RIYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgc2hhcmVkS2V5ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NoYXJlZC1rZXknKTtcbnZhciBoaWRkZW5LZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGRlbi1rZXlzJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG52YXIgc2V0LCBnZXQsIGhhcztcblxudmFyIGVuZm9yY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGhhcyhpdCkgPyBnZXQoaXQpIDogc2V0KGl0LCB7fSk7XG59O1xuXG52YXIgZ2V0dGVyRm9yID0gZnVuY3Rpb24gKFRZUEUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBzdGF0ZTtcbiAgICBpZiAoIWlzT2JqZWN0KGl0KSB8fCAoc3RhdGUgPSBnZXQoaXQpKS50eXBlICE9PSBUWVBFKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0luY29tcGF0aWJsZSByZWNlaXZlciwgJyArIFRZUEUgKyAnIHJlcXVpcmVkJyk7XG4gICAgfSByZXR1cm4gc3RhdGU7XG4gIH07XG59O1xuXG5pZiAoTkFUSVZFX1dFQUtfTUFQKSB7XG4gIHZhciBzdG9yZSA9IG5ldyBXZWFrTWFwKCk7XG4gIHZhciB3bWdldCA9IHN0b3JlLmdldDtcbiAgdmFyIHdtaGFzID0gc3RvcmUuaGFzO1xuICB2YXIgd21zZXQgPSBzdG9yZS5zZXQ7XG4gIHNldCA9IGZ1bmN0aW9uIChpdCwgbWV0YWRhdGEpIHtcbiAgICB3bXNldC5jYWxsKHN0b3JlLCBpdCwgbWV0YWRhdGEpO1xuICAgIHJldHVybiBtZXRhZGF0YTtcbiAgfTtcbiAgZ2V0ID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtZ2V0LmNhbGwoc3RvcmUsIGl0KSB8fCB7fTtcbiAgfTtcbiAgaGFzID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgcmV0dXJuIHdtaGFzLmNhbGwoc3RvcmUsIGl0KTtcbiAgfTtcbn0gZWxzZSB7XG4gIHZhciBTVEFURSA9IHNoYXJlZEtleSgnc3RhdGUnKTtcbiAgaGlkZGVuS2V5c1tTVEFURV0gPSB0cnVlO1xuICBzZXQgPSBmdW5jdGlvbiAoaXQsIG1ldGFkYXRhKSB7XG4gICAgaGlkZShpdCwgU1RBVEUsIG1ldGFkYXRhKTtcbiAgICByZXR1cm4gbWV0YWRhdGE7XG4gIH07XG4gIGdldCA9IGZ1bmN0aW9uIChpdCkge1xuICAgIHJldHVybiBvYmplY3RIYXMoaXQsIFNUQVRFKSA/IGl0W1NUQVRFXSA6IHt9O1xuICB9O1xuICBoYXMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gb2JqZWN0SGFzKGl0LCBTVEFURSk7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IHNldCxcbiAgZ2V0OiBnZXQsXG4gIGhhczogaGFzLFxuICBlbmZvcmNlOiBlbmZvcmNlLFxuICBnZXR0ZXJGb3I6IGdldHRlckZvclxufTtcbiIsInZhciB3ZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0b3JzJyk7XG5cbnZhciBJVEVSQVRPUiA9IHdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbnZhciBBcnJheVByb3RvdHlwZSA9IEFycmF5LnByb3RvdHlwZTtcblxuLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b3R5cGVbSVRFUkFUT1JdID09PSBpdCk7XG59O1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZi1yYXcnKTtcblxuLy8gYElzQXJyYXlgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXNhcnJheVxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjbGFzc29mKGFyZykgPT0gJ0FycmF5Jztcbn07XG4iLCJ2YXIgZmFpbHMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZmFpbHMnKTtcblxudmFyIHJlcGxhY2VtZW50ID0gLyN8XFwucHJvdG90eXBlXFwuLztcblxudmFyIGlzRm9yY2VkID0gZnVuY3Rpb24gKGZlYXR1cmUsIGRldGVjdGlvbikge1xuICB2YXIgdmFsdWUgPSBkYXRhW25vcm1hbGl6ZShmZWF0dXJlKV07XG4gIHJldHVybiB2YWx1ZSA9PSBQT0xZRklMTCA/IHRydWVcbiAgICA6IHZhbHVlID09IE5BVElWRSA/IGZhbHNlXG4gICAgOiB0eXBlb2YgZGV0ZWN0aW9uID09ICdmdW5jdGlvbicgPyBmYWlscyhkZXRlY3Rpb24pXG4gICAgOiAhIWRldGVjdGlvbjtcbn07XG5cbnZhciBub3JtYWxpemUgPSBpc0ZvcmNlZC5ub3JtYWxpemUgPSBmdW5jdGlvbiAoc3RyaW5nKSB7XG4gIHJldHVybiBTdHJpbmcoc3RyaW5nKS5yZXBsYWNlKHJlcGxhY2VtZW50LCAnLicpLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgZGF0YSA9IGlzRm9yY2VkLmRhdGEgPSB7fTtcbnZhciBOQVRJVkUgPSBpc0ZvcmNlZC5OQVRJVkUgPSAnTic7XG52YXIgUE9MWUZJTEwgPSBpc0ZvcmNlZC5QT0xZRklMTCA9ICdQJztcblxubW9kdWxlLmV4cG9ydHMgPSBpc0ZvcmNlZDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmYWxzZTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NsYXNzb2YtcmF3Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBNQVRDSCA9IHdlbGxLbm93blN5bWJvbCgnbWF0Y2gnKTtcblxuLy8gYElzUmVnRXhwYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWlzcmVnZXhwXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjbGFzc29mKGl0KSA9PSAnUmVnRXhwJyk7XG59O1xuIiwidmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIGlzQXJyYXlJdGVyYXRvck1ldGhvZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1hcnJheS1pdGVyYXRvci1tZXRob2QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1sZW5ndGgnKTtcbnZhciBiaW5kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2JpbmQtY29udGV4dCcpO1xudmFyIGdldEl0ZXJhdG9yTWV0aG9kID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dldC1pdGVyYXRvci1tZXRob2QnKTtcbnZhciBjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NhbGwtd2l0aC1zYWZlLWl0ZXJhdGlvbi1jbG9zaW5nJyk7XG5cbnZhciBCUkVBSyA9IHt9O1xuXG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBmbiwgdGhhdCwgRU5UUklFUywgSVRFUkFUT1IpIHtcbiAgdmFyIGJvdW5kRnVuY3Rpb24gPSBiaW5kKGZuLCB0aGF0LCBFTlRSSUVTID8gMiA6IDEpO1xuICB2YXIgaXRlcmF0b3IsIGl0ZXJGbiwgaW5kZXgsIGxlbmd0aCwgcmVzdWx0LCBzdGVwO1xuXG4gIGlmIChJVEVSQVRPUikge1xuICAgIGl0ZXJhdG9yID0gaXRlcmFibGU7XG4gIH0gZWxzZSB7XG4gICAgaXRlckZuID0gZ2V0SXRlcmF0b3JNZXRob2QoaXRlcmFibGUpO1xuICAgIGlmICh0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpIHRocm93IFR5cGVFcnJvcignVGFyZ2V0IGlzIG5vdCBpdGVyYWJsZScpO1xuICAgIC8vIG9wdGltaXNhdGlvbiBmb3IgYXJyYXkgaXRlcmF0b3JzXG4gICAgaWYgKGlzQXJyYXlJdGVyYXRvck1ldGhvZChpdGVyRm4pKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoaXRlcmFibGUubGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdWx0ID0gRU5UUklFUyA/IGJvdW5kRnVuY3Rpb24oYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogYm91bmRGdW5jdGlvbihpdGVyYWJsZVtpbmRleF0pO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBCUkVBSykgcmV0dXJuIEJSRUFLO1xuICAgICAgfSByZXR1cm47XG4gICAgfVxuICAgIGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoaXRlcmFibGUpO1xuICB9XG5cbiAgd2hpbGUgKCEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkge1xuICAgIGlmIChjYWxsV2l0aFNhZmVJdGVyYXRpb25DbG9zaW5nKGl0ZXJhdG9yLCBib3VuZEZ1bmN0aW9uLCBzdGVwLnZhbHVlLCBFTlRSSUVTKSA9PT0gQlJFQUspIHJldHVybiBCUkVBSztcbiAgfVxufTtcblxuZXhwb3J0cy5CUkVBSyA9IEJSRUFLO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IGZhbHNlO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH07XG5cbi8vIGAlSXRlcmF0b3JQcm90b3R5cGUlYCBvYmplY3Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVpdGVyYXRvcnByb3RvdHlwZSUtb2JqZWN0XG52YXIgSXRlcmF0b3JQcm90b3R5cGUsIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSwgYXJyYXlJdGVyYXRvcjtcblxuaWYgKFtdLmtleXMpIHtcbiAgYXJyYXlJdGVyYXRvciA9IFtdLmtleXMoKTtcbiAgLy8gU2FmYXJpIDggaGFzIGJ1Z2d5IGl0ZXJhdG9ycyB3L28gYG5leHRgXG4gIGlmICghKCduZXh0JyBpbiBhcnJheUl0ZXJhdG9yKSkgQlVHR1lfU0FGQVJJX0lURVJBVE9SUyA9IHRydWU7XG4gIGVsc2Uge1xuICAgIFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZSA9IGdldFByb3RvdHlwZU9mKGdldFByb3RvdHlwZU9mKGFycmF5SXRlcmF0b3IpKTtcbiAgICBpZiAoUHJvdG90eXBlT2ZBcnJheUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlKSBJdGVyYXRvclByb3RvdHlwZSA9IFByb3RvdHlwZU9mQXJyYXlJdGVyYXRvclByb3RvdHlwZTtcbiAgfVxufVxuXG5pZiAoSXRlcmF0b3JQcm90b3R5cGUgPT0gdW5kZWZpbmVkKSBJdGVyYXRvclByb3RvdHlwZSA9IHt9O1xuXG4vLyAyNS4xLjIuMS4xICVJdGVyYXRvclByb3RvdHlwZSVbQEBpdGVyYXRvcl0oKVxuaWYgKCFJU19QVVJFICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSkgaGlkZShJdGVyYXRvclByb3RvdHlwZSwgSVRFUkFUT1IsIHJldHVyblRoaXMpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgSXRlcmF0b3JQcm90b3R5cGU6IEl0ZXJhdG9yUHJvdG90eXBlLFxuICBCVUdHWV9TQUZBUklfSVRFUkFUT1JTOiBCVUdHWV9TQUZBUklfSVRFUkFUT1JTXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpLmY7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90YXNrJykuc2V0O1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy91c2VyLWFnZW50Jyk7XG5cbnZhciBNdXRhdGlvbk9ic2VydmVyID0gZ2xvYmFsLk11dGF0aW9uT2JzZXJ2ZXIgfHwgZ2xvYmFsLldlYktpdE11dGF0aW9uT2JzZXJ2ZXI7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyIFByb21pc2UgPSBnbG9iYWwuUHJvbWlzZTtcbnZhciBJU19OT0RFID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG4vLyBOb2RlLmpzIDExIHNob3dzIEV4cGVyaW1lbnRhbFdhcm5pbmcgb24gZ2V0dGluZyBgcXVldWVNaWNyb3Rhc2tgXG52YXIgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGdsb2JhbCwgJ3F1ZXVlTWljcm90YXNrJyk7XG52YXIgcXVldWVNaWNyb3Rhc2sgPSBxdWV1ZU1pY3JvdGFza0Rlc2NyaXB0b3IgJiYgcXVldWVNaWNyb3Rhc2tEZXNjcmlwdG9yLnZhbHVlO1xuXG52YXIgZmx1c2gsIGhlYWQsIGxhc3QsIG5vdGlmeSwgdG9nZ2xlLCBub2RlLCBwcm9taXNlO1xuXG4vLyBtb2Rlcm4gZW5naW5lcyBoYXZlIHF1ZXVlTWljcm90YXNrIG1ldGhvZFxuaWYgKCFxdWV1ZU1pY3JvdGFzaykge1xuICBmbHVzaCA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50LCBmbjtcbiAgICBpZiAoSVNfTk9ERSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKSBwYXJlbnQuZXhpdCgpO1xuICAgIHdoaWxlIChoZWFkKSB7XG4gICAgICBmbiA9IGhlYWQuZm47XG4gICAgICBoZWFkID0gaGVhZC5uZXh0O1xuICAgICAgdHJ5IHtcbiAgICAgICAgZm4oKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cbiAgICB9IGxhc3QgPSB1bmRlZmluZWQ7XG4gICAgaWYgKHBhcmVudCkgcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZiAoSVNfTk9ERSkge1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soZmx1c2gpO1xuICAgIH07XG4gIC8vIGJyb3dzZXJzIHdpdGggTXV0YXRpb25PYnNlcnZlciwgZXhjZXB0IGlPUyAtIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8zMzlcbiAgfSBlbHNlIGlmIChNdXRhdGlvbk9ic2VydmVyICYmICEvKGlwaG9uZXxpcG9kfGlwYWQpLiphcHBsZXdlYmtpdC9pLnRlc3QodXNlckFnZW50KSkge1xuICAgIHRvZ2dsZSA9IHRydWU7XG4gICAgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCcnKTtcbiAgICBuZXcgTXV0YXRpb25PYnNlcnZlcihmbHVzaCkub2JzZXJ2ZShub2RlLCB7IGNoYXJhY3RlckRhdGE6IHRydWUgfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlID0gIXRvZ2dsZTtcbiAgICB9O1xuICAvLyBlbnZpcm9ubWVudHMgd2l0aCBtYXliZSBub24tY29tcGxldGVseSBjb3JyZWN0LCBidXQgZXhpc3RlbnQgUHJvbWlzZVxuICB9IGVsc2UgaWYgKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKSB7XG4gICAgLy8gUHJvbWlzZS5yZXNvbHZlIHdpdGhvdXQgYW4gYXJndW1lbnQgdGhyb3dzIGFuIGVycm9yIGluIExHIFdlYk9TIDJcbiAgICBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHF1ZXVlTWljcm90YXNrIHx8IGZ1bmN0aW9uIChmbikge1xuICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgaWYgKGxhc3QpIGxhc3QubmV4dCA9IHRhc2s7XG4gIGlmICghaGVhZCkge1xuICAgIGhlYWQgPSB0YXNrO1xuICAgIG5vdGlmeSgpO1xuICB9IGxhc3QgPSB0YXNrO1xufTtcbiIsInZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9ICEhT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBDaHJvbWUgMzggU3ltYm9sIGhhcyBpbmNvcnJlY3QgdG9TdHJpbmcgY29udmVyc2lvblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgcmV0dXJuICFTdHJpbmcoU3ltYm9sKCkpO1xufSk7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZnVuY3Rpb24tdG8tc3RyaW5nJyk7XG5cbnZhciBXZWFrTWFwID0gZ2xvYmFsLldlYWtNYXA7XG5cbm1vZHVsZS5leHBvcnRzID0gdHlwZW9mIFdlYWtNYXAgPT09ICdmdW5jdGlvbicgJiYgL25hdGl2ZSBjb2RlLy50ZXN0KG5hdGl2ZUZ1bmN0aW9uVG9TdHJpbmcuY2FsbChXZWFrTWFwKSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcblxudmFyIFByb21pc2VDYXBhYmlsaXR5ID0gZnVuY3Rpb24gKEMpIHtcbiAgdmFyIHJlc29sdmUsIHJlamVjdDtcbiAgdGhpcy5wcm9taXNlID0gbmV3IEMoZnVuY3Rpb24gKCQkcmVzb2x2ZSwgJCRyZWplY3QpIHtcbiAgICBpZiAocmVzb2x2ZSAhPT0gdW5kZWZpbmVkIHx8IHJlamVjdCAhPT0gdW5kZWZpbmVkKSB0aHJvdyBUeXBlRXJyb3IoJ0JhZCBQcm9taXNlIGNvbnN0cnVjdG9yJyk7XG4gICAgcmVzb2x2ZSA9ICQkcmVzb2x2ZTtcbiAgICByZWplY3QgPSAkJHJlamVjdDtcbiAgfSk7XG4gIHRoaXMucmVzb2x2ZSA9IGFGdW5jdGlvbihyZXNvbHZlKTtcbiAgdGhpcy5yZWplY3QgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG5cbi8vIDI1LjQuMS41IE5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9mYWlscycpO1xudmFyIG9iamVjdEtleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWtleXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tb2JqZWN0Jyk7XG52YXIgSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pbmRleGVkLW9iamVjdCcpO1xuXG52YXIgbmF0aXZlQXNzaWduID0gT2JqZWN0LmFzc2lnbjtcblxuLy8gMTkuMS4yLjEgT2JqZWN0LmFzc2lnbih0YXJnZXQsIHNvdXJjZSwgLi4uKVxuLy8gc2hvdWxkIHdvcmsgd2l0aCBzeW1ib2xzIGFuZCBzaG91bGQgaGF2ZSBkZXRlcm1pbmlzdGljIHByb3BlcnR5IG9yZGVyIChWOCBidWcpXG5tb2R1bGUuZXhwb3J0cyA9ICFuYXRpdmVBc3NpZ24gfHwgZmFpbHMoZnVuY3Rpb24gKCkge1xuICB2YXIgQSA9IHt9O1xuICB2YXIgQiA9IHt9O1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgdmFyIHN5bWJvbCA9IFN5bWJvbCgpO1xuICB2YXIgYWxwaGFiZXQgPSAnYWJjZGVmZ2hpamtsbW5vcHFyc3QnO1xuICBBW3N5bWJvbF0gPSA3O1xuICBhbHBoYWJldC5zcGxpdCgnJykuZm9yRWFjaChmdW5jdGlvbiAoY2hyKSB7IEJbY2hyXSA9IGNocjsgfSk7XG4gIHJldHVybiBuYXRpdmVBc3NpZ24oe30sIEEpW3N5bWJvbF0gIT0gNyB8fCBvYmplY3RLZXlzKG5hdGl2ZUFzc2lnbih7fSwgQikpLmpvaW4oJycpICE9IGFscGhhYmV0O1xufSkgPyBmdW5jdGlvbiBhc3NpZ24odGFyZ2V0LCBzb3VyY2UpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICB2YXIgVCA9IHRvT2JqZWN0KHRhcmdldCk7XG4gIHZhciBhcmd1bWVudHNMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgaW5kZXggPSAxO1xuICB2YXIgZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzTW9kdWxlLmY7XG4gIHZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlLmY7XG4gIHdoaWxlIChhcmd1bWVudHNMZW5ndGggPiBpbmRleCkge1xuICAgIHZhciBTID0gSW5kZXhlZE9iamVjdChhcmd1bWVudHNbaW5kZXgrK10pO1xuICAgIHZhciBrZXlzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8gb2JqZWN0S2V5cyhTKS5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKFMpKSA6IG9iamVjdEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSB7XG4gICAgICBrZXkgPSBrZXlzW2orK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwoUywga2V5KSkgVFtrZXldID0gU1trZXldO1xuICAgIH1cbiAgfSByZXR1cm4gVDtcbn0gOiBuYXRpdmVBc3NpZ247XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG52YXIgZGVmaW5lUHJvcGVydGllcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnRpZXMnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9lbnVtLWJ1Zy1rZXlzJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oaWRkZW4ta2V5cycpO1xudmFyIGh0bWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaHRtbCcpO1xudmFyIGRvY3VtZW50Q3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xudmFyIHNoYXJlZEtleSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQta2V5Jyk7XG52YXIgSUVfUFJPVE8gPSBzaGFyZWRLZXkoJ0lFX1BST1RPJyk7XG5cbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBFbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcblxuLy8gQ3JlYXRlIG9iamVjdCB3aXRoIGZha2UgYG51bGxgIHByb3RvdHlwZTogdXNlIGlmcmFtZSBPYmplY3Qgd2l0aCBjbGVhcmVkIHByb3RvdHlwZVxudmFyIGNyZWF0ZURpY3QgPSBmdW5jdGlvbiAoKSB7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSBkb2N1bWVudENyZWF0ZUVsZW1lbnQoJ2lmcmFtZScpO1xuICB2YXIgbGVuZ3RoID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBzY3JpcHQgPSAnc2NyaXB0JztcbiAgdmFyIGd0ID0gJz4nO1xuICB2YXIganMgPSAnamF2YScgKyBzY3JpcHQgKyAnOic7XG4gIHZhciBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIGh0bWwuYXBwZW5kQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lLnNyYyA9IFN0cmluZyhqcyk7XG4gIGlmcmFtZURvY3VtZW50ID0gaWZyYW1lLmNvbnRlbnRXaW5kb3cuZG9jdW1lbnQ7XG4gIGlmcmFtZURvY3VtZW50Lm9wZW4oKTtcbiAgaWZyYW1lRG9jdW1lbnQud3JpdGUobHQgKyBzY3JpcHQgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvJyArIHNjcmlwdCArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChsZW5ndGgtLSkgZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tsZW5ndGhdXTtcbiAgcmV0dXJuIGNyZWF0ZURpY3QoKTtcbn07XG5cbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRlZmluZVByb3BlcnRpZXMocmVzdWx0LCBQcm9wZXJ0aWVzKTtcbn07XG5cbmhpZGRlbktleXNbSUVfUFJPVE9dID0gdHJ1ZTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIGRlZmluZVByb3BlcnR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1kZWZpbmUtcHJvcGVydHknKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBvYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gREVTQ1JJUFRPUlMgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBvYmplY3RLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKGxlbmd0aCA+IGkpIGRlZmluZVByb3BlcnR5TW9kdWxlLmYoTywga2V5ID0ga2V5c1tpKytdLCBQcm9wZXJ0aWVzW2tleV0pO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcbnZhciBJRThfRE9NX0RFRklORSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pZTgtZG9tLWRlZmluZScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLXByaW1pdGl2ZScpO1xuXG52YXIgbmF0aXZlRGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7XG5cbmV4cG9ydHMuZiA9IERFU0NSSVBUT1JTID8gbmF0aXZlRGVmaW5lUHJvcGVydHkgOiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZiAoSUU4X0RPTV9ERUZJTkUpIHRyeSB7XG4gICAgcmV0dXJuIG5hdGl2ZURlZmluZVByb3BlcnR5KE8sIFAsIEF0dHJpYnV0ZXMpO1xuICB9IGNhdGNoIChlcnJvcikgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQnKTtcbiAgaWYgKCd2YWx1ZScgaW4gQXR0cmlidXRlcykgT1tQXSA9IEF0dHJpYnV0ZXMudmFsdWU7XG4gIHJldHVybiBPO1xufTtcbiIsInZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZXNjcmlwdG9ycycpO1xudmFyIHByb3BlcnR5SXNFbnVtZXJhYmxlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1wcm9wZXJ0eS1pcy1lbnVtZXJhYmxlJyk7XG52YXIgY3JlYXRlUHJvcGVydHlEZXNjcmlwdG9yID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NyZWF0ZS1wcm9wZXJ0eS1kZXNjcmlwdG9yJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdG8tcHJpbWl0aXZlJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2llOC1kb20tZGVmaW5lJyk7XG5cbnZhciBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuXG5leHBvcnRzLmYgPSBERVNDUklQVE9SUyA/IG5hdGl2ZUdldE93blByb3BlcnR5RGVzY3JpcHRvciA6IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihPLCBQKSB7XG4gIE8gPSB0b0luZGV4ZWRPYmplY3QoTyk7XG4gIFAgPSB0b1ByaW1pdGl2ZShQLCB0cnVlKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBuYXRpdmVHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgaWYgKGhhcyhPLCBQKSkgcmV0dXJuIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcighcHJvcGVydHlJc0VudW1lcmFibGVNb2R1bGUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCIvLyAxOS4xLjIuNyAvIDE1LjIuMy40IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKE8pXG52YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG52YXIgaGlkZGVuS2V5cyA9IGVudW1CdWdLZXlzLmNvbmNhdCgnbGVuZ3RoJywgJ3Byb3RvdHlwZScpO1xuXG5leHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eU5hbWVzKE8pIHtcbiAgcmV0dXJuIGludGVybmFsT2JqZWN0S2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwidmFyIGhhcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1vYmplY3QnKTtcbnZhciBzaGFyZWRLZXkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkLWtleScpO1xudmFyIENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jb3JyZWN0LXByb3RvdHlwZS1nZXR0ZXInKTtcblxudmFyIElFX1BST1RPID0gc2hhcmVkS2V5KCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIDE5LjEuMi45IC8gMTUuMi4zLjIgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG5tb2R1bGUuZXhwb3J0cyA9IENPUlJFQ1RfUFJPVE9UWVBFX0dFVFRFUiA/IE9iamVjdC5nZXRQcm90b3R5cGVPZiA6IGZ1bmN0aW9uIChPKSB7XG4gIE8gPSB0b09iamVjdChPKTtcbiAgaWYgKGhhcyhPLCBJRV9QUk9UTykpIHJldHVybiBPW0lFX1BST1RPXTtcbiAgaWYgKHR5cGVvZiBPLmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgTyBpbnN0YW5jZW9mIE8uY29uc3RydWN0b3IpIHtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90b3R5cGUgOiBudWxsO1xufTtcbiIsInZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgdG9JbmRleGVkT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWluZGV4ZWQtb2JqZWN0Jyk7XG52YXIgYXJyYXlJbmNsdWRlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1pbmNsdWRlcycpO1xudmFyIGhpZGRlbktleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZGVuLWtleXMnKTtcblxudmFyIGFycmF5SW5kZXhPZiA9IGFycmF5SW5jbHVkZXMoZmFsc2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JbmRleGVkT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSAhaGFzKGhpZGRlbktleXMsIGtleSkgJiYgaGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZSAobmFtZXMubGVuZ3RoID4gaSkgaWYgKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSkge1xuICAgIH5hcnJheUluZGV4T2YocmVzdWx0LCBrZXkpIHx8IHJlc3VsdC5wdXNoKGtleSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn07XG4iLCJ2YXIgaW50ZXJuYWxPYmplY3RLZXlzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgZW51bUJ1Z0tleXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZW51bS1idWcta2V5cycpO1xuXG4vLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmtleXMgfHwgZnVuY3Rpb24ga2V5cyhPKSB7XG4gIHJldHVybiBpbnRlcm5hbE9iamVjdEtleXMoTywgZW51bUJ1Z0tleXMpO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZSA9IHt9LnByb3BlcnR5SXNFbnVtZXJhYmxlO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7XG5cbi8vIE5hc2hvcm4gfiBKREs4IGJ1Z1xudmFyIE5BU0hPUk5fQlVHID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yICYmICFuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHsgMTogMiB9LCAxKTtcblxuZXhwb3J0cy5mID0gTkFTSE9STl9CVUcgPyBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShWKSB7XG4gIHZhciBkZXNjcmlwdG9yID0gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRoaXMsIFYpO1xuICByZXR1cm4gISFkZXNjcmlwdG9yICYmIGRlc2NyaXB0b3IuZW51bWVyYWJsZTtcbn0gOiBuYXRpdmVQcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsInZhciB2YWxpZGF0ZVNldFByb3RvdHlwZU9mQXJndW1lbnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3ZhbGlkYXRlLXNldC1wcm90b3R5cGUtb2YtYXJndW1lbnRzJyk7XG5cbi8vIFdvcmtzIHdpdGggX19wcm90b19fIG9ubHkuIE9sZCB2OCBjYW4ndCB3b3JrIHdpdGggbnVsbCBwcm90byBvYmplY3RzLlxuLyogZXNsaW50LWRpc2FibGUgbm8tcHJvdG8gKi9cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8ICgnX19wcm90b19fJyBpbiB7fSA/IGZ1bmN0aW9uICgpIHtcbiAgdmFyIGNvcnJlY3RTZXR0ZXIgPSBmYWxzZTtcbiAgdmFyIHRlc3QgPSB7fTtcbiAgdmFyIHNldHRlcjtcbiAgdHJ5IHtcbiAgICBzZXR0ZXIgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE9iamVjdC5wcm90b3R5cGUsICdfX3Byb3RvX18nKS5zZXQ7XG4gICAgc2V0dGVyLmNhbGwodGVzdCwgW10pO1xuICAgIGNvcnJlY3RTZXR0ZXIgPSB0ZXN0IGluc3RhbmNlb2YgQXJyYXk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgdmFsaWRhdGVTZXRQcm90b3R5cGVPZkFyZ3VtZW50cyhPLCBwcm90byk7XG4gICAgaWYgKGNvcnJlY3RTZXR0ZXIpIHNldHRlci5jYWxsKE8sIHByb3RvKTtcbiAgICBlbHNlIE8uX19wcm90b19fID0gcHJvdG87XG4gICAgcmV0dXJuIE87XG4gIH07XG59KCkgOiB1bmRlZmluZWQpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2xhc3NvZicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciB0ZXN0ID0ge307XG5cbnRlc3RbVE9fU1RSSU5HX1RBR10gPSAneic7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2QgaW1wbGVtZW50YXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nKHRlc3QpICE9PSAnW29iamVjdCB6XScgPyBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuICdbb2JqZWN0ICcgKyBjbGFzc29mKHRoaXMpICsgJ10nO1xufSA6IHRlc3QudG9TdHJpbmc7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGdldE93blByb3BlcnR5TmFtZXNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHNNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWdldC1vd24tcHJvcGVydHktc3ltYm9scycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLW9iamVjdCcpO1xuXG52YXIgUmVmbGVjdCA9IGdsb2JhbC5SZWZsZWN0O1xuXG4vLyBhbGwgb2JqZWN0IGtleXMsIGluY2x1ZGVzIG5vbi1lbnVtZXJhYmxlIGFuZCBzeW1ib2xzXG5tb2R1bGUuZXhwb3J0cyA9IFJlZmxlY3QgJiYgUmVmbGVjdC5vd25LZXlzIHx8IGZ1bmN0aW9uIG93bktleXMoaXQpIHtcbiAgdmFyIGtleXMgPSBnZXRPd25Qcm9wZXJ0eU5hbWVzTW9kdWxlLmYoYW5PYmplY3QoaXQpKTtcbiAgdmFyIGdldE93blByb3BlcnR5U3ltYm9scyA9IGdldE93blByb3BlcnR5U3ltYm9sc01vZHVsZS5mO1xuICByZXR1cm4gZ2V0T3duUHJvcGVydHlTeW1ib2xzID8ga2V5cy5jb25jYXQoZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSkgOiBrZXlzO1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiB7IGVycm9yOiBmYWxzZSwgdmFsdWU6IGV4ZWMoKSB9O1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiB7IGVycm9yOiB0cnVlLCB2YWx1ZTogZXJyb3IgfTtcbiAgfVxufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEMsIHgpIHtcbiAgYW5PYmplY3QoQyk7XG4gIGlmIChpc09iamVjdCh4KSAmJiB4LmNvbnN0cnVjdG9yID09PSBDKSByZXR1cm4geDtcbiAgdmFyIHByb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkuZihDKTtcbiAgdmFyIHJlc29sdmUgPSBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlO1xuICByZXNvbHZlKHgpO1xuICByZXR1cm4gcHJvbWlzZUNhcGFiaWxpdHkucHJvbWlzZTtcbn07XG4iLCJ2YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGFyZ2V0LCBzcmMsIG9wdGlvbnMpIHtcbiAgZm9yICh2YXIga2V5IGluIHNyYykgcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBvcHRpb25zKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGFzJyk7XG52YXIgc2V0R2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1nbG9iYWwnKTtcbnZhciBuYXRpdmVGdW5jdGlvblRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2Z1bmN0aW9uLXRvLXN0cmluZycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcblxudmFyIGdldEludGVybmFsU3RhdGUgPSBJbnRlcm5hbFN0YXRlTW9kdWxlLmdldDtcbnZhciBlbmZvcmNlSW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZW5mb3JjZTtcbnZhciBURU1QTEFURSA9IFN0cmluZyhuYXRpdmVGdW5jdGlvblRvU3RyaW5nKS5zcGxpdCgndG9TdHJpbmcnKTtcblxuc2hhcmVkKCdpbnNwZWN0U291cmNlJywgZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwoaXQpO1xufSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbHVlLCBvcHRpb25zKSB7XG4gIHZhciB1bnNhZmUgPSBvcHRpb25zID8gISFvcHRpb25zLnVuc2FmZSA6IGZhbHNlO1xuICB2YXIgc2ltcGxlID0gb3B0aW9ucyA/ICEhb3B0aW9ucy5lbnVtZXJhYmxlIDogZmFsc2U7XG4gIHZhciBub1RhcmdldEdldCA9IG9wdGlvbnMgPyAhIW9wdGlvbnMubm9UYXJnZXRHZXQgOiBmYWxzZTtcbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7XG4gICAgaWYgKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgJiYgIWhhcyh2YWx1ZSwgJ25hbWUnKSkgaGlkZSh2YWx1ZSwgJ25hbWUnLCBrZXkpO1xuICAgIGVuZm9yY2VJbnRlcm5hbFN0YXRlKHZhbHVlKS5zb3VyY2UgPSBURU1QTEFURS5qb2luKHR5cGVvZiBrZXkgPT0gJ3N0cmluZycgPyBrZXkgOiAnJyk7XG4gIH1cbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIGlmIChzaW1wbGUpIE9ba2V5XSA9IHZhbHVlO1xuICAgIGVsc2Ugc2V0R2xvYmFsKGtleSwgdmFsdWUpO1xuICAgIHJldHVybjtcbiAgfSBlbHNlIGlmICghdW5zYWZlKSB7XG4gICAgZGVsZXRlIE9ba2V5XTtcbiAgfSBlbHNlIGlmICghbm9UYXJnZXRHZXQgJiYgT1trZXldKSB7XG4gICAgc2ltcGxlID0gdHJ1ZTtcbiAgfVxuICBpZiAoc2ltcGxlKSBPW2tleV0gPSB2YWx1ZTtcbiAgZWxzZSBoaWRlKE8sIGtleSwgdmFsdWUpO1xuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICByZXR1cm4gdHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyAmJiBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpLnNvdXJjZSB8fCBuYXRpdmVGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7XG59KTtcbiIsIi8vIGBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlcXVpcmVvYmplY3Rjb2VyY2libGVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCA9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNhbGwgbWV0aG9kIG9uIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hpZGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICB0cnkge1xuICAgIGhpZGUoZ2xvYmFsLCBrZXksIHZhbHVlKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBnbG9iYWxba2V5XSA9IHZhbHVlO1xuICB9IHJldHVybiB2YWx1ZTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBkZWZpbmVQcm9wZXJ0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtZGVmaW5lLXByb3BlcnR5Jyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVzY3JpcHRvcnMnKTtcblxudmFyIFNQRUNJRVMgPSB3ZWxsS25vd25TeW1ib2woJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09OU1RSVUNUT1JfTkFNRSkge1xuICB2YXIgQyA9IGdldEJ1aWx0SW4oQ09OU1RSVUNUT1JfTkFNRSk7XG4gIHZhciBkZWZpbmVQcm9wZXJ0eSA9IGRlZmluZVByb3BlcnR5TW9kdWxlLmY7XG4gIGlmIChERVNDUklQVE9SUyAmJiBDICYmICFDW1NQRUNJRVNdKSBkZWZpbmVQcm9wZXJ0eShDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07XG4iLCJ2YXIgZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWRlZmluZS1wcm9wZXJ0eScpLmY7XG52YXIgaGFzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2hhcycpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIFRBRywgU1RBVElDKSB7XG4gIGlmIChpdCAmJiAhaGFzKGl0ID0gU1RBVElDID8gaXQgOiBpdC5wcm90b3R5cGUsIFRPX1NUUklOR19UQUcpKSB7XG4gICAgZGVmaW5lUHJvcGVydHkoaXQsIFRPX1NUUklOR19UQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogVEFHIH0pO1xuICB9XG59O1xuIiwidmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zaGFyZWQnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdWlkJyk7XG5cbnZhciBrZXlzID0gc2hhcmVkKCdrZXlzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4ga2V5c1trZXldIHx8IChrZXlzW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzZXRHbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LWdsb2JhbCcpO1xudmFyIElTX1BVUkUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtcHVyZScpO1xuXG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCBzZXRHbG9iYWwoU0hBUkVELCB7fSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiAnMy4xLjMnLFxuICBtb2RlOiBJU19QVVJFID8gJ3B1cmUnIDogJ2dsb2JhbCcsXG4gIGNvcHlyaWdodDogJ8KpIDIwMTkgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSknXG59KTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hbi1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgU1BFQ0lFUyA9IHdlbGxLbm93blN5bWJvbCgnc3BlY2llcycpO1xuXG4vLyBgU3BlY2llc0NvbnN0cnVjdG9yYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXNwZWNpZXNjb25zdHJ1Y3RvclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTywgZGVmYXVsdENvbnN0cnVjdG9yKSB7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3I7XG4gIHZhciBTO1xuICByZXR1cm4gQyA9PT0gdW5kZWZpbmVkIHx8IChTID0gYW5PYmplY3QoQylbU1BFQ0lFU10pID09IHVuZGVmaW5lZCA/IGRlZmF1bHRDb25zdHJ1Y3RvciA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBDT05WRVJUX1RPX1NUUklORzogdHJ1ZSAgLT4gU3RyaW5nI2F0XG4vLyBDT05WRVJUX1RPX1NUUklORzogZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBwb3MsIENPTlZFUlRfVE9fU1RSSU5HKSB7XG4gIHZhciBTID0gU3RyaW5nKHJlcXVpcmVPYmplY3RDb2VyY2libGUodGhhdCkpO1xuICB2YXIgcG9zaXRpb24gPSB0b0ludGVnZXIocG9zKTtcbiAgdmFyIHNpemUgPSBTLmxlbmd0aDtcbiAgdmFyIGZpcnN0LCBzZWNvbmQ7XG4gIGlmIChwb3NpdGlvbiA8IDAgfHwgcG9zaXRpb24gPj0gc2l6ZSkgcmV0dXJuIENPTlZFUlRfVE9fU1RSSU5HID8gJycgOiB1bmRlZmluZWQ7XG4gIGZpcnN0ID0gUy5jaGFyQ29kZUF0KHBvc2l0aW9uKTtcbiAgcmV0dXJuIGZpcnN0IDwgMHhEODAwIHx8IGZpcnN0ID4gMHhEQkZGIHx8IHBvc2l0aW9uICsgMSA9PT0gc2l6ZVxuICAgIHx8IChzZWNvbmQgPSBTLmNoYXJDb2RlQXQocG9zaXRpb24gKyAxKSkgPCAweERDMDAgfHwgc2Vjb25kID4gMHhERkZGXG4gICAgICA/IENPTlZFUlRfVE9fU1RSSU5HID8gUy5jaGFyQXQocG9zaXRpb24pIDogZmlyc3RcbiAgICAgIDogQ09OVkVSVF9UT19TVFJJTkcgPyBTLnNsaWNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDIpIDogKGZpcnN0IC0gMHhEODAwIDw8IDEwKSArIChzZWNvbmQgLSAweERDMDApICsgMHgxMDAwMDtcbn07XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2dsb2JhbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ZhaWxzJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYmluZC1jb250ZXh0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9odG1sJyk7XG52YXIgY3JlYXRlRWxlbWVudCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kb2N1bWVudC1jcmVhdGUtZWxlbWVudCcpO1xuXG52YXIgbG9jYXRpb24gPSBnbG9iYWwubG9jYXRpb247XG52YXIgc2V0ID0gZ2xvYmFsLnNldEltbWVkaWF0ZTtcbnZhciBjbGVhciA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgTWVzc2FnZUNoYW5uZWwgPSBnbG9iYWwuTWVzc2FnZUNoYW5uZWw7XG52YXIgRGlzcGF0Y2ggPSBnbG9iYWwuRGlzcGF0Y2g7XG52YXIgY291bnRlciA9IDA7XG52YXIgcXVldWUgPSB7fTtcbnZhciBPTlJFQURZU1RBVEVDSEFOR0UgPSAnb25yZWFkeXN0YXRlY2hhbmdlJztcbnZhciBkZWZlciwgY2hhbm5lbCwgcG9ydDtcblxudmFyIHJ1biA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zXG4gIGlmIChxdWV1ZS5oYXNPd25Qcm9wZXJ0eShpZCkpIHtcbiAgICB2YXIgZm4gPSBxdWV1ZVtpZF07XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgICBmbigpO1xuICB9XG59O1xuXG52YXIgcnVubmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgcnVuKGlkKTtcbiAgfTtcbn07XG5cbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4oZXZlbnQuZGF0YSk7XG59O1xuXG52YXIgcG9zdCA9IGZ1bmN0aW9uIChpZCkge1xuICAvLyBvbGQgZW5naW5lcyBoYXZlIG5vdCBsb2NhdGlvbi5vcmlnaW5cbiAgZ2xvYmFsLnBvc3RNZXNzYWdlKGlkICsgJycsIGxvY2F0aW9uLnByb3RvY29sICsgJy8vJyArIGxvY2F0aW9uLmhvc3QpO1xufTtcblxuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYgKCFzZXQgfHwgIWNsZWFyKSB7XG4gIHNldCA9IGZ1bmN0aW9uIHNldEltbWVkaWF0ZShmbikge1xuICAgIHZhciBhcmdzID0gW107XG4gICAgdmFyIGkgPSAxO1xuICAgIHdoaWxlIChhcmd1bWVudHMubGVuZ3RoID4gaSkgYXJncy5wdXNoKGFyZ3VtZW50c1tpKytdKTtcbiAgICBxdWV1ZVsrK2NvdW50ZXJdID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gICAgICAodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSkuYXBwbHkodW5kZWZpbmVkLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhciA9IGZ1bmN0aW9uIGNsZWFySW1tZWRpYXRlKGlkKSB7XG4gICAgZGVsZXRlIHF1ZXVlW2lkXTtcbiAgfTtcbiAgLy8gTm9kZS5qcyAwLjgtXG4gIGlmIChjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKHJ1bm5lcihpZCkpO1xuICAgIH07XG4gIC8vIFNwaGVyZSAoSlMgZ2FtZSBlbmdpbmUpIERpc3BhdGNoIEFQSVxuICB9IGVsc2UgaWYgKERpc3BhdGNoICYmIERpc3BhdGNoLm5vdykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBEaXNwYXRjaC5ub3cocnVubmVyKGlkKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBiaW5kKHBvcnQucG9zdE1lc3NhZ2UsIHBvcnQsIDEpO1xuICAvLyBCcm93c2VycyB3aXRoIHBvc3RNZXNzYWdlLCBza2lwIFdlYldvcmtlcnNcbiAgLy8gSUU4IGhhcyBwb3N0TWVzc2FnZSwgYnV0IGl0J3Mgc3luYyAmIHR5cGVvZiBpdHMgcG9zdE1lc3NhZ2UgaXMgJ29iamVjdCdcbiAgfSBlbHNlIGlmIChnbG9iYWwuYWRkRXZlbnRMaXN0ZW5lciAmJiB0eXBlb2YgcG9zdE1lc3NhZ2UgPT0gJ2Z1bmN0aW9uJyAmJiAhZ2xvYmFsLmltcG9ydFNjcmlwdHMgJiYgIWZhaWxzKHBvc3QpKSB7XG4gICAgZGVmZXIgPSBwb3N0O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjcmVhdGVFbGVtZW50KCdzY3JpcHQnKSkge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpKVtPTlJFQURZU1RBVEVDSEFOR0VdID0gZnVuY3Rpb24gKCkge1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4oaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KHJ1bm5lcihpZCksIDApO1xuICAgIH07XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0LFxuICBjbGVhcjogY2xlYXJcbn07XG4iLCJ2YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3RvLWludGVnZXInKTtcblxudmFyIG1heCA9IE1hdGgubWF4O1xudmFyIG1pbiA9IE1hdGgubWluO1xuXG4vLyBIZWxwZXIgZm9yIGEgcG9wdWxhciByZXBlYXRpbmcgY2FzZSBvZiB0aGUgc3BlYzpcbi8vIExldCBpbnRlZ2VyIGJlID8gVG9JbnRlZ2VyKGluZGV4KS5cbi8vIElmIGludGVnZXIgPCAwLCBsZXQgcmVzdWx0IGJlIG1heCgobGVuZ3RoICsgaW50ZWdlciksIDApOyBlbHNlIGxldCByZXN1bHQgYmUgbWluKGxlbmd0aCwgbGVuZ3RoKS5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGluZGV4LCBsZW5ndGgpIHtcbiAgdmFyIGludGVnZXIgPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW50ZWdlciA8IDAgPyBtYXgoaW50ZWdlciArIGxlbmd0aCwgMCkgOiBtaW4oaW50ZWdlciwgbGVuZ3RoKTtcbn07XG4iLCIvLyB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIEluZGV4ZWRPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW5kZXhlZC1vYmplY3QnKTtcbnZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gSW5kZXhlZE9iamVjdChyZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGl0KSk7XG59O1xuIiwidmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xuXG4vLyBgVG9JbnRlZ2VyYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvaW50ZWdlclxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgcmV0dXJuIGlzTmFOKGFyZ3VtZW50ID0gK2FyZ3VtZW50KSA/IDAgOiAoYXJndW1lbnQgPiAwID8gZmxvb3IgOiBjZWlsKShhcmd1bWVudCk7XG59O1xuIiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbnRlZ2VyJyk7XG5cbnZhciBtaW4gPSBNYXRoLm1pbjtcblxuLy8gYFRvTGVuZ3RoYCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXRvbGVuZ3RoXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChhcmd1bWVudCkge1xuICByZXR1cm4gYXJndW1lbnQgPiAwID8gbWluKHRvSW50ZWdlcihhcmd1bWVudCksIDB4MUZGRkZGRkZGRkZGRkYpIDogMDsgLy8gMiAqKiA1MyAtIDEgPT0gOTAwNzE5OTI1NDc0MDk5MVxufTtcbiIsInZhciByZXF1aXJlT2JqZWN0Q29lcmNpYmxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3JlcXVpcmUtb2JqZWN0LWNvZXJjaWJsZScpO1xuXG4vLyBgVG9PYmplY3RgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9vYmplY3Rcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGFyZ3VtZW50KSB7XG4gIHJldHVybiBPYmplY3QocmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudCkpO1xufTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9pcy1vYmplY3QnKTtcblxuLy8gNy4xLjEgVG9QcmltaXRpdmUoaW5wdXQgWywgUHJlZmVycmVkVHlwZV0pXG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBTKSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSByZXR1cm4gaXQ7XG4gIHZhciBmbiwgdmFsO1xuICBpZiAoUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgaWYgKHR5cGVvZiAoZm4gPSBpdC52YWx1ZU9mKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICghUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSkgcmV0dXJuIHZhbDtcbiAgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlXCIpO1xufTtcbiIsInZhciBpZCA9IDA7XG52YXIgcG9zdGZpeCA9IE1hdGgucmFuZG9tKCk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHBvc3RmaXgpLnRvU3RyaW5nKDM2KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcblxudmFyIG5hdmlnYXRvciA9IGdsb2JhbC5uYXZpZ2F0b3I7XG5cbm1vZHVsZS5leHBvcnRzID0gbmF2aWdhdG9yICYmIG5hdmlnYXRvci51c2VyQWdlbnQgfHwgJyc7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYW4tb2JqZWN0Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkge1xuICAgIHRocm93IFR5cGVFcnJvcihcIkNhbid0IHNldCBcIiArIFN0cmluZyhwcm90bykgKyAnIGFzIGEgcHJvdG90eXBlJyk7XG4gIH1cbn07XG4iLCIvLyBoZWxwZXIgZm9yIFN0cmluZyN7c3RhcnRzV2l0aCwgZW5kc1dpdGgsIGluY2x1ZGVzfVxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXJlZ2V4cCcpO1xudmFyIHJlcXVpcmVPYmplY3RDb2VyY2libGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVxdWlyZS1vYmplY3QtY29lcmNpYmxlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIHNlYXJjaFN0cmluZywgTkFNRSkge1xuICBpZiAoaXNSZWdFeHAoc2VhcmNoU3RyaW5nKSkge1xuICAgIHRocm93IFR5cGVFcnJvcignU3RyaW5nLnByb3RvdHlwZS4nICsgTkFNRSArIFwiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4XCIpO1xuICB9IHJldHVybiBTdHJpbmcocmVxdWlyZU9iamVjdENvZXJjaWJsZSh0aGF0KSk7XG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2hhcmVkJyk7XG52YXIgdWlkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VpZCcpO1xudmFyIE5BVElWRV9TWU1CT0wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmF0aXZlLXN5bWJvbCcpO1xuXG52YXIgU3ltYm9sID0gZ2xvYmFsLlN5bWJvbDtcbnZhciBzdG9yZSA9IHNoYXJlZCgnd2tzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgcmV0dXJuIHN0b3JlW25hbWVdIHx8IChzdG9yZVtuYW1lXSA9IE5BVElWRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdXG4gICAgfHwgKE5BVElWRV9TWU1CT0wgPyBTeW1ib2wgOiB1aWQpKCdTeW1ib2wuJyArIG5hbWUpKTtcbn07XG4iLCJleHBvcnRzLmYgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvd2VsbC1rbm93bi1zeW1ib2wnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFycmF5TWV0aG9kcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hcnJheS1tZXRob2RzJyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxudmFyIGludGVybmFsRmluZCA9IGFycmF5TWV0aG9kcyg1KTtcbnZhciBGSU5EID0gJ2ZpbmQnO1xudmFyIFNLSVBTX0hPTEVTID0gdHJ1ZTtcblxuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChGSU5EIGluIFtdKSBBcnJheSgxKVtGSU5EXShmdW5jdGlvbiAoKSB7IFNLSVBTX0hPTEVTID0gZmFsc2U7IH0pO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmZpbmRgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmZpbmRcbiQoeyB0YXJnZXQ6ICdBcnJheScsIHByb3RvOiB0cnVlLCBmb3JjZWQ6IFNLSVBTX0hPTEVTIH0sIHtcbiAgZmluZDogZnVuY3Rpb24gZmluZChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiBpbnRlcm5hbEZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAdW5zY29wYWJsZXNcbmFkZFRvVW5zY29wYWJsZXMoRklORCk7XG4iLCJ2YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBmcm9tID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWZyb20nKTtcbnZhciBjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvY2hlY2stY29ycmVjdG5lc3Mtb2YtaXRlcmF0aW9uJyk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gIWNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbihmdW5jdGlvbiAoaXRlcmFibGUpIHtcbiAgQXJyYXkuZnJvbShpdGVyYWJsZSk7XG59KTtcblxuLy8gYEFycmF5LmZyb21gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkuZnJvbVxuJCh7IHRhcmdldDogJ0FycmF5Jywgc3RhdDogdHJ1ZSwgZm9yY2VkOiBJTkNPUlJFQ1RfSVRFUkFUSU9OIH0sIHtcbiAgZnJvbTogZnJvbVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FycmF5LWluY2x1ZGVzJyk7XG52YXIgYWRkVG9VbnNjb3BhYmxlcyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9hZGQtdG8tdW5zY29wYWJsZXMnKTtcblxudmFyIGludGVybmFsSW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzKHRydWUpO1xuXG4vLyBgQXJyYXkucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xuJCh7IHRhcmdldDogJ0FycmF5JywgcHJvdG86IHRydWUgfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuIGludGVybmFsSW5jbHVkZXModGhpcywgZWwsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgfVxufSk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdpbmNsdWRlcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW5kZXhlZE9iamVjdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy90by1pbmRleGVkLW9iamVjdCcpO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYWRkLXRvLXVuc2NvcGFibGVzJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdG9ycycpO1xudmFyIEludGVybmFsU3RhdGVNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaW50ZXJuYWwtc3RhdGUnKTtcbnZhciBkZWZpbmVJdGVyYXRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9kZWZpbmUtaXRlcmF0b3InKTtcblxudmFyIEFSUkFZX0lURVJBVE9SID0gJ0FycmF5IEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKEFSUkFZX0lURVJBVE9SKTtcblxuLy8gYEFycmF5LnByb3RvdHlwZS5lbnRyaWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS5lbnRyaWVzXG4vLyBgQXJyYXkucHJvdG90eXBlLmtleXNgIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLmtleXNcbi8vIGBBcnJheS5wcm90b3R5cGUudmFsdWVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS52YWx1ZXNcbi8vIGBBcnJheS5wcm90b3R5cGVbQEBpdGVyYXRvcl1gIG1ldGhvZFxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtYXJyYXkucHJvdG90eXBlLUBAaXRlcmF0b3Jcbi8vIGBDcmVhdGVBcnJheUl0ZXJhdG9yYCBpbnRlcm5hbCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZWFycmF5aXRlcmF0b3Jcbm1vZHVsZS5leHBvcnRzID0gZGVmaW5lSXRlcmF0b3IoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICBzZXRJbnRlcm5hbFN0YXRlKHRoaXMsIHtcbiAgICB0eXBlOiBBUlJBWV9JVEVSQVRPUixcbiAgICB0YXJnZXQ6IHRvSW5kZXhlZE9iamVjdChpdGVyYXRlZCksIC8vIHRhcmdldFxuICAgIGluZGV4OiAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICAgIGtpbmQ6IGtpbmQgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICB9KTtcbi8vIGAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dGAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy0lYXJyYXlpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICB2YXIgdGFyZ2V0ID0gc3RhdGUudGFyZ2V0O1xuICB2YXIga2luZCA9IHN0YXRlLmtpbmQ7XG4gIHZhciBpbmRleCA9IHN0YXRlLmluZGV4Kys7XG4gIGlmICghdGFyZ2V0IHx8IGluZGV4ID49IHRhcmdldC5sZW5ndGgpIHtcbiAgICBzdGF0ZS50YXJnZXQgPSB1bmRlZmluZWQ7XG4gICAgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9XG4gIGlmIChraW5kID09ICdrZXlzJykgcmV0dXJuIHsgdmFsdWU6IGluZGV4LCBkb25lOiBmYWxzZSB9O1xuICBpZiAoa2luZCA9PSAndmFsdWVzJykgcmV0dXJuIHsgdmFsdWU6IHRhcmdldFtpbmRleF0sIGRvbmU6IGZhbHNlIH07XG4gIHJldHVybiB7IHZhbHVlOiBbaW5kZXgsIHRhcmdldFtpbmRleF1dLCBkb25lOiBmYWxzZSB9O1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyVcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWNyZWF0ZXVubWFwcGVkYXJndW1lbnRzb2JqZWN0XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1jcmVhdGVtYXBwZWRhcmd1bWVudHNvYmplY3Rcbkl0ZXJhdG9ycy5Bcmd1bWVudHMgPSBJdGVyYXRvcnMuQXJyYXk7XG5cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFycmF5LnByb3RvdHlwZS1AQHVuc2NvcGFibGVzXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGFzc2lnbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9vYmplY3QtYXNzaWduJyk7XG5cbi8vIGBPYmplY3QuYXNzaWduYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5hc3NpZ25cbiQoeyB0YXJnZXQ6ICdPYmplY3QnLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IE9iamVjdC5hc3NpZ24gIT09IGFzc2lnbiB9LCB7XG4gIGFzc2lnbjogYXNzaWduXG59KTtcbiIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9yZWRlZmluZScpO1xudmFyIHRvU3RyaW5nID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC10by1zdHJpbmcnKTtcblxudmFyIE9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7XG5cbi8vIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmdcbmlmICh0b1N0cmluZyAhPT0gT2JqZWN0UHJvdG90eXBlLnRvU3RyaW5nKSB7XG4gIHJlZGVmaW5lKE9iamVjdFByb3RvdHlwZSwgJ3RvU3RyaW5nJywgdG9TdHJpbmcsIHsgdW5zYWZlOiB0cnVlIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgZ2V0QnVpbHRJbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nZXQtYnVpbHQtaW4nKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHByb21pc2VSZXNvbHZlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3Byb21pc2UtcmVzb2x2ZScpO1xuXG4vLyBgUHJvbWlzZS5wcm90b3R5cGUuZmluYWxseWAgbWV0aG9kXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnByb3RvdHlwZS5maW5hbGx5XG4kKHsgdGFyZ2V0OiAnUHJvbWlzZScsIHByb3RvOiB0cnVlLCByZWFsOiB0cnVlIH0sIHtcbiAgJ2ZpbmFsbHknOiBmdW5jdGlvbiAob25GaW5hbGx5KSB7XG4gICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgZ2V0QnVpbHRJbignUHJvbWlzZScpKTtcbiAgICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgICByZXR1cm4gdGhpcy50aGVuKFxuICAgICAgaXNGdW5jdGlvbiA/IGZ1bmN0aW9uICh4KSB7XG4gICAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICAgIH0gOiBvbkZpbmFsbHksXG4gICAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgICB9IDogb25GaW5hbGx5XG4gICAgKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBJU19QVVJFID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2lzLXB1cmUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2xvYmFsJyk7XG52YXIgcGF0aCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wYXRoJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcmVkZWZpbmUtYWxsJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBzZXRTcGVjaWVzID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3NldC1zcGVjaWVzJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2EtZnVuY3Rpb24nKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2FuLWluc3RhbmNlJyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jbGFzc29mLXJhdycpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGNoZWNrQ29ycmVjdG5lc3NPZkl0ZXJhdGlvbiA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jaGVjay1jb3JyZWN0bmVzcy1vZi1pdGVyYXRpb24nKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvc3BlY2llcy1jb25zdHJ1Y3RvcicpO1xudmFyIHRhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvdGFzaycpLnNldDtcbnZhciBtaWNyb3Rhc2sgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbWljcm90YXNrJyk7XG52YXIgcHJvbWlzZVJlc29sdmUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcHJvbWlzZS1yZXNvbHZlJyk7XG52YXIgaG9zdFJlcG9ydEVycm9ycyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9ob3N0LXJlcG9ydC1lcnJvcnMnKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9uZXctcHJvbWlzZS1jYXBhYmlsaXR5Jyk7XG52YXIgcGVyZm9ybSA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9wZXJmb3JtJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3VzZXItYWdlbnQnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgaXNGb3JjZWQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXMtZm9yY2VkJyk7XG52YXIgd2VsbEtub3duU3ltYm9sID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3dlbGwta25vd24tc3ltYm9sJyk7XG5cbnZhciBTUEVDSUVTID0gd2VsbEtub3duU3ltYm9sKCdzcGVjaWVzJyk7XG52YXIgUFJPTUlTRSA9ICdQcm9taXNlJztcbnZhciBnZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXQ7XG52YXIgc2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuc2V0O1xudmFyIGdldEludGVybmFsUHJvbWlzZVN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5nZXR0ZXJGb3IoUFJPTUlTRSk7XG52YXIgUHJvbWlzZUNvbnN0cnVjdG9yID0gZ2xvYmFsW1BST01JU0VdO1xudmFyIFR5cGVFcnJvciA9IGdsb2JhbC5UeXBlRXJyb3I7XG52YXIgZG9jdW1lbnQgPSBnbG9iYWwuZG9jdW1lbnQ7XG52YXIgcHJvY2VzcyA9IGdsb2JhbC5wcm9jZXNzO1xudmFyICRmZXRjaCA9IGdsb2JhbC5mZXRjaDtcbnZhciB2ZXJzaW9ucyA9IHByb2Nlc3MgJiYgcHJvY2Vzcy52ZXJzaW9ucztcbnZhciB2OCA9IHZlcnNpb25zICYmIHZlcnNpb25zLnY4IHx8ICcnO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZjtcbnZhciBuZXdHZW5lcmljUHJvbWlzZUNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eTtcbnZhciBJU19OT0RFID0gY2xhc3NvZihwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG52YXIgRElTUEFUQ0hfRVZFTlQgPSAhIShkb2N1bWVudCAmJiBkb2N1bWVudC5jcmVhdGVFdmVudCAmJiBnbG9iYWwuZGlzcGF0Y2hFdmVudCk7XG52YXIgVU5IQU5ETEVEX1JFSkVDVElPTiA9ICd1bmhhbmRsZWRyZWplY3Rpb24nO1xudmFyIFJFSkVDVElPTl9IQU5ETEVEID0gJ3JlamVjdGlvbmhhbmRsZWQnO1xudmFyIFBFTkRJTkcgPSAwO1xudmFyIEZVTEZJTExFRCA9IDE7XG52YXIgUkVKRUNURUQgPSAyO1xudmFyIEhBTkRMRUQgPSAxO1xudmFyIFVOSEFORExFRCA9IDI7XG52YXIgSW50ZXJuYWwsIE93blByb21pc2VDYXBhYmlsaXR5LCBQcm9taXNlV3JhcHBlcjtcblxudmFyIEZPUkNFRCA9IGlzRm9yY2VkKFBST01JU0UsIGZ1bmN0aW9uICgpIHtcbiAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gIHZhciBwcm9taXNlID0gUHJvbWlzZUNvbnN0cnVjdG9yLnJlc29sdmUoMSk7XG4gIHZhciBlbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbiAgdmFyIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbU1BFQ0lFU10gPSBmdW5jdGlvbiAoZXhlYykge1xuICAgIGV4ZWMoZW1wdHksIGVtcHR5KTtcbiAgfTtcbiAgLy8gdW5oYW5kbGVkIHJlamVjdGlvbnMgdHJhY2tpbmcgc3VwcG9ydCwgTm9kZUpTIFByb21pc2Ugd2l0aG91dCBpdCBmYWlscyBAQHNwZWNpZXMgdGVzdFxuICByZXR1cm4gISgoSVNfTk9ERSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpXG4gICAgJiYgKCFJU19QVVJFIHx8IHByb21pc2VbJ2ZpbmFsbHknXSlcbiAgICAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2VcbiAgICAvLyB2OCA2LjYgKE5vZGUgMTAgYW5kIENocm9tZSA2NikgaGF2ZSBhIGJ1ZyB3aXRoIHJlc29sdmluZyBjdXN0b20gdGhlbmFibGVzXG4gICAgLy8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9ODMwNTY1XG4gICAgLy8gd2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgICAmJiB2OC5pbmRleE9mKCc2LjYnKSAhPT0gMFxuICAgICYmIHVzZXJBZ2VudC5pbmRleE9mKCdDaHJvbWUvNjYnKSA9PT0gLTEpO1xufSk7XG5cbnZhciBJTkNPUlJFQ1RfSVRFUkFUSU9OID0gRk9SQ0VEIHx8ICFjaGVja0NvcnJlY3RuZXNzT2ZJdGVyYXRpb24oZnVuY3Rpb24gKGl0ZXJhYmxlKSB7XG4gIFByb21pc2VDb25zdHJ1Y3Rvci5hbGwoaXRlcmFibGUpWydjYXRjaCddKGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG5cbnZhciBub3RpZnkgPSBmdW5jdGlvbiAocHJvbWlzZSwgc3RhdGUsIGlzUmVqZWN0KSB7XG4gIGlmIChzdGF0ZS5ub3RpZmllZCkgcmV0dXJuO1xuICBzdGF0ZS5ub3RpZmllZCA9IHRydWU7XG4gIHZhciBjaGFpbiA9IHN0YXRlLnJlYWN0aW9ucztcbiAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgb2sgPSBzdGF0ZS5zdGF0ZSA9PSBGVUxGSUxMRUQ7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBydW4gPSBmdW5jdGlvbiAocmVhY3Rpb24pIHtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWw7XG4gICAgICB2YXIgcmVzb2x2ZSA9IHJlYWN0aW9uLnJlc29sdmU7XG4gICAgICB2YXIgcmVqZWN0ID0gcmVhY3Rpb24ucmVqZWN0O1xuICAgICAgdmFyIGRvbWFpbiA9IHJlYWN0aW9uLmRvbWFpbjtcbiAgICAgIHZhciByZXN1bHQsIHRoZW4sIGV4aXRlZDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgaWYgKCFvaykge1xuICAgICAgICAgICAgaWYgKHN0YXRlLnJlamVjdGlvbiA9PT0gVU5IQU5ETEVEKSBvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlLCBzdGF0ZSk7XG4gICAgICAgICAgICBzdGF0ZS5yZWplY3Rpb24gPSBIQU5ETEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoaGFuZGxlciA9PT0gdHJ1ZSkgcmVzdWx0ID0gdmFsdWU7XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoZG9tYWluKSBkb21haW4uZW50ZXIoKTtcbiAgICAgICAgICAgIHJlc3VsdCA9IGhhbmRsZXIodmFsdWUpOyAvLyBtYXkgdGhyb3dcbiAgICAgICAgICAgIGlmIChkb21haW4pIHtcbiAgICAgICAgICAgICAgZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICAgICAgZXhpdGVkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHJlc3VsdCA9PT0gcmVhY3Rpb24ucHJvbWlzZSkge1xuICAgICAgICAgICAgcmVqZWN0KFR5cGVFcnJvcignUHJvbWlzZS1jaGFpbiBjeWNsZScpKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpIHtcbiAgICAgICAgICAgIHRoZW4uY2FsbChyZXN1bHQsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSBlbHNlIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSBlbHNlIHJlamVjdCh2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAoZG9tYWluICYmICFleGl0ZWQpIGRvbWFpbi5leGl0KCk7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkgcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHN0YXRlLnJlYWN0aW9ucyA9IFtdO1xuICAgIHN0YXRlLm5vdGlmaWVkID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFzdGF0ZS5yZWplY3Rpb24pIG9uVW5oYW5kbGVkKHByb21pc2UsIHN0YXRlKTtcbiAgfSk7XG59O1xuXG52YXIgZGlzcGF0Y2hFdmVudCA9IGZ1bmN0aW9uIChuYW1lLCBwcm9taXNlLCByZWFzb24pIHtcbiAgdmFyIGV2ZW50LCBoYW5kbGVyO1xuICBpZiAoRElTUEFUQ0hfRVZFTlQpIHtcbiAgICBldmVudCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdFdmVudCcpO1xuICAgIGV2ZW50LnByb21pc2UgPSBwcm9taXNlO1xuICAgIGV2ZW50LnJlYXNvbiA9IHJlYXNvbjtcbiAgICBldmVudC5pbml0RXZlbnQobmFtZSwgZmFsc2UsIHRydWUpO1xuICAgIGdsb2JhbC5kaXNwYXRjaEV2ZW50KGV2ZW50KTtcbiAgfSBlbHNlIGV2ZW50ID0geyBwcm9taXNlOiBwcm9taXNlLCByZWFzb246IHJlYXNvbiB9O1xuICBpZiAoaGFuZGxlciA9IGdsb2JhbFsnb24nICsgbmFtZV0pIGhhbmRsZXIoZXZlbnQpO1xuICBlbHNlIGlmIChuYW1lID09PSBVTkhBTkRMRURfUkVKRUNUSU9OKSBob3N0UmVwb3J0RXJyb3JzKCdVbmhhbmRsZWQgcHJvbWlzZSByZWplY3Rpb24nLCByZWFzb24pO1xufTtcblxudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgdmFsdWUgPSBzdGF0ZS52YWx1ZTtcbiAgICB2YXIgSVNfVU5IQU5ETEVEID0gaXNVbmhhbmRsZWQoc3RhdGUpO1xuICAgIHZhciByZXN1bHQ7XG4gICAgaWYgKElTX1VOSEFORExFRCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChJU19OT0RFKSB7XG4gICAgICAgICAgcHJvY2Vzcy5lbWl0KCd1bmhhbmRsZWRSZWplY3Rpb24nLCB2YWx1ZSwgcHJvbWlzZSk7XG4gICAgICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFVOSEFORExFRF9SRUpFQ1RJT04sIHByb21pc2UsIHZhbHVlKTtcbiAgICAgIH0pO1xuICAgICAgLy8gQnJvd3NlcnMgc2hvdWxkIG5vdCB0cmlnZ2VyIGByZWplY3Rpb25IYW5kbGVkYCBldmVudCBpZiBpdCB3YXMgaGFuZGxlZCBoZXJlLCBOb2RlSlMgLSBzaG91bGRcbiAgICAgIHN0YXRlLnJlamVjdGlvbiA9IElTX05PREUgfHwgaXNVbmhhbmRsZWQoc3RhdGUpID8gVU5IQU5ETEVEIDogSEFORExFRDtcbiAgICAgIGlmIChyZXN1bHQuZXJyb3IpIHRocm93IHJlc3VsdC52YWx1ZTtcbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHN0YXRlKSB7XG4gIHJldHVybiBzdGF0ZS5yZWplY3Rpb24gIT09IEhBTkRMRUQgJiYgIXN0YXRlLnBhcmVudDtcbn07XG5cbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSkge1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKElTX05PREUpIHtcbiAgICAgIHByb2Nlc3MuZW1pdCgncmVqZWN0aW9uSGFuZGxlZCcsIHByb21pc2UpO1xuICAgIH0gZWxzZSBkaXNwYXRjaEV2ZW50KFJFSkVDVElPTl9IQU5ETEVELCBwcm9taXNlLCBzdGF0ZS52YWx1ZSk7XG4gIH0pO1xufTtcblxudmFyIGJpbmQgPSBmdW5jdGlvbiAoZm4sIHByb21pc2UsIHN0YXRlLCB1bndyYXApIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgIGZuKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKTtcbiAgfTtcbn07XG5cbnZhciBpbnRlcm5hbFJlamVjdCA9IGZ1bmN0aW9uIChwcm9taXNlLCBzdGF0ZSwgdmFsdWUsIHVud3JhcCkge1xuICBpZiAoc3RhdGUuZG9uZSkgcmV0dXJuO1xuICBzdGF0ZS5kb25lID0gdHJ1ZTtcbiAgaWYgKHVud3JhcCkgc3RhdGUgPSB1bndyYXA7XG4gIHN0YXRlLnZhbHVlID0gdmFsdWU7XG4gIHN0YXRlLnN0YXRlID0gUkVKRUNURUQ7XG4gIG5vdGlmeShwcm9taXNlLCBzdGF0ZSwgdHJ1ZSk7XG59O1xuXG52YXIgaW50ZXJuYWxSZXNvbHZlID0gZnVuY3Rpb24gKHByb21pc2UsIHN0YXRlLCB2YWx1ZSwgdW53cmFwKSB7XG4gIGlmIChzdGF0ZS5kb25lKSByZXR1cm47XG4gIHN0YXRlLmRvbmUgPSB0cnVlO1xuICBpZiAodW53cmFwKSBzdGF0ZSA9IHVud3JhcDtcbiAgdHJ5IHtcbiAgICBpZiAocHJvbWlzZSA9PT0gdmFsdWUpIHRocm93IFR5cGVFcnJvcihcIlByb21pc2UgY2FuJ3QgYmUgcmVzb2x2ZWQgaXRzZWxmXCIpO1xuICAgIHZhciB0aGVuID0gaXNUaGVuYWJsZSh2YWx1ZSk7XG4gICAgaWYgKHRoZW4pIHtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciB3cmFwcGVyID0geyBkb25lOiBmYWxzZSB9O1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSxcbiAgICAgICAgICAgIGJpbmQoaW50ZXJuYWxSZXNvbHZlLCBwcm9taXNlLCB3cmFwcGVyLCBzdGF0ZSksXG4gICAgICAgICAgICBiaW5kKGludGVybmFsUmVqZWN0LCBwcm9taXNlLCB3cmFwcGVyLCBzdGF0ZSlcbiAgICAgICAgICApO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGludGVybmFsUmVqZWN0KHByb21pc2UsIHdyYXBwZXIsIGVycm9yLCBzdGF0ZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS52YWx1ZSA9IHZhbHVlO1xuICAgICAgc3RhdGUuc3RhdGUgPSBGVUxGSUxMRUQ7XG4gICAgICBub3RpZnkocHJvbWlzZSwgc3RhdGUsIGZhbHNlKTtcbiAgICB9XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgaW50ZXJuYWxSZWplY3QocHJvbWlzZSwgeyBkb25lOiBmYWxzZSB9LCBlcnJvciwgc3RhdGUpO1xuICB9XG59O1xuXG4vLyBjb25zdHJ1Y3RvciBwb2x5ZmlsbFxuaWYgKEZPUkNFRCkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICBQcm9taXNlQ29uc3RydWN0b3IgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCBQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UpO1xuICAgIGFGdW5jdGlvbihleGVjdXRvcik7XG4gICAgSW50ZXJuYWwuY2FsbCh0aGlzKTtcbiAgICB2YXIgc3RhdGUgPSBnZXRJbnRlcm5hbFN0YXRlKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihiaW5kKGludGVybmFsUmVzb2x2ZSwgdGhpcywgc3RhdGUpLCBiaW5kKGludGVybmFsUmVqZWN0LCB0aGlzLCBzdGF0ZSkpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBpbnRlcm5hbFJlamVjdCh0aGlzLCBzdGF0ZSwgZXJyb3IpO1xuICAgIH1cbiAgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIEludGVybmFsID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcikge1xuICAgIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgICAgdHlwZTogUFJPTUlTRSxcbiAgICAgIGRvbmU6IGZhbHNlLFxuICAgICAgbm90aWZpZWQ6IGZhbHNlLFxuICAgICAgcGFyZW50OiBmYWxzZSxcbiAgICAgIHJlYWN0aW9uczogW10sXG4gICAgICByZWplY3Rpb246IGZhbHNlLFxuICAgICAgc3RhdGU6IFBFTkRJTkcsXG4gICAgICB2YWx1ZTogdW5kZWZpbmVkXG4gICAgfSk7XG4gIH07XG4gIEludGVybmFsLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKFByb21pc2VDb25zdHJ1Y3Rvci5wcm90b3R5cGUsIHtcbiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUudGhlbmAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5wcm90b3R5cGUudGhlblxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsUHJvbWlzZVN0YXRlKHRoaXMpO1xuICAgICAgdmFyIHJlYWN0aW9uID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsIFByb21pc2VDb25zdHJ1Y3RvcikpO1xuICAgICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBJU19OT0RFID8gcHJvY2Vzcy5kb21haW4gOiB1bmRlZmluZWQ7XG4gICAgICBzdGF0ZS5wYXJlbnQgPSB0cnVlO1xuICAgICAgc3RhdGUucmVhY3Rpb25zLnB1c2gocmVhY3Rpb24pO1xuICAgICAgaWYgKHN0YXRlLnN0YXRlICE9IFBFTkRJTkcpIG5vdGlmeSh0aGlzLCBzdGF0ZSwgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyBgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2hgIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucHJvdG90eXBlLmNhdGNoXG4gICAgJ2NhdGNoJzogZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBPd25Qcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcHJvbWlzZSA9IG5ldyBJbnRlcm5hbCgpO1xuICAgIHZhciBzdGF0ZSA9IGdldEludGVybmFsU3RhdGUocHJvbWlzZSk7XG4gICAgdGhpcy5wcm9taXNlID0gcHJvbWlzZTtcbiAgICB0aGlzLnJlc29sdmUgPSBiaW5kKGludGVybmFsUmVzb2x2ZSwgcHJvbWlzZSwgc3RhdGUpO1xuICAgIHRoaXMucmVqZWN0ID0gYmluZChpbnRlcm5hbFJlamVjdCwgcHJvbWlzZSwgc3RhdGUpO1xuICB9O1xuICBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoQykge1xuICAgIHJldHVybiBDID09PSBQcm9taXNlQ29uc3RydWN0b3IgfHwgQyA9PT0gUHJvbWlzZVdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcblxuICAvLyB3cmFwIGZldGNoIHJlc3VsdFxuICBpZiAoIUlTX1BVUkUgJiYgdHlwZW9mICRmZXRjaCA9PSAnZnVuY3Rpb24nKSAkKHsgZ2xvYmFsOiB0cnVlLCBlbnVtZXJhYmxlOiB0cnVlLCBmb3JjZWQ6IHRydWUgfSwge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIGZldGNoOiBmdW5jdGlvbiBmZXRjaChpbnB1dCkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKFByb21pc2VDb25zdHJ1Y3RvciwgJGZldGNoLmFwcGx5KGdsb2JhbCwgYXJndW1lbnRzKSk7XG4gICAgfVxuICB9KTtcbn1cblxuJCh7IGdsb2JhbDogdHJ1ZSwgd3JhcDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICBQcm9taXNlOiBQcm9taXNlQ29uc3RydWN0b3Jcbn0pO1xuXG5zZXRUb1N0cmluZ1RhZyhQcm9taXNlQ29uc3RydWN0b3IsIFBST01JU0UsIGZhbHNlLCB0cnVlKTtcbnNldFNwZWNpZXMoUFJPTUlTRSk7XG5cblByb21pc2VXcmFwcGVyID0gcGF0aFtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJCh7IHRhcmdldDogUFJPTUlTRSwgc3RhdDogdHJ1ZSwgZm9yY2VkOiBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZWplY3RgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLnJlamVjdFxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKSB7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSh0aGlzKTtcbiAgICBjYXBhYmlsaXR5LnJlamVjdC5jYWxsKHVuZGVmaW5lZCwgcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG5cbiQoeyB0YXJnZXQ6IFBST01JU0UsIHN0YXQ6IHRydWUsIGZvcmNlZDogSVNfUFVSRSB8fCBGT1JDRUQgfSwge1xuICAvLyBgUHJvbWlzZS5yZXNvbHZlYCBtZXRob2RcbiAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcHJvbWlzZS5yZXNvbHZlXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoeCkge1xuICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShJU19QVVJFICYmIHRoaXMgPT09IFByb21pc2VXcmFwcGVyID8gUHJvbWlzZUNvbnN0cnVjdG9yIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuXG4kKHsgdGFyZ2V0OiBQUk9NSVNFLCBzdGF0OiB0cnVlLCBmb3JjZWQ6IElOQ09SUkVDVF9JVEVSQVRJT04gfSwge1xuICAvLyBgUHJvbWlzZS5hbGxgIG1ldGhvZFxuICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1wcm9taXNlLmFsbFxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgJHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbaW5kZXhdID0gdmFsdWU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gYFByb21pc2UucmFjZWAgbWV0aG9kXG4gIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXByb21pc2UucmFjZVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoQyk7XG4gICAgdmFyIHJlamVjdCA9IGNhcGFiaWxpdHkucmVqZWN0O1xuICAgIHZhciByZXN1bHQgPSBwZXJmb3JtKGZ1bmN0aW9uICgpIHtcbiAgICAgIHZhciAkcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgICRwcm9taXNlUmVzb2x2ZS5jYWxsKEMsIHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciB2YWxpZGF0ZUFyZ3VtZW50cyA9IHJlcXVpcmUoJy4uL2ludGVybmFscy92YWxpZGF0ZS1zdHJpbmctbWV0aG9kLWFyZ3VtZW50cycpO1xudmFyIGNvcnJlY3RJc1JlZ0V4cExvZ2ljID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2NvcnJlY3QtaXMtcmVnZXhwLWxvZ2ljJyk7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlLmluY2x1ZGVzYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXNcbiQoeyB0YXJnZXQ6ICdTdHJpbmcnLCBwcm90bzogdHJ1ZSwgZm9yY2VkOiAhY29ycmVjdElzUmVnRXhwTG9naWMoJ2luY2x1ZGVzJykgfSwge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoU3RyaW5nIC8qICwgcG9zaXRpb24gPSAwICovKSB7XG4gICAgcmV0dXJuICEhfnZhbGlkYXRlQXJndW1lbnRzKHRoaXMsIHNlYXJjaFN0cmluZywgJ2luY2x1ZGVzJylcbiAgICAgIC5pbmRleE9mKHNlYXJjaFN0cmluZywgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjb2RlUG9pbnRBdCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9zdHJpbmctYXQnKTtcbnZhciBJbnRlcm5hbFN0YXRlTW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2ludGVybmFsLXN0YXRlJyk7XG52YXIgZGVmaW5lSXRlcmF0b3IgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLWl0ZXJhdG9yJyk7XG5cbnZhciBTVFJJTkdfSVRFUkFUT1IgPSAnU3RyaW5nIEl0ZXJhdG9yJztcbnZhciBzZXRJbnRlcm5hbFN0YXRlID0gSW50ZXJuYWxTdGF0ZU1vZHVsZS5zZXQ7XG52YXIgZ2V0SW50ZXJuYWxTdGF0ZSA9IEludGVybmFsU3RhdGVNb2R1bGUuZ2V0dGVyRm9yKFNUUklOR19JVEVSQVRPUik7XG5cbi8vIGBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdYCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXN0cmluZy5wcm90b3R5cGUtQEBpdGVyYXRvclxuZGVmaW5lSXRlcmF0b3IoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24gKGl0ZXJhdGVkKSB7XG4gIHNldEludGVybmFsU3RhdGUodGhpcywge1xuICAgIHR5cGU6IFNUUklOR19JVEVSQVRPUixcbiAgICBzdHJpbmc6IFN0cmluZyhpdGVyYXRlZCksXG4gICAgaW5kZXg6IDBcbiAgfSk7XG4vLyBgJVN0cmluZ0l0ZXJhdG9yUHJvdG90eXBlJS5uZXh0YCBtZXRob2Rcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLSVzdHJpbmdpdGVyYXRvcnByb3RvdHlwZSUubmV4dFxufSwgZnVuY3Rpb24gbmV4dCgpIHtcbiAgdmFyIHN0YXRlID0gZ2V0SW50ZXJuYWxTdGF0ZSh0aGlzKTtcbiAgdmFyIHN0cmluZyA9IHN0YXRlLnN0cmluZztcbiAgdmFyIGluZGV4ID0gc3RhdGUuaW5kZXg7XG4gIHZhciBwb2ludDtcbiAgaWYgKGluZGV4ID49IHN0cmluZy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSBjb2RlUG9pbnRBdChzdHJpbmcsIGluZGV4LCB0cnVlKTtcbiAgc3RhdGUuaW5kZXggKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4geyB2YWx1ZTogcG9pbnQsIGRvbmU6IGZhbHNlIH07XG59KTtcbiIsInZhciBkZWZpbmVXZWxsS25vd25TeW1ib2wgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZGVmaW5lLXdlbGwta25vd24tc3ltYm9sJyk7XG5cbi8vIGBTeW1ib2wuaXRlcmF0b3JgIHdlbGwta25vd24gc3ltYm9sXG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zeW1ib2wuaXRlcmF0b3JcbmRlZmluZVdlbGxLbm93blN5bWJvbCgnaXRlcmF0b3InKTtcbiIsInZhciAkID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2V4cG9ydCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL29iamVjdC1nZXQtcHJvdG90eXBlLW9mJyk7XG52YXIgc2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LXNldC1wcm90b3R5cGUtb2YnKTtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvb2JqZWN0LWNyZWF0ZScpO1xudmFyIGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9jcmVhdGUtcHJvcGVydHktZGVzY3JpcHRvcicpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xuXG52YXIgJEFnZ3JlZ2F0ZUVycm9yID0gZnVuY3Rpb24gQWdncmVnYXRlRXJyb3IoZXJyb3JzLCBtZXNzYWdlKSB7XG4gIHZhciB0aGF0ID0gdGhpcztcbiAgaWYgKCEodGhhdCBpbnN0YW5jZW9mICRBZ2dyZWdhdGVFcnJvcikpIHJldHVybiBuZXcgJEFnZ3JlZ2F0ZUVycm9yKGVycm9ycywgbWVzc2FnZSk7XG4gIGlmIChzZXRQcm90b3R5cGVPZikge1xuICAgIHRoYXQgPSBzZXRQcm90b3R5cGVPZihuZXcgRXJyb3IobWVzc2FnZSksIGdldFByb3RvdHlwZU9mKHRoYXQpKTtcbiAgfVxuICB2YXIgZXJyb3JzQXJyYXkgPSBbXTtcbiAgaXRlcmF0ZShlcnJvcnMsIGVycm9yc0FycmF5LnB1c2gsIGVycm9yc0FycmF5KTtcbiAgdGhhdC5lcnJvcnMgPSBlcnJvcnNBcnJheTtcbiAgaWYgKG1lc3NhZ2UgIT09IHVuZGVmaW5lZCkgaGlkZSh0aGF0LCAnbWVzc2FnZScsIFN0cmluZyhtZXNzYWdlKSk7XG4gIHJldHVybiB0aGF0O1xufTtcblxuJEFnZ3JlZ2F0ZUVycm9yLnByb3RvdHlwZSA9IGNyZWF0ZShFcnJvci5wcm90b3R5cGUsIHtcbiAgY29uc3RydWN0b3I6IGNyZWF0ZVByb3BlcnR5RGVzY3JpcHRvcig1LCAkQWdncmVnYXRlRXJyb3IpLFxuICBuYW1lOiBjcmVhdGVQcm9wZXJ0eURlc2NyaXB0b3IoNSwgJ0FnZ3JlZ2F0ZUVycm9yJylcbn0pO1xuXG4kKHsgZ2xvYmFsOiB0cnVlIH0sIHtcbiAgQWdncmVnYXRlRXJyb3I6ICRBZ2dyZWdhdGVFcnJvclxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL3BlcmZvcm0nKTtcbnZhciBpdGVyYXRlID0gcmVxdWlyZSgnLi4vaW50ZXJuYWxzL2l0ZXJhdGUnKTtcblxuLy8gYFByb21pc2UuYWxsU2V0dGxlZGAgbWV0aG9kXG4vLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1wcm9taXNlLWFsbFNldHRsZWRcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGFsbFNldHRsZWQ6IGZ1bmN0aW9uIGFsbFNldHRsZWQoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZS5mKEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgcHJvbWlzZVJlc29sdmUgPSBhRnVuY3Rpb24oQy5yZXNvbHZlKTtcbiAgICAgIHZhciB2YWx1ZXMgPSBbXTtcbiAgICAgIHZhciBjb3VudGVyID0gMDtcbiAgICAgIHZhciByZW1haW5pbmcgPSAxO1xuICAgICAgaXRlcmF0ZShpdGVyYWJsZSwgZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgICAgICAgdmFyIGluZGV4ID0gY291bnRlcisrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAnZnVsZmlsbGVkJywgdmFsdWU6IHZhbHVlIH07XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgICAgICB9LCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5Q2FsbGVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzW2luZGV4XSA9IHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGUgfTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4gICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgfSk7XG4gICAgaWYgKHJlc3VsdC5lcnJvcikgcmVqZWN0KHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9leHBvcnQnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvYS1mdW5jdGlvbicpO1xudmFyIGdldEJ1aWx0SW4gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZ2V0LWJ1aWx0LWluJyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xudmFyIGl0ZXJhdGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaXRlcmF0ZScpO1xuXG52YXIgUFJPTUlTRV9BTllfRVJST1IgPSAnTm8gb25lIHByb21pc2UgcmVzb2x2ZWQnO1xuXG4vLyBgUHJvbWlzZS5hbnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS1hbnlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gIGFueTogZnVuY3Rpb24gYW55KGl0ZXJhYmxlKSB7XG4gICAgdmFyIEMgPSB0aGlzO1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUuZihDKTtcbiAgICB2YXIgcmVzb2x2ZSA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgdmFyIHByb21pc2VSZXNvbHZlID0gYUZ1bmN0aW9uKEMucmVzb2x2ZSk7XG4gICAgICB2YXIgZXJyb3JzID0gW107XG4gICAgICB2YXIgY291bnRlciA9IDA7XG4gICAgICB2YXIgcmVtYWluaW5nID0gMTtcbiAgICAgIHZhciBhbHJlYWR5UmVzb2x2ZWQgPSBmYWxzZTtcbiAgICAgIGl0ZXJhdGUoaXRlcmFibGUsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciBpbmRleCA9IGNvdW50ZXIrKztcbiAgICAgICAgdmFyIGFscmVhZHlSZWplY3RlZCA9IGZhbHNlO1xuICAgICAgICBlcnJvcnMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgcHJvbWlzZVJlc29sdmUuY2FsbChDLCBwcm9taXNlKS50aGVuKGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgIGlmIChhbHJlYWR5UmVqZWN0ZWQgfHwgYWxyZWFkeVJlc29sdmVkKSByZXR1cm47XG4gICAgICAgICAgYWxyZWFkeVJlc29sdmVkID0gdHJ1ZTtcbiAgICAgICAgICByZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgfSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICBpZiAoYWxyZWFkeVJlamVjdGVkIHx8IGFscmVhZHlSZXNvbHZlZCkgcmV0dXJuO1xuICAgICAgICAgIGFscmVhZHlSZWplY3RlZCA9IHRydWU7XG4gICAgICAgICAgZXJyb3JzW2luZGV4XSA9IGU7XG4gICAgICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyAoZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKSkoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgICAgICB9KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVqZWN0KG5ldyAoZ2V0QnVpbHRJbignQWdncmVnYXRlRXJyb3InKSkoZXJyb3JzLCBQUk9NSVNFX0FOWV9FUlJPUikpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZXJyb3IpIHJlamVjdChyZXN1bHQudmFsdWUpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICQgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZXhwb3J0Jyk7XG52YXIgbmV3UHJvbWlzZUNhcGFiaWxpdHlNb2R1bGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvcGVyZm9ybScpO1xuXG4vLyBgUHJvbWlzZS50cnlgIG1ldGhvZFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtcHJvbWlzZS10cnlcbiQoeyB0YXJnZXQ6ICdQcm9taXNlJywgc3RhdDogdHJ1ZSB9LCB7XG4gICd0cnknOiBmdW5jdGlvbiAoY2FsbGJhY2tmbikge1xuICAgIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYodGhpcyk7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oY2FsbGJhY2tmbik7XG4gICAgKHJlc3VsdC5lcnJvciA/IHByb21pc2VDYXBhYmlsaXR5LnJlamVjdCA6IHByb21pc2VDYXBhYmlsaXR5LnJlc29sdmUpKHJlc3VsdC52YWx1ZSk7XG4gICAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pO1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy9nbG9iYWwnKTtcbnZhciBET01JdGVyYWJsZXMgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvZG9tLWl0ZXJhYmxlcycpO1xudmFyIEFycmF5SXRlcmF0b3JNZXRob2RzID0gcmVxdWlyZSgnLi4vbW9kdWxlcy9lcy5hcnJheS5pdGVyYXRvcicpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuLi9pbnRlcm5hbHMvaGlkZScpO1xudmFyIHdlbGxLbm93blN5bWJvbCA9IHJlcXVpcmUoJy4uL2ludGVybmFscy93ZWxsLWtub3duLXN5bWJvbCcpO1xuXG52YXIgSVRFUkFUT1IgPSB3ZWxsS25vd25TeW1ib2woJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdlbGxLbm93blN5bWJvbCgndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEFycmF5SXRlcmF0b3JNZXRob2RzLnZhbHVlcztcblxuZm9yICh2YXIgQ09MTEVDVElPTl9OQU1FIGluIERPTUl0ZXJhYmxlcykge1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtDT0xMRUNUSU9OX05BTUVdO1xuICB2YXIgQ29sbGVjdGlvblByb3RvdHlwZSA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGU7XG4gIGlmIChDb2xsZWN0aW9uUHJvdG90eXBlKSB7XG4gICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgaWYgKENvbGxlY3Rpb25Qcm90b3R5cGVbSVRFUkFUT1JdICE9PSBBcnJheVZhbHVlcykgdHJ5IHtcbiAgICAgIGhpZGUoQ29sbGVjdGlvblByb3RvdHlwZSwgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgQ29sbGVjdGlvblByb3RvdHlwZVtJVEVSQVRPUl0gPSBBcnJheVZhbHVlcztcbiAgICB9XG4gICAgaWYgKCFDb2xsZWN0aW9uUHJvdG90eXBlW1RPX1NUUklOR19UQUddKSBoaWRlKENvbGxlY3Rpb25Qcm90b3R5cGUsIFRPX1NUUklOR19UQUcsIENPTExFQ1RJT05fTkFNRSk7XG4gICAgaWYgKERPTUl0ZXJhYmxlc1tDT0xMRUNUSU9OX05BTUVdKSBmb3IgKHZhciBNRVRIT0RfTkFNRSBpbiBBcnJheUl0ZXJhdG9yTWV0aG9kcykge1xuICAgICAgLy8gc29tZSBDaHJvbWUgdmVyc2lvbnMgaGF2ZSBub24tY29uZmlndXJhYmxlIG1ldGhvZHMgb24gRE9NVG9rZW5MaXN0XG4gICAgICBpZiAoQ29sbGVjdGlvblByb3RvdHlwZVtNRVRIT0RfTkFNRV0gIT09IEFycmF5SXRlcmF0b3JNZXRob2RzW01FVEhPRF9OQU1FXSkgdHJ5IHtcbiAgICAgICAgaGlkZShDb2xsZWN0aW9uUHJvdG90eXBlLCBNRVRIT0RfTkFNRSwgQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIENvbGxlY3Rpb25Qcm90b3R5cGVbTUVUSE9EX05BTUVdID0gQXJyYXlJdGVyYXRvck1ldGhvZHNbTUVUSE9EX05BTUVdO1xuICAgICAgfVxuICAgIH1cbiAgfVxufVxuIiwiLyoqXG4gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICpcbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBXM0MgU09GVFdBUkUgQU5EIERPQ1VNRU5UIE5PVElDRSBBTkQgTElDRU5TRS5cbiAqXG4gKiAgaHR0cHM6Ly93d3cudzMub3JnL0NvbnNvcnRpdW0vTGVnYWwvMjAxNS9jb3B5cmlnaHQtc29mdHdhcmUtYW5kLWRvY3VtZW50XG4gKlxuICovXG4oZnVuY3Rpb24oKSB7XG4ndXNlIHN0cmljdCc7XG5cbi8vIEV4aXQgZWFybHkgaWYgd2UncmUgbm90IHJ1bm5pbmcgaW4gYSBicm93c2VyLlxuaWYgKHR5cGVvZiB3aW5kb3cgIT09ICdvYmplY3QnKSB7XG4gIHJldHVybjtcbn1cblxuLy8gRXhpdCBlYXJseSBpZiBhbGwgSW50ZXJzZWN0aW9uT2JzZXJ2ZXIgYW5kIEludGVyc2VjdGlvbk9ic2VydmVyRW50cnlcbi8vIGZlYXR1cmVzIGFyZSBuYXRpdmVseSBzdXBwb3J0ZWQuXG5pZiAoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyBpbiB3aW5kb3cgJiZcbiAgICAnSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeScgaW4gd2luZG93ICYmXG4gICAgJ2ludGVyc2VjdGlvblJhdGlvJyBpbiB3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeS5wcm90b3R5cGUpIHtcblxuICAvLyBNaW5pbWFsIHBvbHlmaWxsIGZvciBFZGdlIDE1J3MgbGFjayBvZiBgaXNJbnRlcnNlY3RpbmdgXG4gIC8vIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL3czYy9JbnRlcnNlY3Rpb25PYnNlcnZlci9pc3N1ZXMvMjExXG4gIGlmICghKCdpc0ludGVyc2VjdGluZycgaW4gd2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyRW50cnkucHJvdG90eXBlKSkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeS5wcm90b3R5cGUsXG4gICAgICAnaXNJbnRlcnNlY3RpbmcnLCB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaW50ZXJzZWN0aW9uUmF0aW8gPiAwO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG4gIHJldHVybjtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBlbWJlZGRpbmcgZnJhbWUgZWxlbWVudCwgaWYgYW55LlxuICogQHBhcmFtIHshRG9jdW1lbnR9IGRvY1xuICogQHJldHVybiB7IUVsZW1lbnR9XG4gKi9cbmZ1bmN0aW9uIGdldEZyYW1lRWxlbWVudChkb2MpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZG9jLmRlZmF1bHRWaWV3ICYmIGRvYy5kZWZhdWx0Vmlldy5mcmFtZUVsZW1lbnQgfHwgbnVsbDtcbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElnbm9yZSB0aGUgZXJyb3IuXG4gICAgcmV0dXJuIG51bGw7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGxvY2FsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBkb2N1bWVudC5cbiAqL1xudmFyIGRvY3VtZW50ID0gKGZ1bmN0aW9uKHN0YXJ0RG9jKSB7XG4gIHZhciBkb2MgPSBzdGFydERvYztcbiAgdmFyIGZyYW1lID0gZ2V0RnJhbWVFbGVtZW50KGRvYyk7XG4gIHdoaWxlIChmcmFtZSkge1xuICAgIGRvYyA9IGZyYW1lLm93bmVyRG9jdW1lbnQ7XG4gICAgZnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoZG9jKTtcbiAgfVxuICByZXR1cm4gZG9jO1xufSkod2luZG93LmRvY3VtZW50KTtcblxuLyoqXG4gKiBBbiBJbnRlcnNlY3Rpb25PYnNlcnZlciByZWdpc3RyeS4gVGhpcyByZWdpc3RyeSBleGlzdHMgdG8gaG9sZCBhIHN0cm9uZ1xuICogcmVmZXJlbmNlIHRvIEludGVyc2VjdGlvbk9ic2VydmVyIGluc3RhbmNlcyBjdXJyZW50bHkgb2JzZXJ2aW5nIGEgdGFyZ2V0XG4gKiBlbGVtZW50LiBXaXRob3V0IHRoaXMgcmVnaXN0cnksIGluc3RhbmNlcyB3aXRob3V0IGFub3RoZXIgcmVmZXJlbmNlIG1heSBiZVxuICogZ2FyYmFnZSBjb2xsZWN0ZWQuXG4gKi9cbnZhciByZWdpc3RyeSA9IFtdO1xuXG4vKipcbiAqIFRoZSBzaWduYWwgdXBkYXRlciBmb3IgY3Jvc3Mtb3JpZ2luIGludGVyc2VjdGlvbi4gV2hlbiBub3QgbnVsbCwgaXQgbWVhbnNcbiAqIHRoYXQgdGhlIHBvbHlmaWxsIGlzIGNvbmZpZ3VyZWQgdG8gd29yayBpbiBhIGNyb3NzLW9yaWdpbiBtb2RlLlxuICogQHR5cGUge2Z1bmN0aW9uKERPTVJlY3R8Q2xpZW50UmVjdCwgRE9NUmVjdHxDbGllbnRSZWN0KX1cbiAqL1xudmFyIGNyb3NzT3JpZ2luVXBkYXRlciA9IG51bGw7XG5cbi8qKlxuICogVGhlIGN1cnJlbnQgY3Jvc3Mtb3JpZ2luIGludGVyc2VjdGlvbi4gT25seSB1c2VkIGluIHRoZSBjcm9zcy1vcmlnaW4gbW9kZS5cbiAqIEB0eXBlIHtET01SZWN0fENsaWVudFJlY3R9XG4gKi9cbnZhciBjcm9zc09yaWdpblJlY3QgPSBudWxsO1xuXG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgZ2xvYmFsIEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkgY29uc3RydWN0b3IuXG4gKiBodHRwczovL3czYy5naXRodWIuaW8vSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvI2ludGVyc2VjdGlvbi1vYnNlcnZlci1lbnRyeVxuICogQHBhcmFtIHtPYmplY3R9IGVudHJ5IEEgZGljdGlvbmFyeSBvZiBpbnN0YW5jZSBwcm9wZXJ0aWVzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIEludGVyc2VjdGlvbk9ic2VydmVyRW50cnkoZW50cnkpIHtcbiAgdGhpcy50aW1lID0gZW50cnkudGltZTtcbiAgdGhpcy50YXJnZXQgPSBlbnRyeS50YXJnZXQ7XG4gIHRoaXMucm9vdEJvdW5kcyA9IGVuc3VyZURPTVJlY3QoZW50cnkucm9vdEJvdW5kcyk7XG4gIHRoaXMuYm91bmRpbmdDbGllbnRSZWN0ID0gZW5zdXJlRE9NUmVjdChlbnRyeS5ib3VuZGluZ0NsaWVudFJlY3QpO1xuICB0aGlzLmludGVyc2VjdGlvblJlY3QgPSBlbnN1cmVET01SZWN0KGVudHJ5LmludGVyc2VjdGlvblJlY3QgfHwgZ2V0RW1wdHlSZWN0KCkpO1xuICB0aGlzLmlzSW50ZXJzZWN0aW5nID0gISFlbnRyeS5pbnRlcnNlY3Rpb25SZWN0O1xuXG4gIC8vIENhbGN1bGF0ZXMgdGhlIGludGVyc2VjdGlvbiByYXRpby5cbiAgdmFyIHRhcmdldFJlY3QgPSB0aGlzLmJvdW5kaW5nQ2xpZW50UmVjdDtcbiAgdmFyIHRhcmdldEFyZWEgPSB0YXJnZXRSZWN0LndpZHRoICogdGFyZ2V0UmVjdC5oZWlnaHQ7XG4gIHZhciBpbnRlcnNlY3Rpb25SZWN0ID0gdGhpcy5pbnRlcnNlY3Rpb25SZWN0O1xuICB2YXIgaW50ZXJzZWN0aW9uQXJlYSA9IGludGVyc2VjdGlvblJlY3Qud2lkdGggKiBpbnRlcnNlY3Rpb25SZWN0LmhlaWdodDtcblxuICAvLyBTZXRzIGludGVyc2VjdGlvbiByYXRpby5cbiAgaWYgKHRhcmdldEFyZWEpIHtcbiAgICAvLyBSb3VuZCB0aGUgaW50ZXJzZWN0aW9uIHJhdGlvIHRvIGF2b2lkIGZsb2F0aW5nIHBvaW50IG1hdGggaXNzdWVzOlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvaXNzdWVzLzMyNFxuICAgIHRoaXMuaW50ZXJzZWN0aW9uUmF0aW8gPSBOdW1iZXIoKGludGVyc2VjdGlvbkFyZWEgLyB0YXJnZXRBcmVhKS50b0ZpeGVkKDQpKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBJZiBhcmVhIGlzIHplcm8gYW5kIGlzIGludGVyc2VjdGluZywgc2V0cyB0byAxLCBvdGhlcndpc2UgdG8gMFxuICAgIHRoaXMuaW50ZXJzZWN0aW9uUmF0aW8gPSB0aGlzLmlzSW50ZXJzZWN0aW5nID8gMSA6IDA7XG4gIH1cbn1cblxuXG4vKipcbiAqIENyZWF0ZXMgdGhlIGdsb2JhbCBJbnRlcnNlY3Rpb25PYnNlcnZlciBjb25zdHJ1Y3Rvci5cbiAqIGh0dHBzOi8vdzNjLmdpdGh1Yi5pby9JbnRlcnNlY3Rpb25PYnNlcnZlci8jaW50ZXJzZWN0aW9uLW9ic2VydmVyLWludGVyZmFjZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYWZ0ZXIgaW50ZXJzZWN0aW9uXG4gKiAgICAgY2hhbmdlcyBoYXZlIHF1ZXVlZC4gVGhlIGZ1bmN0aW9uIGlzIG5vdCBpbnZva2VkIGlmIHRoZSBxdWV1ZSBoYXNcbiAqICAgICBiZWVuIGVtcHRpZWQgYnkgY2FsbGluZyB0aGUgYHRha2VSZWNvcmRzYCBtZXRob2QuXG4gKiBAcGFyYW0ge09iamVjdD19IG9wdF9vcHRpb25zIE9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy5cbiAqIEBjb25zdHJ1Y3RvclxuICovXG5mdW5jdGlvbiBJbnRlcnNlY3Rpb25PYnNlcnZlcihjYWxsYmFjaywgb3B0X29wdGlvbnMpIHtcblxuICB2YXIgb3B0aW9ucyA9IG9wdF9vcHRpb25zIHx8IHt9O1xuXG4gIGlmICh0eXBlb2YgY2FsbGJhY2sgIT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAob3B0aW9ucy5yb290ICYmIG9wdGlvbnMucm9vdC5ub2RlVHlwZSAhPSAxKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdyb290IG11c3QgYmUgYW4gRWxlbWVudCcpO1xuICB9XG5cbiAgLy8gQmluZHMgYW5kIHRocm90dGxlcyBgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zYC5cbiAgdGhpcy5fY2hlY2tGb3JJbnRlcnNlY3Rpb25zID0gdGhyb3R0bGUoXG4gICAgICB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMuYmluZCh0aGlzKSwgdGhpcy5USFJPVFRMRV9USU1FT1VUKTtcblxuICAvLyBQcml2YXRlIHByb3BlcnRpZXMuXG4gIHRoaXMuX2NhbGxiYWNrID0gY2FsbGJhY2s7XG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cyA9IFtdO1xuICB0aGlzLl9xdWV1ZWRFbnRyaWVzID0gW107XG4gIHRoaXMuX3Jvb3RNYXJnaW5WYWx1ZXMgPSB0aGlzLl9wYXJzZVJvb3RNYXJnaW4ob3B0aW9ucy5yb290TWFyZ2luKTtcblxuICAvLyBQdWJsaWMgcHJvcGVydGllcy5cbiAgdGhpcy50aHJlc2hvbGRzID0gdGhpcy5faW5pdFRocmVzaG9sZHMob3B0aW9ucy50aHJlc2hvbGQpO1xuICB0aGlzLnJvb3QgPSBvcHRpb25zLnJvb3QgfHwgbnVsbDtcbiAgdGhpcy5yb290TWFyZ2luID0gdGhpcy5fcm9vdE1hcmdpblZhbHVlcy5tYXAoZnVuY3Rpb24obWFyZ2luKSB7XG4gICAgcmV0dXJuIG1hcmdpbi52YWx1ZSArIG1hcmdpbi51bml0O1xuICB9KS5qb2luKCcgJyk7XG5cbiAgLyoqIEBwcml2YXRlIEBjb25zdCB7IUFycmF5PCFEb2N1bWVudD59ICovXG4gIHRoaXMuX21vbml0b3JpbmdEb2N1bWVudHMgPSBbXTtcbiAgLyoqIEBwcml2YXRlIEBjb25zdCB7IUFycmF5PGZ1bmN0aW9uKCk+fSAqL1xuICB0aGlzLl9tb25pdG9yaW5nVW5zdWJzY3JpYmVzID0gW107XG59XG5cblxuLyoqXG4gKiBUaGUgbWluaW11bSBpbnRlcnZhbCB3aXRoaW4gd2hpY2ggdGhlIGRvY3VtZW50IHdpbGwgYmUgY2hlY2tlZCBmb3JcbiAqIGludGVyc2VjdGlvbiBjaGFuZ2VzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuVEhST1RUTEVfVElNRU9VVCA9IDEwMDtcblxuXG4vKipcbiAqIFRoZSBmcmVxdWVuY3kgaW4gd2hpY2ggdGhlIHBvbHlmaWxsIHBvbGxzIGZvciBpbnRlcnNlY3Rpb24gY2hhbmdlcy5cbiAqIHRoaXMgY2FuIGJlIHVwZGF0ZWQgb24gYSBwZXIgaW5zdGFuY2UgYmFzaXMgYW5kIG11c3QgYmUgc2V0IHByaW9yIHRvXG4gKiBjYWxsaW5nIGBvYnNlcnZlYCBvbiB0aGUgZmlyc3QgdGFyZ2V0LlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuUE9MTF9JTlRFUlZBTCA9IG51bGw7XG5cbi8qKlxuICogVXNlIGEgbXV0YXRpb24gb2JzZXJ2ZXIgb24gdGhlIHJvb3QgZWxlbWVudFxuICogdG8gZGV0ZWN0IGludGVyc2VjdGlvbiBjaGFuZ2VzLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuVVNFX01VVEFUSU9OX09CU0VSVkVSID0gdHJ1ZTtcblxuXG4vKipcbiAqIFNldHMgdXAgdGhlIHBvbHlmaWxsIGluIHRoZSBjcm9zcy1vcmlnaW4gbW9kZS4gVGhlIHJlc3VsdCBpcyB0aGVcbiAqIHVwZGF0ZXIgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHR3byBhcmd1bWVudHM6IGBib3VuZGluZ0NsaWVudFJlY3RgIGFuZFxuICogYGludGVyc2VjdGlvblJlY3RgIC0ganVzdCBhcyB0aGVzZSBmaWVsZHMgd291bGQgYmUgYXZhaWxhYmxlIHRvIHRoZVxuICogcGFyZW50IHZpYSBgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeWAuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZFxuICogZWFjaCB0aW1lIHRoZSBpZnJhbWUgcmVjZWl2ZXMgaW50ZXJzZWN0aW9uIGluZm9ybWF0aW9uIGZyb20gdGhlIHBhcmVudFxuICogd2luZG93LCBlLmcuIHZpYSBtZXNzYWdpbmcuXG4gKiBAcmV0dXJuIHtmdW5jdGlvbihET01SZWN0fENsaWVudFJlY3QsIERPTVJlY3R8Q2xpZW50UmVjdCl9XG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLl9zZXR1cENyb3NzT3JpZ2luVXBkYXRlciA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIWNyb3NzT3JpZ2luVXBkYXRlcikge1xuICAgIC8qKlxuICAgICAqIEBwYXJhbSB7RE9NUmVjdHxDbGllbnRSZWN0fSBib3VuZGluZ0NsaWVudFJlY3RcbiAgICAgKiBAcGFyYW0ge0RPTVJlY3R8Q2xpZW50UmVjdH0gaW50ZXJzZWN0aW9uUmVjdFxuICAgICAqL1xuICAgIGNyb3NzT3JpZ2luVXBkYXRlciA9IGZ1bmN0aW9uKGJvdW5kaW5nQ2xpZW50UmVjdCwgaW50ZXJzZWN0aW9uUmVjdCkge1xuICAgICAgaWYgKCFib3VuZGluZ0NsaWVudFJlY3QgfHwgIWludGVyc2VjdGlvblJlY3QpIHtcbiAgICAgICAgY3Jvc3NPcmlnaW5SZWN0ID0gZ2V0RW1wdHlSZWN0KCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjcm9zc09yaWdpblJlY3QgPSBjb252ZXJ0RnJvbVBhcmVudFJlY3QoYm91bmRpbmdDbGllbnRSZWN0LCBpbnRlcnNlY3Rpb25SZWN0KTtcbiAgICAgIH1cbiAgICAgIHJlZ2lzdHJ5LmZvckVhY2goZnVuY3Rpb24ob2JzZXJ2ZXIpIHtcbiAgICAgICAgb2JzZXJ2ZXIuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucygpO1xuICAgICAgfSk7XG4gICAgfTtcbiAgfVxuICByZXR1cm4gY3Jvc3NPcmlnaW5VcGRhdGVyO1xufTtcblxuXG4vKipcbiAqIFJlc2V0cyB0aGUgY3Jvc3Mtb3JpZ2luIG1vZGUuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLl9yZXNldENyb3NzT3JpZ2luVXBkYXRlciA9IGZ1bmN0aW9uKCkge1xuICBjcm9zc09yaWdpblVwZGF0ZXIgPSBudWxsO1xuICBjcm9zc09yaWdpblJlY3QgPSBudWxsO1xufTtcblxuXG4vKipcbiAqIFN0YXJ0cyBvYnNlcnZpbmcgYSB0YXJnZXQgZWxlbWVudCBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMgYmFzZWQgb25cbiAqIHRoZSB0aHJlc2hvbGRzIHZhbHVlcy5cbiAqIEBwYXJhbSB7RWxlbWVudH0gdGFyZ2V0IFRoZSBET00gZWxlbWVudCB0byBvYnNlcnZlLlxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUub2JzZXJ2ZSA9IGZ1bmN0aW9uKHRhcmdldCkge1xuICB2YXIgaXNUYXJnZXRBbHJlYWR5T2JzZXJ2ZWQgPSB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMuc29tZShmdW5jdGlvbihpdGVtKSB7XG4gICAgcmV0dXJuIGl0ZW0uZWxlbWVudCA9PSB0YXJnZXQ7XG4gIH0pO1xuXG4gIGlmIChpc1RhcmdldEFscmVhZHlPYnNlcnZlZCkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGlmICghKHRhcmdldCAmJiB0YXJnZXQubm9kZVR5cGUgPT0gMSkpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3RhcmdldCBtdXN0IGJlIGFuIEVsZW1lbnQnKTtcbiAgfVxuXG4gIHRoaXMuX3JlZ2lzdGVySW5zdGFuY2UoKTtcbiAgdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLnB1c2goe2VsZW1lbnQ6IHRhcmdldCwgZW50cnk6IG51bGx9KTtcbiAgdGhpcy5fbW9uaXRvckludGVyc2VjdGlvbnModGFyZ2V0Lm93bmVyRG9jdW1lbnQpO1xuICB0aGlzLl9jaGVja0ZvckludGVyc2VjdGlvbnMoKTtcbn07XG5cblxuLyoqXG4gKiBTdG9wcyBvYnNlcnZpbmcgYSB0YXJnZXQgZWxlbWVudCBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBUaGUgRE9NIGVsZW1lbnQgdG8gb2JzZXJ2ZS5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLnVub2JzZXJ2ZSA9IGZ1bmN0aW9uKHRhcmdldCkge1xuICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMgPVxuICAgICAgdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLmZpbHRlcihmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHJldHVybiBpdGVtLmVsZW1lbnQgIT0gdGFyZ2V0O1xuICAgICAgfSk7XG4gIHRoaXMuX3VubW9uaXRvckludGVyc2VjdGlvbnModGFyZ2V0Lm93bmVyRG9jdW1lbnQpO1xuICBpZiAodGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLmxlbmd0aCA9PSAwKSB7XG4gICAgdGhpcy5fdW5yZWdpc3Rlckluc3RhbmNlKCk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBTdG9wcyBvYnNlcnZpbmcgYWxsIHRhcmdldCBlbGVtZW50cyBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5kaXNjb25uZWN0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuX29ic2VydmF0aW9uVGFyZ2V0cyA9IFtdO1xuICB0aGlzLl91bm1vbml0b3JBbGxJbnRlcnNlY3Rpb25zKCk7XG4gIHRoaXMuX3VucmVnaXN0ZXJJbnN0YW5jZSgpO1xufTtcblxuXG4vKipcbiAqIFJldHVybnMgYW55IHF1ZXVlIGVudHJpZXMgdGhhdCBoYXZlIG5vdCB5ZXQgYmVlbiByZXBvcnRlZCB0byB0aGVcbiAqIGNhbGxiYWNrIGFuZCBjbGVhcnMgdGhlIHF1ZXVlLiBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlXG4gKiBjYWxsYmFjayB0byBvYnRhaW4gdGhlIGFic29sdXRlIG1vc3QgdXAtdG8tZGF0ZSBpbnRlcnNlY3Rpb24gaW5mb3JtYXRpb24uXG4gKiBAcmV0dXJuIHtBcnJheX0gVGhlIGN1cnJlbnRseSBxdWV1ZWQgZW50cmllcy5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLnRha2VSZWNvcmRzID0gZnVuY3Rpb24oKSB7XG4gIHZhciByZWNvcmRzID0gdGhpcy5fcXVldWVkRW50cmllcy5zbGljZSgpO1xuICB0aGlzLl9xdWV1ZWRFbnRyaWVzID0gW107XG4gIHJldHVybiByZWNvcmRzO1xufTtcblxuXG4vKipcbiAqIEFjY2VwdHMgdGhlIHRocmVzaG9sZCB2YWx1ZSBmcm9tIHRoZSB1c2VyIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFuZFxuICogcmV0dXJucyBhIHNvcnRlZCBhcnJheSBvZiB1bmlxdWUgdGhyZXNob2xkIHZhbHVlcy4gSWYgYSB2YWx1ZSBpcyBub3RcbiAqIGJldHdlZW4gMCBhbmQgMSBhbmQgZXJyb3IgaXMgdGhyb3duLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7QXJyYXl8bnVtYmVyPX0gb3B0X3RocmVzaG9sZCBBbiBvcHRpb25hbCB0aHJlc2hvbGQgdmFsdWUgb3JcbiAqICAgICBhIGxpc3Qgb2YgdGhyZXNob2xkIHZhbHVlcywgZGVmYXVsdGluZyB0byBbMF0uXG4gKiBAcmV0dXJuIHtBcnJheX0gQSBzb3J0ZWQgbGlzdCBvZiB1bmlxdWUgYW5kIHZhbGlkIHRocmVzaG9sZCB2YWx1ZXMuXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5faW5pdFRocmVzaG9sZHMgPSBmdW5jdGlvbihvcHRfdGhyZXNob2xkKSB7XG4gIHZhciB0aHJlc2hvbGQgPSBvcHRfdGhyZXNob2xkIHx8IFswXTtcbiAgaWYgKCFBcnJheS5pc0FycmF5KHRocmVzaG9sZCkpIHRocmVzaG9sZCA9IFt0aHJlc2hvbGRdO1xuXG4gIHJldHVybiB0aHJlc2hvbGQuc29ydCgpLmZpbHRlcihmdW5jdGlvbih0LCBpLCBhKSB7XG4gICAgaWYgKHR5cGVvZiB0ICE9ICdudW1iZXInIHx8IGlzTmFOKHQpIHx8IHQgPCAwIHx8IHQgPiAxKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RocmVzaG9sZCBtdXN0IGJlIGEgbnVtYmVyIGJldHdlZW4gMCBhbmQgMSBpbmNsdXNpdmVseScpO1xuICAgIH1cbiAgICByZXR1cm4gdCAhPT0gYVtpIC0gMV07XG4gIH0pO1xufTtcblxuXG4vKipcbiAqIEFjY2VwdHMgdGhlIHJvb3RNYXJnaW4gdmFsdWUgZnJvbSB0aGUgdXNlciBjb25maWd1cmF0aW9uIG9iamVjdFxuICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIGZvdXIgbWFyZ2luIHZhbHVlcyBhcyBhbiBvYmplY3QgY29udGFpbmluZ1xuICogdGhlIHZhbHVlIGFuZCB1bml0IHByb3BlcnRpZXMuIElmIGFueSBvZiB0aGUgdmFsdWVzIGFyZSBub3QgcHJvcGVybHlcbiAqIGZvcm1hdHRlZCBvciB1c2UgYSB1bml0IG90aGVyIHRoYW4gcHggb3IgJSwgYW5kIGVycm9yIGlzIHRocm93bi5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZz19IG9wdF9yb290TWFyZ2luIEFuIG9wdGlvbmFsIHJvb3RNYXJnaW4gdmFsdWUsXG4gKiAgICAgZGVmYXVsdGluZyB0byAnMHB4Jy5cbiAqIEByZXR1cm4ge0FycmF5PE9iamVjdD59IEFuIGFycmF5IG9mIG1hcmdpbiBvYmplY3RzIHdpdGggdGhlIGtleXNcbiAqICAgICB2YWx1ZSBhbmQgdW5pdC5cbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9wYXJzZVJvb3RNYXJnaW4gPSBmdW5jdGlvbihvcHRfcm9vdE1hcmdpbikge1xuICB2YXIgbWFyZ2luU3RyaW5nID0gb3B0X3Jvb3RNYXJnaW4gfHwgJzBweCc7XG4gIHZhciBtYXJnaW5zID0gbWFyZ2luU3RyaW5nLnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uKG1hcmdpbikge1xuICAgIHZhciBwYXJ0cyA9IC9eKC0/XFxkKlxcLj9cXGQrKShweHwlKSQvLmV4ZWMobWFyZ2luKTtcbiAgICBpZiAoIXBhcnRzKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Jvb3RNYXJnaW4gbXVzdCBiZSBzcGVjaWZpZWQgaW4gcGl4ZWxzIG9yIHBlcmNlbnQnKTtcbiAgICB9XG4gICAgcmV0dXJuIHt2YWx1ZTogcGFyc2VGbG9hdChwYXJ0c1sxXSksIHVuaXQ6IHBhcnRzWzJdfTtcbiAgfSk7XG5cbiAgLy8gSGFuZGxlcyBzaG9ydGhhbmQuXG4gIG1hcmdpbnNbMV0gPSBtYXJnaW5zWzFdIHx8IG1hcmdpbnNbMF07XG4gIG1hcmdpbnNbMl0gPSBtYXJnaW5zWzJdIHx8IG1hcmdpbnNbMF07XG4gIG1hcmdpbnNbM10gPSBtYXJnaW5zWzNdIHx8IG1hcmdpbnNbMV07XG5cbiAgcmV0dXJuIG1hcmdpbnM7XG59O1xuXG5cbi8qKlxuICogU3RhcnRzIHBvbGxpbmcgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzIGlmIHRoZSBwb2xsaW5nIGlzIG5vdCBhbHJlYWR5XG4gKiBoYXBwZW5pbmcsIGFuZCBpZiB0aGUgcGFnZSdzIHZpc2liaWxpdHkgc3RhdGUgaXMgdmlzaWJsZS5cbiAqIEBwYXJhbSB7IURvY3VtZW50fSBkb2NcbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fbW9uaXRvckludGVyc2VjdGlvbnMgPSBmdW5jdGlvbihkb2MpIHtcbiAgdmFyIHdpbiA9IGRvYy5kZWZhdWx0VmlldztcbiAgaWYgKCF3aW4pIHtcbiAgICAvLyBBbHJlYWR5IGRlc3Ryb3llZC5cbiAgICByZXR1cm47XG4gIH1cbiAgaWYgKHRoaXMuX21vbml0b3JpbmdEb2N1bWVudHMuaW5kZXhPZihkb2MpICE9IC0xKSB7XG4gICAgLy8gQWxyZWFkeSBtb25pdG9yaW5nLlxuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIFByaXZhdGUgc3RhdGUgZm9yIG1vbml0b3JpbmcuXG4gIHZhciBjYWxsYmFjayA9IHRoaXMuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucztcbiAgdmFyIG1vbml0b3JpbmdJbnRlcnZhbCA9IG51bGw7XG4gIHZhciBkb21PYnNlcnZlciA9IG51bGw7XG5cbiAgLy8gSWYgYSBwb2xsIGludGVydmFsIGlzIHNldCwgdXNlIHBvbGxpbmcgaW5zdGVhZCBvZiBsaXN0ZW5pbmcgdG9cbiAgLy8gcmVzaXplIGFuZCBzY3JvbGwgZXZlbnRzIG9yIERPTSBtdXRhdGlvbnMuXG4gIGlmICh0aGlzLlBPTExfSU5URVJWQUwpIHtcbiAgICBtb25pdG9yaW5nSW50ZXJ2YWwgPSB3aW4uc2V0SW50ZXJ2YWwoY2FsbGJhY2ssIHRoaXMuUE9MTF9JTlRFUlZBTCk7XG4gIH0gZWxzZSB7XG4gICAgYWRkRXZlbnQod2luLCAncmVzaXplJywgY2FsbGJhY2ssIHRydWUpO1xuICAgIGFkZEV2ZW50KGRvYywgJ3Njcm9sbCcsIGNhbGxiYWNrLCB0cnVlKTtcbiAgICBpZiAodGhpcy5VU0VfTVVUQVRJT05fT0JTRVJWRVIgJiYgJ011dGF0aW9uT2JzZXJ2ZXInIGluIHdpbikge1xuICAgICAgZG9tT2JzZXJ2ZXIgPSBuZXcgd2luLk11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgICAgZG9tT2JzZXJ2ZXIub2JzZXJ2ZShkb2MsIHtcbiAgICAgICAgYXR0cmlidXRlczogdHJ1ZSxcbiAgICAgICAgY2hpbGRMaXN0OiB0cnVlLFxuICAgICAgICBjaGFyYWN0ZXJEYXRhOiB0cnVlLFxuICAgICAgICBzdWJ0cmVlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICB0aGlzLl9tb25pdG9yaW5nRG9jdW1lbnRzLnB1c2goZG9jKTtcbiAgdGhpcy5fbW9uaXRvcmluZ1Vuc3Vic2NyaWJlcy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgIC8vIEdldCB0aGUgd2luZG93IG9iamVjdCBhZ2Fpbi4gV2hlbiBhIGZyaWVuZGx5IGlmcmFtZSBpcyBkZXN0cm95ZWQsIGl0XG4gICAgLy8gd2lsbCBiZSBudWxsLlxuICAgIHZhciB3aW4gPSBkb2MuZGVmYXVsdFZpZXc7XG5cbiAgICBpZiAod2luKSB7XG4gICAgICBpZiAobW9uaXRvcmluZ0ludGVydmFsKSB7XG4gICAgICAgIHdpbi5jbGVhckludGVydmFsKG1vbml0b3JpbmdJbnRlcnZhbCk7XG4gICAgICB9XG4gICAgICByZW1vdmVFdmVudCh3aW4sICdyZXNpemUnLCBjYWxsYmFjaywgdHJ1ZSk7XG4gICAgfVxuXG4gICAgcmVtb3ZlRXZlbnQoZG9jLCAnc2Nyb2xsJywgY2FsbGJhY2ssIHRydWUpO1xuICAgIGlmIChkb21PYnNlcnZlcikge1xuICAgICAgZG9tT2JzZXJ2ZXIuZGlzY29ubmVjdCgpO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gQWxzbyBtb25pdG9yIHRoZSBwYXJlbnQuXG4gIGlmIChkb2MgIT0gKHRoaXMucm9vdCAmJiB0aGlzLnJvb3Qub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCkpIHtcbiAgICB2YXIgZnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoZG9jKTtcbiAgICBpZiAoZnJhbWUpIHtcbiAgICAgIHRoaXMuX21vbml0b3JJbnRlcnNlY3Rpb25zKGZyYW1lLm93bmVyRG9jdW1lbnQpO1xuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqIFN0b3BzIHBvbGxpbmcgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzLlxuICogQHBhcmFtIHshRG9jdW1lbnR9IGRvY1xuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl91bm1vbml0b3JJbnRlcnNlY3Rpb25zID0gZnVuY3Rpb24oZG9jKSB7XG4gIHZhciBpbmRleCA9IHRoaXMuX21vbml0b3JpbmdEb2N1bWVudHMuaW5kZXhPZihkb2MpO1xuICBpZiAoaW5kZXggPT0gLTEpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgcm9vdERvYyA9ICh0aGlzLnJvb3QgJiYgdGhpcy5yb290Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQpO1xuXG4gIC8vIENoZWNrIGlmIGFueSBkZXBlbmRlbnQgdGFyZ2V0cyBhcmUgc3RpbGwgcmVtYWluaW5nLlxuICB2YXIgaGFzRGVwZW5kZW50VGFyZ2V0cyA9XG4gICAgICB0aGlzLl9vYnNlcnZhdGlvblRhcmdldHMuc29tZShmdW5jdGlvbihpdGVtKSB7XG4gICAgICAgIHZhciBpdGVtRG9jID0gaXRlbS5lbGVtZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICAgIC8vIFRhcmdldCBpcyBpbiB0aGlzIGNvbnRleHQuXG4gICAgICAgIGlmIChpdGVtRG9jID09IGRvYykge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRhcmdldCBpcyBuZXN0ZWQgaW4gdGhpcyBjb250ZXh0LlxuICAgICAgICB3aGlsZSAoaXRlbURvYyAmJiBpdGVtRG9jICE9IHJvb3REb2MpIHtcbiAgICAgICAgICB2YXIgZnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoaXRlbURvYyk7XG4gICAgICAgICAgaXRlbURvYyA9IGZyYW1lICYmIGZyYW1lLm93bmVyRG9jdW1lbnQ7XG4gICAgICAgICAgaWYgKGl0ZW1Eb2MgPT0gZG9jKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfSk7XG4gIGlmIChoYXNEZXBlbmRlbnRUYXJnZXRzKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gVW5zdWJzY3JpYmUuXG4gIHZhciB1bnN1YnNjcmliZSA9IHRoaXMuX21vbml0b3JpbmdVbnN1YnNjcmliZXNbaW5kZXhdO1xuICB0aGlzLl9tb25pdG9yaW5nRG9jdW1lbnRzLnNwbGljZShpbmRleCwgMSk7XG4gIHRoaXMuX21vbml0b3JpbmdVbnN1YnNjcmliZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgdW5zdWJzY3JpYmUoKTtcblxuICAvLyBBbHNvIHVubW9uaXRvciB0aGUgcGFyZW50LlxuICBpZiAoZG9jICE9IHJvb3REb2MpIHtcbiAgICB2YXIgZnJhbWUgPSBnZXRGcmFtZUVsZW1lbnQoZG9jKTtcbiAgICBpZiAoZnJhbWUpIHtcbiAgICAgIHRoaXMuX3VubW9uaXRvckludGVyc2VjdGlvbnMoZnJhbWUub3duZXJEb2N1bWVudCk7XG4gICAgfVxuICB9XG59O1xuXG5cbi8qKlxuICogU3RvcHMgcG9sbGluZyBmb3IgaW50ZXJzZWN0aW9uIGNoYW5nZXMuXG4gKiBAcGFyYW0geyFEb2N1bWVudH0gZG9jXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX3VubW9uaXRvckFsbEludGVyc2VjdGlvbnMgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHVuc3Vic2NyaWJlcyA9IHRoaXMuX21vbml0b3JpbmdVbnN1YnNjcmliZXMuc2xpY2UoMCk7XG4gIHRoaXMuX21vbml0b3JpbmdEb2N1bWVudHMubGVuZ3RoID0gMDtcbiAgdGhpcy5fbW9uaXRvcmluZ1Vuc3Vic2NyaWJlcy5sZW5ndGggPSAwO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHVuc3Vic2NyaWJlcy5sZW5ndGg7IGkrKykge1xuICAgIHVuc3Vic2NyaWJlc1tpXSgpO1xuICB9XG59O1xuXG5cbi8qKlxuICogU2NhbnMgZWFjaCBvYnNlcnZhdGlvbiB0YXJnZXQgZm9yIGludGVyc2VjdGlvbiBjaGFuZ2VzIGFuZCBhZGRzIHRoZW1cbiAqIHRvIHRoZSBpbnRlcm5hbCBlbnRyaWVzIHF1ZXVlLiBJZiBuZXcgZW50cmllcyBhcmUgZm91bmQsIGl0XG4gKiBzY2hlZHVsZXMgdGhlIGNhbGxiYWNrIHRvIGJlIGludm9rZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2NoZWNrRm9ySW50ZXJzZWN0aW9ucyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoIXRoaXMucm9vdCAmJiBjcm9zc09yaWdpblVwZGF0ZXIgJiYgIWNyb3NzT3JpZ2luUmVjdCkge1xuICAgIC8vIENyb3NzIG9yaWdpbiBtb25pdG9yaW5nLCBidXQgbm8gaW5pdGlhbCBkYXRhIGF2YWlsYWJsZSB5ZXQuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHJvb3RJc0luRG9tID0gdGhpcy5fcm9vdElzSW5Eb20oKTtcbiAgdmFyIHJvb3RSZWN0ID0gcm9vdElzSW5Eb20gPyB0aGlzLl9nZXRSb290UmVjdCgpIDogZ2V0RW1wdHlSZWN0KCk7XG5cbiAgdGhpcy5fb2JzZXJ2YXRpb25UYXJnZXRzLmZvckVhY2goZnVuY3Rpb24oaXRlbSkge1xuICAgIHZhciB0YXJnZXQgPSBpdGVtLmVsZW1lbnQ7XG4gICAgdmFyIHRhcmdldFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGFyZ2V0KTtcbiAgICB2YXIgcm9vdENvbnRhaW5zVGFyZ2V0ID0gdGhpcy5fcm9vdENvbnRhaW5zVGFyZ2V0KHRhcmdldCk7XG4gICAgdmFyIG9sZEVudHJ5ID0gaXRlbS5lbnRyeTtcbiAgICB2YXIgaW50ZXJzZWN0aW9uUmVjdCA9IHJvb3RJc0luRG9tICYmIHJvb3RDb250YWluc1RhcmdldCAmJlxuICAgICAgICB0aGlzLl9jb21wdXRlVGFyZ2V0QW5kUm9vdEludGVyc2VjdGlvbih0YXJnZXQsIHRhcmdldFJlY3QsIHJvb3RSZWN0KTtcblxuICAgIHZhciBuZXdFbnRyeSA9IGl0ZW0uZW50cnkgPSBuZXcgSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSh7XG4gICAgICB0aW1lOiBub3coKSxcbiAgICAgIHRhcmdldDogdGFyZ2V0LFxuICAgICAgYm91bmRpbmdDbGllbnRSZWN0OiB0YXJnZXRSZWN0LFxuICAgICAgcm9vdEJvdW5kczogY3Jvc3NPcmlnaW5VcGRhdGVyICYmICF0aGlzLnJvb3QgPyBudWxsIDogcm9vdFJlY3QsXG4gICAgICBpbnRlcnNlY3Rpb25SZWN0OiBpbnRlcnNlY3Rpb25SZWN0XG4gICAgfSk7XG5cbiAgICBpZiAoIW9sZEVudHJ5KSB7XG4gICAgICB0aGlzLl9xdWV1ZWRFbnRyaWVzLnB1c2gobmV3RW50cnkpO1xuICAgIH0gZWxzZSBpZiAocm9vdElzSW5Eb20gJiYgcm9vdENvbnRhaW5zVGFyZ2V0KSB7XG4gICAgICAvLyBJZiB0aGUgbmV3IGVudHJ5IGludGVyc2VjdGlvbiByYXRpbyBoYXMgY3Jvc3NlZCBhbnkgb2YgdGhlXG4gICAgICAvLyB0aHJlc2hvbGRzLCBhZGQgYSBuZXcgZW50cnkuXG4gICAgICBpZiAodGhpcy5faGFzQ3Jvc3NlZFRocmVzaG9sZChvbGRFbnRyeSwgbmV3RW50cnkpKSB7XG4gICAgICAgIHRoaXMuX3F1ZXVlZEVudHJpZXMucHVzaChuZXdFbnRyeSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIHRoZSByb290IGlzIG5vdCBpbiB0aGUgRE9NIG9yIHRhcmdldCBpcyBub3QgY29udGFpbmVkIHdpdGhpblxuICAgICAgLy8gcm9vdCBidXQgdGhlIHByZXZpb3VzIGVudHJ5IGZvciB0aGlzIHRhcmdldCBoYWQgYW4gaW50ZXJzZWN0aW9uLFxuICAgICAgLy8gYWRkIGEgbmV3IHJlY29yZCBpbmRpY2F0aW5nIHJlbW92YWwuXG4gICAgICBpZiAob2xkRW50cnkgJiYgb2xkRW50cnkuaXNJbnRlcnNlY3RpbmcpIHtcbiAgICAgICAgdGhpcy5fcXVldWVkRW50cmllcy5wdXNoKG5ld0VudHJ5KTtcbiAgICAgIH1cbiAgICB9XG4gIH0sIHRoaXMpO1xuXG4gIGlmICh0aGlzLl9xdWV1ZWRFbnRyaWVzLmxlbmd0aCkge1xuICAgIHRoaXMuX2NhbGxiYWNrKHRoaXMudGFrZVJlY29yZHMoKSwgdGhpcyk7XG4gIH1cbn07XG5cblxuLyoqXG4gKiBBY2NlcHRzIGEgdGFyZ2V0IGFuZCByb290IHJlY3QgY29tcHV0ZXMgdGhlIGludGVyc2VjdGlvbiBiZXR3ZWVuIHRoZW5cbiAqIGZvbGxvd2luZyB0aGUgYWxnb3JpdGhtIGluIHRoZSBzcGVjLlxuICogVE9ETyhwaGlsaXB3YWx0b24pOiBhdCB0aGlzIHRpbWUgY2xpcC1wYXRoIGlzIG5vdCBjb25zaWRlcmVkLlxuICogaHR0cHM6Ly93M2MuZ2l0aHViLmlvL0ludGVyc2VjdGlvbk9ic2VydmVyLyNjYWxjdWxhdGUtaW50ZXJzZWN0aW9uLXJlY3QtYWxnb1xuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXQgVGhlIHRhcmdldCBET00gZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IHRhcmdldFJlY3QgVGhlIGJvdW5kaW5nIHJlY3Qgb2YgdGhlIHRhcmdldC5cbiAqIEBwYXJhbSB7T2JqZWN0fSByb290UmVjdCBUaGUgYm91bmRpbmcgcmVjdCBvZiB0aGUgcm9vdCBhZnRlciBiZWluZ1xuICogICAgIGV4cGFuZGVkIGJ5IHRoZSByb290TWFyZ2luIHZhbHVlLlxuICogQHJldHVybiB7P09iamVjdH0gVGhlIGZpbmFsIGludGVyc2VjdGlvbiByZWN0IG9iamVjdCBvciB1bmRlZmluZWQgaWYgbm9cbiAqICAgICBpbnRlcnNlY3Rpb24gaXMgZm91bmQuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2NvbXB1dGVUYXJnZXRBbmRSb290SW50ZXJzZWN0aW9uID1cbiAgICBmdW5jdGlvbih0YXJnZXQsIHRhcmdldFJlY3QsIHJvb3RSZWN0KSB7XG4gIC8vIElmIHRoZSBlbGVtZW50IGlzbid0IGRpc3BsYXllZCwgYW4gaW50ZXJzZWN0aW9uIGNhbid0IGhhcHBlbi5cbiAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldCkuZGlzcGxheSA9PSAnbm9uZScpIHJldHVybjtcblxuICB2YXIgaW50ZXJzZWN0aW9uUmVjdCA9IHRhcmdldFJlY3Q7XG4gIHZhciBwYXJlbnQgPSBnZXRQYXJlbnROb2RlKHRhcmdldCk7XG4gIHZhciBhdFJvb3QgPSBmYWxzZTtcblxuICB3aGlsZSAoIWF0Um9vdCAmJiBwYXJlbnQpIHtcbiAgICB2YXIgcGFyZW50UmVjdCA9IG51bGw7XG4gICAgdmFyIHBhcmVudENvbXB1dGVkU3R5bGUgPSBwYXJlbnQubm9kZVR5cGUgPT0gMSA/XG4gICAgICAgIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHBhcmVudCkgOiB7fTtcblxuICAgIC8vIElmIHRoZSBwYXJlbnQgaXNuJ3QgZGlzcGxheWVkLCBhbiBpbnRlcnNlY3Rpb24gY2FuJ3QgaGFwcGVuLlxuICAgIGlmIChwYXJlbnRDb21wdXRlZFN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnKSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChwYXJlbnQgPT0gdGhpcy5yb290IHx8IHBhcmVudC5ub2RlVHlwZSA9PSAvKiBET0NVTUVOVCAqLyA5KSB7XG4gICAgICBhdFJvb3QgPSB0cnVlO1xuICAgICAgaWYgKHBhcmVudCA9PSB0aGlzLnJvb3QgfHwgcGFyZW50ID09IGRvY3VtZW50KSB7XG4gICAgICAgIGlmIChjcm9zc09yaWdpblVwZGF0ZXIgJiYgIXRoaXMucm9vdCkge1xuICAgICAgICAgIGlmICghY3Jvc3NPcmlnaW5SZWN0IHx8XG4gICAgICAgICAgICAgIGNyb3NzT3JpZ2luUmVjdC53aWR0aCA9PSAwICYmIGNyb3NzT3JpZ2luUmVjdC5oZWlnaHQgPT0gMCkge1xuICAgICAgICAgICAgLy8gQSAwLXNpemUgY3Jvc3Mtb3JpZ2luIGludGVyc2VjdGlvbiBtZWFucyBuby1pbnRlcnNlY3Rpb24uXG4gICAgICAgICAgICBwYXJlbnQgPSBudWxsO1xuICAgICAgICAgICAgcGFyZW50UmVjdCA9IG51bGw7XG4gICAgICAgICAgICBpbnRlcnNlY3Rpb25SZWN0ID0gbnVsbDtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGFyZW50UmVjdCA9IGNyb3NzT3JpZ2luUmVjdDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50UmVjdCA9IHJvb3RSZWN0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDaGVjayBpZiB0aGVyZSdzIGEgZnJhbWUgdGhhdCBjYW4gYmUgbmF2aWdhdGVkIHRvLlxuICAgICAgICB2YXIgZnJhbWUgPSBnZXRQYXJlbnROb2RlKHBhcmVudCk7XG4gICAgICAgIHZhciBmcmFtZVJlY3QgPSBmcmFtZSAmJiBnZXRCb3VuZGluZ0NsaWVudFJlY3QoZnJhbWUpO1xuICAgICAgICB2YXIgZnJhbWVJbnRlcnNlY3QgPVxuICAgICAgICAgICAgZnJhbWUgJiZcbiAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVUYXJnZXRBbmRSb290SW50ZXJzZWN0aW9uKGZyYW1lLCBmcmFtZVJlY3QsIHJvb3RSZWN0KTtcbiAgICAgICAgaWYgKGZyYW1lUmVjdCAmJiBmcmFtZUludGVyc2VjdCkge1xuICAgICAgICAgIHBhcmVudCA9IGZyYW1lO1xuICAgICAgICAgIHBhcmVudFJlY3QgPSBjb252ZXJ0RnJvbVBhcmVudFJlY3QoZnJhbWVSZWN0LCBmcmFtZUludGVyc2VjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGFyZW50ID0gbnVsbDtcbiAgICAgICAgICBpbnRlcnNlY3Rpb25SZWN0ID0gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBub24tdmlzaWJsZSBvdmVyZmxvdywgYW5kIGl0J3Mgbm90IHRoZSA8Ym9keT5cbiAgICAgIC8vIG9yIDxodG1sPiBlbGVtZW50LCB1cGRhdGUgdGhlIGludGVyc2VjdGlvbiByZWN0LlxuICAgICAgLy8gTm90ZTogPGJvZHk+IGFuZCA8aHRtbD4gY2Fubm90IGJlIGNsaXBwZWQgdG8gYSByZWN0IHRoYXQncyBub3QgYWxzb1xuICAgICAgLy8gdGhlIGRvY3VtZW50IHJlY3QsIHNvIG5vIG5lZWQgdG8gY29tcHV0ZSBhIG5ldyBpbnRlcnNlY3Rpb24uXG4gICAgICB2YXIgZG9jID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7XG4gICAgICBpZiAocGFyZW50ICE9IGRvYy5ib2R5ICYmXG4gICAgICAgICAgcGFyZW50ICE9IGRvYy5kb2N1bWVudEVsZW1lbnQgJiZcbiAgICAgICAgICBwYXJlbnRDb21wdXRlZFN0eWxlLm92ZXJmbG93ICE9ICd2aXNpYmxlJykge1xuICAgICAgICBwYXJlbnRSZWN0ID0gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSWYgZWl0aGVyIG9mIHRoZSBhYm92ZSBjb25kaXRpb25hbHMgc2V0IGEgbmV3IHBhcmVudFJlY3QsXG4gICAgLy8gY2FsY3VsYXRlIG5ldyBpbnRlcnNlY3Rpb24gZGF0YS5cbiAgICBpZiAocGFyZW50UmVjdCkge1xuICAgICAgaW50ZXJzZWN0aW9uUmVjdCA9IGNvbXB1dGVSZWN0SW50ZXJzZWN0aW9uKHBhcmVudFJlY3QsIGludGVyc2VjdGlvblJlY3QpO1xuICAgIH1cbiAgICBpZiAoIWludGVyc2VjdGlvblJlY3QpIGJyZWFrO1xuICAgIHBhcmVudCA9IHBhcmVudCAmJiBnZXRQYXJlbnROb2RlKHBhcmVudCk7XG4gIH1cbiAgcmV0dXJuIGludGVyc2VjdGlvblJlY3Q7XG59O1xuXG5cbi8qKlxuICogUmV0dXJucyB0aGUgcm9vdCByZWN0IGFmdGVyIGJlaW5nIGV4cGFuZGVkIGJ5IHRoZSByb290TWFyZ2luIHZhbHVlLlxuICogQHJldHVybiB7Q2xpZW50UmVjdH0gVGhlIGV4cGFuZGVkIHJvb3QgcmVjdC5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fZ2V0Um9vdFJlY3QgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHJvb3RSZWN0O1xuICBpZiAodGhpcy5yb290KSB7XG4gICAgcm9vdFJlY3QgPSBnZXRCb3VuZGluZ0NsaWVudFJlY3QodGhpcy5yb290KTtcbiAgfSBlbHNlIHtcbiAgICAvLyBVc2UgPGh0bWw+Lzxib2R5PiBpbnN0ZWFkIG9mIHdpbmRvdyBzaW5jZSBzY3JvbGwgYmFycyBhZmZlY3Qgc2l6ZS5cbiAgICB2YXIgaHRtbCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcbiAgICB2YXIgYm9keSA9IGRvY3VtZW50LmJvZHk7XG4gICAgcm9vdFJlY3QgPSB7XG4gICAgICB0b3A6IDAsXG4gICAgICBsZWZ0OiAwLFxuICAgICAgcmlnaHQ6IGh0bWwuY2xpZW50V2lkdGggfHwgYm9keS5jbGllbnRXaWR0aCxcbiAgICAgIHdpZHRoOiBodG1sLmNsaWVudFdpZHRoIHx8IGJvZHkuY2xpZW50V2lkdGgsXG4gICAgICBib3R0b206IGh0bWwuY2xpZW50SGVpZ2h0IHx8IGJvZHkuY2xpZW50SGVpZ2h0LFxuICAgICAgaGVpZ2h0OiBodG1sLmNsaWVudEhlaWdodCB8fCBib2R5LmNsaWVudEhlaWdodFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHRoaXMuX2V4cGFuZFJlY3RCeVJvb3RNYXJnaW4ocm9vdFJlY3QpO1xufTtcblxuXG4vKipcbiAqIEFjY2VwdHMgYSByZWN0IGFuZCBleHBhbmRzIGl0IGJ5IHRoZSByb290TWFyZ2luIHZhbHVlLlxuICogQHBhcmFtIHtET01SZWN0fENsaWVudFJlY3R9IHJlY3QgVGhlIHJlY3Qgb2JqZWN0IHRvIGV4cGFuZC5cbiAqIEByZXR1cm4ge0NsaWVudFJlY3R9IFRoZSBleHBhbmRlZCByZWN0LlxuICogQHByaXZhdGVcbiAqL1xuSW50ZXJzZWN0aW9uT2JzZXJ2ZXIucHJvdG90eXBlLl9leHBhbmRSZWN0QnlSb290TWFyZ2luID0gZnVuY3Rpb24ocmVjdCkge1xuICB2YXIgbWFyZ2lucyA9IHRoaXMuX3Jvb3RNYXJnaW5WYWx1ZXMubWFwKGZ1bmN0aW9uKG1hcmdpbiwgaSkge1xuICAgIHJldHVybiBtYXJnaW4udW5pdCA9PSAncHgnID8gbWFyZ2luLnZhbHVlIDpcbiAgICAgICAgbWFyZ2luLnZhbHVlICogKGkgJSAyID8gcmVjdC53aWR0aCA6IHJlY3QuaGVpZ2h0KSAvIDEwMDtcbiAgfSk7XG4gIHZhciBuZXdSZWN0ID0ge1xuICAgIHRvcDogcmVjdC50b3AgLSBtYXJnaW5zWzBdLFxuICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgbWFyZ2luc1sxXSxcbiAgICBib3R0b206IHJlY3QuYm90dG9tICsgbWFyZ2luc1syXSxcbiAgICBsZWZ0OiByZWN0LmxlZnQgLSBtYXJnaW5zWzNdXG4gIH07XG4gIG5ld1JlY3Qud2lkdGggPSBuZXdSZWN0LnJpZ2h0IC0gbmV3UmVjdC5sZWZ0O1xuICBuZXdSZWN0LmhlaWdodCA9IG5ld1JlY3QuYm90dG9tIC0gbmV3UmVjdC50b3A7XG5cbiAgcmV0dXJuIG5ld1JlY3Q7XG59O1xuXG5cbi8qKlxuICogQWNjZXB0cyBhbiBvbGQgYW5kIG5ldyBlbnRyeSBhbmQgcmV0dXJucyB0cnVlIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVcbiAqIHRocmVzaG9sZCB2YWx1ZXMgaGFzIGJlZW4gY3Jvc3NlZC5cbiAqIEBwYXJhbSB7P0ludGVyc2VjdGlvbk9ic2VydmVyRW50cnl9IG9sZEVudHJ5IFRoZSBwcmV2aW91cyBlbnRyeSBmb3IgYVxuICogICAgcGFydGljdWxhciB0YXJnZXQgZWxlbWVudCBvciBudWxsIGlmIG5vIHByZXZpb3VzIGVudHJ5IGV4aXN0cy5cbiAqIEBwYXJhbSB7SW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeX0gbmV3RW50cnkgVGhlIGN1cnJlbnQgZW50cnkgZm9yIGFcbiAqICAgIHBhcnRpY3VsYXIgdGFyZ2V0IGVsZW1lbnQuXG4gKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgYSBhbnkgdGhyZXNob2xkIGhhcyBiZWVuIGNyb3NzZWQuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX2hhc0Nyb3NzZWRUaHJlc2hvbGQgPVxuICAgIGZ1bmN0aW9uKG9sZEVudHJ5LCBuZXdFbnRyeSkge1xuXG4gIC8vIFRvIG1ha2UgY29tcGFyaW5nIGVhc2llciwgYW4gZW50cnkgdGhhdCBoYXMgYSByYXRpbyBvZiAwXG4gIC8vIGJ1dCBkb2VzIG5vdCBhY3R1YWxseSBpbnRlcnNlY3QgaXMgZ2l2ZW4gYSB2YWx1ZSBvZiAtMVxuICB2YXIgb2xkUmF0aW8gPSBvbGRFbnRyeSAmJiBvbGRFbnRyeS5pc0ludGVyc2VjdGluZyA/XG4gICAgICBvbGRFbnRyeS5pbnRlcnNlY3Rpb25SYXRpbyB8fCAwIDogLTE7XG4gIHZhciBuZXdSYXRpbyA9IG5ld0VudHJ5LmlzSW50ZXJzZWN0aW5nID9cbiAgICAgIG5ld0VudHJ5LmludGVyc2VjdGlvblJhdGlvIHx8IDAgOiAtMTtcblxuICAvLyBJZ25vcmUgdW5jaGFuZ2VkIHJhdGlvc1xuICBpZiAob2xkUmF0aW8gPT09IG5ld1JhdGlvKSByZXR1cm47XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnRocmVzaG9sZHMubGVuZ3RoOyBpKyspIHtcbiAgICB2YXIgdGhyZXNob2xkID0gdGhpcy50aHJlc2hvbGRzW2ldO1xuXG4gICAgLy8gUmV0dXJuIHRydWUgaWYgYW4gZW50cnkgbWF0Y2hlcyBhIHRocmVzaG9sZCBvciBpZiB0aGUgbmV3IHJhdGlvXG4gICAgLy8gYW5kIHRoZSBvbGQgcmF0aW8gYXJlIG9uIHRoZSBvcHBvc2l0ZSBzaWRlcyBvZiBhIHRocmVzaG9sZC5cbiAgICBpZiAodGhyZXNob2xkID09IG9sZFJhdGlvIHx8IHRocmVzaG9sZCA9PSBuZXdSYXRpbyB8fFxuICAgICAgICB0aHJlc2hvbGQgPCBvbGRSYXRpbyAhPT0gdGhyZXNob2xkIDwgbmV3UmF0aW8pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxufTtcblxuXG4vKipcbiAqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhlIHJvb3QgZWxlbWVudCBpcyBhbiBlbGVtZW50IGFuZCBpcyBpbiB0aGUgRE9NLlxuICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcm9vdCBlbGVtZW50IGlzIGFuIGVsZW1lbnQgYW5kIGlzIGluIHRoZSBET00uXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX3Jvb3RJc0luRG9tID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAhdGhpcy5yb290IHx8IGNvbnRhaW5zRGVlcChkb2N1bWVudCwgdGhpcy5yb290KTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoZSB0YXJnZXQgZWxlbWVudCBpcyBhIGNoaWxkIG9mIHJvb3QuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldCBUaGUgdGFyZ2V0IGVsZW1lbnQgdG8gY2hlY2suXG4gKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB0YXJnZXQgZWxlbWVudCBpcyBhIGNoaWxkIG9mIHJvb3QuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX3Jvb3RDb250YWluc1RhcmdldCA9IGZ1bmN0aW9uKHRhcmdldCkge1xuICByZXR1cm4gY29udGFpbnNEZWVwKHRoaXMucm9vdCB8fCBkb2N1bWVudCwgdGFyZ2V0KSAmJlxuICAgICghdGhpcy5yb290IHx8IHRoaXMucm9vdC5vd25lckRvY3VtZW50ID09IHRhcmdldC5vd25lckRvY3VtZW50KTtcbn07XG5cblxuLyoqXG4gKiBBZGRzIHRoZSBpbnN0YW5jZSB0byB0aGUgZ2xvYmFsIEludGVyc2VjdGlvbk9ic2VydmVyIHJlZ2lzdHJ5IGlmIGl0IGlzbid0XG4gKiBhbHJlYWR5IHByZXNlbnQuXG4gKiBAcHJpdmF0ZVxuICovXG5JbnRlcnNlY3Rpb25PYnNlcnZlci5wcm90b3R5cGUuX3JlZ2lzdGVySW5zdGFuY2UgPSBmdW5jdGlvbigpIHtcbiAgaWYgKHJlZ2lzdHJ5LmluZGV4T2YodGhpcykgPCAwKSB7XG4gICAgcmVnaXN0cnkucHVzaCh0aGlzKTtcbiAgfVxufTtcblxuXG4vKipcbiAqIFJlbW92ZXMgdGhlIGluc3RhbmNlIGZyb20gdGhlIGdsb2JhbCBJbnRlcnNlY3Rpb25PYnNlcnZlciByZWdpc3RyeS5cbiAqIEBwcml2YXRlXG4gKi9cbkludGVyc2VjdGlvbk9ic2VydmVyLnByb3RvdHlwZS5fdW5yZWdpc3Rlckluc3RhbmNlID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpbmRleCA9IHJlZ2lzdHJ5LmluZGV4T2YodGhpcyk7XG4gIGlmIChpbmRleCAhPSAtMSkgcmVnaXN0cnkuc3BsaWNlKGluZGV4LCAxKTtcbn07XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSByZXN1bHQgb2YgdGhlIHBlcmZvcm1hbmNlLm5vdygpIG1ldGhvZCBvciBudWxsIGluIGJyb3dzZXJzXG4gKiB0aGF0IGRvbid0IHN1cHBvcnQgdGhlIEFQSS5cbiAqIEByZXR1cm4ge251bWJlcn0gVGhlIGVsYXBzZWQgdGltZSBzaW5jZSB0aGUgcGFnZSB3YXMgcmVxdWVzdGVkLlxuICovXG5mdW5jdGlvbiBub3coKSB7XG4gIHJldHVybiB3aW5kb3cucGVyZm9ybWFuY2UgJiYgcGVyZm9ybWFuY2Uubm93ICYmIHBlcmZvcm1hbmNlLm5vdygpO1xufVxuXG5cbi8qKlxuICogVGhyb3R0bGVzIGEgZnVuY3Rpb24gYW5kIGRlbGF5cyBpdHMgZXhlY3V0aW9uLCBzbyBpdCdzIG9ubHkgY2FsbGVkIGF0IG1vc3RcbiAqIG9uY2Ugd2l0aGluIGEgZ2l2ZW4gdGltZSBwZXJpb2QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuXG4gKiBAcGFyYW0ge251bWJlcn0gdGltZW91dCBUaGUgYW1vdW50IG9mIHRpbWUgdGhhdCBtdXN0IHBhc3MgYmVmb3JlIHRoZVxuICogICAgIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgYWdhaW4uXG4gKiBAcmV0dXJuIHtGdW5jdGlvbn0gVGhlIHRocm90dGxlZCBmdW5jdGlvbi5cbiAqL1xuZnVuY3Rpb24gdGhyb3R0bGUoZm4sIHRpbWVvdXQpIHtcbiAgdmFyIHRpbWVyID0gbnVsbDtcbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXRpbWVyKSB7XG4gICAgICB0aW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGZuKCk7XG4gICAgICAgIHRpbWVyID0gbnVsbDtcbiAgICAgIH0sIHRpbWVvdXQpO1xuICAgIH1cbiAgfTtcbn1cblxuXG4vKipcbiAqIEFkZHMgYW4gZXZlbnQgaGFuZGxlciB0byBhIERPTSBub2RlIGVuc3VyaW5nIGNyb3NzLWJyb3dzZXIgY29tcGF0aWJpbGl0eS5cbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUaGUgRE9NIG5vZGUgdG8gYWRkIHRoZSBldmVudCBoYW5kbGVyIHRvLlxuICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50IFRoZSBldmVudCBuYW1lLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGV2ZW50IGhhbmRsZXIgdG8gYWRkLlxuICogQHBhcmFtIHtib29sZWFufSBvcHRfdXNlQ2FwdHVyZSBPcHRpb25hbGx5IGFkZHMgdGhlIGV2ZW4gdG8gdGhlIGNhcHR1cmVcbiAqICAgICBwaGFzZS4gTm90ZTogdGhpcyBvbmx5IHdvcmtzIGluIG1vZGVybiBicm93c2Vycy5cbiAqL1xuZnVuY3Rpb24gYWRkRXZlbnQobm9kZSwgZXZlbnQsIGZuLCBvcHRfdXNlQ2FwdHVyZSkge1xuICBpZiAodHlwZW9mIG5vZGUuYWRkRXZlbnRMaXN0ZW5lciA9PSAnZnVuY3Rpb24nKSB7XG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBmbiwgb3B0X3VzZUNhcHR1cmUgfHwgZmFsc2UpO1xuICB9XG4gIGVsc2UgaWYgKHR5cGVvZiBub2RlLmF0dGFjaEV2ZW50ID09ICdmdW5jdGlvbicpIHtcbiAgICBub2RlLmF0dGFjaEV2ZW50KCdvbicgKyBldmVudCwgZm4pO1xuICB9XG59XG5cblxuLyoqXG4gKiBSZW1vdmVzIGEgcHJldmlvdXNseSBhZGRlZCBldmVudCBoYW5kbGVyIGZyb20gYSBET00gbm9kZS5cbiAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBUaGUgRE9NIG5vZGUgdG8gcmVtb3ZlIHRoZSBldmVudCBoYW5kbGVyIGZyb20uXG4gKiBAcGFyYW0ge3N0cmluZ30gZXZlbnQgVGhlIGV2ZW50IG5hbWUuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmbiBUaGUgZXZlbnQgaGFuZGxlciB0byByZW1vdmUuXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG9wdF91c2VDYXB0dXJlIElmIHRoZSBldmVudCBoYW5kbGVyIHdhcyBhZGRlZCB3aXRoIHRoaXNcbiAqICAgICBmbGFnIHNldCB0byB0cnVlLCBpdCBzaG91bGQgYmUgc2V0IHRvIHRydWUgaGVyZSBpbiBvcmRlciB0byByZW1vdmUgaXQuXG4gKi9cbmZ1bmN0aW9uIHJlbW92ZUV2ZW50KG5vZGUsIGV2ZW50LCBmbiwgb3B0X3VzZUNhcHR1cmUpIHtcbiAgaWYgKHR5cGVvZiBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIgPT0gJ2Z1bmN0aW9uJykge1xuICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgZm4sIG9wdF91c2VDYXB0dXJlIHx8IGZhbHNlKTtcbiAgfVxuICBlbHNlIGlmICh0eXBlb2Ygbm9kZS5kZXRhdGNoRXZlbnQgPT0gJ2Z1bmN0aW9uJykge1xuICAgIG5vZGUuZGV0YXRjaEV2ZW50KCdvbicgKyBldmVudCwgZm4pO1xuICB9XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0d28gcmVjdCBvYmplY3RzLlxuICogQHBhcmFtIHtPYmplY3R9IHJlY3QxIFRoZSBmaXJzdCByZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IHJlY3QyIFRoZSBzZWNvbmQgcmVjdC5cbiAqIEByZXR1cm4gez9PYmplY3R8P0NsaWVudFJlY3R9IFRoZSBpbnRlcnNlY3Rpb24gcmVjdCBvciB1bmRlZmluZWQgaWYgbm9cbiAqICAgICBpbnRlcnNlY3Rpb24gaXMgZm91bmQuXG4gKi9cbmZ1bmN0aW9uIGNvbXB1dGVSZWN0SW50ZXJzZWN0aW9uKHJlY3QxLCByZWN0Mikge1xuICB2YXIgdG9wID0gTWF0aC5tYXgocmVjdDEudG9wLCByZWN0Mi50b3ApO1xuICB2YXIgYm90dG9tID0gTWF0aC5taW4ocmVjdDEuYm90dG9tLCByZWN0Mi5ib3R0b20pO1xuICB2YXIgbGVmdCA9IE1hdGgubWF4KHJlY3QxLmxlZnQsIHJlY3QyLmxlZnQpO1xuICB2YXIgcmlnaHQgPSBNYXRoLm1pbihyZWN0MS5yaWdodCwgcmVjdDIucmlnaHQpO1xuICB2YXIgd2lkdGggPSByaWdodCAtIGxlZnQ7XG4gIHZhciBoZWlnaHQgPSBib3R0b20gLSB0b3A7XG5cbiAgcmV0dXJuICh3aWR0aCA+PSAwICYmIGhlaWdodCA+PSAwKSAmJiB7XG4gICAgdG9wOiB0b3AsXG4gICAgYm90dG9tOiBib3R0b20sXG4gICAgbGVmdDogbGVmdCxcbiAgICByaWdodDogcmlnaHQsXG4gICAgd2lkdGg6IHdpZHRoLFxuICAgIGhlaWdodDogaGVpZ2h0XG4gIH0gfHwgbnVsbDtcbn1cblxuXG4vKipcbiAqIFNoaW1zIHRoZSBuYXRpdmUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IGZvciBjb21wYXRpYmlsaXR5IHdpdGggb2xkZXIgSUUuXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsIFRoZSBlbGVtZW50IHdob3NlIGJvdW5kaW5nIHJlY3QgdG8gZ2V0LlxuICogQHJldHVybiB7RE9NUmVjdHxDbGllbnRSZWN0fSBUaGUgKHBvc3NpYmx5IHNoaW1tZWQpIHJlY3Qgb2YgdGhlIGVsZW1lbnQuXG4gKi9cbmZ1bmN0aW9uIGdldEJvdW5kaW5nQ2xpZW50UmVjdChlbCkge1xuICB2YXIgcmVjdDtcblxuICB0cnkge1xuICAgIHJlY3QgPSBlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgfSBjYXRjaCAoZXJyKSB7XG4gICAgLy8gSWdub3JlIFdpbmRvd3MgNyBJRTExIFwiVW5zcGVjaWZpZWQgZXJyb3JcIlxuICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS93M2MvSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvcHVsbC8yMDVcbiAgfVxuXG4gIGlmICghcmVjdCkgcmV0dXJuIGdldEVtcHR5UmVjdCgpO1xuXG4gIC8vIE9sZGVyIElFXG4gIGlmICghKHJlY3Qud2lkdGggJiYgcmVjdC5oZWlnaHQpKSB7XG4gICAgcmVjdCA9IHtcbiAgICAgIHRvcDogcmVjdC50b3AsXG4gICAgICByaWdodDogcmVjdC5yaWdodCxcbiAgICAgIGJvdHRvbTogcmVjdC5ib3R0b20sXG4gICAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgICB3aWR0aDogcmVjdC5yaWdodCAtIHJlY3QubGVmdCxcbiAgICAgIGhlaWdodDogcmVjdC5ib3R0b20gLSByZWN0LnRvcFxuICAgIH07XG4gIH1cbiAgcmV0dXJuIHJlY3Q7XG59XG5cblxuLyoqXG4gKiBSZXR1cm5zIGFuIGVtcHR5IHJlY3Qgb2JqZWN0LiBBbiBlbXB0eSByZWN0IGlzIHJldHVybmVkIHdoZW4gYW4gZWxlbWVudFxuICogaXMgbm90IGluIHRoZSBET00uXG4gKiBAcmV0dXJuIHtDbGllbnRSZWN0fSBUaGUgZW1wdHkgcmVjdC5cbiAqL1xuZnVuY3Rpb24gZ2V0RW1wdHlSZWN0KCkge1xuICByZXR1cm4ge1xuICAgIHRvcDogMCxcbiAgICBib3R0b206IDAsXG4gICAgbGVmdDogMCxcbiAgICByaWdodDogMCxcbiAgICB3aWR0aDogMCxcbiAgICBoZWlnaHQ6IDBcbiAgfTtcbn1cblxuXG4vKipcbiAqIEVuc3VyZSB0aGF0IHRoZSByZXN1bHQgaGFzIGFsbCBvZiB0aGUgbmVjZXNzYXJ5IGZpZWxkcyBvZiB0aGUgRE9NUmVjdC5cbiAqIFNwZWNpZmljYWxseSB0aGlzIGVuc3VyZXMgdGhhdCBgeGAgYW5kIGB5YCBmaWVsZHMgYXJlIHNldC5cbiAqXG4gKiBAcGFyYW0gez9ET01SZWN0fD9DbGllbnRSZWN0fSByZWN0XG4gKiBAcmV0dXJuIHs/RE9NUmVjdH1cbiAqL1xuZnVuY3Rpb24gZW5zdXJlRE9NUmVjdChyZWN0KSB7XG4gIC8vIEEgYERPTVJlY3RgIG9iamVjdCBoYXMgYHhgIGFuZCBgeWAgZmllbGRzLlxuICBpZiAoIXJlY3QgfHwgJ3gnIGluIHJlY3QpIHtcbiAgICByZXR1cm4gcmVjdDtcbiAgfVxuICAvLyBBIElFJ3MgYENsaWVudFJlY3RgIHR5cGUgZG9lcyBub3QgaGF2ZSBgeGAgYW5kIGB5YC4gVGhlIHNhbWUgaXMgdGhlIGNhc2VcbiAgLy8gZm9yIGludGVybmFsbHkgY2FsY3VsYXRlZCBSZWN0IG9iamVjdHMuIEZvciB0aGUgcHVycG9zZXMgb2ZcbiAgLy8gYEludGVyc2VjdGlvbk9ic2VydmVyYCwgaXQncyBzdWZmaWNpZW50IHRvIHNpbXBseSBtaXJyb3IgYGxlZnRgIGFuZCBgdG9wYFxuICAvLyBmb3IgdGhlc2UgZmllbGRzLlxuICByZXR1cm4ge1xuICAgIHRvcDogcmVjdC50b3AsXG4gICAgeTogcmVjdC50b3AsXG4gICAgYm90dG9tOiByZWN0LmJvdHRvbSxcbiAgICBsZWZ0OiByZWN0LmxlZnQsXG4gICAgeDogcmVjdC5sZWZ0LFxuICAgIHJpZ2h0OiByZWN0LnJpZ2h0LFxuICAgIHdpZHRoOiByZWN0LndpZHRoLFxuICAgIGhlaWdodDogcmVjdC5oZWlnaHRcbiAgfTtcbn1cblxuXG4vKipcbiAqIEludmVydHMgdGhlIGludGVyc2VjdGlvbiBhbmQgYm91bmRpbmcgcmVjdCBmcm9tIHRoZSBwYXJlbnQgKGZyYW1lKSBCQ1IgdG9cbiAqIHRoZSBsb2NhbCBCQ1Igc3BhY2UuXG4gKiBAcGFyYW0ge0RPTVJlY3R8Q2xpZW50UmVjdH0gcGFyZW50Qm91bmRpbmdSZWN0IFRoZSBwYXJlbnQncyBib3VuZCBjbGllbnQgcmVjdC5cbiAqIEBwYXJhbSB7RE9NUmVjdHxDbGllbnRSZWN0fSBwYXJlbnRJbnRlcnNlY3Rpb25SZWN0IFRoZSBwYXJlbnQncyBvd24gaW50ZXJzZWN0aW9uIHJlY3QuXG4gKiBAcmV0dXJuIHtDbGllbnRSZWN0fSBUaGUgbG9jYWwgcm9vdCBib3VuZGluZyByZWN0IGZvciB0aGUgcGFyZW50J3MgY2hpbGRyZW4uXG4gKi9cbmZ1bmN0aW9uIGNvbnZlcnRGcm9tUGFyZW50UmVjdChwYXJlbnRCb3VuZGluZ1JlY3QsIHBhcmVudEludGVyc2VjdGlvblJlY3QpIHtcbiAgdmFyIHRvcCA9IHBhcmVudEludGVyc2VjdGlvblJlY3QudG9wIC0gcGFyZW50Qm91bmRpbmdSZWN0LnRvcDtcbiAgdmFyIGxlZnQgPSBwYXJlbnRJbnRlcnNlY3Rpb25SZWN0LmxlZnQgLSBwYXJlbnRCb3VuZGluZ1JlY3QubGVmdDtcbiAgcmV0dXJuIHtcbiAgICB0b3A6IHRvcCxcbiAgICBsZWZ0OiBsZWZ0LFxuICAgIGhlaWdodDogcGFyZW50SW50ZXJzZWN0aW9uUmVjdC5oZWlnaHQsXG4gICAgd2lkdGg6IHBhcmVudEludGVyc2VjdGlvblJlY3Qud2lkdGgsXG4gICAgYm90dG9tOiB0b3AgKyBwYXJlbnRJbnRlcnNlY3Rpb25SZWN0LmhlaWdodCxcbiAgICByaWdodDogbGVmdCArIHBhcmVudEludGVyc2VjdGlvblJlY3Qud2lkdGhcbiAgfTtcbn1cblxuXG4vKipcbiAqIENoZWNrcyB0byBzZWUgaWYgYSBwYXJlbnQgZWxlbWVudCBjb250YWlucyBhIGNoaWxkIGVsZW1lbnQgKGluY2x1ZGluZyBpbnNpZGVcbiAqIHNoYWRvdyBET00pLlxuICogQHBhcmFtIHtOb2RlfSBwYXJlbnQgVGhlIHBhcmVudCBlbGVtZW50LlxuICogQHBhcmFtIHtOb2RlfSBjaGlsZCBUaGUgY2hpbGQgZWxlbWVudC5cbiAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHBhcmVudCBub2RlIGNvbnRhaW5zIHRoZSBjaGlsZCBub2RlLlxuICovXG5mdW5jdGlvbiBjb250YWluc0RlZXAocGFyZW50LCBjaGlsZCkge1xuICB2YXIgbm9kZSA9IGNoaWxkO1xuICB3aGlsZSAobm9kZSkge1xuICAgIGlmIChub2RlID09IHBhcmVudCkgcmV0dXJuIHRydWU7XG5cbiAgICBub2RlID0gZ2V0UGFyZW50Tm9kZShub2RlKTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cblxuLyoqXG4gKiBHZXRzIHRoZSBwYXJlbnQgbm9kZSBvZiBhbiBlbGVtZW50IG9yIGl0cyBob3N0IGVsZW1lbnQgaWYgdGhlIHBhcmVudCBub2RlXG4gKiBpcyBhIHNoYWRvdyByb290LlxuICogQHBhcmFtIHtOb2RlfSBub2RlIFRoZSBub2RlIHdob3NlIHBhcmVudCB0byBnZXQuXG4gKiBAcmV0dXJuIHtOb2RlfG51bGx9IFRoZSBwYXJlbnQgbm9kZSBvciBudWxsIGlmIG5vIHBhcmVudCBleGlzdHMuXG4gKi9cbmZ1bmN0aW9uIGdldFBhcmVudE5vZGUobm9kZSkge1xuICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlO1xuXG4gIGlmIChub2RlLm5vZGVUeXBlID09IC8qIERPQ1VNRU5UICovIDkgJiYgbm9kZSAhPSBkb2N1bWVudCkge1xuICAgIC8vIElmIHRoaXMgbm9kZSBpcyBhIGRvY3VtZW50IG5vZGUsIGxvb2sgZm9yIHRoZSBlbWJlZGRpbmcgZnJhbWUuXG4gICAgcmV0dXJuIGdldEZyYW1lRWxlbWVudChub2RlKTtcbiAgfVxuXG4gIGlmIChwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlID09IDExICYmIHBhcmVudC5ob3N0KSB7XG4gICAgLy8gSWYgdGhlIHBhcmVudCBpcyBhIHNoYWRvdyByb290LCByZXR1cm4gdGhlIGhvc3QgZWxlbWVudC5cbiAgICByZXR1cm4gcGFyZW50Lmhvc3Q7XG4gIH1cblxuICBpZiAocGFyZW50ICYmIHBhcmVudC5hc3NpZ25lZFNsb3QpIHtcbiAgICAvLyBJZiB0aGUgcGFyZW50IGlzIGRpc3RyaWJ1dGVkIGluIGEgPHNsb3Q+LCByZXR1cm4gdGhlIHBhcmVudCBvZiBhIHNsb3QuXG4gICAgcmV0dXJuIHBhcmVudC5hc3NpZ25lZFNsb3QucGFyZW50Tm9kZTtcbiAgfVxuXG4gIHJldHVybiBwYXJlbnQ7XG59XG5cblxuLy8gRXhwb3NlcyB0aGUgY29uc3RydWN0b3JzIGdsb2JhbGx5Llxud2luZG93LkludGVyc2VjdGlvbk9ic2VydmVyID0gSW50ZXJzZWN0aW9uT2JzZXJ2ZXI7XG53aW5kb3cuSW50ZXJzZWN0aW9uT2JzZXJ2ZXJFbnRyeSA9IEludGVyc2VjdGlvbk9ic2VydmVyRW50cnk7XG5cbn0oKSk7XG4iLCIoZnVuY3Rpb24gd2VicGFja1VuaXZlcnNhbE1vZHVsZURlZmluaXRpb24ocm9vdCwgZmFjdG9yeSkge1xuXHRpZih0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSA9PT0gJ29iamVjdCcpXG5cdFx0bW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG5cdGVsc2UgaWYodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKVxuXHRcdGRlZmluZShbXSwgZmFjdG9yeSk7XG5cdGVsc2Uge1xuXHRcdHZhciBhID0gZmFjdG9yeSgpO1xuXHRcdGZvcih2YXIgaSBpbiBhKSAodHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnID8gZXhwb3J0cyA6IHJvb3QpW2ldID0gYVtpXTtcblx0fVxufSkodHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHRoaXMsIGZ1bmN0aW9uKCkge1xucmV0dXJuIC8qKioqKiovIChmdW5jdGlvbihtb2R1bGVzKSB7IC8vIHdlYnBhY2tCb290c3RyYXBcbi8qKioqKiovIFx0Ly8gVGhlIG1vZHVsZSBjYWNoZVxuLyoqKioqKi8gXHR2YXIgaW5zdGFsbGVkTW9kdWxlcyA9IHt9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gVGhlIHJlcXVpcmUgZnVuY3Rpb25cbi8qKioqKiovIFx0ZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuLyoqKioqKi9cbi8qKioqKiovIFx0XHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcbi8qKioqKiovIFx0XHRpZihpbnN0YWxsZWRNb2R1bGVzW21vZHVsZUlkXSkge1xuLyoqKioqKi8gXHRcdFx0cmV0dXJuIGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdLmV4cG9ydHM7XG4vKioqKioqLyBcdFx0fVxuLyoqKioqKi8gXHRcdC8vIENyZWF0ZSBhIG5ldyBtb2R1bGUgKGFuZCBwdXQgaXQgaW50byB0aGUgY2FjaGUpXG4vKioqKioqLyBcdFx0dmFyIG1vZHVsZSA9IGluc3RhbGxlZE1vZHVsZXNbbW9kdWxlSWRdID0ge1xuLyoqKioqKi8gXHRcdFx0aTogbW9kdWxlSWQsXG4vKioqKioqLyBcdFx0XHRsOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdGV4cG9ydHM6IHt9XG4vKioqKioqLyBcdFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdFx0Ly8gRXhlY3V0ZSB0aGUgbW9kdWxlIGZ1bmN0aW9uXG4vKioqKioqLyBcdFx0bW9kdWxlc1ttb2R1bGVJZF0uY2FsbChtb2R1bGUuZXhwb3J0cywgbW9kdWxlLCBtb2R1bGUuZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXyk7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIEZsYWcgdGhlIG1vZHVsZSBhcyBsb2FkZWRcbi8qKioqKiovIFx0XHRtb2R1bGUubCA9IHRydWU7XG4vKioqKioqL1xuLyoqKioqKi8gXHRcdC8vIFJldHVybiB0aGUgZXhwb3J0cyBvZiB0aGUgbW9kdWxlXG4vKioqKioqLyBcdFx0cmV0dXJuIG1vZHVsZS5leHBvcnRzO1xuLyoqKioqKi8gXHR9XG4vKioqKioqL1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gZXhwb3NlIHRoZSBtb2R1bGVzIG9iamVjdCAoX193ZWJwYWNrX21vZHVsZXNfXylcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5tID0gbW9kdWxlcztcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGV4cG9zZSB0aGUgbW9kdWxlIGNhY2hlXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18uYyA9IGluc3RhbGxlZE1vZHVsZXM7XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBkZWZpbmUgZ2V0dGVyIGZ1bmN0aW9uIGZvciBoYXJtb255IGV4cG9ydHNcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kID0gZnVuY3Rpb24oZXhwb3J0cywgbmFtZSwgZ2V0dGVyKSB7XG4vKioqKioqLyBcdFx0aWYoIV9fd2VicGFja19yZXF1aXJlX18ubyhleHBvcnRzLCBuYW1lKSkge1xuLyoqKioqKi8gXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIG5hbWUsIHtcbi8qKioqKiovIFx0XHRcdFx0Y29uZmlndXJhYmxlOiBmYWxzZSxcbi8qKioqKiovIFx0XHRcdFx0ZW51bWVyYWJsZTogdHJ1ZSxcbi8qKioqKiovIFx0XHRcdFx0Z2V0OiBnZXR0ZXJcbi8qKioqKiovIFx0XHRcdH0pO1xuLyoqKioqKi8gXHRcdH1cbi8qKioqKiovIFx0fTtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG4vKioqKioqLyBcdF9fd2VicGFja19yZXF1aXJlX18ubiA9IGZ1bmN0aW9uKG1vZHVsZSkge1xuLyoqKioqKi8gXHRcdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuLyoqKioqKi8gXHRcdFx0ZnVuY3Rpb24gZ2V0RGVmYXVsdCgpIHsgcmV0dXJuIG1vZHVsZVsnZGVmYXVsdCddOyB9IDpcbi8qKioqKiovIFx0XHRcdGZ1bmN0aW9uIGdldE1vZHVsZUV4cG9ydHMoKSB7IHJldHVybiBtb2R1bGU7IH07XG4vKioqKioqLyBcdFx0X193ZWJwYWNrX3JlcXVpcmVfXy5kKGdldHRlciwgJ2EnLCBnZXR0ZXIpO1xuLyoqKioqKi8gXHRcdHJldHVybiBnZXR0ZXI7XG4vKioqKioqLyBcdH07XG4vKioqKioqL1xuLyoqKioqKi8gXHQvLyBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGxcbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5vID0gZnVuY3Rpb24ob2JqZWN0LCBwcm9wZXJ0eSkgeyByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgcHJvcGVydHkpOyB9O1xuLyoqKioqKi9cbi8qKioqKiovIFx0Ly8gX193ZWJwYWNrX3B1YmxpY19wYXRoX19cbi8qKioqKiovIFx0X193ZWJwYWNrX3JlcXVpcmVfXy5wID0gXCJcIjtcbi8qKioqKiovXG4vKioqKioqLyBcdC8vIExvYWQgZW50cnkgbW9kdWxlIGFuZCByZXR1cm4gZXhwb3J0c1xuLyoqKioqKi8gXHRyZXR1cm4gX193ZWJwYWNrX3JlcXVpcmVfXyhfX3dlYnBhY2tfcmVxdWlyZV9fLnMgPSA3KTtcbi8qKioqKiovIH0pXG4vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuLyoqKioqKi8gKFtcbi8qIDAgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gICAgdmFsdWU6IHRydWVcbn0pO1xuXG52YXIgX2V4dGVuZHMgPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uICh0YXJnZXQpIHsgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpXTsgZm9yICh2YXIga2V5IGluIHNvdXJjZSkgeyBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgeyB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOyB9IH0gfSByZXR1cm4gdGFyZ2V0OyB9OyAvKiBnbG9iYWxzIGpRdWVyeSAqL1xuXG5leHBvcnRzLmxvcnkgPSBsb3J5O1xuXG52YXIgX2RldGVjdFByZWZpeGVzID0gX193ZWJwYWNrX3JlcXVpcmVfXygxKTtcblxudmFyIF9kZXRlY3RQcmVmaXhlczIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZXRlY3RQcmVmaXhlcyk7XG5cbnZhciBfZGV0ZWN0U3VwcG9ydHNQYXNzaXZlID0gX193ZWJwYWNrX3JlcXVpcmVfXygyKTtcblxudmFyIF9kZXRlY3RTdXBwb3J0c1Bhc3NpdmUyID0gX2ludGVyb3BSZXF1aXJlRGVmYXVsdChfZGV0ZWN0U3VwcG9ydHNQYXNzaXZlKTtcblxudmFyIF9kaXNwYXRjaEV2ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXygzKTtcblxudmFyIF9kaXNwYXRjaEV2ZW50MiA9IF9pbnRlcm9wUmVxdWlyZURlZmF1bHQoX2Rpc3BhdGNoRXZlbnQpO1xuXG52YXIgX2RlZmF1bHRzID0gX193ZWJwYWNrX3JlcXVpcmVfXyg2KTtcblxudmFyIF9kZWZhdWx0czIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9kZWZhdWx0cyk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcblxuZnVuY3Rpb24gbG9yeShzbGlkZXIsIG9wdHMpIHtcbiAgICB2YXIgcG9zaXRpb24gPSB2b2lkIDA7XG4gICAgdmFyIHNsaWRlc1dpZHRoID0gdm9pZCAwO1xuICAgIHZhciBmcmFtZVdpZHRoID0gdm9pZCAwO1xuICAgIHZhciBzbGlkZXMgPSB2b2lkIDA7XG5cbiAgICAvKipcbiAgICAgKiBzbGlkZXIgRE9NIGVsZW1lbnRzXG4gICAgICovXG4gICAgdmFyIGZyYW1lID0gdm9pZCAwO1xuICAgIHZhciBzbGlkZUNvbnRhaW5lciA9IHZvaWQgMDtcbiAgICB2YXIgcHJldkN0cmwgPSB2b2lkIDA7XG4gICAgdmFyIG5leHRDdHJsID0gdm9pZCAwO1xuICAgIHZhciBwcmVmaXhlcyA9IHZvaWQgMDtcbiAgICB2YXIgdHJhbnNpdGlvbkVuZENhbGxiYWNrID0gdm9pZCAwO1xuXG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgb3B0aW9ucyA9IHt9O1xuICAgIHZhciB0b3VjaEV2ZW50UGFyYW1zID0gKDAsIF9kZXRlY3RTdXBwb3J0c1Bhc3NpdmUyLmRlZmF1bHQpKCkgPyB7IHBhc3NpdmU6IHRydWUgfSA6IGZhbHNlO1xuXG4gICAgLyoqXG4gICAgICogaWYgb2JqZWN0IGlzIGpRdWVyeSBjb252ZXJ0IHRvIG5hdGl2ZSBET00gZWxlbWVudFxuICAgICAqL1xuICAgIGlmICh0eXBlb2YgalF1ZXJ5ICE9PSAndW5kZWZpbmVkJyAmJiBzbGlkZXIgaW5zdGFuY2VvZiBqUXVlcnkpIHtcbiAgICAgICAgc2xpZGVyID0gc2xpZGVyWzBdO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHByaXZhdGVcbiAgICAgKiBzZXQgYWN0aXZlIGNsYXNzIHRvIGVsZW1lbnQgd2hpY2ggaXMgdGhlIGN1cnJlbnQgc2xpZGVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXRBY3RpdmVFbGVtZW50KHNsaWRlcywgY3VycmVudEluZGV4KSB7XG4gICAgICAgIHZhciBfb3B0aW9ucyA9IG9wdGlvbnMsXG4gICAgICAgICAgICBjbGFzc05hbWVBY3RpdmVTbGlkZSA9IF9vcHRpb25zLmNsYXNzTmFtZUFjdGl2ZVNsaWRlO1xuXG5cbiAgICAgICAgc2xpZGVzLmZvckVhY2goZnVuY3Rpb24gKGVsZW1lbnQsIGluZGV4KSB7XG4gICAgICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lQWN0aXZlU2xpZGUpKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZUFjdGl2ZVNsaWRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgc2xpZGVzW2N1cnJlbnRJbmRleF0uY2xhc3NMaXN0LmFkZChjbGFzc05hbWVBY3RpdmVTbGlkZSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcHJpdmF0ZVxuICAgICAqIHNldHVwSW5maW5pdGU6IGZ1bmN0aW9uIHRvIHNldHVwIGlmIGluZmluaXRlIGlzIHNldFxuICAgICAqXG4gICAgICogQHBhcmFtICB7YXJyYXl9IHNsaWRlQXJyYXlcbiAgICAgKiBAcmV0dXJuIHthcnJheX0gYXJyYXkgb2YgdXBkYXRlZCBzbGlkZUNvbnRhaW5lciBlbGVtZW50c1xuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNldHVwSW5maW5pdGUoc2xpZGVBcnJheSkge1xuICAgICAgICB2YXIgX29wdGlvbnMyID0gb3B0aW9ucyxcbiAgICAgICAgICAgIGluZmluaXRlID0gX29wdGlvbnMyLmluZmluaXRlO1xuXG5cbiAgICAgICAgdmFyIGZyb250ID0gc2xpZGVBcnJheS5zbGljZSgwLCBpbmZpbml0ZSk7XG4gICAgICAgIHZhciBiYWNrID0gc2xpZGVBcnJheS5zbGljZShzbGlkZUFycmF5Lmxlbmd0aCAtIGluZmluaXRlLCBzbGlkZUFycmF5Lmxlbmd0aCk7XG5cbiAgICAgICAgZnJvbnQuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyIGNsb25lZCA9IGVsZW1lbnQuY2xvbmVOb2RlKHRydWUpO1xuXG4gICAgICAgICAgICBzbGlkZUNvbnRhaW5lci5hcHBlbmRDaGlsZChjbG9uZWQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBiYWNrLnJldmVyc2UoKS5mb3JFYWNoKGZ1bmN0aW9uIChlbGVtZW50KSB7XG4gICAgICAgICAgICB2YXIgY2xvbmVkID0gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSk7XG5cbiAgICAgICAgICAgIHNsaWRlQ29udGFpbmVyLmluc2VydEJlZm9yZShjbG9uZWQsIHNsaWRlQ29udGFpbmVyLmZpcnN0Q2hpbGQpO1xuICAgICAgICB9KTtcblxuICAgICAgICBzbGlkZUNvbnRhaW5lci5hZGRFdmVudExpc3RlbmVyKHByZWZpeGVzLnRyYW5zaXRpb25FbmQsIG9uVHJhbnNpdGlvbkVuZCk7XG5cbiAgICAgICAgcmV0dXJuIHNsaWNlLmNhbGwoc2xpZGVDb250YWluZXIuY2hpbGRyZW4pO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIFtkaXNwYXRjaFNsaWRlckV2ZW50IGRlc2NyaXB0aW9uXVxuICAgICAqIEByZXR1cm4ge1t0eXBlXX0gW2Rlc2NyaXB0aW9uXVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRpc3BhdGNoU2xpZGVyRXZlbnQocGhhc2UsIHR5cGUsIGRldGFpbCkge1xuICAgICAgICAoMCwgX2Rpc3BhdGNoRXZlbnQyLmRlZmF1bHQpKHNsaWRlciwgcGhhc2UgKyAnLmxvcnkuJyArIHR5cGUsIGRldGFpbCk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdHJhbnNsYXRlcyB0byBhIGdpdmVuIHBvc2l0aW9uIGluIGEgZ2l2ZW4gdGltZSBpbiBtaWxsaXNlY29uZHNcbiAgICAgKlxuICAgICAqIEB0byAgICAgICAge251bWJlcn0gbnVtYmVyIGluIHBpeGVscyB3aGVyZSB0byB0cmFuc2xhdGUgdG9cbiAgICAgKiBAZHVyYXRpb24gIHtudW1iZXJ9IHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgdHJhbnNpc3Rpb25cbiAgICAgKiBAZWFzZSAgICAgIHtzdHJpbmd9IGVhc2luZyBjc3MgcHJvcGVydHlcbiAgICAgKi9cbiAgICBmdW5jdGlvbiB0cmFuc2xhdGUodG8sIGR1cmF0aW9uLCBlYXNlKSB7XG4gICAgICAgIHZhciBzdHlsZSA9IHNsaWRlQ29udGFpbmVyICYmIHNsaWRlQ29udGFpbmVyLnN0eWxlO1xuXG4gICAgICAgIGlmIChzdHlsZSkge1xuICAgICAgICAgICAgc3R5bGVbcHJlZml4ZXMudHJhbnNpdGlvbiArICdUaW1pbmdGdW5jdGlvbiddID0gZWFzZTtcbiAgICAgICAgICAgIHN0eWxlW3ByZWZpeGVzLnRyYW5zaXRpb24gKyAnRHVyYXRpb24nXSA9IGR1cmF0aW9uICsgJ21zJztcbiAgICAgICAgICAgIHN0eWxlW3ByZWZpeGVzLnRyYW5zZm9ybV0gPSAndHJhbnNsYXRlWCgnICsgdG8gKyAncHgpJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHJldHVybnMgYW4gZWxlbWVudCdzIHdpZHRoXG4gICAgICovXG4gICAgZnVuY3Rpb24gZWxlbWVudFdpZHRoKGVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGggfHwgZWxlbWVudC5vZmZzZXRXaWR0aDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBzbGlkZWZ1bmN0aW9uIGNhbGxlZCBieSBwcmV2LCBuZXh0ICYgdG91Y2hlbmRcbiAgICAgKlxuICAgICAqIGRldGVybWluZSBuZXh0SW5kZXggYW5kIHNsaWRlIHRvIG5leHQgcG9zdGlvblxuICAgICAqIHVuZGVyIHJlc3RyaWN0aW9ucyBvZiB0aGUgZGVmaW5lZCBvcHRpb25zXG4gICAgICpcbiAgICAgKiBAZGlyZWN0aW9uICB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzbGlkZShuZXh0SW5kZXgsIGRpcmVjdGlvbikge1xuICAgICAgICB2YXIgX29wdGlvbnMzID0gb3B0aW9ucyxcbiAgICAgICAgICAgIHNsaWRlU3BlZWQgPSBfb3B0aW9uczMuc2xpZGVTcGVlZCxcbiAgICAgICAgICAgIHNsaWRlc1RvU2Nyb2xsID0gX29wdGlvbnMzLnNsaWRlc1RvU2Nyb2xsLFxuICAgICAgICAgICAgaW5maW5pdGUgPSBfb3B0aW9uczMuaW5maW5pdGUsXG4gICAgICAgICAgICByZXdpbmQgPSBfb3B0aW9uczMucmV3aW5kLFxuICAgICAgICAgICAgcmV3aW5kUHJldiA9IF9vcHRpb25zMy5yZXdpbmRQcmV2LFxuICAgICAgICAgICAgcmV3aW5kU3BlZWQgPSBfb3B0aW9uczMucmV3aW5kU3BlZWQsXG4gICAgICAgICAgICBlYXNlID0gX29wdGlvbnMzLmVhc2UsXG4gICAgICAgICAgICBjbGFzc05hbWVBY3RpdmVTbGlkZSA9IF9vcHRpb25zMy5jbGFzc05hbWVBY3RpdmVTbGlkZSxcbiAgICAgICAgICAgIF9vcHRpb25zMyRjbGFzc05hbWVEaSA9IF9vcHRpb25zMy5jbGFzc05hbWVEaXNhYmxlZE5leHRDdHJsLFxuICAgICAgICAgICAgY2xhc3NOYW1lRGlzYWJsZWROZXh0Q3RybCA9IF9vcHRpb25zMyRjbGFzc05hbWVEaSA9PT0gdW5kZWZpbmVkID8gJ2Rpc2FibGVkJyA6IF9vcHRpb25zMyRjbGFzc05hbWVEaSxcbiAgICAgICAgICAgIF9vcHRpb25zMyRjbGFzc05hbWVEaTIgPSBfb3B0aW9uczMuY2xhc3NOYW1lRGlzYWJsZWRQcmV2Q3RybCxcbiAgICAgICAgICAgIGNsYXNzTmFtZURpc2FibGVkUHJldkN0cmwgPSBfb3B0aW9uczMkY2xhc3NOYW1lRGkyID09PSB1bmRlZmluZWQgPyAnZGlzYWJsZWQnIDogX29wdGlvbnMzJGNsYXNzTmFtZURpMjtcblxuXG4gICAgICAgIHZhciBkdXJhdGlvbiA9IHNsaWRlU3BlZWQ7XG5cbiAgICAgICAgdmFyIG5leHRTbGlkZSA9IGRpcmVjdGlvbiA/IGluZGV4ICsgMSA6IGluZGV4IC0gMTtcbiAgICAgICAgdmFyIG1heE9mZnNldCA9IE1hdGgucm91bmQoc2xpZGVzV2lkdGggLSBmcmFtZVdpZHRoKTtcblxuICAgICAgICBkaXNwYXRjaFNsaWRlckV2ZW50KCdiZWZvcmUnLCAnc2xpZGUnLCB7XG4gICAgICAgICAgICBpbmRleDogaW5kZXgsXG4gICAgICAgICAgICBuZXh0U2xpZGU6IG5leHRTbGlkZVxuICAgICAgICB9KTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogUmVzZXQgY29udHJvbCBjbGFzc2VzXG4gICAgICAgICAqL1xuICAgICAgICBpZiAocHJldkN0cmwpIHtcbiAgICAgICAgICAgIHByZXZDdHJsLmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lRGlzYWJsZWRQcmV2Q3RybCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5leHRDdHJsKSB7XG4gICAgICAgICAgICBuZXh0Q3RybC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZURpc2FibGVkTmV4dEN0cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZiBuZXh0SW5kZXggIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaWYgKGluZmluaXRlICYmIGluZGV4ICsgaW5maW5pdGUgKiAyICE9PSBzbGlkZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IGluZGV4ICsgKGluZmluaXRlIC0gaW5kZXggJSBpbmZpbml0ZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbmV4dEluZGV4ID0gaW5kZXggKyBzbGlkZXNUb1Njcm9sbDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChpbmZpbml0ZSAmJiBpbmRleCAlIGluZmluaXRlICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHRJbmRleCA9IGluZGV4IC0gaW5kZXggJSBpbmZpbml0ZTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBuZXh0SW5kZXggPSBpbmRleCAtIHNsaWRlc1RvU2Nyb2xsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5leHRJbmRleCA9IE1hdGgubWluKE1hdGgubWF4KG5leHRJbmRleCwgMCksIHNsaWRlcy5sZW5ndGggLSAxKTtcblxuICAgICAgICBpZiAoaW5maW5pdGUgJiYgZGlyZWN0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCArPSBpbmZpbml0ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyZXdpbmRQcmV2ICYmIE1hdGguYWJzKHBvc2l0aW9uLngpID09PSAwICYmIGRpcmVjdGlvbiA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgIG5leHRJbmRleCA9IHNsaWRlcy5sZW5ndGggLSAxO1xuICAgICAgICAgICAgZHVyYXRpb24gPSByZXdpbmRTcGVlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBuZXh0T2Zmc2V0ID0gTWF0aC5taW4oTWF0aC5tYXgoc2xpZGVzW25leHRJbmRleF0ub2Zmc2V0TGVmdCAqIC0xLCBtYXhPZmZzZXQgKiAtMSksIDApO1xuXG4gICAgICAgIGlmIChyZXdpbmQgJiYgTWF0aC5hYnMocG9zaXRpb24ueCkgPT09IG1heE9mZnNldCAmJiBkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgIG5leHRPZmZzZXQgPSAwO1xuICAgICAgICAgICAgbmV4dEluZGV4ID0gMDtcbiAgICAgICAgICAgIGR1cmF0aW9uID0gcmV3aW5kU3BlZWQ7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogdHJhbnNsYXRlIHRvIHRoZSBuZXh0T2Zmc2V0IGJ5IGEgZGVmaW5lZCBkdXJhdGlvbiBhbmQgZWFzZSBmdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgdHJhbnNsYXRlKG5leHRPZmZzZXQsIGR1cmF0aW9uLCBlYXNlKTtcblxuICAgICAgICAvKipcbiAgICAgICAgICogdXBkYXRlIHRoZSBwb3NpdGlvbiB3aXRoIHRoZSBuZXh0IHBvc2l0aW9uXG4gICAgICAgICAqL1xuICAgICAgICBwb3NpdGlvbi54ID0gbmV4dE9mZnNldDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogdXBkYXRlIHRoZSBpbmRleCB3aXRoIHRoZSBuZXh0SW5kZXggb25seSBpZlxuICAgICAgICAgKiB0aGUgb2Zmc2V0IG9mIHRoZSBuZXh0SW5kZXggaXMgaW4gdGhlIHJhbmdlIG9mIHRoZSBtYXhPZmZzZXRcbiAgICAgICAgICovXG4gICAgICAgIGlmIChzbGlkZXNbbmV4dEluZGV4XS5vZmZzZXRMZWZ0IDw9IG1heE9mZnNldCkge1xuICAgICAgICAgICAgaW5kZXggPSBuZXh0SW5kZXg7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaW5maW5pdGUgJiYgKG5leHRJbmRleCA9PT0gc2xpZGVzLmxlbmd0aCAtIGluZmluaXRlIHx8IG5leHRJbmRleCA9PT0gc2xpZGVzLmxlbmd0aCAtIHNsaWRlcy5sZW5ndGggJSBpbmZpbml0ZSB8fCBuZXh0SW5kZXggPT09IDApKSB7XG4gICAgICAgICAgICBpZiAoZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICAgICAgaW5kZXggPSBpbmZpbml0ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFkaXJlY3Rpb24pIHtcbiAgICAgICAgICAgICAgICBpbmRleCA9IHNsaWRlcy5sZW5ndGggLSBpbmZpbml0ZSAqIDI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHBvc2l0aW9uLnggPSBzbGlkZXNbaW5kZXhdLm9mZnNldExlZnQgKiAtMTtcblxuICAgICAgICAgICAgdHJhbnNpdGlvbkVuZENhbGxiYWNrID0gZnVuY3Rpb24gdHJhbnNpdGlvbkVuZENhbGxiYWNrKCkge1xuICAgICAgICAgICAgICAgIHRyYW5zbGF0ZShzbGlkZXNbaW5kZXhdLm9mZnNldExlZnQgKiAtMSwgMCwgdW5kZWZpbmVkKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2xhc3NOYW1lQWN0aXZlU2xpZGUpIHtcbiAgICAgICAgICAgIHNldEFjdGl2ZUVsZW1lbnQoc2xpY2UuY2FsbChzbGlkZXMpLCBpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICAvKipcbiAgICAgICAgICogdXBkYXRlIGNsYXNzZXMgZm9yIG5leHQgYW5kIHByZXYgYXJyb3dzXG4gICAgICAgICAqIGJhc2VkIG9uIHVzZXIgc2V0dGluZ3NcbiAgICAgICAgICovXG4gICAgICAgIGlmIChwcmV2Q3RybCAmJiAhaW5maW5pdGUgJiYgIXJld2luZFByZXYgJiYgbmV4dEluZGV4ID09PSAwKSB7XG4gICAgICAgICAgICBwcmV2Q3RybC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZURpc2FibGVkUHJldkN0cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5leHRDdHJsICYmICFpbmZpbml0ZSAmJiAhcmV3aW5kICYmIG5leHRJbmRleCArIDEgPT09IHNsaWRlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIG5leHRDdHJsLmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lRGlzYWJsZWROZXh0Q3RybCk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwYXRjaFNsaWRlckV2ZW50KCdhZnRlcicsICdzbGlkZScsIHtcbiAgICAgICAgICAgIGN1cnJlbnRTbGlkZTogaW5kZXhcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcHVibGljXG4gICAgICogc2V0dXAgZnVuY3Rpb25cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBzZXR1cCgpIHtcbiAgICAgICAgZGlzcGF0Y2hTbGlkZXJFdmVudCgnYmVmb3JlJywgJ2luaXQnKTtcblxuICAgICAgICBwcmVmaXhlcyA9ICgwLCBfZGV0ZWN0UHJlZml4ZXMyLmRlZmF1bHQpKCk7XG4gICAgICAgIG9wdGlvbnMgPSBfZXh0ZW5kcyh7fSwgX2RlZmF1bHRzMi5kZWZhdWx0LCBvcHRzKTtcblxuICAgICAgICB2YXIgX29wdGlvbnM0ID0gb3B0aW9ucyxcbiAgICAgICAgICAgIGNsYXNzTmFtZUZyYW1lID0gX29wdGlvbnM0LmNsYXNzTmFtZUZyYW1lLFxuICAgICAgICAgICAgY2xhc3NOYW1lU2xpZGVDb250YWluZXIgPSBfb3B0aW9uczQuY2xhc3NOYW1lU2xpZGVDb250YWluZXIsXG4gICAgICAgICAgICBjbGFzc05hbWVQcmV2Q3RybCA9IF9vcHRpb25zNC5jbGFzc05hbWVQcmV2Q3RybCxcbiAgICAgICAgICAgIGNsYXNzTmFtZU5leHRDdHJsID0gX29wdGlvbnM0LmNsYXNzTmFtZU5leHRDdHJsLFxuICAgICAgICAgICAgX29wdGlvbnM0JGNsYXNzTmFtZURpID0gX29wdGlvbnM0LmNsYXNzTmFtZURpc2FibGVkTmV4dEN0cmwsXG4gICAgICAgICAgICBjbGFzc05hbWVEaXNhYmxlZE5leHRDdHJsID0gX29wdGlvbnM0JGNsYXNzTmFtZURpID09PSB1bmRlZmluZWQgPyAnZGlzYWJsZWQnIDogX29wdGlvbnM0JGNsYXNzTmFtZURpLFxuICAgICAgICAgICAgX29wdGlvbnM0JGNsYXNzTmFtZURpMiA9IF9vcHRpb25zNC5jbGFzc05hbWVEaXNhYmxlZFByZXZDdHJsLFxuICAgICAgICAgICAgY2xhc3NOYW1lRGlzYWJsZWRQcmV2Q3RybCA9IF9vcHRpb25zNCRjbGFzc05hbWVEaTIgPT09IHVuZGVmaW5lZCA/ICdkaXNhYmxlZCcgOiBfb3B0aW9uczQkY2xhc3NOYW1lRGkyLFxuICAgICAgICAgICAgZW5hYmxlTW91c2VFdmVudHMgPSBfb3B0aW9uczQuZW5hYmxlTW91c2VFdmVudHMsXG4gICAgICAgICAgICBjbGFzc05hbWVBY3RpdmVTbGlkZSA9IF9vcHRpb25zNC5jbGFzc05hbWVBY3RpdmVTbGlkZSxcbiAgICAgICAgICAgIGluaXRpYWxJbmRleCA9IF9vcHRpb25zNC5pbml0aWFsSW5kZXg7XG5cblxuICAgICAgICBpbmRleCA9IGluaXRpYWxJbmRleDtcbiAgICAgICAgZnJhbWUgPSBzbGlkZXIuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVGcmFtZSlbMF07XG4gICAgICAgIHNsaWRlQ29udGFpbmVyID0gZnJhbWUuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShjbGFzc05hbWVTbGlkZUNvbnRhaW5lcilbMF07XG4gICAgICAgIHByZXZDdHJsID0gc2xpZGVyLmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xhc3NOYW1lUHJldkN0cmwpWzBdO1xuICAgICAgICBuZXh0Q3RybCA9IHNsaWRlci5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKGNsYXNzTmFtZU5leHRDdHJsKVswXTtcblxuICAgICAgICBwb3NpdGlvbiA9IHtcbiAgICAgICAgICAgIHg6IHNsaWRlQ29udGFpbmVyLm9mZnNldExlZnQsXG4gICAgICAgICAgICB5OiBzbGlkZUNvbnRhaW5lci5vZmZzZXRUb3BcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAob3B0aW9ucy5pbmZpbml0ZSkge1xuICAgICAgICAgICAgc2xpZGVzID0gc2V0dXBJbmZpbml0ZShzbGljZS5jYWxsKHNsaWRlQ29udGFpbmVyLmNoaWxkcmVuKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzbGlkZXMgPSBzbGljZS5jYWxsKHNsaWRlQ29udGFpbmVyLmNoaWxkcmVuKTtcblxuICAgICAgICAgICAgaWYgKHByZXZDdHJsICYmICFvcHRpb25zLnJld2luZFByZXYpIHtcbiAgICAgICAgICAgICAgICBwcmV2Q3RybC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZURpc2FibGVkUHJldkN0cmwpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAobmV4dEN0cmwgJiYgc2xpZGVzLmxlbmd0aCA9PT0gMSAmJiAhb3B0aW9ucy5yZXdpbmQpIHtcbiAgICAgICAgICAgICAgICBuZXh0Q3RybC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZURpc2FibGVkTmV4dEN0cmwpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmVzZXQoKTtcblxuICAgICAgICBpZiAoY2xhc3NOYW1lQWN0aXZlU2xpZGUpIHtcbiAgICAgICAgICAgIHNldEFjdGl2ZUVsZW1lbnQoc2xpZGVzLCBpbmRleCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocHJldkN0cmwgJiYgbmV4dEN0cmwpIHtcbiAgICAgICAgICAgIHByZXZDdHJsLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcHJldik7XG4gICAgICAgICAgICBuZXh0Q3RybC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIG5leHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uVG91Y2hzdGFydCwgdG91Y2hFdmVudFBhcmFtcyk7XG5cbiAgICAgICAgaWYgKGVuYWJsZU1vdXNlRXZlbnRzKSB7XG4gICAgICAgICAgICBmcmFtZS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvblRvdWNoc3RhcnQpO1xuICAgICAgICAgICAgZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBvbkNsaWNrKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMud2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplKTtcblxuICAgICAgICBkaXNwYXRjaFNsaWRlckV2ZW50KCdhZnRlcicsICdpbml0Jyk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcHVibGljXG4gICAgICogcmVzZXQgZnVuY3Rpb246IGNhbGxlZCBvbiByZXNpemVcbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXNldCgpIHtcbiAgICAgICAgdmFyIF9vcHRpb25zNSA9IG9wdGlvbnMsXG4gICAgICAgICAgICBpbmZpbml0ZSA9IF9vcHRpb25zNS5pbmZpbml0ZSxcbiAgICAgICAgICAgIGVhc2UgPSBfb3B0aW9uczUuZWFzZSxcbiAgICAgICAgICAgIHJld2luZFNwZWVkID0gX29wdGlvbnM1LnJld2luZFNwZWVkLFxuICAgICAgICAgICAgcmV3aW5kT25SZXNpemUgPSBfb3B0aW9uczUucmV3aW5kT25SZXNpemUsXG4gICAgICAgICAgICBjbGFzc05hbWVBY3RpdmVTbGlkZSA9IF9vcHRpb25zNS5jbGFzc05hbWVBY3RpdmVTbGlkZSxcbiAgICAgICAgICAgIGluaXRpYWxJbmRleCA9IF9vcHRpb25zNS5pbml0aWFsSW5kZXg7XG5cblxuICAgICAgICBzbGlkZXNXaWR0aCA9IGVsZW1lbnRXaWR0aChzbGlkZUNvbnRhaW5lcik7XG4gICAgICAgIGZyYW1lV2lkdGggPSBlbGVtZW50V2lkdGgoZnJhbWUpO1xuXG4gICAgICAgIGlmIChmcmFtZVdpZHRoID09PSBzbGlkZXNXaWR0aCkge1xuICAgICAgICAgICAgc2xpZGVzV2lkdGggPSBzbGlkZXMucmVkdWNlKGZ1bmN0aW9uIChwcmV2aW91c1ZhbHVlLCBzbGlkZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2aW91c1ZhbHVlICsgZWxlbWVudFdpZHRoKHNsaWRlKTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHJld2luZE9uUmVzaXplKSB7XG4gICAgICAgICAgICBpbmRleCA9IGluaXRpYWxJbmRleDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGVhc2UgPSBudWxsO1xuICAgICAgICAgICAgcmV3aW5kU3BlZWQgPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGluZmluaXRlKSB7XG4gICAgICAgICAgICB0cmFuc2xhdGUoc2xpZGVzW2luZGV4ICsgaW5maW5pdGVdLm9mZnNldExlZnQgKiAtMSwgMCwgbnVsbCk7XG5cbiAgICAgICAgICAgIGluZGV4ID0gaW5kZXggKyBpbmZpbml0ZTtcbiAgICAgICAgICAgIHBvc2l0aW9uLnggPSBzbGlkZXNbaW5kZXhdLm9mZnNldExlZnQgKiAtMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRyYW5zbGF0ZShzbGlkZXNbaW5kZXhdLm9mZnNldExlZnQgKiAtMSwgcmV3aW5kU3BlZWQsIGVhc2UpO1xuICAgICAgICAgICAgcG9zaXRpb24ueCA9IHNsaWRlc1tpbmRleF0ub2Zmc2V0TGVmdCAqIC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNsYXNzTmFtZUFjdGl2ZVNsaWRlKSB7XG4gICAgICAgICAgICBzZXRBY3RpdmVFbGVtZW50KHNsaWNlLmNhbGwoc2xpZGVzKSwgaW5kZXgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogcHVibGljXG4gICAgICogc2xpZGVUbzogY2FsbGVkIG9uIGNsaWNraGFuZGxlclxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHNsaWRlVG8oaW5kZXgpIHtcbiAgICAgICAgc2xpZGUoaW5kZXgpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHB1YmxpY1xuICAgICAqIHJldHVybkluZGV4IGZ1bmN0aW9uOiBjYWxsZWQgb24gY2xpY2toYW5kbGVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmV0dXJuSW5kZXgoKSB7XG4gICAgICAgIHJldHVybiBpbmRleCAtIG9wdGlvbnMuaW5maW5pdGUgfHwgMDtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwdWJsaWNcbiAgICAgKiBwcmV2IGZ1bmN0aW9uOiBjYWxsZWQgb24gY2xpY2toYW5kbGVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gcHJldigpIHtcbiAgICAgICAgc2xpZGUoZmFsc2UsIGZhbHNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBwdWJsaWNcbiAgICAgKiBuZXh0IGZ1bmN0aW9uOiBjYWxsZWQgb24gY2xpY2toYW5kbGVyXG4gICAgICovXG4gICAgZnVuY3Rpb24gbmV4dCgpIHtcbiAgICAgICAgc2xpZGUoZmFsc2UsIHRydWUpO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIHB1YmxpY1xuICAgICAqIGRlc3Ryb3kgZnVuY3Rpb246IGNhbGxlZCB0byBncmFjZWZ1bGx5IGRlc3Ryb3kgdGhlIGxvcnkgaW5zdGFuY2VcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZXN0cm95KCkge1xuICAgICAgICBkaXNwYXRjaFNsaWRlckV2ZW50KCdiZWZvcmUnLCAnZGVzdHJveScpO1xuXG4gICAgICAgIC8vIHJlbW92ZSBldmVudCBsaXN0ZW5lcnNcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcihwcmVmaXhlcy50cmFuc2l0aW9uRW5kLCBvblRyYW5zaXRpb25FbmQpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0Jywgb25Ub3VjaHN0YXJ0LCB0b3VjaEV2ZW50UGFyYW1zKTtcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaG1vdmUsIHRvdWNoRXZlbnRQYXJhbXMpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hlbmQpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvblRvdWNobW92ZSk7XG4gICAgICAgIGZyYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIG9uVG91Y2hzdGFydCk7XG4gICAgICAgIGZyYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblRvdWNoZW5kKTtcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uVG91Y2hlbmQpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIG9uQ2xpY2spO1xuXG4gICAgICAgIG9wdGlvbnMud2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIG9uUmVzaXplKTtcblxuICAgICAgICBpZiAocHJldkN0cmwpIHtcbiAgICAgICAgICAgIHByZXZDdHJsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgcHJldik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobmV4dEN0cmwpIHtcbiAgICAgICAgICAgIG5leHRDdHJsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgbmV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyByZW1vdmUgY2xvbmVkIHNsaWRlcyBpZiBpbmZpbml0ZSBpcyBzZXRcbiAgICAgICAgaWYgKG9wdGlvbnMuaW5maW5pdGUpIHtcbiAgICAgICAgICAgIEFycmF5LmFwcGx5KG51bGwsIEFycmF5KG9wdGlvbnMuaW5maW5pdGUpKS5mb3JFYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzbGlkZUNvbnRhaW5lci5yZW1vdmVDaGlsZChzbGlkZUNvbnRhaW5lci5maXJzdENoaWxkKTtcbiAgICAgICAgICAgICAgICBzbGlkZUNvbnRhaW5lci5yZW1vdmVDaGlsZChzbGlkZUNvbnRhaW5lci5sYXN0Q2hpbGQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBkaXNwYXRjaFNsaWRlckV2ZW50KCdhZnRlcicsICdkZXN0cm95Jyk7XG4gICAgfVxuXG4gICAgLy8gZXZlbnQgaGFuZGxpbmdcblxuICAgIHZhciB0b3VjaE9mZnNldCA9IHZvaWQgMDtcbiAgICB2YXIgZGVsdGEgPSB2b2lkIDA7XG4gICAgdmFyIGlzU2Nyb2xsaW5nID0gdm9pZCAwO1xuXG4gICAgZnVuY3Rpb24gb25UcmFuc2l0aW9uRW5kKCkge1xuICAgICAgICBpZiAodHJhbnNpdGlvbkVuZENhbGxiYWNrKSB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uRW5kQ2FsbGJhY2soKTtcblxuICAgICAgICAgICAgdHJhbnNpdGlvbkVuZENhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25Ub3VjaHN0YXJ0KGV2ZW50KSB7XG4gICAgICAgIHZhciBfb3B0aW9uczYgPSBvcHRpb25zLFxuICAgICAgICAgICAgZW5hYmxlTW91c2VFdmVudHMgPSBfb3B0aW9uczYuZW5hYmxlTW91c2VFdmVudHM7XG5cbiAgICAgICAgdmFyIHRvdWNoZXMgPSBldmVudC50b3VjaGVzID8gZXZlbnQudG91Y2hlc1swXSA6IGV2ZW50O1xuXG4gICAgICAgIGlmIChlbmFibGVNb3VzZUV2ZW50cykge1xuICAgICAgICAgICAgZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Ub3VjaG1vdmUpO1xuICAgICAgICAgICAgZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG9uVG91Y2hlbmQpO1xuICAgICAgICAgICAgZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uVG91Y2hlbmQpO1xuICAgICAgICB9XG5cbiAgICAgICAgZnJhbWUuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaG1vdmUsIHRvdWNoRXZlbnRQYXJhbXMpO1xuICAgICAgICBmcmFtZS5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hlbmQpO1xuXG4gICAgICAgIHZhciBwYWdlWCA9IHRvdWNoZXMucGFnZVgsXG4gICAgICAgICAgICBwYWdlWSA9IHRvdWNoZXMucGFnZVk7XG5cblxuICAgICAgICB0b3VjaE9mZnNldCA9IHtcbiAgICAgICAgICAgIHg6IHBhZ2VYLFxuICAgICAgICAgICAgeTogcGFnZVksXG4gICAgICAgICAgICB0aW1lOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG5cbiAgICAgICAgaXNTY3JvbGxpbmcgPSB1bmRlZmluZWQ7XG5cbiAgICAgICAgZGVsdGEgPSB7fTtcblxuICAgICAgICBkaXNwYXRjaFNsaWRlckV2ZW50KCdvbicsICd0b3VjaHN0YXJ0Jywge1xuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uVG91Y2htb3ZlKGV2ZW50KSB7XG4gICAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQudG91Y2hlcyA/IGV2ZW50LnRvdWNoZXNbMF0gOiBldmVudDtcbiAgICAgICAgdmFyIHBhZ2VYID0gdG91Y2hlcy5wYWdlWCxcbiAgICAgICAgICAgIHBhZ2VZID0gdG91Y2hlcy5wYWdlWTtcblxuXG4gICAgICAgIGRlbHRhID0ge1xuICAgICAgICAgICAgeDogcGFnZVggLSB0b3VjaE9mZnNldC54LFxuICAgICAgICAgICAgeTogcGFnZVkgLSB0b3VjaE9mZnNldC55XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHR5cGVvZiBpc1Njcm9sbGluZyA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIGlzU2Nyb2xsaW5nID0gISEoaXNTY3JvbGxpbmcgfHwgTWF0aC5hYnMoZGVsdGEueCkgPCBNYXRoLmFicyhkZWx0YS55KSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nICYmIHRvdWNoT2Zmc2V0KSB7XG4gICAgICAgICAgICB0cmFuc2xhdGUocG9zaXRpb24ueCArIGRlbHRhLngsIDAsIG51bGwpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gbWF5IGJlXG4gICAgICAgIGRpc3BhdGNoU2xpZGVyRXZlbnQoJ29uJywgJ3RvdWNobW92ZScsIHtcbiAgICAgICAgICAgIGV2ZW50OiBldmVudFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblRvdWNoZW5kKGV2ZW50KSB7XG4gICAgICAgIC8qKlxuICAgICAgICAgKiB0aW1lIGJldHdlZW4gdG91Y2hzdGFydCBhbmQgdG91Y2hlbmQgaW4gbWlsbGlzZWNvbmRzXG4gICAgICAgICAqIEBkdXJhdGlvbiB7bnVtYmVyfVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGR1cmF0aW9uID0gdG91Y2hPZmZzZXQgPyBEYXRlLm5vdygpIC0gdG91Y2hPZmZzZXQudGltZSA6IHVuZGVmaW5lZDtcblxuICAgICAgICAvKipcbiAgICAgICAgICogaXMgdmFsaWQgaWY6XG4gICAgICAgICAqXG4gICAgICAgICAqIC0+IHN3aXBlIGF0dGVtcHQgdGltZSBpcyBvdmVyIDMwMCBtc1xuICAgICAgICAgKiBhbmRcbiAgICAgICAgICogLT4gc3dpcGUgZGlzdGFuY2UgaXMgZ3JlYXRlciB0aGFuIDI1cHhcbiAgICAgICAgICogb3JcbiAgICAgICAgICogLT4gc3dpcGUgZGlzdGFuY2UgaXMgbW9yZSB0aGVuIGEgdGhpcmQgb2YgdGhlIHN3aXBlIGFyZWFcbiAgICAgICAgICpcbiAgICAgICAgICogQGlzVmFsaWRTbGlkZSB7Qm9vbGVhbn1cbiAgICAgICAgICovXG4gICAgICAgIHZhciBpc1ZhbGlkID0gTnVtYmVyKGR1cmF0aW9uKSA8IDMwMCAmJiBNYXRoLmFicyhkZWx0YS54KSA+IDI1IHx8IE1hdGguYWJzKGRlbHRhLngpID4gZnJhbWVXaWR0aCAvIDM7XG5cbiAgICAgICAgLyoqXG4gICAgICAgICAqIGlzIG91dCBvZiBib3VuZHMgaWY6XG4gICAgICAgICAqXG4gICAgICAgICAqIC0+IGluZGV4IGlzIDAgYW5kIGRlbHRhIHggaXMgZ3JlYXRlciB0aGFuIDBcbiAgICAgICAgICogb3JcbiAgICAgICAgICogLT4gaW5kZXggaXMgdGhlIGxhc3Qgc2xpZGUgYW5kIGRlbHRhIGlzIHNtYWxsZXIgdGhhbiAwXG4gICAgICAgICAqXG4gICAgICAgICAqIEBpc091dE9mQm91bmRzIHtCb29sZWFufVxuICAgICAgICAgKi9cbiAgICAgICAgdmFyIGlzT3V0T2ZCb3VuZHMgPSAhaW5kZXggJiYgZGVsdGEueCA+IDAgfHwgaW5kZXggPT09IHNsaWRlcy5sZW5ndGggLSAxICYmIGRlbHRhLnggPCAwO1xuXG4gICAgICAgIHZhciBkaXJlY3Rpb24gPSBkZWx0YS54IDwgMDtcblxuICAgICAgICBpZiAoIWlzU2Nyb2xsaW5nKSB7XG4gICAgICAgICAgICBpZiAoaXNWYWxpZCAmJiAhaXNPdXRPZkJvdW5kcykge1xuICAgICAgICAgICAgICAgIHNsaWRlKGZhbHNlLCBkaXJlY3Rpb24pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0cmFuc2xhdGUocG9zaXRpb24ueCwgb3B0aW9ucy5zbmFwQmFja1NwZWVkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRvdWNoT2Zmc2V0ID0gdW5kZWZpbmVkO1xuXG4gICAgICAgIC8qKlxuICAgICAgICAgKiByZW1vdmUgZXZlbnRsaXN0ZW5lcnMgYWZ0ZXIgc3dpcGUgYXR0ZW1wdFxuICAgICAgICAgKi9cbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgb25Ub3VjaG1vdmUpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uVG91Y2hlbmQpO1xuICAgICAgICBmcmFtZS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvblRvdWNobW92ZSk7XG4gICAgICAgIGZyYW1lLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBvblRvdWNoZW5kKTtcbiAgICAgICAgZnJhbWUucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2VsZWF2ZScsIG9uVG91Y2hlbmQpO1xuXG4gICAgICAgIGRpc3BhdGNoU2xpZGVyRXZlbnQoJ29uJywgJ3RvdWNoZW5kJywge1xuICAgICAgICAgICAgZXZlbnQ6IGV2ZW50XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uQ2xpY2soZXZlbnQpIHtcbiAgICAgICAgaWYgKGRlbHRhLngpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvblJlc2l6ZShldmVudCkge1xuICAgICAgICBpZiAoZnJhbWVXaWR0aCAhPT0gZWxlbWVudFdpZHRoKGZyYW1lKSkge1xuICAgICAgICAgICAgcmVzZXQoKTtcblxuICAgICAgICAgICAgZGlzcGF0Y2hTbGlkZXJFdmVudCgnb24nLCAncmVzaXplJywge1xuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyB0cmlnZ2VyIGluaXRpYWwgc2V0dXBcbiAgICBzZXR1cCgpO1xuXG4gICAgLy8gZXhwb3NlIHB1YmxpYyBhcGlcbiAgICByZXR1cm4ge1xuICAgICAgICBzZXR1cDogc2V0dXAsXG4gICAgICAgIHJlc2V0OiByZXNldCxcbiAgICAgICAgc2xpZGVUbzogc2xpZGVUbyxcbiAgICAgICAgcmV0dXJuSW5kZXg6IHJldHVybkluZGV4LFxuICAgICAgICBwcmV2OiBwcmV2LFxuICAgICAgICBuZXh0OiBuZXh0LFxuICAgICAgICBkZXN0cm95OiBkZXN0cm95XG4gICAgfTtcbn1cblxuLyoqKi8gfSksXG4vKiAxICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGRldGVjdFByZWZpeGVzO1xuLyoqXG4gKiBEZXRlY3RpbmcgcHJlZml4ZXMgZm9yIHNhdmluZyB0aW1lIGFuZCBieXRlc1xuICovXG5mdW5jdGlvbiBkZXRlY3RQcmVmaXhlcygpIHtcbiAgICB2YXIgdHJhbnNmb3JtID0gdm9pZCAwO1xuICAgIHZhciB0cmFuc2l0aW9uID0gdm9pZCAwO1xuICAgIHZhciB0cmFuc2l0aW9uRW5kID0gdm9pZCAwO1xuXG4gICAgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnXycpO1xuICAgICAgICB2YXIgc3R5bGUgPSBlbC5zdHlsZTtcblxuICAgICAgICB2YXIgcHJvcCA9IHZvaWQgMDtcblxuICAgICAgICBpZiAoc3R5bGVbcHJvcCA9ICd3ZWJraXRUcmFuc2l0aW9uJ10gPT09ICcnKSB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uRW5kID0gJ3dlYmtpdFRyYW5zaXRpb25FbmQnO1xuICAgICAgICAgICAgdHJhbnNpdGlvbiA9IHByb3A7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3R5bGVbcHJvcCA9ICd0cmFuc2l0aW9uJ10gPT09ICcnKSB7XG4gICAgICAgICAgICB0cmFuc2l0aW9uRW5kID0gJ3RyYW5zaXRpb25lbmQnO1xuICAgICAgICAgICAgdHJhbnNpdGlvbiA9IHByb3A7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3R5bGVbcHJvcCA9ICd3ZWJraXRUcmFuc2Zvcm0nXSA9PT0gJycpIHtcbiAgICAgICAgICAgIHRyYW5zZm9ybSA9IHByb3A7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3R5bGVbcHJvcCA9ICdtc1RyYW5zZm9ybSddID09PSAnJykge1xuICAgICAgICAgICAgdHJhbnNmb3JtID0gcHJvcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzdHlsZVtwcm9wID0gJ3RyYW5zZm9ybSddID09PSAnJykge1xuICAgICAgICAgICAgdHJhbnNmb3JtID0gcHJvcDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRvY3VtZW50LmJvZHkuaW5zZXJ0QmVmb3JlKGVsLCBudWxsKTtcbiAgICAgICAgc3R5bGVbdHJhbnNmb3JtXSA9ICd0cmFuc2xhdGVYKDApJztcbiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChlbCk7XG4gICAgfSkoKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHRyYW5zZm9ybTogdHJhbnNmb3JtLFxuICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uLFxuICAgICAgICB0cmFuc2l0aW9uRW5kOiB0cmFuc2l0aW9uRW5kXG4gICAgfTtcbn1cblxuLyoqKi8gfSksXG4vKiAyICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cblwidXNlIHN0cmljdFwiO1xuXG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwge1xuICAgIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IGRldGVjdFN1cHBvcnRzUGFzc2l2ZTtcbmZ1bmN0aW9uIGRldGVjdFN1cHBvcnRzUGFzc2l2ZSgpIHtcbiAgICB2YXIgc3VwcG9ydHNQYXNzaXZlID0gZmFsc2U7XG5cbiAgICB0cnkge1xuICAgICAgICB2YXIgb3B0cyA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ3Bhc3NpdmUnLCB7XG4gICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCgpIHtcbiAgICAgICAgICAgICAgICBzdXBwb3J0c1Bhc3NpdmUgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdFBhc3NpdmUnLCBudWxsLCBvcHRzKTtcbiAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3RQYXNzaXZlJywgbnVsbCwgb3B0cyk7XG4gICAgfSBjYXRjaCAoZSkge31cblxuICAgIHJldHVybiBzdXBwb3J0c1Bhc3NpdmU7XG59XG5cbi8qKiovIH0pLFxuLyogMyAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHtcbiAgICB2YWx1ZTogdHJ1ZVxufSk7XG5leHBvcnRzLmRlZmF1bHQgPSBkaXNwYXRjaEV2ZW50O1xuXG52YXIgX2N1c3RvbUV2ZW50ID0gX193ZWJwYWNrX3JlcXVpcmVfXyg0KTtcblxudmFyIF9jdXN0b21FdmVudDIgPSBfaW50ZXJvcFJlcXVpcmVEZWZhdWx0KF9jdXN0b21FdmVudCk7XG5cbmZ1bmN0aW9uIF9pbnRlcm9wUmVxdWlyZURlZmF1bHQob2JqKSB7IHJldHVybiBvYmogJiYgb2JqLl9fZXNNb2R1bGUgPyBvYmogOiB7IGRlZmF1bHQ6IG9iaiB9OyB9XG5cbi8qKlxuICogZGlzcGF0Y2ggY3VzdG9tIGV2ZW50c1xuICpcbiAqIEBwYXJhbSAge2VsZW1lbnR9IGVsICAgICAgICAgc2xpZGVzaG93IGVsZW1lbnRcbiAqIEBwYXJhbSAge3N0cmluZ30gIHR5cGUgICAgICAgY3VzdG9tIGV2ZW50IG5hbWVcbiAqIEBwYXJhbSAge29iamVjdH0gIGRldGFpbCAgICAgY3VzdG9tIGRldGFpbCBpbmZvcm1hdGlvblxuICovXG5mdW5jdGlvbiBkaXNwYXRjaEV2ZW50KHRhcmdldCwgdHlwZSwgZGV0YWlsKSB7XG4gICAgdmFyIGV2ZW50ID0gbmV3IF9jdXN0b21FdmVudDIuZGVmYXVsdCh0eXBlLCB7XG4gICAgICAgIGJ1YmJsZXM6IHRydWUsXG4gICAgICAgIGNhbmNlbGFibGU6IHRydWUsXG4gICAgICAgIGRldGFpbDogZGV0YWlsXG4gICAgfSk7XG5cbiAgICB0YXJnZXQuZGlzcGF0Y2hFdmVudChldmVudCk7XG59XG5cbi8qKiovIH0pLFxuLyogNCAqL1xuLyoqKi8gKGZ1bmN0aW9uKG1vZHVsZSwgZXhwb3J0cywgX193ZWJwYWNrX3JlcXVpcmVfXykge1xuXG4vKiBXRUJQQUNLIFZBUiBJTkpFQ1RJT04gKi8oZnVuY3Rpb24oZ2xvYmFsKSB7XG52YXIgTmF0aXZlQ3VzdG9tRXZlbnQgPSBnbG9iYWwuQ3VzdG9tRXZlbnQ7XG5cbmZ1bmN0aW9uIHVzZU5hdGl2ZSAoKSB7XG4gIHRyeSB7XG4gICAgdmFyIHAgPSBuZXcgTmF0aXZlQ3VzdG9tRXZlbnQoJ2NhdCcsIHsgZGV0YWlsOiB7IGZvbzogJ2JhcicgfSB9KTtcbiAgICByZXR1cm4gICdjYXQnID09PSBwLnR5cGUgJiYgJ2JhcicgPT09IHAuZGV0YWlsLmZvbztcbiAgfSBjYXRjaCAoZSkge1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBDcm9zcy1icm93c2VyIGBDdXN0b21FdmVudGAgY29uc3RydWN0b3IuXG4gKlxuICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0N1c3RvbUV2ZW50LkN1c3RvbUV2ZW50XG4gKlxuICogQHB1YmxpY1xuICovXG5cbm1vZHVsZS5leHBvcnRzID0gdXNlTmF0aXZlKCkgPyBOYXRpdmVDdXN0b21FdmVudCA6XG5cbi8vIElFID49IDlcbid1bmRlZmluZWQnICE9PSB0eXBlb2YgZG9jdW1lbnQgJiYgJ2Z1bmN0aW9uJyA9PT0gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUV2ZW50ID8gZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKHR5cGUsIHBhcmFtcykge1xuICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpO1xuICBpZiAocGFyYW1zKSB7XG4gICAgZS5pbml0Q3VzdG9tRXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlLCBwYXJhbXMuZGV0YWlsKTtcbiAgfSBlbHNlIHtcbiAgICBlLmluaXRDdXN0b21FdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UsIHZvaWQgMCk7XG4gIH1cbiAgcmV0dXJuIGU7XG59IDpcblxuLy8gSUUgPD0gOFxuZnVuY3Rpb24gQ3VzdG9tRXZlbnQgKHR5cGUsIHBhcmFtcykge1xuICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50T2JqZWN0KCk7XG4gIGUudHlwZSA9IHR5cGU7XG4gIGlmIChwYXJhbXMpIHtcbiAgICBlLmJ1YmJsZXMgPSBCb29sZWFuKHBhcmFtcy5idWJibGVzKTtcbiAgICBlLmNhbmNlbGFibGUgPSBCb29sZWFuKHBhcmFtcy5jYW5jZWxhYmxlKTtcbiAgICBlLmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7XG4gIH0gZWxzZSB7XG4gICAgZS5idWJibGVzID0gZmFsc2U7XG4gICAgZS5jYW5jZWxhYmxlID0gZmFsc2U7XG4gICAgZS5kZXRhaWwgPSB2b2lkIDA7XG4gIH1cbiAgcmV0dXJuIGU7XG59XG5cbi8qIFdFQlBBQ0sgVkFSIElOSkVDVElPTiAqL30uY2FsbChleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKDUpKSlcblxuLyoqKi8gfSksXG4vKiA1ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzKSB7XG5cbnZhciBnO1xyXG5cclxuLy8gVGhpcyB3b3JrcyBpbiBub24tc3RyaWN0IG1vZGVcclxuZyA9IChmdW5jdGlvbigpIHtcclxuXHRyZXR1cm4gdGhpcztcclxufSkoKTtcclxuXHJcbnRyeSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiBldmFsIGlzIGFsbG93ZWQgKHNlZSBDU1ApXHJcblx0ZyA9IGcgfHwgRnVuY3Rpb24oXCJyZXR1cm4gdGhpc1wiKSgpIHx8ICgxLGV2YWwpKFwidGhpc1wiKTtcclxufSBjYXRjaChlKSB7XHJcblx0Ly8gVGhpcyB3b3JrcyBpZiB0aGUgd2luZG93IHJlZmVyZW5jZSBpcyBhdmFpbGFibGVcclxuXHRpZih0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiKVxyXG5cdFx0ZyA9IHdpbmRvdztcclxufVxyXG5cclxuLy8gZyBjYW4gc3RpbGwgYmUgdW5kZWZpbmVkLCBidXQgbm90aGluZyB0byBkbyBhYm91dCBpdC4uLlxyXG4vLyBXZSByZXR1cm4gdW5kZWZpbmVkLCBpbnN0ZWFkIG9mIG5vdGhpbmcgaGVyZSwgc28gaXQnc1xyXG4vLyBlYXNpZXIgdG8gaGFuZGxlIHRoaXMgY2FzZS4gaWYoIWdsb2JhbCkgeyAuLi59XHJcblxyXG5tb2R1bGUuZXhwb3J0cyA9IGc7XHJcblxuXG4vKioqLyB9KSxcbi8qIDYgKi9cbi8qKiovIChmdW5jdGlvbihtb2R1bGUsIGV4cG9ydHMsIF9fd2VicGFja19yZXF1aXJlX18pIHtcblxuXCJ1c2Ugc3RyaWN0XCI7XG5cblxuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7XG4gIHZhbHVlOiB0cnVlXG59KTtcbmV4cG9ydHMuZGVmYXVsdCA9IHtcbiAgLyoqXG4gICAqIHNsaWRlcyBzY3JvbGxlZCBhdCBvbmNlXG4gICAqIEBzbGlkZXNUb1Njcm9sbCB7TnVtYmVyfVxuICAgKi9cbiAgc2xpZGVzVG9TY3JvbGw6IDEsXG5cbiAgLyoqXG4gICAqIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgYW5pbWF0aW9uIG9mIGEgdmFsaWQgc2xpZGUgYXR0ZW1wdFxuICAgKiBAc2xpZGVTcGVlZCB7TnVtYmVyfVxuICAgKi9cbiAgc2xpZGVTcGVlZDogMzAwLFxuXG4gIC8qKlxuICAgKiB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIGFuaW1hdGlvbiBvZiB0aGUgcmV3aW5kIGFmdGVyIHRoZSBsYXN0IHNsaWRlXG4gICAqIEByZXdpbmRTcGVlZCB7TnVtYmVyfVxuICAgKi9cbiAgcmV3aW5kU3BlZWQ6IDYwMCxcblxuICAvKipcbiAgICogdGltZSBmb3IgdGhlIHNuYXBCYWNrIG9mIHRoZSBzbGlkZXIgaWYgdGhlIHNsaWRlIGF0dGVtcHQgd2FzIG5vdCB2YWxpZFxuICAgKiBAc25hcEJhY2tTcGVlZCB7TnVtYmVyfVxuICAgKi9cbiAgc25hcEJhY2tTcGVlZDogMjAwLFxuXG4gIC8qKlxuICAgKiBCYXNpYyBlYXNpbmcgZnVuY3Rpb25zOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9kZS9kb2NzL1dlYi9DU1MvdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb25cbiAgICogY3ViaWMgYmV6aWVyIGVhc2luZyBmdW5jdGlvbnM6IGh0dHA6Ly9lYXNpbmdzLm5ldC9kZVxuICAgKiBAZWFzZSB7U3RyaW5nfVxuICAgKi9cbiAgZWFzZTogJ2Vhc2UnLFxuXG4gIC8qKlxuICAgKiBpZiBzbGlkZXIgcmVhY2hlZCB0aGUgbGFzdCBzbGlkZSwgd2l0aCBuZXh0IGNsaWNrIHRoZSBzbGlkZXIgZ29lcyBiYWNrIHRvIHRoZSBzdGFydGluZGV4LlxuICAgKiB1c2UgaW5maW5pdGUgb3IgcmV3aW5kLCBub3QgYm90aFxuICAgKiBAcmV3aW5kIHtCb29sZWFufVxuICAgKi9cbiAgcmV3aW5kOiBmYWxzZSxcblxuICAvKipcbiAgICogbnVtYmVyIG9mIHZpc2libGUgc2xpZGVzIG9yIGZhbHNlXG4gICAqIHVzZSBpbmZpbml0ZSBvciByZXdpbmQsIG5vdCBib3RoXG4gICAqIEBpbmZpbml0ZSB7bnVtYmVyfVxuICAgKi9cbiAgaW5maW5pdGU6IGZhbHNlLFxuXG4gIC8qKlxuICAgKiB0aGUgc2xpZGUgaW5kZXggdG8gc2hvdyB3aGVuIHRoZSBzbGlkZXIgaXMgaW5pdGlhbGl6ZWQuXG4gICAqIEBpbml0aWFsSW5kZXgge251bWJlcn1cbiAgICovXG4gIGluaXRpYWxJbmRleDogMCxcblxuICAvKipcbiAgICogY2xhc3MgbmFtZSBmb3Igc2xpZGVyIGZyYW1lXG4gICAqIEBjbGFzc05hbWVGcmFtZSB7c3RyaW5nfVxuICAgKi9cbiAgY2xhc3NOYW1lRnJhbWU6ICdqc19mcmFtZScsXG5cbiAgLyoqXG4gICAqIGNsYXNzIG5hbWUgZm9yIHNsaWRlcyBjb250YWluZXJcbiAgICogQGNsYXNzTmFtZVNsaWRlQ29udGFpbmVyIHtzdHJpbmd9XG4gICAqL1xuICBjbGFzc05hbWVTbGlkZUNvbnRhaW5lcjogJ2pzX3NsaWRlcycsXG5cbiAgLyoqXG4gICAqIGNsYXNzIG5hbWUgZm9yIHNsaWRlciBwcmV2IGNvbnRyb2xcbiAgICogQGNsYXNzTmFtZVByZXZDdHJsIHtzdHJpbmd9XG4gICAqL1xuICBjbGFzc05hbWVQcmV2Q3RybDogJ2pzX3ByZXYnLFxuXG4gIC8qKlxuICAgKiBjbGFzcyBuYW1lIGZvciBzbGlkZXIgbmV4dCBjb250cm9sXG4gICAqIEBjbGFzc05hbWVOZXh0Q3RybCB7c3RyaW5nfVxuICAgKi9cbiAgY2xhc3NOYW1lTmV4dEN0cmw6ICdqc19uZXh0JyxcblxuICAvKipcbiAgICogY2xhc3MgbmFtZSBmb3IgY3VycmVudCBhY3RpdmUgc2xpZGVcbiAgICogaWYgZW1wdHlTdHJpbmcgdGhlbiBubyBjbGFzcyBpcyBzZXRcbiAgICogQGNsYXNzTmFtZUFjdGl2ZVNsaWRlIHtzdHJpbmd9XG4gICAqL1xuICBjbGFzc05hbWVBY3RpdmVTbGlkZTogJ2FjdGl2ZScsXG5cbiAgLyoqXG4gICAqIGVuYWJsZXMgbW91c2UgZXZlbnRzIGZvciBzd2lwaW5nIG9uIGRlc2t0b3AgZGV2aWNlc1xuICAgKiBAZW5hYmxlTW91c2VFdmVudHMge2Jvb2xlYW59XG4gICAqL1xuICBlbmFibGVNb3VzZUV2ZW50czogZmFsc2UsXG5cbiAgLyoqXG4gICAqIHdpbmRvdyBpbnN0YW5jZVxuICAgKiBAd2luZG93IHtvYmplY3R9XG4gICAqL1xuICB3aW5kb3c6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnID8gd2luZG93IDogbnVsbCxcblxuICAvKipcbiAgICogSWYgZmFsc2UsIHNsaWRlcyBsb3J5IHRvIHRoZSBmaXJzdCBzbGlkZSBvbiB3aW5kb3cgcmVzaXplLlxuICAgKiBAcmV3aW5kT25SZXNpemUge2Jvb2xlYW59XG4gICAqL1xuICByZXdpbmRPblJlc2l6ZTogdHJ1ZVxufTtcblxuLyoqKi8gfSksXG4vKiA3ICovXG4vKioqLyAoZnVuY3Rpb24obW9kdWxlLCBleHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKSB7XG5cbm1vZHVsZS5leHBvcnRzID0gX193ZWJwYWNrX3JlcXVpcmVfXygwKTtcblxuXG4vKioqLyB9KVxuLyoqKioqKi8gXSk7XG59KTsiLCJpZiAod2luZG93Lk5vZGVMaXN0ICYmICFOb2RlTGlzdC5wcm90b3R5cGUuZm9yRWFjaCkge1xyXG4gICAgTm9kZUxpc3QucHJvdG90eXBlLmZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHRoaXNBcmcpIHtcclxuICAgICAgICB0aGlzQXJnID0gdGhpc0FyZyB8fCB3aW5kb3c7XHJcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XHJcbiAgICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpc0FyZywgdGhpc1tpXSwgaSwgdGhpcyk7XHJcbiAgICAgICAgfVxyXG4gICAgfTtcclxufVxyXG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgcmVwbGFjZSA9IFN0cmluZy5wcm90b3R5cGUucmVwbGFjZTtcbnZhciBwZXJjZW50VHdlbnRpZXMgPSAvJTIwL2c7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgICdkZWZhdWx0JzogJ1JGQzM5ODYnLFxuICAgIGZvcm1hdHRlcnM6IHtcbiAgICAgICAgUkZDMTczODogZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVwbGFjZS5jYWxsKHZhbHVlLCBwZXJjZW50VHdlbnRpZXMsICcrJyk7XG4gICAgICAgIH0sXG4gICAgICAgIFJGQzM5ODY6IGZ1bmN0aW9uICh2YWx1ZSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBSRkMxNzM4OiAnUkZDMTczOCcsXG4gICAgUkZDMzk4NjogJ1JGQzM5ODYnXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgc3RyaW5naWZ5ID0gcmVxdWlyZSgnLi9zdHJpbmdpZnknKTtcbnZhciBwYXJzZSA9IHJlcXVpcmUoJy4vcGFyc2UnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGZvcm1hdHM6IGZvcm1hdHMsXG4gICAgcGFyc2U6IHBhcnNlLFxuICAgIHN0cmluZ2lmeTogc3RyaW5naWZ5XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG5cbnZhciBoYXMgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG52YXIgZGVmYXVsdHMgPSB7XG4gICAgYWxsb3dEb3RzOiBmYWxzZSxcbiAgICBhbGxvd1Byb3RvdHlwZXM6IGZhbHNlLFxuICAgIGFycmF5TGltaXQ6IDIwLFxuICAgIGNoYXJzZXQ6ICd1dGYtOCcsXG4gICAgY2hhcnNldFNlbnRpbmVsOiBmYWxzZSxcbiAgICBjb21tYTogZmFsc2UsXG4gICAgZGVjb2RlcjogdXRpbHMuZGVjb2RlLFxuICAgIGRlbGltaXRlcjogJyYnLFxuICAgIGRlcHRoOiA1LFxuICAgIGlnbm9yZVF1ZXJ5UHJlZml4OiBmYWxzZSxcbiAgICBpbnRlcnByZXROdW1lcmljRW50aXRpZXM6IGZhbHNlLFxuICAgIHBhcmFtZXRlckxpbWl0OiAxMDAwLFxuICAgIHBhcnNlQXJyYXlzOiB0cnVlLFxuICAgIHBsYWluT2JqZWN0czogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIGludGVycHJldE51bWVyaWNFbnRpdGllcyA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICByZXR1cm4gc3RyLnJlcGxhY2UoLyYjKFxcZCspOy9nLCBmdW5jdGlvbiAoJDAsIG51bWJlclN0cikge1xuICAgICAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChudW1iZXJTdHIsIDEwKSk7XG4gICAgfSk7XG59O1xuXG4vLyBUaGlzIGlzIHdoYXQgYnJvd3NlcnMgd2lsbCBzdWJtaXQgd2hlbiB0aGUg4pyTIGNoYXJhY3RlciBvY2N1cnMgaW4gYW5cbi8vIGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCBib2R5IGFuZCB0aGUgZW5jb2Rpbmcgb2YgdGhlIHBhZ2UgY29udGFpbmluZ1xuLy8gdGhlIGZvcm0gaXMgaXNvLTg4NTktMSwgb3Igd2hlbiB0aGUgc3VibWl0dGVkIGZvcm0gaGFzIGFuIGFjY2VwdC1jaGFyc2V0XG4vLyBhdHRyaWJ1dGUgb2YgaXNvLTg4NTktMS4gUHJlc3VtYWJseSBhbHNvIHdpdGggb3RoZXIgY2hhcnNldHMgdGhhdCBkbyBub3QgY29udGFpblxuLy8gdGhlIOKckyBjaGFyYWN0ZXIsIHN1Y2ggYXMgdXMtYXNjaWkuXG52YXIgaXNvU2VudGluZWwgPSAndXRmOD0lMjYlMjMxMDAwMyUzQic7IC8vIGVuY29kZVVSSUNvbXBvbmVudCgnJiMxMDAwMzsnKVxuXG4vLyBUaGVzZSBhcmUgdGhlIHBlcmNlbnQtZW5jb2RlZCB1dGYtOCBvY3RldHMgcmVwcmVzZW50aW5nIGEgY2hlY2ttYXJrLCBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3QgYWN0dWFsbHkgaXMgdXRmLTggZW5jb2RlZC5cbnZhciBjaGFyc2V0U2VudGluZWwgPSAndXRmOD0lRTIlOUMlOTMnOyAvLyBlbmNvZGVVUklDb21wb25lbnQoJ+KckycpXG5cbnZhciBwYXJzZVZhbHVlcyA9IGZ1bmN0aW9uIHBhcnNlUXVlcnlTdHJpbmdWYWx1ZXMoc3RyLCBvcHRpb25zKSB7XG4gICAgdmFyIG9iaiA9IHt9O1xuICAgIHZhciBjbGVhblN0ciA9IG9wdGlvbnMuaWdub3JlUXVlcnlQcmVmaXggPyBzdHIucmVwbGFjZSgvXlxcPy8sICcnKSA6IHN0cjtcbiAgICB2YXIgbGltaXQgPSBvcHRpb25zLnBhcmFtZXRlckxpbWl0ID09PSBJbmZpbml0eSA/IHVuZGVmaW5lZCA6IG9wdGlvbnMucGFyYW1ldGVyTGltaXQ7XG4gICAgdmFyIHBhcnRzID0gY2xlYW5TdHIuc3BsaXQob3B0aW9ucy5kZWxpbWl0ZXIsIGxpbWl0KTtcbiAgICB2YXIgc2tpcEluZGV4ID0gLTE7IC8vIEtlZXAgdHJhY2sgb2Ygd2hlcmUgdGhlIHV0Zjggc2VudGluZWwgd2FzIGZvdW5kXG4gICAgdmFyIGk7XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdGlvbnMuY2hhcnNldDtcbiAgICBpZiAob3B0aW9ucy5jaGFyc2V0U2VudGluZWwpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHBhcnRzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICBpZiAocGFydHNbaV0uaW5kZXhPZigndXRmOD0nKSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChwYXJ0c1tpXSA9PT0gY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAndXRmLTgnO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFydHNbaV0gPT09IGlzb1NlbnRpbmVsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNoYXJzZXQgPSAnaXNvLTg4NTktMSc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNraXBJbmRleCA9IGk7XG4gICAgICAgICAgICAgICAgaSA9IHBhcnRzLmxlbmd0aDsgLy8gVGhlIGVzbGludCBzZXR0aW5ncyBkbyBub3QgYWxsb3cgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgcGFydHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgaWYgKGkgPT09IHNraXBJbmRleCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHBhcnQgPSBwYXJ0c1tpXTtcblxuICAgICAgICB2YXIgYnJhY2tldEVxdWFsc1BvcyA9IHBhcnQuaW5kZXhPZignXT0nKTtcbiAgICAgICAgdmFyIHBvcyA9IGJyYWNrZXRFcXVhbHNQb3MgPT09IC0xID8gcGFydC5pbmRleE9mKCc9JykgOiBicmFja2V0RXF1YWxzUG9zICsgMTtcblxuICAgICAgICB2YXIga2V5LCB2YWw7XG4gICAgICAgIGlmIChwb3MgPT09IC0xKSB7XG4gICAgICAgICAgICBrZXkgPSBvcHRpb25zLmRlY29kZXIocGFydCwgZGVmYXVsdHMuZGVjb2RlciwgY2hhcnNldCk7XG4gICAgICAgICAgICB2YWwgPSBvcHRpb25zLnN0cmljdE51bGxIYW5kbGluZyA/IG51bGwgOiAnJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGtleSA9IG9wdGlvbnMuZGVjb2RlcihwYXJ0LnNsaWNlKDAsIHBvcyksIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQpO1xuICAgICAgICAgICAgdmFsID0gb3B0aW9ucy5kZWNvZGVyKHBhcnQuc2xpY2UocG9zICsgMSksIGRlZmF1bHRzLmRlY29kZXIsIGNoYXJzZXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBvcHRpb25zLmludGVycHJldE51bWVyaWNFbnRpdGllcyAmJiBjaGFyc2V0ID09PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgICAgIHZhbCA9IGludGVycHJldE51bWVyaWNFbnRpdGllcyh2YWwpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHZhbCAmJiBvcHRpb25zLmNvbW1hICYmIHZhbC5pbmRleE9mKCcsJykgPiAtMSkge1xuICAgICAgICAgICAgdmFsID0gdmFsLnNwbGl0KCcsJyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoaGFzLmNhbGwob2JqLCBrZXkpKSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHV0aWxzLmNvbWJpbmUob2JqW2tleV0sIHZhbCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBvYmpba2V5XSA9IHZhbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBvYmo7XG59O1xuXG52YXIgcGFyc2VPYmplY3QgPSBmdW5jdGlvbiAoY2hhaW4sIHZhbCwgb3B0aW9ucykge1xuICAgIHZhciBsZWFmID0gdmFsO1xuXG4gICAgZm9yICh2YXIgaSA9IGNoYWluLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBvYmo7XG4gICAgICAgIHZhciByb290ID0gY2hhaW5baV07XG5cbiAgICAgICAgaWYgKHJvb3QgPT09ICdbXScgJiYgb3B0aW9ucy5wYXJzZUFycmF5cykge1xuICAgICAgICAgICAgb2JqID0gW10uY29uY2F0KGxlYWYpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb2JqID0gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgICAgICAgICB2YXIgY2xlYW5Sb290ID0gcm9vdC5jaGFyQXQoMCkgPT09ICdbJyAmJiByb290LmNoYXJBdChyb290Lmxlbmd0aCAtIDEpID09PSAnXScgPyByb290LnNsaWNlKDEsIC0xKSA6IHJvb3Q7XG4gICAgICAgICAgICB2YXIgaW5kZXggPSBwYXJzZUludChjbGVhblJvb3QsIDEwKTtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5wYXJzZUFycmF5cyAmJiBjbGVhblJvb3QgPT09ICcnKSB7XG4gICAgICAgICAgICAgICAgb2JqID0geyAwOiBsZWFmIH07XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICFpc05hTihpbmRleClcbiAgICAgICAgICAgICAgICAmJiByb290ICE9PSBjbGVhblJvb3RcbiAgICAgICAgICAgICAgICAmJiBTdHJpbmcoaW5kZXgpID09PSBjbGVhblJvb3RcbiAgICAgICAgICAgICAgICAmJiBpbmRleCA+PSAwXG4gICAgICAgICAgICAgICAgJiYgKG9wdGlvbnMucGFyc2VBcnJheXMgJiYgaW5kZXggPD0gb3B0aW9ucy5hcnJheUxpbWl0KVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgb2JqID0gW107XG4gICAgICAgICAgICAgICAgb2JqW2luZGV4XSA9IGxlYWY7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIG9ialtjbGVhblJvb3RdID0gbGVhZjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxlYWYgPSBvYmo7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYWY7XG59O1xuXG52YXIgcGFyc2VLZXlzID0gZnVuY3Rpb24gcGFyc2VRdWVyeVN0cmluZ0tleXMoZ2l2ZW5LZXksIHZhbCwgb3B0aW9ucykge1xuICAgIGlmICghZ2l2ZW5LZXkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIFRyYW5zZm9ybSBkb3Qgbm90YXRpb24gdG8gYnJhY2tldCBub3RhdGlvblxuICAgIHZhciBrZXkgPSBvcHRpb25zLmFsbG93RG90cyA/IGdpdmVuS2V5LnJlcGxhY2UoL1xcLihbXi5bXSspL2csICdbJDFdJykgOiBnaXZlbktleTtcblxuICAgIC8vIFRoZSByZWdleCBjaHVua3NcblxuICAgIHZhciBicmFja2V0cyA9IC8oXFxbW15bXFxdXSpdKS87XG4gICAgdmFyIGNoaWxkID0gLyhcXFtbXltcXF1dKl0pL2c7XG5cbiAgICAvLyBHZXQgdGhlIHBhcmVudFxuXG4gICAgdmFyIHNlZ21lbnQgPSBicmFja2V0cy5leGVjKGtleSk7XG4gICAgdmFyIHBhcmVudCA9IHNlZ21lbnQgPyBrZXkuc2xpY2UoMCwgc2VnbWVudC5pbmRleCkgOiBrZXk7XG5cbiAgICAvLyBTdGFzaCB0aGUgcGFyZW50IGlmIGl0IGV4aXN0c1xuXG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBpZiAocGFyZW50KSB7XG4gICAgICAgIC8vIElmIHdlIGFyZW4ndCB1c2luZyBwbGFpbiBvYmplY3RzLCBvcHRpb25hbGx5IHByZWZpeCBrZXlzIHRoYXQgd291bGQgb3ZlcndyaXRlIG9iamVjdCBwcm90b3R5cGUgcHJvcGVydGllc1xuICAgICAgICBpZiAoIW9wdGlvbnMucGxhaW5PYmplY3RzICYmIGhhcy5jYWxsKE9iamVjdC5wcm90b3R5cGUsIHBhcmVudCkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBrZXlzLnB1c2gocGFyZW50KTtcbiAgICB9XG5cbiAgICAvLyBMb29wIHRocm91Z2ggY2hpbGRyZW4gYXBwZW5kaW5nIHRvIHRoZSBhcnJheSB1bnRpbCB3ZSBoaXQgZGVwdGhcblxuICAgIHZhciBpID0gMDtcbiAgICB3aGlsZSAoKHNlZ21lbnQgPSBjaGlsZC5leGVjKGtleSkpICE9PSBudWxsICYmIGkgPCBvcHRpb25zLmRlcHRoKSB7XG4gICAgICAgIGkgKz0gMTtcbiAgICAgICAgaWYgKCFvcHRpb25zLnBsYWluT2JqZWN0cyAmJiBoYXMuY2FsbChPYmplY3QucHJvdG90eXBlLCBzZWdtZW50WzFdLnNsaWNlKDEsIC0xKSkpIHtcbiAgICAgICAgICAgIGlmICghb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAga2V5cy5wdXNoKHNlZ21lbnRbMV0pO1xuICAgIH1cblxuICAgIC8vIElmIHRoZXJlJ3MgYSByZW1haW5kZXIsIGp1c3QgYWRkIHdoYXRldmVyIGlzIGxlZnRcblxuICAgIGlmIChzZWdtZW50KSB7XG4gICAgICAgIGtleXMucHVzaCgnWycgKyBrZXkuc2xpY2Uoc2VnbWVudC5pbmRleCkgKyAnXScpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJzZU9iamVjdChrZXlzLCB2YWwsIG9wdGlvbnMpO1xufTtcblxudmFyIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyA9IGZ1bmN0aW9uIG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5kZWNvZGVyICE9PSBudWxsICYmIG9wdHMuZGVjb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRzLmRlY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRGVjb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIG9wdHMuY2hhcnNldCAhPT0gJ3VuZGVmaW5lZCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAndXRmLTgnICYmIG9wdHMuY2hhcnNldCAhPT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG4gICAgdmFyIGNoYXJzZXQgPSB0eXBlb2Ygb3B0cy5jaGFyc2V0ID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmNoYXJzZXQgOiBvcHRzLmNoYXJzZXQ7XG5cbiAgICByZXR1cm4ge1xuICAgICAgICBhbGxvd0RvdHM6IHR5cGVvZiBvcHRzLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5hbGxvd0RvdHMgOiAhIW9wdHMuYWxsb3dEb3RzLFxuICAgICAgICBhbGxvd1Byb3RvdHlwZXM6IHR5cGVvZiBvcHRzLmFsbG93UHJvdG90eXBlcyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hbGxvd1Byb3RvdHlwZXMgOiBkZWZhdWx0cy5hbGxvd1Byb3RvdHlwZXMsXG4gICAgICAgIGFycmF5TGltaXQ6IHR5cGVvZiBvcHRzLmFycmF5TGltaXQgPT09ICdudW1iZXInID8gb3B0cy5hcnJheUxpbWl0IDogZGVmYXVsdHMuYXJyYXlMaW1pdCxcbiAgICAgICAgY2hhcnNldDogY2hhcnNldCxcbiAgICAgICAgY2hhcnNldFNlbnRpbmVsOiB0eXBlb2Ygb3B0cy5jaGFyc2V0U2VudGluZWwgPT09ICdib29sZWFuJyA/IG9wdHMuY2hhcnNldFNlbnRpbmVsIDogZGVmYXVsdHMuY2hhcnNldFNlbnRpbmVsLFxuICAgICAgICBjb21tYTogdHlwZW9mIG9wdHMuY29tbWEgPT09ICdib29sZWFuJyA/IG9wdHMuY29tbWEgOiBkZWZhdWx0cy5jb21tYSxcbiAgICAgICAgZGVjb2RlcjogdHlwZW9mIG9wdHMuZGVjb2RlciA9PT0gJ2Z1bmN0aW9uJyA/IG9wdHMuZGVjb2RlciA6IGRlZmF1bHRzLmRlY29kZXIsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAnc3RyaW5nJyB8fCB1dGlscy5pc1JlZ0V4cChvcHRzLmRlbGltaXRlcikgPyBvcHRzLmRlbGltaXRlciA6IGRlZmF1bHRzLmRlbGltaXRlcixcbiAgICAgICAgZGVwdGg6IHR5cGVvZiBvcHRzLmRlcHRoID09PSAnbnVtYmVyJyA/IG9wdHMuZGVwdGggOiBkZWZhdWx0cy5kZXB0aCxcbiAgICAgICAgaWdub3JlUXVlcnlQcmVmaXg6IG9wdHMuaWdub3JlUXVlcnlQcmVmaXggPT09IHRydWUsXG4gICAgICAgIGludGVycHJldE51bWVyaWNFbnRpdGllczogdHlwZW9mIG9wdHMuaW50ZXJwcmV0TnVtZXJpY0VudGl0aWVzID09PSAnYm9vbGVhbicgPyBvcHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyA6IGRlZmF1bHRzLmludGVycHJldE51bWVyaWNFbnRpdGllcyxcbiAgICAgICAgcGFyYW1ldGVyTGltaXQ6IHR5cGVvZiBvcHRzLnBhcmFtZXRlckxpbWl0ID09PSAnbnVtYmVyJyA/IG9wdHMucGFyYW1ldGVyTGltaXQgOiBkZWZhdWx0cy5wYXJhbWV0ZXJMaW1pdCxcbiAgICAgICAgcGFyc2VBcnJheXM6IG9wdHMucGFyc2VBcnJheXMgIT09IGZhbHNlLFxuICAgICAgICBwbGFpbk9iamVjdHM6IHR5cGVvZiBvcHRzLnBsYWluT2JqZWN0cyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5wbGFpbk9iamVjdHMgOiBkZWZhdWx0cy5wbGFpbk9iamVjdHMsXG4gICAgICAgIHN0cmljdE51bGxIYW5kbGluZzogdHlwZW9mIG9wdHMuc3RyaWN0TnVsbEhhbmRsaW5nID09PSAnYm9vbGVhbicgPyBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA6IGRlZmF1bHRzLnN0cmljdE51bGxIYW5kbGluZ1xuICAgIH07XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChzdHIsIG9wdHMpIHtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVBhcnNlT3B0aW9ucyhvcHRzKTtcblxuICAgIGlmIChzdHIgPT09ICcnIHx8IHN0ciA9PT0gbnVsbCB8fCB0eXBlb2Ygc3RyID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gb3B0aW9ucy5wbGFpbk9iamVjdHMgPyBPYmplY3QuY3JlYXRlKG51bGwpIDoge307XG4gICAgfVxuXG4gICAgdmFyIHRlbXBPYmogPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHBhcnNlVmFsdWVzKHN0ciwgb3B0aW9ucykgOiBzdHI7XG4gICAgdmFyIG9iaiA9IG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuXG4gICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBrZXlzIGFuZCBzZXR1cCB0aGUgbmV3IG9iamVjdFxuXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh0ZW1wT2JqKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgIHZhciBuZXdPYmogPSBwYXJzZUtleXMoa2V5LCB0ZW1wT2JqW2tleV0sIG9wdGlvbnMpO1xuICAgICAgICBvYmogPSB1dGlscy5tZXJnZShvYmosIG5ld09iaiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHV0aWxzLmNvbXBhY3Qob2JqKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBmb3JtYXRzID0gcmVxdWlyZSgnLi9mb3JtYXRzJyk7XG52YXIgaGFzID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxudmFyIGFycmF5UHJlZml4R2VuZXJhdG9ycyA9IHtcbiAgICBicmFja2V0czogZnVuY3Rpb24gYnJhY2tldHMocHJlZml4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgICAgIHJldHVybiBwcmVmaXggKyAnW10nO1xuICAgIH0sXG4gICAgY29tbWE6ICdjb21tYScsXG4gICAgaW5kaWNlczogZnVuY3Rpb24gaW5kaWNlcyhwcmVmaXgsIGtleSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gcHJlZml4ICsgJ1snICsga2V5ICsgJ10nO1xuICAgIH0sXG4gICAgcmVwZWF0OiBmdW5jdGlvbiByZXBlYXQocHJlZml4KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZnVuYy1uYW1lLW1hdGNoaW5nXG4gICAgICAgIHJldHVybiBwcmVmaXg7XG4gICAgfVxufTtcblxudmFyIGlzQXJyYXkgPSBBcnJheS5pc0FycmF5O1xudmFyIHB1c2ggPSBBcnJheS5wcm90b3R5cGUucHVzaDtcbnZhciBwdXNoVG9BcnJheSA9IGZ1bmN0aW9uIChhcnIsIHZhbHVlT3JBcnJheSkge1xuICAgIHB1c2guYXBwbHkoYXJyLCBpc0FycmF5KHZhbHVlT3JBcnJheSkgPyB2YWx1ZU9yQXJyYXkgOiBbdmFsdWVPckFycmF5XSk7XG59O1xuXG52YXIgdG9JU08gPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZztcblxudmFyIGRlZmF1bHRzID0ge1xuICAgIGFkZFF1ZXJ5UHJlZml4OiBmYWxzZSxcbiAgICBhbGxvd0RvdHM6IGZhbHNlLFxuICAgIGNoYXJzZXQ6ICd1dGYtOCcsXG4gICAgY2hhcnNldFNlbnRpbmVsOiBmYWxzZSxcbiAgICBkZWxpbWl0ZXI6ICcmJyxcbiAgICBlbmNvZGU6IHRydWUsXG4gICAgZW5jb2RlcjogdXRpbHMuZW5jb2RlLFxuICAgIGVuY29kZVZhbHVlc09ubHk6IGZhbHNlLFxuICAgIGZvcm1hdHRlcjogZm9ybWF0cy5mb3JtYXR0ZXJzW2Zvcm1hdHNbJ2RlZmF1bHQnXV0sXG4gICAgLy8gZGVwcmVjYXRlZFxuICAgIGluZGljZXM6IGZhbHNlLFxuICAgIHNlcmlhbGl6ZURhdGU6IGZ1bmN0aW9uIHNlcmlhbGl6ZURhdGUoZGF0ZSkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIGZ1bmMtbmFtZS1tYXRjaGluZ1xuICAgICAgICByZXR1cm4gdG9JU08uY2FsbChkYXRlKTtcbiAgICB9LFxuICAgIHNraXBOdWxsczogZmFsc2UsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nOiBmYWxzZVxufTtcblxudmFyIHN0cmluZ2lmeSA9IGZ1bmN0aW9uIHN0cmluZ2lmeSggLy8gZXNsaW50LWRpc2FibGUtbGluZSBmdW5jLW5hbWUtbWF0Y2hpbmdcbiAgICBvYmplY3QsXG4gICAgcHJlZml4LFxuICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgIHNraXBOdWxscyxcbiAgICBlbmNvZGVyLFxuICAgIGZpbHRlcixcbiAgICBzb3J0LFxuICAgIGFsbG93RG90cyxcbiAgICBzZXJpYWxpemVEYXRlLFxuICAgIGZvcm1hdHRlcixcbiAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgIGNoYXJzZXRcbikge1xuICAgIHZhciBvYmogPSBvYmplY3Q7XG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb2JqID0gZmlsdGVyKHByZWZpeCwgb2JqKTtcbiAgICB9IGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIERhdGUpIHtcbiAgICAgICAgb2JqID0gc2VyaWFsaXplRGF0ZShvYmopO1xuICAgIH0gZWxzZSBpZiAoZ2VuZXJhdGVBcnJheVByZWZpeCA9PT0gJ2NvbW1hJyAmJiBpc0FycmF5KG9iaikpIHtcbiAgICAgICAgb2JqID0gb2JqLmpvaW4oJywnKTtcbiAgICB9XG5cbiAgICBpZiAob2JqID09PSBudWxsKSB7XG4gICAgICAgIGlmIChzdHJpY3ROdWxsSGFuZGxpbmcpIHtcbiAgICAgICAgICAgIHJldHVybiBlbmNvZGVyICYmICFlbmNvZGVWYWx1ZXNPbmx5ID8gZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQpIDogcHJlZml4O1xuICAgICAgICB9XG5cbiAgICAgICAgb2JqID0gJyc7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnIHx8IHR5cGVvZiBvYmogPT09ICdudW1iZXInIHx8IHR5cGVvZiBvYmogPT09ICdib29sZWFuJyB8fCB1dGlscy5pc0J1ZmZlcihvYmopKSB7XG4gICAgICAgIGlmIChlbmNvZGVyKSB7XG4gICAgICAgICAgICB2YXIga2V5VmFsdWUgPSBlbmNvZGVWYWx1ZXNPbmx5ID8gcHJlZml4IDogZW5jb2RlcihwcmVmaXgsIGRlZmF1bHRzLmVuY29kZXIsIGNoYXJzZXQpO1xuICAgICAgICAgICAgcmV0dXJuIFtmb3JtYXR0ZXIoa2V5VmFsdWUpICsgJz0nICsgZm9ybWF0dGVyKGVuY29kZXIob2JqLCBkZWZhdWx0cy5lbmNvZGVyLCBjaGFyc2V0KSldO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbZm9ybWF0dGVyKHByZWZpeCkgKyAnPScgKyBmb3JtYXR0ZXIoU3RyaW5nKG9iaikpXTtcbiAgICB9XG5cbiAgICB2YXIgdmFsdWVzID0gW107XG5cbiAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlcztcbiAgICB9XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICBpZiAoaXNBcnJheShmaWx0ZXIpKSB7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgICAgICBvYmpLZXlzID0gc29ydCA/IGtleXMuc29ydChzb3J0KSA6IGtleXM7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2ldO1xuXG4gICAgICAgIGlmIChza2lwTnVsbHMgJiYgb2JqW2tleV0gPT09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzQXJyYXkob2JqKSkge1xuICAgICAgICAgICAgcHVzaFRvQXJyYXkodmFsdWVzLCBzdHJpbmdpZnkoXG4gICAgICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICAgICAgdHlwZW9mIGdlbmVyYXRlQXJyYXlQcmVmaXggPT09ICdmdW5jdGlvbicgPyBnZW5lcmF0ZUFycmF5UHJlZml4KHByZWZpeCwga2V5KSA6IHByZWZpeCxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgICAgIHN0cmljdE51bGxIYW5kbGluZyxcbiAgICAgICAgICAgICAgICBza2lwTnVsbHMsXG4gICAgICAgICAgICAgICAgZW5jb2RlcixcbiAgICAgICAgICAgICAgICBmaWx0ZXIsXG4gICAgICAgICAgICAgICAgc29ydCxcbiAgICAgICAgICAgICAgICBhbGxvd0RvdHMsXG4gICAgICAgICAgICAgICAgc2VyaWFsaXplRGF0ZSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIsXG4gICAgICAgICAgICAgICAgZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgICAgICAgICBjaGFyc2V0XG4gICAgICAgICAgICApKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHB1c2hUb0FycmF5KHZhbHVlcywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgICAgIG9ialtrZXldLFxuICAgICAgICAgICAgICAgIHByZWZpeCArIChhbGxvd0RvdHMgPyAnLicgKyBrZXkgOiAnWycgKyBrZXkgKyAnXScpLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQXJyYXlQcmVmaXgsXG4gICAgICAgICAgICAgICAgc3RyaWN0TnVsbEhhbmRsaW5nLFxuICAgICAgICAgICAgICAgIHNraXBOdWxscyxcbiAgICAgICAgICAgICAgICBlbmNvZGVyLFxuICAgICAgICAgICAgICAgIGZpbHRlcixcbiAgICAgICAgICAgICAgICBzb3J0LFxuICAgICAgICAgICAgICAgIGFsbG93RG90cyxcbiAgICAgICAgICAgICAgICBzZXJpYWxpemVEYXRlLFxuICAgICAgICAgICAgICAgIGZvcm1hdHRlcixcbiAgICAgICAgICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICAgICAgICAgIGNoYXJzZXRcbiAgICAgICAgICAgICkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlcztcbn07XG5cbnZhciBub3JtYWxpemVTdHJpbmdpZnlPcHRpb25zID0gZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5naWZ5T3B0aW9ucyhvcHRzKSB7XG4gICAgaWYgKCFvcHRzKSB7XG4gICAgICAgIHJldHVybiBkZWZhdWx0cztcbiAgICB9XG5cbiAgICBpZiAob3B0cy5lbmNvZGVyICE9PSBudWxsICYmIG9wdHMuZW5jb2RlciAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRzLmVuY29kZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRW5jb2RlciBoYXMgdG8gYmUgYSBmdW5jdGlvbi4nKTtcbiAgICB9XG5cbiAgICB2YXIgY2hhcnNldCA9IG9wdHMuY2hhcnNldCB8fCBkZWZhdWx0cy5jaGFyc2V0O1xuICAgIGlmICh0eXBlb2Ygb3B0cy5jaGFyc2V0ICE9PSAndW5kZWZpbmVkJyAmJiBvcHRzLmNoYXJzZXQgIT09ICd1dGYtOCcgJiYgb3B0cy5jaGFyc2V0ICE9PSAnaXNvLTg4NTktMScpIHtcbiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIGNoYXJzZXQgb3B0aW9uIG11c3QgYmUgZWl0aGVyIHV0Zi04LCBpc28tODg1OS0xLCBvciB1bmRlZmluZWQnKTtcbiAgICB9XG5cbiAgICB2YXIgZm9ybWF0ID0gZm9ybWF0c1snZGVmYXVsdCddO1xuICAgIGlmICh0eXBlb2Ygb3B0cy5mb3JtYXQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIGlmICghaGFzLmNhbGwoZm9ybWF0cy5mb3JtYXR0ZXJzLCBvcHRzLmZvcm1hdCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZm9ybWF0IG9wdGlvbiBwcm92aWRlZC4nKTtcbiAgICAgICAgfVxuICAgICAgICBmb3JtYXQgPSBvcHRzLmZvcm1hdDtcbiAgICB9XG4gICAgdmFyIGZvcm1hdHRlciA9IGZvcm1hdHMuZm9ybWF0dGVyc1tmb3JtYXRdO1xuXG4gICAgdmFyIGZpbHRlciA9IGRlZmF1bHRzLmZpbHRlcjtcbiAgICBpZiAodHlwZW9mIG9wdHMuZmlsdGVyID09PSAnZnVuY3Rpb24nIHx8IGlzQXJyYXkob3B0cy5maWx0ZXIpKSB7XG4gICAgICAgIGZpbHRlciA9IG9wdHMuZmlsdGVyO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIGFkZFF1ZXJ5UHJlZml4OiB0eXBlb2Ygb3B0cy5hZGRRdWVyeVByZWZpeCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5hZGRRdWVyeVByZWZpeCA6IGRlZmF1bHRzLmFkZFF1ZXJ5UHJlZml4LFxuICAgICAgICBhbGxvd0RvdHM6IHR5cGVvZiBvcHRzLmFsbG93RG90cyA9PT0gJ3VuZGVmaW5lZCcgPyBkZWZhdWx0cy5hbGxvd0RvdHMgOiAhIW9wdHMuYWxsb3dEb3RzLFxuICAgICAgICBjaGFyc2V0OiBjaGFyc2V0LFxuICAgICAgICBjaGFyc2V0U2VudGluZWw6IHR5cGVvZiBvcHRzLmNoYXJzZXRTZW50aW5lbCA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5jaGFyc2V0U2VudGluZWwgOiBkZWZhdWx0cy5jaGFyc2V0U2VudGluZWwsXG4gICAgICAgIGRlbGltaXRlcjogdHlwZW9mIG9wdHMuZGVsaW1pdGVyID09PSAndW5kZWZpbmVkJyA/IGRlZmF1bHRzLmRlbGltaXRlciA6IG9wdHMuZGVsaW1pdGVyLFxuICAgICAgICBlbmNvZGU6IHR5cGVvZiBvcHRzLmVuY29kZSA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5lbmNvZGUgOiBkZWZhdWx0cy5lbmNvZGUsXG4gICAgICAgIGVuY29kZXI6IHR5cGVvZiBvcHRzLmVuY29kZXIgPT09ICdmdW5jdGlvbicgPyBvcHRzLmVuY29kZXIgOiBkZWZhdWx0cy5lbmNvZGVyLFxuICAgICAgICBlbmNvZGVWYWx1ZXNPbmx5OiB0eXBlb2Ygb3B0cy5lbmNvZGVWYWx1ZXNPbmx5ID09PSAnYm9vbGVhbicgPyBvcHRzLmVuY29kZVZhbHVlc09ubHkgOiBkZWZhdWx0cy5lbmNvZGVWYWx1ZXNPbmx5LFxuICAgICAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICAgICAgZm9ybWF0dGVyOiBmb3JtYXR0ZXIsXG4gICAgICAgIHNlcmlhbGl6ZURhdGU6IHR5cGVvZiBvcHRzLnNlcmlhbGl6ZURhdGUgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNlcmlhbGl6ZURhdGUgOiBkZWZhdWx0cy5zZXJpYWxpemVEYXRlLFxuICAgICAgICBza2lwTnVsbHM6IHR5cGVvZiBvcHRzLnNraXBOdWxscyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5za2lwTnVsbHMgOiBkZWZhdWx0cy5za2lwTnVsbHMsXG4gICAgICAgIHNvcnQ6IHR5cGVvZiBvcHRzLnNvcnQgPT09ICdmdW5jdGlvbicgPyBvcHRzLnNvcnQgOiBudWxsLFxuICAgICAgICBzdHJpY3ROdWxsSGFuZGxpbmc6IHR5cGVvZiBvcHRzLnN0cmljdE51bGxIYW5kbGluZyA9PT0gJ2Jvb2xlYW4nID8gb3B0cy5zdHJpY3ROdWxsSGFuZGxpbmcgOiBkZWZhdWx0cy5zdHJpY3ROdWxsSGFuZGxpbmdcbiAgICB9O1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqZWN0LCBvcHRzKSB7XG4gICAgdmFyIG9iaiA9IG9iamVjdDtcbiAgICB2YXIgb3B0aW9ucyA9IG5vcm1hbGl6ZVN0cmluZ2lmeU9wdGlvbnMob3B0cyk7XG5cbiAgICB2YXIgb2JqS2V5cztcbiAgICB2YXIgZmlsdGVyO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBmaWx0ZXIgPSBvcHRpb25zLmZpbHRlcjtcbiAgICAgICAgb2JqID0gZmlsdGVyKCcnLCBvYmopO1xuICAgIH0gZWxzZSBpZiAoaXNBcnJheShvcHRpb25zLmZpbHRlcikpIHtcbiAgICAgICAgZmlsdGVyID0gb3B0aW9ucy5maWx0ZXI7XG4gICAgICAgIG9iaktleXMgPSBmaWx0ZXI7XG4gICAgfVxuXG4gICAgdmFyIGtleXMgPSBbXTtcblxuICAgIGlmICh0eXBlb2Ygb2JqICE9PSAnb2JqZWN0JyB8fCBvYmogPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIHZhciBhcnJheUZvcm1hdDtcbiAgICBpZiAob3B0cyAmJiBvcHRzLmFycmF5Rm9ybWF0IGluIGFycmF5UHJlZml4R2VuZXJhdG9ycykge1xuICAgICAgICBhcnJheUZvcm1hdCA9IG9wdHMuYXJyYXlGb3JtYXQ7XG4gICAgfSBlbHNlIGlmIChvcHRzICYmICdpbmRpY2VzJyBpbiBvcHRzKSB7XG4gICAgICAgIGFycmF5Rm9ybWF0ID0gb3B0cy5pbmRpY2VzID8gJ2luZGljZXMnIDogJ3JlcGVhdCc7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYXJyYXlGb3JtYXQgPSAnaW5kaWNlcyc7XG4gICAgfVxuXG4gICAgdmFyIGdlbmVyYXRlQXJyYXlQcmVmaXggPSBhcnJheVByZWZpeEdlbmVyYXRvcnNbYXJyYXlGb3JtYXRdO1xuXG4gICAgaWYgKCFvYmpLZXlzKSB7XG4gICAgICAgIG9iaktleXMgPSBPYmplY3Qua2V5cyhvYmopO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLnNvcnQpIHtcbiAgICAgICAgb2JqS2V5cy5zb3J0KG9wdGlvbnMuc29ydCk7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmpLZXlzLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBrZXkgPSBvYmpLZXlzW2ldO1xuXG4gICAgICAgIGlmIChvcHRpb25zLnNraXBOdWxscyAmJiBvYmpba2V5XSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgcHVzaFRvQXJyYXkoa2V5cywgc3RyaW5naWZ5KFxuICAgICAgICAgICAgb2JqW2tleV0sXG4gICAgICAgICAgICBrZXksXG4gICAgICAgICAgICBnZW5lcmF0ZUFycmF5UHJlZml4LFxuICAgICAgICAgICAgb3B0aW9ucy5zdHJpY3ROdWxsSGFuZGxpbmcsXG4gICAgICAgICAgICBvcHRpb25zLnNraXBOdWxscyxcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlID8gb3B0aW9ucy5lbmNvZGVyIDogbnVsbCxcbiAgICAgICAgICAgIG9wdGlvbnMuZmlsdGVyLFxuICAgICAgICAgICAgb3B0aW9ucy5zb3J0LFxuICAgICAgICAgICAgb3B0aW9ucy5hbGxvd0RvdHMsXG4gICAgICAgICAgICBvcHRpb25zLnNlcmlhbGl6ZURhdGUsXG4gICAgICAgICAgICBvcHRpb25zLmZvcm1hdHRlcixcbiAgICAgICAgICAgIG9wdGlvbnMuZW5jb2RlVmFsdWVzT25seSxcbiAgICAgICAgICAgIG9wdGlvbnMuY2hhcnNldFxuICAgICAgICApKTtcbiAgICB9XG5cbiAgICB2YXIgam9pbmVkID0ga2V5cy5qb2luKG9wdGlvbnMuZGVsaW1pdGVyKTtcbiAgICB2YXIgcHJlZml4ID0gb3B0aW9ucy5hZGRRdWVyeVByZWZpeCA9PT0gdHJ1ZSA/ICc/JyA6ICcnO1xuXG4gICAgaWYgKG9wdGlvbnMuY2hhcnNldFNlbnRpbmVsKSB7XG4gICAgICAgIGlmIChvcHRpb25zLmNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICAgICAgLy8gZW5jb2RlVVJJQ29tcG9uZW50KCcmIzEwMDAzOycpLCB0aGUgXCJudW1lcmljIGVudGl0eVwiIHJlcHJlc2VudGF0aW9uIG9mIGEgY2hlY2ttYXJrXG4gICAgICAgICAgICBwcmVmaXggKz0gJ3V0Zjg9JTI2JTIzMTAwMDMlM0ImJztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIGVuY29kZVVSSUNvbXBvbmVudCgn4pyTJylcbiAgICAgICAgICAgIHByZWZpeCArPSAndXRmOD0lRTIlOUMlOTMmJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBqb2luZWQubGVuZ3RoID4gMCA/IHByZWZpeCArIGpvaW5lZCA6ICcnO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGhhcyA9IE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHk7XG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7XG5cbnZhciBoZXhUYWJsZSA9IChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFycmF5ID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7ICsraSkge1xuICAgICAgICBhcnJheS5wdXNoKCclJyArICgoaSA8IDE2ID8gJzAnIDogJycpICsgaS50b1N0cmluZygxNikpLnRvVXBwZXJDYXNlKCkpO1xuICAgIH1cblxuICAgIHJldHVybiBhcnJheTtcbn0oKSk7XG5cbnZhciBjb21wYWN0UXVldWUgPSBmdW5jdGlvbiBjb21wYWN0UXVldWUocXVldWUpIHtcbiAgICB3aGlsZSAocXVldWUubGVuZ3RoID4gMSkge1xuICAgICAgICB2YXIgaXRlbSA9IHF1ZXVlLnBvcCgpO1xuICAgICAgICB2YXIgb2JqID0gaXRlbS5vYmpbaXRlbS5wcm9wXTtcblxuICAgICAgICBpZiAoaXNBcnJheShvYmopKSB7XG4gICAgICAgICAgICB2YXIgY29tcGFjdGVkID0gW107XG5cbiAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb2JqLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvYmpbal0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbXBhY3RlZC5wdXNoKG9ialtqXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpdGVtLm9ialtpdGVtLnByb3BdID0gY29tcGFjdGVkO1xuICAgICAgICB9XG4gICAgfVxufTtcblxudmFyIGFycmF5VG9PYmplY3QgPSBmdW5jdGlvbiBhcnJheVRvT2JqZWN0KHNvdXJjZSwgb3B0aW9ucykge1xuICAgIHZhciBvYmogPSBvcHRpb25zICYmIG9wdGlvbnMucGxhaW5PYmplY3RzID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IHt9O1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc291cmNlW2ldICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgb2JqW2ldID0gc291cmNlW2ldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9iajtcbn07XG5cbnZhciBtZXJnZSA9IGZ1bmN0aW9uIG1lcmdlKHRhcmdldCwgc291cmNlLCBvcHRpb25zKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIHNvdXJjZSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgaWYgKGlzQXJyYXkodGFyZ2V0KSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2goc291cmNlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0YXJnZXQgJiYgdHlwZW9mIHRhcmdldCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgIGlmICgob3B0aW9ucyAmJiAob3B0aW9ucy5wbGFpbk9iamVjdHMgfHwgb3B0aW9ucy5hbGxvd1Byb3RvdHlwZXMpKSB8fCAhaGFzLmNhbGwoT2JqZWN0LnByb3RvdHlwZSwgc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHRhcmdldFtzb3VyY2VdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbdGFyZ2V0LCBzb3VyY2VdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICBpZiAoIXRhcmdldCB8fCB0eXBlb2YgdGFyZ2V0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXR1cm4gW3RhcmdldF0uY29uY2F0KHNvdXJjZSk7XG4gICAgfVxuXG4gICAgdmFyIG1lcmdlVGFyZ2V0ID0gdGFyZ2V0O1xuICAgIGlmIChpc0FycmF5KHRhcmdldCkgJiYgIWlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBtZXJnZVRhcmdldCA9IGFycmF5VG9PYmplY3QodGFyZ2V0LCBvcHRpb25zKTtcbiAgICB9XG5cbiAgICBpZiAoaXNBcnJheSh0YXJnZXQpICYmIGlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICBzb3VyY2UuZm9yRWFjaChmdW5jdGlvbiAoaXRlbSwgaSkge1xuICAgICAgICAgICAgaWYgKGhhcy5jYWxsKHRhcmdldCwgaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0SXRlbSA9IHRhcmdldFtpXTtcbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0SXRlbSAmJiB0eXBlb2YgdGFyZ2V0SXRlbSA9PT0gJ29iamVjdCcgJiYgaXRlbSAmJiB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W2ldID0gbWVyZ2UodGFyZ2V0SXRlbSwgaXRlbSwgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRbaV0gPSBpdGVtO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRhcmdldDtcbiAgICB9XG5cbiAgICByZXR1cm4gT2JqZWN0LmtleXMoc291cmNlKS5yZWR1Y2UoZnVuY3Rpb24gKGFjYywga2V5KSB7XG4gICAgICAgIHZhciB2YWx1ZSA9IHNvdXJjZVtrZXldO1xuXG4gICAgICAgIGlmIChoYXMuY2FsbChhY2MsIGtleSkpIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gbWVyZ2UoYWNjW2tleV0sIHZhbHVlLCBvcHRpb25zKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGFjY1trZXldID0gdmFsdWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGFjYztcbiAgICB9LCBtZXJnZVRhcmdldCk7XG59O1xuXG52YXIgYXNzaWduID0gZnVuY3Rpb24gYXNzaWduU2luZ2xlU291cmNlKHRhcmdldCwgc291cmNlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKHNvdXJjZSkucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgICAgICBhY2Nba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICByZXR1cm4gYWNjO1xuICAgIH0sIHRhcmdldCk7XG59O1xuXG52YXIgZGVjb2RlID0gZnVuY3Rpb24gKHN0ciwgZGVjb2RlciwgY2hhcnNldCkge1xuICAgIHZhciBzdHJXaXRob3V0UGx1cyA9IHN0ci5yZXBsYWNlKC9cXCsvZywgJyAnKTtcbiAgICBpZiAoY2hhcnNldCA9PT0gJ2lzby04ODU5LTEnKSB7XG4gICAgICAgIC8vIHVuZXNjYXBlIG5ldmVyIHRocm93cywgbm8gdHJ5Li4uY2F0Y2ggbmVlZGVkOlxuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXMucmVwbGFjZSgvJVswLTlhLWZdezJ9L2dpLCB1bmVzY2FwZSk7XG4gICAgfVxuICAgIC8vIHV0Zi04XG4gICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChzdHJXaXRob3V0UGx1cyk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICByZXR1cm4gc3RyV2l0aG91dFBsdXM7XG4gICAgfVxufTtcblxudmFyIGVuY29kZSA9IGZ1bmN0aW9uIGVuY29kZShzdHIsIGRlZmF1bHRFbmNvZGVyLCBjaGFyc2V0KSB7XG4gICAgLy8gVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQnJpYW4gV2hpdGUgKG1zY2RleCkgZm9yIHRoZSBpby5qcyBjb3JlIHF1ZXJ5c3RyaW5nIGxpYnJhcnkuXG4gICAgLy8gSXQgaGFzIGJlZW4gYWRhcHRlZCBoZXJlIGZvciBzdHJpY3RlciBhZGhlcmVuY2UgdG8gUkZDIDM5ODZcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH1cblxuICAgIHZhciBzdHJpbmcgPSB0eXBlb2Ygc3RyID09PSAnc3RyaW5nJyA/IHN0ciA6IFN0cmluZyhzdHIpO1xuXG4gICAgaWYgKGNoYXJzZXQgPT09ICdpc28tODg1OS0xJykge1xuICAgICAgICByZXR1cm4gZXNjYXBlKHN0cmluZykucmVwbGFjZSgvJXVbMC05YS1mXXs0fS9naSwgZnVuY3Rpb24gKCQwKSB7XG4gICAgICAgICAgICByZXR1cm4gJyUyNiUyMycgKyBwYXJzZUludCgkMC5zbGljZSgyKSwgMTYpICsgJyUzQic7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHZhciBvdXQgPSAnJztcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0cmluZy5sZW5ndGg7ICsraSkge1xuICAgICAgICB2YXIgYyA9IHN0cmluZy5jaGFyQ29kZUF0KGkpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGMgPT09IDB4MkQgLy8gLVxuICAgICAgICAgICAgfHwgYyA9PT0gMHgyRSAvLyAuXG4gICAgICAgICAgICB8fCBjID09PSAweDVGIC8vIF9cbiAgICAgICAgICAgIHx8IGMgPT09IDB4N0UgLy8gflxuICAgICAgICAgICAgfHwgKGMgPj0gMHgzMCAmJiBjIDw9IDB4MzkpIC8vIDAtOVxuICAgICAgICAgICAgfHwgKGMgPj0gMHg0MSAmJiBjIDw9IDB4NUEpIC8vIGEtelxuICAgICAgICAgICAgfHwgKGMgPj0gMHg2MSAmJiBjIDw9IDB4N0EpIC8vIEEtWlxuICAgICAgICApIHtcbiAgICAgICAgICAgIG91dCArPSBzdHJpbmcuY2hhckF0KGkpO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIHtcbiAgICAgICAgICAgIG91dCA9IG91dCArIGhleFRhYmxlW2NdO1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyAoaGV4VGFibGVbMHhDMCB8IChjID4+IDYpXSArIGhleFRhYmxlWzB4ODAgfCAoYyAmIDB4M0YpXSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjIDwgMHhEODAwIHx8IGMgPj0gMHhFMDAwKSB7XG4gICAgICAgICAgICBvdXQgPSBvdXQgKyAoaGV4VGFibGVbMHhFMCB8IChjID4+IDEyKV0gKyBoZXhUYWJsZVsweDgwIHwgKChjID4+IDYpICYgMHgzRildICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildKTtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaSArPSAxO1xuICAgICAgICBjID0gMHgxMDAwMCArICgoKGMgJiAweDNGRikgPDwgMTApIHwgKHN0cmluZy5jaGFyQ29kZUF0KGkpICYgMHgzRkYpKTtcbiAgICAgICAgb3V0ICs9IGhleFRhYmxlWzB4RjAgfCAoYyA+PiAxOCldXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gMTIpICYgMHgzRildXG4gICAgICAgICAgICArIGhleFRhYmxlWzB4ODAgfCAoKGMgPj4gNikgJiAweDNGKV1cbiAgICAgICAgICAgICsgaGV4VGFibGVbMHg4MCB8IChjICYgMHgzRildO1xuICAgIH1cblxuICAgIHJldHVybiBvdXQ7XG59O1xuXG52YXIgY29tcGFjdCA9IGZ1bmN0aW9uIGNvbXBhY3QodmFsdWUpIHtcbiAgICB2YXIgcXVldWUgPSBbeyBvYmo6IHsgbzogdmFsdWUgfSwgcHJvcDogJ28nIH1dO1xuICAgIHZhciByZWZzID0gW107XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIHZhciBpdGVtID0gcXVldWVbaV07XG4gICAgICAgIHZhciBvYmogPSBpdGVtLm9ialtpdGVtLnByb3BdO1xuXG4gICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXMob2JqKTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrZXlzLmxlbmd0aDsgKytqKSB7XG4gICAgICAgICAgICB2YXIga2V5ID0ga2V5c1tqXTtcbiAgICAgICAgICAgIHZhciB2YWwgPSBvYmpba2V5XTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiB2YWwgIT09IG51bGwgJiYgcmVmcy5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgcXVldWUucHVzaCh7IG9iajogb2JqLCBwcm9wOiBrZXkgfSk7XG4gICAgICAgICAgICAgICAgcmVmcy5wdXNoKHZhbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb21wYWN0UXVldWUocXVldWUpO1xuXG4gICAgcmV0dXJuIHZhbHVlO1xufTtcblxudmFyIGlzUmVnRXhwID0gZnVuY3Rpb24gaXNSZWdFeHAob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBSZWdFeHBdJztcbn07XG5cbnZhciBpc0J1ZmZlciA9IGZ1bmN0aW9uIGlzQnVmZmVyKG9iaikge1xuICAgIGlmICghb2JqIHx8IHR5cGVvZiBvYmogIT09ICdvYmplY3QnKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gISEob2JqLmNvbnN0cnVjdG9yICYmIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKSk7XG59O1xuXG52YXIgY29tYmluZSA9IGZ1bmN0aW9uIGNvbWJpbmUoYSwgYikge1xuICAgIHJldHVybiBbXS5jb25jYXQoYSwgYik7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBhcnJheVRvT2JqZWN0OiBhcnJheVRvT2JqZWN0LFxuICAgIGFzc2lnbjogYXNzaWduLFxuICAgIGNvbWJpbmU6IGNvbWJpbmUsXG4gICAgY29tcGFjdDogY29tcGFjdCxcbiAgICBkZWNvZGU6IGRlY29kZSxcbiAgICBlbmNvZGU6IGVuY29kZSxcbiAgICBpc0J1ZmZlcjogaXNCdWZmZXIsXG4gICAgaXNSZWdFeHA6IGlzUmVnRXhwLFxuICAgIG1lcmdlOiBtZXJnZVxufTtcbiIsIjsvKiEgc2hvd2Rvd24gdiAyLjEuMCAtIDIxLTA0LTIwMjIgKi9cclxuKGZ1bmN0aW9uKCl7XHJcbi8qKlxuICogQ3JlYXRlZCBieSBUaXZpZSBvbiAxMy0wNy0yMDE1LlxuICovXG5cbmZ1bmN0aW9uIGdldERlZmF1bHRPcHRzIChzaW1wbGUpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBkZWZhdWx0T3B0aW9ucyA9IHtcbiAgICBvbWl0RXh0cmFXTEluQ29kZUJsb2Nrczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnT21pdCB0aGUgZGVmYXVsdCBleHRyYSB3aGl0ZWxpbmUgYWRkZWQgdG8gY29kZSBibG9ja3MnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBub0hlYWRlcklkOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdUdXJuIG9uL29mZiBnZW5lcmF0ZWQgaGVhZGVyIGlkJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgcHJlZml4SGVhZGVySWQ6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ0FkZCBhIHByZWZpeCB0byB0aGUgZ2VuZXJhdGVkIGhlYWRlciBpZHMuIFBhc3NpbmcgYSBzdHJpbmcgd2lsbCBwcmVmaXggdGhhdCBzdHJpbmcgdG8gdGhlIGhlYWRlciBpZC4gU2V0dGluZyB0byB0cnVlIHdpbGwgYWRkIGEgZ2VuZXJpYyBcXCdzZWN0aW9uLVxcJyBwcmVmaXgnLFxuICAgICAgdHlwZTogJ3N0cmluZydcbiAgICB9LFxuICAgIHJhd1ByZWZpeEhlYWRlcklkOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdTZXR0aW5nIHRoaXMgb3B0aW9uIHRvIHRydWUgd2lsbCBwcmV2ZW50IHNob3dkb3duIGZyb20gbW9kaWZ5aW5nIHRoZSBwcmVmaXguIFRoaXMgbWlnaHQgcmVzdWx0IGluIG1hbGZvcm1lZCBJRHMgKGlmLCBmb3IgaW5zdGFuY2UsIHRoZSBcIiBjaGFyIGlzIHVzZWQgaW4gdGhlIHByZWZpeCknLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBnaENvbXBhdGlibGVIZWFkZXJJZDoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnR2VuZXJhdGUgaGVhZGVyIGlkcyBjb21wYXRpYmxlIHdpdGggZ2l0aHViIHN0eWxlIChzcGFjZXMgYXJlIHJlcGxhY2VkIHdpdGggZGFzaGVzLCBhIGJ1bmNoIG9mIG5vbiBhbHBoYW51bWVyaWMgY2hhcnMgYXJlIHJlbW92ZWQpJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgcmF3SGVhZGVySWQ6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1JlbW92ZSBvbmx5IHNwYWNlcywgXFwnIGFuZCBcIiBmcm9tIGdlbmVyYXRlZCBoZWFkZXIgaWRzIChpbmNsdWRpbmcgcHJlZml4ZXMpLCByZXBsYWNpbmcgdGhlbSB3aXRoIGRhc2hlcyAoLSkuIFdBUk5JTkc6IFRoaXMgbWlnaHQgcmVzdWx0IGluIG1hbGZvcm1lZCBpZHMnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBoZWFkZXJMZXZlbFN0YXJ0OiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdUaGUgaGVhZGVyIGJsb2NrcyBsZXZlbCBzdGFydCcsXG4gICAgICB0eXBlOiAnaW50ZWdlcidcbiAgICB9LFxuICAgIHBhcnNlSW1nRGltZW5zaW9uczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnVHVybiBvbi9vZmYgaW1hZ2UgZGltZW5zaW9uIHBhcnNpbmcnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBzaW1wbGlmaWVkQXV0b0xpbms6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1R1cm4gb24vb2ZmIEdGTSBhdXRvbGluayBzdHlsZScsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIGV4Y2x1ZGVUcmFpbGluZ1B1bmN0dWF0aW9uRnJvbVVSTHM6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ0V4Y2x1ZGVzIHRyYWlsaW5nIHB1bmN0dWF0aW9uIGZyb20gbGlua3MgZ2VuZXJhdGVkIHdpdGggYXV0b0xpbmtpbmcnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBsaXRlcmFsTWlkV29yZFVuZGVyc2NvcmVzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdQYXJzZSBtaWR3b3JkIHVuZGVyc2NvcmVzIGFzIGxpdGVyYWwgdW5kZXJzY29yZXMnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBsaXRlcmFsTWlkV29yZEFzdGVyaXNrczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnUGFyc2UgbWlkd29yZCBhc3Rlcmlza3MgYXMgbGl0ZXJhbCBhc3Rlcmlza3MnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBzdHJpa2V0aHJvdWdoOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdUdXJuIG9uL29mZiBzdHJpa2V0aHJvdWdoIHN1cHBvcnQnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICB0YWJsZXM6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1R1cm4gb24vb2ZmIHRhYmxlcyBzdXBwb3J0JyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgdGFibGVzSGVhZGVySWQ6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ0FkZCBhbiBpZCB0byB0YWJsZSBoZWFkZXJzJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgZ2hDb2RlQmxvY2tzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgICBkZXNjcmliZTogJ1R1cm4gb24vb2ZmIEdGTSBmZW5jZWQgY29kZSBibG9ja3Mgc3VwcG9ydCcsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIHRhc2tsaXN0czoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnVHVybiBvbi9vZmYgR0ZNIHRhc2tsaXN0IHN1cHBvcnQnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBzbW9vdGhMaXZlUHJldmlldzoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnUHJldmVudHMgd2VpcmQgZWZmZWN0cyBpbiBsaXZlIHByZXZpZXdzIGR1ZSB0byBpbmNvbXBsZXRlIGlucHV0JyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgc21hcnRJbmRlbnRhdGlvbkZpeDoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnVHJpZXMgdG8gc21hcnRseSBmaXggaW5kZW50YXRpb24gaW4gZXM2IHN0cmluZ3MnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBkaXNhYmxlRm9yY2VkNFNwYWNlc0luZGVudGVkU3VibGlzdHM6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ0Rpc2FibGVzIHRoZSByZXF1aXJlbWVudCBvZiBpbmRlbnRpbmcgbmVzdGVkIHN1Ymxpc3RzIGJ5IDQgc3BhY2VzJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgc2ltcGxlTGluZUJyZWFrczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnUGFyc2VzIHNpbXBsZSBsaW5lIGJyZWFrcyBhcyA8YnI+IChHRk0gU3R5bGUpJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgcmVxdWlyZVNwYWNlQmVmb3JlSGVhZGluZ1RleHQ6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ01ha2VzIGFkZGluZyBhIHNwYWNlIGJldHdlZW4gYCNgIGFuZCB0aGUgaGVhZGVyIHRleHQgbWFuZGF0b3J5IChHRk0gU3R5bGUpJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgZ2hNZW50aW9uczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnRW5hYmxlcyBnaXRodWIgQG1lbnRpb25zJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgZ2hNZW50aW9uc0xpbms6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogJ2h0dHBzOi8vZ2l0aHViLmNvbS97dX0nLFxuICAgICAgZGVzY3JpYmU6ICdDaGFuZ2VzIHRoZSBsaW5rIGdlbmVyYXRlZCBieSBAbWVudGlvbnMuIE9ubHkgYXBwbGllcyBpZiBnaE1lbnRpb25zIG9wdGlvbiBpcyBlbmFibGVkLicsXG4gICAgICB0eXBlOiAnc3RyaW5nJ1xuICAgIH0sXG4gICAgZW5jb2RlRW1haWxzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgICBkZXNjcmliZTogJ0VuY29kZSBlLW1haWwgYWRkcmVzc2VzIHRocm91Z2ggdGhlIHVzZSBvZiBDaGFyYWN0ZXIgRW50aXRpZXMsIHRyYW5zZm9ybWluZyBBU0NJSSBlLW1haWwgYWRkcmVzc2VzIGludG8gaXRzIGVxdWl2YWxlbnQgZGVjaW1hbCBlbnRpdGllcycsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIG9wZW5MaW5rc0luTmV3V2luZG93OiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdPcGVuIGFsbCBsaW5rcyBpbiBuZXcgd2luZG93cycsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIGJhY2tzbGFzaEVzY2FwZXNIVE1MVGFnczoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnU3VwcG9ydCBmb3IgSFRNTCBUYWcgZXNjYXBpbmcuIGV4OiBcXDxkaXY+Zm9vXFw8L2Rpdj4nLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBlbW9qaToge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnRW5hYmxlIGVtb2ppIHN1cHBvcnQuIEV4OiBgdGhpcyBpcyBhIDpzbWlsZTogZW1vamlgJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH0sXG4gICAgdW5kZXJsaW5lOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICAgICAgZGVzY3JpYmU6ICdFbmFibGUgc3VwcG9ydCBmb3IgdW5kZXJsaW5lLiBTeW50YXggaXMgZG91YmxlIG9yIHRyaXBsZSB1bmRlcnNjb3JlczogYF9fdW5kZXJsaW5lIHdvcmRfX2AuIFdpdGggdGhpcyBvcHRpb24gZW5hYmxlZCwgdW5kZXJzY29yZXMgbm8gbG9uZ2VyIHBhcnNlcyBpbnRvIGA8ZW0+YCBhbmQgYDxzdHJvbmc+YCcsXG4gICAgICB0eXBlOiAnYm9vbGVhbidcbiAgICB9LFxuICAgIGVsbGlwc2lzOiB7XG4gICAgICBkZWZhdWx0VmFsdWU6IHRydWUsXG4gICAgICBkZXNjcmliZTogJ1JlcGxhY2VzIHRocmVlIGRvdHMgd2l0aCB0aGUgZWxsaXBzaXMgdW5pY29kZSBjaGFyYWN0ZXInLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBjb21wbGV0ZUhUTUxEb2N1bWVudDoge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnT3V0cHV0cyBhIGNvbXBsZXRlIGh0bWwgZG9jdW1lbnQsIGluY2x1ZGluZyBgPGh0bWw+YCwgYDxoZWFkPmAgYW5kIGA8Ym9keT5gIHRhZ3MnLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBtZXRhZGF0YToge1xuICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgICAgIGRlc2NyaWJlOiAnRW5hYmxlIHN1cHBvcnQgZm9yIGRvY3VtZW50IG1ldGFkYXRhIChkZWZpbmVkIGF0IHRoZSB0b3Agb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gYMKrwqvCq2AgYW5kIGDCu8K7wrtgIG9yIGJldHdlZW4gYC0tLWAgYW5kIGAtLS1gKS4nLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nXG4gICAgfSxcbiAgICBzcGxpdEFkamFjZW50QmxvY2txdW90ZXM6IHtcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmFsc2UsXG4gICAgICBkZXNjcmliZTogJ1NwbGl0IGFkamFjZW50IGJsb2NrcXVvdGUgYmxvY2tzJyxcbiAgICAgIHR5cGU6ICdib29sZWFuJ1xuICAgIH1cbiAgfTtcbiAgaWYgKHNpbXBsZSA9PT0gZmFsc2UpIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShkZWZhdWx0T3B0aW9ucykpO1xuICB9XG4gIHZhciByZXQgPSB7fTtcbiAgZm9yICh2YXIgb3B0IGluIGRlZmF1bHRPcHRpb25zKSB7XG4gICAgaWYgKGRlZmF1bHRPcHRpb25zLmhhc093blByb3BlcnR5KG9wdCkpIHtcbiAgICAgIHJldFtvcHRdID0gZGVmYXVsdE9wdGlvbnNbb3B0XS5kZWZhdWx0VmFsdWU7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXQ7XG59XG5cbmZ1bmN0aW9uIGFsbE9wdGlvbnNPbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIG9wdGlvbnMgPSBnZXREZWZhdWx0T3B0cyh0cnVlKSxcbiAgICAgIHJldCA9IHt9O1xuICBmb3IgKHZhciBvcHQgaW4gb3B0aW9ucykge1xuICAgIGlmIChvcHRpb25zLmhhc093blByb3BlcnR5KG9wdCkpIHtcbiAgICAgIHJldFtvcHRdID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJldDtcbn1cblxyXG4vKipcbiAqIENyZWF0ZWQgYnkgVGl2aWUgb24gMDYtMDEtMjAxNS5cbiAqL1xuXG4vLyBQcml2YXRlIHByb3BlcnRpZXNcbnZhciBzaG93ZG93biA9IHt9LFxuICAgIHBhcnNlcnMgPSB7fSxcbiAgICBleHRlbnNpb25zID0ge30sXG4gICAgZ2xvYmFsT3B0aW9ucyA9IGdldERlZmF1bHRPcHRzKHRydWUpLFxuICAgIHNldEZsYXZvciA9ICd2YW5pbGxhJyxcbiAgICBmbGF2b3IgPSB7XG4gICAgICBnaXRodWI6IHtcbiAgICAgICAgb21pdEV4dHJhV0xJbkNvZGVCbG9ja3M6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBzaW1wbGlmaWVkQXV0b0xpbms6ICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIGV4Y2x1ZGVUcmFpbGluZ1B1bmN0dWF0aW9uRnJvbVVSTHM6ICAgdHJ1ZSxcbiAgICAgICAgbGl0ZXJhbE1pZFdvcmRVbmRlcnNjb3JlczogICAgICAgICAgICB0cnVlLFxuICAgICAgICBzdHJpa2V0aHJvdWdoOiAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHRhYmxlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgdGFibGVzSGVhZGVySWQ6ICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBnaENvZGVCbG9ja3M6ICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHRhc2tsaXN0czogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgZGlzYWJsZUZvcmNlZDRTcGFjZXNJbmRlbnRlZFN1Ymxpc3RzOiB0cnVlLFxuICAgICAgICBzaW1wbGVMaW5lQnJlYWtzOiAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHJlcXVpcmVTcGFjZUJlZm9yZUhlYWRpbmdUZXh0OiAgICAgICAgdHJ1ZSxcbiAgICAgICAgZ2hDb21wYXRpYmxlSGVhZGVySWQ6ICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBnaE1lbnRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIGJhY2tzbGFzaEVzY2FwZXNIVE1MVGFnczogICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgZW1vamk6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBzcGxpdEFkamFjZW50QmxvY2txdW90ZXM6ICAgICAgICAgICAgIHRydWVcbiAgICAgIH0sXG4gICAgICBvcmlnaW5hbDoge1xuICAgICAgICBub0hlYWRlcklkOiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIGdoQ29kZUJsb2NrczogICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgIH0sXG4gICAgICBnaG9zdDoge1xuICAgICAgICBvbWl0RXh0cmFXTEluQ29kZUJsb2NrczogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHBhcnNlSW1nRGltZW5zaW9uczogICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc2ltcGxpZmllZEF1dG9MaW5rOiAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICBleGNsdWRlVHJhaWxpbmdQdW5jdHVhdGlvbkZyb21VUkxzOiAgIHRydWUsXG4gICAgICAgIGxpdGVyYWxNaWRXb3JkVW5kZXJzY29yZXM6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc3RyaWtldGhyb3VnaDogICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICB0YWJsZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHRhYmxlc0hlYWRlcklkOiAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgZ2hDb2RlQmxvY2tzOiAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICB0YXNrbGlzdHM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgIHNtb290aExpdmVQcmV2aWV3OiAgICAgICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgc2ltcGxlTGluZUJyZWFrczogICAgICAgICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICByZXF1aXJlU3BhY2VCZWZvcmVIZWFkaW5nVGV4dDogICAgICAgIHRydWUsXG4gICAgICAgIGdoTWVudGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgIGVuY29kZUVtYWlsczogICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgfSxcbiAgICAgIHZhbmlsbGE6IGdldERlZmF1bHRPcHRzKHRydWUpLFxuICAgICAgYWxsT246IGFsbE9wdGlvbnNPbigpXG4gICAgfTtcblxuLyoqXG4gKiBoZWxwZXIgbmFtZXNwYWNlXG4gKiBAdHlwZSB7e319XG4gKi9cbnNob3dkb3duLmhlbHBlciA9IHt9O1xuXG4vKipcbiAqIFRPRE8gTEVHQUNZIFNVUFBPUlQgQ09ERVxuICogQHR5cGUge3t9fVxuICovXG5zaG93ZG93bi5leHRlbnNpb25zID0ge307XG5cbi8qKlxuICogU2V0IGEgZ2xvYmFsIG9wdGlvblxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHBhcmFtIHsqfSB2YWx1ZVxuICogQHJldHVybnMge3Nob3dkb3dufVxuICovXG5zaG93ZG93bi5zZXRPcHRpb24gPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAndXNlIHN0cmljdCc7XG4gIGdsb2JhbE9wdGlvbnNba2V5XSA9IHZhbHVlO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8qKlxuICogR2V0IGEgZ2xvYmFsIG9wdGlvblxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICogQHJldHVybnMgeyp9XG4gKi9cbnNob3dkb3duLmdldE9wdGlvbiA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICByZXR1cm4gZ2xvYmFsT3B0aW9uc1trZXldO1xufTtcblxuLyoqXG4gKiBHZXQgdGhlIGdsb2JhbCBvcHRpb25zXG4gKiBAc3RhdGljXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbnNob3dkb3duLmdldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgcmV0dXJuIGdsb2JhbE9wdGlvbnM7XG59O1xuXG4vKipcbiAqIFJlc2V0IGdsb2JhbCBvcHRpb25zIHRvIHRoZSBkZWZhdWx0IHZhbHVlc1xuICogQHN0YXRpY1xuICovXG5zaG93ZG93bi5yZXNldE9wdGlvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgZ2xvYmFsT3B0aW9ucyA9IGdldERlZmF1bHRPcHRzKHRydWUpO1xufTtcblxuLyoqXG4gKiBTZXQgdGhlIGZsYXZvciBzaG93ZG93biBzaG91bGQgdXNlIGFzIGRlZmF1bHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gKi9cbnNob3dkb3duLnNldEZsYXZvciA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgaWYgKCFmbGF2b3IuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICB0aHJvdyBFcnJvcihuYW1lICsgJyBmbGF2b3Igd2FzIG5vdCBmb3VuZCcpO1xuICB9XG4gIHNob3dkb3duLnJlc2V0T3B0aW9ucygpO1xuICB2YXIgcHJlc2V0ID0gZmxhdm9yW25hbWVdO1xuICBzZXRGbGF2b3IgPSBuYW1lO1xuICBmb3IgKHZhciBvcHRpb24gaW4gcHJlc2V0KSB7XG4gICAgaWYgKHByZXNldC5oYXNPd25Qcm9wZXJ0eShvcHRpb24pKSB7XG4gICAgICBnbG9iYWxPcHRpb25zW29wdGlvbl0gPSBwcmVzZXRbb3B0aW9uXTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IHRoZSBjdXJyZW50bHkgc2V0IGZsYXZvclxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuc2hvd2Rvd24uZ2V0Rmxhdm9yID0gZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG4gIHJldHVybiBzZXRGbGF2b3I7XG59O1xuXG4vKipcbiAqIEdldCB0aGUgb3B0aW9ucyBvZiBhIHNwZWNpZmllZCBmbGF2b3IuIFJldHVybnMgdW5kZWZpbmVkIGlmIHRoZSBmbGF2b3Igd2FzIG5vdCBmb3VuZFxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmxhdm9yXG4gKiBAcmV0dXJucyB7e318dW5kZWZpbmVkfVxuICovXG5zaG93ZG93bi5nZXRGbGF2b3JPcHRpb25zID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBpZiAoZmxhdm9yLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgcmV0dXJuIGZsYXZvcltuYW1lXTtcbiAgfVxufTtcblxuLyoqXG4gKiBHZXQgdGhlIGRlZmF1bHQgb3B0aW9uc1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtib29sZWFufSBbc2ltcGxlPXRydWVdXG4gKiBAcmV0dXJucyB7e319XG4gKi9cbnNob3dkb3duLmdldERlZmF1bHRPcHRpb25zID0gZnVuY3Rpb24gKHNpbXBsZSkge1xuICAndXNlIHN0cmljdCc7XG4gIHJldHVybiBnZXREZWZhdWx0T3B0cyhzaW1wbGUpO1xufTtcblxuLyoqXG4gKiBHZXQgb3Igc2V0IGEgc3ViUGFyc2VyXG4gKlxuICogc3ViUGFyc2VyKG5hbWUpICAgICAgIC0gR2V0IGEgcmVnaXN0ZXJlZCBzdWJQYXJzZXJcbiAqIHN1YlBhcnNlcihuYW1lLCBmdW5jKSAtIFJlZ2lzdGVyIGEgc3ViUGFyc2VyXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICogQHBhcmFtIHtmdW5jdGlvbn0gW2Z1bmNdXG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyID0gZnVuY3Rpb24gKG5hbWUsIGZ1bmMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBpZiAoc2hvd2Rvd24uaGVscGVyLmlzU3RyaW5nKG5hbWUpKSB7XG4gICAgaWYgKHR5cGVvZiBmdW5jICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgcGFyc2Vyc1tuYW1lXSA9IGZ1bmM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChwYXJzZXJzLmhhc093blByb3BlcnR5KG5hbWUpKSB7XG4gICAgICAgIHJldHVybiBwYXJzZXJzW25hbWVdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3cgRXJyb3IoJ1N1YlBhcnNlciBuYW1lZCAnICsgbmFtZSArICcgbm90IHJlZ2lzdGVyZWQhJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIEdldHMgb3IgcmVnaXN0ZXJzIGFuIGV4dGVuc2lvblxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEBwYXJhbSB7b2JqZWN0fG9iamVjdFtdfGZ1bmN0aW9uPX0gZXh0XG4gKiBAcmV0dXJucyB7Kn1cbiAqL1xuc2hvd2Rvd24uZXh0ZW5zaW9uID0gZnVuY3Rpb24gKG5hbWUsIGV4dCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgaWYgKCFzaG93ZG93bi5oZWxwZXIuaXNTdHJpbmcobmFtZSkpIHtcbiAgICB0aHJvdyBFcnJvcignRXh0ZW5zaW9uIFxcJ25hbWVcXCcgbXVzdCBiZSBhIHN0cmluZycpO1xuICB9XG5cbiAgbmFtZSA9IHNob3dkb3duLmhlbHBlci5zdGRFeHROYW1lKG5hbWUpO1xuXG4gIC8vIEdldHRlclxuICBpZiAoc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGV4dCkpIHtcbiAgICBpZiAoIWV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIHRocm93IEVycm9yKCdFeHRlbnNpb24gbmFtZWQgJyArIG5hbWUgKyAnIGlzIG5vdCByZWdpc3RlcmVkIScpO1xuICAgIH1cbiAgICByZXR1cm4gZXh0ZW5zaW9uc1tuYW1lXTtcblxuICAgIC8vIFNldHRlclxuICB9IGVsc2Uge1xuICAgIC8vIEV4cGFuZCBleHRlbnNpb24gaWYgaXQncyB3cmFwcGVkIGluIGEgZnVuY3Rpb25cbiAgICBpZiAodHlwZW9mIGV4dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgZXh0ID0gZXh0KCk7XG4gICAgfVxuXG4gICAgLy8gRW5zdXJlIGV4dGVuc2lvbiBpcyBhbiBhcnJheVxuICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzQXJyYXkoZXh0KSkge1xuICAgICAgZXh0ID0gW2V4dF07XG4gICAgfVxuXG4gICAgdmFyIHZhbGlkRXh0ZW5zaW9uID0gdmFsaWRhdGUoZXh0LCBuYW1lKTtcblxuICAgIGlmICh2YWxpZEV4dGVuc2lvbi52YWxpZCkge1xuICAgICAgZXh0ZW5zaW9uc1tuYW1lXSA9IGV4dDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgRXJyb3IodmFsaWRFeHRlbnNpb24uZXJyb3IpO1xuICAgIH1cbiAgfVxufTtcblxuLyoqXG4gKiBHZXRzIGFsbCBleHRlbnNpb25zIHJlZ2lzdGVyZWRcbiAqIEByZXR1cm5zIHt7fX1cbiAqL1xuc2hvd2Rvd24uZ2V0QWxsRXh0ZW5zaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICByZXR1cm4gZXh0ZW5zaW9ucztcbn07XG5cbi8qKlxuICogUmVtb3ZlIGFuIGV4dGVuc2lvblxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqL1xuc2hvd2Rvd24ucmVtb3ZlRXh0ZW5zaW9uID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICBkZWxldGUgZXh0ZW5zaW9uc1tuYW1lXTtcbn07XG5cbi8qKlxuICogUmVtb3ZlcyBhbGwgZXh0ZW5zaW9uc1xuICovXG5zaG93ZG93bi5yZXNldEV4dGVuc2lvbnMgPSBmdW5jdGlvbiAoKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgZXh0ZW5zaW9ucyA9IHt9O1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZSBleHRlbnNpb25cbiAqIEBwYXJhbSB7YXJyYXl9IGV4dGVuc2lvblxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAqIEByZXR1cm5zIHt7dmFsaWQ6IGJvb2xlYW4sIGVycm9yOiBzdHJpbmd9fVxuICovXG5mdW5jdGlvbiB2YWxpZGF0ZSAoZXh0ZW5zaW9uLCBuYW1lKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgZXJyTXNnID0gKG5hbWUpID8gJ0Vycm9yIGluICcgKyBuYW1lICsgJyBleHRlbnNpb24tPicgOiAnRXJyb3IgaW4gdW5uYW1lZCBleHRlbnNpb24nLFxuICAgICAgcmV0ID0ge1xuICAgICAgICB2YWxpZDogdHJ1ZSxcbiAgICAgICAgZXJyb3I6ICcnXG4gICAgICB9O1xuXG4gIGlmICghc2hvd2Rvd24uaGVscGVyLmlzQXJyYXkoZXh0ZW5zaW9uKSkge1xuICAgIGV4dGVuc2lvbiA9IFtleHRlbnNpb25dO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHRlbnNpb24ubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYmFzZU1zZyA9IGVyck1zZyArICcgc3ViLWV4dGVuc2lvbiAnICsgaSArICc6ICcsXG4gICAgICAgIGV4dCA9IGV4dGVuc2lvbltpXTtcbiAgICBpZiAodHlwZW9mIGV4dCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHJldC52YWxpZCA9IGZhbHNlO1xuICAgICAgcmV0LmVycm9yID0gYmFzZU1zZyArICdtdXN0IGJlIGFuIG9iamVjdCwgYnV0ICcgKyB0eXBlb2YgZXh0ICsgJyBnaXZlbic7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzU3RyaW5nKGV4dC50eXBlKSkge1xuICAgICAgcmV0LnZhbGlkID0gZmFsc2U7XG4gICAgICByZXQuZXJyb3IgPSBiYXNlTXNnICsgJ3Byb3BlcnR5IFwidHlwZVwiIG11c3QgYmUgYSBzdHJpbmcsIGJ1dCAnICsgdHlwZW9mIGV4dC50eXBlICsgJyBnaXZlbic7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIHZhciB0eXBlID0gZXh0LnR5cGUgPSBleHQudHlwZS50b0xvd2VyQ2FzZSgpO1xuXG4gICAgLy8gbm9ybWFsaXplIGV4dGVuc2lvbiB0eXBlXG4gICAgaWYgKHR5cGUgPT09ICdsYW5ndWFnZScpIHtcbiAgICAgIHR5cGUgPSBleHQudHlwZSA9ICdsYW5nJztcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ2h0bWwnKSB7XG4gICAgICB0eXBlID0gZXh0LnR5cGUgPSAnb3V0cHV0JztcbiAgICB9XG5cbiAgICBpZiAodHlwZSAhPT0gJ2xhbmcnICYmIHR5cGUgIT09ICdvdXRwdXQnICYmIHR5cGUgIT09ICdsaXN0ZW5lcicpIHtcbiAgICAgIHJldC52YWxpZCA9IGZhbHNlO1xuICAgICAgcmV0LmVycm9yID0gYmFzZU1zZyArICd0eXBlICcgKyB0eXBlICsgJyBpcyBub3QgcmVjb2duaXplZC4gVmFsaWQgdmFsdWVzOiBcImxhbmcvbGFuZ3VhZ2VcIiwgXCJvdXRwdXQvaHRtbFwiIG9yIFwibGlzdGVuZXJcIic7XG4gICAgICByZXR1cm4gcmV0O1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnbGlzdGVuZXInKSB7XG4gICAgICBpZiAoc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGV4dC5saXN0ZW5lcnMpKSB7XG4gICAgICAgIHJldC52YWxpZCA9IGZhbHNlO1xuICAgICAgICByZXQuZXJyb3IgPSBiYXNlTXNnICsgJy4gRXh0ZW5zaW9ucyBvZiB0eXBlIFwibGlzdGVuZXJcIiBtdXN0IGhhdmUgYSBwcm9wZXJ0eSBjYWxsZWQgXCJsaXN0ZW5lcnNcIic7XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChzaG93ZG93bi5oZWxwZXIuaXNVbmRlZmluZWQoZXh0LmZpbHRlcikgJiYgc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGV4dC5yZWdleCkpIHtcbiAgICAgICAgcmV0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgIHJldC5lcnJvciA9IGJhc2VNc2cgKyB0eXBlICsgJyBleHRlbnNpb25zIG11c3QgZGVmaW5lIGVpdGhlciBhIFwicmVnZXhcIiBwcm9wZXJ0eSBvciBhIFwiZmlsdGVyXCIgbWV0aG9kJztcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZXh0Lmxpc3RlbmVycykge1xuICAgICAgaWYgKHR5cGVvZiBleHQubGlzdGVuZXJzICE9PSAnb2JqZWN0Jykge1xuICAgICAgICByZXQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgcmV0LmVycm9yID0gYmFzZU1zZyArICdcImxpc3RlbmVyc1wiIHByb3BlcnR5IG11c3QgYmUgYW4gb2JqZWN0IGJ1dCAnICsgdHlwZW9mIGV4dC5saXN0ZW5lcnMgKyAnIGdpdmVuJztcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICAgIGZvciAodmFyIGxuIGluIGV4dC5saXN0ZW5lcnMpIHtcbiAgICAgICAgaWYgKGV4dC5saXN0ZW5lcnMuaGFzT3duUHJvcGVydHkobG4pKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiBleHQubGlzdGVuZXJzW2xuXSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgICAgICByZXQuZXJyb3IgPSBiYXNlTXNnICsgJ1wibGlzdGVuZXJzXCIgcHJvcGVydHkgbXVzdCBiZSBhbiBoYXNoIG9mIFtldmVudCBuYW1lXTogW2NhbGxiYWNrXS4gbGlzdGVuZXJzLicgKyBsbiArXG4gICAgICAgICAgICAgICcgbXVzdCBiZSBhIGZ1bmN0aW9uIGJ1dCAnICsgdHlwZW9mIGV4dC5saXN0ZW5lcnNbbG5dICsgJyBnaXZlbic7XG4gICAgICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChleHQuZmlsdGVyKSB7XG4gICAgICBpZiAodHlwZW9mIGV4dC5maWx0ZXIgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0LnZhbGlkID0gZmFsc2U7XG4gICAgICAgIHJldC5lcnJvciA9IGJhc2VNc2cgKyAnXCJmaWx0ZXJcIiBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCAnICsgdHlwZW9mIGV4dC5maWx0ZXIgKyAnIGdpdmVuJztcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGV4dC5yZWdleCkge1xuICAgICAgaWYgKHNob3dkb3duLmhlbHBlci5pc1N0cmluZyhleHQucmVnZXgpKSB7XG4gICAgICAgIGV4dC5yZWdleCA9IG5ldyBSZWdFeHAoZXh0LnJlZ2V4LCAnZycpO1xuICAgICAgfVxuICAgICAgaWYgKCEoZXh0LnJlZ2V4IGluc3RhbmNlb2YgUmVnRXhwKSkge1xuICAgICAgICByZXQudmFsaWQgPSBmYWxzZTtcbiAgICAgICAgcmV0LmVycm9yID0gYmFzZU1zZyArICdcInJlZ2V4XCIgcHJvcGVydHkgbXVzdCBlaXRoZXIgYmUgYSBzdHJpbmcgb3IgYSBSZWdFeHAgb2JqZWN0LCBidXQgJyArIHR5cGVvZiBleHQucmVnZXggKyAnIGdpdmVuJztcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICAgIH1cbiAgICAgIGlmIChzaG93ZG93bi5oZWxwZXIuaXNVbmRlZmluZWQoZXh0LnJlcGxhY2UpKSB7XG4gICAgICAgIHJldC52YWxpZCA9IGZhbHNlO1xuICAgICAgICByZXQuZXJyb3IgPSBiYXNlTXNnICsgJ1wicmVnZXhcIiBleHRlbnNpb25zIG11c3QgaW1wbGVtZW50IGEgcmVwbGFjZSBzdHJpbmcgb3IgZnVuY3Rpb24nO1xuICAgICAgICByZXR1cm4gcmV0O1xuICAgICAgfVxuICAgIH1cbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG4vKipcbiAqIFZhbGlkYXRlIGV4dGVuc2lvblxuICogQHBhcmFtIHtvYmplY3R9IGV4dFxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnNob3dkb3duLnZhbGlkYXRlRXh0ZW5zaW9uID0gZnVuY3Rpb24gKGV4dCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHZhbGlkYXRlRXh0ZW5zaW9uID0gdmFsaWRhdGUoZXh0LCBudWxsKTtcbiAgaWYgKCF2YWxpZGF0ZUV4dGVuc2lvbi52YWxpZCkge1xuICAgIGNvbnNvbGUud2Fybih2YWxpZGF0ZUV4dGVuc2lvbi5lcnJvcik7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIHJldHVybiB0cnVlO1xufTtcblxyXG4vKipcbiAqIHNob3dkb3duanMgaGVscGVyIGZ1bmN0aW9uc1xuICovXG5cbmlmICghc2hvd2Rvd24uaGFzT3duUHJvcGVydHkoJ2hlbHBlcicpKSB7XG4gIHNob3dkb3duLmhlbHBlciA9IHt9O1xufVxuXG4vKipcbiAqIENoZWNrIGlmIHZhciBpcyBzdHJpbmdcbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7c3RyaW5nfSBhXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuc2hvd2Rvd24uaGVscGVyLmlzU3RyaW5nID0gZnVuY3Rpb24gKGEpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICByZXR1cm4gKHR5cGVvZiBhID09PSAnc3RyaW5nJyB8fCBhIGluc3RhbmNlb2YgU3RyaW5nKTtcbn07XG5cbi8qKlxuICogQ2hlY2sgaWYgdmFyIGlzIGEgZnVuY3Rpb25cbiAqIEBzdGF0aWNcbiAqIEBwYXJhbSB7Kn0gYVxuICogQHJldHVybnMge2Jvb2xlYW59XG4gKi9cbnNob3dkb3duLmhlbHBlci5pc0Z1bmN0aW9uID0gZnVuY3Rpb24gKGEpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgZ2V0VHlwZSA9IHt9O1xuICByZXR1cm4gYSAmJiBnZXRUeXBlLnRvU3RyaW5nLmNhbGwoYSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59O1xuXG4vKipcbiAqIGlzQXJyYXkgaGVscGVyIGZ1bmN0aW9uXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0geyp9IGFcbiAqIEByZXR1cm5zIHtib29sZWFufVxuICovXG5zaG93ZG93bi5oZWxwZXIuaXNBcnJheSA9IGZ1bmN0aW9uIChhKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYSk7XG59O1xuXG4vKipcbiAqIENoZWNrIGlmIHZhbHVlIGlzIHVuZGVmaW5lZFxuICogQHN0YXRpY1xuICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgdW5kZWZpbmVkYCwgZWxzZSBgZmFsc2VgLlxuICovXG5zaG93ZG93bi5oZWxwZXIuaXNVbmRlZmluZWQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbn07XG5cbi8qKlxuICogRm9yRWFjaCBoZWxwZXIgZnVuY3Rpb25cbiAqIEl0ZXJhdGVzIG92ZXIgQXJyYXlzIGFuZCBPYmplY3RzIChvd24gcHJvcGVydGllcyBvbmx5KVxuICogQHN0YXRpY1xuICogQHBhcmFtIHsqfSBvYmpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGNhbGxiYWNrIEFjY2VwdHMgMyBwYXJhbXM6IDEuIHZhbHVlLCAyLiBrZXksIDMuIHRoZSBvcmlnaW5hbCBhcnJheS9vYmplY3RcbiAqL1xuc2hvd2Rvd24uaGVscGVyLmZvckVhY2ggPSBmdW5jdGlvbiAob2JqLCBjYWxsYmFjaykge1xuICAndXNlIHN0cmljdCc7XG4gIC8vIGNoZWNrIGlmIG9iaiBpcyBkZWZpbmVkXG4gIGlmIChzaG93ZG93bi5oZWxwZXIuaXNVbmRlZmluZWQob2JqKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignb2JqIHBhcmFtIGlzIHJlcXVpcmVkJyk7XG4gIH1cblxuICBpZiAoc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGNhbGxiYWNrKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2FsbGJhY2sgcGFyYW0gaXMgcmVxdWlyZWQnKTtcbiAgfVxuXG4gIGlmICghc2hvd2Rvd24uaGVscGVyLmlzRnVuY3Rpb24oY2FsbGJhY2spKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdjYWxsYmFjayBwYXJhbSBtdXN0IGJlIGEgZnVuY3Rpb24vY2xvc3VyZScpO1xuICB9XG5cbiAgaWYgKHR5cGVvZiBvYmouZm9yRWFjaCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIG9iai5mb3JFYWNoKGNhbGxiYWNrKTtcbiAgfSBlbHNlIGlmIChzaG93ZG93bi5oZWxwZXIuaXNBcnJheShvYmopKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNhbGxiYWNrKG9ialtpXSwgaSwgb2JqKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIChvYmopID09PSAnb2JqZWN0Jykge1xuICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB7XG4gICAgICAgIGNhbGxiYWNrKG9ialtwcm9wXSwgcHJvcCwgb2JqKTtcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdvYmogZG9lcyBub3Qgc2VlbSB0byBiZSBhbiBhcnJheSBvciBhbiBpdGVyYWJsZSBvYmplY3QnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTdGFuZGFyZGlkaXplIGV4dGVuc2lvbiBuYW1lXG4gKiBAc3RhdGljXG4gKiBAcGFyYW0ge3N0cmluZ30gcyBleHRlbnNpb24gbmFtZVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuc2hvd2Rvd24uaGVscGVyLnN0ZEV4dE5hbWUgPSBmdW5jdGlvbiAocykge1xuICAndXNlIHN0cmljdCc7XG4gIHJldHVybiBzLnJlcGxhY2UoL1tfPyorXFwvXFxcXC5eLV0vZywgJycpLnJlcGxhY2UoL1xccy9nLCAnJykudG9Mb3dlckNhc2UoKTtcbn07XG5cbmZ1bmN0aW9uIGVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayAod2hvbGVNYXRjaCwgbTEpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgY2hhckNvZGVUb0VzY2FwZSA9IG0xLmNoYXJDb2RlQXQoMCk7XG4gIHJldHVybiAnwqhFJyArIGNoYXJDb2RlVG9Fc2NhcGUgKyAnRSc7XG59XG5cbi8qKlxuICogQ2FsbGJhY2sgdXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyB3aGVuIHBhc3NpbmcgdGhyb3VnaCBTdHJpbmcucmVwbGFjZVxuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IHdob2xlTWF0Y2hcbiAqIEBwYXJhbSB7c3RyaW5nfSBtMVxuICogQHJldHVybnMge3N0cmluZ31cbiAqL1xuc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayA9IGVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjaztcblxuLyoqXG4gKiBFc2NhcGUgY2hhcmFjdGVycyBpbiBhIHN0cmluZ1xuICogQHN0YXRpY1xuICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFyc1RvRXNjYXBlXG4gKiBAcGFyYW0ge2Jvb2xlYW59IGFmdGVyQmFja3NsYXNoXG4gKiBAcmV0dXJucyB7WE1MfHN0cmluZ3x2b2lkfCp9XG4gKi9cbnNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzID0gZnVuY3Rpb24gKHRleHQsIGNoYXJzVG9Fc2NhcGUsIGFmdGVyQmFja3NsYXNoKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgLy8gRmlyc3Qgd2UgaGF2ZSB0byBlc2NhcGUgdGhlIGVzY2FwZSBjaGFyYWN0ZXJzIHNvIHRoYXRcbiAgLy8gd2UgY2FuIGJ1aWxkIGEgY2hhcmFjdGVyIGNsYXNzIG91dCBvZiB0aGVtXG4gIHZhciByZWdleFN0cmluZyA9ICcoWycgKyBjaGFyc1RvRXNjYXBlLnJlcGxhY2UoLyhbXFxbXFxdXFxcXF0pL2csICdcXFxcJDEnKSArICddKSc7XG5cbiAgaWYgKGFmdGVyQmFja3NsYXNoKSB7XG4gICAgcmVnZXhTdHJpbmcgPSAnXFxcXFxcXFwnICsgcmVnZXhTdHJpbmc7XG4gIH1cblxuICB2YXIgcmVnZXggPSBuZXcgUmVnRXhwKHJlZ2V4U3RyaW5nLCAnZycpO1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHJlZ2V4LCBlc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spO1xuXG4gIHJldHVybiB0ZXh0O1xufTtcblxuLyoqXG4gKiBVbmVzY2FwZSBIVE1MIGVudGl0aWVzXG4gKiBAcGFyYW0gdHh0XG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5zaG93ZG93bi5oZWxwZXIudW5lc2NhcGVIVE1MRW50aXRpZXMgPSBmdW5jdGlvbiAodHh0KSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICByZXR1cm4gdHh0XG4gICAgLnJlcGxhY2UoLyZxdW90Oy9nLCAnXCInKVxuICAgIC5yZXBsYWNlKC8mbHQ7L2csICc8JylcbiAgICAucmVwbGFjZSgvJmd0Oy9nLCAnPicpXG4gICAgLnJlcGxhY2UoLyZhbXA7L2csICcmJyk7XG59O1xuXG52YXIgcmd4RmluZE1hdGNoUG9zID0gZnVuY3Rpb24gKHN0ciwgbGVmdCwgcmlnaHQsIGZsYWdzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdmFyIGYgPSBmbGFncyB8fCAnJyxcbiAgICAgIGcgPSBmLmluZGV4T2YoJ2cnKSA+IC0xLFxuICAgICAgeCA9IG5ldyBSZWdFeHAobGVmdCArICd8JyArIHJpZ2h0LCAnZycgKyBmLnJlcGxhY2UoL2cvZywgJycpKSxcbiAgICAgIGwgPSBuZXcgUmVnRXhwKGxlZnQsIGYucmVwbGFjZSgvZy9nLCAnJykpLFxuICAgICAgcG9zID0gW10sXG4gICAgICB0LCBzLCBtLCBzdGFydCwgZW5kO1xuXG4gIGRvIHtcbiAgICB0ID0gMDtcbiAgICB3aGlsZSAoKG0gPSB4LmV4ZWMoc3RyKSkpIHtcbiAgICAgIGlmIChsLnRlc3QobVswXSkpIHtcbiAgICAgICAgaWYgKCEodCsrKSkge1xuICAgICAgICAgIHMgPSB4Lmxhc3RJbmRleDtcbiAgICAgICAgICBzdGFydCA9IHMgLSBtWzBdLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICh0KSB7XG4gICAgICAgIGlmICghLS10KSB7XG4gICAgICAgICAgZW5kID0gbS5pbmRleCArIG1bMF0ubGVuZ3RoO1xuICAgICAgICAgIHZhciBvYmogPSB7XG4gICAgICAgICAgICBsZWZ0OiB7c3RhcnQ6IHN0YXJ0LCBlbmQ6IHN9LFxuICAgICAgICAgICAgbWF0Y2g6IHtzdGFydDogcywgZW5kOiBtLmluZGV4fSxcbiAgICAgICAgICAgIHJpZ2h0OiB7c3RhcnQ6IG0uaW5kZXgsIGVuZDogZW5kfSxcbiAgICAgICAgICAgIHdob2xlTWF0Y2g6IHtzdGFydDogc3RhcnQsIGVuZDogZW5kfVxuICAgICAgICAgIH07XG4gICAgICAgICAgcG9zLnB1c2gob2JqKTtcbiAgICAgICAgICBpZiAoIWcpIHtcbiAgICAgICAgICAgIHJldHVybiBwb3M7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9IHdoaWxlICh0ICYmICh4Lmxhc3RJbmRleCA9IHMpKTtcblxuICByZXR1cm4gcG9zO1xufTtcblxuLyoqXG4gKiBtYXRjaFJlY3Vyc2l2ZVJlZ0V4cFxuICpcbiAqIChjKSAyMDA3IFN0ZXZlbiBMZXZpdGhhbiA8c3RldmVubGV2aXRoYW4uY29tPlxuICogTUlUIExpY2Vuc2VcbiAqXG4gKiBBY2NlcHRzIGEgc3RyaW5nIHRvIHNlYXJjaCwgYSBsZWZ0IGFuZCByaWdodCBmb3JtYXQgZGVsaW1pdGVyXG4gKiBhcyByZWdleCBwYXR0ZXJucywgYW5kIG9wdGlvbmFsIHJlZ2V4IGZsYWdzLiBSZXR1cm5zIGFuIGFycmF5XG4gKiBvZiBtYXRjaGVzLCBhbGxvd2luZyBuZXN0ZWQgaW5zdGFuY2VzIG9mIGxlZnQvcmlnaHQgZGVsaW1pdGVycy5cbiAqIFVzZSB0aGUgXCJnXCIgZmxhZyB0byByZXR1cm4gYWxsIG1hdGNoZXMsIG90aGVyd2lzZSBvbmx5IHRoZVxuICogZmlyc3QgaXMgcmV0dXJuZWQuIEJlIGNhcmVmdWwgdG8gZW5zdXJlIHRoYXQgdGhlIGxlZnQgYW5kXG4gKiByaWdodCBmb3JtYXQgZGVsaW1pdGVycyBwcm9kdWNlIG11dHVhbGx5IGV4Y2x1c2l2ZSBtYXRjaGVzLlxuICogQmFja3JlZmVyZW5jZXMgYXJlIG5vdCBzdXBwb3J0ZWQgd2l0aGluIHRoZSByaWdodCBkZWxpbWl0ZXJcbiAqIGR1ZSB0byBob3cgaXQgaXMgaW50ZXJuYWxseSBjb21iaW5lZCB3aXRoIHRoZSBsZWZ0IGRlbGltaXRlci5cbiAqIFdoZW4gbWF0Y2hpbmcgc3RyaW5ncyB3aG9zZSBmb3JtYXQgZGVsaW1pdGVycyBhcmUgdW5iYWxhbmNlZFxuICogdG8gdGhlIGxlZnQgb3IgcmlnaHQsIHRoZSBvdXRwdXQgaXMgaW50ZW50aW9uYWxseSBhcyBhXG4gKiBjb252ZW50aW9uYWwgcmVnZXggbGlicmFyeSB3aXRoIHJlY3Vyc2lvbiBzdXBwb3J0IHdvdWxkXG4gKiBwcm9kdWNlLCBlLmcuIFwiPDx4PlwiIGFuZCBcIjx4Pj5cIiBib3RoIHByb2R1Y2UgW1wieFwiXSB3aGVuIHVzaW5nXG4gKiBcIjxcIiBhbmQgXCI+XCIgYXMgdGhlIGRlbGltaXRlcnMgKGJvdGggc3RyaW5ncyBjb250YWluIGEgc2luZ2xlLFxuICogYmFsYW5jZWQgaW5zdGFuY2Ugb2YgXCI8eD5cIikuXG4gKlxuICogZXhhbXBsZXM6XG4gKiBtYXRjaFJlY3Vyc2l2ZVJlZ0V4cChcInRlc3RcIiwgXCJcXFxcKFwiLCBcIlxcXFwpXCIpXG4gKiByZXR1cm5zOiBbXVxuICogbWF0Y2hSZWN1cnNpdmVSZWdFeHAoXCI8dDw8ZT4+PHM+PnQ8PlwiLCBcIjxcIiwgXCI+XCIsIFwiZ1wiKVxuICogcmV0dXJuczogW1widDw8ZT4+PHM+XCIsIFwiXCJdXG4gKiBtYXRjaFJlY3Vyc2l2ZVJlZ0V4cChcIjxkaXYgaWQ9XFxcInhcXFwiPnRlc3Q8L2Rpdj5cIiwgXCI8ZGl2XFxcXGJbXj5dKj5cIiwgXCI8L2Rpdj5cIiwgXCJnaVwiKVxuICogcmV0dXJuczogW1widGVzdFwiXVxuICovXG5zaG93ZG93bi5oZWxwZXIubWF0Y2hSZWN1cnNpdmVSZWdFeHAgPSBmdW5jdGlvbiAoc3RyLCBsZWZ0LCByaWdodCwgZmxhZ3MpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBtYXRjaFBvcyA9IHJneEZpbmRNYXRjaFBvcyAoc3RyLCBsZWZ0LCByaWdodCwgZmxhZ3MpLFxuICAgICAgcmVzdWx0cyA9IFtdO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbWF0Y2hQb3MubGVuZ3RoOyArK2kpIHtcbiAgICByZXN1bHRzLnB1c2goW1xuICAgICAgc3RyLnNsaWNlKG1hdGNoUG9zW2ldLndob2xlTWF0Y2guc3RhcnQsIG1hdGNoUG9zW2ldLndob2xlTWF0Y2guZW5kKSxcbiAgICAgIHN0ci5zbGljZShtYXRjaFBvc1tpXS5tYXRjaC5zdGFydCwgbWF0Y2hQb3NbaV0ubWF0Y2guZW5kKSxcbiAgICAgIHN0ci5zbGljZShtYXRjaFBvc1tpXS5sZWZ0LnN0YXJ0LCBtYXRjaFBvc1tpXS5sZWZ0LmVuZCksXG4gICAgICBzdHIuc2xpY2UobWF0Y2hQb3NbaV0ucmlnaHQuc3RhcnQsIG1hdGNoUG9zW2ldLnJpZ2h0LmVuZClcbiAgICBdKTtcbiAgfVxuICByZXR1cm4gcmVzdWx0cztcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9ufSByZXBsYWNlbWVudFxuICogQHBhcmFtIHtzdHJpbmd9IGxlZnRcbiAqIEBwYXJhbSB7c3RyaW5nfSByaWdodFxuICogQHBhcmFtIHtzdHJpbmd9IGZsYWdzXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5zaG93ZG93bi5oZWxwZXIucmVwbGFjZVJlY3Vyc2l2ZVJlZ0V4cCA9IGZ1bmN0aW9uIChzdHIsIHJlcGxhY2VtZW50LCBsZWZ0LCByaWdodCwgZmxhZ3MpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmICghc2hvd2Rvd24uaGVscGVyLmlzRnVuY3Rpb24ocmVwbGFjZW1lbnQpKSB7XG4gICAgdmFyIHJlcFN0ciA9IHJlcGxhY2VtZW50O1xuICAgIHJlcGxhY2VtZW50ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIHJlcFN0cjtcbiAgICB9O1xuICB9XG5cbiAgdmFyIG1hdGNoUG9zID0gcmd4RmluZE1hdGNoUG9zKHN0ciwgbGVmdCwgcmlnaHQsIGZsYWdzKSxcbiAgICAgIGZpbmFsU3RyID0gc3RyLFxuICAgICAgbG5nID0gbWF0Y2hQb3MubGVuZ3RoO1xuXG4gIGlmIChsbmcgPiAwKSB7XG4gICAgdmFyIGJpdHMgPSBbXTtcbiAgICBpZiAobWF0Y2hQb3NbMF0ud2hvbGVNYXRjaC5zdGFydCAhPT0gMCkge1xuICAgICAgYml0cy5wdXNoKHN0ci5zbGljZSgwLCBtYXRjaFBvc1swXS53aG9sZU1hdGNoLnN0YXJ0KSk7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG5nOyArK2kpIHtcbiAgICAgIGJpdHMucHVzaChcbiAgICAgICAgcmVwbGFjZW1lbnQoXG4gICAgICAgICAgc3RyLnNsaWNlKG1hdGNoUG9zW2ldLndob2xlTWF0Y2guc3RhcnQsIG1hdGNoUG9zW2ldLndob2xlTWF0Y2guZW5kKSxcbiAgICAgICAgICBzdHIuc2xpY2UobWF0Y2hQb3NbaV0ubWF0Y2guc3RhcnQsIG1hdGNoUG9zW2ldLm1hdGNoLmVuZCksXG4gICAgICAgICAgc3RyLnNsaWNlKG1hdGNoUG9zW2ldLmxlZnQuc3RhcnQsIG1hdGNoUG9zW2ldLmxlZnQuZW5kKSxcbiAgICAgICAgICBzdHIuc2xpY2UobWF0Y2hQb3NbaV0ucmlnaHQuc3RhcnQsIG1hdGNoUG9zW2ldLnJpZ2h0LmVuZClcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICAgIGlmIChpIDwgbG5nIC0gMSkge1xuICAgICAgICBiaXRzLnB1c2goc3RyLnNsaWNlKG1hdGNoUG9zW2ldLndob2xlTWF0Y2guZW5kLCBtYXRjaFBvc1tpICsgMV0ud2hvbGVNYXRjaC5zdGFydCkpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAobWF0Y2hQb3NbbG5nIC0gMV0ud2hvbGVNYXRjaC5lbmQgPCBzdHIubGVuZ3RoKSB7XG4gICAgICBiaXRzLnB1c2goc3RyLnNsaWNlKG1hdGNoUG9zW2xuZyAtIDFdLndob2xlTWF0Y2guZW5kKSk7XG4gICAgfVxuICAgIGZpbmFsU3RyID0gYml0cy5qb2luKCcnKTtcbiAgfVxuICByZXR1cm4gZmluYWxTdHI7XG59O1xuXG4vKipcbiAqIFJldHVybnMgdGhlIGluZGV4IHdpdGhpbiB0aGUgcGFzc2VkIFN0cmluZyBvYmplY3Qgb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgdGhlIHNwZWNpZmllZCByZWdleCxcbiAqIHN0YXJ0aW5nIHRoZSBzZWFyY2ggYXQgZnJvbUluZGV4LiBSZXR1cm5zIC0xIGlmIHRoZSB2YWx1ZSBpcyBub3QgZm91bmQuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciBzdHJpbmcgdG8gc2VhcmNoXG4gKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXggUmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaFxuICogQHBhcmFtIHtpbnR9IFtmcm9tSW5kZXggPSAwXSBJbmRleCB0byBzdGFydCB0aGUgc2VhcmNoXG4gKiBAcmV0dXJucyB7TnVtYmVyfVxuICogQHRocm93cyBJbnZhbGlkQXJndW1lbnRFcnJvclxuICovXG5zaG93ZG93bi5oZWxwZXIucmVnZXhJbmRleE9mID0gZnVuY3Rpb24gKHN0ciwgcmVnZXgsIGZyb21JbmRleCkge1xuICAndXNlIHN0cmljdCc7XG4gIGlmICghc2hvd2Rvd24uaGVscGVyLmlzU3RyaW5nKHN0cikpIHtcbiAgICB0aHJvdyAnSW52YWxpZEFyZ3VtZW50RXJyb3I6IGZpcnN0IHBhcmFtZXRlciBvZiBzaG93ZG93bi5oZWxwZXIucmVnZXhJbmRleE9mIGZ1bmN0aW9uIG11c3QgYmUgYSBzdHJpbmcnO1xuICB9XG4gIGlmIChyZWdleCBpbnN0YW5jZW9mIFJlZ0V4cCA9PT0gZmFsc2UpIHtcbiAgICB0aHJvdyAnSW52YWxpZEFyZ3VtZW50RXJyb3I6IHNlY29uZCBwYXJhbWV0ZXIgb2Ygc2hvd2Rvd24uaGVscGVyLnJlZ2V4SW5kZXhPZiBmdW5jdGlvbiBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIFJlZ0V4cCc7XG4gIH1cbiAgdmFyIGluZGV4T2YgPSBzdHIuc3Vic3RyaW5nKGZyb21JbmRleCB8fCAwKS5zZWFyY2gocmVnZXgpO1xuICByZXR1cm4gKGluZGV4T2YgPj0gMCkgPyAoaW5kZXhPZiArIChmcm9tSW5kZXggfHwgMCkpIDogaW5kZXhPZjtcbn07XG5cbi8qKlxuICogU3BsaXRzIHRoZSBwYXNzZWQgc3RyaW5nIG9iamVjdCBhdCB0aGUgZGVmaW5lZCBpbmRleCwgYW5kIHJldHVybnMgYW4gYXJyYXkgY29tcG9zZWQgb2YgdGhlIHR3byBzdWJzdHJpbmdzXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIHN0cmluZyB0byBzcGxpdFxuICogQHBhcmFtIHtpbnR9IGluZGV4IGluZGV4IHRvIHNwbGl0IHN0cmluZyBhdFxuICogQHJldHVybnMge1tzdHJpbmcsc3RyaW5nXX1cbiAqIEB0aHJvd3MgSW52YWxpZEFyZ3VtZW50RXJyb3JcbiAqL1xuc2hvd2Rvd24uaGVscGVyLnNwbGl0QXRJbmRleCA9IGZ1bmN0aW9uIChzdHIsIGluZGV4KSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgaWYgKCFzaG93ZG93bi5oZWxwZXIuaXNTdHJpbmcoc3RyKSkge1xuICAgIHRocm93ICdJbnZhbGlkQXJndW1lbnRFcnJvcjogZmlyc3QgcGFyYW1ldGVyIG9mIHNob3dkb3duLmhlbHBlci5yZWdleEluZGV4T2YgZnVuY3Rpb24gbXVzdCBiZSBhIHN0cmluZyc7XG4gIH1cbiAgcmV0dXJuIFtzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSwgc3RyLnN1YnN0cmluZyhpbmRleCldO1xufTtcblxuLyoqXG4gKiBPYmZ1c2NhdGUgYW4gZS1tYWlsIGFkZHJlc3MgdGhyb3VnaCB0aGUgdXNlIG9mIENoYXJhY3RlciBFbnRpdGllcyxcbiAqIHRyYW5zZm9ybWluZyBBU0NJSSBjaGFyYWN0ZXJzIGludG8gdGhlaXIgZXF1aXZhbGVudCBkZWNpbWFsIG9yIGhleCBlbnRpdGllcy5cbiAqXG4gKiBTaW5jZSBpdCBoYXMgYSByYW5kb20gY29tcG9uZW50LCBzdWJzZXF1ZW50IGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24gcHJvZHVjZSBkaWZmZXJlbnQgcmVzdWx0c1xuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBtYWlsXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5zaG93ZG93bi5oZWxwZXIuZW5jb2RlRW1haWxBZGRyZXNzID0gZnVuY3Rpb24gKG1haWwpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB2YXIgZW5jb2RlID0gW1xuICAgIGZ1bmN0aW9uIChjaCkge1xuICAgICAgcmV0dXJuICcmIycgKyBjaC5jaGFyQ29kZUF0KDApICsgJzsnO1xuICAgIH0sXG4gICAgZnVuY3Rpb24gKGNoKSB7XG4gICAgICByZXR1cm4gJyYjeCcgKyBjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KSArICc7JztcbiAgICB9LFxuICAgIGZ1bmN0aW9uIChjaCkge1xuICAgICAgcmV0dXJuIGNoO1xuICAgIH1cbiAgXTtcblxuICBtYWlsID0gbWFpbC5yZXBsYWNlKC8uL2csIGZ1bmN0aW9uIChjaCkge1xuICAgIGlmIChjaCA9PT0gJ0AnKSB7XG4gICAgICAvLyB0aGlzICptdXN0KiBiZSBlbmNvZGVkLiBJIGluc2lzdC5cbiAgICAgIGNoID0gZW5jb2RlW01hdGguZmxvb3IoTWF0aC5yYW5kb20oKSAqIDIpXShjaCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciByID0gTWF0aC5yYW5kb20oKTtcbiAgICAgIC8vIHJvdWdobHkgMTAlIHJhdywgNDUlIGhleCwgNDUlIGRlY1xuICAgICAgY2ggPSAoXG4gICAgICAgIHIgPiAwLjkgPyBlbmNvZGVbMl0oY2gpIDogciA+IDAuNDUgPyBlbmNvZGVbMV0oY2gpIDogZW5jb2RlWzBdKGNoKVxuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuIGNoO1xuICB9KTtcblxuICByZXR1cm4gbWFpbDtcbn07XG5cbi8qKlxuICpcbiAqIEBwYXJhbSBzdHJcbiAqIEBwYXJhbSB0YXJnZXRMZW5ndGhcbiAqIEBwYXJhbSBwYWRTdHJpbmdcbiAqIEByZXR1cm5zIHtzdHJpbmd9XG4gKi9cbnNob3dkb3duLmhlbHBlci5wYWRFbmQgPSBmdW5jdGlvbiBwYWRFbmQgKHN0ciwgdGFyZ2V0TGVuZ3RoLCBwYWRTdHJpbmcpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICAvKmpzaGludCBiaXR3aXNlOiBmYWxzZSovXG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBzcGFjZS1pbmZpeC1vcHNcbiAgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0TGVuZ3RoPj4wOyAvL2Zsb29yIGlmIG51bWJlciBvciBjb252ZXJ0IG5vbi1udW1iZXIgdG8gMDtcbiAgLypqc2hpbnQgYml0d2lzZTogdHJ1ZSovXG4gIHBhZFN0cmluZyA9IFN0cmluZyhwYWRTdHJpbmcgfHwgJyAnKTtcbiAgaWYgKHN0ci5sZW5ndGggPiB0YXJnZXRMZW5ndGgpIHtcbiAgICByZXR1cm4gU3RyaW5nKHN0cik7XG4gIH0gZWxzZSB7XG4gICAgdGFyZ2V0TGVuZ3RoID0gdGFyZ2V0TGVuZ3RoIC0gc3RyLmxlbmd0aDtcbiAgICBpZiAodGFyZ2V0TGVuZ3RoID4gcGFkU3RyaW5nLmxlbmd0aCkge1xuICAgICAgcGFkU3RyaW5nICs9IHBhZFN0cmluZy5yZXBlYXQodGFyZ2V0TGVuZ3RoIC8gcGFkU3RyaW5nLmxlbmd0aCk7IC8vYXBwZW5kIHRvIG9yaWdpbmFsIHRvIGVuc3VyZSB3ZSBhcmUgbG9uZ2VyIHRoYW4gbmVlZGVkXG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcoc3RyKSArIHBhZFN0cmluZy5zbGljZSgwLHRhcmdldExlbmd0aCk7XG4gIH1cbn07XG5cbi8qKlxuICogUE9MWUZJTExTXG4gKi9cbi8vIHVzZSB0aGlzIGluc3RlYWQgb2YgYnVpbHRpbiBpcyB1bmRlZmluZWQgZm9yIElFOCBjb21wYXRpYmlsaXR5XG5pZiAodHlwZW9mIChjb25zb2xlKSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgY29uc29sZSA9IHtcbiAgICB3YXJuOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAndXNlIHN0cmljdCc7XG4gICAgICBhbGVydChtc2cpO1xuICAgIH0sXG4gICAgbG9nOiBmdW5jdGlvbiAobXNnKSB7XG4gICAgICAndXNlIHN0cmljdCc7XG4gICAgICBhbGVydChtc2cpO1xuICAgIH0sXG4gICAgZXJyb3I6IGZ1bmN0aW9uIChtc2cpIHtcbiAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgIHRocm93IG1zZztcbiAgICB9XG4gIH07XG59XG5cbi8qKlxuICogQ29tbW9uIHJlZ2V4ZXMuXG4gKiBXZSBkZWNsYXJlIHNvbWUgY29tbW9uIHJlZ2V4ZXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuICovXG5zaG93ZG93bi5oZWxwZXIucmVnZXhlcyA9IHtcbiAgYXN0ZXJpc2tEYXNoQW5kQ29sb246IC8oWypfOn5dKS9nXG59O1xuXG4vKipcbiAqIEVNT0pJUyBMSVNUXG4gKi9cbnNob3dkb3duLmhlbHBlci5lbW9qaXMgPSB7XG4gICcrMSc6J1xcdWQ4M2RcXHVkYzRkJyxcbiAgJy0xJzonXFx1ZDgzZFxcdWRjNGUnLFxuICAnMTAwJzonXFx1ZDgzZFxcdWRjYWYnLFxuICAnMTIzNCc6J1xcdWQ4M2RcXHVkZDIyJyxcbiAgJzFzdF9wbGFjZV9tZWRhbCc6J1xcdWQ4M2VcXHVkZDQ3JyxcbiAgJzJuZF9wbGFjZV9tZWRhbCc6J1xcdWQ4M2VcXHVkZDQ4JyxcbiAgJzNyZF9wbGFjZV9tZWRhbCc6J1xcdWQ4M2VcXHVkZDQ5JyxcbiAgJzhiYWxsJzonXFx1ZDgzY1xcdWRmYjEnLFxuICAnYSc6J1xcdWQ4M2NcXHVkZDcwXFx1ZmUwZicsXG4gICdhYic6J1xcdWQ4M2NcXHVkZDhlJyxcbiAgJ2FiYyc6J1xcdWQ4M2RcXHVkZDI0JyxcbiAgJ2FiY2QnOidcXHVkODNkXFx1ZGQyMScsXG4gICdhY2NlcHQnOidcXHVkODNjXFx1ZGU1MScsXG4gICdhZXJpYWxfdHJhbXdheSc6J1xcdWQ4M2RcXHVkZWExJyxcbiAgJ2FpcnBsYW5lJzonXFx1MjcwOFxcdWZlMGYnLFxuICAnYWxhcm1fY2xvY2snOidcXHUyM2YwJyxcbiAgJ2FsZW1iaWMnOidcXHUyNjk3XFx1ZmUwZicsXG4gICdhbGllbic6J1xcdWQ4M2RcXHVkYzdkJyxcbiAgJ2FtYnVsYW5jZSc6J1xcdWQ4M2RcXHVkZTkxJyxcbiAgJ2FtcGhvcmEnOidcXHVkODNjXFx1ZGZmYScsXG4gICdhbmNob3InOidcXHUyNjkzXFx1ZmUwZicsXG4gICdhbmdlbCc6J1xcdWQ4M2RcXHVkYzdjJyxcbiAgJ2FuZ2VyJzonXFx1ZDgzZFxcdWRjYTInLFxuICAnYW5ncnknOidcXHVkODNkXFx1ZGUyMCcsXG4gICdhbmd1aXNoZWQnOidcXHVkODNkXFx1ZGUyNycsXG4gICdhbnQnOidcXHVkODNkXFx1ZGMxYycsXG4gICdhcHBsZSc6J1xcdWQ4M2NcXHVkZjRlJyxcbiAgJ2FxdWFyaXVzJzonXFx1MjY1MlxcdWZlMGYnLFxuICAnYXJpZXMnOidcXHUyNjQ4XFx1ZmUwZicsXG4gICdhcnJvd19iYWNrd2FyZCc6J1xcdTI1YzBcXHVmZTBmJyxcbiAgJ2Fycm93X2RvdWJsZV9kb3duJzonXFx1MjNlYycsXG4gICdhcnJvd19kb3VibGVfdXAnOidcXHUyM2ViJyxcbiAgJ2Fycm93X2Rvd24nOidcXHUyYjA3XFx1ZmUwZicsXG4gICdhcnJvd19kb3duX3NtYWxsJzonXFx1ZDgzZFxcdWRkM2QnLFxuICAnYXJyb3dfZm9yd2FyZCc6J1xcdTI1YjZcXHVmZTBmJyxcbiAgJ2Fycm93X2hlYWRpbmdfZG93bic6J1xcdTI5MzVcXHVmZTBmJyxcbiAgJ2Fycm93X2hlYWRpbmdfdXAnOidcXHUyOTM0XFx1ZmUwZicsXG4gICdhcnJvd19sZWZ0JzonXFx1MmIwNVxcdWZlMGYnLFxuICAnYXJyb3dfbG93ZXJfbGVmdCc6J1xcdTIxOTlcXHVmZTBmJyxcbiAgJ2Fycm93X2xvd2VyX3JpZ2h0JzonXFx1MjE5OFxcdWZlMGYnLFxuICAnYXJyb3dfcmlnaHQnOidcXHUyN2ExXFx1ZmUwZicsXG4gICdhcnJvd19yaWdodF9ob29rJzonXFx1MjFhYVxcdWZlMGYnLFxuICAnYXJyb3dfdXAnOidcXHUyYjA2XFx1ZmUwZicsXG4gICdhcnJvd191cF9kb3duJzonXFx1MjE5NVxcdWZlMGYnLFxuICAnYXJyb3dfdXBfc21hbGwnOidcXHVkODNkXFx1ZGQzYycsXG4gICdhcnJvd191cHBlcl9sZWZ0JzonXFx1MjE5NlxcdWZlMGYnLFxuICAnYXJyb3dfdXBwZXJfcmlnaHQnOidcXHUyMTk3XFx1ZmUwZicsXG4gICdhcnJvd3NfY2xvY2t3aXNlJzonXFx1ZDgzZFxcdWRkMDMnLFxuICAnYXJyb3dzX2NvdW50ZXJjbG9ja3dpc2UnOidcXHVkODNkXFx1ZGQwNCcsXG4gICdhcnQnOidcXHVkODNjXFx1ZGZhOCcsXG4gICdhcnRpY3VsYXRlZF9sb3JyeSc6J1xcdWQ4M2RcXHVkZTliJyxcbiAgJ2FydGlmaWNpYWxfc2F0ZWxsaXRlJzonXFx1ZDgzZFxcdWRlZjAnLFxuICAnYXN0b25pc2hlZCc6J1xcdWQ4M2RcXHVkZTMyJyxcbiAgJ2F0aGxldGljX3Nob2UnOidcXHVkODNkXFx1ZGM1ZicsXG4gICdhdG0nOidcXHVkODNjXFx1ZGZlNycsXG4gICdhdG9tX3N5bWJvbCc6J1xcdTI2OWJcXHVmZTBmJyxcbiAgJ2F2b2NhZG8nOidcXHVkODNlXFx1ZGQ1MScsXG4gICdiJzonXFx1ZDgzY1xcdWRkNzFcXHVmZTBmJyxcbiAgJ2JhYnknOidcXHVkODNkXFx1ZGM3NicsXG4gICdiYWJ5X2JvdHRsZSc6J1xcdWQ4M2NcXHVkZjdjJyxcbiAgJ2JhYnlfY2hpY2snOidcXHVkODNkXFx1ZGMyNCcsXG4gICdiYWJ5X3N5bWJvbCc6J1xcdWQ4M2RcXHVkZWJjJyxcbiAgJ2JhY2snOidcXHVkODNkXFx1ZGQxOScsXG4gICdiYWNvbic6J1xcdWQ4M2VcXHVkZDUzJyxcbiAgJ2JhZG1pbnRvbic6J1xcdWQ4M2NcXHVkZmY4JyxcbiAgJ2JhZ2dhZ2VfY2xhaW0nOidcXHVkODNkXFx1ZGVjNCcsXG4gICdiYWd1ZXR0ZV9icmVhZCc6J1xcdWQ4M2VcXHVkZDU2JyxcbiAgJ2JhbGFuY2Vfc2NhbGUnOidcXHUyNjk2XFx1ZmUwZicsXG4gICdiYWxsb29uJzonXFx1ZDgzY1xcdWRmODgnLFxuICAnYmFsbG90X2JveCc6J1xcdWQ4M2RcXHVkZGYzJyxcbiAgJ2JhbGxvdF9ib3hfd2l0aF9jaGVjayc6J1xcdTI2MTFcXHVmZTBmJyxcbiAgJ2JhbWJvbyc6J1xcdWQ4M2NcXHVkZjhkJyxcbiAgJ2JhbmFuYSc6J1xcdWQ4M2NcXHVkZjRjJyxcbiAgJ2JhbmdiYW5nJzonXFx1MjAzY1xcdWZlMGYnLFxuICAnYmFuayc6J1xcdWQ4M2NcXHVkZmU2JyxcbiAgJ2Jhcl9jaGFydCc6J1xcdWQ4M2RcXHVkY2NhJyxcbiAgJ2JhcmJlcic6J1xcdWQ4M2RcXHVkYzg4JyxcbiAgJ2Jhc2ViYWxsJzonXFx1MjZiZVxcdWZlMGYnLFxuICAnYmFza2V0YmFsbCc6J1xcdWQ4M2NcXHVkZmMwJyxcbiAgJ2Jhc2tldGJhbGxfbWFuJzonXFx1MjZmOVxcdWZlMGYnLFxuICAnYmFza2V0YmFsbF93b21hbic6J1xcdTI2ZjlcXHVmZTBmJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdiYXQnOidcXHVkODNlXFx1ZGQ4NycsXG4gICdiYXRoJzonXFx1ZDgzZFxcdWRlYzAnLFxuICAnYmF0aHR1Yic6J1xcdWQ4M2RcXHVkZWMxJyxcbiAgJ2JhdHRlcnknOidcXHVkODNkXFx1ZGQwYicsXG4gICdiZWFjaF91bWJyZWxsYSc6J1xcdWQ4M2NcXHVkZmQ2JyxcbiAgJ2JlYXInOidcXHVkODNkXFx1ZGMzYicsXG4gICdiZWQnOidcXHVkODNkXFx1ZGVjZicsXG4gICdiZWUnOidcXHVkODNkXFx1ZGMxZCcsXG4gICdiZWVyJzonXFx1ZDgzY1xcdWRmN2EnLFxuICAnYmVlcnMnOidcXHVkODNjXFx1ZGY3YicsXG4gICdiZWV0bGUnOidcXHVkODNkXFx1ZGMxZScsXG4gICdiZWdpbm5lcic6J1xcdWQ4M2RcXHVkZDMwJyxcbiAgJ2JlbGwnOidcXHVkODNkXFx1ZGQxNCcsXG4gICdiZWxsaG9wX2JlbGwnOidcXHVkODNkXFx1ZGVjZScsXG4gICdiZW50byc6J1xcdWQ4M2NcXHVkZjcxJyxcbiAgJ2Jpa2luZ19tYW4nOidcXHVkODNkXFx1ZGViNCcsXG4gICdiaWtlJzonXFx1ZDgzZFxcdWRlYjInLFxuICAnYmlraW5nX3dvbWFuJzonXFx1ZDgzZFxcdWRlYjQmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ2Jpa2luaSc6J1xcdWQ4M2RcXHVkYzU5JyxcbiAgJ2Jpb2hhemFyZCc6J1xcdTI2MjNcXHVmZTBmJyxcbiAgJ2JpcmQnOidcXHVkODNkXFx1ZGMyNicsXG4gICdiaXJ0aGRheSc6J1xcdWQ4M2NcXHVkZjgyJyxcbiAgJ2JsYWNrX2NpcmNsZSc6J1xcdTI2YWJcXHVmZTBmJyxcbiAgJ2JsYWNrX2ZsYWcnOidcXHVkODNjXFx1ZGZmNCcsXG4gICdibGFja19oZWFydCc6J1xcdWQ4M2RcXHVkZGE0JyxcbiAgJ2JsYWNrX2pva2VyJzonXFx1ZDgzY1xcdWRjY2YnLFxuICAnYmxhY2tfbGFyZ2Vfc3F1YXJlJzonXFx1MmIxYlxcdWZlMGYnLFxuICAnYmxhY2tfbWVkaXVtX3NtYWxsX3NxdWFyZSc6J1xcdTI1ZmVcXHVmZTBmJyxcbiAgJ2JsYWNrX21lZGl1bV9zcXVhcmUnOidcXHUyNWZjXFx1ZmUwZicsXG4gICdibGFja19uaWInOidcXHUyNzEyXFx1ZmUwZicsXG4gICdibGFja19zbWFsbF9zcXVhcmUnOidcXHUyNWFhXFx1ZmUwZicsXG4gICdibGFja19zcXVhcmVfYnV0dG9uJzonXFx1ZDgzZFxcdWRkMzInLFxuICAnYmxvbmRlX21hbic6J1xcdWQ4M2RcXHVkYzcxJyxcbiAgJ2Jsb25kZV93b21hbic6J1xcdWQ4M2RcXHVkYzcxJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdibG9zc29tJzonXFx1ZDgzY1xcdWRmM2MnLFxuICAnYmxvd2Zpc2gnOidcXHVkODNkXFx1ZGMyMScsXG4gICdibHVlX2Jvb2snOidcXHVkODNkXFx1ZGNkOCcsXG4gICdibHVlX2Nhcic6J1xcdWQ4M2RcXHVkZTk5JyxcbiAgJ2JsdWVfaGVhcnQnOidcXHVkODNkXFx1ZGM5OScsXG4gICdibHVzaCc6J1xcdWQ4M2RcXHVkZTBhJyxcbiAgJ2JvYXInOidcXHVkODNkXFx1ZGMxNycsXG4gICdib2F0JzonXFx1MjZmNVxcdWZlMGYnLFxuICAnYm9tYic6J1xcdWQ4M2RcXHVkY2EzJyxcbiAgJ2Jvb2snOidcXHVkODNkXFx1ZGNkNicsXG4gICdib29rbWFyayc6J1xcdWQ4M2RcXHVkZDE2JyxcbiAgJ2Jvb2ttYXJrX3RhYnMnOidcXHVkODNkXFx1ZGNkMScsXG4gICdib29rcyc6J1xcdWQ4M2RcXHVkY2RhJyxcbiAgJ2Jvb20nOidcXHVkODNkXFx1ZGNhNScsXG4gICdib290JzonXFx1ZDgzZFxcdWRjNjInLFxuICAnYm91cXVldCc6J1xcdWQ4M2RcXHVkYzkwJyxcbiAgJ2Jvd2luZ19tYW4nOidcXHVkODNkXFx1ZGU0NycsXG4gICdib3dfYW5kX2Fycm93JzonXFx1ZDgzY1xcdWRmZjknLFxuICAnYm93aW5nX3dvbWFuJzonXFx1ZDgzZFxcdWRlNDcmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ2Jvd2xpbmcnOidcXHVkODNjXFx1ZGZiMycsXG4gICdib3hpbmdfZ2xvdmUnOidcXHVkODNlXFx1ZGQ0YScsXG4gICdib3knOidcXHVkODNkXFx1ZGM2NicsXG4gICdicmVhZCc6J1xcdWQ4M2NcXHVkZjVlJyxcbiAgJ2JyaWRlX3dpdGhfdmVpbCc6J1xcdWQ4M2RcXHVkYzcwJyxcbiAgJ2JyaWRnZV9hdF9uaWdodCc6J1xcdWQ4M2NcXHVkZjA5JyxcbiAgJ2JyaWVmY2FzZSc6J1xcdWQ4M2RcXHVkY2JjJyxcbiAgJ2Jyb2tlbl9oZWFydCc6J1xcdWQ4M2RcXHVkYzk0JyxcbiAgJ2J1Zyc6J1xcdWQ4M2RcXHVkYzFiJyxcbiAgJ2J1aWxkaW5nX2NvbnN0cnVjdGlvbic6J1xcdWQ4M2NcXHVkZmQ3JyxcbiAgJ2J1bGInOidcXHVkODNkXFx1ZGNhMScsXG4gICdidWxsZXR0cmFpbl9mcm9udCc6J1xcdWQ4M2RcXHVkZTg1JyxcbiAgJ2J1bGxldHRyYWluX3NpZGUnOidcXHVkODNkXFx1ZGU4NCcsXG4gICdidXJyaXRvJzonXFx1ZDgzY1xcdWRmMmYnLFxuICAnYnVzJzonXFx1ZDgzZFxcdWRlOGMnLFxuICAnYnVzaW5lc3Nfc3VpdF9sZXZpdGF0aW5nJzonXFx1ZDgzZFxcdWRkNzQnLFxuICAnYnVzc3RvcCc6J1xcdWQ4M2RcXHVkZThmJyxcbiAgJ2J1c3RfaW5fc2lsaG91ZXR0ZSc6J1xcdWQ4M2RcXHVkYzY0JyxcbiAgJ2J1c3RzX2luX3NpbGhvdWV0dGUnOidcXHVkODNkXFx1ZGM2NScsXG4gICdidXR0ZXJmbHknOidcXHVkODNlXFx1ZGQ4YicsXG4gICdjYWN0dXMnOidcXHVkODNjXFx1ZGYzNScsXG4gICdjYWtlJzonXFx1ZDgzY1xcdWRmNzAnLFxuICAnY2FsZW5kYXInOidcXHVkODNkXFx1ZGNjNicsXG4gICdjYWxsX21lX2hhbmQnOidcXHVkODNlXFx1ZGQxOScsXG4gICdjYWxsaW5nJzonXFx1ZDgzZFxcdWRjZjInLFxuICAnY2FtZWwnOidcXHVkODNkXFx1ZGMyYicsXG4gICdjYW1lcmEnOidcXHVkODNkXFx1ZGNmNycsXG4gICdjYW1lcmFfZmxhc2gnOidcXHVkODNkXFx1ZGNmOCcsXG4gICdjYW1waW5nJzonXFx1ZDgzY1xcdWRmZDUnLFxuICAnY2FuY2VyJzonXFx1MjY0YlxcdWZlMGYnLFxuICAnY2FuZGxlJzonXFx1ZDgzZFxcdWRkNmYnLFxuICAnY2FuZHknOidcXHVkODNjXFx1ZGY2YycsXG4gICdjYW5vZSc6J1xcdWQ4M2RcXHVkZWY2JyxcbiAgJ2NhcGl0YWxfYWJjZCc6J1xcdWQ4M2RcXHVkZDIwJyxcbiAgJ2NhcHJpY29ybic6J1xcdTI2NTFcXHVmZTBmJyxcbiAgJ2Nhcic6J1xcdWQ4M2RcXHVkZTk3JyxcbiAgJ2NhcmRfZmlsZV9ib3gnOidcXHVkODNkXFx1ZGRjMycsXG4gICdjYXJkX2luZGV4JzonXFx1ZDgzZFxcdWRjYzcnLFxuICAnY2FyZF9pbmRleF9kaXZpZGVycyc6J1xcdWQ4M2RcXHVkZGMyJyxcbiAgJ2Nhcm91c2VsX2hvcnNlJzonXFx1ZDgzY1xcdWRmYTAnLFxuICAnY2Fycm90JzonXFx1ZDgzZVxcdWRkNTUnLFxuICAnY2F0JzonXFx1ZDgzZFxcdWRjMzEnLFxuICAnY2F0Mic6J1xcdWQ4M2RcXHVkYzA4JyxcbiAgJ2NkJzonXFx1ZDgzZFxcdWRjYmYnLFxuICAnY2hhaW5zJzonXFx1MjZkMycsXG4gICdjaGFtcGFnbmUnOidcXHVkODNjXFx1ZGY3ZScsXG4gICdjaGFydCc6J1xcdWQ4M2RcXHVkY2I5JyxcbiAgJ2NoYXJ0X3dpdGhfZG93bndhcmRzX3RyZW5kJzonXFx1ZDgzZFxcdWRjYzknLFxuICAnY2hhcnRfd2l0aF91cHdhcmRzX3RyZW5kJzonXFx1ZDgzZFxcdWRjYzgnLFxuICAnY2hlY2tlcmVkX2ZsYWcnOidcXHVkODNjXFx1ZGZjMScsXG4gICdjaGVlc2UnOidcXHVkODNlXFx1ZGRjMCcsXG4gICdjaGVycmllcyc6J1xcdWQ4M2NcXHVkZjUyJyxcbiAgJ2NoZXJyeV9ibG9zc29tJzonXFx1ZDgzY1xcdWRmMzgnLFxuICAnY2hlc3RudXQnOidcXHVkODNjXFx1ZGYzMCcsXG4gICdjaGlja2VuJzonXFx1ZDgzZFxcdWRjMTQnLFxuICAnY2hpbGRyZW5fY3Jvc3NpbmcnOidcXHVkODNkXFx1ZGViOCcsXG4gICdjaGlwbXVuayc6J1xcdWQ4M2RcXHVkYzNmJyxcbiAgJ2Nob2NvbGF0ZV9iYXInOidcXHVkODNjXFx1ZGY2YicsXG4gICdjaHJpc3RtYXNfdHJlZSc6J1xcdWQ4M2NcXHVkZjg0JyxcbiAgJ2NodXJjaCc6J1xcdTI2ZWFcXHVmZTBmJyxcbiAgJ2NpbmVtYSc6J1xcdWQ4M2NcXHVkZmE2JyxcbiAgJ2NpcmN1c190ZW50JzonXFx1ZDgzY1xcdWRmYWEnLFxuICAnY2l0eV9zdW5yaXNlJzonXFx1ZDgzY1xcdWRmMDcnLFxuICAnY2l0eV9zdW5zZXQnOidcXHVkODNjXFx1ZGYwNicsXG4gICdjaXR5c2NhcGUnOidcXHVkODNjXFx1ZGZkOScsXG4gICdjbCc6J1xcdWQ4M2NcXHVkZDkxJyxcbiAgJ2NsYW1wJzonXFx1ZDgzZFxcdWRkZGMnLFxuICAnY2xhcCc6J1xcdWQ4M2RcXHVkYzRmJyxcbiAgJ2NsYXBwZXInOidcXHVkODNjXFx1ZGZhYycsXG4gICdjbGFzc2ljYWxfYnVpbGRpbmcnOidcXHVkODNjXFx1ZGZkYicsXG4gICdjbGlua2luZ19nbGFzc2VzJzonXFx1ZDgzZVxcdWRkNDInLFxuICAnY2xpcGJvYXJkJzonXFx1ZDgzZFxcdWRjY2InLFxuICAnY2xvY2sxJzonXFx1ZDgzZFxcdWRkNTAnLFxuICAnY2xvY2sxMCc6J1xcdWQ4M2RcXHVkZDU5JyxcbiAgJ2Nsb2NrMTAzMCc6J1xcdWQ4M2RcXHVkZDY1JyxcbiAgJ2Nsb2NrMTEnOidcXHVkODNkXFx1ZGQ1YScsXG4gICdjbG9jazExMzAnOidcXHVkODNkXFx1ZGQ2NicsXG4gICdjbG9jazEyJzonXFx1ZDgzZFxcdWRkNWInLFxuICAnY2xvY2sxMjMwJzonXFx1ZDgzZFxcdWRkNjcnLFxuICAnY2xvY2sxMzAnOidcXHVkODNkXFx1ZGQ1YycsXG4gICdjbG9jazInOidcXHVkODNkXFx1ZGQ1MScsXG4gICdjbG9jazIzMCc6J1xcdWQ4M2RcXHVkZDVkJyxcbiAgJ2Nsb2NrMyc6J1xcdWQ4M2RcXHVkZDUyJyxcbiAgJ2Nsb2NrMzMwJzonXFx1ZDgzZFxcdWRkNWUnLFxuICAnY2xvY2s0JzonXFx1ZDgzZFxcdWRkNTMnLFxuICAnY2xvY2s0MzAnOidcXHVkODNkXFx1ZGQ1ZicsXG4gICdjbG9jazUnOidcXHVkODNkXFx1ZGQ1NCcsXG4gICdjbG9jazUzMCc6J1xcdWQ4M2RcXHVkZDYwJyxcbiAgJ2Nsb2NrNic6J1xcdWQ4M2RcXHVkZDU1JyxcbiAgJ2Nsb2NrNjMwJzonXFx1ZDgzZFxcdWRkNjEnLFxuICAnY2xvY2s3JzonXFx1ZDgzZFxcdWRkNTYnLFxuICAnY2xvY2s3MzAnOidcXHVkODNkXFx1ZGQ2MicsXG4gICdjbG9jazgnOidcXHVkODNkXFx1ZGQ1NycsXG4gICdjbG9jazgzMCc6J1xcdWQ4M2RcXHVkZDYzJyxcbiAgJ2Nsb2NrOSc6J1xcdWQ4M2RcXHVkZDU4JyxcbiAgJ2Nsb2NrOTMwJzonXFx1ZDgzZFxcdWRkNjQnLFxuICAnY2xvc2VkX2Jvb2snOidcXHVkODNkXFx1ZGNkNScsXG4gICdjbG9zZWRfbG9ja193aXRoX2tleSc6J1xcdWQ4M2RcXHVkZDEwJyxcbiAgJ2Nsb3NlZF91bWJyZWxsYSc6J1xcdWQ4M2NcXHVkZjAyJyxcbiAgJ2Nsb3VkJzonXFx1MjYwMVxcdWZlMGYnLFxuICAnY2xvdWRfd2l0aF9saWdodG5pbmcnOidcXHVkODNjXFx1ZGYyOScsXG4gICdjbG91ZF93aXRoX2xpZ2h0bmluZ19hbmRfcmFpbic6J1xcdTI2YzgnLFxuICAnY2xvdWRfd2l0aF9yYWluJzonXFx1ZDgzY1xcdWRmMjcnLFxuICAnY2xvdWRfd2l0aF9zbm93JzonXFx1ZDgzY1xcdWRmMjgnLFxuICAnY2xvd25fZmFjZSc6J1xcdWQ4M2VcXHVkZDIxJyxcbiAgJ2NsdWJzJzonXFx1MjY2M1xcdWZlMGYnLFxuICAnY29ja3RhaWwnOidcXHVkODNjXFx1ZGY3OCcsXG4gICdjb2ZmZWUnOidcXHUyNjE1XFx1ZmUwZicsXG4gICdjb2ZmaW4nOidcXHUyNmIwXFx1ZmUwZicsXG4gICdjb2xkX3N3ZWF0JzonXFx1ZDgzZFxcdWRlMzAnLFxuICAnY29tZXQnOidcXHUyNjA0XFx1ZmUwZicsXG4gICdjb21wdXRlcic6J1xcdWQ4M2RcXHVkY2JiJyxcbiAgJ2NvbXB1dGVyX21vdXNlJzonXFx1ZDgzZFxcdWRkYjEnLFxuICAnY29uZmV0dGlfYmFsbCc6J1xcdWQ4M2NcXHVkZjhhJyxcbiAgJ2NvbmZvdW5kZWQnOidcXHVkODNkXFx1ZGUxNicsXG4gICdjb25mdXNlZCc6J1xcdWQ4M2RcXHVkZTE1JyxcbiAgJ2NvbmdyYXR1bGF0aW9ucyc6J1xcdTMyOTdcXHVmZTBmJyxcbiAgJ2NvbnN0cnVjdGlvbic6J1xcdWQ4M2RcXHVkZWE3JyxcbiAgJ2NvbnN0cnVjdGlvbl93b3JrZXJfbWFuJzonXFx1ZDgzZFxcdWRjNzcnLFxuICAnY29uc3RydWN0aW9uX3dvcmtlcl93b21hbic6J1xcdWQ4M2RcXHVkYzc3Jnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdjb250cm9sX2tub2JzJzonXFx1ZDgzY1xcdWRmOWInLFxuICAnY29udmVuaWVuY2Vfc3RvcmUnOidcXHVkODNjXFx1ZGZlYScsXG4gICdjb29raWUnOidcXHVkODNjXFx1ZGY2YScsXG4gICdjb29sJzonXFx1ZDgzY1xcdWRkOTInLFxuICAncG9saWNlbWFuJzonXFx1ZDgzZFxcdWRjNmUnLFxuICAnY29weXJpZ2h0JzonXFx1MDBhOVxcdWZlMGYnLFxuICAnY29ybic6J1xcdWQ4M2NcXHVkZjNkJyxcbiAgJ2NvdWNoX2FuZF9sYW1wJzonXFx1ZDgzZFxcdWRlY2InLFxuICAnY291cGxlJzonXFx1ZDgzZFxcdWRjNmInLFxuICAnY291cGxlX3dpdGhfaGVhcnRfd29tYW5fbWFuJzonXFx1ZDgzZFxcdWRjOTEnLFxuICAnY291cGxlX3dpdGhfaGVhcnRfbWFuX21hbic6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHUyNzY0XFx1ZmUwZiZ6d2o7XFx1ZDgzZFxcdWRjNjgnLFxuICAnY291cGxlX3dpdGhfaGVhcnRfd29tYW5fd29tYW4nOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1Mjc2NFxcdWZlMGYmendqO1xcdWQ4M2RcXHVkYzY5JyxcbiAgJ2NvdXBsZWtpc3NfbWFuX21hbic6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHUyNzY0XFx1ZmUwZiZ6d2o7XFx1ZDgzZFxcdWRjOGImendqO1xcdWQ4M2RcXHVkYzY4JyxcbiAgJ2NvdXBsZWtpc3NfbWFuX3dvbWFuJzonXFx1ZDgzZFxcdWRjOGYnLFxuICAnY291cGxla2lzc193b21hbl93b21hbic6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHUyNzY0XFx1ZmUwZiZ6d2o7XFx1ZDgzZFxcdWRjOGImendqO1xcdWQ4M2RcXHVkYzY5JyxcbiAgJ2Nvdyc6J1xcdWQ4M2RcXHVkYzJlJyxcbiAgJ2NvdzInOidcXHVkODNkXFx1ZGMwNCcsXG4gICdjb3dib3lfaGF0X2ZhY2UnOidcXHVkODNlXFx1ZGQyMCcsXG4gICdjcmFiJzonXFx1ZDgzZVxcdWRkODAnLFxuICAnY3JheW9uJzonXFx1ZDgzZFxcdWRkOGQnLFxuICAnY3JlZGl0X2NhcmQnOidcXHVkODNkXFx1ZGNiMycsXG4gICdjcmVzY2VudF9tb29uJzonXFx1ZDgzY1xcdWRmMTknLFxuICAnY3JpY2tldCc6J1xcdWQ4M2NcXHVkZmNmJyxcbiAgJ2Nyb2NvZGlsZSc6J1xcdWQ4M2RcXHVkYzBhJyxcbiAgJ2Nyb2lzc2FudCc6J1xcdWQ4M2VcXHVkZDUwJyxcbiAgJ2Nyb3NzZWRfZmluZ2Vycyc6J1xcdWQ4M2VcXHVkZDFlJyxcbiAgJ2Nyb3NzZWRfZmxhZ3MnOidcXHVkODNjXFx1ZGY4YycsXG4gICdjcm9zc2VkX3N3b3Jkcyc6J1xcdTI2OTRcXHVmZTBmJyxcbiAgJ2Nyb3duJzonXFx1ZDgzZFxcdWRjNTEnLFxuICAnY3J5JzonXFx1ZDgzZFxcdWRlMjInLFxuICAnY3J5aW5nX2NhdF9mYWNlJzonXFx1ZDgzZFxcdWRlM2YnLFxuICAnY3J5c3RhbF9iYWxsJzonXFx1ZDgzZFxcdWRkMmUnLFxuICAnY3VjdW1iZXInOidcXHVkODNlXFx1ZGQ1MicsXG4gICdjdXBpZCc6J1xcdWQ4M2RcXHVkYzk4JyxcbiAgJ2N1cmx5X2xvb3AnOidcXHUyN2IwJyxcbiAgJ2N1cnJlbmN5X2V4Y2hhbmdlJzonXFx1ZDgzZFxcdWRjYjEnLFxuICAnY3VycnknOidcXHVkODNjXFx1ZGY1YicsXG4gICdjdXN0YXJkJzonXFx1ZDgzY1xcdWRmNmUnLFxuICAnY3VzdG9tcyc6J1xcdWQ4M2RcXHVkZWMzJyxcbiAgJ2N5Y2xvbmUnOidcXHVkODNjXFx1ZGYwMCcsXG4gICdkYWdnZXInOidcXHVkODNkXFx1ZGRlMScsXG4gICdkYW5jZXInOidcXHVkODNkXFx1ZGM4MycsXG4gICdkYW5jaW5nX3dvbWVuJzonXFx1ZDgzZFxcdWRjNmYnLFxuICAnZGFuY2luZ19tZW4nOidcXHVkODNkXFx1ZGM2ZiZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnZGFuZ28nOidcXHVkODNjXFx1ZGY2MScsXG4gICdkYXJrX3N1bmdsYXNzZXMnOidcXHVkODNkXFx1ZGQ3NicsXG4gICdkYXJ0JzonXFx1ZDgzY1xcdWRmYWYnLFxuICAnZGFzaCc6J1xcdWQ4M2RcXHVkY2E4JyxcbiAgJ2RhdGUnOidcXHVkODNkXFx1ZGNjNScsXG4gICdkZWNpZHVvdXNfdHJlZSc6J1xcdWQ4M2NcXHVkZjMzJyxcbiAgJ2RlZXInOidcXHVkODNlXFx1ZGQ4YycsXG4gICdkZXBhcnRtZW50X3N0b3JlJzonXFx1ZDgzY1xcdWRmZWMnLFxuICAnZGVyZWxpY3RfaG91c2UnOidcXHVkODNjXFx1ZGZkYScsXG4gICdkZXNlcnQnOidcXHVkODNjXFx1ZGZkYycsXG4gICdkZXNlcnRfaXNsYW5kJzonXFx1ZDgzY1xcdWRmZGQnLFxuICAnZGVza3RvcF9jb21wdXRlcic6J1xcdWQ4M2RcXHVkZGE1JyxcbiAgJ21hbGVfZGV0ZWN0aXZlJzonXFx1ZDgzZFxcdWRkNzVcXHVmZTBmJyxcbiAgJ2RpYW1vbmRfc2hhcGVfd2l0aF9hX2RvdF9pbnNpZGUnOidcXHVkODNkXFx1ZGNhMCcsXG4gICdkaWFtb25kcyc6J1xcdTI2NjZcXHVmZTBmJyxcbiAgJ2Rpc2FwcG9pbnRlZCc6J1xcdWQ4M2RcXHVkZTFlJyxcbiAgJ2Rpc2FwcG9pbnRlZF9yZWxpZXZlZCc6J1xcdWQ4M2RcXHVkZTI1JyxcbiAgJ2Rpenp5JzonXFx1ZDgzZFxcdWRjYWInLFxuICAnZGl6enlfZmFjZSc6J1xcdWQ4M2RcXHVkZTM1JyxcbiAgJ2RvX25vdF9saXR0ZXInOidcXHVkODNkXFx1ZGVhZicsXG4gICdkb2cnOidcXHVkODNkXFx1ZGMzNicsXG4gICdkb2cyJzonXFx1ZDgzZFxcdWRjMTUnLFxuICAnZG9sbGFyJzonXFx1ZDgzZFxcdWRjYjUnLFxuICAnZG9sbHMnOidcXHVkODNjXFx1ZGY4ZScsXG4gICdkb2xwaGluJzonXFx1ZDgzZFxcdWRjMmMnLFxuICAnZG9vcic6J1xcdWQ4M2RcXHVkZWFhJyxcbiAgJ2RvdWdobnV0JzonXFx1ZDgzY1xcdWRmNjknLFxuICAnZG92ZSc6J1xcdWQ4M2RcXHVkZDRhJyxcbiAgJ2RyYWdvbic6J1xcdWQ4M2RcXHVkYzA5JyxcbiAgJ2RyYWdvbl9mYWNlJzonXFx1ZDgzZFxcdWRjMzInLFxuICAnZHJlc3MnOidcXHVkODNkXFx1ZGM1NycsXG4gICdkcm9tZWRhcnlfY2FtZWwnOidcXHVkODNkXFx1ZGMyYScsXG4gICdkcm9vbGluZ19mYWNlJzonXFx1ZDgzZVxcdWRkMjQnLFxuICAnZHJvcGxldCc6J1xcdWQ4M2RcXHVkY2E3JyxcbiAgJ2RydW0nOidcXHVkODNlXFx1ZGQ0MScsXG4gICdkdWNrJzonXFx1ZDgzZVxcdWRkODYnLFxuICAnZHZkJzonXFx1ZDgzZFxcdWRjYzAnLFxuICAnZS1tYWlsJzonXFx1ZDgzZFxcdWRjZTcnLFxuICAnZWFnbGUnOidcXHVkODNlXFx1ZGQ4NScsXG4gICdlYXInOidcXHVkODNkXFx1ZGM0MicsXG4gICdlYXJfb2ZfcmljZSc6J1xcdWQ4M2NcXHVkZjNlJyxcbiAgJ2VhcnRoX2FmcmljYSc6J1xcdWQ4M2NcXHVkZjBkJyxcbiAgJ2VhcnRoX2FtZXJpY2FzJzonXFx1ZDgzY1xcdWRmMGUnLFxuICAnZWFydGhfYXNpYSc6J1xcdWQ4M2NcXHVkZjBmJyxcbiAgJ2VnZyc6J1xcdWQ4M2VcXHVkZDVhJyxcbiAgJ2VnZ3BsYW50JzonXFx1ZDgzY1xcdWRmNDYnLFxuICAnZWlnaHRfcG9pbnRlZF9ibGFja19zdGFyJzonXFx1MjczNFxcdWZlMGYnLFxuICAnZWlnaHRfc3Bva2VkX2FzdGVyaXNrJzonXFx1MjczM1xcdWZlMGYnLFxuICAnZWxlY3RyaWNfcGx1Zyc6J1xcdWQ4M2RcXHVkZDBjJyxcbiAgJ2VsZXBoYW50JzonXFx1ZDgzZFxcdWRjMTgnLFxuICAnZW1haWwnOidcXHUyNzA5XFx1ZmUwZicsXG4gICdlbmQnOidcXHVkODNkXFx1ZGQxYScsXG4gICdlbnZlbG9wZV93aXRoX2Fycm93JzonXFx1ZDgzZFxcdWRjZTknLFxuICAnZXVybyc6J1xcdWQ4M2RcXHVkY2I2JyxcbiAgJ2V1cm9wZWFuX2Nhc3RsZSc6J1xcdWQ4M2NcXHVkZmYwJyxcbiAgJ2V1cm9wZWFuX3Bvc3Rfb2ZmaWNlJzonXFx1ZDgzY1xcdWRmZTQnLFxuICAnZXZlcmdyZWVuX3RyZWUnOidcXHVkODNjXFx1ZGYzMicsXG4gICdleGNsYW1hdGlvbic6J1xcdTI3NTdcXHVmZTBmJyxcbiAgJ2V4cHJlc3Npb25sZXNzJzonXFx1ZDgzZFxcdWRlMTEnLFxuICAnZXllJzonXFx1ZDgzZFxcdWRjNDEnLFxuICAnZXllX3NwZWVjaF9idWJibGUnOidcXHVkODNkXFx1ZGM0MSZ6d2o7XFx1ZDgzZFxcdWRkZTgnLFxuICAnZXllZ2xhc3Nlcyc6J1xcdWQ4M2RcXHVkYzUzJyxcbiAgJ2V5ZXMnOidcXHVkODNkXFx1ZGM0MCcsXG4gICdmYWNlX3dpdGhfaGVhZF9iYW5kYWdlJzonXFx1ZDgzZVxcdWRkMTUnLFxuICAnZmFjZV93aXRoX3RoZXJtb21ldGVyJzonXFx1ZDgzZVxcdWRkMTInLFxuICAnZmlzdF9vbmNvbWluZyc6J1xcdWQ4M2RcXHVkYzRhJyxcbiAgJ2ZhY3RvcnknOidcXHVkODNjXFx1ZGZlZCcsXG4gICdmYWxsZW5fbGVhZic6J1xcdWQ4M2NcXHVkZjQyJyxcbiAgJ2ZhbWlseV9tYW5fd29tYW5fYm95JzonXFx1ZDgzZFxcdWRjNmEnLFxuICAnZmFtaWx5X21hbl9ib3knOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjYnLFxuICAnZmFtaWx5X21hbl9ib3lfYm95JzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY2Jnp3ajtcXHVkODNkXFx1ZGM2NicsXG4gICdmYW1pbHlfbWFuX2dpcmwnOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjcnLFxuICAnZmFtaWx5X21hbl9naXJsX2JveSc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2NyZ6d2o7XFx1ZDgzZFxcdWRjNjYnLFxuICAnZmFtaWx5X21hbl9naXJsX2dpcmwnOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjcmendqO1xcdWQ4M2RcXHVkYzY3JyxcbiAgJ2ZhbWlseV9tYW5fbWFuX2JveSc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjYnLFxuICAnZmFtaWx5X21hbl9tYW5fYm95X2JveSc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjYmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV9tYW5fbWFuX2dpcmwnOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY3JyxcbiAgJ2ZhbWlseV9tYW5fbWFuX2dpcmxfYm95JzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2NyZ6d2o7XFx1ZDgzZFxcdWRjNjYnLFxuICAnZmFtaWx5X21hbl9tYW5fZ2lybF9naXJsJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGM2NyZ6d2o7XFx1ZDgzZFxcdWRjNjcnLFxuICAnZmFtaWx5X21hbl93b21hbl9ib3lfYm95JzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NiZ6d2o7XFx1ZDgzZFxcdWRjNjYnLFxuICAnZmFtaWx5X21hbl93b21hbl9naXJsJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NycsXG4gICdmYW1pbHlfbWFuX3dvbWFuX2dpcmxfYm95JzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NyZ6d2o7XFx1ZDgzZFxcdWRjNjYnLFxuICAnZmFtaWx5X21hbl93b21hbl9naXJsX2dpcmwnOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY3Jnp3ajtcXHVkODNkXFx1ZGM2NycsXG4gICdmYW1pbHlfd29tYW5fYm95JzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV93b21hbl9ib3lfYm95JzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY2Jnp3ajtcXHVkODNkXFx1ZGM2NicsXG4gICdmYW1pbHlfd29tYW5fZ2lybCc6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NycsXG4gICdmYW1pbHlfd29tYW5fZ2lybF9ib3knOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjcmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV93b21hbl9naXJsX2dpcmwnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjcmendqO1xcdWQ4M2RcXHVkYzY3JyxcbiAgJ2ZhbWlseV93b21hbl93b21hbl9ib3knOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV93b21hbl93b21hbl9ib3lfYm95JzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2NiZ6d2o7XFx1ZDgzZFxcdWRjNjYnLFxuICAnZmFtaWx5X3dvbWFuX3dvbWFuX2dpcmwnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY3JyxcbiAgJ2ZhbWlseV93b21hbl93b21hbl9naXJsX2JveSc6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjcmendqO1xcdWQ4M2RcXHVkYzY2JyxcbiAgJ2ZhbWlseV93b21hbl93b21hbl9naXJsX2dpcmwnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkYzY3Jnp3ajtcXHVkODNkXFx1ZGM2NycsXG4gICdmYXN0X2ZvcndhcmQnOidcXHUyM2U5JyxcbiAgJ2ZheCc6J1xcdWQ4M2RcXHVkY2UwJyxcbiAgJ2ZlYXJmdWwnOidcXHVkODNkXFx1ZGUyOCcsXG4gICdmZWV0JzonXFx1ZDgzZFxcdWRjM2UnLFxuICAnZmVtYWxlX2RldGVjdGl2ZSc6J1xcdWQ4M2RcXHVkZDc1XFx1ZmUwZiZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnZmVycmlzX3doZWVsJzonXFx1ZDgzY1xcdWRmYTEnLFxuICAnZmVycnknOidcXHUyNmY0JyxcbiAgJ2ZpZWxkX2hvY2tleSc6J1xcdWQ4M2NcXHVkZmQxJyxcbiAgJ2ZpbGVfY2FiaW5ldCc6J1xcdWQ4M2RcXHVkZGM0JyxcbiAgJ2ZpbGVfZm9sZGVyJzonXFx1ZDgzZFxcdWRjYzEnLFxuICAnZmlsbV9wcm9qZWN0b3InOidcXHVkODNkXFx1ZGNmZCcsXG4gICdmaWxtX3N0cmlwJzonXFx1ZDgzY1xcdWRmOWUnLFxuICAnZmlyZSc6J1xcdWQ4M2RcXHVkZDI1JyxcbiAgJ2ZpcmVfZW5naW5lJzonXFx1ZDgzZFxcdWRlOTInLFxuICAnZmlyZXdvcmtzJzonXFx1ZDgzY1xcdWRmODYnLFxuICAnZmlyc3RfcXVhcnRlcl9tb29uJzonXFx1ZDgzY1xcdWRmMTMnLFxuICAnZmlyc3RfcXVhcnRlcl9tb29uX3dpdGhfZmFjZSc6J1xcdWQ4M2NcXHVkZjFiJyxcbiAgJ2Zpc2gnOidcXHVkODNkXFx1ZGMxZicsXG4gICdmaXNoX2Nha2UnOidcXHVkODNjXFx1ZGY2NScsXG4gICdmaXNoaW5nX3BvbGVfYW5kX2Zpc2gnOidcXHVkODNjXFx1ZGZhMycsXG4gICdmaXN0X3JhaXNlZCc6J1xcdTI3MGEnLFxuICAnZmlzdF9sZWZ0JzonXFx1ZDgzZVxcdWRkMWInLFxuICAnZmlzdF9yaWdodCc6J1xcdWQ4M2VcXHVkZDFjJyxcbiAgJ2ZsYWdzJzonXFx1ZDgzY1xcdWRmOGYnLFxuICAnZmxhc2hsaWdodCc6J1xcdWQ4M2RcXHVkZDI2JyxcbiAgJ2ZsZXVyX2RlX2xpcyc6J1xcdTI2OWNcXHVmZTBmJyxcbiAgJ2ZsaWdodF9hcnJpdmFsJzonXFx1ZDgzZFxcdWRlZWMnLFxuICAnZmxpZ2h0X2RlcGFydHVyZSc6J1xcdWQ4M2RcXHVkZWViJyxcbiAgJ2Zsb3BweV9kaXNrJzonXFx1ZDgzZFxcdWRjYmUnLFxuICAnZmxvd2VyX3BsYXlpbmdfY2FyZHMnOidcXHVkODNjXFx1ZGZiNCcsXG4gICdmbHVzaGVkJzonXFx1ZDgzZFxcdWRlMzMnLFxuICAnZm9nJzonXFx1ZDgzY1xcdWRmMmInLFxuICAnZm9nZ3knOidcXHVkODNjXFx1ZGYwMScsXG4gICdmb290YmFsbCc6J1xcdWQ4M2NcXHVkZmM4JyxcbiAgJ2Zvb3RwcmludHMnOidcXHVkODNkXFx1ZGM2MycsXG4gICdmb3JrX2FuZF9rbmlmZSc6J1xcdWQ4M2NcXHVkZjc0JyxcbiAgJ2ZvdW50YWluJzonXFx1MjZmMlxcdWZlMGYnLFxuICAnZm91bnRhaW5fcGVuJzonXFx1ZDgzZFxcdWRkOGInLFxuICAnZm91cl9sZWFmX2Nsb3Zlcic6J1xcdWQ4M2NcXHVkZjQwJyxcbiAgJ2ZveF9mYWNlJzonXFx1ZDgzZVxcdWRkOGEnLFxuICAnZnJhbWVkX3BpY3R1cmUnOidcXHVkODNkXFx1ZGRiYycsXG4gICdmcmVlJzonXFx1ZDgzY1xcdWRkOTMnLFxuICAnZnJpZWRfZWdnJzonXFx1ZDgzY1xcdWRmNzMnLFxuICAnZnJpZWRfc2hyaW1wJzonXFx1ZDgzY1xcdWRmNjQnLFxuICAnZnJpZXMnOidcXHVkODNjXFx1ZGY1ZicsXG4gICdmcm9nJzonXFx1ZDgzZFxcdWRjMzgnLFxuICAnZnJvd25pbmcnOidcXHVkODNkXFx1ZGUyNicsXG4gICdmcm93bmluZ19mYWNlJzonXFx1MjYzOVxcdWZlMGYnLFxuICAnZnJvd25pbmdfbWFuJzonXFx1ZDgzZFxcdWRlNGQmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ2Zyb3duaW5nX3dvbWFuJzonXFx1ZDgzZFxcdWRlNGQnLFxuICAnbWlkZGxlX2Zpbmdlcic6J1xcdWQ4M2RcXHVkZDk1JyxcbiAgJ2Z1ZWxwdW1wJzonXFx1MjZmZFxcdWZlMGYnLFxuICAnZnVsbF9tb29uJzonXFx1ZDgzY1xcdWRmMTUnLFxuICAnZnVsbF9tb29uX3dpdGhfZmFjZSc6J1xcdWQ4M2NcXHVkZjFkJyxcbiAgJ2Z1bmVyYWxfdXJuJzonXFx1MjZiMVxcdWZlMGYnLFxuICAnZ2FtZV9kaWUnOidcXHVkODNjXFx1ZGZiMicsXG4gICdnZWFyJzonXFx1MjY5OVxcdWZlMGYnLFxuICAnZ2VtJzonXFx1ZDgzZFxcdWRjOGUnLFxuICAnZ2VtaW5pJzonXFx1MjY0YVxcdWZlMGYnLFxuICAnZ2hvc3QnOidcXHVkODNkXFx1ZGM3YicsXG4gICdnaWZ0JzonXFx1ZDgzY1xcdWRmODEnLFxuICAnZ2lmdF9oZWFydCc6J1xcdWQ4M2RcXHVkYzlkJyxcbiAgJ2dpcmwnOidcXHVkODNkXFx1ZGM2NycsXG4gICdnbG9iZV93aXRoX21lcmlkaWFucyc6J1xcdWQ4M2NcXHVkZjEwJyxcbiAgJ2dvYWxfbmV0JzonXFx1ZDgzZVxcdWRkNDUnLFxuICAnZ29hdCc6J1xcdWQ4M2RcXHVkYzEwJyxcbiAgJ2dvbGYnOidcXHUyNmYzXFx1ZmUwZicsXG4gICdnb2xmaW5nX21hbic6J1xcdWQ4M2NcXHVkZmNjXFx1ZmUwZicsXG4gICdnb2xmaW5nX3dvbWFuJzonXFx1ZDgzY1xcdWRmY2NcXHVmZTBmJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdnb3JpbGxhJzonXFx1ZDgzZVxcdWRkOGQnLFxuICAnZ3JhcGVzJzonXFx1ZDgzY1xcdWRmNDcnLFxuICAnZ3JlZW5fYXBwbGUnOidcXHVkODNjXFx1ZGY0ZicsXG4gICdncmVlbl9ib29rJzonXFx1ZDgzZFxcdWRjZDcnLFxuICAnZ3JlZW5faGVhcnQnOidcXHVkODNkXFx1ZGM5YScsXG4gICdncmVlbl9zYWxhZCc6J1xcdWQ4M2VcXHVkZDU3JyxcbiAgJ2dyZXlfZXhjbGFtYXRpb24nOidcXHUyNzU1JyxcbiAgJ2dyZXlfcXVlc3Rpb24nOidcXHUyNzU0JyxcbiAgJ2dyaW1hY2luZyc6J1xcdWQ4M2RcXHVkZTJjJyxcbiAgJ2dyaW4nOidcXHVkODNkXFx1ZGUwMScsXG4gICdncmlubmluZyc6J1xcdWQ4M2RcXHVkZTAwJyxcbiAgJ2d1YXJkc21hbic6J1xcdWQ4M2RcXHVkYzgyJyxcbiAgJ2d1YXJkc3dvbWFuJzonXFx1ZDgzZFxcdWRjODImendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ2d1aXRhcic6J1xcdWQ4M2NcXHVkZmI4JyxcbiAgJ2d1bic6J1xcdWQ4M2RcXHVkZDJiJyxcbiAgJ2hhaXJjdXRfd29tYW4nOidcXHVkODNkXFx1ZGM4NycsXG4gICdoYWlyY3V0X21hbic6J1xcdWQ4M2RcXHVkYzg3Jnp3ajtcXHUyNjQyXFx1ZmUwZicsXG4gICdoYW1idXJnZXInOidcXHVkODNjXFx1ZGY1NCcsXG4gICdoYW1tZXInOidcXHVkODNkXFx1ZGQyOCcsXG4gICdoYW1tZXJfYW5kX3BpY2snOidcXHUyNjkyJyxcbiAgJ2hhbW1lcl9hbmRfd3JlbmNoJzonXFx1ZDgzZFxcdWRlZTAnLFxuICAnaGFtc3Rlcic6J1xcdWQ4M2RcXHVkYzM5JyxcbiAgJ2hhbmQnOidcXHUyNzBiJyxcbiAgJ2hhbmRiYWcnOidcXHVkODNkXFx1ZGM1YycsXG4gICdoYW5kc2hha2UnOidcXHVkODNlXFx1ZGQxZCcsXG4gICdoYW5rZXknOidcXHVkODNkXFx1ZGNhOScsXG4gICdoYXRjaGVkX2NoaWNrJzonXFx1ZDgzZFxcdWRjMjUnLFxuICAnaGF0Y2hpbmdfY2hpY2snOidcXHVkODNkXFx1ZGMyMycsXG4gICdoZWFkcGhvbmVzJzonXFx1ZDgzY1xcdWRmYTcnLFxuICAnaGVhcl9ub19ldmlsJzonXFx1ZDgzZFxcdWRlNDknLFxuICAnaGVhcnQnOidcXHUyNzY0XFx1ZmUwZicsXG4gICdoZWFydF9kZWNvcmF0aW9uJzonXFx1ZDgzZFxcdWRjOWYnLFxuICAnaGVhcnRfZXllcyc6J1xcdWQ4M2RcXHVkZTBkJyxcbiAgJ2hlYXJ0X2V5ZXNfY2F0JzonXFx1ZDgzZFxcdWRlM2InLFxuICAnaGVhcnRiZWF0JzonXFx1ZDgzZFxcdWRjOTMnLFxuICAnaGVhcnRwdWxzZSc6J1xcdWQ4M2RcXHVkYzk3JyxcbiAgJ2hlYXJ0cyc6J1xcdTI2NjVcXHVmZTBmJyxcbiAgJ2hlYXZ5X2NoZWNrX21hcmsnOidcXHUyNzE0XFx1ZmUwZicsXG4gICdoZWF2eV9kaXZpc2lvbl9zaWduJzonXFx1Mjc5NycsXG4gICdoZWF2eV9kb2xsYXJfc2lnbic6J1xcdWQ4M2RcXHVkY2IyJyxcbiAgJ2hlYXZ5X2hlYXJ0X2V4Y2xhbWF0aW9uJzonXFx1Mjc2M1xcdWZlMGYnLFxuICAnaGVhdnlfbWludXNfc2lnbic6J1xcdTI3OTYnLFxuICAnaGVhdnlfbXVsdGlwbGljYXRpb25feCc6J1xcdTI3MTZcXHVmZTBmJyxcbiAgJ2hlYXZ5X3BsdXNfc2lnbic6J1xcdTI3OTUnLFxuICAnaGVsaWNvcHRlcic6J1xcdWQ4M2RcXHVkZTgxJyxcbiAgJ2hlcmInOidcXHVkODNjXFx1ZGYzZicsXG4gICdoaWJpc2N1cyc6J1xcdWQ4M2NcXHVkZjNhJyxcbiAgJ2hpZ2hfYnJpZ2h0bmVzcyc6J1xcdWQ4M2RcXHVkZDA2JyxcbiAgJ2hpZ2hfaGVlbCc6J1xcdWQ4M2RcXHVkYzYwJyxcbiAgJ2hvY2hvJzonXFx1ZDgzZFxcdWRkMmEnLFxuICAnaG9sZSc6J1xcdWQ4M2RcXHVkZDczJyxcbiAgJ2hvbmV5X3BvdCc6J1xcdWQ4M2NcXHVkZjZmJyxcbiAgJ2hvcnNlJzonXFx1ZDgzZFxcdWRjMzQnLFxuICAnaG9yc2VfcmFjaW5nJzonXFx1ZDgzY1xcdWRmYzcnLFxuICAnaG9zcGl0YWwnOidcXHVkODNjXFx1ZGZlNScsXG4gICdob3RfcGVwcGVyJzonXFx1ZDgzY1xcdWRmMzYnLFxuICAnaG90ZG9nJzonXFx1ZDgzY1xcdWRmMmQnLFxuICAnaG90ZWwnOidcXHVkODNjXFx1ZGZlOCcsXG4gICdob3RzcHJpbmdzJzonXFx1MjY2OFxcdWZlMGYnLFxuICAnaG91cmdsYXNzJzonXFx1MjMxYlxcdWZlMGYnLFxuICAnaG91cmdsYXNzX2Zsb3dpbmdfc2FuZCc6J1xcdTIzZjMnLFxuICAnaG91c2UnOidcXHVkODNjXFx1ZGZlMCcsXG4gICdob3VzZV93aXRoX2dhcmRlbic6J1xcdWQ4M2NcXHVkZmUxJyxcbiAgJ2hvdXNlcyc6J1xcdWQ4M2NcXHVkZmQ4JyxcbiAgJ2h1Z3MnOidcXHVkODNlXFx1ZGQxNycsXG4gICdodXNoZWQnOidcXHVkODNkXFx1ZGUyZicsXG4gICdpY2VfY3JlYW0nOidcXHVkODNjXFx1ZGY2OCcsXG4gICdpY2VfaG9ja2V5JzonXFx1ZDgzY1xcdWRmZDInLFxuICAnaWNlX3NrYXRlJzonXFx1MjZmOCcsXG4gICdpY2VjcmVhbSc6J1xcdWQ4M2NcXHVkZjY2JyxcbiAgJ2lkJzonXFx1ZDgzY1xcdWRkOTQnLFxuICAnaWRlb2dyYXBoX2FkdmFudGFnZSc6J1xcdWQ4M2NcXHVkZTUwJyxcbiAgJ2ltcCc6J1xcdWQ4M2RcXHVkYzdmJyxcbiAgJ2luYm94X3RyYXknOidcXHVkODNkXFx1ZGNlNScsXG4gICdpbmNvbWluZ19lbnZlbG9wZSc6J1xcdWQ4M2RcXHVkY2U4JyxcbiAgJ3RpcHBpbmdfaGFuZF93b21hbic6J1xcdWQ4M2RcXHVkYzgxJyxcbiAgJ2luZm9ybWF0aW9uX3NvdXJjZSc6J1xcdTIxMzlcXHVmZTBmJyxcbiAgJ2lubm9jZW50JzonXFx1ZDgzZFxcdWRlMDcnLFxuICAnaW50ZXJyb2JhbmcnOidcXHUyMDQ5XFx1ZmUwZicsXG4gICdpcGhvbmUnOidcXHVkODNkXFx1ZGNmMScsXG4gICdpemFrYXlhX2xhbnRlcm4nOidcXHVkODNjXFx1ZGZlZScsXG4gICdqYWNrX29fbGFudGVybic6J1xcdWQ4M2NcXHVkZjgzJyxcbiAgJ2phcGFuJzonXFx1ZDgzZFxcdWRkZmUnLFxuICAnamFwYW5lc2VfY2FzdGxlJzonXFx1ZDgzY1xcdWRmZWYnLFxuICAnamFwYW5lc2VfZ29ibGluJzonXFx1ZDgzZFxcdWRjN2EnLFxuICAnamFwYW5lc2Vfb2dyZSc6J1xcdWQ4M2RcXHVkYzc5JyxcbiAgJ2plYW5zJzonXFx1ZDgzZFxcdWRjNTYnLFxuICAnam95JzonXFx1ZDgzZFxcdWRlMDInLFxuICAnam95X2NhdCc6J1xcdWQ4M2RcXHVkZTM5JyxcbiAgJ2pveXN0aWNrJzonXFx1ZDgzZFxcdWRkNzknLFxuICAna2FhYmEnOidcXHVkODNkXFx1ZGQ0YicsXG4gICdrZXknOidcXHVkODNkXFx1ZGQxMScsXG4gICdrZXlib2FyZCc6J1xcdTIzMjhcXHVmZTBmJyxcbiAgJ2tleWNhcF90ZW4nOidcXHVkODNkXFx1ZGQxZicsXG4gICdraWNrX3Njb290ZXInOidcXHVkODNkXFx1ZGVmNCcsXG4gICdraW1vbm8nOidcXHVkODNkXFx1ZGM1OCcsXG4gICdraXNzJzonXFx1ZDgzZFxcdWRjOGInLFxuICAna2lzc2luZyc6J1xcdWQ4M2RcXHVkZTE3JyxcbiAgJ2tpc3NpbmdfY2F0JzonXFx1ZDgzZFxcdWRlM2QnLFxuICAna2lzc2luZ19jbG9zZWRfZXllcyc6J1xcdWQ4M2RcXHVkZTFhJyxcbiAgJ2tpc3NpbmdfaGVhcnQnOidcXHVkODNkXFx1ZGUxOCcsXG4gICdraXNzaW5nX3NtaWxpbmdfZXllcyc6J1xcdWQ4M2RcXHVkZTE5JyxcbiAgJ2tpd2lfZnJ1aXQnOidcXHVkODNlXFx1ZGQ1ZCcsXG4gICdrb2FsYSc6J1xcdWQ4M2RcXHVkYzI4JyxcbiAgJ2tva28nOidcXHVkODNjXFx1ZGUwMScsXG4gICdsYWJlbCc6J1xcdWQ4M2NcXHVkZmY3JyxcbiAgJ2xhcmdlX2JsdWVfY2lyY2xlJzonXFx1ZDgzZFxcdWRkMzUnLFxuICAnbGFyZ2VfYmx1ZV9kaWFtb25kJzonXFx1ZDgzZFxcdWRkMzcnLFxuICAnbGFyZ2Vfb3JhbmdlX2RpYW1vbmQnOidcXHVkODNkXFx1ZGQzNicsXG4gICdsYXN0X3F1YXJ0ZXJfbW9vbic6J1xcdWQ4M2NcXHVkZjE3JyxcbiAgJ2xhc3RfcXVhcnRlcl9tb29uX3dpdGhfZmFjZSc6J1xcdWQ4M2NcXHVkZjFjJyxcbiAgJ2xhdGluX2Nyb3NzJzonXFx1MjcxZFxcdWZlMGYnLFxuICAnbGF1Z2hpbmcnOidcXHVkODNkXFx1ZGUwNicsXG4gICdsZWF2ZXMnOidcXHVkODNjXFx1ZGY0MycsXG4gICdsZWRnZXInOidcXHVkODNkXFx1ZGNkMicsXG4gICdsZWZ0X2x1Z2dhZ2UnOidcXHVkODNkXFx1ZGVjNScsXG4gICdsZWZ0X3JpZ2h0X2Fycm93JzonXFx1MjE5NFxcdWZlMGYnLFxuICAnbGVmdHdhcmRzX2Fycm93X3dpdGhfaG9vayc6J1xcdTIxYTlcXHVmZTBmJyxcbiAgJ2xlbW9uJzonXFx1ZDgzY1xcdWRmNGInLFxuICAnbGVvJzonXFx1MjY0Y1xcdWZlMGYnLFxuICAnbGVvcGFyZCc6J1xcdWQ4M2RcXHVkYzA2JyxcbiAgJ2xldmVsX3NsaWRlcic6J1xcdWQ4M2NcXHVkZjlhJyxcbiAgJ2xpYnJhJzonXFx1MjY0ZVxcdWZlMGYnLFxuICAnbGlnaHRfcmFpbCc6J1xcdWQ4M2RcXHVkZTg4JyxcbiAgJ2xpbmsnOidcXHVkODNkXFx1ZGQxNycsXG4gICdsaW9uJzonXFx1ZDgzZVxcdWRkODEnLFxuICAnbGlwcyc6J1xcdWQ4M2RcXHVkYzQ0JyxcbiAgJ2xpcHN0aWNrJzonXFx1ZDgzZFxcdWRjODQnLFxuICAnbGl6YXJkJzonXFx1ZDgzZVxcdWRkOGUnLFxuICAnbG9jayc6J1xcdWQ4M2RcXHVkZDEyJyxcbiAgJ2xvY2tfd2l0aF9pbmtfcGVuJzonXFx1ZDgzZFxcdWRkMGYnLFxuICAnbG9sbGlwb3AnOidcXHVkODNjXFx1ZGY2ZCcsXG4gICdsb29wJzonXFx1MjdiZicsXG4gICdsb3VkX3NvdW5kJzonXFx1ZDgzZFxcdWRkMGEnLFxuICAnbG91ZHNwZWFrZXInOidcXHVkODNkXFx1ZGNlMicsXG4gICdsb3ZlX2hvdGVsJzonXFx1ZDgzY1xcdWRmZTknLFxuICAnbG92ZV9sZXR0ZXInOidcXHVkODNkXFx1ZGM4YycsXG4gICdsb3dfYnJpZ2h0bmVzcyc6J1xcdWQ4M2RcXHVkZDA1JyxcbiAgJ2x5aW5nX2ZhY2UnOidcXHVkODNlXFx1ZGQyNScsXG4gICdtJzonXFx1MjRjMlxcdWZlMGYnLFxuICAnbWFnJzonXFx1ZDgzZFxcdWRkMGQnLFxuICAnbWFnX3JpZ2h0JzonXFx1ZDgzZFxcdWRkMGUnLFxuICAnbWFoam9uZyc6J1xcdWQ4M2NcXHVkYzA0XFx1ZmUwZicsXG4gICdtYWlsYm94JzonXFx1ZDgzZFxcdWRjZWInLFxuICAnbWFpbGJveF9jbG9zZWQnOidcXHVkODNkXFx1ZGNlYScsXG4gICdtYWlsYm94X3dpdGhfbWFpbCc6J1xcdWQ4M2RcXHVkY2VjJyxcbiAgJ21haWxib3hfd2l0aF9ub19tYWlsJzonXFx1ZDgzZFxcdWRjZWQnLFxuICAnbWFuJzonXFx1ZDgzZFxcdWRjNjgnLFxuICAnbWFuX2FydGlzdCc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNjXFx1ZGZhOCcsXG4gICdtYW5fYXN0cm9uYXV0JzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkZTgwJyxcbiAgJ21hbl9jYXJ0d2hlZWxpbmcnOidcXHVkODNlXFx1ZGQzOCZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnbWFuX2Nvb2snOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzY1xcdWRmNzMnLFxuICAnbWFuX2RhbmNpbmcnOidcXHVkODNkXFx1ZGQ3YScsXG4gICdtYW5fZmFjZXBhbG1pbmcnOidcXHVkODNlXFx1ZGQyNiZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnbWFuX2ZhY3Rvcnlfd29ya2VyJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2NcXHVkZmVkJyxcbiAgJ21hbl9mYXJtZXInOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1ZDgzY1xcdWRmM2UnLFxuICAnbWFuX2ZpcmVmaWdodGVyJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkZTkyJyxcbiAgJ21hbl9oZWFsdGhfd29ya2VyJzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdTI2OTVcXHVmZTBmJyxcbiAgJ21hbl9pbl90dXhlZG8nOidcXHVkODNlXFx1ZGQzNScsXG4gICdtYW5fanVkZ2UnOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1MjY5NlxcdWZlMGYnLFxuICAnbWFuX2p1Z2dsaW5nJzonXFx1ZDgzZVxcdWRkMzkmendqO1xcdTI2NDJcXHVmZTBmJyxcbiAgJ21hbl9tZWNoYW5pYyc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGQyNycsXG4gICdtYW5fb2ZmaWNlX3dvcmtlcic6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNkXFx1ZGNiYycsXG4gICdtYW5fcGlsb3QnOidcXHVkODNkXFx1ZGM2OCZ6d2o7XFx1MjcwOFxcdWZlMGYnLFxuICAnbWFuX3BsYXlpbmdfaGFuZGJhbGwnOidcXHVkODNlXFx1ZGQzZSZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnbWFuX3BsYXlpbmdfd2F0ZXJfcG9sbyc6J1xcdWQ4M2VcXHVkZDNkJnp3ajtcXHUyNjQyXFx1ZmUwZicsXG4gICdtYW5fc2NpZW50aXN0JzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkZDJjJyxcbiAgJ21hbl9zaHJ1Z2dpbmcnOidcXHVkODNlXFx1ZGQzNyZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnbWFuX3Npbmdlcic6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNjXFx1ZGZhNCcsXG4gICdtYW5fc3R1ZGVudCc6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNjXFx1ZGY5MycsXG4gICdtYW5fdGVhY2hlcic6J1xcdWQ4M2RcXHVkYzY4Jnp3ajtcXHVkODNjXFx1ZGZlYicsXG4gICdtYW5fdGVjaG5vbG9naXN0JzonXFx1ZDgzZFxcdWRjNjgmendqO1xcdWQ4M2RcXHVkY2JiJyxcbiAgJ21hbl93aXRoX2d1YV9waV9tYW8nOidcXHVkODNkXFx1ZGM3MicsXG4gICdtYW5fd2l0aF90dXJiYW4nOidcXHVkODNkXFx1ZGM3MycsXG4gICd0YW5nZXJpbmUnOidcXHVkODNjXFx1ZGY0YScsXG4gICdtYW5zX3Nob2UnOidcXHVkODNkXFx1ZGM1ZScsXG4gICdtYW50ZWxwaWVjZV9jbG9jayc6J1xcdWQ4M2RcXHVkZDcwJyxcbiAgJ21hcGxlX2xlYWYnOidcXHVkODNjXFx1ZGY0MScsXG4gICdtYXJ0aWFsX2FydHNfdW5pZm9ybSc6J1xcdWQ4M2VcXHVkZDRiJyxcbiAgJ21hc2snOidcXHVkODNkXFx1ZGUzNycsXG4gICdtYXNzYWdlX3dvbWFuJzonXFx1ZDgzZFxcdWRjODYnLFxuICAnbWFzc2FnZV9tYW4nOidcXHVkODNkXFx1ZGM4NiZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnbWVhdF9vbl9ib25lJzonXFx1ZDgzY1xcdWRmNTYnLFxuICAnbWVkYWxfbWlsaXRhcnknOidcXHVkODNjXFx1ZGY5NicsXG4gICdtZWRhbF9zcG9ydHMnOidcXHVkODNjXFx1ZGZjNScsXG4gICdtZWdhJzonXFx1ZDgzZFxcdWRjZTMnLFxuICAnbWVsb24nOidcXHVkODNjXFx1ZGY0OCcsXG4gICdtZW1vJzonXFx1ZDgzZFxcdWRjZGQnLFxuICAnbWVuX3dyZXN0bGluZyc6J1xcdWQ4M2VcXHVkZDNjJnp3ajtcXHUyNjQyXFx1ZmUwZicsXG4gICdtZW5vcmFoJzonXFx1ZDgzZFxcdWRkNGUnLFxuICAnbWVucyc6J1xcdWQ4M2RcXHVkZWI5JyxcbiAgJ21ldGFsJzonXFx1ZDgzZVxcdWRkMTgnLFxuICAnbWV0cm8nOidcXHVkODNkXFx1ZGU4NycsXG4gICdtaWNyb3Bob25lJzonXFx1ZDgzY1xcdWRmYTQnLFxuICAnbWljcm9zY29wZSc6J1xcdWQ4M2RcXHVkZDJjJyxcbiAgJ21pbGtfZ2xhc3MnOidcXHVkODNlXFx1ZGQ1YicsXG4gICdtaWxreV93YXknOidcXHVkODNjXFx1ZGYwYycsXG4gICdtaW5pYnVzJzonXFx1ZDgzZFxcdWRlOTAnLFxuICAnbWluaWRpc2MnOidcXHVkODNkXFx1ZGNiZCcsXG4gICdtb2JpbGVfcGhvbmVfb2ZmJzonXFx1ZDgzZFxcdWRjZjQnLFxuICAnbW9uZXlfbW91dGhfZmFjZSc6J1xcdWQ4M2VcXHVkZDExJyxcbiAgJ21vbmV5X3dpdGhfd2luZ3MnOidcXHVkODNkXFx1ZGNiOCcsXG4gICdtb25leWJhZyc6J1xcdWQ4M2RcXHVkY2IwJyxcbiAgJ21vbmtleSc6J1xcdWQ4M2RcXHVkYzEyJyxcbiAgJ21vbmtleV9mYWNlJzonXFx1ZDgzZFxcdWRjMzUnLFxuICAnbW9ub3JhaWwnOidcXHVkODNkXFx1ZGU5ZCcsXG4gICdtb29uJzonXFx1ZDgzY1xcdWRmMTQnLFxuICAnbW9ydGFyX2JvYXJkJzonXFx1ZDgzY1xcdWRmOTMnLFxuICAnbW9zcXVlJzonXFx1ZDgzZFxcdWRkNGMnLFxuICAnbW90b3JfYm9hdCc6J1xcdWQ4M2RcXHVkZWU1JyxcbiAgJ21vdG9yX3Njb290ZXInOidcXHVkODNkXFx1ZGVmNScsXG4gICdtb3RvcmN5Y2xlJzonXFx1ZDgzY1xcdWRmY2QnLFxuICAnbW90b3J3YXknOidcXHVkODNkXFx1ZGVlMycsXG4gICdtb3VudF9mdWppJzonXFx1ZDgzZFxcdWRkZmInLFxuICAnbW91bnRhaW4nOidcXHUyNmYwJyxcbiAgJ21vdW50YWluX2Jpa2luZ19tYW4nOidcXHVkODNkXFx1ZGViNScsXG4gICdtb3VudGFpbl9iaWtpbmdfd29tYW4nOidcXHVkODNkXFx1ZGViNSZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnbW91bnRhaW5fY2FibGV3YXknOidcXHVkODNkXFx1ZGVhMCcsXG4gICdtb3VudGFpbl9yYWlsd2F5JzonXFx1ZDgzZFxcdWRlOWUnLFxuICAnbW91bnRhaW5fc25vdyc6J1xcdWQ4M2NcXHVkZmQ0JyxcbiAgJ21vdXNlJzonXFx1ZDgzZFxcdWRjMmQnLFxuICAnbW91c2UyJzonXFx1ZDgzZFxcdWRjMDEnLFxuICAnbW92aWVfY2FtZXJhJzonXFx1ZDgzY1xcdWRmYTUnLFxuICAnbW95YWknOidcXHVkODNkXFx1ZGRmZicsXG4gICdtcnNfY2xhdXMnOidcXHVkODNlXFx1ZGQzNicsXG4gICdtdXNjbGUnOidcXHVkODNkXFx1ZGNhYScsXG4gICdtdXNocm9vbSc6J1xcdWQ4M2NcXHVkZjQ0JyxcbiAgJ211c2ljYWxfa2V5Ym9hcmQnOidcXHVkODNjXFx1ZGZiOScsXG4gICdtdXNpY2FsX25vdGUnOidcXHVkODNjXFx1ZGZiNScsXG4gICdtdXNpY2FsX3Njb3JlJzonXFx1ZDgzY1xcdWRmYmMnLFxuICAnbXV0ZSc6J1xcdWQ4M2RcXHVkZDA3JyxcbiAgJ25haWxfY2FyZSc6J1xcdWQ4M2RcXHVkYzg1JyxcbiAgJ25hbWVfYmFkZ2UnOidcXHVkODNkXFx1ZGNkYicsXG4gICduYXRpb25hbF9wYXJrJzonXFx1ZDgzY1xcdWRmZGUnLFxuICAnbmF1c2VhdGVkX2ZhY2UnOidcXHVkODNlXFx1ZGQyMicsXG4gICduZWNrdGllJzonXFx1ZDgzZFxcdWRjNTQnLFxuICAnbmVnYXRpdmVfc3F1YXJlZF9jcm9zc19tYXJrJzonXFx1Mjc0ZScsXG4gICduZXJkX2ZhY2UnOidcXHVkODNlXFx1ZGQxMycsXG4gICduZXV0cmFsX2ZhY2UnOidcXHVkODNkXFx1ZGUxMCcsXG4gICduZXcnOidcXHVkODNjXFx1ZGQ5NScsXG4gICduZXdfbW9vbic6J1xcdWQ4M2NcXHVkZjExJyxcbiAgJ25ld19tb29uX3dpdGhfZmFjZSc6J1xcdWQ4M2NcXHVkZjFhJyxcbiAgJ25ld3NwYXBlcic6J1xcdWQ4M2RcXHVkY2YwJyxcbiAgJ25ld3NwYXBlcl9yb2xsJzonXFx1ZDgzZFxcdWRkZGUnLFxuICAnbmV4dF90cmFja19idXR0b24nOidcXHUyM2VkJyxcbiAgJ25nJzonXFx1ZDgzY1xcdWRkOTYnLFxuICAnbm9fZ29vZF9tYW4nOidcXHVkODNkXFx1ZGU0NSZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAnbm9fZ29vZF93b21hbic6J1xcdWQ4M2RcXHVkZTQ1JyxcbiAgJ25pZ2h0X3dpdGhfc3RhcnMnOidcXHVkODNjXFx1ZGYwMycsXG4gICdub19iZWxsJzonXFx1ZDgzZFxcdWRkMTUnLFxuICAnbm9fYmljeWNsZXMnOidcXHVkODNkXFx1ZGViMycsXG4gICdub19lbnRyeSc6J1xcdTI2ZDRcXHVmZTBmJyxcbiAgJ25vX2VudHJ5X3NpZ24nOidcXHVkODNkXFx1ZGVhYicsXG4gICdub19tb2JpbGVfcGhvbmVzJzonXFx1ZDgzZFxcdWRjZjUnLFxuICAnbm9fbW91dGgnOidcXHVkODNkXFx1ZGUzNicsXG4gICdub19wZWRlc3RyaWFucyc6J1xcdWQ4M2RcXHVkZWI3JyxcbiAgJ25vX3Ntb2tpbmcnOidcXHVkODNkXFx1ZGVhZCcsXG4gICdub24tcG90YWJsZV93YXRlcic6J1xcdWQ4M2RcXHVkZWIxJyxcbiAgJ25vc2UnOidcXHVkODNkXFx1ZGM0MycsXG4gICdub3RlYm9vayc6J1xcdWQ4M2RcXHVkY2QzJyxcbiAgJ25vdGVib29rX3dpdGhfZGVjb3JhdGl2ZV9jb3Zlcic6J1xcdWQ4M2RcXHVkY2Q0JyxcbiAgJ25vdGVzJzonXFx1ZDgzY1xcdWRmYjYnLFxuICAnbnV0X2FuZF9ib2x0JzonXFx1ZDgzZFxcdWRkMjknLFxuICAnbyc6J1xcdTJiNTVcXHVmZTBmJyxcbiAgJ28yJzonXFx1ZDgzY1xcdWRkN2VcXHVmZTBmJyxcbiAgJ29jZWFuJzonXFx1ZDgzY1xcdWRmMGEnLFxuICAnb2N0b3B1cyc6J1xcdWQ4M2RcXHVkYzE5JyxcbiAgJ29kZW4nOidcXHVkODNjXFx1ZGY2MicsXG4gICdvZmZpY2UnOidcXHVkODNjXFx1ZGZlMicsXG4gICdvaWxfZHJ1bSc6J1xcdWQ4M2RcXHVkZWUyJyxcbiAgJ29rJzonXFx1ZDgzY1xcdWRkOTcnLFxuICAnb2tfaGFuZCc6J1xcdWQ4M2RcXHVkYzRjJyxcbiAgJ29rX21hbic6J1xcdWQ4M2RcXHVkZTQ2Jnp3ajtcXHUyNjQyXFx1ZmUwZicsXG4gICdva193b21hbic6J1xcdWQ4M2RcXHVkZTQ2JyxcbiAgJ29sZF9rZXknOidcXHVkODNkXFx1ZGRkZCcsXG4gICdvbGRlcl9tYW4nOidcXHVkODNkXFx1ZGM3NCcsXG4gICdvbGRlcl93b21hbic6J1xcdWQ4M2RcXHVkYzc1JyxcbiAgJ29tJzonXFx1ZDgzZFxcdWRkNDknLFxuICAnb24nOidcXHVkODNkXFx1ZGQxYicsXG4gICdvbmNvbWluZ19hdXRvbW9iaWxlJzonXFx1ZDgzZFxcdWRlOTgnLFxuICAnb25jb21pbmdfYnVzJzonXFx1ZDgzZFxcdWRlOGQnLFxuICAnb25jb21pbmdfcG9saWNlX2Nhcic6J1xcdWQ4M2RcXHVkZTk0JyxcbiAgJ29uY29taW5nX3RheGknOidcXHVkODNkXFx1ZGU5NicsXG4gICdvcGVuX2ZpbGVfZm9sZGVyJzonXFx1ZDgzZFxcdWRjYzInLFxuICAnb3Blbl9oYW5kcyc6J1xcdWQ4M2RcXHVkYzUwJyxcbiAgJ29wZW5fbW91dGgnOidcXHVkODNkXFx1ZGUyZScsXG4gICdvcGVuX3VtYnJlbGxhJzonXFx1MjYwMlxcdWZlMGYnLFxuICAnb3BoaXVjaHVzJzonXFx1MjZjZScsXG4gICdvcmFuZ2VfYm9vayc6J1xcdWQ4M2RcXHVkY2Q5JyxcbiAgJ29ydGhvZG94X2Nyb3NzJzonXFx1MjYyNlxcdWZlMGYnLFxuICAnb3V0Ym94X3RyYXknOidcXHVkODNkXFx1ZGNlNCcsXG4gICdvd2wnOidcXHVkODNlXFx1ZGQ4OScsXG4gICdveCc6J1xcdWQ4M2RcXHVkYzAyJyxcbiAgJ3BhY2thZ2UnOidcXHVkODNkXFx1ZGNlNicsXG4gICdwYWdlX2ZhY2luZ191cCc6J1xcdWQ4M2RcXHVkY2M0JyxcbiAgJ3BhZ2Vfd2l0aF9jdXJsJzonXFx1ZDgzZFxcdWRjYzMnLFxuICAncGFnZXInOidcXHVkODNkXFx1ZGNkZicsXG4gICdwYWludGJydXNoJzonXFx1ZDgzZFxcdWRkOGMnLFxuICAncGFsbV90cmVlJzonXFx1ZDgzY1xcdWRmMzQnLFxuICAncGFuY2FrZXMnOidcXHVkODNlXFx1ZGQ1ZScsXG4gICdwYW5kYV9mYWNlJzonXFx1ZDgzZFxcdWRjM2MnLFxuICAncGFwZXJjbGlwJzonXFx1ZDgzZFxcdWRjY2UnLFxuICAncGFwZXJjbGlwcyc6J1xcdWQ4M2RcXHVkZDg3JyxcbiAgJ3BhcmFzb2xfb25fZ3JvdW5kJzonXFx1MjZmMScsXG4gICdwYXJraW5nJzonXFx1ZDgzY1xcdWRkN2ZcXHVmZTBmJyxcbiAgJ3BhcnRfYWx0ZXJuYXRpb25fbWFyayc6J1xcdTMwM2RcXHVmZTBmJyxcbiAgJ3BhcnRseV9zdW5ueSc6J1xcdTI2YzVcXHVmZTBmJyxcbiAgJ3Bhc3Nlbmdlcl9zaGlwJzonXFx1ZDgzZFxcdWRlZjMnLFxuICAncGFzc3BvcnRfY29udHJvbCc6J1xcdWQ4M2RcXHVkZWMyJyxcbiAgJ3BhdXNlX2J1dHRvbic6J1xcdTIzZjgnLFxuICAncGVhY2Vfc3ltYm9sJzonXFx1MjYyZVxcdWZlMGYnLFxuICAncGVhY2gnOidcXHVkODNjXFx1ZGY1MScsXG4gICdwZWFudXRzJzonXFx1ZDgzZVxcdWRkNWMnLFxuICAncGVhcic6J1xcdWQ4M2NcXHVkZjUwJyxcbiAgJ3Blbic6J1xcdWQ4M2RcXHVkZDhhJyxcbiAgJ3BlbmNpbDInOidcXHUyNzBmXFx1ZmUwZicsXG4gICdwZW5ndWluJzonXFx1ZDgzZFxcdWRjMjcnLFxuICAncGVuc2l2ZSc6J1xcdWQ4M2RcXHVkZTE0JyxcbiAgJ3BlcmZvcm1pbmdfYXJ0cyc6J1xcdWQ4M2NcXHVkZmFkJyxcbiAgJ3BlcnNldmVyZSc6J1xcdWQ4M2RcXHVkZTIzJyxcbiAgJ3BlcnNvbl9mZW5jaW5nJzonXFx1ZDgzZVxcdWRkM2EnLFxuICAncG91dGluZ193b21hbic6J1xcdWQ4M2RcXHVkZTRlJyxcbiAgJ3Bob25lJzonXFx1MjYwZVxcdWZlMGYnLFxuICAncGljayc6J1xcdTI2Y2YnLFxuICAncGlnJzonXFx1ZDgzZFxcdWRjMzcnLFxuICAncGlnMic6J1xcdWQ4M2RcXHVkYzE2JyxcbiAgJ3BpZ19ub3NlJzonXFx1ZDgzZFxcdWRjM2QnLFxuICAncGlsbCc6J1xcdWQ4M2RcXHVkYzhhJyxcbiAgJ3BpbmVhcHBsZSc6J1xcdWQ4M2NcXHVkZjRkJyxcbiAgJ3BpbmdfcG9uZyc6J1xcdWQ4M2NcXHVkZmQzJyxcbiAgJ3Bpc2Nlcyc6J1xcdTI2NTNcXHVmZTBmJyxcbiAgJ3BpenphJzonXFx1ZDgzY1xcdWRmNTUnLFxuICAncGxhY2Vfb2Zfd29yc2hpcCc6J1xcdWQ4M2RcXHVkZWQwJyxcbiAgJ3BsYXRlX3dpdGhfY3V0bGVyeSc6J1xcdWQ4M2NcXHVkZjdkJyxcbiAgJ3BsYXlfb3JfcGF1c2VfYnV0dG9uJzonXFx1MjNlZicsXG4gICdwb2ludF9kb3duJzonXFx1ZDgzZFxcdWRjNDcnLFxuICAncG9pbnRfbGVmdCc6J1xcdWQ4M2RcXHVkYzQ4JyxcbiAgJ3BvaW50X3JpZ2h0JzonXFx1ZDgzZFxcdWRjNDknLFxuICAncG9pbnRfdXAnOidcXHUyNjFkXFx1ZmUwZicsXG4gICdwb2ludF91cF8yJzonXFx1ZDgzZFxcdWRjNDYnLFxuICAncG9saWNlX2Nhcic6J1xcdWQ4M2RcXHVkZTkzJyxcbiAgJ3BvbGljZXdvbWFuJzonXFx1ZDgzZFxcdWRjNmUmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3Bvb2RsZSc6J1xcdWQ4M2RcXHVkYzI5JyxcbiAgJ3BvcGNvcm4nOidcXHVkODNjXFx1ZGY3ZicsXG4gICdwb3N0X29mZmljZSc6J1xcdWQ4M2NcXHVkZmUzJyxcbiAgJ3Bvc3RhbF9ob3JuJzonXFx1ZDgzZFxcdWRjZWYnLFxuICAncG9zdGJveCc6J1xcdWQ4M2RcXHVkY2VlJyxcbiAgJ3BvdGFibGVfd2F0ZXInOidcXHVkODNkXFx1ZGViMCcsXG4gICdwb3RhdG8nOidcXHVkODNlXFx1ZGQ1NCcsXG4gICdwb3VjaCc6J1xcdWQ4M2RcXHVkYzVkJyxcbiAgJ3BvdWx0cnlfbGVnJzonXFx1ZDgzY1xcdWRmNTcnLFxuICAncG91bmQnOidcXHVkODNkXFx1ZGNiNycsXG4gICdyYWdlJzonXFx1ZDgzZFxcdWRlMjEnLFxuICAncG91dGluZ19jYXQnOidcXHVkODNkXFx1ZGUzZScsXG4gICdwb3V0aW5nX21hbic6J1xcdWQ4M2RcXHVkZTRlJnp3ajtcXHUyNjQyXFx1ZmUwZicsXG4gICdwcmF5JzonXFx1ZDgzZFxcdWRlNGYnLFxuICAncHJheWVyX2JlYWRzJzonXFx1ZDgzZFxcdWRjZmYnLFxuICAncHJlZ25hbnRfd29tYW4nOidcXHVkODNlXFx1ZGQzMCcsXG4gICdwcmV2aW91c190cmFja19idXR0b24nOidcXHUyM2VlJyxcbiAgJ3ByaW5jZSc6J1xcdWQ4M2VcXHVkZDM0JyxcbiAgJ3ByaW5jZXNzJzonXFx1ZDgzZFxcdWRjNzgnLFxuICAncHJpbnRlcic6J1xcdWQ4M2RcXHVkZGE4JyxcbiAgJ3B1cnBsZV9oZWFydCc6J1xcdWQ4M2RcXHVkYzljJyxcbiAgJ3B1cnNlJzonXFx1ZDgzZFxcdWRjNWInLFxuICAncHVzaHBpbic6J1xcdWQ4M2RcXHVkY2NjJyxcbiAgJ3B1dF9saXR0ZXJfaW5faXRzX3BsYWNlJzonXFx1ZDgzZFxcdWRlYWUnLFxuICAncXVlc3Rpb24nOidcXHUyNzUzJyxcbiAgJ3JhYmJpdCc6J1xcdWQ4M2RcXHVkYzMwJyxcbiAgJ3JhYmJpdDInOidcXHVkODNkXFx1ZGMwNycsXG4gICdyYWNlaG9yc2UnOidcXHVkODNkXFx1ZGMwZScsXG4gICdyYWNpbmdfY2FyJzonXFx1ZDgzY1xcdWRmY2UnLFxuICAncmFkaW8nOidcXHVkODNkXFx1ZGNmYicsXG4gICdyYWRpb19idXR0b24nOidcXHVkODNkXFx1ZGQxOCcsXG4gICdyYWRpb2FjdGl2ZSc6J1xcdTI2MjJcXHVmZTBmJyxcbiAgJ3JhaWx3YXlfY2FyJzonXFx1ZDgzZFxcdWRlODMnLFxuICAncmFpbHdheV90cmFjayc6J1xcdWQ4M2RcXHVkZWU0JyxcbiAgJ3JhaW5ib3cnOidcXHVkODNjXFx1ZGYwOCcsXG4gICdyYWluYm93X2ZsYWcnOidcXHVkODNjXFx1ZGZmM1xcdWZlMGYmendqO1xcdWQ4M2NcXHVkZjA4JyxcbiAgJ3JhaXNlZF9iYWNrX29mX2hhbmQnOidcXHVkODNlXFx1ZGQxYScsXG4gICdyYWlzZWRfaGFuZF93aXRoX2ZpbmdlcnNfc3BsYXllZCc6J1xcdWQ4M2RcXHVkZDkwJyxcbiAgJ3JhaXNlZF9oYW5kcyc6J1xcdWQ4M2RcXHVkZTRjJyxcbiAgJ3JhaXNpbmdfaGFuZF93b21hbic6J1xcdWQ4M2RcXHVkZTRiJyxcbiAgJ3JhaXNpbmdfaGFuZF9tYW4nOidcXHVkODNkXFx1ZGU0YiZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAncmFtJzonXFx1ZDgzZFxcdWRjMGYnLFxuICAncmFtZW4nOidcXHVkODNjXFx1ZGY1YycsXG4gICdyYXQnOidcXHVkODNkXFx1ZGMwMCcsXG4gICdyZWNvcmRfYnV0dG9uJzonXFx1MjNmYScsXG4gICdyZWN5Y2xlJzonXFx1MjY3YlxcdWZlMGYnLFxuICAncmVkX2NpcmNsZSc6J1xcdWQ4M2RcXHVkZDM0JyxcbiAgJ3JlZ2lzdGVyZWQnOidcXHUwMGFlXFx1ZmUwZicsXG4gICdyZWxheGVkJzonXFx1MjYzYVxcdWZlMGYnLFxuICAncmVsaWV2ZWQnOidcXHVkODNkXFx1ZGUwYycsXG4gICdyZW1pbmRlcl9yaWJib24nOidcXHVkODNjXFx1ZGY5NycsXG4gICdyZXBlYXQnOidcXHVkODNkXFx1ZGQwMScsXG4gICdyZXBlYXRfb25lJzonXFx1ZDgzZFxcdWRkMDInLFxuICAncmVzY3VlX3dvcmtlcl9oZWxtZXQnOidcXHUyNmQxJyxcbiAgJ3Jlc3Ryb29tJzonXFx1ZDgzZFxcdWRlYmInLFxuICAncmV2b2x2aW5nX2hlYXJ0cyc6J1xcdWQ4M2RcXHVkYzllJyxcbiAgJ3Jld2luZCc6J1xcdTIzZWEnLFxuICAncmhpbm9jZXJvcyc6J1xcdWQ4M2VcXHVkZDhmJyxcbiAgJ3JpYmJvbic6J1xcdWQ4M2NcXHVkZjgwJyxcbiAgJ3JpY2UnOidcXHVkODNjXFx1ZGY1YScsXG4gICdyaWNlX2JhbGwnOidcXHVkODNjXFx1ZGY1OScsXG4gICdyaWNlX2NyYWNrZXInOidcXHVkODNjXFx1ZGY1OCcsXG4gICdyaWNlX3NjZW5lJzonXFx1ZDgzY1xcdWRmOTEnLFxuICAncmlnaHRfYW5nZXJfYnViYmxlJzonXFx1ZDgzZFxcdWRkZWYnLFxuICAncmluZyc6J1xcdWQ4M2RcXHVkYzhkJyxcbiAgJ3JvYm90JzonXFx1ZDgzZVxcdWRkMTYnLFxuICAncm9ja2V0JzonXFx1ZDgzZFxcdWRlODAnLFxuICAncm9mbCc6J1xcdWQ4M2VcXHVkZDIzJyxcbiAgJ3JvbGxfZXllcyc6J1xcdWQ4M2RcXHVkZTQ0JyxcbiAgJ3JvbGxlcl9jb2FzdGVyJzonXFx1ZDgzY1xcdWRmYTInLFxuICAncm9vc3Rlcic6J1xcdWQ4M2RcXHVkYzEzJyxcbiAgJ3Jvc2UnOidcXHVkODNjXFx1ZGYzOScsXG4gICdyb3NldHRlJzonXFx1ZDgzY1xcdWRmZjUnLFxuICAncm90YXRpbmdfbGlnaHQnOidcXHVkODNkXFx1ZGVhOCcsXG4gICdyb3VuZF9wdXNocGluJzonXFx1ZDgzZFxcdWRjY2QnLFxuICAncm93aW5nX21hbic6J1xcdWQ4M2RcXHVkZWEzJyxcbiAgJ3Jvd2luZ193b21hbic6J1xcdWQ4M2RcXHVkZWEzJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdydWdieV9mb290YmFsbCc6J1xcdWQ4M2NcXHVkZmM5JyxcbiAgJ3J1bm5pbmdfbWFuJzonXFx1ZDgzY1xcdWRmYzMnLFxuICAncnVubmluZ19zaGlydF93aXRoX3Nhc2gnOidcXHVkODNjXFx1ZGZiZCcsXG4gICdydW5uaW5nX3dvbWFuJzonXFx1ZDgzY1xcdWRmYzMmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3NhJzonXFx1ZDgzY1xcdWRlMDJcXHVmZTBmJyxcbiAgJ3NhZ2l0dGFyaXVzJzonXFx1MjY1MFxcdWZlMGYnLFxuICAnc2FrZSc6J1xcdWQ4M2NcXHVkZjc2JyxcbiAgJ3NhbmRhbCc6J1xcdWQ4M2RcXHVkYzYxJyxcbiAgJ3NhbnRhJzonXFx1ZDgzY1xcdWRmODUnLFxuICAnc2F0ZWxsaXRlJzonXFx1ZDgzZFxcdWRjZTEnLFxuICAnc2F4b3Bob25lJzonXFx1ZDgzY1xcdWRmYjcnLFxuICAnc2Nob29sJzonXFx1ZDgzY1xcdWRmZWInLFxuICAnc2Nob29sX3NhdGNoZWwnOidcXHVkODNjXFx1ZGY5MicsXG4gICdzY2lzc29ycyc6J1xcdTI3MDJcXHVmZTBmJyxcbiAgJ3Njb3JwaW9uJzonXFx1ZDgzZVxcdWRkODInLFxuICAnc2NvcnBpdXMnOidcXHUyNjRmXFx1ZmUwZicsXG4gICdzY3JlYW0nOidcXHVkODNkXFx1ZGUzMScsXG4gICdzY3JlYW1fY2F0JzonXFx1ZDgzZFxcdWRlNDAnLFxuICAnc2Nyb2xsJzonXFx1ZDgzZFxcdWRjZGMnLFxuICAnc2VhdCc6J1xcdWQ4M2RcXHVkY2JhJyxcbiAgJ3NlY3JldCc6J1xcdTMyOTlcXHVmZTBmJyxcbiAgJ3NlZV9ub19ldmlsJzonXFx1ZDgzZFxcdWRlNDgnLFxuICAnc2VlZGxpbmcnOidcXHVkODNjXFx1ZGYzMScsXG4gICdzZWxmaWUnOidcXHVkODNlXFx1ZGQzMycsXG4gICdzaGFsbG93X3Bhbl9vZl9mb29kJzonXFx1ZDgzZVxcdWRkNTgnLFxuICAnc2hhbXJvY2snOidcXHUyNjE4XFx1ZmUwZicsXG4gICdzaGFyayc6J1xcdWQ4M2VcXHVkZDg4JyxcbiAgJ3NoYXZlZF9pY2UnOidcXHVkODNjXFx1ZGY2NycsXG4gICdzaGVlcCc6J1xcdWQ4M2RcXHVkYzExJyxcbiAgJ3NoZWxsJzonXFx1ZDgzZFxcdWRjMWEnLFxuICAnc2hpZWxkJzonXFx1ZDgzZFxcdWRlZTEnLFxuICAnc2hpbnRvX3NocmluZSc6J1xcdTI2ZTknLFxuICAnc2hpcCc6J1xcdWQ4M2RcXHVkZWEyJyxcbiAgJ3NoaXJ0JzonXFx1ZDgzZFxcdWRjNTUnLFxuICAnc2hvcHBpbmcnOidcXHVkODNkXFx1ZGVjZCcsXG4gICdzaG9wcGluZ19jYXJ0JzonXFx1ZDgzZFxcdWRlZDInLFxuICAnc2hvd2VyJzonXFx1ZDgzZFxcdWRlYmYnLFxuICAnc2hyaW1wJzonXFx1ZDgzZVxcdWRkOTAnLFxuICAnc2lnbmFsX3N0cmVuZ3RoJzonXFx1ZDgzZFxcdWRjZjYnLFxuICAnc2l4X3BvaW50ZWRfc3Rhcic6J1xcdWQ4M2RcXHVkZDJmJyxcbiAgJ3NraSc6J1xcdWQ4M2NcXHVkZmJmJyxcbiAgJ3NraWVyJzonXFx1MjZmNycsXG4gICdza3VsbCc6J1xcdWQ4M2RcXHVkYzgwJyxcbiAgJ3NrdWxsX2FuZF9jcm9zc2JvbmVzJzonXFx1MjYyMFxcdWZlMGYnLFxuICAnc2xlZXBpbmcnOidcXHVkODNkXFx1ZGUzNCcsXG4gICdzbGVlcGluZ19iZWQnOidcXHVkODNkXFx1ZGVjYycsXG4gICdzbGVlcHknOidcXHVkODNkXFx1ZGUyYScsXG4gICdzbGlnaHRseV9mcm93bmluZ19mYWNlJzonXFx1ZDgzZFxcdWRlNDEnLFxuICAnc2xpZ2h0bHlfc21pbGluZ19mYWNlJzonXFx1ZDgzZFxcdWRlNDInLFxuICAnc2xvdF9tYWNoaW5lJzonXFx1ZDgzY1xcdWRmYjAnLFxuICAnc21hbGxfYWlycGxhbmUnOidcXHVkODNkXFx1ZGVlOScsXG4gICdzbWFsbF9ibHVlX2RpYW1vbmQnOidcXHVkODNkXFx1ZGQzOScsXG4gICdzbWFsbF9vcmFuZ2VfZGlhbW9uZCc6J1xcdWQ4M2RcXHVkZDM4JyxcbiAgJ3NtYWxsX3JlZF90cmlhbmdsZSc6J1xcdWQ4M2RcXHVkZDNhJyxcbiAgJ3NtYWxsX3JlZF90cmlhbmdsZV9kb3duJzonXFx1ZDgzZFxcdWRkM2InLFxuICAnc21pbGUnOidcXHVkODNkXFx1ZGUwNCcsXG4gICdzbWlsZV9jYXQnOidcXHVkODNkXFx1ZGUzOCcsXG4gICdzbWlsZXknOidcXHVkODNkXFx1ZGUwMycsXG4gICdzbWlsZXlfY2F0JzonXFx1ZDgzZFxcdWRlM2EnLFxuICAnc21pbGluZ19pbXAnOidcXHVkODNkXFx1ZGUwOCcsXG4gICdzbWlyayc6J1xcdWQ4M2RcXHVkZTBmJyxcbiAgJ3NtaXJrX2NhdCc6J1xcdWQ4M2RcXHVkZTNjJyxcbiAgJ3Ntb2tpbmcnOidcXHVkODNkXFx1ZGVhYycsXG4gICdzbmFpbCc6J1xcdWQ4M2RcXHVkYzBjJyxcbiAgJ3NuYWtlJzonXFx1ZDgzZFxcdWRjMGQnLFxuICAnc25lZXppbmdfZmFjZSc6J1xcdWQ4M2VcXHVkZDI3JyxcbiAgJ3Nub3dib2FyZGVyJzonXFx1ZDgzY1xcdWRmYzInLFxuICAnc25vd2ZsYWtlJzonXFx1Mjc0NFxcdWZlMGYnLFxuICAnc25vd21hbic6J1xcdTI2YzRcXHVmZTBmJyxcbiAgJ3Nub3dtYW5fd2l0aF9zbm93JzonXFx1MjYwM1xcdWZlMGYnLFxuICAnc29iJzonXFx1ZDgzZFxcdWRlMmQnLFxuICAnc29jY2VyJzonXFx1MjZiZFxcdWZlMGYnLFxuICAnc29vbic6J1xcdWQ4M2RcXHVkZDFjJyxcbiAgJ3Nvcyc6J1xcdWQ4M2NcXHVkZDk4JyxcbiAgJ3NvdW5kJzonXFx1ZDgzZFxcdWRkMDknLFxuICAnc3BhY2VfaW52YWRlcic6J1xcdWQ4M2RcXHVkYzdlJyxcbiAgJ3NwYWRlcyc6J1xcdTI2NjBcXHVmZTBmJyxcbiAgJ3NwYWdoZXR0aSc6J1xcdWQ4M2NcXHVkZjVkJyxcbiAgJ3NwYXJrbGUnOidcXHUyNzQ3XFx1ZmUwZicsXG4gICdzcGFya2xlcic6J1xcdWQ4M2NcXHVkZjg3JyxcbiAgJ3NwYXJrbGVzJzonXFx1MjcyOCcsXG4gICdzcGFya2xpbmdfaGVhcnQnOidcXHVkODNkXFx1ZGM5NicsXG4gICdzcGVha19ub19ldmlsJzonXFx1ZDgzZFxcdWRlNGEnLFxuICAnc3BlYWtlcic6J1xcdWQ4M2RcXHVkZDA4JyxcbiAgJ3NwZWFraW5nX2hlYWQnOidcXHVkODNkXFx1ZGRlMycsXG4gICdzcGVlY2hfYmFsbG9vbic6J1xcdWQ4M2RcXHVkY2FjJyxcbiAgJ3NwZWVkYm9hdCc6J1xcdWQ4M2RcXHVkZWE0JyxcbiAgJ3NwaWRlcic6J1xcdWQ4M2RcXHVkZDc3JyxcbiAgJ3NwaWRlcl93ZWInOidcXHVkODNkXFx1ZGQ3OCcsXG4gICdzcGlyYWxfY2FsZW5kYXInOidcXHVkODNkXFx1ZGRkMycsXG4gICdzcGlyYWxfbm90ZXBhZCc6J1xcdWQ4M2RcXHVkZGQyJyxcbiAgJ3Nwb29uJzonXFx1ZDgzZVxcdWRkNDQnLFxuICAnc3F1aWQnOidcXHVkODNlXFx1ZGQ5MScsXG4gICdzdGFkaXVtJzonXFx1ZDgzY1xcdWRmZGYnLFxuICAnc3Rhcic6J1xcdTJiNTBcXHVmZTBmJyxcbiAgJ3N0YXIyJzonXFx1ZDgzY1xcdWRmMWYnLFxuICAnc3Rhcl9hbmRfY3Jlc2NlbnQnOidcXHUyNjJhXFx1ZmUwZicsXG4gICdzdGFyX29mX2RhdmlkJzonXFx1MjcyMVxcdWZlMGYnLFxuICAnc3RhcnMnOidcXHVkODNjXFx1ZGYyMCcsXG4gICdzdGF0aW9uJzonXFx1ZDgzZFxcdWRlODknLFxuICAnc3RhdHVlX29mX2xpYmVydHknOidcXHVkODNkXFx1ZGRmZCcsXG4gICdzdGVhbV9sb2NvbW90aXZlJzonXFx1ZDgzZFxcdWRlODInLFxuICAnc3Rldyc6J1xcdWQ4M2NcXHVkZjcyJyxcbiAgJ3N0b3BfYnV0dG9uJzonXFx1MjNmOScsXG4gICdzdG9wX3NpZ24nOidcXHVkODNkXFx1ZGVkMScsXG4gICdzdG9wd2F0Y2gnOidcXHUyM2YxJyxcbiAgJ3N0cmFpZ2h0X3J1bGVyJzonXFx1ZDgzZFxcdWRjY2YnLFxuICAnc3RyYXdiZXJyeSc6J1xcdWQ4M2NcXHVkZjUzJyxcbiAgJ3N0dWNrX291dF90b25ndWUnOidcXHVkODNkXFx1ZGUxYicsXG4gICdzdHVja19vdXRfdG9uZ3VlX2Nsb3NlZF9leWVzJzonXFx1ZDgzZFxcdWRlMWQnLFxuICAnc3R1Y2tfb3V0X3Rvbmd1ZV93aW5raW5nX2V5ZSc6J1xcdWQ4M2RcXHVkZTFjJyxcbiAgJ3N0dWRpb19taWNyb3Bob25lJzonXFx1ZDgzY1xcdWRmOTknLFxuICAnc3R1ZmZlZF9mbGF0YnJlYWQnOidcXHVkODNlXFx1ZGQ1OScsXG4gICdzdW5fYmVoaW5kX2xhcmdlX2Nsb3VkJzonXFx1ZDgzY1xcdWRmMjUnLFxuICAnc3VuX2JlaGluZF9yYWluX2Nsb3VkJzonXFx1ZDgzY1xcdWRmMjYnLFxuICAnc3VuX2JlaGluZF9zbWFsbF9jbG91ZCc6J1xcdWQ4M2NcXHVkZjI0JyxcbiAgJ3N1bl93aXRoX2ZhY2UnOidcXHVkODNjXFx1ZGYxZScsXG4gICdzdW5mbG93ZXInOidcXHVkODNjXFx1ZGYzYicsXG4gICdzdW5nbGFzc2VzJzonXFx1ZDgzZFxcdWRlMGUnLFxuICAnc3VubnknOidcXHUyNjAwXFx1ZmUwZicsXG4gICdzdW5yaXNlJzonXFx1ZDgzY1xcdWRmMDUnLFxuICAnc3VucmlzZV9vdmVyX21vdW50YWlucyc6J1xcdWQ4M2NcXHVkZjA0JyxcbiAgJ3N1cmZpbmdfbWFuJzonXFx1ZDgzY1xcdWRmYzQnLFxuICAnc3VyZmluZ193b21hbic6J1xcdWQ4M2NcXHVkZmM0Jnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICdzdXNoaSc6J1xcdWQ4M2NcXHVkZjYzJyxcbiAgJ3N1c3BlbnNpb25fcmFpbHdheSc6J1xcdWQ4M2RcXHVkZTlmJyxcbiAgJ3N3ZWF0JzonXFx1ZDgzZFxcdWRlMTMnLFxuICAnc3dlYXRfZHJvcHMnOidcXHVkODNkXFx1ZGNhNicsXG4gICdzd2VhdF9zbWlsZSc6J1xcdWQ4M2RcXHVkZTA1JyxcbiAgJ3N3ZWV0X3BvdGF0byc6J1xcdWQ4M2NcXHVkZjYwJyxcbiAgJ3N3aW1taW5nX21hbic6J1xcdWQ4M2NcXHVkZmNhJyxcbiAgJ3N3aW1taW5nX3dvbWFuJzonXFx1ZDgzY1xcdWRmY2EmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3N5bWJvbHMnOidcXHVkODNkXFx1ZGQyMycsXG4gICdzeW5hZ29ndWUnOidcXHVkODNkXFx1ZGQ0ZCcsXG4gICdzeXJpbmdlJzonXFx1ZDgzZFxcdWRjODknLFxuICAndGFjbyc6J1xcdWQ4M2NcXHVkZjJlJyxcbiAgJ3RhZGEnOidcXHVkODNjXFx1ZGY4OScsXG4gICd0YW5hYmF0YV90cmVlJzonXFx1ZDgzY1xcdWRmOGInLFxuICAndGF1cnVzJzonXFx1MjY0OVxcdWZlMGYnLFxuICAndGF4aSc6J1xcdWQ4M2RcXHVkZTk1JyxcbiAgJ3RlYSc6J1xcdWQ4M2NcXHVkZjc1JyxcbiAgJ3RlbGVwaG9uZV9yZWNlaXZlcic6J1xcdWQ4M2RcXHVkY2RlJyxcbiAgJ3RlbGVzY29wZSc6J1xcdWQ4M2RcXHVkZDJkJyxcbiAgJ3Rlbm5pcyc6J1xcdWQ4M2NcXHVkZmJlJyxcbiAgJ3RlbnQnOidcXHUyNmZhXFx1ZmUwZicsXG4gICd0aGVybW9tZXRlcic6J1xcdWQ4M2NcXHVkZjIxJyxcbiAgJ3RoaW5raW5nJzonXFx1ZDgzZVxcdWRkMTQnLFxuICAndGhvdWdodF9iYWxsb29uJzonXFx1ZDgzZFxcdWRjYWQnLFxuICAndGlja2V0JzonXFx1ZDgzY1xcdWRmYWInLFxuICAndGlja2V0cyc6J1xcdWQ4M2NcXHVkZjlmJyxcbiAgJ3RpZ2VyJzonXFx1ZDgzZFxcdWRjMmYnLFxuICAndGlnZXIyJzonXFx1ZDgzZFxcdWRjMDUnLFxuICAndGltZXJfY2xvY2snOidcXHUyM2YyJyxcbiAgJ3RpcHBpbmdfaGFuZF9tYW4nOidcXHVkODNkXFx1ZGM4MSZ6d2o7XFx1MjY0MlxcdWZlMGYnLFxuICAndGlyZWRfZmFjZSc6J1xcdWQ4M2RcXHVkZTJiJyxcbiAgJ3RtJzonXFx1MjEyMlxcdWZlMGYnLFxuICAndG9pbGV0JzonXFx1ZDgzZFxcdWRlYmQnLFxuICAndG9reW9fdG93ZXInOidcXHVkODNkXFx1ZGRmYycsXG4gICd0b21hdG8nOidcXHVkODNjXFx1ZGY0NScsXG4gICd0b25ndWUnOidcXHVkODNkXFx1ZGM0NScsXG4gICd0b3AnOidcXHVkODNkXFx1ZGQxZCcsXG4gICd0b3BoYXQnOidcXHVkODNjXFx1ZGZhOScsXG4gICd0b3JuYWRvJzonXFx1ZDgzY1xcdWRmMmEnLFxuICAndHJhY2tiYWxsJzonXFx1ZDgzZFxcdWRkYjInLFxuICAndHJhY3Rvcic6J1xcdWQ4M2RcXHVkZTljJyxcbiAgJ3RyYWZmaWNfbGlnaHQnOidcXHVkODNkXFx1ZGVhNScsXG4gICd0cmFpbic6J1xcdWQ4M2RcXHVkZThiJyxcbiAgJ3RyYWluMic6J1xcdWQ4M2RcXHVkZTg2JyxcbiAgJ3RyYW0nOidcXHVkODNkXFx1ZGU4YScsXG4gICd0cmlhbmd1bGFyX2ZsYWdfb25fcG9zdCc6J1xcdWQ4M2RcXHVkZWE5JyxcbiAgJ3RyaWFuZ3VsYXJfcnVsZXInOidcXHVkODNkXFx1ZGNkMCcsXG4gICd0cmlkZW50JzonXFx1ZDgzZFxcdWRkMzEnLFxuICAndHJpdW1waCc6J1xcdWQ4M2RcXHVkZTI0JyxcbiAgJ3Ryb2xsZXlidXMnOidcXHVkODNkXFx1ZGU4ZScsXG4gICd0cm9waHknOidcXHVkODNjXFx1ZGZjNicsXG4gICd0cm9waWNhbF9kcmluayc6J1xcdWQ4M2NcXHVkZjc5JyxcbiAgJ3Ryb3BpY2FsX2Zpc2gnOidcXHVkODNkXFx1ZGMyMCcsXG4gICd0cnVjayc6J1xcdWQ4M2RcXHVkZTlhJyxcbiAgJ3RydW1wZXQnOidcXHVkODNjXFx1ZGZiYScsXG4gICd0dWxpcCc6J1xcdWQ4M2NcXHVkZjM3JyxcbiAgJ3R1bWJsZXJfZ2xhc3MnOidcXHVkODNlXFx1ZGQ0MycsXG4gICd0dXJrZXknOidcXHVkODNlXFx1ZGQ4MycsXG4gICd0dXJ0bGUnOidcXHVkODNkXFx1ZGMyMicsXG4gICd0dic6J1xcdWQ4M2RcXHVkY2ZhJyxcbiAgJ3R3aXN0ZWRfcmlnaHR3YXJkc19hcnJvd3MnOidcXHVkODNkXFx1ZGQwMCcsXG4gICd0d29faGVhcnRzJzonXFx1ZDgzZFxcdWRjOTUnLFxuICAndHdvX21lbl9ob2xkaW5nX2hhbmRzJzonXFx1ZDgzZFxcdWRjNmMnLFxuICAndHdvX3dvbWVuX2hvbGRpbmdfaGFuZHMnOidcXHVkODNkXFx1ZGM2ZCcsXG4gICd1NTI3Mic6J1xcdWQ4M2NcXHVkZTM5JyxcbiAgJ3U1NDA4JzonXFx1ZDgzY1xcdWRlMzQnLFxuICAndTU1YjYnOidcXHVkODNjXFx1ZGUzYScsXG4gICd1NjMwNyc6J1xcdWQ4M2NcXHVkZTJmXFx1ZmUwZicsXG4gICd1NjcwOCc6J1xcdWQ4M2NcXHVkZTM3XFx1ZmUwZicsXG4gICd1NjcwOSc6J1xcdWQ4M2NcXHVkZTM2JyxcbiAgJ3U2ZTgwJzonXFx1ZDgzY1xcdWRlMzUnLFxuICAndTcxMjEnOidcXHVkODNjXFx1ZGUxYVxcdWZlMGYnLFxuICAndTc1MzMnOidcXHVkODNjXFx1ZGUzOCcsXG4gICd1Nzk4MSc6J1xcdWQ4M2NcXHVkZTMyJyxcbiAgJ3U3YTdhJzonXFx1ZDgzY1xcdWRlMzMnLFxuICAndW1icmVsbGEnOidcXHUyNjE0XFx1ZmUwZicsXG4gICd1bmFtdXNlZCc6J1xcdWQ4M2RcXHVkZTEyJyxcbiAgJ3VuZGVyYWdlJzonXFx1ZDgzZFxcdWRkMWUnLFxuICAndW5pY29ybic6J1xcdWQ4M2VcXHVkZDg0JyxcbiAgJ3VubG9jayc6J1xcdWQ4M2RcXHVkZDEzJyxcbiAgJ3VwJzonXFx1ZDgzY1xcdWRkOTknLFxuICAndXBzaWRlX2Rvd25fZmFjZSc6J1xcdWQ4M2RcXHVkZTQzJyxcbiAgJ3YnOidcXHUyNzBjXFx1ZmUwZicsXG4gICd2ZXJ0aWNhbF90cmFmZmljX2xpZ2h0JzonXFx1ZDgzZFxcdWRlYTYnLFxuICAndmhzJzonXFx1ZDgzZFxcdWRjZmMnLFxuICAndmlicmF0aW9uX21vZGUnOidcXHVkODNkXFx1ZGNmMycsXG4gICd2aWRlb19jYW1lcmEnOidcXHVkODNkXFx1ZGNmOScsXG4gICd2aWRlb19nYW1lJzonXFx1ZDgzY1xcdWRmYWUnLFxuICAndmlvbGluJzonXFx1ZDgzY1xcdWRmYmInLFxuICAndmlyZ28nOidcXHUyNjRkXFx1ZmUwZicsXG4gICd2b2xjYW5vJzonXFx1ZDgzY1xcdWRmMGInLFxuICAndm9sbGV5YmFsbCc6J1xcdWQ4M2NcXHVkZmQwJyxcbiAgJ3ZzJzonXFx1ZDgzY1xcdWRkOWEnLFxuICAndnVsY2FuX3NhbHV0ZSc6J1xcdWQ4M2RcXHVkZDk2JyxcbiAgJ3dhbGtpbmdfbWFuJzonXFx1ZDgzZFxcdWRlYjYnLFxuICAnd2Fsa2luZ193b21hbic6J1xcdWQ4M2RcXHVkZWI2Jnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICd3YW5pbmdfY3Jlc2NlbnRfbW9vbic6J1xcdWQ4M2NcXHVkZjE4JyxcbiAgJ3dhbmluZ19naWJib3VzX21vb24nOidcXHVkODNjXFx1ZGYxNicsXG4gICd3YXJuaW5nJzonXFx1MjZhMFxcdWZlMGYnLFxuICAnd2FzdGViYXNrZXQnOidcXHVkODNkXFx1ZGRkMScsXG4gICd3YXRjaCc6J1xcdTIzMWFcXHVmZTBmJyxcbiAgJ3dhdGVyX2J1ZmZhbG8nOidcXHVkODNkXFx1ZGMwMycsXG4gICd3YXRlcm1lbG9uJzonXFx1ZDgzY1xcdWRmNDknLFxuICAnd2F2ZSc6J1xcdWQ4M2RcXHVkYzRiJyxcbiAgJ3dhdnlfZGFzaCc6J1xcdTMwMzBcXHVmZTBmJyxcbiAgJ3dheGluZ19jcmVzY2VudF9tb29uJzonXFx1ZDgzY1xcdWRmMTInLFxuICAnd2MnOidcXHVkODNkXFx1ZGViZScsXG4gICd3ZWFyeSc6J1xcdWQ4M2RcXHVkZTI5JyxcbiAgJ3dlZGRpbmcnOidcXHVkODNkXFx1ZGM5MicsXG4gICd3ZWlnaHRfbGlmdGluZ19tYW4nOidcXHVkODNjXFx1ZGZjYlxcdWZlMGYnLFxuICAnd2VpZ2h0X2xpZnRpbmdfd29tYW4nOidcXHVkODNjXFx1ZGZjYlxcdWZlMGYmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3doYWxlJzonXFx1ZDgzZFxcdWRjMzMnLFxuICAnd2hhbGUyJzonXFx1ZDgzZFxcdWRjMGInLFxuICAnd2hlZWxfb2ZfZGhhcm1hJzonXFx1MjYzOFxcdWZlMGYnLFxuICAnd2hlZWxjaGFpcic6J1xcdTI2N2ZcXHVmZTBmJyxcbiAgJ3doaXRlX2NoZWNrX21hcmsnOidcXHUyNzA1JyxcbiAgJ3doaXRlX2NpcmNsZSc6J1xcdTI2YWFcXHVmZTBmJyxcbiAgJ3doaXRlX2ZsYWcnOidcXHVkODNjXFx1ZGZmM1xcdWZlMGYnLFxuICAnd2hpdGVfZmxvd2VyJzonXFx1ZDgzZFxcdWRjYWUnLFxuICAnd2hpdGVfbGFyZ2Vfc3F1YXJlJzonXFx1MmIxY1xcdWZlMGYnLFxuICAnd2hpdGVfbWVkaXVtX3NtYWxsX3NxdWFyZSc6J1xcdTI1ZmRcXHVmZTBmJyxcbiAgJ3doaXRlX21lZGl1bV9zcXVhcmUnOidcXHUyNWZiXFx1ZmUwZicsXG4gICd3aGl0ZV9zbWFsbF9zcXVhcmUnOidcXHUyNWFiXFx1ZmUwZicsXG4gICd3aGl0ZV9zcXVhcmVfYnV0dG9uJzonXFx1ZDgzZFxcdWRkMzMnLFxuICAnd2lsdGVkX2Zsb3dlcic6J1xcdWQ4M2VcXHVkZDQwJyxcbiAgJ3dpbmRfY2hpbWUnOidcXHVkODNjXFx1ZGY5MCcsXG4gICd3aW5kX2ZhY2UnOidcXHVkODNjXFx1ZGYyYycsXG4gICd3aW5lX2dsYXNzJzonXFx1ZDgzY1xcdWRmNzcnLFxuICAnd2luayc6J1xcdWQ4M2RcXHVkZTA5JyxcbiAgJ3dvbGYnOidcXHVkODNkXFx1ZGMzYScsXG4gICd3b21hbic6J1xcdWQ4M2RcXHVkYzY5JyxcbiAgJ3dvbWFuX2FydGlzdCc6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNjXFx1ZGZhOCcsXG4gICd3b21hbl9hc3Ryb25hdXQnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRlODAnLFxuICAnd29tYW5fY2FydHdoZWVsaW5nJzonXFx1ZDgzZVxcdWRkMzgmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3dvbWFuX2Nvb2snOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzY1xcdWRmNzMnLFxuICAnd29tYW5fZmFjZXBhbG1pbmcnOidcXHVkODNlXFx1ZGQyNiZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnd29tYW5fZmFjdG9yeV93b3JrZXInOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzY1xcdWRmZWQnLFxuICAnd29tYW5fZmFybWVyJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2NcXHVkZjNlJyxcbiAgJ3dvbWFuX2ZpcmVmaWdodGVyJzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkZTkyJyxcbiAgJ3dvbWFuX2hlYWx0aF93b3JrZXInOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1MjY5NVxcdWZlMGYnLFxuICAnd29tYW5fanVkZ2UnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1MjY5NlxcdWZlMGYnLFxuICAnd29tYW5fanVnZ2xpbmcnOidcXHVkODNlXFx1ZGQzOSZ6d2o7XFx1MjY0MFxcdWZlMGYnLFxuICAnd29tYW5fbWVjaGFuaWMnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRkMjcnLFxuICAnd29tYW5fb2ZmaWNlX3dvcmtlcic6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNkXFx1ZGNiYycsXG4gICd3b21hbl9waWxvdCc6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHUyNzA4XFx1ZmUwZicsXG4gICd3b21hbl9wbGF5aW5nX2hhbmRiYWxsJzonXFx1ZDgzZVxcdWRkM2UmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3dvbWFuX3BsYXlpbmdfd2F0ZXJfcG9sbyc6J1xcdWQ4M2VcXHVkZDNkJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICd3b21hbl9zY2llbnRpc3QnOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzZFxcdWRkMmMnLFxuICAnd29tYW5fc2hydWdnaW5nJzonXFx1ZDgzZVxcdWRkMzcmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3dvbWFuX3Npbmdlcic6J1xcdWQ4M2RcXHVkYzY5Jnp3ajtcXHVkODNjXFx1ZGZhNCcsXG4gICd3b21hbl9zdHVkZW50JzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2NcXHVkZjkzJyxcbiAgJ3dvbWFuX3RlYWNoZXInOidcXHVkODNkXFx1ZGM2OSZ6d2o7XFx1ZDgzY1xcdWRmZWInLFxuICAnd29tYW5fdGVjaG5vbG9naXN0JzonXFx1ZDgzZFxcdWRjNjkmendqO1xcdWQ4M2RcXHVkY2JiJyxcbiAgJ3dvbWFuX3dpdGhfdHVyYmFuJzonXFx1ZDgzZFxcdWRjNzMmendqO1xcdTI2NDBcXHVmZTBmJyxcbiAgJ3dvbWFuc19jbG90aGVzJzonXFx1ZDgzZFxcdWRjNWEnLFxuICAnd29tYW5zX2hhdCc6J1xcdWQ4M2RcXHVkYzUyJyxcbiAgJ3dvbWVuX3dyZXN0bGluZyc6J1xcdWQ4M2VcXHVkZDNjJnp3ajtcXHUyNjQwXFx1ZmUwZicsXG4gICd3b21lbnMnOidcXHVkODNkXFx1ZGViYScsXG4gICd3b3JsZF9tYXAnOidcXHVkODNkXFx1ZGRmYScsXG4gICd3b3JyaWVkJzonXFx1ZDgzZFxcdWRlMWYnLFxuICAnd3JlbmNoJzonXFx1ZDgzZFxcdWRkMjcnLFxuICAnd3JpdGluZ19oYW5kJzonXFx1MjcwZFxcdWZlMGYnLFxuICAneCc6J1xcdTI3NGMnLFxuICAneWVsbG93X2hlYXJ0JzonXFx1ZDgzZFxcdWRjOWInLFxuICAneWVuJzonXFx1ZDgzZFxcdWRjYjQnLFxuICAneWluX3lhbmcnOidcXHUyNjJmXFx1ZmUwZicsXG4gICd5dW0nOidcXHVkODNkXFx1ZGUwYicsXG4gICd6YXAnOidcXHUyNmExXFx1ZmUwZicsXG4gICd6aXBwZXJfbW91dGhfZmFjZSc6J1xcdWQ4M2VcXHVkZDEwJyxcbiAgJ3p6eic6J1xcdWQ4M2RcXHVkY2E0JyxcblxuICAvKiBzcGVjaWFsIGVtb2ppcyA6UCAqL1xuICAnb2N0b2NhdCc6ICAnPGltZyBhbHQ9XCI6b2N0b2NhdDpcIiBoZWlnaHQ9XCIyMFwiIHdpZHRoPVwiMjBcIiBhbGlnbj1cImFic21pZGRsZVwiIHNyYz1cImh0dHBzOi8vYXNzZXRzLWNkbi5naXRodWIuY29tL2ltYWdlcy9pY29ucy9lbW9qaS9vY3RvY2F0LnBuZ1wiPicsXG4gICdzaG93ZG93bic6ICc8c3BhbiBzdHlsZT1cImZvbnQtZmFtaWx5OiBcXCdBbm9ueW1vdXMgUHJvXFwnLCBtb25vc3BhY2U7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRhc2hlZDsgdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiAjM2U4YjhhO3RleHQtdW5kZXJsaW5lLXBvc2l0aW9uOiB1bmRlcjtcIj5TPC9zcGFuPidcbn07XG5cclxuLyoqXG4gKiBDcmVhdGVkIGJ5IEVzdGV2YW8gb24gMzEtMDUtMjAxNS5cbiAqL1xuXG4vKipcbiAqIFNob3dkb3duIENvbnZlcnRlciBjbGFzc1xuICogQGNsYXNzXG4gKiBAcGFyYW0ge29iamVjdH0gW2NvbnZlcnRlck9wdGlvbnNdXG4gKiBAcmV0dXJucyB7Q29udmVydGVyfVxuICovXG5zaG93ZG93bi5Db252ZXJ0ZXIgPSBmdW5jdGlvbiAoY29udmVydGVyT3B0aW9ucykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyXG4gICAgICAvKipcbiAgICAgICAqIE9wdGlvbnMgdXNlZCBieSB0aGlzIGNvbnZlcnRlclxuICAgICAgICogQHByaXZhdGVcbiAgICAgICAqIEB0eXBlIHt7fX1cbiAgICAgICAqL1xuICAgICAgb3B0aW9ucyA9IHt9LFxuXG4gICAgICAvKipcbiAgICAgICAqIExhbmd1YWdlIGV4dGVuc2lvbnMgdXNlZCBieSB0aGlzIGNvbnZlcnRlclxuICAgICAgICogQHByaXZhdGVcbiAgICAgICAqIEB0eXBlIHtBcnJheX1cbiAgICAgICAqL1xuICAgICAgbGFuZ0V4dGVuc2lvbnMgPSBbXSxcblxuICAgICAgLyoqXG4gICAgICAgKiBPdXRwdXQgbW9kaWZpZXJzIGV4dGVuc2lvbnMgdXNlZCBieSB0aGlzIGNvbnZlcnRlclxuICAgICAgICogQHByaXZhdGVcbiAgICAgICAqIEB0eXBlIHtBcnJheX1cbiAgICAgICAqL1xuICAgICAgb3V0cHV0TW9kaWZpZXJzID0gW10sXG5cbiAgICAgIC8qKlxuICAgICAgICogRXZlbnQgbGlzdGVuZXJzXG4gICAgICAgKiBAcHJpdmF0ZVxuICAgICAgICogQHR5cGUge3t9fVxuICAgICAgICovXG4gICAgICBsaXN0ZW5lcnMgPSB7fSxcblxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZmxhdm9yIHNldCBpbiB0aGlzIGNvbnZlcnRlclxuICAgICAgICovXG4gICAgICBzZXRDb252Rmxhdm9yID0gc2V0Rmxhdm9yLFxuXG4gICAgICAvKipcbiAgICAgICAqIE1ldGFkYXRhIG9mIHRoZSBkb2N1bWVudFxuICAgICAgICogQHR5cGUge3twYXJzZWQ6IHt9LCByYXc6IHN0cmluZywgZm9ybWF0OiBzdHJpbmd9fVxuICAgICAgICovXG4gICAgICBtZXRhZGF0YSA9IHtcbiAgICAgICAgcGFyc2VkOiB7fSxcbiAgICAgICAgcmF3OiAnJyxcbiAgICAgICAgZm9ybWF0OiAnJ1xuICAgICAgfTtcblxuICBfY29uc3RydWN0b3IoKTtcblxuICAvKipcbiAgICogQ29udmVydGVyIGNvbnN0cnVjdG9yXG4gICAqIEBwcml2YXRlXG4gICAqL1xuICBmdW5jdGlvbiBfY29uc3RydWN0b3IgKCkge1xuICAgIGNvbnZlcnRlck9wdGlvbnMgPSBjb252ZXJ0ZXJPcHRpb25zIHx8IHt9O1xuXG4gICAgZm9yICh2YXIgZ09wdCBpbiBnbG9iYWxPcHRpb25zKSB7XG4gICAgICBpZiAoZ2xvYmFsT3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShnT3B0KSkge1xuICAgICAgICBvcHRpb25zW2dPcHRdID0gZ2xvYmFsT3B0aW9uc1tnT3B0XTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBNZXJnZSBvcHRpb25zXG4gICAgaWYgKHR5cGVvZiBjb252ZXJ0ZXJPcHRpb25zID09PSAnb2JqZWN0Jykge1xuICAgICAgZm9yICh2YXIgb3B0IGluIGNvbnZlcnRlck9wdGlvbnMpIHtcbiAgICAgICAgaWYgKGNvbnZlcnRlck9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0KSkge1xuICAgICAgICAgIG9wdGlvbnNbb3B0XSA9IGNvbnZlcnRlck9wdGlvbnNbb3B0XTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBFcnJvcignQ29udmVydGVyIGV4cGVjdHMgdGhlIHBhc3NlZCBwYXJhbWV0ZXIgdG8gYmUgYW4gb2JqZWN0LCBidXQgJyArIHR5cGVvZiBjb252ZXJ0ZXJPcHRpb25zICtcbiAgICAgICcgd2FzIHBhc3NlZCBpbnN0ZWFkLicpO1xuICAgIH1cblxuICAgIGlmIChvcHRpb25zLmV4dGVuc2lvbnMpIHtcbiAgICAgIHNob3dkb3duLmhlbHBlci5mb3JFYWNoKG9wdGlvbnMuZXh0ZW5zaW9ucywgX3BhcnNlRXh0ZW5zaW9uKTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogUGFyc2UgZXh0ZW5zaW9uXG4gICAqIEBwYXJhbSB7Kn0gZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbbmFtZT0nJ11cbiAgICogQHByaXZhdGVcbiAgICovXG4gIGZ1bmN0aW9uIF9wYXJzZUV4dGVuc2lvbiAoZXh0LCBuYW1lKSB7XG5cbiAgICBuYW1lID0gbmFtZSB8fCBudWxsO1xuICAgIC8vIElmIGl0J3MgYSBzdHJpbmcsIHRoZSBleHRlbnNpb24gd2FzIHByZXZpb3VzbHkgbG9hZGVkXG4gICAgaWYgKHNob3dkb3duLmhlbHBlci5pc1N0cmluZyhleHQpKSB7XG4gICAgICBleHQgPSBzaG93ZG93bi5oZWxwZXIuc3RkRXh0TmFtZShleHQpO1xuICAgICAgbmFtZSA9IGV4dDtcblxuICAgICAgLy8gTEVHQUNZX1NVUFBPUlQgQ09ERVxuICAgICAgaWYgKHNob3dkb3duLmV4dGVuc2lvbnNbZXh0XSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ0RFUFJFQ0FUSU9OIFdBUk5JTkc6ICcgKyBleHQgKyAnIGlzIGFuIG9sZCBleHRlbnNpb24gdGhhdCB1c2VzIGEgZGVwcmVjYXRlZCBsb2FkaW5nIG1ldGhvZC4nICtcbiAgICAgICAgICAnUGxlYXNlIGluZm9ybSB0aGUgZGV2ZWxvcGVyIHRoYXQgdGhlIGV4dGVuc2lvbiBzaG91bGQgYmUgdXBkYXRlZCEnKTtcbiAgICAgICAgbGVnYWN5RXh0ZW5zaW9uTG9hZGluZyhzaG93ZG93bi5leHRlbnNpb25zW2V4dF0sIGV4dCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgICAgLy8gRU5EIExFR0FDWSBTVVBQT1JUIENPREVcblxuICAgICAgfSBlbHNlIGlmICghc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGV4dGVuc2lvbnNbZXh0XSkpIHtcbiAgICAgICAgZXh0ID0gZXh0ZW5zaW9uc1tleHRdO1xuXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBFcnJvcignRXh0ZW5zaW9uIFwiJyArIGV4dCArICdcIiBjb3VsZCBub3QgYmUgbG9hZGVkLiBJdCB3YXMgZWl0aGVyIG5vdCBmb3VuZCBvciBpcyBub3QgYSB2YWxpZCBleHRlbnNpb24uJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBleHQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGV4dCA9IGV4dCgpO1xuICAgIH1cblxuICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzQXJyYXkoZXh0KSkge1xuICAgICAgZXh0ID0gW2V4dF07XG4gICAgfVxuXG4gICAgdmFyIHZhbGlkRXh0ID0gdmFsaWRhdGUoZXh0LCBuYW1lKTtcbiAgICBpZiAoIXZhbGlkRXh0LnZhbGlkKSB7XG4gICAgICB0aHJvdyBFcnJvcih2YWxpZEV4dC5lcnJvcik7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleHQubGVuZ3RoOyArK2kpIHtcbiAgICAgIHN3aXRjaCAoZXh0W2ldLnR5cGUpIHtcblxuICAgICAgICBjYXNlICdsYW5nJzpcbiAgICAgICAgICBsYW5nRXh0ZW5zaW9ucy5wdXNoKGV4dFtpXSk7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnb3V0cHV0JzpcbiAgICAgICAgICBvdXRwdXRNb2RpZmllcnMucHVzaChleHRbaV0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgaWYgKGV4dFtpXS5oYXNPd25Qcm9wZXJ0eSgnbGlzdGVuZXJzJykpIHtcbiAgICAgICAgZm9yICh2YXIgbG4gaW4gZXh0W2ldLmxpc3RlbmVycykge1xuICAgICAgICAgIGlmIChleHRbaV0ubGlzdGVuZXJzLmhhc093blByb3BlcnR5KGxuKSkge1xuICAgICAgICAgICAgbGlzdGVuKGxuLCBleHRbaV0ubGlzdGVuZXJzW2xuXSk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gIH1cblxuICAvKipcbiAgICogTEVHQUNZX1NVUFBPUlRcbiAgICogQHBhcmFtIHsqfSBleHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIGxlZ2FjeUV4dGVuc2lvbkxvYWRpbmcgKGV4dCwgbmFtZSkge1xuICAgIGlmICh0eXBlb2YgZXh0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBleHQgPSBleHQobmV3IHNob3dkb3duLkNvbnZlcnRlcigpKTtcbiAgICB9XG4gICAgaWYgKCFzaG93ZG93bi5oZWxwZXIuaXNBcnJheShleHQpKSB7XG4gICAgICBleHQgPSBbZXh0XTtcbiAgICB9XG4gICAgdmFyIHZhbGlkID0gdmFsaWRhdGUoZXh0LCBuYW1lKTtcblxuICAgIGlmICghdmFsaWQudmFsaWQpIHtcbiAgICAgIHRocm93IEVycm9yKHZhbGlkLmVycm9yKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4dC5sZW5ndGg7ICsraSkge1xuICAgICAgc3dpdGNoIChleHRbaV0udHlwZSkge1xuICAgICAgICBjYXNlICdsYW5nJzpcbiAgICAgICAgICBsYW5nRXh0ZW5zaW9ucy5wdXNoKGV4dFtpXSk7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ291dHB1dCc6XG4gICAgICAgICAgb3V0cHV0TW9kaWZpZXJzLnB1c2goZXh0W2ldKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDovLyBzaG91bGQgbmV2ZXIgcmVhY2ggaGVyZVxuICAgICAgICAgIHRocm93IEVycm9yKCdFeHRlbnNpb24gbG9hZGVyIGVycm9yOiBUeXBlIHVucmVjb2duaXplZCEhIScpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBMaXN0ZW4gdG8gYW4gZXZlbnRcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtmdW5jdGlvbn0gY2FsbGJhY2tcbiAgICovXG4gIGZ1bmN0aW9uIGxpc3RlbiAobmFtZSwgY2FsbGJhY2spIHtcbiAgICBpZiAoIXNob3dkb3duLmhlbHBlci5pc1N0cmluZyhuYW1lKSkge1xuICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQgaW4gY29udmVydGVyLmxpc3RlbigpIG1ldGhvZDogbmFtZSBtdXN0IGJlIGEgc3RyaW5nLCBidXQgJyArIHR5cGVvZiBuYW1lICsgJyBnaXZlbicpO1xuICAgIH1cblxuICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50IGluIGNvbnZlcnRlci5saXN0ZW4oKSBtZXRob2Q6IGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0ICcgKyB0eXBlb2YgY2FsbGJhY2sgKyAnIGdpdmVuJyk7XG4gICAgfVxuXG4gICAgaWYgKCFsaXN0ZW5lcnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICAgIGxpc3RlbmVyc1tuYW1lXSA9IFtdO1xuICAgIH1cbiAgICBsaXN0ZW5lcnNbbmFtZV0ucHVzaChjYWxsYmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiByVHJpbUlucHV0VGV4dCAodGV4dCkge1xuICAgIHZhciByc3AgPSB0ZXh0Lm1hdGNoKC9eXFxzKi8pWzBdLmxlbmd0aCxcbiAgICAgICAgcmd4ID0gbmV3IFJlZ0V4cCgnXlxcXFxzezAsJyArIHJzcCArICd9JywgJ2dtJyk7XG4gICAgcmV0dXJuIHRleHQucmVwbGFjZShyZ3gsICcnKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwYXRjaCBhbiBldmVudFxuICAgKiBAcHJpdmF0ZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZ0TmFtZSBFdmVudCBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRleHRcbiAgICogQHBhcmFtIHt7fX0gb3B0aW9ucyBDb252ZXJ0ZXIgT3B0aW9uc1xuICAgKiBAcGFyYW0ge3t9fSBnbG9iYWxzXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICB0aGlzLl9kaXNwYXRjaCA9IGZ1bmN0aW9uIGRpc3BhdGNoIChldnROYW1lLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICAgaWYgKGxpc3RlbmVycy5oYXNPd25Qcm9wZXJ0eShldnROYW1lKSkge1xuICAgICAgZm9yICh2YXIgZWkgPSAwOyBlaSA8IGxpc3RlbmVyc1tldnROYW1lXS5sZW5ndGg7ICsrZWkpIHtcbiAgICAgICAgdmFyIG5UZXh0ID0gbGlzdGVuZXJzW2V2dE5hbWVdW2VpXShldnROYW1lLCB0ZXh0LCB0aGlzLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICAgICAgaWYgKG5UZXh0ICYmIHR5cGVvZiBuVGV4dCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICB0ZXh0ID0gblRleHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRleHQ7XG4gIH07XG5cbiAgLyoqXG4gICAqIExpc3RlbiB0byBhbiBldmVudFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2Z1bmN0aW9ufSBjYWxsYmFja1xuICAgKiBAcmV0dXJucyB7c2hvd2Rvd24uQ29udmVydGVyfVxuICAgKi9cbiAgdGhpcy5saXN0ZW4gPSBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2spIHtcbiAgICBsaXN0ZW4obmFtZSwgY2FsbGJhY2spO1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhIG1hcmtkb3duIHN0cmluZyBpbnRvIEhUTUxcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRleHRcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICB0aGlzLm1ha2VIdG1sID0gZnVuY3Rpb24gKHRleHQpIHtcbiAgICAvL2NoZWNrIGlmIHRleHQgaXMgbm90IGZhbHN5XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICB2YXIgZ2xvYmFscyA9IHtcbiAgICAgIGdIdG1sQmxvY2tzOiAgICAgW10sXG4gICAgICBnSHRtbE1kQmxvY2tzOiAgIFtdLFxuICAgICAgZ0h0bWxTcGFuczogICAgICBbXSxcbiAgICAgIGdVcmxzOiAgICAgICAgICAge30sXG4gICAgICBnVGl0bGVzOiAgICAgICAgIHt9LFxuICAgICAgZ0RpbWVuc2lvbnM6ICAgICB7fSxcbiAgICAgIGdMaXN0TGV2ZWw6ICAgICAgMCxcbiAgICAgIGhhc2hMaW5rQ291bnRzOiAge30sXG4gICAgICBsYW5nRXh0ZW5zaW9uczogIGxhbmdFeHRlbnNpb25zLFxuICAgICAgb3V0cHV0TW9kaWZpZXJzOiBvdXRwdXRNb2RpZmllcnMsXG4gICAgICBjb252ZXJ0ZXI6ICAgICAgIHRoaXMsXG4gICAgICBnaENvZGVCbG9ja3M6ICAgIFtdLFxuICAgICAgbWV0YWRhdGE6IHtcbiAgICAgICAgcGFyc2VkOiB7fSxcbiAgICAgICAgcmF3OiAnJyxcbiAgICAgICAgZm9ybWF0OiAnJ1xuICAgICAgfVxuICAgIH07XG5cbiAgICAvLyBUaGlzIGxldHMgdXMgdXNlIMKoIHRyZW1hIGFzIGFuIGVzY2FwZSBjaGFyIHRvIGF2b2lkIG1kNSBoYXNoZXNcbiAgICAvLyBUaGUgY2hvaWNlIG9mIGNoYXJhY3RlciBpcyBhcmJpdHJhcnk7IGFueXRoaW5nIHRoYXQgaXNuJ3RcbiAgICAvLyBtYWdpYyBpbiBNYXJrZG93biB3aWxsIHdvcmsuXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqgvZywgJ8KoVCcpO1xuXG4gICAgLy8gUmVwbGFjZSAkIHdpdGggwqhEXG4gICAgLy8gUmVnRXhwIGludGVycHJldHMgJCBhcyBhIHNwZWNpYWwgY2hhcmFjdGVyXG4gICAgLy8gd2hlbiBpdCdzIGluIGEgcmVwbGFjZW1lbnQgc3RyaW5nXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFwkL2csICfCqEQnKTtcblxuICAgIC8vIFN0YW5kYXJkaXplIGxpbmUgZW5kaW5nc1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7IC8vIERPUyB0byBVbml4XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxyL2csICdcXG4nKTsgLy8gTWFjIHRvIFVuaXhcblxuICAgIC8vIFN0YXJkYXJkaXplIGxpbmUgc3BhY2VzXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFx1MDBBMC9nLCAnJm5ic3A7Jyk7XG5cbiAgICBpZiAob3B0aW9ucy5zbWFydEluZGVudGF0aW9uRml4KSB7XG4gICAgICB0ZXh0ID0gclRyaW1JbnB1dFRleHQodGV4dCk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBzdXJlIHRleHQgYmVnaW5zIGFuZCBlbmRzIHdpdGggYSBjb3VwbGUgb2YgbmV3bGluZXM6XG4gICAgdGV4dCA9ICdcXG5cXG4nICsgdGV4dCArICdcXG5cXG4nO1xuXG4gICAgLy8gZGV0YWJcbiAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdkZXRhYicpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gICAgLyoqXG4gICAgICogU3RyaXAgYW55IGxpbmVzIGNvbnNpc3Rpbmcgb25seSBvZiBzcGFjZXMgYW5kIHRhYnMuXG4gICAgICogVGhpcyBtYWtlcyBzdWJzZXF1ZW50IHJlZ2V4cyBlYXNpZXIgdG8gd3JpdGUsIGJlY2F1c2Ugd2UgY2FuXG4gICAgICogbWF0Y2ggY29uc2VjdXRpdmUgYmxhbmsgbGluZXMgd2l0aCAvXFxuKy8gaW5zdGVhZCBvZiBzb21ldGhpbmdcbiAgICAgKiBjb250b3J0ZWQgbGlrZSAvWyBcXHRdKlxcbisvXG4gICAgICovXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXlsgXFx0XSskL21nLCAnJyk7XG5cbiAgICAvL3J1biBsYW5ndWFnZUV4dGVuc2lvbnNcbiAgICBzaG93ZG93bi5oZWxwZXIuZm9yRWFjaChsYW5nRXh0ZW5zaW9ucywgZnVuY3Rpb24gKGV4dCkge1xuICAgICAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcigncnVuRXh0ZW5zaW9uJykoZXh0LCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB9KTtcblxuICAgIC8vIHJ1biB0aGUgc3ViIHBhcnNlcnNcbiAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtZXRhZGF0YScpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hQcmVDb2RlVGFncycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2dpdGh1YkNvZGVCbG9ja3MnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoSFRNTEJsb2NrcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hDb2RlVGFncycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3N0cmlwTGlua0RlZmluaXRpb25zJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignYmxvY2tHYW11dCcpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3VuaGFzaEhUTUxTcGFucycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3VuZXNjYXBlU3BlY2lhbENoYXJzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgICAvLyBhdHRhY2tsYWI6IFJlc3RvcmUgZG9sbGFyIHNpZ25zXG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqhEL2csICckJCcpO1xuXG4gICAgLy8gYXR0YWNrbGFiOiBSZXN0b3JlIHRyZW1hc1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL8KoVC9nLCAnwqgnKTtcblxuICAgIC8vIHJlbmRlciBhIGNvbXBsZXRlIGh0bWwgZG9jdW1lbnQgaW5zdGVhZCBvZiBhIHBhcnRpYWwgaWYgdGhlIG9wdGlvbiBpcyBlbmFibGVkXG4gICAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignY29tcGxldGVIVE1MRG9jdW1lbnQnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAgIC8vIFJ1biBvdXRwdXQgbW9kaWZpZXJzXG4gICAgc2hvd2Rvd24uaGVscGVyLmZvckVhY2gob3V0cHV0TW9kaWZpZXJzLCBmdW5jdGlvbiAoZXh0KSB7XG4gICAgICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdydW5FeHRlbnNpb24nKShleHQsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIH0pO1xuXG4gICAgLy8gdXBkYXRlIG1ldGFkYXRhXG4gICAgbWV0YWRhdGEgPSBnbG9iYWxzLm1ldGFkYXRhO1xuICAgIHJldHVybiB0ZXh0O1xuICB9O1xuXG4gIC8qKlxuICAgKiBDb252ZXJ0cyBhbiBIVE1MIHN0cmluZyBpbnRvIGEgbWFya2Rvd24gc3RyaW5nXG4gICAqIEBwYXJhbSBzcmNcbiAgICogQHBhcmFtIFtIVE1MUGFyc2VyXSBBIFdIQVRXRyBET00gYW5kIEhUTUwgcGFyc2VyLCBzdWNoIGFzIEpTRE9NLiBJZiBub25lIGlzIHN1cHBsaWVkLCB3aW5kb3cuZG9jdW1lbnQgd2lsbCBiZSB1c2VkLlxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgdGhpcy5tYWtlTWFya2Rvd24gPSB0aGlzLm1ha2VNZCA9IGZ1bmN0aW9uIChzcmMsIEhUTUxQYXJzZXIpIHtcblxuICAgIC8vIHJlcGxhY2UgXFxyXFxuIHdpdGggXFxuXG4gICAgc3JjID0gc3JjLnJlcGxhY2UoL1xcclxcbi9nLCAnXFxuJyk7XG4gICAgc3JjID0gc3JjLnJlcGxhY2UoL1xcci9nLCAnXFxuJyk7IC8vIG9sZCBtYWNzXG5cbiAgICAvLyBkdWUgdG8gYW4gZWRnZSBjYXNlLCB3ZSBuZWVkIHRvIGZpbmQgdGhpczogPiA8XG4gICAgLy8gdG8gcHJldmVudCByZW1vdmluZyBvZiBub24gc2lsZW50IHdoaXRlIHNwYWNlc1xuICAgIC8vIGV4OiA8ZW0+dGhpcyBpczwvZW0+IDxzdHJvbmc+c3BhcnRhPC9zdHJvbmc+XG4gICAgc3JjID0gc3JjLnJlcGxhY2UoLz5bIFxcdF0rPC8sICc+wqhOQlNQOzwnKTtcblxuICAgIGlmICghSFRNTFBhcnNlcikge1xuICAgICAgaWYgKHdpbmRvdyAmJiB3aW5kb3cuZG9jdW1lbnQpIHtcbiAgICAgICAgSFRNTFBhcnNlciA9IHdpbmRvdy5kb2N1bWVudDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcignSFRNTFBhcnNlciBpcyB1bmRlZmluZWQuIElmIGluIGEgd2Vid29ya2VyIG9yIG5vZGVqcyBlbnZpcm9ubWVudCwgeW91IG5lZWQgdG8gcHJvdmlkZSBhIFdIQVRXRyBET00gYW5kIEhUTUwgc3VjaCBhcyBKU0RPTScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHZhciBkb2MgPSBIVE1MUGFyc2VyLmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgIGRvYy5pbm5lckhUTUwgPSBzcmM7XG5cbiAgICB2YXIgZ2xvYmFscyA9IHtcbiAgICAgIHByZUxpc3Q6IHN1YnN0aXR1dGVQcmVDb2RlVGFncyhkb2MpXG4gICAgfTtcblxuICAgIC8vIHJlbW92ZSBhbGwgbmV3bGluZXMgYW5kIGNvbGxhcHNlIHNwYWNlc1xuICAgIGNsZWFuKGRvYyk7XG5cbiAgICAvLyBzb21lIHN0dWZmLCBsaWtlIGFjY2lkZW50YWwgcmVmZXJlbmNlIGxpbmtzIG11c3Qgbm93IGJlIGVzY2FwZWRcbiAgICAvLyBUT0RPXG4gICAgLy8gZG9jLmlubmVySFRNTCA9IGRvYy5pbm5lckhUTUwucmVwbGFjZSgvXFxbW1xcU1xcdCBdXS8pO1xuXG4gICAgdmFyIG5vZGVzID0gZG9jLmNoaWxkTm9kZXMsXG4gICAgICAgIG1kRG9jID0gJyc7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBtZERvYyArPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ub2RlJykobm9kZXNbaV0sIGdsb2JhbHMpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGNsZWFuIChub2RlKSB7XG4gICAgICBmb3IgKHZhciBuID0gMDsgbiA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7ICsrbikge1xuICAgICAgICB2YXIgY2hpbGQgPSBub2RlLmNoaWxkTm9kZXNbbl07XG4gICAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PT0gMykge1xuICAgICAgICAgIGlmICghL1xcUy8udGVzdChjaGlsZC5ub2RlVmFsdWUpICYmICEvXlsgXSskLy50ZXN0KGNoaWxkLm5vZGVWYWx1ZSkpIHtcbiAgICAgICAgICAgIG5vZGUucmVtb3ZlQ2hpbGQoY2hpbGQpO1xuICAgICAgICAgICAgLS1uO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGlsZC5ub2RlVmFsdWUgPSBjaGlsZC5ub2RlVmFsdWUuc3BsaXQoJ1xcbicpLmpvaW4oJyAnKTtcbiAgICAgICAgICAgIGNoaWxkLm5vZGVWYWx1ZSA9IGNoaWxkLm5vZGVWYWx1ZS5yZXBsYWNlKC8oXFxzKSsvZywgJyQxJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGNoaWxkLm5vZGVUeXBlID09PSAxKSB7XG4gICAgICAgICAgY2xlYW4oY2hpbGQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZmluZCBhbGwgcHJlIHRhZ3MgYW5kIHJlcGxhY2UgY29udGVudHMgd2l0aCBwbGFjZWhvbGRlclxuICAgIC8vIHdlIG5lZWQgdGhpcyBzbyB0aGF0IHdlIGNhbiByZW1vdmUgYWxsIGluZGVudGF0aW9uIGZyb20gaHRtbFxuICAgIC8vIHRvIGVhc2UgdXAgcGFyc2luZ1xuICAgIGZ1bmN0aW9uIHN1YnN0aXR1dGVQcmVDb2RlVGFncyAoZG9jKSB7XG5cbiAgICAgIHZhciBwcmVzID0gZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoJ3ByZScpLFxuICAgICAgICAgIHByZXNQSCA9IFtdO1xuXG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZXMubGVuZ3RoOyArK2kpIHtcblxuICAgICAgICBpZiAocHJlc1tpXS5jaGlsZEVsZW1lbnRDb3VudCA9PT0gMSAmJiBwcmVzW2ldLmZpcnN0Q2hpbGQudGFnTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnY29kZScpIHtcbiAgICAgICAgICB2YXIgY29udGVudCA9IHByZXNbaV0uZmlyc3RDaGlsZC5pbm5lckhUTUwudHJpbSgpLFxuICAgICAgICAgICAgICBsYW5ndWFnZSA9IHByZXNbaV0uZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoJ2RhdGEtbGFuZ3VhZ2UnKSB8fCAnJztcblxuICAgICAgICAgIC8vIGlmIGRhdGEtbGFuZ3VhZ2UgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLCB0aGVuIHdlIGxvb2sgZm9yIGNsYXNzIGxhbmd1YWdlLSpcbiAgICAgICAgICBpZiAobGFuZ3VhZ2UgPT09ICcnKSB7XG4gICAgICAgICAgICB2YXIgY2xhc3NlcyA9IHByZXNbaV0uZmlyc3RDaGlsZC5jbGFzc05hbWUuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgY2xhc3Nlcy5sZW5ndGg7ICsrYykge1xuICAgICAgICAgICAgICB2YXIgbWF0Y2hlcyA9IGNsYXNzZXNbY10ubWF0Y2goL15sYW5ndWFnZS0oLispJC8pO1xuICAgICAgICAgICAgICBpZiAobWF0Y2hlcyAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlID0gbWF0Y2hlc1sxXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cblxuICAgICAgICAgIC8vIHVuZXNjYXBlIGh0bWwgZW50aXRpZXMgaW4gY29udGVudFxuICAgICAgICAgIGNvbnRlbnQgPSBzaG93ZG93bi5oZWxwZXIudW5lc2NhcGVIVE1MRW50aXRpZXMoY29udGVudCk7XG5cbiAgICAgICAgICBwcmVzUEgucHVzaChjb250ZW50KTtcbiAgICAgICAgICBwcmVzW2ldLm91dGVySFRNTCA9ICc8cHJlY29kZSBsYW5ndWFnZT1cIicgKyBsYW5ndWFnZSArICdcIiBwcmVjb2RlbnVtPVwiJyArIGkudG9TdHJpbmcoKSArICdcIj48L3ByZWNvZGU+JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcmVzUEgucHVzaChwcmVzW2ldLmlubmVySFRNTCk7XG4gICAgICAgICAgcHJlc1tpXS5pbm5lckhUTUwgPSAnJztcbiAgICAgICAgICBwcmVzW2ldLnNldEF0dHJpYnV0ZSgncHJlbnVtJywgaS50b1N0cmluZygpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHByZXNQSDtcbiAgICB9XG5cbiAgICByZXR1cm4gbWREb2M7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCBhbiBvcHRpb24gb2YgdGhpcyBDb252ZXJ0ZXIgaW5zdGFuY2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IGtleVxuICAgKiBAcGFyYW0geyp9IHZhbHVlXG4gICAqL1xuICB0aGlzLnNldE9wdGlvbiA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gICAgb3B0aW9uc1trZXldID0gdmFsdWU7XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgb3B0aW9uIG9mIHRoaXMgQ29udmVydGVyIGluc3RhbmNlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBrZXlcbiAgICogQHJldHVybnMgeyp9XG4gICAqL1xuICB0aGlzLmdldE9wdGlvbiA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gb3B0aW9uc1trZXldO1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG9wdGlvbnMgb2YgdGhpcyBDb252ZXJ0ZXIgaW5zdGFuY2VcbiAgICogQHJldHVybnMge3t9fVxuICAgKi9cbiAgdGhpcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBvcHRpb25zO1xuICB9O1xuXG4gIC8qKlxuICAgKiBBZGQgZXh0ZW5zaW9uIHRvIFRISVMgY29udmVydGVyXG4gICAqIEBwYXJhbSB7e319IGV4dGVuc2lvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gW25hbWU9bnVsbF1cbiAgICovXG4gIHRoaXMuYWRkRXh0ZW5zaW9uID0gZnVuY3Rpb24gKGV4dGVuc2lvbiwgbmFtZSkge1xuICAgIG5hbWUgPSBuYW1lIHx8IG51bGw7XG4gICAgX3BhcnNlRXh0ZW5zaW9uKGV4dGVuc2lvbiwgbmFtZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFVzZSBhIGdsb2JhbCByZWdpc3RlcmVkIGV4dGVuc2lvbiB3aXRoIFRISVMgY29udmVydGVyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBleHRlbnNpb25OYW1lIE5hbWUgb2YgdGhlIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBleHRlbnNpb25cbiAgICovXG4gIHRoaXMudXNlRXh0ZW5zaW9uID0gZnVuY3Rpb24gKGV4dGVuc2lvbk5hbWUpIHtcbiAgICBfcGFyc2VFeHRlbnNpb24oZXh0ZW5zaW9uTmFtZSk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFNldCB0aGUgZmxhdm9yIFRISVMgY29udmVydGVyIHNob3VsZCB1c2VcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIHRoaXMuc2V0Rmxhdm9yID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoIWZsYXZvci5oYXNPd25Qcm9wZXJ0eShuYW1lKSkge1xuICAgICAgdGhyb3cgRXJyb3IobmFtZSArICcgZmxhdm9yIHdhcyBub3QgZm91bmQnKTtcbiAgICB9XG4gICAgdmFyIHByZXNldCA9IGZsYXZvcltuYW1lXTtcbiAgICBzZXRDb252Rmxhdm9yID0gbmFtZTtcbiAgICBmb3IgKHZhciBvcHRpb24gaW4gcHJlc2V0KSB7XG4gICAgICBpZiAocHJlc2V0Lmhhc093blByb3BlcnR5KG9wdGlvbikpIHtcbiAgICAgICAgb3B0aW9uc1tvcHRpb25dID0gcHJlc2V0W29wdGlvbl07XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGN1cnJlbnRseSBzZXQgZmxhdm9yIG9mIHRoaXMgY29udmVydGVyXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICB0aGlzLmdldEZsYXZvciA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gc2V0Q29udkZsYXZvcjtcbiAgfTtcblxuICAvKipcbiAgICogUmVtb3ZlIGFuIGV4dGVuc2lvbiBmcm9tIFRISVMgY29udmVydGVyLlxuICAgKiBOb3RlOiBUaGlzIGlzIGEgY29zdGx5IG9wZXJhdGlvbi4gSXQncyBiZXR0ZXIgdG8gaW5pdGlhbGl6ZSBhIG5ldyBjb252ZXJ0ZXJcbiAgICogYW5kIHNwZWNpZnkgdGhlIGV4dGVuc2lvbnMgeW91IHdpc2ggdG8gdXNlXG4gICAqIEBwYXJhbSB7QXJyYXl9IGV4dGVuc2lvblxuICAgKi9cbiAgdGhpcy5yZW1vdmVFeHRlbnNpb24gPSBmdW5jdGlvbiAoZXh0ZW5zaW9uKSB7XG4gICAgaWYgKCFzaG93ZG93bi5oZWxwZXIuaXNBcnJheShleHRlbnNpb24pKSB7XG4gICAgICBleHRlbnNpb24gPSBbZXh0ZW5zaW9uXTtcbiAgICB9XG4gICAgZm9yICh2YXIgYSA9IDA7IGEgPCBleHRlbnNpb24ubGVuZ3RoOyArK2EpIHtcbiAgICAgIHZhciBleHQgPSBleHRlbnNpb25bYV07XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhbmdFeHRlbnNpb25zLmxlbmd0aDsgKytpKSB7XG4gICAgICAgIGlmIChsYW5nRXh0ZW5zaW9uc1tpXSA9PT0gZXh0KSB7XG4gICAgICAgICAgbGFuZ0V4dGVuc2lvbnMuc3BsaWNlKGksIDEpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgb3V0cHV0TW9kaWZpZXJzLmxlbmd0aDsgKytpaSkge1xuICAgICAgICBpZiAob3V0cHV0TW9kaWZpZXJzW2lpXSA9PT0gZXh0KSB7XG4gICAgICAgICAgb3V0cHV0TW9kaWZpZXJzLnNwbGljZShpaSwgMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLyoqXG4gICAqIEdldCBhbGwgZXh0ZW5zaW9uIG9mIFRISVMgY29udmVydGVyXG4gICAqIEByZXR1cm5zIHt7bGFuZ3VhZ2U6IEFycmF5LCBvdXRwdXQ6IEFycmF5fX1cbiAgICovXG4gIHRoaXMuZ2V0QWxsRXh0ZW5zaW9ucyA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4ge1xuICAgICAgbGFuZ3VhZ2U6IGxhbmdFeHRlbnNpb25zLFxuICAgICAgb3V0cHV0OiBvdXRwdXRNb2RpZmllcnNcbiAgICB9O1xuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1ldGFkYXRhIG9mIHRoZSBwcmV2aW91c2x5IHBhcnNlZCBkb2N1bWVudFxuICAgKiBAcGFyYW0gcmF3XG4gICAqIEByZXR1cm5zIHtzdHJpbmd8e319XG4gICAqL1xuICB0aGlzLmdldE1ldGFkYXRhID0gZnVuY3Rpb24gKHJhdykge1xuICAgIGlmIChyYXcpIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YS5yYXc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBtZXRhZGF0YS5wYXJzZWQ7XG4gICAgfVxuICB9O1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIG1ldGFkYXRhIGZvcm1hdCBvZiB0aGUgcHJldmlvdXNseSBwYXJzZWQgZG9jdW1lbnRcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIHRoaXMuZ2V0TWV0YWRhdGFGb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG1ldGFkYXRhLmZvcm1hdDtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZTogc2V0IGEgc2luZ2xlIGtleSwgdmFsdWUgbWV0YWRhdGEgcGFpclxuICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5XG4gICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZVxuICAgKi9cbiAgdGhpcy5fc2V0TWV0YWRhdGFQYWlyID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHtcbiAgICBtZXRhZGF0YS5wYXJzZWRba2V5XSA9IHZhbHVlO1xuICB9O1xuXG4gIC8qKlxuICAgKiBQcml2YXRlOiBzZXQgbWV0YWRhdGEgZm9ybWF0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBmb3JtYXRcbiAgICovXG4gIHRoaXMuX3NldE1ldGFkYXRhRm9ybWF0ID0gZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgIG1ldGFkYXRhLmZvcm1hdCA9IGZvcm1hdDtcbiAgfTtcblxuICAvKipcbiAgICogUHJpdmF0ZTogc2V0IG1ldGFkYXRhIHJhdyB0ZXh0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSByYXdcbiAgICovXG4gIHRoaXMuX3NldE1ldGFkYXRhUmF3ID0gZnVuY3Rpb24gKHJhdykge1xuICAgIG1ldGFkYXRhLnJhdyA9IHJhdztcbiAgfTtcbn07XG5cclxuLyoqXG4gKiBUdXJuIE1hcmtkb3duIGxpbmsgc2hvcnRjdXRzIGludG8gWEhUTUwgPGE+IHRhZ3MuXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignYW5jaG9ycycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdhbmNob3JzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHZhciB3cml0ZUFuY2hvclRhZyA9IGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBsaW5rVGV4dCwgbGlua0lkLCB1cmwsIG01LCBtNiwgdGl0bGUpIHtcbiAgICBpZiAoc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKHRpdGxlKSkge1xuICAgICAgdGl0bGUgPSAnJztcbiAgICB9XG4gICAgbGlua0lkID0gbGlua0lkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGV4cGxpY2l0IGVtcHR5IHVybFxuICAgIGlmICh3aG9sZU1hdGNoLnNlYXJjaCgvXFwoPD9cXHMqPj8gPyhbJ1wiXS4qWydcIl0pP1xcKSQvbSkgPiAtMSkge1xuICAgICAgdXJsID0gJyc7XG4gICAgfSBlbHNlIGlmICghdXJsKSB7XG4gICAgICBpZiAoIWxpbmtJZCkge1xuICAgICAgICAvLyBsb3dlci1jYXNlIGFuZCB0dXJuIGVtYmVkZGVkIG5ld2xpbmVzIGludG8gc3BhY2VzXG4gICAgICAgIGxpbmtJZCA9IGxpbmtUZXh0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvID9cXG4vZywgJyAnKTtcbiAgICAgIH1cbiAgICAgIHVybCA9ICcjJyArIGxpbmtJZDtcblxuICAgICAgaWYgKCFzaG93ZG93bi5oZWxwZXIuaXNVbmRlZmluZWQoZ2xvYmFscy5nVXJsc1tsaW5rSWRdKSkge1xuICAgICAgICB1cmwgPSBnbG9iYWxzLmdVcmxzW2xpbmtJZF07XG4gICAgICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGdsb2JhbHMuZ1RpdGxlc1tsaW5rSWRdKSkge1xuICAgICAgICAgIHRpdGxlID0gZ2xvYmFscy5nVGl0bGVzW2xpbmtJZF07XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB3aG9sZU1hdGNoO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vdXJsID0gc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnModXJsLCAnKl8nLCBmYWxzZSk7IC8vIHJlcGxhY2VkIGxpbmUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZVxuICAgIHVybCA9IHVybC5yZXBsYWNlKHNob3dkb3duLmhlbHBlci5yZWdleGVzLmFzdGVyaXNrRGFzaEFuZENvbG9uLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcblxuICAgIHZhciByZXN1bHQgPSAnPGEgaHJlZj1cIicgKyB1cmwgKyAnXCInO1xuXG4gICAgaWYgKHRpdGxlICE9PSAnJyAmJiB0aXRsZSAhPT0gbnVsbCkge1xuICAgICAgdGl0bGUgPSB0aXRsZS5yZXBsYWNlKC9cIi9nLCAnJnF1b3Q7Jyk7XG4gICAgICAvL3RpdGxlID0gc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnModGl0bGUsICcqXycsIGZhbHNlKTsgLy8gcmVwbGFjZWQgbGluZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlXG4gICAgICB0aXRsZSA9IHRpdGxlLnJlcGxhY2Uoc2hvd2Rvd24uaGVscGVyLnJlZ2V4ZXMuYXN0ZXJpc2tEYXNoQW5kQ29sb24sIHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spO1xuICAgICAgcmVzdWx0ICs9ICcgdGl0bGU9XCInICsgdGl0bGUgKyAnXCInO1xuICAgIH1cblxuICAgIC8vIG9wdGlvbkxpbmtzSW5OZXdXaW5kb3cgb25seSBhcHBsaWVzXG4gICAgLy8gdG8gZXh0ZXJuYWwgbGlua3MuIEhhc2ggbGlua3MgKCMpIG9wZW4gaW4gc2FtZSBwYWdlXG4gICAgaWYgKG9wdGlvbnMub3BlbkxpbmtzSW5OZXdXaW5kb3cgJiYgIS9eIy8udGVzdCh1cmwpKSB7XG4gICAgICAvLyBlc2NhcGVkIF9cbiAgICAgIHJlc3VsdCArPSAnIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiB0YXJnZXQ9XCLCqEU5NUVibGFua1wiJztcbiAgICB9XG5cbiAgICByZXN1bHQgKz0gJz4nICsgbGlua1RleHQgKyAnPC9hPic7XG5cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xuXG4gIC8vIEZpcnN0LCBoYW5kbGUgcmVmZXJlbmNlLXN0eWxlIGxpbmtzOiBbbGluayB0ZXh0XSBbaWRdXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcWygoPzpcXFtbXlxcXV0qXXxbXlxcW1xcXV0pKildID8oPzpcXG4gKik/XFxbKC4qPyldKCkoKSgpKCkvZywgd3JpdGVBbmNob3JUYWcpO1xuXG4gIC8vIE5leHQsIGlubGluZS1zdHlsZSBsaW5rczogW2xpbmsgdGV4dF0odXJsIFwib3B0aW9uYWwgdGl0bGVcIilcbiAgLy8gY2FzZXMgd2l0aCBjcmF6eSB1cmxzIGxpa2UgLi9pbWFnZS9jYXQxKS5wbmdcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxbKCg/OlxcW1teXFxdXSpdfFteXFxbXFxdXSkqKV0oKVsgXFx0XSpcXChbIFxcdF0/PChbXj5dKik+KD86WyBcXHRdKigoW1wiJ10pKFteXCJdKj8pXFw1KSk/WyBcXHRdP1xcKS9nLFxuICAgIHdyaXRlQW5jaG9yVGFnKTtcblxuICAvLyBub3JtYWwgY2FzZXNcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxbKCg/OlxcW1teXFxdXSpdfFteXFxbXFxdXSkqKV0oKVsgXFx0XSpcXChbIFxcdF0/PD8oW1xcU10rPyg/OlxcKFtcXFNdKj9cXClbXFxTXSo/KT8pPj8oPzpbIFxcdF0qKChbXCInXSkoW15cIl0qPylcXDUpKT9bIFxcdF0/XFwpL2csXG4gICAgd3JpdGVBbmNob3JUYWcpO1xuXG4gIC8vIGhhbmRsZSByZWZlcmVuY2Utc3R5bGUgc2hvcnRjdXRzOiBbbGluayB0ZXh0XVxuICAvLyBUaGVzZSBtdXN0IGNvbWUgbGFzdCBpbiBjYXNlIHlvdSd2ZSBhbHNvIGdvdCBbbGluayB0ZXN0XVsxXVxuICAvLyBvciBbbGluayB0ZXN0XSgvZm9vKVxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXFsoW15cXFtcXF1dKyldKCkoKSgpKCkoKS9nLCB3cml0ZUFuY2hvclRhZyk7XG5cbiAgLy8gTGFzdGx5IGhhbmRsZSBHaXRodWJNZW50aW9ucyBpZiBvcHRpb24gaXMgZW5hYmxlZFxuICBpZiAob3B0aW9ucy5naE1lbnRpb25zKSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKF58XFxzKShcXFxcKT8oQChbYS16XFxkXSsoPzpbYS16XFxkLi1dKz9bYS16XFxkXSspKikpL2dtaSwgZnVuY3Rpb24gKHdtLCBzdCwgZXNjYXBlLCBtZW50aW9ucywgdXNlcm5hbWUpIHtcbiAgICAgIGlmIChlc2NhcGUgPT09ICdcXFxcJykge1xuICAgICAgICByZXR1cm4gc3QgKyBtZW50aW9ucztcbiAgICAgIH1cblxuICAgICAgLy9jaGVjayBpZiBvcHRpb25zLmdoTWVudGlvbnNMaW5rIGlzIGEgc3RyaW5nXG4gICAgICBpZiAoIXNob3dkb3duLmhlbHBlci5pc1N0cmluZyhvcHRpb25zLmdoTWVudGlvbnNMaW5rKSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2doTWVudGlvbnNMaW5rIG9wdGlvbiBtdXN0IGJlIGEgc3RyaW5nJyk7XG4gICAgICB9XG4gICAgICB2YXIgbG5rID0gb3B0aW9ucy5naE1lbnRpb25zTGluay5yZXBsYWNlKC9cXHt1fS9nLCB1c2VybmFtZSksXG4gICAgICAgICAgdGFyZ2V0ID0gJyc7XG4gICAgICBpZiAob3B0aW9ucy5vcGVuTGlua3NJbk5ld1dpbmRvdykge1xuICAgICAgICB0YXJnZXQgPSAnIHJlbD1cIm5vb3BlbmVyIG5vcmVmZXJyZXJcIiB0YXJnZXQ9XCLCqEU5NUVibGFua1wiJztcbiAgICAgIH1cbiAgICAgIHJldHVybiBzdCArICc8YSBocmVmPVwiJyArIGxuayArICdcIicgKyB0YXJnZXQgKyAnPicgKyBtZW50aW9ucyArICc8L2E+JztcbiAgICB9KTtcbiAgfVxuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2FuY2hvcnMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vLyB1cmwgYWxsb3dlZCBjaGFycyBbYS16XFxkXy5+Oi8/I1tdQCEkJicoKSorLDs9LV1cblxudmFyIHNpbXBsZVVSTFJlZ2V4ICA9IC8oWyp+X10rfFxcYikoKChodHRwcz98ZnRwfGRpY3QpOlxcL1xcL3x3d3dcXC4pW14nXCI+XFxzXSs/XFwuW14nXCI+XFxzXSs/KSgpKFxcMSk/KD89XFxzfCQpKD8hW1wiPD5dKS9naSxcbiAgICBzaW1wbGVVUkxSZWdleDIgPSAvKFsqfl9dK3xcXGIpKCgoaHR0cHM/fGZ0cHxkaWN0KTpcXC9cXC98d3d3XFwuKVteJ1wiPlxcc10rXFwuW14nXCI+XFxzXSs/KShbLiE/LCgpXFxbXFxdXSk/KFxcMSk/KD89XFxzfCQpKD8hW1wiPD5dKS9naSxcbiAgICBkZWxpbVVybFJlZ2V4ICAgPSAvKCk8KCgoaHR0cHM/fGZ0cHxkaWN0KTpcXC9cXC98d3d3XFwuKVteJ1wiPlxcc10rKSgpPigpL2dpLFxuICAgIHNpbXBsZU1haWxSZWdleCA9IC8oXnxcXHMpKD86bWFpbHRvOik/KFtBLVphLXowLTkhIyQlJicqKy0vPT9eX2B7fH1+Ll0rQFstYS16MC05XSsoXFwuWy1hLXowLTldKykqXFwuW2Etel0rKSg/PSR8XFxzKS9nbWksXG4gICAgZGVsaW1NYWlsUmVnZXggID0gLzwoKSg/Om1haWx0bzopPyhbLS5cXHddK0BbLWEtejAtOV0rKFxcLlstYS16MC05XSspKlxcLlthLXpdKyk+L2dpLFxuXG4gICAgcmVwbGFjZUxpbmsgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgICAgJ3VzZSBzdHJpY3QnO1xuICAgICAgcmV0dXJuIGZ1bmN0aW9uICh3bSwgbGVhZGluZ01hZ2ljQ2hhcnMsIGxpbmssIG0yLCBtMywgdHJhaWxpbmdQdW5jdHVhdGlvbiwgdHJhaWxpbmdNYWdpY0NoYXJzKSB7XG4gICAgICAgIGxpbmsgPSBsaW5rLnJlcGxhY2Uoc2hvd2Rvd24uaGVscGVyLnJlZ2V4ZXMuYXN0ZXJpc2tEYXNoQW5kQ29sb24sIHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spO1xuICAgICAgICB2YXIgbG5rVHh0ID0gbGluayxcbiAgICAgICAgICAgIGFwcGVuZCA9ICcnLFxuICAgICAgICAgICAgdGFyZ2V0ID0gJycsXG4gICAgICAgICAgICBsbWMgICAgPSBsZWFkaW5nTWFnaWNDaGFycyB8fCAnJyxcbiAgICAgICAgICAgIHRtYyAgICA9IHRyYWlsaW5nTWFnaWNDaGFycyB8fCAnJztcbiAgICAgICAgaWYgKC9ed3d3XFwuL2kudGVzdChsaW5rKSkge1xuICAgICAgICAgIGxpbmsgPSBsaW5rLnJlcGxhY2UoL153d3dcXC4vaSwgJ2h0dHA6Ly93d3cuJyk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG9wdGlvbnMuZXhjbHVkZVRyYWlsaW5nUHVuY3R1YXRpb25Gcm9tVVJMcyAmJiB0cmFpbGluZ1B1bmN0dWF0aW9uKSB7XG4gICAgICAgICAgYXBwZW5kID0gdHJhaWxpbmdQdW5jdHVhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAob3B0aW9ucy5vcGVuTGlua3NJbk5ld1dpbmRvdykge1xuICAgICAgICAgIHRhcmdldCA9ICcgcmVsPVwibm9vcGVuZXIgbm9yZWZlcnJlclwiIHRhcmdldD1cIsKoRTk1RWJsYW5rXCInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsbWMgKyAnPGEgaHJlZj1cIicgKyBsaW5rICsgJ1wiJyArIHRhcmdldCArICc+JyArIGxua1R4dCArICc8L2E+JyArIGFwcGVuZCArIHRtYztcbiAgICAgIH07XG4gICAgfSxcblxuICAgIHJlcGxhY2VNYWlsID0gZnVuY3Rpb24gKG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgIHJldHVybiBmdW5jdGlvbiAod2hvbGVNYXRjaCwgYiwgbWFpbCkge1xuICAgICAgICB2YXIgaHJlZiA9ICdtYWlsdG86JztcbiAgICAgICAgYiA9IGIgfHwgJyc7XG4gICAgICAgIG1haWwgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3VuZXNjYXBlU3BlY2lhbENoYXJzJykobWFpbCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgICAgIGlmIChvcHRpb25zLmVuY29kZUVtYWlscykge1xuICAgICAgICAgIGhyZWYgPSBzaG93ZG93bi5oZWxwZXIuZW5jb2RlRW1haWxBZGRyZXNzKGhyZWYgKyBtYWlsKTtcbiAgICAgICAgICBtYWlsID0gc2hvd2Rvd24uaGVscGVyLmVuY29kZUVtYWlsQWRkcmVzcyhtYWlsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBocmVmID0gaHJlZiArIG1haWw7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGIgKyAnPGEgaHJlZj1cIicgKyBocmVmICsgJ1wiPicgKyBtYWlsICsgJzwvYT4nO1xuICAgICAgfTtcbiAgICB9O1xuXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2F1dG9MaW5rcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdhdXRvTGlua3MuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZShkZWxpbVVybFJlZ2V4LCByZXBsYWNlTGluayhvcHRpb25zKSk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoZGVsaW1NYWlsUmVnZXgsIHJlcGxhY2VNYWlsKG9wdGlvbnMsIGdsb2JhbHMpKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdhdXRvTGlua3MuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICByZXR1cm4gdGV4dDtcbn0pO1xuXG5zaG93ZG93bi5zdWJQYXJzZXIoJ3NpbXBsaWZpZWRBdXRvTGlua3MnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgaWYgKCFvcHRpb25zLnNpbXBsaWZpZWRBdXRvTGluaykge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnc2ltcGxpZmllZEF1dG9MaW5rcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICBpZiAob3B0aW9ucy5leGNsdWRlVHJhaWxpbmdQdW5jdHVhdGlvbkZyb21VUkxzKSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZShzaW1wbGVVUkxSZWdleDIsIHJlcGxhY2VMaW5rKG9wdGlvbnMpKTtcbiAgfSBlbHNlIHtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHNpbXBsZVVSTFJlZ2V4LCByZXBsYWNlTGluayhvcHRpb25zKSk7XG4gIH1cbiAgdGV4dCA9IHRleHQucmVwbGFjZShzaW1wbGVNYWlsUmVnZXgsIHJlcGxhY2VNYWlsKG9wdGlvbnMsIGdsb2JhbHMpKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdzaW1wbGlmaWVkQXV0b0xpbmtzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIFRoZXNlIGFyZSBhbGwgdGhlIHRyYW5zZm9ybWF0aW9ucyB0aGF0IGZvcm0gYmxvY2stbGV2ZWxcbiAqIHRhZ3MgbGlrZSBwYXJhZ3JhcGhzLCBoZWFkZXJzLCBhbmQgbGlzdCBpdGVtcy5cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdibG9ja0dhbXV0JywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2Jsb2NrR2FtdXQuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gd2UgcGFyc2UgYmxvY2txdW90ZXMgZmlyc3Qgc28gdGhhdCB3ZSBjYW4gaGF2ZSBoZWFkaW5ncyBhbmQgaHJzXG4gIC8vIGluc2lkZSBibG9ja3F1b3Rlc1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdibG9ja1F1b3RlcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdoZWFkZXJzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gRG8gSG9yaXpvbnRhbCBSdWxlczpcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignaG9yaXpvbnRhbFJ1bGUnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdsaXN0cycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdjb2RlQmxvY2tzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3RhYmxlcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIFdlIGFscmVhZHkgcmFuIF9IYXNoSFRNTEJsb2NrcygpIGJlZm9yZSwgaW4gTWFya2Rvd24oKSwgYnV0IHRoYXRcbiAgLy8gd2FzIHRvIGVzY2FwZSByYXcgSFRNTCBpbiB0aGUgb3JpZ2luYWwgTWFya2Rvd24gc291cmNlLiBUaGlzIHRpbWUsXG4gIC8vIHdlJ3JlIGVzY2FwaW5nIHRoZSBtYXJrdXAgd2UndmUganVzdCBjcmVhdGVkLCBzbyB0aGF0IHdlIGRvbid0IHdyYXBcbiAgLy8gPHA+IHRhZ3MgYXJvdW5kIGJsb2NrLWxldmVsIHRhZ3MuXG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hIVE1MQmxvY2tzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3BhcmFncmFwaHMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdibG9ja0dhbXV0LmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2Jsb2NrUXVvdGVzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2Jsb2NrUXVvdGVzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIGFkZCBhIGNvdXBsZSBleHRyYSBsaW5lcyBhZnRlciB0aGUgdGV4dCBhbmQgZW5kdGV4dCBtYXJrXG4gIHRleHQgPSB0ZXh0ICsgJ1xcblxcbic7XG5cbiAgdmFyIHJneCA9IC8oXiB7MCwzfT5bIFxcdF0/LitcXG4oLitcXG4pKlxcbiopKy9nbTtcblxuICBpZiAob3B0aW9ucy5zcGxpdEFkamFjZW50QmxvY2txdW90ZXMpIHtcbiAgICByZ3ggPSAvXiB7MCwzfT5bXFxzXFxTXSo/KD86XFxuXFxuKS9nbTtcbiAgfVxuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2Uocmd4LCBmdW5jdGlvbiAoYnEpIHtcbiAgICAvLyBhdHRhY2tsYWI6IGhhY2sgYXJvdW5kIEtvbnF1ZXJvciAzLjUuNCBidWc6XG4gICAgLy8gXCItLS0tLS0tLS0tYnVnXCIucmVwbGFjZSgvXi0vZyxcIlwiKSA9PSBcImJ1Z1wiXG4gICAgYnEgPSBicS5yZXBsYWNlKC9eWyBcXHRdKj5bIFxcdF0/L2dtLCAnJyk7IC8vIHRyaW0gb25lIGxldmVsIG9mIHF1b3RpbmdcblxuICAgIC8vIGF0dGFja2xhYjogY2xlYW4gdXAgaGFja1xuICAgIGJxID0gYnEucmVwbGFjZSgvwqgwL2csICcnKTtcblxuICAgIGJxID0gYnEucmVwbGFjZSgvXlsgXFx0XSskL2dtLCAnJyk7IC8vIHRyaW0gd2hpdGVzcGFjZS1vbmx5IGxpbmVzXG4gICAgYnEgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2dpdGh1YkNvZGVCbG9ja3MnKShicSwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgYnEgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2Jsb2NrR2FtdXQnKShicSwgb3B0aW9ucywgZ2xvYmFscyk7IC8vIHJlY3Vyc2VcblxuICAgIGJxID0gYnEucmVwbGFjZSgvKF58XFxuKS9nLCAnJDEgICcpO1xuICAgIC8vIFRoZXNlIGxlYWRpbmcgc3BhY2VzIHNjcmV3IHdpdGggPHByZT4gY29udGVudCwgc28gd2UgbmVlZCB0byBmaXggdGhhdDpcbiAgICBicSA9IGJxLnJlcGxhY2UoLyhcXHMqPHByZT5bXlxccl0rPzxcXC9wcmU+KS9nbSwgZnVuY3Rpb24gKHdob2xlTWF0Y2gsIG0xKSB7XG4gICAgICB2YXIgcHJlID0gbTE7XG4gICAgICAvLyBhdHRhY2tsYWI6IGhhY2sgYXJvdW5kIEtvbnF1ZXJvciAzLjUuNCBidWc6XG4gICAgICBwcmUgPSBwcmUucmVwbGFjZSgvXiAgL21nLCAnwqgwJyk7XG4gICAgICBwcmUgPSBwcmUucmVwbGFjZSgvwqgwL2csICcnKTtcbiAgICAgIHJldHVybiBwcmU7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoQmxvY2snKSgnPGJsb2NrcXVvdGU+XFxuJyArIGJxICsgJ1xcbjwvYmxvY2txdW90ZT4nLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgfSk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnYmxvY2tRdW90ZXMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIFByb2Nlc3MgTWFya2Rvd24gYDxwcmU+PGNvZGU+YCBibG9ja3MuXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignY29kZUJsb2NrcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdjb2RlQmxvY2tzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIHNlbnRpbmVsIHdvcmthcm91bmRzIGZvciBsYWNrIG9mIFxcQSBhbmQgXFxaLCBzYWZhcmlcXGtodG1sIGJ1Z1xuICB0ZXh0ICs9ICfCqDAnO1xuXG4gIHZhciBwYXR0ZXJuID0gLyg/OlxcblxcbnxeKSgoPzooPzpbIF17NH18XFx0KS4qXFxuKykrKShcXG4qWyBdezAsM31bXiBcXHRcXG5dfCg/PcKoMCkpL2c7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UocGF0dGVybiwgZnVuY3Rpb24gKHdob2xlTWF0Y2gsIG0xLCBtMikge1xuICAgIHZhciBjb2RlYmxvY2sgPSBtMSxcbiAgICAgICAgbmV4dENoYXIgPSBtMixcbiAgICAgICAgZW5kID0gJ1xcbic7XG5cbiAgICBjb2RlYmxvY2sgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ291dGRlbnQnKShjb2RlYmxvY2ssIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgIGNvZGVibG9jayA9IHNob3dkb3duLnN1YlBhcnNlcignZW5jb2RlQ29kZScpKGNvZGVibG9jaywgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgY29kZWJsb2NrID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdkZXRhYicpKGNvZGVibG9jaywgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgY29kZWJsb2NrID0gY29kZWJsb2NrLnJlcGxhY2UoL15cXG4rL2csICcnKTsgLy8gdHJpbSBsZWFkaW5nIG5ld2xpbmVzXG4gICAgY29kZWJsb2NrID0gY29kZWJsb2NrLnJlcGxhY2UoL1xcbiskL2csICcnKTsgLy8gdHJpbSB0cmFpbGluZyBuZXdsaW5lc1xuXG4gICAgaWYgKG9wdGlvbnMub21pdEV4dHJhV0xJbkNvZGVCbG9ja3MpIHtcbiAgICAgIGVuZCA9ICcnO1xuICAgIH1cblxuICAgIGNvZGVibG9jayA9ICc8cHJlPjxjb2RlPicgKyBjb2RlYmxvY2sgKyBlbmQgKyAnPC9jb2RlPjwvcHJlPic7XG5cbiAgICByZXR1cm4gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoQmxvY2snKShjb2RlYmxvY2ssIG9wdGlvbnMsIGdsb2JhbHMpICsgbmV4dENoYXI7XG4gIH0pO1xuXG4gIC8vIHN0cmlwIHNlbnRpbmVsXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL8KoMC8sICcnKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdjb2RlQmxvY2tzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKlxuICogICAqICBCYWNrdGljayBxdW90ZXMgYXJlIHVzZWQgZm9yIDxjb2RlPjwvY29kZT4gc3BhbnMuXG4gKlxuICogICAqICBZb3UgY2FuIHVzZSBtdWx0aXBsZSBiYWNrdGlja3MgYXMgdGhlIGRlbGltaXRlcnMgaWYgeW91IHdhbnQgdG9cbiAqICAgICBpbmNsdWRlIGxpdGVyYWwgYmFja3RpY2tzIGluIHRoZSBjb2RlIHNwYW4uIFNvLCB0aGlzIGlucHV0OlxuICpcbiAqICAgICAgICAgSnVzdCB0eXBlIGBgZm9vIGBiYXJgIGJhemBgIGF0IHRoZSBwcm9tcHQuXG4gKlxuICogICAgICAgV2lsbCB0cmFuc2xhdGUgdG86XG4gKlxuICogICAgICAgICA8cD5KdXN0IHR5cGUgPGNvZGU+Zm9vIGBiYXJgIGJhejwvY29kZT4gYXQgdGhlIHByb21wdC48L3A+XG4gKlxuICogICAgVGhlcmUncyBubyBhcmJpdHJhcnkgbGltaXQgdG8gdGhlIG51bWJlciBvZiBiYWNrdGlja3MgeW91XG4gKiAgICBjYW4gdXNlIGFzIGRlbGltdGVycy4gSWYgeW91IG5lZWQgdGhyZWUgY29uc2VjdXRpdmUgYmFja3RpY2tzXG4gKiAgICBpbiB5b3VyIGNvZGUsIHVzZSBmb3VyIGZvciBkZWxpbWl0ZXJzLCBldGMuXG4gKlxuICogICogIFlvdSBjYW4gdXNlIHNwYWNlcyB0byBnZXQgbGl0ZXJhbCBiYWNrdGlja3MgYXQgdGhlIGVkZ2VzOlxuICpcbiAqICAgICAgICAgLi4uIHR5cGUgYGAgYGJhcmAgYGAgLi4uXG4gKlxuICogICAgICAgVHVybnMgdG86XG4gKlxuICogICAgICAgICAuLi4gdHlwZSA8Y29kZT5gYmFyYDwvY29kZT4gLi4uXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignY29kZVNwYW5zJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2NvZGVTcGFucy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICBpZiAodHlwZW9mICh0ZXh0KSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICB0ZXh0ID0gJyc7XG4gIH1cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvKF58W15cXFxcXSkoYCspKFteXFxyXSo/W15gXSlcXDIoPyFgKS9nbSxcbiAgICBmdW5jdGlvbiAod2hvbGVNYXRjaCwgbTEsIG0yLCBtMykge1xuICAgICAgdmFyIGMgPSBtMztcbiAgICAgIGMgPSBjLnJlcGxhY2UoL14oWyBcXHRdKikvZywgJycpO1x0Ly8gbGVhZGluZyB3aGl0ZXNwYWNlXG4gICAgICBjID0gYy5yZXBsYWNlKC9bIFxcdF0qJC9nLCAnJyk7XHQvLyB0cmFpbGluZyB3aGl0ZXNwYWNlXG4gICAgICBjID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVDb2RlJykoYywgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgICBjID0gbTEgKyAnPGNvZGU+JyArIGMgKyAnPC9jb2RlPic7XG4gICAgICBjID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoSFRNTFNwYW5zJykoYywgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgICByZXR1cm4gYztcbiAgICB9XG4gICk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnY29kZVNwYW5zLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBDcmVhdGUgYSBmdWxsIEhUTUwgZG9jdW1lbnQgZnJvbSB0aGUgcHJvY2Vzc2VkIG1hcmtkb3duXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignY29tcGxldGVIVE1MRG9jdW1lbnQnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgaWYgKCFvcHRpb25zLmNvbXBsZXRlSFRNTERvY3VtZW50KSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdjb21wbGV0ZUhUTUxEb2N1bWVudC5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB2YXIgZG9jdHlwZSA9ICdodG1sJyxcbiAgICAgIGRvY3R5cGVQYXJzZWQgPSAnPCFET0NUWVBFIEhUTUw+XFxuJyxcbiAgICAgIHRpdGxlID0gJycsXG4gICAgICBjaGFyc2V0ID0gJzxtZXRhIGNoYXJzZXQ9XCJ1dGYtOFwiPlxcbicsXG4gICAgICBsYW5nID0gJycsXG4gICAgICBtZXRhZGF0YSA9ICcnO1xuXG4gIGlmICh0eXBlb2YgZ2xvYmFscy5tZXRhZGF0YS5wYXJzZWQuZG9jdHlwZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICBkb2N0eXBlUGFyc2VkID0gJzwhRE9DVFlQRSAnICsgIGdsb2JhbHMubWV0YWRhdGEucGFyc2VkLmRvY3R5cGUgKyAnPlxcbic7XG4gICAgZG9jdHlwZSA9IGdsb2JhbHMubWV0YWRhdGEucGFyc2VkLmRvY3R5cGUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpO1xuICAgIGlmIChkb2N0eXBlID09PSAnaHRtbCcgfHwgZG9jdHlwZSA9PT0gJ2h0bWw1Jykge1xuICAgICAgY2hhcnNldCA9ICc8bWV0YSBjaGFyc2V0PVwidXRmLThcIj4nO1xuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIG1ldGEgaW4gZ2xvYmFscy5tZXRhZGF0YS5wYXJzZWQpIHtcbiAgICBpZiAoZ2xvYmFscy5tZXRhZGF0YS5wYXJzZWQuaGFzT3duUHJvcGVydHkobWV0YSkpIHtcbiAgICAgIHN3aXRjaCAobWV0YS50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgIGNhc2UgJ2RvY3R5cGUnOlxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ3RpdGxlJzpcbiAgICAgICAgICB0aXRsZSA9ICc8dGl0bGU+JyArICBnbG9iYWxzLm1ldGFkYXRhLnBhcnNlZC50aXRsZSArICc8L3RpdGxlPlxcbic7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgY2FzZSAnY2hhcnNldCc6XG4gICAgICAgICAgaWYgKGRvY3R5cGUgPT09ICdodG1sJyB8fCBkb2N0eXBlID09PSAnaHRtbDUnKSB7XG4gICAgICAgICAgICBjaGFyc2V0ID0gJzxtZXRhIGNoYXJzZXQ9XCInICsgZ2xvYmFscy5tZXRhZGF0YS5wYXJzZWQuY2hhcnNldCArICdcIj5cXG4nO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjaGFyc2V0ID0gJzxtZXRhIG5hbWU9XCJjaGFyc2V0XCIgY29udGVudD1cIicgKyBnbG9iYWxzLm1ldGFkYXRhLnBhcnNlZC5jaGFyc2V0ICsgJ1wiPlxcbic7XG4gICAgICAgICAgfVxuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2xhbmd1YWdlJzpcbiAgICAgICAgY2FzZSAnbGFuZyc6XG4gICAgICAgICAgbGFuZyA9ICcgbGFuZz1cIicgKyBnbG9iYWxzLm1ldGFkYXRhLnBhcnNlZFttZXRhXSArICdcIic7XG4gICAgICAgICAgbWV0YWRhdGEgKz0gJzxtZXRhIG5hbWU9XCInICsgbWV0YSArICdcIiBjb250ZW50PVwiJyArIGdsb2JhbHMubWV0YWRhdGEucGFyc2VkW21ldGFdICsgJ1wiPlxcbic7XG4gICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBtZXRhZGF0YSArPSAnPG1ldGEgbmFtZT1cIicgKyBtZXRhICsgJ1wiIGNvbnRlbnQ9XCInICsgZ2xvYmFscy5tZXRhZGF0YS5wYXJzZWRbbWV0YV0gKyAnXCI+XFxuJztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICB0ZXh0ID0gZG9jdHlwZVBhcnNlZCArICc8aHRtbCcgKyBsYW5nICsgJz5cXG48aGVhZD5cXG4nICsgdGl0bGUgKyBjaGFyc2V0ICsgbWV0YWRhdGEgKyAnPC9oZWFkPlxcbjxib2R5PlxcbicgKyB0ZXh0LnRyaW0oKSArICdcXG48L2JvZHk+XFxuPC9odG1sPic7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnY29tcGxldGVIVE1MRG9jdW1lbnQuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIENvbnZlcnQgYWxsIHRhYnMgdG8gc3BhY2VzXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignZGV0YWInLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2RldGFiLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIGV4cGFuZCBmaXJzdCBuLTEgdGFic1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHQoPz1cXHQpL2csICcgICAgJyk7IC8vIGdfdGFiX3dpZHRoXG5cbiAgLy8gcmVwbGFjZSB0aGUgbnRoIHdpdGggdHdvIHNlbnRpbmVsc1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXHQvZywgJ8KoQcKoQicpO1xuXG4gIC8vIHVzZSB0aGUgc2VudGluZWwgdG8gYW5jaG9yIG91ciByZWdleCBzbyBpdCBkb2Vzbid0IGV4cGxvZGVcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqhCKC4rPynCqEEvZywgZnVuY3Rpb24gKHdob2xlTWF0Y2gsIG0xKSB7XG4gICAgdmFyIGxlYWRpbmdUZXh0ID0gbTEsXG4gICAgICAgIG51bVNwYWNlcyA9IDQgLSBsZWFkaW5nVGV4dC5sZW5ndGggJSA0OyAgLy8gZ190YWJfd2lkdGhcblxuICAgIC8vIHRoZXJlICptdXN0KiBiZSBhIGJldHRlciB3YXkgdG8gZG8gdGhpczpcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVNwYWNlczsgaSsrKSB7XG4gICAgICBsZWFkaW5nVGV4dCArPSAnICc7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxlYWRpbmdUZXh0O1xuICB9KTtcblxuICAvLyBjbGVhbiB1cCBzZW50aW5lbHNcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqhBL2csICcgICAgJyk7ICAvLyBnX3RhYl93aWR0aFxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC/CqEIvZywgJycpO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2RldGFiLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdlbGxpcHNpcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAoIW9wdGlvbnMuZWxsaXBzaXMpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2VsbGlwc2lzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcLlxcLlxcLi9nLCAn4oCmJyk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZWxsaXBzaXMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogVHVybiBlbW9qaSBjb2RlcyBpbnRvIGVtb2ppc1xuICpcbiAqIExpc3Qgb2Ygc3VwcG9ydGVkIGVtb2ppczogaHR0cHM6Ly9naXRodWIuY29tL3Nob3dkb3duanMvc2hvd2Rvd24vd2lraS9FbW9qaXNcbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdlbW9qaScsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAoIW9wdGlvbnMuZW1vamkpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2Vtb2ppLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHZhciBlbW9qaVJneCA9IC86KFtcXFNdKz8pOi9nO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoZW1vamlSZ3gsIGZ1bmN0aW9uICh3bSwgZW1vamlDb2RlKSB7XG4gICAgaWYgKHNob3dkb3duLmhlbHBlci5lbW9qaXMuaGFzT3duUHJvcGVydHkoZW1vamlDb2RlKSkge1xuICAgICAgcmV0dXJuIHNob3dkb3duLmhlbHBlci5lbW9qaXNbZW1vamlDb2RlXTtcbiAgICB9XG4gICAgcmV0dXJuIHdtO1xuICB9KTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdlbW9qaS5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBTbWFydCBwcm9jZXNzaW5nIGZvciBhbXBlcnNhbmRzIGFuZCBhbmdsZSBicmFja2V0cyB0aGF0IG5lZWQgdG8gYmUgZW5jb2RlZC5cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVBbXBzQW5kQW5nbGVzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdlbmNvZGVBbXBzQW5kQW5nbGVzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIEFtcGVyc2FuZC1lbmNvZGluZyBiYXNlZCBlbnRpcmVseSBvbiBOYXQgSXJvbnMncyBBbXB1dGF0b3IgTVQgcGx1Z2luOlxuICAvLyBodHRwOi8vYnVtcHBvLm5ldC9wcm9qZWN0cy9hbXB1dGF0b3IvXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyYoPyEjP1t4WF0/KD86WzAtOWEtZkEtRl0rfFxcdyspOykvZywgJyZhbXA7Jyk7XG5cbiAgLy8gRW5jb2RlIG5ha2VkIDwnc1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88KD8hW2EtelxcLz8kIV0pL2dpLCAnJmx0OycpO1xuXG4gIC8vIEVuY29kZSA8XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzwvZywgJyZsdDsnKTtcblxuICAvLyBFbmNvZGUgPlxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8+L2csICcmZ3Q7Jyk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZW5jb2RlQW1wc0FuZEFuZ2xlcy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogUmV0dXJucyB0aGUgc3RyaW5nLCB3aXRoIGFmdGVyIHByb2Nlc3NpbmcgdGhlIGZvbGxvd2luZyBiYWNrc2xhc2ggZXNjYXBlIHNlcXVlbmNlcy5cbiAqXG4gKiBhdHRhY2tsYWI6IFRoZSBwb2xpdGUgd2F5IHRvIGRvIHRoaXMgaXMgd2l0aCB0aGUgbmV3IGVzY2FwZUNoYXJhY3RlcnMoKSBmdW5jdGlvbjpcbiAqXG4gKiAgICB0ZXh0ID0gZXNjYXBlQ2hhcmFjdGVycyh0ZXh0LFwiXFxcXFwiLHRydWUpO1xuICogICAgdGV4dCA9IGVzY2FwZUNoYXJhY3RlcnModGV4dCxcImAqX3t9W10oKT4jKy0uIVwiLHRydWUpO1xuICpcbiAqIC4uLmJ1dCB3ZSdyZSBzaWRlc3RlcHBpbmcgaXRzIHVzZSBvZiB0aGUgKHNsb3cpIFJlZ0V4cCBjb25zdHJ1Y3RvclxuICogYXMgYW4gb3B0aW1pemF0aW9uIGZvciBGaXJlZm94LiAgVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBhIExPVC5cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVCYWNrc2xhc2hFc2NhcGVzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdlbmNvZGVCYWNrc2xhc2hFc2NhcGVzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcXFwoXFxcXCkvZywgc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcXFwoW2AqX3t9XFxbXFxdKCk+IysuIX49fDotXSkvZywgc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnNDYWxsYmFjayk7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnZW5jb2RlQmFja3NsYXNoRXNjYXBlcy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogRW5jb2RlL2VzY2FwZSBjZXJ0YWluIGNoYXJhY3RlcnMgaW5zaWRlIE1hcmtkb3duIGNvZGUgcnVucy5cbiAqIFRoZSBwb2ludCBpcyB0aGF0IGluIGNvZGUsIHRoZXNlIGNoYXJhY3RlcnMgYXJlIGxpdGVyYWxzLFxuICogYW5kIGxvc2UgdGhlaXIgc3BlY2lhbCBNYXJrZG93biBtZWFuaW5ncy5cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVDb2RlJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2VuY29kZUNvZGUuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gRW5jb2RlIGFsbCBhbXBlcnNhbmRzOyBIVE1MIGVudGl0aWVzIGFyZSBub3RcbiAgLy8gZW50aXRpZXMgd2l0aGluIGEgTWFya2Rvd24gY29kZSBzcGFuLlxuICB0ZXh0ID0gdGV4dFxuICAgIC5yZXBsYWNlKC8mL2csICcmYW1wOycpXG4gIC8vIERvIHRoZSBhbmdsZSBicmFja2V0IHNvbmcgYW5kIGRhbmNlOlxuICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JylcbiAgICAucmVwbGFjZSgvPi9nLCAnJmd0OycpXG4gIC8vIE5vdywgZXNjYXBlIGNoYXJhY3RlcnMgdGhhdCBhcmUgbWFnaWMgaW4gTWFya2Rvd246XG4gICAgLnJlcGxhY2UoLyhbKl97fVxcW1xcXVxcXFw9fi1dKS9nLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdlbmNvZGVDb2RlLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBXaXRoaW4gdGFncyAtLSBtZWFuaW5nIGJldHdlZW4gPCBhbmQgPiAtLSBlbmNvZGUgW1xcIGAgKiBfIH4gPV0gc28gdGhleVxuICogZG9uJ3QgY29uZmxpY3Qgd2l0aCB0aGVpciB1c2UgaW4gTWFya2Rvd24gZm9yIGNvZGUsIGl0YWxpY3MgYW5kIHN0cm9uZy5cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdlc2NhcGVTcGVjaWFsQ2hhcnNXaXRoaW5UYWdBdHRyaWJ1dGVzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdlc2NhcGVTcGVjaWFsQ2hhcnNXaXRoaW5UYWdBdHRyaWJ1dGVzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIEJ1aWxkIGEgcmVnZXggdG8gZmluZCBIVE1MIHRhZ3MuXG4gIHZhciB0YWdzICAgICA9IC88XFwvP1thLXpcXGRfOi1dKyg/OltcXHNdK1tcXHNcXFNdKz8pPz4vZ2ksXG4gICAgICBjb21tZW50cyA9IC88ISgtLSg/Oig/OltePi1dfC1bXj5dKSg/OlteLV18LVteLV0pKiktLSk+L2dpO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UodGFncywgZnVuY3Rpb24gKHdob2xlTWF0Y2gpIHtcbiAgICByZXR1cm4gd2hvbGVNYXRjaFxuICAgICAgLnJlcGxhY2UoLyguKTxcXC8/Y29kZT4oPz0uKS9nLCAnJDFgJylcbiAgICAgIC5yZXBsYWNlKC8oW1xcXFxgKl9+PXxdKS9nLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcbiAgfSk7XG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZShjb21tZW50cywgZnVuY3Rpb24gKHdob2xlTWF0Y2gpIHtcbiAgICByZXR1cm4gd2hvbGVNYXRjaFxuICAgICAgLnJlcGxhY2UoLyhbXFxcXGAqX349fF0pL2csIHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spO1xuICB9KTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdlc2NhcGVTcGVjaWFsQ2hhcnNXaXRoaW5UYWdBdHRyaWJ1dGVzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBIYW5kbGUgZ2l0aHViIGNvZGVibG9ja3MgcHJpb3IgdG8gcnVubmluZyBIYXNoSFRNTCBzbyB0aGF0XG4gKiBIVE1MIGNvbnRhaW5lZCB3aXRoaW4gdGhlIGNvZGVibG9jayBnZXRzIGVzY2FwZWQgcHJvcGVybHlcbiAqIEV4YW1wbGU6XG4gKiBgYGBydWJ5XG4gKiAgICAgZGVmIGhlbGxvX3dvcmxkKHgpXG4gKiAgICAgICBwdXRzIFwiSGVsbG8sICN7eH1cIlxuICogICAgIGVuZFxuICogYGBgXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignZ2l0aHViQ29kZUJsb2NrcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICAvLyBlYXJseSBleGl0IGlmIG9wdGlvbiBpcyBub3QgZW5hYmxlZFxuICBpZiAoIW9wdGlvbnMuZ2hDb2RlQmxvY2tzKSB7XG4gICAgcmV0dXJuIHRleHQ7XG4gIH1cblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdnaXRodWJDb2RlQmxvY2tzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHRleHQgKz0gJ8KoMCc7XG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvKD86XnxcXG4pKD86IHswLDN9KShgYGArfH5+fispKD86ICopKFteXFxzYH5dKilcXG4oW1xcc1xcU10qPylcXG4oPzogezAsM30pXFwxL2csIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBkZWxpbSwgbGFuZ3VhZ2UsIGNvZGVibG9jaykge1xuICAgIHZhciBlbmQgPSAob3B0aW9ucy5vbWl0RXh0cmFXTEluQ29kZUJsb2NrcykgPyAnJyA6ICdcXG4nO1xuXG4gICAgLy8gRmlyc3QgcGFyc2UgdGhlIGdpdGh1YiBjb2RlIGJsb2NrXG4gICAgY29kZWJsb2NrID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVDb2RlJykoY29kZWJsb2NrLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICBjb2RlYmxvY2sgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2RldGFiJykoY29kZWJsb2NrLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICBjb2RlYmxvY2sgPSBjb2RlYmxvY2sucmVwbGFjZSgvXlxcbisvZywgJycpOyAvLyB0cmltIGxlYWRpbmcgbmV3bGluZXNcbiAgICBjb2RlYmxvY2sgPSBjb2RlYmxvY2sucmVwbGFjZSgvXFxuKyQvZywgJycpOyAvLyB0cmltIHRyYWlsaW5nIHdoaXRlc3BhY2VcblxuICAgIGNvZGVibG9jayA9ICc8cHJlPjxjb2RlJyArIChsYW5ndWFnZSA/ICcgY2xhc3M9XCInICsgbGFuZ3VhZ2UgKyAnIGxhbmd1YWdlLScgKyBsYW5ndWFnZSArICdcIicgOiAnJykgKyAnPicgKyBjb2RlYmxvY2sgKyBlbmQgKyAnPC9jb2RlPjwvcHJlPic7XG5cbiAgICBjb2RlYmxvY2sgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hCbG9jaycpKGNvZGVibG9jaywgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgICAvLyBTaW5jZSBHSENvZGVibG9ja3MgY2FuIGJlIGZhbHNlIHBvc2l0aXZlcywgd2UgbmVlZCB0b1xuICAgIC8vIHN0b3JlIHRoZSBwcmltaXRpdmUgdGV4dCBhbmQgdGhlIHBhcnNlZCB0ZXh0IGluIGEgZ2xvYmFsIHZhcixcbiAgICAvLyBhbmQgdGhlbiByZXR1cm4gYSB0b2tlblxuICAgIHJldHVybiAnXFxuXFxuwqhHJyArIChnbG9iYWxzLmdoQ29kZUJsb2Nrcy5wdXNoKHt0ZXh0OiB3aG9sZU1hdGNoLCBjb2RlYmxvY2s6IGNvZGVibG9ja30pIC0gMSkgKyAnR1xcblxcbic7XG4gIH0pO1xuXG4gIC8vIGF0dGFja2xhYjogc3RyaXAgc2VudGluZWxcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqgwLywgJycpO1xuXG4gIHJldHVybiBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2dpdGh1YkNvZGVCbG9ja3MuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignaGFzaEJsb2NrJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoQmxvY2suYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyheXFxuK3xcXG4rJCkvZywgJycpO1xuICB0ZXh0ID0gJ1xcblxcbsKoSycgKyAoZ2xvYmFscy5nSHRtbEJsb2Nrcy5wdXNoKHRleHQpIC0gMSkgKyAnS1xcblxcbic7XG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2hhc2hCbG9jay5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogSGFzaCBhbmQgZXNjYXBlIDxjb2RlPiBlbGVtZW50cyB0aGF0IHNob3VsZCBub3QgYmUgcGFyc2VkIGFzIG1hcmtkb3duXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignaGFzaENvZGVUYWdzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoQ29kZVRhZ3MuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgdmFyIHJlcEZ1bmMgPSBmdW5jdGlvbiAod2hvbGVNYXRjaCwgbWF0Y2gsIGxlZnQsIHJpZ2h0KSB7XG4gICAgdmFyIGNvZGVibG9jayA9IGxlZnQgKyBzaG93ZG93bi5zdWJQYXJzZXIoJ2VuY29kZUNvZGUnKShtYXRjaCwgb3B0aW9ucywgZ2xvYmFscykgKyByaWdodDtcbiAgICByZXR1cm4gJ8KoQycgKyAoZ2xvYmFscy5nSHRtbFNwYW5zLnB1c2goY29kZWJsb2NrKSAtIDEpICsgJ0MnO1xuICB9O1xuXG4gIC8vIEhhc2ggbmFrZWQgPGNvZGU+XG4gIHRleHQgPSBzaG93ZG93bi5oZWxwZXIucmVwbGFjZVJlY3Vyc2l2ZVJlZ0V4cCh0ZXh0LCByZXBGdW5jLCAnPGNvZGVcXFxcYltePl0qPicsICc8L2NvZGU+JywgJ2dpbScpO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2hhc2hDb2RlVGFncy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignaGFzaEVsZW1lbnQnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBtMSkge1xuICAgIHZhciBibG9ja1RleHQgPSBtMTtcblxuICAgIC8vIFVuZG8gZG91YmxlIGxpbmVzXG4gICAgYmxvY2tUZXh0ID0gYmxvY2tUZXh0LnJlcGxhY2UoL1xcblxcbi9nLCAnXFxuJyk7XG4gICAgYmxvY2tUZXh0ID0gYmxvY2tUZXh0LnJlcGxhY2UoL15cXG4vLCAnJyk7XG5cbiAgICAvLyBzdHJpcCB0cmFpbGluZyBibGFuayBsaW5lc1xuICAgIGJsb2NrVGV4dCA9IGJsb2NrVGV4dC5yZXBsYWNlKC9cXG4rJC9nLCAnJyk7XG5cbiAgICAvLyBSZXBsYWNlIHRoZSBlbGVtZW50IHRleHQgd2l0aCBhIG1hcmtlciAoXCLCqEt4S1wiIHdoZXJlIHggaXMgaXRzIGtleSlcbiAgICBibG9ja1RleHQgPSAnXFxuXFxuwqhLJyArIChnbG9iYWxzLmdIdG1sQmxvY2tzLnB1c2goYmxvY2tUZXh0KSAtIDEpICsgJ0tcXG5cXG4nO1xuXG4gICAgcmV0dXJuIGJsb2NrVGV4dDtcbiAgfTtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignaGFzaEhUTUxCbG9ja3MnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2hhc2hIVE1MQmxvY2tzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHZhciBibG9ja1RhZ3MgPSBbXG4gICAgICAgICdwcmUnLFxuICAgICAgICAnZGl2JyxcbiAgICAgICAgJ2gxJyxcbiAgICAgICAgJ2gyJyxcbiAgICAgICAgJ2gzJyxcbiAgICAgICAgJ2g0JyxcbiAgICAgICAgJ2g1JyxcbiAgICAgICAgJ2g2JyxcbiAgICAgICAgJ2Jsb2NrcXVvdGUnLFxuICAgICAgICAndGFibGUnLFxuICAgICAgICAnZGwnLFxuICAgICAgICAnb2wnLFxuICAgICAgICAndWwnLFxuICAgICAgICAnc2NyaXB0JyxcbiAgICAgICAgJ25vc2NyaXB0JyxcbiAgICAgICAgJ2Zvcm0nLFxuICAgICAgICAnZmllbGRzZXQnLFxuICAgICAgICAnaWZyYW1lJyxcbiAgICAgICAgJ21hdGgnLFxuICAgICAgICAnc3R5bGUnLFxuICAgICAgICAnc2VjdGlvbicsXG4gICAgICAgICdoZWFkZXInLFxuICAgICAgICAnZm9vdGVyJyxcbiAgICAgICAgJ25hdicsXG4gICAgICAgICdhcnRpY2xlJyxcbiAgICAgICAgJ2FzaWRlJyxcbiAgICAgICAgJ2FkZHJlc3MnLFxuICAgICAgICAnYXVkaW8nLFxuICAgICAgICAnY2FudmFzJyxcbiAgICAgICAgJ2ZpZ3VyZScsXG4gICAgICAgICdoZ3JvdXAnLFxuICAgICAgICAnb3V0cHV0JyxcbiAgICAgICAgJ3ZpZGVvJyxcbiAgICAgICAgJ3AnXG4gICAgICBdLFxuICAgICAgcmVwRnVuYyA9IGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBtYXRjaCwgbGVmdCwgcmlnaHQpIHtcbiAgICAgICAgdmFyIHR4dCA9IHdob2xlTWF0Y2g7XG4gICAgICAgIC8vIGNoZWNrIGlmIHRoaXMgaHRtbCBlbGVtZW50IGlzIG1hcmtlZCBhcyBtYXJrZG93blxuICAgICAgICAvLyBpZiBzbywgaXQncyBjb250ZW50cyBzaG91bGQgYmUgcGFyc2VkIGFzIG1hcmtkb3duXG4gICAgICAgIGlmIChsZWZ0LnNlYXJjaCgvXFxibWFya2Rvd25cXGIvKSAhPT0gLTEpIHtcbiAgICAgICAgICB0eHQgPSBsZWZ0ICsgZ2xvYmFscy5jb252ZXJ0ZXIubWFrZUh0bWwobWF0Y2gpICsgcmlnaHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdcXG5cXG7CqEsnICsgKGdsb2JhbHMuZ0h0bWxCbG9ja3MucHVzaCh0eHQpIC0gMSkgKyAnS1xcblxcbic7XG4gICAgICB9O1xuXG4gIGlmIChvcHRpb25zLmJhY2tzbGFzaEVzY2FwZXNIVE1MVGFncykge1xuICAgIC8vIGVuY29kZSBiYWNrc2xhc2ggZXNjYXBlZCBIVE1MIHRhZ3NcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXFxcPChcXC8/W14+XSs/KT4vZywgZnVuY3Rpb24gKHdtLCBpbnNpZGUpIHtcbiAgICAgIHJldHVybiAnJmx0OycgKyBpbnNpZGUgKyAnJmd0Oyc7XG4gICAgfSk7XG4gIH1cblxuICAvLyBoYXNoIEhUTUwgQmxvY2tzXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tUYWdzLmxlbmd0aDsgKytpKSB7XG5cbiAgICB2YXIgb3BUYWdQb3MsXG4gICAgICAgIHJneDEgICAgID0gbmV3IFJlZ0V4cCgnXiB7MCwzfSg8JyArIGJsb2NrVGFnc1tpXSArICdcXFxcYltePl0qPiknLCAnaW0nKSxcbiAgICAgICAgcGF0TGVmdCAgPSAnPCcgKyBibG9ja1RhZ3NbaV0gKyAnXFxcXGJbXj5dKj4nLFxuICAgICAgICBwYXRSaWdodCA9ICc8LycgKyBibG9ja1RhZ3NbaV0gKyAnPic7XG4gICAgLy8gMS4gTG9vayBmb3IgdGhlIGZpcnN0IHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvcGVuaW5nIEhUTUwgdGFnIGluIHRoZSB0ZXh0XG4gICAgd2hpbGUgKChvcFRhZ1BvcyA9IHNob3dkb3duLmhlbHBlci5yZWdleEluZGV4T2YodGV4dCwgcmd4MSkpICE9PSAtMSkge1xuXG4gICAgICAvLyBpZiB0aGUgSFRNTCB0YWcgaXMgXFwgZXNjYXBlZCwgd2UgbmVlZCB0byBlc2NhcGUgaXQgYW5kIGJyZWFrXG5cblxuICAgICAgLy8yLiBTcGxpdCB0aGUgdGV4dCBpbiB0aGF0IHBvc2l0aW9uXG4gICAgICB2YXIgc3ViVGV4dHMgPSBzaG93ZG93bi5oZWxwZXIuc3BsaXRBdEluZGV4KHRleHQsIG9wVGFnUG9zKSxcbiAgICAgICAgICAvLzMuIE1hdGNoIHJlY3Vyc2l2ZWx5XG4gICAgICAgICAgbmV3U3ViVGV4dDEgPSBzaG93ZG93bi5oZWxwZXIucmVwbGFjZVJlY3Vyc2l2ZVJlZ0V4cChzdWJUZXh0c1sxXSwgcmVwRnVuYywgcGF0TGVmdCwgcGF0UmlnaHQsICdpbScpO1xuXG4gICAgICAvLyBwcmV2ZW50IGFuIGluZmluaXRlIGxvb3BcbiAgICAgIGlmIChuZXdTdWJUZXh0MSA9PT0gc3ViVGV4dHNbMV0pIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB0ZXh0ID0gc3ViVGV4dHNbMF0uY29uY2F0KG5ld1N1YlRleHQxKTtcbiAgICB9XG4gIH1cbiAgLy8gSFIgU1BFQ0lBTCBDQVNFXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhcXG4gezAsM30oPChocilcXGIoW148Pl0pKj9cXC8/PilbIFxcdF0qKD89XFxuezIsfSkpL2csXG4gICAgc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoRWxlbWVudCcpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpKTtcblxuICAvLyBTcGVjaWFsIGNhc2UgZm9yIHN0YW5kYWxvbmUgSFRNTCBjb21tZW50c1xuICB0ZXh0ID0gc2hvd2Rvd24uaGVscGVyLnJlcGxhY2VSZWN1cnNpdmVSZWdFeHAodGV4dCwgZnVuY3Rpb24gKHR4dCkge1xuICAgIHJldHVybiAnXFxuXFxuwqhLJyArIChnbG9iYWxzLmdIdG1sQmxvY2tzLnB1c2godHh0KSAtIDEpICsgJ0tcXG5cXG4nO1xuICB9LCAnXiB7MCwzfTwhLS0nLCAnLS0+JywgJ2dtJyk7XG5cbiAgLy8gUEhQIGFuZCBBU1Atc3R5bGUgcHJvY2Vzc29yIGluc3RydWN0aW9ucyAoPD8uLi4/PiBhbmQgPCUuLi4lPilcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvKD86XFxuXFxuKSggezAsM30oPzo8KFs/JV0pW15cXHJdKj9cXDI+KVsgXFx0XSooPz1cXG57Mix9KSkvZyxcbiAgICBzaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hFbGVtZW50JykodGV4dCwgb3B0aW9ucywgZ2xvYmFscykpO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2hhc2hIVE1MQmxvY2tzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBIYXNoIHNwYW4gZWxlbWVudHMgdGhhdCBzaG91bGQgbm90IGJlIHBhcnNlZCBhcyBtYXJrZG93blxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hIVE1MU3BhbnMnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2hhc2hIVE1MU3BhbnMuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgZnVuY3Rpb24gaGFzaEhUTUxTcGFuIChodG1sKSB7XG4gICAgcmV0dXJuICfCqEMnICsgKGdsb2JhbHMuZ0h0bWxTcGFucy5wdXNoKGh0bWwpIC0gMSkgKyAnQyc7XG4gIH1cblxuICAvLyBIYXNoIFNlbGYgQ2xvc2luZyB0YWdzXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzxbXj5dKz9cXC8+L2dpLCBmdW5jdGlvbiAod20pIHtcbiAgICByZXR1cm4gaGFzaEhUTUxTcGFuKHdtKTtcbiAgfSk7XG5cbiAgLy8gSGFzaCB0YWdzIHdpdGhvdXQgcHJvcGVydGllc1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88KFtePl0rPyk+W1xcc1xcU10qPzxcXC9cXDE+L2csIGZ1bmN0aW9uICh3bSkge1xuICAgIHJldHVybiBoYXNoSFRNTFNwYW4od20pO1xuICB9KTtcblxuICAvLyBIYXNoIHRhZ3Mgd2l0aCBwcm9wZXJ0aWVzXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoLzwoW14+XSs/KVxcc1tePl0rPz5bXFxzXFxTXSo/PFxcL1xcMT4vZywgZnVuY3Rpb24gKHdtKSB7XG4gICAgcmV0dXJuIGhhc2hIVE1MU3Bhbih3bSk7XG4gIH0pO1xuXG4gIC8vIEhhc2ggc2VsZiBjbG9zaW5nIHRhZ3Mgd2l0aG91dCAvPlxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC88W14+XSs/Pi9naSwgZnVuY3Rpb24gKHdtKSB7XG4gICAgcmV0dXJuIGhhc2hIVE1MU3Bhbih3bSk7XG4gIH0pO1xuXG4gIC8qc2hvd2Rvd24uaGVscGVyLm1hdGNoUmVjdXJzaXZlUmVnRXhwKHRleHQsICc8Y29kZVxcXFxiW14+XSo+JywgJzwvY29kZT4nLCAnZ2knKTsqL1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2hhc2hIVE1MU3BhbnMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxuLyoqXG4gKiBVbmhhc2ggSFRNTCBzcGFuc1xuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ3VuaGFzaEhUTUxTcGFucycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgndW5oYXNoSFRNTFNwYW5zLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgZ2xvYmFscy5nSHRtbFNwYW5zLmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHJlcFRleHQgPSBnbG9iYWxzLmdIdG1sU3BhbnNbaV0sXG4gICAgICAgIC8vIGxpbWl0ZXIgdG8gcHJldmVudCBpbmZpbml0ZSBsb29wIChhc3N1bWUgMTAgYXMgbGltaXQgZm9yIHJlY3Vyc2UpXG4gICAgICAgIGxpbWl0ID0gMDtcblxuICAgIHdoaWxlICgvwqhDKFxcZCspQy8udGVzdChyZXBUZXh0KSkge1xuICAgICAgdmFyIG51bSA9IFJlZ0V4cC4kMTtcbiAgICAgIHJlcFRleHQgPSByZXBUZXh0LnJlcGxhY2UoJ8KoQycgKyBudW0gKyAnQycsIGdsb2JhbHMuZ0h0bWxTcGFuc1tudW1dKTtcbiAgICAgIGlmIChsaW1pdCA9PT0gMTApIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignbWF4aW11bSBuZXN0aW5nIG9mIDEwIHNwYW5zIHJlYWNoZWQhISEnKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICArK2xpbWl0O1xuICAgIH1cbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKCfCqEMnICsgaSArICdDJywgcmVwVGV4dCk7XG4gIH1cblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCd1bmhhc2hIVE1MU3BhbnMuYWZ0ZXInLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgcmV0dXJuIHRleHQ7XG59KTtcblxyXG4vKipcbiAqIEhhc2ggYW5kIGVzY2FwZSA8cHJlPjxjb2RlPiBlbGVtZW50cyB0aGF0IHNob3VsZCBub3QgYmUgcGFyc2VkIGFzIG1hcmtkb3duXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignaGFzaFByZUNvZGVUYWdzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoYXNoUHJlQ29kZVRhZ3MuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgdmFyIHJlcEZ1bmMgPSBmdW5jdGlvbiAod2hvbGVNYXRjaCwgbWF0Y2gsIGxlZnQsIHJpZ2h0KSB7XG4gICAgLy8gZW5jb2RlIGh0bWwgZW50aXRpZXNcbiAgICB2YXIgY29kZWJsb2NrID0gbGVmdCArIHNob3dkb3duLnN1YlBhcnNlcignZW5jb2RlQ29kZScpKG1hdGNoLCBvcHRpb25zLCBnbG9iYWxzKSArIHJpZ2h0O1xuICAgIHJldHVybiAnXFxuXFxuwqhHJyArIChnbG9iYWxzLmdoQ29kZUJsb2Nrcy5wdXNoKHt0ZXh0OiB3aG9sZU1hdGNoLCBjb2RlYmxvY2s6IGNvZGVibG9ja30pIC0gMSkgKyAnR1xcblxcbic7XG4gIH07XG5cbiAgLy8gSGFzaCA8cHJlPjxjb2RlPlxuICB0ZXh0ID0gc2hvd2Rvd24uaGVscGVyLnJlcGxhY2VSZWN1cnNpdmVSZWdFeHAodGV4dCwgcmVwRnVuYywgJ14gezAsM308cHJlXFxcXGJbXj5dKj5cXFxccyo8Y29kZVxcXFxiW14+XSo+JywgJ14gezAsM308L2NvZGU+XFxcXHMqPC9wcmU+JywgJ2dpbScpO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2hhc2hQcmVDb2RlVGFncy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignaGVhZGVycycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdoZWFkZXJzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHZhciBoZWFkZXJMZXZlbFN0YXJ0ID0gKGlzTmFOKHBhcnNlSW50KG9wdGlvbnMuaGVhZGVyTGV2ZWxTdGFydCkpKSA/IDEgOiBwYXJzZUludChvcHRpb25zLmhlYWRlckxldmVsU3RhcnQpLFxuXG4gICAgICAvLyBTZXQgdGV4dC1zdHlsZSBoZWFkZXJzOlxuICAgICAgLy9cdEhlYWRlciAxXG4gICAgICAvL1x0PT09PT09PT1cbiAgICAgIC8vXG4gICAgICAvL1x0SGVhZGVyIDJcbiAgICAgIC8vXHQtLS0tLS0tLVxuICAgICAgLy9cbiAgICAgIHNldGV4dFJlZ2V4SDEgPSAob3B0aW9ucy5zbW9vdGhMaXZlUHJldmlldykgPyAvXiguKylbIFxcdF0qXFxuPXsyLH1bIFxcdF0qXFxuKy9nbSA6IC9eKC4rKVsgXFx0XSpcXG49K1sgXFx0XSpcXG4rL2dtLFxuICAgICAgc2V0ZXh0UmVnZXhIMiA9IChvcHRpb25zLnNtb290aExpdmVQcmV2aWV3KSA/IC9eKC4rKVsgXFx0XSpcXG4tezIsfVsgXFx0XSpcXG4rL2dtIDogL14oLispWyBcXHRdKlxcbi0rWyBcXHRdKlxcbisvZ207XG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZShzZXRleHRSZWdleEgxLCBmdW5jdGlvbiAod2hvbGVNYXRjaCwgbTEpIHtcblxuICAgIHZhciBzcGFuR2FtdXQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3NwYW5HYW11dCcpKG0xLCBvcHRpb25zLCBnbG9iYWxzKSxcbiAgICAgICAgaElEID0gKG9wdGlvbnMubm9IZWFkZXJJZCkgPyAnJyA6ICcgaWQ9XCInICsgaGVhZGVySWQobTEpICsgJ1wiJyxcbiAgICAgICAgaExldmVsID0gaGVhZGVyTGV2ZWxTdGFydCxcbiAgICAgICAgaGFzaEJsb2NrID0gJzxoJyArIGhMZXZlbCArIGhJRCArICc+JyArIHNwYW5HYW11dCArICc8L2gnICsgaExldmVsICsgJz4nO1xuICAgIHJldHVybiBzaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hCbG9jaycpKGhhc2hCbG9jaywgb3B0aW9ucywgZ2xvYmFscyk7XG4gIH0pO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2Uoc2V0ZXh0UmVnZXhIMiwgZnVuY3Rpb24gKG1hdGNoRm91bmQsIG0xKSB7XG4gICAgdmFyIHNwYW5HYW11dCA9IHNob3dkb3duLnN1YlBhcnNlcignc3BhbkdhbXV0JykobTEsIG9wdGlvbnMsIGdsb2JhbHMpLFxuICAgICAgICBoSUQgPSAob3B0aW9ucy5ub0hlYWRlcklkKSA/ICcnIDogJyBpZD1cIicgKyBoZWFkZXJJZChtMSkgKyAnXCInLFxuICAgICAgICBoTGV2ZWwgPSBoZWFkZXJMZXZlbFN0YXJ0ICsgMSxcbiAgICAgICAgaGFzaEJsb2NrID0gJzxoJyArIGhMZXZlbCArIGhJRCArICc+JyArIHNwYW5HYW11dCArICc8L2gnICsgaExldmVsICsgJz4nO1xuICAgIHJldHVybiBzaG93ZG93bi5zdWJQYXJzZXIoJ2hhc2hCbG9jaycpKGhhc2hCbG9jaywgb3B0aW9ucywgZ2xvYmFscyk7XG4gIH0pO1xuXG4gIC8vIGF0eC1zdHlsZSBoZWFkZXJzOlxuICAvLyAgIyBIZWFkZXIgMVxuICAvLyAgIyMgSGVhZGVyIDJcbiAgLy8gICMjIEhlYWRlciAyIHdpdGggY2xvc2luZyBoYXNoZXMgIyNcbiAgLy8gIC4uLlxuICAvLyAgIyMjIyMjIEhlYWRlciA2XG4gIC8vXG4gIHZhciBhdHhTdHlsZSA9IChvcHRpb25zLnJlcXVpcmVTcGFjZUJlZm9yZUhlYWRpbmdUZXh0KSA/IC9eKCN7MSw2fSlbIFxcdF0rKC4rPylbIFxcdF0qIypcXG4rL2dtIDogL14oI3sxLDZ9KVsgXFx0XSooLis/KVsgXFx0XSojKlxcbisvZ207XG5cbiAgdGV4dCA9IHRleHQucmVwbGFjZShhdHhTdHlsZSwgZnVuY3Rpb24gKHdob2xlTWF0Y2gsIG0xLCBtMikge1xuICAgIHZhciBoVGV4dCA9IG0yO1xuICAgIGlmIChvcHRpb25zLmN1c3RvbWl6ZWRIZWFkZXJJZCkge1xuICAgICAgaFRleHQgPSBtMi5yZXBsYWNlKC9cXHM/XFx7KFtee10rPyl9XFxzKiQvLCAnJyk7XG4gICAgfVxuXG4gICAgdmFyIHNwYW4gPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3NwYW5HYW11dCcpKGhUZXh0LCBvcHRpb25zLCBnbG9iYWxzKSxcbiAgICAgICAgaElEID0gKG9wdGlvbnMubm9IZWFkZXJJZCkgPyAnJyA6ICcgaWQ9XCInICsgaGVhZGVySWQobTIpICsgJ1wiJyxcbiAgICAgICAgaExldmVsID0gaGVhZGVyTGV2ZWxTdGFydCAtIDEgKyBtMS5sZW5ndGgsXG4gICAgICAgIGhlYWRlciA9ICc8aCcgKyBoTGV2ZWwgKyBoSUQgKyAnPicgKyBzcGFuICsgJzwvaCcgKyBoTGV2ZWwgKyAnPic7XG5cbiAgICByZXR1cm4gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoQmxvY2snKShoZWFkZXIsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB9KTtcblxuICBmdW5jdGlvbiBoZWFkZXJJZCAobSkge1xuICAgIHZhciB0aXRsZSxcbiAgICAgICAgcHJlZml4O1xuXG4gICAgLy8gSXQgaXMgc2VwYXJhdGUgZnJvbSBvdGhlciBvcHRpb25zIHRvIGFsbG93IGNvbWJpbmluZyBwcmVmaXggYW5kIGN1c3RvbWl6ZWRcbiAgICBpZiAob3B0aW9ucy5jdXN0b21pemVkSGVhZGVySWQpIHtcbiAgICAgIHZhciBtYXRjaCA9IG0ubWF0Y2goL1xceyhbXntdKz8pfVxccyokLyk7XG4gICAgICBpZiAobWF0Y2ggJiYgbWF0Y2hbMV0pIHtcbiAgICAgICAgbSA9IG1hdGNoWzFdO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRpdGxlID0gbTtcblxuICAgIC8vIFByZWZpeCBpZCB0byBwcmV2ZW50IGNhdXNpbmcgaW5hZHZlcnRlbnQgcHJlLWV4aXN0aW5nIHN0eWxlIG1hdGNoZXMuXG4gICAgaWYgKHNob3dkb3duLmhlbHBlci5pc1N0cmluZyhvcHRpb25zLnByZWZpeEhlYWRlcklkKSkge1xuICAgICAgcHJlZml4ID0gb3B0aW9ucy5wcmVmaXhIZWFkZXJJZDtcbiAgICB9IGVsc2UgaWYgKG9wdGlvbnMucHJlZml4SGVhZGVySWQgPT09IHRydWUpIHtcbiAgICAgIHByZWZpeCA9ICdzZWN0aW9uLSc7XG4gICAgfSBlbHNlIHtcbiAgICAgIHByZWZpeCA9ICcnO1xuICAgIH1cblxuICAgIGlmICghb3B0aW9ucy5yYXdQcmVmaXhIZWFkZXJJZCkge1xuICAgICAgdGl0bGUgPSBwcmVmaXggKyB0aXRsZTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5naENvbXBhdGlibGVIZWFkZXJJZCkge1xuICAgICAgdGl0bGUgPSB0aXRsZVxuICAgICAgICAucmVwbGFjZSgvIC9nLCAnLScpXG4gICAgICAgIC8vIHJlcGxhY2UgcHJldmlvdXNseSBlc2NhcGVkIGNoYXJzICgmLCDCqCBhbmQgJClcbiAgICAgICAgLnJlcGxhY2UoLyZhbXA7L2csICcnKVxuICAgICAgICAucmVwbGFjZSgvwqhUL2csICcnKVxuICAgICAgICAucmVwbGFjZSgvwqhEL2csICcnKVxuICAgICAgICAvLyByZXBsYWNlIHJlc3Qgb2YgdGhlIGNoYXJzICgmfiQgYXJlIHJlcGVhdGVkIGFzIHRoZXkgbWlnaHQgaGF2ZSBiZWVuIGVzY2FwZWQpXG4gICAgICAgIC8vIGJvcnJvd2VkIGZyb20gZ2l0aHViJ3MgcmVkY2FycGV0IChzb21lIHRoZXkgc2hvdWxkIHByb2R1Y2Ugc2ltaWxhciByZXN1bHRzKVxuICAgICAgICAucmVwbGFjZSgvWyYrJCxcXC86Oz0/QFwiI3t9fF7CqH5cXFtcXF1gXFxcXCopKCUuISc8Pl0vZywgJycpXG4gICAgICAgIC50b0xvd2VyQ2FzZSgpO1xuICAgIH0gZWxzZSBpZiAob3B0aW9ucy5yYXdIZWFkZXJJZCkge1xuICAgICAgdGl0bGUgPSB0aXRsZVxuICAgICAgICAucmVwbGFjZSgvIC9nLCAnLScpXG4gICAgICAgIC8vIHJlcGxhY2UgcHJldmlvdXNseSBlc2NhcGVkIGNoYXJzICgmLCDCqCBhbmQgJClcbiAgICAgICAgLnJlcGxhY2UoLyZhbXA7L2csICcmJylcbiAgICAgICAgLnJlcGxhY2UoL8KoVC9nLCAnwqgnKVxuICAgICAgICAucmVwbGFjZSgvwqhEL2csICckJylcbiAgICAgICAgLy8gcmVwbGFjZSBcIiBhbmQgJ1xuICAgICAgICAucmVwbGFjZSgvW1wiJ10vZywgJy0nKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGl0bGUgPSB0aXRsZVxuICAgICAgICAucmVwbGFjZSgvW15cXHddL2csICcnKVxuICAgICAgICAudG9Mb3dlckNhc2UoKTtcbiAgICB9XG5cbiAgICBpZiAob3B0aW9ucy5yYXdQcmVmaXhIZWFkZXJJZCkge1xuICAgICAgdGl0bGUgPSBwcmVmaXggKyB0aXRsZTtcbiAgICB9XG5cbiAgICBpZiAoZ2xvYmFscy5oYXNoTGlua0NvdW50c1t0aXRsZV0pIHtcbiAgICAgIHRpdGxlID0gdGl0bGUgKyAnLScgKyAoZ2xvYmFscy5oYXNoTGlua0NvdW50c1t0aXRsZV0rKyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdsb2JhbHMuaGFzaExpbmtDb3VudHNbdGl0bGVdID0gMTtcbiAgICB9XG4gICAgcmV0dXJuIHRpdGxlO1xuICB9XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaGVhZGVycy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogVHVybiBNYXJrZG93biBsaW5rIHNob3J0Y3V0cyBpbnRvIFhIVE1MIDxhPiB0YWdzLlxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2hvcml6b250YWxSdWxlJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdob3Jpem9udGFsUnVsZS5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB2YXIga2V5ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoQmxvY2snKSgnPGhyIC8+Jywgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14gezAsMn0oID8tKXszLH1bIFxcdF0qJC9nbSwga2V5KTtcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXiB7MCwyfSggP1xcKil7Myx9WyBcXHRdKiQvZ20sIGtleSk7XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL14gezAsMn0oID9fKXszLH1bIFxcdF0qJC9nbSwga2V5KTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdob3Jpem9udGFsUnVsZS5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogVHVybiBNYXJrZG93biBpbWFnZSBzaG9ydGN1dHMgaW50byA8aW1nPiB0YWdzLlxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ2ltYWdlcycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdpbWFnZXMuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgdmFyIGlubGluZVJlZ0V4cCAgICAgID0gLyFcXFsoW15cXF1dKj8pXVsgXFx0XSooKVxcKFsgXFx0XT88PyhbXFxTXSs/KD86XFwoW1xcU10qP1xcKVtcXFNdKj8pPyk+Pyg/OiA9KFsqXFxkXStbQS1aYS16JV17MCw0fSl4KFsqXFxkXStbQS1aYS16JV17MCw0fSkpP1sgXFx0XSooPzooW1wiJ10pKFteXCJdKj8pXFw2KT9bIFxcdF0/XFwpL2csXG4gICAgICBjcmF6eVJlZ0V4cCAgICAgICA9IC8hXFxbKFteXFxdXSo/KV1bIFxcdF0qKClcXChbIFxcdF0/PChbXj5dKik+KD86ID0oWypcXGRdK1tBLVphLXolXXswLDR9KXgoWypcXGRdK1tBLVphLXolXXswLDR9KSk/WyBcXHRdKig/Oig/OihbXCInXSkoW15cIl0qPylcXDYpKT9bIFxcdF0/XFwpL2csXG4gICAgICBiYXNlNjRSZWdFeHAgICAgICA9IC8hXFxbKFteXFxdXSo/KV1bIFxcdF0qKClcXChbIFxcdF0/PD8oZGF0YTouKz9cXC8uKz87YmFzZTY0LFtBLVphLXowLTkrLz1cXG5dKz8pPj8oPzogPShbKlxcZF0rW0EtWmEteiVdezAsNH0peChbKlxcZF0rW0EtWmEteiVdezAsNH0pKT9bIFxcdF0qKD86KFtcIiddKShbXlwiXSo/KVxcNik/WyBcXHRdP1xcKS9nLFxuICAgICAgcmVmZXJlbmNlUmVnRXhwICAgPSAvIVxcWyhbXlxcXV0qPyldID8oPzpcXG4gKik/XFxbKFtcXHNcXFNdKj8pXSgpKCkoKSgpKCkvZyxcbiAgICAgIHJlZlNob3J0Y3V0UmVnRXhwID0gLyFcXFsoW15cXFtcXF1dKyldKCkoKSgpKCkoKS9nO1xuXG4gIGZ1bmN0aW9uIHdyaXRlSW1hZ2VUYWdCYXNlNjQgKHdob2xlTWF0Y2gsIGFsdFRleHQsIGxpbmtJZCwgdXJsLCB3aWR0aCwgaGVpZ2h0LCBtNSwgdGl0bGUpIHtcbiAgICB1cmwgPSB1cmwucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgICByZXR1cm4gd3JpdGVJbWFnZVRhZyAod2hvbGVNYXRjaCwgYWx0VGV4dCwgbGlua0lkLCB1cmwsIHdpZHRoLCBoZWlnaHQsIG01LCB0aXRsZSk7XG4gIH1cblxuICBmdW5jdGlvbiB3cml0ZUltYWdlVGFnICh3aG9sZU1hdGNoLCBhbHRUZXh0LCBsaW5rSWQsIHVybCwgd2lkdGgsIGhlaWdodCwgbTUsIHRpdGxlKSB7XG5cbiAgICB2YXIgZ1VybHMgICA9IGdsb2JhbHMuZ1VybHMsXG4gICAgICAgIGdUaXRsZXMgPSBnbG9iYWxzLmdUaXRsZXMsXG4gICAgICAgIGdEaW1zICAgPSBnbG9iYWxzLmdEaW1lbnNpb25zO1xuXG4gICAgbGlua0lkID0gbGlua0lkLnRvTG93ZXJDYXNlKCk7XG5cbiAgICBpZiAoIXRpdGxlKSB7XG4gICAgICB0aXRsZSA9ICcnO1xuICAgIH1cbiAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGV4cGxpY2l0IGVtcHR5IHVybFxuICAgIGlmICh3aG9sZU1hdGNoLnNlYXJjaCgvXFwoPD9cXHMqPj8gPyhbJ1wiXS4qWydcIl0pP1xcKSQvbSkgPiAtMSkge1xuICAgICAgdXJsID0gJyc7XG5cbiAgICB9IGVsc2UgaWYgKHVybCA9PT0gJycgfHwgdXJsID09PSBudWxsKSB7XG4gICAgICBpZiAobGlua0lkID09PSAnJyB8fCBsaW5rSWQgPT09IG51bGwpIHtcbiAgICAgICAgLy8gbG93ZXItY2FzZSBhbmQgdHVybiBlbWJlZGRlZCBuZXdsaW5lcyBpbnRvIHNwYWNlc1xuICAgICAgICBsaW5rSWQgPSBhbHRUZXh0LnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvID9cXG4vZywgJyAnKTtcbiAgICAgIH1cbiAgICAgIHVybCA9ICcjJyArIGxpbmtJZDtcblxuICAgICAgaWYgKCFzaG93ZG93bi5oZWxwZXIuaXNVbmRlZmluZWQoZ1VybHNbbGlua0lkXSkpIHtcbiAgICAgICAgdXJsID0gZ1VybHNbbGlua0lkXTtcbiAgICAgICAgaWYgKCFzaG93ZG93bi5oZWxwZXIuaXNVbmRlZmluZWQoZ1RpdGxlc1tsaW5rSWRdKSkge1xuICAgICAgICAgIHRpdGxlID0gZ1RpdGxlc1tsaW5rSWRdO1xuICAgICAgICB9XG4gICAgICAgIGlmICghc2hvd2Rvd24uaGVscGVyLmlzVW5kZWZpbmVkKGdEaW1zW2xpbmtJZF0pKSB7XG4gICAgICAgICAgd2lkdGggPSBnRGltc1tsaW5rSWRdLndpZHRoO1xuICAgICAgICAgIGhlaWdodCA9IGdEaW1zW2xpbmtJZF0uaGVpZ2h0O1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gd2hvbGVNYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBhbHRUZXh0ID0gYWx0VGV4dFxuICAgICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKVxuICAgIC8vYWx0VGV4dCA9IHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzKGFsdFRleHQsICcqXycsIGZhbHNlKTtcbiAgICAgIC5yZXBsYWNlKHNob3dkb3duLmhlbHBlci5yZWdleGVzLmFzdGVyaXNrRGFzaEFuZENvbG9uLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcbiAgICAvL3VybCA9IHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzKHVybCwgJypfJywgZmFsc2UpO1xuICAgIHVybCA9IHVybC5yZXBsYWNlKHNob3dkb3duLmhlbHBlci5yZWdleGVzLmFzdGVyaXNrRGFzaEFuZENvbG9uLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcbiAgICB2YXIgcmVzdWx0ID0gJzxpbWcgc3JjPVwiJyArIHVybCArICdcIiBhbHQ9XCInICsgYWx0VGV4dCArICdcIic7XG5cbiAgICBpZiAodGl0bGUgJiYgc2hvd2Rvd24uaGVscGVyLmlzU3RyaW5nKHRpdGxlKSkge1xuICAgICAgdGl0bGUgPSB0aXRsZVxuICAgICAgICAucmVwbGFjZSgvXCIvZywgJyZxdW90OycpXG4gICAgICAvL3RpdGxlID0gc2hvd2Rvd24uaGVscGVyLmVzY2FwZUNoYXJhY3RlcnModGl0bGUsICcqXycsIGZhbHNlKTtcbiAgICAgICAgLnJlcGxhY2Uoc2hvd2Rvd24uaGVscGVyLnJlZ2V4ZXMuYXN0ZXJpc2tEYXNoQW5kQ29sb24sIHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spO1xuICAgICAgcmVzdWx0ICs9ICcgdGl0bGU9XCInICsgdGl0bGUgKyAnXCInO1xuICAgIH1cblxuICAgIGlmICh3aWR0aCAmJiBoZWlnaHQpIHtcbiAgICAgIHdpZHRoICA9ICh3aWR0aCA9PT0gJyonKSA/ICdhdXRvJyA6IHdpZHRoO1xuICAgICAgaGVpZ2h0ID0gKGhlaWdodCA9PT0gJyonKSA/ICdhdXRvJyA6IGhlaWdodDtcblxuICAgICAgcmVzdWx0ICs9ICcgd2lkdGg9XCInICsgd2lkdGggKyAnXCInO1xuICAgICAgcmVzdWx0ICs9ICcgaGVpZ2h0PVwiJyArIGhlaWdodCArICdcIic7XG4gICAgfVxuXG4gICAgcmVzdWx0ICs9ICcgLz4nO1xuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIEZpcnN0LCBoYW5kbGUgcmVmZXJlbmNlLXN0eWxlIGxhYmVsZWQgaW1hZ2VzOiAhW2FsdCB0ZXh0XVtpZF1cbiAgdGV4dCA9IHRleHQucmVwbGFjZShyZWZlcmVuY2VSZWdFeHAsIHdyaXRlSW1hZ2VUYWcpO1xuXG4gIC8vIE5leHQsIGhhbmRsZSBpbmxpbmUgaW1hZ2VzOiAgIVthbHQgdGV4dF0odXJsID08d2lkdGg+eDxoZWlnaHQ+IFwib3B0aW9uYWwgdGl0bGVcIilcblxuICAvLyBiYXNlNjQgZW5jb2RlZCBpbWFnZXNcbiAgdGV4dCA9IHRleHQucmVwbGFjZShiYXNlNjRSZWdFeHAsIHdyaXRlSW1hZ2VUYWdCYXNlNjQpO1xuXG4gIC8vIGNhc2VzIHdpdGggY3JhenkgdXJscyBsaWtlIC4vaW1hZ2UvY2F0MSkucG5nXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoY3JhenlSZWdFeHAsIHdyaXRlSW1hZ2VUYWcpO1xuXG4gIC8vIG5vcm1hbCBjYXNlc1xuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKGlubGluZVJlZ0V4cCwgd3JpdGVJbWFnZVRhZyk7XG5cbiAgLy8gaGFuZGxlIHJlZmVyZW5jZS1zdHlsZSBzaG9ydGN1dHM6ICFbaW1nIHRleHRdXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UocmVmU2hvcnRjdXRSZWdFeHAsIHdyaXRlSW1hZ2VUYWcpO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2ltYWdlcy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignaXRhbGljc0FuZEJvbGQnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnaXRhbGljc0FuZEJvbGQuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gaXQncyBmYXN0ZXIgdG8gaGF2ZSAzIHNlcGFyYXRlIHJlZ2V4ZXMgZm9yIGVhY2ggY2FzZSB0aGFuIGhhdmUganVzdCBvbmVcbiAgLy8gYmVjYXVzZSBvZiBiYWNrdHJhY2luZywgaW4gc29tZSBjYXNlcywgaXQgY291bGQgbGVhZCB0byBhbiBleHBvbmVudGlhbCBlZmZlY3RcbiAgLy8gY2FsbGVkIFwiY2F0YXN0cm9waGljIGJhY2t0cmFjZVwiLiBPbWlub3VzIVxuXG4gIGZ1bmN0aW9uIHBhcnNlSW5zaWRlICh0eHQsIGxlZnQsIHJpZ2h0KSB7XG4gICAgLypcbiAgICBpZiAob3B0aW9ucy5zaW1wbGlmaWVkQXV0b0xpbmspIHtcbiAgICAgIHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignc2ltcGxpZmllZEF1dG9MaW5rcycpKHR4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgfVxuICAgICovXG4gICAgcmV0dXJuIGxlZnQgKyB0eHQgKyByaWdodDtcbiAgfVxuXG4gIC8vIFBhcnNlIHVuZGVyc2NvcmVzXG4gIGlmIChvcHRpb25zLmxpdGVyYWxNaWRXb3JkVW5kZXJzY29yZXMpIHtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXGJfX18oXFxTW1xcc1xcU10qPylfX19cXGIvZywgZnVuY3Rpb24gKHdtLCB0eHQpIHtcbiAgICAgIHJldHVybiBwYXJzZUluc2lkZSAodHh0LCAnPHN0cm9uZz48ZW0+JywgJzwvZW0+PC9zdHJvbmc+Jyk7XG4gICAgfSk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxiX18oXFxTW1xcc1xcU10qPylfX1xcYi9nLCBmdW5jdGlvbiAod20sIHR4dCkge1xuICAgICAgcmV0dXJuIHBhcnNlSW5zaWRlICh0eHQsICc8c3Ryb25nPicsICc8L3N0cm9uZz4nKTtcbiAgICB9KTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXGJfKFxcU1tcXHNcXFNdKj8pX1xcYi9nLCBmdW5jdGlvbiAod20sIHR4dCkge1xuICAgICAgcmV0dXJuIHBhcnNlSW5zaWRlICh0eHQsICc8ZW0+JywgJzwvZW0+Jyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvX19fKFxcU1tcXHNcXFNdKj8pX19fL2csIGZ1bmN0aW9uICh3bSwgbSkge1xuICAgICAgcmV0dXJuICgvXFxTJC8udGVzdChtKSkgPyBwYXJzZUluc2lkZSAobSwgJzxzdHJvbmc+PGVtPicsICc8L2VtPjwvc3Ryb25nPicpIDogd207XG4gICAgfSk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvX18oXFxTW1xcc1xcU10qPylfXy9nLCBmdW5jdGlvbiAod20sIG0pIHtcbiAgICAgIHJldHVybiAoL1xcUyQvLnRlc3QobSkpID8gcGFyc2VJbnNpZGUgKG0sICc8c3Ryb25nPicsICc8L3N0cm9uZz4nKSA6IHdtO1xuICAgIH0pO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL18oW15cXHNfXVtcXHNcXFNdKj8pXy9nLCBmdW5jdGlvbiAod20sIG0pIHtcbiAgICAgIC8vICEvXl9bXl9dLy50ZXN0KG0pIC0gdGVzdCBpZiBpdCBkb2Vzbid0IHN0YXJ0IHdpdGggX18gKHNpbmNlIGl0IHNlZW1zIHJlZHVuZGFudCwgd2UgcmVtb3ZlZCBpdClcbiAgICAgIHJldHVybiAoL1xcUyQvLnRlc3QobSkpID8gcGFyc2VJbnNpZGUgKG0sICc8ZW0+JywgJzwvZW0+JykgOiB3bTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIE5vdyBwYXJzZSBhc3Rlcmlza3NcbiAgaWYgKG9wdGlvbnMubGl0ZXJhbE1pZFdvcmRBc3Rlcmlza3MpIHtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oW14qXXxeKVxcQlxcKlxcKlxcKihcXFNbXFxzXFxTXSo/KVxcKlxcKlxcKlxcQig/IVxcKikvZywgZnVuY3Rpb24gKHdtLCBsZWFkLCB0eHQpIHtcbiAgICAgIHJldHVybiBwYXJzZUluc2lkZSAodHh0LCBsZWFkICsgJzxzdHJvbmc+PGVtPicsICc8L2VtPjwvc3Ryb25nPicpO1xuICAgIH0pO1xuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoLyhbXipdfF4pXFxCXFwqXFwqKFxcU1tcXHNcXFNdKj8pXFwqXFwqXFxCKD8hXFwqKS9nLCBmdW5jdGlvbiAod20sIGxlYWQsIHR4dCkge1xuICAgICAgcmV0dXJuIHBhcnNlSW5zaWRlICh0eHQsIGxlYWQgKyAnPHN0cm9uZz4nLCAnPC9zdHJvbmc+Jyk7XG4gICAgfSk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFteKl18XilcXEJcXCooXFxTW1xcc1xcU10qPylcXCpcXEIoPyFcXCopL2csIGZ1bmN0aW9uICh3bSwgbGVhZCwgdHh0KSB7XG4gICAgICByZXR1cm4gcGFyc2VJbnNpZGUgKHR4dCwgbGVhZCArICc8ZW0+JywgJzwvZW0+Jyk7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFwqXFwqXFwqKFxcU1tcXHNcXFNdKj8pXFwqXFwqXFwqL2csIGZ1bmN0aW9uICh3bSwgbSkge1xuICAgICAgcmV0dXJuICgvXFxTJC8udGVzdChtKSkgPyBwYXJzZUluc2lkZSAobSwgJzxzdHJvbmc+PGVtPicsICc8L2VtPjwvc3Ryb25nPicpIDogd207XG4gICAgfSk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFwqXFwqKFxcU1tcXHNcXFNdKj8pXFwqXFwqL2csIGZ1bmN0aW9uICh3bSwgbSkge1xuICAgICAgcmV0dXJuICgvXFxTJC8udGVzdChtKSkgPyBwYXJzZUluc2lkZSAobSwgJzxzdHJvbmc+JywgJzwvc3Ryb25nPicpIDogd207XG4gICAgfSk7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFwqKFteXFxzKl1bXFxzXFxTXSo/KVxcKi9nLCBmdW5jdGlvbiAod20sIG0pIHtcbiAgICAgIC8vICEvXlxcKlteKl0vLnRlc3QobSkgLSB0ZXN0IGlmIGl0IGRvZXNuJ3Qgc3RhcnQgd2l0aCAqKiAoc2luY2UgaXQgc2VlbXMgcmVkdW5kYW50LCB3ZSByZW1vdmVkIGl0KVxuICAgICAgcmV0dXJuICgvXFxTJC8udGVzdChtKSkgPyBwYXJzZUluc2lkZSAobSwgJzxlbT4nLCAnPC9lbT4nKSA6IHdtO1xuICAgIH0pO1xuICB9XG5cblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdpdGFsaWNzQW5kQm9sZC5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogRm9ybSBIVE1MIG9yZGVyZWQgKG51bWJlcmVkKSBhbmQgdW5vcmRlcmVkIChidWxsZXRlZCkgbGlzdHMuXG4gKi9cbnNob3dkb3duLnN1YlBhcnNlcignbGlzdHMnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIFByb2Nlc3MgdGhlIGNvbnRlbnRzIG9mIGEgc2luZ2xlIG9yZGVyZWQgb3IgdW5vcmRlcmVkIGxpc3QsIHNwbGl0dGluZyBpdFxuICAgKiBpbnRvIGluZGl2aWR1YWwgbGlzdCBpdGVtcy5cbiAgICogQHBhcmFtIHtzdHJpbmd9IGxpc3RTdHJcbiAgICogQHBhcmFtIHtib29sZWFufSB0cmltVHJhaWxpbmdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NMaXN0SXRlbXMgKGxpc3RTdHIsIHRyaW1UcmFpbGluZykge1xuICAgIC8vIFRoZSAkZ19saXN0X2xldmVsIGdsb2JhbCBrZWVwcyB0cmFjayBvZiB3aGVuIHdlJ3JlIGluc2lkZSBhIGxpc3QuXG4gICAgLy8gRWFjaCB0aW1lIHdlIGVudGVyIGEgbGlzdCwgd2UgaW5jcmVtZW50IGl0OyB3aGVuIHdlIGxlYXZlIGEgbGlzdCxcbiAgICAvLyB3ZSBkZWNyZW1lbnQuIElmIGl0J3MgemVybywgd2UncmUgbm90IGluIGEgbGlzdCBhbnltb3JlLlxuICAgIC8vXG4gICAgLy8gV2UgZG8gdGhpcyBiZWNhdXNlIHdoZW4gd2UncmUgbm90IGluc2lkZSBhIGxpc3QsIHdlIHdhbnQgdG8gdHJlYXRcbiAgICAvLyBzb21ldGhpbmcgbGlrZSB0aGlzOlxuICAgIC8vXG4gICAgLy8gICAgSSByZWNvbW1lbmQgdXBncmFkaW5nIHRvIHZlcnNpb25cbiAgICAvLyAgICA4LiBPb3BzLCBub3cgdGhpcyBsaW5lIGlzIHRyZWF0ZWRcbiAgICAvLyAgICBhcyBhIHN1Yi1saXN0LlxuICAgIC8vXG4gICAgLy8gQXMgYSBzaW5nbGUgcGFyYWdyYXBoLCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgdGhlIHNlY29uZCBsaW5lIHN0YXJ0c1xuICAgIC8vIHdpdGggYSBkaWdpdC1wZXJpb2Qtc3BhY2Ugc2VxdWVuY2UuXG4gICAgLy9cbiAgICAvLyBXaGVyZWFzIHdoZW4gd2UncmUgaW5zaWRlIGEgbGlzdCAob3Igc3ViLWxpc3QpLCB0aGF0IGxpbmUgd2lsbCBiZVxuICAgIC8vIHRyZWF0ZWQgYXMgdGhlIHN0YXJ0IG9mIGEgc3ViLWxpc3QuIFdoYXQgYSBrbHVkZ2UsIGh1aD8gVGhpcyBpc1xuICAgIC8vIGFuIGFzcGVjdCBvZiBNYXJrZG93bidzIHN5bnRheCB0aGF0J3MgaGFyZCB0byBwYXJzZSBwZXJmZWN0bHlcbiAgICAvLyB3aXRob3V0IHJlc29ydGluZyB0byBtaW5kLXJlYWRpbmcuIFBlcmhhcHMgdGhlIHNvbHV0aW9uIGlzIHRvXG4gICAgLy8gY2hhbmdlIHRoZSBzeW50YXggcnVsZXMgc3VjaCB0aGF0IHN1Yi1saXN0cyBtdXN0IHN0YXJ0IHdpdGggYVxuICAgIC8vIHN0YXJ0aW5nIGNhcmRpbmFsIG51bWJlcjsgZS5nLiBcIjEuXCIgb3IgXCJhLlwiLlxuICAgIGdsb2JhbHMuZ0xpc3RMZXZlbCsrO1xuXG4gICAgLy8gdHJpbSB0cmFpbGluZyBibGFuayBsaW5lczpcbiAgICBsaXN0U3RyID0gbGlzdFN0ci5yZXBsYWNlKC9cXG57Mix9JC8sICdcXG4nKTtcblxuICAgIC8vIGF0dGFja2xhYjogYWRkIHNlbnRpbmVsIHRvIGVtdWxhdGUgXFx6XG4gICAgbGlzdFN0ciArPSAnwqgwJztcblxuICAgIHZhciByZ3ggPSAvKFxcbik/KF4gezAsM30pKFsqKy1dfFxcZCtbLl0pWyBcXHRdKygoXFxbKHh8WHwgKT9dKT9bIFxcdF0qW15cXHJdKz8oXFxuezEsMn0pKSg/PVxcbioowqgwfCB7MCwzfShbKistXXxcXGQrWy5dKVsgXFx0XSspKS9nbSxcbiAgICAgICAgaXNQYXJhZ3JhcGhlZCA9ICgvXFxuWyBcXHRdKlxcbig/IcKoMCkvLnRlc3QobGlzdFN0cikpO1xuXG4gICAgLy8gU2luY2UgdmVyc2lvbiAxLjUsIG5lc3Rpbmcgc3VibGlzdHMgcmVxdWlyZXMgNCBzcGFjZXMgKG9yIDEgdGFiKSBpbmRlbnRhdGlvbixcbiAgICAvLyB3aGljaCBpcyBhIHN5bnRheCBicmVha2luZyBjaGFuZ2VcbiAgICAvLyBhY3RpdmF0aW5nIHRoaXMgb3B0aW9uIHJldmVydHMgdG8gb2xkIGJlaGF2aW9yXG4gICAgaWYgKG9wdGlvbnMuZGlzYWJsZUZvcmNlZDRTcGFjZXNJbmRlbnRlZFN1Ymxpc3RzKSB7XG4gICAgICByZ3ggPSAvKFxcbik/KF4gezAsM30pKFsqKy1dfFxcZCtbLl0pWyBcXHRdKygoXFxbKHh8WHwgKT9dKT9bIFxcdF0qW15cXHJdKz8oXFxuezEsMn0pKSg/PVxcbioowqgwfFxcMihbKistXXxcXGQrWy5dKVsgXFx0XSspKS9nbTtcbiAgICB9XG5cbiAgICBsaXN0U3RyID0gbGlzdFN0ci5yZXBsYWNlKHJneCwgZnVuY3Rpb24gKHdob2xlTWF0Y2gsIG0xLCBtMiwgbTMsIG00LCB0YXNrYnRuLCBjaGVja2VkKSB7XG4gICAgICBjaGVja2VkID0gKGNoZWNrZWQgJiYgY2hlY2tlZC50cmltKCkgIT09ICcnKTtcblxuICAgICAgdmFyIGl0ZW0gPSBzaG93ZG93bi5zdWJQYXJzZXIoJ291dGRlbnQnKShtNCwgb3B0aW9ucywgZ2xvYmFscyksXG4gICAgICAgICAgYnVsbGV0U3R5bGUgPSAnJztcblxuICAgICAgLy8gU3VwcG9ydCBmb3IgZ2l0aHViIHRhc2tsaXN0c1xuICAgICAgaWYgKHRhc2tidG4gJiYgb3B0aW9ucy50YXNrbGlzdHMpIHtcbiAgICAgICAgYnVsbGV0U3R5bGUgPSAnIGNsYXNzPVwidGFzay1saXN0LWl0ZW1cIiBzdHlsZT1cImxpc3Qtc3R5bGUtdHlwZTogbm9uZTtcIic7XG4gICAgICAgIGl0ZW0gPSBpdGVtLnJlcGxhY2UoL15bIFxcdF0qXFxbKHh8WHwgKT9dL20sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICB2YXIgb3RwID0gJzxpbnB1dCB0eXBlPVwiY2hlY2tib3hcIiBkaXNhYmxlZCBzdHlsZT1cIm1hcmdpbjogMHB4IDAuMzVlbSAwLjI1ZW0gLTEuNmVtOyB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1wiJztcbiAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgb3RwICs9ICcgY2hlY2tlZCc7XG4gICAgICAgICAgfVxuICAgICAgICAgIG90cCArPSAnPic7XG4gICAgICAgICAgcmV0dXJuIG90cDtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIElTU1VFICMzMTJcbiAgICAgIC8vIFRoaXMgaW5wdXQ6IC0gLSAtIGFcbiAgICAgIC8vIGNhdXNlcyB0cm91YmxlIHRvIHRoZSBwYXJzZXIsIHNpbmNlIGl0IGludGVycHJldHMgaXQgYXM6XG4gICAgICAvLyA8dWw+PGxpPjxsaT48bGk+YTwvbGk+PC9saT48L2xpPjwvdWw+XG4gICAgICAvLyBpbnN0ZWFkIG9mOlxuICAgICAgLy8gPHVsPjxsaT4tIC0gYTwvbGk+PC91bD5cbiAgICAgIC8vIFNvLCB0byBwcmV2ZW50IGl0LCB3ZSB3aWxsIHB1dCBhIG1hcmtlciAowqhBKWluIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmVcbiAgICAgIC8vIEtpbmQgb2YgaGFja2lzaC9tb25rZXkgcGF0Y2hpbmcsIGJ1dCBzZWVtcyBtb3JlIGVmZmVjdGl2ZSB0aGFuIG92ZXJjb21wbGljYXRpbmcgdGhlIGxpc3QgcGFyc2VyXG4gICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKC9eKFstKitdfFxcZFxcLilbIFxcdF0rW1xcU1xcbiBdKi9nLCBmdW5jdGlvbiAod20yKSB7XG4gICAgICAgIHJldHVybiAnwqhBJyArIHdtMjtcbiAgICAgIH0pO1xuXG4gICAgICAvLyBtMSAtIExlYWRpbmcgbGluZSBvclxuICAgICAgLy8gSGFzIGEgZG91YmxlIHJldHVybiAobXVsdGkgcGFyYWdyYXBoKSBvclxuICAgICAgLy8gSGFzIHN1Ymxpc3RcbiAgICAgIGlmIChtMSB8fCAoaXRlbS5zZWFyY2goL1xcbnsyLH0vKSA+IC0xKSkge1xuICAgICAgICBpdGVtID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdnaXRodWJDb2RlQmxvY2tzJykoaXRlbSwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgICAgIGl0ZW0gPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2Jsb2NrR2FtdXQnKShpdGVtLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIFJlY3Vyc2lvbiBmb3Igc3ViLWxpc3RzOlxuICAgICAgICBpdGVtID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdsaXN0cycpKGl0ZW0sIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKC9cXG4kLywgJycpOyAvLyBjaG9tcChpdGVtKVxuICAgICAgICBpdGVtID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdoYXNoSFRNTEJsb2NrcycpKGl0ZW0sIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gICAgICAgIC8vIENvbGFwc2UgZG91YmxlIGxpbmVicmVha3NcbiAgICAgICAgaXRlbSA9IGl0ZW0ucmVwbGFjZSgvXFxuXFxuKy9nLCAnXFxuXFxuJyk7XG4gICAgICAgIGlmIChpc1BhcmFncmFwaGVkKSB7XG4gICAgICAgICAgaXRlbSA9IHNob3dkb3duLnN1YlBhcnNlcigncGFyYWdyYXBocycpKGl0ZW0sIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGl0ZW0gPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3NwYW5HYW11dCcpKGl0ZW0sIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIG5vdyB3ZSBuZWVkIHRvIHJlbW92ZSB0aGUgbWFya2VyICjCqEEpXG4gICAgICBpdGVtID0gaXRlbS5yZXBsYWNlKCfCqEEnLCAnJyk7XG4gICAgICAvLyB3ZSBjYW4gZmluYWxseSB3cmFwIHRoZSBsaW5lIGluIGxpc3QgaXRlbSB0YWdzXG4gICAgICBpdGVtID0gICc8bGknICsgYnVsbGV0U3R5bGUgKyAnPicgKyBpdGVtICsgJzwvbGk+XFxuJztcblxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfSk7XG5cbiAgICAvLyBhdHRhY2tsYWI6IHN0cmlwIHNlbnRpbmVsXG4gICAgbGlzdFN0ciA9IGxpc3RTdHIucmVwbGFjZSgvwqgwL2csICcnKTtcblxuICAgIGdsb2JhbHMuZ0xpc3RMZXZlbC0tO1xuXG4gICAgaWYgKHRyaW1UcmFpbGluZykge1xuICAgICAgbGlzdFN0ciA9IGxpc3RTdHIucmVwbGFjZSgvXFxzKyQvLCAnJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGxpc3RTdHI7XG4gIH1cblxuICBmdW5jdGlvbiBzdHlsZVN0YXJ0TnVtYmVyIChsaXN0LCBsaXN0VHlwZSkge1xuICAgIC8vIGNoZWNrIGlmIG9sIGFuZCBzdGFydHMgYnkgYSBudW1iZXIgZGlmZmVyZW50IHRoYW4gMVxuICAgIGlmIChsaXN0VHlwZSA9PT0gJ29sJykge1xuICAgICAgdmFyIHJlcyA9IGxpc3QubWF0Y2goL14gKihcXGQrKVxcLi8pO1xuICAgICAgaWYgKHJlcyAmJiByZXNbMV0gIT09ICcxJykge1xuICAgICAgICByZXR1cm4gJyBzdGFydD1cIicgKyByZXNbMV0gKyAnXCInO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gJyc7XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgYW5kIHBhcnNlIGNvbnNlY3V0aXZlIGxpc3RzIChiZXR0ZXIgZml4IGZvciBpc3N1ZSAjMTQyKVxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlzdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbGlzdFR5cGVcbiAgICogQHBhcmFtIHtib29sZWFufSB0cmltVHJhaWxpbmdcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlQ29uc2VjdXRpdmVMaXN0cyAobGlzdCwgbGlzdFR5cGUsIHRyaW1UcmFpbGluZykge1xuICAgIC8vIGNoZWNrIGlmIHdlIGNhdWdodCAyIG9yIG1vcmUgY29uc2VjdXRpdmUgbGlzdHMgYnkgbWlzdGFrZVxuICAgIC8vIHdlIHVzZSB0aGUgY291bnRlclJneCwgbWVhbmluZyBpZiBsaXN0VHlwZSBpcyBVTCB3ZSBsb29rIGZvciBPTCBhbmQgdmljZSB2ZXJzYVxuICAgIHZhciBvbFJneCA9IChvcHRpb25zLmRpc2FibGVGb3JjZWQ0U3BhY2VzSW5kZW50ZWRTdWJsaXN0cykgPyAvXiA/XFxkK1xcLlsgXFx0XS9nbSA6IC9eIHswLDN9XFxkK1xcLlsgXFx0XS9nbSxcbiAgICAgICAgdWxSZ3ggPSAob3B0aW9ucy5kaXNhYmxlRm9yY2VkNFNwYWNlc0luZGVudGVkU3VibGlzdHMpID8gL14gP1sqKy1dWyBcXHRdL2dtIDogL14gezAsM31bKistXVsgXFx0XS9nbSxcbiAgICAgICAgY291bnRlclJ4ZyA9IChsaXN0VHlwZSA9PT0gJ3VsJykgPyBvbFJneCA6IHVsUmd4LFxuICAgICAgICByZXN1bHQgPSAnJztcblxuICAgIGlmIChsaXN0LnNlYXJjaChjb3VudGVyUnhnKSAhPT0gLTEpIHtcbiAgICAgIChmdW5jdGlvbiBwYXJzZUNMICh0eHQpIHtcbiAgICAgICAgdmFyIHBvcyA9IHR4dC5zZWFyY2goY291bnRlclJ4ZyksXG4gICAgICAgICAgICBzdHlsZSA9IHN0eWxlU3RhcnROdW1iZXIobGlzdCwgbGlzdFR5cGUpO1xuICAgICAgICBpZiAocG9zICE9PSAtMSkge1xuICAgICAgICAgIC8vIHNsaWNlXG4gICAgICAgICAgcmVzdWx0ICs9ICdcXG5cXG48JyArIGxpc3RUeXBlICsgc3R5bGUgKyAnPlxcbicgKyBwcm9jZXNzTGlzdEl0ZW1zKHR4dC5zbGljZSgwLCBwb3MpLCAhIXRyaW1UcmFpbGluZykgKyAnPC8nICsgbGlzdFR5cGUgKyAnPlxcbic7XG5cbiAgICAgICAgICAvLyBpbnZlcnQgY291bnRlclR5cGUgYW5kIGxpc3RUeXBlXG4gICAgICAgICAgbGlzdFR5cGUgPSAobGlzdFR5cGUgPT09ICd1bCcpID8gJ29sJyA6ICd1bCc7XG4gICAgICAgICAgY291bnRlclJ4ZyA9IChsaXN0VHlwZSA9PT0gJ3VsJykgPyBvbFJneCA6IHVsUmd4O1xuXG4gICAgICAgICAgLy9yZWN1cnNlXG4gICAgICAgICAgcGFyc2VDTCh0eHQuc2xpY2UocG9zKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmVzdWx0ICs9ICdcXG5cXG48JyArIGxpc3RUeXBlICsgc3R5bGUgKyAnPlxcbicgKyBwcm9jZXNzTGlzdEl0ZW1zKHR4dCwgISF0cmltVHJhaWxpbmcpICsgJzwvJyArIGxpc3RUeXBlICsgJz5cXG4nO1xuICAgICAgICB9XG4gICAgICB9KShsaXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIHN0eWxlID0gc3R5bGVTdGFydE51bWJlcihsaXN0LCBsaXN0VHlwZSk7XG4gICAgICByZXN1bHQgPSAnXFxuXFxuPCcgKyBsaXN0VHlwZSArIHN0eWxlICsgJz5cXG4nICsgcHJvY2Vzc0xpc3RJdGVtcyhsaXN0LCAhIXRyaW1UcmFpbGluZykgKyAnPC8nICsgbGlzdFR5cGUgKyAnPlxcbic7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8qKiBTdGFydCBvZiBsaXN0IHBhcnNpbmcgKiovXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2xpc3RzLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICAvLyBhZGQgc2VudGluZWwgdG8gaGFjayBhcm91bmQga2h0bWwvc2FmYXJpIGJ1ZzpcbiAgLy8gaHR0cDovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTEyMzFcbiAgdGV4dCArPSAnwqgwJztcblxuICBpZiAoZ2xvYmFscy5nTGlzdExldmVsKSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXigoIHswLDN9KFsqKy1dfFxcZCtbLl0pWyBcXHRdKylbXlxccl0rPyjCqDB8XFxuezIsfSg/PVxcUykoPyFbIFxcdF0qKD86WyorLV18XFxkK1suXSlbIFxcdF0rKSkpL2dtLFxuICAgICAgZnVuY3Rpb24gKHdob2xlTWF0Y2gsIGxpc3QsIG0yKSB7XG4gICAgICAgIHZhciBsaXN0VHlwZSA9IChtMi5zZWFyY2goL1sqKy1dL2cpID4gLTEpID8gJ3VsJyA6ICdvbCc7XG4gICAgICAgIHJldHVybiBwYXJzZUNvbnNlY3V0aXZlTGlzdHMobGlzdCwgbGlzdFR5cGUsIHRydWUpO1xuICAgICAgfVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvKFxcblxcbnxeXFxuPykoKCB7MCwzfShbKistXXxcXGQrWy5dKVsgXFx0XSspW15cXHJdKz8owqgwfFxcbnsyLH0oPz1cXFMpKD8hWyBcXHRdKig/OlsqKy1dfFxcZCtbLl0pWyBcXHRdKykpKS9nbSxcbiAgICAgIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBtMSwgbGlzdCwgbTMpIHtcbiAgICAgICAgdmFyIGxpc3RUeXBlID0gKG0zLnNlYXJjaCgvWyorLV0vZykgPiAtMSkgPyAndWwnIDogJ29sJztcbiAgICAgICAgcmV0dXJuIHBhcnNlQ29uc2VjdXRpdmVMaXN0cyhsaXN0LCBsaXN0VHlwZSwgZmFsc2UpO1xuICAgICAgfVxuICAgICk7XG4gIH1cblxuICAvLyBzdHJpcCBzZW50aW5lbFxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC/CqDAvLCAnJyk7XG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ2xpc3RzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBQYXJzZSBtZXRhZGF0YSBhdCB0aGUgdG9wIG9mIHRoZSBkb2N1bWVudFxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ldGFkYXRhJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmICghb3B0aW9ucy5tZXRhZGF0YSkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnbWV0YWRhdGEuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgZnVuY3Rpb24gcGFyc2VNZXRhZGF0YUNvbnRlbnRzIChjb250ZW50KSB7XG4gICAgLy8gcmF3IGlzIHJhdyBzbyBpdCdzIG5vdCBjaGFuZ2VkIGluIGFueSB3YXlcbiAgICBnbG9iYWxzLm1ldGFkYXRhLnJhdyA9IGNvbnRlbnQ7XG5cbiAgICAvLyBlc2NhcGUgY2hhcnMgZm9yYmlkZGVuIGluIGh0bWwgYXR0cmlidXRlc1xuICAgIC8vIGRvdWJsZSBxdW90ZXNcbiAgICBjb250ZW50ID0gY29udGVudFxuICAgICAgLy8gYW1wZXJzYW5kIGZpcnN0XG4gICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKVxuICAgICAgLy8gZG91YmxlIHF1b3Rlc1xuICAgICAgLnJlcGxhY2UoL1wiL2csICcmcXVvdDsnKTtcblxuICAgIGNvbnRlbnQgPSBjb250ZW50LnJlcGxhY2UoL1xcbiB7NH0vZywgJyAnKTtcbiAgICBjb250ZW50LnJlcGxhY2UoL14oW1xcUyBdKyk6ICsoW1xcc1xcU10rPykkL2dtLCBmdW5jdGlvbiAod20sIGtleSwgdmFsdWUpIHtcbiAgICAgIGdsb2JhbHMubWV0YWRhdGEucGFyc2VkW2tleV0gPSB2YWx1ZTtcbiAgICAgIHJldHVybiAnJztcbiAgICB9KTtcbiAgfVxuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15cXHMqwqvCq8KrKyhcXFMqPylcXG4oW1xcc1xcU10rPylcXG7Cu8K7wrsrXFxuLywgZnVuY3Rpb24gKHdob2xlbWF0Y2gsIGZvcm1hdCwgY29udGVudCkge1xuICAgIHBhcnNlTWV0YWRhdGFDb250ZW50cyhjb250ZW50KTtcbiAgICByZXR1cm4gJ8KoTSc7XG4gIH0pO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15cXHMqLS0tKyhcXFMqPylcXG4oW1xcc1xcU10rPylcXG4tLS0rXFxuLywgZnVuY3Rpb24gKHdob2xlbWF0Y2gsIGZvcm1hdCwgY29udGVudCkge1xuICAgIGlmIChmb3JtYXQpIHtcbiAgICAgIGdsb2JhbHMubWV0YWRhdGEuZm9ybWF0ID0gZm9ybWF0O1xuICAgIH1cbiAgICBwYXJzZU1ldGFkYXRhQ29udGVudHMoY29udGVudCk7XG4gICAgcmV0dXJuICfCqE0nO1xuICB9KTtcblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC/CqE0vZywgJycpO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ21ldGFkYXRhLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBSZW1vdmUgb25lIGxldmVsIG9mIGxpbmUtbGVhZGluZyB0YWJzIG9yIHNwYWNlc1xuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ291dGRlbnQnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ291dGRlbnQuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gYXR0YWNrbGFiOiBoYWNrIGFyb3VuZCBLb25xdWVyb3IgMy41LjQgYnVnOlxuICAvLyBcIi0tLS0tLS0tLS1idWdcIi5yZXBsYWNlKC9eLS9nLFwiXCIpID09IFwiYnVnXCJcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXihcXHR8WyBdezEsNH0pL2dtLCAnwqgwJyk7IC8vIGF0dGFja2xhYjogZ190YWJfd2lkdGhcblxuICAvLyBhdHRhY2tsYWI6IGNsZWFuIHVwIGhhY2tcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvwqgwL2csICcnKTtcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdvdXRkZW50LmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKlxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ3BhcmFncmFwaHMnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgncGFyYWdyYXBocy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgLy8gU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgbGluZXM6XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15cXG4rL2csICcnKTtcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxuKyQvZywgJycpO1xuXG4gIHZhciBncmFmcyA9IHRleHQuc3BsaXQoL1xcbnsyLH0vZyksXG4gICAgICBncmFmc091dCA9IFtdLFxuICAgICAgZW5kID0gZ3JhZnMubGVuZ3RoOyAvLyBXcmFwIDxwPiB0YWdzXG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciBzdHIgPSBncmFmc1tpXTtcbiAgICAvLyBpZiB0aGlzIGlzIGFuIEhUTUwgbWFya2VyLCBjb3B5IGl0XG4gICAgaWYgKHN0ci5zZWFyY2goL8KoKEt8RykoXFxkKylcXDEvZykgPj0gMCkge1xuICAgICAgZ3JhZnNPdXQucHVzaChzdHIpO1xuXG4gICAgLy8gdGVzdCBmb3IgcHJlc2VuY2Ugb2YgY2hhcmFjdGVycyB0byBwcmV2ZW50IGVtcHR5IGxpbmVzIGJlaW5nIHBhcnNlZFxuICAgIC8vIGFzIHBhcmFncmFwaHMgKHJlc3VsdGluZyBpbiB1bmRlc2lyZWQgZXh0cmEgZW1wdHkgcGFyYWdyYXBocylcbiAgICB9IGVsc2UgaWYgKHN0ci5zZWFyY2goL1xcUy8pID49IDApIHtcbiAgICAgIHN0ciA9IHNob3dkb3duLnN1YlBhcnNlcignc3BhbkdhbXV0Jykoc3RyLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9eKFsgXFx0XSopL2csICc8cD4nKTtcbiAgICAgIHN0ciArPSAnPC9wPic7XG4gICAgICBncmFmc091dC5wdXNoKHN0cik7XG4gICAgfVxuICB9XG5cbiAgLyoqIFVuaGFzaGlmeSBIVE1MIGJsb2NrcyAqL1xuICBlbmQgPSBncmFmc091dC5sZW5ndGg7XG4gIGZvciAoaSA9IDA7IGkgPCBlbmQ7IGkrKykge1xuICAgIHZhciBibG9ja1RleHQgPSAnJyxcbiAgICAgICAgZ3JhZnNPdXRJdCA9IGdyYWZzT3V0W2ldLFxuICAgICAgICBjb2RlRmxhZyA9IGZhbHNlO1xuICAgIC8vIGlmIHRoaXMgaXMgYSBtYXJrZXIgZm9yIGFuIGh0bWwgYmxvY2suLi5cbiAgICAvLyB1c2UgUmVnRXhwLnRlc3QgaW5zdGVhZCBvZiBzdHJpbmcuc2VhcmNoIGJlY2F1c2Ugb2YgUU1MIGJ1Z1xuICAgIHdoaWxlICgvwqgoS3xHKShcXGQrKVxcMS8udGVzdChncmFmc091dEl0KSkge1xuICAgICAgdmFyIGRlbGltID0gUmVnRXhwLiQxLFxuICAgICAgICAgIG51bSAgID0gUmVnRXhwLiQyO1xuXG4gICAgICBpZiAoZGVsaW0gPT09ICdLJykge1xuICAgICAgICBibG9ja1RleHQgPSBnbG9iYWxzLmdIdG1sQmxvY2tzW251bV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIGlmIGdoQmxvY2sgaXMgYSBmYWxzZSBwb3NpdGl2ZVxuICAgICAgICBpZiAoY29kZUZsYWcpIHtcbiAgICAgICAgICAvLyB1c2UgZW5jb2RlZCB2ZXJzaW9uIG9mIGFsbCB0ZXh0XG4gICAgICAgICAgYmxvY2tUZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdlbmNvZGVDb2RlJykoZ2xvYmFscy5naENvZGVCbG9ja3NbbnVtXS50ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBibG9ja1RleHQgPSBnbG9iYWxzLmdoQ29kZUJsb2Nrc1tudW1dLmNvZGVibG9jaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYmxvY2tUZXh0ID0gYmxvY2tUZXh0LnJlcGxhY2UoL1xcJC9nLCAnJCQkJCcpOyAvLyBFc2NhcGUgYW55IGRvbGxhciBzaWduc1xuXG4gICAgICBncmFmc091dEl0ID0gZ3JhZnNPdXRJdC5yZXBsYWNlKC8oXFxuXFxuKT/CqChLfEcpXFxkK1xcMihcXG5cXG4pPy8sIGJsb2NrVGV4dCk7XG4gICAgICAvLyBDaGVjayBpZiBncmFmc091dEl0IGlzIGEgcHJlLT5jb2RlXG4gICAgICBpZiAoL148cHJlXFxiW14+XSo+XFxzKjxjb2RlXFxiW14+XSo+Ly50ZXN0KGdyYWZzT3V0SXQpKSB7XG4gICAgICAgIGNvZGVGbGFnID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gICAgZ3JhZnNPdXRbaV0gPSBncmFmc091dEl0O1xuICB9XG4gIHRleHQgPSBncmFmc091dC5qb2luKCdcXG4nKTtcbiAgLy8gU3RyaXAgbGVhZGluZyBhbmQgdHJhaWxpbmcgbGluZXM6XG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL15cXG4rL2csICcnKTtcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxuKyQvZywgJycpO1xuICByZXR1cm4gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdwYXJhZ3JhcGhzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG59KTtcblxyXG4vKipcbiAqIFJ1biBleHRlbnNpb25cbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdydW5FeHRlbnNpb24nLCBmdW5jdGlvbiAoZXh0LCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBpZiAoZXh0LmZpbHRlcikge1xuICAgIHRleHQgPSBleHQuZmlsdGVyKHRleHQsIGdsb2JhbHMuY29udmVydGVyLCBvcHRpb25zKTtcblxuICB9IGVsc2UgaWYgKGV4dC5yZWdleCkge1xuICAgIC8vIFRPRE8gcmVtb3ZlIHRoaXMgd2hlbiBvbGQgZXh0ZW5zaW9uIGxvYWRpbmcgbWVjaGFuaXNtIGlzIGRlcHJlY2F0ZWRcbiAgICB2YXIgcmUgPSBleHQucmVnZXg7XG4gICAgaWYgKCEocmUgaW5zdGFuY2VvZiBSZWdFeHApKSB7XG4gICAgICByZSA9IG5ldyBSZWdFeHAocmUsICdnJyk7XG4gICAgfVxuICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UocmUsIGV4dC5yZXBsYWNlKTtcbiAgfVxuXG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBUaGVzZSBhcmUgYWxsIHRoZSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBvY2N1ciAqd2l0aGluKiBibG9jay1sZXZlbFxuICogdGFncyBsaWtlIHBhcmFncmFwaHMsIGhlYWRlcnMsIGFuZCBsaXN0IGl0ZW1zLlxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ3NwYW5HYW11dCcsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdzcGFuR2FtdXQuYmVmb3JlJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2NvZGVTcGFucycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdlc2NhcGVTcGVjaWFsQ2hhcnNXaXRoaW5UYWdBdHRyaWJ1dGVzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2VuY29kZUJhY2tzbGFzaEVzY2FwZXMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBQcm9jZXNzIGFuY2hvciBhbmQgaW1hZ2UgdGFncy4gSW1hZ2VzIG11c3QgY29tZSBmaXJzdCxcbiAgLy8gYmVjYXVzZSAhW2Zvb11bZl0gbG9va3MgbGlrZSBhbiBhbmNob3IuXG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2ltYWdlcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdhbmNob3JzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gTWFrZSBsaW5rcyBvdXQgb2YgdGhpbmdzIGxpa2UgYDxodHRwOi8vZXhhbXBsZS5jb20vPmBcbiAgLy8gTXVzdCBjb21lIGFmdGVyIGFuY2hvcnMsIGJlY2F1c2UgeW91IGNhbiB1c2UgPCBhbmQgPlxuICAvLyBkZWxpbWl0ZXJzIGluIGlubGluZSBsaW5rcyBsaWtlIFt0aGlzXSg8dXJsPikuXG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2F1dG9MaW5rcycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdzaW1wbGlmaWVkQXV0b0xpbmtzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2Vtb2ppJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ3VuZGVybGluZScpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdpdGFsaWNzQW5kQm9sZCcpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuICB0ZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdzdHJpa2V0aHJvdWdoJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2VsbGlwc2lzJykodGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG5cbiAgLy8gd2UgbmVlZCB0byBoYXNoIEhUTUwgdGFncyBpbnNpZGUgc3BhbnNcbiAgdGV4dCA9IHNob3dkb3duLnN1YlBhcnNlcignaGFzaEhUTUxTcGFucycpKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIC8vIG5vdyB3ZSBlbmNvZGUgYW1wcyBhbmQgYW5nbGVzXG4gIHRleHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2VuY29kZUFtcHNBbmRBbmdsZXMnKSh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBEbyBoYXJkIGJyZWFrc1xuICBpZiAob3B0aW9ucy5zaW1wbGVMaW5lQnJlYWtzKSB7XG4gICAgLy8gR0ZNIHN0eWxlIGhhcmQgYnJlYWtzXG4gICAgLy8gb25seSBhZGQgbGluZSBicmVha3MgaWYgdGhlIHRleHQgZG9lcyBub3QgY29udGFpbiBhIGJsb2NrIChzcGVjaWFsIGNhc2UgZm9yIGxpc3RzKVxuICAgIGlmICghL1xcblxcbsKoSy8udGVzdCh0ZXh0KSkge1xuICAgICAgdGV4dCA9IHRleHQucmVwbGFjZSgvXFxuKy9nLCAnPGJyIC8+XFxuJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIC8vIFZhbmlsbGEgaGFyZCBicmVha3NcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8gICtcXG4vZywgJzxiciAvPlxcbicpO1xuICB9XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnc3BhbkdhbXV0LmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdzdHJpa2V0aHJvdWdoJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGZ1bmN0aW9uIHBhcnNlSW5zaWRlICh0eHQpIHtcbiAgICBpZiAob3B0aW9ucy5zaW1wbGlmaWVkQXV0b0xpbmspIHtcbiAgICAgIHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignc2ltcGxpZmllZEF1dG9MaW5rcycpKHR4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gICAgfVxuICAgIHJldHVybiAnPGRlbD4nICsgdHh0ICsgJzwvZGVsPic7XG4gIH1cblxuICBpZiAob3B0aW9ucy5zdHJpa2V0aHJvdWdoKSB7XG4gICAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgnc3RyaWtldGhyb3VnaC5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC8oPzp+KXsyfShbXFxzXFxTXSs/KSg/On4pezJ9L2csIGZ1bmN0aW9uICh3bSwgdHh0KSB7IHJldHVybiBwYXJzZUluc2lkZSh0eHQpOyB9KTtcbiAgICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCdzdHJpa2V0aHJvdWdoLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIH1cblxuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbi8qKlxuICogU3RyaXBzIGxpbmsgZGVmaW5pdGlvbnMgZnJvbSB0ZXh0LCBzdG9yZXMgdGhlIFVSTHMgYW5kIHRpdGxlcyBpblxuICogaGFzaCByZWZlcmVuY2VzLlxuICogTGluayBkZWZzIGFyZSBpbiB0aGUgZm9ybTogXltpZF06IHVybCBcIm9wdGlvbmFsIHRpdGxlXCJcbiAqL1xuc2hvd2Rvd24uc3ViUGFyc2VyKCdzdHJpcExpbmtEZWZpbml0aW9ucycsIGZ1bmN0aW9uICh0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgcmVnZXggICAgICAgPSAvXiB7MCwzfVxcWyhbXlxcXV0rKV06WyBcXHRdKlxcbj9bIFxcdF0qPD8oW14+XFxzXSspPj8oPzogPShbKlxcZF0rW0EtWmEteiVdezAsNH0peChbKlxcZF0rW0EtWmEteiVdezAsNH0pKT9bIFxcdF0qXFxuP1sgXFx0XSooPzooXFxuKilbXCJ8JyhdKC4rPylbXCJ8JyldWyBcXHRdKik/KD86XFxuK3woPz3CqDApKS9nbSxcbiAgICAgIGJhc2U2NFJlZ2V4ID0gL14gezAsM31cXFsoW15cXF1dKyldOlsgXFx0XSpcXG4/WyBcXHRdKjw/KGRhdGE6Lis/XFwvLis/O2Jhc2U2NCxbQS1aYS16MC05Ky89XFxuXSs/KT4/KD86ID0oWypcXGRdK1tBLVphLXolXXswLDR9KXgoWypcXGRdK1tBLVphLXolXXswLDR9KSk/WyBcXHRdKlxcbj9bIFxcdF0qKD86KFxcbiopW1wifCcoXSguKz8pW1wifCcpXVsgXFx0XSopPyg/OlxcblxcbnwoPz3CqDApfCg/PVxcblxcWykpL2dtO1xuXG4gIC8vIGF0dGFja2xhYjogc2VudGluZWwgd29ya2Fyb3VuZHMgZm9yIGxhY2sgb2YgXFxBIGFuZCBcXFosIHNhZmFyaVxca2h0bWwgYnVnXG4gIHRleHQgKz0gJ8KoMCc7XG5cbiAgdmFyIHJlcGxhY2VGdW5jID0gZnVuY3Rpb24gKHdob2xlTWF0Y2gsIGxpbmtJZCwgdXJsLCB3aWR0aCwgaGVpZ2h0LCBibGFua0xpbmVzLCB0aXRsZSkge1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlbid0IHR3byBpbnN0YW5jZXMgb2YgbGlua0lkIGl0IG11c3Qgbm90IGJlIGEgcmVmZXJlbmNlIGxpbmsgc28gYmFjayBvdXRcbiAgICBsaW5rSWQgPSBsaW5rSWQudG9Mb3dlckNhc2UoKTtcbiAgICBpZiAodGV4dC50b0xvd2VyQ2FzZSgpLnNwbGl0KGxpbmtJZCkubGVuZ3RoIC0gMSA8IDIpIHtcbiAgICAgIHJldHVybiB3aG9sZU1hdGNoO1xuICAgIH1cbiAgICBpZiAodXJsLm1hdGNoKC9eZGF0YTouKz9cXC8uKz87YmFzZTY0LC8pKSB7XG4gICAgICAvLyByZW1vdmUgbmV3bGluZXNcbiAgICAgIGdsb2JhbHMuZ1VybHNbbGlua0lkXSA9IHVybC5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBnbG9iYWxzLmdVcmxzW2xpbmtJZF0gPSBzaG93ZG93bi5zdWJQYXJzZXIoJ2VuY29kZUFtcHNBbmRBbmdsZXMnKSh1cmwsIG9wdGlvbnMsIGdsb2JhbHMpOyAgLy8gTGluayBJRHMgYXJlIGNhc2UtaW5zZW5zaXRpdmVcbiAgICB9XG5cbiAgICBpZiAoYmxhbmtMaW5lcykge1xuICAgICAgLy8gT29wcywgZm91bmQgYmxhbmsgbGluZXMsIHNvIGl0J3Mgbm90IGEgdGl0bGUuXG4gICAgICAvLyBQdXQgYmFjayB0aGUgcGFyZW50aGV0aWNhbCBzdGF0ZW1lbnQgd2Ugc3RvbGUuXG4gICAgICByZXR1cm4gYmxhbmtMaW5lcyArIHRpdGxlO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICh0aXRsZSkge1xuICAgICAgICBnbG9iYWxzLmdUaXRsZXNbbGlua0lkXSA9IHRpdGxlLnJlcGxhY2UoL1wifCcvZywgJyZxdW90OycpO1xuICAgICAgfVxuICAgICAgaWYgKG9wdGlvbnMucGFyc2VJbWdEaW1lbnNpb25zICYmIHdpZHRoICYmIGhlaWdodCkge1xuICAgICAgICBnbG9iYWxzLmdEaW1lbnNpb25zW2xpbmtJZF0gPSB7XG4gICAgICAgICAgd2lkdGg6ICB3aWR0aCxcbiAgICAgICAgICBoZWlnaHQ6IGhlaWdodFxuICAgICAgICB9O1xuICAgICAgfVxuICAgIH1cbiAgICAvLyBDb21wbGV0ZWx5IHJlbW92ZSB0aGUgZGVmaW5pdGlvbiBmcm9tIHRoZSB0ZXh0XG4gICAgcmV0dXJuICcnO1xuICB9O1xuXG4gIC8vIGZpcnN0IHdlIHRyeSB0byBmaW5kIGJhc2U2NCBsaW5rIHJlZmVyZW5jZXNcbiAgdGV4dCA9IHRleHQucmVwbGFjZShiYXNlNjRSZWdleCwgcmVwbGFjZUZ1bmMpO1xuXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UocmVnZXgsIHJlcGxhY2VGdW5jKTtcblxuICAvLyBhdHRhY2tsYWI6IHN0cmlwIHNlbnRpbmVsXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL8KoMC8sICcnKTtcblxuICByZXR1cm4gdGV4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcigndGFibGVzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIGlmICghb3B0aW9ucy50YWJsZXMpIHtcbiAgICByZXR1cm4gdGV4dDtcbiAgfVxuXG4gIHZhciB0YWJsZVJneCAgICAgICA9IC9eIHswLDN9XFx8Py4rXFx8LitcXG4gezAsM31cXHw/WyBcXHRdKjo/WyBcXHRdKig/OlstPV0pezIsfVsgXFx0XSo6P1sgXFx0XSpcXHxbIFxcdF0qOj9bIFxcdF0qKD86Wy09XSl7Mix9W1xcc1xcU10rPyg/OlxcblxcbnzCqDApL2dtLFxuICAgICAgLy9zaW5nZUNvbFRibFJneCA9IC9eIHswLDN9XFx8LitcXHxcXG4gezAsM31cXHxbIFxcdF0qOj9bIFxcdF0qKD86Wy09XSl7Mix9WyBcXHRdKjo/WyBcXHRdKlxcfFsgXFx0XSpcXG4oPzogezAsM31cXHwuK1xcfFxcbikrKD86XFxuXFxufMKoMCkvZ207XG4gICAgICBzaW5nZUNvbFRibFJneCA9IC9eIHswLDN9XFx8LitcXHxbIFxcdF0qXFxuIHswLDN9XFx8WyBcXHRdKjo/WyBcXHRdKig/OlstPV0pezIsfVsgXFx0XSo6P1sgXFx0XSpcXHxbIFxcdF0qXFxuKCB7MCwzfVxcfC4rXFx8WyBcXHRdKlxcbikqKD86XFxufMKoMCkvZ207XG5cbiAgZnVuY3Rpb24gcGFyc2VTdHlsZXMgKHNMaW5lKSB7XG4gICAgaWYgKC9eOlsgXFx0XSotLSokLy50ZXN0KHNMaW5lKSkge1xuICAgICAgcmV0dXJuICcgc3R5bGU9XCJ0ZXh0LWFsaWduOmxlZnQ7XCInO1xuICAgIH0gZWxzZSBpZiAoL14tLSpbIFxcdF0qOlsgXFx0XSokLy50ZXN0KHNMaW5lKSkge1xuICAgICAgcmV0dXJuICcgc3R5bGU9XCJ0ZXh0LWFsaWduOnJpZ2h0O1wiJztcbiAgICB9IGVsc2UgaWYgKC9eOlsgXFx0XSotLSpbIFxcdF0qOiQvLnRlc3Qoc0xpbmUpKSB7XG4gICAgICByZXR1cm4gJyBzdHlsZT1cInRleHQtYWxpZ246Y2VudGVyO1wiJztcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHBhcnNlSGVhZGVycyAoaGVhZGVyLCBzdHlsZSkge1xuICAgIHZhciBpZCA9ICcnO1xuICAgIGhlYWRlciA9IGhlYWRlci50cmltKCk7XG4gICAgLy8gc3VwcG9ydCBib3RoIHRhYmxlc0hlYWRlcklkIGFuZCB0YWJsZUhlYWRlcklkIGR1ZSB0byBlcnJvciBpbiBkb2N1bWVudGF0aW9uIHNvIHdlIGRvbid0IGJyZWFrIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5XG4gICAgaWYgKG9wdGlvbnMudGFibGVzSGVhZGVySWQgfHwgb3B0aW9ucy50YWJsZUhlYWRlcklkKSB7XG4gICAgICBpZCA9ICcgaWQ9XCInICsgaGVhZGVyLnJlcGxhY2UoLyAvZywgJ18nKS50b0xvd2VyQ2FzZSgpICsgJ1wiJztcbiAgICB9XG4gICAgaGVhZGVyID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdzcGFuR2FtdXQnKShoZWFkZXIsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gICAgcmV0dXJuICc8dGgnICsgaWQgKyBzdHlsZSArICc+JyArIGhlYWRlciArICc8L3RoPlxcbic7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZUNlbGxzIChjZWxsLCBzdHlsZSkge1xuICAgIHZhciBzdWJUZXh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdzcGFuR2FtdXQnKShjZWxsLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICByZXR1cm4gJzx0ZCcgKyBzdHlsZSArICc+JyArIHN1YlRleHQgKyAnPC90ZD5cXG4nO1xuICB9XG5cbiAgZnVuY3Rpb24gYnVpbGRUYWJsZSAoaGVhZGVycywgY2VsbHMpIHtcbiAgICB2YXIgdGIgPSAnPHRhYmxlPlxcbjx0aGVhZD5cXG48dHI+XFxuJyxcbiAgICAgICAgdGJsTGduID0gaGVhZGVycy5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRibExnbjsgKytpKSB7XG4gICAgICB0YiArPSBoZWFkZXJzW2ldO1xuICAgIH1cbiAgICB0YiArPSAnPC90cj5cXG48L3RoZWFkPlxcbjx0Ym9keT5cXG4nO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgKytpKSB7XG4gICAgICB0YiArPSAnPHRyPlxcbic7XG4gICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgdGJsTGduOyArK2lpKSB7XG4gICAgICAgIHRiICs9IGNlbGxzW2ldW2lpXTtcbiAgICAgIH1cbiAgICAgIHRiICs9ICc8L3RyPlxcbic7XG4gICAgfVxuICAgIHRiICs9ICc8L3Rib2R5PlxcbjwvdGFibGU+XFxuJztcbiAgICByZXR1cm4gdGI7XG4gIH1cblxuICBmdW5jdGlvbiBwYXJzZVRhYmxlIChyYXdUYWJsZSkge1xuICAgIHZhciBpLCB0YWJsZUxpbmVzID0gcmF3VGFibGUuc3BsaXQoJ1xcbicpO1xuXG4gICAgZm9yIChpID0gMDsgaSA8IHRhYmxlTGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgIC8vIHN0cmlwIHdyb25nIGZpcnN0IGFuZCBsYXN0IGNvbHVtbiBpZiB3cmFwcGVkIHRhYmxlcyBhcmUgdXNlZFxuICAgICAgaWYgKC9eIHswLDN9XFx8Ly50ZXN0KHRhYmxlTGluZXNbaV0pKSB7XG4gICAgICAgIHRhYmxlTGluZXNbaV0gPSB0YWJsZUxpbmVzW2ldLnJlcGxhY2UoL14gezAsM31cXHwvLCAnJyk7XG4gICAgICB9XG4gICAgICBpZiAoL1xcfFsgXFx0XSokLy50ZXN0KHRhYmxlTGluZXNbaV0pKSB7XG4gICAgICAgIHRhYmxlTGluZXNbaV0gPSB0YWJsZUxpbmVzW2ldLnJlcGxhY2UoL1xcfFsgXFx0XSokLywgJycpO1xuICAgICAgfVxuICAgICAgLy8gcGFyc2UgY29kZSBzcGFucyBmaXJzdCwgYnV0IHdlIG9ubHkgc3VwcG9ydCBvbmUgbGluZSBjb2RlIHNwYW5zXG4gICAgICB0YWJsZUxpbmVzW2ldID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdjb2RlU3BhbnMnKSh0YWJsZUxpbmVzW2ldLCBvcHRpb25zLCBnbG9iYWxzKTtcbiAgICB9XG5cbiAgICB2YXIgcmF3SGVhZGVycyA9IHRhYmxlTGluZXNbMF0uc3BsaXQoJ3wnKS5tYXAoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMudHJpbSgpO30pLFxuICAgICAgICByYXdTdHlsZXMgPSB0YWJsZUxpbmVzWzFdLnNwbGl0KCd8JykubWFwKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzLnRyaW0oKTt9KSxcbiAgICAgICAgcmF3Q2VsbHMgPSBbXSxcbiAgICAgICAgaGVhZGVycyA9IFtdLFxuICAgICAgICBzdHlsZXMgPSBbXSxcbiAgICAgICAgY2VsbHMgPSBbXTtcblxuICAgIHRhYmxlTGluZXMuc2hpZnQoKTtcbiAgICB0YWJsZUxpbmVzLnNoaWZ0KCk7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgdGFibGVMaW5lcy5sZW5ndGg7ICsraSkge1xuICAgICAgaWYgKHRhYmxlTGluZXNbaV0udHJpbSgpID09PSAnJykge1xuICAgICAgICBjb250aW51ZTtcbiAgICAgIH1cbiAgICAgIHJhd0NlbGxzLnB1c2goXG4gICAgICAgIHRhYmxlTGluZXNbaV1cbiAgICAgICAgICAuc3BsaXQoJ3wnKVxuICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKHMpIHtcbiAgICAgICAgICAgIHJldHVybiBzLnRyaW0oKTtcbiAgICAgICAgICB9KVxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAocmF3SGVhZGVycy5sZW5ndGggPCByYXdTdHlsZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gcmF3VGFibGU7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IHJhd1N0eWxlcy5sZW5ndGg7ICsraSkge1xuICAgICAgc3R5bGVzLnB1c2gocGFyc2VTdHlsZXMocmF3U3R5bGVzW2ldKSk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IHJhd0hlYWRlcnMubGVuZ3RoOyArK2kpIHtcbiAgICAgIGlmIChzaG93ZG93bi5oZWxwZXIuaXNVbmRlZmluZWQoc3R5bGVzW2ldKSkge1xuICAgICAgICBzdHlsZXNbaV0gPSAnJztcbiAgICAgIH1cbiAgICAgIGhlYWRlcnMucHVzaChwYXJzZUhlYWRlcnMocmF3SGVhZGVyc1tpXSwgc3R5bGVzW2ldKSk7XG4gICAgfVxuXG4gICAgZm9yIChpID0gMDsgaSA8IHJhd0NlbGxzLmxlbmd0aDsgKytpKSB7XG4gICAgICB2YXIgcm93ID0gW107XG4gICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDwgaGVhZGVycy5sZW5ndGg7ICsraWkpIHtcbiAgICAgICAgaWYgKHNob3dkb3duLmhlbHBlci5pc1VuZGVmaW5lZChyYXdDZWxsc1tpXVtpaV0pKSB7XG5cbiAgICAgICAgfVxuICAgICAgICByb3cucHVzaChwYXJzZUNlbGxzKHJhd0NlbGxzW2ldW2lpXSwgc3R5bGVzW2lpXSkpO1xuICAgICAgfVxuICAgICAgY2VsbHMucHVzaChyb3cpO1xuICAgIH1cblxuICAgIHJldHVybiBidWlsZFRhYmxlKGhlYWRlcnMsIGNlbGxzKTtcbiAgfVxuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3RhYmxlcy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICAvLyBmaW5kIGVzY2FwZWQgcGlwZSBjaGFyYWN0ZXJzXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xcXFwoXFx8KS9nLCBzaG93ZG93bi5oZWxwZXIuZXNjYXBlQ2hhcmFjdGVyc0NhbGxiYWNrKTtcblxuICAvLyBwYXJzZSBtdWx0aSBjb2x1bW4gdGFibGVzXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2UodGFibGVSZ3gsIHBhcnNlVGFibGUpO1xuXG4gIC8vIHBhcnNlIG9uZSBjb2x1bW4gdGFibGVzXG4gIHRleHQgPSB0ZXh0LnJlcGxhY2Uoc2luZ2VDb2xUYmxSZ3gsIHBhcnNlVGFibGUpO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3RhYmxlcy5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCd1bmRlcmxpbmUnLCBmdW5jdGlvbiAodGV4dCwgb3B0aW9ucywgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgaWYgKCFvcHRpb25zLnVuZGVybGluZSkge1xuICAgIHJldHVybiB0ZXh0O1xuICB9XG5cbiAgdGV4dCA9IGdsb2JhbHMuY29udmVydGVyLl9kaXNwYXRjaCgndW5kZXJsaW5lLmJlZm9yZScsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIGlmIChvcHRpb25zLmxpdGVyYWxNaWRXb3JkVW5kZXJzY29yZXMpIHtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXGJfX18oXFxTW1xcc1xcU10qPylfX19cXGIvZywgZnVuY3Rpb24gKHdtLCB0eHQpIHtcbiAgICAgIHJldHVybiAnPHU+JyArIHR4dCArICc8L3U+JztcbiAgICB9KTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXGJfXyhcXFNbXFxzXFxTXSo/KV9fXFxiL2csIGZ1bmN0aW9uICh3bSwgdHh0KSB7XG4gICAgICByZXR1cm4gJzx1PicgKyB0eHQgKyAnPC91Pic7XG4gICAgfSk7XG4gIH0gZWxzZSB7XG4gICAgdGV4dCA9IHRleHQucmVwbGFjZSgvX19fKFxcU1tcXHNcXFNdKj8pX19fL2csIGZ1bmN0aW9uICh3bSwgbSkge1xuICAgICAgcmV0dXJuICgvXFxTJC8udGVzdChtKSkgPyAnPHU+JyArIG0gKyAnPC91PicgOiB3bTtcbiAgICB9KTtcbiAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9fXyhcXFNbXFxzXFxTXSo/KV9fL2csIGZ1bmN0aW9uICh3bSwgbSkge1xuICAgICAgcmV0dXJuICgvXFxTJC8udGVzdChtKSkgPyAnPHU+JyArIG0gKyAnPC91PicgOiB3bTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIGVzY2FwZSByZW1haW5pbmcgdW5kZXJzY29yZXMgdG8gcHJldmVudCB0aGVtIGJlaW5nIHBhcnNlZCBieSBpdGFsaWMgYW5kIGJvbGRcbiAgdGV4dCA9IHRleHQucmVwbGFjZSgvKF8pL2csIHNob3dkb3duLmhlbHBlci5lc2NhcGVDaGFyYWN0ZXJzQ2FsbGJhY2spO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3VuZGVybGluZS5hZnRlcicsIHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpO1xuXG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuLyoqXG4gKiBTd2FwIGJhY2sgaW4gYWxsIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgd2UndmUgaGlkZGVuLlxuICovXG5zaG93ZG93bi5zdWJQYXJzZXIoJ3VuZXNjYXBlU3BlY2lhbENoYXJzJywgZnVuY3Rpb24gKHRleHQsIG9wdGlvbnMsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICB0ZXh0ID0gZ2xvYmFscy5jb252ZXJ0ZXIuX2Rpc3BhdGNoKCd1bmVzY2FwZVNwZWNpYWxDaGFycy5iZWZvcmUnLCB0ZXh0LCBvcHRpb25zLCBnbG9iYWxzKTtcblxuICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC/CqEUoXFxkKylFL2csIGZ1bmN0aW9uICh3aG9sZU1hdGNoLCBtMSkge1xuICAgIHZhciBjaGFyQ29kZVRvUmVwbGFjZSA9IHBhcnNlSW50KG0xKTtcbiAgICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZVRvUmVwbGFjZSk7XG4gIH0pO1xuXG4gIHRleHQgPSBnbG9iYWxzLmNvbnZlcnRlci5fZGlzcGF0Y2goJ3VuZXNjYXBlU3BlY2lhbENoYXJzLmFmdGVyJywgdGV4dCwgb3B0aW9ucywgZ2xvYmFscyk7XG4gIHJldHVybiB0ZXh0O1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uYmxvY2txdW90ZScsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgdHh0ID0gJyc7XG4gIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcyxcbiAgICAgICAgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyArK2kpIHtcbiAgICAgIHZhciBpbm5lclR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLm5vZGUnKShjaGlsZHJlbltpXSwgZ2xvYmFscyk7XG5cbiAgICAgIGlmIChpbm5lclR4dCA9PT0gJycpIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICB0eHQgKz0gaW5uZXJUeHQ7XG4gICAgfVxuICB9XG4gIC8vIGNsZWFudXBcbiAgdHh0ID0gdHh0LnRyaW0oKTtcbiAgdHh0ID0gJz4gJyArIHR4dC5zcGxpdCgnXFxuJykuam9pbignXFxuPiAnKTtcbiAgcmV0dXJuIHR4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmNvZGVCbG9jaycsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbGFuZyA9IG5vZGUuZ2V0QXR0cmlidXRlKCdsYW5ndWFnZScpLFxuICAgICAgbnVtICA9IG5vZGUuZ2V0QXR0cmlidXRlKCdwcmVjb2RlbnVtJyk7XG4gIHJldHVybiAnYGBgJyArIGxhbmcgKyAnXFxuJyArIGdsb2JhbHMucHJlTGlzdFtudW1dICsgJ1xcbmBgYCc7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5jb2RlU3BhbicsIGZ1bmN0aW9uIChub2RlKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICByZXR1cm4gJ2AnICsgbm9kZS5pbm5lckhUTUwgKyAnYCc7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5lbXBoYXNpcycsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgdHh0ID0gJyc7XG4gIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHR4dCArPSAnKic7XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzLFxuICAgICAgICBjaGlsZHJlbkxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyArK2kpIHtcbiAgICAgIHR4dCArPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ub2RlJykoY2hpbGRyZW5baV0sIGdsb2JhbHMpO1xuICAgIH1cbiAgICB0eHQgKz0gJyonO1xuICB9XG4gIHJldHVybiB0eHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5oZWFkZXInLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscywgaGVhZGVyTGV2ZWwpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBoZWFkZXJNYXJrID0gbmV3IEFycmF5KGhlYWRlckxldmVsICsgMSkuam9pbignIycpLFxuICAgICAgdHh0ID0gJyc7XG5cbiAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgdHh0ID0gaGVhZGVyTWFyayArICcgJztcbiAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkTm9kZXMsXG4gICAgICAgIGNoaWxkcmVuTGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgKytpKSB7XG4gICAgICB0eHQgKz0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubm9kZScpKGNoaWxkcmVuW2ldLCBnbG9iYWxzKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHR4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmhyJywgZnVuY3Rpb24gKCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgcmV0dXJuICctLS0nO1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaW1hZ2UnLCBmdW5jdGlvbiAobm9kZSkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHR4dCA9ICcnO1xuICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoJ3NyYycpKSB7XG4gICAgdHh0ICs9ICchWycgKyBub2RlLmdldEF0dHJpYnV0ZSgnYWx0JykgKyAnXSgnO1xuICAgIHR4dCArPSAnPCcgKyBub2RlLmdldEF0dHJpYnV0ZSgnc3JjJykgKyAnPic7XG4gICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKCd3aWR0aCcpICYmIG5vZGUuaGFzQXR0cmlidXRlKCdoZWlnaHQnKSkge1xuICAgICAgdHh0ICs9ICcgPScgKyBub2RlLmdldEF0dHJpYnV0ZSgnd2lkdGgnKSArICd4JyArIG5vZGUuZ2V0QXR0cmlidXRlKCdoZWlnaHQnKTtcbiAgICB9XG5cbiAgICBpZiAobm9kZS5oYXNBdHRyaWJ1dGUoJ3RpdGxlJykpIHtcbiAgICAgIHR4dCArPSAnIFwiJyArIG5vZGUuZ2V0QXR0cmlidXRlKCd0aXRsZScpICsgJ1wiJztcbiAgICB9XG4gICAgdHh0ICs9ICcpJztcbiAgfVxuICByZXR1cm4gdHh0O1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubGlua3MnLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHR4dCA9ICcnO1xuICBpZiAobm9kZS5oYXNDaGlsZE5vZGVzKCkgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoJ2hyZWYnKSkge1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcyxcbiAgICAgICAgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgdHh0ID0gJ1snO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7ICsraSkge1xuICAgICAgdHh0ICs9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLm5vZGUnKShjaGlsZHJlbltpXSwgZ2xvYmFscyk7XG4gICAgfVxuICAgIHR4dCArPSAnXSgnO1xuICAgIHR4dCArPSAnPCcgKyBub2RlLmdldEF0dHJpYnV0ZSgnaHJlZicpICsgJz4nO1xuICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZSgndGl0bGUnKSkge1xuICAgICAgdHh0ICs9ICcgXCInICsgbm9kZS5nZXRBdHRyaWJ1dGUoJ3RpdGxlJykgKyAnXCInO1xuICAgIH1cbiAgICB0eHQgKz0gJyknO1xuICB9XG4gIHJldHVybiB0eHQ7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5saXN0JywgZnVuY3Rpb24gKG5vZGUsIGdsb2JhbHMsIHR5cGUpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciB0eHQgPSAnJztcbiAgaWYgKCFub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuICB2YXIgbGlzdEl0ZW1zICAgICAgID0gbm9kZS5jaGlsZE5vZGVzLFxuICAgICAgbGlzdEl0ZW1zTGVuZ2h0ID0gbGlzdEl0ZW1zLmxlbmd0aCxcbiAgICAgIGxpc3ROdW0gPSBub2RlLmdldEF0dHJpYnV0ZSgnc3RhcnQnKSB8fCAxO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzdEl0ZW1zTGVuZ2h0OyArK2kpIHtcbiAgICBpZiAodHlwZW9mIGxpc3RJdGVtc1tpXS50YWdOYW1lID09PSAndW5kZWZpbmVkJyB8fCBsaXN0SXRlbXNbaV0udGFnTmFtZS50b0xvd2VyQ2FzZSgpICE9PSAnbGknKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvLyBkZWZpbmUgdGhlIGJ1bGxldCB0byB1c2UgaW4gbGlzdFxuICAgIHZhciBidWxsZXQgPSAnJztcbiAgICBpZiAodHlwZSA9PT0gJ29sJykge1xuICAgICAgYnVsbGV0ID0gbGlzdE51bS50b1N0cmluZygpICsgJy4gJztcbiAgICB9IGVsc2Uge1xuICAgICAgYnVsbGV0ID0gJy0gJztcbiAgICB9XG5cbiAgICAvLyBwYXJzZSBsaXN0IGl0ZW1cbiAgICB0eHQgKz0gYnVsbGV0ICsgc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubGlzdEl0ZW0nKShsaXN0SXRlbXNbaV0sIGdsb2JhbHMpO1xuICAgICsrbGlzdE51bTtcbiAgfVxuXG4gIC8vIGFkZCBjb21tZW50IGF0IHRoZSBlbmQgdG8gcHJldmVudCBjb25zZWN1dGl2ZSBsaXN0cyB0byBiZSBwYXJzZWQgYXMgb25lXG4gIHR4dCArPSAnXFxuPCEtLSAtLT5cXG4nO1xuICByZXR1cm4gdHh0LnRyaW0oKTtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmxpc3RJdGVtJywgZnVuY3Rpb24gKG5vZGUsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciBsaXN0SXRlbVR4dCA9ICcnO1xuXG4gIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcyxcbiAgICAgIGNoaWxkcmVuTGVuZ2h0ID0gY2hpbGRyZW4ubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5naHQ7ICsraSkge1xuICAgIGxpc3RJdGVtVHh0ICs9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLm5vZGUnKShjaGlsZHJlbltpXSwgZ2xvYmFscyk7XG4gIH1cbiAgLy8gaWYgaXQncyBvbmx5IG9uZSBsaW5lciwgd2UgbmVlZCB0byBhZGQgYSBuZXdsaW5lIGF0IHRoZSBlbmRcbiAgaWYgKCEvXFxuJC8udGVzdChsaXN0SXRlbVR4dCkpIHtcbiAgICBsaXN0SXRlbVR4dCArPSAnXFxuJztcbiAgfSBlbHNlIHtcbiAgICAvLyBpdCdzIG11bHRpcGFyYWdyYXBoLCBzbyB3ZSBuZWVkIHRvIGluZGVudFxuICAgIGxpc3RJdGVtVHh0ID0gbGlzdEl0ZW1UeHRcbiAgICAgIC5zcGxpdCgnXFxuJylcbiAgICAgIC5qb2luKCdcXG4gICAgJylcbiAgICAgIC5yZXBsYWNlKC9eIHs0fSQvZ20sICcnKVxuICAgICAgLnJlcGxhY2UoL1xcblxcbisvZywgJ1xcblxcbicpO1xuICB9XG5cbiAgcmV0dXJuIGxpc3RJdGVtVHh0O1xufSk7XG5cclxuXG5cbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLm5vZGUnLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscywgc3BhbnNPbmx5KSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICBzcGFuc09ubHkgPSBzcGFuc09ubHkgfHwgZmFsc2U7XG5cbiAgdmFyIHR4dCA9ICcnO1xuXG4gIC8vIGVkZ2UgY2FzZSBvZiB0ZXh0IHdpdGhvdXQgd3JhcHBlciBwYXJhZ3JhcGhcbiAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDMpIHtcbiAgICByZXR1cm4gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24udHh0Jykobm9kZSwgZ2xvYmFscyk7XG4gIH1cblxuICAvLyBIVE1MIGNvbW1lbnRcbiAgaWYgKG5vZGUubm9kZVR5cGUgPT09IDgpIHtcbiAgICByZXR1cm4gJzwhLS0nICsgbm9kZS5kYXRhICsgJy0tPlxcblxcbic7XG4gIH1cblxuICAvLyBwcm9jZXNzIG9ubHkgbm9kZSBlbGVtZW50c1xuICBpZiAobm9kZS5ub2RlVHlwZSAhPT0gMSkge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIHZhciB0YWdOYW1lID0gbm9kZS50YWdOYW1lLnRvTG93ZXJDYXNlKCk7XG5cbiAgc3dpdGNoICh0YWdOYW1lKSB7XG5cbiAgICAvL1xuICAgIC8vIEJMT0NLU1xuICAgIC8vXG4gICAgY2FzZSAnaDEnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaGVhZGVyJykobm9kZSwgZ2xvYmFscywgMSkgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaDInOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaGVhZGVyJykobm9kZSwgZ2xvYmFscywgMikgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaDMnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaGVhZGVyJykobm9kZSwgZ2xvYmFscywgMykgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaDQnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaGVhZGVyJykobm9kZSwgZ2xvYmFscywgNCkgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaDUnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaGVhZGVyJykobm9kZSwgZ2xvYmFscywgNSkgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnaDYnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaGVhZGVyJykobm9kZSwgZ2xvYmFscywgNikgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdwJzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnBhcmFncmFwaCcpKG5vZGUsIGdsb2JhbHMpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYmxvY2txdW90ZSc6XG4gICAgICBpZiAoIXNwYW5zT25seSkgeyB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ibG9ja3F1b3RlJykobm9kZSwgZ2xvYmFscykgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdocic6XG4gICAgICBpZiAoIXNwYW5zT25seSkgeyB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ocicpKG5vZGUsIGdsb2JhbHMpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb2wnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubGlzdCcpKG5vZGUsIGdsb2JhbHMsICdvbCcpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAndWwnOlxuICAgICAgaWYgKCFzcGFuc09ubHkpIHsgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubGlzdCcpKG5vZGUsIGdsb2JhbHMsICd1bCcpICsgJ1xcblxcbic7IH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAncHJlY29kZSc6XG4gICAgICBpZiAoIXNwYW5zT25seSkgeyB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5jb2RlQmxvY2snKShub2RlLCBnbG9iYWxzKSArICdcXG5cXG4nOyB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3ByZSc6XG4gICAgICBpZiAoIXNwYW5zT25seSkgeyB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5wcmUnKShub2RlLCBnbG9iYWxzKSArICdcXG5cXG4nOyB9XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3RhYmxlJzpcbiAgICAgIGlmICghc3BhbnNPbmx5KSB7IHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnRhYmxlJykobm9kZSwgZ2xvYmFscykgKyAnXFxuXFxuJzsgfVxuICAgICAgYnJlYWs7XG5cbiAgICAvL1xuICAgIC8vIFNQQU5TXG4gICAgLy9cbiAgICBjYXNlICdjb2RlJzpcbiAgICAgIHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmNvZGVTcGFuJykobm9kZSwgZ2xvYmFscyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ2VtJzpcbiAgICBjYXNlICdpJzpcbiAgICAgIHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLmVtcGhhc2lzJykobm9kZSwgZ2xvYmFscyk7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3N0cm9uZyc6XG4gICAgY2FzZSAnYic6XG4gICAgICB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5zdHJvbmcnKShub2RlLCBnbG9iYWxzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZGVsJzpcbiAgICAgIHR4dCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnN0cmlrZXRocm91Z2gnKShub2RlLCBnbG9iYWxzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnYSc6XG4gICAgICB0eHQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5saW5rcycpKG5vZGUsIGdsb2JhbHMpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdpbWcnOlxuICAgICAgdHh0ID0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uaW1hZ2UnKShub2RlLCBnbG9iYWxzKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHR4dCA9IG5vZGUub3V0ZXJIVE1MICsgJ1xcblxcbic7XG4gIH1cblxuICAvLyBjb21tb24gbm9ybWFsaXphdGlvblxuICAvLyBUT0RPIGV2ZW50dWFsbHlcblxuICByZXR1cm4gdHh0O1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ucGFyYWdyYXBoJywgZnVuY3Rpb24gKG5vZGUsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciB0eHQgPSAnJztcbiAgaWYgKG5vZGUuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZE5vZGVzLFxuICAgICAgICBjaGlsZHJlbkxlbmd0aCA9IGNoaWxkcmVuLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuTGVuZ3RoOyArK2kpIHtcbiAgICAgIHR4dCArPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ub2RlJykoY2hpbGRyZW5baV0sIGdsb2JhbHMpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNvbWUgdGV4dCBub3JtYWxpemF0aW9uXG4gIHR4dCA9IHR4dC50cmltKCk7XG5cbiAgcmV0dXJuIHR4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnByZScsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgbnVtICA9IG5vZGUuZ2V0QXR0cmlidXRlKCdwcmVudW0nKTtcbiAgcmV0dXJuICc8cHJlPicgKyBnbG9iYWxzLnByZUxpc3RbbnVtXSArICc8L3ByZT4nO1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24uc3RyaWtldGhyb3VnaCcsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgdHh0ID0gJyc7XG4gIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHR4dCArPSAnfn4nO1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcyxcbiAgICAgICAgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgKytpKSB7XG4gICAgICB0eHQgKz0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubm9kZScpKGNoaWxkcmVuW2ldLCBnbG9iYWxzKTtcbiAgICB9XG4gICAgdHh0ICs9ICd+fic7XG4gIH1cbiAgcmV0dXJuIHR4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnN0cm9uZycsIGZ1bmN0aW9uIChub2RlLCBnbG9iYWxzKSB7XG4gICd1c2Ugc3RyaWN0JztcblxuICB2YXIgdHh0ID0gJyc7XG4gIGlmIChub2RlLmhhc0NoaWxkTm9kZXMoKSkge1xuICAgIHR4dCArPSAnKionO1xuICAgIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcyxcbiAgICAgICAgY2hpbGRyZW5MZW5ndGggPSBjaGlsZHJlbi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbkxlbmd0aDsgKytpKSB7XG4gICAgICB0eHQgKz0gc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24ubm9kZScpKGNoaWxkcmVuW2ldLCBnbG9iYWxzKTtcbiAgICB9XG4gICAgdHh0ICs9ICcqKic7XG4gIH1cbiAgcmV0dXJuIHR4dDtcbn0pO1xuXHJcbnNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnRhYmxlJywgZnVuY3Rpb24gKG5vZGUsIGdsb2JhbHMpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciB0eHQgPSAnJyxcbiAgICAgIHRhYmxlQXJyYXkgPSBbW10sIFtdXSxcbiAgICAgIGhlYWRpbmdzICAgPSBub2RlLnF1ZXJ5U2VsZWN0b3JBbGwoJ3RoZWFkPnRyPnRoJyksXG4gICAgICByb3dzICAgICAgID0gbm9kZS5xdWVyeVNlbGVjdG9yQWxsKCd0Ym9keT50cicpLFxuICAgICAgaSwgaWk7XG4gIGZvciAoaSA9IDA7IGkgPCBoZWFkaW5ncy5sZW5ndGg7ICsraSkge1xuICAgIHZhciBoZWFkQ29udGVudCA9IHNob3dkb3duLnN1YlBhcnNlcignbWFrZU1hcmtkb3duLnRhYmxlQ2VsbCcpKGhlYWRpbmdzW2ldLCBnbG9iYWxzKSxcbiAgICAgICAgYWxsaWduID0gJy0tLSc7XG5cbiAgICBpZiAoaGVhZGluZ3NbaV0uaGFzQXR0cmlidXRlKCdzdHlsZScpKSB7XG4gICAgICB2YXIgc3R5bGUgPSBoZWFkaW5nc1tpXS5nZXRBdHRyaWJ1dGUoJ3N0eWxlJykudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9cXHMvZywgJycpO1xuICAgICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgICBjYXNlICd0ZXh0LWFsaWduOmxlZnQ7JzpcbiAgICAgICAgICBhbGxpZ24gPSAnOi0tLSc7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RleHQtYWxpZ246cmlnaHQ7JzpcbiAgICAgICAgICBhbGxpZ24gPSAnLS0tOic7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgJ3RleHQtYWxpZ246Y2VudGVyOyc6XG4gICAgICAgICAgYWxsaWduID0gJzotLS06JztcbiAgICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG4gICAgdGFibGVBcnJheVswXVtpXSA9IGhlYWRDb250ZW50LnRyaW0oKTtcbiAgICB0YWJsZUFycmF5WzFdW2ldID0gYWxsaWduO1xuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgciA9IHRhYmxlQXJyYXkucHVzaChbXSkgLSAxLFxuICAgICAgICBjb2xzID0gcm93c1tpXS5nZXRFbGVtZW50c0J5VGFnTmFtZSgndGQnKTtcblxuICAgIGZvciAoaWkgPSAwOyBpaSA8IGhlYWRpbmdzLmxlbmd0aDsgKytpaSkge1xuICAgICAgdmFyIGNlbGxDb250ZW50ID0gJyAnO1xuICAgICAgaWYgKHR5cGVvZiBjb2xzW2lpXSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgY2VsbENvbnRlbnQgPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi50YWJsZUNlbGwnKShjb2xzW2lpXSwgZ2xvYmFscyk7XG4gICAgICB9XG4gICAgICB0YWJsZUFycmF5W3JdLnB1c2goY2VsbENvbnRlbnQpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBjZWxsU3BhY2VzQ291bnQgPSAzO1xuICBmb3IgKGkgPSAwOyBpIDwgdGFibGVBcnJheS5sZW5ndGg7ICsraSkge1xuICAgIGZvciAoaWkgPSAwOyBpaSA8IHRhYmxlQXJyYXlbaV0ubGVuZ3RoOyArK2lpKSB7XG4gICAgICB2YXIgc3RyTGVuID0gdGFibGVBcnJheVtpXVtpaV0ubGVuZ3RoO1xuICAgICAgaWYgKHN0ckxlbiA+IGNlbGxTcGFjZXNDb3VudCkge1xuICAgICAgICBjZWxsU3BhY2VzQ291bnQgPSBzdHJMZW47XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgZm9yIChpID0gMDsgaSA8IHRhYmxlQXJyYXkubGVuZ3RoOyArK2kpIHtcbiAgICBmb3IgKGlpID0gMDsgaWkgPCB0YWJsZUFycmF5W2ldLmxlbmd0aDsgKytpaSkge1xuICAgICAgaWYgKGkgPT09IDEpIHtcbiAgICAgICAgaWYgKHRhYmxlQXJyYXlbaV1baWldLnNsaWNlKC0xKSA9PT0gJzonKSB7XG4gICAgICAgICAgdGFibGVBcnJheVtpXVtpaV0gPSBzaG93ZG93bi5oZWxwZXIucGFkRW5kKHRhYmxlQXJyYXlbaV1baWldLnNsaWNlKC0xKSwgY2VsbFNwYWNlc0NvdW50IC0gMSwgJy0nKSArICc6JztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0YWJsZUFycmF5W2ldW2lpXSA9IHNob3dkb3duLmhlbHBlci5wYWRFbmQodGFibGVBcnJheVtpXVtpaV0sIGNlbGxTcGFjZXNDb3VudCwgJy0nKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGFibGVBcnJheVtpXVtpaV0gPSBzaG93ZG93bi5oZWxwZXIucGFkRW5kKHRhYmxlQXJyYXlbaV1baWldLCBjZWxsU3BhY2VzQ291bnQpO1xuICAgICAgfVxuICAgIH1cbiAgICB0eHQgKz0gJ3wgJyArIHRhYmxlQXJyYXlbaV0uam9pbignIHwgJykgKyAnIHxcXG4nO1xuICB9XG5cbiAgcmV0dXJuIHR4dC50cmltKCk7XG59KTtcblxyXG5zaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi50YWJsZUNlbGwnLCBmdW5jdGlvbiAobm9kZSwgZ2xvYmFscykge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIHR4dCA9ICcnO1xuICBpZiAoIW5vZGUuaGFzQ2hpbGROb2RlcygpKSB7XG4gICAgcmV0dXJuICcnO1xuICB9XG4gIHZhciBjaGlsZHJlbiA9IG5vZGUuY2hpbGROb2RlcyxcbiAgICAgIGNoaWxkcmVuTGVuZ3RoID0gY2hpbGRyZW4ubGVuZ3RoO1xuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRyZW5MZW5ndGg7ICsraSkge1xuICAgIHR4dCArPSBzaG93ZG93bi5zdWJQYXJzZXIoJ21ha2VNYXJrZG93bi5ub2RlJykoY2hpbGRyZW5baV0sIGdsb2JhbHMsIHRydWUpO1xuICB9XG4gIHJldHVybiB0eHQudHJpbSgpO1xufSk7XG5cclxuc2hvd2Rvd24uc3ViUGFyc2VyKCdtYWtlTWFya2Rvd24udHh0JywgZnVuY3Rpb24gKG5vZGUpIHtcbiAgJ3VzZSBzdHJpY3QnO1xuXG4gIHZhciB0eHQgPSBub2RlLm5vZGVWYWx1ZTtcblxuICAvLyBtdWx0aXBsZSBzcGFjZXMgYXJlIGNvbGxhcHNlZFxuICB0eHQgPSB0eHQucmVwbGFjZSgvICsvZywgJyAnKTtcblxuICAvLyByZXBsYWNlIHRoZSBjdXN0b20gwqhOQlNQOyB3aXRoIGEgc3BhY2VcbiAgdHh0ID0gdHh0LnJlcGxhY2UoL8KoTkJTUDsvZywgJyAnKTtcblxuICAvLyBcIiwgPCwgPiBhbmQgJiBzaG91bGQgcmVwbGFjZSBlc2NhcGVkIGh0bWwgZW50aXRpZXNcbiAgdHh0ID0gc2hvd2Rvd24uaGVscGVyLnVuZXNjYXBlSFRNTEVudGl0aWVzKHR4dCk7XG5cbiAgLy8gZXNjYXBlIG1hcmtkb3duIG1hZ2ljIGNoYXJhY3RlcnNcbiAgLy8gZW1waGFzaXMsIHN0cm9uZyBhbmQgc3RyaWtldGhyb3VnaCAtIGNhbiBhcHBlYXIgZXZlcnl3aGVyZVxuICAvLyB3ZSBhbHNvIGVzY2FwZSBwaXBlICh8KSBiZWNhdXNlIG9mIHRhYmxlc1xuICAvLyBhbmQgZXNjYXBlIGAgYmVjYXVzZSBvZiBjb2RlIGJsb2NrcyBhbmQgc3BhbnNcbiAgdHh0ID0gdHh0LnJlcGxhY2UoLyhbKl9+fGBdKS9nLCAnXFxcXCQxJyk7XG5cbiAgLy8gZXNjYXBlID4gYmVjYXVzZSBvZiBibG9ja3F1b3Rlc1xuICB0eHQgPSB0eHQucmVwbGFjZSgvXihcXHMqKT4vZywgJ1xcXFwkMT4nKTtcblxuICAvLyBoYXNoIGNoYXJhY3Rlciwgb25seSB0cm91Ymxlc29tZSBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBiZWNhdXNlIG9mIGhlYWRlcnNcbiAgdHh0ID0gdHh0LnJlcGxhY2UoL14jL2dtLCAnXFxcXCMnKTtcblxuICAvLyBob3Jpem9udGFsIHJ1bGVzXG4gIHR4dCA9IHR4dC5yZXBsYWNlKC9eKFxccyopKFstPV17Myx9KShcXHMqKSQvLCAnJDFcXFxcJDIkMycpO1xuXG4gIC8vIGRvdCwgYmVjYXVzZSBvZiBvcmRlcmVkIGxpc3RzLCBvbmx5IHRyb3VibGVzb21lIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lIHdoZW4gcHJlY2VkZWQgYnkgYW4gaW50ZWdlclxuICB0eHQgPSB0eHQucmVwbGFjZSgvXiggezAsM31cXGQrKVxcLi9nbSwgJyQxXFxcXC4nKTtcblxuICAvLyArLCAqIGFuZCAtLCBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZSBiZWNvbWVzIGEgbGlzdCwgc28gd2UgbmVlZCB0byBlc2NhcGUgdGhlbSBhbHNvIChhc3RlcmlzayB3YXMgYWxyZWFkeSBlc2NhcGVkKVxuICB0eHQgPSB0eHQucmVwbGFjZSgvXiggezAsM30pKFsrLV0pL2dtLCAnJDFcXFxcJDInKTtcblxuICAvLyBpbWFnZXMgYW5kIGxpbmtzLCBdIGZvbGxvd2VkIGJ5ICggaXMgcHJvYmxlbWF0aWMsIHNvIHdlIGVzY2FwZSBpdFxuICB0eHQgPSB0eHQucmVwbGFjZSgvXShbXFxzXSopXFwoL2csICdcXFxcXSQxXFxcXCgnKTtcblxuICAvLyByZWZlcmVuY2UgVVJJcyBtdXN0IGFsc28gYmUgZXNjYXBlZFxuICB0eHQgPSB0eHQucmVwbGFjZSgvXiB7MCwzfVxcWyhbXFxTIFxcdF0qPyldOi9nbSwgJ1xcXFxbJDFdOicpO1xuXG4gIHJldHVybiB0eHQ7XG59KTtcblxyXG52YXIgcm9vdCA9IHRoaXM7XG5cbi8vIEFNRCBMb2FkZXJcbmlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgZGVmaW5lKGZ1bmN0aW9uICgpIHtcbiAgICAndXNlIHN0cmljdCc7XG4gICAgcmV0dXJuIHNob3dkb3duO1xuICB9KTtcblxuLy8gQ29tbW9uSlMvbm9kZUpTIExvYWRlclxufSBlbHNlIGlmICh0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyAmJiBtb2R1bGUuZXhwb3J0cykge1xuICBtb2R1bGUuZXhwb3J0cyA9IHNob3dkb3duO1xuXG4vLyBSZWd1bGFyIEJyb3dzZXIgbG9hZGVyXG59IGVsc2Uge1xuICByb290LnNob3dkb3duID0gc2hvd2Rvd247XG59XG59KS5jYWxsKHRoaXMpO1xyXG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNob3dkb3duLmpzLm1hcFxyXG4iLCJ2YXIgbmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzL2Jyb3dzZXIuanMnKS5uZXh0VGljaztcbnZhciBhcHBseSA9IEZ1bmN0aW9uLnByb3RvdHlwZS5hcHBseTtcbnZhciBzbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBpbW1lZGlhdGVJZHMgPSB7fTtcbnZhciBuZXh0SW1tZWRpYXRlSWQgPSAwO1xuXG4vLyBET00gQVBJcywgZm9yIGNvbXBsZXRlbmVzc1xuXG5leHBvcnRzLnNldFRpbWVvdXQgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0VGltZW91dCwgd2luZG93LCBhcmd1bWVudHMpLCBjbGVhclRpbWVvdXQpO1xufTtcbmV4cG9ydHMuc2V0SW50ZXJ2YWwgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIG5ldyBUaW1lb3V0KGFwcGx5LmNhbGwoc2V0SW50ZXJ2YWwsIHdpbmRvdywgYXJndW1lbnRzKSwgY2xlYXJJbnRlcnZhbCk7XG59O1xuZXhwb3J0cy5jbGVhclRpbWVvdXQgPVxuZXhwb3J0cy5jbGVhckludGVydmFsID0gZnVuY3Rpb24odGltZW91dCkgeyB0aW1lb3V0LmNsb3NlKCk7IH07XG5cbmZ1bmN0aW9uIFRpbWVvdXQoaWQsIGNsZWFyRm4pIHtcbiAgdGhpcy5faWQgPSBpZDtcbiAgdGhpcy5fY2xlYXJGbiA9IGNsZWFyRm47XG59XG5UaW1lb3V0LnByb3RvdHlwZS51bnJlZiA9IFRpbWVvdXQucHJvdG90eXBlLnJlZiA9IGZ1bmN0aW9uKCkge307XG5UaW1lb3V0LnByb3RvdHlwZS5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLl9jbGVhckZuLmNhbGwod2luZG93LCB0aGlzLl9pZCk7XG59O1xuXG4vLyBEb2VzIG5vdCBzdGFydCB0aGUgdGltZSwganVzdCBzZXRzIHVwIHRoZSBtZW1iZXJzIG5lZWRlZC5cbmV4cG9ydHMuZW5yb2xsID0gZnVuY3Rpb24oaXRlbSwgbXNlY3MpIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IG1zZWNzO1xufTtcblxuZXhwb3J0cy51bmVucm9sbCA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuICBpdGVtLl9pZGxlVGltZW91dCA9IC0xO1xufTtcblxuZXhwb3J0cy5fdW5yZWZBY3RpdmUgPSBleHBvcnRzLmFjdGl2ZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcbiAgY2xlYXJUaW1lb3V0KGl0ZW0uX2lkbGVUaW1lb3V0SWQpO1xuXG4gIHZhciBtc2VjcyA9IGl0ZW0uX2lkbGVUaW1lb3V0O1xuICBpZiAobXNlY3MgPj0gMCkge1xuICAgIGl0ZW0uX2lkbGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uIG9uVGltZW91dCgpIHtcbiAgICAgIGlmIChpdGVtLl9vblRpbWVvdXQpXG4gICAgICAgIGl0ZW0uX29uVGltZW91dCgpO1xuICAgIH0sIG1zZWNzKTtcbiAgfVxufTtcblxuLy8gVGhhdCdzIG5vdCBob3cgbm9kZS5qcyBpbXBsZW1lbnRzIGl0IGJ1dCB0aGUgZXhwb3NlZCBhcGkgaXMgdGhlIHNhbWUuXG5leHBvcnRzLnNldEltbWVkaWF0ZSA9IHR5cGVvZiBzZXRJbW1lZGlhdGUgPT09IFwiZnVuY3Rpb25cIiA/IHNldEltbWVkaWF0ZSA6IGZ1bmN0aW9uKGZuKSB7XG4gIHZhciBpZCA9IG5leHRJbW1lZGlhdGVJZCsrO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPCAyID8gZmFsc2UgOiBzbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG5cbiAgaW1tZWRpYXRlSWRzW2lkXSA9IHRydWU7XG5cbiAgbmV4dFRpY2soZnVuY3Rpb24gb25OZXh0VGljaygpIHtcbiAgICBpZiAoaW1tZWRpYXRlSWRzW2lkXSkge1xuICAgICAgLy8gZm4uY2FsbCgpIGlzIGZhc3RlciBzbyB3ZSBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiB1c2UtY2FzZVxuICAgICAgLy8gQHNlZSBodHRwOi8vanNwZXJmLmNvbS9jYWxsLWFwcGx5LXNlZ3VcbiAgICAgIGlmIChhcmdzKSB7XG4gICAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZm4uY2FsbChudWxsKTtcbiAgICAgIH1cbiAgICAgIC8vIFByZXZlbnQgaWRzIGZyb20gbGVha2luZ1xuICAgICAgZXhwb3J0cy5jbGVhckltbWVkaWF0ZShpZCk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gaWQ7XG59O1xuXG5leHBvcnRzLmNsZWFySW1tZWRpYXRlID0gdHlwZW9mIGNsZWFySW1tZWRpYXRlID09PSBcImZ1bmN0aW9uXCIgPyBjbGVhckltbWVkaWF0ZSA6IGZ1bmN0aW9uKGlkKSB7XG4gIGRlbGV0ZSBpbW1lZGlhdGVJZHNbaWRdO1xufTsiLCIvKiohXG4qIHRpcHB5LmpzIHY2LjIuNlxuKiAoYykgMjAxNy0yMDIwIGF0b21pa3NcbiogTUlUIExpY2Vuc2VcbiovXG4ndXNlIHN0cmljdCc7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbnZhciBjb3JlID0gcmVxdWlyZSgnQHBvcHBlcmpzL2NvcmUnKTtcblxudmFyIFJPVU5EX0FSUk9XID0gJzxzdmcgd2lkdGg9XCIxNlwiIGhlaWdodD1cIjZcIiB4bWxucz1cImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnXCI+PHBhdGggZD1cIk0wIDZzMS43OTYtLjAxMyA0LjY3LTMuNjE1QzUuODUxLjkgNi45My4wMDYgOCAwYzEuMDctLjAwNiAyLjE0OC44ODcgMy4zNDMgMi4zODVDMTQuMjMzIDYuMDA1IDE2IDYgMTYgNkgwelwiPjwvc3ZnPic7XG52YXIgQk9YX0NMQVNTID0gXCJ0aXBweS1ib3hcIjtcbnZhciBDT05URU5UX0NMQVNTID0gXCJ0aXBweS1jb250ZW50XCI7XG52YXIgQkFDS0RST1BfQ0xBU1MgPSBcInRpcHB5LWJhY2tkcm9wXCI7XG52YXIgQVJST1dfQ0xBU1MgPSBcInRpcHB5LWFycm93XCI7XG52YXIgU1ZHX0FSUk9XX0NMQVNTID0gXCJ0aXBweS1zdmctYXJyb3dcIjtcbnZhciBUT1VDSF9PUFRJT05TID0ge1xuICBwYXNzaXZlOiB0cnVlLFxuICBjYXB0dXJlOiB0cnVlXG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIGtleSkge1xuICByZXR1cm4ge30uaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG59XG5mdW5jdGlvbiBnZXRWYWx1ZUF0SW5kZXhPclJldHVybih2YWx1ZSwgaW5kZXgsIGRlZmF1bHRWYWx1ZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICB2YXIgdiA9IHZhbHVlW2luZGV4XTtcbiAgICByZXR1cm4gdiA9PSBudWxsID8gQXJyYXkuaXNBcnJheShkZWZhdWx0VmFsdWUpID8gZGVmYXVsdFZhbHVlW2luZGV4XSA6IGRlZmF1bHRWYWx1ZSA6IHY7XG4gIH1cblxuICByZXR1cm4gdmFsdWU7XG59XG5mdW5jdGlvbiBpc1R5cGUodmFsdWUsIHR5cGUpIHtcbiAgdmFyIHN0ciA9IHt9LnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICByZXR1cm4gc3RyLmluZGV4T2YoJ1tvYmplY3QnKSA9PT0gMCAmJiBzdHIuaW5kZXhPZih0eXBlICsgXCJdXCIpID4gLTE7XG59XG5mdW5jdGlvbiBpbnZva2VXaXRoQXJnc09yUmV0dXJuKHZhbHVlLCBhcmdzKSB7XG4gIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbicgPyB2YWx1ZS5hcHBseSh2b2lkIDAsIGFyZ3MpIDogdmFsdWU7XG59XG5mdW5jdGlvbiBkZWJvdW5jZShmbiwgbXMpIHtcbiAgLy8gQXZvaWQgd3JhcHBpbmcgaW4gYHNldFRpbWVvdXRgIGlmIG1zIGlzIDAgYW55d2F5XG4gIGlmIChtcyA9PT0gMCkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB0aW1lb3V0O1xuICByZXR1cm4gZnVuY3Rpb24gKGFyZykge1xuICAgIGNsZWFyVGltZW91dCh0aW1lb3V0KTtcbiAgICB0aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICBmbihhcmcpO1xuICAgIH0sIG1zKTtcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlbW92ZVByb3BlcnRpZXMob2JqLCBrZXlzKSB7XG4gIHZhciBjbG9uZSA9IE9iamVjdC5hc3NpZ24oe30sIG9iaik7XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgZGVsZXRlIGNsb25lW2tleV07XG4gIH0pO1xuICByZXR1cm4gY2xvbmU7XG59XG5mdW5jdGlvbiBzcGxpdEJ5U3BhY2VzKHZhbHVlKSB7XG4gIHJldHVybiB2YWx1ZS5zcGxpdCgvXFxzKy8pLmZpbHRlcihCb29sZWFuKTtcbn1cbmZ1bmN0aW9uIG5vcm1hbGl6ZVRvQXJyYXkodmFsdWUpIHtcbiAgcmV0dXJuIFtdLmNvbmNhdCh2YWx1ZSk7XG59XG5mdW5jdGlvbiBwdXNoSWZVbmlxdWUoYXJyLCB2YWx1ZSkge1xuICBpZiAoYXJyLmluZGV4T2YodmFsdWUpID09PSAtMSkge1xuICAgIGFyci5wdXNoKHZhbHVlKTtcbiAgfVxufVxuZnVuY3Rpb24gdW5pcXVlKGFycikge1xuICByZXR1cm4gYXJyLmZpbHRlcihmdW5jdGlvbiAoaXRlbSwgaW5kZXgpIHtcbiAgICByZXR1cm4gYXJyLmluZGV4T2YoaXRlbSkgPT09IGluZGV4O1xuICB9KTtcbn1cbmZ1bmN0aW9uIGdldEJhc2VQbGFjZW1lbnQocGxhY2VtZW50KSB7XG4gIHJldHVybiBwbGFjZW1lbnQuc3BsaXQoJy0nKVswXTtcbn1cbmZ1bmN0aW9uIGFycmF5RnJvbSh2YWx1ZSkge1xuICByZXR1cm4gW10uc2xpY2UuY2FsbCh2YWx1ZSk7XG59XG5mdW5jdGlvbiByZW1vdmVVbmRlZmluZWRQcm9wcyhvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgIGlmIChvYmpba2V5XSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBhY2Nba2V5XSA9IG9ialtrZXldO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbn1cblxuZnVuY3Rpb24gZGl2KCkge1xuICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG59XG5mdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHtcbiAgcmV0dXJuIFsnRWxlbWVudCcsICdGcmFnbWVudCddLnNvbWUoZnVuY3Rpb24gKHR5cGUpIHtcbiAgICByZXR1cm4gaXNUeXBlKHZhbHVlLCB0eXBlKTtcbiAgfSk7XG59XG5mdW5jdGlvbiBpc05vZGVMaXN0KHZhbHVlKSB7XG4gIHJldHVybiBpc1R5cGUodmFsdWUsICdOb2RlTGlzdCcpO1xufVxuZnVuY3Rpb24gaXNNb3VzZUV2ZW50KHZhbHVlKSB7XG4gIHJldHVybiBpc1R5cGUodmFsdWUsICdNb3VzZUV2ZW50Jyk7XG59XG5mdW5jdGlvbiBpc1JlZmVyZW5jZUVsZW1lbnQodmFsdWUpIHtcbiAgcmV0dXJuICEhKHZhbHVlICYmIHZhbHVlLl90aXBweSAmJiB2YWx1ZS5fdGlwcHkucmVmZXJlbmNlID09PSB2YWx1ZSk7XG59XG5mdW5jdGlvbiBnZXRBcnJheU9mRWxlbWVudHModmFsdWUpIHtcbiAgaWYgKGlzRWxlbWVudCh2YWx1ZSkpIHtcbiAgICByZXR1cm4gW3ZhbHVlXTtcbiAgfVxuXG4gIGlmIChpc05vZGVMaXN0KHZhbHVlKSkge1xuICAgIHJldHVybiBhcnJheUZyb20odmFsdWUpO1xuICB9XG5cbiAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9XG5cbiAgcmV0dXJuIGFycmF5RnJvbShkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHZhbHVlKSk7XG59XG5mdW5jdGlvbiBzZXRUcmFuc2l0aW9uRHVyYXRpb24oZWxzLCB2YWx1ZSkge1xuICBlbHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IHZhbHVlICsgXCJtc1wiO1xuICAgIH1cbiAgfSk7XG59XG5mdW5jdGlvbiBzZXRWaXNpYmlsaXR5U3RhdGUoZWxzLCBzdGF0ZSkge1xuICBlbHMuZm9yRWFjaChmdW5jdGlvbiAoZWwpIHtcbiAgICBpZiAoZWwpIHtcbiAgICAgIGVsLnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0ZScsIHN0YXRlKTtcbiAgICB9XG4gIH0pO1xufVxuZnVuY3Rpb24gZ2V0T3duZXJEb2N1bWVudChlbGVtZW50T3JFbGVtZW50cykge1xuICB2YXIgX25vcm1hbGl6ZVRvQXJyYXkgPSBub3JtYWxpemVUb0FycmF5KGVsZW1lbnRPckVsZW1lbnRzKSxcbiAgICAgIGVsZW1lbnQgPSBfbm9ybWFsaXplVG9BcnJheVswXTtcblxuICByZXR1cm4gZWxlbWVudCA/IGVsZW1lbnQub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCA6IGRvY3VtZW50O1xufVxuZnVuY3Rpb24gaXNDdXJzb3JPdXRzaWRlSW50ZXJhY3RpdmVCb3JkZXIocG9wcGVyVHJlZURhdGEsIGV2ZW50KSB7XG4gIHZhciBjbGllbnRYID0gZXZlbnQuY2xpZW50WCxcbiAgICAgIGNsaWVudFkgPSBldmVudC5jbGllbnRZO1xuICByZXR1cm4gcG9wcGVyVHJlZURhdGEuZXZlcnkoZnVuY3Rpb24gKF9yZWYpIHtcbiAgICB2YXIgcG9wcGVyUmVjdCA9IF9yZWYucG9wcGVyUmVjdCxcbiAgICAgICAgcG9wcGVyU3RhdGUgPSBfcmVmLnBvcHBlclN0YXRlLFxuICAgICAgICBwcm9wcyA9IF9yZWYucHJvcHM7XG4gICAgdmFyIGludGVyYWN0aXZlQm9yZGVyID0gcHJvcHMuaW50ZXJhY3RpdmVCb3JkZXI7XG4gICAgdmFyIGJhc2VQbGFjZW1lbnQgPSBnZXRCYXNlUGxhY2VtZW50KHBvcHBlclN0YXRlLnBsYWNlbWVudCk7XG4gICAgdmFyIG9mZnNldERhdGEgPSBwb3BwZXJTdGF0ZS5tb2RpZmllcnNEYXRhLm9mZnNldDtcblxuICAgIGlmICghb2Zmc2V0RGF0YSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgdmFyIHRvcERpc3RhbmNlID0gYmFzZVBsYWNlbWVudCA9PT0gJ2JvdHRvbScgPyBvZmZzZXREYXRhLnRvcC55IDogMDtcbiAgICB2YXIgYm90dG9tRGlzdGFuY2UgPSBiYXNlUGxhY2VtZW50ID09PSAndG9wJyA/IG9mZnNldERhdGEuYm90dG9tLnkgOiAwO1xuICAgIHZhciBsZWZ0RGlzdGFuY2UgPSBiYXNlUGxhY2VtZW50ID09PSAncmlnaHQnID8gb2Zmc2V0RGF0YS5sZWZ0LnggOiAwO1xuICAgIHZhciByaWdodERpc3RhbmNlID0gYmFzZVBsYWNlbWVudCA9PT0gJ2xlZnQnID8gb2Zmc2V0RGF0YS5yaWdodC54IDogMDtcbiAgICB2YXIgZXhjZWVkc1RvcCA9IHBvcHBlclJlY3QudG9wIC0gY2xpZW50WSArIHRvcERpc3RhbmNlID4gaW50ZXJhY3RpdmVCb3JkZXI7XG4gICAgdmFyIGV4Y2VlZHNCb3R0b20gPSBjbGllbnRZIC0gcG9wcGVyUmVjdC5ib3R0b20gLSBib3R0b21EaXN0YW5jZSA+IGludGVyYWN0aXZlQm9yZGVyO1xuICAgIHZhciBleGNlZWRzTGVmdCA9IHBvcHBlclJlY3QubGVmdCAtIGNsaWVudFggKyBsZWZ0RGlzdGFuY2UgPiBpbnRlcmFjdGl2ZUJvcmRlcjtcbiAgICB2YXIgZXhjZWVkc1JpZ2h0ID0gY2xpZW50WCAtIHBvcHBlclJlY3QucmlnaHQgLSByaWdodERpc3RhbmNlID4gaW50ZXJhY3RpdmVCb3JkZXI7XG4gICAgcmV0dXJuIGV4Y2VlZHNUb3AgfHwgZXhjZWVkc0JvdHRvbSB8fCBleGNlZWRzTGVmdCB8fCBleGNlZWRzUmlnaHQ7XG4gIH0pO1xufVxuZnVuY3Rpb24gdXBkYXRlVHJhbnNpdGlvbkVuZExpc3RlbmVyKGJveCwgYWN0aW9uLCBsaXN0ZW5lcikge1xuICB2YXIgbWV0aG9kID0gYWN0aW9uICsgXCJFdmVudExpc3RlbmVyXCI7IC8vIHNvbWUgYnJvd3NlcnMgYXBwYXJlbnRseSBzdXBwb3J0IGB0cmFuc2l0aW9uYCAodW5wcmVmaXhlZCkgYnV0IG9ubHkgZmlyZVxuICAvLyBgd2Via2l0VHJhbnNpdGlvbkVuZGAuLi5cblxuICBbJ3RyYW5zaXRpb25lbmQnLCAnd2Via2l0VHJhbnNpdGlvbkVuZCddLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgYm94W21ldGhvZF0oZXZlbnQsIGxpc3RlbmVyKTtcbiAgfSk7XG59XG5cbnZhciBjdXJyZW50SW5wdXQgPSB7XG4gIGlzVG91Y2g6IGZhbHNlXG59O1xudmFyIGxhc3RNb3VzZU1vdmVUaW1lID0gMDtcbi8qKlxuICogV2hlbiBhIGB0b3VjaHN0YXJ0YCBldmVudCBpcyBmaXJlZCwgaXQncyBhc3N1bWVkIHRoZSB1c2VyIGlzIHVzaW5nIHRvdWNoXG4gKiBpbnB1dC4gV2UnbGwgYmluZCBhIGBtb3VzZW1vdmVgIGV2ZW50IGxpc3RlbmVyIHRvIGxpc3RlbiBmb3IgbW91c2UgaW5wdXQgaW5cbiAqIHRoZSBmdXR1cmUuIFRoaXMgd2F5LCB0aGUgYGlzVG91Y2hgIHByb3BlcnR5IGlzIGZ1bGx5IGR5bmFtaWMgYW5kIHdpbGwgaGFuZGxlXG4gKiBoeWJyaWQgZGV2aWNlcyB0aGF0IHVzZSBhIG1peCBvZiB0b3VjaCArIG1vdXNlIGlucHV0LlxuICovXG5cbmZ1bmN0aW9uIG9uRG9jdW1lbnRUb3VjaFN0YXJ0KCkge1xuICBpZiAoY3VycmVudElucHV0LmlzVG91Y2gpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICBjdXJyZW50SW5wdXQuaXNUb3VjaCA9IHRydWU7XG5cbiAgaWYgKHdpbmRvdy5wZXJmb3JtYW5jZSkge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uRG9jdW1lbnRNb3VzZU1vdmUpO1xuICB9XG59XG4vKipcbiAqIFdoZW4gdHdvIGBtb3VzZW1vdmVgIGV2ZW50IGFyZSBmaXJlZCBjb25zZWN1dGl2ZWx5IHdpdGhpbiAyMG1zLCBpdCdzIGFzc3VtZWRcbiAqIHRoZSB1c2VyIGlzIHVzaW5nIG1vdXNlIGlucHV0IGFnYWluLiBgbW91c2Vtb3ZlYCBjYW4gZmlyZSBvbiB0b3VjaCBkZXZpY2VzIGFzXG4gKiB3ZWxsLCBidXQgdmVyeSByYXJlbHkgdGhhdCBxdWlja2x5LlxuICovXG5cbmZ1bmN0aW9uIG9uRG9jdW1lbnRNb3VzZU1vdmUoKSB7XG4gIHZhciBub3cgPSBwZXJmb3JtYW5jZS5ub3coKTtcblxuICBpZiAobm93IC0gbGFzdE1vdXNlTW92ZVRpbWUgPCAyMCkge1xuICAgIGN1cnJlbnRJbnB1dC5pc1RvdWNoID0gZmFsc2U7XG4gICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgb25Eb2N1bWVudE1vdXNlTW92ZSk7XG4gIH1cblxuICBsYXN0TW91c2VNb3ZlVGltZSA9IG5vdztcbn1cbi8qKlxuICogV2hlbiBhbiBlbGVtZW50IGlzIGluIGZvY3VzIGFuZCBoYXMgYSB0aXBweSwgbGVhdmluZyB0aGUgdGFiL3dpbmRvdyBhbmRcbiAqIHJldHVybmluZyBjYXVzZXMgaXQgdG8gc2hvdyBhZ2Fpbi4gRm9yIG1vdXNlIHVzZXJzIHRoaXMgaXMgdW5leHBlY3RlZCwgYnV0XG4gKiBmb3Iga2V5Ym9hcmQgdXNlIGl0IG1ha2VzIHNlbnNlLlxuICogVE9ETzogZmluZCBhIGJldHRlciB0ZWNobmlxdWUgdG8gc29sdmUgdGhpcyBwcm9ibGVtXG4gKi9cblxuZnVuY3Rpb24gb25XaW5kb3dCbHVyKCkge1xuICB2YXIgYWN0aXZlRWxlbWVudCA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7XG5cbiAgaWYgKGlzUmVmZXJlbmNlRWxlbWVudChhY3RpdmVFbGVtZW50KSkge1xuICAgIHZhciBpbnN0YW5jZSA9IGFjdGl2ZUVsZW1lbnQuX3RpcHB5O1xuXG4gICAgaWYgKGFjdGl2ZUVsZW1lbnQuYmx1ciAmJiAhaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICBhY3RpdmVFbGVtZW50LmJsdXIoKTtcbiAgICB9XG4gIH1cbn1cbmZ1bmN0aW9uIGJpbmRHbG9iYWxFdmVudExpc3RlbmVycygpIHtcbiAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIG9uRG9jdW1lbnRUb3VjaFN0YXJ0LCBUT1VDSF9PUFRJT05TKTtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCBvbldpbmRvd0JsdXIpO1xufVxuXG52YXIgaXNCcm93c2VyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJztcbnZhciB1YSA9IGlzQnJvd3NlciA/IG5hdmlnYXRvci51c2VyQWdlbnQgOiAnJztcbnZhciBpc0lFID0gL01TSUUgfFRyaWRlbnRcXC8vLnRlc3QodWEpO1xuXG5mdW5jdGlvbiBjcmVhdGVNZW1vcnlMZWFrV2FybmluZyhtZXRob2QpIHtcbiAgdmFyIHR4dCA9IG1ldGhvZCA9PT0gJ2Rlc3Ryb3knID8gJ24gYWxyZWFkeS0nIDogJyAnO1xuICByZXR1cm4gW21ldGhvZCArIFwiKCkgd2FzIGNhbGxlZCBvbiBhXCIgKyB0eHQgKyBcImRlc3Ryb3llZCBpbnN0YW5jZS4gVGhpcyBpcyBhIG5vLW9wIGJ1dFwiLCAnaW5kaWNhdGVzIGEgcG90ZW50aWFsIG1lbW9yeSBsZWFrLiddLmpvaW4oJyAnKTtcbn1cbmZ1bmN0aW9uIGNsZWFuKHZhbHVlKSB7XG4gIHZhciBzcGFjZXNBbmRUYWJzID0gL1sgXFx0XXsyLH0vZztcbiAgdmFyIGxpbmVTdGFydFdpdGhTcGFjZXMgPSAvXlsgXFx0XSovZ207XG4gIHJldHVybiB2YWx1ZS5yZXBsYWNlKHNwYWNlc0FuZFRhYnMsICcgJykucmVwbGFjZShsaW5lU3RhcnRXaXRoU3BhY2VzLCAnJykudHJpbSgpO1xufVxuXG5mdW5jdGlvbiBnZXREZXZNZXNzYWdlKG1lc3NhZ2UpIHtcbiAgcmV0dXJuIGNsZWFuKFwiXFxuICAlY3RpcHB5LmpzXFxuXFxuICAlY1wiICsgY2xlYW4obWVzc2FnZSkgKyBcIlxcblxcbiAgJWNcXHVEODNEXFx1REM3N1xcdTIwMEQgVGhpcyBpcyBhIGRldmVsb3BtZW50LW9ubHkgbWVzc2FnZS4gSXQgd2lsbCBiZSByZW1vdmVkIGluIHByb2R1Y3Rpb24uXFxuICBcIik7XG59XG5cbmZ1bmN0aW9uIGdldEZvcm1hdHRlZE1lc3NhZ2UobWVzc2FnZSkge1xuICByZXR1cm4gW2dldERldk1lc3NhZ2UobWVzc2FnZSksIC8vIHRpdGxlXG4gICdjb2xvcjogIzAwQzU4NDsgZm9udC1zaXplOiAxLjNlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7JywgLy8gbWVzc2FnZVxuICAnbGluZS1oZWlnaHQ6IDEuNScsIC8vIGZvb3RlclxuICAnY29sb3I6ICNhNmEwOTU7J107XG59IC8vIEFzc3VtZSB3YXJuaW5ncyBhbmQgZXJyb3JzIG5ldmVyIGhhdmUgdGhlIHNhbWUgbWVzc2FnZVxuXG52YXIgdmlzaXRlZE1lc3NhZ2VzO1xuXG5pZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICByZXNldFZpc2l0ZWRNZXNzYWdlcygpO1xufVxuXG5mdW5jdGlvbiByZXNldFZpc2l0ZWRNZXNzYWdlcygpIHtcbiAgdmlzaXRlZE1lc3NhZ2VzID0gbmV3IFNldCgpO1xufVxuZnVuY3Rpb24gd2FybldoZW4oY29uZGl0aW9uLCBtZXNzYWdlKSB7XG4gIGlmIChjb25kaXRpb24gJiYgIXZpc2l0ZWRNZXNzYWdlcy5oYXMobWVzc2FnZSkpIHtcbiAgICB2YXIgX2NvbnNvbGU7XG5cbiAgICB2aXNpdGVkTWVzc2FnZXMuYWRkKG1lc3NhZ2UpO1xuXG4gICAgKF9jb25zb2xlID0gY29uc29sZSkud2Fybi5hcHBseShfY29uc29sZSwgZ2V0Rm9ybWF0dGVkTWVzc2FnZShtZXNzYWdlKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIGVycm9yV2hlbihjb25kaXRpb24sIG1lc3NhZ2UpIHtcbiAgaWYgKGNvbmRpdGlvbiAmJiAhdmlzaXRlZE1lc3NhZ2VzLmhhcyhtZXNzYWdlKSkge1xuICAgIHZhciBfY29uc29sZTI7XG5cbiAgICB2aXNpdGVkTWVzc2FnZXMuYWRkKG1lc3NhZ2UpO1xuXG4gICAgKF9jb25zb2xlMiA9IGNvbnNvbGUpLmVycm9yLmFwcGx5KF9jb25zb2xlMiwgZ2V0Rm9ybWF0dGVkTWVzc2FnZShtZXNzYWdlKSk7XG4gIH1cbn1cbmZ1bmN0aW9uIHZhbGlkYXRlVGFyZ2V0cyh0YXJnZXRzKSB7XG4gIHZhciBkaWRQYXNzRmFsc3lWYWx1ZSA9ICF0YXJnZXRzO1xuICB2YXIgZGlkUGFzc1BsYWluT2JqZWN0ID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHRhcmdldHMpID09PSAnW29iamVjdCBPYmplY3RdJyAmJiAhdGFyZ2V0cy5hZGRFdmVudExpc3RlbmVyO1xuICBlcnJvcldoZW4oZGlkUGFzc0ZhbHN5VmFsdWUsIFsndGlwcHkoKSB3YXMgcGFzc2VkJywgJ2AnICsgU3RyaW5nKHRhcmdldHMpICsgJ2AnLCAnYXMgaXRzIHRhcmdldHMgKGZpcnN0KSBhcmd1bWVudC4gVmFsaWQgdHlwZXMgYXJlOiBTdHJpbmcsIEVsZW1lbnQsJywgJ0VsZW1lbnRbXSwgb3IgTm9kZUxpc3QuJ10uam9pbignICcpKTtcbiAgZXJyb3JXaGVuKGRpZFBhc3NQbGFpbk9iamVjdCwgWyd0aXBweSgpIHdhcyBwYXNzZWQgYSBwbGFpbiBvYmplY3Qgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBhcyBhbiBhcmd1bWVudCcsICdmb3IgdmlydHVhbCBwb3NpdGlvbmluZy4gVXNlIHByb3BzLmdldFJlZmVyZW5jZUNsaWVudFJlY3QgaW5zdGVhZC4nXS5qb2luKCcgJykpO1xufVxuXG52YXIgcGx1Z2luUHJvcHMgPSB7XG4gIGFuaW1hdGVGaWxsOiBmYWxzZSxcbiAgZm9sbG93Q3Vyc29yOiBmYWxzZSxcbiAgaW5saW5lUG9zaXRpb25pbmc6IGZhbHNlLFxuICBzdGlja3k6IGZhbHNlXG59O1xudmFyIHJlbmRlclByb3BzID0ge1xuICBhbGxvd0hUTUw6IGZhbHNlLFxuICBhbmltYXRpb246ICdmYWRlJyxcbiAgYXJyb3c6IHRydWUsXG4gIGNvbnRlbnQ6ICcnLFxuICBpbmVydGlhOiBmYWxzZSxcbiAgbWF4V2lkdGg6IDM1MCxcbiAgcm9sZTogJ3Rvb2x0aXAnLFxuICB0aGVtZTogJycsXG4gIHpJbmRleDogOTk5OVxufTtcbnZhciBkZWZhdWx0UHJvcHMgPSBPYmplY3QuYXNzaWduKHtcbiAgYXBwZW5kVG86IGZ1bmN0aW9uIGFwcGVuZFRvKCkge1xuICAgIHJldHVybiBkb2N1bWVudC5ib2R5O1xuICB9LFxuICBhcmlhOiB7XG4gICAgY29udGVudDogJ2F1dG8nLFxuICAgIGV4cGFuZGVkOiAnYXV0bydcbiAgfSxcbiAgZGVsYXk6IDAsXG4gIGR1cmF0aW9uOiBbMzAwLCAyNTBdLFxuICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiBudWxsLFxuICBoaWRlT25DbGljazogdHJ1ZSxcbiAgaWdub3JlQXR0cmlidXRlczogZmFsc2UsXG4gIGludGVyYWN0aXZlOiBmYWxzZSxcbiAgaW50ZXJhY3RpdmVCb3JkZXI6IDIsXG4gIGludGVyYWN0aXZlRGVib3VuY2U6IDAsXG4gIG1vdmVUcmFuc2l0aW9uOiAnJyxcbiAgb2Zmc2V0OiBbMCwgMTBdLFxuICBvbkFmdGVyVXBkYXRlOiBmdW5jdGlvbiBvbkFmdGVyVXBkYXRlKCkge30sXG4gIG9uQmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBvbkJlZm9yZVVwZGF0ZSgpIHt9LFxuICBvbkNyZWF0ZTogZnVuY3Rpb24gb25DcmVhdGUoKSB7fSxcbiAgb25EZXN0cm95OiBmdW5jdGlvbiBvbkRlc3Ryb3koKSB7fSxcbiAgb25IaWRkZW46IGZ1bmN0aW9uIG9uSGlkZGVuKCkge30sXG4gIG9uSGlkZTogZnVuY3Rpb24gb25IaWRlKCkge30sXG4gIG9uTW91bnQ6IGZ1bmN0aW9uIG9uTW91bnQoKSB7fSxcbiAgb25TaG93OiBmdW5jdGlvbiBvblNob3coKSB7fSxcbiAgb25TaG93bjogZnVuY3Rpb24gb25TaG93bigpIHt9LFxuICBvblRyaWdnZXI6IGZ1bmN0aW9uIG9uVHJpZ2dlcigpIHt9LFxuICBvblVudHJpZ2dlcjogZnVuY3Rpb24gb25VbnRyaWdnZXIoKSB7fSxcbiAgb25DbGlja091dHNpZGU6IGZ1bmN0aW9uIG9uQ2xpY2tPdXRzaWRlKCkge30sXG4gIHBsYWNlbWVudDogJ3RvcCcsXG4gIHBsdWdpbnM6IFtdLFxuICBwb3BwZXJPcHRpb25zOiB7fSxcbiAgcmVuZGVyOiBudWxsLFxuICBzaG93T25DcmVhdGU6IGZhbHNlLFxuICB0b3VjaDogdHJ1ZSxcbiAgdHJpZ2dlcjogJ21vdXNlZW50ZXIgZm9jdXMnLFxuICB0cmlnZ2VyVGFyZ2V0OiBudWxsXG59LCBwbHVnaW5Qcm9wcywge30sIHJlbmRlclByb3BzKTtcbnZhciBkZWZhdWx0S2V5cyA9IE9iamVjdC5rZXlzKGRlZmF1bHRQcm9wcyk7XG52YXIgc2V0RGVmYXVsdFByb3BzID0gZnVuY3Rpb24gc2V0RGVmYXVsdFByb3BzKHBhcnRpYWxQcm9wcykge1xuICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHZhbGlkYXRlUHJvcHMocGFydGlhbFByb3BzLCBbXSk7XG4gIH1cblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHBhcnRpYWxQcm9wcyk7XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgZGVmYXVsdFByb3BzW2tleV0gPSBwYXJ0aWFsUHJvcHNba2V5XTtcbiAgfSk7XG59O1xuZnVuY3Rpb24gZ2V0RXh0ZW5kZWRQYXNzZWRQcm9wcyhwYXNzZWRQcm9wcykge1xuICB2YXIgcGx1Z2lucyA9IHBhc3NlZFByb3BzLnBsdWdpbnMgfHwgW107XG4gIHZhciBwbHVnaW5Qcm9wcyA9IHBsdWdpbnMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHBsdWdpbikge1xuICAgIHZhciBuYW1lID0gcGx1Z2luLm5hbWUsXG4gICAgICAgIGRlZmF1bHRWYWx1ZSA9IHBsdWdpbi5kZWZhdWx0VmFsdWU7XG5cbiAgICBpZiAobmFtZSkge1xuICAgICAgYWNjW25hbWVdID0gcGFzc2VkUHJvcHNbbmFtZV0gIT09IHVuZGVmaW5lZCA/IHBhc3NlZFByb3BzW25hbWVdIDogZGVmYXVsdFZhbHVlO1xuICAgIH1cblxuICAgIHJldHVybiBhY2M7XG4gIH0sIHt9KTtcbiAgcmV0dXJuIE9iamVjdC5hc3NpZ24oe30sIHBhc3NlZFByb3BzLCB7fSwgcGx1Z2luUHJvcHMpO1xufVxuZnVuY3Rpb24gZ2V0RGF0YUF0dHJpYnV0ZVByb3BzKHJlZmVyZW5jZSwgcGx1Z2lucykge1xuICB2YXIgcHJvcEtleXMgPSBwbHVnaW5zID8gT2JqZWN0LmtleXMoZ2V0RXh0ZW5kZWRQYXNzZWRQcm9wcyhPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0UHJvcHMsIHtcbiAgICBwbHVnaW5zOiBwbHVnaW5zXG4gIH0pKSkgOiBkZWZhdWx0S2V5cztcbiAgdmFyIHByb3BzID0gcHJvcEtleXMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGtleSkge1xuICAgIHZhciB2YWx1ZUFzU3RyaW5nID0gKHJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoXCJkYXRhLXRpcHB5LVwiICsga2V5KSB8fCAnJykudHJpbSgpO1xuXG4gICAgaWYgKCF2YWx1ZUFzU3RyaW5nKSB7XG4gICAgICByZXR1cm4gYWNjO1xuICAgIH1cblxuICAgIGlmIChrZXkgPT09ICdjb250ZW50Jykge1xuICAgICAgYWNjW2tleV0gPSB2YWx1ZUFzU3RyaW5nO1xuICAgIH0gZWxzZSB7XG4gICAgICB0cnkge1xuICAgICAgICBhY2Nba2V5XSA9IEpTT04ucGFyc2UodmFsdWVBc1N0cmluZyk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGFjY1trZXldID0gdmFsdWVBc1N0cmluZztcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCB7fSk7XG4gIHJldHVybiBwcm9wcztcbn1cbmZ1bmN0aW9uIGV2YWx1YXRlUHJvcHMocmVmZXJlbmNlLCBwcm9wcykge1xuICB2YXIgb3V0ID0gT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMsIHtcbiAgICBjb250ZW50OiBpbnZva2VXaXRoQXJnc09yUmV0dXJuKHByb3BzLmNvbnRlbnQsIFtyZWZlcmVuY2VdKVxuICB9LCBwcm9wcy5pZ25vcmVBdHRyaWJ1dGVzID8ge30gOiBnZXREYXRhQXR0cmlidXRlUHJvcHMocmVmZXJlbmNlLCBwcm9wcy5wbHVnaW5zKSk7XG4gIG91dC5hcmlhID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFByb3BzLmFyaWEsIHt9LCBvdXQuYXJpYSk7XG4gIG91dC5hcmlhID0ge1xuICAgIGV4cGFuZGVkOiBvdXQuYXJpYS5leHBhbmRlZCA9PT0gJ2F1dG8nID8gcHJvcHMuaW50ZXJhY3RpdmUgOiBvdXQuYXJpYS5leHBhbmRlZCxcbiAgICBjb250ZW50OiBvdXQuYXJpYS5jb250ZW50ID09PSAnYXV0bycgPyBwcm9wcy5pbnRlcmFjdGl2ZSA/IG51bGwgOiAnZGVzY3JpYmVkYnknIDogb3V0LmFyaWEuY29udGVudFxuICB9O1xuICByZXR1cm4gb3V0O1xufVxuZnVuY3Rpb24gdmFsaWRhdGVQcm9wcyhwYXJ0aWFsUHJvcHMsIHBsdWdpbnMpIHtcbiAgaWYgKHBhcnRpYWxQcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgcGFydGlhbFByb3BzID0ge307XG4gIH1cblxuICBpZiAocGx1Z2lucyA9PT0gdm9pZCAwKSB7XG4gICAgcGx1Z2lucyA9IFtdO1xuICB9XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhwYXJ0aWFsUHJvcHMpO1xuICBrZXlzLmZvckVhY2goZnVuY3Rpb24gKHByb3ApIHtcbiAgICB2YXIgbm9uUGx1Z2luUHJvcHMgPSByZW1vdmVQcm9wZXJ0aWVzKGRlZmF1bHRQcm9wcywgT2JqZWN0LmtleXMocGx1Z2luUHJvcHMpKTtcbiAgICB2YXIgZGlkUGFzc1Vua25vd25Qcm9wID0gIWhhc093blByb3BlcnR5KG5vblBsdWdpblByb3BzLCBwcm9wKTsgLy8gQ2hlY2sgaWYgdGhlIHByb3AgZXhpc3RzIGluIGBwbHVnaW5zYFxuXG4gICAgaWYgKGRpZFBhc3NVbmtub3duUHJvcCkge1xuICAgICAgZGlkUGFzc1Vua25vd25Qcm9wID0gcGx1Z2lucy5maWx0ZXIoZnVuY3Rpb24gKHBsdWdpbikge1xuICAgICAgICByZXR1cm4gcGx1Z2luLm5hbWUgPT09IHByb3A7XG4gICAgICB9KS5sZW5ndGggPT09IDA7XG4gICAgfVxuXG4gICAgd2FybldoZW4oZGlkUGFzc1Vua25vd25Qcm9wLCBbXCJgXCIgKyBwcm9wICsgXCJgXCIsIFwiaXMgbm90IGEgdmFsaWQgcHJvcC4gWW91IG1heSBoYXZlIHNwZWxsZWQgaXQgaW5jb3JyZWN0bHksIG9yIGlmIGl0J3NcIiwgJ2EgcGx1Z2luLCBmb3Jnb3QgdG8gcGFzcyBpdCBpbiBhbiBhcnJheSBhcyBwcm9wcy5wbHVnaW5zLicsICdcXG5cXG4nLCAnQWxsIHByb3BzOiBodHRwczovL2F0b21pa3MuZ2l0aHViLmlvL3RpcHB5anMvdjYvYWxsLXByb3BzL1xcbicsICdQbHVnaW5zOiBodHRwczovL2F0b21pa3MuZ2l0aHViLmlvL3RpcHB5anMvdjYvcGx1Z2lucy8nXS5qb2luKCcgJykpO1xuICB9KTtcbn1cblxudmFyIGlubmVySFRNTCA9IGZ1bmN0aW9uIGlubmVySFRNTCgpIHtcbiAgcmV0dXJuICdpbm5lckhUTUwnO1xufTtcblxuZnVuY3Rpb24gZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwoZWxlbWVudCwgaHRtbCkge1xuICBlbGVtZW50W2lubmVySFRNTCgpXSA9IGh0bWw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUFycm93RWxlbWVudCh2YWx1ZSkge1xuICB2YXIgYXJyb3cgPSBkaXYoKTtcblxuICBpZiAodmFsdWUgPT09IHRydWUpIHtcbiAgICBhcnJvdy5jbGFzc05hbWUgPSBBUlJPV19DTEFTUztcbiAgfSBlbHNlIHtcbiAgICBhcnJvdy5jbGFzc05hbWUgPSBTVkdfQVJST1dfQ0xBU1M7XG5cbiAgICBpZiAoaXNFbGVtZW50KHZhbHVlKSkge1xuICAgICAgYXJyb3cuYXBwZW5kQ2hpbGQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTChhcnJvdywgdmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcnJvdztcbn1cblxuZnVuY3Rpb24gc2V0Q29udGVudChjb250ZW50LCBwcm9wcykge1xuICBpZiAoaXNFbGVtZW50KHByb3BzLmNvbnRlbnQpKSB7XG4gICAgZGFuZ2Vyb3VzbHlTZXRJbm5lckhUTUwoY29udGVudCwgJycpO1xuICAgIGNvbnRlbnQuYXBwZW5kQ2hpbGQocHJvcHMuY29udGVudCk7XG4gIH0gZWxzZSBpZiAodHlwZW9mIHByb3BzLmNvbnRlbnQgIT09ICdmdW5jdGlvbicpIHtcbiAgICBpZiAocHJvcHMuYWxsb3dIVE1MKSB7XG4gICAgICBkYW5nZXJvdXNseVNldElubmVySFRNTChjb250ZW50LCBwcm9wcy5jb250ZW50KTtcbiAgICB9IGVsc2Uge1xuICAgICAgY29udGVudC50ZXh0Q29udGVudCA9IHByb3BzLmNvbnRlbnQ7XG4gICAgfVxuICB9XG59XG5mdW5jdGlvbiBnZXRDaGlsZHJlbihwb3BwZXIpIHtcbiAgdmFyIGJveCA9IHBvcHBlci5maXJzdEVsZW1lbnRDaGlsZDtcbiAgdmFyIGJveENoaWxkcmVuID0gYXJyYXlGcm9tKGJveC5jaGlsZHJlbik7XG4gIHJldHVybiB7XG4gICAgYm94OiBib3gsXG4gICAgY29udGVudDogYm94Q2hpbGRyZW4uZmluZChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKENPTlRFTlRfQ0xBU1MpO1xuICAgIH0pLFxuICAgIGFycm93OiBib3hDaGlsZHJlbi5maW5kKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoQVJST1dfQ0xBU1MpIHx8IG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKFNWR19BUlJPV19DTEFTUyk7XG4gICAgfSksXG4gICAgYmFja2Ryb3A6IGJveENoaWxkcmVuLmZpbmQoZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLmNsYXNzTGlzdC5jb250YWlucyhCQUNLRFJPUF9DTEFTUyk7XG4gICAgfSlcbiAgfTtcbn1cbmZ1bmN0aW9uIHJlbmRlcihpbnN0YW5jZSkge1xuICB2YXIgcG9wcGVyID0gZGl2KCk7XG4gIHZhciBib3ggPSBkaXYoKTtcbiAgYm94LmNsYXNzTmFtZSA9IEJPWF9DTEFTUztcbiAgYm94LnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0ZScsICdoaWRkZW4nKTtcbiAgYm94LnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTtcbiAgdmFyIGNvbnRlbnQgPSBkaXYoKTtcbiAgY29udGVudC5jbGFzc05hbWUgPSBDT05URU5UX0NMQVNTO1xuICBjb250ZW50LnNldEF0dHJpYnV0ZSgnZGF0YS1zdGF0ZScsICdoaWRkZW4nKTtcbiAgc2V0Q29udGVudChjb250ZW50LCBpbnN0YW5jZS5wcm9wcyk7XG4gIHBvcHBlci5hcHBlbmRDaGlsZChib3gpO1xuICBib3guYXBwZW5kQ2hpbGQoY29udGVudCk7XG4gIG9uVXBkYXRlKGluc3RhbmNlLnByb3BzLCBpbnN0YW5jZS5wcm9wcyk7XG5cbiAgZnVuY3Rpb24gb25VcGRhdGUocHJldlByb3BzLCBuZXh0UHJvcHMpIHtcbiAgICB2YXIgX2dldENoaWxkcmVuID0gZ2V0Q2hpbGRyZW4ocG9wcGVyKSxcbiAgICAgICAgYm94ID0gX2dldENoaWxkcmVuLmJveCxcbiAgICAgICAgY29udGVudCA9IF9nZXRDaGlsZHJlbi5jb250ZW50LFxuICAgICAgICBhcnJvdyA9IF9nZXRDaGlsZHJlbi5hcnJvdztcblxuICAgIGlmIChuZXh0UHJvcHMudGhlbWUpIHtcbiAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGhlbWUnLCBuZXh0UHJvcHMudGhlbWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICBib3gucmVtb3ZlQXR0cmlidXRlKCdkYXRhLXRoZW1lJyk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBuZXh0UHJvcHMuYW5pbWF0aW9uID09PSAnc3RyaW5nJykge1xuICAgICAgYm94LnNldEF0dHJpYnV0ZSgnZGF0YS1hbmltYXRpb24nLCBuZXh0UHJvcHMuYW5pbWF0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1hbmltYXRpb24nKTtcbiAgICB9XG5cbiAgICBpZiAobmV4dFByb3BzLmluZXJ0aWEpIHtcbiAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ2RhdGEtaW5lcnRpYScsICcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZSgnZGF0YS1pbmVydGlhJyk7XG4gICAgfVxuXG4gICAgYm94LnN0eWxlLm1heFdpZHRoID0gdHlwZW9mIG5leHRQcm9wcy5tYXhXaWR0aCA9PT0gJ251bWJlcicgPyBuZXh0UHJvcHMubWF4V2lkdGggKyBcInB4XCIgOiBuZXh0UHJvcHMubWF4V2lkdGg7XG5cbiAgICBpZiAobmV4dFByb3BzLnJvbGUpIHtcbiAgICAgIGJveC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCBuZXh0UHJvcHMucm9sZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGJveC5yZW1vdmVBdHRyaWJ1dGUoJ3JvbGUnKTtcbiAgICB9XG5cbiAgICBpZiAocHJldlByb3BzLmNvbnRlbnQgIT09IG5leHRQcm9wcy5jb250ZW50IHx8IHByZXZQcm9wcy5hbGxvd0hUTUwgIT09IG5leHRQcm9wcy5hbGxvd0hUTUwpIHtcbiAgICAgIHNldENvbnRlbnQoY29udGVudCwgaW5zdGFuY2UucHJvcHMpO1xuICAgIH1cblxuICAgIGlmIChuZXh0UHJvcHMuYXJyb3cpIHtcbiAgICAgIGlmICghYXJyb3cpIHtcbiAgICAgICAgYm94LmFwcGVuZENoaWxkKGNyZWF0ZUFycm93RWxlbWVudChuZXh0UHJvcHMuYXJyb3cpKTtcbiAgICAgIH0gZWxzZSBpZiAocHJldlByb3BzLmFycm93ICE9PSBuZXh0UHJvcHMuYXJyb3cpIHtcbiAgICAgICAgYm94LnJlbW92ZUNoaWxkKGFycm93KTtcbiAgICAgICAgYm94LmFwcGVuZENoaWxkKGNyZWF0ZUFycm93RWxlbWVudChuZXh0UHJvcHMuYXJyb3cpKTtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGFycm93KSB7XG4gICAgICBib3gucmVtb3ZlQ2hpbGQoYXJyb3cpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB7XG4gICAgcG9wcGVyOiBwb3BwZXIsXG4gICAgb25VcGRhdGU6IG9uVXBkYXRlXG4gIH07XG59IC8vIFJ1bnRpbWUgY2hlY2sgdG8gaWRlbnRpZnkgaWYgdGhlIHJlbmRlciBmdW5jdGlvbiBpcyB0aGUgZGVmYXVsdCBvbmU7IHRoaXNcbi8vIHdheSB3ZSBjYW4gYXBwbHkgZGVmYXVsdCBDU1MgdHJhbnNpdGlvbnMgbG9naWMgYW5kIGl0IGNhbiBiZSB0cmVlLXNoYWtlbiBhd2F5XG5cbnJlbmRlci4kJHRpcHB5ID0gdHJ1ZTtcblxudmFyIGlkQ291bnRlciA9IDE7XG52YXIgbW91c2VNb3ZlTGlzdGVuZXJzID0gW107IC8vIFVzZWQgYnkgYGhpZGVBbGwoKWBcblxudmFyIG1vdW50ZWRJbnN0YW5jZXMgPSBbXTtcbmZ1bmN0aW9uIGNyZWF0ZVRpcHB5KHJlZmVyZW5jZSwgcGFzc2VkUHJvcHMpIHtcbiAgdmFyIHByb3BzID0gZXZhbHVhdGVQcm9wcyhyZWZlcmVuY2UsIE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRQcm9wcywge30sIGdldEV4dGVuZGVkUGFzc2VkUHJvcHMocmVtb3ZlVW5kZWZpbmVkUHJvcHMocGFzc2VkUHJvcHMpKSkpOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8g8J+UkiBQcml2YXRlIG1lbWJlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIHNob3dUaW1lb3V0O1xuICB2YXIgaGlkZVRpbWVvdXQ7XG4gIHZhciBzY2hlZHVsZUhpZGVBbmltYXRpb25GcmFtZTtcbiAgdmFyIGlzVmlzaWJsZUZyb21DbGljayA9IGZhbHNlO1xuICB2YXIgZGlkSGlkZUR1ZVRvRG9jdW1lbnRNb3VzZURvd24gPSBmYWxzZTtcbiAgdmFyIGRpZFRvdWNoTW92ZSA9IGZhbHNlO1xuICB2YXIgaWdub3JlT25GaXJzdFVwZGF0ZSA9IGZhbHNlO1xuICB2YXIgbGFzdFRyaWdnZXJFdmVudDtcbiAgdmFyIGN1cnJlbnRUcmFuc2l0aW9uRW5kTGlzdGVuZXI7XG4gIHZhciBvbkZpcnN0VXBkYXRlO1xuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBkZWJvdW5jZWRPbk1vdXNlTW92ZSA9IGRlYm91bmNlKG9uTW91c2VNb3ZlLCBwcm9wcy5pbnRlcmFjdGl2ZURlYm91bmNlKTtcbiAgdmFyIGN1cnJlbnRUYXJnZXQ7XG4gIHZhciBkb2MgPSBnZXRPd25lckRvY3VtZW50KHByb3BzLnRyaWdnZXJUYXJnZXQgfHwgcmVmZXJlbmNlKTsgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIPCflJEgUHVibGljIG1lbWJlcnNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgdmFyIGlkID0gaWRDb3VudGVyKys7XG4gIHZhciBwb3BwZXJJbnN0YW5jZSA9IG51bGw7XG4gIHZhciBwbHVnaW5zID0gdW5pcXVlKHByb3BzLnBsdWdpbnMpO1xuICB2YXIgc3RhdGUgPSB7XG4gICAgLy8gSXMgdGhlIGluc3RhbmNlIGN1cnJlbnRseSBlbmFibGVkP1xuICAgIGlzRW5hYmxlZDogdHJ1ZSxcbiAgICAvLyBJcyB0aGUgdGlwcHkgY3VycmVudGx5IHNob3dpbmcgYW5kIG5vdCB0cmFuc2l0aW9uaW5nIG91dD9cbiAgICBpc1Zpc2libGU6IGZhbHNlLFxuICAgIC8vIEhhcyB0aGUgaW5zdGFuY2UgYmVlbiBkZXN0cm95ZWQ/XG4gICAgaXNEZXN0cm95ZWQ6IGZhbHNlLFxuICAgIC8vIElzIHRoZSB0aXBweSBjdXJyZW50bHkgbW91bnRlZCB0byB0aGUgRE9NP1xuICAgIGlzTW91bnRlZDogZmFsc2UsXG4gICAgLy8gSGFzIHRoZSB0aXBweSBmaW5pc2hlZCB0cmFuc2l0aW9uaW5nIGluP1xuICAgIGlzU2hvd246IGZhbHNlXG4gIH07XG4gIHZhciBpbnN0YW5jZSA9IHtcbiAgICAvLyBwcm9wZXJ0aWVzXG4gICAgaWQ6IGlkLFxuICAgIHJlZmVyZW5jZTogcmVmZXJlbmNlLFxuICAgIHBvcHBlcjogZGl2KCksXG4gICAgcG9wcGVySW5zdGFuY2U6IHBvcHBlckluc3RhbmNlLFxuICAgIHByb3BzOiBwcm9wcyxcbiAgICBzdGF0ZTogc3RhdGUsXG4gICAgcGx1Z2luczogcGx1Z2lucyxcbiAgICAvLyBtZXRob2RzXG4gICAgY2xlYXJEZWxheVRpbWVvdXRzOiBjbGVhckRlbGF5VGltZW91dHMsXG4gICAgc2V0UHJvcHM6IHNldFByb3BzLFxuICAgIHNldENvbnRlbnQ6IHNldENvbnRlbnQsXG4gICAgc2hvdzogc2hvdyxcbiAgICBoaWRlOiBoaWRlLFxuICAgIGhpZGVXaXRoSW50ZXJhY3Rpdml0eTogaGlkZVdpdGhJbnRlcmFjdGl2aXR5LFxuICAgIGVuYWJsZTogZW5hYmxlLFxuICAgIGRpc2FibGU6IGRpc2FibGUsXG4gICAgdW5tb3VudDogdW5tb3VudCxcbiAgICBkZXN0cm95OiBkZXN0cm95XG4gIH07IC8vIFRPRE86IEludmVzdGlnYXRlIHdoeSB0aGlzIGVhcmx5IHJldHVybiBjYXVzZXMgYSBURFogZXJyb3IgaW4gdGhlIHRlc3RzIOKAlFxuICAvLyBpdCBkb2Vzbid0IHNlZW0gdG8gaGFwcGVuIGluIHRoZSBicm93c2VyXG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGlmICovXG5cbiAgaWYgKCFwcm9wcy5yZW5kZXIpIHtcbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgZXJyb3JXaGVuKHRydWUsICdyZW5kZXIoKSBmdW5jdGlvbiBoYXMgbm90IGJlZW4gc3VwcGxpZWQuJyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGluc3RhbmNlO1xuICB9IC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBJbml0aWFsIG11dGF0aW9uc1xuICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuXG4gIHZhciBfcHJvcHMkcmVuZGVyID0gcHJvcHMucmVuZGVyKGluc3RhbmNlKSxcbiAgICAgIHBvcHBlciA9IF9wcm9wcyRyZW5kZXIucG9wcGVyLFxuICAgICAgb25VcGRhdGUgPSBfcHJvcHMkcmVuZGVyLm9uVXBkYXRlO1xuXG4gIHBvcHBlci5zZXRBdHRyaWJ1dGUoJ2RhdGEtdGlwcHktcm9vdCcsICcnKTtcbiAgcG9wcGVyLmlkID0gXCJ0aXBweS1cIiArIGluc3RhbmNlLmlkO1xuICBpbnN0YW5jZS5wb3BwZXIgPSBwb3BwZXI7XG4gIHJlZmVyZW5jZS5fdGlwcHkgPSBpbnN0YW5jZTtcbiAgcG9wcGVyLl90aXBweSA9IGluc3RhbmNlO1xuICB2YXIgcGx1Z2luc0hvb2tzID0gcGx1Z2lucy5tYXAoZnVuY3Rpb24gKHBsdWdpbikge1xuICAgIHJldHVybiBwbHVnaW4uZm4oaW5zdGFuY2UpO1xuICB9KTtcbiAgdmFyIGhhc0FyaWFFeHBhbmRlZCA9IHJlZmVyZW5jZS5oYXNBdHRyaWJ1dGUoJ2FyaWEtZXhwYW5kZWQnKTtcbiAgYWRkTGlzdGVuZXJzKCk7XG4gIGhhbmRsZUFyaWFFeHBhbmRlZEF0dHJpYnV0ZSgpO1xuICBoYW5kbGVTdHlsZXMoKTtcbiAgaW52b2tlSG9vaygnb25DcmVhdGUnLCBbaW5zdGFuY2VdKTtcblxuICBpZiAocHJvcHMuc2hvd09uQ3JlYXRlKSB7XG4gICAgc2NoZWR1bGVTaG93KCk7XG4gIH0gLy8gUHJldmVudCBhIHRpcHB5IHdpdGggYSBkZWxheSBmcm9tIGhpZGluZyBpZiB0aGUgY3Vyc29yIGxlZnQgdGhlbiByZXR1cm5lZFxuICAvLyBiZWZvcmUgaXQgc3RhcnRlZCBoaWRpbmdcblxuXG4gIHBvcHBlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWVudGVyJywgZnVuY3Rpb24gKCkge1xuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJiBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUpIHtcbiAgICAgIGluc3RhbmNlLmNsZWFyRGVsYXlUaW1lb3V0cygpO1xuICAgIH1cbiAgfSk7XG4gIHBvcHBlci5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWxlYXZlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgaWYgKGluc3RhbmNlLnByb3BzLmludGVyYWN0aXZlICYmIGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignbW91c2VlbnRlcicpID49IDApIHtcbiAgICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBkZWJvdW5jZWRPbk1vdXNlTW92ZSk7XG4gICAgICBkZWJvdW5jZWRPbk1vdXNlTW92ZShldmVudCk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIGluc3RhbmNlOyAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8g8J+UkiBQcml2YXRlIG1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbiAgZnVuY3Rpb24gZ2V0Tm9ybWFsaXplZFRvdWNoU2V0dGluZ3MoKSB7XG4gICAgdmFyIHRvdWNoID0gaW5zdGFuY2UucHJvcHMudG91Y2g7XG4gICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodG91Y2gpID8gdG91Y2ggOiBbdG91Y2gsIDBdO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0SXNDdXN0b21Ub3VjaEJlaGF2aW9yKCkge1xuICAgIHJldHVybiBnZXROb3JtYWxpemVkVG91Y2hTZXR0aW5ncygpWzBdID09PSAnaG9sZCc7XG4gIH1cblxuICBmdW5jdGlvbiBnZXRJc0RlZmF1bHRSZW5kZXJGbigpIHtcbiAgICB2YXIgX2luc3RhbmNlJHByb3BzJHJlbmRlO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIHJldHVybiAhISgoX2luc3RhbmNlJHByb3BzJHJlbmRlID0gaW5zdGFuY2UucHJvcHMucmVuZGVyKSA9PSBudWxsID8gdm9pZCAwIDogX2luc3RhbmNlJHByb3BzJHJlbmRlLiQkdGlwcHkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0Q3VycmVudFRhcmdldCgpIHtcbiAgICByZXR1cm4gY3VycmVudFRhcmdldCB8fCByZWZlcmVuY2U7XG4gIH1cblxuICBmdW5jdGlvbiBnZXREZWZhdWx0VGVtcGxhdGVDaGlsZHJlbigpIHtcbiAgICByZXR1cm4gZ2V0Q2hpbGRyZW4ocG9wcGVyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldERlbGF5KGlzU2hvdykge1xuICAgIC8vIEZvciB0b3VjaCBvciBrZXlib2FyZCBpbnB1dCwgZm9yY2UgYDBgIGRlbGF5IGZvciBVWCByZWFzb25zXG4gICAgLy8gQWxzbyBpZiB0aGUgaW5zdGFuY2UgaXMgbW91bnRlZCBidXQgbm90IHZpc2libGUgKHRyYW5zaXRpb25pbmcgb3V0KSxcbiAgICAvLyBpZ25vcmUgZGVsYXlcbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkICYmICFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgfHwgY3VycmVudElucHV0LmlzVG91Y2ggfHwgbGFzdFRyaWdnZXJFdmVudCAmJiBsYXN0VHJpZ2dlckV2ZW50LnR5cGUgPT09ICdmb2N1cycpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIHJldHVybiBnZXRWYWx1ZUF0SW5kZXhPclJldHVybihpbnN0YW5jZS5wcm9wcy5kZWxheSwgaXNTaG93ID8gMCA6IDEsIGRlZmF1bHRQcm9wcy5kZWxheSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVTdHlsZXMoKSB7XG4gICAgcG9wcGVyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJiBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgPyAnJyA6ICdub25lJztcbiAgICBwb3BwZXIuc3R5bGUuekluZGV4ID0gXCJcIiArIGluc3RhbmNlLnByb3BzLnpJbmRleDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGludm9rZUhvb2soaG9vaywgYXJncywgc2hvdWxkSW52b2tlUHJvcHNIb29rKSB7XG4gICAgaWYgKHNob3VsZEludm9rZVByb3BzSG9vayA9PT0gdm9pZCAwKSB7XG4gICAgICBzaG91bGRJbnZva2VQcm9wc0hvb2sgPSB0cnVlO1xuICAgIH1cblxuICAgIHBsdWdpbnNIb29rcy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW5Ib29rcykge1xuICAgICAgaWYgKHBsdWdpbkhvb2tzW2hvb2tdKSB7XG4gICAgICAgIHBsdWdpbkhvb2tzW2hvb2tdLmFwcGx5KHZvaWQgMCwgYXJncyk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoc2hvdWxkSW52b2tlUHJvcHNIb29rKSB7XG4gICAgICB2YXIgX2luc3RhbmNlJHByb3BzO1xuXG4gICAgICAoX2luc3RhbmNlJHByb3BzID0gaW5zdGFuY2UucHJvcHMpW2hvb2tdLmFwcGx5KF9pbnN0YW5jZSRwcm9wcywgYXJncyk7XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaGFuZGxlQXJpYUNvbnRlbnRBdHRyaWJ1dGUoKSB7XG4gICAgdmFyIGFyaWEgPSBpbnN0YW5jZS5wcm9wcy5hcmlhO1xuXG4gICAgaWYgKCFhcmlhLmNvbnRlbnQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgYXR0ciA9IFwiYXJpYS1cIiArIGFyaWEuY29udGVudDtcbiAgICB2YXIgaWQgPSBwb3BwZXIuaWQ7XG4gICAgdmFyIG5vZGVzID0gbm9ybWFsaXplVG9BcnJheShpbnN0YW5jZS5wcm9wcy50cmlnZ2VyVGFyZ2V0IHx8IHJlZmVyZW5jZSk7XG4gICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuICAgICAgdmFyIGN1cnJlbnRWYWx1ZSA9IG5vZGUuZ2V0QXR0cmlidXRlKGF0dHIpO1xuXG4gICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKGF0dHIsIGN1cnJlbnRWYWx1ZSA/IGN1cnJlbnRWYWx1ZSArIFwiIFwiICsgaWQgOiBpZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgbmV4dFZhbHVlID0gY3VycmVudFZhbHVlICYmIGN1cnJlbnRWYWx1ZS5yZXBsYWNlKGlkLCAnJykudHJpbSgpO1xuXG4gICAgICAgIGlmIChuZXh0VmFsdWUpIHtcbiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShhdHRyLCBuZXh0VmFsdWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKGF0dHIpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBoYW5kbGVBcmlhRXhwYW5kZWRBdHRyaWJ1dGUoKSB7XG4gICAgaWYgKGhhc0FyaWFFeHBhbmRlZCB8fCAhaW5zdGFuY2UucHJvcHMuYXJpYS5leHBhbmRlZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBub2RlcyA9IG5vcm1hbGl6ZVRvQXJyYXkoaW5zdGFuY2UucHJvcHMudHJpZ2dlclRhcmdldCB8fCByZWZlcmVuY2UpO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSkge1xuICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZSAmJiBub2RlID09PSBnZXRDdXJyZW50VGFyZ2V0KCkgPyAndHJ1ZScgOiAnZmFsc2UnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBjbGVhbnVwSW50ZXJhY3RpdmVNb3VzZUxpc3RlbmVycygpIHtcbiAgICBkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZGVib3VuY2VkT25Nb3VzZU1vdmUpO1xuICAgIG1vdXNlTW92ZUxpc3RlbmVycyA9IG1vdXNlTW92ZUxpc3RlbmVycy5maWx0ZXIoZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICByZXR1cm4gbGlzdGVuZXIgIT09IGRlYm91bmNlZE9uTW91c2VNb3ZlO1xuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gb25Eb2N1bWVudFByZXNzKGV2ZW50KSB7XG4gICAgLy8gTW92ZWQgZmluZ2VyIHRvIHNjcm9sbCBpbnN0ZWFkIG9mIGFuIGludGVudGlvbmFsIHRhcCBvdXRzaWRlXG4gICAgaWYgKGN1cnJlbnRJbnB1dC5pc1RvdWNoKSB7XG4gICAgICBpZiAoZGlkVG91Y2hNb3ZlIHx8IGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICB9IC8vIENsaWNrZWQgb24gaW50ZXJhY3RpdmUgcG9wcGVyXG5cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJiBwb3BwZXIuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gQ2xpY2tlZCBvbiB0aGUgZXZlbnQgbGlzdGVuZXJzIHRhcmdldFxuXG5cbiAgICBpZiAoZ2V0Q3VycmVudFRhcmdldCgpLmNvbnRhaW5zKGV2ZW50LnRhcmdldCkpIHtcbiAgICAgIGlmIChjdXJyZW50SW5wdXQuaXNUb3VjaCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgJiYgaW5zdGFuY2UucHJvcHMudHJpZ2dlci5pbmRleE9mKCdjbGljaycpID49IDApIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpbnZva2VIb29rKCdvbkNsaWNrT3V0c2lkZScsIFtpbnN0YW5jZSwgZXZlbnRdKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMuaGlkZU9uQ2xpY2sgPT09IHRydWUpIHtcbiAgICAgIGluc3RhbmNlLmNsZWFyRGVsYXlUaW1lb3V0cygpO1xuICAgICAgaW5zdGFuY2UuaGlkZSgpOyAvLyBgbW91c2Vkb3duYCBldmVudCBpcyBmaXJlZCByaWdodCBiZWZvcmUgYGZvY3VzYCBpZiBwcmVzc2luZyB0aGVcbiAgICAgIC8vIGN1cnJlbnRUYXJnZXQuIFRoaXMgbGV0cyBhIHRpcHB5IHdpdGggYGZvY3VzYCB0cmlnZ2VyIGtub3cgdGhhdCBpdFxuICAgICAgLy8gc2hvdWxkIG5vdCBzaG93XG5cbiAgICAgIGRpZEhpZGVEdWVUb0RvY3VtZW50TW91c2VEb3duID0gdHJ1ZTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBkaWRIaWRlRHVlVG9Eb2N1bWVudE1vdXNlRG93biA9IGZhbHNlO1xuICAgICAgfSk7IC8vIFRoZSBsaXN0ZW5lciBnZXRzIGFkZGVkIGluIGBzY2hlZHVsZVNob3coKWAsIGJ1dCB0aGlzIG1heSBiZSBoaWRpbmcgaXRcbiAgICAgIC8vIGJlZm9yZSBpdCBzaG93cywgYW5kIGhpZGUoKSdzIGVhcmx5IGJhaWwtb3V0IGJlaGF2aW9yIGNhbiBwcmV2ZW50IGl0XG4gICAgICAvLyBmcm9tIGJlaW5nIGNsZWFuZWQgdXBcblxuICAgICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgICAgcmVtb3ZlRG9jdW1lbnRQcmVzcygpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVG91Y2hNb3ZlKCkge1xuICAgIGRpZFRvdWNoTW92ZSA9IHRydWU7XG4gIH1cblxuICBmdW5jdGlvbiBvblRvdWNoU3RhcnQoKSB7XG4gICAgZGlkVG91Y2hNb3ZlID0gZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBhZGREb2N1bWVudFByZXNzKCkge1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbkRvY3VtZW50UHJlc3MsIHRydWUpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uRG9jdW1lbnRQcmVzcywgVE9VQ0hfT1BUSU9OUyk7XG4gICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIFRPVUNIX09QVElPTlMpO1xuICAgIGRvYy5hZGRFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgVE9VQ0hfT1BUSU9OUyk7XG4gIH1cblxuICBmdW5jdGlvbiByZW1vdmVEb2N1bWVudFByZXNzKCkge1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBvbkRvY3VtZW50UHJlc3MsIHRydWUpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIG9uRG9jdW1lbnRQcmVzcywgVE9VQ0hfT1BUSU9OUyk7XG4gICAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCBvblRvdWNoU3RhcnQsIFRPVUNIX09QVElPTlMpO1xuICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgVE9VQ0hfT1BUSU9OUyk7XG4gIH1cblxuICBmdW5jdGlvbiBvblRyYW5zaXRpb25lZE91dChkdXJhdGlvbiwgY2FsbGJhY2spIHtcbiAgICBvblRyYW5zaXRpb25FbmQoZHVyYXRpb24sIGZ1bmN0aW9uICgpIHtcbiAgICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlICYmIHBvcHBlci5wYXJlbnROb2RlICYmIHBvcHBlci5wYXJlbnROb2RlLmNvbnRhaW5zKHBvcHBlcikpIHtcbiAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVHJhbnNpdGlvbmVkSW4oZHVyYXRpb24sIGNhbGxiYWNrKSB7XG4gICAgb25UcmFuc2l0aW9uRW5kKGR1cmF0aW9uLCBjYWxsYmFjayk7XG4gIH1cblxuICBmdW5jdGlvbiBvblRyYW5zaXRpb25FbmQoZHVyYXRpb24sIGNhbGxiYWNrKSB7XG4gICAgdmFyIGJveCA9IGdldERlZmF1bHRUZW1wbGF0ZUNoaWxkcmVuKCkuYm94O1xuXG4gICAgZnVuY3Rpb24gbGlzdGVuZXIoZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGJveCkge1xuICAgICAgICB1cGRhdGVUcmFuc2l0aW9uRW5kTGlzdGVuZXIoYm94LCAncmVtb3ZlJywgbGlzdGVuZXIpO1xuICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgfVxuICAgIH0gLy8gTWFrZSBjYWxsYmFjayBzeW5jaHJvbm91cyBpZiBkdXJhdGlvbiBpcyAwXG4gICAgLy8gYHRyYW5zaXRpb25lbmRgIHdvbid0IGZpcmUgb3RoZXJ3aXNlXG5cblxuICAgIGlmIChkdXJhdGlvbiA9PT0gMCkge1xuICAgICAgcmV0dXJuIGNhbGxiYWNrKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlVHJhbnNpdGlvbkVuZExpc3RlbmVyKGJveCwgJ3JlbW92ZScsIGN1cnJlbnRUcmFuc2l0aW9uRW5kTGlzdGVuZXIpO1xuICAgIHVwZGF0ZVRyYW5zaXRpb25FbmRMaXN0ZW5lcihib3gsICdhZGQnLCBsaXN0ZW5lcik7XG4gICAgY3VycmVudFRyYW5zaXRpb25FbmRMaXN0ZW5lciA9IGxpc3RlbmVyO1xuICB9XG5cbiAgZnVuY3Rpb24gb24oZXZlbnRUeXBlLCBoYW5kbGVyLCBvcHRpb25zKSB7XG4gICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkge1xuICAgICAgb3B0aW9ucyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHZhciBub2RlcyA9IG5vcm1hbGl6ZVRvQXJyYXkoaW5zdGFuY2UucHJvcHMudHJpZ2dlclRhcmdldCB8fCByZWZlcmVuY2UpO1xuICAgIG5vZGVzLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcbiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudFR5cGUsIGhhbmRsZXIsIG9wdGlvbnMpO1xuICAgICAgbGlzdGVuZXJzLnB1c2goe1xuICAgICAgICBub2RlOiBub2RlLFxuICAgICAgICBldmVudFR5cGU6IGV2ZW50VHlwZSxcbiAgICAgICAgaGFuZGxlcjogaGFuZGxlcixcbiAgICAgICAgb3B0aW9uczogb3B0aW9uc1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBhZGRMaXN0ZW5lcnMoKSB7XG4gICAgaWYgKGdldElzQ3VzdG9tVG91Y2hCZWhhdmlvcigpKSB7XG4gICAgICBvbigndG91Y2hzdGFydCcsIG9uVHJpZ2dlciwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICAgIG9uKCd0b3VjaGVuZCcsIG9uTW91c2VMZWF2ZSwge1xuICAgICAgICBwYXNzaXZlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBzcGxpdEJ5U3BhY2VzKGluc3RhbmNlLnByb3BzLnRyaWdnZXIpLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50VHlwZSkge1xuICAgICAgaWYgKGV2ZW50VHlwZSA9PT0gJ21hbnVhbCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICBvbihldmVudFR5cGUsIG9uVHJpZ2dlcik7XG5cbiAgICAgIHN3aXRjaCAoZXZlbnRUeXBlKSB7XG4gICAgICAgIGNhc2UgJ21vdXNlZW50ZXInOlxuICAgICAgICAgIG9uKCdtb3VzZWxlYXZlJywgb25Nb3VzZUxlYXZlKTtcbiAgICAgICAgICBicmVhaztcblxuICAgICAgICBjYXNlICdmb2N1cyc6XG4gICAgICAgICAgb24oaXNJRSA/ICdmb2N1c291dCcgOiAnYmx1cicsIG9uQmx1ck9yRm9jdXNPdXQpO1xuICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgIGNhc2UgJ2ZvY3VzaW4nOlxuICAgICAgICAgIG9uKCdmb2N1c291dCcsIG9uQmx1ck9yRm9jdXNPdXQpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKCkge1xuICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgbm9kZSA9IF9yZWYubm9kZSxcbiAgICAgICAgICBldmVudFR5cGUgPSBfcmVmLmV2ZW50VHlwZSxcbiAgICAgICAgICBoYW5kbGVyID0gX3JlZi5oYW5kbGVyLFxuICAgICAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbiAgICBsaXN0ZW5lcnMgPSBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uVHJpZ2dlcihldmVudCkge1xuICAgIHZhciBfbGFzdFRyaWdnZXJFdmVudDtcblxuICAgIHZhciBzaG91bGRTY2hlZHVsZUNsaWNrSGlkZSA9IGZhbHNlO1xuXG4gICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc0VuYWJsZWQgfHwgaXNFdmVudExpc3RlbmVyU3RvcHBlZChldmVudCkgfHwgZGlkSGlkZUR1ZVRvRG9jdW1lbnRNb3VzZURvd24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgd2FzRm9jdXNlZCA9ICgoX2xhc3RUcmlnZ2VyRXZlbnQgPSBsYXN0VHJpZ2dlckV2ZW50KSA9PSBudWxsID8gdm9pZCAwIDogX2xhc3RUcmlnZ2VyRXZlbnQudHlwZSkgPT09ICdmb2N1cyc7XG4gICAgbGFzdFRyaWdnZXJFdmVudCA9IGV2ZW50O1xuICAgIGN1cnJlbnRUYXJnZXQgPSBldmVudC5jdXJyZW50VGFyZ2V0O1xuICAgIGhhbmRsZUFyaWFFeHBhbmRlZEF0dHJpYnV0ZSgpO1xuXG4gICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgJiYgaXNNb3VzZUV2ZW50KGV2ZW50KSkge1xuICAgICAgLy8gSWYgc2Nyb2xsaW5nLCBgbW91c2VlbnRlcmAgZXZlbnRzIGNhbiBiZSBmaXJlZCBpZiB0aGUgY3Vyc29yIGxhbmRzXG4gICAgICAvLyBvdmVyIGEgbmV3IHRhcmdldCwgYnV0IGBtb3VzZW1vdmVgIGV2ZW50cyBkb24ndCBnZXQgZmlyZWQuIFRoaXNcbiAgICAgIC8vIGNhdXNlcyBpbnRlcmFjdGl2ZSB0b29sdGlwcyB0byBnZXQgc3R1Y2sgb3BlbiB1bnRpbCB0aGUgY3Vyc29yIGlzXG4gICAgICAvLyBtb3ZlZFxuICAgICAgbW91c2VNb3ZlTGlzdGVuZXJzLmZvckVhY2goZnVuY3Rpb24gKGxpc3RlbmVyKSB7XG4gICAgICAgIHJldHVybiBsaXN0ZW5lcihldmVudCk7XG4gICAgICB9KTtcbiAgICB9IC8vIFRvZ2dsZSBzaG93L2hpZGUgd2hlbiBjbGlja2luZyBjbGljay10cmlnZ2VyZWQgdG9vbHRpcHNcblxuXG4gICAgaWYgKGV2ZW50LnR5cGUgPT09ICdjbGljaycgJiYgKGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignbW91c2VlbnRlcicpIDwgMCB8fCBpc1Zpc2libGVGcm9tQ2xpY2spICYmIGluc3RhbmNlLnByb3BzLmhpZGVPbkNsaWNrICE9PSBmYWxzZSAmJiBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUpIHtcbiAgICAgIHNob3VsZFNjaGVkdWxlQ2xpY2tIaWRlID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgc2NoZWR1bGVTaG93KGV2ZW50KTtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaXNWaXNpYmxlRnJvbUNsaWNrID0gIXNob3VsZFNjaGVkdWxlQ2xpY2tIaWRlO1xuICAgIH1cblxuICAgIGlmIChzaG91bGRTY2hlZHVsZUNsaWNrSGlkZSAmJiAhd2FzRm9jdXNlZCkge1xuICAgICAgc2NoZWR1bGVIaWRlKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdXNlTW92ZShldmVudCkge1xuICAgIHZhciB0YXJnZXQgPSBldmVudC50YXJnZXQ7XG4gICAgdmFyIGlzQ3Vyc29yT3ZlclJlZmVyZW5jZU9yUG9wcGVyID0gZ2V0Q3VycmVudFRhcmdldCgpLmNvbnRhaW5zKHRhcmdldCkgfHwgcG9wcGVyLmNvbnRhaW5zKHRhcmdldCk7XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ21vdXNlbW92ZScgJiYgaXNDdXJzb3JPdmVyUmVmZXJlbmNlT3JQb3BwZXIpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcG9wcGVyVHJlZURhdGEgPSBnZXROZXN0ZWRQb3BwZXJUcmVlKCkuY29uY2F0KHBvcHBlcikubWFwKGZ1bmN0aW9uIChwb3BwZXIpIHtcbiAgICAgIHZhciBfaW5zdGFuY2UkcG9wcGVySW5zdGE7XG5cbiAgICAgIHZhciBpbnN0YW5jZSA9IHBvcHBlci5fdGlwcHk7XG4gICAgICB2YXIgc3RhdGUgPSAoX2luc3RhbmNlJHBvcHBlckluc3RhID0gaW5zdGFuY2UucG9wcGVySW5zdGFuY2UpID09IG51bGwgPyB2b2lkIDAgOiBfaW5zdGFuY2UkcG9wcGVySW5zdGEuc3RhdGU7XG5cbiAgICAgIGlmIChzdGF0ZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHBvcHBlclJlY3Q6IHBvcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxcbiAgICAgICAgICBwb3BwZXJTdGF0ZTogc3RhdGUsXG4gICAgICAgICAgcHJvcHM6IHByb3BzXG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0pLmZpbHRlcihCb29sZWFuKTtcblxuICAgIGlmIChpc0N1cnNvck91dHNpZGVJbnRlcmFjdGl2ZUJvcmRlcihwb3BwZXJUcmVlRGF0YSwgZXZlbnQpKSB7XG4gICAgICBjbGVhbnVwSW50ZXJhY3RpdmVNb3VzZUxpc3RlbmVycygpO1xuICAgICAgc2NoZWR1bGVIaWRlKGV2ZW50KTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbk1vdXNlTGVhdmUoZXZlbnQpIHtcbiAgICB2YXIgc2hvdWxkQmFpbCA9IGlzRXZlbnRMaXN0ZW5lclN0b3BwZWQoZXZlbnQpIHx8IGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignY2xpY2snKSA+PSAwICYmIGlzVmlzaWJsZUZyb21DbGljaztcblxuICAgIGlmIChzaG91bGRCYWlsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzLmludGVyYWN0aXZlKSB7XG4gICAgICBpbnN0YW5jZS5oaWRlV2l0aEludGVyYWN0aXZpdHkoZXZlbnQpO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNjaGVkdWxlSGlkZShldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBvbkJsdXJPckZvY3VzT3V0KGV2ZW50KSB7XG4gICAgaWYgKGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignZm9jdXNpbicpIDwgMCAmJiBldmVudC50YXJnZXQgIT09IGdldEN1cnJlbnRUYXJnZXQoKSkge1xuICAgICAgcmV0dXJuO1xuICAgIH0gLy8gSWYgZm9jdXMgd2FzIG1vdmVkIHRvIHdpdGhpbiB0aGUgcG9wcGVyXG5cblxuICAgIGlmIChpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJiBldmVudC5yZWxhdGVkVGFyZ2V0ICYmIHBvcHBlci5jb250YWlucyhldmVudC5yZWxhdGVkVGFyZ2V0KSkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHNjaGVkdWxlSGlkZShldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiBpc0V2ZW50TGlzdGVuZXJTdG9wcGVkKGV2ZW50KSB7XG4gICAgcmV0dXJuIGN1cnJlbnRJbnB1dC5pc1RvdWNoID8gZ2V0SXNDdXN0b21Ub3VjaEJlaGF2aW9yKCkgIT09IGV2ZW50LnR5cGUuaW5kZXhPZigndG91Y2gnKSA+PSAwIDogZmFsc2U7XG4gIH1cblxuICBmdW5jdGlvbiBjcmVhdGVQb3BwZXJJbnN0YW5jZSgpIHtcbiAgICBkZXN0cm95UG9wcGVySW5zdGFuY2UoKTtcbiAgICB2YXIgX2luc3RhbmNlJHByb3BzMiA9IGluc3RhbmNlLnByb3BzLFxuICAgICAgICBwb3BwZXJPcHRpb25zID0gX2luc3RhbmNlJHByb3BzMi5wb3BwZXJPcHRpb25zLFxuICAgICAgICBwbGFjZW1lbnQgPSBfaW5zdGFuY2UkcHJvcHMyLnBsYWNlbWVudCxcbiAgICAgICAgb2Zmc2V0ID0gX2luc3RhbmNlJHByb3BzMi5vZmZzZXQsXG4gICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3QgPSBfaW5zdGFuY2UkcHJvcHMyLmdldFJlZmVyZW5jZUNsaWVudFJlY3QsXG4gICAgICAgIG1vdmVUcmFuc2l0aW9uID0gX2luc3RhbmNlJHByb3BzMi5tb3ZlVHJhbnNpdGlvbjtcbiAgICB2YXIgYXJyb3cgPSBnZXRJc0RlZmF1bHRSZW5kZXJGbigpID8gZ2V0Q2hpbGRyZW4ocG9wcGVyKS5hcnJvdyA6IG51bGw7XG4gICAgdmFyIGNvbXB1dGVkUmVmZXJlbmNlID0gZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdCA/IHtcbiAgICAgIGdldEJvdW5kaW5nQ2xpZW50UmVjdDogZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdCxcbiAgICAgIGNvbnRleHRFbGVtZW50OiBnZXRSZWZlcmVuY2VDbGllbnRSZWN0LmNvbnRleHRFbGVtZW50IHx8IGdldEN1cnJlbnRUYXJnZXQoKVxuICAgIH0gOiByZWZlcmVuY2U7XG4gICAgdmFyIHRpcHB5TW9kaWZpZXIgPSB7XG4gICAgICBuYW1lOiAnJCR0aXBweScsXG4gICAgICBlbmFibGVkOiB0cnVlLFxuICAgICAgcGhhc2U6ICdiZWZvcmVXcml0ZScsXG4gICAgICByZXF1aXJlczogWydjb21wdXRlU3R5bGVzJ10sXG4gICAgICBmbjogZnVuY3Rpb24gZm4oX3JlZjIpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGU7XG5cbiAgICAgICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgICAgICB2YXIgX2dldERlZmF1bHRUZW1wbGF0ZUNoID0gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKSxcbiAgICAgICAgICAgICAgYm94ID0gX2dldERlZmF1bHRUZW1wbGF0ZUNoLmJveDtcblxuICAgICAgICAgIFsncGxhY2VtZW50JywgJ3JlZmVyZW5jZS1oaWRkZW4nLCAnZXNjYXBlZCddLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHtcbiAgICAgICAgICAgIGlmIChhdHRyID09PSAncGxhY2VtZW50Jykge1xuICAgICAgICAgICAgICBib3guc2V0QXR0cmlidXRlKCdkYXRhLXBsYWNlbWVudCcsIHN0YXRlLnBsYWNlbWVudCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBpZiAoc3RhdGUuYXR0cmlidXRlcy5wb3BwZXJbXCJkYXRhLXBvcHBlci1cIiArIGF0dHJdKSB7XG4gICAgICAgICAgICAgICAgYm94LnNldEF0dHJpYnV0ZShcImRhdGEtXCIgKyBhdHRyLCAnJyk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYm94LnJlbW92ZUF0dHJpYnV0ZShcImRhdGEtXCIgKyBhdHRyKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgICAgIHN0YXRlLmF0dHJpYnV0ZXMucG9wcGVyID0ge307XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICAgIHZhciBtb2RpZmllcnMgPSBbe1xuICAgICAgbmFtZTogJ29mZnNldCcsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIG9mZnNldDogb2Zmc2V0XG4gICAgICB9XG4gICAgfSwge1xuICAgICAgbmFtZTogJ3ByZXZlbnRPdmVyZmxvdycsXG4gICAgICBvcHRpb25zOiB7XG4gICAgICAgIHBhZGRpbmc6IHtcbiAgICAgICAgICB0b3A6IDIsXG4gICAgICAgICAgYm90dG9tOiAyLFxuICAgICAgICAgIGxlZnQ6IDUsXG4gICAgICAgICAgcmlnaHQ6IDVcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdmbGlwJyxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgcGFkZGluZzogNVxuICAgICAgfVxuICAgIH0sIHtcbiAgICAgIG5hbWU6ICdjb21wdXRlU3R5bGVzJyxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgYWRhcHRpdmU6ICFtb3ZlVHJhbnNpdGlvblxuICAgICAgfVxuICAgIH0sIHRpcHB5TW9kaWZpZXJdO1xuXG4gICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkgJiYgYXJyb3cpIHtcbiAgICAgIG1vZGlmaWVycy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ2Fycm93JyxcbiAgICAgICAgb3B0aW9uczoge1xuICAgICAgICAgIGVsZW1lbnQ6IGFycm93LFxuICAgICAgICAgIHBhZGRpbmc6IDNcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgbW9kaWZpZXJzLnB1c2guYXBwbHkobW9kaWZpZXJzLCAocG9wcGVyT3B0aW9ucyA9PSBudWxsID8gdm9pZCAwIDogcG9wcGVyT3B0aW9ucy5tb2RpZmllcnMpIHx8IFtdKTtcbiAgICBpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZSA9IGNvcmUuY3JlYXRlUG9wcGVyKGNvbXB1dGVkUmVmZXJlbmNlLCBwb3BwZXIsIE9iamVjdC5hc3NpZ24oe30sIHBvcHBlck9wdGlvbnMsIHtcbiAgICAgIHBsYWNlbWVudDogcGxhY2VtZW50LFxuICAgICAgb25GaXJzdFVwZGF0ZTogb25GaXJzdFVwZGF0ZSxcbiAgICAgIG1vZGlmaWVyczogbW9kaWZpZXJzXG4gICAgfSkpO1xuICB9XG5cbiAgZnVuY3Rpb24gZGVzdHJveVBvcHBlckluc3RhbmNlKCkge1xuICAgIGlmIChpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZSkge1xuICAgICAgaW5zdGFuY2UucG9wcGVySW5zdGFuY2UuZGVzdHJveSgpO1xuICAgICAgaW5zdGFuY2UucG9wcGVySW5zdGFuY2UgPSBudWxsO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG1vdW50KCkge1xuICAgIHZhciBhcHBlbmRUbyA9IGluc3RhbmNlLnByb3BzLmFwcGVuZFRvO1xuICAgIHZhciBwYXJlbnROb2RlOyAvLyBCeSBkZWZhdWx0LCB3ZSdsbCBhcHBlbmQgdGhlIHBvcHBlciB0byB0aGUgdHJpZ2dlclRhcmdldHMncyBwYXJlbnROb2RlIHNvXG4gICAgLy8gaXQncyBkaXJlY3RseSBhZnRlciB0aGUgcmVmZXJlbmNlIGVsZW1lbnQgc28gdGhlIGVsZW1lbnRzIGluc2lkZSB0aGVcbiAgICAvLyB0aXBweSBjYW4gYmUgdGFiYmVkIHRvXG4gICAgLy8gSWYgdGhlcmUgYXJlIGNsaXBwaW5nIGlzc3VlcywgdGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBkaWZmZXJlbnQgYXBwZW5kVG9cbiAgICAvLyBhbmQgZW5zdXJlIGZvY3VzIG1hbmFnZW1lbnQgaXMgaGFuZGxlZCBjb3JyZWN0bHkgbWFudWFsbHlcblxuICAgIHZhciBub2RlID0gZ2V0Q3VycmVudFRhcmdldCgpO1xuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzLmludGVyYWN0aXZlICYmIGFwcGVuZFRvID09PSBkZWZhdWx0UHJvcHMuYXBwZW5kVG8gfHwgYXBwZW5kVG8gPT09ICdwYXJlbnQnKSB7XG4gICAgICBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlO1xuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnROb2RlID0gaW52b2tlV2l0aEFyZ3NPclJldHVybihhcHBlbmRUbywgW25vZGVdKTtcbiAgICB9IC8vIFRoZSBwb3BwZXIgZWxlbWVudCBuZWVkcyB0byBleGlzdCBvbiB0aGUgRE9NIGJlZm9yZSBpdHMgcG9zaXRpb24gY2FuIGJlXG4gICAgLy8gdXBkYXRlZCBhcyBQb3BwZXIgbmVlZHMgdG8gcmVhZCBpdHMgZGltZW5zaW9uc1xuXG5cbiAgICBpZiAoIXBhcmVudE5vZGUuY29udGFpbnMocG9wcGVyKSkge1xuICAgICAgcGFyZW50Tm9kZS5hcHBlbmRDaGlsZChwb3BwZXIpO1xuICAgIH1cblxuICAgIGNyZWF0ZVBvcHBlckluc3RhbmNlKCk7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblxuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICAvLyBBY2Nlc3NpYmlsaXR5IGNoZWNrXG4gICAgICB3YXJuV2hlbihpbnN0YW5jZS5wcm9wcy5pbnRlcmFjdGl2ZSAmJiBhcHBlbmRUbyA9PT0gZGVmYXVsdFByb3BzLmFwcGVuZFRvICYmIG5vZGUubmV4dEVsZW1lbnRTaWJsaW5nICE9PSBwb3BwZXIsIFsnSW50ZXJhY3RpdmUgdGlwcHkgZWxlbWVudCBtYXkgbm90IGJlIGFjY2Vzc2libGUgdmlhIGtleWJvYXJkJywgJ25hdmlnYXRpb24gYmVjYXVzZSBpdCBpcyBub3QgZGlyZWN0bHkgYWZ0ZXIgdGhlIHJlZmVyZW5jZSBlbGVtZW50JywgJ2luIHRoZSBET00gc291cmNlIG9yZGVyLicsICdcXG5cXG4nLCAnVXNpbmcgYSB3cmFwcGVyIDxkaXY+IG9yIDxzcGFuPiB0YWcgYXJvdW5kIHRoZSByZWZlcmVuY2UgZWxlbWVudCcsICdzb2x2ZXMgdGhpcyBieSBjcmVhdGluZyBhIG5ldyBwYXJlbnROb2RlIGNvbnRleHQuJywgJ1xcblxcbicsICdTcGVjaWZ5aW5nIGBhcHBlbmRUbzogZG9jdW1lbnQuYm9keWAgc2lsZW5jZXMgdGhpcyB3YXJuaW5nLCBidXQgaXQnLCAnYXNzdW1lcyB5b3UgYXJlIHVzaW5nIGEgZm9jdXMgbWFuYWdlbWVudCBzb2x1dGlvbiB0byBoYW5kbGUnLCAna2V5Ym9hcmQgbmF2aWdhdGlvbi4nLCAnXFxuXFxuJywgJ1NlZTogaHR0cHM6Ly9hdG9taWtzLmdpdGh1Yi5pby90aXBweWpzL3Y2L2FjY2Vzc2liaWxpdHkvI2ludGVyYWN0aXZpdHknXS5qb2luKCcgJykpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGdldE5lc3RlZFBvcHBlclRyZWUoKSB7XG4gICAgcmV0dXJuIGFycmF5RnJvbShwb3BwZXIucXVlcnlTZWxlY3RvckFsbCgnW2RhdGEtdGlwcHktcm9vdF0nKSk7XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZVNob3coZXZlbnQpIHtcbiAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcblxuICAgIGlmIChldmVudCkge1xuICAgICAgaW52b2tlSG9vaygnb25UcmlnZ2VyJywgW2luc3RhbmNlLCBldmVudF0pO1xuICAgIH1cblxuICAgIGFkZERvY3VtZW50UHJlc3MoKTtcbiAgICB2YXIgZGVsYXkgPSBnZXREZWxheSh0cnVlKTtcblxuICAgIHZhciBfZ2V0Tm9ybWFsaXplZFRvdWNoU2UgPSBnZXROb3JtYWxpemVkVG91Y2hTZXR0aW5ncygpLFxuICAgICAgICB0b3VjaFZhbHVlID0gX2dldE5vcm1hbGl6ZWRUb3VjaFNlWzBdLFxuICAgICAgICB0b3VjaERlbGF5ID0gX2dldE5vcm1hbGl6ZWRUb3VjaFNlWzFdO1xuXG4gICAgaWYgKGN1cnJlbnRJbnB1dC5pc1RvdWNoICYmIHRvdWNoVmFsdWUgPT09ICdob2xkJyAmJiB0b3VjaERlbGF5KSB7XG4gICAgICBkZWxheSA9IHRvdWNoRGVsYXk7XG4gICAgfVxuXG4gICAgaWYgKGRlbGF5KSB7XG4gICAgICBzaG93VGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICBpbnN0YW5jZS5zaG93KCk7XG4gICAgICB9LCBkZWxheSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnNob3coKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBzY2hlZHVsZUhpZGUoZXZlbnQpIHtcbiAgICBpbnN0YW5jZS5jbGVhckRlbGF5VGltZW91dHMoKTtcbiAgICBpbnZva2VIb29rKCdvblVudHJpZ2dlcicsIFtpbnN0YW5jZSwgZXZlbnRdKTtcblxuICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICByZW1vdmVEb2N1bWVudFByZXNzKCk7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBGb3IgaW50ZXJhY3RpdmUgdGlwcGllcywgc2NoZWR1bGVIaWRlIGlzIGFkZGVkIHRvIGEgZG9jdW1lbnQuYm9keSBoYW5kbGVyXG4gICAgLy8gZnJvbSBvbk1vdXNlTGVhdmUgc28gbXVzdCBpbnRlcmNlcHQgc2NoZWR1bGVkIGhpZGVzIGZyb20gbW91c2Vtb3ZlL2xlYXZlXG4gICAgLy8gZXZlbnRzIHdoZW4gdHJpZ2dlciBjb250YWlucyBtb3VzZWVudGVyIGFuZCBjbGljaywgYW5kIHRoZSB0aXAgaXNcbiAgICAvLyBjdXJyZW50bHkgc2hvd24gYXMgYSByZXN1bHQgb2YgYSBjbGljay5cblxuXG4gICAgaWYgKGluc3RhbmNlLnByb3BzLnRyaWdnZXIuaW5kZXhPZignbW91c2VlbnRlcicpID49IDAgJiYgaW5zdGFuY2UucHJvcHMudHJpZ2dlci5pbmRleE9mKCdjbGljaycpID49IDAgJiYgWydtb3VzZWxlYXZlJywgJ21vdXNlbW92ZSddLmluZGV4T2YoZXZlbnQudHlwZSkgPj0gMCAmJiBpc1Zpc2libGVGcm9tQ2xpY2spIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgZGVsYXkgPSBnZXREZWxheShmYWxzZSk7XG5cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGhpZGVUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUpIHtcbiAgICAgICAgICBpbnN0YW5jZS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0sIGRlbGF5KTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRml4ZXMgYSBgdHJhbnNpdGlvbmVuZGAgcHJvYmxlbSB3aGVuIGl0IGZpcmVzIDEgZnJhbWUgdG9vXG4gICAgICAvLyBsYXRlIHNvbWV0aW1lcywgd2UgZG9uJ3Qgd2FudCBoaWRlKCkgdG8gYmUgY2FsbGVkLlxuICAgICAgc2NoZWR1bGVIaWRlQW5pbWF0aW9uRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24gKCkge1xuICAgICAgICBpbnN0YW5jZS5oaWRlKCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH0gLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIPCflJEgUHVibGljIG1ldGhvZHNcbiAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cblxuICBmdW5jdGlvbiBlbmFibGUoKSB7XG4gICAgaW5zdGFuY2Uuc3RhdGUuaXNFbmFibGVkID0gdHJ1ZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRpc2FibGUoKSB7XG4gICAgLy8gRGlzYWJsaW5nIHRoZSBpbnN0YW5jZSBzaG91bGQgYWxzbyBoaWRlIGl0XG4gICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2F0b21pa3MvdGlwcHkuanMtcmVhY3QvaXNzdWVzLzEwNlxuICAgIGluc3RhbmNlLmhpZGUoKTtcbiAgICBpbnN0YW5jZS5zdGF0ZS5pc0VuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGNsZWFyRGVsYXlUaW1lb3V0cygpIHtcbiAgICBjbGVhclRpbWVvdXQoc2hvd1RpbWVvdXQpO1xuICAgIGNsZWFyVGltZW91dChoaWRlVGltZW91dCk7XG4gICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoc2NoZWR1bGVIaWRlQW5pbWF0aW9uRnJhbWUpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0UHJvcHMocGFydGlhbFByb3BzKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgd2FybldoZW4oaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQsIGNyZWF0ZU1lbW9yeUxlYWtXYXJuaW5nKCdzZXRQcm9wcycpKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnZva2VIb29rKCdvbkJlZm9yZVVwZGF0ZScsIFtpbnN0YW5jZSwgcGFydGlhbFByb3BzXSk7XG4gICAgcmVtb3ZlTGlzdGVuZXJzKCk7XG4gICAgdmFyIHByZXZQcm9wcyA9IGluc3RhbmNlLnByb3BzO1xuICAgIHZhciBuZXh0UHJvcHMgPSBldmFsdWF0ZVByb3BzKHJlZmVyZW5jZSwgT2JqZWN0LmFzc2lnbih7fSwgaW5zdGFuY2UucHJvcHMsIHt9LCBwYXJ0aWFsUHJvcHMsIHtcbiAgICAgIGlnbm9yZUF0dHJpYnV0ZXM6IHRydWVcbiAgICB9KSk7XG4gICAgaW5zdGFuY2UucHJvcHMgPSBuZXh0UHJvcHM7XG4gICAgYWRkTGlzdGVuZXJzKCk7XG5cbiAgICBpZiAocHJldlByb3BzLmludGVyYWN0aXZlRGVib3VuY2UgIT09IG5leHRQcm9wcy5pbnRlcmFjdGl2ZURlYm91bmNlKSB7XG4gICAgICBjbGVhbnVwSW50ZXJhY3RpdmVNb3VzZUxpc3RlbmVycygpO1xuICAgICAgZGVib3VuY2VkT25Nb3VzZU1vdmUgPSBkZWJvdW5jZShvbk1vdXNlTW92ZSwgbmV4dFByb3BzLmludGVyYWN0aXZlRGVib3VuY2UpO1xuICAgIH0gLy8gRW5zdXJlIHN0YWxlIGFyaWEtZXhwYW5kZWQgYXR0cmlidXRlcyBhcmUgcmVtb3ZlZFxuXG5cbiAgICBpZiAocHJldlByb3BzLnRyaWdnZXJUYXJnZXQgJiYgIW5leHRQcm9wcy50cmlnZ2VyVGFyZ2V0KSB7XG4gICAgICBub3JtYWxpemVUb0FycmF5KHByZXZQcm9wcy50cmlnZ2VyVGFyZ2V0KS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG4gICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyk7XG4gICAgICB9KTtcbiAgICB9IGVsc2UgaWYgKG5leHRQcm9wcy50cmlnZ2VyVGFyZ2V0KSB7XG4gICAgICByZWZlcmVuY2UucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJyk7XG4gICAgfVxuXG4gICAgaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlKCk7XG4gICAgaGFuZGxlU3R5bGVzKCk7XG5cbiAgICBpZiAob25VcGRhdGUpIHtcbiAgICAgIG9uVXBkYXRlKHByZXZQcm9wcywgbmV4dFByb3BzKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2UucG9wcGVySW5zdGFuY2UpIHtcbiAgICAgIGNyZWF0ZVBvcHBlckluc3RhbmNlKCk7IC8vIEZpeGVzIGFuIGlzc3VlIHdpdGggbmVzdGVkIHRpcHBpZXMgaWYgdGhleSBhcmUgYWxsIGdldHRpbmcgcmUtcmVuZGVyZWQsXG4gICAgICAvLyBhbmQgdGhlIG5lc3RlZCBvbmVzIGdldCByZS1yZW5kZXJlZCBmaXJzdC5cbiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hdG9taWtzL3RpcHB5anMtcmVhY3QvaXNzdWVzLzE3N1xuICAgICAgLy8gVE9ETzogZmluZCBhIGNsZWFuZXIgLyBtb3JlIGVmZmljaWVudCBzb2x1dGlvbighKVxuXG4gICAgICBnZXROZXN0ZWRQb3BwZXJUcmVlKCkuZm9yRWFjaChmdW5jdGlvbiAobmVzdGVkUG9wcGVyKSB7XG4gICAgICAgIC8vIFJlYWN0IChhbmQgb3RoZXIgVUkgbGlicyBsaWtlbHkpIHJlcXVpcmVzIGEgckFGIHdyYXBwZXIgYXMgaXQgZmx1c2hlc1xuICAgICAgICAvLyBpdHMgd29yayBpbiBvbmVcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKG5lc3RlZFBvcHBlci5fdGlwcHkucG9wcGVySW5zdGFuY2UuZm9yY2VVcGRhdGUpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW52b2tlSG9vaygnb25BZnRlclVwZGF0ZScsIFtpbnN0YW5jZSwgcGFydGlhbFByb3BzXSk7XG4gIH1cblxuICBmdW5jdGlvbiBzZXRDb250ZW50KGNvbnRlbnQpIHtcbiAgICBpbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICBjb250ZW50OiBjb250ZW50XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG93KCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygnc2hvdycpKTtcbiAgICB9IC8vIEVhcmx5IGJhaWwtb3V0XG5cblxuICAgIHZhciBpc0FscmVhZHlWaXNpYmxlID0gaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlO1xuICAgIHZhciBpc0Rlc3Ryb3llZCA9IGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkO1xuICAgIHZhciBpc0Rpc2FibGVkID0gIWluc3RhbmNlLnN0YXRlLmlzRW5hYmxlZDtcbiAgICB2YXIgaXNUb3VjaEFuZFRvdWNoRGlzYWJsZWQgPSBjdXJyZW50SW5wdXQuaXNUb3VjaCAmJiAhaW5zdGFuY2UucHJvcHMudG91Y2g7XG4gICAgdmFyIGR1cmF0aW9uID0gZ2V0VmFsdWVBdEluZGV4T3JSZXR1cm4oaW5zdGFuY2UucHJvcHMuZHVyYXRpb24sIDAsIGRlZmF1bHRQcm9wcy5kdXJhdGlvbik7XG5cbiAgICBpZiAoaXNBbHJlYWR5VmlzaWJsZSB8fCBpc0Rlc3Ryb3llZCB8fCBpc0Rpc2FibGVkIHx8IGlzVG91Y2hBbmRUb3VjaERpc2FibGVkKSB7XG4gICAgICByZXR1cm47XG4gICAgfSAvLyBOb3JtYWxpemUgYGRpc2FibGVkYCBiZWhhdmlvciBhY3Jvc3MgYnJvd3NlcnMuXG4gICAgLy8gRmlyZWZveCBhbGxvd3MgZXZlbnRzIG9uIGRpc2FibGVkIGVsZW1lbnRzLCBidXQgQ2hyb21lIGRvZXNuJ3QuXG4gICAgLy8gVXNpbmcgYSB3cmFwcGVyIGVsZW1lbnQgKGkuZS4gPHNwYW4+KSBpcyByZWNvbW1lbmRlZC5cblxuXG4gICAgaWYgKGdldEN1cnJlbnRUYXJnZXQoKS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnZva2VIb29rKCdvblNob3cnLCBbaW5zdGFuY2VdLCBmYWxzZSk7XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMub25TaG93KGluc3RhbmNlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgPSB0cnVlO1xuXG4gICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgIHBvcHBlci5zdHlsZS52aXNpYmlsaXR5ID0gJ3Zpc2libGUnO1xuICAgIH1cblxuICAgIGhhbmRsZVN0eWxlcygpO1xuICAgIGFkZERvY3VtZW50UHJlc3MoKTtcblxuICAgIGlmICghaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkKSB7XG4gICAgICBwb3BwZXIuc3R5bGUudHJhbnNpdGlvbiA9ICdub25lJztcbiAgICB9IC8vIElmIGZsaXBwaW5nIHRvIHRoZSBvcHBvc2l0ZSBzaWRlIGFmdGVyIGhpZGluZyBhdCBsZWFzdCBvbmNlLCB0aGVcbiAgICAvLyBhbmltYXRpb24gd2lsbCB1c2UgdGhlIHdyb25nIHBsYWNlbWVudCB3aXRob3V0IHJlc2V0dGluZyB0aGUgZHVyYXRpb25cblxuXG4gICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgIHZhciBfZ2V0RGVmYXVsdFRlbXBsYXRlQ2gyID0gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKSxcbiAgICAgICAgICBib3ggPSBfZ2V0RGVmYXVsdFRlbXBsYXRlQ2gyLmJveCxcbiAgICAgICAgICBjb250ZW50ID0gX2dldERlZmF1bHRUZW1wbGF0ZUNoMi5jb250ZW50O1xuXG4gICAgICBzZXRUcmFuc2l0aW9uRHVyYXRpb24oW2JveCwgY29udGVudF0sIDApO1xuICAgIH1cblxuICAgIG9uRmlyc3RVcGRhdGUgPSBmdW5jdGlvbiBvbkZpcnN0VXBkYXRlKCkge1xuICAgICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgfHwgaWdub3JlT25GaXJzdFVwZGF0ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG5cbiAgICAgIGlnbm9yZU9uRmlyc3RVcGRhdGUgPSB0cnVlOyAvLyByZWZsb3dcblxuICAgICAgdm9pZCBwb3BwZXIub2Zmc2V0SGVpZ2h0O1xuICAgICAgcG9wcGVyLnN0eWxlLnRyYW5zaXRpb24gPSBpbnN0YW5jZS5wcm9wcy5tb3ZlVHJhbnNpdGlvbjtcblxuICAgICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkgJiYgaW5zdGFuY2UucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICAgIHZhciBfZ2V0RGVmYXVsdFRlbXBsYXRlQ2gzID0gZ2V0RGVmYXVsdFRlbXBsYXRlQ2hpbGRyZW4oKSxcbiAgICAgICAgICAgIF9ib3ggPSBfZ2V0RGVmYXVsdFRlbXBsYXRlQ2gzLmJveCxcbiAgICAgICAgICAgIF9jb250ZW50ID0gX2dldERlZmF1bHRUZW1wbGF0ZUNoMy5jb250ZW50O1xuXG4gICAgICAgIHNldFRyYW5zaXRpb25EdXJhdGlvbihbX2JveCwgX2NvbnRlbnRdLCBkdXJhdGlvbik7XG4gICAgICAgIHNldFZpc2liaWxpdHlTdGF0ZShbX2JveCwgX2NvbnRlbnRdLCAndmlzaWJsZScpO1xuICAgICAgfVxuXG4gICAgICBoYW5kbGVBcmlhQ29udGVudEF0dHJpYnV0ZSgpO1xuICAgICAgaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlKCk7XG4gICAgICBwdXNoSWZVbmlxdWUobW91bnRlZEluc3RhbmNlcywgaW5zdGFuY2UpO1xuICAgICAgaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkID0gdHJ1ZTtcbiAgICAgIGludm9rZUhvb2soJ29uTW91bnQnLCBbaW5zdGFuY2VdKTtcblxuICAgICAgaWYgKGluc3RhbmNlLnByb3BzLmFuaW1hdGlvbiAmJiBnZXRJc0RlZmF1bHRSZW5kZXJGbigpKSB7XG4gICAgICAgIG9uVHJhbnNpdGlvbmVkSW4oZHVyYXRpb24sIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICBpbnN0YW5jZS5zdGF0ZS5pc1Nob3duID0gdHJ1ZTtcbiAgICAgICAgICBpbnZva2VIb29rKCdvblNob3duJywgW2luc3RhbmNlXSk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH07XG5cbiAgICBtb3VudCgpO1xuICB9XG5cbiAgZnVuY3Rpb24gaGlkZSgpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB3YXJuV2hlbihpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCwgY3JlYXRlTWVtb3J5TGVha1dhcm5pbmcoJ2hpZGUnKSk7XG4gICAgfSAvLyBFYXJseSBiYWlsLW91dFxuXG5cbiAgICB2YXIgaXNBbHJlYWR5SGlkZGVuID0gIWluc3RhbmNlLnN0YXRlLmlzVmlzaWJsZTtcbiAgICB2YXIgaXNEZXN0cm95ZWQgPSBpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZDtcbiAgICB2YXIgaXNEaXNhYmxlZCA9ICFpbnN0YW5jZS5zdGF0ZS5pc0VuYWJsZWQ7XG4gICAgdmFyIGR1cmF0aW9uID0gZ2V0VmFsdWVBdEluZGV4T3JSZXR1cm4oaW5zdGFuY2UucHJvcHMuZHVyYXRpb24sIDEsIGRlZmF1bHRQcm9wcy5kdXJhdGlvbik7XG5cbiAgICBpZiAoaXNBbHJlYWR5SGlkZGVuIHx8IGlzRGVzdHJveWVkIHx8IGlzRGlzYWJsZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnZva2VIb29rKCdvbkhpZGUnLCBbaW5zdGFuY2VdLCBmYWxzZSk7XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMub25IaWRlKGluc3RhbmNlKSA9PT0gZmFsc2UpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpbnN0YW5jZS5zdGF0ZS5pc1Zpc2libGUgPSBmYWxzZTtcbiAgICBpbnN0YW5jZS5zdGF0ZS5pc1Nob3duID0gZmFsc2U7XG4gICAgaWdub3JlT25GaXJzdFVwZGF0ZSA9IGZhbHNlO1xuICAgIGlzVmlzaWJsZUZyb21DbGljayA9IGZhbHNlO1xuXG4gICAgaWYgKGdldElzRGVmYXVsdFJlbmRlckZuKCkpIHtcbiAgICAgIHBvcHBlci5zdHlsZS52aXNpYmlsaXR5ID0gJ2hpZGRlbic7XG4gICAgfVxuXG4gICAgY2xlYW51cEludGVyYWN0aXZlTW91c2VMaXN0ZW5lcnMoKTtcbiAgICByZW1vdmVEb2N1bWVudFByZXNzKCk7XG4gICAgaGFuZGxlU3R5bGVzKCk7XG5cbiAgICBpZiAoZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSkge1xuICAgICAgdmFyIF9nZXREZWZhdWx0VGVtcGxhdGVDaDQgPSBnZXREZWZhdWx0VGVtcGxhdGVDaGlsZHJlbigpLFxuICAgICAgICAgIGJveCA9IF9nZXREZWZhdWx0VGVtcGxhdGVDaDQuYm94LFxuICAgICAgICAgIGNvbnRlbnQgPSBfZ2V0RGVmYXVsdFRlbXBsYXRlQ2g0LmNvbnRlbnQ7XG5cbiAgICAgIGlmIChpbnN0YW5jZS5wcm9wcy5hbmltYXRpb24pIHtcbiAgICAgICAgc2V0VHJhbnNpdGlvbkR1cmF0aW9uKFtib3gsIGNvbnRlbnRdLCBkdXJhdGlvbik7XG4gICAgICAgIHNldFZpc2liaWxpdHlTdGF0ZShbYm94LCBjb250ZW50XSwgJ2hpZGRlbicpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGhhbmRsZUFyaWFDb250ZW50QXR0cmlidXRlKCk7XG4gICAgaGFuZGxlQXJpYUV4cGFuZGVkQXR0cmlidXRlKCk7XG5cbiAgICBpZiAoaW5zdGFuY2UucHJvcHMuYW5pbWF0aW9uKSB7XG4gICAgICBpZiAoZ2V0SXNEZWZhdWx0UmVuZGVyRm4oKSkge1xuICAgICAgICBvblRyYW5zaXRpb25lZE91dChkdXJhdGlvbiwgaW5zdGFuY2UudW5tb3VudCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGluc3RhbmNlLnVubW91bnQoKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBoaWRlV2l0aEludGVyYWN0aXZpdHkoZXZlbnQpIHtcbiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgZWxzZSAqL1xuICAgIGlmIChcImRldmVsb3BtZW50XCIgIT09IFwicHJvZHVjdGlvblwiKSB7XG4gICAgICB3YXJuV2hlbihpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCwgY3JlYXRlTWVtb3J5TGVha1dhcm5pbmcoJ2hpZGVXaXRoSW50ZXJhY3Rpdml0eScpKTtcbiAgICB9XG5cbiAgICBkb2MuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgZGVib3VuY2VkT25Nb3VzZU1vdmUpO1xuICAgIHB1c2hJZlVuaXF1ZShtb3VzZU1vdmVMaXN0ZW5lcnMsIGRlYm91bmNlZE9uTW91c2VNb3ZlKTtcbiAgICBkZWJvdW5jZWRPbk1vdXNlTW92ZShldmVudCk7XG4gIH1cblxuICBmdW5jdGlvbiB1bm1vdW50KCkge1xuICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG4gICAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICAgIHdhcm5XaGVuKGluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkLCBjcmVhdGVNZW1vcnlMZWFrV2FybmluZygndW5tb3VudCcpKTtcbiAgICB9XG5cbiAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlKSB7XG4gICAgICBpbnN0YW5jZS5oaWRlKCk7XG4gICAgfVxuXG4gICAgaWYgKCFpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBkZXN0cm95UG9wcGVySW5zdGFuY2UoKTsgLy8gSWYgYSBwb3BwZXIgaXMgbm90IGludGVyYWN0aXZlLCBpdCB3aWxsIGJlIGFwcGVuZGVkIG91dHNpZGUgdGhlIHBvcHBlclxuICAgIC8vIHRyZWUgYnkgZGVmYXVsdC4gVGhpcyBzZWVtcyBtYWlubHkgZm9yIGludGVyYWN0aXZlIHRpcHBpZXMsIGJ1dCB3ZSBzaG91bGRcbiAgICAvLyBmaW5kIGEgd29ya2Fyb3VuZCBpZiBwb3NzaWJsZVxuXG4gICAgZ2V0TmVzdGVkUG9wcGVyVHJlZSgpLmZvckVhY2goZnVuY3Rpb24gKG5lc3RlZFBvcHBlcikge1xuICAgICAgbmVzdGVkUG9wcGVyLl90aXBweS51bm1vdW50KCk7XG4gICAgfSk7XG5cbiAgICBpZiAocG9wcGVyLnBhcmVudE5vZGUpIHtcbiAgICAgIHBvcHBlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHBvcHBlcik7XG4gICAgfVxuXG4gICAgbW91bnRlZEluc3RhbmNlcyA9IG1vdW50ZWRJbnN0YW5jZXMuZmlsdGVyKGZ1bmN0aW9uIChpKSB7XG4gICAgICByZXR1cm4gaSAhPT0gaW5zdGFuY2U7XG4gICAgfSk7XG4gICAgaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkID0gZmFsc2U7XG4gICAgaW52b2tlSG9vaygnb25IaWRkZW4nLCBbaW5zdGFuY2VdKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc3Ryb3koKSB7XG4gICAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgd2FybldoZW4oaW5zdGFuY2Uuc3RhdGUuaXNEZXN0cm95ZWQsIGNyZWF0ZU1lbW9yeUxlYWtXYXJuaW5nKCdkZXN0cm95JykpO1xuICAgIH1cblxuICAgIGlmIChpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIGluc3RhbmNlLmNsZWFyRGVsYXlUaW1lb3V0cygpO1xuICAgIGluc3RhbmNlLnVubW91bnQoKTtcbiAgICByZW1vdmVMaXN0ZW5lcnMoKTtcbiAgICBkZWxldGUgcmVmZXJlbmNlLl90aXBweTtcbiAgICBpbnN0YW5jZS5zdGF0ZS5pc0Rlc3Ryb3llZCA9IHRydWU7XG4gICAgaW52b2tlSG9vaygnb25EZXN0cm95JywgW2luc3RhbmNlXSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gdGlwcHkodGFyZ2V0cywgb3B0aW9uYWxQcm9wcykge1xuICBpZiAob3B0aW9uYWxQcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9uYWxQcm9wcyA9IHt9O1xuICB9XG5cbiAgdmFyIHBsdWdpbnMgPSBkZWZhdWx0UHJvcHMucGx1Z2lucy5jb25jYXQob3B0aW9uYWxQcm9wcy5wbHVnaW5zIHx8IFtdKTtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cblxuICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgIHZhbGlkYXRlVGFyZ2V0cyh0YXJnZXRzKTtcbiAgICB2YWxpZGF0ZVByb3BzKG9wdGlvbmFsUHJvcHMsIHBsdWdpbnMpO1xuICB9XG5cbiAgYmluZEdsb2JhbEV2ZW50TGlzdGVuZXJzKCk7XG4gIHZhciBwYXNzZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbmFsUHJvcHMsIHtcbiAgICBwbHVnaW5zOiBwbHVnaW5zXG4gIH0pO1xuICB2YXIgZWxlbWVudHMgPSBnZXRBcnJheU9mRWxlbWVudHModGFyZ2V0cyk7XG4gIC8qIGlzdGFuYnVsIGlnbm9yZSBlbHNlICovXG5cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICB2YXIgaXNTaW5nbGVDb250ZW50RWxlbWVudCA9IGlzRWxlbWVudChwYXNzZWRQcm9wcy5jb250ZW50KTtcbiAgICB2YXIgaXNNb3JlVGhhbk9uZVJlZmVyZW5jZUVsZW1lbnQgPSBlbGVtZW50cy5sZW5ndGggPiAxO1xuICAgIHdhcm5XaGVuKGlzU2luZ2xlQ29udGVudEVsZW1lbnQgJiYgaXNNb3JlVGhhbk9uZVJlZmVyZW5jZUVsZW1lbnQsIFsndGlwcHkoKSB3YXMgcGFzc2VkIGFuIEVsZW1lbnQgYXMgdGhlIGBjb250ZW50YCBwcm9wLCBidXQgbW9yZSB0aGFuJywgJ29uZSB0aXBweSBpbnN0YW5jZSB3YXMgY3JlYXRlZCBieSB0aGlzIGludm9jYXRpb24uIFRoaXMgbWVhbnMgdGhlJywgJ2NvbnRlbnQgZWxlbWVudCB3aWxsIG9ubHkgYmUgYXBwZW5kZWQgdG8gdGhlIGxhc3QgdGlwcHkgaW5zdGFuY2UuJywgJ1xcblxcbicsICdJbnN0ZWFkLCBwYXNzIHRoZSAuaW5uZXJIVE1MIG9mIHRoZSBlbGVtZW50LCBvciB1c2UgYSBmdW5jdGlvbiB0aGF0JywgJ3JldHVybnMgYSBjbG9uZWQgdmVyc2lvbiBvZiB0aGUgZWxlbWVudCBpbnN0ZWFkLicsICdcXG5cXG4nLCAnMSkgY29udGVudDogZWxlbWVudC5pbm5lckhUTUxcXG4nLCAnMikgY29udGVudDogKCkgPT4gZWxlbWVudC5jbG9uZU5vZGUodHJ1ZSknXS5qb2luKCcgJykpO1xuICB9XG5cbiAgdmFyIGluc3RhbmNlcyA9IGVsZW1lbnRzLnJlZHVjZShmdW5jdGlvbiAoYWNjLCByZWZlcmVuY2UpIHtcbiAgICB2YXIgaW5zdGFuY2UgPSByZWZlcmVuY2UgJiYgY3JlYXRlVGlwcHkocmVmZXJlbmNlLCBwYXNzZWRQcm9wcyk7XG5cbiAgICBpZiAoaW5zdGFuY2UpIHtcbiAgICAgIGFjYy5wdXNoKGluc3RhbmNlKTtcbiAgICB9XG5cbiAgICByZXR1cm4gYWNjO1xuICB9LCBbXSk7XG4gIHJldHVybiBpc0VsZW1lbnQodGFyZ2V0cykgPyBpbnN0YW5jZXNbMF0gOiBpbnN0YW5jZXM7XG59XG5cbnRpcHB5LmRlZmF1bHRQcm9wcyA9IGRlZmF1bHRQcm9wcztcbnRpcHB5LnNldERlZmF1bHRQcm9wcyA9IHNldERlZmF1bHRQcm9wcztcbnRpcHB5LmN1cnJlbnRJbnB1dCA9IGN1cnJlbnRJbnB1dDtcbnZhciBoaWRlQWxsID0gZnVuY3Rpb24gaGlkZUFsbChfdGVtcCkge1xuICB2YXIgX3JlZiA9IF90ZW1wID09PSB2b2lkIDAgPyB7fSA6IF90ZW1wLFxuICAgICAgZXhjbHVkZWRSZWZlcmVuY2VPckluc3RhbmNlID0gX3JlZi5leGNsdWRlLFxuICAgICAgZHVyYXRpb24gPSBfcmVmLmR1cmF0aW9uO1xuXG4gIG1vdW50ZWRJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICB2YXIgaXNFeGNsdWRlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGV4Y2x1ZGVkUmVmZXJlbmNlT3JJbnN0YW5jZSkge1xuICAgICAgaXNFeGNsdWRlZCA9IGlzUmVmZXJlbmNlRWxlbWVudChleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2UpID8gaW5zdGFuY2UucmVmZXJlbmNlID09PSBleGNsdWRlZFJlZmVyZW5jZU9ySW5zdGFuY2UgOiBpbnN0YW5jZS5wb3BwZXIgPT09IGV4Y2x1ZGVkUmVmZXJlbmNlT3JJbnN0YW5jZS5wb3BwZXI7XG4gICAgfVxuXG4gICAgaWYgKCFpc0V4Y2x1ZGVkKSB7XG4gICAgICB2YXIgb3JpZ2luYWxEdXJhdGlvbiA9IGluc3RhbmNlLnByb3BzLmR1cmF0aW9uO1xuICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMoe1xuICAgICAgICBkdXJhdGlvbjogZHVyYXRpb25cbiAgICAgIH0pO1xuICAgICAgaW5zdGFuY2UuaGlkZSgpO1xuXG4gICAgICBpZiAoIWluc3RhbmNlLnN0YXRlLmlzRGVzdHJveWVkKSB7XG4gICAgICAgIGluc3RhbmNlLnNldFByb3BzKHtcbiAgICAgICAgICBkdXJhdGlvbjogb3JpZ2luYWxEdXJhdGlvblxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxudmFyIGNyZWF0ZVNpbmdsZXRvbiA9IGZ1bmN0aW9uIGNyZWF0ZVNpbmdsZXRvbih0aXBweUluc3RhbmNlcywgb3B0aW9uYWxQcm9wcykge1xuICBpZiAob3B0aW9uYWxQcm9wcyA9PT0gdm9pZCAwKSB7XG4gICAgb3B0aW9uYWxQcm9wcyA9IHt9O1xuICB9XG5cbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBlcnJvcldoZW4oIUFycmF5LmlzQXJyYXkodGlwcHlJbnN0YW5jZXMpLCBbJ1RoZSBmaXJzdCBhcmd1bWVudCBwYXNzZWQgdG8gY3JlYXRlU2luZ2xldG9uKCkgbXVzdCBiZSBhbiBhcnJheSBvZicsICd0aXBweSBpbnN0YW5jZXMuIFRoZSBwYXNzZWQgdmFsdWUgd2FzJywgU3RyaW5nKHRpcHB5SW5zdGFuY2VzKV0uam9pbignICcpKTtcbiAgfVxuXG4gIHZhciBtdXRUaXBweUluc3RhbmNlcyA9IHRpcHB5SW5zdGFuY2VzO1xuICB2YXIgcmVmZXJlbmNlcyA9IFtdO1xuICB2YXIgY3VycmVudFRhcmdldDtcbiAgdmFyIG92ZXJyaWRlcyA9IG9wdGlvbmFsUHJvcHMub3ZlcnJpZGVzO1xuXG4gIGZ1bmN0aW9uIHNldFJlZmVyZW5jZXMoKSB7XG4gICAgcmVmZXJlbmNlcyA9IG11dFRpcHB5SW5zdGFuY2VzLm1hcChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5yZWZlcmVuY2U7XG4gICAgfSk7XG4gIH1cblxuICBmdW5jdGlvbiBlbmFibGVJbnN0YW5jZXMoaXNFbmFibGVkKSB7XG4gICAgbXV0VGlwcHlJbnN0YW5jZXMuZm9yRWFjaChmdW5jdGlvbiAoaW5zdGFuY2UpIHtcbiAgICAgIGlmIChpc0VuYWJsZWQpIHtcbiAgICAgICAgaW5zdGFuY2UuZW5hYmxlKCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpbnN0YW5jZS5kaXNhYmxlKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBlbmFibGVJbnN0YW5jZXMoZmFsc2UpO1xuICBzZXRSZWZlcmVuY2VzKCk7XG4gIHZhciBzaW5nbGV0b24gPSB7XG4gICAgZm46IGZ1bmN0aW9uIGZuKCkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgb25EZXN0cm95OiBmdW5jdGlvbiBvbkRlc3Ryb3koKSB7XG4gICAgICAgICAgZW5hYmxlSW5zdGFuY2VzKHRydWUpO1xuICAgICAgICB9LFxuICAgICAgICBvblRyaWdnZXI6IGZ1bmN0aW9uIG9uVHJpZ2dlcihpbnN0YW5jZSwgZXZlbnQpIHtcbiAgICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldDtcbiAgICAgICAgICB2YXIgaW5kZXggPSByZWZlcmVuY2VzLmluZGV4T2YodGFyZ2V0KTsgLy8gYmFpbC1vdXRcblxuICAgICAgICAgIGlmICh0YXJnZXQgPT09IGN1cnJlbnRUYXJnZXQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjdXJyZW50VGFyZ2V0ID0gdGFyZ2V0O1xuICAgICAgICAgIHZhciBvdmVycmlkZVByb3BzID0gKG92ZXJyaWRlcyB8fCBbXSkuY29uY2F0KCdjb250ZW50JykucmVkdWNlKGZ1bmN0aW9uIChhY2MsIHByb3ApIHtcbiAgICAgICAgICAgIGFjY1twcm9wXSA9IG11dFRpcHB5SW5zdGFuY2VzW2luZGV4XS5wcm9wc1twcm9wXTtcbiAgICAgICAgICAgIHJldHVybiBhY2M7XG4gICAgICAgICAgfSwge30pO1xuICAgICAgICAgIGluc3RhbmNlLnNldFByb3BzKE9iamVjdC5hc3NpZ24oe30sIG92ZXJyaWRlUHJvcHMsIHtcbiAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6IGZ1bmN0aW9uIGdldFJlZmVyZW5jZUNsaWVudFJlY3QoKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSkpO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIH1cbiAgfTtcbiAgdmFyIGluc3RhbmNlID0gdGlwcHkoZGl2KCksIE9iamVjdC5hc3NpZ24oe30sIHJlbW92ZVByb3BlcnRpZXMob3B0aW9uYWxQcm9wcywgWydvdmVycmlkZXMnXSksIHtcbiAgICBwbHVnaW5zOiBbc2luZ2xldG9uXS5jb25jYXQob3B0aW9uYWxQcm9wcy5wbHVnaW5zIHx8IFtdKSxcbiAgICB0cmlnZ2VyVGFyZ2V0OiByZWZlcmVuY2VzXG4gIH0pKTtcbiAgdmFyIG9yaWdpbmFsU2V0UHJvcHMgPSBpbnN0YW5jZS5zZXRQcm9wcztcblxuICBpbnN0YW5jZS5zZXRQcm9wcyA9IGZ1bmN0aW9uIChwcm9wcykge1xuICAgIG92ZXJyaWRlcyA9IHByb3BzLm92ZXJyaWRlcyB8fCBvdmVycmlkZXM7XG4gICAgb3JpZ2luYWxTZXRQcm9wcyhwcm9wcyk7XG4gIH07XG5cbiAgaW5zdGFuY2Uuc2V0SW5zdGFuY2VzID0gZnVuY3Rpb24gKG5leHRJbnN0YW5jZXMpIHtcbiAgICBlbmFibGVJbnN0YW5jZXModHJ1ZSk7XG4gICAgbXV0VGlwcHlJbnN0YW5jZXMgPSBuZXh0SW5zdGFuY2VzO1xuICAgIGVuYWJsZUluc3RhbmNlcyhmYWxzZSk7XG4gICAgc2V0UmVmZXJlbmNlcygpO1xuICAgIGluc3RhbmNlLnNldFByb3BzKHtcbiAgICAgIHRyaWdnZXJUYXJnZXQ6IHJlZmVyZW5jZXNcbiAgICB9KTtcbiAgfTtcblxuICByZXR1cm4gaW5zdGFuY2U7XG59O1xuXG52YXIgQlVCQkxJTkdfRVZFTlRTX01BUCA9IHtcbiAgbW91c2VvdmVyOiAnbW91c2VlbnRlcicsXG4gIGZvY3VzaW46ICdmb2N1cycsXG4gIGNsaWNrOiAnY2xpY2snXG59O1xuLyoqXG4gKiBDcmVhdGVzIGEgZGVsZWdhdGUgaW5zdGFuY2UgdGhhdCBjb250cm9scyB0aGUgY3JlYXRpb24gb2YgdGlwcHkgaW5zdGFuY2VzXG4gKiBmb3IgY2hpbGQgZWxlbWVudHMgKGB0YXJnZXRgIENTUyBzZWxlY3RvcikuXG4gKi9cblxuZnVuY3Rpb24gZGVsZWdhdGUodGFyZ2V0cywgcHJvcHMpIHtcbiAgLyogaXN0YW5idWwgaWdub3JlIGVsc2UgKi9cbiAgaWYgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gXCJwcm9kdWN0aW9uXCIpIHtcbiAgICBlcnJvcldoZW4oIShwcm9wcyAmJiBwcm9wcy50YXJnZXQpLCBbJ1lvdSBtdXN0IHNwZWNpdHkgYSBgdGFyZ2V0YCBwcm9wIGluZGljYXRpbmcgYSBDU1Mgc2VsZWN0b3Igc3RyaW5nIG1hdGNoaW5nJywgJ3RoZSB0YXJnZXQgZWxlbWVudHMgdGhhdCBzaG91bGQgcmVjZWl2ZSBhIHRpcHB5LiddLmpvaW4oJyAnKSk7XG4gIH1cblxuICB2YXIgbGlzdGVuZXJzID0gW107XG4gIHZhciBjaGlsZFRpcHB5SW5zdGFuY2VzID0gW107XG4gIHZhciB0YXJnZXQgPSBwcm9wcy50YXJnZXQ7XG4gIHZhciBuYXRpdmVQcm9wcyA9IHJlbW92ZVByb3BlcnRpZXMocHJvcHMsIFsndGFyZ2V0J10pO1xuICB2YXIgcGFyZW50UHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBuYXRpdmVQcm9wcywge1xuICAgIHRyaWdnZXI6ICdtYW51YWwnLFxuICAgIHRvdWNoOiBmYWxzZVxuICB9KTtcbiAgdmFyIGNoaWxkUHJvcHMgPSBPYmplY3QuYXNzaWduKHt9LCBuYXRpdmVQcm9wcywge1xuICAgIHNob3dPbkNyZWF0ZTogdHJ1ZVxuICB9KTtcbiAgdmFyIHJldHVyblZhbHVlID0gdGlwcHkodGFyZ2V0cywgcGFyZW50UHJvcHMpO1xuICB2YXIgbm9ybWFsaXplZFJldHVyblZhbHVlID0gbm9ybWFsaXplVG9BcnJheShyZXR1cm5WYWx1ZSk7XG5cbiAgZnVuY3Rpb24gb25UcmlnZ2VyKGV2ZW50KSB7XG4gICAgaWYgKCFldmVudC50YXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0Tm9kZSA9IGV2ZW50LnRhcmdldC5jbG9zZXN0KHRhcmdldCk7XG5cbiAgICBpZiAoIXRhcmdldE5vZGUpIHtcbiAgICAgIHJldHVybjtcbiAgICB9IC8vIEdldCByZWxldmFudCB0cmlnZ2VyIHdpdGggZmFsbGJhY2tzOlxuICAgIC8vIDEuIENoZWNrIGBkYXRhLXRpcHB5LXRyaWdnZXJgIGF0dHJpYnV0ZSBvbiB0YXJnZXQgbm9kZVxuICAgIC8vIDIuIEZhbGxiYWNrIHRvIGB0cmlnZ2VyYCBwYXNzZWQgdG8gYGRlbGVnYXRlKClgXG4gICAgLy8gMy4gRmFsbGJhY2sgdG8gYGRlZmF1bHRQcm9wcy50cmlnZ2VyYFxuXG5cbiAgICB2YXIgdHJpZ2dlciA9IHRhcmdldE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXRpcHB5LXRyaWdnZXInKSB8fCBwcm9wcy50cmlnZ2VyIHx8IGRlZmF1bHRQcm9wcy50cmlnZ2VyOyAvLyBAdHMtaWdub3JlXG5cbiAgICBpZiAodGFyZ2V0Tm9kZS5fdGlwcHkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RvdWNoc3RhcnQnICYmIHR5cGVvZiBjaGlsZFByb3BzLnRvdWNoID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoZXZlbnQudHlwZSAhPT0gJ3RvdWNoc3RhcnQnICYmIHRyaWdnZXIuaW5kZXhPZihCVUJCTElOR19FVkVOVFNfTUFQW2V2ZW50LnR5cGVdKSA8IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgaW5zdGFuY2UgPSB0aXBweSh0YXJnZXROb2RlLCBjaGlsZFByb3BzKTtcblxuICAgIGlmIChpbnN0YW5jZSkge1xuICAgICAgY2hpbGRUaXBweUluc3RhbmNlcyA9IGNoaWxkVGlwcHlJbnN0YW5jZXMuY29uY2F0KGluc3RhbmNlKTtcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBvbihub2RlLCBldmVudFR5cGUsIGhhbmRsZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAob3B0aW9ucyA9PT0gdm9pZCAwKSB7XG4gICAgICBvcHRpb25zID0gZmFsc2U7XG4gICAgfVxuXG4gICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGV2ZW50VHlwZSwgaGFuZGxlciwgb3B0aW9ucyk7XG4gICAgbGlzdGVuZXJzLnB1c2goe1xuICAgICAgbm9kZTogbm9kZSxcbiAgICAgIGV2ZW50VHlwZTogZXZlbnRUeXBlLFxuICAgICAgaGFuZGxlcjogaGFuZGxlcixcbiAgICAgIG9wdGlvbnM6IG9wdGlvbnNcbiAgICB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJzKGluc3RhbmNlKSB7XG4gICAgdmFyIHJlZmVyZW5jZSA9IGluc3RhbmNlLnJlZmVyZW5jZTtcbiAgICBvbihyZWZlcmVuY2UsICd0b3VjaHN0YXJ0Jywgb25UcmlnZ2VyKTtcbiAgICBvbihyZWZlcmVuY2UsICdtb3VzZW92ZXInLCBvblRyaWdnZXIpO1xuICAgIG9uKHJlZmVyZW5jZSwgJ2ZvY3VzaW4nLCBvblRyaWdnZXIpO1xuICAgIG9uKHJlZmVyZW5jZSwgJ2NsaWNrJywgb25UcmlnZ2VyKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCkge1xuICAgIGxpc3RlbmVycy5mb3JFYWNoKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICB2YXIgbm9kZSA9IF9yZWYubm9kZSxcbiAgICAgICAgICBldmVudFR5cGUgPSBfcmVmLmV2ZW50VHlwZSxcbiAgICAgICAgICBoYW5kbGVyID0gX3JlZi5oYW5kbGVyLFxuICAgICAgICAgIG9wdGlvbnMgPSBfcmVmLm9wdGlvbnM7XG4gICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRUeXBlLCBoYW5kbGVyLCBvcHRpb25zKTtcbiAgICB9KTtcbiAgICBsaXN0ZW5lcnMgPSBbXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGFwcGx5TXV0YXRpb25zKGluc3RhbmNlKSB7XG4gICAgdmFyIG9yaWdpbmFsRGVzdHJveSA9IGluc3RhbmNlLmRlc3Ryb3k7XG5cbiAgICBpbnN0YW5jZS5kZXN0cm95ID0gZnVuY3Rpb24gKHNob3VsZERlc3Ryb3lDaGlsZEluc3RhbmNlcykge1xuICAgICAgaWYgKHNob3VsZERlc3Ryb3lDaGlsZEluc3RhbmNlcyA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHNob3VsZERlc3Ryb3lDaGlsZEluc3RhbmNlcyA9IHRydWU7XG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGREZXN0cm95Q2hpbGRJbnN0YW5jZXMpIHtcbiAgICAgICAgY2hpbGRUaXBweUluc3RhbmNlcy5mb3JFYWNoKGZ1bmN0aW9uIChpbnN0YW5jZSkge1xuICAgICAgICAgIGluc3RhbmNlLmRlc3Ryb3koKTtcbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGNoaWxkVGlwcHlJbnN0YW5jZXMgPSBbXTtcbiAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJzKCk7XG4gICAgICBvcmlnaW5hbERlc3Ryb3koKTtcbiAgICB9O1xuXG4gICAgYWRkRXZlbnRMaXN0ZW5lcnMoaW5zdGFuY2UpO1xuICB9XG5cbiAgbm9ybWFsaXplZFJldHVyblZhbHVlLmZvckVhY2goYXBwbHlNdXRhdGlvbnMpO1xuICByZXR1cm4gcmV0dXJuVmFsdWU7XG59XG5cbnZhciBhbmltYXRlRmlsbCA9IHtcbiAgbmFtZTogJ2FuaW1hdGVGaWxsJyxcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZm46IGZ1bmN0aW9uIGZuKGluc3RhbmNlKSB7XG4gICAgdmFyIF9pbnN0YW5jZSRwcm9wcyRyZW5kZTtcblxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBpZiAoISgoX2luc3RhbmNlJHByb3BzJHJlbmRlID0gaW5zdGFuY2UucHJvcHMucmVuZGVyKSA9PSBudWxsID8gdm9pZCAwIDogX2luc3RhbmNlJHByb3BzJHJlbmRlLiQkdGlwcHkpKSB7XG4gICAgICBpZiAoXCJkZXZlbG9wbWVudFwiICE9PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICBlcnJvcldoZW4oaW5zdGFuY2UucHJvcHMuYW5pbWF0ZUZpbGwsICdUaGUgYGFuaW1hdGVGaWxsYCBwbHVnaW4gcmVxdWlyZXMgdGhlIGRlZmF1bHQgcmVuZGVyIGZ1bmN0aW9uLicpO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgdmFyIF9nZXRDaGlsZHJlbiA9IGdldENoaWxkcmVuKGluc3RhbmNlLnBvcHBlciksXG4gICAgICAgIGJveCA9IF9nZXRDaGlsZHJlbi5ib3gsXG4gICAgICAgIGNvbnRlbnQgPSBfZ2V0Q2hpbGRyZW4uY29udGVudDtcblxuICAgIHZhciBiYWNrZHJvcCA9IGluc3RhbmNlLnByb3BzLmFuaW1hdGVGaWxsID8gY3JlYXRlQmFja2Ryb3BFbGVtZW50KCkgOiBudWxsO1xuICAgIHJldHVybiB7XG4gICAgICBvbkNyZWF0ZTogZnVuY3Rpb24gb25DcmVhdGUoKSB7XG4gICAgICAgIGlmIChiYWNrZHJvcCkge1xuICAgICAgICAgIGJveC5pbnNlcnRCZWZvcmUoYmFja2Ryb3AsIGJveC5maXJzdEVsZW1lbnRDaGlsZCk7XG4gICAgICAgICAgYm94LnNldEF0dHJpYnV0ZSgnZGF0YS1hbmltYXRlZmlsbCcsICcnKTtcbiAgICAgICAgICBib3guc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICAgICAgICBhcnJvdzogZmFsc2UsXG4gICAgICAgICAgICBhbmltYXRpb246ICdzaGlmdC1hd2F5J1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25Nb3VudDogZnVuY3Rpb24gb25Nb3VudCgpIHtcbiAgICAgICAgaWYgKGJhY2tkcm9wKSB7XG4gICAgICAgICAgdmFyIHRyYW5zaXRpb25EdXJhdGlvbiA9IGJveC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb247XG4gICAgICAgICAgdmFyIGR1cmF0aW9uID0gTnVtYmVyKHRyYW5zaXRpb25EdXJhdGlvbi5yZXBsYWNlKCdtcycsICcnKSk7IC8vIFRoZSBjb250ZW50IHNob3VsZCBmYWRlIGluIGFmdGVyIHRoZSBiYWNrZHJvcCBoYXMgbW9zdGx5IGZpbGxlZCB0aGVcbiAgICAgICAgICAvLyB0b29sdGlwIGVsZW1lbnQuIGBjbGlwLXBhdGhgIGlzIHRoZSBvdGhlciBhbHRlcm5hdGl2ZSBidXQgaXMgbm90XG4gICAgICAgICAgLy8gd2VsbC1zdXBwb3J0ZWQgYW5kIGlzIGJ1Z2d5IG9uIHNvbWUgZGV2aWNlcy5cblxuICAgICAgICAgIGNvbnRlbnQuc3R5bGUudHJhbnNpdGlvbkRlbGF5ID0gTWF0aC5yb3VuZChkdXJhdGlvbiAvIDEwKSArIFwibXNcIjtcbiAgICAgICAgICBiYWNrZHJvcC5zdHlsZS50cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb247XG4gICAgICAgICAgc2V0VmlzaWJpbGl0eVN0YXRlKFtiYWNrZHJvcF0sICd2aXNpYmxlJyk7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvblNob3c6IGZ1bmN0aW9uIG9uU2hvdygpIHtcbiAgICAgICAgaWYgKGJhY2tkcm9wKSB7XG4gICAgICAgICAgYmFja2Ryb3Auc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gJzBtcyc7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbkhpZGU6IGZ1bmN0aW9uIG9uSGlkZSgpIHtcbiAgICAgICAgaWYgKGJhY2tkcm9wKSB7XG4gICAgICAgICAgc2V0VmlzaWJpbGl0eVN0YXRlKFtiYWNrZHJvcF0sICdoaWRkZW4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGNyZWF0ZUJhY2tkcm9wRWxlbWVudCgpIHtcbiAgdmFyIGJhY2tkcm9wID0gZGl2KCk7XG4gIGJhY2tkcm9wLmNsYXNzTmFtZSA9IEJBQ0tEUk9QX0NMQVNTO1xuICBzZXRWaXNpYmlsaXR5U3RhdGUoW2JhY2tkcm9wXSwgJ2hpZGRlbicpO1xuICByZXR1cm4gYmFja2Ryb3A7XG59XG5cbnZhciBtb3VzZUNvb3JkcyA9IHtcbiAgY2xpZW50WDogMCxcbiAgY2xpZW50WTogMFxufTtcbnZhciBhY3RpdmVJbnN0YW5jZXMgPSBbXTtcblxuZnVuY3Rpb24gc3RvcmVNb3VzZUNvb3JkcyhfcmVmKSB7XG4gIHZhciBjbGllbnRYID0gX3JlZi5jbGllbnRYLFxuICAgICAgY2xpZW50WSA9IF9yZWYuY2xpZW50WTtcbiAgbW91c2VDb29yZHMgPSB7XG4gICAgY2xpZW50WDogY2xpZW50WCxcbiAgICBjbGllbnRZOiBjbGllbnRZXG4gIH07XG59XG5cbmZ1bmN0aW9uIGFkZE1vdXNlQ29vcmRzTGlzdGVuZXIoZG9jKSB7XG4gIGRvYy5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBzdG9yZU1vdXNlQ29vcmRzKTtcbn1cblxuZnVuY3Rpb24gcmVtb3ZlTW91c2VDb29yZHNMaXN0ZW5lcihkb2MpIHtcbiAgZG9jLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIHN0b3JlTW91c2VDb29yZHMpO1xufVxuXG52YXIgZm9sbG93Q3Vyc29yID0ge1xuICBuYW1lOiAnZm9sbG93Q3Vyc29yJyxcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZm46IGZ1bmN0aW9uIGZuKGluc3RhbmNlKSB7XG4gICAgdmFyIHJlZmVyZW5jZSA9IGluc3RhbmNlLnJlZmVyZW5jZTtcbiAgICB2YXIgZG9jID0gZ2V0T3duZXJEb2N1bWVudChpbnN0YW5jZS5wcm9wcy50cmlnZ2VyVGFyZ2V0IHx8IHJlZmVyZW5jZSk7XG4gICAgdmFyIGlzSW50ZXJuYWxVcGRhdGUgPSBmYWxzZTtcbiAgICB2YXIgd2FzRm9jdXNFdmVudCA9IGZhbHNlO1xuICAgIHZhciBpc1VubW91bnRlZCA9IHRydWU7XG4gICAgdmFyIHByZXZQcm9wcyA9IGluc3RhbmNlLnByb3BzO1xuXG4gICAgZnVuY3Rpb24gZ2V0SXNJbml0aWFsQmVoYXZpb3IoKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UucHJvcHMuZm9sbG93Q3Vyc29yID09PSAnaW5pdGlhbCcgJiYgaW5zdGFuY2Uuc3RhdGUuaXNWaXNpYmxlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFkZExpc3RlbmVyKCkge1xuICAgICAgZG9jLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG9uTW91c2VNb3ZlKTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcigpIHtcbiAgICAgIGRvYy5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gdW5zZXRHZXRSZWZlcmVuY2VDbGllbnRSZWN0KCkge1xuICAgICAgaXNJbnRlcm5hbFVwZGF0ZSA9IHRydWU7XG4gICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6IG51bGxcbiAgICAgIH0pO1xuICAgICAgaXNJbnRlcm5hbFVwZGF0ZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIG9uTW91c2VNb3ZlKGV2ZW50KSB7XG4gICAgICAvLyBJZiB0aGUgaW5zdGFuY2UgaXMgaW50ZXJhY3RpdmUsIGF2b2lkIHVwZGF0aW5nIHRoZSBwb3NpdGlvbiB1bmxlc3MgaXQnc1xuICAgICAgLy8gb3ZlciB0aGUgcmVmZXJlbmNlIGVsZW1lbnRcbiAgICAgIHZhciBpc0N1cnNvck92ZXJSZWZlcmVuY2UgPSBldmVudC50YXJnZXQgPyByZWZlcmVuY2UuY29udGFpbnMoZXZlbnQudGFyZ2V0KSA6IHRydWU7XG4gICAgICB2YXIgZm9sbG93Q3Vyc29yID0gaW5zdGFuY2UucHJvcHMuZm9sbG93Q3Vyc29yO1xuICAgICAgdmFyIGNsaWVudFggPSBldmVudC5jbGllbnRYLFxuICAgICAgICAgIGNsaWVudFkgPSBldmVudC5jbGllbnRZO1xuICAgICAgdmFyIHJlY3QgPSByZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICB2YXIgcmVsYXRpdmVYID0gY2xpZW50WCAtIHJlY3QubGVmdDtcbiAgICAgIHZhciByZWxhdGl2ZVkgPSBjbGllbnRZIC0gcmVjdC50b3A7XG5cbiAgICAgIGlmIChpc0N1cnNvck92ZXJSZWZlcmVuY2UgfHwgIWluc3RhbmNlLnByb3BzLmludGVyYWN0aXZlKSB7XG4gICAgICAgIGluc3RhbmNlLnNldFByb3BzKHtcbiAgICAgICAgICBnZXRSZWZlcmVuY2VDbGllbnRSZWN0OiBmdW5jdGlvbiBnZXRSZWZlcmVuY2VDbGllbnRSZWN0KCkge1xuICAgICAgICAgICAgdmFyIHJlY3QgPSByZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gICAgICAgICAgICB2YXIgeCA9IGNsaWVudFg7XG4gICAgICAgICAgICB2YXIgeSA9IGNsaWVudFk7XG5cbiAgICAgICAgICAgIGlmIChmb2xsb3dDdXJzb3IgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgICB4ID0gcmVjdC5sZWZ0ICsgcmVsYXRpdmVYO1xuICAgICAgICAgICAgICB5ID0gcmVjdC50b3AgKyByZWxhdGl2ZVk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0b3AgPSBmb2xsb3dDdXJzb3IgPT09ICdob3Jpem9udGFsJyA/IHJlY3QudG9wIDogeTtcbiAgICAgICAgICAgIHZhciByaWdodCA9IGZvbGxvd0N1cnNvciA9PT0gJ3ZlcnRpY2FsJyA/IHJlY3QucmlnaHQgOiB4O1xuICAgICAgICAgICAgdmFyIGJvdHRvbSA9IGZvbGxvd0N1cnNvciA9PT0gJ2hvcml6b250YWwnID8gcmVjdC5ib3R0b20gOiB5O1xuICAgICAgICAgICAgdmFyIGxlZnQgPSBmb2xsb3dDdXJzb3IgPT09ICd2ZXJ0aWNhbCcgPyByZWN0LmxlZnQgOiB4O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgd2lkdGg6IHJpZ2h0IC0gbGVmdCxcbiAgICAgICAgICAgICAgaGVpZ2h0OiBib3R0b20gLSB0b3AsXG4gICAgICAgICAgICAgIHRvcDogdG9wLFxuICAgICAgICAgICAgICByaWdodDogcmlnaHQsXG4gICAgICAgICAgICAgIGJvdHRvbTogYm90dG9tLFxuICAgICAgICAgICAgICBsZWZ0OiBsZWZ0XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gY3JlYXRlKCkge1xuICAgICAgaWYgKGluc3RhbmNlLnByb3BzLmZvbGxvd0N1cnNvcikge1xuICAgICAgICBhY3RpdmVJbnN0YW5jZXMucHVzaCh7XG4gICAgICAgICAgaW5zdGFuY2U6IGluc3RhbmNlLFxuICAgICAgICAgIGRvYzogZG9jXG4gICAgICAgIH0pO1xuICAgICAgICBhZGRNb3VzZUNvb3Jkc0xpc3RlbmVyKGRvYyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZGVzdHJveSgpIHtcbiAgICAgIGFjdGl2ZUluc3RhbmNlcyA9IGFjdGl2ZUluc3RhbmNlcy5maWx0ZXIoZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIGRhdGEuaW5zdGFuY2UgIT09IGluc3RhbmNlO1xuICAgICAgfSk7XG5cbiAgICAgIGlmIChhY3RpdmVJbnN0YW5jZXMuZmlsdGVyKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgIHJldHVybiBkYXRhLmRvYyA9PT0gZG9jO1xuICAgICAgfSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJlbW92ZU1vdXNlQ29vcmRzTGlzdGVuZXIoZG9jKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb25DcmVhdGU6IGNyZWF0ZSxcbiAgICAgIG9uRGVzdHJveTogZGVzdHJveSxcbiAgICAgIG9uQmVmb3JlVXBkYXRlOiBmdW5jdGlvbiBvbkJlZm9yZVVwZGF0ZSgpIHtcbiAgICAgICAgcHJldlByb3BzID0gaW5zdGFuY2UucHJvcHM7XG4gICAgICB9LFxuICAgICAgb25BZnRlclVwZGF0ZTogZnVuY3Rpb24gb25BZnRlclVwZGF0ZShfLCBfcmVmMikge1xuICAgICAgICB2YXIgZm9sbG93Q3Vyc29yID0gX3JlZjIuZm9sbG93Q3Vyc29yO1xuXG4gICAgICAgIGlmIChpc0ludGVybmFsVXBkYXRlKSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvbGxvd0N1cnNvciAhPT0gdW5kZWZpbmVkICYmIHByZXZQcm9wcy5mb2xsb3dDdXJzb3IgIT09IGZvbGxvd0N1cnNvcikge1xuICAgICAgICAgIGRlc3Ryb3koKTtcblxuICAgICAgICAgIGlmIChmb2xsb3dDdXJzb3IpIHtcbiAgICAgICAgICAgIGNyZWF0ZSgpO1xuXG4gICAgICAgICAgICBpZiAoaW5zdGFuY2Uuc3RhdGUuaXNNb3VudGVkICYmICF3YXNGb2N1c0V2ZW50ICYmICFnZXRJc0luaXRpYWxCZWhhdmlvcigpKSB7XG4gICAgICAgICAgICAgIGFkZExpc3RlbmVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyKCk7XG4gICAgICAgICAgICB1bnNldEdldFJlZmVyZW5jZUNsaWVudFJlY3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvbk1vdW50OiBmdW5jdGlvbiBvbk1vdW50KCkge1xuICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMuZm9sbG93Q3Vyc29yICYmICF3YXNGb2N1c0V2ZW50KSB7XG4gICAgICAgICAgaWYgKGlzVW5tb3VudGVkKSB7XG4gICAgICAgICAgICBvbk1vdXNlTW92ZShtb3VzZUNvb3Jkcyk7XG4gICAgICAgICAgICBpc1VubW91bnRlZCA9IGZhbHNlO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICghZ2V0SXNJbml0aWFsQmVoYXZpb3IoKSkge1xuICAgICAgICAgICAgYWRkTGlzdGVuZXIoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBvblRyaWdnZXI6IGZ1bmN0aW9uIG9uVHJpZ2dlcihfLCBldmVudCkge1xuICAgICAgICBpZiAoaXNNb3VzZUV2ZW50KGV2ZW50KSkge1xuICAgICAgICAgIG1vdXNlQ29vcmRzID0ge1xuICAgICAgICAgICAgY2xpZW50WDogZXZlbnQuY2xpZW50WCxcbiAgICAgICAgICAgIGNsaWVudFk6IGV2ZW50LmNsaWVudFlcbiAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgd2FzRm9jdXNFdmVudCA9IGV2ZW50LnR5cGUgPT09ICdmb2N1cyc7XG4gICAgICB9LFxuICAgICAgb25IaWRkZW46IGZ1bmN0aW9uIG9uSGlkZGVuKCkge1xuICAgICAgICBpZiAoaW5zdGFuY2UucHJvcHMuZm9sbG93Q3Vyc29yKSB7XG4gICAgICAgICAgdW5zZXRHZXRSZWZlcmVuY2VDbGllbnRSZWN0KCk7XG4gICAgICAgICAgcmVtb3ZlTGlzdGVuZXIoKTtcbiAgICAgICAgICBpc1VubW91bnRlZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiBnZXRQcm9wcyhwcm9wcywgbW9kaWZpZXIpIHtcbiAgdmFyIF9wcm9wcyRwb3BwZXJPcHRpb25zO1xuXG4gIHJldHVybiB7XG4gICAgcG9wcGVyT3B0aW9uczogT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMucG9wcGVyT3B0aW9ucywge1xuICAgICAgbW9kaWZpZXJzOiBbXS5jb25jYXQoKCgoX3Byb3BzJHBvcHBlck9wdGlvbnMgPSBwcm9wcy5wb3BwZXJPcHRpb25zKSA9PSBudWxsID8gdm9pZCAwIDogX3Byb3BzJHBvcHBlck9wdGlvbnMubW9kaWZpZXJzKSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uIChfcmVmKSB7XG4gICAgICAgIHZhciBuYW1lID0gX3JlZi5uYW1lO1xuICAgICAgICByZXR1cm4gbmFtZSAhPT0gbW9kaWZpZXIubmFtZTtcbiAgICAgIH0pLCBbbW9kaWZpZXJdKVxuICAgIH0pXG4gIH07XG59XG5cbnZhciBpbmxpbmVQb3NpdGlvbmluZyA9IHtcbiAgbmFtZTogJ2lubGluZVBvc2l0aW9uaW5nJyxcbiAgZGVmYXVsdFZhbHVlOiBmYWxzZSxcbiAgZm46IGZ1bmN0aW9uIGZuKGluc3RhbmNlKSB7XG4gICAgdmFyIHJlZmVyZW5jZSA9IGluc3RhbmNlLnJlZmVyZW5jZTtcblxuICAgIGZ1bmN0aW9uIGlzRW5hYmxlZCgpIHtcbiAgICAgIHJldHVybiAhIWluc3RhbmNlLnByb3BzLmlubGluZVBvc2l0aW9uaW5nO1xuICAgIH1cblxuICAgIHZhciBwbGFjZW1lbnQ7XG4gICAgdmFyIGN1cnNvclJlY3RJbmRleCA9IC0xO1xuICAgIHZhciBpc0ludGVybmFsVXBkYXRlID0gZmFsc2U7XG4gICAgdmFyIG1vZGlmaWVyID0ge1xuICAgICAgbmFtZTogJ3RpcHB5SW5saW5lUG9zaXRpb25pbmcnLFxuICAgICAgZW5hYmxlZDogdHJ1ZSxcbiAgICAgIHBoYXNlOiAnYWZ0ZXJXcml0ZScsXG4gICAgICBmbjogZnVuY3Rpb24gZm4oX3JlZjIpIHtcbiAgICAgICAgdmFyIHN0YXRlID0gX3JlZjIuc3RhdGU7XG5cbiAgICAgICAgaWYgKGlzRW5hYmxlZCgpKSB7XG4gICAgICAgICAgaWYgKHBsYWNlbWVudCAhPT0gc3RhdGUucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBpbnN0YW5jZS5zZXRQcm9wcyh7XG4gICAgICAgICAgICAgIGdldFJlZmVyZW5jZUNsaWVudFJlY3Q6IGZ1bmN0aW9uIGdldFJlZmVyZW5jZUNsaWVudFJlY3QoKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIF9nZXRSZWZlcmVuY2VDbGllbnRSZWN0KHN0YXRlLnBsYWNlbWVudCk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIHBsYWNlbWVudCA9IHN0YXRlLnBsYWNlbWVudDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG5cbiAgICBmdW5jdGlvbiBfZ2V0UmVmZXJlbmNlQ2xpZW50UmVjdChwbGFjZW1lbnQpIHtcbiAgICAgIHJldHVybiBnZXRJbmxpbmVCb3VuZGluZ0NsaWVudFJlY3QoZ2V0QmFzZVBsYWNlbWVudChwbGFjZW1lbnQpLCByZWZlcmVuY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGFycmF5RnJvbShyZWZlcmVuY2UuZ2V0Q2xpZW50UmVjdHMoKSksIGN1cnNvclJlY3RJbmRleCk7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2V0SW50ZXJuYWxQcm9wcyhwYXJ0aWFsUHJvcHMpIHtcbiAgICAgIGlzSW50ZXJuYWxVcGRhdGUgPSB0cnVlO1xuICAgICAgaW5zdGFuY2Uuc2V0UHJvcHMocGFydGlhbFByb3BzKTtcbiAgICAgIGlzSW50ZXJuYWxVcGRhdGUgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBhZGRNb2RpZmllcigpIHtcbiAgICAgIGlmICghaXNJbnRlcm5hbFVwZGF0ZSkge1xuICAgICAgICBzZXRJbnRlcm5hbFByb3BzKGdldFByb3BzKGluc3RhbmNlLnByb3BzLCBtb2RpZmllcikpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBvbkNyZWF0ZTogYWRkTW9kaWZpZXIsXG4gICAgICBvbkFmdGVyVXBkYXRlOiBhZGRNb2RpZmllcixcbiAgICAgIG9uVHJpZ2dlcjogZnVuY3Rpb24gb25UcmlnZ2VyKF8sIGV2ZW50KSB7XG4gICAgICAgIGlmIChpc01vdXNlRXZlbnQoZXZlbnQpKSB7XG4gICAgICAgICAgdmFyIHJlY3RzID0gYXJyYXlGcm9tKGluc3RhbmNlLnJlZmVyZW5jZS5nZXRDbGllbnRSZWN0cygpKTtcbiAgICAgICAgICB2YXIgY3Vyc29yUmVjdCA9IHJlY3RzLmZpbmQoZnVuY3Rpb24gKHJlY3QpIHtcbiAgICAgICAgICAgIHJldHVybiByZWN0LmxlZnQgLSAyIDw9IGV2ZW50LmNsaWVudFggJiYgcmVjdC5yaWdodCArIDIgPj0gZXZlbnQuY2xpZW50WCAmJiByZWN0LnRvcCAtIDIgPD0gZXZlbnQuY2xpZW50WSAmJiByZWN0LmJvdHRvbSArIDIgPj0gZXZlbnQuY2xpZW50WTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBjdXJzb3JSZWN0SW5kZXggPSByZWN0cy5pbmRleE9mKGN1cnNvclJlY3QpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgb25VbnRyaWdnZXI6IGZ1bmN0aW9uIG9uVW50cmlnZ2VyKCkge1xuICAgICAgICBjdXJzb3JSZWN0SW5kZXggPSAtMTtcbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuZnVuY3Rpb24gZ2V0SW5saW5lQm91bmRpbmdDbGllbnRSZWN0KGN1cnJlbnRCYXNlUGxhY2VtZW50LCBib3VuZGluZ1JlY3QsIGNsaWVudFJlY3RzLCBjdXJzb3JSZWN0SW5kZXgpIHtcbiAgLy8gTm90IGFuIGlubGluZSBlbGVtZW50LCBvciBwbGFjZW1lbnQgaXMgbm90IHlldCBrbm93blxuICBpZiAoY2xpZW50UmVjdHMubGVuZ3RoIDwgMiB8fCBjdXJyZW50QmFzZVBsYWNlbWVudCA9PT0gbnVsbCkge1xuICAgIHJldHVybiBib3VuZGluZ1JlY3Q7XG4gIH0gLy8gVGhlcmUgYXJlIHR3byByZWN0cyBhbmQgdGhleSBhcmUgZGlzam9pbmVkXG5cblxuICBpZiAoY2xpZW50UmVjdHMubGVuZ3RoID09PSAyICYmIGN1cnNvclJlY3RJbmRleCA+PSAwICYmIGNsaWVudFJlY3RzWzBdLmxlZnQgPiBjbGllbnRSZWN0c1sxXS5yaWdodCkge1xuICAgIHJldHVybiBjbGllbnRSZWN0c1tjdXJzb3JSZWN0SW5kZXhdIHx8IGJvdW5kaW5nUmVjdDtcbiAgfVxuXG4gIHN3aXRjaCAoY3VycmVudEJhc2VQbGFjZW1lbnQpIHtcbiAgICBjYXNlICd0b3AnOlxuICAgIGNhc2UgJ2JvdHRvbSc6XG4gICAgICB7XG4gICAgICAgIHZhciBmaXJzdFJlY3QgPSBjbGllbnRSZWN0c1swXTtcbiAgICAgICAgdmFyIGxhc3RSZWN0ID0gY2xpZW50UmVjdHNbY2xpZW50UmVjdHMubGVuZ3RoIC0gMV07XG4gICAgICAgIHZhciBpc1RvcCA9IGN1cnJlbnRCYXNlUGxhY2VtZW50ID09PSAndG9wJztcbiAgICAgICAgdmFyIHRvcCA9IGZpcnN0UmVjdC50b3A7XG4gICAgICAgIHZhciBib3R0b20gPSBsYXN0UmVjdC5ib3R0b207XG4gICAgICAgIHZhciBsZWZ0ID0gaXNUb3AgPyBmaXJzdFJlY3QubGVmdCA6IGxhc3RSZWN0LmxlZnQ7XG4gICAgICAgIHZhciByaWdodCA9IGlzVG9wID8gZmlyc3RSZWN0LnJpZ2h0IDogbGFzdFJlY3QucmlnaHQ7XG4gICAgICAgIHZhciB3aWR0aCA9IHJpZ2h0IC0gbGVmdDtcbiAgICAgICAgdmFyIGhlaWdodCA9IGJvdHRvbSAtIHRvcDtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICB0b3A6IHRvcCxcbiAgICAgICAgICBib3R0b206IGJvdHRvbSxcbiAgICAgICAgICBsZWZ0OiBsZWZ0LFxuICAgICAgICAgIHJpZ2h0OiByaWdodCxcbiAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBoZWlnaHRcbiAgICAgICAgfTtcbiAgICAgIH1cblxuICAgIGNhc2UgJ2xlZnQnOlxuICAgIGNhc2UgJ3JpZ2h0JzpcbiAgICAgIHtcbiAgICAgICAgdmFyIG1pbkxlZnQgPSBNYXRoLm1pbi5hcHBseShNYXRoLCBjbGllbnRSZWN0cy5tYXAoZnVuY3Rpb24gKHJlY3RzKSB7XG4gICAgICAgICAgcmV0dXJuIHJlY3RzLmxlZnQ7XG4gICAgICAgIH0pKTtcbiAgICAgICAgdmFyIG1heFJpZ2h0ID0gTWF0aC5tYXguYXBwbHkoTWF0aCwgY2xpZW50UmVjdHMubWFwKGZ1bmN0aW9uIChyZWN0cykge1xuICAgICAgICAgIHJldHVybiByZWN0cy5yaWdodDtcbiAgICAgICAgfSkpO1xuICAgICAgICB2YXIgbWVhc3VyZVJlY3RzID0gY2xpZW50UmVjdHMuZmlsdGVyKGZ1bmN0aW9uIChyZWN0KSB7XG4gICAgICAgICAgcmV0dXJuIGN1cnJlbnRCYXNlUGxhY2VtZW50ID09PSAnbGVmdCcgPyByZWN0LmxlZnQgPT09IG1pbkxlZnQgOiByZWN0LnJpZ2h0ID09PSBtYXhSaWdodDtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBfdG9wID0gbWVhc3VyZVJlY3RzWzBdLnRvcDtcbiAgICAgICAgdmFyIF9ib3R0b20gPSBtZWFzdXJlUmVjdHNbbWVhc3VyZVJlY3RzLmxlbmd0aCAtIDFdLmJvdHRvbTtcbiAgICAgICAgdmFyIF9sZWZ0ID0gbWluTGVmdDtcbiAgICAgICAgdmFyIF9yaWdodCA9IG1heFJpZ2h0O1xuXG4gICAgICAgIHZhciBfd2lkdGggPSBfcmlnaHQgLSBfbGVmdDtcblxuICAgICAgICB2YXIgX2hlaWdodCA9IF9ib3R0b20gLSBfdG9wO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG9wOiBfdG9wLFxuICAgICAgICAgIGJvdHRvbTogX2JvdHRvbSxcbiAgICAgICAgICBsZWZ0OiBfbGVmdCxcbiAgICAgICAgICByaWdodDogX3JpZ2h0LFxuICAgICAgICAgIHdpZHRoOiBfd2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiBfaGVpZ2h0XG4gICAgICAgIH07XG4gICAgICB9XG5cbiAgICBkZWZhdWx0OlxuICAgICAge1xuICAgICAgICByZXR1cm4gYm91bmRpbmdSZWN0O1xuICAgICAgfVxuICB9XG59XG5cbnZhciBzdGlja3kgPSB7XG4gIG5hbWU6ICdzdGlja3knLFxuICBkZWZhdWx0VmFsdWU6IGZhbHNlLFxuICBmbjogZnVuY3Rpb24gZm4oaW5zdGFuY2UpIHtcbiAgICB2YXIgcmVmZXJlbmNlID0gaW5zdGFuY2UucmVmZXJlbmNlLFxuICAgICAgICBwb3BwZXIgPSBpbnN0YW5jZS5wb3BwZXI7XG5cbiAgICBmdW5jdGlvbiBnZXRSZWZlcmVuY2UoKSB7XG4gICAgICByZXR1cm4gaW5zdGFuY2UucG9wcGVySW5zdGFuY2UgPyBpbnN0YW5jZS5wb3BwZXJJbnN0YW5jZS5zdGF0ZS5lbGVtZW50cy5yZWZlcmVuY2UgOiByZWZlcmVuY2U7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gc2hvdWxkQ2hlY2sodmFsdWUpIHtcbiAgICAgIHJldHVybiBpbnN0YW5jZS5wcm9wcy5zdGlja3kgPT09IHRydWUgfHwgaW5zdGFuY2UucHJvcHMuc3RpY2t5ID09PSB2YWx1ZTtcbiAgICB9XG5cbiAgICB2YXIgcHJldlJlZlJlY3QgPSBudWxsO1xuICAgIHZhciBwcmV2UG9wUmVjdCA9IG51bGw7XG5cbiAgICBmdW5jdGlvbiB1cGRhdGVQb3NpdGlvbigpIHtcbiAgICAgIHZhciBjdXJyZW50UmVmUmVjdCA9IHNob3VsZENoZWNrKCdyZWZlcmVuY2UnKSA/IGdldFJlZmVyZW5jZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIDogbnVsbDtcbiAgICAgIHZhciBjdXJyZW50UG9wUmVjdCA9IHNob3VsZENoZWNrKCdwb3BwZXInKSA/IHBvcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7XG5cbiAgICAgIGlmIChjdXJyZW50UmVmUmVjdCAmJiBhcmVSZWN0c0RpZmZlcmVudChwcmV2UmVmUmVjdCwgY3VycmVudFJlZlJlY3QpIHx8IGN1cnJlbnRQb3BSZWN0ICYmIGFyZVJlY3RzRGlmZmVyZW50KHByZXZQb3BSZWN0LCBjdXJyZW50UG9wUmVjdCkpIHtcbiAgICAgICAgaWYgKGluc3RhbmNlLnBvcHBlckluc3RhbmNlKSB7XG4gICAgICAgICAgaW5zdGFuY2UucG9wcGVySW5zdGFuY2UudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgcHJldlJlZlJlY3QgPSBjdXJyZW50UmVmUmVjdDtcbiAgICAgIHByZXZQb3BSZWN0ID0gY3VycmVudFBvcFJlY3Q7XG5cbiAgICAgIGlmIChpbnN0YW5jZS5zdGF0ZS5pc01vdW50ZWQpIHtcbiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZVBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgb25Nb3VudDogZnVuY3Rpb24gb25Nb3VudCgpIHtcbiAgICAgICAgaWYgKGluc3RhbmNlLnByb3BzLnN0aWNreSkge1xuICAgICAgICAgIHVwZGF0ZVBvc2l0aW9uKCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG59O1xuXG5mdW5jdGlvbiBhcmVSZWN0c0RpZmZlcmVudChyZWN0QSwgcmVjdEIpIHtcbiAgaWYgKHJlY3RBICYmIHJlY3RCKSB7XG4gICAgcmV0dXJuIHJlY3RBLnRvcCAhPT0gcmVjdEIudG9wIHx8IHJlY3RBLnJpZ2h0ICE9PSByZWN0Qi5yaWdodCB8fCByZWN0QS5ib3R0b20gIT09IHJlY3RCLmJvdHRvbSB8fCByZWN0QS5sZWZ0ICE9PSByZWN0Qi5sZWZ0O1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbnRpcHB5LnNldERlZmF1bHRQcm9wcyh7XG4gIHJlbmRlcjogcmVuZGVyXG59KTtcblxuZXhwb3J0cy5hbmltYXRlRmlsbCA9IGFuaW1hdGVGaWxsO1xuZXhwb3J0cy5jcmVhdGVTaW5nbGV0b24gPSBjcmVhdGVTaW5nbGV0b247XG5leHBvcnRzLmRlZmF1bHQgPSB0aXBweTtcbmV4cG9ydHMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTtcbmV4cG9ydHMuZm9sbG93Q3Vyc29yID0gZm9sbG93Q3Vyc29yO1xuZXhwb3J0cy5oaWRlQWxsID0gaGlkZUFsbDtcbmV4cG9ydHMuaW5saW5lUG9zaXRpb25pbmcgPSBpbmxpbmVQb3NpdGlvbmluZztcbmV4cG9ydHMucm91bmRBcnJvdyA9IFJPVU5EX0FSUk9XO1xuZXhwb3J0cy5zdGlja3kgPSBzdGlja3k7XG4vLyMgc291cmNlTWFwcGluZ1VSTD10aXBweS5janMuanMubWFwXG4iLCIhZnVuY3Rpb24odCxlKXtcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cyYmXCJvYmplY3RcIj09dHlwZW9mIG1vZHVsZT9tb2R1bGUuZXhwb3J0cz1lKCk6XCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kP2RlZmluZShbXSxlKTpcIm9iamVjdFwiPT10eXBlb2YgZXhwb3J0cz9leHBvcnRzW1widnVlLWpzLW1vZGFsXCJdPWUoKTp0W1widnVlLWpzLW1vZGFsXCJdPWUoKX0od2luZG93LGZ1bmN0aW9uKCl7cmV0dXJuIGk9e30sby5tPW49W2Z1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDcpO1wic3RyaW5nXCI9PXR5cGVvZiBpJiYoaT1bW3QuaSxpLFwiXCJdXSksaS5sb2NhbHMmJih0LmV4cG9ydHM9aS5sb2NhbHMpOygwLG4oNCkuZGVmYXVsdCkoXCJkNzYzNjc5Y1wiLGksITEse30pfSxmdW5jdGlvbih0LGUsbil7dmFyIGk9bigxMCk7XCJzdHJpbmdcIj09dHlwZW9mIGkmJihpPVtbdC5pLGksXCJcIl1dKSxpLmxvY2FscyYmKHQuZXhwb3J0cz1pLmxvY2Fscyk7KDAsbig0KS5kZWZhdWx0KShcIjZiOWNjMGUwXCIsaSwhMSx7fSl9LGZ1bmN0aW9uKHQsZSxuKXt2YXIgaT1uKDEyKTtcInN0cmluZ1wiPT10eXBlb2YgaSYmKGk9W1t0LmksaSxcIlwiXV0pLGkubG9jYWxzJiYodC5leHBvcnRzPWkubG9jYWxzKTsoMCxuKDQpLmRlZmF1bHQpKFwiNjYzYzAwNGVcIixpLCExLHt9KX0sZnVuY3Rpb24odCxlKXt0LmV4cG9ydHM9ZnVuY3Rpb24obil7dmFyIGE9W107cmV0dXJuIGEudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odCl7dmFyIGU9ZnVuY3Rpb24odCxlKXt2YXIgbj10WzFdfHxcIlwiLGk9dFszXTtpZighaSlyZXR1cm4gbjtpZihlJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBidG9hKXt2YXIgbz1mdW5jdGlvbih0KXtyZXR1cm5cIi8qIyBzb3VyY2VNYXBwaW5nVVJMPWRhdGE6YXBwbGljYXRpb24vanNvbjtjaGFyc2V0PXV0Zi04O2Jhc2U2NCxcIitidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeSh0KSkpKStcIiAqL1wifShpKSxyPWkuc291cmNlcy5tYXAoZnVuY3Rpb24odCl7cmV0dXJuXCIvKiMgc291cmNlVVJMPVwiK2kuc291cmNlUm9vdCt0K1wiICovXCJ9KTtyZXR1cm5bbl0uY29uY2F0KHIpLmNvbmNhdChbb10pLmpvaW4oXCJcXG5cIil9cmV0dXJuW25dLmpvaW4oXCJcXG5cIil9KHQsbik7cmV0dXJuIHRbMl0/XCJAbWVkaWEgXCIrdFsyXStcIntcIitlK1wifVwiOmV9KS5qb2luKFwiXCIpfSxhLmk9ZnVuY3Rpb24odCxlKXtcInN0cmluZ1wiPT10eXBlb2YgdCYmKHQ9W1tudWxsLHQsXCJcIl1dKTtmb3IodmFyIG49e30saT0wO2k8dGhpcy5sZW5ndGg7aSsrKXt2YXIgbz10aGlzW2ldWzBdO1wibnVtYmVyXCI9PXR5cGVvZiBvJiYobltvXT0hMCl9Zm9yKGk9MDtpPHQubGVuZ3RoO2krKyl7dmFyIHI9dFtpXTtcIm51bWJlclwiPT10eXBlb2YgclswXSYmbltyWzBdXXx8KGUmJiFyWzJdP3JbMl09ZTplJiYoclsyXT1cIihcIityWzJdK1wiKSBhbmQgKFwiK2UrXCIpXCIpLGEucHVzaChyKSl9fSxhfX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIGwodCxlKXtmb3IodmFyIG49W10saT17fSxvPTA7bzxlLmxlbmd0aDtvKyspe3ZhciByPWVbb10sYT1yWzBdLHM9e2lkOnQrXCI6XCIrbyxjc3M6clsxXSxtZWRpYTpyWzJdLHNvdXJjZU1hcDpyWzNdfTtpW2FdP2lbYV0ucGFydHMucHVzaChzKTpuLnB1c2goaVthXT17aWQ6YSxwYXJ0czpbc119KX1yZXR1cm4gbn1uLnIoZSksbi5kKGUsXCJkZWZhdWx0XCIsZnVuY3Rpb24oKXtyZXR1cm4gcH0pO3ZhciBpPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBkb2N1bWVudDtpZihcInVuZGVmaW5lZFwiIT10eXBlb2YgREVCVUcmJkRFQlVHJiYhaSl0aHJvdyBuZXcgRXJyb3IoXCJ2dWUtc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQuIFVzZSB7IHRhcmdldDogJ25vZGUnIH0gaW4geW91ciBXZWJwYWNrIGNvbmZpZyB0byBpbmRpY2F0ZSBhIHNlcnZlci1yZW5kZXJpbmcgZW52aXJvbm1lbnQuXCIpO3ZhciB1PXt9LG89aSYmKGRvY3VtZW50LmhlYWR8fGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwiaGVhZFwiKVswXSkscj1udWxsLGE9MCxjPSExLHM9ZnVuY3Rpb24oKXt9LGQ9bnVsbCxoPVwiZGF0YS12dWUtc3NyLWlkXCIsZj1cInVuZGVmaW5lZFwiIT10eXBlb2YgbmF2aWdhdG9yJiYvbXNpZSBbNi05XVxcYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpO2Z1bmN0aW9uIHAoYSx0LGUsbil7Yz1lLGQ9bnx8e307dmFyIHM9bChhLHQpO3JldHVybiB2KHMpLGZ1bmN0aW9uKHQpe2Zvcih2YXIgZT1bXSxuPTA7bjxzLmxlbmd0aDtuKyspe3ZhciBpPXNbbl07KG89dVtpLmlkXSkucmVmcy0tLGUucHVzaChvKX10P3Yocz1sKGEsdCkpOnM9W107Zm9yKG49MDtuPGUubGVuZ3RoO24rKyl7dmFyIG87aWYoMD09PShvPWVbbl0pLnJlZnMpe2Zvcih2YXIgcj0wO3I8by5wYXJ0cy5sZW5ndGg7cisrKW8ucGFydHNbcl0oKTtkZWxldGUgdVtvLmlkXX19fX1mdW5jdGlvbiB2KHQpe2Zvcih2YXIgZT0wO2U8dC5sZW5ndGg7ZSsrKXt2YXIgbj10W2VdLGk9dVtuLmlkXTtpZihpKXtpLnJlZnMrKztmb3IodmFyIG89MDtvPGkucGFydHMubGVuZ3RoO28rKylpLnBhcnRzW29dKG4ucGFydHNbb10pO2Zvcig7bzxuLnBhcnRzLmxlbmd0aDtvKyspaS5wYXJ0cy5wdXNoKGIobi5wYXJ0c1tvXSkpO2kucGFydHMubGVuZ3RoPm4ucGFydHMubGVuZ3RoJiYoaS5wYXJ0cy5sZW5ndGg9bi5wYXJ0cy5sZW5ndGgpfWVsc2V7dmFyIHI9W107Zm9yKG89MDtvPG4ucGFydHMubGVuZ3RoO28rKylyLnB1c2goYihuLnBhcnRzW29dKSk7dVtuLmlkXT17aWQ6bi5pZCxyZWZzOjEscGFydHM6cn19fX1mdW5jdGlvbiBtKCl7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInN0eWxlXCIpO3JldHVybiB0LnR5cGU9XCJ0ZXh0L2Nzc1wiLG8uYXBwZW5kQ2hpbGQodCksdH1mdW5jdGlvbiBiKGUpe3ZhciBuLGksdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKFwic3R5bGVbXCIraCsnfj1cIicrZS5pZCsnXCJdJyk7aWYodCl7aWYoYylyZXR1cm4gczt0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodCl9aWYoZil7dmFyIG89YSsrO3Q9cj1yfHxtKCksbj13LmJpbmQobnVsbCx0LG8sITEpLGk9dy5iaW5kKG51bGwsdCxvLCEwKX1lbHNlIHQ9bSgpLG49ZnVuY3Rpb24odCxlKXt2YXIgbj1lLmNzcyxpPWUubWVkaWEsbz1lLnNvdXJjZU1hcDtpJiZ0LnNldEF0dHJpYnV0ZShcIm1lZGlhXCIsaSk7ZC5zc3JJZCYmdC5zZXRBdHRyaWJ1dGUoaCxlLmlkKTtvJiYobis9XCJcXG4vKiMgc291cmNlVVJMPVwiK28uc291cmNlc1swXStcIiAqL1wiLG4rPVwiXFxuLyojIHNvdXJjZU1hcHBpbmdVUkw9ZGF0YTphcHBsaWNhdGlvbi9qc29uO2Jhc2U2NCxcIitidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShvKSkpKStcIiAqL1wiKTtpZih0LnN0eWxlU2hlZXQpdC5zdHlsZVNoZWV0LmNzc1RleHQ9bjtlbHNle2Zvcig7dC5maXJzdENoaWxkOyl0LnJlbW92ZUNoaWxkKHQuZmlyc3RDaGlsZCk7dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuKSl9fS5iaW5kKG51bGwsdCksaT1mdW5jdGlvbigpe3QucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KX07cmV0dXJuIG4oZSksZnVuY3Rpb24odCl7aWYodCl7aWYodC5jc3M9PT1lLmNzcyYmdC5tZWRpYT09PWUubWVkaWEmJnQuc291cmNlTWFwPT09ZS5zb3VyY2VNYXApcmV0dXJuO24oZT10KX1lbHNlIGkoKX19dmFyIHksZz0oeT1bXSxmdW5jdGlvbih0LGUpe3JldHVybiB5W3RdPWUseS5maWx0ZXIoQm9vbGVhbikuam9pbihcIlxcblwiKX0pO2Z1bmN0aW9uIHcodCxlLG4saSl7dmFyIG89bj9cIlwiOmkuY3NzO2lmKHQuc3R5bGVTaGVldCl0LnN0eWxlU2hlZXQuY3NzVGV4dD1nKGUsbyk7ZWxzZXt2YXIgcj1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvKSxhPXQuY2hpbGROb2RlczthW2VdJiZ0LnJlbW92ZUNoaWxkKGFbZV0pLGEubGVuZ3RoP3QuaW5zZXJ0QmVmb3JlKHIsYVtlXSk6dC5hcHBlbmRDaGlsZChyKX19fSxmdW5jdGlvbih0LE0sZSl7XCJ1c2Ugc3RyaWN0XCI7KGZ1bmN0aW9uKHQpe3ZhciBpPWZ1bmN0aW9uKCl7aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIE1hcClyZXR1cm4gTWFwO2Z1bmN0aW9uIGkodCxuKXt2YXIgaT0tMTtyZXR1cm4gdC5zb21lKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHRbMF09PT1uJiYoaT1lLCEwKX0pLGl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSxcInNpemVcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX19lbnRyaWVzX18ubGVuZ3RofSxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pLHQucHJvdG90eXBlLmdldD1mdW5jdGlvbih0KXt2YXIgZT1pKHRoaXMuX19lbnRyaWVzX18sdCksbj10aGlzLl9fZW50cmllc19fW2VdO3JldHVybiBuJiZuWzFdfSx0LnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24odCxlKXt2YXIgbj1pKHRoaXMuX19lbnRyaWVzX18sdCk7fm4/dGhpcy5fX2VudHJpZXNfX1tuXVsxXT1lOnRoaXMuX19lbnRyaWVzX18ucHVzaChbdCxlXSl9LHQucHJvdG90eXBlLmRlbGV0ZT1mdW5jdGlvbih0KXt2YXIgZT10aGlzLl9fZW50cmllc19fLG49aShlLHQpO35uJiZlLnNwbGljZShuLDEpfSx0LnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24odCl7cmV0dXJuISF+aSh0aGlzLl9fZW50cmllc19fLHQpfSx0LnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuX19lbnRyaWVzX18uc3BsaWNlKDApfSx0LnByb3RvdHlwZS5mb3JFYWNoPWZ1bmN0aW9uKHQsZSl7dm9pZCAwPT09ZSYmKGU9bnVsbCk7Zm9yKHZhciBuPTAsaT10aGlzLl9fZW50cmllc19fO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dO3QuY2FsbChlLG9bMV0sb1swXSl9fSx0O2Z1bmN0aW9uIHQoKXt0aGlzLl9fZW50cmllc19fPVtdfX0oKSxuPVwidW5kZWZpbmVkXCIhPXR5cGVvZiB3aW5kb3cmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBkb2N1bWVudCYmd2luZG93LmRvY3VtZW50PT09ZG9jdW1lbnQsZT12b2lkIDAhPT10JiZ0Lk1hdGg9PT1NYXRoP3Q6XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNlbGYmJnNlbGYuTWF0aD09PU1hdGg/c2VsZjpcInVuZGVmaW5lZFwiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09PU1hdGg/d2luZG93OkZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKSxsPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZT9yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZChlKTpmdW5jdGlvbih0KXtyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpe3JldHVybiB0KERhdGUubm93KCkpfSwxZTMvNjApfSx1PTI7dmFyIG89W1widG9wXCIsXCJyaWdodFwiLFwiYm90dG9tXCIsXCJsZWZ0XCIsXCJ3aWR0aFwiLFwiaGVpZ2h0XCIsXCJzaXplXCIsXCJ3ZWlnaHRcIl0scj1cInVuZGVmaW5lZFwiIT10eXBlb2YgTXV0YXRpb25PYnNlcnZlcixhPShzLnByb3RvdHlwZS5hZGRPYnNlcnZlcj1mdW5jdGlvbih0KXt+dGhpcy5vYnNlcnZlcnNfLmluZGV4T2YodCl8fHRoaXMub2JzZXJ2ZXJzXy5wdXNoKHQpLHRoaXMuY29ubmVjdGVkX3x8dGhpcy5jb25uZWN0XygpfSxzLnByb3RvdHlwZS5yZW1vdmVPYnNlcnZlcj1mdW5jdGlvbih0KXt2YXIgZT10aGlzLm9ic2VydmVyc18sbj1lLmluZGV4T2YodCk7fm4mJmUuc3BsaWNlKG4sMSksIWUubGVuZ3RoJiZ0aGlzLmNvbm5lY3RlZF8mJnRoaXMuZGlzY29ubmVjdF8oKX0scy5wcm90b3R5cGUucmVmcmVzaD1mdW5jdGlvbigpe3RoaXMudXBkYXRlT2JzZXJ2ZXJzXygpJiZ0aGlzLnJlZnJlc2goKX0scy5wcm90b3R5cGUudXBkYXRlT2JzZXJ2ZXJzXz1mdW5jdGlvbigpe3ZhciB0PXRoaXMub2JzZXJ2ZXJzXy5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIHQuZ2F0aGVyQWN0aXZlKCksdC5oYXNBY3RpdmUoKX0pO3JldHVybiB0LmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIHQuYnJvYWRjYXN0QWN0aXZlKCl9KSwwPHQubGVuZ3RofSxzLnByb3RvdHlwZS5jb25uZWN0Xz1mdW5jdGlvbigpe24mJiF0aGlzLmNvbm5lY3RlZF8mJihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwidHJhbnNpdGlvbmVuZFwiLHRoaXMub25UcmFuc2l0aW9uRW5kXyksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIix0aGlzLnJlZnJlc2gpLHI/KHRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfPW5ldyBNdXRhdGlvbk9ic2VydmVyKHRoaXMucmVmcmVzaCksdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8ub2JzZXJ2ZShkb2N1bWVudCx7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsY2hhcmFjdGVyRGF0YTohMCxzdWJ0cmVlOiEwfSkpOihkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwiRE9NU3VidHJlZU1vZGlmaWVkXCIsdGhpcy5yZWZyZXNoKSx0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfPSEwKSx0aGlzLmNvbm5lY3RlZF89ITApfSxzLnByb3RvdHlwZS5kaXNjb25uZWN0Xz1mdW5jdGlvbigpe24mJnRoaXMuY29ubmVjdGVkXyYmKGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJ0cmFuc2l0aW9uZW5kXCIsdGhpcy5vblRyYW5zaXRpb25FbmRfKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcInJlc2l6ZVwiLHRoaXMucmVmcmVzaCksdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl8mJnRoaXMubXV0YXRpb25zT2JzZXJ2ZXJfLmRpc2Nvbm5lY3QoKSx0aGlzLm11dGF0aW9uRXZlbnRzQWRkZWRfJiZkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NU3VidHJlZU1vZGlmaWVkXCIsdGhpcy5yZWZyZXNoKSx0aGlzLm11dGF0aW9uc09ic2VydmVyXz1udWxsLHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF89ITEsdGhpcy5jb25uZWN0ZWRfPSExKX0scy5wcm90b3R5cGUub25UcmFuc2l0aW9uRW5kXz1mdW5jdGlvbih0KXt2YXIgZT10LnByb3BlcnR5TmFtZSxuPXZvaWQgMD09PWU/XCJcIjplO28uc29tZShmdW5jdGlvbih0KXtyZXR1cm4hIX5uLmluZGV4T2YodCl9KSYmdGhpcy5yZWZyZXNoKCl9LHMuZ2V0SW5zdGFuY2U9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5pbnN0YW5jZV98fCh0aGlzLmluc3RhbmNlXz1uZXcgcyksdGhpcy5pbnN0YW5jZV99LHMuaW5zdGFuY2VfPW51bGwscyk7ZnVuY3Rpb24gcygpe2Z1bmN0aW9uIHQoKXtyJiYocj0hMSxpKCkpLGEmJm4oKX1mdW5jdGlvbiBlKCl7bCh0KX1mdW5jdGlvbiBuKCl7dmFyIHQ9RGF0ZS5ub3coKTtpZihyKXtpZih0LXM8dSlyZXR1cm47YT0hMH1lbHNlIGE9IShyPSEwKSxzZXRUaW1lb3V0KGUsbyk7cz10fXZhciBpLG8scixhLHM7dGhpcy5jb25uZWN0ZWRfPSExLHRoaXMubXV0YXRpb25FdmVudHNBZGRlZF89ITEsdGhpcy5tdXRhdGlvbnNPYnNlcnZlcl89bnVsbCx0aGlzLm9ic2VydmVyc189W10sdGhpcy5vblRyYW5zaXRpb25FbmRfPXRoaXMub25UcmFuc2l0aW9uRW5kXy5iaW5kKHRoaXMpLHRoaXMucmVmcmVzaD0oaT10aGlzLnJlZnJlc2guYmluZCh0aGlzKSxhPXI9IShvPTIwKSxzPTAsbil9dmFyIGM9ZnVuY3Rpb24odCxlKXtmb3IodmFyIG49MCxpPU9iamVjdC5rZXlzKGUpO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LG8se3ZhbHVlOmVbb10sZW51bWVyYWJsZTohMSx3cml0YWJsZTohMSxjb25maWd1cmFibGU6ITB9KX1yZXR1cm4gdH0saD1mdW5jdGlvbih0KXtyZXR1cm4gdCYmdC5vd25lckRvY3VtZW50JiZ0Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXd8fGV9LGY9eSgwLDAsMCwwKTtmdW5jdGlvbiBwKHQpe3JldHVybiBwYXJzZUZsb2F0KHQpfHwwfWZ1bmN0aW9uIHYobil7Zm9yKHZhciB0PVtdLGU9MTtlPGFyZ3VtZW50cy5sZW5ndGg7ZSsrKXRbZS0xXT1hcmd1bWVudHNbZV07cmV0dXJuIHQucmVkdWNlKGZ1bmN0aW9uKHQsZSl7cmV0dXJuIHQrcChuW1wiYm9yZGVyLVwiK2UrXCItd2lkdGhcIl0pfSwwKX1mdW5jdGlvbiBkKHQpe3ZhciBlPXQuY2xpZW50V2lkdGgsbj10LmNsaWVudEhlaWdodDtpZighZSYmIW4pcmV0dXJuIGY7dmFyIGksbz1oKHQpLmdldENvbXB1dGVkU3R5bGUodCkscj1mdW5jdGlvbih0KXtmb3IodmFyIGU9e30sbj0wLGk9W1widG9wXCIsXCJyaWdodFwiLFwiYm90dG9tXCIsXCJsZWZ0XCJdO248aS5sZW5ndGg7bisrKXt2YXIgbz1pW25dLHI9dFtcInBhZGRpbmctXCIrb107ZVtvXT1wKHIpfXJldHVybiBlfShvKSxhPXIubGVmdCtyLnJpZ2h0LHM9ci50b3Arci5ib3R0b20sbD1wKG8ud2lkdGgpLHU9cChvLmhlaWdodCk7aWYoXCJib3JkZXItYm94XCI9PT1vLmJveFNpemluZyYmKE1hdGgucm91bmQobCthKSE9PWUmJihsLT12KG8sXCJsZWZ0XCIsXCJyaWdodFwiKSthKSxNYXRoLnJvdW5kKHUrcykhPT1uJiYodS09dihvLFwidG9wXCIsXCJib3R0b21cIikrcykpLChpPXQpIT09aChpKS5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpe3ZhciBjPU1hdGgucm91bmQobCthKS1lLGQ9TWF0aC5yb3VuZCh1K3MpLW47MSE9PU1hdGguYWJzKGMpJiYobC09YyksMSE9PU1hdGguYWJzKGQpJiYodS09ZCl9cmV0dXJuIHkoci5sZWZ0LHIudG9wLGwsdSl9dmFyIG09XCJ1bmRlZmluZWRcIiE9dHlwZW9mIFNWR0dyYXBoaWNzRWxlbWVudD9mdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGgodCkuU1ZHR3JhcGhpY3NFbGVtZW50fTpmdW5jdGlvbih0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIGgodCkuU1ZHRWxlbWVudCYmXCJmdW5jdGlvblwiPT10eXBlb2YgdC5nZXRCQm94fTtmdW5jdGlvbiBiKHQpe3JldHVybiBuP20odCk/eSgwLDAsKGU9dC5nZXRCQm94KCkpLndpZHRoLGUuaGVpZ2h0KTpkKHQpOmY7dmFyIGV9ZnVuY3Rpb24geSh0LGUsbixpKXtyZXR1cm57eDp0LHk6ZSx3aWR0aDpuLGhlaWdodDppfX12YXIgZz0ody5wcm90b3R5cGUuaXNBY3RpdmU9ZnVuY3Rpb24oKXt2YXIgdD1iKHRoaXMudGFyZ2V0KTtyZXR1cm4odGhpcy5jb250ZW50UmVjdF89dCkud2lkdGghPT10aGlzLmJyb2FkY2FzdFdpZHRofHx0LmhlaWdodCE9PXRoaXMuYnJvYWRjYXN0SGVpZ2h0fSx3LnByb3RvdHlwZS5icm9hZGNhc3RSZWN0PWZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5jb250ZW50UmVjdF87cmV0dXJuIHRoaXMuYnJvYWRjYXN0V2lkdGg9dC53aWR0aCx0aGlzLmJyb2FkY2FzdEhlaWdodD10LmhlaWdodCx0fSx3KTtmdW5jdGlvbiB3KHQpe3RoaXMuYnJvYWRjYXN0V2lkdGg9MCx0aGlzLmJyb2FkY2FzdEhlaWdodD0wLHRoaXMuY29udGVudFJlY3RfPXkoMCwwLDAsMCksdGhpcy50YXJnZXQ9dH12YXIgXz1mdW5jdGlvbih0LGUpe3ZhciBuLGksbyxyLGEscyxsLHU9KGk9KG49ZSkueCxvPW4ueSxyPW4ud2lkdGgsYT1uLmhlaWdodCxzPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBET01SZWN0UmVhZE9ubHk/RE9NUmVjdFJlYWRPbmx5Ok9iamVjdCxsPU9iamVjdC5jcmVhdGUocy5wcm90b3R5cGUpLGMobCx7eDppLHk6byx3aWR0aDpyLGhlaWdodDphLHRvcDpvLHJpZ2h0Omkrcixib3R0b206YStvLGxlZnQ6aX0pLGwpO2ModGhpcyx7dGFyZ2V0OnQsY29udGVudFJlY3Q6dX0pfSxFPSh4LnByb3RvdHlwZS5vYnNlcnZlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoXCIxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuXCIpO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBFbGVtZW50JiZFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0KXtpZighKHQgaW5zdGFuY2VvZiBoKHQpLkVsZW1lbnQpKXRocm93IG5ldyBUeXBlRXJyb3IoJ3BhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlIFwiRWxlbWVudFwiLicpO3ZhciBlPXRoaXMub2JzZXJ2YXRpb25zXztlLmhhcyh0KXx8KGUuc2V0KHQsbmV3IGcodCkpLHRoaXMuY29udHJvbGxlcl8uYWRkT2JzZXJ2ZXIodGhpcyksdGhpcy5jb250cm9sbGVyXy5yZWZyZXNoKCkpfX0seC5wcm90b3R5cGUudW5vYnNlcnZlPWZ1bmN0aW9uKHQpe2lmKCFhcmd1bWVudHMubGVuZ3RoKXRocm93IG5ldyBUeXBlRXJyb3IoXCIxIGFyZ3VtZW50IHJlcXVpcmVkLCBidXQgb25seSAwIHByZXNlbnQuXCIpO2lmKFwidW5kZWZpbmVkXCIhPXR5cGVvZiBFbGVtZW50JiZFbGVtZW50IGluc3RhbmNlb2YgT2JqZWN0KXtpZighKHQgaW5zdGFuY2VvZiBoKHQpLkVsZW1lbnQpKXRocm93IG5ldyBUeXBlRXJyb3IoJ3BhcmFtZXRlciAxIGlzIG5vdCBvZiB0eXBlIFwiRWxlbWVudFwiLicpO3ZhciBlPXRoaXMub2JzZXJ2YXRpb25zXztlLmhhcyh0KSYmKGUuZGVsZXRlKHQpLGUuc2l6ZXx8dGhpcy5jb250cm9sbGVyXy5yZW1vdmVPYnNlcnZlcih0aGlzKSl9fSx4LnByb3RvdHlwZS5kaXNjb25uZWN0PWZ1bmN0aW9uKCl7dGhpcy5jbGVhckFjdGl2ZSgpLHRoaXMub2JzZXJ2YXRpb25zXy5jbGVhcigpLHRoaXMuY29udHJvbGxlcl8ucmVtb3ZlT2JzZXJ2ZXIodGhpcyl9LHgucHJvdG90eXBlLmdhdGhlckFjdGl2ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy5jbGVhckFjdGl2ZSgpLHRoaXMub2JzZXJ2YXRpb25zXy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuaXNBY3RpdmUoKSYmZS5hY3RpdmVPYnNlcnZhdGlvbnNfLnB1c2godCl9KX0seC5wcm90b3R5cGUuYnJvYWRjYXN0QWN0aXZlPWZ1bmN0aW9uKCl7aWYodGhpcy5oYXNBY3RpdmUoKSl7dmFyIHQ9dGhpcy5jYWxsYmFja0N0eF8sZT10aGlzLmFjdGl2ZU9ic2VydmF0aW9uc18ubWFwKGZ1bmN0aW9uKHQpe3JldHVybiBuZXcgXyh0LnRhcmdldCx0LmJyb2FkY2FzdFJlY3QoKSl9KTt0aGlzLmNhbGxiYWNrXy5jYWxsKHQsZSx0KSx0aGlzLmNsZWFyQWN0aXZlKCl9fSx4LnByb3RvdHlwZS5jbGVhckFjdGl2ZT1mdW5jdGlvbigpe3RoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5zcGxpY2UoMCl9LHgucHJvdG90eXBlLmhhc0FjdGl2ZT1mdW5jdGlvbigpe3JldHVybiAwPHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXy5sZW5ndGh9LHgpO2Z1bmN0aW9uIHgodCxlLG4pe2lmKHRoaXMuYWN0aXZlT2JzZXJ2YXRpb25zXz1bXSx0aGlzLm9ic2VydmF0aW9uc189bmV3IGksXCJmdW5jdGlvblwiIT10eXBlb2YgdCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiVGhlIGNhbGxiYWNrIHByb3ZpZGVkIGFzIHBhcmFtZXRlciAxIGlzIG5vdCBhIGZ1bmN0aW9uLlwiKTt0aGlzLmNhbGxiYWNrXz10LHRoaXMuY29udHJvbGxlcl89ZSx0aGlzLmNhbGxiYWNrQ3R4Xz1ufXZhciBUPW5ldyhcInVuZGVmaW5lZFwiIT10eXBlb2YgV2Vha01hcD9XZWFrTWFwOmkpLE89ZnVuY3Rpb24gdChlKXtpZighKHRoaXMgaW5zdGFuY2VvZiB0KSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uLlwiKTtpZighYXJndW1lbnRzLmxlbmd0aCl0aHJvdyBuZXcgVHlwZUVycm9yKFwiMSBhcmd1bWVudCByZXF1aXJlZCwgYnV0IG9ubHkgMCBwcmVzZW50LlwiKTt2YXIgbj1hLmdldEluc3RhbmNlKCksaT1uZXcgRShlLG4sdGhpcyk7VC5zZXQodGhpcyxpKX07W1wib2JzZXJ2ZVwiLFwidW5vYnNlcnZlXCIsXCJkaXNjb25uZWN0XCJdLmZvckVhY2goZnVuY3Rpb24oZSl7Ty5wcm90b3R5cGVbZV09ZnVuY3Rpb24oKXt2YXIgdDtyZXR1cm4odD1ULmdldCh0aGlzKSlbZV0uYXBwbHkodCxhcmd1bWVudHMpfX0pO3ZhciBTPXZvaWQgMCE9PWUuUmVzaXplT2JzZXJ2ZXI/ZS5SZXNpemVPYnNlcnZlcjpPO00uYT1TfSkuY2FsbCh0aGlzLGUoOCkpfSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9bigwKTtuLm4oaSkuYX0sZnVuY3Rpb24odCxlLG4peyh0LmV4cG9ydHM9bigzKSghMSkpLnB1c2goW3QuaSxcIlxcbi52dWUtbW9kYWwtcmVzaXplciB7XFxuICBkaXNwbGF5OiBibG9jaztcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICB3aWR0aDogMTJweDtcXG4gIGhlaWdodDogMTJweDtcXG4gIHJpZ2h0OiAwO1xcbiAgYm90dG9tOiAwO1xcbiAgei1pbmRleDogOTk5OTk5OTtcXG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xcbiAgY3Vyc29yOiBzZS1yZXNpemU7XFxufVxcbi52dWUtbW9kYWwtcmVzaXplcjo6YWZ0ZXIge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICBjb250ZW50OiAnJztcXG4gIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50O1xcbiAgbGVmdDogMDtcXG4gIHRvcDogMDtcXG4gIHdpZHRoOiAwO1xcbiAgaGVpZ2h0OiAwO1xcbiAgYm9yZGVyLWJvdHRvbTogMTBweCBzb2xpZCAjZGRkO1xcbiAgYm9yZGVyLWxlZnQ6IDEwcHggc29saWQgdHJhbnNwYXJlbnQ7XFxufVxcbi52dWUtbW9kYWwtcmVzaXplci5jbGlja2VkOjphZnRlciB7XFxuICBib3JkZXItYm90dG9tOiAxMHB4IHNvbGlkICMzNjliZTk7XFxufVxcblwiLFwiXCJdKX0sZnVuY3Rpb24odCxlKXt2YXIgbjtuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9KCk7dHJ5e249bnx8bmV3IEZ1bmN0aW9uKFwicmV0dXJuIHRoaXNcIikoKX1jYXRjaCh0KXtcIm9iamVjdFwiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfXQuZXhwb3J0cz1ufSxmdW5jdGlvbih0LGUsbil7XCJ1c2Ugc3RyaWN0XCI7dmFyIGk9bigxKTtuLm4oaSkuYX0sZnVuY3Rpb24odCxlLG4peyh0LmV4cG9ydHM9bigzKSghMSkpLnB1c2goW3QuaSxcIlxcbi52bS0tYmxvY2stc2Nyb2xsIHtcXG4gIG92ZXJmbG93OiBoaWRkZW47XFxuICB3aWR0aDogMTAwdnc7XFxufVxcbi52bS0tY29udGFpbmVyIHtcXG4gIHBvc2l0aW9uOiBmaXhlZDtcXG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XFxuICBsZWZ0OiAwO1xcbiAgdG9wOiAwO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBoZWlnaHQ6IDEwMHZoO1xcbiAgei1pbmRleDogOTk5O1xcbn1cXG4udm0tLW92ZXJsYXkge1xcbiAgcG9zaXRpb246IGZpeGVkO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG4gIGxlZnQ6IDA7XFxuICB0b3A6IDA7XFxuICB3aWR0aDogMTAwJTtcXG4gIGhlaWdodDogMTAwdmg7XFxuICBiYWNrZ3JvdW5kOiByZ2JhKDAsIDAsIDAsIDAuMik7XFxuICAvKiB6LWluZGV4OiA5OTk7ICovXFxuICBvcGFjaXR5OiAxO1xcbn1cXG4udm0tLWNvbnRhaW5lci5zY3JvbGxhYmxlIHtcXG4gIGhlaWdodDogMTAwJTtcXG4gIG1pbi1oZWlnaHQ6IDEwMHZoO1xcbiAgb3ZlcmZsb3cteTogYXV0bztcXG4gIC13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOiB0b3VjaDtcXG59XFxuLnZtLS1tb2RhbCB7XFxuICBwb3NpdGlvbjogcmVsYXRpdmU7XFxuICBvdmVyZmxvdzogaGlkZGVuO1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG5cXG4gIGJhY2tncm91bmQtY29sb3I6IHdoaXRlO1xcbiAgYm9yZGVyLXJhZGl1czogM3B4O1xcbiAgYm94LXNoYWRvdzogMCAyMHB4IDYwcHggLTJweCByZ2JhKDI3LCAzMywgNTgsIDAuNCk7XFxufVxcbi52bS0tY29udGFpbmVyLnNjcm9sbGFibGUgLnZtLS1tb2RhbCB7XFxuICBtYXJnaW4tYm90dG9tOiAycHg7XFxufVxcbi52bS0tdG9wLXJpZ2h0LXNsb3Qge1xcbiAgZGlzcGxheTogYmxvY2s7XFxuICBwb3NpdGlvbjogYWJzb2x1dGU7XFxuICByaWdodDogMDtcXG4gIHRvcDogMDtcXG59XFxuLnZtLXRyYW5zaXRpb24tLW92ZXJsYXktZW50ZXItYWN0aXZlLFxcbi52bS10cmFuc2l0aW9uLS1vdmVybGF5LWxlYXZlLWFjdGl2ZSB7XFxuICB0cmFuc2l0aW9uOiBhbGwgNTBtcztcXG59XFxuLnZtLXRyYW5zaXRpb24tLW92ZXJsYXktZW50ZXIsXFxuLnZtLXRyYW5zaXRpb24tLW92ZXJsYXktbGVhdmUtYWN0aXZlIHtcXG4gIG9wYWNpdHk6IDA7XFxufVxcbi52bS10cmFuc2l0aW9uLS1tb2RhbC1lbnRlci1hY3RpdmUsXFxuLnZtLXRyYW5zaXRpb24tLW1vZGFsLWxlYXZlLWFjdGl2ZSB7XFxuICB0cmFuc2l0aW9uOiBhbGwgNDAwbXM7XFxufVxcbi52bS10cmFuc2l0aW9uLS1tb2RhbC1lbnRlcixcXG4udm0tdHJhbnNpdGlvbi0tbW9kYWwtbGVhdmUtYWN0aXZlIHtcXG4gIG9wYWNpdHk6IDA7XFxuICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoLTIwcHgpO1xcbn1cXG4udm0tdHJhbnNpdGlvbi0tZGVmYXVsdC1lbnRlci1hY3RpdmUsXFxuLnZtLXRyYW5zaXRpb24tLWRlZmF1bHQtbGVhdmUtYWN0aXZlIHtcXG4gIHRyYW5zaXRpb246IGFsbCAybXM7XFxufVxcbi52bS10cmFuc2l0aW9uLS1kZWZhdWx0LWVudGVyLFxcbi52bS10cmFuc2l0aW9uLS1kZWZhdWx0LWxlYXZlLWFjdGl2ZSB7XFxuICBvcGFjaXR5OiAwO1xcbn1cXG5cIixcIlwiXSl9LGZ1bmN0aW9uKHQsZSxuKXtcInVzZSBzdHJpY3RcIjt2YXIgaT1uKDIpO24ubihpKS5hfSxmdW5jdGlvbih0LGUsbil7KHQuZXhwb3J0cz1uKDMpKCExKSkucHVzaChbdC5pLFwiXFxuLnZ1ZS1kaWFsb2cge1xcbiAgZm9udC1zaXplOiAxNHB4O1xcbn1cXG4udnVlLWRpYWxvZyBkaXYge1xcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcXG59XFxuLnZ1ZS1kaWFsb2ctY29udGVudCB7XFxuICBmbGV4OiAxIDAgYXV0bztcXG4gIHdpZHRoOiAxMDAlO1xcbiAgcGFkZGluZzogMTRweDtcXG59XFxuLnZ1ZS1kaWFsb2ctY29udGVudC10aXRsZSB7XFxuICBmb250LXdlaWdodDogNjAwO1xcbiAgcGFkZGluZy1ib3R0b206IDE0cHg7XFxufVxcbi52dWUtZGlhbG9nLWJ1dHRvbnMge1xcbiAgZGlzcGxheTogZmxleDtcXG4gIGZsZXg6IDAgMSBhdXRvO1xcbiAgd2lkdGg6IDEwMCU7XFxuICBib3JkZXItdG9wOiAxcHggc29saWQgI2VlZTtcXG59XFxuLnZ1ZS1kaWFsb2ctYnV0dG9ucy1ub25lIHtcXG4gIHdpZHRoOiAxMDAlO1xcbiAgcGFkZGluZy1ib3R0b206IDE0cHg7XFxufVxcbi52dWUtZGlhbG9nLWJ1dHRvbiB7XFxuICBmb250LXNpemU6IGluaGVyaXQ7XFxuICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDtcXG4gIHBhZGRpbmc6IDA7XFxuICBtYXJnaW46IDA7XFxuICBib3JkZXI6IDA7XFxuICBjdXJzb3I6IHBvaW50ZXI7XFxuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xcbiAgbGluZS1oZWlnaHQ6IDQwcHg7XFxuICBoZWlnaHQ6IDQwcHg7XFxuICBjb2xvcjogaW5oZXJpdDtcXG4gIGZvbnQ6IGluaGVyaXQ7XFxuICBvdXRsaW5lOiBub25lO1xcbn1cXG4udnVlLWRpYWxvZy1idXR0b246aG92ZXIge1xcbiAgYmFja2dyb3VuZDogI2Y5ZjlmOTtcXG59XFxuLnZ1ZS1kaWFsb2ctYnV0dG9uOmFjdGl2ZSB7XFxuICBiYWNrZ3JvdW5kOiAjZjNmM2YzO1xcbn1cXG4udnVlLWRpYWxvZy1idXR0b246bm90KDpmaXJzdC1vZi10eXBlKSB7XFxuICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNlZWU7XFxufVxcblwiLFwiXCJdKX0sZnVuY3Rpb24odCxlLG4pe1widXNlIHN0cmljdFwiO24ucihlKSxuLmQoZSxcIk1vZGFsXCIsZnVuY3Rpb24oKXtyZXR1cm4gV30pLG4uZChlLFwiRGlhbG9nXCIsZnVuY3Rpb24oKXtyZXR1cm4gVX0pLG4uZChlLFwidmVyc2lvblwiLGZ1bmN0aW9uKCl7cmV0dXJuIEp9KTtmdW5jdGlvbiBpKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQsbj1lLl9zZWxmLl9jfHx0O3JldHVybiBlLnZpc2libGU/bihcImRpdlwiLHtjbGFzczplLmNvbnRhaW5lckNsYXNzfSxbbihcInRyYW5zaXRpb25cIix7YXR0cnM6e25hbWU6ZS5ndWFyYW50ZWVkT3ZlcmxheVRyYW5zaXRpb259LG9uOntcImJlZm9yZS1lbnRlclwiOmUuYmVmb3JlT3ZlcmxheVRyYW5zaXRpb25FbnRlcixcImFmdGVyLWVudGVyXCI6ZS5hZnRlck92ZXJsYXlUcmFuc2l0aW9uRW50ZXIsXCJiZWZvcmUtbGVhdmVcIjplLmJlZm9yZU92ZXJsYXlUcmFuc2l0aW9uTGVhdmUsXCJhZnRlci1sZWF2ZVwiOmUuYWZ0ZXJPdmVybGF5VHJhbnNpdGlvbkxlYXZlfX0sW2UudmlzaWJpbGl0eS5vdmVybGF5P24oXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJ2bS0tb3ZlcmxheVwiLGF0dHJzOntcImRhdGEtbW9kYWxcIjplLm5hbWUsXCJhcmlhLWV4cGFuZGVkXCI6ZS52aXNpYmlsaXR5Lm92ZXJsYXkudG9TdHJpbmcoKX0sb246e2NsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiB0LnRhcmdldCE9PXQuY3VycmVudFRhcmdldD9udWxsOih0LnN0b3BQcm9wYWdhdGlvbigpLGUub25PdmVybGF5Q2xpY2sodCkpfX19LFtuKFwiZGl2XCIse3N0YXRpY0NsYXNzOlwidm0tLXRvcC1yaWdodC1zbG90XCJ9LFtlLl90KFwidG9wLXJpZ2h0XCIpXSwyKV0pOmUuX2UoKV0pLGUuX3YoXCIgXCIpLG4oXCJ0cmFuc2l0aW9uXCIse2F0dHJzOntuYW1lOmUuZ3VhcmFudGVlZE1vZGFsVHJhbnNpdGlvbn0sb246e1wiYmVmb3JlLWVudGVyXCI6ZS5iZWZvcmVNb2RhbFRyYW5zaXRpb25FbnRlcixcImFmdGVyLWVudGVyXCI6ZS5hZnRlck1vZGFsVHJhbnNpdGlvbkVudGVyLFwiYmVmb3JlLWxlYXZlXCI6ZS5iZWZvcmVNb2RhbFRyYW5zaXRpb25MZWF2ZSxcImFmdGVyLWxlYXZlXCI6ZS5hZnRlck1vZGFsVHJhbnNpdGlvbkxlYXZlfX0sW2UudmlzaWJpbGl0eS5tb2RhbD9uKFwiZGl2XCIse3JlZjpcIm1vZGFsXCIsY2xhc3M6ZS5tb2RhbENsYXNzLHN0eWxlOmUubW9kYWxTdHlsZSxhdHRyczp7XCJhcmlhLWV4cGFuZGVkXCI6ZS52aXNpYmlsaXR5Lm1vZGFsLnRvU3RyaW5nKCkscm9sZTpcImRpYWxvZ1wiLFwiYXJpYS1tb2RhbFwiOlwidHJ1ZVwifX0sW2UuX3QoXCJkZWZhdWx0XCIpLGUuX3YoXCIgXCIpLGUucmVzaXphYmxlJiYhZS5pc0F1dG9IZWlnaHQ/bihcInJlc2l6ZXJcIix7YXR0cnM6e1wibWluLXdpZHRoXCI6ZS5taW5XaWR0aCxcIm1pbi1oZWlnaHRcIjplLm1pbkhlaWdodCxcIm1heC13aWR0aFwiOmUubWF4V2lkdGgsXCJtYXgtaGVpZ2h0XCI6ZS5tYXhIZWlnaHR9LG9uOntyZXNpemU6ZS5vbk1vZGFsUmVzaXplfX0pOmUuX2UoKV0sMik6ZS5fZSgpXSldLDEpOmUuX2UoKX1mdW5jdGlvbiBvKCl7dmFyIHQ9dGhpcy4kY3JlYXRlRWxlbWVudDtyZXR1cm4odGhpcy5fc2VsZi5fY3x8dCkoXCJkaXZcIix7Y2xhc3M6dGhpcy5jbGFzc05hbWV9KX1vLl93aXRoU3RyaXBwZWQ9aS5fd2l0aFN0cmlwcGVkPSEwO2Z1bmN0aW9uIGgodCxlLG4pe3JldHVybiBuPHQ/dDplPG4/ZTpufWZ1bmN0aW9uIHIodCxlLG4pe3JldHVybiBlIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsZSx7dmFsdWU6bixlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCx3cml0YWJsZTohMH0pOnRbZV09bix0fWZ1bmN0aW9uIGEodCxlKXtyZXR1cm4gZnVuY3Rpb24odCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdH0odCl8fGZ1bmN0aW9uKHQsZSl7dmFyIG49W10saT0hMCxvPSExLHI9dm9pZCAwO3RyeXtmb3IodmFyIGEscz10W1N5bWJvbC5pdGVyYXRvcl0oKTshKGk9KGE9cy5uZXh0KCkpLmRvbmUpJiYobi5wdXNoKGEudmFsdWUpLCFlfHxuLmxlbmd0aCE9PWUpO2k9ITApO31jYXRjaCh0KXtvPSEwLHI9dH1maW5hbGx5e3RyeXtpfHxudWxsPT1zLnJldHVybnx8cy5yZXR1cm4oKX1maW5hbGx5e2lmKG8pdGhyb3cgcn19cmV0dXJuIG59KHQsZSl8fGZ1bmN0aW9uKCl7dGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgYXR0ZW1wdCB0byBkZXN0cnVjdHVyZSBub24taXRlcmFibGUgaW5zdGFuY2VcIil9KCl9ZnVuY3Rpb24gcygpe3ZhciB0PXdpbmRvdy5pbm5lcldpZHRoLGU9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoO3JldHVybiB0JiZlP01hdGgubWluKHQsZSk6ZXx8dH1mdW5jdGlvbiBsKHQpe3JldHVybiB0LnNwbGl0KFwiO1wiKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIHQudHJpbSgpfSkuZmlsdGVyKEJvb2xlYW4pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC5zcGxpdChcIjpcIil9KS5yZWR1Y2UoZnVuY3Rpb24odCxlKXt2YXIgbj1hKGUsMik7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1t0XT9hcmd1bWVudHNbdF06e30saT1PYmplY3Qua2V5cyhuKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYoaT1pLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG4pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpLmVudW1lcmFibGV9KSkpLGkuZm9yRWFjaChmdW5jdGlvbih0KXtyKGUsdCxuW3RdKX0pfXJldHVybiBlfSh7fSx0LHIoe30sblswXSxuWzFdKSl9LHt9KX1mdW5jdGlvbiBmKHQpe3JldHVybiB0LnRvdWNoZXMmJjA8dC50b3VjaGVzLmxlbmd0aD90LnRvdWNoZXNbMF06dH12YXIgcD1bXCJJTlBVVFwiLFwiVEVYVEFSRUFcIixcIlNFTEVDVFwiXSxjPWZ1bmN0aW9uKHQpe3ZhciBlPTA8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD90OjA7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuKGUrKykudG9TdHJpbmcoKX19KCksdT17bmFtZTpcIlZ1ZUpzTW9kYWxSZXNpemVyXCIscHJvcHM6e21pbkhlaWdodDp7dHlwZTpOdW1iZXIsZGVmYXVsdDowfSxtaW5XaWR0aDp7dHlwZTpOdW1iZXIsZGVmYXVsdDowfSxtYXhXaWR0aDp7dHlwZTpOdW1iZXIsZGVmYXVsdDpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn0sbWF4SGVpZ2h0Ont0eXBlOk51bWJlcixkZWZhdWx0Ok51bWJlci5NQVhfU0FGRV9JTlRFR0VSfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntjbGlja2VkOiExLHNpemU6e319fSxtb3VudGVkOmZ1bmN0aW9uKCl7dGhpcy4kZWwuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLHRoaXMuc3RhcnQsITEpfSxjb21wdXRlZDp7Y2xhc3NOYW1lOmZ1bmN0aW9uKCl7cmV0dXJuW1widnVlLW1vZGFsLXJlc2l6ZXJcIix7Y2xpY2tlZDp0aGlzLmNsaWNrZWR9XX19LG1ldGhvZHM6e3N0YXJ0OmZ1bmN0aW9uKHQpe3RoaXMuY2xpY2tlZD0hMCx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlbW92ZVwiLHRoaXMubW91c2Vtb3ZlLCExKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0aGlzLnN0b3AsITEpLHQuc3RvcFByb3BhZ2F0aW9uKCksdC5wcmV2ZW50RGVmYXVsdCgpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5jbGlja2VkPSExLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsdGhpcy5tb3VzZW1vdmUsITEpLHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwibW91c2V1cFwiLHRoaXMuc3RvcCwhMSksdGhpcy4kZW1pdChcInJlc2l6ZS1zdG9wXCIse2VsZW1lbnQ6dGhpcy4kZWwucGFyZW50RWxlbWVudCxzaXplOnRoaXMuc2l6ZX0pfSxtb3VzZW1vdmU6ZnVuY3Rpb24odCl7dGhpcy5yZXNpemUodCl9LHJlc2l6ZTpmdW5jdGlvbih0KXt2YXIgZT10aGlzLiRlbC5wYXJlbnRFbGVtZW50O2lmKGUpe3ZhciBuPXQuY2xpZW50WC1lLm9mZnNldExlZnQsaT10LmNsaWVudFktZS5vZmZzZXRUb3Asbz1NYXRoLm1pbihzKCksdGhpcy5tYXhXaWR0aCkscj1NYXRoLm1pbih3aW5kb3cuaW5uZXJIZWlnaHQsdGhpcy5tYXhIZWlnaHQpO249aCh0aGlzLm1pbldpZHRoLG8sbiksaT1oKHRoaXMubWluSGVpZ2h0LHIsaSksdGhpcy5zaXplPXt3aWR0aDpuLGhlaWdodDppfSxlLnN0eWxlLndpZHRoPW4rXCJweFwiLGUuc3R5bGUuaGVpZ2h0PWkrXCJweFwiLHRoaXMuJGVtaXQoXCJyZXNpemVcIix7ZWxlbWVudDplLHNpemU6dGhpcy5zaXplfSl9fX19O24oNik7ZnVuY3Rpb24gZCh0LGUsbixpLG8scixhLHMpe3ZhciBsLHU9XCJmdW5jdGlvblwiPT10eXBlb2YgdD90Lm9wdGlvbnM6dDtpZihlJiYodS5yZW5kZXI9ZSx1LnN0YXRpY1JlbmRlckZucz1uLHUuX2NvbXBpbGVkPSEwKSxpJiYodS5mdW5jdGlvbmFsPSEwKSxyJiYodS5fc2NvcGVJZD1cImRhdGEtdi1cIityKSxhPyhsPWZ1bmN0aW9uKHQpeyh0PXR8fHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fHx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuJHZub2RlJiZ0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCl8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9ffHwodD1fX1ZVRV9TU1JfQ09OVEVYVF9fKSxvJiZvLmNhbGwodGhpcyx0KSx0JiZ0Ll9yZWdpc3RlcmVkQ29tcG9uZW50cyYmdC5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKGEpfSx1Ll9zc3JSZWdpc3Rlcj1sKTpvJiYobD1zP2Z1bmN0aW9uKCl7by5jYWxsKHRoaXMsdGhpcy4kcm9vdC4kb3B0aW9ucy5zaGFkb3dSb290KX06byksbClpZih1LmZ1bmN0aW9uYWwpe3UuX2luamVjdFN0eWxlcz1sO3ZhciBjPXUucmVuZGVyO3UucmVuZGVyPWZ1bmN0aW9uKHQsZSl7cmV0dXJuIGwuY2FsbChlKSxjKHQsZSl9fWVsc2V7dmFyIGQ9dS5iZWZvcmVDcmVhdGU7dS5iZWZvcmVDcmVhdGU9ZD9bXS5jb25jYXQoZCxsKTpbbF19cmV0dXJue2V4cG9ydHM6dCxvcHRpb25zOnV9fXZhciB2PWQodSxvLFtdLCExLG51bGwsbnVsbCxudWxsKTt2Lm9wdGlvbnMuX19maWxlPVwic3JjL2NvbXBvbmVudHMvUmVzaXplci52dWVcIjt2YXIgbT12LmV4cG9ydHM7ZnVuY3Rpb24gYih0KXtyZXR1cm4oYj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24geSh0KXtzd2l0Y2goYih0KSl7Y2FzZVwibnVtYmVyXCI6cmV0dXJue3R5cGU6XCJweFwiLHZhbHVlOnR9O2Nhc2VcInN0cmluZ1wiOnJldHVybiBmdW5jdGlvbihlKXtpZihcImF1dG9cIj09PWUpcmV0dXJue3R5cGU6ZSx2YWx1ZTowfTt2YXIgdD1fLmZpbmQoZnVuY3Rpb24odCl7cmV0dXJuIHQucmVnZXhwLnRlc3QoZSl9KTtyZXR1cm4gdD97dHlwZTp0Lm5hbWUsdmFsdWU6cGFyc2VGbG9hdChlKX06e3R5cGU6XCJcIix2YWx1ZTplfX0odCk7ZGVmYXVsdDpyZXR1cm57dHlwZTpcIlwiLHZhbHVlOnR9fX1mdW5jdGlvbiBnKHQpe2lmKFwic3RyaW5nXCIhPXR5cGVvZiB0KXJldHVybiAwPD10O3ZhciBlPXkodCk7cmV0dXJuKFwiJVwiPT09ZS50eXBlfHxcInB4XCI9PT1lLnR5cGUpJiYwPGUudmFsdWV9dmFyIHc9XCJbLStdP1swLTldKi4/WzAtOV0rXCIsXz1be25hbWU6XCJweFwiLHJlZ2V4cDpuZXcgUmVnRXhwKFwiXlwiLmNvbmNhdCh3LFwicHgkXCIpKX0se25hbWU6XCIlXCIscmVnZXhwOm5ldyBSZWdFeHAoXCJeXCIuY29uY2F0KHcsXCIlJFwiKSl9LHtuYW1lOlwicHhcIixyZWdleHA6bmV3IFJlZ0V4cChcIl5cIi5jb25jYXQodyxcIiRcIikpfV0sRT1uKDUpLHg9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyYmd2luZG93LlJlc2l6ZU9ic2VydmVyP1Jlc2l6ZU9ic2VydmVyOkUuYTtmdW5jdGlvbiBUKHQsZSl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspe3ZhciBpPWVbbl07aS5lbnVtZXJhYmxlPWkuZW51bWVyYWJsZXx8ITEsaS5jb25maWd1cmFibGU9ITAsXCJ2YWx1ZVwiaW4gaSYmKGkud3JpdGFibGU9ITApLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkua2V5LGkpfX1mdW5jdGlvbiBPKHQpe3JldHVybiBmdW5jdGlvbih0KXtpZihBcnJheS5pc0FycmF5KHQpKXtmb3IodmFyIGU9MCxuPW5ldyBBcnJheSh0Lmxlbmd0aCk7ZTx0Lmxlbmd0aDtlKyspbltlXT10W2VdO3JldHVybiBufX0odCl8fGZ1bmN0aW9uKHQpe2lmKFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCl8fFwiW29iamVjdCBBcmd1bWVudHNdXCI9PT1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodCkpcmV0dXJuIEFycmF5LmZyb20odCl9KHQpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gc3ByZWFkIG5vbi1pdGVyYWJsZSBpbnN0YW5jZVwiKX0oKX1mdW5jdGlvbiBTKHQpe3JldHVybiBlPSdidXR0b246bm90KFtkaXNhYmxlZF0pLCBzZWxlY3Q6bm90KFtkaXNhYmxlZF0pLCBhW2hyZWZdOm5vdChbZGlzYWJsZWRdKSwgYXJlYVtocmVmXTpub3QoW2Rpc2FibGVkXSksIFtjb250ZW50RWRpdGFibGU9XCJcIl06bm90KFtkaXNhYmxlZF0pLCBbY29udGVudEVkaXRhYmxlPVwidHJ1ZVwiXTpub3QoW2Rpc2FibGVkXSksIFtjb250ZW50RWRpdGFibGU9XCJUUlVFXCJdOm5vdChbZGlzYWJsZWRdKSwgdGV4dGFyZWE6bm90KFtkaXNhYmxlZF0pLCBpZnJhbWU6bm90KFtkaXNhYmxlZF0pLCBpbnB1dDpub3QoW2Rpc2FibGVkXSksIHN1bW1hcnk6bm90KFtkaXNhYmxlZF0pLCBbdGFiaW5kZXhdOm5vdChbdGFiaW5kZXg9XCItMVwiXSknLE8odC5xdWVyeVNlbGVjdG9yQWxsKGUpfHxbXSk7dmFyIGV9ZnVuY3Rpb24gTSh0KXtyZXR1cm4gdD09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudH12YXIgaz1mdW5jdGlvbigpe2Z1bmN0aW9uIHQoKXshZnVuY3Rpb24odCxlKXtpZighKHQgaW5zdGFuY2VvZiBlKSl0aHJvdyBuZXcgVHlwZUVycm9yKFwiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uXCIpfSh0aGlzLHQpLHRoaXMucm9vdD1udWxsLHRoaXMuZWxlbWVudHM9W10sdGhpcy5vbktleURvd249dGhpcy5vbktleURvd24uYmluZCh0aGlzKSx0aGlzLmVuYWJsZT10aGlzLmVuYWJsZS5iaW5kKHRoaXMpLHRoaXMuZGlzYWJsZT10aGlzLmRpc2FibGUuYmluZCh0aGlzKSx0aGlzLmZpcnN0RWxlbWVudD10aGlzLmZpcnN0RWxlbWVudC5iaW5kKHRoaXMpLHRoaXMubGFzdEVsZW1lbnQ9dGhpcy5sYXN0RWxlbWVudC5iaW5kKHRoaXMpfXZhciBlLG4saTtyZXR1cm4gZT10LChuPVt7a2V5OlwibGFzdEVsZW1lbnRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVsZW1lbnRzW3RoaXMuZWxlbWVudHMubGVuZ3RoLTFdfHxudWxsfX0se2tleTpcImZpcnN0RWxlbWVudFwiLHZhbHVlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudHNbMF18fG51bGx9fSx7a2V5Olwib25LZXlEb3duXCIsdmFsdWU6ZnVuY3Rpb24odCl7dmFyIGU7aWYoXCJUYWJcIj09PShlPXQpLmtleXx8OT09PWUua2V5Q29kZSlyZXR1cm4gdC5zaGlmdEtleSYmTSh0aGlzLmZpcnN0RWxlbWVudCgpKT8odGhpcy5sYXN0RWxlbWVudCgpLmZvY3VzKCksdm9pZCB0LnByZXZlbnREZWZhdWx0KCkpOiFkb2N1bWVudC5hY3RpdmVFbGVtZW50fHxNKHRoaXMubGFzdEVsZW1lbnQoKSk/KHRoaXMuZmlyc3RFbGVtZW50KCkuZm9jdXMoKSx2b2lkIHQucHJldmVudERlZmF1bHQoKSk6dm9pZCAwfX0se2tleTpcImVuYWJsZWRcIix2YWx1ZTpmdW5jdGlvbigpe3JldHVybiEhdGhpcy5yb290fX0se2tleTpcImVuYWJsZVwiLHZhbHVlOmZ1bmN0aW9uKHQpe2lmKHQpe3RoaXMucm9vdD10LHRoaXMuZWxlbWVudHM9Uyh0aGlzLnJvb3QpO3ZhciBlPXRoaXMuZmlyc3RFbGVtZW50KCk7ZSYmZS5mb2N1cygpLHRoaXMucm9vdC5hZGRFdmVudExpc3RlbmVyKFwia2V5ZG93blwiLHRoaXMub25LZXlEb3duKX19fSx7a2V5OlwiZGlzYWJsZVwiLHZhbHVlOmZ1bmN0aW9uKCl7dGhpcy5yb290LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJrZXlkb3duXCIsdGhpcy5vbktleURvd24pLHRoaXMucm9vdD1udWxsfX1dKSYmVChlLnByb3RvdHlwZSxuKSxpJiZUKGUsaSksdH0oKTtmdW5jdGlvbiBMKHQsZSxuKXtyZXR1cm4gZSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGUse3ZhbHVlOm4sZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITB9KTp0W2VdPW4sdH1mdW5jdGlvbiB6KHQsZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe2lmKEFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHR9KHQpfHxmdW5jdGlvbih0LGUpe3ZhciBuPVtdLGk9ITAsbz0hMSxyPXZvaWQgMDt0cnl7Zm9yKHZhciBhLHM9dFtTeW1ib2wuaXRlcmF0b3JdKCk7IShpPShhPXMubmV4dCgpKS5kb25lKSYmKG4ucHVzaChhLnZhbHVlKSwhZXx8bi5sZW5ndGghPT1lKTtpPSEwKTt9Y2F0Y2godCl7bz0hMCxyPXR9ZmluYWxseXt0cnl7aXx8bnVsbD09cy5yZXR1cm58fHMucmV0dXJuKCl9ZmluYWxseXtpZihvKXRocm93IHJ9fXJldHVybiBufSh0LGUpfHxmdW5jdGlvbigpe3Rocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIGF0dGVtcHQgdG8gZGVzdHJ1Y3R1cmUgbm9uLWl0ZXJhYmxlIGluc3RhbmNlXCIpfSgpfXZhciAkPVwidm0tdHJhbnNpdGlvbi0tZGVmYXVsdFwiLEE9XCJlbnRlclwiLEM9XCJlbnRlcmluZ1wiLGo9XCJsZWF2ZVwiLFI9XCJsZWF2bmdcIixIPXtuYW1lOlwiVnVlSnNNb2RhbFwiLHByb3BzOntuYW1lOntyZXF1aXJlZDohMCx0eXBlOlN0cmluZ30scmVzaXphYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sYWRhcHRpdmU6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxkcmFnZ2FibGU6e3R5cGU6W0Jvb2xlYW4sU3RyaW5nXSxkZWZhdWx0OiExfSxzY3JvbGxhYmxlOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0sZm9jdXNUcmFwOnt0eXBlOkJvb2xlYW4sZGVmYXVsdDohMX0scmVzZXQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfSxvdmVybGF5VHJhbnNpdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpcInZtLXRyYW5zaXRpb24tLW92ZXJsYXlcIn0sdHJhbnNpdGlvbjp7dHlwZTpTdHJpbmcsZGVmYXVsdDpcInZtLXRyYW5zaXRpb24tLW1vZGFsXCJ9LGNsaWNrVG9DbG9zZTp7dHlwZTpCb29sZWFuLGRlZmF1bHQ6ITB9LGNsYXNzZXM6e3R5cGU6W1N0cmluZyxBcnJheV0sZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybltdfX0sc3R5bGVzOnt0eXBlOltTdHJpbmcsQXJyYXksT2JqZWN0XX0sbWluV2lkdGg6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCx2YWxpZGF0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIDA8PXR9fSxtaW5IZWlnaHQ6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6MCx2YWxpZGF0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIDA8PXR9fSxtYXhXaWR0aDp7dHlwZTpOdW1iZXIsZGVmYXVsdDpOdW1iZXIuTUFYX1NBRkVfSU5URUdFUn0sbWF4SGVpZ2h0Ont0eXBlOk51bWJlcixkZWZhdWx0Ok51bWJlci5NQVhfU0FGRV9JTlRFR0VSfSx3aWR0aDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDo2MDAsdmFsaWRhdG9yOmd9LGhlaWdodDp7dHlwZTpbTnVtYmVyLFN0cmluZ10sZGVmYXVsdDozMDAsdmFsaWRhdG9yOmZ1bmN0aW9uKHQpe3JldHVyblwiYXV0b1wiPT09dHx8Zyh0KX19LHNoaWZ0WDp7dHlwZTpOdW1iZXIsZGVmYXVsdDouNSx2YWxpZGF0b3I6ZnVuY3Rpb24odCl7cmV0dXJuIDA8PXQmJnQ8PTF9fSxzaGlmdFk6e3R5cGU6TnVtYmVyLGRlZmF1bHQ6LjUsdmFsaWRhdG9yOmZ1bmN0aW9uKHQpe3JldHVybiAwPD10JiZ0PD0xfX19LGNvbXBvbmVudHM6e1Jlc2l6ZXI6bX0sZGF0YTpmdW5jdGlvbigpe3JldHVybnt2aXNpYmxlOiExLHZpc2liaWxpdHk6e21vZGFsOiExLG92ZXJsYXk6ITF9LG92ZXJsYXlUcmFuc2l0aW9uU3RhdGU6bnVsbCxtb2RhbFRyYW5zaXRpb25TdGF0ZTpudWxsLHNoaWZ0TGVmdDowLHNoaWZ0VG9wOjAsbW9kYWw6e3dpZHRoOjAsd2lkdGhUeXBlOlwicHhcIixoZWlnaHQ6MCxoZWlnaHRUeXBlOlwicHhcIixyZW5kZXJlZEhlaWdodDowfSx2aWV3cG9ydEhlaWdodDowLHZpZXdwb3J0V2lkdGg6MH19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLnNldEluaXRpYWxTaXplKCl9LGJlZm9yZU1vdW50OmZ1bmN0aW9uKCl7dGhpcy4kbW9kYWwuc3Vic2NyaXB0aW9uLiRvbihcInRvZ2dsZVwiLHRoaXMub25Ub2dnbGUpLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsdGhpcy5vbldpbmRvd1Jlc2l6ZSksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoXCJvcmllbnRhdGlvbmNoYW5nZVwiLHRoaXMub25XaW5kb3dSZXNpemUpLHRoaXMub25XaW5kb3dSZXNpemUoKSx0aGlzLnNjcm9sbGFibGUmJiF0aGlzLmlzQXV0b0hlaWdodCYmY29uc29sZS53YXJuKCdNb2RhbCBcIicuY29uY2F0KHRoaXMubmFtZSwnXCIgaGFzIHNjcm9sbGFibGUgZmxhZyBzZXQgdG8gdHJ1ZSAnKSsnYnV0IGhlaWdodCBpcyBub3QgXCJhdXRvXCIgKCcuY29uY2F0KHRoaXMuaGVpZ2h0LFwiKVwiKSksdGhpcy5jbGlja1RvQ2xvc2UmJndpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwia2V5dXBcIix0aGlzLm9uRXNjYXBlS2V5VXApfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIG49dGhpczt0aGlzLnJlc2l6ZU9ic2VydmVyPW5ldyB4KGZ1bmN0aW9uKHQpe2lmKDA8dC5sZW5ndGgpe3ZhciBlPXoodCwxKVswXTtuLm1vZGFsLnJlbmRlcmVkSGVpZ2h0PWUuY29udGVudFJlY3QuaGVpZ2h0fX0pLHRoaXMuJGZvY3VzVHJhcD1uZXcga30sYmVmb3JlRGVzdHJveTpmdW5jdGlvbigpe3RoaXMuJG1vZGFsLnN1YnNjcmlwdGlvbi4kb2ZmKFwidG9nZ2xlXCIsdGhpcy5vblRvZ2dsZSksd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJyZXNpemVcIix0aGlzLm9uV2luZG93UmVzaXplKSx3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm9yaWVudGF0aW9uY2hhbmdlXCIsdGhpcy5vbldpbmRvd1Jlc2l6ZSksdGhpcy5jbGlja1RvQ2xvc2UmJndpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKFwia2V5dXBcIix0aGlzLm9uRXNjYXBlS2V5VXApLGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcInZtLS1ibG9jay1zY3JvbGxcIil9LGNvbXB1dGVkOntndWFyYW50ZWVkT3ZlcmxheVRyYW5zaXRpb246ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5vdmVybGF5VHJhbnNpdGlvbnx8JH0sZ3VhcmFudGVlZE1vZGFsVHJhbnNpdGlvbjpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRyYW5zaXRpb258fCR9LGlzQXV0b0hlaWdodDpmdW5jdGlvbigpe3JldHVyblwiYXV0b1wiPT09dGhpcy5tb2RhbC5oZWlnaHRUeXBlfSxwb3NpdGlvbjpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlld3BvcnRIZWlnaHQsZT10aGlzLnZpZXdwb3J0V2lkdGgsbj10aGlzLnNoaWZ0TGVmdCxpPXRoaXMuc2hpZnRUb3Asbz10aGlzLnNoaWZ0WCxyPXRoaXMuc2hpZnRZLGE9dGhpcy50cnVlTW9kYWxXaWR0aCxzPXRoaXMudHJ1ZU1vZGFsSGVpZ2h0LGw9ZS1hLHU9TWF0aC5tYXgodC1zLDApLGM9aStyKnU7cmV0dXJue2xlZnQ6cGFyc2VJbnQoaCgwLGwsbitvKmwpKSx0b3A6IXMmJnRoaXMuaXNBdXRvSGVpZ2h0P3ZvaWQgMDpwYXJzZUludChoKDAsdSxjKSl9fSx0cnVlTW9kYWxXaWR0aDpmdW5jdGlvbigpe3ZhciB0PXRoaXMudmlld3BvcnRXaWR0aCxlPXRoaXMubW9kYWwsbj10aGlzLmFkYXB0aXZlLGk9dGhpcy5taW5XaWR0aCxvPXRoaXMubWF4V2lkdGgscj1cIiVcIj09PWUud2lkdGhUeXBlP3QvMTAwKmUud2lkdGg6ZS53aWR0aDtpZihuKXt2YXIgYT1NYXRoLm1heChpLE1hdGgubWluKHQsbykpO3JldHVybiBoKGksYSxyKX1yZXR1cm4gcn0sdHJ1ZU1vZGFsSGVpZ2h0OmZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy52aWV3cG9ydEhlaWdodCxlPXRoaXMubW9kYWwsbj10aGlzLmlzQXV0b0hlaWdodCxpPXRoaXMuYWRhcHRpdmUsbz10aGlzLm1pbkhlaWdodCxyPXRoaXMubWF4SGVpZ2h0LGE9XCIlXCI9PT1lLmhlaWdodFR5cGU/dC8xMDAqZS5oZWlnaHQ6ZS5oZWlnaHQ7aWYobilyZXR1cm4gdGhpcy5tb2RhbC5yZW5kZXJlZEhlaWdodDtpZihpKXt2YXIgcz1NYXRoLm1heChvLE1hdGgubWluKHQscikpO3JldHVybiBoKG8scyxhKX1yZXR1cm4gYX0sYXV0b0hlaWdodDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmFkYXB0aXZlJiZ0aGlzLm1vZGFsLnJlbmRlcmVkSGVpZ2h0Pj10aGlzLnZpZXdwb3J0SGVpZ2h0P01hdGgubWF4KHRoaXMubWluSGVpZ2h0LHRoaXMudmlld3BvcnRIZWlnaHQpK1wicHhcIjpcImF1dG9cIn0sY29udGFpbmVyQ2xhc3M6ZnVuY3Rpb24oKXtyZXR1cm5bXCJ2bS0tY29udGFpbmVyXCIsdGhpcy5zY3JvbGxhYmxlJiZ0aGlzLmlzQXV0b0hlaWdodCYmXCJzY3JvbGxhYmxlXCJdfSxtb2RhbENsYXNzOmZ1bmN0aW9uKCl7cmV0dXJuW1widm0tLW1vZGFsXCIsdGhpcy5jbGFzc2VzXX0sc3R5bGVzUHJvcDpmdW5jdGlvbigpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiB0aGlzLnN0eWxlcz9sKHRoaXMuc3R5bGVzKTp0aGlzLnN0eWxlc30sbW9kYWxTdHlsZTpmdW5jdGlvbigpe3JldHVyblt0aGlzLnN0eWxlc1Byb3Ase3RvcDp0aGlzLnBvc2l0aW9uLnRvcCtcInB4XCIsbGVmdDp0aGlzLnBvc2l0aW9uLmxlZnQrXCJweFwiLHdpZHRoOnRoaXMudHJ1ZU1vZGFsV2lkdGgrXCJweFwiLGhlaWdodDp0aGlzLmlzQXV0b0hlaWdodD90aGlzLmF1dG9IZWlnaHQ6dGhpcy50cnVlTW9kYWxIZWlnaHQrXCJweFwifV19LGlzQ29tcG9uZW50UmVhZHlUb0JlRGVzdHJveWVkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMub3ZlcmxheVRyYW5zaXRpb25TdGF0ZT09PWomJnRoaXMubW9kYWxUcmFuc2l0aW9uU3RhdGU9PT1qfX0sd2F0Y2g6e2lzQ29tcG9uZW50UmVhZHlUb0JlRGVzdHJveWVkOmZ1bmN0aW9uKHQpe3QmJih0aGlzLnZpc2libGU9ITEpfX0sbWV0aG9kczp7c3RhcnRUcmFuc2l0aW9uRW50ZXI6ZnVuY3Rpb24oKXt0aGlzLnZpc2liaWxpdHkub3ZlcmxheT0hMCx0aGlzLnZpc2liaWxpdHkubW9kYWw9ITB9LHN0YXJ0VHJhbnNpdGlvbkxlYXZlOmZ1bmN0aW9uKCl7dGhpcy52aXNpYmlsaXR5Lm92ZXJsYXk9ITEsdGhpcy52aXNpYmlsaXR5Lm1vZGFsPSExfSxiZWZvcmVPdmVybGF5VHJhbnNpdGlvbkVudGVyOmZ1bmN0aW9uKCl7dGhpcy5vdmVybGF5VHJhbnNpdGlvblN0YXRlPUN9LGFmdGVyT3ZlcmxheVRyYW5zaXRpb25FbnRlcjpmdW5jdGlvbigpe3RoaXMub3ZlcmxheVRyYW5zaXRpb25TdGF0ZT1BfSxiZWZvcmVPdmVybGF5VHJhbnNpdGlvbkxlYXZlOmZ1bmN0aW9uKCl7dGhpcy5vdmVybGF5VHJhbnNpdGlvblN0YXRlPVJ9LGFmdGVyT3ZlcmxheVRyYW5zaXRpb25MZWF2ZTpmdW5jdGlvbigpe3RoaXMub3ZlcmxheVRyYW5zaXRpb25TdGF0ZT1qfSxiZWZvcmVNb2RhbFRyYW5zaXRpb25FbnRlcjpmdW5jdGlvbigpe3ZhciB0PXRoaXM7dGhpcy5tb2RhbFRyYW5zaXRpb25TdGF0ZT1DLHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7dC5yZXNpemVPYnNlcnZlci5vYnNlcnZlKHQuJHJlZnMubW9kYWwpfSl9LGFmdGVyTW9kYWxUcmFuc2l0aW9uRW50ZXI6ZnVuY3Rpb24oKXt0aGlzLm1vZGFsVHJhbnNpdGlvblN0YXRlPUEsdGhpcy5kcmFnZ2FibGUmJnRoaXMuYWRkRHJhZ2dhYmxlTGlzdGVuZXJzKCksdGhpcy5mb2N1c1RyYXAmJnRoaXMuJGZvY3VzVHJhcC5lbmFibGUodGhpcy4kcmVmcy5tb2RhbCk7dmFyIHQ9dGhpcy5jcmVhdGVNb2RhbEV2ZW50KHtzdGF0ZTpcIm9wZW5lZFwifSk7dGhpcy4kZW1pdChcIm9wZW5lZFwiLHQpfSxiZWZvcmVNb2RhbFRyYW5zaXRpb25MZWF2ZTpmdW5jdGlvbigpe3RoaXMubW9kYWxUcmFuc2l0aW9uU3RhdGU9Uix0aGlzLnJlc2l6ZU9ic2VydmVyLnVub2JzZXJ2ZSh0aGlzLiRyZWZzLm1vZGFsKSx0aGlzLiRmb2N1c1RyYXAuZW5hYmxlZCgpJiZ0aGlzLiRmb2N1c1RyYXAuZGlzYWJsZSgpfSxhZnRlck1vZGFsVHJhbnNpdGlvbkxlYXZlOmZ1bmN0aW9uKCl7dGhpcy5tb2RhbFRyYW5zaXRpb25TdGF0ZT1qO3ZhciB0PXRoaXMuY3JlYXRlTW9kYWxFdmVudCh7c3RhdGU6XCJjbG9zZWRcIn0pO3RoaXMuJGVtaXQoXCJjbG9zZWRcIix0KX0sb25Ub2dnbGU6ZnVuY3Rpb24odCxlLG4pe2lmKHRoaXMubmFtZT09PXQpe3ZhciBpPXZvaWQgMD09PWU/IXRoaXMudmlzaWJsZTplO3RoaXMudG9nZ2xlKGksbil9fSxzZXRJbml0aWFsU2l6ZTpmdW5jdGlvbigpe3ZhciB0PXkodGhpcy53aWR0aCksZT15KHRoaXMuaGVpZ2h0KTt0aGlzLm1vZGFsLndpZHRoPXQudmFsdWUsdGhpcy5tb2RhbC53aWR0aFR5cGU9dC50eXBlLHRoaXMubW9kYWwuaGVpZ2h0PWUudmFsdWUsdGhpcy5tb2RhbC5oZWlnaHRUeXBlPWUudHlwZX0sb25Fc2NhcGVLZXlVcDpmdW5jdGlvbih0KXsyNz09PXQud2hpY2gmJnRoaXMudmlzaWJsZSYmdGhpcy4kbW9kYWwuaGlkZSh0aGlzLm5hbWUpfSxvbldpbmRvd1Jlc2l6ZTpmdW5jdGlvbigpe3RoaXMudmlld3BvcnRXaWR0aD1zKCksdGhpcy52aWV3cG9ydEhlaWdodD13aW5kb3cuaW5uZXJIZWlnaHQsdGhpcy5lbnN1cmVTaGlmdEluV2luZG93Qm91bmRzKCl9LGNyZWF0ZU1vZGFsRXZlbnQ6ZnVuY3Rpb24odCl7dmFyIGU9MDxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT10P3Q6e307cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspe3ZhciBuPW51bGwhPWFyZ3VtZW50c1t0XT9hcmd1bWVudHNbdF06e30saT1PYmplY3Qua2V5cyhuKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzJiYoaT1pLmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzKG4pLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihuLHQpLmVudW1lcmFibGV9KSkpLGkuZm9yRWFjaChmdW5jdGlvbih0KXtMKGUsdCxuW3RdKX0pfXJldHVybiBlfSh7bmFtZTp0aGlzLm5hbWUscmVmOnRoaXMuJHJlZnMubW9kYWx8fG51bGx9LGUpfSxvbk1vZGFsUmVzaXplOmZ1bmN0aW9uKHQpe3RoaXMubW9kYWwud2lkdGhUeXBlPVwicHhcIix0aGlzLm1vZGFsLndpZHRoPXQuc2l6ZS53aWR0aCx0aGlzLm1vZGFsLmhlaWdodFR5cGU9XCJweFwiLHRoaXMubW9kYWwuaGVpZ2h0PXQuc2l6ZS5oZWlnaHQ7dmFyIGU9dGhpcy5tb2RhbC5zaXplO3RoaXMuJGVtaXQoXCJyZXNpemVcIix0aGlzLmNyZWF0ZU1vZGFsRXZlbnQoe3NpemU6ZX0pKX0sb3BlbjpmdW5jdGlvbih0KXt2YXIgZT10aGlzO3RoaXMucmVzZXQmJih0aGlzLnNldEluaXRpYWxTaXplKCksdGhpcy5zaGlmdExlZnQ9MCx0aGlzLnNoaWZ0VG9wPTApLHRoaXMuc2Nyb2xsYWJsZSYmZG9jdW1lbnQuYm9keS5jbGFzc0xpc3QuYWRkKFwidm0tLWJsb2NrLXNjcm9sbFwiKTt2YXIgbj0hMSxpPXRoaXMuY3JlYXRlTW9kYWxFdmVudCh7Y2FuY2VsOmZ1bmN0aW9uKCl7bj0hMH0sc3RhdGU6XCJiZWZvcmUtb3BlblwiLHBhcmFtczp0fSk7dGhpcy4kZW1pdChcImJlZm9yZS1vcGVuXCIsaSksbj90aGlzLnNjcm9sbGFibGUmJmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcInZtLS1ibG9jay1zY3JvbGxcIik6KFwidW5kZWZpbmVkXCIhPXR5cGVvZiBkb2N1bWVudCYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudCYmXCJCT0RZXCIhPT1kb2N1bWVudC5hY3RpdmVFbGVtZW50LnRhZ05hbWUmJmRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1ciYmZG9jdW1lbnQuYWN0aXZlRWxlbWVudC5ibHVyKCksdGhpcy52aXNpYmxlPSEwLHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7ZS5zdGFydFRyYW5zaXRpb25FbnRlcigpfSkpfSxjbG9zZTpmdW5jdGlvbih0KXt0aGlzLnNjcm9sbGFibGUmJmRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LnJlbW92ZShcInZtLS1ibG9jay1zY3JvbGxcIik7dmFyIGU9ITEsbj10aGlzLmNyZWF0ZU1vZGFsRXZlbnQoe2NhbmNlbDpmdW5jdGlvbigpe2U9ITB9LHN0YXRlOlwiYmVmb3JlLWNsb3NlXCIscGFyYW1zOnR9KTt0aGlzLiRlbWl0KFwiYmVmb3JlLWNsb3NlXCIsbiksZXx8dGhpcy5zdGFydFRyYW5zaXRpb25MZWF2ZSgpfSx0b2dnbGU6ZnVuY3Rpb24odCxlKXt0aGlzLnZpc2libGUhPT10JiYodD90aGlzLm9wZW4oZSk6dGhpcy5jbG9zZShlKSl9LGdldERyYWdnYWJsZUVsZW1lbnQ6ZnVuY3Rpb24oKXtyZXR1cm4hMD09PXRoaXMuZHJhZ2dhYmxlP3RoaXMuJHJlZnMubW9kYWw6XCJzdHJpbmdcIj09dHlwZW9mIHRoaXMuZHJhZ2dhYmxlP3RoaXMuJHJlZnMubW9kYWwucXVlcnlTZWxlY3Rvcih0aGlzLmRyYWdnYWJsZSk6bnVsbH0sb25PdmVybGF5Q2xpY2s6ZnVuY3Rpb24oKXt0aGlzLmNsaWNrVG9DbG9zZSYmdGhpcy50b2dnbGUoITEpfSxhZGREcmFnZ2FibGVMaXN0ZW5lcnM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLHQ9dGhpcy5nZXREcmFnZ2FibGVFbGVtZW50KCk7aWYodCl7dmFyIHM9MCxsPTAsdT0wLGM9MCxlPWZ1bmN0aW9uKHQpe3ZhciBlPXQudGFyZ2V0O2lmKCEobj1lKXx8LTE9PT1wLmluZGV4T2Yobi5ub2RlTmFtZSkpe3ZhciBuLGk9Zih0KSxvPWkuY2xpZW50WCxyPWkuY2xpZW50WTtkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKFwibW91c2Vtb3ZlXCIsZCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNobW92ZVwiLGQpLGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJtb3VzZXVwXCIsaCksZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoZW5kXCIsaCkscz1vLGw9cix1PWEuc2hpZnRMZWZ0LGM9YS5zaGlmdFRvcH19LGQ9ZnVuY3Rpb24odCl7dmFyIGU9Zih0KSxuPWUuY2xpZW50WCxpPWUuY2xpZW50WTthLnNoaWZ0TGVmdD11K24tcyxhLnNoaWZ0VG9wPWMraS1sLHQucHJldmVudERlZmF1bHQoKX0saD1mdW5jdGlvbiB0KGUpe2EuZW5zdXJlU2hpZnRJbldpbmRvd0JvdW5kcygpLGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJtb3VzZW1vdmVcIixkKSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2htb3ZlXCIsZCksZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIm1vdXNldXBcIix0KSxkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFwidG91Y2hlbmRcIix0KSxlLnByZXZlbnREZWZhdWx0KCl9O3QuYWRkRXZlbnRMaXN0ZW5lcihcIm1vdXNlZG93blwiLGUpLHQuYWRkRXZlbnRMaXN0ZW5lcihcInRvdWNoc3RhcnRcIixlKX19LGVuc3VyZVNoaWZ0SW5XaW5kb3dCb3VuZHM6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLnZpZXdwb3J0SGVpZ2h0LGU9dGhpcy52aWV3cG9ydFdpZHRoLG49dGhpcy5zaGlmdExlZnQsaT10aGlzLnNoaWZ0VG9wLG89dGhpcy5zaGlmdFgscj10aGlzLnNoaWZ0WSxhPXRoaXMudHJ1ZU1vZGFsV2lkdGgscz10aGlzLnRydWVNb2RhbEhlaWdodCxsPWUtYSx1PU1hdGgubWF4KHQtcywwKSxjPW4rbypsLGQ9aStyKnU7dGhpcy5zaGlmdExlZnQtPWMtaCgwLGwsYyksdGhpcy5zaGlmdFRvcC09ZC1oKDAsdSxkKX19fSxOPShuKDkpLGQoSCxpLFtdLCExLG51bGwsbnVsbCxudWxsKSk7Ti5vcHRpb25zLl9fZmlsZT1cInNyYy9jb21wb25lbnRzL01vZGFsLnZ1ZVwiO2Z1bmN0aW9uIEQoKXt2YXIgbj10aGlzLHQ9bi4kY3JlYXRlRWxlbWVudCxpPW4uX3NlbGYuX2N8fHQ7cmV0dXJuIGkobi4kbW9kYWwuY29udGV4dC5jb21wb25lbnROYW1lLHt0YWc6XCJjb21wb25lbnRcIixhdHRyczp7bmFtZTpcImRpYWxvZ1wiLGhlaWdodDpcImF1dG9cIixjbGFzc2VzOltcInZ1ZS1kaWFsb2dcIix0aGlzLnBhcmFtcy5jbGFzc10sd2lkdGg6bi53aWR0aCxcInNoaWZ0LXlcIjouMyxhZGFwdGl2ZTohMCxcImZvY3VzLXRyYXBcIjohMCxjbGlja1RvQ2xvc2U6bi5jbGlja1RvQ2xvc2UsdHJhbnNpdGlvbjpuLnRyYW5zaXRpb259LG9uOntcImJlZm9yZS1vcGVuXCI6bi5iZWZvcmVPcGVuZWQsXCJiZWZvcmUtY2xvc2VcIjpuLmJlZm9yZUNsb3NlZCxvcGVuZWQ6ZnVuY3Rpb24odCl7cmV0dXJuIG4uJGVtaXQoXCJvcGVuZWRcIix0KX0sY2xvc2VkOmZ1bmN0aW9uKHQpe3JldHVybiBuLiRlbWl0KFwiY2xvc2VkXCIsdCl9fX0sW2koXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJ2dWUtZGlhbG9nLWNvbnRlbnRcIn0sW24ucGFyYW1zLnRpdGxlP2koXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJ2dWUtZGlhbG9nLWNvbnRlbnQtdGl0bGVcIixkb21Qcm9wczp7aW5uZXJIVE1MOm4uX3Mobi5wYXJhbXMudGl0bGV8fFwiXCIpfX0pOm4uX2UoKSxuLl92KFwiIFwiKSxuLnBhcmFtcy5jb21wb25lbnQ/aShuLnBhcmFtcy5jb21wb25lbnQsbi5fYih7dGFnOlwiY29tcG9uZW50XCJ9LFwiY29tcG9uZW50XCIsbi5wYXJhbXMucHJvcHMsITEpKTppKFwiZGl2XCIse2RvbVByb3BzOntpbm5lckhUTUw6bi5fcyhuLnBhcmFtcy50ZXh0fHxcIlwiKX19KV0sMSksbi5fdihcIiBcIiksbi5idXR0b25zP2koXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJ2dWUtZGlhbG9nLWJ1dHRvbnNcIn0sbi5fbChuLmJ1dHRvbnMsZnVuY3Rpb24odCxlKXtyZXR1cm4gaShcImJ1dHRvblwiLHtrZXk6ZSxjbGFzczp0LmNsYXNzfHxcInZ1ZS1kaWFsb2ctYnV0dG9uXCIsc3R5bGU6bi5idXR0b25TdHlsZSxhdHRyczp7dHlwZTpcImJ1dHRvblwiLHRhYmluZGV4OlwiMFwifSxkb21Qcm9wczp7aW5uZXJIVE1MOm4uX3ModC50aXRsZSl9LG9uOntjbGljazpmdW5jdGlvbih0KXtyZXR1cm4gdC5zdG9wUHJvcGFnYXRpb24oKSxuLmNsaWNrKGUsdCl9fX0sW24uX3Yobi5fcyh0LnRpdGxlKSldKX0pLDApOmkoXCJkaXZcIix7c3RhdGljQ2xhc3M6XCJ2dWUtZGlhbG9nLWJ1dHRvbnMtbm9uZVwifSldKX12YXIgVz1OLmV4cG9ydHM7RC5fd2l0aFN0cmlwcGVkPSEwO3ZhciBQPXtuYW1lOlwiVnVlSnNEaWFsb2dcIixwcm9wczp7d2lkdGg6e3R5cGU6W051bWJlcixTdHJpbmddLGRlZmF1bHQ6NDAwfSxjbGlja1RvQ2xvc2U6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiEwfSx0cmFuc2l0aW9uOnt0eXBlOlN0cmluZ319LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57cGFyYW1zOnt9fX0sY29tcHV0ZWQ6e2J1dHRvbnM6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wYXJhbXMuYnV0dG9uc3x8W119LGJ1dHRvblN0eWxlOmZ1bmN0aW9uKCl7cmV0dXJue2ZsZXg6XCIxIDEgXCIuY29uY2F0KDEwMC90aGlzLmJ1dHRvbnMubGVuZ3RoLFwiJVwiKX19fSxtZXRob2RzOntiZWZvcmVPcGVuZWQ6ZnVuY3Rpb24odCl7dGhpcy5wYXJhbXM9dC5wYXJhbXN8fHt9LHRoaXMuJGVtaXQoXCJiZWZvcmUtb3BlbmVkXCIsdCl9LGJlZm9yZUNsb3NlZDpmdW5jdGlvbih0KXt0aGlzLnBhcmFtcz17fSx0aGlzLiRlbWl0KFwiYmVmb3JlLWNsb3NlZFwiLHQpfSxjbGljazpmdW5jdGlvbih0LGUsbil7dmFyIGk9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1uP246XCJjbGlja1wiLG89dGhpcy5idXR0b25zW3RdLHI9bnVsbD09bz92b2lkIDA6by5oYW5kbGVyO1wiZnVuY3Rpb25cIj09dHlwZW9mIHImJnIodCxlLHtzb3VyY2U6aX0pfX19LEI9KG4oMTEpLGQoUCxELFtdLCExLG51bGwsbnVsbCxudWxsKSk7Qi5vcHRpb25zLl9fZmlsZT1cInNyYy9jb21wb25lbnRzL0RpYWxvZy52dWVcIjtmdW5jdGlvbiBJKCl7dmFyIG49dGhpcyx0PW4uJGNyZWF0ZUVsZW1lbnQsaT1uLl9zZWxmLl9jfHx0O3JldHVybiBpKFwiZGl2XCIse2F0dHJzOntpZDpcIm1vZGFscy1jb250YWluZXJcIn19LG4uX2wobi5tb2RhbHMsZnVuY3Rpb24oZSl7cmV0dXJuIGkoXCJtb2RhbFwiLG4uX2cobi5fYih7a2V5OmUuaWQsb246e2Nsb3NlZDpmdW5jdGlvbih0KXtyZXR1cm4gbi5yZW1vdmUoZS5pZCl9fX0sXCJtb2RhbFwiLGUubW9kYWxBdHRycywhMSksZS5tb2RhbExpc3RlbmVycyksW2koZS5jb21wb25lbnQsbi5fZyhuLl9iKHt0YWc6XCJjb21wb25lbnRcIixvbjp7Y2xvc2U6ZnVuY3Rpb24odCl7cmV0dXJuIG4uJG1vZGFsLmhpZGUoZS5tb2RhbEF0dHJzLm5hbWUsdCl9fX0sXCJjb21wb25lbnRcIixlLmNvbXBvbmVudEF0dHJzLCExKSxuLiRsaXN0ZW5lcnMpKV0sMSl9KSwxKX12YXIgVT1CLmV4cG9ydHM7ZnVuY3Rpb24gWCh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9SS5fd2l0aFN0cmlwcGVkPSEwO3ZhciBGPWQoe2RhdGE6ZnVuY3Rpb24oKXtyZXR1cm57bW9kYWxzOltdfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuJHJvb3QuX19tb2RhbENvbnRhaW5lcj10aGlzfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIHQ9dGhpczt0aGlzLiRtb2RhbC5zdWJzY3JpcHRpb24uJG9uKFwiaGlkZS1hbGxcIixmdW5jdGlvbigpe3QubW9kYWxzPVtdfSl9LG1ldGhvZHM6e2FkZDpmdW5jdGlvbih0LGUsbixpKXt2YXIgbz10aGlzLHI9MTxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1lP2U6e30sYT0yPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PW4/bjp7fSxzPTM8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09aT9pOnt9LGw9YygpLHU9YS5uYW1lfHxcImR5bmFtaWNfbW9kYWxfXCIrbDt0aGlzLm1vZGFscy5wdXNoKHtpZDpsLG1vZGFsQXR0cnM6ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTE7dDxhcmd1bWVudHMubGVuZ3RoO3QrKyl7dmFyIG49bnVsbCE9YXJndW1lbnRzW3RdP2FyZ3VtZW50c1t0XTp7fSxpPU9iamVjdC5rZXlzKG4pO1wiZnVuY3Rpb25cIj09dHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMmJihpPWkuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMobikuZmlsdGVyKGZ1bmN0aW9uKHQpe3JldHVybiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG4sdCkuZW51bWVyYWJsZX0pKSksaS5mb3JFYWNoKGZ1bmN0aW9uKHQpe1goZSx0LG5bdF0pfSl9cmV0dXJuIGV9KHt9LGEse25hbWU6dX0pLG1vZGFsTGlzdGVuZXJzOnMsY29tcG9uZW50OnQsY29tcG9uZW50QXR0cnM6cn0pLHRoaXMuJG5leHRUaWNrKGZ1bmN0aW9uKCl7by4kbW9kYWwuc2hvdyh1KX0pfSxyZW1vdmU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tb2RhbHMuZmluZEluZGV4KGZ1bmN0aW9uKHQpe3JldHVybiB0LmlkPT09ZX0pOy0xIT09dCYmdGhpcy5tb2RhbHMuc3BsaWNlKHQsMSl9fX0sSSxbXSwhMSxudWxsLG51bGwsbnVsbCk7Ri5vcHRpb25zLl9fZmlsZT1cInNyYy9jb21wb25lbnRzL01vZGFsc0NvbnRhaW5lci52dWVcIjt2YXIgRz1GLmV4cG9ydHM7ZnVuY3Rpb24gVih0KXtyZXR1cm4oVj1cImZ1bmN0aW9uXCI9PXR5cGVvZiBTeW1ib2wmJlwic3ltYm9sXCI9PXR5cGVvZiBTeW1ib2wuaXRlcmF0b3I/ZnVuY3Rpb24odCl7cmV0dXJuIHR5cGVvZiB0fTpmdW5jdGlvbih0KXtyZXR1cm4gdCYmXCJmdW5jdGlvblwiPT10eXBlb2YgU3ltYm9sJiZ0LmNvbnN0cnVjdG9yPT09U3ltYm9sJiZ0IT09U3ltYm9sLnByb3RvdHlwZT9cInN5bWJvbFwiOnR5cGVvZiB0fSkodCl9ZnVuY3Rpb24gcSh0LGUsbil7cmV0dXJuIGUgaW4gdD9PYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHt2YWx1ZTpuLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwfSk6dFtlXT1uLHR9dmFyIEs9ZnVuY3Rpb24oaSx0KXtmdW5jdGlvbiBvKHQsZSxuLGkpe3ZhciBvLHI9Mjxhcmd1bWVudHMubGVuZ3RoJiZ2b2lkIDAhPT1uP246e30sYT0zPGFyZ3VtZW50cy5sZW5ndGg/aTp2b2lkIDAscz1udWxsPT09KG89Yy5yb290KXx8dm9pZCAwPT09bz92b2lkIDA6by5fX21vZGFsQ29udGFpbmVyLGw9dS5keW5hbWljRGVmYXVsdHN8fHt9O251bGwhPXMmJnMuYWRkKHQsZSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXt2YXIgbj1udWxsIT1hcmd1bWVudHNbdF0/YXJndW1lbnRzW3RdOnt9LGk9T2JqZWN0LmtleXMobik7XCJmdW5jdGlvblwiPT10eXBlb2YgT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyYmKGk9aS5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhuKS5maWx0ZXIoZnVuY3Rpb24odCl7cmV0dXJuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3Iobix0KS5lbnVtZXJhYmxlfSkpKSxpLmZvckVhY2goZnVuY3Rpb24odCl7cShlLHQsblt0XSl9KX1yZXR1cm4gZX0oe30sbCxyKSxhKX12YXIgdT0xPGFyZ3VtZW50cy5sZW5ndGgmJnZvaWQgMCE9PXQ/dDp7fSxyPW5ldyBpLGM9e3Jvb3Q6bnVsbCxjb21wb25lbnROYW1lOnUuY29tcG9uZW50TmFtZXx8XCJNb2RhbFwifTtyZXR1cm57Y29udGV4dDpjLHN1YnNjcmlwdGlvbjpyLHNob3c6ZnVuY3Rpb24oKXtmb3IodmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxlPW5ldyBBcnJheSh0KSxuPTA7bjx0O24rKyllW25dPWFyZ3VtZW50c1tuXTt2YXIgaT1lWzBdO3N3aXRjaChWKGkpKXtjYXNlXCJzdHJpbmdcIjooZnVuY3Rpb24odCxlKXtyLiRlbWl0KFwidG9nZ2xlXCIsdCwhMCxlKX0pLmFwcGx5KHZvaWQgMCxlKTticmVhaztjYXNlXCJvYmplY3RcIjpjYXNlXCJmdW5jdGlvblwiOm8uYXBwbHkodm9pZCAwLGUpO2JyZWFrO2RlZmF1bHQ6Y29uc29sZS53YXJuKFwiW3Z1ZS1qcy1tb2RhbF0gJG1vZGFsKCkgcmVjZWl2ZWQgYW4gdW5zdXBwb3J0ZWQgYXJndW1lbnQgYXMgYSBmaXJzdCBhcmd1bWVudC5cIixpKX19LGhpZGU6ZnVuY3Rpb24odCxlKXtyLiRlbWl0KFwidG9nZ2xlXCIsdCwhMSxlKX0saGlkZUFsbDpmdW5jdGlvbigpe3IuJGVtaXQoXCJoaWRlLWFsbFwiKX0sdG9nZ2xlOmZ1bmN0aW9uKHQsZSl7ci4kZW1pdChcInRvZ2dsZVwiLHQsdm9pZCAwLGUpfSxzZXREeW5hbWljTW9kYWxDb250YWluZXI6ZnVuY3Rpb24odCl7Yy5yb290PXQ7dmFyIGUsbj0oZT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZSksZSk7bmV3IGkoe3BhcmVudDp0LHJlbmRlcjpmdW5jdGlvbih0KXtyZXR1cm4gdChHKX19KS4kbW91bnQobil9fX0sWT17aW5zdGFsbDpmdW5jdGlvbihlLHQpe3ZhciBuPTE8YXJndW1lbnRzLmxlbmd0aCYmdm9pZCAwIT09dD90Ont9O2lmKCFlLnByb3RvdHlwZS4kbW9kYWwpe3ZhciBpPW5ldyBLKGUsbik7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiJG1vZGFsXCIse2dldDpmdW5jdGlvbigpe2lmKHRoaXMgaW5zdGFuY2VvZiBlKXt2YXIgdD10aGlzLiRyb290O2kuY29udGV4dC5yb290fHxpLnNldER5bmFtaWNNb2RhbENvbnRhaW5lcih0KX1yZXR1cm4gaX19KSxlLmNvbXBvbmVudChpLmNvbnRleHQuY29tcG9uZW50TmFtZSxXKSxuLmRpYWxvZyYmZS5jb21wb25lbnQoXCJWRGlhbG9nXCIsVSl9fX0sSj1cIl9fVkVSU0lPTl9fXCI7ZS5kZWZhdWx0PVl9XSxvLmM9aSxvLmQ9ZnVuY3Rpb24odCxlLG4pe28ubyh0LGUpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkodCxlLHtlbnVtZXJhYmxlOiEwLGdldDpufSl9LG8ucj1mdW5jdGlvbih0KXtcInVuZGVmaW5lZFwiIT10eXBlb2YgU3ltYm9sJiZTeW1ib2wudG9TdHJpbmdUYWcmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFN5bWJvbC50b1N0cmluZ1RhZyx7dmFsdWU6XCJNb2R1bGVcIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LFwiX19lc01vZHVsZVwiLHt2YWx1ZTohMH0pfSxvLnQ9ZnVuY3Rpb24oZSx0KXtpZigxJnQmJihlPW8oZSkpLDgmdClyZXR1cm4gZTtpZig0JnQmJlwib2JqZWN0XCI9PXR5cGVvZiBlJiZlJiZlLl9fZXNNb2R1bGUpcmV0dXJuIGU7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZihvLnIobiksT2JqZWN0LmRlZmluZVByb3BlcnR5KG4sXCJkZWZhdWx0XCIse2VudW1lcmFibGU6ITAsdmFsdWU6ZX0pLDImdCYmXCJzdHJpbmdcIiE9dHlwZW9mIGUpZm9yKHZhciBpIGluIGUpby5kKG4saSxmdW5jdGlvbih0KXtyZXR1cm4gZVt0XX0uYmluZChudWxsLGkpKTtyZXR1cm4gbn0sby5uPWZ1bmN0aW9uKHQpe3ZhciBlPXQmJnQuX19lc01vZHVsZT9mdW5jdGlvbigpe3JldHVybiB0LmRlZmF1bHR9OmZ1bmN0aW9uKCl7cmV0dXJuIHR9O3JldHVybiBvLmQoZSxcImFcIixlKSxlfSxvLm89ZnVuY3Rpb24odCxlKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsZSl9LG8ucD1cIi9kaXN0L1wiLG8oby5zPTEzKTtmdW5jdGlvbiBvKHQpe2lmKGlbdF0pcmV0dXJuIGlbdF0uZXhwb3J0czt2YXIgZT1pW3RdPXtpOnQsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gblt0XS5jYWxsKGUuZXhwb3J0cyxlLGUuZXhwb3J0cyxvKSxlLmw9ITAsZS5leHBvcnRzfXZhciBuLGl9KTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWluZGV4LmpzLm1hcCIsIi8qIVxuICogVnVlLmpzIHYyLjYuMTFcbiAqIChjKSAyMDE0LTIwMTkgRXZhbiBZb3VcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS5cbiAqL1xuIWZ1bmN0aW9uKGUsdCl7XCJvYmplY3RcIj09dHlwZW9mIGV4cG9ydHMmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBtb2R1bGU/bW9kdWxlLmV4cG9ydHM9dCgpOlwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZD9kZWZpbmUodCk6KGU9ZXx8c2VsZikuVnVlPXQoKX0odGhpcyxmdW5jdGlvbigpe1widXNlIHN0cmljdFwiO3ZhciBlPU9iamVjdC5mcmVlemUoe30pO2Z1bmN0aW9uIHQoZSl7cmV0dXJuIG51bGw9PWV9ZnVuY3Rpb24gbihlKXtyZXR1cm4gbnVsbCE9ZX1mdW5jdGlvbiByKGUpe3JldHVybiEwPT09ZX1mdW5jdGlvbiBpKGUpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlfHxcIm51bWJlclwiPT10eXBlb2YgZXx8XCJzeW1ib2xcIj09dHlwZW9mIGV8fFwiYm9vbGVhblwiPT10eXBlb2YgZX1mdW5jdGlvbiBvKGUpe3JldHVybiBudWxsIT09ZSYmXCJvYmplY3RcIj09dHlwZW9mIGV9dmFyIGE9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBzKGUpe3JldHVyblwiW29iamVjdCBPYmplY3RdXCI9PT1hLmNhbGwoZSl9ZnVuY3Rpb24gYyhlKXt2YXIgdD1wYXJzZUZsb2F0KFN0cmluZyhlKSk7cmV0dXJuIHQ+PTAmJk1hdGguZmxvb3IodCk9PT10JiZpc0Zpbml0ZShlKX1mdW5jdGlvbiB1KGUpe3JldHVybiBuKGUpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLnRoZW4mJlwiZnVuY3Rpb25cIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gbChlKXtyZXR1cm4gbnVsbD09ZT9cIlwiOkFycmF5LmlzQXJyYXkoZSl8fHMoZSkmJmUudG9TdHJpbmc9PT1hP0pTT04uc3RyaW5naWZ5KGUsbnVsbCwyKTpTdHJpbmcoZSl9ZnVuY3Rpb24gZihlKXt2YXIgdD1wYXJzZUZsb2F0KGUpO3JldHVybiBpc05hTih0KT9lOnR9ZnVuY3Rpb24gcChlLHQpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9ZS5zcGxpdChcIixcIiksaT0wO2k8ci5sZW5ndGg7aSsrKW5bcltpXV09ITA7cmV0dXJuIHQ/ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXX06ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19fXZhciBkPXAoXCJzbG90LGNvbXBvbmVudFwiLCEwKSx2PXAoXCJrZXkscmVmLHNsb3Qsc2xvdC1zY29wZSxpc1wiKTtmdW5jdGlvbiBoKGUsdCl7aWYoZS5sZW5ndGgpe3ZhciBuPWUuaW5kZXhPZih0KTtpZihuPi0xKXJldHVybiBlLnNwbGljZShuLDEpfX12YXIgbT1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O2Z1bmN0aW9uIHkoZSx0KXtyZXR1cm4gbS5jYWxsKGUsdCl9ZnVuY3Rpb24gZyhlKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdFtuXXx8KHRbbl09ZShuKSl9fXZhciBfPS8tKFxcdykvZyxiPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVwbGFjZShfLGZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dC50b1VwcGVyQ2FzZSgpOlwiXCJ9KX0pLCQ9ZyhmdW5jdGlvbihlKXtyZXR1cm4gZS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKStlLnNsaWNlKDEpfSksdz0vXFxCKFtBLVpdKS9nLEM9ZyhmdW5jdGlvbihlKXtyZXR1cm4gZS5yZXBsYWNlKHcsXCItJDFcIikudG9Mb3dlckNhc2UoKX0pO3ZhciB4PUZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kP2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGUuYmluZCh0KX06ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHI/cj4xP2UuYXBwbHkodCxhcmd1bWVudHMpOmUuY2FsbCh0LG4pOmUuY2FsbCh0KX1yZXR1cm4gbi5fbGVuZ3RoPWUubGVuZ3RoLG59O2Z1bmN0aW9uIGsoZSx0KXt0PXR8fDA7Zm9yKHZhciBuPWUubGVuZ3RoLXQscj1uZXcgQXJyYXkobik7bi0tOylyW25dPWVbbit0XTtyZXR1cm4gcn1mdW5jdGlvbiBBKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIE8oZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoO24rKyllW25dJiZBKHQsZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gUyhlLHQsbil7fXZhciBUPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMX0sRT1mdW5jdGlvbihlKXtyZXR1cm4gZX07ZnVuY3Rpb24gTihlLHQpe2lmKGU9PT10KXJldHVybiEwO3ZhciBuPW8oZSkscj1vKHQpO2lmKCFufHwhcilyZXR1cm4hbiYmIXImJlN0cmluZyhlKT09PVN0cmluZyh0KTt0cnl7dmFyIGk9QXJyYXkuaXNBcnJheShlKSxhPUFycmF5LmlzQXJyYXkodCk7aWYoaSYmYSlyZXR1cm4gZS5sZW5ndGg9PT10Lmxlbmd0aCYmZS5ldmVyeShmdW5jdGlvbihlLG4pe3JldHVybiBOKGUsdFtuXSl9KTtpZihlIGluc3RhbmNlb2YgRGF0ZSYmdCBpbnN0YW5jZW9mIERhdGUpcmV0dXJuIGUuZ2V0VGltZSgpPT09dC5nZXRUaW1lKCk7aWYoaXx8YSlyZXR1cm4hMTt2YXIgcz1PYmplY3Qua2V5cyhlKSxjPU9iamVjdC5rZXlzKHQpO3JldHVybiBzLmxlbmd0aD09PWMubGVuZ3RoJiZzLmV2ZXJ5KGZ1bmN0aW9uKG4pe3JldHVybiBOKGVbbl0sdFtuXSl9KX1jYXRjaChlKXtyZXR1cm4hMX19ZnVuY3Rpb24gaihlLHQpe2Zvcih2YXIgbj0wO248ZS5sZW5ndGg7bisrKWlmKE4oZVtuXSx0KSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBEKGUpe3ZhciB0PSExO3JldHVybiBmdW5jdGlvbigpe3R8fCh0PSEwLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX19dmFyIEw9XCJkYXRhLXNlcnZlci1yZW5kZXJlZFwiLE09W1wiY29tcG9uZW50XCIsXCJkaXJlY3RpdmVcIixcImZpbHRlclwiXSxJPVtcImJlZm9yZUNyZWF0ZVwiLFwiY3JlYXRlZFwiLFwiYmVmb3JlTW91bnRcIixcIm1vdW50ZWRcIixcImJlZm9yZVVwZGF0ZVwiLFwidXBkYXRlZFwiLFwiYmVmb3JlRGVzdHJveVwiLFwiZGVzdHJveWVkXCIsXCJhY3RpdmF0ZWRcIixcImRlYWN0aXZhdGVkXCIsXCJlcnJvckNhcHR1cmVkXCIsXCJzZXJ2ZXJQcmVmZXRjaFwiXSxGPXtvcHRpb25NZXJnZVN0cmF0ZWdpZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxzaWxlbnQ6ITEscHJvZHVjdGlvblRpcDohMSxkZXZ0b29sczohMSxwZXJmb3JtYW5jZTohMSxlcnJvckhhbmRsZXI6bnVsbCx3YXJuSGFuZGxlcjpudWxsLGlnbm9yZWRFbGVtZW50czpbXSxrZXlDb2RlczpPYmplY3QuY3JlYXRlKG51bGwpLGlzUmVzZXJ2ZWRUYWc6VCxpc1Jlc2VydmVkQXR0cjpULGlzVW5rbm93bkVsZW1lbnQ6VCxnZXRUYWdOYW1lc3BhY2U6UyxwYXJzZVBsYXRmb3JtVGFnTmFtZTpFLG11c3RVc2VQcm9wOlQsYXN5bmM6ITAsX2xpZmVjeWNsZUhvb2tzOkl9LFA9L2EtekEtWlxcdTAwQjdcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDNGLVxcdTIwNDBcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQvO2Z1bmN0aW9uIFIoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX12YXIgSD1uZXcgUmVnRXhwKFwiW15cIitQLnNvdXJjZStcIi4kX1xcXFxkXVwiKTt2YXIgQixVPVwiX19wcm90b19fXCJpbnt9LHo9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHdpbmRvdyxWPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sSz1WJiZXWEVudmlyb25tZW50LnBsYXRmb3JtLnRvTG93ZXJDYXNlKCksSj16JiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLHE9SiYmL21zaWV8dHJpZGVudC8udGVzdChKKSxXPUomJkouaW5kZXhPZihcIm1zaWUgOS4wXCIpPjAsWj1KJiZKLmluZGV4T2YoXCJlZGdlL1wiKT4wLEc9KEomJkouaW5kZXhPZihcImFuZHJvaWRcIiksSiYmL2lwaG9uZXxpcGFkfGlwb2R8aW9zLy50ZXN0KEopfHxcImlvc1wiPT09SyksWD0oSiYmL2Nocm9tZVxcL1xcZCsvLnRlc3QoSiksSiYmL3BoYW50b21qcy8udGVzdChKKSxKJiZKLm1hdGNoKC9maXJlZm94XFwvKFxcZCspLykpLFk9e30ud2F0Y2gsUT0hMTtpZih6KXRyeXt2YXIgZWU9e307T2JqZWN0LmRlZmluZVByb3BlcnR5KGVlLFwicGFzc2l2ZVwiLHtnZXQ6ZnVuY3Rpb24oKXtRPSEwfX0pLHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKFwidGVzdC1wYXNzaXZlXCIsbnVsbCxlZSl9Y2F0Y2goZSl7fXZhciB0ZT1mdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1CJiYoQj0heiYmIVYmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBnbG9iYWwmJihnbG9iYWwucHJvY2VzcyYmXCJzZXJ2ZXJcIj09PWdsb2JhbC5wcm9jZXNzLmVudi5WVUVfRU5WKSksQn0sbmU9eiYmd2luZG93Ll9fVlVFX0RFVlRPT0xTX0dMT0JBTF9IT09LX187ZnVuY3Rpb24gcmUoZSl7cmV0dXJuXCJmdW5jdGlvblwiPT10eXBlb2YgZSYmL25hdGl2ZSBjb2RlLy50ZXN0KGUudG9TdHJpbmcoKSl9dmFyIGllLG9lPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBTeW1ib2wmJnJlKFN5bWJvbCkmJlwidW5kZWZpbmVkXCIhPXR5cGVvZiBSZWZsZWN0JiZyZShSZWZsZWN0Lm93bktleXMpO2llPVwidW5kZWZpbmVkXCIhPXR5cGVvZiBTZXQmJnJlKFNldCk/U2V0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4hMD09PXRoaXMuc2V0W2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRbZV09ITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX0sZX0oKTt2YXIgYWU9UyxzZT0wLGNlPWZ1bmN0aW9uKCl7dGhpcy5pZD1zZSsrLHRoaXMuc3Vicz1bXX07Y2UucHJvdG90eXBlLmFkZFN1Yj1mdW5jdGlvbihlKXt0aGlzLnN1YnMucHVzaChlKX0sY2UucHJvdG90eXBlLnJlbW92ZVN1Yj1mdW5jdGlvbihlKXtoKHRoaXMuc3VicyxlKX0sY2UucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe2NlLnRhcmdldCYmY2UudGFyZ2V0LmFkZERlcCh0aGlzKX0sY2UucHJvdG90eXBlLm5vdGlmeT1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnN1YnMuc2xpY2UoKSx0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWVbdF0udXBkYXRlKCl9LGNlLnRhcmdldD1udWxsO3ZhciB1ZT1bXTtmdW5jdGlvbiBsZShlKXt1ZS5wdXNoKGUpLGNlLnRhcmdldD1lfWZ1bmN0aW9uIGZlKCl7dWUucG9wKCksY2UudGFyZ2V0PXVlW3VlLmxlbmd0aC0xXX12YXIgcGU9ZnVuY3Rpb24oZSx0LG4scixpLG8sYSxzKXt0aGlzLnRhZz1lLHRoaXMuZGF0YT10LHRoaXMuY2hpbGRyZW49bix0aGlzLnRleHQ9cix0aGlzLmVsbT1pLHRoaXMubnM9dm9pZCAwLHRoaXMuY29udGV4dD1vLHRoaXMuZm5Db250ZXh0PXZvaWQgMCx0aGlzLmZuT3B0aW9ucz12b2lkIDAsdGhpcy5mblNjb3BlSWQ9dm9pZCAwLHRoaXMua2V5PXQmJnQua2V5LHRoaXMuY29tcG9uZW50T3B0aW9ucz1hLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9dm9pZCAwLHRoaXMucGFyZW50PXZvaWQgMCx0aGlzLnJhdz0hMSx0aGlzLmlzU3RhdGljPSExLHRoaXMuaXNSb290SW5zZXJ0PSEwLHRoaXMuaXNDb21tZW50PSExLHRoaXMuaXNDbG9uZWQ9ITEsdGhpcy5pc09uY2U9ITEsdGhpcy5hc3luY0ZhY3Rvcnk9cyx0aGlzLmFzeW5jTWV0YT12b2lkIDAsdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXI9ITF9LGRlPXtjaGlsZDp7Y29uZmlndXJhYmxlOiEwfX07ZGUuY2hpbGQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKHBlLnByb3RvdHlwZSxkZSk7dmFyIHZlPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPVwiXCIpO3ZhciB0PW5ldyBwZTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH07ZnVuY3Rpb24gaGUoZSl7cmV0dXJuIG5ldyBwZSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIG1lKGUpe3ZhciB0PW5ldyBwZShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbiYmZS5jaGlsZHJlbi5zbGljZSgpLGUudGV4dCxlLmVsbSxlLmNvbnRleHQsZS5jb21wb25lbnRPcHRpb25zLGUuYXN5bmNGYWN0b3J5KTtyZXR1cm4gdC5ucz1lLm5zLHQuaXNTdGF0aWM9ZS5pc1N0YXRpYyx0LmtleT1lLmtleSx0LmlzQ29tbWVudD1lLmlzQ29tbWVudCx0LmZuQ29udGV4dD1lLmZuQ29udGV4dCx0LmZuT3B0aW9ucz1lLmZuT3B0aW9ucyx0LmZuU2NvcGVJZD1lLmZuU2NvcGVJZCx0LmFzeW5jTWV0YT1lLmFzeW5jTWV0YSx0LmlzQ2xvbmVkPSEwLHR9dmFyIHllPUFycmF5LnByb3RvdHlwZSxnZT1PYmplY3QuY3JlYXRlKHllKTtbXCJwdXNoXCIsXCJwb3BcIixcInNoaWZ0XCIsXCJ1bnNoaWZ0XCIsXCJzcGxpY2VcIixcInNvcnRcIixcInJldmVyc2VcIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD15ZVtlXTtSKGdlLGUsZnVuY3Rpb24oKXtmb3IodmFyIG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT1hcmd1bWVudHNbcl07dmFyIGksbz10LmFwcGx5KHRoaXMsbiksYT10aGlzLl9fb2JfXztzd2l0Y2goZSl7Y2FzZVwicHVzaFwiOmNhc2VcInVuc2hpZnRcIjppPW47YnJlYWs7Y2FzZVwic3BsaWNlXCI6aT1uLnNsaWNlKDIpfXJldHVybiBpJiZhLm9ic2VydmVBcnJheShpKSxhLmRlcC5ub3RpZnkoKSxvfSl9KTt2YXIgX2U9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZ2UpLGJlPSEwO2Z1bmN0aW9uICRlKGUpe2JlPWV9dmFyIHdlPWZ1bmN0aW9uKGUpe3ZhciB0O3RoaXMudmFsdWU9ZSx0aGlzLmRlcD1uZXcgY2UsdGhpcy52bUNvdW50PTAsUihlLFwiX19vYl9fXCIsdGhpcyksQXJyYXkuaXNBcnJheShlKT8oVT8odD1nZSxlLl9fcHJvdG9fXz10KTpmdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPTAsaT1uLmxlbmd0aDtyPGk7cisrKXt2YXIgbz1uW3JdO1IoZSxvLHRbb10pfX0oZSxnZSxfZSksdGhpcy5vYnNlcnZlQXJyYXkoZSkpOnRoaXMud2FsayhlKX07ZnVuY3Rpb24gQ2UoZSx0KXt2YXIgbjtpZihvKGUpJiYhKGUgaW5zdGFuY2VvZiBwZSkpcmV0dXJuIHkoZSxcIl9fb2JfX1wiKSYmZS5fX29iX18gaW5zdGFuY2VvZiB3ZT9uPWUuX19vYl9fOmJlJiYhdGUoKSYmKEFycmF5LmlzQXJyYXkoZSl8fHMoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyB3ZShlKSksdCYmbiYmbi52bUNvdW50Kyssbn1mdW5jdGlvbiB4ZShlLHQsbixyLGkpe3ZhciBvPW5ldyBjZSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsYz1hJiZhLnNldDtzJiYhY3x8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChuPWVbdF0pO3ZhciB1PSFpJiZDZShuKTtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6ZnVuY3Rpb24oKXt2YXIgdD1zP3MuY2FsbChlKTpuO3JldHVybiBjZS50YXJnZXQmJihvLmRlcGVuZCgpLHUmJih1LmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KHQpJiZmdW5jdGlvbiBlKHQpe2Zvcih2YXIgbj12b2lkIDAscj0wLGk9dC5sZW5ndGg7cjxpO3IrKykobj10W3JdKSYmbi5fX29iX18mJm4uX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KG4pJiZlKG4pfSh0KSkpLHR9LHNldDpmdW5jdGlvbih0KXt2YXIgcj1zP3MuY2FsbChlKTpuO3Q9PT1yfHx0IT10JiZyIT1yfHxzJiYhY3x8KGM/Yy5jYWxsKGUsdCk6bj10LHU9IWkmJkNlKHQpLG8ubm90aWZ5KCkpfX0pfX1mdW5jdGlvbiBrZShlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmYyh0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bixuO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8oeGUoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOihlW3RdPW4sbil9ZnVuY3Rpb24gQWUoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZjKHQpKWUuc3BsaWNlKHQsMSk7ZWxzZXt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHx5KGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9fXdlLnByb3RvdHlwZS53YWxrPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD1PYmplY3Qua2V5cyhlKSxuPTA7bjx0Lmxlbmd0aDtuKyspeGUoZSx0W25dKX0sd2UucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspQ2UoZVt0XSl9O3ZhciBPZT1GLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztmdW5jdGlvbiBTZShlLHQpe2lmKCF0KXJldHVybiBlO2Zvcih2YXIgbixyLGksbz1vZT9SZWZsZWN0Lm93bktleXModCk6T2JqZWN0LmtleXModCksYT0wO2E8by5sZW5ndGg7YSsrKVwiX19vYl9fXCIhPT0obj1vW2FdKSYmKHI9ZVtuXSxpPXRbbl0seShlLG4pP3IhPT1pJiZzKHIpJiZzKGkpJiZTZShyLGkpOmtlKGUsbixpKSk7cmV0dXJuIGV9ZnVuY3Rpb24gVGUoZSx0LG4pe3JldHVybiBuP2Z1bmN0aW9uKCl7dmFyIHI9XCJmdW5jdGlvblwiPT10eXBlb2YgdD90LmNhbGwobixuKTp0LGk9XCJmdW5jdGlvblwiPT10eXBlb2YgZT9lLmNhbGwobixuKTplO3JldHVybiByP1NlKHIsaSk6aX06dD9lP2Z1bmN0aW9uKCl7cmV0dXJuIFNlKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dC5jYWxsKHRoaXMsdGhpcyk6dCxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlP2UuY2FsbCh0aGlzLHRoaXMpOmUpfTp0OmV9ZnVuY3Rpb24gRWUoZSx0KXt2YXIgbj10P2U/ZS5jb25jYXQodCk6QXJyYXkuaXNBcnJheSh0KT90Olt0XTplO3JldHVybiBuP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdD1bXSxuPTA7bjxlLmxlbmd0aDtuKyspLTE9PT10LmluZGV4T2YoZVtuXSkmJnQucHVzaChlW25dKTtyZXR1cm4gdH0obik6bn1mdW5jdGlvbiBOZShlLHQsbixyKXt2YXIgaT1PYmplY3QuY3JlYXRlKGV8fG51bGwpO3JldHVybiB0P0EoaSx0KTppfU9lLmRhdGE9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBuP1RlKGUsdCxuKTp0JiZcImZ1bmN0aW9uXCIhPXR5cGVvZiB0P2U6VGUoZSx0KX0sSS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2VdPUVlfSksTS5mb3JFYWNoKGZ1bmN0aW9uKGUpe09lW2UrXCJzXCJdPU5lfSksT2Uud2F0Y2g9ZnVuY3Rpb24oZSx0LG4scil7aWYoZT09PVkmJihlPXZvaWQgMCksdD09PVkmJih0PXZvaWQgMCksIXQpcmV0dXJuIE9iamVjdC5jcmVhdGUoZXx8bnVsbCk7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9e307Zm9yKHZhciBvIGluIEEoaSxlKSx0KXt2YXIgYT1pW29dLHM9dFtvXTthJiYhQXJyYXkuaXNBcnJheShhKSYmKGE9W2FdKSxpW29dPWE/YS5jb25jYXQocyk6QXJyYXkuaXNBcnJheShzKT9zOltzXX1yZXR1cm4gaX0sT2UucHJvcHM9T2UubWV0aG9kcz1PZS5pbmplY3Q9T2UuY29tcHV0ZWQ9ZnVuY3Rpb24oZSx0LG4scil7aWYoIWUpcmV0dXJuIHQ7dmFyIGk9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gQShpLGUpLHQmJkEoaSx0KSxpfSxPZS5wcm92aWRlPVRlO3ZhciBqZT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P2U6dH07ZnVuY3Rpb24gRGUoZSx0LG4pe2lmKFwiZnVuY3Rpb25cIj09dHlwZW9mIHQmJih0PXQub3B0aW9ucyksZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnByb3BzO2lmKG4pe3ZhciByLGksbz17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcihyPW4ubGVuZ3RoO3ItLTspXCJzdHJpbmdcIj09dHlwZW9mKGk9bltyXSkmJihvW2IoaSldPXt0eXBlOm51bGx9KTtlbHNlIGlmKHMobikpZm9yKHZhciBhIGluIG4paT1uW2FdLG9bYihhKV09cyhpKT9pOnt0eXBlOml9O2UucHJvcHM9b319KHQpLGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5pbmplY3Q7aWYobil7dmFyIHI9ZS5pbmplY3Q9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIGk9MDtpPG4ubGVuZ3RoO2krKylyW25baV1dPXtmcm9tOm5baV19O2Vsc2UgaWYocyhuKSlmb3IodmFyIG8gaW4gbil7dmFyIGE9bltvXTtyW29dPXMoYSk/QSh7ZnJvbTpvfSxhKTp7ZnJvbTphfX19fSh0KSxmdW5jdGlvbihlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtcImZ1bmN0aW9uXCI9PXR5cGVvZiByJiYodFtuXT17YmluZDpyLHVwZGF0ZTpyfSl9fSh0KSwhdC5fYmFzZSYmKHQuZXh0ZW5kcyYmKGU9RGUoZSx0LmV4dGVuZHMsbikpLHQubWl4aW5zKSlmb3IodmFyIHI9MCxpPXQubWl4aW5zLmxlbmd0aDtyPGk7cisrKWU9RGUoZSx0Lm1peGluc1tyXSxuKTt2YXIgbyxhPXt9O2ZvcihvIGluIGUpYyhvKTtmb3IobyBpbiB0KXkoZSxvKXx8YyhvKTtmdW5jdGlvbiBjKHIpe3ZhciBpPU9lW3JdfHxqZTthW3JdPWkoZVtyXSx0W3JdLG4scil9cmV0dXJuIGF9ZnVuY3Rpb24gTGUoZSx0LG4scil7aWYoXCJzdHJpbmdcIj09dHlwZW9mIG4pe3ZhciBpPWVbdF07aWYoeShpLG4pKXJldHVybiBpW25dO3ZhciBvPWIobik7aWYoeShpLG8pKXJldHVybiBpW29dO3ZhciBhPSQobyk7cmV0dXJuIHkoaSxhKT9pW2FdOmlbbl18fGlbb118fGlbYV19fWZ1bmN0aW9uIE1lKGUsdCxuLHIpe3ZhciBpPXRbZV0sbz0heShuLGUpLGE9bltlXSxzPVBlKEJvb2xlYW4saS50eXBlKTtpZihzPi0xKWlmKG8mJiF5KGksXCJkZWZhdWx0XCIpKWE9ITE7ZWxzZSBpZihcIlwiPT09YXx8YT09PUMoZSkpe3ZhciBjPVBlKFN0cmluZyxpLnR5cGUpOyhjPDB8fHM8YykmJihhPSEwKX1pZih2b2lkIDA9PT1hKXthPWZ1bmN0aW9uKGUsdCxuKXtpZigheSh0LFwiZGVmYXVsdFwiKSlyZXR1cm47dmFyIHI9dC5kZWZhdWx0O2lmKGUmJmUuJG9wdGlvbnMucHJvcHNEYXRhJiZ2b2lkIDA9PT1lLiRvcHRpb25zLnByb3BzRGF0YVtuXSYmdm9pZCAwIT09ZS5fcHJvcHNbbl0pcmV0dXJuIGUuX3Byb3BzW25dO3JldHVyblwiZnVuY3Rpb25cIj09dHlwZW9mIHImJlwiRnVuY3Rpb25cIiE9PUllKHQudHlwZSk/ci5jYWxsKGUpOnJ9KHIsaSxlKTt2YXIgdT1iZTskZSghMCksQ2UoYSksJGUodSl9cmV0dXJuIGF9ZnVuY3Rpb24gSWUoZSl7dmFyIHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXFxzKmZ1bmN0aW9uIChcXHcrKS8pO3JldHVybiB0P3RbMV06XCJcIn1mdW5jdGlvbiBGZShlLHQpe3JldHVybiBJZShlKT09PUllKHQpfWZ1bmN0aW9uIFBlKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIEZlKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYoRmUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBSZShlLHQsbil7bGUoKTt0cnl7aWYodClmb3IodmFyIHI9dDtyPXIuJHBhcmVudDspe3ZhciBpPXIuJG9wdGlvbnMuZXJyb3JDYXB0dXJlZDtpZihpKWZvcih2YXIgbz0wO288aS5sZW5ndGg7bysrKXRyeXtpZighMT09PWlbb10uY2FsbChyLGUsdCxuKSlyZXR1cm59Y2F0Y2goZSl7QmUoZSxyLFwiZXJyb3JDYXB0dXJlZCBob29rXCIpfX1CZShlLHQsbil9ZmluYWxseXtmZSgpfX1mdW5jdGlvbiBIZShlLHQsbixyLGkpe3ZhciBvO3RyeXsobz1uP2UuYXBwbHkodCxuKTplLmNhbGwodCkpJiYhby5faXNWdWUmJnUobykmJiFvLl9oYW5kbGVkJiYoby5jYXRjaChmdW5jdGlvbihlKXtyZXR1cm4gUmUoZSxyLGkrXCIgKFByb21pc2UvYXN5bmMpXCIpfSksby5faGFuZGxlZD0hMCl9Y2F0Y2goZSl7UmUoZSxyLGkpfXJldHVybiBvfWZ1bmN0aW9uIEJlKGUsdCxuKXtpZihGLmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIEYuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCxlLHQsbil9Y2F0Y2godCl7dCE9PWUmJlVlKHQsbnVsbCxcImNvbmZpZy5lcnJvckhhbmRsZXJcIil9VWUoZSx0LG4pfWZ1bmN0aW9uIFVlKGUsdCxuKXtpZigheiYmIVZ8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBjb25zb2xlKXRocm93IGU7Y29uc29sZS5lcnJvcihlKX12YXIgemUsVmU9ITEsS2U9W10sSmU9ITE7ZnVuY3Rpb24gcWUoKXtKZT0hMTt2YXIgZT1LZS5zbGljZSgwKTtLZS5sZW5ndGg9MDtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdKCl9aWYoXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFByb21pc2UmJnJlKFByb21pc2UpKXt2YXIgV2U9UHJvbWlzZS5yZXNvbHZlKCk7emU9ZnVuY3Rpb24oKXtXZS50aGVuKHFlKSxHJiZzZXRUaW1lb3V0KFMpfSxWZT0hMH1lbHNlIGlmKHF8fFwidW5kZWZpbmVkXCI9PXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyfHwhcmUoTXV0YXRpb25PYnNlcnZlcikmJlwiW29iamVjdCBNdXRhdGlvbk9ic2VydmVyQ29uc3RydWN0b3JdXCIhPT1NdXRhdGlvbk9ic2VydmVyLnRvU3RyaW5nKCkpemU9XCJ1bmRlZmluZWRcIiE9dHlwZW9mIHNldEltbWVkaWF0ZSYmcmUoc2V0SW1tZWRpYXRlKT9mdW5jdGlvbigpe3NldEltbWVkaWF0ZShxZSl9OmZ1bmN0aW9uKCl7c2V0VGltZW91dChxZSwwKX07ZWxzZXt2YXIgWmU9MSxHZT1uZXcgTXV0YXRpb25PYnNlcnZlcihxZSksWGU9ZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoU3RyaW5nKFplKSk7R2Uub2JzZXJ2ZShYZSx7Y2hhcmFjdGVyRGF0YTohMH0pLHplPWZ1bmN0aW9uKCl7WmU9KFplKzEpJTIsWGUuZGF0YT1TdHJpbmcoWmUpfSxWZT0hMH1mdW5jdGlvbiBZZShlLHQpe3ZhciBuO2lmKEtlLnB1c2goZnVuY3Rpb24oKXtpZihlKXRyeXtlLmNhbGwodCl9Y2F0Y2goZSl7UmUoZSx0LFwibmV4dFRpY2tcIil9ZWxzZSBuJiZuKHQpfSksSmV8fChKZT0hMCx6ZSgpKSwhZSYmXCJ1bmRlZmluZWRcIiE9dHlwZW9mIFByb21pc2UpcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKGUpe249ZX0pfXZhciBRZT1uZXcgaWU7ZnVuY3Rpb24gZXQoZSl7IWZ1bmN0aW9uIGUodCxuKXt2YXIgcixpO3ZhciBhPUFycmF5LmlzQXJyYXkodCk7aWYoIWEmJiFvKHQpfHxPYmplY3QuaXNGcm96ZW4odCl8fHQgaW5zdGFuY2VvZiBwZSlyZXR1cm47aWYodC5fX29iX18pe3ZhciBzPXQuX19vYl9fLmRlcC5pZDtpZihuLmhhcyhzKSlyZXR1cm47bi5hZGQocyl9aWYoYSlmb3Iocj10Lmxlbmd0aDtyLS07KWUodFtyXSxuKTtlbHNlIGZvcihpPU9iamVjdC5rZXlzKHQpLHI9aS5sZW5ndGg7ci0tOyllKHRbaVtyXV0sbil9KGUsUWUpLFFlLmNsZWFyKCl9dmFyIHR0PWcoZnVuY3Rpb24oZSl7dmFyIHQ9XCImXCI9PT1lLmNoYXJBdCgwKSxuPVwiflwiPT09KGU9dD9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKSxyPVwiIVwiPT09KGU9bj9lLnNsaWNlKDEpOmUpLmNoYXJBdCgwKTtyZXR1cm57bmFtZTplPXI/ZS5zbGljZSgxKTplLG9uY2U6bixjYXB0dXJlOnIscGFzc2l2ZTp0fX0pO2Z1bmN0aW9uIG50KGUsdCl7ZnVuY3Rpb24gbigpe3ZhciBlPWFyZ3VtZW50cyxyPW4uZm5zO2lmKCFBcnJheS5pc0FycmF5KHIpKXJldHVybiBIZShyLG51bGwsYXJndW1lbnRzLHQsXCJ2LW9uIGhhbmRsZXJcIik7Zm9yKHZhciBpPXIuc2xpY2UoKSxvPTA7bzxpLmxlbmd0aDtvKyspSGUoaVtvXSxudWxsLGUsdCxcInYtb24gaGFuZGxlclwiKX1yZXR1cm4gbi5mbnM9ZSxufWZ1bmN0aW9uIHJ0KGUsbixpLG8sYSxzKXt2YXIgYyx1LGwsZjtmb3IoYyBpbiBlKXU9ZVtjXSxsPW5bY10sZj10dChjKSx0KHUpfHwodChsKT8odCh1LmZucykmJih1PWVbY109bnQodSxzKSkscihmLm9uY2UpJiYodT1lW2NdPWEoZi5uYW1lLHUsZi5jYXB0dXJlKSksaShmLm5hbWUsdSxmLmNhcHR1cmUsZi5wYXNzaXZlLGYucGFyYW1zKSk6dSE9PWwmJihsLmZucz11LGVbY109bCkpO2ZvcihjIGluIG4pdChlW2NdKSYmbygoZj10dChjKSkubmFtZSxuW2NdLGYuY2FwdHVyZSl9ZnVuY3Rpb24gaXQoZSxpLG8pe3ZhciBhO2UgaW5zdGFuY2VvZiBwZSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBzPWVbaV07ZnVuY3Rpb24gYygpe28uYXBwbHkodGhpcyxhcmd1bWVudHMpLGgoYS5mbnMsYyl9dChzKT9hPW50KFtjXSk6bihzLmZucykmJnIocy5tZXJnZWQpPyhhPXMpLmZucy5wdXNoKGMpOmE9bnQoW3MsY10pLGEubWVyZ2VkPSEwLGVbaV09YX1mdW5jdGlvbiBvdChlLHQscixpLG8pe2lmKG4odCkpe2lmKHkodCxyKSlyZXR1cm4gZVtyXT10W3JdLG98fGRlbGV0ZSB0W3JdLCEwO2lmKHkodCxpKSlyZXR1cm4gZVtyXT10W2ldLG98fGRlbGV0ZSB0W2ldLCEwfXJldHVybiExfWZ1bmN0aW9uIGF0KGUpe3JldHVybiBpKGUpP1toZShlKV06QXJyYXkuaXNBcnJheShlKT9mdW5jdGlvbiBlKG8sYSl7dmFyIHM9W107dmFyIGMsdSxsLGY7Zm9yKGM9MDtjPG8ubGVuZ3RoO2MrKyl0KHU9b1tjXSl8fFwiYm9vbGVhblwiPT10eXBlb2YgdXx8KGw9cy5sZW5ndGgtMSxmPXNbbF0sQXJyYXkuaXNBcnJheSh1KT91Lmxlbmd0aD4wJiYoc3QoKHU9ZSh1LChhfHxcIlwiKStcIl9cIitjKSlbMF0pJiZzdChmKSYmKHNbbF09aGUoZi50ZXh0K3VbMF0udGV4dCksdS5zaGlmdCgpKSxzLnB1c2guYXBwbHkocyx1KSk6aSh1KT9zdChmKT9zW2xdPWhlKGYudGV4dCt1KTpcIlwiIT09dSYmcy5wdXNoKGhlKHUpKTpzdCh1KSYmc3QoZik/c1tsXT1oZShmLnRleHQrdS50ZXh0KToocihvLl9pc1ZMaXN0KSYmbih1LnRhZykmJnQodS5rZXkpJiZuKGEpJiYodS5rZXk9XCJfX3ZsaXN0XCIrYStcIl9cIitjK1wiX19cIikscy5wdXNoKHUpKSk7cmV0dXJuIHN9KGUpOnZvaWQgMH1mdW5jdGlvbiBzdChlKXtyZXR1cm4gbihlKSYmbihlLnRleHQpJiYhMT09PWUuaXNDb21tZW50fWZ1bmN0aW9uIGN0KGUsdCl7aWYoZSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1vZT9SZWZsZWN0Lm93bktleXMoZSk6T2JqZWN0LmtleXMoZSksaT0wO2k8ci5sZW5ndGg7aSsrKXt2YXIgbz1yW2ldO2lmKFwiX19vYl9fXCIhPT1vKXtmb3IodmFyIGE9ZVtvXS5mcm9tLHM9dDtzOyl7aWYocy5fcHJvdmlkZWQmJnkocy5fcHJvdmlkZWQsYSkpe25bb109cy5fcHJvdmlkZWRbYV07YnJlYWt9cz1zLiRwYXJlbnR9aWYoIXMmJlwiZGVmYXVsdFwiaW4gZVtvXSl7dmFyIGM9ZVtvXS5kZWZhdWx0O25bb109XCJmdW5jdGlvblwiPT10eXBlb2YgYz9jLmNhbGwodCk6Y319fXJldHVybiBufX1mdW5jdGlvbiB1dChlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe3ZhciBvPWVbcl0sYT1vLmRhdGE7aWYoYSYmYS5hdHRycyYmYS5hdHRycy5zbG90JiZkZWxldGUgYS5hdHRycy5zbG90LG8uY29udGV4dCE9PXQmJm8uZm5Db250ZXh0IT09dHx8IWF8fG51bGw9PWEuc2xvdCkobi5kZWZhdWx0fHwobi5kZWZhdWx0PVtdKSkucHVzaChvKTtlbHNle3ZhciBzPWEuc2xvdCxjPW5bc118fChuW3NdPVtdKTtcInRlbXBsYXRlXCI9PT1vLnRhZz9jLnB1c2guYXBwbHkoYyxvLmNoaWxkcmVufHxbXSk6Yy5wdXNoKG8pfX1mb3IodmFyIHUgaW4gbiluW3VdLmV2ZXJ5KGx0KSYmZGVsZXRlIG5bdV07cmV0dXJuIG59ZnVuY3Rpb24gbHQoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fFwiIFwiPT09ZS50ZXh0fWZ1bmN0aW9uIGZ0KHQsbixyKXt2YXIgaSxvPU9iamVjdC5rZXlzKG4pLmxlbmd0aD4wLGE9dD8hIXQuJHN0YWJsZTohbyxzPXQmJnQuJGtleTtpZih0KXtpZih0Ll9ub3JtYWxpemVkKXJldHVybiB0Ll9ub3JtYWxpemVkO2lmKGEmJnImJnIhPT1lJiZzPT09ci4ka2V5JiYhbyYmIXIuJGhhc05vcm1hbClyZXR1cm4gcjtmb3IodmFyIGMgaW4gaT17fSx0KXRbY10mJlwiJFwiIT09Y1swXSYmKGlbY109cHQobixjLHRbY10pKX1lbHNlIGk9e307Zm9yKHZhciB1IGluIG4pdSBpbiBpfHwoaVt1XT1kdChuLHUpKTtyZXR1cm4gdCYmT2JqZWN0LmlzRXh0ZW5zaWJsZSh0KSYmKHQuX25vcm1hbGl6ZWQ9aSksUihpLFwiJHN0YWJsZVwiLGEpLFIoaSxcIiRrZXlcIixzKSxSKGksXCIkaGFzTm9ybWFsXCIsbyksaX1mdW5jdGlvbiBwdChlLHQsbil7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoP24uYXBwbHkobnVsbCxhcmd1bWVudHMpOm4oe30pO3JldHVybihlPWUmJlwib2JqZWN0XCI9PXR5cGVvZiBlJiYhQXJyYXkuaXNBcnJheShlKT9bZV06YXQoZSkpJiYoMD09PWUubGVuZ3RofHwxPT09ZS5sZW5ndGgmJmVbMF0uaXNDb21tZW50KT92b2lkIDA6ZX07cmV0dXJuIG4ucHJveHkmJk9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2dldDpyLGVudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwfSkscn1mdW5jdGlvbiBkdChlLHQpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlW3RdfX1mdW5jdGlvbiB2dChlLHQpe3ZhciByLGksYSxzLGM7aWYoQXJyYXkuaXNBcnJheShlKXx8XCJzdHJpbmdcIj09dHlwZW9mIGUpZm9yKHI9bmV3IEFycmF5KGUubGVuZ3RoKSxpPTAsYT1lLmxlbmd0aDtpPGE7aSsrKXJbaV09dChlW2ldLGkpO2Vsc2UgaWYoXCJudW1iZXJcIj09dHlwZW9mIGUpZm9yKHI9bmV3IEFycmF5KGUpLGk9MDtpPGU7aSsrKXJbaV09dChpKzEsaSk7ZWxzZSBpZihvKGUpKWlmKG9lJiZlW1N5bWJvbC5pdGVyYXRvcl0pe3I9W107Zm9yKHZhciB1PWVbU3ltYm9sLml0ZXJhdG9yXSgpLGw9dS5uZXh0KCk7IWwuZG9uZTspci5wdXNoKHQobC52YWx1ZSxyLmxlbmd0aCkpLGw9dS5uZXh0KCl9ZWxzZSBmb3Iocz1PYmplY3Qua2V5cyhlKSxyPW5ldyBBcnJheShzLmxlbmd0aCksaT0wLGE9cy5sZW5ndGg7aTxhO2krKyljPXNbaV0scltpXT10KGVbY10sYyxpKTtyZXR1cm4gbihyKXx8KHI9W10pLHIuX2lzVkxpc3Q9ITAscn1mdW5jdGlvbiBodChlLHQsbixyKXt2YXIgaSxvPXRoaXMuJHNjb3BlZFNsb3RzW2VdO28/KG49bnx8e30sciYmKG49QShBKHt9LHIpLG4pKSxpPW8obil8fHQpOmk9dGhpcy4kc2xvdHNbZV18fHQ7dmFyIGE9biYmbi5zbG90O3JldHVybiBhP3RoaXMuJGNyZWF0ZUVsZW1lbnQoXCJ0ZW1wbGF0ZVwiLHtzbG90OmF9LGkpOml9ZnVuY3Rpb24gbXQoZSl7cmV0dXJuIExlKHRoaXMuJG9wdGlvbnMsXCJmaWx0ZXJzXCIsZSl8fEV9ZnVuY3Rpb24geXQoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMT09PWUuaW5kZXhPZih0KTplIT09dH1mdW5jdGlvbiBndChlLHQsbixyLGkpe3ZhciBvPUYua2V5Q29kZXNbdF18fG47cmV0dXJuIGkmJnImJiFGLmtleUNvZGVzW3RdP3l0KGkscik6bz95dChvLGUpOnI/QyhyKSE9PXQ6dm9pZCAwfWZ1bmN0aW9uIF90KGUsdCxuLHIsaSl7aWYobilpZihvKG4pKXt2YXIgYTtBcnJheS5pc0FycmF5KG4pJiYobj1PKG4pKTt2YXIgcz1mdW5jdGlvbihvKXtpZihcImNsYXNzXCI9PT1vfHxcInN0eWxlXCI9PT1vfHx2KG8pKWE9ZTtlbHNle3ZhciBzPWUuYXR0cnMmJmUuYXR0cnMudHlwZTthPXJ8fEYubXVzdFVzZVByb3AodCxzLG8pP2UuZG9tUHJvcHN8fChlLmRvbVByb3BzPXt9KTplLmF0dHJzfHwoZS5hdHRycz17fSl9dmFyIGM9YihvKSx1PUMobyk7YyBpbiBhfHx1IGluIGF8fChhW29dPW5bb10saSYmKChlLm9ufHwoZS5vbj17fSkpW1widXBkYXRlOlwiK29dPWZ1bmN0aW9uKGUpe25bb109ZX0pKX07Zm9yKHZhciBjIGluIG4pcyhjKX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIGJ0KGUsdCl7dmFyIG49dGhpcy5fc3RhdGljVHJlZXN8fCh0aGlzLl9zdGF0aWNUcmVlcz1bXSkscj1uW2VdO3JldHVybiByJiYhdD9yOih3dChyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLFwiX19zdGF0aWNfX1wiK2UsITEpLHIpfWZ1bmN0aW9uICR0KGUsdCxuKXtyZXR1cm4gd3QoZSxcIl9fb25jZV9fXCIrdCsobj9cIl9cIituOlwiXCIpLCEwKSxlfWZ1bmN0aW9uIHd0KGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJlwic3RyaW5nXCIhPXR5cGVvZiBlW3JdJiZDdChlW3JdLHQrXCJfXCIrcixuKTtlbHNlIEN0KGUsdCxuKX1mdW5jdGlvbiBDdChlLHQsbil7ZS5pc1N0YXRpYz0hMCxlLmtleT10LGUuaXNPbmNlPW59ZnVuY3Rpb24geHQoZSx0KXtpZih0KWlmKHModCkpe3ZhciBuPWUub249ZS5vbj9BKHt9LGUub24pOnt9O2Zvcih2YXIgciBpbiB0KXt2YXIgaT1uW3JdLG89dFtyXTtuW3JdPWk/W10uY29uY2F0KGksbyk6b319ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiBrdChlLHQsbixyKXt0PXR8fHskc3RhYmxlOiFufTtmb3IodmFyIGk9MDtpPGUubGVuZ3RoO2krKyl7dmFyIG89ZVtpXTtBcnJheS5pc0FycmF5KG8pP2t0KG8sdCxuKTpvJiYoby5wcm94eSYmKG8uZm4ucHJveHk9ITApLHRbby5rZXldPW8uZm4pfXJldHVybiByJiYodC4ka2V5PXIpLHR9ZnVuY3Rpb24gQXQoZSx0KXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rPTIpe3ZhciByPXRbbl07XCJzdHJpbmdcIj09dHlwZW9mIHImJnImJihlW3Rbbl1dPXRbbisxXSl9cmV0dXJuIGV9ZnVuY3Rpb24gT3QoZSx0KXtyZXR1cm5cInN0cmluZ1wiPT10eXBlb2YgZT90K2U6ZX1mdW5jdGlvbiBTdChlKXtlLl9vPSR0LGUuX249ZixlLl9zPWwsZS5fbD12dCxlLl90PWh0LGUuX3E9TixlLl9pPWosZS5fbT1idCxlLl9mPW10LGUuX2s9Z3QsZS5fYj1fdCxlLl92PWhlLGUuX2U9dmUsZS5fdT1rdCxlLl9nPXh0LGUuX2Q9QXQsZS5fcD1PdH1mdW5jdGlvbiBUdCh0LG4saSxvLGEpe3ZhciBzLGM9dGhpcyx1PWEub3B0aW9uczt5KG8sXCJfdWlkXCIpPyhzPU9iamVjdC5jcmVhdGUobykpLl9vcmlnaW5hbD1vOihzPW8sbz1vLl9vcmlnaW5hbCk7dmFyIGw9cih1Ll9jb21waWxlZCksZj0hbDt0aGlzLmRhdGE9dCx0aGlzLnByb3BzPW4sdGhpcy5jaGlsZHJlbj1pLHRoaXMucGFyZW50PW8sdGhpcy5saXN0ZW5lcnM9dC5vbnx8ZSx0aGlzLmluamVjdGlvbnM9Y3QodS5pbmplY3QsbyksdGhpcy5zbG90cz1mdW5jdGlvbigpe3JldHVybiBjLiRzbG90c3x8ZnQodC5zY29wZWRTbG90cyxjLiRzbG90cz11dChpLG8pKSxjLiRzbG90c30sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsXCJzY29wZWRTbG90c1wiLHtlbnVtZXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3JldHVybiBmdCh0LnNjb3BlZFNsb3RzLHRoaXMuc2xvdHMoKSl9fSksbCYmKHRoaXMuJG9wdGlvbnM9dSx0aGlzLiRzbG90cz10aGlzLnNsb3RzKCksdGhpcy4kc2NvcGVkU2xvdHM9ZnQodC5zY29wZWRTbG90cyx0aGlzLiRzbG90cykpLHUuX3Njb3BlSWQ/dGhpcy5fYz1mdW5jdGlvbihlLHQsbixyKXt2YXIgaT1QdChzLGUsdCxuLHIsZik7cmV0dXJuIGkmJiFBcnJheS5pc0FycmF5KGkpJiYoaS5mblNjb3BlSWQ9dS5fc2NvcGVJZCxpLmZuQ29udGV4dD1vKSxpfTp0aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBQdChzLGUsdCxuLHIsZil9fWZ1bmN0aW9uIEV0KGUsdCxuLHIsaSl7dmFyIG89bWUoZSk7cmV0dXJuIG8uZm5Db250ZXh0PW4sby5mbk9wdGlvbnM9cix0LnNsb3QmJigoby5kYXRhfHwoby5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLG99ZnVuY3Rpb24gTnQoZSx0KXtmb3IodmFyIG4gaW4gdCllW2IobildPXRbbl19U3QoVHQucHJvdG90eXBlKTt2YXIganQ9e2luaXQ6ZnVuY3Rpb24oZSx0KXtpZihlLmNvbXBvbmVudEluc3RhbmNlJiYhZS5jb21wb25lbnRJbnN0YW5jZS5faXNEZXN0cm95ZWQmJmUuZGF0YS5rZWVwQWxpdmUpe3ZhciByPWU7anQucHJlcGF0Y2gocixyKX1lbHNleyhlLmNvbXBvbmVudEluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIHI9e19pc0NvbXBvbmVudDohMCxfcGFyZW50Vm5vZGU6ZSxwYXJlbnQ6dH0saT1lLmRhdGEuaW5saW5lVGVtcGxhdGU7bihpKSYmKHIucmVuZGVyPWkucmVuZGVyLHIuc3RhdGljUmVuZGVyRm5zPWkuc3RhdGljUmVuZGVyRm5zKTtyZXR1cm4gbmV3IGUuY29tcG9uZW50T3B0aW9ucy5DdG9yKHIpfShlLFd0KSkuJG1vdW50KHQ/ZS5lbG06dm9pZCAwLHQpfX0scHJlcGF0Y2g6ZnVuY3Rpb24odCxuKXt2YXIgcj1uLmNvbXBvbmVudE9wdGlvbnM7IWZ1bmN0aW9uKHQsbixyLGksbyl7dmFyIGE9aS5kYXRhLnNjb3BlZFNsb3RzLHM9dC4kc2NvcGVkU2xvdHMsYz0hIShhJiYhYS4kc3RhYmxlfHxzIT09ZSYmIXMuJHN0YWJsZXx8YSYmdC4kc2NvcGVkU2xvdHMuJGtleSE9PWEuJGtleSksdT0hIShvfHx0LiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbnx8Yyk7dC4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9aSx0LiR2bm9kZT1pLHQuX3Zub2RlJiYodC5fdm5vZGUucGFyZW50PWkpO2lmKHQuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPW8sdC4kYXR0cnM9aS5kYXRhLmF0dHJzfHxlLHQuJGxpc3RlbmVycz1yfHxlLG4mJnQuJG9wdGlvbnMucHJvcHMpeyRlKCExKTtmb3IodmFyIGw9dC5fcHJvcHMsZj10LiRvcHRpb25zLl9wcm9wS2V5c3x8W10scD0wO3A8Zi5sZW5ndGg7cCsrKXt2YXIgZD1mW3BdLHY9dC4kb3B0aW9ucy5wcm9wcztsW2RdPU1lKGQsdixuLHQpfSRlKCEwKSx0LiRvcHRpb25zLnByb3BzRGF0YT1ufXI9cnx8ZTt2YXIgaD10LiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7dC4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzPXIscXQodCxyLGgpLHUmJih0LiRzbG90cz11dChvLGkuY29udGV4dCksdC4kZm9yY2VVcGRhdGUoKSl9KG4uY29tcG9uZW50SW5zdGFuY2U9dC5jb21wb25lbnRJbnN0YW5jZSxyLnByb3BzRGF0YSxyLmxpc3RlbmVycyxuLHIuY2hpbGRyZW4pfSxpbnNlcnQ6ZnVuY3Rpb24oZSl7dmFyIHQsbj1lLmNvbnRleHQscj1lLmNvbXBvbmVudEluc3RhbmNlO3IuX2lzTW91bnRlZHx8KHIuX2lzTW91bnRlZD0hMCxZdChyLFwibW91bnRlZFwiKSksZS5kYXRhLmtlZXBBbGl2ZSYmKG4uX2lzTW91bnRlZD8oKHQ9cikuX2luYWN0aXZlPSExLGVuLnB1c2godCkpOlh0KHIsITApKX0sZGVzdHJveTpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbXBvbmVudEluc3RhbmNlO3QuX2lzRGVzdHJveWVkfHwoZS5kYXRhLmtlZXBBbGl2ZT9mdW5jdGlvbiBlKHQsbil7aWYobiYmKHQuX2RpcmVjdEluYWN0aXZlPSEwLEd0KHQpKSlyZXR1cm47aWYoIXQuX2luYWN0aXZlKXt0Ll9pbmFjdGl2ZT0hMDtmb3IodmFyIHI9MDtyPHQuJGNoaWxkcmVuLmxlbmd0aDtyKyspZSh0LiRjaGlsZHJlbltyXSk7WXQodCxcImRlYWN0aXZhdGVkXCIpfX0odCwhMCk6dC4kZGVzdHJveSgpKX19LER0PU9iamVjdC5rZXlzKGp0KTtmdW5jdGlvbiBMdChpLGEscyxjLGwpe2lmKCF0KGkpKXt2YXIgZj1zLiRvcHRpb25zLl9iYXNlO2lmKG8oaSkmJihpPWYuZXh0ZW5kKGkpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBpKXt2YXIgcDtpZih0KGkuY2lkKSYmdm9pZCAwPT09KGk9ZnVuY3Rpb24oZSxpKXtpZihyKGUuZXJyb3IpJiZuKGUuZXJyb3JDb21wKSlyZXR1cm4gZS5lcnJvckNvbXA7aWYobihlLnJlc29sdmVkKSlyZXR1cm4gZS5yZXNvbHZlZDt2YXIgYT1IdDthJiZuKGUub3duZXJzKSYmLTE9PT1lLm93bmVycy5pbmRleE9mKGEpJiZlLm93bmVycy5wdXNoKGEpO2lmKHIoZS5sb2FkaW5nKSYmbihlLmxvYWRpbmdDb21wKSlyZXR1cm4gZS5sb2FkaW5nQ29tcDtpZihhJiYhbihlLm93bmVycykpe3ZhciBzPWUub3duZXJzPVthXSxjPSEwLGw9bnVsbCxmPW51bGw7YS4kb24oXCJob29rOmRlc3Ryb3llZFwiLGZ1bmN0aW9uKCl7cmV0dXJuIGgocyxhKX0pO3ZhciBwPWZ1bmN0aW9uKGUpe2Zvcih2YXIgdD0wLG49cy5sZW5ndGg7dDxuO3QrKylzW3RdLiRmb3JjZVVwZGF0ZSgpO2UmJihzLmxlbmd0aD0wLG51bGwhPT1sJiYoY2xlYXJUaW1lb3V0KGwpLGw9bnVsbCksbnVsbCE9PWYmJihjbGVhclRpbWVvdXQoZiksZj1udWxsKSl9LGQ9RChmdW5jdGlvbih0KXtlLnJlc29sdmVkPUJ0KHQsaSksYz9zLmxlbmd0aD0wOnAoITApfSksdj1EKGZ1bmN0aW9uKHQpe24oZS5lcnJvckNvbXApJiYoZS5lcnJvcj0hMCxwKCEwKSl9KSxtPWUoZCx2KTtyZXR1cm4gbyhtKSYmKHUobSk/dChlLnJlc29sdmVkKSYmbS50aGVuKGQsdik6dShtLmNvbXBvbmVudCkmJihtLmNvbXBvbmVudC50aGVuKGQsdiksbihtLmVycm9yKSYmKGUuZXJyb3JDb21wPUJ0KG0uZXJyb3IsaSkpLG4obS5sb2FkaW5nKSYmKGUubG9hZGluZ0NvbXA9QnQobS5sb2FkaW5nLGkpLDA9PT1tLmRlbGF5P2UubG9hZGluZz0hMDpsPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtsPW51bGwsdChlLnJlc29sdmVkKSYmdChlLmVycm9yKSYmKGUubG9hZGluZz0hMCxwKCExKSl9LG0uZGVsYXl8fDIwMCkpLG4obS50aW1lb3V0KSYmKGY9c2V0VGltZW91dChmdW5jdGlvbigpe2Y9bnVsbCx0KGUucmVzb2x2ZWQpJiZ2KG51bGwpfSxtLnRpbWVvdXQpKSkpLGM9ITEsZS5sb2FkaW5nP2UubG9hZGluZ0NvbXA6ZS5yZXNvbHZlZH19KHA9aSxmKSkpcmV0dXJuIGZ1bmN0aW9uKGUsdCxuLHIsaSl7dmFyIG89dmUoKTtyZXR1cm4gby5hc3luY0ZhY3Rvcnk9ZSxvLmFzeW5jTWV0YT17ZGF0YTp0LGNvbnRleHQ6bixjaGlsZHJlbjpyLHRhZzppfSxvfShwLGEscyxjLGwpO2E9YXx8e30sJG4oaSksbihhLm1vZGVsKSYmZnVuY3Rpb24oZSx0KXt2YXIgcj1lLm1vZGVsJiZlLm1vZGVsLnByb3B8fFwidmFsdWVcIixpPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fFwiaW5wdXRcIjsodC5hdHRyc3x8KHQuYXR0cnM9e30pKVtyXT10Lm1vZGVsLnZhbHVlO3ZhciBvPXQub258fCh0Lm9uPXt9KSxhPW9baV0scz10Lm1vZGVsLmNhbGxiYWNrO24oYSk/KEFycmF5LmlzQXJyYXkoYSk/LTE9PT1hLmluZGV4T2Yocyk6YSE9PXMpJiYob1tpXT1bc10uY29uY2F0KGEpKTpvW2ldPXN9KGkub3B0aW9ucyxhKTt2YXIgZD1mdW5jdGlvbihlLHIsaSl7dmFyIG89ci5vcHRpb25zLnByb3BzO2lmKCF0KG8pKXt2YXIgYT17fSxzPWUuYXR0cnMsYz1lLnByb3BzO2lmKG4ocyl8fG4oYykpZm9yKHZhciB1IGluIG8pe3ZhciBsPUModSk7b3QoYSxjLHUsbCwhMCl8fG90KGEscyx1LGwsITEpfXJldHVybiBhfX0oYSxpKTtpZihyKGkub3B0aW9ucy5mdW5jdGlvbmFsKSlyZXR1cm4gZnVuY3Rpb24odCxyLGksbyxhKXt2YXIgcz10Lm9wdGlvbnMsYz17fSx1PXMucHJvcHM7aWYobih1KSlmb3IodmFyIGwgaW4gdSljW2xdPU1lKGwsdSxyfHxlKTtlbHNlIG4oaS5hdHRycykmJk50KGMsaS5hdHRycyksbihpLnByb3BzKSYmTnQoYyxpLnByb3BzKTt2YXIgZj1uZXcgVHQoaSxjLGEsbyx0KSxwPXMucmVuZGVyLmNhbGwobnVsbCxmLl9jLGYpO2lmKHAgaW5zdGFuY2VvZiBwZSlyZXR1cm4gRXQocCxpLGYucGFyZW50LHMpO2lmKEFycmF5LmlzQXJyYXkocCkpe2Zvcih2YXIgZD1hdChwKXx8W10sdj1uZXcgQXJyYXkoZC5sZW5ndGgpLGg9MDtoPGQubGVuZ3RoO2grKyl2W2hdPUV0KGRbaF0saSxmLnBhcmVudCxzKTtyZXR1cm4gdn19KGksZCxhLHMsYyk7dmFyIHY9YS5vbjtpZihhLm9uPWEubmF0aXZlT24scihpLm9wdGlvbnMuYWJzdHJhY3QpKXt2YXIgbT1hLnNsb3Q7YT17fSxtJiYoYS5zbG90PW0pfSFmdW5jdGlvbihlKXtmb3IodmFyIHQ9ZS5ob29rfHwoZS5ob29rPXt9KSxuPTA7bjxEdC5sZW5ndGg7bisrKXt2YXIgcj1EdFtuXSxpPXRbcl0sbz1qdFtyXTtpPT09b3x8aSYmaS5fbWVyZ2VkfHwodFtyXT1pP010KG8saSk6byl9fShhKTt2YXIgeT1pLm9wdGlvbnMubmFtZXx8bDtyZXR1cm4gbmV3IHBlKFwidnVlLWNvbXBvbmVudC1cIitpLmNpZCsoeT9cIi1cIit5OlwiXCIpLGEsdm9pZCAwLHZvaWQgMCx2b2lkIDAscyx7Q3RvcjppLHByb3BzRGF0YTpkLGxpc3RlbmVyczp2LHRhZzpsLGNoaWxkcmVuOmN9LHApfX19ZnVuY3Rpb24gTXQoZSx0KXt2YXIgbj1mdW5jdGlvbihuLHIpe2UobixyKSx0KG4scil9O3JldHVybiBuLl9tZXJnZWQ9ITAsbn12YXIgSXQ9MSxGdD0yO2Z1bmN0aW9uIFB0KGUsYSxzLGMsdSxsKXtyZXR1cm4oQXJyYXkuaXNBcnJheShzKXx8aShzKSkmJih1PWMsYz1zLHM9dm9pZCAwKSxyKGwpJiYodT1GdCksZnVuY3Rpb24oZSxpLGEscyxjKXtpZihuKGEpJiZuKGEuX19vYl9fKSlyZXR1cm4gdmUoKTtuKGEpJiZuKGEuaXMpJiYoaT1hLmlzKTtpZighaSlyZXR1cm4gdmUoKTtBcnJheS5pc0FycmF5KHMpJiZcImZ1bmN0aW9uXCI9PXR5cGVvZiBzWzBdJiYoKGE9YXx8e30pLnNjb3BlZFNsb3RzPXtkZWZhdWx0OnNbMF19LHMubGVuZ3RoPTApO2M9PT1GdD9zPWF0KHMpOmM9PT1JdCYmKHM9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoQXJyYXkuaXNBcnJheShlW3RdKSlyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxlKTtyZXR1cm4gZX0ocykpO3ZhciB1LGw7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGkpe3ZhciBmO2w9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxGLmdldFRhZ05hbWVzcGFjZShpKSx1PUYuaXNSZXNlcnZlZFRhZyhpKT9uZXcgcGUoRi5wYXJzZVBsYXRmb3JtVGFnTmFtZShpKSxhLHMsdm9pZCAwLHZvaWQgMCxlKTphJiZhLnByZXx8IW4oZj1MZShlLiRvcHRpb25zLFwiY29tcG9uZW50c1wiLGkpKT9uZXcgcGUoaSxhLHMsdm9pZCAwLHZvaWQgMCxlKTpMdChmLGEsZSxzLGkpfWVsc2UgdT1MdChpLGEsZSxzKTtyZXR1cm4gQXJyYXkuaXNBcnJheSh1KT91Om4odSk/KG4obCkmJmZ1bmN0aW9uIGUoaSxvLGEpe2kubnM9bztcImZvcmVpZ25PYmplY3RcIj09PWkudGFnJiYobz12b2lkIDAsYT0hMCk7aWYobihpLmNoaWxkcmVuKSlmb3IodmFyIHM9MCxjPWkuY2hpbGRyZW4ubGVuZ3RoO3M8YztzKyspe3ZhciB1PWkuY2hpbGRyZW5bc107bih1LnRhZykmJih0KHUubnMpfHxyKGEpJiZcInN2Z1wiIT09dS50YWcpJiZlKHUsbyxhKX19KHUsbCksbihhKSYmZnVuY3Rpb24oZSl7byhlLnN0eWxlKSYmZXQoZS5zdHlsZSk7byhlLmNsYXNzKSYmZXQoZS5jbGFzcyl9KGEpLHUpOnZlKCl9KGUsYSxzLGMsdSl9dmFyIFJ0LEh0PW51bGw7ZnVuY3Rpb24gQnQoZSx0KXtyZXR1cm4oZS5fX2VzTW9kdWxlfHxvZSYmXCJNb2R1bGVcIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSkmJihlPWUuZGVmYXVsdCksbyhlKT90LmV4dGVuZChlKTplfWZ1bmN0aW9uIFV0KGUpe3JldHVybiBlLmlzQ29tbWVudCYmZS5hc3luY0ZhY3Rvcnl9ZnVuY3Rpb24genQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyl7dmFyIHI9ZVt0XTtpZihuKHIpJiYobihyLmNvbXBvbmVudE9wdGlvbnMpfHxVdChyKSkpcmV0dXJuIHJ9fWZ1bmN0aW9uIFZ0KGUsdCl7UnQuJG9uKGUsdCl9ZnVuY3Rpb24gS3QoZSx0KXtSdC4kb2ZmKGUsdCl9ZnVuY3Rpb24gSnQoZSx0KXt2YXIgbj1SdDtyZXR1cm4gZnVuY3Rpb24gcigpe251bGwhPT10LmFwcGx5KG51bGwsYXJndW1lbnRzKSYmbi4kb2ZmKGUscil9fWZ1bmN0aW9uIHF0KGUsdCxuKXtSdD1lLHJ0KHQsbnx8e30sVnQsS3QsSnQsZSksUnQ9dm9pZCAwfXZhciBXdD1udWxsO2Z1bmN0aW9uIFp0KGUpe3ZhciB0PVd0O3JldHVybiBXdD1lLGZ1bmN0aW9uKCl7V3Q9dH19ZnVuY3Rpb24gR3QoZSl7Zm9yKDtlJiYoZT1lLiRwYXJlbnQpOylpZihlLl9pbmFjdGl2ZSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBYdChlLHQpe2lmKHQpe2lmKGUuX2RpcmVjdEluYWN0aXZlPSExLEd0KGUpKXJldHVybn1lbHNlIGlmKGUuX2RpcmVjdEluYWN0aXZlKXJldHVybjtpZihlLl9pbmFjdGl2ZXx8bnVsbD09PWUuX2luYWN0aXZlKXtlLl9pbmFjdGl2ZT0hMTtmb3IodmFyIG49MDtuPGUuJGNoaWxkcmVuLmxlbmd0aDtuKyspWHQoZS4kY2hpbGRyZW5bbl0pO1l0KGUsXCJhY3RpdmF0ZWRcIil9fWZ1bmN0aW9uIFl0KGUsdCl7bGUoKTt2YXIgbj1lLiRvcHRpb25zW3RdLHI9dCtcIiBob29rXCI7aWYobilmb3IodmFyIGk9MCxvPW4ubGVuZ3RoO2k8bztpKyspSGUobltpXSxlLG51bGwsZSxyKTtlLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoXCJob29rOlwiK3QpLGZlKCl9dmFyIFF0PVtdLGVuPVtdLHRuPXt9LG5uPSExLHJuPSExLG9uPTA7dmFyIGFuPTAsc249RGF0ZS5ub3c7aWYoeiYmIXEpe3ZhciBjbj13aW5kb3cucGVyZm9ybWFuY2U7Y24mJlwiZnVuY3Rpb25cIj09dHlwZW9mIGNuLm5vdyYmc24oKT5kb2N1bWVudC5jcmVhdGVFdmVudChcIkV2ZW50XCIpLnRpbWVTdGFtcCYmKHNuPWZ1bmN0aW9uKCl7cmV0dXJuIGNuLm5vdygpfSl9ZnVuY3Rpb24gdW4oKXt2YXIgZSx0O2Zvcihhbj1zbigpLHJuPSEwLFF0LnNvcnQoZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5pZC10LmlkfSksb249MDtvbjxRdC5sZW5ndGg7b24rKykoZT1RdFtvbl0pLmJlZm9yZSYmZS5iZWZvcmUoKSx0PWUuaWQsdG5bdF09bnVsbCxlLnJ1bigpO3ZhciBuPWVuLnNsaWNlKCkscj1RdC5zbGljZSgpO29uPVF0Lmxlbmd0aD1lbi5sZW5ndGg9MCx0bj17fSxubj1ybj0hMSxmdW5jdGlvbihlKXtmb3IodmFyIHQ9MDt0PGUubGVuZ3RoO3QrKyllW3RdLl9pbmFjdGl2ZT0hMCxYdChlW3RdLCEwKX0obiksZnVuY3Rpb24oZSl7dmFyIHQ9ZS5sZW5ndGg7Zm9yKDt0LS07KXt2YXIgbj1lW3RdLHI9bi52bTtyLl93YXRjaGVyPT09biYmci5faXNNb3VudGVkJiYhci5faXNEZXN0cm95ZWQmJll0KHIsXCJ1cGRhdGVkXCIpfX0ociksbmUmJkYuZGV2dG9vbHMmJm5lLmVtaXQoXCJmbHVzaFwiKX12YXIgbG49MCxmbj1mdW5jdGlvbihlLHQsbixyLGkpe3RoaXMudm09ZSxpJiYoZS5fd2F0Y2hlcj10aGlzKSxlLl93YXRjaGVycy5wdXNoKHRoaXMpLHI/KHRoaXMuZGVlcD0hIXIuZGVlcCx0aGlzLnVzZXI9ISFyLnVzZXIsdGhpcy5sYXp5PSEhci5sYXp5LHRoaXMuc3luYz0hIXIuc3luYyx0aGlzLmJlZm9yZT1yLmJlZm9yZSk6dGhpcy5kZWVwPXRoaXMudXNlcj10aGlzLmxhenk9dGhpcy5zeW5jPSExLHRoaXMuY2I9bix0aGlzLmlkPSsrbG4sdGhpcy5hY3RpdmU9ITAsdGhpcy5kaXJ0eT10aGlzLmxhenksdGhpcy5kZXBzPVtdLHRoaXMubmV3RGVwcz1bXSx0aGlzLmRlcElkcz1uZXcgaWUsdGhpcy5uZXdEZXBJZHM9bmV3IGllLHRoaXMuZXhwcmVzc2lvbj1cIlwiLFwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/dGhpcy5nZXR0ZXI9dDoodGhpcy5nZXR0ZXI9ZnVuY3Rpb24oZSl7aWYoIUgudGVzdChlKSl7dmFyIHQ9ZS5zcGxpdChcIi5cIik7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXtpZighZSlyZXR1cm47ZT1lW3Rbbl1dfXJldHVybiBlfX19KHQpLHRoaXMuZ2V0dGVyfHwodGhpcy5nZXR0ZXI9UykpLHRoaXMudmFsdWU9dGhpcy5sYXp5P3ZvaWQgMDp0aGlzLmdldCgpfTtmbi5wcm90b3R5cGUuZ2V0PWZ1bmN0aW9uKCl7dmFyIGU7bGUodGhpcyk7dmFyIHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO1JlKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyIFwiJyt0aGlzLmV4cHJlc3Npb24rJ1wiJyl9ZmluYWxseXt0aGlzLmRlZXAmJmV0KGUpLGZlKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxmbi5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxmbi5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LGZuLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTpmdW5jdGlvbihlKXt2YXIgdD1lLmlkO2lmKG51bGw9PXRuW3RdKXtpZih0blt0XT0hMCxybil7Zm9yKHZhciBuPVF0Lmxlbmd0aC0xO24+b24mJlF0W25dLmlkPmUuaWQ7KW4tLTtRdC5zcGxpY2UobisxLDAsZSl9ZWxzZSBRdC5wdXNoKGUpO25ufHwobm49ITAsWWUodW4pKX19KHRoaXMpfSxmbi5wcm90b3R5cGUucnVuPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3ZhciBlPXRoaXMuZ2V0KCk7aWYoZSE9PXRoaXMudmFsdWV8fG8oZSl8fHRoaXMuZGVlcCl7dmFyIHQ9dGhpcy52YWx1ZTtpZih0aGlzLnZhbHVlPWUsdGhpcy51c2VyKXRyeXt0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfWNhdGNoKGUpe1JlKGUsdGhpcy52bSwnY2FsbGJhY2sgZm9yIHdhdGNoZXIgXCInK3RoaXMuZXhwcmVzc2lvbisnXCInKX1lbHNlIHRoaXMuY2IuY2FsbCh0aGlzLnZtLGUsdCl9fX0sZm4ucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLmdldCgpLHRoaXMuZGlydHk9ITF9LGZuLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXRoaXMuZGVwc1tlXS5kZXBlbmQoKX0sZm4ucHJvdG90eXBlLnRlYXJkb3duPWZ1bmN0aW9uKCl7aWYodGhpcy5hY3RpdmUpe3RoaXMudm0uX2lzQmVpbmdEZXN0cm95ZWR8fGgodGhpcy52bS5fd2F0Y2hlcnMsdGhpcyk7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0ucmVtb3ZlU3ViKHRoaXMpO3RoaXMuYWN0aXZlPSExfX07dmFyIHBuPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6UyxzZXQ6U307ZnVuY3Rpb24gZG4oZSx0LG4pe3BuLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzW3RdW25dfSxwbi5zZXQ9ZnVuY3Rpb24oZSl7dGhpc1t0XVtuXT1lfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxuLHBuKX1mdW5jdGlvbiB2bihlKXtlLl93YXRjaGVycz1bXTt2YXIgdD1lLiRvcHRpb25zO3QucHJvcHMmJmZ1bmN0aW9uKGUsdCl7dmFyIG49ZS4kb3B0aW9ucy5wcm9wc0RhdGF8fHt9LHI9ZS5fcHJvcHM9e30saT1lLiRvcHRpb25zLl9wcm9wS2V5cz1bXTtlLiRwYXJlbnQmJiRlKCExKTt2YXIgbz1mdW5jdGlvbihvKXtpLnB1c2gobyk7dmFyIGE9TWUobyx0LG4sZSk7eGUocixvLGEpLG8gaW4gZXx8ZG4oZSxcIl9wcm9wc1wiLG8pfTtmb3IodmFyIGEgaW4gdClvKGEpOyRlKCEwKX0oZSx0LnByb3BzKSx0Lm1ldGhvZHMmJmZ1bmN0aW9uKGUsdCl7ZS4kb3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdCllW25dPVwiZnVuY3Rpb25cIiE9dHlwZW9mIHRbbl0/Uzp4KHRbbl0sZSl9KGUsdC5tZXRob2RzKSx0LmRhdGE/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO3ModD1lLl9kYXRhPVwiZnVuY3Rpb25cIj09dHlwZW9mIHQ/ZnVuY3Rpb24oZSx0KXtsZSgpO3RyeXtyZXR1cm4gZS5jYWxsKHQsdCl9Y2F0Y2goZSl7cmV0dXJuIFJlKGUsdCxcImRhdGEoKVwiKSx7fX1maW5hbGx5e2ZlKCl9fSh0LGUpOnR8fHt9KXx8KHQ9e30pO3ZhciBuPU9iamVjdC5rZXlzKHQpLHI9ZS4kb3B0aW9ucy5wcm9wcyxpPShlLiRvcHRpb25zLm1ldGhvZHMsbi5sZW5ndGgpO2Zvcig7aS0tOyl7dmFyIG89bltpXTtyJiZ5KHIsbyl8fChhPXZvaWQgMCwzNiE9PShhPShvK1wiXCIpLmNoYXJDb2RlQXQoMCkpJiY5NSE9PWEmJmRuKGUsXCJfZGF0YVwiLG8pKX12YXIgYTtDZSh0LCEwKX0oZSk6Q2UoZS5fZGF0YT17fSwhMCksdC5jb21wdXRlZCYmZnVuY3Rpb24oZSx0KXt2YXIgbj1lLl9jb21wdXRlZFdhdGNoZXJzPU9iamVjdC5jcmVhdGUobnVsbCkscj10ZSgpO2Zvcih2YXIgaSBpbiB0KXt2YXIgbz10W2ldLGE9XCJmdW5jdGlvblwiPT10eXBlb2Ygbz9vOm8uZ2V0O3J8fChuW2ldPW5ldyBmbihlLGF8fFMsUyxobikpLGkgaW4gZXx8bW4oZSxpLG8pfX0oZSx0LmNvbXB1dGVkKSx0LndhdGNoJiZ0LndhdGNoIT09WSYmZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTtpZihBcnJheS5pc0FycmF5KHIpKWZvcih2YXIgaT0wO2k8ci5sZW5ndGg7aSsrKV9uKGUsbixyW2ldKTtlbHNlIF9uKGUsbixyKX19KGUsdC53YXRjaCl9dmFyIGhuPXtsYXp5OiEwfTtmdW5jdGlvbiBtbihlLHQsbil7dmFyIHI9IXRlKCk7XCJmdW5jdGlvblwiPT10eXBlb2Ygbj8ocG4uZ2V0PXI/eW4odCk6Z24obikscG4uc2V0PVMpOihwbi5nZXQ9bi5nZXQ/ciYmITEhPT1uLmNhY2hlP3luKHQpOmduKG4uZ2V0KTpTLHBuLnNldD1uLnNldHx8UyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxwbil9ZnVuY3Rpb24geW4oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29tcHV0ZWRXYXRjaGVycyYmdGhpcy5fY29tcHV0ZWRXYXRjaGVyc1tlXTtpZih0KXJldHVybiB0LmRpcnR5JiZ0LmV2YWx1YXRlKCksY2UudGFyZ2V0JiZ0LmRlcGVuZCgpLHQudmFsdWV9fWZ1bmN0aW9uIGduKGUpe3JldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmNhbGwodGhpcyx0aGlzKX19ZnVuY3Rpb24gX24oZSx0LG4scil7cmV0dXJuIHMobikmJihyPW4sbj1uLmhhbmRsZXIpLFwic3RyaW5nXCI9PXR5cGVvZiBuJiYobj1lW25dKSxlLiR3YXRjaCh0LG4scil9dmFyIGJuPTA7ZnVuY3Rpb24gJG4oZSl7dmFyIHQ9ZS5vcHRpb25zO2lmKGUuc3VwZXIpe3ZhciBuPSRuKGUuc3VwZXIpO2lmKG4hPT1lLnN1cGVyT3B0aW9ucyl7ZS5zdXBlck9wdGlvbnM9bjt2YXIgcj1mdW5jdGlvbihlKXt2YXIgdCxuPWUub3B0aW9ucyxyPWUuc2VhbGVkT3B0aW9ucztmb3IodmFyIGkgaW4gbiluW2ldIT09cltpXSYmKHR8fCh0PXt9KSx0W2ldPW5baV0pO3JldHVybiB0fShlKTtyJiZBKGUuZXh0ZW5kT3B0aW9ucyxyKSwodD1lLm9wdGlvbnM9RGUobixlLmV4dGVuZE9wdGlvbnMpKS5uYW1lJiYodC5jb21wb25lbnRzW3QubmFtZV09ZSl9fXJldHVybiB0fWZ1bmN0aW9uIHduKGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24gQ24oZSl7ZS5jaWQ9MDt2YXIgdD0xO2UuZXh0ZW5kPWZ1bmN0aW9uKGUpe2U9ZXx8e307dmFyIG49dGhpcyxyPW4uY2lkLGk9ZS5fQ3Rvcnx8KGUuX0N0b3I9e30pO2lmKGlbcl0pcmV0dXJuIGlbcl07dmFyIG89ZS5uYW1lfHxuLm9wdGlvbnMubmFtZSxhPWZ1bmN0aW9uKGUpe3RoaXMuX2luaXQoZSl9O3JldHVybihhLnByb3RvdHlwZT1PYmplY3QuY3JlYXRlKG4ucHJvdG90eXBlKSkuY29uc3RydWN0b3I9YSxhLmNpZD10KyssYS5vcHRpb25zPURlKG4ub3B0aW9ucyxlKSxhLnN1cGVyPW4sYS5vcHRpb25zLnByb3BzJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpZG4oZS5wcm90b3R5cGUsXCJfcHJvcHNcIixuKX0oYSksYS5vcHRpb25zLmNvbXB1dGVkJiZmdW5jdGlvbihlKXt2YXIgdD1lLm9wdGlvbnMuY29tcHV0ZWQ7Zm9yKHZhciBuIGluIHQpbW4oZS5wcm90b3R5cGUsbix0W25dKX0oYSksYS5leHRlbmQ9bi5leHRlbmQsYS5taXhpbj1uLm1peGluLGEudXNlPW4udXNlLE0uZm9yRWFjaChmdW5jdGlvbihlKXthW2VdPW5bZV19KSxvJiYoYS5vcHRpb25zLmNvbXBvbmVudHNbb109YSksYS5zdXBlck9wdGlvbnM9bi5vcHRpb25zLGEuZXh0ZW5kT3B0aW9ucz1lLGEuc2VhbGVkT3B0aW9ucz1BKHt9LGEub3B0aW9ucyksaVtyXT1hLGF9fWZ1bmN0aW9uIHhuKGUpe3JldHVybiBlJiYoZS5DdG9yLm9wdGlvbnMubmFtZXx8ZS50YWcpfWZ1bmN0aW9uIGtuKGUsdCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZS5pbmRleE9mKHQpPi0xOlwic3RyaW5nXCI9PXR5cGVvZiBlP2Uuc3BsaXQoXCIsXCIpLmluZGV4T2YodCk+LTE6KG49ZSxcIltvYmplY3QgUmVnRXhwXVwiPT09YS5jYWxsKG4pJiZlLnRlc3QodCkpO3ZhciBufWZ1bmN0aW9uIEFuKGUsdCl7dmFyIG49ZS5jYWNoZSxyPWUua2V5cyxpPWUuX3Zub2RlO2Zvcih2YXIgbyBpbiBuKXt2YXIgYT1uW29dO2lmKGEpe3ZhciBzPXhuKGEuY29tcG9uZW50T3B0aW9ucyk7cyYmIXQocykmJk9uKG4sbyxyLGkpfX19ZnVuY3Rpb24gT24oZSx0LG4scil7dmFyIGk9ZVt0XTshaXx8ciYmaS50YWc9PT1yLnRhZ3x8aS5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpLGVbdF09bnVsbCxoKG4sdCl9IWZ1bmN0aW9uKHQpe3QucHJvdG90eXBlLl9pbml0PWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXM7bi5fdWlkPWJuKyssbi5faXNWdWU9ITAsdCYmdC5faXNDb21wb25lbnQ/ZnVuY3Rpb24oZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50LG4uX3BhcmVudFZub2RlPXI7dmFyIGk9ci5jb21wb25lbnRPcHRpb25zO24ucHJvcHNEYXRhPWkucHJvcHNEYXRhLG4uX3BhcmVudExpc3RlbmVycz1pLmxpc3RlbmVycyxuLl9yZW5kZXJDaGlsZHJlbj1pLmNoaWxkcmVuLG4uX2NvbXBvbmVudFRhZz1pLnRhZyx0LnJlbmRlciYmKG4ucmVuZGVyPXQucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zKX0obix0KTpuLiRvcHRpb25zPURlKCRuKG4uY29uc3RydWN0b3IpLHR8fHt9LG4pLG4uX3JlbmRlclByb3h5PW4sbi5fc2VsZj1uLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMsbj10LnBhcmVudDtpZihuJiYhdC5hYnN0cmFjdCl7Zm9yKDtuLiRvcHRpb25zLmFic3RyYWN0JiZuLiRwYXJlbnQ7KW49bi4kcGFyZW50O24uJGNoaWxkcmVuLnB1c2goZSl9ZS4kcGFyZW50PW4sZS4kcm9vdD1uP24uJHJvb3Q6ZSxlLiRjaGlsZHJlbj1bXSxlLiRyZWZzPXt9LGUuX3dhdGNoZXI9bnVsbCxlLl9pbmFjdGl2ZT1udWxsLGUuX2RpcmVjdEluYWN0aXZlPSExLGUuX2lzTW91bnRlZD0hMSxlLl9pc0Rlc3Ryb3llZD0hMSxlLl9pc0JlaW5nRGVzdHJveWVkPSExfShuKSxmdW5jdGlvbihlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJnF0KGUsdCl9KG4pLGZ1bmN0aW9uKHQpe3QuX3Zub2RlPW51bGwsdC5fc3RhdGljVHJlZXM9bnVsbDt2YXIgbj10LiRvcHRpb25zLHI9dC4kdm5vZGU9bi5fcGFyZW50Vm5vZGUsaT1yJiZyLmNvbnRleHQ7dC4kc2xvdHM9dXQobi5fcmVuZGVyQ2hpbGRyZW4saSksdC4kc2NvcGVkU2xvdHM9ZSx0Ll9jPWZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiBQdCh0LGUsbixyLGksITEpfSx0LiRjcmVhdGVFbGVtZW50PWZ1bmN0aW9uKGUsbixyLGkpe3JldHVybiBQdCh0LGUsbixyLGksITApfTt2YXIgbz1yJiZyLmRhdGE7eGUodCxcIiRhdHRyc1wiLG8mJm8uYXR0cnN8fGUsbnVsbCwhMCkseGUodCxcIiRsaXN0ZW5lcnNcIixuLl9wYXJlbnRMaXN0ZW5lcnN8fGUsbnVsbCwhMCl9KG4pLFl0KG4sXCJiZWZvcmVDcmVhdGVcIiksZnVuY3Rpb24oZSl7dmFyIHQ9Y3QoZS4kb3B0aW9ucy5pbmplY3QsZSk7dCYmKCRlKCExKSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe3hlKGUsbix0W25dKX0pLCRlKCEwKSl9KG4pLHZuKG4pLGZ1bmN0aW9uKGUpe3ZhciB0PWUuJG9wdGlvbnMucHJvdmlkZTt0JiYoZS5fcHJvdmlkZWQ9XCJmdW5jdGlvblwiPT10eXBlb2YgdD90LmNhbGwoZSk6dCl9KG4pLFl0KG4sXCJjcmVhdGVkXCIpLG4uJG9wdGlvbnMuZWwmJm4uJG1vdW50KG4uJG9wdGlvbnMuZWwpfX0od24pLGZ1bmN0aW9uKGUpe3ZhciB0PXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX19LG49e2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wc319O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSxcIiRkYXRhXCIsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLFwiJHByb3BzXCIsbiksZS5wcm90b3R5cGUuJHNldD1rZSxlLnByb3RvdHlwZS4kZGVsZXRlPUFlLGUucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7aWYocyh0KSlyZXR1cm4gX24odGhpcyxlLHQsbik7KG49bnx8e30pLnVzZXI9ITA7dmFyIHI9bmV3IGZuKHRoaXMsZSx0LG4pO2lmKG4uaW1tZWRpYXRlKXRyeXt0LmNhbGwodGhpcyxyLnZhbHVlKX1jYXRjaChlKXtSZShlLHRoaXMsJ2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciBcIicrci5leHByZXNzaW9uKydcIicpfXJldHVybiBmdW5jdGlvbigpe3IudGVhcmRvd24oKX19fSh3biksZnVuY3Rpb24oZSl7dmFyIHQ9L15ob29rOi87ZS5wcm90b3R5cGUuJG9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcztpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgaT0wLG89ZS5sZW5ndGg7aTxvO2krKylyLiRvbihlW2ldLG4pO2Vsc2Uoci5fZXZlbnRzW2VdfHwoci5fZXZlbnRzW2VdPVtdKSkucHVzaChuKSx0LnRlc3QoZSkmJihyLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiByfSxlLnByb3RvdHlwZS4kb25jZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXM7ZnVuY3Rpb24gcigpe24uJG9mZihlLHIpLHQuYXBwbHkobixhcmd1bWVudHMpfXJldHVybiByLmZuPXQsbi4kb24oZSxyKSxufSxlLnByb3RvdHlwZS4kb2ZmPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbi5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksbjtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbi4kb2ZmKGVbcl0sdCk7cmV0dXJuIG59dmFyIG8sYT1uLl9ldmVudHNbZV07aWYoIWEpcmV0dXJuIG47aWYoIXQpcmV0dXJuIG4uX2V2ZW50c1tlXT1udWxsLG47Zm9yKHZhciBzPWEubGVuZ3RoO3MtLTspaWYoKG89YVtzXSk9PT10fHxvLmZuPT09dCl7YS5zcGxpY2UocywxKTticmVha31yZXR1cm4gbn0sZS5wcm90b3R5cGUuJGVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5fZXZlbnRzW2VdO2lmKHQpe3Q9dC5sZW5ndGg+MT9rKHQpOnQ7Zm9yKHZhciBuPWsoYXJndW1lbnRzLDEpLHI9J2V2ZW50IGhhbmRsZXIgZm9yIFwiJytlKydcIicsaT0wLG89dC5sZW5ndGg7aTxvO2krKylIZSh0W2ldLHRoaXMsbix0aGlzLHIpfXJldHVybiB0aGlzfX0od24pLGZ1bmN0aW9uKGUpe2UucHJvdG90eXBlLl91cGRhdGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj10aGlzLHI9bi4kZWwsaT1uLl92bm9kZSxvPVp0KG4pO24uX3Zub2RlPWUsbi4kZWw9aT9uLl9fcGF0Y2hfXyhpLGUpOm4uX19wYXRjaF9fKG4uJGVsLGUsdCwhMSksbygpLHImJihyLl9fdnVlX189bnVsbCksbi4kZWwmJihuLiRlbC5fX3Z1ZV9fPW4pLG4uJHZub2RlJiZuLiRwYXJlbnQmJm4uJHZub2RlPT09bi4kcGFyZW50Ll92bm9kZSYmKG4uJHBhcmVudC4kZWw9bi4kZWwpfSxlLnByb3RvdHlwZS4kZm9yY2VVcGRhdGU9ZnVuY3Rpb24oKXt0aGlzLl93YXRjaGVyJiZ0aGlzLl93YXRjaGVyLnVwZGF0ZSgpfSxlLnByb3RvdHlwZS4kZGVzdHJveT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYoIWUuX2lzQmVpbmdEZXN0cm95ZWQpe1l0KGUsXCJiZWZvcmVEZXN0cm95XCIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHxoKHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLFl0KGUsXCJkZXN0cm95ZWRcIiksZS4kb2ZmKCksZS4kZWwmJihlLiRlbC5fX3Z1ZV9fPW51bGwpLGUuJHZub2RlJiYoZS4kdm5vZGUucGFyZW50PW51bGwpfX19KHduKSxmdW5jdGlvbihlKXtTdChlLnByb3RvdHlwZSksZS5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKGUpe3JldHVybiBZZShlLHRoaXMpfSxlLnByb3RvdHlwZS5fcmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGUsdD10aGlzLG49dC4kb3B0aW9ucyxyPW4ucmVuZGVyLGk9bi5fcGFyZW50Vm5vZGU7aSYmKHQuJHNjb3BlZFNsb3RzPWZ0KGkuZGF0YS5zY29wZWRTbG90cyx0LiRzbG90cyx0LiRzY29wZWRTbG90cykpLHQuJHZub2RlPWk7dHJ5e0h0PXQsZT1yLmNhbGwodC5fcmVuZGVyUHJveHksdC4kY3JlYXRlRWxlbWVudCl9Y2F0Y2gobil7UmUobix0LFwicmVuZGVyXCIpLGU9dC5fdm5vZGV9ZmluYWxseXtIdD1udWxsfXJldHVybiBBcnJheS5pc0FycmF5KGUpJiYxPT09ZS5sZW5ndGgmJihlPWVbMF0pLGUgaW5zdGFuY2VvZiBwZXx8KGU9dmUoKSksZS5wYXJlbnQ9aSxlfX0od24pO3ZhciBTbj1bU3RyaW5nLFJlZ0V4cCxBcnJheV0sVG49e0tlZXBBbGl2ZTp7bmFtZTpcImtlZXAtYWxpdmVcIixhYnN0cmFjdDohMCxwcm9wczp7aW5jbHVkZTpTbixleGNsdWRlOlNuLG1heDpbU3RyaW5nLE51bWJlcl19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5rZXlzPVtdfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtmb3IodmFyIGUgaW4gdGhpcy5jYWNoZSlPbih0aGlzLmNhY2hlLGUsdGhpcy5rZXlzKX0sbW91bnRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7dGhpcy4kd2F0Y2goXCJpbmNsdWRlXCIsZnVuY3Rpb24odCl7QW4oZSxmdW5jdGlvbihlKXtyZXR1cm4ga24odCxlKX0pfSksdGhpcy4kd2F0Y2goXCJleGNsdWRlXCIsZnVuY3Rpb24odCl7QW4oZSxmdW5jdGlvbihlKXtyZXR1cm4ha24odCxlKX0pfSl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNsb3RzLmRlZmF1bHQsdD16dChlKSxuPXQmJnQuY29tcG9uZW50T3B0aW9ucztpZihuKXt2YXIgcj14bihuKSxpPXRoaXMuaW5jbHVkZSxvPXRoaXMuZXhjbHVkZTtpZihpJiYoIXJ8fCFrbihpLHIpKXx8byYmciYma24obyxyKSlyZXR1cm4gdDt2YXIgYT10aGlzLmNhY2hlLHM9dGhpcy5rZXlzLGM9bnVsbD09dC5rZXk/bi5DdG9yLmNpZCsobi50YWc/XCI6OlwiK24udGFnOlwiXCIpOnQua2V5O2FbY10/KHQuY29tcG9uZW50SW5zdGFuY2U9YVtjXS5jb21wb25lbnRJbnN0YW5jZSxoKHMsYykscy5wdXNoKGMpKTooYVtjXT10LHMucHVzaChjKSx0aGlzLm1heCYmcy5sZW5ndGg+cGFyc2VJbnQodGhpcy5tYXgpJiZPbihhLHNbMF0scyx0aGlzLl92bm9kZSkpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fX07IWZ1bmN0aW9uKGUpe3ZhciB0PXtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gRn19O09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLFwiY29uZmlnXCIsdCksZS51dGlsPXt3YXJuOmFlLGV4dGVuZDpBLG1lcmdlT3B0aW9uczpEZSxkZWZpbmVSZWFjdGl2ZTp4ZX0sZS5zZXQ9a2UsZS5kZWxldGU9QWUsZS5uZXh0VGljaz1ZZSxlLm9ic2VydmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIENlKGUpLGV9LGUub3B0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpLE0uZm9yRWFjaChmdW5jdGlvbih0KXtlLm9wdGlvbnNbdCtcInNcIl09T2JqZWN0LmNyZWF0ZShudWxsKX0pLGUub3B0aW9ucy5fYmFzZT1lLEEoZS5vcHRpb25zLmNvbXBvbmVudHMsVG4pLGZ1bmN0aW9uKGUpe2UudXNlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuX2luc3RhbGxlZFBsdWdpbnN8fCh0aGlzLl9pbnN0YWxsZWRQbHVnaW5zPVtdKTtpZih0LmluZGV4T2YoZSk+LTEpcmV0dXJuIHRoaXM7dmFyIG49ayhhcmd1bWVudHMsMSk7cmV0dXJuIG4udW5zaGlmdCh0aGlzKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBlLmluc3RhbGw/ZS5pbnN0YWxsLmFwcGx5KGUsbik6XCJmdW5jdGlvblwiPT10eXBlb2YgZSYmZS5hcHBseShudWxsLG4pLHQucHVzaChlKSx0aGlzfX0oZSksZnVuY3Rpb24oZSl7ZS5taXhpbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zPURlKHRoaXMub3B0aW9ucyxlKSx0aGlzfX0oZSksQ24oZSksZnVuY3Rpb24oZSl7TS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2VbdF09ZnVuY3Rpb24oZSxuKXtyZXR1cm4gbj8oXCJjb21wb25lbnRcIj09PXQmJnMobikmJihuLm5hbWU9bi5uYW1lfHxlLG49dGhpcy5vcHRpb25zLl9iYXNlLmV4dGVuZChuKSksXCJkaXJlY3RpdmVcIj09PXQmJlwiZnVuY3Rpb25cIj09dHlwZW9mIG4mJihuPXtiaW5kOm4sdXBkYXRlOm59KSx0aGlzLm9wdGlvbnNbdCtcInNcIl1bZV09bixuKTp0aGlzLm9wdGlvbnNbdCtcInNcIl1bZV19fSl9KGUpfSh3biksT2JqZWN0LmRlZmluZVByb3BlcnR5KHduLnByb3RvdHlwZSxcIiRpc1NlcnZlclwiLHtnZXQ6dGV9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkod24ucHJvdG90eXBlLFwiJHNzckNvbnRleHRcIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh3bixcIkZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0XCIse3ZhbHVlOlR0fSksd24udmVyc2lvbj1cIjIuNi4xMVwiO3ZhciBFbj1wKFwic3R5bGUsY2xhc3NcIiksTm49cChcImlucHV0LHRleHRhcmVhLG9wdGlvbixzZWxlY3QscHJvZ3Jlc3NcIiksam49ZnVuY3Rpb24oZSx0LG4pe3JldHVyblwidmFsdWVcIj09PW4mJk5uKGUpJiZcImJ1dHRvblwiIT09dHx8XCJzZWxlY3RlZFwiPT09biYmXCJvcHRpb25cIj09PWV8fFwiY2hlY2tlZFwiPT09biYmXCJpbnB1dFwiPT09ZXx8XCJtdXRlZFwiPT09biYmXCJ2aWRlb1wiPT09ZX0sRG49cChcImNvbnRlbnRlZGl0YWJsZSxkcmFnZ2FibGUsc3BlbGxjaGVja1wiKSxMbj1wKFwiZXZlbnRzLGNhcmV0LHR5cGluZyxwbGFpbnRleHQtb25seVwiKSxNbj1mdW5jdGlvbihlLHQpe3JldHVybiBIbih0KXx8XCJmYWxzZVwiPT09dD9cImZhbHNlXCI6XCJjb250ZW50ZWRpdGFibGVcIj09PWUmJkxuKHQpP3Q6XCJ0cnVlXCJ9LEluPXAoXCJhbGxvd2Z1bGxzY3JlZW4sYXN5bmMsYXV0b2ZvY3VzLGF1dG9wbGF5LGNoZWNrZWQsY29tcGFjdCxjb250cm9scyxkZWNsYXJlLGRlZmF1bHQsZGVmYXVsdGNoZWNrZWQsZGVmYXVsdG11dGVkLGRlZmF1bHRzZWxlY3RlZCxkZWZlcixkaXNhYmxlZCxlbmFibGVkLGZvcm1ub3ZhbGlkYXRlLGhpZGRlbixpbmRldGVybWluYXRlLGluZXJ0LGlzbWFwLGl0ZW1zY29wZSxsb29wLG11bHRpcGxlLG11dGVkLG5vaHJlZixub3Jlc2l6ZSxub3NoYWRlLG5vdmFsaWRhdGUsbm93cmFwLG9wZW4scGF1c2VvbmV4aXQscmVhZG9ubHkscmVxdWlyZWQscmV2ZXJzZWQsc2NvcGVkLHNlYW1sZXNzLHNlbGVjdGVkLHNvcnRhYmxlLHRyYW5zbGF0ZSx0cnVlc3BlZWQsdHlwZW11c3RtYXRjaCx2aXNpYmxlXCIpLEZuPVwiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGlua1wiLFBuPWZ1bmN0aW9uKGUpe3JldHVyblwiOlwiPT09ZS5jaGFyQXQoNSkmJlwieGxpbmtcIj09PWUuc2xpY2UoMCw1KX0sUm49ZnVuY3Rpb24oZSl7cmV0dXJuIFBuKGUpP2Uuc2xpY2UoNixlLmxlbmd0aCk6XCJcIn0sSG49ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWV8fCExPT09ZX07ZnVuY3Rpb24gQm4oZSl7Zm9yKHZhciB0PWUuZGF0YSxyPWUsaT1lO24oaS5jb21wb25lbnRJbnN0YW5jZSk7KShpPWkuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmaS5kYXRhJiYodD1VbihpLmRhdGEsdCkpO2Zvcig7bihyPXIucGFyZW50KTspciYmci5kYXRhJiYodD1Vbih0LHIuZGF0YSkpO3JldHVybiBmdW5jdGlvbihlLHQpe2lmKG4oZSl8fG4odCkpcmV0dXJuIHpuKGUsVm4odCkpO3JldHVyblwiXCJ9KHQuc3RhdGljQ2xhc3MsdC5jbGFzcyl9ZnVuY3Rpb24gVW4oZSx0KXtyZXR1cm57c3RhdGljQ2xhc3M6em4oZS5zdGF0aWNDbGFzcyx0LnN0YXRpY0NsYXNzKSxjbGFzczpuKGUuY2xhc3MpP1tlLmNsYXNzLHQuY2xhc3NdOnQuY2xhc3N9fWZ1bmN0aW9uIHpuKGUsdCl7cmV0dXJuIGU/dD9lK1wiIFwiK3Q6ZTp0fHxcIlwifWZ1bmN0aW9uIFZuKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP2Z1bmN0aW9uKGUpe2Zvcih2YXIgdCxyPVwiXCIsaT0wLG89ZS5sZW5ndGg7aTxvO2krKyluKHQ9Vm4oZVtpXSkpJiZcIlwiIT09dCYmKHImJihyKz1cIiBcIikscis9dCk7cmV0dXJuIHJ9KGUpOm8oZSk/ZnVuY3Rpb24oZSl7dmFyIHQ9XCJcIjtmb3IodmFyIG4gaW4gZSllW25dJiYodCYmKHQrPVwiIFwiKSx0Kz1uKTtyZXR1cm4gdH0oZSk6XCJzdHJpbmdcIj09dHlwZW9mIGU/ZTpcIlwifXZhciBLbj17c3ZnOlwiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmdcIixtYXRoOlwiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTFwifSxKbj1wKFwiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3RcIikscW49cChcInN2ZyxhbmltYXRlLGNpcmNsZSxjbGlwcGF0aCxjdXJzb3IsZGVmcyxkZXNjLGVsbGlwc2UsZmlsdGVyLGZvbnQtZmFjZSxmb3JlaWduT2JqZWN0LGcsZ2x5cGgsaW1hZ2UsbGluZSxtYXJrZXIsbWFzayxtaXNzaW5nLWdseXBoLHBhdGgscGF0dGVybixwb2x5Z29uLHBvbHlsaW5lLHJlY3Qsc3dpdGNoLHN5bWJvbCx0ZXh0LHRleHRwYXRoLHRzcGFuLHVzZSx2aWV3XCIsITApLFduPWZ1bmN0aW9uKGUpe3JldHVybiBKbihlKXx8cW4oZSl9O2Z1bmN0aW9uIFpuKGUpe3JldHVybiBxbihlKT9cInN2Z1wiOlwibWF0aFwiPT09ZT9cIm1hdGhcIjp2b2lkIDB9dmFyIEduPU9iamVjdC5jcmVhdGUobnVsbCk7dmFyIFhuPXAoXCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybFwiKTtmdW5jdGlvbiBZbihlKXtpZihcInN0cmluZ1wiPT10eXBlb2YgZSl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKTtyZXR1cm4gdHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKX1yZXR1cm4gZX12YXIgUW49T2JqZWN0LmZyZWV6ZSh7Y3JlYXRlRWxlbWVudDpmdW5jdGlvbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuXCJzZWxlY3RcIiE9PWU/bjoodC5kYXRhJiZ0LmRhdGEuYXR0cnMmJnZvaWQgMCE9PXQuZGF0YS5hdHRycy5tdWx0aXBsZSYmbi5zZXRBdHRyaWJ1dGUoXCJtdWx0aXBsZVwiLFwibXVsdGlwbGVcIiksbil9LGNyZWF0ZUVsZW1lbnROUzpmdW5jdGlvbihlLHQpe3JldHVybiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoS25bZV0sdCl9LGNyZWF0ZVRleHROb2RlOmZ1bmN0aW9uKGUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKX0sY3JlYXRlQ29tbWVudDpmdW5jdGlvbihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChlKX0saW5zZXJ0QmVmb3JlOmZ1bmN0aW9uKGUsdCxuKXtlLmluc2VydEJlZm9yZSh0LG4pfSxyZW1vdmVDaGlsZDpmdW5jdGlvbihlLHQpe2UucmVtb3ZlQ2hpbGQodCl9LGFwcGVuZENoaWxkOmZ1bmN0aW9uKGUsdCl7ZS5hcHBlbmRDaGlsZCh0KX0scGFyZW50Tm9kZTpmdW5jdGlvbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlfSxuZXh0U2libGluZzpmdW5jdGlvbihlKXtyZXR1cm4gZS5uZXh0U2libGluZ30sdGFnTmFtZTpmdW5jdGlvbihlKXtyZXR1cm4gZS50YWdOYW1lfSxzZXRUZXh0Q29udGVudDpmdW5jdGlvbihlLHQpe2UudGV4dENvbnRlbnQ9dH0sc2V0U3R5bGVTY29wZTpmdW5jdGlvbihlLHQpe2Uuc2V0QXR0cmlidXRlKHQsXCJcIil9fSksZXI9e2NyZWF0ZTpmdW5jdGlvbihlLHQpe3RyKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKHRyKGUsITApLHRyKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXt0cihlLCEwKX19O2Z1bmN0aW9uIHRyKGUsdCl7dmFyIHI9ZS5kYXRhLnJlZjtpZihuKHIpKXt2YXIgaT1lLmNvbnRleHQsbz1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxhPWkuJHJlZnM7dD9BcnJheS5pc0FycmF5KGFbcl0pP2goYVtyXSxvKTphW3JdPT09byYmKGFbcl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShhW3JdKT9hW3JdLmluZGV4T2Yobyk8MCYmYVtyXS5wdXNoKG8pOmFbcl09W29dOmFbcl09b319dmFyIG5yPW5ldyBwZShcIlwiLHt9LFtdKSxycj1bXCJjcmVhdGVcIixcImFjdGl2YXRlXCIsXCJ1cGRhdGVcIixcInJlbW92ZVwiLFwiZGVzdHJveVwiXTtmdW5jdGlvbiBpcihlLGkpe3JldHVybiBlLmtleT09PWkua2V5JiYoZS50YWc9PT1pLnRhZyYmZS5pc0NvbW1lbnQ9PT1pLmlzQ29tbWVudCYmbihlLmRhdGEpPT09bihpLmRhdGEpJiZmdW5jdGlvbihlLHQpe2lmKFwiaW5wdXRcIiE9PWUudGFnKXJldHVybiEwO3ZhciByLGk9bihyPWUuZGF0YSkmJm4ocj1yLmF0dHJzKSYmci50eXBlLG89bihyPXQuZGF0YSkmJm4ocj1yLmF0dHJzKSYmci50eXBlO3JldHVybiBpPT09b3x8WG4oaSkmJlhuKG8pfShlLGkpfHxyKGUuaXNBc3luY1BsYWNlaG9sZGVyKSYmZS5hc3luY0ZhY3Rvcnk9PT1pLmFzeW5jRmFjdG9yeSYmdChpLmFzeW5jRmFjdG9yeS5lcnJvcikpfWZ1bmN0aW9uIG9yKGUsdCxyKXt2YXIgaSxvLGE9e307Zm9yKGk9dDtpPD1yOysraSluKG89ZVtpXS5rZXkpJiYoYVtvXT1pKTtyZXR1cm4gYX12YXIgYXI9e2NyZWF0ZTpzcix1cGRhdGU6c3IsZGVzdHJveTpmdW5jdGlvbihlKXtzcihlLG5yKX19O2Z1bmN0aW9uIHNyKGUsdCl7KGUuZGF0YS5kaXJlY3RpdmVzfHx0LmRhdGEuZGlyZWN0aXZlcykmJmZ1bmN0aW9uKGUsdCl7dmFyIG4scixpLG89ZT09PW5yLGE9dD09PW5yLHM9dXIoZS5kYXRhLmRpcmVjdGl2ZXMsZS5jb250ZXh0KSxjPXVyKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksdT1bXSxsPVtdO2ZvcihuIGluIGMpcj1zW25dLGk9Y1tuXSxyPyhpLm9sZFZhbHVlPXIudmFsdWUsaS5vbGRBcmc9ci5hcmcsZnIoaSxcInVwZGF0ZVwiLHQsZSksaS5kZWYmJmkuZGVmLmNvbXBvbmVudFVwZGF0ZWQmJmwucHVzaChpKSk6KGZyKGksXCJiaW5kXCIsdCxlKSxpLmRlZiYmaS5kZWYuaW5zZXJ0ZWQmJnUucHVzaChpKSk7aWYodS5sZW5ndGgpe3ZhciBmPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTA7bjx1Lmxlbmd0aDtuKyspZnIodVtuXSxcImluc2VydGVkXCIsdCxlKX07bz9pdCh0LFwiaW5zZXJ0XCIsZik6ZigpfWwubGVuZ3RoJiZpdCh0LFwicG9zdHBhdGNoXCIsZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPGwubGVuZ3RoO24rKylmcihsW25dLFwiY29tcG9uZW50VXBkYXRlZFwiLHQsZSl9KTtpZighbylmb3IobiBpbiBzKWNbbl18fGZyKHNbbl0sXCJ1bmJpbmRcIixlLGUsYSl9KGUsdCl9dmFyIGNyPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24gdXIoZSx0KXt2YXIgbixyLGk9T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gaTtmb3Iobj0wO248ZS5sZW5ndGg7bisrKShyPWVbbl0pLm1vZGlmaWVyc3x8KHIubW9kaWZpZXJzPWNyKSxpW2xyKHIpXT1yLHIuZGVmPUxlKHQuJG9wdGlvbnMsXCJkaXJlY3RpdmVzXCIsci5uYW1lKTtyZXR1cm4gaX1mdW5jdGlvbiBscihlKXtyZXR1cm4gZS5yYXdOYW1lfHxlLm5hbWUrXCIuXCIrT2JqZWN0LmtleXMoZS5tb2RpZmllcnN8fHt9KS5qb2luKFwiLlwiKX1mdW5jdGlvbiBmcihlLHQsbixyLGkpe3ZhciBvPWUuZGVmJiZlLmRlZlt0XTtpZihvKXRyeXtvKG4uZWxtLGUsbixyLGkpfWNhdGNoKHIpe1JlKHIsbi5jb250ZXh0LFwiZGlyZWN0aXZlIFwiK2UubmFtZStcIiBcIit0K1wiIGhvb2tcIil9fXZhciBwcj1bZXIsYXJdO2Z1bmN0aW9uIGRyKGUscil7dmFyIGk9ci5jb21wb25lbnRPcHRpb25zO2lmKCEobihpKSYmITE9PT1pLkN0b3Iub3B0aW9ucy5pbmhlcml0QXR0cnN8fHQoZS5kYXRhLmF0dHJzKSYmdChyLmRhdGEuYXR0cnMpKSl7dmFyIG8sYSxzPXIuZWxtLGM9ZS5kYXRhLmF0dHJzfHx7fSx1PXIuZGF0YS5hdHRyc3x8e307Zm9yKG8gaW4gbih1Ll9fb2JfXykmJih1PXIuZGF0YS5hdHRycz1BKHt9LHUpKSx1KWE9dVtvXSxjW29dIT09YSYmdnIocyxvLGEpO2ZvcihvIGluKHF8fFopJiZ1LnZhbHVlIT09Yy52YWx1ZSYmdnIocyxcInZhbHVlXCIsdS52YWx1ZSksYyl0KHVbb10pJiYoUG4obyk/cy5yZW1vdmVBdHRyaWJ1dGVOUyhGbixSbihvKSk6RG4obyl8fHMucmVtb3ZlQXR0cmlidXRlKG8pKX19ZnVuY3Rpb24gdnIoZSx0LG4pe2UudGFnTmFtZS5pbmRleE9mKFwiLVwiKT4tMT9ocihlLHQsbik6SW4odCk/SG4obik/ZS5yZW1vdmVBdHRyaWJ1dGUodCk6KG49XCJhbGxvd2Z1bGxzY3JlZW5cIj09PXQmJlwiRU1CRURcIj09PWUudGFnTmFtZT9cInRydWVcIjp0LGUuc2V0QXR0cmlidXRlKHQsbikpOkRuKHQpP2Uuc2V0QXR0cmlidXRlKHQsTW4odCxuKSk6UG4odCk/SG4obik/ZS5yZW1vdmVBdHRyaWJ1dGVOUyhGbixSbih0KSk6ZS5zZXRBdHRyaWJ1dGVOUyhGbix0LG4pOmhyKGUsdCxuKX1mdW5jdGlvbiBocihlLHQsbil7aWYoSG4obikpZS5yZW1vdmVBdHRyaWJ1dGUodCk7ZWxzZXtpZihxJiYhVyYmXCJURVhUQVJFQVwiPT09ZS50YWdOYW1lJiZcInBsYWNlaG9sZGVyXCI9PT10JiZcIlwiIT09biYmIWUuX19pZXBoKXt2YXIgcj1mdW5jdGlvbih0KXt0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihcImlucHV0XCIscil9O2UuYWRkRXZlbnRMaXN0ZW5lcihcImlucHV0XCIsciksZS5fX2llcGg9ITB9ZS5zZXRBdHRyaWJ1dGUodCxuKX19dmFyIG1yPXtjcmVhdGU6ZHIsdXBkYXRlOmRyfTtmdW5jdGlvbiB5cihlLHIpe3ZhciBpPXIuZWxtLG89ci5kYXRhLGE9ZS5kYXRhO2lmKCEodChvLnN0YXRpY0NsYXNzKSYmdChvLmNsYXNzKSYmKHQoYSl8fHQoYS5zdGF0aWNDbGFzcykmJnQoYS5jbGFzcykpKSl7dmFyIHM9Qm4ociksYz1pLl90cmFuc2l0aW9uQ2xhc3NlcztuKGMpJiYocz16bihzLFZuKGMpKSkscyE9PWkuX3ByZXZDbGFzcyYmKGkuc2V0QXR0cmlidXRlKFwiY2xhc3NcIixzKSxpLl9wcmV2Q2xhc3M9cyl9fXZhciBncixfcixiciwkcix3cixDcix4cj17Y3JlYXRlOnlyLHVwZGF0ZTp5cn0sa3I9L1tcXHcpLitcXC1fJFxcXV0vO2Z1bmN0aW9uIEFyKGUpe3ZhciB0LG4scixpLG8sYT0hMSxzPSExLGM9ITEsdT0hMSxsPTAsZj0wLHA9MCxkPTA7Zm9yKHI9MDtyPGUubGVuZ3RoO3IrKylpZihuPXQsdD1lLmNoYXJDb2RlQXQociksYSkzOT09PXQmJjkyIT09biYmKGE9ITEpO2Vsc2UgaWYocykzND09PXQmJjkyIT09biYmKHM9ITEpO2Vsc2UgaWYoYyk5Nj09PXQmJjkyIT09biYmKGM9ITEpO2Vsc2UgaWYodSk0Nz09PXQmJjkyIT09biYmKHU9ITEpO2Vsc2UgaWYoMTI0IT09dHx8MTI0PT09ZS5jaGFyQ29kZUF0KHIrMSl8fDEyND09PWUuY2hhckNvZGVBdChyLTEpfHxsfHxmfHxwKXtzd2l0Y2godCl7Y2FzZSAzNDpzPSEwO2JyZWFrO2Nhc2UgMzk6YT0hMDticmVhaztjYXNlIDk2OmM9ITA7YnJlYWs7Y2FzZSA0MDpwKys7YnJlYWs7Y2FzZSA0MTpwLS07YnJlYWs7Y2FzZSA5MTpmKys7YnJlYWs7Y2FzZSA5MzpmLS07YnJlYWs7Y2FzZSAxMjM6bCsrO2JyZWFrO2Nhc2UgMTI1OmwtLX1pZig0Nz09PXQpe2Zvcih2YXIgdj1yLTEsaD12b2lkIDA7dj49MCYmXCIgXCI9PT0oaD1lLmNoYXJBdCh2KSk7di0tKTtoJiZrci50ZXN0KGgpfHwodT0hMCl9fWVsc2Ugdm9pZCAwPT09aT8oZD1yKzEsaT1lLnNsaWNlKDAscikudHJpbSgpKTptKCk7ZnVuY3Rpb24gbSgpeyhvfHwobz1bXSkpLnB1c2goZS5zbGljZShkLHIpLnRyaW0oKSksZD1yKzF9aWYodm9pZCAwPT09aT9pPWUuc2xpY2UoMCxyKS50cmltKCk6MCE9PWQmJm0oKSxvKWZvcihyPTA7cjxvLmxlbmd0aDtyKyspaT1PcihpLG9bcl0pO3JldHVybiBpfWZ1bmN0aW9uIE9yKGUsdCl7dmFyIG49dC5pbmRleE9mKFwiKFwiKTtpZihuPDApcmV0dXJuJ19mKFwiJyt0KydcIikoJytlK1wiKVwiO3ZhciByPXQuc2xpY2UoMCxuKSxpPXQuc2xpY2UobisxKTtyZXR1cm4nX2YoXCInK3IrJ1wiKSgnK2UrKFwiKVwiIT09aT9cIixcIitpOmkpfWZ1bmN0aW9uIFNyKGUsdCl7Y29uc29sZS5lcnJvcihcIltWdWUgY29tcGlsZXJdOiBcIitlKX1mdW5jdGlvbiBUcihlLHQpe3JldHVybiBlP2UubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlW3RdfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSk6W119ZnVuY3Rpb24gRXIoZSx0LG4scixpKXsoZS5wcm9wc3x8KGUucHJvcHM9W10pKS5wdXNoKFJyKHtuYW1lOnQsdmFsdWU6bixkeW5hbWljOml9LHIpKSxlLnBsYWluPSExfWZ1bmN0aW9uIE5yKGUsdCxuLHIsaSl7KGk/ZS5keW5hbWljQXR0cnN8fChlLmR5bmFtaWNBdHRycz1bXSk6ZS5hdHRyc3x8KGUuYXR0cnM9W10pKS5wdXNoKFJyKHtuYW1lOnQsdmFsdWU6bixkeW5hbWljOml9LHIpKSxlLnBsYWluPSExfWZ1bmN0aW9uIGpyKGUsdCxuLHIpe2UuYXR0cnNNYXBbdF09bixlLmF0dHJzTGlzdC5wdXNoKFJyKHtuYW1lOnQsdmFsdWU6bn0scikpfWZ1bmN0aW9uIERyKGUsdCxuLHIsaSxvLGEscyl7KGUuZGlyZWN0aXZlc3x8KGUuZGlyZWN0aXZlcz1bXSkpLnB1c2goUnIoe25hbWU6dCxyYXdOYW1lOm4sdmFsdWU6cixhcmc6aSxpc0R5bmFtaWNBcmc6byxtb2RpZmllcnM6YX0scykpLGUucGxhaW49ITF9ZnVuY3Rpb24gTHIoZSx0LG4pe3JldHVybiBuP1wiX3AoXCIrdCsnLFwiJytlKydcIiknOmUrdH1mdW5jdGlvbiBNcih0LG4scixpLG8sYSxzLGMpe3ZhciB1OyhpPWl8fGUpLnJpZ2h0P2M/bj1cIihcIituK1wiKT09PSdjbGljayc/J2NvbnRleHRtZW51JzooXCIrbitcIilcIjpcImNsaWNrXCI9PT1uJiYobj1cImNvbnRleHRtZW51XCIsZGVsZXRlIGkucmlnaHQpOmkubWlkZGxlJiYoYz9uPVwiKFwiK24rXCIpPT09J2NsaWNrJz8nbW91c2V1cCc6KFwiK24rXCIpXCI6XCJjbGlja1wiPT09biYmKG49XCJtb3VzZXVwXCIpKSxpLmNhcHR1cmUmJihkZWxldGUgaS5jYXB0dXJlLG49THIoXCIhXCIsbixjKSksaS5vbmNlJiYoZGVsZXRlIGkub25jZSxuPUxyKFwiflwiLG4sYykpLGkucGFzc2l2ZSYmKGRlbGV0ZSBpLnBhc3NpdmUsbj1McihcIiZcIixuLGMpKSxpLm5hdGl2ZT8oZGVsZXRlIGkubmF0aXZlLHU9dC5uYXRpdmVFdmVudHN8fCh0Lm5hdGl2ZUV2ZW50cz17fSkpOnU9dC5ldmVudHN8fCh0LmV2ZW50cz17fSk7dmFyIGw9UnIoe3ZhbHVlOnIudHJpbSgpLGR5bmFtaWM6Y30scyk7aSE9PWUmJihsLm1vZGlmaWVycz1pKTt2YXIgZj11W25dO0FycmF5LmlzQXJyYXkoZik/bz9mLnVuc2hpZnQobCk6Zi5wdXNoKGwpOnVbbl09Zj9vP1tsLGZdOltmLGxdOmwsdC5wbGFpbj0hMX1mdW5jdGlvbiBJcihlLHQsbil7dmFyIHI9RnIoZSxcIjpcIit0KXx8RnIoZSxcInYtYmluZDpcIit0KTtpZihudWxsIT1yKXJldHVybiBBcihyKTtpZighMSE9PW4pe3ZhciBpPUZyKGUsdCk7aWYobnVsbCE9aSlyZXR1cm4gSlNPTi5zdHJpbmdpZnkoaSl9fWZ1bmN0aW9uIEZyKGUsdCxuKXt2YXIgcjtpZihudWxsIT0ocj1lLmF0dHJzTWFwW3RdKSlmb3IodmFyIGk9ZS5hdHRyc0xpc3Qsbz0wLGE9aS5sZW5ndGg7bzxhO28rKylpZihpW29dLm5hbWU9PT10KXtpLnNwbGljZShvLDEpO2JyZWFrfXJldHVybiBuJiZkZWxldGUgZS5hdHRyc01hcFt0XSxyfWZ1bmN0aW9uIFByKGUsdCl7Zm9yKHZhciBuPWUuYXR0cnNMaXN0LHI9MCxpPW4ubGVuZ3RoO3I8aTtyKyspe3ZhciBvPW5bcl07aWYodC50ZXN0KG8ubmFtZSkpcmV0dXJuIG4uc3BsaWNlKHIsMSksb319ZnVuY3Rpb24gUnIoZSx0KXtyZXR1cm4gdCYmKG51bGwhPXQuc3RhcnQmJihlLnN0YXJ0PXQuc3RhcnQpLG51bGwhPXQuZW5kJiYoZS5lbmQ9dC5lbmQpKSxlfWZ1bmN0aW9uIEhyKGUsdCxuKXt2YXIgcj1ufHx7fSxpPXIubnVtYmVyLG89XCIkJHZcIjtyLnRyaW0mJihvPVwiKHR5cGVvZiAkJHYgPT09ICdzdHJpbmcnPyAkJHYudHJpbSgpOiAkJHYpXCIpLGkmJihvPVwiX24oXCIrbytcIilcIik7dmFyIGE9QnIodCxvKTtlLm1vZGVsPXt2YWx1ZTpcIihcIit0K1wiKVwiLGV4cHJlc3Npb246SlNPTi5zdHJpbmdpZnkodCksY2FsbGJhY2s6XCJmdW5jdGlvbiAoJCR2KSB7XCIrYStcIn1cIn19ZnVuY3Rpb24gQnIoZSx0KXt2YXIgbj1mdW5jdGlvbihlKXtpZihlPWUudHJpbSgpLGdyPWUubGVuZ3RoLGUuaW5kZXhPZihcIltcIik8MHx8ZS5sYXN0SW5kZXhPZihcIl1cIik8Z3ItMSlyZXR1cm4oJHI9ZS5sYXN0SW5kZXhPZihcIi5cIikpPi0xP3tleHA6ZS5zbGljZSgwLCRyKSxrZXk6J1wiJytlLnNsaWNlKCRyKzEpKydcIid9OntleHA6ZSxrZXk6bnVsbH07X3I9ZSwkcj13cj1Dcj0wO2Zvcig7IXpyKCk7KVZyKGJyPVVyKCkpP0pyKGJyKTo5MT09PWJyJiZLcihicik7cmV0dXJue2V4cDplLnNsaWNlKDAsd3IpLGtleTplLnNsaWNlKHdyKzEsQ3IpfX0oZSk7cmV0dXJuIG51bGw9PT1uLmtleT9lK1wiPVwiK3Q6XCIkc2V0KFwiK24uZXhwK1wiLCBcIituLmtleStcIiwgXCIrdCtcIilcIn1mdW5jdGlvbiBVcigpe3JldHVybiBfci5jaGFyQ29kZUF0KCsrJHIpfWZ1bmN0aW9uIHpyKCl7cmV0dXJuICRyPj1ncn1mdW5jdGlvbiBWcihlKXtyZXR1cm4gMzQ9PT1lfHwzOT09PWV9ZnVuY3Rpb24gS3IoZSl7dmFyIHQ9MTtmb3Iod3I9JHI7IXpyKCk7KWlmKFZyKGU9VXIoKSkpSnIoZSk7ZWxzZSBpZig5MT09PWUmJnQrKyw5Mz09PWUmJnQtLSwwPT09dCl7Q3I9JHI7YnJlYWt9fWZ1bmN0aW9uIEpyKGUpe2Zvcih2YXIgdD1lOyF6cigpJiYoZT1VcigpKSE9PXQ7KTt9dmFyIHFyLFdyPVwiX19yXCIsWnI9XCJfX2NcIjtmdW5jdGlvbiBHcihlLHQsbil7dmFyIHI9cXI7cmV0dXJuIGZ1bmN0aW9uIGkoKXtudWxsIT09dC5hcHBseShudWxsLGFyZ3VtZW50cykmJlFyKGUsaSxuLHIpfX12YXIgWHI9VmUmJiEoWCYmTnVtYmVyKFhbMV0pPD01Myk7ZnVuY3Rpb24gWXIoZSx0LG4scil7aWYoWHIpe3ZhciBpPWFuLG89dDt0PW8uX3dyYXBwZXI9ZnVuY3Rpb24oZSl7aWYoZS50YXJnZXQ9PT1lLmN1cnJlbnRUYXJnZXR8fGUudGltZVN0YW1wPj1pfHxlLnRpbWVTdGFtcDw9MHx8ZS50YXJnZXQub3duZXJEb2N1bWVudCE9PWRvY3VtZW50KXJldHVybiBvLmFwcGx5KHRoaXMsYXJndW1lbnRzKX19cXIuYWRkRXZlbnRMaXN0ZW5lcihlLHQsUT97Y2FwdHVyZTpuLHBhc3NpdmU6cn06bil9ZnVuY3Rpb24gUXIoZSx0LG4scil7KHJ8fHFyKS5yZW1vdmVFdmVudExpc3RlbmVyKGUsdC5fd3JhcHBlcnx8dCxuKX1mdW5jdGlvbiBlaShlLHIpe2lmKCF0KGUuZGF0YS5vbil8fCF0KHIuZGF0YS5vbikpe3ZhciBpPXIuZGF0YS5vbnx8e30sbz1lLmRhdGEub258fHt9O3FyPXIuZWxtLGZ1bmN0aW9uKGUpe2lmKG4oZVtXcl0pKXt2YXIgdD1xP1wiY2hhbmdlXCI6XCJpbnB1dFwiO2VbdF09W10uY29uY2F0KGVbV3JdLGVbdF18fFtdKSxkZWxldGUgZVtXcl19bihlW1pyXSkmJihlLmNoYW5nZT1bXS5jb25jYXQoZVtacl0sZS5jaGFuZ2V8fFtdKSxkZWxldGUgZVtacl0pfShpKSxydChpLG8sWXIsUXIsR3Isci5jb250ZXh0KSxxcj12b2lkIDB9fXZhciB0aSxuaT17Y3JlYXRlOmVpLHVwZGF0ZTplaX07ZnVuY3Rpb24gcmkoZSxyKXtpZighdChlLmRhdGEuZG9tUHJvcHMpfHwhdChyLmRhdGEuZG9tUHJvcHMpKXt2YXIgaSxvLGE9ci5lbG0scz1lLmRhdGEuZG9tUHJvcHN8fHt9LGM9ci5kYXRhLmRvbVByb3BzfHx7fTtmb3IoaSBpbiBuKGMuX19vYl9fKSYmKGM9ci5kYXRhLmRvbVByb3BzPUEoe30sYykpLHMpaSBpbiBjfHwoYVtpXT1cIlwiKTtmb3IoaSBpbiBjKXtpZihvPWNbaV0sXCJ0ZXh0Q29udGVudFwiPT09aXx8XCJpbm5lckhUTUxcIj09PWkpe2lmKHIuY2hpbGRyZW4mJihyLmNoaWxkcmVuLmxlbmd0aD0wKSxvPT09c1tpXSljb250aW51ZTsxPT09YS5jaGlsZE5vZGVzLmxlbmd0aCYmYS5yZW1vdmVDaGlsZChhLmNoaWxkTm9kZXNbMF0pfWlmKFwidmFsdWVcIj09PWkmJlwiUFJPR1JFU1NcIiE9PWEudGFnTmFtZSl7YS5fdmFsdWU9bzt2YXIgdT10KG8pP1wiXCI6U3RyaW5nKG8pO2lpKGEsdSkmJihhLnZhbHVlPXUpfWVsc2UgaWYoXCJpbm5lckhUTUxcIj09PWkmJnFuKGEudGFnTmFtZSkmJnQoYS5pbm5lckhUTUwpKXsodGk9dGl8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLmlubmVySFRNTD1cIjxzdmc+XCIrbytcIjwvc3ZnPlwiO2Zvcih2YXIgbD10aS5maXJzdENoaWxkO2EuZmlyc3RDaGlsZDspYS5yZW1vdmVDaGlsZChhLmZpcnN0Q2hpbGQpO2Zvcig7bC5maXJzdENoaWxkOylhLmFwcGVuZENoaWxkKGwuZmlyc3RDaGlsZCl9ZWxzZSBpZihvIT09c1tpXSl0cnl7YVtpXT1vfWNhdGNoKGUpe319fX1mdW5jdGlvbiBpaShlLHQpe3JldHVybiFlLmNvbXBvc2luZyYmKFwiT1BUSU9OXCI9PT1lLnRhZ05hbWV8fGZ1bmN0aW9uKGUsdCl7dmFyIG49ITA7dHJ5e249ZG9jdW1lbnQuYWN0aXZlRWxlbWVudCE9PWV9Y2F0Y2goZSl7fXJldHVybiBuJiZlLnZhbHVlIT09dH0oZSx0KXx8ZnVuY3Rpb24oZSx0KXt2YXIgcj1lLnZhbHVlLGk9ZS5fdk1vZGlmaWVycztpZihuKGkpKXtpZihpLm51bWJlcilyZXR1cm4gZihyKSE9PWYodCk7aWYoaS50cmltKXJldHVybiByLnRyaW0oKSE9PXQudHJpbSgpfXJldHVybiByIT09dH0oZSx0KSl9dmFyIG9pPXtjcmVhdGU6cmksdXBkYXRlOnJpfSxhaT1nKGZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49LzooLispLztyZXR1cm4gZS5zcGxpdCgvOyg/IVteKF0qXFwpKS9nKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpe3ZhciByPWUuc3BsaXQobik7ci5sZW5ndGg+MSYmKHRbclswXS50cmltKCldPXJbMV0udHJpbSgpKX19KSx0fSk7ZnVuY3Rpb24gc2koZSl7dmFyIHQ9Y2koZS5zdHlsZSk7cmV0dXJuIGUuc3RhdGljU3R5bGU/QShlLnN0YXRpY1N0eWxlLHQpOnR9ZnVuY3Rpb24gY2koZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/TyhlKTpcInN0cmluZ1wiPT10eXBlb2YgZT9haShlKTplfXZhciB1aSxsaT0vXi0tLyxmaT0vXFxzKiFpbXBvcnRhbnQkLyxwaT1mdW5jdGlvbihlLHQsbil7aWYobGkudGVzdCh0KSllLnN0eWxlLnNldFByb3BlcnR5KHQsbik7ZWxzZSBpZihmaS50ZXN0KG4pKWUuc3R5bGUuc2V0UHJvcGVydHkoQyh0KSxuLnJlcGxhY2UoZmksXCJcIiksXCJpbXBvcnRhbnRcIik7ZWxzZXt2YXIgcj12aSh0KTtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgaT0wLG89bi5sZW5ndGg7aTxvO2krKyllLnN0eWxlW3JdPW5baV07ZWxzZSBlLnN0eWxlW3JdPW59fSxkaT1bXCJXZWJraXRcIixcIk1velwiLFwibXNcIl0sdmk9ZyhmdW5jdGlvbihlKXtpZih1aT11aXx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKS5zdHlsZSxcImZpbHRlclwiIT09KGU9YihlKSkmJmUgaW4gdWkpcmV0dXJuIGU7Zm9yKHZhciB0PWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPTA7bjxkaS5sZW5ndGg7bisrKXt2YXIgcj1kaVtuXSt0O2lmKHIgaW4gdWkpcmV0dXJuIHJ9fSk7ZnVuY3Rpb24gaGkoZSxyKXt2YXIgaT1yLmRhdGEsbz1lLmRhdGE7aWYoISh0KGkuc3RhdGljU3R5bGUpJiZ0KGkuc3R5bGUpJiZ0KG8uc3RhdGljU3R5bGUpJiZ0KG8uc3R5bGUpKSl7dmFyIGEscyxjPXIuZWxtLHU9by5zdGF0aWNTdHlsZSxsPW8ubm9ybWFsaXplZFN0eWxlfHxvLnN0eWxlfHx7fSxmPXV8fGwscD1jaShyLmRhdGEuc3R5bGUpfHx7fTtyLmRhdGEubm9ybWFsaXplZFN0eWxlPW4ocC5fX29iX18pP0Eoe30scCk6cDt2YXIgZD1mdW5jdGlvbihlLHQpe3ZhciBuLHI9e307aWYodClmb3IodmFyIGk9ZTtpLmNvbXBvbmVudEluc3RhbmNlOykoaT1pLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJmkuZGF0YSYmKG49c2koaS5kYXRhKSkmJkEocixuKTsobj1zaShlLmRhdGEpKSYmQShyLG4pO2Zvcih2YXIgbz1lO289by5wYXJlbnQ7KW8uZGF0YSYmKG49c2koby5kYXRhKSkmJkEocixuKTtyZXR1cm4gcn0ociwhMCk7Zm9yKHMgaW4gZil0KGRbc10pJiZwaShjLHMsXCJcIik7Zm9yKHMgaW4gZCkoYT1kW3NdKSE9PWZbc10mJnBpKGMscyxudWxsPT1hP1wiXCI6YSl9fXZhciBtaT17Y3JlYXRlOmhpLHVwZGF0ZTpoaX0seWk9L1xccysvO2Z1bmN0aW9uIGdpKGUsdCl7aWYodCYmKHQ9dC50cmltKCkpKWlmKGUuY2xhc3NMaXN0KXQuaW5kZXhPZihcIiBcIik+LTE/dC5zcGxpdCh5aSkuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGFzc0xpc3QuYWRkKHQpfSk6ZS5jbGFzc0xpc3QuYWRkKHQpO2Vsc2V7dmFyIG49XCIgXCIrKGUuZ2V0QXR0cmlidXRlKFwiY2xhc3NcIil8fFwiXCIpK1wiIFwiO24uaW5kZXhPZihcIiBcIit0K1wiIFwiKTwwJiZlLnNldEF0dHJpYnV0ZShcImNsYXNzXCIsKG4rdCkudHJpbSgpKX19ZnVuY3Rpb24gX2koZSx0KXtpZih0JiYodD10LnRyaW0oKSkpaWYoZS5jbGFzc0xpc3QpdC5pbmRleE9mKFwiIFwiKT4tMT90LnNwbGl0KHlpKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNsYXNzTGlzdC5yZW1vdmUodCl9KTplLmNsYXNzTGlzdC5yZW1vdmUodCksZS5jbGFzc0xpc3QubGVuZ3RofHxlLnJlbW92ZUF0dHJpYnV0ZShcImNsYXNzXCIpO2Vsc2V7Zm9yKHZhciBuPVwiIFwiKyhlLmdldEF0dHJpYnV0ZShcImNsYXNzXCIpfHxcIlwiKStcIiBcIixyPVwiIFwiK3QrXCIgXCI7bi5pbmRleE9mKHIpPj0wOyluPW4ucmVwbGFjZShyLFwiIFwiKTsobj1uLnRyaW0oKSk/ZS5zZXRBdHRyaWJ1dGUoXCJjbGFzc1wiLG4pOmUucmVtb3ZlQXR0cmlidXRlKFwiY2xhc3NcIil9fWZ1bmN0aW9uIGJpKGUpe2lmKGUpe2lmKFwib2JqZWN0XCI9PXR5cGVvZiBlKXt2YXIgdD17fTtyZXR1cm4hMSE9PWUuY3NzJiZBKHQsJGkoZS5uYW1lfHxcInZcIikpLEEodCxlKSx0fXJldHVyblwic3RyaW5nXCI9PXR5cGVvZiBlPyRpKGUpOnZvaWQgMH19dmFyICRpPWcoZnVuY3Rpb24oZSl7cmV0dXJue2VudGVyQ2xhc3M6ZStcIi1lbnRlclwiLGVudGVyVG9DbGFzczplK1wiLWVudGVyLXRvXCIsZW50ZXJBY3RpdmVDbGFzczplK1wiLWVudGVyLWFjdGl2ZVwiLGxlYXZlQ2xhc3M6ZStcIi1sZWF2ZVwiLGxlYXZlVG9DbGFzczplK1wiLWxlYXZlLXRvXCIsbGVhdmVBY3RpdmVDbGFzczplK1wiLWxlYXZlLWFjdGl2ZVwifX0pLHdpPXomJiFXLENpPVwidHJhbnNpdGlvblwiLHhpPVwiYW5pbWF0aW9uXCIsa2k9XCJ0cmFuc2l0aW9uXCIsQWk9XCJ0cmFuc2l0aW9uZW5kXCIsT2k9XCJhbmltYXRpb25cIixTaT1cImFuaW1hdGlvbmVuZFwiO3dpJiYodm9pZCAwPT09d2luZG93Lm9udHJhbnNpdGlvbmVuZCYmdm9pZCAwIT09d2luZG93Lm9ud2Via2l0dHJhbnNpdGlvbmVuZCYmKGtpPVwiV2Via2l0VHJhbnNpdGlvblwiLEFpPVwid2Via2l0VHJhbnNpdGlvbkVuZFwiKSx2b2lkIDA9PT13aW5kb3cub25hbmltYXRpb25lbmQmJnZvaWQgMCE9PXdpbmRvdy5vbndlYmtpdGFuaW1hdGlvbmVuZCYmKE9pPVwiV2Via2l0QW5pbWF0aW9uXCIsU2k9XCJ3ZWJraXRBbmltYXRpb25FbmRcIikpO3ZhciBUaT16P3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWU/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdyk6c2V0VGltZW91dDpmdW5jdGlvbihlKXtyZXR1cm4gZSgpfTtmdW5jdGlvbiBFaShlKXtUaShmdW5jdGlvbigpe1RpKGUpfSl9ZnVuY3Rpb24gTmkoZSx0KXt2YXIgbj1lLl90cmFuc2l0aW9uQ2xhc3Nlc3x8KGUuX3RyYW5zaXRpb25DbGFzc2VzPVtdKTtuLmluZGV4T2YodCk8MCYmKG4ucHVzaCh0KSxnaShlLHQpKX1mdW5jdGlvbiBqaShlLHQpe2UuX3RyYW5zaXRpb25DbGFzc2VzJiZoKGUuX3RyYW5zaXRpb25DbGFzc2VzLHQpLF9pKGUsdCl9ZnVuY3Rpb24gRGkoZSx0LG4pe3ZhciByPU1pKGUsdCksaT1yLnR5cGUsbz1yLnRpbWVvdXQsYT1yLnByb3BDb3VudDtpZighaSlyZXR1cm4gbigpO3ZhciBzPWk9PT1DaT9BaTpTaSxjPTAsdT1mdW5jdGlvbigpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGwpLG4oKX0sbD1mdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJisrYz49YSYmdSgpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7YzxhJiZ1KCl9LG8rMSksZS5hZGRFdmVudExpc3RlbmVyKHMsbCl9dmFyIExpPS9cXGIodHJhbnNmb3JtfGFsbCkoLHwkKS87ZnVuY3Rpb24gTWkoZSx0KXt2YXIgbixyPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLGk9KHJba2krXCJEZWxheVwiXXx8XCJcIikuc3BsaXQoXCIsIFwiKSxvPShyW2tpK1wiRHVyYXRpb25cIl18fFwiXCIpLnNwbGl0KFwiLCBcIiksYT1JaShpLG8pLHM9KHJbT2krXCJEZWxheVwiXXx8XCJcIikuc3BsaXQoXCIsIFwiKSxjPShyW09pK1wiRHVyYXRpb25cIl18fFwiXCIpLnNwbGl0KFwiLCBcIiksdT1JaShzLGMpLGw9MCxmPTA7cmV0dXJuIHQ9PT1DaT9hPjAmJihuPUNpLGw9YSxmPW8ubGVuZ3RoKTp0PT09eGk/dT4wJiYobj14aSxsPXUsZj1jLmxlbmd0aCk6Zj0obj0obD1NYXRoLm1heChhLHUpKT4wP2E+dT9DaTp4aTpudWxsKT9uPT09Q2k/by5sZW5ndGg6Yy5sZW5ndGg6MCx7dHlwZTpuLHRpbWVvdXQ6bCxwcm9wQ291bnQ6ZixoYXNUcmFuc2Zvcm06bj09PUNpJiZMaS50ZXN0KHJba2krXCJQcm9wZXJ0eVwiXSl9fWZ1bmN0aW9uIElpKGUsdCl7Zm9yKDtlLmxlbmd0aDx0Lmxlbmd0aDspZT1lLmNvbmNhdChlKTtyZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCx0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBGaSh0KStGaShlW25dKX0pKX1mdW5jdGlvbiBGaShlKXtyZXR1cm4gMWUzKk51bWJlcihlLnNsaWNlKDAsLTEpLnJlcGxhY2UoXCIsXCIsXCIuXCIpKX1mdW5jdGlvbiBQaShlLHIpe3ZhciBpPWUuZWxtO24oaS5fbGVhdmVDYikmJihpLl9sZWF2ZUNiLmNhbmNlbGxlZD0hMCxpLl9sZWF2ZUNiKCkpO3ZhciBhPWJpKGUuZGF0YS50cmFuc2l0aW9uKTtpZighdChhKSYmIW4oaS5fZW50ZXJDYikmJjE9PT1pLm5vZGVUeXBlKXtmb3IodmFyIHM9YS5jc3MsYz1hLnR5cGUsdT1hLmVudGVyQ2xhc3MsbD1hLmVudGVyVG9DbGFzcyxwPWEuZW50ZXJBY3RpdmVDbGFzcyxkPWEuYXBwZWFyQ2xhc3Msdj1hLmFwcGVhclRvQ2xhc3MsaD1hLmFwcGVhckFjdGl2ZUNsYXNzLG09YS5iZWZvcmVFbnRlcix5PWEuZW50ZXIsZz1hLmFmdGVyRW50ZXIsXz1hLmVudGVyQ2FuY2VsbGVkLGI9YS5iZWZvcmVBcHBlYXIsJD1hLmFwcGVhcix3PWEuYWZ0ZXJBcHBlYXIsQz1hLmFwcGVhckNhbmNlbGxlZCx4PWEuZHVyYXRpb24saz1XdCxBPVd0LiR2bm9kZTtBJiZBLnBhcmVudDspaz1BLmNvbnRleHQsQT1BLnBhcmVudDt2YXIgTz0hay5faXNNb3VudGVkfHwhZS5pc1Jvb3RJbnNlcnQ7aWYoIU98fCR8fFwiXCI9PT0kKXt2YXIgUz1PJiZkP2Q6dSxUPU8mJmg/aDpwLEU9TyYmdj92OmwsTj1PJiZifHxtLGo9TyYmXCJmdW5jdGlvblwiPT10eXBlb2YgJD8kOnksTD1PJiZ3fHxnLE09TyYmQ3x8XyxJPWYobyh4KT94LmVudGVyOngpLEY9ITEhPT1zJiYhVyxQPUJpKGopLFI9aS5fZW50ZXJDYj1EKGZ1bmN0aW9uKCl7RiYmKGppKGksRSksamkoaSxUKSksUi5jYW5jZWxsZWQ/KEYmJmppKGksUyksTSYmTShpKSk6TCYmTChpKSxpLl9lbnRlckNiPW51bGx9KTtlLmRhdGEuc2hvd3x8aXQoZSxcImluc2VydFwiLGZ1bmN0aW9uKCl7dmFyIHQ9aS5wYXJlbnROb2RlLG49dCYmdC5fcGVuZGluZyYmdC5fcGVuZGluZ1tlLmtleV07biYmbi50YWc9PT1lLnRhZyYmbi5lbG0uX2xlYXZlQ2ImJm4uZWxtLl9sZWF2ZUNiKCksaiYmaihpLFIpfSksTiYmTihpKSxGJiYoTmkoaSxTKSxOaShpLFQpLEVpKGZ1bmN0aW9uKCl7amkoaSxTKSxSLmNhbmNlbGxlZHx8KE5pKGksRSksUHx8KEhpKEkpP3NldFRpbWVvdXQoUixJKTpEaShpLGMsUikpKX0pKSxlLmRhdGEuc2hvdyYmKHImJnIoKSxqJiZqKGksUikpLEZ8fFB8fFIoKX19fWZ1bmN0aW9uIFJpKGUscil7dmFyIGk9ZS5lbG07bihpLl9lbnRlckNiKSYmKGkuX2VudGVyQ2IuY2FuY2VsbGVkPSEwLGkuX2VudGVyQ2IoKSk7dmFyIGE9YmkoZS5kYXRhLnRyYW5zaXRpb24pO2lmKHQoYSl8fDEhPT1pLm5vZGVUeXBlKXJldHVybiByKCk7aWYoIW4oaS5fbGVhdmVDYikpe3ZhciBzPWEuY3NzLGM9YS50eXBlLHU9YS5sZWF2ZUNsYXNzLGw9YS5sZWF2ZVRvQ2xhc3MscD1hLmxlYXZlQWN0aXZlQ2xhc3MsZD1hLmJlZm9yZUxlYXZlLHY9YS5sZWF2ZSxoPWEuYWZ0ZXJMZWF2ZSxtPWEubGVhdmVDYW5jZWxsZWQseT1hLmRlbGF5TGVhdmUsZz1hLmR1cmF0aW9uLF89ITEhPT1zJiYhVyxiPUJpKHYpLCQ9ZihvKGcpP2cubGVhdmU6Zyksdz1pLl9sZWF2ZUNiPUQoZnVuY3Rpb24oKXtpLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5fcGVuZGluZyYmKGkucGFyZW50Tm9kZS5fcGVuZGluZ1tlLmtleV09bnVsbCksXyYmKGppKGksbCksamkoaSxwKSksdy5jYW5jZWxsZWQ/KF8mJmppKGksdSksbSYmbShpKSk6KHIoKSxoJiZoKGkpKSxpLl9sZWF2ZUNiPW51bGx9KTt5P3koQyk6QygpfWZ1bmN0aW9uIEMoKXt3LmNhbmNlbGxlZHx8KCFlLmRhdGEuc2hvdyYmaS5wYXJlbnROb2RlJiYoKGkucGFyZW50Tm9kZS5fcGVuZGluZ3x8KGkucGFyZW50Tm9kZS5fcGVuZGluZz17fSkpW2Uua2V5XT1lKSxkJiZkKGkpLF8mJihOaShpLHUpLE5pKGkscCksRWkoZnVuY3Rpb24oKXtqaShpLHUpLHcuY2FuY2VsbGVkfHwoTmkoaSxsKSxifHwoSGkoJCk/c2V0VGltZW91dCh3LCQpOkRpKGksYyx3KSkpfSkpLHYmJnYoaSx3KSxffHxifHx3KCkpfX1mdW5jdGlvbiBIaShlKXtyZXR1cm5cIm51bWJlclwiPT10eXBlb2YgZSYmIWlzTmFOKGUpfWZ1bmN0aW9uIEJpKGUpe2lmKHQoZSkpcmV0dXJuITE7dmFyIHI9ZS5mbnM7cmV0dXJuIG4ocik/QmkoQXJyYXkuaXNBcnJheShyKT9yWzBdOnIpOihlLl9sZW5ndGh8fGUubGVuZ3RoKT4xfWZ1bmN0aW9uIFVpKGUsdCl7ITAhPT10LmRhdGEuc2hvdyYmUGkodCl9dmFyIHppPWZ1bmN0aW9uKGUpe3ZhciBvLGEscz17fSxjPWUubW9kdWxlcyx1PWUubm9kZU9wcztmb3Iobz0wO288cnIubGVuZ3RoOysrbylmb3Ioc1tycltvXV09W10sYT0wO2E8Yy5sZW5ndGg7KythKW4oY1thXVtycltvXV0pJiZzW3JyW29dXS5wdXNoKGNbYV1bcnJbb11dKTtmdW5jdGlvbiBsKGUpe3ZhciB0PXUucGFyZW50Tm9kZShlKTtuKHQpJiZ1LnJlbW92ZUNoaWxkKHQsZSl9ZnVuY3Rpb24gZihlLHQsaSxvLGEsYyxsKXtpZihuKGUuZWxtKSYmbihjKSYmKGU9Y1tsXT1tZShlKSksZS5pc1Jvb3RJbnNlcnQ9IWEsIWZ1bmN0aW9uKGUsdCxpLG8pe3ZhciBhPWUuZGF0YTtpZihuKGEpKXt2YXIgYz1uKGUuY29tcG9uZW50SW5zdGFuY2UpJiZhLmtlZXBBbGl2ZTtpZihuKGE9YS5ob29rKSYmbihhPWEuaW5pdCkmJmEoZSwhMSksbihlLmNvbXBvbmVudEluc3RhbmNlKSlyZXR1cm4gZChlLHQpLHYoaSxlLmVsbSxvKSxyKGMpJiZmdW5jdGlvbihlLHQscixpKXtmb3IodmFyIG8sYT1lO2EuY29tcG9uZW50SW5zdGFuY2U7KWlmKGE9YS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUsbihvPWEuZGF0YSkmJm4obz1vLnRyYW5zaXRpb24pKXtmb3Iobz0wO288cy5hY3RpdmF0ZS5sZW5ndGg7KytvKXMuYWN0aXZhdGVbb10obnIsYSk7dC5wdXNoKGEpO2JyZWFrfXYocixlLmVsbSxpKX0oZSx0LGksbyksITB9fShlLHQsaSxvKSl7dmFyIGY9ZS5kYXRhLHA9ZS5jaGlsZHJlbixtPWUudGFnO24obSk/KGUuZWxtPWUubnM/dS5jcmVhdGVFbGVtZW50TlMoZS5ucyxtKTp1LmNyZWF0ZUVsZW1lbnQobSxlKSxnKGUpLGgoZSxwLHQpLG4oZikmJnkoZSx0KSx2KGksZS5lbG0sbykpOnIoZS5pc0NvbW1lbnQpPyhlLmVsbT11LmNyZWF0ZUNvbW1lbnQoZS50ZXh0KSx2KGksZS5lbG0sbykpOihlLmVsbT11LmNyZWF0ZVRleHROb2RlKGUudGV4dCksdihpLGUuZWxtLG8pKX19ZnVuY3Rpb24gZChlLHQpe24oZS5kYXRhLnBlbmRpbmdJbnNlcnQpJiYodC5wdXNoLmFwcGx5KHQsZS5kYXRhLnBlbmRpbmdJbnNlcnQpLGUuZGF0YS5wZW5kaW5nSW5zZXJ0PW51bGwpLGUuZWxtPWUuY29tcG9uZW50SW5zdGFuY2UuJGVsLG0oZSk/KHkoZSx0KSxnKGUpKToodHIoZSksdC5wdXNoKGUpKX1mdW5jdGlvbiB2KGUsdCxyKXtuKGUpJiYobihyKT91LnBhcmVudE5vZGUocik9PT1lJiZ1Lmluc2VydEJlZm9yZShlLHQscik6dS5hcHBlbmRDaGlsZChlLHQpKX1mdW5jdGlvbiBoKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KHQpKWZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKWYodFtyXSxuLGUuZWxtLG51bGwsITAsdCxyKTtlbHNlIGkoZS50ZXh0KSYmdS5hcHBlbmRDaGlsZChlLmVsbSx1LmNyZWF0ZVRleHROb2RlKFN0cmluZyhlLnRleHQpKSl9ZnVuY3Rpb24gbShlKXtmb3IoO2UuY29tcG9uZW50SW5zdGFuY2U7KWU9ZS5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGU7cmV0dXJuIG4oZS50YWcpfWZ1bmN0aW9uIHkoZSx0KXtmb3IodmFyIHI9MDtyPHMuY3JlYXRlLmxlbmd0aDsrK3Ipcy5jcmVhdGVbcl0obnIsZSk7bihvPWUuZGF0YS5ob29rKSYmKG4oby5jcmVhdGUpJiZvLmNyZWF0ZShucixlKSxuKG8uaW5zZXJ0KSYmdC5wdXNoKGUpKX1mdW5jdGlvbiBnKGUpe3ZhciB0O2lmKG4odD1lLmZuU2NvcGVJZCkpdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpO2Vsc2UgZm9yKHZhciByPWU7cjspbih0PXIuY29udGV4dCkmJm4odD10LiRvcHRpb25zLl9zY29wZUlkKSYmdS5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpLHI9ci5wYXJlbnQ7bih0PVd0KSYmdCE9PWUuY29udGV4dCYmdCE9PWUuZm5Db250ZXh0JiZuKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJnUuc2V0U3R5bGVTY29wZShlLmVsbSx0KX1mdW5jdGlvbiBfKGUsdCxuLHIsaSxvKXtmb3IoO3I8PWk7KytyKWYobltyXSxvLGUsdCwhMSxuLHIpfWZ1bmN0aW9uIGIoZSl7dmFyIHQscixpPWUuZGF0YTtpZihuKGkpKWZvcihuKHQ9aS5ob29rKSYmbih0PXQuZGVzdHJveSkmJnQoZSksdD0wO3Q8cy5kZXN0cm95Lmxlbmd0aDsrK3Qpcy5kZXN0cm95W3RdKGUpO2lmKG4odD1lLmNoaWxkcmVuKSlmb3Iocj0wO3I8ZS5jaGlsZHJlbi5sZW5ndGg7KytyKWIoZS5jaGlsZHJlbltyXSl9ZnVuY3Rpb24gJChlLHQscil7Zm9yKDt0PD1yOysrdCl7dmFyIGk9ZVt0XTtuKGkpJiYobihpLnRhZyk/KHcoaSksYihpKSk6bChpLmVsbSkpfX1mdW5jdGlvbiB3KGUsdCl7aWYobih0KXx8bihlLmRhdGEpKXt2YXIgcixpPXMucmVtb3ZlLmxlbmd0aCsxO2ZvcihuKHQpP3QubGlzdGVuZXJzKz1pOnQ9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmbChlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufShlLmVsbSxpKSxuKHI9ZS5jb21wb25lbnRJbnN0YW5jZSkmJm4ocj1yLl92bm9kZSkmJm4oci5kYXRhKSYmdyhyLHQpLHI9MDtyPHMucmVtb3ZlLmxlbmd0aDsrK3Ipcy5yZW1vdmVbcl0oZSx0KTtuKHI9ZS5kYXRhLmhvb2spJiZuKHI9ci5yZW1vdmUpP3IoZSx0KTp0KCl9ZWxzZSBsKGUuZWxtKX1mdW5jdGlvbiBDKGUsdCxyLGkpe2Zvcih2YXIgbz1yO288aTtvKyspe3ZhciBhPXRbb107aWYobihhKSYmaXIoZSxhKSlyZXR1cm4gb319ZnVuY3Rpb24geChlLGksbyxhLGMsbCl7aWYoZSE9PWkpe24oaS5lbG0pJiZuKGEpJiYoaT1hW2NdPW1lKGkpKTt2YXIgcD1pLmVsbT1lLmVsbTtpZihyKGUuaXNBc3luY1BsYWNlaG9sZGVyKSluKGkuYXN5bmNGYWN0b3J5LnJlc29sdmVkKT9PKGUuZWxtLGksbyk6aS5pc0FzeW5jUGxhY2Vob2xkZXI9ITA7ZWxzZSBpZihyKGkuaXNTdGF0aWMpJiZyKGUuaXNTdGF0aWMpJiZpLmtleT09PWUua2V5JiYocihpLmlzQ2xvbmVkKXx8cihpLmlzT25jZSkpKWkuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZTtlbHNle3ZhciBkLHY9aS5kYXRhO24odikmJm4oZD12Lmhvb2spJiZuKGQ9ZC5wcmVwYXRjaCkmJmQoZSxpKTt2YXIgaD1lLmNoaWxkcmVuLHk9aS5jaGlsZHJlbjtpZihuKHYpJiZtKGkpKXtmb3IoZD0wO2Q8cy51cGRhdGUubGVuZ3RoOysrZClzLnVwZGF0ZVtkXShlLGkpO24oZD12Lmhvb2spJiZuKGQ9ZC51cGRhdGUpJiZkKGUsaSl9dChpLnRleHQpP24oaCkmJm4oeSk/aCE9PXkmJmZ1bmN0aW9uKGUscixpLG8sYSl7Zm9yKHZhciBzLGMsbCxwPTAsZD0wLHY9ci5sZW5ndGgtMSxoPXJbMF0sbT1yW3ZdLHk9aS5sZW5ndGgtMSxnPWlbMF0sYj1pW3ldLHc9IWE7cDw9diYmZDw9eTspdChoKT9oPXJbKytwXTp0KG0pP209clstLXZdOmlyKGgsZyk/KHgoaCxnLG8saSxkKSxoPXJbKytwXSxnPWlbKytkXSk6aXIobSxiKT8oeChtLGIsbyxpLHkpLG09clstLXZdLGI9aVstLXldKTppcihoLGIpPyh4KGgsYixvLGkseSksdyYmdS5pbnNlcnRCZWZvcmUoZSxoLmVsbSx1Lm5leHRTaWJsaW5nKG0uZWxtKSksaD1yWysrcF0sYj1pWy0teV0pOmlyKG0sZyk/KHgobSxnLG8saSxkKSx3JiZ1Lmluc2VydEJlZm9yZShlLG0uZWxtLGguZWxtKSxtPXJbLS12XSxnPWlbKytkXSk6KHQocykmJihzPW9yKHIscCx2KSksdChjPW4oZy5rZXkpP3NbZy5rZXldOkMoZyxyLHAsdikpP2YoZyxvLGUsaC5lbG0sITEsaSxkKTppcihsPXJbY10sZyk/KHgobCxnLG8saSxkKSxyW2NdPXZvaWQgMCx3JiZ1Lmluc2VydEJlZm9yZShlLGwuZWxtLGguZWxtKSk6ZihnLG8sZSxoLmVsbSwhMSxpLGQpLGc9aVsrK2RdKTtwPnY/XyhlLHQoaVt5KzFdKT9udWxsOmlbeSsxXS5lbG0saSxkLHksbyk6ZD55JiYkKHIscCx2KX0ocCxoLHksbyxsKTpuKHkpPyhuKGUudGV4dCkmJnUuc2V0VGV4dENvbnRlbnQocCxcIlwiKSxfKHAsbnVsbCx5LDAseS5sZW5ndGgtMSxvKSk6bihoKT8kKGgsMCxoLmxlbmd0aC0xKTpuKGUudGV4dCkmJnUuc2V0VGV4dENvbnRlbnQocCxcIlwiKTplLnRleHQhPT1pLnRleHQmJnUuc2V0VGV4dENvbnRlbnQocCxpLnRleHQpLG4odikmJm4oZD12Lmhvb2spJiZuKGQ9ZC5wb3N0cGF0Y2gpJiZkKGUsaSl9fX1mdW5jdGlvbiBrKGUsdCxpKXtpZihyKGkpJiZuKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgbz0wO288dC5sZW5ndGg7KytvKXRbb10uZGF0YS5ob29rLmluc2VydCh0W29dKX12YXIgQT1wKFwiYXR0cnMsY2xhc3Msc3RhdGljQ2xhc3Msc3RhdGljU3R5bGUsa2V5XCIpO2Z1bmN0aW9uIE8oZSx0LGksbyl7dmFyIGEscz10LnRhZyxjPXQuZGF0YSx1PXQuY2hpbGRyZW47aWYobz1vfHxjJiZjLnByZSx0LmVsbT1lLHIodC5pc0NvbW1lbnQpJiZuKHQuYXN5bmNGYWN0b3J5KSlyZXR1cm4gdC5pc0FzeW5jUGxhY2Vob2xkZXI9ITAsITA7aWYobihjKSYmKG4oYT1jLmhvb2spJiZuKGE9YS5pbml0KSYmYSh0LCEwKSxuKGE9dC5jb21wb25lbnRJbnN0YW5jZSkpKXJldHVybiBkKHQsaSksITA7aWYobihzKSl7aWYobih1KSlpZihlLmhhc0NoaWxkTm9kZXMoKSlpZihuKGE9YykmJm4oYT1hLmRvbVByb3BzKSYmbihhPWEuaW5uZXJIVE1MKSl7aWYoYSE9PWUuaW5uZXJIVE1MKXJldHVybiExfWVsc2V7Zm9yKHZhciBsPSEwLGY9ZS5maXJzdENoaWxkLHA9MDtwPHUubGVuZ3RoO3ArKyl7aWYoIWZ8fCFPKGYsdVtwXSxpLG8pKXtsPSExO2JyZWFrfWY9Zi5uZXh0U2libGluZ31pZighbHx8ZilyZXR1cm4hMX1lbHNlIGgodCx1LGkpO2lmKG4oYykpe3ZhciB2PSExO2Zvcih2YXIgbSBpbiBjKWlmKCFBKG0pKXt2PSEwLHkodCxpKTticmVha30hdiYmYy5jbGFzcyYmZXQoYy5jbGFzcyl9fWVsc2UgZS5kYXRhIT09dC50ZXh0JiYoZS5kYXRhPXQudGV4dCk7cmV0dXJuITB9cmV0dXJuIGZ1bmN0aW9uKGUsaSxvLGEpe2lmKCF0KGkpKXt2YXIgYyxsPSExLHA9W107aWYodChlKSlsPSEwLGYoaSxwKTtlbHNle3ZhciBkPW4oZS5ub2RlVHlwZSk7aWYoIWQmJmlyKGUsaSkpeChlLGkscCxudWxsLG51bGwsYSk7ZWxzZXtpZihkKXtpZigxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoTCkmJihlLnJlbW92ZUF0dHJpYnV0ZShMKSxvPSEwKSxyKG8pJiZPKGUsaSxwKSlyZXR1cm4gayhpLHAsITApLGU7Yz1lLGU9bmV3IHBlKHUudGFnTmFtZShjKS50b0xvd2VyQ2FzZSgpLHt9LFtdLHZvaWQgMCxjKX12YXIgdj1lLmVsbSxoPXUucGFyZW50Tm9kZSh2KTtpZihmKGkscCx2Ll9sZWF2ZUNiP251bGw6aCx1Lm5leHRTaWJsaW5nKHYpKSxuKGkucGFyZW50KSlmb3IodmFyIHk9aS5wYXJlbnQsZz1tKGkpO3k7KXtmb3IodmFyIF89MDtfPHMuZGVzdHJveS5sZW5ndGg7KytfKXMuZGVzdHJveVtfXSh5KTtpZih5LmVsbT1pLmVsbSxnKXtmb3IodmFyIHc9MDt3PHMuY3JlYXRlLmxlbmd0aDsrK3cpcy5jcmVhdGVbd10obnIseSk7dmFyIEM9eS5kYXRhLmhvb2suaW5zZXJ0O2lmKEMubWVyZ2VkKWZvcih2YXIgQT0xO0E8Qy5mbnMubGVuZ3RoO0ErKylDLmZuc1tBXSgpfWVsc2UgdHIoeSk7eT15LnBhcmVudH1uKGgpPyQoW2VdLDAsMCk6bihlLnRhZykmJmIoZSl9fXJldHVybiBrKGkscCxsKSxpLmVsbX1uKGUpJiZiKGUpfX0oe25vZGVPcHM6UW4sbW9kdWxlczpbbXIseHIsbmksb2ksbWksej97Y3JlYXRlOlVpLGFjdGl2YXRlOlVpLHJlbW92ZTpmdW5jdGlvbihlLHQpeyEwIT09ZS5kYXRhLnNob3c/UmkoZSx0KTp0KCl9fTp7fV0uY29uY2F0KHByKX0pO1cmJmRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJzZWxlY3Rpb25jaGFuZ2VcIixmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7ZSYmZS52bW9kZWwmJlhpKGUsXCJpbnB1dFwiKX0pO3ZhciBWaT17aW5zZXJ0ZWQ6ZnVuY3Rpb24oZSx0LG4scil7XCJzZWxlY3RcIj09PW4udGFnPyhyLmVsbSYmIXIuZWxtLl92T3B0aW9ucz9pdChuLFwicG9zdHBhdGNoXCIsZnVuY3Rpb24oKXtWaS5jb21wb25lbnRVcGRhdGVkKGUsdCxuKX0pOktpKGUsdCxuLmNvbnRleHQpLGUuX3ZPcHRpb25zPVtdLm1hcC5jYWxsKGUub3B0aW9ucyxXaSkpOihcInRleHRhcmVhXCI9PT1uLnRhZ3x8WG4oZS50eXBlKSkmJihlLl92TW9kaWZpZXJzPXQubW9kaWZpZXJzLHQubW9kaWZpZXJzLmxhenl8fChlLmFkZEV2ZW50TGlzdGVuZXIoXCJjb21wb3NpdGlvbnN0YXJ0XCIsWmkpLGUuYWRkRXZlbnRMaXN0ZW5lcihcImNvbXBvc2l0aW9uZW5kXCIsR2kpLGUuYWRkRXZlbnRMaXN0ZW5lcihcImNoYW5nZVwiLEdpKSxXJiYoZS52bW9kZWw9ITApKSl9LGNvbXBvbmVudFVwZGF0ZWQ6ZnVuY3Rpb24oZSx0LG4pe2lmKFwic2VsZWN0XCI9PT1uLnRhZyl7S2koZSx0LG4uY29udGV4dCk7dmFyIHI9ZS5fdk9wdGlvbnMsaT1lLl92T3B0aW9ucz1bXS5tYXAuY2FsbChlLm9wdGlvbnMsV2kpO2lmKGkuc29tZShmdW5jdGlvbihlLHQpe3JldHVybiFOKGUsclt0XSl9KSkoZS5tdWx0aXBsZT90LnZhbHVlLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIHFpKGUsaSl9KTp0LnZhbHVlIT09dC5vbGRWYWx1ZSYmcWkodC52YWx1ZSxpKSkmJlhpKGUsXCJjaGFuZ2VcIil9fX07ZnVuY3Rpb24gS2koZSx0LG4pe0ppKGUsdCxuKSwocXx8WikmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtKaShlLHQsbil9LDApfWZ1bmN0aW9uIEppKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9ZS5tdWx0aXBsZTtpZighaXx8QXJyYXkuaXNBcnJheShyKSl7Zm9yKHZhciBvLGEscz0wLGM9ZS5vcHRpb25zLmxlbmd0aDtzPGM7cysrKWlmKGE9ZS5vcHRpb25zW3NdLGkpbz1qKHIsV2koYSkpPi0xLGEuc2VsZWN0ZWQhPT1vJiYoYS5zZWxlY3RlZD1vKTtlbHNlIGlmKE4oV2koYSkscikpcmV0dXJuIHZvaWQoZS5zZWxlY3RlZEluZGV4IT09cyYmKGUuc2VsZWN0ZWRJbmRleD1zKSk7aXx8KGUuc2VsZWN0ZWRJbmRleD0tMSl9fWZ1bmN0aW9uIHFpKGUsdCl7cmV0dXJuIHQuZXZlcnkoZnVuY3Rpb24odCl7cmV0dXJuIU4odCxlKX0pfWZ1bmN0aW9uIFdpKGUpe3JldHVyblwiX3ZhbHVlXCJpbiBlP2UuX3ZhbHVlOmUudmFsdWV9ZnVuY3Rpb24gWmkoZSl7ZS50YXJnZXQuY29tcG9zaW5nPSEwfWZ1bmN0aW9uIEdpKGUpe2UudGFyZ2V0LmNvbXBvc2luZyYmKGUudGFyZ2V0LmNvbXBvc2luZz0hMSxYaShlLnRhcmdldCxcImlucHV0XCIpKX1mdW5jdGlvbiBYaShlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUV2ZW50KFwiSFRNTEV2ZW50c1wiKTtuLmluaXRFdmVudCh0LCEwLCEwKSxlLmRpc3BhdGNoRXZlbnQobil9ZnVuY3Rpb24gWWkoZSl7cmV0dXJuIWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZGF0YSYmZS5kYXRhLnRyYW5zaXRpb24/ZTpZaShlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSl9dmFyIFFpPXttb2RlbDpWaSxzaG93OntiaW5kOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9KG49WWkobikpLmRhdGEmJm4uZGF0YS50cmFuc2l0aW9uLG89ZS5fX3ZPcmlnaW5hbERpc3BsYXk9XCJub25lXCI9PT1lLnN0eWxlLmRpc3BsYXk/XCJcIjplLnN0eWxlLmRpc3BsYXk7ciYmaT8obi5kYXRhLnNob3c9ITAsUGkobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT1vfSkpOmUuc3R5bGUuZGlzcGxheT1yP286XCJub25lXCJ9LHVwZGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZTshciE9IXQub2xkVmFsdWUmJigobj1ZaShuKSkuZGF0YSYmbi5kYXRhLnRyYW5zaXRpb24/KG4uZGF0YS5zaG93PSEwLHI/UGkobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT1lLl9fdk9yaWdpbmFsRGlzcGxheX0pOlJpKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9XCJub25lXCJ9KSk6ZS5zdHlsZS5kaXNwbGF5PXI/ZS5fX3ZPcmlnaW5hbERpc3BsYXk6XCJub25lXCIpfSx1bmJpbmQ6ZnVuY3Rpb24oZSx0LG4scixpKXtpfHwoZS5zdHlsZS5kaXNwbGF5PWUuX192T3JpZ2luYWxEaXNwbGF5KX19fSxlbz17bmFtZTpTdHJpbmcsYXBwZWFyOkJvb2xlYW4sY3NzOkJvb2xlYW4sbW9kZTpTdHJpbmcsdHlwZTpTdHJpbmcsZW50ZXJDbGFzczpTdHJpbmcsbGVhdmVDbGFzczpTdHJpbmcsZW50ZXJUb0NsYXNzOlN0cmluZyxsZWF2ZVRvQ2xhc3M6U3RyaW5nLGVudGVyQWN0aXZlQ2xhc3M6U3RyaW5nLGxlYXZlQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhckNsYXNzOlN0cmluZyxhcHBlYXJBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyVG9DbGFzczpTdHJpbmcsZHVyYXRpb246W051bWJlcixTdHJpbmcsT2JqZWN0XX07ZnVuY3Rpb24gdG8oZSl7dmFyIHQ9ZSYmZS5jb21wb25lbnRPcHRpb25zO3JldHVybiB0JiZ0LkN0b3Iub3B0aW9ucy5hYnN0cmFjdD90byh6dCh0LmNoaWxkcmVuKSk6ZX1mdW5jdGlvbiBubyhlKXt2YXIgdD17fSxuPWUuJG9wdGlvbnM7Zm9yKHZhciByIGluIG4ucHJvcHNEYXRhKXRbcl09ZVtyXTt2YXIgaT1uLl9wYXJlbnRMaXN0ZW5lcnM7Zm9yKHZhciBvIGluIGkpdFtiKG8pXT1pW29dO3JldHVybiB0fWZ1bmN0aW9uIHJvKGUsdCl7aWYoL1xcZC1rZWVwLWFsaXZlJC8udGVzdCh0LnRhZykpcmV0dXJuIGUoXCJrZWVwLWFsaXZlXCIse3Byb3BzOnQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGF9KX12YXIgaW89ZnVuY3Rpb24oZSl7cmV0dXJuIGUudGFnfHxVdChlKX0sb289ZnVuY3Rpb24oZSl7cmV0dXJuXCJzaG93XCI9PT1lLm5hbWV9LGFvPXtuYW1lOlwidHJhbnNpdGlvblwiLHByb3BzOmVvLGFic3RyYWN0OiEwLHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kc2xvdHMuZGVmYXVsdDtpZihuJiYobj1uLmZpbHRlcihpbykpLmxlbmd0aCl7dmFyIHI9dGhpcy5tb2RlLG89blswXTtpZihmdW5jdGlvbihlKXtmb3IoO2U9ZS5wYXJlbnQ7KWlmKGUuZGF0YS50cmFuc2l0aW9uKXJldHVybiEwfSh0aGlzLiR2bm9kZSkpcmV0dXJuIG87dmFyIGE9dG8obyk7aWYoIWEpcmV0dXJuIG87aWYodGhpcy5fbGVhdmluZylyZXR1cm4gcm8oZSxvKTt2YXIgcz1cIl9fdHJhbnNpdGlvbi1cIit0aGlzLl91aWQrXCItXCI7YS5rZXk9bnVsbD09YS5rZXk/YS5pc0NvbW1lbnQ/cytcImNvbW1lbnRcIjpzK2EudGFnOmkoYS5rZXkpPzA9PT1TdHJpbmcoYS5rZXkpLmluZGV4T2Yocyk/YS5rZXk6cythLmtleTphLmtleTt2YXIgYz0oYS5kYXRhfHwoYS5kYXRhPXt9KSkudHJhbnNpdGlvbj1ubyh0aGlzKSx1PXRoaXMuX3Zub2RlLGw9dG8odSk7aWYoYS5kYXRhLmRpcmVjdGl2ZXMmJmEuZGF0YS5kaXJlY3RpdmVzLnNvbWUob28pJiYoYS5kYXRhLnNob3c9ITApLGwmJmwuZGF0YSYmIWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQua2V5PT09ZS5rZXkmJnQudGFnPT09ZS50YWd9KGEsbCkmJiFVdChsKSYmKCFsLmNvbXBvbmVudEluc3RhbmNlfHwhbC5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUuaXNDb21tZW50KSl7dmFyIGY9bC5kYXRhLnRyYW5zaXRpb249QSh7fSxjKTtpZihcIm91dC1pblwiPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCxpdChmLFwiYWZ0ZXJMZWF2ZVwiLGZ1bmN0aW9uKCl7dC5fbGVhdmluZz0hMSx0LiRmb3JjZVVwZGF0ZSgpfSkscm8oZSxvKTtpZihcImluLW91dFwiPT09cil7aWYoVXQoYSkpcmV0dXJuIHU7dmFyIHAsZD1mdW5jdGlvbigpe3AoKX07aXQoYyxcImFmdGVyRW50ZXJcIixkKSxpdChjLFwiZW50ZXJDYW5jZWxsZWRcIixkKSxpdChmLFwiZGVsYXlMZWF2ZVwiLGZ1bmN0aW9uKGUpe3A9ZX0pfX1yZXR1cm4gb319fSxzbz1BKHt0YWc6U3RyaW5nLG1vdmVDbGFzczpTdHJpbmd9LGVvKTtmdW5jdGlvbiBjbyhlKXtlLmVsbS5fbW92ZUNiJiZlLmVsbS5fbW92ZUNiKCksZS5lbG0uX2VudGVyQ2ImJmUuZWxtLl9lbnRlckNiKCl9ZnVuY3Rpb24gdW8oZSl7ZS5kYXRhLm5ld1Bvcz1lLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKX1mdW5jdGlvbiBsbyhlKXt2YXIgdD1lLmRhdGEucG9zLG49ZS5kYXRhLm5ld1BvcyxyPXQubGVmdC1uLmxlZnQsaT10LnRvcC1uLnRvcDtpZihyfHxpKXtlLmRhdGEubW92ZWQ9ITA7dmFyIG89ZS5lbG0uc3R5bGU7by50cmFuc2Zvcm09by5XZWJraXRUcmFuc2Zvcm09XCJ0cmFuc2xhdGUoXCIrcitcInB4LFwiK2krXCJweClcIixvLnRyYW5zaXRpb25EdXJhdGlvbj1cIjBzXCJ9fWRlbGV0ZSBzby5tb2RlO3ZhciBmbz17VHJhbnNpdGlvbjphbyxUcmFuc2l0aW9uR3JvdXA6e3Byb3BzOnNvLGJlZm9yZU1vdW50OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PXRoaXMuX3VwZGF0ZTt0aGlzLl91cGRhdGU9ZnVuY3Rpb24obixyKXt2YXIgaT1adChlKTtlLl9fcGF0Y2hfXyhlLl92bm9kZSxlLmtlcHQsITEsITApLGUuX3Zub2RlPWUua2VwdCxpKCksdC5jYWxsKGUsbixyKX19LHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHxcInNwYW5cIixuPU9iamVjdC5jcmVhdGUobnVsbCkscj10aGlzLnByZXZDaGlsZHJlbj10aGlzLmNoaWxkcmVuLGk9dGhpcy4kc2xvdHMuZGVmYXVsdHx8W10sbz10aGlzLmNoaWxkcmVuPVtdLGE9bm8odGhpcykscz0wO3M8aS5sZW5ndGg7cysrKXt2YXIgYz1pW3NdO2MudGFnJiZudWxsIT1jLmtleSYmMCE9PVN0cmluZyhjLmtleSkuaW5kZXhPZihcIl9fdmxpc3RcIikmJihvLnB1c2goYyksbltjLmtleV09YywoYy5kYXRhfHwoYy5kYXRhPXt9KSkudHJhbnNpdGlvbj1hKX1pZihyKXtmb3IodmFyIHU9W10sbD1bXSxmPTA7ZjxyLmxlbmd0aDtmKyspe3ZhciBwPXJbZl07cC5kYXRhLnRyYW5zaXRpb249YSxwLmRhdGEucG9zPXAuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG5bcC5rZXldP3UucHVzaChwKTpsLnB1c2gocCl9dGhpcy5rZXB0PWUodCxudWxsLHUpLHRoaXMucmVtb3ZlZD1sfXJldHVybiBlKHQsbnVsbCxvKX0sdXBkYXRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJldkNoaWxkcmVuLHQ9dGhpcy5tb3ZlQ2xhc3N8fCh0aGlzLm5hbWV8fFwidlwiKStcIi1tb3ZlXCI7ZS5sZW5ndGgmJnRoaXMuaGFzTW92ZShlWzBdLmVsbSx0KSYmKGUuZm9yRWFjaChjbyksZS5mb3JFYWNoKHVvKSxlLmZvckVhY2gobG8pLHRoaXMuX3JlZmxvdz1kb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCxlLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZS5kYXRhLm1vdmVkKXt2YXIgbj1lLmVsbSxyPW4uc3R5bGU7Tmkobix0KSxyLnRyYW5zZm9ybT1yLldlYmtpdFRyYW5zZm9ybT1yLnRyYW5zaXRpb25EdXJhdGlvbj1cIlwiLG4uYWRkRXZlbnRMaXN0ZW5lcihBaSxuLl9tb3ZlQ2I9ZnVuY3Rpb24gZShyKXtyJiZyLnRhcmdldCE9PW58fHImJiEvdHJhbnNmb3JtJC8udGVzdChyLnByb3BlcnR5TmFtZSl8fChuLnJlbW92ZUV2ZW50TGlzdGVuZXIoQWksZSksbi5fbW92ZUNiPW51bGwsamkobix0KSl9KX19KSl9LG1ldGhvZHM6e2hhc01vdmU6ZnVuY3Rpb24oZSx0KXtpZighd2kpcmV0dXJuITE7aWYodGhpcy5faGFzTW92ZSlyZXR1cm4gdGhpcy5faGFzTW92ZTt2YXIgbj1lLmNsb25lTm9kZSgpO2UuX3RyYW5zaXRpb25DbGFzc2VzJiZlLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe19pKG4sZSl9KSxnaShuLHQpLG4uc3R5bGUuZGlzcGxheT1cIm5vbmVcIix0aGlzLiRlbC5hcHBlbmRDaGlsZChuKTt2YXIgcj1NaShuKTtyZXR1cm4gdGhpcy4kZWwucmVtb3ZlQ2hpbGQobiksdGhpcy5faGFzTW92ZT1yLmhhc1RyYW5zZm9ybX19fX07d24uY29uZmlnLm11c3RVc2VQcm9wPWpuLHduLmNvbmZpZy5pc1Jlc2VydmVkVGFnPVduLHduLmNvbmZpZy5pc1Jlc2VydmVkQXR0cj1Fbix3bi5jb25maWcuZ2V0VGFnTmFtZXNwYWNlPVpuLHduLmNvbmZpZy5pc1Vua25vd25FbGVtZW50PWZ1bmN0aW9uKGUpe2lmKCF6KXJldHVybiEwO2lmKFduKGUpKXJldHVybiExO2lmKGU9ZS50b0xvd2VyQ2FzZSgpLG51bGwhPUduW2VdKXJldHVybiBHbltlXTt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBlLmluZGV4T2YoXCItXCIpPi0xP0duW2VdPXQuY29uc3RydWN0b3I9PT13aW5kb3cuSFRNTFVua25vd25FbGVtZW50fHx0LmNvbnN0cnVjdG9yPT09d2luZG93LkhUTUxFbGVtZW50OkduW2VdPS9IVE1MVW5rbm93bkVsZW1lbnQvLnRlc3QodC50b1N0cmluZygpKX0sQSh3bi5vcHRpb25zLmRpcmVjdGl2ZXMsUWkpLEEod24ub3B0aW9ucy5jb21wb25lbnRzLGZvKSx3bi5wcm90b3R5cGUuX19wYXRjaF9fPXo/emk6Uyx3bi5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtyZXR1cm4gZS4kZWw9dCxlLiRvcHRpb25zLnJlbmRlcnx8KGUuJG9wdGlvbnMucmVuZGVyPXZlKSxZdChlLFwiYmVmb3JlTW91bnRcIikscj1mdW5jdGlvbigpe2UuX3VwZGF0ZShlLl9yZW5kZXIoKSxuKX0sbmV3IGZuKGUscixTLHtiZWZvcmU6ZnVuY3Rpb24oKXtlLl9pc01vdW50ZWQmJiFlLl9pc0Rlc3Ryb3llZCYmWXQoZSxcImJlZm9yZVVwZGF0ZVwiKX19LCEwKSxuPSExLG51bGw9PWUuJHZub2RlJiYoZS5faXNNb3VudGVkPSEwLFl0KGUsXCJtb3VudGVkXCIpKSxlfSh0aGlzLGU9ZSYmej9ZbihlKTp2b2lkIDAsdCl9LHomJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtGLmRldnRvb2xzJiZuZSYmbmUuZW1pdChcImluaXRcIix3bil9LDApO3ZhciBwbz0vXFx7XFx7KCg/Oi58XFxyP1xcbikrPylcXH1cXH0vZyx2bz0vWy0uKis/XiR7fSgpfFtcXF1cXC9cXFxcXS9nLGhvPWcoZnVuY3Rpb24oZSl7dmFyIHQ9ZVswXS5yZXBsYWNlKHZvLFwiXFxcXCQmXCIpLG49ZVsxXS5yZXBsYWNlKHZvLFwiXFxcXCQmXCIpO3JldHVybiBuZXcgUmVnRXhwKHQrXCIoKD86LnxcXFxcbikrPylcIituLFwiZ1wiKX0pO3ZhciBtbz17c3RhdGljS2V5czpbXCJzdGF0aWNDbGFzc1wiXSx0cmFuc2Zvcm1Ob2RlOmZ1bmN0aW9uKGUsdCl7dC53YXJuO3ZhciBuPUZyKGUsXCJjbGFzc1wiKTtuJiYoZS5zdGF0aWNDbGFzcz1KU09OLnN0cmluZ2lmeShuKSk7dmFyIHI9SXIoZSxcImNsYXNzXCIsITEpO3ImJihlLmNsYXNzQmluZGluZz1yKX0sZ2VuRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1cIlwiO3JldHVybiBlLnN0YXRpY0NsYXNzJiYodCs9XCJzdGF0aWNDbGFzczpcIitlLnN0YXRpY0NsYXNzK1wiLFwiKSxlLmNsYXNzQmluZGluZyYmKHQrPVwiY2xhc3M6XCIrZS5jbGFzc0JpbmRpbmcrXCIsXCIpLHR9fTt2YXIgeW8sZ289e3N0YXRpY0tleXM6W1wic3RhdGljU3R5bGVcIl0sdHJhbnNmb3JtTm9kZTpmdW5jdGlvbihlLHQpe3Qud2Fybjt2YXIgbj1GcihlLFwic3R5bGVcIik7biYmKGUuc3RhdGljU3R5bGU9SlNPTi5zdHJpbmdpZnkoYWkobikpKTt2YXIgcj1JcihlLFwic3R5bGVcIiwhMSk7ciYmKGUuc3R5bGVCaW5kaW5nPXIpfSxnZW5EYXRhOmZ1bmN0aW9uKGUpe3ZhciB0PVwiXCI7cmV0dXJuIGUuc3RhdGljU3R5bGUmJih0Kz1cInN0YXRpY1N0eWxlOlwiK2Uuc3RhdGljU3R5bGUrXCIsXCIpLGUuc3R5bGVCaW5kaW5nJiYodCs9XCJzdHlsZTooXCIrZS5zdHlsZUJpbmRpbmcrXCIpLFwiKSx0fX0sX289ZnVuY3Rpb24oZSl7cmV0dXJuKHlvPXlvfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpKS5pbm5lckhUTUw9ZSx5by50ZXh0Q29udGVudH0sYm89cChcImFyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLGxpbmssbWV0YSxwYXJhbSxzb3VyY2UsdHJhY2ssd2JyXCIpLCRvPXAoXCJjb2xncm91cCxkZCxkdCxsaSxvcHRpb25zLHAsdGQsdGZvb3QsdGgsdGhlYWQsdHIsc291cmNlXCIpLHdvPXAoXCJhZGRyZXNzLGFydGljbGUsYXNpZGUsYmFzZSxibG9ja3F1b3RlLGJvZHksY2FwdGlvbixjb2wsY29sZ3JvdXAsZGQsZGV0YWlscyxkaWFsb2csZGl2LGRsLGR0LGZpZWxkc2V0LGZpZ2NhcHRpb24sZmlndXJlLGZvb3Rlcixmb3JtLGgxLGgyLGgzLGg0LGg1LGg2LGhlYWQsaGVhZGVyLGhncm91cCxocixodG1sLGxlZ2VuZCxsaSxtZW51aXRlbSxtZXRhLG9wdGdyb3VwLG9wdGlvbixwYXJhbSxycCxydCxzb3VyY2Usc3R5bGUsc3VtbWFyeSx0Ym9keSx0ZCx0Zm9vdCx0aCx0aGVhZCx0aXRsZSx0cix0cmFja1wiKSxDbz0vXlxccyooW15cXHNcIic8PlxcLz1dKykoPzpcXHMqKD0pXFxzKig/OlwiKFteXCJdKilcIit8JyhbXiddKiknK3woW15cXHNcIic9PD5gXSspKSk/Lyx4bz0vXlxccyooKD86di1bXFx3LV0rOnxAfDp8IylcXFtbXj1dK1xcXVteXFxzXCInPD5cXC89XSopKD86XFxzKig9KVxccyooPzpcIihbXlwiXSopXCIrfCcoW14nXSopJyt8KFteXFxzXCInPTw+YF0rKSkpPy8sa289XCJbYS16QS1aX11bXFxcXC1cXFxcLjAtOV9hLXpBLVpcIitQLnNvdXJjZStcIl0qXCIsQW89XCIoKD86XCIra28rXCJcXFxcOik/XCIra28rXCIpXCIsT289bmV3IFJlZ0V4cChcIl48XCIrQW8pLFNvPS9eXFxzKihcXC8/KT4vLFRvPW5ldyBSZWdFeHAoXCJePFxcXFwvXCIrQW8rXCJbXj5dKj5cIiksRW89L148IURPQ1RZUEUgW14+XSs+L2ksTm89L148IVxcLS0vLGpvPS9ePCFcXFsvLERvPXAoXCJzY3JpcHQsc3R5bGUsdGV4dGFyZWFcIiwhMCksTG89e30sTW89e1wiJmx0O1wiOlwiPFwiLFwiJmd0O1wiOlwiPlwiLFwiJnF1b3Q7XCI6J1wiJyxcIiZhbXA7XCI6XCImXCIsXCImIzEwO1wiOlwiXFxuXCIsXCImIzk7XCI6XCJcXHRcIixcIiYjMzk7XCI6XCInXCJ9LElvPS8mKD86bHR8Z3R8cXVvdHxhbXB8IzM5KTsvZyxGbz0vJig/Omx0fGd0fHF1b3R8YW1wfCMzOXwjMTB8IzkpOy9nLFBvPXAoXCJwcmUsdGV4dGFyZWFcIiwhMCksUm89ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmUG8oZSkmJlwiXFxuXCI9PT10WzBdfTtmdW5jdGlvbiBIbyhlLHQpe3ZhciBuPXQ/Rm86SW87cmV0dXJuIGUucmVwbGFjZShuLGZ1bmN0aW9uKGUpe3JldHVybiBNb1tlXX0pfXZhciBCbyxVbyx6byxWbyxLbyxKbyxxbyxXbyxabz0vXkB8XnYtb246LyxHbz0vXnYtfF5AfF46fF4jLyxYbz0vKFtcXHNcXFNdKj8pXFxzKyg/OmlufG9mKVxccysoW1xcc1xcU10qKS8sWW89LywoW14sXFx9XFxdXSopKD86LChbXixcXH1cXF1dKikpPyQvLFFvPS9eXFwofFxcKSQvZyxlYT0vXlxcWy4qXFxdJC8sdGE9LzooLiopJC8sbmE9L146fF5cXC58XnYtYmluZDovLHJhPS9cXC5bXi5cXF1dKyg/PVteXFxdXSokKS9nLGlhPS9edi1zbG90KDp8JCl8XiMvLG9hPS9bXFxyXFxuXS8sYWE9L1xccysvZyxzYT1nKF9vKSxjYT1cIl9lbXB0eV9cIjtmdW5jdGlvbiB1YShlLHQsbil7cmV0dXJue3R5cGU6MSx0YWc6ZSxhdHRyc0xpc3Q6dCxhdHRyc01hcDptYSh0KSxyYXdBdHRyc01hcDp7fSxwYXJlbnQ6bixjaGlsZHJlbjpbXX19ZnVuY3Rpb24gbGEoZSx0KXtCbz10Lndhcm58fFNyLEpvPXQuaXNQcmVUYWd8fFQscW89dC5tdXN0VXNlUHJvcHx8VCxXbz10LmdldFRhZ05hbWVzcGFjZXx8VDt0LmlzUmVzZXJ2ZWRUYWc7em89VHIodC5tb2R1bGVzLFwidHJhbnNmb3JtTm9kZVwiKSxWbz1Ucih0Lm1vZHVsZXMsXCJwcmVUcmFuc2Zvcm1Ob2RlXCIpLEtvPVRyKHQubW9kdWxlcyxcInBvc3RUcmFuc2Zvcm1Ob2RlXCIpLFVvPXQuZGVsaW1pdGVyczt2YXIgbixyLGk9W10sbz0hMSE9PXQucHJlc2VydmVXaGl0ZXNwYWNlLGE9dC53aGl0ZXNwYWNlLHM9ITEsYz0hMTtmdW5jdGlvbiB1KGUpe2lmKGwoZSksc3x8ZS5wcm9jZXNzZWR8fChlPWZhKGUsdCkpLGkubGVuZ3RofHxlPT09bnx8bi5pZiYmKGUuZWxzZWlmfHxlLmVsc2UpJiZkYShuLHtleHA6ZS5lbHNlaWYsYmxvY2s6ZX0pLHImJiFlLmZvcmJpZGRlbilpZihlLmVsc2VpZnx8ZS5lbHNlKWE9ZSwodT1mdW5jdGlvbihlKXt2YXIgdD1lLmxlbmd0aDtmb3IoO3QtLTspe2lmKDE9PT1lW3RdLnR5cGUpcmV0dXJuIGVbdF07ZS5wb3AoKX19KHIuY2hpbGRyZW4pKSYmdS5pZiYmZGEodSx7ZXhwOmEuZWxzZWlmLGJsb2NrOmF9KTtlbHNle2lmKGUuc2xvdFNjb3BlKXt2YXIgbz1lLnNsb3RUYXJnZXR8fCdcImRlZmF1bHRcIic7KHIuc2NvcGVkU2xvdHN8fChyLnNjb3BlZFNsb3RzPXt9KSlbb109ZX1yLmNoaWxkcmVuLnB1c2goZSksZS5wYXJlbnQ9cn12YXIgYSx1O2UuY2hpbGRyZW49ZS5jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIWUuc2xvdFNjb3BlfSksbChlKSxlLnByZSYmKHM9ITEpLEpvKGUudGFnKSYmKGM9ITEpO2Zvcih2YXIgZj0wO2Y8S28ubGVuZ3RoO2YrKylLb1tmXShlLHQpfWZ1bmN0aW9uIGwoZSl7aWYoIWMpZm9yKHZhciB0Oyh0PWUuY2hpbGRyZW5bZS5jaGlsZHJlbi5sZW5ndGgtMV0pJiYzPT09dC50eXBlJiZcIiBcIj09PXQudGV4dDspZS5jaGlsZHJlbi5wb3AoKX1yZXR1cm4gZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scixpPVtdLG89dC5leHBlY3RIVE1MLGE9dC5pc1VuYXJ5VGFnfHxULHM9dC5jYW5CZUxlZnRPcGVuVGFnfHxULGM9MDtlOyl7aWYobj1lLHImJkRvKHIpKXt2YXIgdT0wLGw9ci50b0xvd2VyQ2FzZSgpLGY9TG9bbF18fChMb1tsXT1uZXcgUmVnRXhwKFwiKFtcXFxcc1xcXFxTXSo/KSg8L1wiK2wrXCJbXj5dKj4pXCIsXCJpXCIpKSxwPWUucmVwbGFjZShmLGZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gdT1yLmxlbmd0aCxEbyhsKXx8XCJub3NjcmlwdFwiPT09bHx8KG49bi5yZXBsYWNlKC88IVxcLS0oW1xcc1xcU10qPyktLT4vZyxcIiQxXCIpLnJlcGxhY2UoLzwhXFxbQ0RBVEFcXFsoW1xcc1xcU10qPyldXT4vZyxcIiQxXCIpKSxSbyhsLG4pJiYobj1uLnNsaWNlKDEpKSx0LmNoYXJzJiZ0LmNoYXJzKG4pLFwiXCJ9KTtjKz1lLmxlbmd0aC1wLmxlbmd0aCxlPXAsQShsLGMtdSxjKX1lbHNle3ZhciBkPWUuaW5kZXhPZihcIjxcIik7aWYoMD09PWQpe2lmKE5vLnRlc3QoZSkpe3ZhciB2PWUuaW5kZXhPZihcIi0tXFx4M2VcIik7aWYodj49MCl7dC5zaG91bGRLZWVwQ29tbWVudCYmdC5jb21tZW50KGUuc3Vic3RyaW5nKDQsdiksYyxjK3YrMyksQyh2KzMpO2NvbnRpbnVlfX1pZihqby50ZXN0KGUpKXt2YXIgaD1lLmluZGV4T2YoXCJdPlwiKTtpZihoPj0wKXtDKGgrMik7Y29udGludWV9fXZhciBtPWUubWF0Y2goRW8pO2lmKG0pe0MobVswXS5sZW5ndGgpO2NvbnRpbnVlfXZhciB5PWUubWF0Y2goVG8pO2lmKHkpe3ZhciBnPWM7Qyh5WzBdLmxlbmd0aCksQSh5WzFdLGcsYyk7Y29udGludWV9dmFyIF89eCgpO2lmKF8pe2soXyksUm8oXy50YWdOYW1lLGUpJiZDKDEpO2NvbnRpbnVlfX12YXIgYj12b2lkIDAsJD12b2lkIDAsdz12b2lkIDA7aWYoZD49MCl7Zm9yKCQ9ZS5zbGljZShkKTshKFRvLnRlc3QoJCl8fE9vLnRlc3QoJCl8fE5vLnRlc3QoJCl8fGpvLnRlc3QoJCl8fCh3PSQuaW5kZXhPZihcIjxcIiwxKSk8MCk7KWQrPXcsJD1lLnNsaWNlKGQpO2I9ZS5zdWJzdHJpbmcoMCxkKX1kPDAmJihiPWUpLGImJkMoYi5sZW5ndGgpLHQuY2hhcnMmJmImJnQuY2hhcnMoYixjLWIubGVuZ3RoLGMpfWlmKGU9PT1uKXt0LmNoYXJzJiZ0LmNoYXJzKGUpO2JyZWFrfX1mdW5jdGlvbiBDKHQpe2MrPXQsZT1lLnN1YnN0cmluZyh0KX1mdW5jdGlvbiB4KCl7dmFyIHQ9ZS5tYXRjaChPbyk7aWYodCl7dmFyIG4scixpPXt0YWdOYW1lOnRbMV0sYXR0cnM6W10sc3RhcnQ6Y307Zm9yKEModFswXS5sZW5ndGgpOyEobj1lLm1hdGNoKFNvKSkmJihyPWUubWF0Y2goeG8pfHxlLm1hdGNoKENvKSk7KXIuc3RhcnQ9YyxDKHJbMF0ubGVuZ3RoKSxyLmVuZD1jLGkuYXR0cnMucHVzaChyKTtpZihuKXJldHVybiBpLnVuYXJ5U2xhc2g9blsxXSxDKG5bMF0ubGVuZ3RoKSxpLmVuZD1jLGl9fWZ1bmN0aW9uIGsoZSl7dmFyIG49ZS50YWdOYW1lLGM9ZS51bmFyeVNsYXNoO28mJihcInBcIj09PXImJndvKG4pJiZBKHIpLHMobikmJnI9PT1uJiZBKG4pKTtmb3IodmFyIHU9YShuKXx8ISFjLGw9ZS5hdHRycy5sZW5ndGgsZj1uZXcgQXJyYXkobCkscD0wO3A8bDtwKyspe3ZhciBkPWUuYXR0cnNbcF0sdj1kWzNdfHxkWzRdfHxkWzVdfHxcIlwiLGg9XCJhXCI9PT1uJiZcImhyZWZcIj09PWRbMV0/dC5zaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWY6dC5zaG91bGREZWNvZGVOZXdsaW5lcztmW3BdPXtuYW1lOmRbMV0sdmFsdWU6SG8odixoKX19dXx8KGkucHVzaCh7dGFnOm4sbG93ZXJDYXNlZFRhZzpuLnRvTG93ZXJDYXNlKCksYXR0cnM6ZixzdGFydDplLnN0YXJ0LGVuZDplLmVuZH0pLHI9biksdC5zdGFydCYmdC5zdGFydChuLGYsdSxlLnN0YXJ0LGUuZW5kKX1mdW5jdGlvbiBBKGUsbixvKXt2YXIgYSxzO2lmKG51bGw9PW4mJihuPWMpLG51bGw9PW8mJihvPWMpLGUpZm9yKHM9ZS50b0xvd2VyQ2FzZSgpLGE9aS5sZW5ndGgtMTthPj0wJiZpW2FdLmxvd2VyQ2FzZWRUYWchPT1zO2EtLSk7ZWxzZSBhPTA7aWYoYT49MCl7Zm9yKHZhciB1PWkubGVuZ3RoLTE7dT49YTt1LS0pdC5lbmQmJnQuZW5kKGlbdV0udGFnLG4sbyk7aS5sZW5ndGg9YSxyPWEmJmlbYS0xXS50YWd9ZWxzZVwiYnJcIj09PXM/dC5zdGFydCYmdC5zdGFydChlLFtdLCEwLG4sbyk6XCJwXCI9PT1zJiYodC5zdGFydCYmdC5zdGFydChlLFtdLCExLG4sbyksdC5lbmQmJnQuZW5kKGUsbixvKSl9QSgpfShlLHt3YXJuOkJvLGV4cGVjdEhUTUw6dC5leHBlY3RIVE1MLGlzVW5hcnlUYWc6dC5pc1VuYXJ5VGFnLGNhbkJlTGVmdE9wZW5UYWc6dC5jYW5CZUxlZnRPcGVuVGFnLHNob3VsZERlY29kZU5ld2xpbmVzOnQuc2hvdWxkRGVjb2RlTmV3bGluZXMsc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOnQuc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmLHNob3VsZEtlZXBDb21tZW50OnQuY29tbWVudHMsb3V0cHV0U291cmNlUmFuZ2U6dC5vdXRwdXRTb3VyY2VSYW5nZSxzdGFydDpmdW5jdGlvbihlLG8sYSxsLGYpe3ZhciBwPXImJnIubnN8fFdvKGUpO3EmJlwic3ZnXCI9PT1wJiYobz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3lhLnRlc3Qoci5uYW1lKXx8KHIubmFtZT1yLm5hbWUucmVwbGFjZShnYSxcIlwiKSx0LnB1c2gocikpfXJldHVybiB0fShvKSk7dmFyIGQsdj11YShlLG8scik7cCYmKHYubnM9cCksXCJzdHlsZVwiIT09KGQ9dikudGFnJiYoXCJzY3JpcHRcIiE9PWQudGFnfHxkLmF0dHJzTWFwLnR5cGUmJlwidGV4dC9qYXZhc2NyaXB0XCIhPT1kLmF0dHJzTWFwLnR5cGUpfHx0ZSgpfHwodi5mb3JiaWRkZW49ITApO2Zvcih2YXIgaD0wO2g8Vm8ubGVuZ3RoO2grKyl2PVZvW2hdKHYsdCl8fHY7c3x8KCFmdW5jdGlvbihlKXtudWxsIT1GcihlLFwidi1wcmVcIikmJihlLnByZT0hMCl9KHYpLHYucHJlJiYocz0hMCkpLEpvKHYudGFnKSYmKGM9ITApLHM/ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5hdHRyc0xpc3Qsbj10Lmxlbmd0aDtpZihuKWZvcih2YXIgcj1lLmF0dHJzPW5ldyBBcnJheShuKSxpPTA7aTxuO2krKylyW2ldPXtuYW1lOnRbaV0ubmFtZSx2YWx1ZTpKU09OLnN0cmluZ2lmeSh0W2ldLnZhbHVlKX0sbnVsbCE9dFtpXS5zdGFydCYmKHJbaV0uc3RhcnQ9dFtpXS5zdGFydCxyW2ldLmVuZD10W2ldLmVuZCk7ZWxzZSBlLnByZXx8KGUucGxhaW49ITApfSh2KTp2LnByb2Nlc3NlZHx8KHBhKHYpLGZ1bmN0aW9uKGUpe3ZhciB0PUZyKGUsXCJ2LWlmXCIpO2lmKHQpZS5pZj10LGRhKGUse2V4cDp0LGJsb2NrOmV9KTtlbHNle251bGwhPUZyKGUsXCJ2LWVsc2VcIikmJihlLmVsc2U9ITApO3ZhciBuPUZyKGUsXCJ2LWVsc2UtaWZcIik7biYmKGUuZWxzZWlmPW4pfX0odiksZnVuY3Rpb24oZSl7bnVsbCE9RnIoZSxcInYtb25jZVwiKSYmKGUub25jZT0hMCl9KHYpKSxufHwobj12KSxhP3Uodik6KHI9dixpLnB1c2godikpfSxlbmQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciBvPWlbaS5sZW5ndGgtMV07aS5sZW5ndGgtPTEscj1pW2kubGVuZ3RoLTFdLHUobyl9LGNoYXJzOmZ1bmN0aW9uKGUsdCxuKXtpZihyJiYoIXF8fFwidGV4dGFyZWFcIiE9PXIudGFnfHxyLmF0dHJzTWFwLnBsYWNlaG9sZGVyIT09ZSkpe3ZhciBpLHUsbCxmPXIuY2hpbGRyZW47aWYoZT1jfHxlLnRyaW0oKT9cInNjcmlwdFwiPT09KGk9cikudGFnfHxcInN0eWxlXCI9PT1pLnRhZz9lOnNhKGUpOmYubGVuZ3RoP2E/XCJjb25kZW5zZVwiPT09YSYmb2EudGVzdChlKT9cIlwiOlwiIFwiOm8/XCIgXCI6XCJcIjpcIlwiKWN8fFwiY29uZGVuc2VcIiE9PWF8fChlPWUucmVwbGFjZShhYSxcIiBcIikpLCFzJiZcIiBcIiE9PWUmJih1PWZ1bmN0aW9uKGUsdCl7dmFyIG49dD9obyh0KTpwbztpZihuLnRlc3QoZSkpe2Zvcih2YXIgcixpLG8sYT1bXSxzPVtdLGM9bi5sYXN0SW5kZXg9MDtyPW4uZXhlYyhlKTspeyhpPXIuaW5kZXgpPmMmJihzLnB1c2gobz1lLnNsaWNlKGMsaSkpLGEucHVzaChKU09OLnN0cmluZ2lmeShvKSkpO3ZhciB1PUFyKHJbMV0udHJpbSgpKTthLnB1c2goXCJfcyhcIit1K1wiKVwiKSxzLnB1c2goe1wiQGJpbmRpbmdcIjp1fSksYz1pK3JbMF0ubGVuZ3RofXJldHVybiBjPGUubGVuZ3RoJiYocy5wdXNoKG89ZS5zbGljZShjKSksYS5wdXNoKEpTT04uc3RyaW5naWZ5KG8pKSkse2V4cHJlc3Npb246YS5qb2luKFwiK1wiKSx0b2tlbnM6c319fShlLFVvKSk/bD17dHlwZToyLGV4cHJlc3Npb246dS5leHByZXNzaW9uLHRva2Vuczp1LnRva2Vucyx0ZXh0OmV9OlwiIFwiPT09ZSYmZi5sZW5ndGgmJlwiIFwiPT09ZltmLmxlbmd0aC0xXS50ZXh0fHwobD17dHlwZTozLHRleHQ6ZX0pLGwmJmYucHVzaChsKX19LGNvbW1lbnQ6ZnVuY3Rpb24oZSx0LG4pe2lmKHIpe3ZhciBpPXt0eXBlOjMsdGV4dDplLGlzQ29tbWVudDohMH07ci5jaGlsZHJlbi5wdXNoKGkpfX19KSxufWZ1bmN0aW9uIGZhKGUsdCl7dmFyIG4scjsocj1JcihuPWUsXCJrZXlcIikpJiYobi5rZXk9ciksZS5wbGFpbj0hZS5rZXkmJiFlLnNjb3BlZFNsb3RzJiYhZS5hdHRyc0xpc3QubGVuZ3RoLGZ1bmN0aW9uKGUpe3ZhciB0PUlyKGUsXCJyZWZcIik7dCYmKGUucmVmPXQsZS5yZWZJbkZvcj1mdW5jdGlvbihlKXt2YXIgdD1lO2Zvcig7dDspe2lmKHZvaWQgMCE9PXQuZm9yKXJldHVybiEwO3Q9dC5wYXJlbnR9cmV0dXJuITF9KGUpKX0oZSksZnVuY3Rpb24oZSl7dmFyIHQ7XCJ0ZW1wbGF0ZVwiPT09ZS50YWc/KHQ9RnIoZSxcInNjb3BlXCIpLGUuc2xvdFNjb3BlPXR8fEZyKGUsXCJzbG90LXNjb3BlXCIpKToodD1GcihlLFwic2xvdC1zY29wZVwiKSkmJihlLnNsb3RTY29wZT10KTt2YXIgbj1JcihlLFwic2xvdFwiKTtuJiYoZS5zbG90VGFyZ2V0PSdcIlwiJz09PW4/J1wiZGVmYXVsdFwiJzpuLGUuc2xvdFRhcmdldER5bmFtaWM9ISghZS5hdHRyc01hcFtcIjpzbG90XCJdJiYhZS5hdHRyc01hcFtcInYtYmluZDpzbG90XCJdKSxcInRlbXBsYXRlXCI9PT1lLnRhZ3x8ZS5zbG90U2NvcGV8fE5yKGUsXCJzbG90XCIsbixmdW5jdGlvbihlLHQpe3JldHVybiBlLnJhd0F0dHJzTWFwW1wiOlwiK3RdfHxlLnJhd0F0dHJzTWFwW1widi1iaW5kOlwiK3RdfHxlLnJhd0F0dHJzTWFwW3RdfShlLFwic2xvdFwiKSkpO2lmKFwidGVtcGxhdGVcIj09PWUudGFnKXt2YXIgcj1QcihlLGlhKTtpZihyKXt2YXIgaT12YShyKSxvPWkubmFtZSxhPWkuZHluYW1pYztlLnNsb3RUYXJnZXQ9byxlLnNsb3RUYXJnZXREeW5hbWljPWEsZS5zbG90U2NvcGU9ci52YWx1ZXx8Y2F9fWVsc2V7dmFyIHM9UHIoZSxpYSk7aWYocyl7dmFyIGM9ZS5zY29wZWRTbG90c3x8KGUuc2NvcGVkU2xvdHM9e30pLHU9dmEocyksbD11Lm5hbWUsZj11LmR5bmFtaWMscD1jW2xdPXVhKFwidGVtcGxhdGVcIixbXSxlKTtwLnNsb3RUYXJnZXQ9bCxwLnNsb3RUYXJnZXREeW5hbWljPWYscC5jaGlsZHJlbj1lLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbihlKXtpZighZS5zbG90U2NvcGUpcmV0dXJuIGUucGFyZW50PXAsITB9KSxwLnNsb3RTY29wZT1zLnZhbHVlfHxjYSxlLmNoaWxkcmVuPVtdLGUucGxhaW49ITF9fX0oZSksZnVuY3Rpb24oZSl7XCJzbG90XCI9PT1lLnRhZyYmKGUuc2xvdE5hbWU9SXIoZSxcIm5hbWVcIikpfShlKSxmdW5jdGlvbihlKXt2YXIgdDsodD1JcihlLFwiaXNcIikpJiYoZS5jb21wb25lbnQ9dCk7bnVsbCE9RnIoZSxcImlubGluZS10ZW1wbGF0ZVwiKSYmKGUuaW5saW5lVGVtcGxhdGU9ITApfShlKTtmb3IodmFyIGk9MDtpPHpvLmxlbmd0aDtpKyspZT16b1tpXShlLHQpfHxlO3JldHVybiBmdW5jdGlvbihlKXt2YXIgdCxuLHIsaSxvLGEscyxjLHU9ZS5hdHRyc0xpc3Q7Zm9yKHQ9MCxuPXUubGVuZ3RoO3Q8bjt0KyspaWYocj1pPXVbdF0ubmFtZSxvPXVbdF0udmFsdWUsR28udGVzdChyKSlpZihlLmhhc0JpbmRpbmdzPSEwLChhPWhhKHIucmVwbGFjZShHbyxcIlwiKSkpJiYocj1yLnJlcGxhY2UocmEsXCJcIikpLG5hLnRlc3Qocikpcj1yLnJlcGxhY2UobmEsXCJcIiksbz1BcihvKSwoYz1lYS50ZXN0KHIpKSYmKHI9ci5zbGljZSgxLC0xKSksYSYmKGEucHJvcCYmIWMmJlwiaW5uZXJIdG1sXCI9PT0ocj1iKHIpKSYmKHI9XCJpbm5lckhUTUxcIiksYS5jYW1lbCYmIWMmJihyPWIocikpLGEuc3luYyYmKHM9QnIobyxcIiRldmVudFwiKSxjP01yKGUsJ1widXBkYXRlOlwiKygnK3IrXCIpXCIscyxudWxsLCExLDAsdVt0XSwhMCk6KE1yKGUsXCJ1cGRhdGU6XCIrYihyKSxzLG51bGwsITEsMCx1W3RdKSxDKHIpIT09YihyKSYmTXIoZSxcInVwZGF0ZTpcIitDKHIpLHMsbnVsbCwhMSwwLHVbdF0pKSkpLGEmJmEucHJvcHx8IWUuY29tcG9uZW50JiZxbyhlLnRhZyxlLmF0dHJzTWFwLnR5cGUscik/RXIoZSxyLG8sdVt0XSxjKTpOcihlLHIsbyx1W3RdLGMpO2Vsc2UgaWYoWm8udGVzdChyKSlyPXIucmVwbGFjZShabyxcIlwiKSwoYz1lYS50ZXN0KHIpKSYmKHI9ci5zbGljZSgxLC0xKSksTXIoZSxyLG8sYSwhMSwwLHVbdF0sYyk7ZWxzZXt2YXIgbD0ocj1yLnJlcGxhY2UoR28sXCJcIikpLm1hdGNoKHRhKSxmPWwmJmxbMV07Yz0hMSxmJiYocj1yLnNsaWNlKDAsLShmLmxlbmd0aCsxKSksZWEudGVzdChmKSYmKGY9Zi5zbGljZSgxLC0xKSxjPSEwKSksRHIoZSxyLGksbyxmLGMsYSx1W3RdKX1lbHNlIE5yKGUscixKU09OLnN0cmluZ2lmeShvKSx1W3RdKSwhZS5jb21wb25lbnQmJlwibXV0ZWRcIj09PXImJnFvKGUudGFnLGUuYXR0cnNNYXAudHlwZSxyKSYmRXIoZSxyLFwidHJ1ZVwiLHVbdF0pfShlKSxlfWZ1bmN0aW9uIHBhKGUpe3ZhciB0O2lmKHQ9RnIoZSxcInYtZm9yXCIpKXt2YXIgbj1mdW5jdGlvbihlKXt2YXIgdD1lLm1hdGNoKFhvKTtpZighdClyZXR1cm47dmFyIG49e307bi5mb3I9dFsyXS50cmltKCk7dmFyIHI9dFsxXS50cmltKCkucmVwbGFjZShRbyxcIlwiKSxpPXIubWF0Y2goWW8pO2k/KG4uYWxpYXM9ci5yZXBsYWNlKFlvLFwiXCIpLnRyaW0oKSxuLml0ZXJhdG9yMT1pWzFdLnRyaW0oKSxpWzJdJiYobi5pdGVyYXRvcjI9aVsyXS50cmltKCkpKTpuLmFsaWFzPXI7cmV0dXJuIG59KHQpO24mJkEoZSxuKX19ZnVuY3Rpb24gZGEoZSx0KXtlLmlmQ29uZGl0aW9uc3x8KGUuaWZDb25kaXRpb25zPVtdKSxlLmlmQ29uZGl0aW9ucy5wdXNoKHQpfWZ1bmN0aW9uIHZhKGUpe3ZhciB0PWUubmFtZS5yZXBsYWNlKGlhLFwiXCIpO3JldHVybiB0fHxcIiNcIiE9PWUubmFtZVswXSYmKHQ9XCJkZWZhdWx0XCIpLGVhLnRlc3QodCk/e25hbWU6dC5zbGljZSgxLC0xKSxkeW5hbWljOiEwfTp7bmFtZTonXCInK3QrJ1wiJyxkeW5hbWljOiExfX1mdW5jdGlvbiBoYShlKXt2YXIgdD1lLm1hdGNoKHJhKTtpZih0KXt2YXIgbj17fTtyZXR1cm4gdC5mb3JFYWNoKGZ1bmN0aW9uKGUpe25bZS5zbGljZSgxKV09ITB9KSxufX1mdW5jdGlvbiBtYShlKXtmb3IodmFyIHQ9e30sbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0W2Vbbl0ubmFtZV09ZVtuXS52YWx1ZTtyZXR1cm4gdH12YXIgeWE9L154bWxuczpOU1xcZCsvLGdhPS9eTlNcXGQrOi87ZnVuY3Rpb24gX2EoZSl7cmV0dXJuIHVhKGUudGFnLGUuYXR0cnNMaXN0LnNsaWNlKCksZS5wYXJlbnQpfXZhciBiYT1bbW8sZ28se3ByZVRyYW5zZm9ybU5vZGU6ZnVuY3Rpb24oZSx0KXtpZihcImlucHV0XCI9PT1lLnRhZyl7dmFyIG4scj1lLmF0dHJzTWFwO2lmKCFyW1widi1tb2RlbFwiXSlyZXR1cm47aWYoKHJbXCI6dHlwZVwiXXx8cltcInYtYmluZDp0eXBlXCJdKSYmKG49SXIoZSxcInR5cGVcIikpLHIudHlwZXx8bnx8IXJbXCJ2LWJpbmRcIl18fChuPVwiKFwiK3JbXCJ2LWJpbmRcIl0rXCIpLnR5cGVcIiksbil7dmFyIGk9RnIoZSxcInYtaWZcIiwhMCksbz1pP1wiJiYoXCIraStcIilcIjpcIlwiLGE9bnVsbCE9RnIoZSxcInYtZWxzZVwiLCEwKSxzPUZyKGUsXCJ2LWVsc2UtaWZcIiwhMCksYz1fYShlKTtwYShjKSxqcihjLFwidHlwZVwiLFwiY2hlY2tib3hcIiksZmEoYyx0KSxjLnByb2Nlc3NlZD0hMCxjLmlmPVwiKFwiK24rXCIpPT09J2NoZWNrYm94J1wiK28sZGEoYyx7ZXhwOmMuaWYsYmxvY2s6Y30pO3ZhciB1PV9hKGUpO0ZyKHUsXCJ2LWZvclwiLCEwKSxqcih1LFwidHlwZVwiLFwicmFkaW9cIiksZmEodSx0KSxkYShjLHtleHA6XCIoXCIrbitcIik9PT0ncmFkaW8nXCIrbyxibG9jazp1fSk7dmFyIGw9X2EoZSk7cmV0dXJuIEZyKGwsXCJ2LWZvclwiLCEwKSxqcihsLFwiOnR5cGVcIixuKSxmYShsLHQpLGRhKGMse2V4cDppLGJsb2NrOmx9KSxhP2MuZWxzZT0hMDpzJiYoYy5lbHNlaWY9cyksY319fX1dO3ZhciAkYSx3YSxDYT17ZXhwZWN0SFRNTDohMCxtb2R1bGVzOmJhLGRpcmVjdGl2ZXM6e21vZGVsOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlLGk9dC5tb2RpZmllcnMsbz1lLnRhZyxhPWUuYXR0cnNNYXAudHlwZTtpZihlLmNvbXBvbmVudClyZXR1cm4gSHIoZSxyLGkpLCExO2lmKFwic2VsZWN0XCI9PT1vKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9J3ZhciAkJHNlbGVjdGVkVmFsID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucyxmdW5jdGlvbihvKXtyZXR1cm4gby5zZWxlY3RlZH0pLm1hcChmdW5jdGlvbihvKXt2YXIgdmFsID0gXCJfdmFsdWVcIiBpbiBvID8gby5fdmFsdWUgOiBvLnZhbHVlO3JldHVybiAnKyhuJiZuLm51bWJlcj9cIl9uKHZhbClcIjpcInZhbFwiKStcIn0pO1wiO3I9citcIiBcIitCcih0LFwiJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdXCIpLE1yKGUsXCJjaGFuZ2VcIixyLG51bGwsITApfShlLHIsaSk7ZWxzZSBpZihcImlucHV0XCI9PT1vJiZcImNoZWNrYm94XCI9PT1hKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsaT1JcihlLFwidmFsdWVcIil8fFwibnVsbFwiLG89SXIoZSxcInRydWUtdmFsdWVcIil8fFwidHJ1ZVwiLGE9SXIoZSxcImZhbHNlLXZhbHVlXCIpfHxcImZhbHNlXCI7RXIoZSxcImNoZWNrZWRcIixcIkFycmF5LmlzQXJyYXkoXCIrdCtcIik/X2koXCIrdCtcIixcIitpK1wiKT4tMVwiKyhcInRydWVcIj09PW8/XCI6KFwiK3QrXCIpXCI6XCI6X3EoXCIrdCtcIixcIitvK1wiKVwiKSksTXIoZSxcImNoYW5nZVwiLFwidmFyICQkYT1cIit0K1wiLCQkZWw9JGV2ZW50LnRhcmdldCwkJGM9JCRlbC5jaGVja2VkPyhcIitvK1wiKTooXCIrYStcIik7aWYoQXJyYXkuaXNBcnJheSgkJGEpKXt2YXIgJCR2PVwiKyhyP1wiX24oXCIraStcIilcIjppKStcIiwkJGk9X2koJCRhLCQkdik7aWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKFwiK0JyKHQsXCIkJGEuY29uY2F0KFskJHZdKVwiKStcIil9ZWxzZXskJGk+LTEmJihcIitCcih0LFwiJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSlcIikrXCIpfX1lbHNle1wiK0JyKHQsXCIkJGNcIikrXCJ9XCIsbnVsbCwhMCl9KGUscixpKTtlbHNlIGlmKFwiaW5wdXRcIj09PW8mJlwicmFkaW9cIj09PWEpIWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uJiZuLm51bWJlcixpPUlyKGUsXCJ2YWx1ZVwiKXx8XCJudWxsXCI7RXIoZSxcImNoZWNrZWRcIixcIl9xKFwiK3QrXCIsXCIrKGk9cj9cIl9uKFwiK2krXCIpXCI6aSkrXCIpXCIpLE1yKGUsXCJjaGFuZ2VcIixCcih0LGkpLG51bGwsITApfShlLHIsaSk7ZWxzZSBpZihcImlucHV0XCI9PT1vfHxcInRleHRhcmVhXCI9PT1vKSFmdW5jdGlvbihlLHQsbil7dmFyIHI9ZS5hdHRyc01hcC50eXBlLGk9bnx8e30sbz1pLmxhenksYT1pLm51bWJlcixzPWkudHJpbSxjPSFvJiZcInJhbmdlXCIhPT1yLHU9bz9cImNoYW5nZVwiOlwicmFuZ2VcIj09PXI/V3I6XCJpbnB1dFwiLGw9XCIkZXZlbnQudGFyZ2V0LnZhbHVlXCI7cyYmKGw9XCIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKVwiKSxhJiYobD1cIl9uKFwiK2wrXCIpXCIpO3ZhciBmPUJyKHQsbCk7YyYmKGY9XCJpZigkZXZlbnQudGFyZ2V0LmNvbXBvc2luZylyZXR1cm47XCIrZiksRXIoZSxcInZhbHVlXCIsXCIoXCIrdCtcIilcIiksTXIoZSx1LGYsbnVsbCwhMCksKHN8fGEpJiZNcihlLFwiYmx1clwiLFwiJGZvcmNlVXBkYXRlKClcIil9KGUscixpKTtlbHNlIGlmKCFGLmlzUmVzZXJ2ZWRUYWcobykpcmV0dXJuIEhyKGUscixpKSwhMTtyZXR1cm4hMH0sdGV4dDpmdW5jdGlvbihlLHQpe3QudmFsdWUmJkVyKGUsXCJ0ZXh0Q29udGVudFwiLFwiX3MoXCIrdC52YWx1ZStcIilcIix0KX0saHRtbDpmdW5jdGlvbihlLHQpe3QudmFsdWUmJkVyKGUsXCJpbm5lckhUTUxcIixcIl9zKFwiK3QudmFsdWUrXCIpXCIsdCl9fSxpc1ByZVRhZzpmdW5jdGlvbihlKXtyZXR1cm5cInByZVwiPT09ZX0saXNVbmFyeVRhZzpibyxtdXN0VXNlUHJvcDpqbixjYW5CZUxlZnRPcGVuVGFnOiRvLGlzUmVzZXJ2ZWRUYWc6V24sZ2V0VGFnTmFtZXNwYWNlOlpuLHN0YXRpY0tleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQuc3RhdGljS2V5c3x8W10pfSxbXSkuam9pbihcIixcIil9KGJhKX0seGE9ZyhmdW5jdGlvbihlKXtyZXR1cm4gcChcInR5cGUsdGFnLGF0dHJzTGlzdCxhdHRyc01hcCxwbGFpbixwYXJlbnQsY2hpbGRyZW4sYXR0cnMsc3RhcnQsZW5kLHJhd0F0dHJzTWFwXCIrKGU/XCIsXCIrZTpcIlwiKSl9KTtmdW5jdGlvbiBrYShlLHQpe2UmJigkYT14YSh0LnN0YXRpY0tleXN8fFwiXCIpLHdhPXQuaXNSZXNlcnZlZFRhZ3x8VCxmdW5jdGlvbiBlKHQpe3Quc3RhdGljPWZ1bmN0aW9uKGUpe2lmKDI9PT1lLnR5cGUpcmV0dXJuITE7aWYoMz09PWUudHlwZSlyZXR1cm4hMDtyZXR1cm4hKCFlLnByZSYmKGUuaGFzQmluZGluZ3N8fGUuaWZ8fGUuZm9yfHxkKGUudGFnKXx8IXdhKGUudGFnKXx8ZnVuY3Rpb24oZSl7Zm9yKDtlLnBhcmVudDspe2lmKFwidGVtcGxhdGVcIiE9PShlPWUucGFyZW50KS50YWcpcmV0dXJuITE7aWYoZS5mb3IpcmV0dXJuITB9cmV0dXJuITF9KGUpfHwhT2JqZWN0LmtleXMoZSkuZXZlcnkoJGEpKSl9KHQpO2lmKDE9PT10LnR5cGUpe2lmKCF3YSh0LnRhZykmJlwic2xvdFwiIT09dC50YWcmJm51bGw9PXQuYXR0cnNNYXBbXCJpbmxpbmUtdGVtcGxhdGVcIl0pcmV0dXJuO2Zvcih2YXIgbj0wLHI9dC5jaGlsZHJlbi5sZW5ndGg7bjxyO24rKyl7dmFyIGk9dC5jaGlsZHJlbltuXTtlKGkpLGkuc3RhdGljfHwodC5zdGF0aWM9ITEpfWlmKHQuaWZDb25kaXRpb25zKWZvcih2YXIgbz0xLGE9dC5pZkNvbmRpdGlvbnMubGVuZ3RoO288YTtvKyspe3ZhciBzPXQuaWZDb25kaXRpb25zW29dLmJsb2NrO2Uocykscy5zdGF0aWN8fCh0LnN0YXRpYz0hMSl9fX0oZSksZnVuY3Rpb24gZSh0LG4pe2lmKDE9PT10LnR5cGUpe2lmKCh0LnN0YXRpY3x8dC5vbmNlKSYmKHQuc3RhdGljSW5Gb3I9biksdC5zdGF0aWMmJnQuY2hpbGRyZW4ubGVuZ3RoJiYoMSE9PXQuY2hpbGRyZW4ubGVuZ3RofHwzIT09dC5jaGlsZHJlblswXS50eXBlKSlyZXR1cm4gdm9pZCh0LnN0YXRpY1Jvb3Q9ITApO2lmKHQuc3RhdGljUm9vdD0hMSx0LmNoaWxkcmVuKWZvcih2YXIgcj0wLGk9dC5jaGlsZHJlbi5sZW5ndGg7cjxpO3IrKyllKHQuY2hpbGRyZW5bcl0sbnx8ISF0LmZvcik7aWYodC5pZkNvbmRpdGlvbnMpZm9yKHZhciBvPTEsYT10LmlmQ29uZGl0aW9ucy5sZW5ndGg7bzxhO28rKyllKHQuaWZDb25kaXRpb25zW29dLmJsb2NrLG4pfX0oZSwhMSkpfXZhciBBYT0vXihbXFx3JF9dK3xcXChbXildKj9cXCkpXFxzKj0+fF5mdW5jdGlvbig/OlxccytbXFx3JF0rKT9cXHMqXFwoLyxPYT0vXFwoW14pXSo/XFwpOyokLyxTYT0vXltBLVphLXpfJF1bXFx3JF0qKD86XFwuW0EtWmEtel8kXVtcXHckXSp8XFxbJ1teJ10qPyddfFxcW1wiW15cIl0qP1wiXXxcXFtcXGQrXXxcXFtbQS1aYS16XyRdW1xcdyRdKl0pKiQvLFRhPXtlc2M6MjcsdGFiOjksZW50ZXI6MTMsc3BhY2U6MzIsdXA6MzgsbGVmdDozNyxyaWdodDozOSxkb3duOjQwLGRlbGV0ZTpbOCw0Nl19LEVhPXtlc2M6W1wiRXNjXCIsXCJFc2NhcGVcIl0sdGFiOlwiVGFiXCIsZW50ZXI6XCJFbnRlclwiLHNwYWNlOltcIiBcIixcIlNwYWNlYmFyXCJdLHVwOltcIlVwXCIsXCJBcnJvd1VwXCJdLGxlZnQ6W1wiTGVmdFwiLFwiQXJyb3dMZWZ0XCJdLHJpZ2h0OltcIlJpZ2h0XCIsXCJBcnJvd1JpZ2h0XCJdLGRvd246W1wiRG93blwiLFwiQXJyb3dEb3duXCJdLGRlbGV0ZTpbXCJCYWNrc3BhY2VcIixcIkRlbGV0ZVwiLFwiRGVsXCJdfSxOYT1mdW5jdGlvbihlKXtyZXR1cm5cImlmKFwiK2UrXCIpcmV0dXJuIG51bGw7XCJ9LGphPXtzdG9wOlwiJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1wiLHByZXZlbnQ6XCIkZXZlbnQucHJldmVudERlZmF1bHQoKTtcIixzZWxmOk5hKFwiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXRcIiksY3RybDpOYShcIiEkZXZlbnQuY3RybEtleVwiKSxzaGlmdDpOYShcIiEkZXZlbnQuc2hpZnRLZXlcIiksYWx0Ok5hKFwiISRldmVudC5hbHRLZXlcIiksbWV0YTpOYShcIiEkZXZlbnQubWV0YUtleVwiKSxsZWZ0Ok5hKFwiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDBcIiksbWlkZGxlOk5hKFwiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDFcIikscmlnaHQ6TmEoXCInYnV0dG9uJyBpbiAkZXZlbnQgJiYgJGV2ZW50LmJ1dHRvbiAhPT0gMlwiKX07ZnVuY3Rpb24gRGEoZSx0KXt2YXIgbj10P1wibmF0aXZlT246XCI6XCJvbjpcIixyPVwiXCIsaT1cIlwiO2Zvcih2YXIgbyBpbiBlKXt2YXIgYT1MYShlW29dKTtlW29dJiZlW29dLmR5bmFtaWM/aSs9bytcIixcIithK1wiLFwiOnIrPSdcIicrbysnXCI6JythK1wiLFwifXJldHVybiByPVwie1wiK3Iuc2xpY2UoMCwtMSkrXCJ9XCIsaT9uK1wiX2QoXCIrcitcIixbXCIraS5zbGljZSgwLC0xKStcIl0pXCI6bityfWZ1bmN0aW9uIExhKGUpe2lmKCFlKXJldHVyblwiZnVuY3Rpb24oKXt9XCI7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm5cIltcIitlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gTGEoZSl9KS5qb2luKFwiLFwiKStcIl1cIjt2YXIgdD1TYS50ZXN0KGUudmFsdWUpLG49QWEudGVzdChlLnZhbHVlKSxyPVNhLnRlc3QoZS52YWx1ZS5yZXBsYWNlKE9hLFwiXCIpKTtpZihlLm1vZGlmaWVycyl7dmFyIGk9XCJcIixvPVwiXCIsYT1bXTtmb3IodmFyIHMgaW4gZS5tb2RpZmllcnMpaWYoamFbc10pbys9amFbc10sVGFbc10mJmEucHVzaChzKTtlbHNlIGlmKFwiZXhhY3RcIj09PXMpe3ZhciBjPWUubW9kaWZpZXJzO28rPU5hKFtcImN0cmxcIixcInNoaWZ0XCIsXCJhbHRcIixcIm1ldGFcIl0uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiFjW2VdfSkubWFwKGZ1bmN0aW9uKGUpe3JldHVyblwiJGV2ZW50LlwiK2UrXCJLZXlcIn0pLmpvaW4oXCJ8fFwiKSl9ZWxzZSBhLnB1c2gocyk7cmV0dXJuIGEubGVuZ3RoJiYoaSs9ZnVuY3Rpb24oZSl7cmV0dXJuXCJpZighJGV2ZW50LnR5cGUuaW5kZXhPZigna2V5JykmJlwiK2UubWFwKE1hKS5qb2luKFwiJiZcIikrXCIpcmV0dXJuIG51bGw7XCJ9KGEpKSxvJiYoaSs9byksXCJmdW5jdGlvbigkZXZlbnQpe1wiK2krKHQ/XCJyZXR1cm4gXCIrZS52YWx1ZStcIigkZXZlbnQpXCI6bj9cInJldHVybiAoXCIrZS52YWx1ZStcIikoJGV2ZW50KVwiOnI/XCJyZXR1cm4gXCIrZS52YWx1ZTplLnZhbHVlKStcIn1cIn1yZXR1cm4gdHx8bj9lLnZhbHVlOlwiZnVuY3Rpb24oJGV2ZW50KXtcIisocj9cInJldHVybiBcIitlLnZhbHVlOmUudmFsdWUpK1wifVwifWZ1bmN0aW9uIE1hKGUpe3ZhciB0PXBhcnNlSW50KGUsMTApO2lmKHQpcmV0dXJuXCIkZXZlbnQua2V5Q29kZSE9PVwiK3Q7dmFyIG49VGFbZV0scj1FYVtlXTtyZXR1cm5cIl9rKCRldmVudC5rZXlDb2RlLFwiK0pTT04uc3RyaW5naWZ5KGUpK1wiLFwiK0pTT04uc3RyaW5naWZ5KG4pK1wiLCRldmVudC5rZXksXCIrSlNPTi5zdHJpbmdpZnkocikrXCIpXCJ9dmFyIElhPXtvbjpmdW5jdGlvbihlLHQpe2Uud3JhcExpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm5cIl9nKFwiK2UrXCIsXCIrdC52YWx1ZStcIilcIn19LGJpbmQ6ZnVuY3Rpb24oZSx0KXtlLndyYXBEYXRhPWZ1bmN0aW9uKG4pe3JldHVyblwiX2IoXCIrbitcIiwnXCIrZS50YWcrXCInLFwiK3QudmFsdWUrXCIsXCIrKHQubW9kaWZpZXJzJiZ0Lm1vZGlmaWVycy5wcm9wP1widHJ1ZVwiOlwiZmFsc2VcIikrKHQubW9kaWZpZXJzJiZ0Lm1vZGlmaWVycy5zeW5jP1wiLHRydWVcIjpcIlwiKStcIilcIn19LGNsb2FrOlN9LEZhPWZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucz1lLHRoaXMud2Fybj1lLndhcm58fFNyLHRoaXMudHJhbnNmb3Jtcz1UcihlLm1vZHVsZXMsXCJ0cmFuc2Zvcm1Db2RlXCIpLHRoaXMuZGF0YUdlbkZucz1UcihlLm1vZHVsZXMsXCJnZW5EYXRhXCIpLHRoaXMuZGlyZWN0aXZlcz1BKEEoe30sSWEpLGUuZGlyZWN0aXZlcyk7dmFyIHQ9ZS5pc1Jlc2VydmVkVGFnfHxUO3RoaXMubWF5YmVDb21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuISFlLmNvbXBvbmVudHx8IXQoZS50YWcpfSx0aGlzLm9uY2VJZD0wLHRoaXMuc3RhdGljUmVuZGVyRm5zPVtdLHRoaXMucHJlPSExfTtmdW5jdGlvbiBQYShlLHQpe3ZhciBuPW5ldyBGYSh0KTtyZXR1cm57cmVuZGVyOlwid2l0aCh0aGlzKXtyZXR1cm4gXCIrKGU/UmEoZSxuKTonX2MoXCJkaXZcIiknKStcIn1cIixzdGF0aWNSZW5kZXJGbnM6bi5zdGF0aWNSZW5kZXJGbnN9fWZ1bmN0aW9uIFJhKGUsdCl7aWYoZS5wYXJlbnQmJihlLnByZT1lLnByZXx8ZS5wYXJlbnQucHJlKSxlLnN0YXRpY1Jvb3QmJiFlLnN0YXRpY1Byb2Nlc3NlZClyZXR1cm4gSGEoZSx0KTtpZihlLm9uY2UmJiFlLm9uY2VQcm9jZXNzZWQpcmV0dXJuIEJhKGUsdCk7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gemEoZSx0KTtpZihlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gVWEoZSx0KTtpZihcInRlbXBsYXRlXCIhPT1lLnRhZ3x8ZS5zbG90VGFyZ2V0fHx0LnByZSl7aWYoXCJzbG90XCI9PT1lLnRhZylyZXR1cm4gZnVuY3Rpb24oZSx0KXt2YXIgbj1lLnNsb3ROYW1lfHwnXCJkZWZhdWx0XCInLHI9cWEoZSx0KSxpPVwiX3QoXCIrbisocj9cIixcIityOlwiXCIpLG89ZS5hdHRyc3x8ZS5keW5hbWljQXR0cnM/R2EoKGUuYXR0cnN8fFtdKS5jb25jYXQoZS5keW5hbWljQXR0cnN8fFtdKS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJue25hbWU6YihlLm5hbWUpLHZhbHVlOmUudmFsdWUsZHluYW1pYzplLmR5bmFtaWN9fSkpOm51bGwsYT1lLmF0dHJzTWFwW1widi1iaW5kXCJdOyFvJiYhYXx8cnx8KGkrPVwiLG51bGxcIik7byYmKGkrPVwiLFwiK28pO2EmJihpKz0obz9cIlwiOlwiLG51bGxcIikrXCIsXCIrYSk7cmV0dXJuIGkrXCIpXCJ9KGUsdCk7dmFyIG47aWYoZS5jb21wb25lbnQpbj1mdW5jdGlvbihlLHQsbil7dmFyIHI9dC5pbmxpbmVUZW1wbGF0ZT9udWxsOnFhKHQsbiwhMCk7cmV0dXJuXCJfYyhcIitlK1wiLFwiK1ZhKHQsbikrKHI/XCIsXCIrcjpcIlwiKStcIilcIn0oZS5jb21wb25lbnQsZSx0KTtlbHNle3ZhciByOyghZS5wbGFpbnx8ZS5wcmUmJnQubWF5YmVDb21wb25lbnQoZSkpJiYocj1WYShlLHQpKTt2YXIgaT1lLmlubGluZVRlbXBsYXRlP251bGw6cWEoZSx0LCEwKTtuPVwiX2MoJ1wiK2UudGFnK1wiJ1wiKyhyP1wiLFwiK3I6XCJcIikrKGk/XCIsXCIraTpcIlwiKStcIilcIn1mb3IodmFyIG89MDtvPHQudHJhbnNmb3Jtcy5sZW5ndGg7bysrKW49dC50cmFuc2Zvcm1zW29dKGUsbik7cmV0dXJuIG59cmV0dXJuIHFhKGUsdCl8fFwidm9pZCAwXCJ9ZnVuY3Rpb24gSGEoZSx0KXtlLnN0YXRpY1Byb2Nlc3NlZD0hMDt2YXIgbj10LnByZTtyZXR1cm4gZS5wcmUmJih0LnByZT1lLnByZSksdC5zdGF0aWNSZW5kZXJGbnMucHVzaChcIndpdGgodGhpcyl7cmV0dXJuIFwiK1JhKGUsdCkrXCJ9XCIpLHQucHJlPW4sXCJfbShcIisodC5zdGF0aWNSZW5kZXJGbnMubGVuZ3RoLTEpKyhlLnN0YXRpY0luRm9yP1wiLHRydWVcIjpcIlwiKStcIilcIn1mdW5jdGlvbiBCYShlLHQpe2lmKGUub25jZVByb2Nlc3NlZD0hMCxlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gVWEoZSx0KTtpZihlLnN0YXRpY0luRm9yKXtmb3IodmFyIG49XCJcIixyPWUucGFyZW50O3I7KXtpZihyLmZvcil7bj1yLmtleTticmVha31yPXIucGFyZW50fXJldHVybiBuP1wiX28oXCIrUmEoZSx0KStcIixcIit0Lm9uY2VJZCsrK1wiLFwiK24rXCIpXCI6UmEoZSx0KX1yZXR1cm4gSGEoZSx0KX1mdW5jdGlvbiBVYShlLHQsbixyKXtyZXR1cm4gZS5pZlByb2Nlc3NlZD0hMCxmdW5jdGlvbiBlKHQsbixyLGkpe2lmKCF0Lmxlbmd0aClyZXR1cm4gaXx8XCJfZSgpXCI7dmFyIG89dC5zaGlmdCgpO3JldHVybiBvLmV4cD9cIihcIitvLmV4cCtcIik/XCIrYShvLmJsb2NrKStcIjpcIitlKHQsbixyLGkpOlwiXCIrYShvLmJsb2NrKTtmdW5jdGlvbiBhKGUpe3JldHVybiByP3IoZSxuKTplLm9uY2U/QmEoZSxuKTpSYShlLG4pfX0oZS5pZkNvbmRpdGlvbnMuc2xpY2UoKSx0LG4scil9ZnVuY3Rpb24gemEoZSx0LG4scil7dmFyIGk9ZS5mb3Isbz1lLmFsaWFzLGE9ZS5pdGVyYXRvcjE/XCIsXCIrZS5pdGVyYXRvcjE6XCJcIixzPWUuaXRlcmF0b3IyP1wiLFwiK2UuaXRlcmF0b3IyOlwiXCI7cmV0dXJuIGUuZm9yUHJvY2Vzc2VkPSEwLChyfHxcIl9sXCIpK1wiKChcIitpK1wiKSxmdW5jdGlvbihcIitvK2ErcytcIil7cmV0dXJuIFwiKyhufHxSYSkoZSx0KStcIn0pXCJ9ZnVuY3Rpb24gVmEoZSx0KXt2YXIgbj1cIntcIixyPWZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5kaXJlY3RpdmVzO2lmKCFuKXJldHVybjt2YXIgcixpLG8sYSxzPVwiZGlyZWN0aXZlczpbXCIsYz0hMTtmb3Iocj0wLGk9bi5sZW5ndGg7cjxpO3IrKyl7bz1uW3JdLGE9ITA7dmFyIHU9dC5kaXJlY3RpdmVzW28ubmFtZV07dSYmKGE9ISF1KGUsbyx0Lndhcm4pKSxhJiYoYz0hMCxzKz0ne25hbWU6XCInK28ubmFtZSsnXCIscmF3TmFtZTpcIicrby5yYXdOYW1lKydcIicrKG8udmFsdWU/XCIsdmFsdWU6KFwiK28udmFsdWUrXCIpLGV4cHJlc3Npb246XCIrSlNPTi5zdHJpbmdpZnkoby52YWx1ZSk6XCJcIikrKG8uYXJnP1wiLGFyZzpcIisoby5pc0R5bmFtaWNBcmc/by5hcmc6J1wiJytvLmFyZysnXCInKTpcIlwiKSsoby5tb2RpZmllcnM/XCIsbW9kaWZpZXJzOlwiK0pTT04uc3RyaW5naWZ5KG8ubW9kaWZpZXJzKTpcIlwiKStcIn0sXCIpfWlmKGMpcmV0dXJuIHMuc2xpY2UoMCwtMSkrXCJdXCJ9KGUsdCk7ciYmKG4rPXIrXCIsXCIpLGUua2V5JiYobis9XCJrZXk6XCIrZS5rZXkrXCIsXCIpLGUucmVmJiYobis9XCJyZWY6XCIrZS5yZWYrXCIsXCIpLGUucmVmSW5Gb3ImJihuKz1cInJlZkluRm9yOnRydWUsXCIpLGUucHJlJiYobis9XCJwcmU6dHJ1ZSxcIiksZS5jb21wb25lbnQmJihuKz0ndGFnOlwiJytlLnRhZysnXCIsJyk7Zm9yKHZhciBpPTA7aTx0LmRhdGFHZW5GbnMubGVuZ3RoO2krKyluKz10LmRhdGFHZW5GbnNbaV0oZSk7aWYoZS5hdHRycyYmKG4rPVwiYXR0cnM6XCIrR2EoZS5hdHRycykrXCIsXCIpLGUucHJvcHMmJihuKz1cImRvbVByb3BzOlwiK0dhKGUucHJvcHMpK1wiLFwiKSxlLmV2ZW50cyYmKG4rPURhKGUuZXZlbnRzLCExKStcIixcIiksZS5uYXRpdmVFdmVudHMmJihuKz1EYShlLm5hdGl2ZUV2ZW50cywhMCkrXCIsXCIpLGUuc2xvdFRhcmdldCYmIWUuc2xvdFNjb3BlJiYobis9XCJzbG90OlwiK2Uuc2xvdFRhcmdldCtcIixcIiksZS5zY29wZWRTbG90cyYmKG4rPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lLmZvcnx8T2JqZWN0LmtleXModCkuc29tZShmdW5jdGlvbihlKXt2YXIgbj10W2VdO3JldHVybiBuLnNsb3RUYXJnZXREeW5hbWljfHxuLmlmfHxuLmZvcnx8S2Eobil9KSxpPSEhZS5pZjtpZighcilmb3IodmFyIG89ZS5wYXJlbnQ7bzspe2lmKG8uc2xvdFNjb3BlJiZvLnNsb3RTY29wZSE9PWNhfHxvLmZvcil7cj0hMDticmVha31vLmlmJiYoaT0hMCksbz1vLnBhcmVudH12YXIgYT1PYmplY3Qua2V5cyh0KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIEphKHRbZV0sbil9KS5qb2luKFwiLFwiKTtyZXR1cm5cInNjb3BlZFNsb3RzOl91KFtcIithK1wiXVwiKyhyP1wiLG51bGwsdHJ1ZVwiOlwiXCIpKyghciYmaT9cIixudWxsLGZhbHNlLFwiK2Z1bmN0aW9uKGUpe3ZhciB0PTUzODEsbj1lLmxlbmd0aDtmb3IoO247KXQ9MzMqdF5lLmNoYXJDb2RlQXQoLS1uKTtyZXR1cm4gdD4+PjB9KGEpOlwiXCIpK1wiKVwifShlLGUuc2NvcGVkU2xvdHMsdCkrXCIsXCIpLGUubW9kZWwmJihuKz1cIm1vZGVsOnt2YWx1ZTpcIitlLm1vZGVsLnZhbHVlK1wiLGNhbGxiYWNrOlwiK2UubW9kZWwuY2FsbGJhY2srXCIsZXhwcmVzc2lvbjpcIitlLm1vZGVsLmV4cHJlc3Npb24rXCJ9LFwiKSxlLmlubGluZVRlbXBsYXRlKXt2YXIgbz1mdW5jdGlvbihlLHQpe3ZhciBuPWUuY2hpbGRyZW5bMF07aWYobiYmMT09PW4udHlwZSl7dmFyIHI9UGEobix0Lm9wdGlvbnMpO3JldHVyblwiaW5saW5lVGVtcGxhdGU6e3JlbmRlcjpmdW5jdGlvbigpe1wiK3IucmVuZGVyK1wifSxzdGF0aWNSZW5kZXJGbnM6W1wiK3Iuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbihlKXtyZXR1cm5cImZ1bmN0aW9uKCl7XCIrZStcIn1cIn0pLmpvaW4oXCIsXCIpK1wiXX1cIn19KGUsdCk7byYmKG4rPW8rXCIsXCIpfXJldHVybiBuPW4ucmVwbGFjZSgvLCQvLFwiXCIpK1wifVwiLGUuZHluYW1pY0F0dHJzJiYobj1cIl9iKFwiK24rJyxcIicrZS50YWcrJ1wiLCcrR2EoZS5keW5hbWljQXR0cnMpK1wiKVwiKSxlLndyYXBEYXRhJiYobj1lLndyYXBEYXRhKG4pKSxlLndyYXBMaXN0ZW5lcnMmJihuPWUud3JhcExpc3RlbmVycyhuKSksbn1mdW5jdGlvbiBLYShlKXtyZXR1cm4gMT09PWUudHlwZSYmKFwic2xvdFwiPT09ZS50YWd8fGUuY2hpbGRyZW4uc29tZShLYSkpfWZ1bmN0aW9uIEphKGUsdCl7dmFyIG49ZS5hdHRyc01hcFtcInNsb3Qtc2NvcGVcIl07aWYoZS5pZiYmIWUuaWZQcm9jZXNzZWQmJiFuKXJldHVybiBVYShlLHQsSmEsXCJudWxsXCIpO2lmKGUuZm9yJiYhZS5mb3JQcm9jZXNzZWQpcmV0dXJuIHphKGUsdCxKYSk7dmFyIHI9ZS5zbG90U2NvcGU9PT1jYT9cIlwiOlN0cmluZyhlLnNsb3RTY29wZSksaT1cImZ1bmN0aW9uKFwiK3IrXCIpe3JldHVybiBcIisoXCJ0ZW1wbGF0ZVwiPT09ZS50YWc/ZS5pZiYmbj9cIihcIitlLmlmK1wiKT9cIisocWEoZSx0KXx8XCJ1bmRlZmluZWRcIikrXCI6dW5kZWZpbmVkXCI6cWEoZSx0KXx8XCJ1bmRlZmluZWRcIjpSYShlLHQpKStcIn1cIixvPXI/XCJcIjpcIixwcm94eTp0cnVlXCI7cmV0dXJuXCJ7a2V5OlwiKyhlLnNsb3RUYXJnZXR8fCdcImRlZmF1bHRcIicpK1wiLGZuOlwiK2krbytcIn1cIn1mdW5jdGlvbiBxYShlLHQsbixyLGkpe3ZhciBvPWUuY2hpbGRyZW47aWYoby5sZW5ndGgpe3ZhciBhPW9bMF07aWYoMT09PW8ubGVuZ3RoJiZhLmZvciYmXCJ0ZW1wbGF0ZVwiIT09YS50YWcmJlwic2xvdFwiIT09YS50YWcpe3ZhciBzPW4/dC5tYXliZUNvbXBvbmVudChhKT9cIiwxXCI6XCIsMFwiOlwiXCI7cmV0dXJuXCJcIisocnx8UmEpKGEsdCkrc312YXIgYz1uP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPTAscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdO2lmKDE9PT1pLnR5cGUpe2lmKFdhKGkpfHxpLmlmQ29uZGl0aW9ucyYmaS5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gV2EoZS5ibG9jayl9KSl7bj0yO2JyZWFrfSh0KGkpfHxpLmlmQ29uZGl0aW9ucyYmaS5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gdChlLmJsb2NrKX0pKSYmKG49MSl9fXJldHVybiBufShvLHQubWF5YmVDb21wb25lbnQpOjAsdT1pfHxaYTtyZXR1cm5cIltcIitvLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdShlLHQpfSkuam9pbihcIixcIikrXCJdXCIrKGM/XCIsXCIrYzpcIlwiKX19ZnVuY3Rpb24gV2EoZSl7cmV0dXJuIHZvaWQgMCE9PWUuZm9yfHxcInRlbXBsYXRlXCI9PT1lLnRhZ3x8XCJzbG90XCI9PT1lLnRhZ31mdW5jdGlvbiBaYShlLHQpe3JldHVybiAxPT09ZS50eXBlP1JhKGUsdCk6Mz09PWUudHlwZSYmZS5pc0NvbW1lbnQ/KHI9ZSxcIl9lKFwiK0pTT04uc3RyaW5naWZ5KHIudGV4dCkrXCIpXCIpOlwiX3YoXCIrKDI9PT0obj1lKS50eXBlP24uZXhwcmVzc2lvbjpYYShKU09OLnN0cmluZ2lmeShuLnRleHQpKSkrXCIpXCI7dmFyIG4scn1mdW5jdGlvbiBHYShlKXtmb3IodmFyIHQ9XCJcIixuPVwiXCIscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgaT1lW3JdLG89WGEoaS52YWx1ZSk7aS5keW5hbWljP24rPWkubmFtZStcIixcIitvK1wiLFwiOnQrPSdcIicraS5uYW1lKydcIjonK28rXCIsXCJ9cmV0dXJuIHQ9XCJ7XCIrdC5zbGljZSgwLC0xKStcIn1cIixuP1wiX2QoXCIrdCtcIixbXCIrbi5zbGljZSgwLC0xKStcIl0pXCI6dH1mdW5jdGlvbiBYYShlKXtyZXR1cm4gZS5yZXBsYWNlKC9cXHUyMDI4L2csXCJcXFxcdTIwMjhcIikucmVwbGFjZSgvXFx1MjAyOS9nLFwiXFxcXHUyMDI5XCIpfW5ldyBSZWdFeHAoXCJcXFxcYlwiK1wiZG8saWYsZm9yLGxldCxuZXcsdHJ5LHZhcixjYXNlLGVsc2Usd2l0aCxhd2FpdCxicmVhayxjYXRjaCxjbGFzcyxjb25zdCxzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsZXh0ZW5kcyxmaW5hbGx5LGNvbnRpbnVlLGRlYnVnZ2VyLGZ1bmN0aW9uLGFyZ3VtZW50c1wiLnNwbGl0KFwiLFwiKS5qb2luKFwiXFxcXGJ8XFxcXGJcIikrXCJcXFxcYlwiKTtmdW5jdGlvbiBZYShlLHQpe3RyeXtyZXR1cm4gbmV3IEZ1bmN0aW9uKGUpfWNhdGNoKG4pe3JldHVybiB0LnB1c2goe2VycjpuLGNvZGU6ZX0pLFN9fWZ1bmN0aW9uIFFhKGUpe3ZhciB0PU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIGZ1bmN0aW9uKG4scixpKXsocj1BKHt9LHIpKS53YXJuO2RlbGV0ZSByLndhcm47dmFyIG89ci5kZWxpbWl0ZXJzP1N0cmluZyhyLmRlbGltaXRlcnMpK246bjtpZih0W29dKXJldHVybiB0W29dO3ZhciBhPWUobixyKSxzPXt9LGM9W107cmV0dXJuIHMucmVuZGVyPVlhKGEucmVuZGVyLGMpLHMuc3RhdGljUmVuZGVyRm5zPWEuc3RhdGljUmVuZGVyRm5zLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gWWEoZSxjKX0pLHRbb109c319dmFyIGVzLHRzLG5zPShlcz1mdW5jdGlvbihlLHQpe3ZhciBuPWxhKGUudHJpbSgpLHQpOyExIT09dC5vcHRpbWl6ZSYma2Eobix0KTt2YXIgcj1QYShuLHQpO3JldHVybnthc3Q6bixyZW5kZXI6ci5yZW5kZXIsc3RhdGljUmVuZGVyRm5zOnIuc3RhdGljUmVuZGVyRm5zfX0sZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh0LG4pe3ZhciByPU9iamVjdC5jcmVhdGUoZSksaT1bXSxvPVtdO2lmKG4pZm9yKHZhciBhIGluIG4ubW9kdWxlcyYmKHIubW9kdWxlcz0oZS5tb2R1bGVzfHxbXSkuY29uY2F0KG4ubW9kdWxlcykpLG4uZGlyZWN0aXZlcyYmKHIuZGlyZWN0aXZlcz1BKE9iamVjdC5jcmVhdGUoZS5kaXJlY3RpdmVzfHxudWxsKSxuLmRpcmVjdGl2ZXMpKSxuKVwibW9kdWxlc1wiIT09YSYmXCJkaXJlY3RpdmVzXCIhPT1hJiYoclthXT1uW2FdKTtyLndhcm49ZnVuY3Rpb24oZSx0LG4peyhuP286aSkucHVzaChlKX07dmFyIHM9ZXModC50cmltKCkscik7cmV0dXJuIHMuZXJyb3JzPWkscy50aXBzPW8sc31yZXR1cm57Y29tcGlsZTp0LGNvbXBpbGVUb0Z1bmN0aW9uczpRYSh0KX19KShDYSkscnM9KG5zLmNvbXBpbGUsbnMuY29tcGlsZVRvRnVuY3Rpb25zKTtmdW5jdGlvbiBpcyhlKXtyZXR1cm4odHM9dHN8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikpLmlubmVySFRNTD1lPyc8YSBocmVmPVwiXFxuXCIvPic6JzxkaXYgYT1cIlxcblwiLz4nLHRzLmlubmVySFRNTC5pbmRleE9mKFwiJiMxMDtcIik+MH12YXIgb3M9ISF6JiZpcyghMSksYXM9ISF6JiZpcyghMCksc3M9ZyhmdW5jdGlvbihlKXt2YXIgdD1ZbihlKTtyZXR1cm4gdCYmdC5pbm5lckhUTUx9KSxjcz13bi5wcm90b3R5cGUuJG1vdW50O3JldHVybiB3bi5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7aWYoKGU9ZSYmWW4oZSkpPT09ZG9jdW1lbnQuYm9keXx8ZT09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudClyZXR1cm4gdGhpczt2YXIgbj10aGlzLiRvcHRpb25zO2lmKCFuLnJlbmRlcil7dmFyIHI9bi50ZW1wbGF0ZTtpZihyKWlmKFwic3RyaW5nXCI9PXR5cGVvZiByKVwiI1wiPT09ci5jaGFyQXQoMCkmJihyPXNzKHIpKTtlbHNle2lmKCFyLm5vZGVUeXBlKXJldHVybiB0aGlzO3I9ci5pbm5lckhUTUx9ZWxzZSBlJiYocj1mdW5jdGlvbihlKXtpZihlLm91dGVySFRNTClyZXR1cm4gZS5vdXRlckhUTUw7dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTtyZXR1cm4gdC5hcHBlbmRDaGlsZChlLmNsb25lTm9kZSghMCkpLHQuaW5uZXJIVE1MfShlKSk7aWYocil7dmFyIGk9cnMocix7b3V0cHV0U291cmNlUmFuZ2U6ITEsc2hvdWxkRGVjb2RlTmV3bGluZXM6b3Msc2hvdWxkRGVjb2RlTmV3bGluZXNGb3JIcmVmOmFzLGRlbGltaXRlcnM6bi5kZWxpbWl0ZXJzLGNvbW1lbnRzOm4uY29tbWVudHN9LHRoaXMpLG89aS5yZW5kZXIsYT1pLnN0YXRpY1JlbmRlckZucztuLnJlbmRlcj1vLG4uc3RhdGljUmVuZGVyRm5zPWF9fXJldHVybiBjcy5jYWxsKHRoaXMsZSx0KX0sd24uY29tcGlsZT1ycyx3bn0pOyIsIi8qIVxuICogdnVleCB2My40LjBcbiAqIChjKSAyMDIwIEV2YW4gWW91XG4gKiBAbGljZW5zZSBNSVRcbiAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5mdW5jdGlvbiBhcHBseU1peGluIChWdWUpIHtcbiAgdmFyIHZlcnNpb24gPSBOdW1iZXIoVnVlLnZlcnNpb24uc3BsaXQoJy4nKVswXSk7XG5cbiAgaWYgKHZlcnNpb24gPj0gMikge1xuICAgIFZ1ZS5taXhpbih7IGJlZm9yZUNyZWF0ZTogdnVleEluaXQgfSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gb3ZlcnJpZGUgaW5pdCBhbmQgaW5qZWN0IHZ1ZXggaW5pdCBwcm9jZWR1cmVcbiAgICAvLyBmb3IgMS54IGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICAgIHZhciBfaW5pdCA9IFZ1ZS5wcm90b3R5cGUuX2luaXQ7XG4gICAgVnVlLnByb3RvdHlwZS5faW5pdCA9IGZ1bmN0aW9uIChvcHRpb25zKSB7XG4gICAgICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICAgICAgb3B0aW9ucy5pbml0ID0gb3B0aW9ucy5pbml0XG4gICAgICAgID8gW3Z1ZXhJbml0XS5jb25jYXQob3B0aW9ucy5pbml0KVxuICAgICAgICA6IHZ1ZXhJbml0O1xuICAgICAgX2luaXQuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICB9O1xuICB9XG5cbiAgLyoqXG4gICAqIFZ1ZXggaW5pdCBob29rLCBpbmplY3RlZCBpbnRvIGVhY2ggaW5zdGFuY2VzIGluaXQgaG9va3MgbGlzdC5cbiAgICovXG5cbiAgZnVuY3Rpb24gdnVleEluaXQgKCkge1xuICAgIHZhciBvcHRpb25zID0gdGhpcy4kb3B0aW9ucztcbiAgICAvLyBzdG9yZSBpbmplY3Rpb25cbiAgICBpZiAob3B0aW9ucy5zdG9yZSkge1xuICAgICAgdGhpcy4kc3RvcmUgPSB0eXBlb2Ygb3B0aW9ucy5zdG9yZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IG9wdGlvbnMuc3RvcmUoKVxuICAgICAgICA6IG9wdGlvbnMuc3RvcmU7XG4gICAgfSBlbHNlIGlmIChvcHRpb25zLnBhcmVudCAmJiBvcHRpb25zLnBhcmVudC4kc3RvcmUpIHtcbiAgICAgIHRoaXMuJHN0b3JlID0gb3B0aW9ucy5wYXJlbnQuJHN0b3JlO1xuICAgIH1cbiAgfVxufVxuXG52YXIgdGFyZ2V0ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCdcbiAgPyB3aW5kb3dcbiAgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJ1xuICAgID8gZ2xvYmFsXG4gICAgOiB7fTtcbnZhciBkZXZ0b29sSG9vayA9IHRhcmdldC5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fO1xuXG5mdW5jdGlvbiBkZXZ0b29sUGx1Z2luIChzdG9yZSkge1xuICBpZiAoIWRldnRvb2xIb29rKSB7IHJldHVybiB9XG5cbiAgc3RvcmUuX2RldnRvb2xIb29rID0gZGV2dG9vbEhvb2s7XG5cbiAgZGV2dG9vbEhvb2suZW1pdCgndnVleDppbml0Jywgc3RvcmUpO1xuXG4gIGRldnRvb2xIb29rLm9uKCd2dWV4OnRyYXZlbC10by1zdGF0ZScsIGZ1bmN0aW9uICh0YXJnZXRTdGF0ZSkge1xuICAgIHN0b3JlLnJlcGxhY2VTdGF0ZSh0YXJnZXRTdGF0ZSk7XG4gIH0pO1xuXG4gIHN0b3JlLnN1YnNjcmliZShmdW5jdGlvbiAobXV0YXRpb24sIHN0YXRlKSB7XG4gICAgZGV2dG9vbEhvb2suZW1pdCgndnVleDptdXRhdGlvbicsIG11dGF0aW9uLCBzdGF0ZSk7XG4gIH0sIHsgcHJlcGVuZDogdHJ1ZSB9KTtcblxuICBzdG9yZS5zdWJzY3JpYmVBY3Rpb24oZnVuY3Rpb24gKGFjdGlvbiwgc3RhdGUpIHtcbiAgICBkZXZ0b29sSG9vay5lbWl0KCd2dWV4OmFjdGlvbicsIGFjdGlvbiwgc3RhdGUpO1xuICB9LCB7IHByZXBlbmQ6IHRydWUgfSk7XG59XG5cbi8qKlxuICogR2V0IHRoZSBmaXJzdCBpdGVtIHRoYXQgcGFzcyB0aGUgdGVzdFxuICogYnkgc2Vjb25kIGFyZ3VtZW50IGZ1bmN0aW9uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gbGlzdFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZlxuICogQHJldHVybiB7Kn1cbiAqL1xuXG4vKipcbiAqIGZvckVhY2ggZm9yIG9iamVjdFxuICovXG5mdW5jdGlvbiBmb3JFYWNoVmFsdWUgKG9iaiwgZm4pIHtcbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsgcmV0dXJuIGZuKG9ialtrZXldLCBrZXkpOyB9KTtcbn1cblxuZnVuY3Rpb24gaXNPYmplY3QgKG9iaikge1xuICByZXR1cm4gb2JqICE9PSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnXG59XG5cbmZ1bmN0aW9uIGlzUHJvbWlzZSAodmFsKSB7XG4gIHJldHVybiB2YWwgJiYgdHlwZW9mIHZhbC50aGVuID09PSAnZnVuY3Rpb24nXG59XG5cbmZ1bmN0aW9uIGFzc2VydCAoY29uZGl0aW9uLCBtc2cpIHtcbiAgaWYgKCFjb25kaXRpb24pIHsgdGhyb3cgbmV3IEVycm9yKChcIlt2dWV4XSBcIiArIG1zZykpIH1cbn1cblxuZnVuY3Rpb24gcGFydGlhbCAoZm4sIGFyZykge1xuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBmbihhcmcpXG4gIH1cbn1cblxuLy8gQmFzZSBkYXRhIHN0cnVjdCBmb3Igc3RvcmUncyBtb2R1bGUsIHBhY2thZ2Ugd2l0aCBzb21lIGF0dHJpYnV0ZSBhbmQgbWV0aG9kXG52YXIgTW9kdWxlID0gZnVuY3Rpb24gTW9kdWxlIChyYXdNb2R1bGUsIHJ1bnRpbWUpIHtcbiAgdGhpcy5ydW50aW1lID0gcnVudGltZTtcbiAgLy8gU3RvcmUgc29tZSBjaGlsZHJlbiBpdGVtXG4gIHRoaXMuX2NoaWxkcmVuID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgLy8gU3RvcmUgdGhlIG9yaWdpbiBtb2R1bGUgb2JqZWN0IHdoaWNoIHBhc3NlZCBieSBwcm9ncmFtbWVyXG4gIHRoaXMuX3Jhd01vZHVsZSA9IHJhd01vZHVsZTtcbiAgdmFyIHJhd1N0YXRlID0gcmF3TW9kdWxlLnN0YXRlO1xuXG4gIC8vIFN0b3JlIHRoZSBvcmlnaW4gbW9kdWxlJ3Mgc3RhdGVcbiAgdGhpcy5zdGF0ZSA9ICh0eXBlb2YgcmF3U3RhdGUgPT09ICdmdW5jdGlvbicgPyByYXdTdGF0ZSgpIDogcmF3U3RhdGUpIHx8IHt9O1xufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyA9IHsgbmFtZXNwYWNlZDogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMubmFtZXNwYWNlZC5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhIXRoaXMuX3Jhd01vZHVsZS5uYW1lc3BhY2VkXG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmFkZENoaWxkID0gZnVuY3Rpb24gYWRkQ2hpbGQgKGtleSwgbW9kdWxlKSB7XG4gIHRoaXMuX2NoaWxkcmVuW2tleV0gPSBtb2R1bGU7XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLnJlbW92ZUNoaWxkID0gZnVuY3Rpb24gcmVtb3ZlQ2hpbGQgKGtleSkge1xuICBkZWxldGUgdGhpcy5fY2hpbGRyZW5ba2V5XTtcbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZ2V0Q2hpbGQgPSBmdW5jdGlvbiBnZXRDaGlsZCAoa2V5KSB7XG4gIHJldHVybiB0aGlzLl9jaGlsZHJlbltrZXldXG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmhhc0NoaWxkID0gZnVuY3Rpb24gaGFzQ2hpbGQgKGtleSkge1xuICByZXR1cm4ga2V5IGluIHRoaXMuX2NoaWxkcmVuXG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSAocmF3TW9kdWxlKSB7XG4gIHRoaXMuX3Jhd01vZHVsZS5uYW1lc3BhY2VkID0gcmF3TW9kdWxlLm5hbWVzcGFjZWQ7XG4gIGlmIChyYXdNb2R1bGUuYWN0aW9ucykge1xuICAgIHRoaXMuX3Jhd01vZHVsZS5hY3Rpb25zID0gcmF3TW9kdWxlLmFjdGlvbnM7XG4gIH1cbiAgaWYgKHJhd01vZHVsZS5tdXRhdGlvbnMpIHtcbiAgICB0aGlzLl9yYXdNb2R1bGUubXV0YXRpb25zID0gcmF3TW9kdWxlLm11dGF0aW9ucztcbiAgfVxuICBpZiAocmF3TW9kdWxlLmdldHRlcnMpIHtcbiAgICB0aGlzLl9yYXdNb2R1bGUuZ2V0dGVycyA9IHJhd01vZHVsZS5nZXR0ZXJzO1xuICB9XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmZvckVhY2hDaGlsZCA9IGZ1bmN0aW9uIGZvckVhY2hDaGlsZCAoZm4pIHtcbiAgZm9yRWFjaFZhbHVlKHRoaXMuX2NoaWxkcmVuLCBmbik7XG59O1xuXG5Nb2R1bGUucHJvdG90eXBlLmZvckVhY2hHZXR0ZXIgPSBmdW5jdGlvbiBmb3JFYWNoR2V0dGVyIChmbikge1xuICBpZiAodGhpcy5fcmF3TW9kdWxlLmdldHRlcnMpIHtcbiAgICBmb3JFYWNoVmFsdWUodGhpcy5fcmF3TW9kdWxlLmdldHRlcnMsIGZuKTtcbiAgfVxufTtcblxuTW9kdWxlLnByb3RvdHlwZS5mb3JFYWNoQWN0aW9uID0gZnVuY3Rpb24gZm9yRWFjaEFjdGlvbiAoZm4pIHtcbiAgaWYgKHRoaXMuX3Jhd01vZHVsZS5hY3Rpb25zKSB7XG4gICAgZm9yRWFjaFZhbHVlKHRoaXMuX3Jhd01vZHVsZS5hY3Rpb25zLCBmbik7XG4gIH1cbn07XG5cbk1vZHVsZS5wcm90b3R5cGUuZm9yRWFjaE11dGF0aW9uID0gZnVuY3Rpb24gZm9yRWFjaE11dGF0aW9uIChmbikge1xuICBpZiAodGhpcy5fcmF3TW9kdWxlLm11dGF0aW9ucykge1xuICAgIGZvckVhY2hWYWx1ZSh0aGlzLl9yYXdNb2R1bGUubXV0YXRpb25zLCBmbik7XG4gIH1cbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNb2R1bGUucHJvdG90eXBlLCBwcm90b3R5cGVBY2Nlc3NvcnMgKTtcblxudmFyIE1vZHVsZUNvbGxlY3Rpb24gPSBmdW5jdGlvbiBNb2R1bGVDb2xsZWN0aW9uIChyYXdSb290TW9kdWxlKSB7XG4gIC8vIHJlZ2lzdGVyIHJvb3QgbW9kdWxlIChWdWV4LlN0b3JlIG9wdGlvbnMpXG4gIHRoaXMucmVnaXN0ZXIoW10sIHJhd1Jvb3RNb2R1bGUsIGZhbHNlKTtcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIGdldCAocGF0aCkge1xuICByZXR1cm4gcGF0aC5yZWR1Y2UoZnVuY3Rpb24gKG1vZHVsZSwga2V5KSB7XG4gICAgcmV0dXJuIG1vZHVsZS5nZXRDaGlsZChrZXkpXG4gIH0sIHRoaXMucm9vdClcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLmdldE5hbWVzcGFjZSA9IGZ1bmN0aW9uIGdldE5hbWVzcGFjZSAocGF0aCkge1xuICB2YXIgbW9kdWxlID0gdGhpcy5yb290O1xuICByZXR1cm4gcGF0aC5yZWR1Y2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwga2V5KSB7XG4gICAgbW9kdWxlID0gbW9kdWxlLmdldENoaWxkKGtleSk7XG4gICAgcmV0dXJuIG5hbWVzcGFjZSArIChtb2R1bGUubmFtZXNwYWNlZCA/IGtleSArICcvJyA6ICcnKVxuICB9LCAnJylcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uIHVwZGF0ZSQxIChyYXdSb290TW9kdWxlKSB7XG4gIHVwZGF0ZShbXSwgdGhpcy5yb290LCByYXdSb290TW9kdWxlKTtcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLnJlZ2lzdGVyID0gZnVuY3Rpb24gcmVnaXN0ZXIgKHBhdGgsIHJhd01vZHVsZSwgcnVudGltZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuICAgIGlmICggcnVudGltZSA9PT0gdm9pZCAwICkgcnVudGltZSA9IHRydWU7XG5cbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnRSYXdNb2R1bGUocGF0aCwgcmF3TW9kdWxlKTtcbiAgfVxuXG4gIHZhciBuZXdNb2R1bGUgPSBuZXcgTW9kdWxlKHJhd01vZHVsZSwgcnVudGltZSk7XG4gIGlmIChwYXRoLmxlbmd0aCA9PT0gMCkge1xuICAgIHRoaXMucm9vdCA9IG5ld01vZHVsZTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgcGFyZW50ID0gdGhpcy5nZXQocGF0aC5zbGljZSgwLCAtMSkpO1xuICAgIHBhcmVudC5hZGRDaGlsZChwYXRoW3BhdGgubGVuZ3RoIC0gMV0sIG5ld01vZHVsZSk7XG4gIH1cblxuICAvLyByZWdpc3RlciBuZXN0ZWQgbW9kdWxlc1xuICBpZiAocmF3TW9kdWxlLm1vZHVsZXMpIHtcbiAgICBmb3JFYWNoVmFsdWUocmF3TW9kdWxlLm1vZHVsZXMsIGZ1bmN0aW9uIChyYXdDaGlsZE1vZHVsZSwga2V5KSB7XG4gICAgICB0aGlzJDEucmVnaXN0ZXIocGF0aC5jb25jYXQoa2V5KSwgcmF3Q2hpbGRNb2R1bGUsIHJ1bnRpbWUpO1xuICAgIH0pO1xuICB9XG59O1xuXG5Nb2R1bGVDb2xsZWN0aW9uLnByb3RvdHlwZS51bnJlZ2lzdGVyID0gZnVuY3Rpb24gdW5yZWdpc3RlciAocGF0aCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5nZXQocGF0aC5zbGljZSgwLCAtMSkpO1xuICB2YXIga2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICBpZiAoIXBhcmVudC5nZXRDaGlsZChrZXkpLnJ1bnRpbWUpIHsgcmV0dXJuIH1cblxuICBwYXJlbnQucmVtb3ZlQ2hpbGQoa2V5KTtcbn07XG5cbk1vZHVsZUNvbGxlY3Rpb24ucHJvdG90eXBlLmlzUmVnaXN0ZXJlZCA9IGZ1bmN0aW9uIGlzUmVnaXN0ZXJlZCAocGF0aCkge1xuICB2YXIgcGFyZW50ID0gdGhpcy5nZXQocGF0aC5zbGljZSgwLCAtMSkpO1xuICB2YXIga2V5ID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuXG4gIHJldHVybiBwYXJlbnQuaGFzQ2hpbGQoa2V5KVxufTtcblxuZnVuY3Rpb24gdXBkYXRlIChwYXRoLCB0YXJnZXRNb2R1bGUsIG5ld01vZHVsZSkge1xuICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydFJhd01vZHVsZShwYXRoLCBuZXdNb2R1bGUpO1xuICB9XG5cbiAgLy8gdXBkYXRlIHRhcmdldCBtb2R1bGVcbiAgdGFyZ2V0TW9kdWxlLnVwZGF0ZShuZXdNb2R1bGUpO1xuXG4gIC8vIHVwZGF0ZSBuZXN0ZWQgbW9kdWxlc1xuICBpZiAobmV3TW9kdWxlLm1vZHVsZXMpIHtcbiAgICBmb3IgKHZhciBrZXkgaW4gbmV3TW9kdWxlLm1vZHVsZXMpIHtcbiAgICAgIGlmICghdGFyZ2V0TW9kdWxlLmdldENoaWxkKGtleSkpIHtcbiAgICAgICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICBcIlt2dWV4XSB0cnlpbmcgdG8gYWRkIGEgbmV3IG1vZHVsZSAnXCIgKyBrZXkgKyBcIicgb24gaG90IHJlbG9hZGluZywgXCIgK1xuICAgICAgICAgICAgJ21hbnVhbCByZWxvYWQgaXMgbmVlZGVkJ1xuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICB1cGRhdGUoXG4gICAgICAgIHBhdGguY29uY2F0KGtleSksXG4gICAgICAgIHRhcmdldE1vZHVsZS5nZXRDaGlsZChrZXkpLFxuICAgICAgICBuZXdNb2R1bGUubW9kdWxlc1trZXldXG4gICAgICApO1xuICAgIH1cbiAgfVxufVxuXG52YXIgZnVuY3Rpb25Bc3NlcnQgPSB7XG4gIGFzc2VydDogZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7IH0sXG4gIGV4cGVjdGVkOiAnZnVuY3Rpb24nXG59O1xuXG52YXIgb2JqZWN0QXNzZXJ0ID0ge1xuICBhc3NlcnQ6IGZ1bmN0aW9uICh2YWx1ZSkgeyByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nIHx8XG4gICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIHZhbHVlLmhhbmRsZXIgPT09ICdmdW5jdGlvbicpOyB9LFxuICBleHBlY3RlZDogJ2Z1bmN0aW9uIG9yIG9iamVjdCB3aXRoIFwiaGFuZGxlclwiIGZ1bmN0aW9uJ1xufTtcblxudmFyIGFzc2VydFR5cGVzID0ge1xuICBnZXR0ZXJzOiBmdW5jdGlvbkFzc2VydCxcbiAgbXV0YXRpb25zOiBmdW5jdGlvbkFzc2VydCxcbiAgYWN0aW9uczogb2JqZWN0QXNzZXJ0XG59O1xuXG5mdW5jdGlvbiBhc3NlcnRSYXdNb2R1bGUgKHBhdGgsIHJhd01vZHVsZSkge1xuICBPYmplY3Qua2V5cyhhc3NlcnRUeXBlcykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7XG4gICAgaWYgKCFyYXdNb2R1bGVba2V5XSkgeyByZXR1cm4gfVxuXG4gICAgdmFyIGFzc2VydE9wdGlvbnMgPSBhc3NlcnRUeXBlc1trZXldO1xuXG4gICAgZm9yRWFjaFZhbHVlKHJhd01vZHVsZVtrZXldLCBmdW5jdGlvbiAodmFsdWUsIHR5cGUpIHtcbiAgICAgIGFzc2VydChcbiAgICAgICAgYXNzZXJ0T3B0aW9ucy5hc3NlcnQodmFsdWUpLFxuICAgICAgICBtYWtlQXNzZXJ0aW9uTWVzc2FnZShwYXRoLCBrZXksIHR5cGUsIHZhbHVlLCBhc3NlcnRPcHRpb25zLmV4cGVjdGVkKVxuICAgICAgKTtcbiAgICB9KTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIG1ha2VBc3NlcnRpb25NZXNzYWdlIChwYXRoLCBrZXksIHR5cGUsIHZhbHVlLCBleHBlY3RlZCkge1xuICB2YXIgYnVmID0ga2V5ICsgXCIgc2hvdWxkIGJlIFwiICsgZXhwZWN0ZWQgKyBcIiBidXQgXFxcIlwiICsga2V5ICsgXCIuXCIgKyB0eXBlICsgXCJcXFwiXCI7XG4gIGlmIChwYXRoLmxlbmd0aCA+IDApIHtcbiAgICBidWYgKz0gXCIgaW4gbW9kdWxlIFxcXCJcIiArIChwYXRoLmpvaW4oJy4nKSkgKyBcIlxcXCJcIjtcbiAgfVxuICBidWYgKz0gXCIgaXMgXCIgKyAoSlNPTi5zdHJpbmdpZnkodmFsdWUpKSArIFwiLlwiO1xuICByZXR1cm4gYnVmXG59XG5cbnZhciBWdWU7IC8vIGJpbmQgb24gaW5zdGFsbFxuXG52YXIgU3RvcmUgPSBmdW5jdGlvbiBTdG9yZSAob3B0aW9ucykge1xuICB2YXIgdGhpcyQxID0gdGhpcztcbiAgaWYgKCBvcHRpb25zID09PSB2b2lkIDAgKSBvcHRpb25zID0ge307XG5cbiAgLy8gQXV0byBpbnN0YWxsIGlmIGl0IGlzIG5vdCBkb25lIHlldCBhbmQgYHdpbmRvd2AgaGFzIGBWdWVgLlxuICAvLyBUbyBhbGxvdyB1c2VycyB0byBhdm9pZCBhdXRvLWluc3RhbGxhdGlvbiBpbiBzb21lIGNhc2VzLFxuICAvLyB0aGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCBoZXJlLiBTZWUgIzczMVxuICBpZiAoIVZ1ZSAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuVnVlKSB7XG4gICAgaW5zdGFsbCh3aW5kb3cuVnVlKTtcbiAgfVxuXG4gIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0KFZ1ZSwgXCJtdXN0IGNhbGwgVnVlLnVzZShWdWV4KSBiZWZvcmUgY3JlYXRpbmcgYSBzdG9yZSBpbnN0YW5jZS5cIik7XG4gICAgYXNzZXJ0KHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJywgXCJ2dWV4IHJlcXVpcmVzIGEgUHJvbWlzZSBwb2x5ZmlsbCBpbiB0aGlzIGJyb3dzZXIuXCIpO1xuICAgIGFzc2VydCh0aGlzIGluc3RhbmNlb2YgU3RvcmUsIFwic3RvcmUgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgbmV3IG9wZXJhdG9yLlwiKTtcbiAgfVxuXG4gIHZhciBwbHVnaW5zID0gb3B0aW9ucy5wbHVnaW5zOyBpZiAoIHBsdWdpbnMgPT09IHZvaWQgMCApIHBsdWdpbnMgPSBbXTtcbiAgdmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0OyBpZiAoIHN0cmljdCA9PT0gdm9pZCAwICkgc3RyaWN0ID0gZmFsc2U7XG5cbiAgLy8gc3RvcmUgaW50ZXJuYWwgc3RhdGVcbiAgdGhpcy5fY29tbWl0dGluZyA9IGZhbHNlO1xuICB0aGlzLl9hY3Rpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMgPSBbXTtcbiAgdGhpcy5fbXV0YXRpb25zID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgdGhpcy5fd3JhcHBlZEdldHRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aGlzLl9tb2R1bGVzID0gbmV3IE1vZHVsZUNvbGxlY3Rpb24ob3B0aW9ucyk7XG4gIHRoaXMuX21vZHVsZXNOYW1lc3BhY2VNYXAgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB0aGlzLl9zdWJzY3JpYmVycyA9IFtdO1xuICB0aGlzLl93YXRjaGVyVk0gPSBuZXcgVnVlKCk7XG4gIHRoaXMuX21ha2VMb2NhbEdldHRlcnNDYWNoZSA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG5cbiAgLy8gYmluZCBjb21taXQgYW5kIGRpc3BhdGNoIHRvIHNlbGZcbiAgdmFyIHN0b3JlID0gdGhpcztcbiAgdmFyIHJlZiA9IHRoaXM7XG4gIHZhciBkaXNwYXRjaCA9IHJlZi5kaXNwYXRjaDtcbiAgdmFyIGNvbW1pdCA9IHJlZi5jb21taXQ7XG4gIHRoaXMuZGlzcGF0Y2ggPSBmdW5jdGlvbiBib3VuZERpc3BhdGNoICh0eXBlLCBwYXlsb2FkKSB7XG4gICAgcmV0dXJuIGRpc3BhdGNoLmNhbGwoc3RvcmUsIHR5cGUsIHBheWxvYWQpXG4gIH07XG4gIHRoaXMuY29tbWl0ID0gZnVuY3Rpb24gYm91bmRDb21taXQgKHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gY29tbWl0LmNhbGwoc3RvcmUsIHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpXG4gIH07XG5cbiAgLy8gc3RyaWN0IG1vZGVcbiAgdGhpcy5zdHJpY3QgPSBzdHJpY3Q7XG5cbiAgdmFyIHN0YXRlID0gdGhpcy5fbW9kdWxlcy5yb290LnN0YXRlO1xuXG4gIC8vIGluaXQgcm9vdCBtb2R1bGUuXG4gIC8vIHRoaXMgYWxzbyByZWN1cnNpdmVseSByZWdpc3RlcnMgYWxsIHN1Yi1tb2R1bGVzXG4gIC8vIGFuZCBjb2xsZWN0cyBhbGwgbW9kdWxlIGdldHRlcnMgaW5zaWRlIHRoaXMuX3dyYXBwZWRHZXR0ZXJzXG4gIGluc3RhbGxNb2R1bGUodGhpcywgc3RhdGUsIFtdLCB0aGlzLl9tb2R1bGVzLnJvb3QpO1xuXG4gIC8vIGluaXRpYWxpemUgdGhlIHN0b3JlIHZtLCB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHJlYWN0aXZpdHlcbiAgLy8gKGFsc28gcmVnaXN0ZXJzIF93cmFwcGVkR2V0dGVycyBhcyBjb21wdXRlZCBwcm9wZXJ0aWVzKVxuICByZXNldFN0b3JlVk0odGhpcywgc3RhdGUpO1xuXG4gIC8vIGFwcGx5IHBsdWdpbnNcbiAgcGx1Z2lucy5mb3JFYWNoKGZ1bmN0aW9uIChwbHVnaW4pIHsgcmV0dXJuIHBsdWdpbih0aGlzJDEpOyB9KTtcblxuICB2YXIgdXNlRGV2dG9vbHMgPSBvcHRpb25zLmRldnRvb2xzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRldnRvb2xzIDogVnVlLmNvbmZpZy5kZXZ0b29scztcbiAgaWYgKHVzZURldnRvb2xzKSB7XG4gICAgZGV2dG9vbFBsdWdpbih0aGlzKTtcbiAgfVxufTtcblxudmFyIHByb3RvdHlwZUFjY2Vzc29ycyQxID0geyBzdGF0ZTogeyBjb25maWd1cmFibGU6IHRydWUgfSB9O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5zdGF0ZS5nZXQgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLl92bS5fZGF0YS4kJHN0YXRlXG59O1xuXG5wcm90b3R5cGVBY2Nlc3NvcnMkMS5zdGF0ZS5zZXQgPSBmdW5jdGlvbiAodikge1xuICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydChmYWxzZSwgXCJ1c2Ugc3RvcmUucmVwbGFjZVN0YXRlKCkgdG8gZXhwbGljaXQgcmVwbGFjZSBzdG9yZSBzdGF0ZS5cIik7XG4gIH1cbn07XG5cblN0b3JlLnByb3RvdHlwZS5jb21taXQgPSBmdW5jdGlvbiBjb21taXQgKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICAvLyBjaGVjayBvYmplY3Qtc3R5bGUgY29tbWl0XG4gIHZhciByZWYgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpO1xuICAgIHZhciB0eXBlID0gcmVmLnR5cGU7XG4gICAgdmFyIHBheWxvYWQgPSByZWYucGF5bG9hZDtcbiAgICB2YXIgb3B0aW9ucyA9IHJlZi5vcHRpb25zO1xuXG4gIHZhciBtdXRhdGlvbiA9IHsgdHlwZTogdHlwZSwgcGF5bG9hZDogcGF5bG9hZCB9O1xuICB2YXIgZW50cnkgPSB0aGlzLl9tdXRhdGlvbnNbdHlwZV07XG4gIGlmICghZW50cnkpIHtcbiAgICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBtdXRhdGlvbiB0eXBlOiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgdGhpcy5fd2l0aENvbW1pdChmdW5jdGlvbiAoKSB7XG4gICAgZW50cnkuZm9yRWFjaChmdW5jdGlvbiBjb21taXRJdGVyYXRvciAoaGFuZGxlcikge1xuICAgICAgaGFuZGxlcihwYXlsb2FkKTtcbiAgICB9KTtcbiAgfSk7XG5cbiAgdGhpcy5fc3Vic2NyaWJlcnNcbiAgICAuc2xpY2UoKSAvLyBzaGFsbG93IGNvcHkgdG8gcHJldmVudCBpdGVyYXRvciBpbnZhbGlkYXRpb24gaWYgc3Vic2NyaWJlciBzeW5jaHJvbm91c2x5IGNhbGxzIHVuc3Vic2NyaWJlXG4gICAgLmZvckVhY2goZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViKG11dGF0aW9uLCB0aGlzJDEuc3RhdGUpOyB9KTtcblxuICBpZiAoXG4gICAgKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSAmJlxuICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5zaWxlbnRcbiAgKSB7XG4gICAgY29uc29sZS53YXJuKFxuICAgICAgXCJbdnVleF0gbXV0YXRpb24gdHlwZTogXCIgKyB0eXBlICsgXCIuIFNpbGVudCBvcHRpb24gaGFzIGJlZW4gcmVtb3ZlZC4gXCIgK1xuICAgICAgJ1VzZSB0aGUgZmlsdGVyIGZ1bmN0aW9uYWxpdHkgaW4gdGhlIHZ1ZS1kZXZ0b29scydcbiAgICApO1xuICB9XG59O1xuXG5TdG9yZS5wcm90b3R5cGUuZGlzcGF0Y2ggPSBmdW5jdGlvbiBkaXNwYXRjaCAoX3R5cGUsIF9wYXlsb2FkKSB7XG4gICAgdmFyIHRoaXMkMSA9IHRoaXM7XG5cbiAgLy8gY2hlY2sgb2JqZWN0LXN0eWxlIGRpc3BhdGNoXG4gIHZhciByZWYgPSB1bmlmeU9iamVjdFN0eWxlKF90eXBlLCBfcGF5bG9hZCk7XG4gICAgdmFyIHR5cGUgPSByZWYudHlwZTtcbiAgICB2YXIgcGF5bG9hZCA9IHJlZi5wYXlsb2FkO1xuXG4gIHZhciBhY3Rpb24gPSB7IHR5cGU6IHR5cGUsIHBheWxvYWQ6IHBheWxvYWQgfTtcbiAgdmFyIGVudHJ5ID0gdGhpcy5fYWN0aW9uc1t0eXBlXTtcbiAgaWYgKCFlbnRyeSkge1xuICAgIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGFjdGlvbiB0eXBlOiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cblxuICB0cnkge1xuICAgIHRoaXMuX2FjdGlvblN1YnNjcmliZXJzXG4gICAgICAuc2xpY2UoKSAvLyBzaGFsbG93IGNvcHkgdG8gcHJldmVudCBpdGVyYXRvciBpbnZhbGlkYXRpb24gaWYgc3Vic2NyaWJlciBzeW5jaHJvbm91c2x5IGNhbGxzIHVuc3Vic2NyaWJlXG4gICAgICAuZmlsdGVyKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5iZWZvcmU7IH0pXG4gICAgICAuZm9yRWFjaChmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYmVmb3JlKGFjdGlvbiwgdGhpcyQxLnN0YXRlKTsgfSk7XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgY29uc29sZS53YXJuKFwiW3Z1ZXhdIGVycm9yIGluIGJlZm9yZSBhY3Rpb24gc3Vic2NyaWJlcnM6IFwiKTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIHJlc3VsdCA9IGVudHJ5Lmxlbmd0aCA+IDFcbiAgICA/IFByb21pc2UuYWxsKGVudHJ5Lm1hcChmdW5jdGlvbiAoaGFuZGxlcikgeyByZXR1cm4gaGFuZGxlcihwYXlsb2FkKTsgfSkpXG4gICAgOiBlbnRyeVswXShwYXlsb2FkKTtcblxuICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgIHJlc3VsdC50aGVuKGZ1bmN0aW9uIChyZXMpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHRoaXMkMS5fYWN0aW9uU3Vic2NyaWJlcnNcbiAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5hZnRlcjsgfSlcbiAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbiAoc3ViKSB7IHJldHVybiBzdWIuYWZ0ZXIoYWN0aW9uLCB0aGlzJDEuc3RhdGUpOyB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJbdnVleF0gZXJyb3IgaW4gYWZ0ZXIgYWN0aW9uIHN1YnNjcmliZXJzOiBcIik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVzb2x2ZShyZXMpO1xuICAgIH0sIGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgdGhpcyQxLl9hY3Rpb25TdWJzY3JpYmVyc1xuICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKHN1YikgeyByZXR1cm4gc3ViLmVycm9yOyB9KVxuICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uIChzdWIpIHsgcmV0dXJuIHN1Yi5lcnJvcihhY3Rpb24sIHRoaXMkMS5zdGF0ZSwgZXJyb3IpOyB9KTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXCJbdnVleF0gZXJyb3IgaW4gZXJyb3IgYWN0aW9uIHN1YnNjcmliZXJzOiBcIik7XG4gICAgICAgICAgY29uc29sZS5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICB9KTtcbiAgfSlcbn07XG5cblN0b3JlLnByb3RvdHlwZS5zdWJzY3JpYmUgPSBmdW5jdGlvbiBzdWJzY3JpYmUgKGZuLCBvcHRpb25zKSB7XG4gIHJldHVybiBnZW5lcmljU3Vic2NyaWJlKGZuLCB0aGlzLl9zdWJzY3JpYmVycywgb3B0aW9ucylcbn07XG5cblN0b3JlLnByb3RvdHlwZS5zdWJzY3JpYmVBY3Rpb24gPSBmdW5jdGlvbiBzdWJzY3JpYmVBY3Rpb24gKGZuLCBvcHRpb25zKSB7XG4gIHZhciBzdWJzID0gdHlwZW9mIGZuID09PSAnZnVuY3Rpb24nID8geyBiZWZvcmU6IGZuIH0gOiBmbjtcbiAgcmV0dXJuIGdlbmVyaWNTdWJzY3JpYmUoc3VicywgdGhpcy5fYWN0aW9uU3Vic2NyaWJlcnMsIG9wdGlvbnMpXG59O1xuXG5TdG9yZS5wcm90b3R5cGUud2F0Y2ggPSBmdW5jdGlvbiB3YXRjaCAoZ2V0dGVyLCBjYiwgb3B0aW9ucykge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgYXNzZXJ0KHR5cGVvZiBnZXR0ZXIgPT09ICdmdW5jdGlvbicsIFwic3RvcmUud2F0Y2ggb25seSBhY2NlcHRzIGEgZnVuY3Rpb24uXCIpO1xuICB9XG4gIHJldHVybiB0aGlzLl93YXRjaGVyVk0uJHdhdGNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldHRlcih0aGlzJDEuc3RhdGUsIHRoaXMkMS5nZXR0ZXJzKTsgfSwgY2IsIG9wdGlvbnMpXG59O1xuXG5TdG9yZS5wcm90b3R5cGUucmVwbGFjZVN0YXRlID0gZnVuY3Rpb24gcmVwbGFjZVN0YXRlIChzdGF0ZSkge1xuICAgIHZhciB0aGlzJDEgPSB0aGlzO1xuXG4gIHRoaXMuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgIHRoaXMkMS5fdm0uX2RhdGEuJCRzdGF0ZSA9IHN0YXRlO1xuICB9KTtcbn07XG5cblN0b3JlLnByb3RvdHlwZS5yZWdpc3Rlck1vZHVsZSA9IGZ1bmN0aW9uIHJlZ2lzdGVyTW9kdWxlIChwYXRoLCByYXdNb2R1bGUsIG9wdGlvbnMpIHtcbiAgICBpZiAoIG9wdGlvbnMgPT09IHZvaWQgMCApIG9wdGlvbnMgPSB7fTtcblxuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHBhdGgpLCBcIm1vZHVsZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gQXJyYXkuXCIpO1xuICAgIGFzc2VydChwYXRoLmxlbmd0aCA+IDAsICdjYW5ub3QgcmVnaXN0ZXIgdGhlIHJvb3QgbW9kdWxlIGJ5IHVzaW5nIHJlZ2lzdGVyTW9kdWxlLicpO1xuICB9XG5cbiAgdGhpcy5fbW9kdWxlcy5yZWdpc3RlcihwYXRoLCByYXdNb2R1bGUpO1xuICBpbnN0YWxsTW9kdWxlKHRoaXMsIHRoaXMuc3RhdGUsIHBhdGgsIHRoaXMuX21vZHVsZXMuZ2V0KHBhdGgpLCBvcHRpb25zLnByZXNlcnZlU3RhdGUpO1xuICAvLyByZXNldCBzdG9yZSB0byB1cGRhdGUgZ2V0dGVycy4uLlxuICByZXNldFN0b3JlVk0odGhpcywgdGhpcy5zdGF0ZSk7XG59O1xuXG5TdG9yZS5wcm90b3R5cGUudW5yZWdpc3Rlck1vZHVsZSA9IGZ1bmN0aW9uIHVucmVnaXN0ZXJNb2R1bGUgKHBhdGgpIHtcbiAgICB2YXIgdGhpcyQxID0gdGhpcztcblxuICBpZiAodHlwZW9mIHBhdGggPT09ICdzdHJpbmcnKSB7IHBhdGggPSBbcGF0aF07IH1cblxuICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydChBcnJheS5pc0FycmF5KHBhdGgpLCBcIm1vZHVsZSBwYXRoIG11c3QgYmUgYSBzdHJpbmcgb3IgYW4gQXJyYXkuXCIpO1xuICB9XG5cbiAgdGhpcy5fbW9kdWxlcy51bnJlZ2lzdGVyKHBhdGgpO1xuICB0aGlzLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgcGFyZW50U3RhdGUgPSBnZXROZXN0ZWRTdGF0ZSh0aGlzJDEuc3RhdGUsIHBhdGguc2xpY2UoMCwgLTEpKTtcbiAgICBWdWUuZGVsZXRlKHBhcmVudFN0YXRlLCBwYXRoW3BhdGgubGVuZ3RoIC0gMV0pO1xuICB9KTtcbiAgcmVzZXRTdG9yZSh0aGlzKTtcbn07XG5cblN0b3JlLnByb3RvdHlwZS5oYXNNb2R1bGUgPSBmdW5jdGlvbiBoYXNNb2R1bGUgKHBhdGgpIHtcbiAgaWYgKHR5cGVvZiBwYXRoID09PSAnc3RyaW5nJykgeyBwYXRoID0gW3BhdGhdOyB9XG5cbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICBhc3NlcnQoQXJyYXkuaXNBcnJheShwYXRoKSwgXCJtb2R1bGUgcGF0aCBtdXN0IGJlIGEgc3RyaW5nIG9yIGFuIEFycmF5LlwiKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzLl9tb2R1bGVzLmlzUmVnaXN0ZXJlZChwYXRoKVxufTtcblxuU3RvcmUucHJvdG90eXBlLmhvdFVwZGF0ZSA9IGZ1bmN0aW9uIGhvdFVwZGF0ZSAobmV3T3B0aW9ucykge1xuICB0aGlzLl9tb2R1bGVzLnVwZGF0ZShuZXdPcHRpb25zKTtcbiAgcmVzZXRTdG9yZSh0aGlzLCB0cnVlKTtcbn07XG5cblN0b3JlLnByb3RvdHlwZS5fd2l0aENvbW1pdCA9IGZ1bmN0aW9uIF93aXRoQ29tbWl0IChmbikge1xuICB2YXIgY29tbWl0dGluZyA9IHRoaXMuX2NvbW1pdHRpbmc7XG4gIHRoaXMuX2NvbW1pdHRpbmcgPSB0cnVlO1xuICBmbigpO1xuICB0aGlzLl9jb21taXR0aW5nID0gY29tbWl0dGluZztcbn07XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBTdG9yZS5wcm90b3R5cGUsIHByb3RvdHlwZUFjY2Vzc29ycyQxICk7XG5cbmZ1bmN0aW9uIGdlbmVyaWNTdWJzY3JpYmUgKGZuLCBzdWJzLCBvcHRpb25zKSB7XG4gIGlmIChzdWJzLmluZGV4T2YoZm4pIDwgMCkge1xuICAgIG9wdGlvbnMgJiYgb3B0aW9ucy5wcmVwZW5kXG4gICAgICA/IHN1YnMudW5zaGlmdChmbilcbiAgICAgIDogc3Vicy5wdXNoKGZuKTtcbiAgfVxuICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgIHZhciBpID0gc3Vicy5pbmRleE9mKGZuKTtcbiAgICBpZiAoaSA+IC0xKSB7XG4gICAgICBzdWJzLnNwbGljZShpLCAxKTtcbiAgICB9XG4gIH1cbn1cblxuZnVuY3Rpb24gcmVzZXRTdG9yZSAoc3RvcmUsIGhvdCkge1xuICBzdG9yZS5fYWN0aW9ucyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHN0b3JlLl9tdXRhdGlvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzdG9yZS5fd3JhcHBlZEdldHRlcnMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICBzdG9yZS5fbW9kdWxlc05hbWVzcGFjZU1hcCA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gIHZhciBzdGF0ZSA9IHN0b3JlLnN0YXRlO1xuICAvLyBpbml0IGFsbCBtb2R1bGVzXG4gIGluc3RhbGxNb2R1bGUoc3RvcmUsIHN0YXRlLCBbXSwgc3RvcmUuX21vZHVsZXMucm9vdCwgdHJ1ZSk7XG4gIC8vIHJlc2V0IHZtXG4gIHJlc2V0U3RvcmVWTShzdG9yZSwgc3RhdGUsIGhvdCk7XG59XG5cbmZ1bmN0aW9uIHJlc2V0U3RvcmVWTSAoc3RvcmUsIHN0YXRlLCBob3QpIHtcbiAgdmFyIG9sZFZtID0gc3RvcmUuX3ZtO1xuXG4gIC8vIGJpbmQgc3RvcmUgcHVibGljIGdldHRlcnNcbiAgc3RvcmUuZ2V0dGVycyA9IHt9O1xuICAvLyByZXNldCBsb2NhbCBnZXR0ZXJzIGNhY2hlXG4gIHN0b3JlLl9tYWtlTG9jYWxHZXR0ZXJzQ2FjaGUgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICB2YXIgd3JhcHBlZEdldHRlcnMgPSBzdG9yZS5fd3JhcHBlZEdldHRlcnM7XG4gIHZhciBjb21wdXRlZCA9IHt9O1xuICBmb3JFYWNoVmFsdWUod3JhcHBlZEdldHRlcnMsIGZ1bmN0aW9uIChmbiwga2V5KSB7XG4gICAgLy8gdXNlIGNvbXB1dGVkIHRvIGxldmVyYWdlIGl0cyBsYXp5LWNhY2hpbmcgbWVjaGFuaXNtXG4gICAgLy8gZGlyZWN0IGlubGluZSBmdW5jdGlvbiB1c2Ugd2lsbCBsZWFkIHRvIGNsb3N1cmUgcHJlc2VydmluZyBvbGRWbS5cbiAgICAvLyB1c2luZyBwYXJ0aWFsIHRvIHJldHVybiBmdW5jdGlvbiB3aXRoIG9ubHkgYXJndW1lbnRzIHByZXNlcnZlZCBpbiBjbG9zdXJlIGVudmlyb25tZW50LlxuICAgIGNvbXB1dGVkW2tleV0gPSBwYXJ0aWFsKGZuLCBzdG9yZSk7XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHN0b3JlLmdldHRlcnMsIGtleSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdG9yZS5fdm1ba2V5XTsgfSxcbiAgICAgIGVudW1lcmFibGU6IHRydWUgLy8gZm9yIGxvY2FsIGdldHRlcnNcbiAgICB9KTtcbiAgfSk7XG5cbiAgLy8gdXNlIGEgVnVlIGluc3RhbmNlIHRvIHN0b3JlIHRoZSBzdGF0ZSB0cmVlXG4gIC8vIHN1cHByZXNzIHdhcm5pbmdzIGp1c3QgaW4gY2FzZSB0aGUgdXNlciBoYXMgYWRkZWRcbiAgLy8gc29tZSBmdW5reSBnbG9iYWwgbWl4aW5zXG4gIHZhciBzaWxlbnQgPSBWdWUuY29uZmlnLnNpbGVudDtcbiAgVnVlLmNvbmZpZy5zaWxlbnQgPSB0cnVlO1xuICBzdG9yZS5fdm0gPSBuZXcgVnVlKHtcbiAgICBkYXRhOiB7XG4gICAgICAkJHN0YXRlOiBzdGF0ZVxuICAgIH0sXG4gICAgY29tcHV0ZWQ6IGNvbXB1dGVkXG4gIH0pO1xuICBWdWUuY29uZmlnLnNpbGVudCA9IHNpbGVudDtcblxuICAvLyBlbmFibGUgc3RyaWN0IG1vZGUgZm9yIG5ldyB2bVxuICBpZiAoc3RvcmUuc3RyaWN0KSB7XG4gICAgZW5hYmxlU3RyaWN0TW9kZShzdG9yZSk7XG4gIH1cblxuICBpZiAob2xkVm0pIHtcbiAgICBpZiAoaG90KSB7XG4gICAgICAvLyBkaXNwYXRjaCBjaGFuZ2VzIGluIGFsbCBzdWJzY3JpYmVkIHdhdGNoZXJzXG4gICAgICAvLyB0byBmb3JjZSBnZXR0ZXIgcmUtZXZhbHVhdGlvbiBmb3IgaG90IHJlbG9hZGluZy5cbiAgICAgIHN0b3JlLl93aXRoQ29tbWl0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgb2xkVm0uX2RhdGEuJCRzdGF0ZSA9IG51bGw7XG4gICAgICB9KTtcbiAgICB9XG4gICAgVnVlLm5leHRUaWNrKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG9sZFZtLiRkZXN0cm95KCk7IH0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGluc3RhbGxNb2R1bGUgKHN0b3JlLCByb290U3RhdGUsIHBhdGgsIG1vZHVsZSwgaG90KSB7XG4gIHZhciBpc1Jvb3QgPSAhcGF0aC5sZW5ndGg7XG4gIHZhciBuYW1lc3BhY2UgPSBzdG9yZS5fbW9kdWxlcy5nZXROYW1lc3BhY2UocGF0aCk7XG5cbiAgLy8gcmVnaXN0ZXIgaW4gbmFtZXNwYWNlIG1hcFxuICBpZiAobW9kdWxlLm5hbWVzcGFjZWQpIHtcbiAgICBpZiAoc3RvcmUuX21vZHVsZXNOYW1lc3BhY2VNYXBbbmFtZXNwYWNlXSAmJiAoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpKSB7XG4gICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSBkdXBsaWNhdGUgbmFtZXNwYWNlIFwiICsgbmFtZXNwYWNlICsgXCIgZm9yIHRoZSBuYW1lc3BhY2VkIG1vZHVsZSBcIiArIChwYXRoLmpvaW4oJy8nKSkpKTtcbiAgICB9XG4gICAgc3RvcmUuX21vZHVsZXNOYW1lc3BhY2VNYXBbbmFtZXNwYWNlXSA9IG1vZHVsZTtcbiAgfVxuXG4gIC8vIHNldCBzdGF0ZVxuICBpZiAoIWlzUm9vdCAmJiAhaG90KSB7XG4gICAgdmFyIHBhcmVudFN0YXRlID0gZ2V0TmVzdGVkU3RhdGUocm9vdFN0YXRlLCBwYXRoLnNsaWNlKDAsIC0xKSk7XG4gICAgdmFyIG1vZHVsZU5hbWUgPSBwYXRoW3BhdGgubGVuZ3RoIC0gMV07XG4gICAgc3RvcmUuX3dpdGhDb21taXQoZnVuY3Rpb24gKCkge1xuICAgICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgICAgaWYgKG1vZHVsZU5hbWUgaW4gcGFyZW50U3RhdGUpIHtcbiAgICAgICAgICBjb25zb2xlLndhcm4oXG4gICAgICAgICAgICAoXCJbdnVleF0gc3RhdGUgZmllbGQgXFxcIlwiICsgbW9kdWxlTmFtZSArIFwiXFxcIiB3YXMgb3ZlcnJpZGRlbiBieSBhIG1vZHVsZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXQgXFxcIlwiICsgKHBhdGguam9pbignLicpKSArIFwiXFxcIlwiKVxuICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIFZ1ZS5zZXQocGFyZW50U3RhdGUsIG1vZHVsZU5hbWUsIG1vZHVsZS5zdGF0ZSk7XG4gICAgfSk7XG4gIH1cblxuICB2YXIgbG9jYWwgPSBtb2R1bGUuY29udGV4dCA9IG1ha2VMb2NhbENvbnRleHQoc3RvcmUsIG5hbWVzcGFjZSwgcGF0aCk7XG5cbiAgbW9kdWxlLmZvckVhY2hNdXRhdGlvbihmdW5jdGlvbiAobXV0YXRpb24sIGtleSkge1xuICAgIHZhciBuYW1lc3BhY2VkVHlwZSA9IG5hbWVzcGFjZSArIGtleTtcbiAgICByZWdpc3Rlck11dGF0aW9uKHN0b3JlLCBuYW1lc3BhY2VkVHlwZSwgbXV0YXRpb24sIGxvY2FsKTtcbiAgfSk7XG5cbiAgbW9kdWxlLmZvckVhY2hBY3Rpb24oZnVuY3Rpb24gKGFjdGlvbiwga2V5KSB7XG4gICAgdmFyIHR5cGUgPSBhY3Rpb24ucm9vdCA/IGtleSA6IG5hbWVzcGFjZSArIGtleTtcbiAgICB2YXIgaGFuZGxlciA9IGFjdGlvbi5oYW5kbGVyIHx8IGFjdGlvbjtcbiAgICByZWdpc3RlckFjdGlvbihzdG9yZSwgdHlwZSwgaGFuZGxlciwgbG9jYWwpO1xuICB9KTtcblxuICBtb2R1bGUuZm9yRWFjaEdldHRlcihmdW5jdGlvbiAoZ2V0dGVyLCBrZXkpIHtcbiAgICB2YXIgbmFtZXNwYWNlZFR5cGUgPSBuYW1lc3BhY2UgKyBrZXk7XG4gICAgcmVnaXN0ZXJHZXR0ZXIoc3RvcmUsIG5hbWVzcGFjZWRUeXBlLCBnZXR0ZXIsIGxvY2FsKTtcbiAgfSk7XG5cbiAgbW9kdWxlLmZvckVhY2hDaGlsZChmdW5jdGlvbiAoY2hpbGQsIGtleSkge1xuICAgIGluc3RhbGxNb2R1bGUoc3RvcmUsIHJvb3RTdGF0ZSwgcGF0aC5jb25jYXQoa2V5KSwgY2hpbGQsIGhvdCk7XG4gIH0pO1xufVxuXG4vKipcbiAqIG1ha2UgbG9jYWxpemVkIGRpc3BhdGNoLCBjb21taXQsIGdldHRlcnMgYW5kIHN0YXRlXG4gKiBpZiB0aGVyZSBpcyBubyBuYW1lc3BhY2UsIGp1c3QgdXNlIHJvb3Qgb25lc1xuICovXG5mdW5jdGlvbiBtYWtlTG9jYWxDb250ZXh0IChzdG9yZSwgbmFtZXNwYWNlLCBwYXRoKSB7XG4gIHZhciBub05hbWVzcGFjZSA9IG5hbWVzcGFjZSA9PT0gJyc7XG5cbiAgdmFyIGxvY2FsID0ge1xuICAgIGRpc3BhdGNoOiBub05hbWVzcGFjZSA/IHN0b3JlLmRpc3BhdGNoIDogZnVuY3Rpb24gKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpIHtcbiAgICAgIHZhciBhcmdzID0gdW5pZnlPYmplY3RTdHlsZShfdHlwZSwgX3BheWxvYWQsIF9vcHRpb25zKTtcbiAgICAgIHZhciBwYXlsb2FkID0gYXJncy5wYXlsb2FkO1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmdzLm9wdGlvbnM7XG4gICAgICB2YXIgdHlwZSA9IGFyZ3MudHlwZTtcblxuICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLnJvb3QpIHtcbiAgICAgICAgdHlwZSA9IG5hbWVzcGFjZSArIHR5cGU7XG4gICAgICAgIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpICYmICFzdG9yZS5fYWN0aW9uc1t0eXBlXSkge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIHVua25vd24gbG9jYWwgYWN0aW9uIHR5cGU6IFwiICsgKGFyZ3MudHlwZSkgKyBcIiwgZ2xvYmFsIHR5cGU6IFwiICsgdHlwZSkpO1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBzdG9yZS5kaXNwYXRjaCh0eXBlLCBwYXlsb2FkKVxuICAgIH0sXG5cbiAgICBjb21taXQ6IG5vTmFtZXNwYWNlID8gc3RvcmUuY29tbWl0IDogZnVuY3Rpb24gKF90eXBlLCBfcGF5bG9hZCwgX29wdGlvbnMpIHtcbiAgICAgIHZhciBhcmdzID0gdW5pZnlPYmplY3RTdHlsZShfdHlwZSwgX3BheWxvYWQsIF9vcHRpb25zKTtcbiAgICAgIHZhciBwYXlsb2FkID0gYXJncy5wYXlsb2FkO1xuICAgICAgdmFyIG9wdGlvbnMgPSBhcmdzLm9wdGlvbnM7XG4gICAgICB2YXIgdHlwZSA9IGFyZ3MudHlwZTtcblxuICAgICAgaWYgKCFvcHRpb25zIHx8ICFvcHRpb25zLnJvb3QpIHtcbiAgICAgICAgdHlwZSA9IG5hbWVzcGFjZSArIHR5cGU7XG4gICAgICAgIGlmICgoXCJkZXZlbG9wbWVudFwiICE9PSAncHJvZHVjdGlvbicpICYmICFzdG9yZS5fbXV0YXRpb25zW3R5cGVdKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gdW5rbm93biBsb2NhbCBtdXRhdGlvbiB0eXBlOiBcIiArIChhcmdzLnR5cGUpICsgXCIsIGdsb2JhbCB0eXBlOiBcIiArIHR5cGUpKTtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBzdG9yZS5jb21taXQodHlwZSwgcGF5bG9hZCwgb3B0aW9ucyk7XG4gICAgfVxuICB9O1xuXG4gIC8vIGdldHRlcnMgYW5kIHN0YXRlIG9iamVjdCBtdXN0IGJlIGdvdHRlbiBsYXppbHlcbiAgLy8gYmVjYXVzZSB0aGV5IHdpbGwgYmUgY2hhbmdlZCBieSB2bSB1cGRhdGVcbiAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMobG9jYWwsIHtcbiAgICBnZXR0ZXJzOiB7XG4gICAgICBnZXQ6IG5vTmFtZXNwYWNlXG4gICAgICAgID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gc3RvcmUuZ2V0dGVyczsgfVxuICAgICAgICA6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1ha2VMb2NhbEdldHRlcnMoc3RvcmUsIG5hbWVzcGFjZSk7IH1cbiAgICB9LFxuICAgIHN0YXRlOiB7XG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGdldE5lc3RlZFN0YXRlKHN0b3JlLnN0YXRlLCBwYXRoKTsgfVxuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGxvY2FsXG59XG5cbmZ1bmN0aW9uIG1ha2VMb2NhbEdldHRlcnMgKHN0b3JlLCBuYW1lc3BhY2UpIHtcbiAgaWYgKCFzdG9yZS5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlW25hbWVzcGFjZV0pIHtcbiAgICB2YXIgZ2V0dGVyc1Byb3h5ID0ge307XG4gICAgdmFyIHNwbGl0UG9zID0gbmFtZXNwYWNlLmxlbmd0aDtcbiAgICBPYmplY3Qua2V5cyhzdG9yZS5nZXR0ZXJzKS5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7XG4gICAgICAvLyBza2lwIGlmIHRoZSB0YXJnZXQgZ2V0dGVyIGlzIG5vdCBtYXRjaCB0aGlzIG5hbWVzcGFjZVxuICAgICAgaWYgKHR5cGUuc2xpY2UoMCwgc3BsaXRQb3MpICE9PSBuYW1lc3BhY2UpIHsgcmV0dXJuIH1cblxuICAgICAgLy8gZXh0cmFjdCBsb2NhbCBnZXR0ZXIgdHlwZVxuICAgICAgdmFyIGxvY2FsVHlwZSA9IHR5cGUuc2xpY2Uoc3BsaXRQb3MpO1xuXG4gICAgICAvLyBBZGQgYSBwb3J0IHRvIHRoZSBnZXR0ZXJzIHByb3h5LlxuICAgICAgLy8gRGVmaW5lIGFzIGdldHRlciBwcm9wZXJ0eSBiZWNhdXNlXG4gICAgICAvLyB3ZSBkbyBub3Qgd2FudCB0byBldmFsdWF0ZSB0aGUgZ2V0dGVycyBpbiB0aGlzIHRpbWUuXG4gICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZ2V0dGVyc1Byb3h5LCBsb2NhbFR5cGUsIHtcbiAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBzdG9yZS5nZXR0ZXJzW3R5cGVdOyB9LFxuICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBzdG9yZS5fbWFrZUxvY2FsR2V0dGVyc0NhY2hlW25hbWVzcGFjZV0gPSBnZXR0ZXJzUHJveHk7XG4gIH1cblxuICByZXR1cm4gc3RvcmUuX21ha2VMb2NhbEdldHRlcnNDYWNoZVtuYW1lc3BhY2VdXG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyTXV0YXRpb24gKHN0b3JlLCB0eXBlLCBoYW5kbGVyLCBsb2NhbCkge1xuICB2YXIgZW50cnkgPSBzdG9yZS5fbXV0YXRpb25zW3R5cGVdIHx8IChzdG9yZS5fbXV0YXRpb25zW3R5cGVdID0gW10pO1xuICBlbnRyeS5wdXNoKGZ1bmN0aW9uIHdyYXBwZWRNdXRhdGlvbkhhbmRsZXIgKHBheWxvYWQpIHtcbiAgICBoYW5kbGVyLmNhbGwoc3RvcmUsIGxvY2FsLnN0YXRlLCBwYXlsb2FkKTtcbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyQWN0aW9uIChzdG9yZSwgdHlwZSwgaGFuZGxlciwgbG9jYWwpIHtcbiAgdmFyIGVudHJ5ID0gc3RvcmUuX2FjdGlvbnNbdHlwZV0gfHwgKHN0b3JlLl9hY3Rpb25zW3R5cGVdID0gW10pO1xuICBlbnRyeS5wdXNoKGZ1bmN0aW9uIHdyYXBwZWRBY3Rpb25IYW5kbGVyIChwYXlsb2FkKSB7XG4gICAgdmFyIHJlcyA9IGhhbmRsZXIuY2FsbChzdG9yZSwge1xuICAgICAgZGlzcGF0Y2g6IGxvY2FsLmRpc3BhdGNoLFxuICAgICAgY29tbWl0OiBsb2NhbC5jb21taXQsXG4gICAgICBnZXR0ZXJzOiBsb2NhbC5nZXR0ZXJzLFxuICAgICAgc3RhdGU6IGxvY2FsLnN0YXRlLFxuICAgICAgcm9vdEdldHRlcnM6IHN0b3JlLmdldHRlcnMsXG4gICAgICByb290U3RhdGU6IHN0b3JlLnN0YXRlXG4gICAgfSwgcGF5bG9hZCk7XG4gICAgaWYgKCFpc1Byb21pc2UocmVzKSkge1xuICAgICAgcmVzID0gUHJvbWlzZS5yZXNvbHZlKHJlcyk7XG4gICAgfVxuICAgIGlmIChzdG9yZS5fZGV2dG9vbEhvb2spIHtcbiAgICAgIHJldHVybiByZXMuY2F0Y2goZnVuY3Rpb24gKGVycikge1xuICAgICAgICBzdG9yZS5fZGV2dG9vbEhvb2suZW1pdCgndnVleDplcnJvcicsIGVycik7XG4gICAgICAgIHRocm93IGVyclxuICAgICAgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHJlc1xuICAgIH1cbiAgfSk7XG59XG5cbmZ1bmN0aW9uIHJlZ2lzdGVyR2V0dGVyIChzdG9yZSwgdHlwZSwgcmF3R2V0dGVyLCBsb2NhbCkge1xuICBpZiAoc3RvcmUuX3dyYXBwZWRHZXR0ZXJzW3R5cGVdKSB7XG4gICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoKFwiW3Z1ZXhdIGR1cGxpY2F0ZSBnZXR0ZXIga2V5OiBcIiArIHR5cGUpKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgc3RvcmUuX3dyYXBwZWRHZXR0ZXJzW3R5cGVdID0gZnVuY3Rpb24gd3JhcHBlZEdldHRlciAoc3RvcmUpIHtcbiAgICByZXR1cm4gcmF3R2V0dGVyKFxuICAgICAgbG9jYWwuc3RhdGUsIC8vIGxvY2FsIHN0YXRlXG4gICAgICBsb2NhbC5nZXR0ZXJzLCAvLyBsb2NhbCBnZXR0ZXJzXG4gICAgICBzdG9yZS5zdGF0ZSwgLy8gcm9vdCBzdGF0ZVxuICAgICAgc3RvcmUuZ2V0dGVycyAvLyByb290IGdldHRlcnNcbiAgICApXG4gIH07XG59XG5cbmZ1bmN0aW9uIGVuYWJsZVN0cmljdE1vZGUgKHN0b3JlKSB7XG4gIHN0b3JlLl92bS4kd2F0Y2goZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fZGF0YS4kJHN0YXRlIH0sIGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgICAgYXNzZXJ0KHN0b3JlLl9jb21taXR0aW5nLCBcImRvIG5vdCBtdXRhdGUgdnVleCBzdG9yZSBzdGF0ZSBvdXRzaWRlIG11dGF0aW9uIGhhbmRsZXJzLlwiKTtcbiAgICB9XG4gIH0sIHsgZGVlcDogdHJ1ZSwgc3luYzogdHJ1ZSB9KTtcbn1cblxuZnVuY3Rpb24gZ2V0TmVzdGVkU3RhdGUgKHN0YXRlLCBwYXRoKSB7XG4gIHJldHVybiBwYXRoLnJlZHVjZShmdW5jdGlvbiAoc3RhdGUsIGtleSkgeyByZXR1cm4gc3RhdGVba2V5XTsgfSwgc3RhdGUpXG59XG5cbmZ1bmN0aW9uIHVuaWZ5T2JqZWN0U3R5bGUgKHR5cGUsIHBheWxvYWQsIG9wdGlvbnMpIHtcbiAgaWYgKGlzT2JqZWN0KHR5cGUpICYmIHR5cGUudHlwZSkge1xuICAgIG9wdGlvbnMgPSBwYXlsb2FkO1xuICAgIHBheWxvYWQgPSB0eXBlO1xuICAgIHR5cGUgPSB0eXBlLnR5cGU7XG4gIH1cblxuICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSkge1xuICAgIGFzc2VydCh0eXBlb2YgdHlwZSA9PT0gJ3N0cmluZycsIChcImV4cGVjdHMgc3RyaW5nIGFzIHRoZSB0eXBlLCBidXQgZm91bmQgXCIgKyAodHlwZW9mIHR5cGUpICsgXCIuXCIpKTtcbiAgfVxuXG4gIHJldHVybiB7IHR5cGU6IHR5cGUsIHBheWxvYWQ6IHBheWxvYWQsIG9wdGlvbnM6IG9wdGlvbnMgfVxufVxuXG5mdW5jdGlvbiBpbnN0YWxsIChfVnVlKSB7XG4gIGlmIChWdWUgJiYgX1Z1ZSA9PT0gVnVlKSB7XG4gICAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICdbdnVleF0gYWxyZWFkeSBpbnN0YWxsZWQuIFZ1ZS51c2UoVnVleCkgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IG9uY2UuJ1xuICAgICAgKTtcbiAgICB9XG4gICAgcmV0dXJuXG4gIH1cbiAgVnVlID0gX1Z1ZTtcbiAgYXBwbHlNaXhpbihWdWUpO1xufVxuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZ2V0dGluZyB0aGUgc3RhdGUuXG4gKiBAcGFyYW0ge1N0cmluZ30gW25hbWVzcGFjZV0gLSBNb2R1bGUncyBuYW1lc3BhY2VcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBzdGF0ZXMgIyBPYmplY3QncyBpdGVtIGNhbiBiZSBhIGZ1bmN0aW9uIHdoaWNoIGFjY2VwdCBzdGF0ZSBhbmQgZ2V0dGVycyBmb3IgcGFyYW0sIHlvdSBjYW4gZG8gc29tZXRoaW5nIGZvciBzdGF0ZSBhbmQgZ2V0dGVycyBpbiBpdC5cbiAqIEBwYXJhbSB7T2JqZWN0fVxuICovXG52YXIgbWFwU3RhdGUgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgc3RhdGVzKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykgJiYgIWlzVmFsaWRNYXAoc3RhdGVzKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1t2dWV4XSBtYXBTdGF0ZTogbWFwcGVyIHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBhbiBBcnJheSBvciBhbiBPYmplY3QnKTtcbiAgfVxuICBub3JtYWxpemVNYXAoc3RhdGVzKS5mb3JFYWNoKGZ1bmN0aW9uIChyZWYpIHtcbiAgICB2YXIga2V5ID0gcmVmLmtleTtcbiAgICB2YXIgdmFsID0gcmVmLnZhbDtcblxuICAgIHJlc1trZXldID0gZnVuY3Rpb24gbWFwcGVkU3RhdGUgKCkge1xuICAgICAgdmFyIHN0YXRlID0gdGhpcy4kc3RvcmUuc3RhdGU7XG4gICAgICB2YXIgZ2V0dGVycyA9IHRoaXMuJHN0b3JlLmdldHRlcnM7XG4gICAgICBpZiAobmFtZXNwYWNlKSB7XG4gICAgICAgIHZhciBtb2R1bGUgPSBnZXRNb2R1bGVCeU5hbWVzcGFjZSh0aGlzLiRzdG9yZSwgJ21hcFN0YXRlJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBzdGF0ZSA9IG1vZHVsZS5jb250ZXh0LnN0YXRlO1xuICAgICAgICBnZXR0ZXJzID0gbW9kdWxlLmNvbnRleHQuZ2V0dGVycztcbiAgICAgIH1cbiAgICAgIHJldHVybiB0eXBlb2YgdmFsID09PSAnZnVuY3Rpb24nXG4gICAgICAgID8gdmFsLmNhbGwodGhpcywgc3RhdGUsIGdldHRlcnMpXG4gICAgICAgIDogc3RhdGVbdmFsXVxuICAgIH07XG4gICAgLy8gbWFyayB2dWV4IGdldHRlciBmb3IgZGV2dG9vbHNcbiAgICByZXNba2V5XS52dWV4ID0gdHJ1ZTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgY29tbWl0dGluZyB0aGUgbXV0YXRpb25cbiAqIEBwYXJhbSB7U3RyaW5nfSBbbmFtZXNwYWNlXSAtIE1vZHVsZSdzIG5hbWVzcGFjZVxuICogQHBhcmFtIHtPYmplY3R8QXJyYXl9IG11dGF0aW9ucyAjIE9iamVjdCdzIGl0ZW0gY2FuIGJlIGEgZnVuY3Rpb24gd2hpY2ggYWNjZXB0IGBjb21taXRgIGZ1bmN0aW9uIGFzIHRoZSBmaXJzdCBwYXJhbSwgaXQgY2FuIGFjY2VwdCBhbnRob3IgcGFyYW1zLiBZb3UgY2FuIGNvbW1pdCBtdXRhdGlvbiBhbmQgZG8gYW55IG90aGVyIHRoaW5ncyBpbiB0aGlzIGZ1bmN0aW9uLiBzcGVjaWFsbHksIFlvdSBuZWVkIHRvIHBhc3MgYW50aG9yIHBhcmFtcyBmcm9tIHRoZSBtYXBwZWQgZnVuY3Rpb24uXG4gKiBAcmV0dXJuIHtPYmplY3R9XG4gKi9cbnZhciBtYXBNdXRhdGlvbnMgPSBub3JtYWxpemVOYW1lc3BhY2UoZnVuY3Rpb24gKG5hbWVzcGFjZSwgbXV0YXRpb25zKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykgJiYgIWlzVmFsaWRNYXAobXV0YXRpb25zKSkge1xuICAgIGNvbnNvbGUuZXJyb3IoJ1t2dWV4XSBtYXBNdXRhdGlvbnM6IG1hcHBlciBwYXJhbWV0ZXIgbXVzdCBiZSBlaXRoZXIgYW4gQXJyYXkgb3IgYW4gT2JqZWN0Jyk7XG4gIH1cbiAgbm9ybWFsaXplTWFwKG11dGF0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIGtleSA9IHJlZi5rZXk7XG4gICAgdmFyIHZhbCA9IHJlZi52YWw7XG5cbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZE11dGF0aW9uICgpIHtcbiAgICAgIHZhciBhcmdzID0gW10sIGxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICB3aGlsZSAoIGxlbi0tICkgYXJnc1sgbGVuIF0gPSBhcmd1bWVudHNbIGxlbiBdO1xuXG4gICAgICAvLyBHZXQgdGhlIGNvbW1pdCBtZXRob2QgZnJvbSBzdG9yZVxuICAgICAgdmFyIGNvbW1pdCA9IHRoaXMuJHN0b3JlLmNvbW1pdDtcbiAgICAgIGlmIChuYW1lc3BhY2UpIHtcbiAgICAgICAgdmFyIG1vZHVsZSA9IGdldE1vZHVsZUJ5TmFtZXNwYWNlKHRoaXMuJHN0b3JlLCAnbWFwTXV0YXRpb25zJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb21taXQgPSBtb2R1bGUuY29udGV4dC5jb21taXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICA/IHZhbC5hcHBseSh0aGlzLCBbY29tbWl0XS5jb25jYXQoYXJncykpXG4gICAgICAgIDogY29tbWl0LmFwcGx5KHRoaXMuJHN0b3JlLCBbdmFsXS5jb25jYXQoYXJncykpXG4gICAgfTtcbiAgfSk7XG4gIHJldHVybiByZXNcbn0pO1xuXG4vKipcbiAqIFJlZHVjZSB0aGUgY29kZSB3aGljaCB3cml0dGVuIGluIFZ1ZS5qcyBmb3IgZ2V0dGluZyB0aGUgZ2V0dGVyc1xuICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2VdIC0gTW9kdWxlJ3MgbmFtZXNwYWNlXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gZ2V0dGVyc1xuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgbWFwR2V0dGVycyA9IG5vcm1hbGl6ZU5hbWVzcGFjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBnZXR0ZXJzKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykgJiYgIWlzVmFsaWRNYXAoZ2V0dGVycykpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbdnVleF0gbWFwR2V0dGVyczogbWFwcGVyIHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBhbiBBcnJheSBvciBhbiBPYmplY3QnKTtcbiAgfVxuICBub3JtYWxpemVNYXAoZ2V0dGVycykuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIGtleSA9IHJlZi5rZXk7XG4gICAgdmFyIHZhbCA9IHJlZi52YWw7XG5cbiAgICAvLyBUaGUgbmFtZXNwYWNlIGhhcyBiZWVuIG11dGF0ZWQgYnkgbm9ybWFsaXplTmFtZXNwYWNlXG4gICAgdmFsID0gbmFtZXNwYWNlICsgdmFsO1xuICAgIHJlc1trZXldID0gZnVuY3Rpb24gbWFwcGVkR2V0dGVyICgpIHtcbiAgICAgIGlmIChuYW1lc3BhY2UgJiYgIWdldE1vZHVsZUJ5TmFtZXNwYWNlKHRoaXMuJHN0b3JlLCAnbWFwR2V0dGVycycsIG5hbWVzcGFjZSkpIHtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhKHZhbCBpbiB0aGlzLiRzdG9yZS5nZXR0ZXJzKSkge1xuICAgICAgICBjb25zb2xlLmVycm9yKChcIlt2dWV4XSB1bmtub3duIGdldHRlcjogXCIgKyB2YWwpKTtcbiAgICAgICAgcmV0dXJuXG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy4kc3RvcmUuZ2V0dGVyc1t2YWxdXG4gICAgfTtcbiAgICAvLyBtYXJrIHZ1ZXggZ2V0dGVyIGZvciBkZXZ0b29sc1xuICAgIHJlc1trZXldLnZ1ZXggPSB0cnVlO1xuICB9KTtcbiAgcmV0dXJuIHJlc1xufSk7XG5cbi8qKlxuICogUmVkdWNlIHRoZSBjb2RlIHdoaWNoIHdyaXR0ZW4gaW4gVnVlLmpzIGZvciBkaXNwYXRjaCB0aGUgYWN0aW9uXG4gKiBAcGFyYW0ge1N0cmluZ30gW25hbWVzcGFjZV0gLSBNb2R1bGUncyBuYW1lc3BhY2VcbiAqIEBwYXJhbSB7T2JqZWN0fEFycmF5fSBhY3Rpb25zICMgT2JqZWN0J3MgaXRlbSBjYW4gYmUgYSBmdW5jdGlvbiB3aGljaCBhY2NlcHQgYGRpc3BhdGNoYCBmdW5jdGlvbiBhcyB0aGUgZmlyc3QgcGFyYW0sIGl0IGNhbiBhY2NlcHQgYW50aG9yIHBhcmFtcy4gWW91IGNhbiBkaXNwYXRjaCBhY3Rpb24gYW5kIGRvIGFueSBvdGhlciB0aGluZ3MgaW4gdGhpcyBmdW5jdGlvbi4gc3BlY2lhbGx5LCBZb3UgbmVlZCB0byBwYXNzIGFudGhvciBwYXJhbXMgZnJvbSB0aGUgbWFwcGVkIGZ1bmN0aW9uLlxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgbWFwQWN0aW9ucyA9IG5vcm1hbGl6ZU5hbWVzcGFjZShmdW5jdGlvbiAobmFtZXNwYWNlLCBhY3Rpb25zKSB7XG4gIHZhciByZXMgPSB7fTtcbiAgaWYgKChcImRldmVsb3BtZW50XCIgIT09ICdwcm9kdWN0aW9uJykgJiYgIWlzVmFsaWRNYXAoYWN0aW9ucykpIHtcbiAgICBjb25zb2xlLmVycm9yKCdbdnVleF0gbWFwQWN0aW9uczogbWFwcGVyIHBhcmFtZXRlciBtdXN0IGJlIGVpdGhlciBhbiBBcnJheSBvciBhbiBPYmplY3QnKTtcbiAgfVxuICBub3JtYWxpemVNYXAoYWN0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAocmVmKSB7XG4gICAgdmFyIGtleSA9IHJlZi5rZXk7XG4gICAgdmFyIHZhbCA9IHJlZi52YWw7XG5cbiAgICByZXNba2V5XSA9IGZ1bmN0aW9uIG1hcHBlZEFjdGlvbiAoKSB7XG4gICAgICB2YXIgYXJncyA9IFtdLCBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgICAgd2hpbGUgKCBsZW4tLSApIGFyZ3NbIGxlbiBdID0gYXJndW1lbnRzWyBsZW4gXTtcblxuICAgICAgLy8gZ2V0IGRpc3BhdGNoIGZ1bmN0aW9uIGZyb20gc3RvcmVcbiAgICAgIHZhciBkaXNwYXRjaCA9IHRoaXMuJHN0b3JlLmRpc3BhdGNoO1xuICAgICAgaWYgKG5hbWVzcGFjZSkge1xuICAgICAgICB2YXIgbW9kdWxlID0gZ2V0TW9kdWxlQnlOYW1lc3BhY2UodGhpcy4kc3RvcmUsICdtYXBBY3Rpb25zJywgbmFtZXNwYWNlKTtcbiAgICAgICAgaWYgKCFtb2R1bGUpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBkaXNwYXRjaCA9IG1vZHVsZS5jb250ZXh0LmRpc3BhdGNoO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHR5cGVvZiB2YWwgPT09ICdmdW5jdGlvbidcbiAgICAgICAgPyB2YWwuYXBwbHkodGhpcywgW2Rpc3BhdGNoXS5jb25jYXQoYXJncykpXG4gICAgICAgIDogZGlzcGF0Y2guYXBwbHkodGhpcy4kc3RvcmUsIFt2YWxdLmNvbmNhdChhcmdzKSlcbiAgICB9O1xuICB9KTtcbiAgcmV0dXJuIHJlc1xufSk7XG5cbi8qKlxuICogUmViaW5kaW5nIG5hbWVzcGFjZSBwYXJhbSBmb3IgbWFwWFhYIGZ1bmN0aW9uIGluIHNwZWNpYWwgc2NvcGVkLCBhbmQgcmV0dXJuIHRoZW0gYnkgc2ltcGxlIG9iamVjdFxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG52YXIgY3JlYXRlTmFtZXNwYWNlZEhlbHBlcnMgPSBmdW5jdGlvbiAobmFtZXNwYWNlKSB7IHJldHVybiAoe1xuICBtYXBTdGF0ZTogbWFwU3RhdGUuYmluZChudWxsLCBuYW1lc3BhY2UpLFxuICBtYXBHZXR0ZXJzOiBtYXBHZXR0ZXJzLmJpbmQobnVsbCwgbmFtZXNwYWNlKSxcbiAgbWFwTXV0YXRpb25zOiBtYXBNdXRhdGlvbnMuYmluZChudWxsLCBuYW1lc3BhY2UpLFxuICBtYXBBY3Rpb25zOiBtYXBBY3Rpb25zLmJpbmQobnVsbCwgbmFtZXNwYWNlKVxufSk7IH07XG5cbi8qKlxuICogTm9ybWFsaXplIHRoZSBtYXBcbiAqIG5vcm1hbGl6ZU1hcChbMSwgMiwgM10pID0+IFsgeyBrZXk6IDEsIHZhbDogMSB9LCB7IGtleTogMiwgdmFsOiAyIH0sIHsga2V5OiAzLCB2YWw6IDMgfSBdXG4gKiBub3JtYWxpemVNYXAoe2E6IDEsIGI6IDIsIGM6IDN9KSA9PiBbIHsga2V5OiAnYScsIHZhbDogMSB9LCB7IGtleTogJ2InLCB2YWw6IDIgfSwgeyBrZXk6ICdjJywgdmFsOiAzIH0gXVxuICogQHBhcmFtIHtBcnJheXxPYmplY3R9IG1hcFxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBub3JtYWxpemVNYXAgKG1hcCkge1xuICBpZiAoIWlzVmFsaWRNYXAobWFwKSkge1xuICAgIHJldHVybiBbXVxuICB9XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG1hcClcbiAgICA/IG1hcC5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKHsga2V5OiBrZXksIHZhbDoga2V5IH0pOyB9KVxuICAgIDogT2JqZWN0LmtleXMobWFwKS5tYXAoZnVuY3Rpb24gKGtleSkgeyByZXR1cm4gKHsga2V5OiBrZXksIHZhbDogbWFwW2tleV0gfSk7IH0pXG59XG5cbi8qKlxuICogVmFsaWRhdGUgd2hldGhlciBnaXZlbiBtYXAgaXMgdmFsaWQgb3Igbm90XG4gKiBAcGFyYW0geyp9IG1hcFxuICogQHJldHVybiB7Qm9vbGVhbn1cbiAqL1xuZnVuY3Rpb24gaXNWYWxpZE1hcCAobWFwKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KG1hcCkgfHwgaXNPYmplY3QobWFwKVxufVxuXG4vKipcbiAqIFJldHVybiBhIGZ1bmN0aW9uIGV4cGVjdCB0d28gcGFyYW0gY29udGFpbnMgbmFtZXNwYWNlIGFuZCBtYXAuIGl0IHdpbGwgbm9ybWFsaXplIHRoZSBuYW1lc3BhY2UgYW5kIHRoZW4gdGhlIHBhcmFtJ3MgZnVuY3Rpb24gd2lsbCBoYW5kbGUgdGhlIG5ldyBuYW1lc3BhY2UgYW5kIHRoZSBtYXAuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICogQHJldHVybiB7RnVuY3Rpb259XG4gKi9cbmZ1bmN0aW9uIG5vcm1hbGl6ZU5hbWVzcGFjZSAoZm4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChuYW1lc3BhY2UsIG1hcCkge1xuICAgIGlmICh0eXBlb2YgbmFtZXNwYWNlICE9PSAnc3RyaW5nJykge1xuICAgICAgbWFwID0gbmFtZXNwYWNlO1xuICAgICAgbmFtZXNwYWNlID0gJyc7XG4gICAgfSBlbHNlIGlmIChuYW1lc3BhY2UuY2hhckF0KG5hbWVzcGFjZS5sZW5ndGggLSAxKSAhPT0gJy8nKSB7XG4gICAgICBuYW1lc3BhY2UgKz0gJy8nO1xuICAgIH1cbiAgICByZXR1cm4gZm4obmFtZXNwYWNlLCBtYXApXG4gIH1cbn1cblxuLyoqXG4gKiBTZWFyY2ggYSBzcGVjaWFsIG1vZHVsZSBmcm9tIHN0b3JlIGJ5IG5hbWVzcGFjZS4gaWYgbW9kdWxlIG5vdCBleGlzdCwgcHJpbnQgZXJyb3IgbWVzc2FnZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBzdG9yZVxuICogQHBhcmFtIHtTdHJpbmd9IGhlbHBlclxuICogQHBhcmFtIHtTdHJpbmd9IG5hbWVzcGFjZVxuICogQHJldHVybiB7T2JqZWN0fVxuICovXG5mdW5jdGlvbiBnZXRNb2R1bGVCeU5hbWVzcGFjZSAoc3RvcmUsIGhlbHBlciwgbmFtZXNwYWNlKSB7XG4gIHZhciBtb2R1bGUgPSBzdG9yZS5fbW9kdWxlc05hbWVzcGFjZU1hcFtuYW1lc3BhY2VdO1xuICBpZiAoKFwiZGV2ZWxvcG1lbnRcIiAhPT0gJ3Byb2R1Y3Rpb24nKSAmJiAhbW9kdWxlKSB7XG4gICAgY29uc29sZS5lcnJvcigoXCJbdnVleF0gbW9kdWxlIG5hbWVzcGFjZSBub3QgZm91bmQgaW4gXCIgKyBoZWxwZXIgKyBcIigpOiBcIiArIG5hbWVzcGFjZSkpO1xuICB9XG4gIHJldHVybiBtb2R1bGVcbn1cblxudmFyIGluZGV4X2NqcyA9IHtcbiAgU3RvcmU6IFN0b3JlLFxuICBpbnN0YWxsOiBpbnN0YWxsLFxuICB2ZXJzaW9uOiAnMy40LjAnLFxuICBtYXBTdGF0ZTogbWFwU3RhdGUsXG4gIG1hcE11dGF0aW9uczogbWFwTXV0YXRpb25zLFxuICBtYXBHZXR0ZXJzOiBtYXBHZXR0ZXJzLFxuICBtYXBBY3Rpb25zOiBtYXBBY3Rpb25zLFxuICBjcmVhdGVOYW1lc3BhY2VkSGVscGVyczogY3JlYXRlTmFtZXNwYWNlZEhlbHBlcnNcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gaW5kZXhfY2pzO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9bXMtYnV0dG9uLXNldCA6Y2xhc3M9XFxcInsnbXMtYnV0dG9uLXNldC0tb3ZhbCc6IG92YWxCdXR0b259XFxcIj48ZGl2IHYtZm9yPVxcXCIoYiwgaSkgaW4gYnV0dG9uc1xcXCIgY2xhc3M9bXMtYnV0dG9uLXNldF9idXR0b24tY29udGFpbmVyIDpjbGFzcz1cXFwieydtcy1idXR0b24tc2V0X2J1dHRvbi1jb250YWluZXItLWljb24nOiBiLmljb259XFxcIj48aW5wdXQgdHlwZT1jaGVja2JveCBjbGFzcz1tcy1idXR0b24tc2V0X2J1dHRvbi1jaGVja2JveCB2LW1vZGVsPXZhbHVlc1tpXSBAY2hhbmdlPWNoYW5nZShpKSA6ZGlzYWJsZWQ9Yi5kaXNhYmxlZD48ZGl2IGNsYXNzPW1zLWJ1dHRvbi1zZXRfYnV0dG9uLWNvbnRlbnQ+PHNwYW4gdi1pZj1iLmljb24gY2xhc3M9bXMtYnV0dG9uLXNldF9idXR0b24taWNvbiA6Y2xhc3M9XFxcIidtcy1idXR0b24tc2V0X2J1dHRvbi1pY29uLS0nK2IuaWNvblxcXCI+PC9zcGFuPiA8c3BhbiBjbGFzcz1tcy1idXR0b24tc2V0X2J1dHRvbi10ZXh0Pnt7Yi5sYWJlbH19PC9zcGFuPiA8c3BhbiB2LWlmPWIubW9iaWxlTGFiZWwgY2xhc3M9bXMtYnV0dG9uLXNldF9idXR0b24tbW9iaWxlLXRleHQ+e3tiLm1vYmlsZUxhYmVsfX08L3NwYW4+PGRpdiB2LWlmPWIuZGlzYWJsZWQgY2xhc3M9bXMtYnV0dG9uLXNldF9idXR0b24tbm90aWNlPnt7ZGlzYWJsZWRNZXNzYWdlfX08L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj5cIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IHYtaWY9ZGF0YS5sb2FkaW5nTWVzc2FnZSBjbGFzcz1tcy1sb2FkaW5nX2NvbnRhaW5lcj48ZGl2IGNsYXNzPW1zLWxvYWRpbmdfdGV4dD57e2RhdGEubG9hZGluZ01lc3NhZ2V9fTwvZGl2PjwvZGl2PjxkaXYgdi1lbHNlLWlmPWRhdGEuc2VhcmNoUmVzdWx0cz48Y29tcG9uZW50IDppcz1jb21wb25lbnQgdi1mb3I9XFxcIml0ZW0gaW4gZGF0YS5zZWFyY2hSZXN1bHRzLlJlc3VsdHNcXFwiIDppdGVtPWl0ZW0gOnNlbGVjdGVkLXVuaXQ9c2VsZWN0ZWRVbml0IDprZXk9aXRlbS5pZCA6dmlldy1wcm9kdWN0LWxhYmVsPXZpZXdQcm9kdWN0TGFiZWw+PC9kaXY+XCI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdj48bXMtZnJhbWUtc2VwYXJhdG9yIHYtaWY9c2hvd1RpdGxlIDp0aXRsZT1vcHRpb25zLnF1ZXN0aW9uPjwvbXMtZnJhbWUtc2VwYXJhdG9yPjxtcy1idXR0b24tc2V0IHYtaWY9b3B0aW9ucy5idXR0b24gOmtleT1rZXkgOmJ1dHRvbnM9b3B0aW9ucy5idXR0b24gOm11bHRpcGxlPW9wdGlvbnMubXVsdGlwbGUgOm92YWwtYnV0dG9uPW9wdGlvbnMub3ZhbEJ1dHRvbiA6ZGlzYWJsZWQtbWVzc2FnZT1vcHRpb25zLmRpc2FibGVkTWVzc2FnZSA6b24tY2hhbmdlPW9uQ2hhbmdlIDpkZWZhdWx0LXZhbHVlPWRlZmF1bHRWYWx1ZXMgOm9uLXRyaWdnZXItZXZlbnQ9b25UcmlnZ2VyQW5zd2VyRXZlbnQ+PC9tcy1idXR0b24tc2V0Pjxtcy1pbnB1dC1ib3ggdi1lbHNlIDprZXk9a2V5IDp0aXRsZT1vcHRpb25zLmZpbHRlck5hbWUgOmRlc2NyaXB0aW9uPW9wdGlvbnMucXVlc3Rpb24gOnN3aXRjaGVyPW9wdGlvbnMub3B0aW9ucyA6ZHJvcGRvd24tb3B0aW9ucz1kcm9wZG93bk9wdGlvbnMgOmlucHV0PWlucHV0IDpvbi1jaGFuZ2U9b25DaGFuZ2UgOmRlZmF1bHQtdmFsdWU9ZGVmYXVsdFZhbHVlcyA6b24tdHJpZ2dlci1ldmVudD1vblRyaWdnZXJBbnN3ZXJFdmVudD48L21zLWlucHV0LWJveD48L2Rpdj5cIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPW1zLWZyYW1lX3NlcGFyYXRvcj48ZGl2IHYtaWY9dGl0bGUgY2xhc3M9bXMtZnJhbWVfc2VwYXJhdG9yLXRpdGxlLWNvbnRhaW5lcj48aDMgY2xhc3M9bXMtZnJhbWVfc2VwYXJhdG9yLXRpdGxlPnt7dGl0bGV9fTwvaDM+PC9kaXY+PC9kaXY+XCI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1tcy1mcmFtZSA6Y2xhc3M9XFxcInsnbXMtZnJhbWUtLWxhdGVyYWwtYmFyJzogaXNMYXRlcmFsQmFyLCAnbXMtZnJhbWUtLXRyYW5zcGFyZW50JzogdHJhbnNwYXJlbnR9XFxcIj48ZGl2IHYtaWY9aXNMYXRlcmFsQmFyIGNsYXNzPW1zLWZyYW1lX21vYmlsZS1oZWFkZXI+PGEgY2xhc3M9bXMtZnJhbWVfbW9iaWxlLWNsb3NlLWJ1dHRvbiBAY2xpY2s9b3Blbj57e21vYmlsZUJ1dHRvbkxhYmVsfX08L2E+PC9kaXY+PGRpdiB2LWlmPXRpdGxlIGNsYXNzPW1zLWZyYW1lX3RpdGxlLWNvbnRhaW5lcj48aDQgY2xhc3M9bXMtZnJhbWVfdGl0bGU+e3t0aXRsZX19PC9oND48L2Rpdj48ZGl2IGNsYXNzPW1zLWZyYW1lX2NvbnRhaW5lcj48ZGl2IHYtaWY9bWVzc2FnZSB2LWh0bWw9bWVzc2FnZSBjbGFzcz1tcy1mcmFtZV9tZXNzYWdlPjwvZGl2PjxkaXYgdi1lbHNlIGNsYXNzPW1zLWZyYW1lX2NvbnRlbnQ+PHNsb3Q+PC9zbG90PjwvZGl2PjxkaXYgdi1pZj1ub3RpY2Ugdi1odG1sPW5vdGljZSBjbGFzcz1tcy1mcmFtZV9ub3RpY2U+PC9kaXY+PGRpdiB2LWlmPWhhc0J1dHRvbnMgY2xhc3M9bXMtZnJhbWVfYnV0dG9uLWNvbnRhaW5lcj48YSB2LWlmPWhhc0NvbnRhY3RCdXR0b24gaHJlZj0jbWV0ZXJzZWxlY3RvciBjbGFzcz1cXFwibXMtZnJhbWVfYnV0dG9uIG1zLWZyYW1lX2J1dHRvbi0tY29udGFjdFxcXCI+e3tjb250YWN0QnV0dG9uLmxhYmVsfX08L2E+IDxidXR0b24gdi1pZj1oYXNCdXR0b24gY2xhc3M9bXMtZnJhbWVfYnV0dG9uIDpjbGFzcz1cXFwieydtcy1mcmFtZV9idXR0b24tLXBhcmFtZXRlcnMnOiBoYXNQYXJhbWV0ZXJzQnV0dG9ufVxcXCIgOmRpc2FibGVkPWRpc2FibGVCdXR0b24gQGNsaWNrPWNsaWNrQnV0dG9uPnt7YnV0dG9uTGFiZWx9fTwvYnV0dG9uPjwvZGl2PjwvZGl2PjxhIHYtaWY9Y2FuY2VsQnV0dG9uTGFiZWwgY2xhc3M9bXMtZnJhbWVfY2FuY2VsLWJ1dHRvbiBAY2xpY2s9Y2FuY2VsPnt7Y2FuY2VsQnV0dG9uTGFiZWx9fTwvYT48L2Rpdj5cIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPW1zLWlucHV0LWJveD48ZGl2IGNsYXNzPW1zLWlucHV0LWJveF90b3AtY29udGVudD48ZGl2IGNsYXNzPW1zLWlucHV0LWJveF90aXRsZS1jb250YWluZXI+PGg0IGNsYXNzPW1zLWlucHV0LWJveF90aXRsZT57e3RpdGxlfX08L2g0PjwvZGl2PjxkaXYgdi1pZj1zd2l0Y2hlckZpZWxkIGNsYXNzPW1zLWlucHV0LWJveF9zd2l0Y2hlci1jb250YWluZXI+PGlucHV0IHYtbW9kZWw9c3dpdGNoZXJWYWx1ZSB0eXBlPWNoZWNrYm94IGNsYXNzPW1zLWlucHV0LWJveF9zd2l0Y2hlci1pbnB1dD48ZGl2IGNsYXNzPW1zLWlucHV0LWJveF9zd2l0Y2hlci1sYWJlbC1jb250YWluZXI+PHNwYW4+e3tzd2l0Y2hlckZpZWxkLmxlZnQubGFiZWx9fTwvc3Bhbj4gPHNwYW4+e3tzd2l0Y2hlckZpZWxkLnJpZ2h0LmxhYmVsfX08L3NwYW4+PC9kaXY+PC9kaXY+PGRpdiB2LWlmPWRlc2NyaXB0aW9uIGNsYXNzPW1zLWlucHV0LWJveF9kZXNjcmlwdGlvbi1jb250YWluZXI+e3tkZXNjcmlwdGlvbn19PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz1tcy1pbnB1dC1ib3hfYm90dG9tLWNvbnRlbnQ+PGRpdiB2LWlmPWRyb3Bkb3duRmllbGQgY2xhc3M9bXMtaW5wdXQtYm94X2Ryb3Bkb3duLWNvbnRhaW5lcj48c2VsZWN0IHYtbW9kZWw9ZHJvcGRvd25WYWx1ZT48b3B0aW9uIHYtZm9yPVxcXCJvIGluIGRyb3Bkb3duRmllbGQub3B0aW9uc1xcXCIgOnZhbHVlPW8udmFsdWU+e3sgby5sYWJlbCB9fTwvb3B0aW9uPjwvc2VsZWN0PjwvZGl2PjxkaXYgdi1pZj1pbnB1dEZpZWxkIGNsYXNzPW1zLWlucHV0LWJveF9pbnB1dC1jb250YWluZXI+PGRpdiBjbGFzcz1tcy1pbnB1dC1ib3hfaW5wdXQtdGl0bGU+PHNwYW4gOmlzPWlucHV0VGl0bGUgOm9wdGlvbj1vcHRpb24+PC9zcGFuPjwvZGl2PjxkaXYgY2xhc3M9bXMtaW5wdXQtYm94X3RleHQtaW5wdXQtY29udGFpbmVyIDpjbGFzcz1cXFwieyAnbXMtaW5wdXQtYm94X3RleHQtaW5wdXQtY29udGFpbmVyLS1lcnJvcic6IGlucHV0RXJyb3JNZXNzYWdlIH1cXFwiPjxpbnB1dCB2LW1vZGVsPWlucHV0VmFsdWUgdHlwZT10ZXh0IGNsYXNzPW1zLWlucHV0LWJveF90ZXh0LWlucHV0IDpwbGFjZWhvbGRlcj1pbnB1dEZpZWxkLnBsYWNlaG9sZGVyIEBibHVyPW9uQmx1cklucHV0PjwvZGl2PjxkaXYgdi1pZj1pbnB1dEVycm9yTWVzc2FnZSBjbGFzcz1tcy1pbnB1dC1ib3hfdGV4dC1pbnB1dC1lcnJvcj57e2lucHV0RXJyb3JNZXNzYWdlfX08L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj5cIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IHYtaWY9XFxcIihkYXRhLmZpcnN0TG9hZCAmJiBpc1Nob3cpIHx8IGRhdGEubmV4dFBhZ2VcXFwiPjxzbG90Pjwvc2xvdD48L2Rpdj5cIjtcbiIsIm1vZHVsZS5leHBvcnRzID0gXCI8ZGl2IGNsYXNzPVxcXCJwcm9kdWN0LWNhcmQtaG9yIG1ldGVyLXNlbGVjdG9yX19wcm9kdWN0LWNhcmQtaG9yXFxcIj48ZGl2IGNsYXNzPXByb2R1Y3QtY2FyZC1ob3JfX3dyYXBwZXI+PGRpdiBjbGFzcz1wcm9kdWN0LWNhcmQtaG9yX19yb3c+PGRpdiBjbGFzcz1cXFwicHJvZHVjdC1jYXJkLWhvcl9fYXJlYSBwcm9kdWN0LWNhcmQtaG9yX19hcmVhLXV0aWxzXFxcIj48Ym9va21hcmsgaW5saW5lLXRlbXBsYXRlIDppdGVtPWl0ZW0+PGRpdiBjbGFzcz1cXFwicHJvZHVjdC1jYXJkLWhvcl9fdXRpbCBwcm9kdWN0LWNhcmQtaG9yX191dGlsLWJvb2ttYXJrXFxcIiB2LW9uOmNsaWNrPWhhbmRsZUJvb2ttYXJrKCk+PHNwYW4gY2xhc3M9cHJvZHVjdC1jYXJkLWhvcl9fYm9va21hcmsgOmRhdGEtcHJvZHVjdC1pZD1pdGVtLmlkIHJlZj1ib29rbWFyayA6Y2xhc3M9XFxcInthY3RpdmU6IGlzQm9va21hcmtlZH1cXFwiPjwvc3Bhbj48L2Rpdj48L2Jvb2ttYXJrPjwvZGl2PjxkaXYgY2xhc3M9XFxcInByb2R1Y3QtY2FyZC1ob3JfX2FyZWEgcHJvZHVjdC1jYXJkLWhvcl9fYXJlYS1pbWFnZVxcXCI+PGRpdiBjbGFzcz1wcm9kdWN0LWNhcmQtaG9yX19pbWFnZS1jb250YWluZXIgOnN0eWxlPVxcXCJ7J2JhY2tncm91bmQtaW1hZ2UnOiAndXJsKCcraXRlbS5wcm9kdWN0SW1hZ2VVcmwrJyknfVxcXCI+PC9kaXY+PC9kaXY+PGRpdiBjbGFzcz1cXFwicHJvZHVjdC1jYXJkLWhvcl9fYXJlYSBwcm9kdWN0LWNhcmQtaG9yX19hcmVhLWNvbnRlbnRcXFwiPjxkaXY+PHNwYW4gY2xhc3M9cHJvZHVjdC1jYXJkLWhvcl9fZXllYnJvdz48aW1nIDpzcmM9aXRlbS5icmFuZEltYWdlVXJsIDphbHQ9aXRlbS5icmFuZEltYWdlVXJsQWx0VGV4dCBjbGFzcz1wcm9kdWN0LWNhcmQtaG9yX19leWVicm93LWltYWdlPjwvc3Bhbj48cCBjbGFzcz1wcm9kdWN0LWNhcmQtaG9yX190aXRsZSB2LWh0bWw9aXRlbS5wcm9kdWN0TmFtZT48L3A+PGRpdiBjbGFzcz1wcm9kdWN0LWNhcmQtaG9yX19jb3B5IHYtaHRtbD1pdGVtLnByb2R1Y3REZXNjcmlwdGlvbj48L2Rpdj48ZGl2IGNsYXNzPXByb2R1Y3QtY2FyZC1ob3JfX2N0YT48YSA6aHJlZj1pdGVtLnVybCBjbGFzcz1cXFwiYnV0dG9uIHRlcnRpYXJ5LWJ1dHRvblxcXCI+PHNwYW4gY2xhc3M9YnV0dG9uLXRleHQ+e3t2aWV3UHJvZHVjdExhYmVsfX08L3NwYW4+IDxzcGFuIGNsYXNzPWJ1dHRvbi1pY29uPjwvc3Bhbj48L2E+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+PC9kaXY+XCI7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IFwiPGRpdiBjbGFzcz1jYXRhbG9nLWNhcmQ+PGRpdiBjbGFzcz1jYXRhbG9nLWNhcmRfX3Jvdz48ZGl2IGNsYXNzPVxcXCJjYXRhbG9nLWNhcmRfX2FyZWEgY2F0YWxvZy1jYXJkX19hcmVhLXV0aWxcXFwiPjxib29rbWFyayBpbmxpbmUtdGVtcGxhdGUgOml0ZW09aXRlbT48ZGl2IGNsYXNzPWNhdGFsb2ctY2FyZF9fdXRpbC1ib29rbWFyaz48c3BhbiBjbGFzcz1jYXRhbG9nLWNhcmRfX2Jvb2ttYXJrIDpkYXRhLXByb2R1Y3QtaWQ9aXRlbS5pZCByZWY9Ym9va21hcmsgdi1vbjpjbGljaz1oYW5kbGVCb29rbWFyaygpIDpjbGFzcz1cXFwie2FjdGl2ZTogaXNCb29rbWFya2VkfVxcXCI+PC9zcGFuPjwvZGl2PjwvYm9va21hcms+PC9kaXY+PGRpdiBjbGFzcz1cXFwiY2F0YWxvZy1jYXJkX19hcmVhIGNhdGFsb2ctY2FyZF9fYXJlYS1oZWFkZXJcXFwiPjxkaXYgY2xhc3M9Y2F0YWxvZy1jYXJkX19pbWFnZS1jb250YWluZXI+PGEgOmhyZWY9aXRlbS51cmwgY2xhc3M9Y2F0YWxvZy1jYXJkX19pbWFnZS1saW5rPjxpbWcgY2xhc3M9Y2F0YWxvZy1jYXJkX19pbWFnZSA6c3JjPWl0ZW0ucHJvZHVjdEltYWdlVXJsIDphbHQ9aXRlbS5wcm9kdWN0SW1hZ2VVcmxBbHRUZXh0PjwvYT48L2Rpdj48aW1nIDpzcmM9aXRlbS5icmFuZEltYWdlVXJsIDphbHQ9aXRlbS5icmFuZEltYWdlVXJsQWx0VGV4dCBjbGFzcz1jYXRhbG9nLWNhcmRfX2xvZ28+PGRpdiBjbGFzcz1jYXRhbG9nLWNhcmRfX3RpdGxlIHYtaHRtbD1pdGVtLnByb2R1Y3ROYW1lPjwvZGl2PjwvZGl2PjxkaXYgY2xhc3M9XFxcImNhdGFsb2ctY2FyZF9fYXJlYSBjYXRhbG9nLWNhcmRfX2FyZWEtc3RhdHNcXFwiPjxkaXYgdi1mb3I9XFxcInN0YXQgaW4gaXRlbS5zdGF0c1xcXCIgY2xhc3M9Y2F0YWxvZy1jYXJkX19zdGF0PjxkaXYgY2xhc3M9Y2F0YWxvZy1jYXJkX19zdGF0LWxhYmVsIHYtaHRtbD1zdGF0LmxhYmVsPjwvZGl2PjxkaXYgY2xhc3M9Y2F0YWxvZy1jYXJkX19zdGF0LXZhbHVlPjxkaXYgY2xhc3M9dW5pdC1tZXRyaWMgdi1pZj1cXFwic2VsZWN0ZWRVbml0ID09PSAnbWV0cmljJ1xcXCIgdi1odG1sPXN0YXQudmFsdWVNZXRyaWM+PC9kaXY+PGRpdiBjbGFzcz11bml0LXVzIHYtaWY9XFxcInNlbGVjdGVkVW5pdCA9PT0gJ3VzJ1xcXCIgdi1odG1sPXN0YXQudmFsdWVJbXBlcmlhbD48L2Rpdj48L2Rpdj48L2Rpdj48L2Rpdj48ZGl2IGNsYXNzPVxcXCJjYXRhbG9nLWNhcmRfX2FyZWEgY2F0YWxvZy1jYXJkX19hcmVhLWN0YVxcXCI+PGEgOmhyZWY9aXRlbS51cmwgY2xhc3M9XFxcImJ1dHRvbiB0ZXJ0aWFyeS1idXR0b25cXFwiPjxzcGFuIGNsYXNzPWJ1dHRvbi10ZXh0Pnt7dmlld1Byb2R1Y3RMYWJlbH19PC9zcGFuPiA8c3BhbiBjbGFzcz1idXR0b24taWNvbj48L3NwYW4+PC9hPjwvZGl2PjwvZGl2PjwvZGl2PlwiO1xuIiwibW9kdWxlLmV4cG9ydHMgPSBcIjxkaXYgY2xhc3M9bXMtc3RlcC1iYXIgOmNsYXNzPXJvb3RDbGFzc2VzPjx1bCByZWY9bGlzdCBjbGFzcz1tcy1zdGVwLWJhcl9zdGVwLWxpc3Q+PGxpIHYtZm9yPVxcXCIocywgaSkgaW4gZ2V0U3RlcHNcXFwiIDpjbGFzcz1zLmNsYXNzZXMgQGNsaWNrPW9uQ2xpY2tTdGVwKGkpPjxkaXYgY2xhc3M9bXMtc3RlcC1iYXJfaXRlbS1jb250ZW50PjxzcGFuPnt7cy5sYWJlbH19PC9zcGFuPjxzcGFuIGNsYXNzPW1zLXN0ZXAtYmFyX2l0ZW0tc2VsZWN0ZWQtdmFsdWUgdi1pZj1zLnNlbGVjdGVkVmFsdWU+e3tzLnNlbGVjdGVkVmFsdWV9fTwvc3Bhbj48L2Rpdj48L2xpPjwvdWw+PC9kaXY+XCI7XG4iXX0="}