{"version":3,"sources":["node_modules/browser-pack/_prelude.js","node_modules/bootstrap/js/dist/base-component.js","node_modules/bootstrap/js/dist/dom/data.js","node_modules/bootstrap/js/dist/dom/event-handler.js","node_modules/bootstrap/js/dist/dom/manipulator.js","node_modules/bootstrap/js/dist/dom/selector-engine.js","node_modules/bootstrap/js/dist/modal.js","node_modules/bootstrap/js/dist/util/backdrop.js","node_modules/bootstrap/js/dist/util/component-functions.js","node_modules/bootstrap/js/dist/util/config.js","node_modules/bootstrap/js/dist/util/focustrap.js","node_modules/bootstrap/js/dist/util/index.js","node_modules/bootstrap/js/dist/util/scrollbar.js","source/theme/js/app.js","source/theme/js/modules/global/banners.js","source/theme/js/modules/global/forms.js","source/theme/js/modules/global/heros.js","source/theme/js/modules/global/location.js","source/theme/js/modules/global/mainMenu.js","source/theme/js/modules/global/mapClientTimeToService.js","source/theme/js/modules/global/modals.js","source/theme/js/modules/pages/frontPage.js","source/theme/js/modules/pages/galleryPage.js","source/theme/js/modules/pages/menuPage.js"],"names":[],"mappings":"AAAA;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;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7OA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACzGA;;AASA;;;;AAjBA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AACA;AACA;AACA;AACA;AACA;AAEA;AAEA;AAEA,IAAM,OAAO,GAAG,SAAV,OAAU,GAAM;AACp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","file":"app.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 event.callable === callable && event.delegationSelector === delegationSelector);\n }\n function normalizeParameters(originalTypeEvent, handler, delegationFunction) {\n const isDelegated = typeof handler === 'string';\n // TODO: tooltip passes `false` instead of selector, so we need to check\n const callable = isDelegated ? delegationFunction : handler || delegationFunction;\n let typeEvent = getTypeEvent(originalTypeEvent);\n if (!nativeEvents.has(typeEvent)) {\n typeEvent = originalTypeEvent;\n }\n return [isDelegated, callable, typeEvent];\n }\n function addHandler(element, originalTypeEvent, handler, delegationFunction, oneOff) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n let [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n\n // in case of mouseenter or mouseleave wrap the handler within a function that checks for its DOM position\n // this prevents the handler from being dispatched the same way as mouseover or mouseout does\n if (originalTypeEvent in customEvents) {\n const wrapFunction = fn => {\n return function (event) {\n if (!event.relatedTarget || event.relatedTarget !== event.delegateTarget && !event.delegateTarget.contains(event.relatedTarget)) {\n return fn.call(this, event);\n }\n };\n };\n callable = wrapFunction(callable);\n }\n const events = getElementEvents(element);\n const handlers = events[typeEvent] || (events[typeEvent] = {});\n const previousFunction = findHandler(handlers, callable, isDelegated ? handler : null);\n if (previousFunction) {\n previousFunction.oneOff = previousFunction.oneOff && oneOff;\n return;\n }\n const uid = makeEventUid(callable, originalTypeEvent.replace(namespaceRegex, ''));\n const fn = isDelegated ? bootstrapDelegationHandler(element, handler, callable) : bootstrapHandler(element, callable);\n fn.delegationSelector = isDelegated ? handler : null;\n fn.callable = callable;\n fn.oneOff = oneOff;\n fn.uidEvent = uid;\n handlers[uid] = fn;\n element.addEventListener(typeEvent, fn, isDelegated);\n }\n function removeHandler(element, events, typeEvent, handler, delegationSelector) {\n const fn = findHandler(events[typeEvent], handler, delegationSelector);\n if (!fn) {\n return;\n }\n element.removeEventListener(typeEvent, fn, Boolean(delegationSelector));\n delete events[typeEvent][fn.uidEvent];\n }\n function removeNamespacedHandlers(element, events, typeEvent, namespace) {\n const storeElementEvent = events[typeEvent] || {};\n for (const [handlerKey, event] of Object.entries(storeElementEvent)) {\n if (handlerKey.includes(namespace)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n }\n function getTypeEvent(event) {\n // allow to get the native events from namespaced events ('click.bs.button' --> 'click')\n event = event.replace(stripNameRegex, '');\n return customEvents[event] || event;\n }\n const EventHandler = {\n on(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, false);\n },\n one(element, event, handler, delegationFunction) {\n addHandler(element, event, handler, delegationFunction, true);\n },\n off(element, originalTypeEvent, handler, delegationFunction) {\n if (typeof originalTypeEvent !== 'string' || !element) {\n return;\n }\n const [isDelegated, callable, typeEvent] = normalizeParameters(originalTypeEvent, handler, delegationFunction);\n const inNamespace = typeEvent !== originalTypeEvent;\n const events = getElementEvents(element);\n const storeElementEvent = events[typeEvent] || {};\n const isNamespace = originalTypeEvent.startsWith('.');\n if (typeof callable !== 'undefined') {\n // Simplest case: handler is passed, remove that listener ONLY.\n if (!Object.keys(storeElementEvent).length) {\n return;\n }\n removeHandler(element, events, typeEvent, callable, isDelegated ? handler : null);\n return;\n }\n if (isNamespace) {\n for (const elementEvent of Object.keys(events)) {\n removeNamespacedHandlers(element, events, elementEvent, originalTypeEvent.slice(1));\n }\n }\n for (const [keyHandlers, event] of Object.entries(storeElementEvent)) {\n const handlerKey = keyHandlers.replace(stripUidRegex, '');\n if (!inNamespace || originalTypeEvent.includes(handlerKey)) {\n removeHandler(element, events, typeEvent, event.callable, event.delegationSelector);\n }\n }\n },\n trigger(element, event, args) {\n if (typeof event !== 'string' || !element) {\n return null;\n }\n const $ = index_js.getjQuery();\n const typeEvent = getTypeEvent(event);\n const inNamespace = event !== typeEvent;\n let jQueryEvent = null;\n let bubbles = true;\n let nativeDispatch = true;\n let defaultPrevented = false;\n if (inNamespace && $) {\n jQueryEvent = $.Event(event, args);\n $(element).trigger(jQueryEvent);\n bubbles = !jQueryEvent.isPropagationStopped();\n nativeDispatch = !jQueryEvent.isImmediatePropagationStopped();\n defaultPrevented = jQueryEvent.isDefaultPrevented();\n }\n const evt = hydrateObj(new Event(event, {\n bubbles,\n cancelable: true\n }), args);\n if (defaultPrevented) {\n evt.preventDefault();\n }\n if (nativeDispatch) {\n element.dispatchEvent(evt);\n }\n if (evt.defaultPrevented && jQueryEvent) {\n jQueryEvent.preventDefault();\n }\n return evt;\n }\n };\n function hydrateObj(obj, meta = {}) {\n for (const [key, value] of Object.entries(meta)) {\n try {\n obj[key] = value;\n } catch (_unused) {\n Object.defineProperty(obj, key, {\n configurable: true,\n get() {\n return value;\n }\n });\n }\n }\n return obj;\n }\n\n return EventHandler;\n\n}));\n//# sourceMappingURL=event-handler.js.map\n","/*!\n * Bootstrap manipulator.js v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Manipulator = factory());\n})(this, (function () { 'use strict';\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap dom/manipulator.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n function normalizeData(value) {\n if (value === 'true') {\n return true;\n }\n if (value === 'false') {\n return false;\n }\n if (value === Number(value).toString()) {\n return Number(value);\n }\n if (value === '' || value === 'null') {\n return null;\n }\n if (typeof value !== 'string') {\n return value;\n }\n try {\n return JSON.parse(decodeURIComponent(value));\n } catch (_unused) {\n return value;\n }\n }\n function normalizeDataKey(key) {\n return key.replace(/[A-Z]/g, chr => `-${chr.toLowerCase()}`);\n }\n const Manipulator = {\n setDataAttribute(element, key, value) {\n element.setAttribute(`data-bs-${normalizeDataKey(key)}`, value);\n },\n removeDataAttribute(element, key) {\n element.removeAttribute(`data-bs-${normalizeDataKey(key)}`);\n },\n getDataAttributes(element) {\n if (!element) {\n return {};\n }\n const attributes = {};\n const bsKeys = Object.keys(element.dataset).filter(key => key.startsWith('bs') && !key.startsWith('bsConfig'));\n for (const key of bsKeys) {\n let pureKey = key.replace(/^bs/, '');\n pureKey = pureKey.charAt(0).toLowerCase() + pureKey.slice(1, pureKey.length);\n attributes[pureKey] = normalizeData(element.dataset[key]);\n }\n return attributes;\n },\n getDataAttribute(element, key) {\n return normalizeData(element.getAttribute(`data-bs-${normalizeDataKey(key)}`));\n }\n };\n\n return Manipulator;\n\n}));\n//# sourceMappingURL=manipulator.js.map\n","/*!\n * Bootstrap selector-engine.js v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../util/index.js')) :\n typeof define === 'function' && define.amd ? define(['../util/index'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.SelectorEngine = factory(global.Index));\n})(this, (function (index_js) { 'use strict';\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap dom/selector-engine.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n const getSelector = element => {\n let selector = element.getAttribute('data-bs-target');\n if (!selector || selector === '#') {\n let hrefAttribute = element.getAttribute('href');\n\n // The only valid content that could double as a selector are IDs or classes,\n // so everything starting with `#` or `.`. If a \"real\" URL is used as the selector,\n // `document.querySelector` will rightfully complain it is invalid.\n // See https://github.com/twbs/bootstrap/issues/32273\n if (!hrefAttribute || !hrefAttribute.includes('#') && !hrefAttribute.startsWith('.')) {\n return null;\n }\n\n // Just in case some CMS puts out a full URL with the anchor appended\n if (hrefAttribute.includes('#') && !hrefAttribute.startsWith('#')) {\n hrefAttribute = `#${hrefAttribute.split('#')[1]}`;\n }\n selector = hrefAttribute && hrefAttribute !== '#' ? hrefAttribute.trim() : null;\n }\n return selector ? selector.split(',').map(sel => index_js.parseSelector(sel)).join(',') : null;\n };\n const SelectorEngine = {\n find(selector, element = document.documentElement) {\n return [].concat(...Element.prototype.querySelectorAll.call(element, selector));\n },\n findOne(selector, element = document.documentElement) {\n return Element.prototype.querySelector.call(element, selector);\n },\n children(element, selector) {\n return [].concat(...element.children).filter(child => child.matches(selector));\n },\n parents(element, selector) {\n const parents = [];\n let ancestor = element.parentNode.closest(selector);\n while (ancestor) {\n parents.push(ancestor);\n ancestor = ancestor.parentNode.closest(selector);\n }\n return parents;\n },\n prev(element, selector) {\n let previous = element.previousElementSibling;\n while (previous) {\n if (previous.matches(selector)) {\n return [previous];\n }\n previous = previous.previousElementSibling;\n }\n return [];\n },\n // TODO: this is now unused; remove later along with prev()\n next(element, selector) {\n let next = element.nextElementSibling;\n while (next) {\n if (next.matches(selector)) {\n return [next];\n }\n next = next.nextElementSibling;\n }\n return [];\n },\n focusableChildren(element) {\n const focusables = ['a', 'button', 'input', 'textarea', 'select', 'details', '[tabindex]', '[contenteditable=\"true\"]'].map(selector => `${selector}:not([tabindex^=\"-\"])`).join(',');\n return this.find(focusables, element).filter(el => !index_js.isDisabled(el) && index_js.isVisible(el));\n },\n getSelectorFromElement(element) {\n const selector = getSelector(element);\n if (selector) {\n return SelectorEngine.findOne(selector) ? selector : null;\n }\n return null;\n },\n getElementFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.findOne(selector) : null;\n },\n getMultipleElementsFromSelector(element) {\n const selector = getSelector(element);\n return selector ? SelectorEngine.find(selector) : [];\n }\n };\n\n return SelectorEngine;\n\n}));\n//# sourceMappingURL=selector-engine.js.map\n","/*!\n * Bootstrap modal.js v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./base-component.js'), require('./dom/event-handler.js'), require('./dom/selector-engine.js'), require('./util/backdrop.js'), require('./util/component-functions.js'), require('./util/focustrap.js'), require('./util/index.js'), require('./util/scrollbar.js')) :\n typeof define === 'function' && define.amd ? define(['./base-component', './dom/event-handler', './dom/selector-engine', './util/backdrop', './util/component-functions', './util/focustrap', './util/index', './util/scrollbar'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Modal = factory(global.BaseComponent, global.EventHandler, global.SelectorEngine, global.Backdrop, global.ComponentFunctions, global.Focustrap, global.Index, global.Scrollbar));\n})(this, (function (BaseComponent, EventHandler, SelectorEngine, Backdrop, componentFunctions_js, FocusTrap, index_js, ScrollBarHelper) { 'use strict';\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap modal.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n /**\n * Constants\n */\n\n const NAME = 'modal';\n const DATA_KEY = 'bs.modal';\n const EVENT_KEY = `.${DATA_KEY}`;\n const DATA_API_KEY = '.data-api';\n const ESCAPE_KEY = 'Escape';\n const EVENT_HIDE = `hide${EVENT_KEY}`;\n const EVENT_HIDE_PREVENTED = `hidePrevented${EVENT_KEY}`;\n const EVENT_HIDDEN = `hidden${EVENT_KEY}`;\n const EVENT_SHOW = `show${EVENT_KEY}`;\n const EVENT_SHOWN = `shown${EVENT_KEY}`;\n const EVENT_RESIZE = `resize${EVENT_KEY}`;\n const EVENT_CLICK_DISMISS = `click.dismiss${EVENT_KEY}`;\n const EVENT_MOUSEDOWN_DISMISS = `mousedown.dismiss${EVENT_KEY}`;\n const EVENT_KEYDOWN_DISMISS = `keydown.dismiss${EVENT_KEY}`;\n const EVENT_CLICK_DATA_API = `click${EVENT_KEY}${DATA_API_KEY}`;\n const CLASS_NAME_OPEN = 'modal-open';\n const CLASS_NAME_FADE = 'fade';\n const CLASS_NAME_SHOW = 'show';\n const CLASS_NAME_STATIC = 'modal-static';\n const OPEN_SELECTOR = '.modal.show';\n const SELECTOR_DIALOG = '.modal-dialog';\n const SELECTOR_MODAL_BODY = '.modal-body';\n const SELECTOR_DATA_TOGGLE = '[data-bs-toggle=\"modal\"]';\n const Default = {\n backdrop: true,\n focus: true,\n keyboard: true\n };\n const DefaultType = {\n backdrop: '(boolean|string)',\n focus: 'boolean',\n keyboard: 'boolean'\n };\n\n /**\n * Class definition\n */\n\n class Modal extends BaseComponent {\n constructor(element, config) {\n super(element, config);\n this._dialog = SelectorEngine.findOne(SELECTOR_DIALOG, this._element);\n this._backdrop = this._initializeBackDrop();\n this._focustrap = this._initializeFocusTrap();\n this._isShown = false;\n this._isTransitioning = false;\n this._scrollBar = new ScrollBarHelper();\n this._addEventListeners();\n }\n\n // Getters\n static get Default() {\n return Default;\n }\n static get DefaultType() {\n return DefaultType;\n }\n static get NAME() {\n return NAME;\n }\n\n // Public\n toggle(relatedTarget) {\n return this._isShown ? this.hide() : this.show(relatedTarget);\n }\n show(relatedTarget) {\n if (this._isShown || this._isTransitioning) {\n return;\n }\n const showEvent = EventHandler.trigger(this._element, EVENT_SHOW, {\n relatedTarget\n });\n if (showEvent.defaultPrevented) {\n return;\n }\n this._isShown = true;\n this._isTransitioning = true;\n this._scrollBar.hide();\n document.body.classList.add(CLASS_NAME_OPEN);\n this._adjustDialog();\n this._backdrop.show(() => this._showElement(relatedTarget));\n }\n hide() {\n if (!this._isShown || this._isTransitioning) {\n return;\n }\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE);\n if (hideEvent.defaultPrevented) {\n return;\n }\n this._isShown = false;\n this._isTransitioning = true;\n this._focustrap.deactivate();\n this._element.classList.remove(CLASS_NAME_SHOW);\n this._queueCallback(() => this._hideModal(), this._element, this._isAnimated());\n }\n dispose() {\n EventHandler.off(window, EVENT_KEY);\n EventHandler.off(this._dialog, EVENT_KEY);\n this._backdrop.dispose();\n this._focustrap.deactivate();\n super.dispose();\n }\n handleUpdate() {\n this._adjustDialog();\n }\n\n // Private\n _initializeBackDrop() {\n return new Backdrop({\n isVisible: Boolean(this._config.backdrop),\n // 'static' option will be translated to true, and booleans will keep their value,\n isAnimated: this._isAnimated()\n });\n }\n _initializeFocusTrap() {\n return new FocusTrap({\n trapElement: this._element\n });\n }\n _showElement(relatedTarget) {\n // try to append dynamic modal\n if (!document.body.contains(this._element)) {\n document.body.append(this._element);\n }\n this._element.style.display = 'block';\n this._element.removeAttribute('aria-hidden');\n this._element.setAttribute('aria-modal', true);\n this._element.setAttribute('role', 'dialog');\n this._element.scrollTop = 0;\n const modalBody = SelectorEngine.findOne(SELECTOR_MODAL_BODY, this._dialog);\n if (modalBody) {\n modalBody.scrollTop = 0;\n }\n index_js.reflow(this._element);\n this._element.classList.add(CLASS_NAME_SHOW);\n const transitionComplete = () => {\n if (this._config.focus) {\n this._focustrap.activate();\n }\n this._isTransitioning = false;\n EventHandler.trigger(this._element, EVENT_SHOWN, {\n relatedTarget\n });\n };\n this._queueCallback(transitionComplete, this._dialog, this._isAnimated());\n }\n _addEventListeners() {\n EventHandler.on(this._element, EVENT_KEYDOWN_DISMISS, event => {\n if (event.key !== ESCAPE_KEY) {\n return;\n }\n if (this._config.keyboard) {\n this.hide();\n return;\n }\n this._triggerBackdropTransition();\n });\n EventHandler.on(window, EVENT_RESIZE, () => {\n if (this._isShown && !this._isTransitioning) {\n this._adjustDialog();\n }\n });\n EventHandler.on(this._element, EVENT_MOUSEDOWN_DISMISS, event => {\n // a bad trick to segregate clicks that may start inside dialog but end outside, and avoid listen to scrollbar clicks\n EventHandler.one(this._element, EVENT_CLICK_DISMISS, event2 => {\n if (this._element !== event.target || this._element !== event2.target) {\n return;\n }\n if (this._config.backdrop === 'static') {\n this._triggerBackdropTransition();\n return;\n }\n if (this._config.backdrop) {\n this.hide();\n }\n });\n });\n }\n _hideModal() {\n this._element.style.display = 'none';\n this._element.setAttribute('aria-hidden', true);\n this._element.removeAttribute('aria-modal');\n this._element.removeAttribute('role');\n this._isTransitioning = false;\n this._backdrop.hide(() => {\n document.body.classList.remove(CLASS_NAME_OPEN);\n this._resetAdjustments();\n this._scrollBar.reset();\n EventHandler.trigger(this._element, EVENT_HIDDEN);\n });\n }\n _isAnimated() {\n return this._element.classList.contains(CLASS_NAME_FADE);\n }\n _triggerBackdropTransition() {\n const hideEvent = EventHandler.trigger(this._element, EVENT_HIDE_PREVENTED);\n if (hideEvent.defaultPrevented) {\n return;\n }\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const initialOverflowY = this._element.style.overflowY;\n // return if the following background transition hasn't yet completed\n if (initialOverflowY === 'hidden' || this._element.classList.contains(CLASS_NAME_STATIC)) {\n return;\n }\n if (!isModalOverflowing) {\n this._element.style.overflowY = 'hidden';\n }\n this._element.classList.add(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.classList.remove(CLASS_NAME_STATIC);\n this._queueCallback(() => {\n this._element.style.overflowY = initialOverflowY;\n }, this._dialog);\n }, this._dialog);\n this._element.focus();\n }\n\n /**\n * The following methods are used to handle overflowing modals\n */\n\n _adjustDialog() {\n const isModalOverflowing = this._element.scrollHeight > document.documentElement.clientHeight;\n const scrollbarWidth = this._scrollBar.getWidth();\n const isBodyOverflowing = scrollbarWidth > 0;\n if (isBodyOverflowing && !isModalOverflowing) {\n const property = index_js.isRTL() ? 'paddingLeft' : 'paddingRight';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n if (!isBodyOverflowing && isModalOverflowing) {\n const property = index_js.isRTL() ? 'paddingRight' : 'paddingLeft';\n this._element.style[property] = `${scrollbarWidth}px`;\n }\n }\n _resetAdjustments() {\n this._element.style.paddingLeft = '';\n this._element.style.paddingRight = '';\n }\n\n // Static\n static jQueryInterface(config, relatedTarget) {\n return this.each(function () {\n const data = Modal.getOrCreateInstance(this, config);\n if (typeof config !== 'string') {\n return;\n }\n if (typeof data[config] === 'undefined') {\n throw new TypeError(`No method named \"${config}\"`);\n }\n data[config](relatedTarget);\n });\n }\n }\n\n /**\n * Data API implementation\n */\n\n EventHandler.on(document, EVENT_CLICK_DATA_API, SELECTOR_DATA_TOGGLE, function (event) {\n const target = SelectorEngine.getElementFromSelector(this);\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n EventHandler.one(target, EVENT_SHOW, showEvent => {\n if (showEvent.defaultPrevented) {\n // only register focus restorer if modal will actually get shown\n return;\n }\n EventHandler.one(target, EVENT_HIDDEN, () => {\n if (index_js.isVisible(this)) {\n this.focus();\n }\n });\n });\n\n // avoid conflict when clicking modal toggler while another one is open\n const alreadyOpen = SelectorEngine.findOne(OPEN_SELECTOR);\n if (alreadyOpen) {\n Modal.getInstance(alreadyOpen).hide();\n }\n const data = Modal.getOrCreateInstance(target);\n data.toggle(this);\n });\n componentFunctions_js.enableDismissTrigger(Modal);\n\n /**\n * jQuery\n */\n\n index_js.defineJQueryPlugin(Modal);\n\n return Modal;\n\n}));\n//# sourceMappingURL=modal.js.map\n","/*!\n * Bootstrap backdrop.js v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/event-handler.js'), require('./config.js'), require('./index.js')) :\n typeof define === 'function' && define.amd ? define(['../dom/event-handler', './config', './index'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Backdrop = factory(global.EventHandler, global.Config, global.Index));\n})(this, (function (EventHandler, Config, index_js) { 'use strict';\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap util/backdrop.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n /**\n * Constants\n */\n\n const NAME = 'backdrop';\n const CLASS_NAME_FADE = 'fade';\n const CLASS_NAME_SHOW = 'show';\n const EVENT_MOUSEDOWN = `mousedown.bs.${NAME}`;\n const Default = {\n className: 'modal-backdrop',\n clickCallback: null,\n isAnimated: false,\n isVisible: true,\n // if false, we use the backdrop helper without adding any element to the dom\n rootElement: 'body' // give the choice to place backdrop under different elements\n };\n const DefaultType = {\n className: 'string',\n clickCallback: '(function|null)',\n isAnimated: 'boolean',\n isVisible: 'boolean',\n rootElement: '(element|string)'\n };\n\n /**\n * Class definition\n */\n\n class Backdrop extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isAppended = false;\n this._element = null;\n }\n\n // Getters\n static get Default() {\n return Default;\n }\n static get DefaultType() {\n return DefaultType;\n }\n static get NAME() {\n return NAME;\n }\n\n // Public\n show(callback) {\n if (!this._config.isVisible) {\n index_js.execute(callback);\n return;\n }\n this._append();\n const element = this._getElement();\n if (this._config.isAnimated) {\n index_js.reflow(element);\n }\n element.classList.add(CLASS_NAME_SHOW);\n this._emulateAnimation(() => {\n index_js.execute(callback);\n });\n }\n hide(callback) {\n if (!this._config.isVisible) {\n index_js.execute(callback);\n return;\n }\n this._getElement().classList.remove(CLASS_NAME_SHOW);\n this._emulateAnimation(() => {\n this.dispose();\n index_js.execute(callback);\n });\n }\n dispose() {\n if (!this._isAppended) {\n return;\n }\n EventHandler.off(this._element, EVENT_MOUSEDOWN);\n this._element.remove();\n this._isAppended = false;\n }\n\n // Private\n _getElement() {\n if (!this._element) {\n const backdrop = document.createElement('div');\n backdrop.className = this._config.className;\n if (this._config.isAnimated) {\n backdrop.classList.add(CLASS_NAME_FADE);\n }\n this._element = backdrop;\n }\n return this._element;\n }\n _configAfterMerge(config) {\n // use getElement() with the default \"body\" to get a fresh Element on each instantiation\n config.rootElement = index_js.getElement(config.rootElement);\n return config;\n }\n _append() {\n if (this._isAppended) {\n return;\n }\n const element = this._getElement();\n this._config.rootElement.append(element);\n EventHandler.on(element, EVENT_MOUSEDOWN, () => {\n index_js.execute(this._config.clickCallback);\n });\n this._isAppended = true;\n }\n _emulateAnimation(callback) {\n index_js.executeAfterTransition(callback, this._getElement(), this._config.isAnimated);\n }\n }\n\n return Backdrop;\n\n}));\n//# sourceMappingURL=backdrop.js.map\n","/*!\n * Bootstrap component-functions.js v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('../dom/event-handler.js'), require('../dom/selector-engine.js'), require('./index.js')) :\n typeof define === 'function' && define.amd ? define(['exports', '../dom/event-handler', '../dom/selector-engine', './index'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.ComponentFunctions = {}, global.EventHandler, global.SelectorEngine, global.Index));\n})(this, (function (exports, EventHandler, SelectorEngine, index_js) { 'use strict';\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap util/component-functions.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n const enableDismissTrigger = (component, method = 'hide') => {\n const clickEvent = `click.dismiss${component.EVENT_KEY}`;\n const name = component.NAME;\n EventHandler.on(document, clickEvent, `[data-bs-dismiss=\"${name}\"]`, function (event) {\n if (['A', 'AREA'].includes(this.tagName)) {\n event.preventDefault();\n }\n if (index_js.isDisabled(this)) {\n return;\n }\n const target = SelectorEngine.getElementFromSelector(this) || this.closest(`.${name}`);\n const instance = component.getOrCreateInstance(target);\n\n // Method argument is left, for Alert and only, as it doesn't implement the 'hide' method\n instance[method]();\n });\n };\n\n exports.enableDismissTrigger = enableDismissTrigger;\n\n Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\n}));\n//# sourceMappingURL=component-functions.js.map\n","/*!\n * Bootstrap config.js v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/manipulator.js'), require('./index.js')) :\n typeof define === 'function' && define.amd ? define(['../dom/manipulator', './index'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Config = factory(global.Manipulator, global.Index));\n})(this, (function (Manipulator, index_js) { 'use strict';\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap util/config.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n /**\n * Class definition\n */\n\n class Config {\n // Getters\n static get Default() {\n return {};\n }\n static get DefaultType() {\n return {};\n }\n static get NAME() {\n throw new Error('You have to implement the static method \"NAME\", for each component!');\n }\n _getConfig(config) {\n config = this._mergeConfigObj(config);\n config = this._configAfterMerge(config);\n this._typeCheckConfig(config);\n return config;\n }\n _configAfterMerge(config) {\n return config;\n }\n _mergeConfigObj(config, element) {\n const jsonConfig = index_js.isElement(element) ? Manipulator.getDataAttribute(element, 'config') : {}; // try to parse\n\n return {\n ...this.constructor.Default,\n ...(typeof jsonConfig === 'object' ? jsonConfig : {}),\n ...(index_js.isElement(element) ? Manipulator.getDataAttributes(element) : {}),\n ...(typeof config === 'object' ? config : {})\n };\n }\n _typeCheckConfig(config, configTypes = this.constructor.DefaultType) {\n for (const [property, expectedTypes] of Object.entries(configTypes)) {\n const value = config[property];\n const valueType = index_js.isElement(value) ? 'element' : index_js.toType(value);\n if (!new RegExp(expectedTypes).test(valueType)) {\n throw new TypeError(`${this.constructor.NAME.toUpperCase()}: Option \"${property}\" provided type \"${valueType}\" but expected type \"${expectedTypes}\".`);\n }\n }\n }\n }\n\n return Config;\n\n}));\n//# sourceMappingURL=config.js.map\n","/*!\n * Bootstrap focustrap.js v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/event-handler.js'), require('../dom/selector-engine.js'), require('./config.js')) :\n typeof define === 'function' && define.amd ? define(['../dom/event-handler', '../dom/selector-engine', './config'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Focustrap = factory(global.EventHandler, global.SelectorEngine, global.Config));\n})(this, (function (EventHandler, SelectorEngine, Config) { 'use strict';\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap util/focustrap.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n /**\n * Constants\n */\n\n const NAME = 'focustrap';\n const DATA_KEY = 'bs.focustrap';\n const EVENT_KEY = `.${DATA_KEY}`;\n const EVENT_FOCUSIN = `focusin${EVENT_KEY}`;\n const EVENT_KEYDOWN_TAB = `keydown.tab${EVENT_KEY}`;\n const TAB_KEY = 'Tab';\n const TAB_NAV_FORWARD = 'forward';\n const TAB_NAV_BACKWARD = 'backward';\n const Default = {\n autofocus: true,\n trapElement: null // The element to trap focus inside of\n };\n const DefaultType = {\n autofocus: 'boolean',\n trapElement: 'element'\n };\n\n /**\n * Class definition\n */\n\n class FocusTrap extends Config {\n constructor(config) {\n super();\n this._config = this._getConfig(config);\n this._isActive = false;\n this._lastTabNavDirection = null;\n }\n\n // Getters\n static get Default() {\n return Default;\n }\n static get DefaultType() {\n return DefaultType;\n }\n static get NAME() {\n return NAME;\n }\n\n // Public\n activate() {\n if (this._isActive) {\n return;\n }\n if (this._config.autofocus) {\n this._config.trapElement.focus();\n }\n EventHandler.off(document, EVENT_KEY); // guard against infinite focus loop\n EventHandler.on(document, EVENT_FOCUSIN, event => this._handleFocusin(event));\n EventHandler.on(document, EVENT_KEYDOWN_TAB, event => this._handleKeydown(event));\n this._isActive = true;\n }\n deactivate() {\n if (!this._isActive) {\n return;\n }\n this._isActive = false;\n EventHandler.off(document, EVENT_KEY);\n }\n\n // Private\n _handleFocusin(event) {\n const {\n trapElement\n } = this._config;\n if (event.target === document || event.target === trapElement || trapElement.contains(event.target)) {\n return;\n }\n const elements = SelectorEngine.focusableChildren(trapElement);\n if (elements.length === 0) {\n trapElement.focus();\n } else if (this._lastTabNavDirection === TAB_NAV_BACKWARD) {\n elements[elements.length - 1].focus();\n } else {\n elements[0].focus();\n }\n }\n _handleKeydown(event) {\n if (event.key !== TAB_KEY) {\n return;\n }\n this._lastTabNavDirection = event.shiftKey ? TAB_NAV_BACKWARD : TAB_NAV_FORWARD;\n }\n }\n\n return FocusTrap;\n\n}));\n//# sourceMappingURL=focustrap.js.map\n","/*!\n * Bootstrap index.js v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :\n typeof define === 'function' && define.amd ? define(['exports'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.Index = {}));\n})(this, (function (exports) { 'use strict';\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap util/index.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n const MAX_UID = 1000000;\n const MILLISECONDS_MULTIPLIER = 1000;\n const TRANSITION_END = 'transitionend';\n\n /**\n * Properly escape IDs selectors to handle weird IDs\n * @param {string} selector\n * @returns {string}\n */\n const parseSelector = selector => {\n if (selector && window.CSS && window.CSS.escape) {\n // document.querySelector needs escaping to handle IDs (html5+) containing for instance /\n selector = selector.replace(/#([^\\s\"#']+)/g, (match, id) => `#${CSS.escape(id)}`);\n }\n return selector;\n };\n\n // Shout-out Angus Croll (https://goo.gl/pxwQGp)\n const toType = object => {\n if (object === null || object === undefined) {\n return `${object}`;\n }\n return Object.prototype.toString.call(object).match(/\\s([a-z]+)/i)[1].toLowerCase();\n };\n\n /**\n * Public Util API\n */\n\n const getUID = prefix => {\n do {\n prefix += Math.floor(Math.random() * MAX_UID);\n } while (document.getElementById(prefix));\n return prefix;\n };\n const getTransitionDurationFromElement = element => {\n if (!element) {\n return 0;\n }\n\n // Get transition-duration of the element\n let {\n transitionDuration,\n transitionDelay\n } = window.getComputedStyle(element);\n const floatTransitionDuration = Number.parseFloat(transitionDuration);\n const floatTransitionDelay = Number.parseFloat(transitionDelay);\n\n // Return 0 if element or transition duration is not found\n if (!floatTransitionDuration && !floatTransitionDelay) {\n return 0;\n }\n\n // If multiple durations are defined, take the first\n transitionDuration = transitionDuration.split(',')[0];\n transitionDelay = transitionDelay.split(',')[0];\n return (Number.parseFloat(transitionDuration) + Number.parseFloat(transitionDelay)) * MILLISECONDS_MULTIPLIER;\n };\n const triggerTransitionEnd = element => {\n element.dispatchEvent(new Event(TRANSITION_END));\n };\n const isElement = object => {\n if (!object || typeof object !== 'object') {\n return false;\n }\n if (typeof object.jquery !== 'undefined') {\n object = object[0];\n }\n return typeof object.nodeType !== 'undefined';\n };\n const getElement = object => {\n // it's a jQuery object or a node element\n if (isElement(object)) {\n return object.jquery ? object[0] : object;\n }\n if (typeof object === 'string' && object.length > 0) {\n return document.querySelector(parseSelector(object));\n }\n return null;\n };\n const isVisible = element => {\n if (!isElement(element) || element.getClientRects().length === 0) {\n return false;\n }\n const elementIsVisible = getComputedStyle(element).getPropertyValue('visibility') === 'visible';\n // Handle `details` element as its content may falsie appear visible when it is closed\n const closedDetails = element.closest('details:not([open])');\n if (!closedDetails) {\n return elementIsVisible;\n }\n if (closedDetails !== element) {\n const summary = element.closest('summary');\n if (summary && summary.parentNode !== closedDetails) {\n return false;\n }\n if (summary === null) {\n return false;\n }\n }\n return elementIsVisible;\n };\n const isDisabled = element => {\n if (!element || element.nodeType !== Node.ELEMENT_NODE) {\n return true;\n }\n if (element.classList.contains('disabled')) {\n return true;\n }\n if (typeof element.disabled !== 'undefined') {\n return element.disabled;\n }\n return element.hasAttribute('disabled') && element.getAttribute('disabled') !== 'false';\n };\n const findShadowRoot = element => {\n if (!document.documentElement.attachShadow) {\n return null;\n }\n\n // Can find the shadow root otherwise it'll return the document\n if (typeof element.getRootNode === 'function') {\n const root = element.getRootNode();\n return root instanceof ShadowRoot ? root : null;\n }\n if (element instanceof ShadowRoot) {\n return element;\n }\n\n // when we don't find a shadow root\n if (!element.parentNode) {\n return null;\n }\n return findShadowRoot(element.parentNode);\n };\n const noop = () => {};\n\n /**\n * Trick to restart an element's animation\n *\n * @param {HTMLElement} element\n * @return void\n *\n * @see https://www.charistheo.io/blog/2021/02/restart-a-css-animation-with-javascript/#restarting-a-css-animation\n */\n const reflow = element => {\n element.offsetHeight; // eslint-disable-line no-unused-expressions\n };\n const getjQuery = () => {\n if (window.jQuery && !document.body.hasAttribute('data-bs-no-jquery')) {\n return window.jQuery;\n }\n return null;\n };\n const DOMContentLoadedCallbacks = [];\n const onDOMContentLoaded = callback => {\n if (document.readyState === 'loading') {\n // add listener on the first call when the document is in loading state\n if (!DOMContentLoadedCallbacks.length) {\n document.addEventListener('DOMContentLoaded', () => {\n for (const callback of DOMContentLoadedCallbacks) {\n callback();\n }\n });\n }\n DOMContentLoadedCallbacks.push(callback);\n } else {\n callback();\n }\n };\n const isRTL = () => document.documentElement.dir === 'rtl';\n const defineJQueryPlugin = plugin => {\n onDOMContentLoaded(() => {\n const $ = getjQuery();\n /* istanbul ignore if */\n if ($) {\n const name = plugin.NAME;\n const JQUERY_NO_CONFLICT = $.fn[name];\n $.fn[name] = plugin.jQueryInterface;\n $.fn[name].Constructor = plugin;\n $.fn[name].noConflict = () => {\n $.fn[name] = JQUERY_NO_CONFLICT;\n return plugin.jQueryInterface;\n };\n }\n });\n };\n const execute = (possibleCallback, args = [], defaultValue = possibleCallback) => {\n return typeof possibleCallback === 'function' ? possibleCallback(...args) : defaultValue;\n };\n const executeAfterTransition = (callback, transitionElement, waitForTransition = true) => {\n if (!waitForTransition) {\n execute(callback);\n return;\n }\n const durationPadding = 5;\n const emulatedDuration = getTransitionDurationFromElement(transitionElement) + durationPadding;\n let called = false;\n const handler = ({\n target\n }) => {\n if (target !== transitionElement) {\n return;\n }\n called = true;\n transitionElement.removeEventListener(TRANSITION_END, handler);\n execute(callback);\n };\n transitionElement.addEventListener(TRANSITION_END, handler);\n setTimeout(() => {\n if (!called) {\n triggerTransitionEnd(transitionElement);\n }\n }, emulatedDuration);\n };\n\n /**\n * Return the previous/next element of a list.\n *\n * @param {array} list The list of elements\n * @param activeElement The active element\n * @param shouldGetNext Choose to get next or previous element\n * @param isCycleAllowed\n * @return {Element|elem} The proper element\n */\n const getNextActiveElement = (list, activeElement, shouldGetNext, isCycleAllowed) => {\n const listLength = list.length;\n let index = list.indexOf(activeElement);\n\n // if the element does not exist in the list return an element\n // depending on the direction and if cycle is allowed\n if (index === -1) {\n return !shouldGetNext && isCycleAllowed ? list[listLength - 1] : list[0];\n }\n index += shouldGetNext ? 1 : -1;\n if (isCycleAllowed) {\n index = (index + listLength) % listLength;\n }\n return list[Math.max(0, Math.min(index, listLength - 1))];\n };\n\n exports.defineJQueryPlugin = defineJQueryPlugin;\n exports.execute = execute;\n exports.executeAfterTransition = executeAfterTransition;\n exports.findShadowRoot = findShadowRoot;\n exports.getElement = getElement;\n exports.getNextActiveElement = getNextActiveElement;\n exports.getTransitionDurationFromElement = getTransitionDurationFromElement;\n exports.getUID = getUID;\n exports.getjQuery = getjQuery;\n exports.isDisabled = isDisabled;\n exports.isElement = isElement;\n exports.isRTL = isRTL;\n exports.isVisible = isVisible;\n exports.noop = noop;\n exports.onDOMContentLoaded = onDOMContentLoaded;\n exports.parseSelector = parseSelector;\n exports.reflow = reflow;\n exports.toType = toType;\n exports.triggerTransitionEnd = triggerTransitionEnd;\n\n Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\n}));\n//# sourceMappingURL=index.js.map\n","/*!\n * Bootstrap scrollbar.js v5.3.3 (https://getbootstrap.com/)\n * Copyright 2011-2024 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n */\n(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('../dom/manipulator.js'), require('../dom/selector-engine.js'), require('./index.js')) :\n typeof define === 'function' && define.amd ? define(['../dom/manipulator', '../dom/selector-engine', './index'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Scrollbar = factory(global.Manipulator, global.SelectorEngine, global.Index));\n})(this, (function (Manipulator, SelectorEngine, index_js) { 'use strict';\n\n /**\n * --------------------------------------------------------------------------\n * Bootstrap util/scrollBar.js\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE)\n * --------------------------------------------------------------------------\n */\n\n\n /**\n * Constants\n */\n\n const SELECTOR_FIXED_CONTENT = '.fixed-top, .fixed-bottom, .is-fixed, .sticky-top';\n const SELECTOR_STICKY_CONTENT = '.sticky-top';\n const PROPERTY_PADDING = 'padding-right';\n const PROPERTY_MARGIN = 'margin-right';\n\n /**\n * Class definition\n */\n\n class ScrollBarHelper {\n constructor() {\n this._element = document.body;\n }\n\n // Public\n getWidth() {\n // https://developer.mozilla.org/en-US/docs/Web/API/Window/innerWidth#usage_notes\n const documentWidth = document.documentElement.clientWidth;\n return Math.abs(window.innerWidth - documentWidth);\n }\n hide() {\n const width = this.getWidth();\n this._disableOverFlow();\n // give padding to element to balance the hidden scrollbar width\n this._setElementAttributes(this._element, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n // trick: We adjust positive paddingRight and negative marginRight to sticky-top elements to keep showing fullwidth\n this._setElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING, calculatedValue => calculatedValue + width);\n this._setElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN, calculatedValue => calculatedValue - width);\n }\n reset() {\n this._resetElementAttributes(this._element, 'overflow');\n this._resetElementAttributes(this._element, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_FIXED_CONTENT, PROPERTY_PADDING);\n this._resetElementAttributes(SELECTOR_STICKY_CONTENT, PROPERTY_MARGIN);\n }\n isOverflowing() {\n return this.getWidth() > 0;\n }\n\n // Private\n _disableOverFlow() {\n this._saveInitialAttribute(this._element, 'overflow');\n this._element.style.overflow = 'hidden';\n }\n _setElementAttributes(selector, styleProperty, callback) {\n const scrollbarWidth = this.getWidth();\n const manipulationCallBack = element => {\n if (element !== this._element && window.innerWidth > element.clientWidth + scrollbarWidth) {\n return;\n }\n this._saveInitialAttribute(element, styleProperty);\n const calculatedValue = window.getComputedStyle(element).getPropertyValue(styleProperty);\n element.style.setProperty(styleProperty, `${callback(Number.parseFloat(calculatedValue))}px`);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _saveInitialAttribute(element, styleProperty) {\n const actualValue = element.style.getPropertyValue(styleProperty);\n if (actualValue) {\n Manipulator.setDataAttribute(element, styleProperty, actualValue);\n }\n }\n _resetElementAttributes(selector, styleProperty) {\n const manipulationCallBack = element => {\n const value = Manipulator.getDataAttribute(element, styleProperty);\n // We only want to remove the property if the value is `null`; the value can also be zero\n if (value === null) {\n element.style.removeProperty(styleProperty);\n return;\n }\n Manipulator.removeDataAttribute(element, styleProperty);\n element.style.setProperty(styleProperty, value);\n };\n this._applyManipulationCallback(selector, manipulationCallBack);\n }\n _applyManipulationCallback(selector, callBack) {\n if (index_js.isElement(selector)) {\n callBack(selector);\n return;\n }\n for (const sel of SelectorEngine.find(selector, this._element)) {\n callBack(sel);\n }\n }\n }\n\n return ScrollBarHelper;\n\n}));\n//# sourceMappingURL=scrollbar.js.map\n","// var templateUrl = site.theme_url; // this comes from functions.php\n\n// Customize BootStrap - import only what we need\n// import Alert from 'bootstrap/js/dist/alert';\n// import Button from 'bootstrap/js/dist/button';\n// import Carousel from 'bootstrap/js/dist/carousel';\n// import Collapse from 'bootstrap/js/dist/collapse';\n// import Dropdown from 'bootstrap/js/dist/dropdown';\nimport Modal from 'bootstrap/js/dist/modal';\n// import Offcanvas from 'bootstrap/js/dist/offcanvas';\n// import Popover from 'bootstrap/js/dist/popover';\n// import ScrollSpy from 'bootstrap/js/dist/scrollspy';\n// import Tab from 'bootstrap/js/dist/tab';\n// import Toast from 'bootstrap/js/dist/toast';\n// import Tooltip from 'bootstrap/js/dist/tooltip';\n\n// App\nimport { MainMenu } from './modules/global/mainMenu';\n// import { FrontPage } from './modules/pages/frontPage';\n\nconst initApp = () => {\n const bodyEl = document.getElementsByTagName('body')[0];\n\n // GLOBAL\n const Banners = require('./modules/global/banners');\n Banners.init();\n\n const Forms = require('./modules/global/forms');\n Forms.init();\n\n const Heros = require('./modules/global/heros');\n Heros.init();\n\n const Location = window.Location = require('./modules/global/location');\n Location.init();\n\n // GLOBAL\n const mainMenu = new MainMenu();\n mainMenu.init();\n\n const MapClientTimeToService = window.MapClientTimeToService = require('./modules/global/mapClientTimeToService');\n\n const Modals = require('./modules/global/modals');\n Modals.init();\n\n // PAGE DETECTION\n if (bodyEl.classList.contains('page-home')) {\n const FrontPage = require('./modules/pages/frontPage');\n FrontPage.init();\n }\n\n if (bodyEl.classList.contains('page-gallery')) {\n const GalleryPage = require('./modules/pages/galleryPage');\n GalleryPage.init();\n }\n\n if (bodyEl.classList.contains('page-menu')) {\n const MenuPage = require('./modules/pages/menuPage');\n MenuPage.init();\n }\n\n window.showGlobalModal = (selector) => {\n const targetModal = new Modal(selector);\n targetModal.show();\n };\n};\n\n(function () {\n document.documentElement.classList.remove('no-js');\n initApp( jQuery );\n})();\n","const Banners = (($) => {\n let _els = {};\n let currentIndex = 0;\n let totalItems;\n let direction = 'next';\n\n const init = () => {\n _els.banner = $('.banner--top');\n _els.navPrev = $('.banner--top .nav-btn--prev');\n _els.navNext = $('.banner--top .nav-btn--next');\n _els.messages = $('.banner--top .banner__message');\n _els.currentTxt = $('.banner--top .count__current');\n\n totalItems = _els.messages.length;\n\n _addListeners();\n };\n\n const _addListeners = () => {\n _els.navPrev.on('click', (e) => {\n currentIndex--;\n direction = 'prev';\n _incrementBanner();\n });\n\n _els.navNext.on('click', (e) => {\n currentIndex++;\n direction = 'next';\n _incrementBanner();\n });\n };\n\n const _incrementBanner = () => {\n if (currentIndex < 0) {\n currentIndex = totalItems - 1;\n } else if (currentIndex >= totalItems) {\n currentIndex = 0;\n }\n\n if (direction === 'prev') {\n _els.messages\n .removeClass('in in--left in--right out out--right out--left')\n .addClass('out out--right');\n _els.messages\n .eq(currentIndex)\n .removeClass('out out--right out--left')\n .addClass('in in--right');\n } else if (direction === 'next') {\n _els.messages\n .removeClass('in in--left in--right out out--right out--left')\n .addClass('out out--left');\n _els.messages\n .eq(currentIndex)\n .removeClass('out out--right out--left')\n .addClass('in in--left');\n }\n\n _els.currentTxt.text(currentIndex + 1);\n _els.navPrev.css({ 'pointer-events': 'none' });\n _els.navNext.css({ 'pointer-events': 'none' });\n\n setTimeout(() => {\n _els.messages.not(':eq(' + currentIndex + ')').hide();\n _els.messages.eq(currentIndex).show();\n _els.navPrev.css({ 'pointer-events': 'all' });\n _els.navNext.css({ 'pointer-events': 'all' });\n }, 350);\n };\n\n module.exports = {\n init: init,\n };\n})(jQuery);\n","const Forms = (($) => {\n let _els = {};\n\n const init = () => {\n _els.inputGroups = $('.input-group');\n\n _addListeners();\n };\n\n const _addListeners = () => {\n $.each(_els.inputGroups, (i, val) => {\n let input = $(val).find('input.form-control');\n input.on('focus', (e) => {\n $(val).addClass('active');\n });\n input.on('blur', (e) => {\n $(val).removeClass('active');\n });\n });\n };\n\n module.exports = {\n init: init,\n };\n})(jQuery);\n","const Heros = (($) => {\n let _els = {};\n let _headerHeight;\n\n const init = () => {\n gsap.registerPlugin(ScrollTrigger);\n\n _initScroll();\n _initHeroRotator();\n\n $('.action-location-select').click(function(e) {\n e.preventDefault();\n // $('#modal-location').modal(); // TODO BS5\n window.showGlobalModal('#modal-location');\n });\n\n };\n\n const _initScroll = () => {\n _els.header = $('.section-header .navbar');\n _els.heroContent = $('.hero__content');\n\n _headerHeight = _els.header.outerHeight();\n let headerHeightPercent = 1 - _headerHeight / window.innerHeight;\n\n const heroTl = gsap.timeline({\n scrollTrigger: {\n trigger: '.hero',\n start: 'top top',\n scrub: true,\n pin: false,\n pinSpacing: false,\n onUpdate: (self) => {\n // console.log(self.progress);\n if (self.progress >= headerHeightPercent + 0.05) {\n _els.header.addClass('navbar-tight');\n } else {\n _els.header.removeClass('navbar-tight');\n }\n },\n },\n });\n };\n\n const _initHeroRotator = () => {\n\n let $slides = $('.hero__bg__image');\n let currentIndex = 0;\n let itemInterval = 5000;\n\n // return if none found\n if ($slides.length < 1) return;\n\n // show the first item\n $slides.eq( currentIndex ).addClass( 'active' );\n\n // run the interval\n _interval(() => {\n // hide current\n $slides.eq(currentIndex).removeClass('active');\n\n // increment\n if (currentIndex === $slides.length - 1) {\n currentIndex = 0;\n } else {\n currentIndex++;\n }\n // show next\n $slides.eq( currentIndex ).addClass('active');\n\n }, itemInterval, 100);\n };\n\n // Custom interval function\n const _interval = (func, wait, times) => {\n let interv = ((w, t) => {\n return () => {\n if (typeof t === 'undefined' || t-- > 0) {\n setTimeout(interv, w);\n try {\n func.call(null);\n } catch (e) {\n t = 0;\n throw e.toString();\n }\n }\n };\n })(wait, times);\n\n setTimeout(interv, wait);\n };\n\n module.exports = {\n init: init,\n };\n})(jQuery);\n","const Location = (($) => {\n let _els = {};\n\n const init = () => {\n _els.body = $('body');\n _els.loadingOverlay = $('#loading-overlay');\n };\n\n const _showLoadingOverlay = () => {\n _els.body.addClass('no-scroll');\n _els.loadingOverlay.addClass('show');\n };\n\n const setLocation = (location, redirect='') => {\n console.log( 'setLocation: ', location, redirect );\n\n _showLoadingOverlay();\n\n jQuery.ajax({\n url: '/wp-admin/admin-ajax.php',\n type: 'POST',\n dataType: 'JSON',\n data: {\n action: 'set_location',\n location: location,\n },\n success: function (response) {\n\n if (response.success === true) {\n\n if( redirect ){\n\n //console.log ( 'yes redirect ' + redirect );\n // history.replaceState( {} , 'Reserve', '/reserve' );\n // window.location.replace( '/reserve' );\n window.location.assign( redirect );\n document.getElementById('sevenrooms_form').contentWindow.location.reload();\n\n } else {\n\n //console.log ( 'no redirect' );\n // console.log ( 'form', document.getElementById('sevenrooms_form') );\n window.location.reload( true );\n document.getElementById('sevenrooms_form').contentWindow.location.reload();\n }\n\n } else if (response.success === false) {\n console.warn('Error :: Problem setting the location');\n } else {\n // this \"error\" case means the ajax call, itself, succeeded, but the function called returned an error condition\n console.warn('Error :: Problem returned from the PHP function');\n }\n },\n error: function (xhr, ajaxOptions, thrownError) {\n // this error case means that the ajax call, itself, failed, e.g., a syntax error in your_function()\n console.warn('Request failed :: ' + thrownError);\n },\n });\n };\n\n module.exports = {\n init: init,\n setLocation: setLocation,\n };\n})(jQuery);\n","import Modal from 'bootstrap/js/dist/modal';\n\nexport function MainMenu() {\n const _els = {};\n\n const init = () => {\n _els.navbar = document.querySelector('.navbar');\n _els.hamburger = document.querySelector('.navbar .hamburger');\n _els.mainMenu = document.getElementById('mapleandashMainMenu');\n _els.mainMenuLocationDropdown = document.querySelector('.action-location-select');\n _els.locationDropItems = document.querySelector('#mapleandashMainMenu .dropdown-item');\n _els.locationDropTxt = document.querySelector('#mapleandashMainMenu .dropdown-toggle span');\n\n console.log(_els.locationDropItems);\n _addListeners();\n };\n\n const _addListeners = () => {\n _els.mainMenuLocationDropdown.addEventListener('click', function (e) {\n e.preventDefault();\n const locationModal = new Modal('#modal-location');\n locationModal.show();\n });\n\n _els.mainMenu.addEventListener('show.bs.collapse', (e) => {\n _els.hamburger.classList.add('is-active');\n });\n\n _els.mainMenu.addEventListener('hide.bs.collapse', (e) => {\n _els.hamburger.classList.remove('is-active');\n });\n\n if (null != _els.locationDropItems) {\n _els.locationDropItems.forEach((el) => {\n const $this = jQuery(el);\n _els.locationDropItems.forEach((item) => {\n item.classList.remove('active');\n });\n $this.addClass('active');\n _els.locationDropTxt.text($this.text());\n\n window.Location.setLocation($this.data('location'));\n });\n }\n\n _els.mainMenu.addEventListener('show.bs.collapse', (e) => {\n _els.navbar.classList.add('open');\n });\n\n _els.mainMenu.addEventListener('hide.bs.collapse', (e) => {\n _els.navbar.classList.remove('open');\n });\n };\n\n return { init };\n}\n","const MapClientTimeToService = (() => {\n let _currentService;\n\n const getCurrentService = () => {\n // for testing, manually set currentDate and pass to all instances of Date() below;\n // let currentDate = new Date('December 20, 2020 10:29:00');\n let currentDate = new Date();\n let currentDay = currentDate.getDay(); // 0 is Sunday\n\n // console.log(currentDate);\n // console.log(currentDay);\n\n // Brunch - 10:30am - 3:00pm - Saturdays & Sundays\n // Lunch - 12:00pm - 3:00pm - Daily\n // Pizza & Booze - 3:00pm - 5:00pm - Daily\n // Dinner - 5:00pm - 10:00pm - Daily\n // Happy Hour - 5:00pm - 7:00pm - Sunday-Wednesday\n\n let startBrunch = new Date();\n let startLunch = new Date();\n let startPizza = new Date();\n let startDinner = new Date();\n let startHappyHour = new Date();\n let endHappyHour = new Date();\n\n startBrunch.setHours(4, 0, 0); // Actual 10:30am (set earlier so it shows in the morning instead of dinner)\n startLunch.setHours(4, 0, 0); // Actual 12:00pm (set earlier so it shows in the morning instead of dinner)\n startPizza.setHours(15, 0, 0); // 3:00pm\n startDinner.setHours(17, 0, 0); // 5:00pm\n startHappyHour.setHours(17, 0, 0); // 5:00pm\n endHappyHour.setHours(19, 0, 0); // 7:00pm\n\n if (currentDay === 0 || currentDay === 6) {\n if (currentDate >= startBrunch && currentDate < startPizza) {\n // Sat & Sun Brunch\n _currentService = 'brunch';\n return _currentService;\n }\n } else {\n if (currentDate >= startLunch && currentDate < startPizza) {\n // All other days Lunch\n _currentService = 'lunch';\n return _currentService;\n }\n }\n\n if (currentDay <= 3 && currentDate >= startHappyHour && currentDate < endHappyHour) {\n // Sunday through Wednesday Happy Hour\n _currentService = 'happy-hour';\n return _currentService;\n } else {\n // handle pizza & booze\n if (currentDate >= startPizza && currentDate < startDinner) {\n _currentService = 'pizza-booze';\n return _currentService;\n } else {\n _currentService = 'dinner';\n return _currentService;\n }\n }\n };\n\n module.exports = {\n getCurrentService: getCurrentService,\n };\n})();\n","const Modals = (($) => {\n let _els = {};\n\n const init = () => {\n _els.locationItems = $('#modal-location .location-btn');\n _addListeners();\n };\n\n const _addListeners = () => {\n $.each(_els.locationItems, (i, val) => {\n let $this = $(val);\n\n $this.on('click', (e) => {\n // $.fancybox.close();\n $('#modal-location').modal('hide');\n window.Location.setLocation( $this.data('location') );\n });\n });\n };\n\n module.exports = {\n init: init,\n };\n})(jQuery);\n","const FrontPage = (($) => {\n let _els = {};\n let _currentService = window.MapClientTimeToService.getCurrentService();\n\n const init = () => {\n _els.bgRight = $('.content__bg-right');\n _els.locationLinks = $('.action-set-location');\n _els.bgRight.addClass(_currentService);\n // console.log(_currentService);\n\n _addListeners();\n };\n\n const _addListeners = () => {\n _els.locationLinks.on('click', (e) => {\n e.preventDefault();\n let $this = $(e.target);\n window.Location.setLocation( $this.data('location'), $this.attr(\"href\") );\n });\n };\n\n module.exports = {\n init: init,\n };\n})(jQuery);\n","const GalleryPage = (($) => {\n let _els = {};\n\n const init = () => {\n _els.galleryContainer = $('.section-gallery__grid');\n _els.allItems = $('.section-gallery__grid__item');\n _els.filtersAllBtn = $('#filters .btn');\n _els.filterRadios = $('#filters input[type=\"radio\"]');\n\n _els.galleryContainer.isotope({\n itemSelector: '.section-gallery__grid__item',\n layoutMode: 'packery',\n });\n\n // All button\n _els.filtersAllBtn.on('click', (e) => {\n _els.galleryContainer.isotope({ filter: '*' });\n _els.filterRadios.prop('checked', false);\n _resetGallery();\n });\n\n // Location radios\n _els.filterRadios.on('change', (e) => {\n let $this = $(e.target);\n let filterVal = $this.attr('data-filter');\n _els.galleryContainer.isotope({ filter: filterVal });\n _resetGallery();\n });\n\n // gallery\n _initGallery();\n };\n\n const _initGallery = () => {\n $().fancybox({\n selector : '.iso-visible',\n buttons: [\n \"close\"\n ],\n });\n };\n\n const _resetGallery = () => {\n // get currently filtered items from isotope and add / remove class\n var $filteredItems = $(_els.galleryContainer.isotope('getFilteredItemElements'));\n _els.allItems.removeClass('iso-visible');\n $filteredItems.addClass('iso-visible');\n };\n\n module.exports = {\n init: init,\n };\n})(jQuery);\n","const MenuPage = (($) => {\n let _els = {};\n let _currentService = window.MapClientTimeToService.getCurrentService();\n\n const init = () => {\n _els.navBtns = $('.menu-nav--tabs .btn');\n _els.menuContainer = $('.menu-container');\n _els.menus = $('.menu');\n\n if (_els.navBtns.length) {\n _els.navBtns.on('click', (e) => {\n e.preventDefault();\n\n let $this = $(e.target);\n let targetMenu = $this.attr('data-target');\n\n _els.navBtns.removeClass('active');\n _els.menus.removeClass('active');\n _els.menus.filter('.' + targetMenu).addClass('active');\n\n $this.addClass('active');\n });\n\n // Set a default\n _els.navBtns[0].click();\n }\n };\n\n module.exports = {\n init: init,\n };\n})(jQuery);\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvYmFzZS1jb21wb25lbnQuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvZG9tL2RhdGEuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvZG9tL2V2ZW50LWhhbmRsZXIuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvZG9tL21hbmlwdWxhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2Jvb3RzdHJhcC9qcy9kaXN0L2RvbS9zZWxlY3Rvci1lbmdpbmUuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvbW9kYWwuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9iYWNrZHJvcC5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9jb25maWcuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9mb2N1c3RyYXAuanMiLCJub2RlX21vZHVsZXMvYm9vdHN0cmFwL2pzL2Rpc3QvdXRpbC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9ib290c3RyYXAvanMvZGlzdC91dGlsL3Njcm9sbGJhci5qcyIsInNvdXJjZS90aGVtZS9qcy9hcHAuanMiLCJzb3VyY2UvdGhlbWUvanMvbW9kdWxlcy9nbG9iYWwvYmFubmVycy5qcyIsInNvdXJjZS90aGVtZS9qcy9tb2R1bGVzL2dsb2JhbC9mb3Jtcy5qcyIsInNvdXJjZS90aGVtZS9qcy9tb2R1bGVzL2dsb2JhbC9oZXJvcy5qcyIsInNvdXJjZS90aGVtZS9qcy9tb2R1bGVzL2dsb2JhbC9sb2NhdGlvbi5qcyIsInNvdXJjZS90aGVtZS9qcy9tb2R1bGVzL2dsb2JhbC9tYWluTWVudS5qcyIsInNvdXJjZS90aGVtZS9qcy9tb2R1bGVzL2dsb2JhbC9tYXBDbGllbnRUaW1lVG9TZXJ2aWNlLmpzIiwic291cmNlL3RoZW1lL2pzL21vZHVsZXMvZ2xvYmFsL21vZGFscy5qcyIsInNvdXJjZS90aGVtZS9qcy9tb2R1bGVzL3BhZ2VzL2Zyb250UGFnZS5qcyIsInNvdXJjZS90aGVtZS9qcy9tb2R1bGVzL3BhZ2VzL2dhbGxlcnlQYWdlLmpzIiwic291cmNlL3RoZW1lL2pzL21vZHVsZXMvcGFnZXMvbWVudVBhZ2UuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdPQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0lBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUN6R0E7O0FBU0E7Ozs7QUFqQkE7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFFQTtBQUVBO0FBRUEsSUFBTSxPQUFPLEdBQUcsU0FBVixPQUFVLEdBQU07QUFDcEIsTUFBTSxNQUFNLEdBQUcsUUFBUSxDQUFDLG9CQUFULENBQThCLE1BQTlCLEVBQXNDLENBQXRDLENBQWYsQ0FEb0IsQ0FHcEI7O0FBQ0EsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLDBCQUFELENBQXZCOztBQUNBLEVBQUEsT0FBTyxDQUFDLElBQVI7O0FBRUEsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLHdCQUFELENBQXJCOztBQUNBLEVBQUEsS0FBSyxDQUFDLElBQU47O0FBRUEsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLHdCQUFELENBQXJCOztBQUNBLEVBQUEsS0FBSyxDQUFDLElBQU47O0FBRUEsTUFBTSxRQUFRLEdBQUcsTUFBTSxDQUFDLFFBQVAsR0FBa0IsT0FBTyxDQUFDLDJCQUFELENBQTFDOztBQUNBLEVBQUEsUUFBUSxDQUFDLElBQVQsR0Fkb0IsQ0FnQnBCOztBQUNBLE1BQU0sUUFBUSxHQUFHLElBQUksa0JBQUosRUFBakI7QUFDQSxFQUFBLFFBQVEsQ0FBQyxJQUFUOztBQUVBLE1BQU0sc0JBQXNCLEdBQUcsTUFBTSxDQUFDLHNCQUFQLEdBQWdDLE9BQU8sQ0FBQyx5Q0FBRCxDQUF0RTs7QUFFQSxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMseUJBQUQsQ0FBdEI7O0FBQ0EsRUFBQSxNQUFNLENBQUMsSUFBUCxHQXZCb0IsQ0F5QnBCOztBQUNBLE1BQUksTUFBTSxDQUFDLFNBQVAsQ0FBaUIsUUFBakIsQ0FBMEIsV0FBMUIsQ0FBSixFQUE0QztBQUMxQyxRQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsMkJBQUQsQ0FBekI7O0FBQ0EsSUFBQSxTQUFTLENBQUMsSUFBVjtBQUNEOztBQUVELE1BQUksTUFBTSxDQUFDLFNBQVAsQ0FBaUIsUUFBakIsQ0FBMEIsY0FBMUIsQ0FBSixFQUErQztBQUM3QyxRQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsNkJBQUQsQ0FBM0I7O0FBQ0EsSUFBQSxXQUFXLENBQUMsSUFBWjtBQUNEOztBQUVELE1BQUksTUFBTSxDQUFDLFNBQVAsQ0FBaUIsUUFBakIsQ0FBMEIsV0FBMUIsQ0FBSixFQUE0QztBQUMxQyxRQUFNLFFBQVEsR0FBRyxPQUFPLENBQUMsMEJBQUQsQ0FBeEI7O0FBQ0EsSUFBQSxRQUFRLENBQUMsSUFBVDtBQUNEOztBQUVELEVBQUEsTUFBTSxDQUFDLGVBQVAsR0FBeUIsVUFBQyxRQUFELEVBQWM7QUFDckMsUUFBTSxXQUFXLEdBQUcsSUFBSSxjQUFKLENBQVUsUUFBVixDQUFwQjtBQUNBLElBQUEsV0FBVyxDQUFDLElBQVo7QUFDRCxHQUhEO0FBSUQsQ0E3Q0Q7O0FBK0NBLENBQUMsWUFBWTtBQUNYLEVBQUEsUUFBUSxDQUFDLGVBQVQsQ0FBeUIsU0FBekIsQ0FBbUMsTUFBbkMsQ0FBMEMsT0FBMUM7QUFDQSxFQUFBLE9BQU8sQ0FBRSxNQUFGLENBQVA7QUFDRCxDQUhEOzs7OztBQ25FQSxJQUFNLE9BQU8sR0FBSSxVQUFDLENBQUQsRUFBTztBQUN0QixNQUFJLElBQUksR0FBRyxFQUFYO0FBQ0EsTUFBSSxZQUFZLEdBQUcsQ0FBbkI7QUFDQSxNQUFJLFVBQUo7QUFDQSxNQUFJLFNBQVMsR0FBRyxNQUFoQjs7QUFFQSxNQUFNLElBQUksR0FBRyxTQUFQLElBQU8sR0FBTTtBQUNqQixJQUFBLElBQUksQ0FBQyxNQUFMLEdBQWMsQ0FBQyxDQUFDLGNBQUQsQ0FBZjtBQUNBLElBQUEsSUFBSSxDQUFDLE9BQUwsR0FBZSxDQUFDLENBQUMsNkJBQUQsQ0FBaEI7QUFDQSxJQUFBLElBQUksQ0FBQyxPQUFMLEdBQWUsQ0FBQyxDQUFDLDZCQUFELENBQWhCO0FBQ0EsSUFBQSxJQUFJLENBQUMsUUFBTCxHQUFnQixDQUFDLENBQUMsK0JBQUQsQ0FBakI7QUFDQSxJQUFBLElBQUksQ0FBQyxVQUFMLEdBQWtCLENBQUMsQ0FBQyw4QkFBRCxDQUFuQjtBQUVBLElBQUEsVUFBVSxHQUFHLElBQUksQ0FBQyxRQUFMLENBQWMsTUFBM0I7O0FBRUEsSUFBQSxhQUFhO0FBQ2QsR0FWRDs7QUFZQSxNQUFNLGFBQWEsR0FBRyxTQUFoQixhQUFnQixHQUFNO0FBQzFCLElBQUEsSUFBSSxDQUFDLE9BQUwsQ0FBYSxFQUFiLENBQWdCLE9BQWhCLEVBQXlCLFVBQUMsQ0FBRCxFQUFPO0FBQzlCLE1BQUEsWUFBWTtBQUNaLE1BQUEsU0FBUyxHQUFHLE1BQVo7O0FBQ0EsTUFBQSxnQkFBZ0I7QUFDakIsS0FKRDs7QUFNQSxJQUFBLElBQUksQ0FBQyxPQUFMLENBQWEsRUFBYixDQUFnQixPQUFoQixFQUF5QixVQUFDLENBQUQsRUFBTztBQUM5QixNQUFBLFlBQVk7QUFDWixNQUFBLFNBQVMsR0FBRyxNQUFaOztBQUNBLE1BQUEsZ0JBQWdCO0FBQ2pCLEtBSkQ7QUFLRCxHQVpEOztBQWNBLE1BQU0sZ0JBQWdCLEdBQUcsU0FBbkIsZ0JBQW1CLEdBQU07QUFDN0IsUUFBSSxZQUFZLEdBQUcsQ0FBbkIsRUFBc0I7QUFDcEIsTUFBQSxZQUFZLEdBQUcsVUFBVSxHQUFHLENBQTVCO0FBQ0QsS0FGRCxNQUVPLElBQUksWUFBWSxJQUFJLFVBQXBCLEVBQWdDO0FBQ3JDLE1BQUEsWUFBWSxHQUFHLENBQWY7QUFDRDs7QUFFRCxRQUFJLFNBQVMsS0FBSyxNQUFsQixFQUEwQjtBQUN4QixNQUFBLElBQUksQ0FBQyxRQUFMLENBQ0csV0FESCxDQUNlLGdEQURmLEVBRUcsUUFGSCxDQUVZLGdCQUZaOztBQUdBLE1BQUEsSUFBSSxDQUFDLFFBQUwsQ0FDRyxFQURILENBQ00sWUFETixFQUVHLFdBRkgsQ0FFZSwwQkFGZixFQUdHLFFBSEgsQ0FHWSxjQUhaO0FBSUQsS0FSRCxNQVFPLElBQUksU0FBUyxLQUFLLE1BQWxCLEVBQTBCO0FBQy9CLE1BQUEsSUFBSSxDQUFDLFFBQUwsQ0FDRyxXQURILENBQ2UsZ0RBRGYsRUFFRyxRQUZILENBRVksZUFGWjs7QUFHQSxNQUFBLElBQUksQ0FBQyxRQUFMLENBQ0csRUFESCxDQUNNLFlBRE4sRUFFRyxXQUZILENBRWUsMEJBRmYsRUFHRyxRQUhILENBR1ksYUFIWjtBQUlEOztBQUVELElBQUEsSUFBSSxDQUFDLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsWUFBWSxHQUFHLENBQXBDOztBQUNBLElBQUEsSUFBSSxDQUFDLE9BQUwsQ0FBYSxHQUFiLENBQWlCO0FBQUUsd0JBQWtCO0FBQXBCLEtBQWpCOztBQUNBLElBQUEsSUFBSSxDQUFDLE9BQUwsQ0FBYSxHQUFiLENBQWlCO0FBQUUsd0JBQWtCO0FBQXBCLEtBQWpCOztBQUVBLElBQUEsVUFBVSxDQUFDLFlBQU07QUFDZixNQUFBLElBQUksQ0FBQyxRQUFMLENBQWMsR0FBZCxDQUFrQixTQUFTLFlBQVQsR0FBd0IsR0FBMUMsRUFBK0MsSUFBL0M7O0FBQ0EsTUFBQSxJQUFJLENBQUMsUUFBTCxDQUFjLEVBQWQsQ0FBaUIsWUFBakIsRUFBK0IsSUFBL0I7O0FBQ0EsTUFBQSxJQUFJLENBQUMsT0FBTCxDQUFhLEdBQWIsQ0FBaUI7QUFBRSwwQkFBa0I7QUFBcEIsT0FBakI7O0FBQ0EsTUFBQSxJQUFJLENBQUMsT0FBTCxDQUFhLEdBQWIsQ0FBaUI7QUFBRSwwQkFBa0I7QUFBcEIsT0FBakI7QUFDRCxLQUxTLEVBS1AsR0FMTyxDQUFWO0FBTUQsR0FuQ0Q7O0FBcUNBLEVBQUEsTUFBTSxDQUFDLE9BQVAsR0FBaUI7QUFDZixJQUFBLElBQUksRUFBRTtBQURTLEdBQWpCO0FBR0QsQ0F4RWUsQ0F3RWIsTUF4RWEsQ0FBaEI7Ozs7O0FDQUEsSUFBTSxLQUFLLEdBQUksVUFBQyxDQUFELEVBQU87QUFDcEIsTUFBSSxJQUFJLEdBQUcsRUFBWDs7QUFFQSxNQUFNLElBQUksR0FBRyxTQUFQLElBQU8sR0FBTTtBQUNqQixJQUFBLElBQUksQ0FBQyxXQUFMLEdBQW1CLENBQUMsQ0FBQyxjQUFELENBQXBCOztBQUVBLElBQUEsYUFBYTtBQUNkLEdBSkQ7O0FBTUEsTUFBTSxhQUFhLEdBQUcsU0FBaEIsYUFBZ0IsR0FBTTtBQUMxQixJQUFBLENBQUMsQ0FBQyxJQUFGLENBQU8sSUFBSSxDQUFDLFdBQVosRUFBeUIsVUFBQyxDQUFELEVBQUksR0FBSixFQUFZO0FBQ25DLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxHQUFELENBQUQsQ0FBTyxJQUFQLENBQVksb0JBQVosQ0FBWjtBQUNBLE1BQUEsS0FBSyxDQUFDLEVBQU4sQ0FBUyxPQUFULEVBQWtCLFVBQUMsQ0FBRCxFQUFPO0FBQ3ZCLFFBQUEsQ0FBQyxDQUFDLEdBQUQsQ0FBRCxDQUFPLFFBQVAsQ0FBZ0IsUUFBaEI7QUFDRCxPQUZEO0FBR0EsTUFBQSxLQUFLLENBQUMsRUFBTixDQUFTLE1BQVQsRUFBaUIsVUFBQyxDQUFELEVBQU87QUFDdEIsUUFBQSxDQUFDLENBQUMsR0FBRCxDQUFELENBQU8sV0FBUCxDQUFtQixRQUFuQjtBQUNELE9BRkQ7QUFHRCxLQVJEO0FBU0QsR0FWRDs7QUFZQSxFQUFBLE1BQU0sQ0FBQyxPQUFQLEdBQWlCO0FBQ2YsSUFBQSxJQUFJLEVBQUU7QUFEUyxHQUFqQjtBQUdELENBeEJhLENBd0JYLE1BeEJXLENBQWQ7Ozs7O0FDQUEsSUFBTSxLQUFLLEdBQUksVUFBQyxDQUFELEVBQU87QUFDcEIsTUFBSSxJQUFJLEdBQUcsRUFBWDs7QUFDQSxNQUFJLGFBQUo7O0FBRUEsTUFBTSxJQUFJLEdBQUcsU0FBUCxJQUFPLEdBQU07QUFDakIsSUFBQSxJQUFJLENBQUMsY0FBTCxDQUFvQixhQUFwQjs7QUFFQSxJQUFBLFdBQVc7O0FBQ1gsSUFBQSxnQkFBZ0I7O0FBRWhCLElBQUEsQ0FBQyxDQUFDLHlCQUFELENBQUQsQ0FBNkIsS0FBN0IsQ0FBbUMsVUFBUyxDQUFULEVBQVk7QUFDN0MsTUFBQSxDQUFDLENBQUMsY0FBRixHQUQ2QyxDQUU3Qzs7QUFDQSxNQUFBLE1BQU0sQ0FBQyxlQUFQLENBQXVCLGlCQUF2QjtBQUNELEtBSkQ7QUFNRCxHQVpEOztBQWNBLE1BQU0sV0FBVyxHQUFHLFNBQWQsV0FBYyxHQUFNO0FBQ3hCLElBQUEsSUFBSSxDQUFDLE1BQUwsR0FBYyxDQUFDLENBQUMseUJBQUQsQ0FBZjtBQUNBLElBQUEsSUFBSSxDQUFDLFdBQUwsR0FBbUIsQ0FBQyxDQUFDLGdCQUFELENBQXBCO0FBRUEsSUFBQSxhQUFhLEdBQUcsSUFBSSxDQUFDLE1BQUwsQ0FBWSxXQUFaLEVBQWhCO0FBQ0EsUUFBSSxtQkFBbUIsR0FBRyxJQUFJLGFBQWEsR0FBRyxNQUFNLENBQUMsV0FBckQ7QUFFQSxRQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBTCxDQUFjO0FBQzNCLE1BQUEsYUFBYSxFQUFFO0FBQ2IsUUFBQSxPQUFPLEVBQUUsT0FESTtBQUViLFFBQUEsS0FBSyxFQUFFLFNBRk07QUFHYixRQUFBLEtBQUssRUFBRSxJQUhNO0FBSWIsUUFBQSxHQUFHLEVBQUUsS0FKUTtBQUtiLFFBQUEsVUFBVSxFQUFFLEtBTEM7QUFNYixRQUFBLFFBQVEsRUFBRSxrQkFBQyxJQUFELEVBQVU7QUFDbEI7QUFDQSxjQUFJLElBQUksQ0FBQyxRQUFMLElBQWlCLG1CQUFtQixHQUFHLElBQTNDLEVBQWlEO0FBQy9DLFlBQUEsSUFBSSxDQUFDLE1BQUwsQ0FBWSxRQUFaLENBQXFCLGNBQXJCO0FBQ0QsV0FGRCxNQUVPO0FBQ0wsWUFBQSxJQUFJLENBQUMsTUFBTCxDQUFZLFdBQVosQ0FBd0IsY0FBeEI7QUFDRDtBQUNGO0FBYlk7QUFEWSxLQUFkLENBQWY7QUFpQkQsR0F4QkQ7O0FBMEJBLE1BQU0sZ0JBQWdCLEdBQUcsU0FBbkIsZ0JBQW1CLEdBQU07QUFFN0IsUUFBSSxPQUFPLEdBQUcsQ0FBQyxDQUFDLGtCQUFELENBQWY7QUFDQSxRQUFJLFlBQVksR0FBRyxDQUFuQjtBQUNBLFFBQUksWUFBWSxHQUFHLElBQW5CLENBSjZCLENBTTdCOztBQUNBLFFBQUksT0FBTyxDQUFDLE1BQVIsR0FBaUIsQ0FBckIsRUFBd0IsT0FQSyxDQVM3Qjs7QUFDQSxJQUFBLE9BQU8sQ0FBQyxFQUFSLENBQVksWUFBWixFQUEyQixRQUEzQixDQUFxQyxRQUFyQyxFQVY2QixDQVk3Qjs7QUFDQSxJQUFBLFNBQVMsQ0FBQyxZQUFNO0FBQ2Q7QUFDQSxNQUFBLE9BQU8sQ0FBQyxFQUFSLENBQVcsWUFBWCxFQUF5QixXQUF6QixDQUFxQyxRQUFyQyxFQUZjLENBSWQ7O0FBQ0EsVUFBSSxZQUFZLEtBQUssT0FBTyxDQUFDLE1BQVIsR0FBaUIsQ0FBdEMsRUFBeUM7QUFDdkMsUUFBQSxZQUFZLEdBQUcsQ0FBZjtBQUNELE9BRkQsTUFFTztBQUNMLFFBQUEsWUFBWTtBQUNiLE9BVGEsQ0FVZDs7O0FBQ0EsTUFBQSxPQUFPLENBQUMsRUFBUixDQUFZLFlBQVosRUFBMkIsUUFBM0IsQ0FBb0MsUUFBcEM7QUFFRCxLQWJRLEVBYU4sWUFiTSxFQWFRLEdBYlIsQ0FBVDtBQWNELEdBM0JELENBNUNvQixDQXlFcEI7OztBQUNBLE1BQU0sU0FBUyxHQUFHLFNBQVosU0FBWSxDQUFDLElBQUQsRUFBTyxJQUFQLEVBQWEsS0FBYixFQUF1QjtBQUN2QyxRQUFJLE1BQU0sR0FBSSxVQUFDLENBQUQsRUFBSSxDQUFKLEVBQVU7QUFDdEIsYUFBTyxZQUFNO0FBQ1gsWUFBSSxPQUFPLENBQVAsS0FBYSxXQUFiLElBQTRCLENBQUMsS0FBSyxDQUF0QyxFQUF5QztBQUN2QyxVQUFBLFVBQVUsQ0FBQyxNQUFELEVBQVMsQ0FBVCxDQUFWOztBQUNBLGNBQUk7QUFDRixZQUFBLElBQUksQ0FBQyxJQUFMLENBQVUsSUFBVjtBQUNELFdBRkQsQ0FFRSxPQUFPLENBQVAsRUFBVTtBQUNWLFlBQUEsQ0FBQyxHQUFHLENBQUo7QUFDQSxrQkFBTSxDQUFDLENBQUMsUUFBRixFQUFOO0FBQ0Q7QUFDRjtBQUNGLE9BVkQ7QUFXRCxLQVpZLENBWVYsSUFaVSxFQVlKLEtBWkksQ0FBYjs7QUFjQSxJQUFBLFVBQVUsQ0FBQyxNQUFELEVBQVMsSUFBVCxDQUFWO0FBQ0QsR0FoQkQ7O0FBa0JBLEVBQUEsTUFBTSxDQUFDLE9BQVAsR0FBaUI7QUFDZixJQUFBLElBQUksRUFBRTtBQURTLEdBQWpCO0FBR0QsQ0EvRmEsQ0ErRlgsTUEvRlcsQ0FBZDs7Ozs7QUNBQSxJQUFNLFFBQVEsR0FBSSxVQUFDLENBQUQsRUFBTztBQUN2QixNQUFJLElBQUksR0FBRyxFQUFYOztBQUVBLE1BQU0sSUFBSSxHQUFHLFNBQVAsSUFBTyxHQUFNO0FBQ2pCLElBQUEsSUFBSSxDQUFDLElBQUwsR0FBWSxDQUFDLENBQUMsTUFBRCxDQUFiO0FBQ0EsSUFBQSxJQUFJLENBQUMsY0FBTCxHQUFzQixDQUFDLENBQUMsa0JBQUQsQ0FBdkI7QUFDRCxHQUhEOztBQUtBLE1BQU0sbUJBQW1CLEdBQUcsU0FBdEIsbUJBQXNCLEdBQU07QUFDaEMsSUFBQSxJQUFJLENBQUMsSUFBTCxDQUFVLFFBQVYsQ0FBbUIsV0FBbkI7O0FBQ0EsSUFBQSxJQUFJLENBQUMsY0FBTCxDQUFvQixRQUFwQixDQUE2QixNQUE3QjtBQUNELEdBSEQ7O0FBS0EsTUFBTSxXQUFXLEdBQUcsU0FBZCxXQUFjLENBQUMsUUFBRCxFQUEyQjtBQUFBLFFBQWhCLFFBQWdCLHVFQUFQLEVBQU87QUFDN0MsSUFBQSxPQUFPLENBQUMsR0FBUixDQUFhLGVBQWIsRUFBOEIsUUFBOUIsRUFBd0MsUUFBeEM7O0FBRUEsSUFBQSxtQkFBbUI7O0FBRW5CLElBQUEsTUFBTSxDQUFDLElBQVAsQ0FBWTtBQUNWLE1BQUEsR0FBRyxFQUFFLDBCQURLO0FBRVYsTUFBQSxJQUFJLEVBQUUsTUFGSTtBQUdWLE1BQUEsUUFBUSxFQUFFLE1BSEE7QUFJVixNQUFBLElBQUksRUFBRTtBQUNKLFFBQUEsTUFBTSxFQUFFLGNBREo7QUFFSixRQUFBLFFBQVEsRUFBRTtBQUZOLE9BSkk7QUFRVixNQUFBLE9BQU8sRUFBRSxpQkFBVSxRQUFWLEVBQW9CO0FBRTNCLFlBQUksUUFBUSxDQUFDLE9BQVQsS0FBcUIsSUFBekIsRUFBK0I7QUFFN0IsY0FBSSxRQUFKLEVBQWM7QUFFWjtBQUNBO0FBQ0E7QUFDQSxZQUFBLE1BQU0sQ0FBQyxRQUFQLENBQWdCLE1BQWhCLENBQXdCLFFBQXhCO0FBQ0EsWUFBQSxRQUFRLENBQUMsY0FBVCxDQUF3QixpQkFBeEIsRUFBMkMsYUFBM0MsQ0FBeUQsUUFBekQsQ0FBa0UsTUFBbEU7QUFFRCxXQVJELE1BUU87QUFFTDtBQUNBO0FBQ0EsWUFBQSxNQUFNLENBQUMsUUFBUCxDQUFnQixNQUFoQixDQUF3QixJQUF4QjtBQUNBLFlBQUEsUUFBUSxDQUFDLGNBQVQsQ0FBd0IsaUJBQXhCLEVBQTJDLGFBQTNDLENBQXlELFFBQXpELENBQWtFLE1BQWxFO0FBQ0Q7QUFFRixTQWxCRCxNQWtCTyxJQUFJLFFBQVEsQ0FBQyxPQUFULEtBQXFCLEtBQXpCLEVBQWdDO0FBQ3JDLFVBQUEsT0FBTyxDQUFDLElBQVIsQ0FBYSx1Q0FBYjtBQUNELFNBRk0sTUFFQTtBQUNMO0FBQ0EsVUFBQSxPQUFPLENBQUMsSUFBUixDQUFhLGlEQUFiO0FBQ0Q7QUFDRixPQWxDUztBQW1DVixNQUFBLEtBQUssRUFBRSxlQUFVLEdBQVYsRUFBZSxXQUFmLEVBQTRCLFdBQTVCLEVBQXlDO0FBQzlDO0FBQ0EsUUFBQSxPQUFPLENBQUMsSUFBUixDQUFhLHVCQUF1QixXQUFwQztBQUNEO0FBdENTLEtBQVo7QUF3Q0QsR0E3Q0Q7O0FBK0NBLEVBQUEsTUFBTSxDQUFDLE9BQVAsR0FBaUI7QUFDZixJQUFBLElBQUksRUFBRSxJQURTO0FBRWYsSUFBQSxXQUFXLEVBQUU7QUFGRSxHQUFqQjtBQUlELENBaEVnQixDQWdFZCxNQWhFYyxDQUFqQjs7Ozs7Ozs7OztBQ0FBOzs7O0FBRU8sU0FBUyxRQUFULEdBQW9CO0FBQ3pCLE1BQU0sSUFBSSxHQUFHLEVBQWI7O0FBRUEsTUFBTSxJQUFJLEdBQUcsU0FBUCxJQUFPLEdBQU07QUFDakIsSUFBQSxJQUFJLENBQUMsTUFBTCxHQUFjLFFBQVEsQ0FBQyxhQUFULENBQXVCLFNBQXZCLENBQWQ7QUFDQSxJQUFBLElBQUksQ0FBQyxTQUFMLEdBQWlCLFFBQVEsQ0FBQyxhQUFULENBQXVCLG9CQUF2QixDQUFqQjtBQUNBLElBQUEsSUFBSSxDQUFDLFFBQUwsR0FBZ0IsUUFBUSxDQUFDLGNBQVQsQ0FBd0IscUJBQXhCLENBQWhCO0FBQ0EsSUFBQSxJQUFJLENBQUMsd0JBQUwsR0FBZ0MsUUFBUSxDQUFDLGFBQVQsQ0FBdUIseUJBQXZCLENBQWhDO0FBQ0EsSUFBQSxJQUFJLENBQUMsaUJBQUwsR0FBeUIsUUFBUSxDQUFDLGFBQVQsQ0FBdUIscUNBQXZCLENBQXpCO0FBQ0EsSUFBQSxJQUFJLENBQUMsZUFBTCxHQUF1QixRQUFRLENBQUMsYUFBVCxDQUF1Qiw0Q0FBdkIsQ0FBdkI7QUFFQSxJQUFBLE9BQU8sQ0FBQyxHQUFSLENBQVksSUFBSSxDQUFDLGlCQUFqQjs7QUFDQSxJQUFBLGFBQWE7QUFDZCxHQVZEOztBQVlBLE1BQU0sYUFBYSxHQUFHLFNBQWhCLGFBQWdCLEdBQU07QUFDMUIsSUFBQSxJQUFJLENBQUMsd0JBQUwsQ0FBOEIsZ0JBQTlCLENBQStDLE9BQS9DLEVBQXdELFVBQVUsQ0FBVixFQUFhO0FBQ25FLE1BQUEsQ0FBQyxDQUFDLGNBQUY7QUFDQSxVQUFNLGFBQWEsR0FBRyxJQUFJLGNBQUosQ0FBVSxpQkFBVixDQUF0QjtBQUNBLE1BQUEsYUFBYSxDQUFDLElBQWQ7QUFDRCxLQUpEOztBQU1BLElBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBYyxnQkFBZCxDQUErQixrQkFBL0IsRUFBbUQsVUFBQyxDQUFELEVBQU87QUFDeEQsTUFBQSxJQUFJLENBQUMsU0FBTCxDQUFlLFNBQWYsQ0FBeUIsR0FBekIsQ0FBNkIsV0FBN0I7QUFDRCxLQUZEOztBQUlBLElBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBYyxnQkFBZCxDQUErQixrQkFBL0IsRUFBbUQsVUFBQyxDQUFELEVBQU87QUFDeEQsTUFBQSxJQUFJLENBQUMsU0FBTCxDQUFlLFNBQWYsQ0FBeUIsTUFBekIsQ0FBZ0MsV0FBaEM7QUFDRCxLQUZEOztBQUlBLFFBQUksUUFBUSxJQUFJLENBQUMsaUJBQWpCLEVBQW9DO0FBQ2xDLE1BQUEsSUFBSSxDQUFDLGlCQUFMLENBQXVCLE9BQXZCLENBQStCLFVBQUMsRUFBRCxFQUFRO0FBQ3JDLFlBQU0sS0FBSyxHQUFHLE1BQU0sQ0FBQyxFQUFELENBQXBCOztBQUNBLFFBQUEsSUFBSSxDQUFDLGlCQUFMLENBQXVCLE9BQXZCLENBQStCLFVBQUMsSUFBRCxFQUFVO0FBQ3ZDLFVBQUEsSUFBSSxDQUFDLFNBQUwsQ0FBZSxNQUFmLENBQXNCLFFBQXRCO0FBQ0QsU0FGRDs7QUFHQSxRQUFBLEtBQUssQ0FBQyxRQUFOLENBQWUsUUFBZjs7QUFDQSxRQUFBLElBQUksQ0FBQyxlQUFMLENBQXFCLElBQXJCLENBQTBCLEtBQUssQ0FBQyxJQUFOLEVBQTFCOztBQUVBLFFBQUEsTUFBTSxDQUFDLFFBQVAsQ0FBZ0IsV0FBaEIsQ0FBNEIsS0FBSyxDQUFDLElBQU4sQ0FBVyxVQUFYLENBQTVCO0FBQ0QsT0FURDtBQVVEOztBQUVELElBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBYyxnQkFBZCxDQUErQixrQkFBL0IsRUFBbUQsVUFBQyxDQUFELEVBQU87QUFDeEQsTUFBQSxJQUFJLENBQUMsTUFBTCxDQUFZLFNBQVosQ0FBc0IsR0FBdEIsQ0FBMEIsTUFBMUI7QUFDRCxLQUZEOztBQUlBLElBQUEsSUFBSSxDQUFDLFFBQUwsQ0FBYyxnQkFBZCxDQUErQixrQkFBL0IsRUFBbUQsVUFBQyxDQUFELEVBQU87QUFDeEQsTUFBQSxJQUFJLENBQUMsTUFBTCxDQUFZLFNBQVosQ0FBc0IsTUFBdEIsQ0FBNkIsTUFBN0I7QUFDRCxLQUZEO0FBR0QsR0FuQ0Q7O0FBcUNBLFNBQU87QUFBRSxJQUFBLElBQUksRUFBSjtBQUFGLEdBQVA7QUFDRDs7Ozs7QUN2REQsSUFBTSxzQkFBc0IsR0FBSSxZQUFNO0FBQ3BDLE1BQUksZUFBSjs7QUFFQSxNQUFNLGlCQUFpQixHQUFHLFNBQXBCLGlCQUFvQixHQUFNO0FBQzlCO0FBQ0E7QUFDQSxRQUFJLFdBQVcsR0FBRyxJQUFJLElBQUosRUFBbEI7QUFDQSxRQUFJLFVBQVUsR0FBRyxXQUFXLENBQUMsTUFBWixFQUFqQixDQUo4QixDQUlTO0FBRXZDO0FBQ0E7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVBLFFBQUksV0FBVyxHQUFHLElBQUksSUFBSixFQUFsQjtBQUNBLFFBQUksVUFBVSxHQUFHLElBQUksSUFBSixFQUFqQjtBQUNBLFFBQUksVUFBVSxHQUFHLElBQUksSUFBSixFQUFqQjtBQUNBLFFBQUksV0FBVyxHQUFHLElBQUksSUFBSixFQUFsQjtBQUNBLFFBQUksY0FBYyxHQUFHLElBQUksSUFBSixFQUFyQjtBQUNBLFFBQUksWUFBWSxHQUFHLElBQUksSUFBSixFQUFuQjtBQUVBLElBQUEsV0FBVyxDQUFDLFFBQVosQ0FBcUIsQ0FBckIsRUFBd0IsQ0FBeEIsRUFBMkIsQ0FBM0IsRUF0QjhCLENBc0JDOztBQUMvQixJQUFBLFVBQVUsQ0FBQyxRQUFYLENBQW9CLENBQXBCLEVBQXVCLENBQXZCLEVBQTBCLENBQTFCLEVBdkI4QixDQXVCQTs7QUFDOUIsSUFBQSxVQUFVLENBQUMsUUFBWCxDQUFvQixFQUFwQixFQUF3QixDQUF4QixFQUEyQixDQUEzQixFQXhCOEIsQ0F3QkM7O0FBQy9CLElBQUEsV0FBVyxDQUFDLFFBQVosQ0FBcUIsRUFBckIsRUFBeUIsQ0FBekIsRUFBNEIsQ0FBNUIsRUF6QjhCLENBeUJFOztBQUNoQyxJQUFBLGNBQWMsQ0FBQyxRQUFmLENBQXdCLEVBQXhCLEVBQTRCLENBQTVCLEVBQStCLENBQS9CLEVBMUI4QixDQTBCSzs7QUFDbkMsSUFBQSxZQUFZLENBQUMsUUFBYixDQUFzQixFQUF0QixFQUEwQixDQUExQixFQUE2QixDQUE3QixFQTNCOEIsQ0EyQkc7O0FBRWpDLFFBQUksVUFBVSxLQUFLLENBQWYsSUFBb0IsVUFBVSxLQUFLLENBQXZDLEVBQTBDO0FBQ3hDLFVBQUksV0FBVyxJQUFJLFdBQWYsSUFBOEIsV0FBVyxHQUFHLFVBQWhELEVBQTREO0FBQzFEO0FBQ0EsUUFBQSxlQUFlLEdBQUcsUUFBbEI7QUFDQSxlQUFPLGVBQVA7QUFDRDtBQUNGLEtBTkQsTUFNTztBQUNMLFVBQUksV0FBVyxJQUFJLFVBQWYsSUFBNkIsV0FBVyxHQUFHLFVBQS9DLEVBQTJEO0FBQ3pEO0FBQ0EsUUFBQSxlQUFlLEdBQUcsT0FBbEI7QUFDQSxlQUFPLGVBQVA7QUFDRDtBQUNGOztBQUVELFFBQUksVUFBVSxJQUFJLENBQWQsSUFBbUIsV0FBVyxJQUFJLGNBQWxDLElBQW9ELFdBQVcsR0FBRyxZQUF0RSxFQUFvRjtBQUNsRjtBQUNBLE1BQUEsZUFBZSxHQUFHLFlBQWxCO0FBQ0EsYUFBTyxlQUFQO0FBQ0QsS0FKRCxNQUlPO0FBQ0w7QUFDQSxVQUFJLFdBQVcsSUFBSSxVQUFmLElBQTZCLFdBQVcsR0FBRyxXQUEvQyxFQUE0RDtBQUMxRCxRQUFBLGVBQWUsR0FBRyxhQUFsQjtBQUNBLGVBQU8sZUFBUDtBQUNELE9BSEQsTUFHTztBQUNMLFFBQUEsZUFBZSxHQUFHLFFBQWxCO0FBQ0EsZUFBTyxlQUFQO0FBQ0Q7QUFDRjtBQUNGLEdBekREOztBQTJEQSxFQUFBLE1BQU0sQ0FBQyxPQUFQLEdBQWlCO0FBQ2YsSUFBQSxpQkFBaUIsRUFBRTtBQURKLEdBQWpCO0FBR0QsQ0FqRThCLEVBQS9COzs7OztBQ0FBLElBQU0sTUFBTSxHQUFJLFVBQUMsQ0FBRCxFQUFPO0FBQ3JCLE1BQUksSUFBSSxHQUFHLEVBQVg7O0FBRUEsTUFBTSxJQUFJLEdBQUcsU0FBUCxJQUFPLEdBQU07QUFDakIsSUFBQSxJQUFJLENBQUMsYUFBTCxHQUFxQixDQUFDLENBQUMsK0JBQUQsQ0FBdEI7O0FBQ0EsSUFBQSxhQUFhO0FBQ2QsR0FIRDs7QUFLQSxNQUFNLGFBQWEsR0FBRyxTQUFoQixhQUFnQixHQUFNO0FBQzFCLElBQUEsQ0FBQyxDQUFDLElBQUYsQ0FBTyxJQUFJLENBQUMsYUFBWixFQUEyQixVQUFDLENBQUQsRUFBSSxHQUFKLEVBQVk7QUFDckMsVUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEdBQUQsQ0FBYjtBQUVBLE1BQUEsS0FBSyxDQUFDLEVBQU4sQ0FBUyxPQUFULEVBQWtCLFVBQUMsQ0FBRCxFQUFPO0FBQ3ZCO0FBQ0EsUUFBQSxDQUFDLENBQUMsaUJBQUQsQ0FBRCxDQUFxQixLQUFyQixDQUEyQixNQUEzQjtBQUNBLFFBQUEsTUFBTSxDQUFDLFFBQVAsQ0FBZ0IsV0FBaEIsQ0FBNkIsS0FBSyxDQUFDLElBQU4sQ0FBVyxVQUFYLENBQTdCO0FBQ0QsT0FKRDtBQUtELEtBUkQ7QUFTRCxHQVZEOztBQVlBLEVBQUEsTUFBTSxDQUFDLE9BQVAsR0FBaUI7QUFDZixJQUFBLElBQUksRUFBRTtBQURTLEdBQWpCO0FBR0QsQ0F2QmMsQ0F1QlosTUF2QlksQ0FBZjs7Ozs7QUNBQSxJQUFNLFNBQVMsR0FBSSxVQUFDLENBQUQsRUFBTztBQUN4QixNQUFJLElBQUksR0FBRyxFQUFYOztBQUNBLE1BQUksZUFBZSxHQUFHLE1BQU0sQ0FBQyxzQkFBUCxDQUE4QixpQkFBOUIsRUFBdEI7O0FBRUEsTUFBTSxJQUFJLEdBQUcsU0FBUCxJQUFPLEdBQU07QUFDakIsSUFBQSxJQUFJLENBQUMsT0FBTCxHQUFlLENBQUMsQ0FBQyxvQkFBRCxDQUFoQjtBQUNBLElBQUEsSUFBSSxDQUFDLGFBQUwsR0FBcUIsQ0FBQyxDQUFDLHNCQUFELENBQXRCOztBQUNBLElBQUEsSUFBSSxDQUFDLE9BQUwsQ0FBYSxRQUFiLENBQXNCLGVBQXRCLEVBSGlCLENBSWpCOzs7QUFFQSxJQUFBLGFBQWE7QUFDZCxHQVBEOztBQVNBLE1BQU0sYUFBYSxHQUFHLFNBQWhCLGFBQWdCLEdBQU07QUFDMUIsSUFBQSxJQUFJLENBQUMsYUFBTCxDQUFtQixFQUFuQixDQUFzQixPQUF0QixFQUErQixVQUFDLENBQUQsRUFBTztBQUNwQyxNQUFBLENBQUMsQ0FBQyxjQUFGO0FBQ0EsVUFBSSxLQUFLLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFILENBQWI7QUFDQSxNQUFBLE1BQU0sQ0FBQyxRQUFQLENBQWdCLFdBQWhCLENBQTZCLEtBQUssQ0FBQyxJQUFOLENBQVcsVUFBWCxDQUE3QixFQUFxRCxLQUFLLENBQUMsSUFBTixDQUFXLE1BQVgsQ0FBckQ7QUFDRCxLQUpEO0FBS0QsR0FORDs7QUFRQSxFQUFBLE1BQU0sQ0FBQyxPQUFQLEdBQWlCO0FBQ2YsSUFBQSxJQUFJLEVBQUU7QUFEUyxHQUFqQjtBQUdELENBeEJpQixDQXdCZixNQXhCZSxDQUFsQjs7Ozs7QUNBQSxJQUFNLFdBQVcsR0FBSSxVQUFDLENBQUQsRUFBTztBQUMxQixNQUFJLElBQUksR0FBRyxFQUFYOztBQUVBLE1BQU0sSUFBSSxHQUFHLFNBQVAsSUFBTyxHQUFNO0FBQ2pCLElBQUEsSUFBSSxDQUFDLGdCQUFMLEdBQXdCLENBQUMsQ0FBQyx3QkFBRCxDQUF6QjtBQUNBLElBQUEsSUFBSSxDQUFDLFFBQUwsR0FBZ0IsQ0FBQyxDQUFDLDhCQUFELENBQWpCO0FBQ0EsSUFBQSxJQUFJLENBQUMsYUFBTCxHQUFxQixDQUFDLENBQUMsZUFBRCxDQUF0QjtBQUNBLElBQUEsSUFBSSxDQUFDLFlBQUwsR0FBb0IsQ0FBQyxDQUFDLDhCQUFELENBQXJCOztBQUVBLElBQUEsSUFBSSxDQUFDLGdCQUFMLENBQXNCLE9BQXRCLENBQThCO0FBQzVCLE1BQUEsWUFBWSxFQUFFLDhCQURjO0FBRTVCLE1BQUEsVUFBVSxFQUFFO0FBRmdCLEtBQTlCLEVBTmlCLENBV2pCOzs7QUFDQSxJQUFBLElBQUksQ0FBQyxhQUFMLENBQW1CLEVBQW5CLENBQXNCLE9BQXRCLEVBQStCLFVBQUMsQ0FBRCxFQUFPO0FBQ3BDLE1BQUEsSUFBSSxDQUFDLGdCQUFMLENBQXNCLE9BQXRCLENBQThCO0FBQUUsUUFBQSxNQUFNLEVBQUU7QUFBVixPQUE5Qjs7QUFDQSxNQUFBLElBQUksQ0FBQyxZQUFMLENBQWtCLElBQWxCLENBQXVCLFNBQXZCLEVBQWtDLEtBQWxDOztBQUNBLE1BQUEsYUFBYTtBQUNkLEtBSkQsRUFaaUIsQ0FrQmpCOzs7QUFDQSxJQUFBLElBQUksQ0FBQyxZQUFMLENBQWtCLEVBQWxCLENBQXFCLFFBQXJCLEVBQStCLFVBQUMsQ0FBRCxFQUFPO0FBQ3BDLFVBQUksS0FBSyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBSCxDQUFiO0FBQ0EsVUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDLElBQU4sQ0FBVyxhQUFYLENBQWhCOztBQUNBLE1BQUEsSUFBSSxDQUFDLGdCQUFMLENBQXNCLE9BQXRCLENBQThCO0FBQUUsUUFBQSxNQUFNLEVBQUU7QUFBVixPQUE5Qjs7QUFDQSxNQUFBLGFBQWE7QUFDZCxLQUxELEVBbkJpQixDQTBCakI7OztBQUNBLElBQUEsWUFBWTtBQUNiLEdBNUJEOztBQThCQSxNQUFNLFlBQVksR0FBRyxTQUFmLFlBQWUsR0FBTTtBQUN6QixJQUFBLENBQUMsR0FBRyxRQUFKLENBQWE7QUFDWCxNQUFBLFFBQVEsRUFBRyxjQURBO0FBRVgsTUFBQSxPQUFPLEVBQUUsQ0FDUCxPQURPO0FBRkUsS0FBYjtBQU1ELEdBUEQ7O0FBU0EsTUFBTSxhQUFhLEdBQUcsU0FBaEIsYUFBZ0IsR0FBTTtBQUMxQjtBQUNBLFFBQUksY0FBYyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQUwsQ0FBc0IsT0FBdEIsQ0FBOEIseUJBQTlCLENBQUQsQ0FBdEI7O0FBQ0EsSUFBQSxJQUFJLENBQUMsUUFBTCxDQUFjLFdBQWQsQ0FBMEIsYUFBMUI7O0FBQ0EsSUFBQSxjQUFjLENBQUMsUUFBZixDQUF3QixhQUF4QjtBQUNELEdBTEQ7O0FBT0EsRUFBQSxNQUFNLENBQUMsT0FBUCxHQUFpQjtBQUNmLElBQUEsSUFBSSxFQUFFO0FBRFMsR0FBakI7QUFHRCxDQXBEbUIsQ0FvRGpCLE1BcERpQixDQUFwQjs7Ozs7QUNBQSxJQUFNLFFBQVEsR0FBSSxVQUFDLENBQUQsRUFBTztBQUN2QixNQUFJLElBQUksR0FBRyxFQUFYOztBQUNBLE1BQUksZUFBZSxHQUFHLE1BQU0sQ0FBQyxzQkFBUCxDQUE4QixpQkFBOUIsRUFBdEI7O0FBRUEsTUFBTSxJQUFJLEdBQUcsU0FBUCxJQUFPLEdBQU07QUFDakIsSUFBQSxJQUFJLENBQUMsT0FBTCxHQUFlLENBQUMsQ0FBQyxzQkFBRCxDQUFoQjtBQUNBLElBQUEsSUFBSSxDQUFDLGFBQUwsR0FBcUIsQ0FBQyxDQUFDLGlCQUFELENBQXRCO0FBQ0EsSUFBQSxJQUFJLENBQUMsS0FBTCxHQUFhLENBQUMsQ0FBQyxPQUFELENBQWQ7O0FBRUEsUUFBSSxJQUFJLENBQUMsT0FBTCxDQUFhLE1BQWpCLEVBQXlCO0FBQ3ZCLE1BQUEsSUFBSSxDQUFDLE9BQUwsQ0FBYSxFQUFiLENBQWdCLE9BQWhCLEVBQXlCLFVBQUMsQ0FBRCxFQUFPO0FBQzlCLFFBQUEsQ0FBQyxDQUFDLGNBQUY7QUFFQSxZQUFJLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQUgsQ0FBYjtBQUNBLFlBQUksVUFBVSxHQUFHLEtBQUssQ0FBQyxJQUFOLENBQVcsYUFBWCxDQUFqQjs7QUFFQSxRQUFBLElBQUksQ0FBQyxPQUFMLENBQWEsV0FBYixDQUF5QixRQUF6Qjs7QUFDQSxRQUFBLElBQUksQ0FBQyxLQUFMLENBQVcsV0FBWCxDQUF1QixRQUF2Qjs7QUFDQSxRQUFBLElBQUksQ0FBQyxLQUFMLENBQVcsTUFBWCxDQUFrQixNQUFNLFVBQXhCLEVBQW9DLFFBQXBDLENBQTZDLFFBQTdDOztBQUVBLFFBQUEsS0FBSyxDQUFDLFFBQU4sQ0FBZSxRQUFmO0FBQ0QsT0FYRCxFQUR1QixDQWN2Qjs7O0FBQ0EsTUFBQSxJQUFJLENBQUMsT0FBTCxDQUFhLENBQWIsRUFBZ0IsS0FBaEI7QUFDRDtBQUNGLEdBdEJEOztBQXdCQSxFQUFBLE1BQU0sQ0FBQyxPQUFQLEdBQWlCO0FBQ2YsSUFBQSxJQUFJLEVBQUU7QUFEUyxHQUFqQjtBQUdELENBL0JnQixDQStCZCxNQS9CYyxDQUFqQiIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcihlLG4sdCl7ZnVuY3Rpb24gbyhpLGYpe2lmKCFuW2ldKXtpZighZVtpXSl7dmFyIGM9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZTtpZighZiYmYylyZXR1cm4gYyhpLCEwKTtpZih1KXJldHVybiB1KGksITApO3ZhciBhPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIraStcIidcIik7dGhyb3cgYS5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGF9dmFyIHA9bltpXT17ZXhwb3J0czp7fX07ZVtpXVswXS5jYWxsKHAuZXhwb3J0cyxmdW5jdGlvbihyKXt2YXIgbj1lW2ldWzFdW3JdO3JldHVybiBvKG58fHIpfSxwLHAuZXhwb3J0cyxyLGUsbix0KX1yZXR1cm4gbltpXS5leHBvcnRzfWZvcih2YXIgdT1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlLGk9MDtpPHQubGVuZ3RoO2krKylvKHRbaV0pO3JldHVybiBvfXJldHVybiByfSkoKSIsIi8qIVxuICAqIEJvb3RzdHJhcCBiYXNlLWNvbXBvbmVudC5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoJy4vZG9tL2RhdGEuanMnKSwgcmVxdWlyZSgnLi9kb20vZXZlbnQtaGFuZGxlci5qcycpLCByZXF1aXJlKCcuL3V0aWwvY29uZmlnLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4vZG9tL2RhdGEnLCAnLi9kb20vZXZlbnQtaGFuZGxlcicsICcuL3V0aWwvY29uZmlnJywgJy4vdXRpbC9pbmRleCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5CYXNlQ29tcG9uZW50ID0gZmFjdG9yeShnbG9iYWwuRGF0YSwgZ2xvYmFsLkV2ZW50SGFuZGxlciwgZ2xvYmFsLkNvbmZpZywgZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKERhdGEsIEV2ZW50SGFuZGxlciwgQ29uZmlnLCBpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCBiYXNlLWNvbXBvbmVudC5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIGNvbnN0IFZFUlNJT04gPSAnNS4zLjMnO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIEJhc2VDb21wb25lbnQgZXh0ZW5kcyBDb25maWcge1xuICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQsIGNvbmZpZykge1xuICAgICAgc3VwZXIoKTtcbiAgICAgIGVsZW1lbnQgPSBpbmRleF9qcy5nZXRFbGVtZW50KGVsZW1lbnQpO1xuICAgICAgaWYgKCFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2VsZW1lbnQgPSBlbGVtZW50O1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICBEYXRhLnNldCh0aGlzLl9lbGVtZW50LCB0aGlzLmNvbnN0cnVjdG9yLkRBVEFfS0VZLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICBkaXNwb3NlKCkge1xuICAgICAgRGF0YS5yZW1vdmUodGhpcy5fZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5EQVRBX0tFWSk7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIHRoaXMuY29uc3RydWN0b3IuRVZFTlRfS0VZKTtcbiAgICAgIGZvciAoY29uc3QgcHJvcGVydHlOYW1lIG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG4gICAgICAgIHRoaXNbcHJvcGVydHlOYW1lXSA9IG51bGw7XG4gICAgICB9XG4gICAgfVxuICAgIF9xdWV1ZUNhbGxiYWNrKGNhbGxiYWNrLCBlbGVtZW50LCBpc0FuaW1hdGVkID0gdHJ1ZSkge1xuICAgICAgaW5kZXhfanMuZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbihjYWxsYmFjaywgZWxlbWVudCwgaXNBbmltYXRlZCk7XG4gICAgfVxuICAgIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcsIHRoaXMuX2VsZW1lbnQpO1xuICAgICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpO1xuICAgICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZyk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cblxuICAgIC8vIFN0YXRpY1xuICAgIHN0YXRpYyBnZXRJbnN0YW5jZShlbGVtZW50KSB7XG4gICAgICByZXR1cm4gRGF0YS5nZXQoaW5kZXhfanMuZ2V0RWxlbWVudChlbGVtZW50KSwgdGhpcy5EQVRBX0tFWSk7XG4gICAgfVxuICAgIHN0YXRpYyBnZXRPckNyZWF0ZUluc3RhbmNlKGVsZW1lbnQsIGNvbmZpZyA9IHt9KSB7XG4gICAgICByZXR1cm4gdGhpcy5nZXRJbnN0YW5jZShlbGVtZW50KSB8fCBuZXcgdGhpcyhlbGVtZW50LCB0eXBlb2YgY29uZmlnID09PSAnb2JqZWN0JyA/IGNvbmZpZyA6IG51bGwpO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IFZFUlNJT04oKSB7XG4gICAgICByZXR1cm4gVkVSU0lPTjtcbiAgICB9XG4gICAgc3RhdGljIGdldCBEQVRBX0tFWSgpIHtcbiAgICAgIHJldHVybiBgYnMuJHt0aGlzLk5BTUV9YDtcbiAgICB9XG4gICAgc3RhdGljIGdldCBFVkVOVF9LRVkoKSB7XG4gICAgICByZXR1cm4gYC4ke3RoaXMuREFUQV9LRVl9YDtcbiAgICB9XG4gICAgc3RhdGljIGV2ZW50TmFtZShuYW1lKSB7XG4gICAgICByZXR1cm4gYCR7bmFtZX0ke3RoaXMuRVZFTlRfS0VZfWA7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIEJhc2VDb21wb25lbnQ7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWJhc2UtY29tcG9uZW50LmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGRhdGEuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkRhdGEgPSBmYWN0b3J5KCkpO1xufSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgZG9tL2RhdGEuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgY29uc3QgZWxlbWVudE1hcCA9IG5ldyBNYXAoKTtcbiAgY29uc3QgZGF0YSA9IHtcbiAgICBzZXQoZWxlbWVudCwga2V5LCBpbnN0YW5jZSkge1xuICAgICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICBlbGVtZW50TWFwLnNldChlbGVtZW50LCBuZXcgTWFwKCkpO1xuICAgICAgfVxuICAgICAgY29uc3QgaW5zdGFuY2VNYXAgPSBlbGVtZW50TWFwLmdldChlbGVtZW50KTtcblxuICAgICAgLy8gbWFrZSBpdCBjbGVhciB3ZSBvbmx5IHdhbnQgb25lIGluc3RhbmNlIHBlciBlbGVtZW50XG4gICAgICAvLyBjYW4gYmUgcmVtb3ZlZCBsYXRlciB3aGVuIG11bHRpcGxlIGtleS9pbnN0YW5jZXMgYXJlIGZpbmUgdG8gYmUgdXNlZFxuICAgICAgaWYgKCFpbnN0YW5jZU1hcC5oYXMoa2V5KSAmJiBpbnN0YW5jZU1hcC5zaXplICE9PSAwKSB7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgIGNvbnNvbGUuZXJyb3IoYEJvb3RzdHJhcCBkb2Vzbid0IGFsbG93IG1vcmUgdGhhbiBvbmUgaW5zdGFuY2UgcGVyIGVsZW1lbnQuIEJvdW5kIGluc3RhbmNlOiAke0FycmF5LmZyb20oaW5zdGFuY2VNYXAua2V5cygpKVswXX0uYCk7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGluc3RhbmNlTWFwLnNldChrZXksIGluc3RhbmNlKTtcbiAgICB9LFxuICAgIGdldChlbGVtZW50LCBrZXkpIHtcbiAgICAgIGlmIChlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICByZXR1cm4gZWxlbWVudE1hcC5nZXQoZWxlbWVudCkuZ2V0KGtleSkgfHwgbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgcmVtb3ZlKGVsZW1lbnQsIGtleSkge1xuICAgICAgaWYgKCFlbGVtZW50TWFwLmhhcyhlbGVtZW50KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpbnN0YW5jZU1hcCA9IGVsZW1lbnRNYXAuZ2V0KGVsZW1lbnQpO1xuICAgICAgaW5zdGFuY2VNYXAuZGVsZXRlKGtleSk7XG5cbiAgICAgIC8vIGZyZWUgdXAgZWxlbWVudCByZWZlcmVuY2VzIGlmIHRoZXJlIGFyZSBubyBpbnN0YW5jZXMgbGVmdCBmb3IgYW4gZWxlbWVudFxuICAgICAgaWYgKGluc3RhbmNlTWFwLnNpemUgPT09IDApIHtcbiAgICAgICAgZWxlbWVudE1hcC5kZWxldGUoZWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHJldHVybiBkYXRhO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1kYXRhLmpzLm1hcFxuIiwiLyohXG4gICogQm9vdHN0cmFwIGV2ZW50LWhhbmRsZXIuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi91dGlsL2luZGV4LmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vdXRpbC9pbmRleCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5FdmVudEhhbmRsZXIgPSBmYWN0b3J5KGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCBkb20vZXZlbnQtaGFuZGxlci5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAvKipcbiAgICogQ29uc3RhbnRzXG4gICAqL1xuXG4gIGNvbnN0IG5hbWVzcGFjZVJlZ2V4ID0gL1teLl0qKD89XFwuLiopXFwufC4qLztcbiAgY29uc3Qgc3RyaXBOYW1lUmVnZXggPSAvXFwuLiovO1xuICBjb25zdCBzdHJpcFVpZFJlZ2V4ID0gLzo6XFxkKyQvO1xuICBjb25zdCBldmVudFJlZ2lzdHJ5ID0ge307IC8vIEV2ZW50cyBzdG9yYWdlXG4gIGxldCB1aWRFdmVudCA9IDE7XG4gIGNvbnN0IGN1c3RvbUV2ZW50cyA9IHtcbiAgICBtb3VzZWVudGVyOiAnbW91c2VvdmVyJyxcbiAgICBtb3VzZWxlYXZlOiAnbW91c2VvdXQnXG4gIH07XG4gIGNvbnN0IG5hdGl2ZUV2ZW50cyA9IG5ldyBTZXQoWydjbGljaycsICdkYmxjbGljaycsICdtb3VzZXVwJywgJ21vdXNlZG93bicsICdjb250ZXh0bWVudScsICdtb3VzZXdoZWVsJywgJ0RPTU1vdXNlU2Nyb2xsJywgJ21vdXNlb3ZlcicsICdtb3VzZW91dCcsICdtb3VzZW1vdmUnLCAnc2VsZWN0c3RhcnQnLCAnc2VsZWN0ZW5kJywgJ2tleWRvd24nLCAna2V5cHJlc3MnLCAna2V5dXAnLCAnb3JpZW50YXRpb25jaGFuZ2UnLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnLCAndG91Y2hjYW5jZWwnLCAncG9pbnRlcmRvd24nLCAncG9pbnRlcm1vdmUnLCAncG9pbnRlcnVwJywgJ3BvaW50ZXJsZWF2ZScsICdwb2ludGVyY2FuY2VsJywgJ2dlc3R1cmVzdGFydCcsICdnZXN0dXJlY2hhbmdlJywgJ2dlc3R1cmVlbmQnLCAnZm9jdXMnLCAnYmx1cicsICdjaGFuZ2UnLCAncmVzZXQnLCAnc2VsZWN0JywgJ3N1Ym1pdCcsICdmb2N1c2luJywgJ2ZvY3Vzb3V0JywgJ2xvYWQnLCAndW5sb2FkJywgJ2JlZm9yZXVubG9hZCcsICdyZXNpemUnLCAnbW92ZScsICdET01Db250ZW50TG9hZGVkJywgJ3JlYWR5c3RhdGVjaGFuZ2UnLCAnZXJyb3InLCAnYWJvcnQnLCAnc2Nyb2xsJ10pO1xuXG4gIC8qKlxuICAgKiBQcml2YXRlIG1ldGhvZHNcbiAgICovXG5cbiAgZnVuY3Rpb24gbWFrZUV2ZW50VWlkKGVsZW1lbnQsIHVpZCkge1xuICAgIHJldHVybiB1aWQgJiYgYCR7dWlkfTo6JHt1aWRFdmVudCsrfWAgfHwgZWxlbWVudC51aWRFdmVudCB8fCB1aWRFdmVudCsrO1xuICB9XG4gIGZ1bmN0aW9uIGdldEVsZW1lbnRFdmVudHMoZWxlbWVudCkge1xuICAgIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChlbGVtZW50KTtcbiAgICBlbGVtZW50LnVpZEV2ZW50ID0gdWlkO1xuICAgIGV2ZW50UmVnaXN0cnlbdWlkXSA9IGV2ZW50UmVnaXN0cnlbdWlkXSB8fCB7fTtcbiAgICByZXR1cm4gZXZlbnRSZWdpc3RyeVt1aWRdO1xuICB9XG4gIGZ1bmN0aW9uIGJvb3RzdHJhcEhhbmRsZXIoZWxlbWVudCwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAgaHlkcmF0ZU9iaihldmVudCwge1xuICAgICAgICBkZWxlZ2F0ZVRhcmdldDogZWxlbWVudFxuICAgICAgfSk7XG4gICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgRXZlbnRIYW5kbGVyLm9mZihlbGVtZW50LCBldmVudC50eXBlLCBmbik7XG4gICAgICB9XG4gICAgICByZXR1cm4gZm4uYXBwbHkoZWxlbWVudCwgW2V2ZW50XSk7XG4gICAgfTtcbiAgfVxuICBmdW5jdGlvbiBib290c3RyYXBEZWxlZ2F0aW9uSGFuZGxlcihlbGVtZW50LCBzZWxlY3RvciwgZm4pIHtcbiAgICByZXR1cm4gZnVuY3Rpb24gaGFuZGxlcihldmVudCkge1xuICAgICAgY29uc3QgZG9tRWxlbWVudHMgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpO1xuICAgICAgZm9yIChsZXQge1xuICAgICAgICB0YXJnZXRcbiAgICAgIH0gPSBldmVudDsgdGFyZ2V0ICYmIHRhcmdldCAhPT0gdGhpczsgdGFyZ2V0ID0gdGFyZ2V0LnBhcmVudE5vZGUpIHtcbiAgICAgICAgZm9yIChjb25zdCBkb21FbGVtZW50IG9mIGRvbUVsZW1lbnRzKSB7XG4gICAgICAgICAgaWYgKGRvbUVsZW1lbnQgIT09IHRhcmdldCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuICAgICAgICAgIGh5ZHJhdGVPYmooZXZlbnQsIHtcbiAgICAgICAgICAgIGRlbGVnYXRlVGFyZ2V0OiB0YXJnZXRcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBpZiAoaGFuZGxlci5vbmVPZmYpIHtcbiAgICAgICAgICAgIEV2ZW50SGFuZGxlci5vZmYoZWxlbWVudCwgZXZlbnQudHlwZSwgc2VsZWN0b3IsIGZuKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KHRhcmdldCwgW2V2ZW50XSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9O1xuICB9XG4gIGZ1bmN0aW9uIGZpbmRIYW5kbGVyKGV2ZW50cywgY2FsbGFibGUsIGRlbGVnYXRpb25TZWxlY3RvciA9IG51bGwpIHtcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhldmVudHMpLmZpbmQoZXZlbnQgPT4gZXZlbnQuY2FsbGFibGUgPT09IGNhbGxhYmxlICYmIGV2ZW50LmRlbGVnYXRpb25TZWxlY3RvciA9PT0gZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgfVxuICBmdW5jdGlvbiBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICBjb25zdCBpc0RlbGVnYXRlZCA9IHR5cGVvZiBoYW5kbGVyID09PSAnc3RyaW5nJztcbiAgICAvLyBUT0RPOiB0b29sdGlwIHBhc3NlcyBgZmFsc2VgIGluc3RlYWQgb2Ygc2VsZWN0b3IsIHNvIHdlIG5lZWQgdG8gY2hlY2tcbiAgICBjb25zdCBjYWxsYWJsZSA9IGlzRGVsZWdhdGVkID8gZGVsZWdhdGlvbkZ1bmN0aW9uIDogaGFuZGxlciB8fCBkZWxlZ2F0aW9uRnVuY3Rpb247XG4gICAgbGV0IHR5cGVFdmVudCA9IGdldFR5cGVFdmVudChvcmlnaW5hbFR5cGVFdmVudCk7XG4gICAgaWYgKCFuYXRpdmVFdmVudHMuaGFzKHR5cGVFdmVudCkpIHtcbiAgICAgIHR5cGVFdmVudCA9IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgIH1cbiAgICByZXR1cm4gW2lzRGVsZWdhdGVkLCBjYWxsYWJsZSwgdHlwZUV2ZW50XTtcbiAgfVxuICBmdW5jdGlvbiBhZGRIYW5kbGVyKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIG9uZU9mZikge1xuICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGxldCBbaXNEZWxlZ2F0ZWQsIGNhbGxhYmxlLCB0eXBlRXZlbnRdID0gbm9ybWFsaXplUGFyYW1ldGVycyhvcmlnaW5hbFR5cGVFdmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKTtcblxuICAgIC8vIGluIGNhc2Ugb2YgbW91c2VlbnRlciBvciBtb3VzZWxlYXZlIHdyYXAgdGhlIGhhbmRsZXIgd2l0aGluIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgZm9yIGl0cyBET00gcG9zaXRpb25cbiAgICAvLyB0aGlzIHByZXZlbnRzIHRoZSBoYW5kbGVyIGZyb20gYmVpbmcgZGlzcGF0Y2hlZCB0aGUgc2FtZSB3YXkgYXMgbW91c2VvdmVyIG9yIG1vdXNlb3V0IGRvZXNcbiAgICBpZiAob3JpZ2luYWxUeXBlRXZlbnQgaW4gY3VzdG9tRXZlbnRzKSB7XG4gICAgICBjb25zdCB3cmFwRnVuY3Rpb24gPSBmbiA9PiB7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICBpZiAoIWV2ZW50LnJlbGF0ZWRUYXJnZXQgfHwgZXZlbnQucmVsYXRlZFRhcmdldCAhPT0gZXZlbnQuZGVsZWdhdGVUYXJnZXQgJiYgIWV2ZW50LmRlbGVnYXRlVGFyZ2V0LmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZm4uY2FsbCh0aGlzLCBldmVudCk7XG4gICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgfTtcbiAgICAgIGNhbGxhYmxlID0gd3JhcEZ1bmN0aW9uKGNhbGxhYmxlKTtcbiAgICB9XG4gICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICBjb25zdCBoYW5kbGVycyA9IGV2ZW50c1t0eXBlRXZlbnRdIHx8IChldmVudHNbdHlwZUV2ZW50XSA9IHt9KTtcbiAgICBjb25zdCBwcmV2aW91c0Z1bmN0aW9uID0gZmluZEhhbmRsZXIoaGFuZGxlcnMsIGNhbGxhYmxlLCBpc0RlbGVnYXRlZCA/IGhhbmRsZXIgOiBudWxsKTtcbiAgICBpZiAocHJldmlvdXNGdW5jdGlvbikge1xuICAgICAgcHJldmlvdXNGdW5jdGlvbi5vbmVPZmYgPSBwcmV2aW91c0Z1bmN0aW9uLm9uZU9mZiAmJiBvbmVPZmY7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHVpZCA9IG1ha2VFdmVudFVpZChjYWxsYWJsZSwgb3JpZ2luYWxUeXBlRXZlbnQucmVwbGFjZShuYW1lc3BhY2VSZWdleCwgJycpKTtcbiAgICBjb25zdCBmbiA9IGlzRGVsZWdhdGVkID8gYm9vdHN0cmFwRGVsZWdhdGlvbkhhbmRsZXIoZWxlbWVudCwgaGFuZGxlciwgY2FsbGFibGUpIDogYm9vdHN0cmFwSGFuZGxlcihlbGVtZW50LCBjYWxsYWJsZSk7XG4gICAgZm4uZGVsZWdhdGlvblNlbGVjdG9yID0gaXNEZWxlZ2F0ZWQgPyBoYW5kbGVyIDogbnVsbDtcbiAgICBmbi5jYWxsYWJsZSA9IGNhbGxhYmxlO1xuICAgIGZuLm9uZU9mZiA9IG9uZU9mZjtcbiAgICBmbi51aWRFdmVudCA9IHVpZDtcbiAgICBoYW5kbGVyc1t1aWRdID0gZm47XG4gICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIGlzRGVsZWdhdGVkKTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpIHtcbiAgICBjb25zdCBmbiA9IGZpbmRIYW5kbGVyKGV2ZW50c1t0eXBlRXZlbnRdLCBoYW5kbGVyLCBkZWxlZ2F0aW9uU2VsZWN0b3IpO1xuICAgIGlmICghZm4pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGVFdmVudCwgZm4sIEJvb2xlYW4oZGVsZWdhdGlvblNlbGVjdG9yKSk7XG4gICAgZGVsZXRlIGV2ZW50c1t0eXBlRXZlbnRdW2ZuLnVpZEV2ZW50XTtcbiAgfVxuICBmdW5jdGlvbiByZW1vdmVOYW1lc3BhY2VkSGFuZGxlcnMoZWxlbWVudCwgZXZlbnRzLCB0eXBlRXZlbnQsIG5hbWVzcGFjZSkge1xuICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gICAgZm9yIChjb25zdCBbaGFuZGxlcktleSwgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgaWYgKGhhbmRsZXJLZXkuaW5jbHVkZXMobmFtZXNwYWNlKSkge1xuICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZnVuY3Rpb24gZ2V0VHlwZUV2ZW50KGV2ZW50KSB7XG4gICAgLy8gYWxsb3cgdG8gZ2V0IHRoZSBuYXRpdmUgZXZlbnRzIGZyb20gbmFtZXNwYWNlZCBldmVudHMgKCdjbGljay5icy5idXR0b24nIC0tPiAnY2xpY2snKVxuICAgIGV2ZW50ID0gZXZlbnQucmVwbGFjZShzdHJpcE5hbWVSZWdleCwgJycpO1xuICAgIHJldHVybiBjdXN0b21FdmVudHNbZXZlbnRdIHx8IGV2ZW50O1xuICB9XG4gIGNvbnN0IEV2ZW50SGFuZGxlciA9IHtcbiAgICBvbihlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIGZhbHNlKTtcbiAgICB9LFxuICAgIG9uZShlbGVtZW50LCBldmVudCwgaGFuZGxlciwgZGVsZWdhdGlvbkZ1bmN0aW9uKSB7XG4gICAgICBhZGRIYW5kbGVyKGVsZW1lbnQsIGV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24sIHRydWUpO1xuICAgIH0sXG4gICAgb2ZmKGVsZW1lbnQsIG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pIHtcbiAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxUeXBlRXZlbnQgIT09ICdzdHJpbmcnIHx8ICFlbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IFtpc0RlbGVnYXRlZCwgY2FsbGFibGUsIHR5cGVFdmVudF0gPSBub3JtYWxpemVQYXJhbWV0ZXJzKG9yaWdpbmFsVHlwZUV2ZW50LCBoYW5kbGVyLCBkZWxlZ2F0aW9uRnVuY3Rpb24pO1xuICAgICAgY29uc3QgaW5OYW1lc3BhY2UgPSB0eXBlRXZlbnQgIT09IG9yaWdpbmFsVHlwZUV2ZW50O1xuICAgICAgY29uc3QgZXZlbnRzID0gZ2V0RWxlbWVudEV2ZW50cyhlbGVtZW50KTtcbiAgICAgIGNvbnN0IHN0b3JlRWxlbWVudEV2ZW50ID0gZXZlbnRzW3R5cGVFdmVudF0gfHwge307XG4gICAgICBjb25zdCBpc05hbWVzcGFjZSA9IG9yaWdpbmFsVHlwZUV2ZW50LnN0YXJ0c1dpdGgoJy4nKTtcbiAgICAgIGlmICh0eXBlb2YgY2FsbGFibGUgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgIC8vIFNpbXBsZXN0IGNhc2U6IGhhbmRsZXIgaXMgcGFzc2VkLCByZW1vdmUgdGhhdCBsaXN0ZW5lciBPTkxZLlxuICAgICAgICBpZiAoIU9iamVjdC5rZXlzKHN0b3JlRWxlbWVudEV2ZW50KS5sZW5ndGgpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgcmVtb3ZlSGFuZGxlcihlbGVtZW50LCBldmVudHMsIHR5cGVFdmVudCwgY2FsbGFibGUsIGlzRGVsZWdhdGVkID8gaGFuZGxlciA6IG51bGwpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAoaXNOYW1lc3BhY2UpIHtcbiAgICAgICAgZm9yIChjb25zdCBlbGVtZW50RXZlbnQgb2YgT2JqZWN0LmtleXMoZXZlbnRzKSkge1xuICAgICAgICAgIHJlbW92ZU5hbWVzcGFjZWRIYW5kbGVycyhlbGVtZW50LCBldmVudHMsIGVsZW1lbnRFdmVudCwgb3JpZ2luYWxUeXBlRXZlbnQuc2xpY2UoMSkpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IFtrZXlIYW5kbGVycywgZXZlbnRdIG9mIE9iamVjdC5lbnRyaWVzKHN0b3JlRWxlbWVudEV2ZW50KSkge1xuICAgICAgICBjb25zdCBoYW5kbGVyS2V5ID0ga2V5SGFuZGxlcnMucmVwbGFjZShzdHJpcFVpZFJlZ2V4LCAnJyk7XG4gICAgICAgIGlmICghaW5OYW1lc3BhY2UgfHwgb3JpZ2luYWxUeXBlRXZlbnQuaW5jbHVkZXMoaGFuZGxlcktleSkpIHtcbiAgICAgICAgICByZW1vdmVIYW5kbGVyKGVsZW1lbnQsIGV2ZW50cywgdHlwZUV2ZW50LCBldmVudC5jYWxsYWJsZSwgZXZlbnQuZGVsZWdhdGlvblNlbGVjdG9yKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG4gICAgdHJpZ2dlcihlbGVtZW50LCBldmVudCwgYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBldmVudCAhPT0gJ3N0cmluZycgfHwgIWVsZW1lbnQpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCAkID0gaW5kZXhfanMuZ2V0alF1ZXJ5KCk7XG4gICAgICBjb25zdCB0eXBlRXZlbnQgPSBnZXRUeXBlRXZlbnQoZXZlbnQpO1xuICAgICAgY29uc3QgaW5OYW1lc3BhY2UgPSBldmVudCAhPT0gdHlwZUV2ZW50O1xuICAgICAgbGV0IGpRdWVyeUV2ZW50ID0gbnVsbDtcbiAgICAgIGxldCBidWJibGVzID0gdHJ1ZTtcbiAgICAgIGxldCBuYXRpdmVEaXNwYXRjaCA9IHRydWU7XG4gICAgICBsZXQgZGVmYXVsdFByZXZlbnRlZCA9IGZhbHNlO1xuICAgICAgaWYgKGluTmFtZXNwYWNlICYmICQpIHtcbiAgICAgICAgalF1ZXJ5RXZlbnQgPSAkLkV2ZW50KGV2ZW50LCBhcmdzKTtcbiAgICAgICAgJChlbGVtZW50KS50cmlnZ2VyKGpRdWVyeUV2ZW50KTtcbiAgICAgICAgYnViYmxlcyA9ICFqUXVlcnlFdmVudC5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgICBuYXRpdmVEaXNwYXRjaCA9ICFqUXVlcnlFdmVudC5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpO1xuICAgICAgICBkZWZhdWx0UHJldmVudGVkID0galF1ZXJ5RXZlbnQuaXNEZWZhdWx0UHJldmVudGVkKCk7XG4gICAgICB9XG4gICAgICBjb25zdCBldnQgPSBoeWRyYXRlT2JqKG5ldyBFdmVudChldmVudCwge1xuICAgICAgICBidWJibGVzLFxuICAgICAgICBjYW5jZWxhYmxlOiB0cnVlXG4gICAgICB9KSwgYXJncyk7XG4gICAgICBpZiAoZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICBldnQucHJldmVudERlZmF1bHQoKTtcbiAgICAgIH1cbiAgICAgIGlmIChuYXRpdmVEaXNwYXRjaCkge1xuICAgICAgICBlbGVtZW50LmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgICAgIH1cbiAgICAgIGlmIChldnQuZGVmYXVsdFByZXZlbnRlZCAmJiBqUXVlcnlFdmVudCkge1xuICAgICAgICBqUXVlcnlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGV2dDtcbiAgICB9XG4gIH07XG4gIGZ1bmN0aW9uIGh5ZHJhdGVPYmoob2JqLCBtZXRhID0ge30pIHtcbiAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhtZXRhKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgb2JqW2tleV0gPSB2YWx1ZTtcbiAgICAgIH0gY2F0Y2ggKF91bnVzZWQpIHtcbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwga2V5LCB7XG4gICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgICAgICAgIGdldCgpIHtcbiAgICAgICAgICAgIHJldHVybiB2YWx1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgcmV0dXJuIEV2ZW50SGFuZGxlcjtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZXZlbnQtaGFuZGxlci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBtYW5pcHVsYXRvci5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuTWFuaXB1bGF0b3IgPSBmYWN0b3J5KCkpO1xufSkodGhpcywgKGZ1bmN0aW9uICgpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgZG9tL21hbmlwdWxhdG9yLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhKHZhbHVlKSB7XG4gICAgaWYgKHZhbHVlID09PSAndHJ1ZScpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgaWYgKHZhbHVlID09PSBOdW1iZXIodmFsdWUpLnRvU3RyaW5nKCkpIHtcbiAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSAnbnVsbCcpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoZGVjb2RlVVJJQ29tcG9uZW50KHZhbHVlKSk7XG4gICAgfSBjYXRjaCAoX3VudXNlZCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbiAgfVxuICBmdW5jdGlvbiBub3JtYWxpemVEYXRhS2V5KGtleSkge1xuICAgIHJldHVybiBrZXkucmVwbGFjZSgvW0EtWl0vZywgY2hyID0+IGAtJHtjaHIudG9Mb3dlckNhc2UoKX1gKTtcbiAgfVxuICBjb25zdCBNYW5pcHVsYXRvciA9IHtcbiAgICBzZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIGtleSwgdmFsdWUpIHtcbiAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWAsIHZhbHVlKTtcbiAgICB9LFxuICAgIHJlbW92ZURhdGFBdHRyaWJ1dGUoZWxlbWVudCwga2V5KSB7XG4gICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShgZGF0YS1icy0ke25vcm1hbGl6ZURhdGFLZXkoa2V5KX1gKTtcbiAgICB9LFxuICAgIGdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIHtcbiAgICAgIGlmICghZWxlbWVudCkge1xuICAgICAgICByZXR1cm4ge307XG4gICAgICB9XG4gICAgICBjb25zdCBhdHRyaWJ1dGVzID0ge307XG4gICAgICBjb25zdCBic0tleXMgPSBPYmplY3Qua2V5cyhlbGVtZW50LmRhdGFzZXQpLmZpbHRlcihrZXkgPT4ga2V5LnN0YXJ0c1dpdGgoJ2JzJykgJiYgIWtleS5zdGFydHNXaXRoKCdic0NvbmZpZycpKTtcbiAgICAgIGZvciAoY29uc3Qga2V5IG9mIGJzS2V5cykge1xuICAgICAgICBsZXQgcHVyZUtleSA9IGtleS5yZXBsYWNlKC9eYnMvLCAnJyk7XG4gICAgICAgIHB1cmVLZXkgPSBwdXJlS2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsgcHVyZUtleS5zbGljZSgxLCBwdXJlS2V5Lmxlbmd0aCk7XG4gICAgICAgIGF0dHJpYnV0ZXNbcHVyZUtleV0gPSBub3JtYWxpemVEYXRhKGVsZW1lbnQuZGF0YXNldFtrZXldKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBhdHRyaWJ1dGVzO1xuICAgIH0sXG4gICAgZ2V0RGF0YUF0dHJpYnV0ZShlbGVtZW50LCBrZXkpIHtcbiAgICAgIHJldHVybiBub3JtYWxpemVEYXRhKGVsZW1lbnQuZ2V0QXR0cmlidXRlKGBkYXRhLWJzLSR7bm9ybWFsaXplRGF0YUtleShrZXkpfWApKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIE1hbmlwdWxhdG9yO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tYW5pcHVsYXRvci5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBzZWxlY3Rvci1lbmdpbmUuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi91dGlsL2luZGV4LmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vdXRpbC9pbmRleCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSA9IGZhY3RvcnkoZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIGRvbS9zZWxlY3Rvci1lbmdpbmUuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIGNvbnN0IGdldFNlbGVjdG9yID0gZWxlbWVudCA9PiB7XG4gICAgbGV0IHNlbGVjdG9yID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtYnMtdGFyZ2V0Jyk7XG4gICAgaWYgKCFzZWxlY3RvciB8fCBzZWxlY3RvciA9PT0gJyMnKSB7XG4gICAgICBsZXQgaHJlZkF0dHJpYnV0ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7XG5cbiAgICAgIC8vIFRoZSBvbmx5IHZhbGlkIGNvbnRlbnQgdGhhdCBjb3VsZCBkb3VibGUgYXMgYSBzZWxlY3RvciBhcmUgSURzIG9yIGNsYXNzZXMsXG4gICAgICAvLyBzbyBldmVyeXRoaW5nIHN0YXJ0aW5nIHdpdGggYCNgIG9yIGAuYC4gSWYgYSBcInJlYWxcIiBVUkwgaXMgdXNlZCBhcyB0aGUgc2VsZWN0b3IsXG4gICAgICAvLyBgZG9jdW1lbnQucXVlcnlTZWxlY3RvcmAgd2lsbCByaWdodGZ1bGx5IGNvbXBsYWluIGl0IGlzIGludmFsaWQuXG4gICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2lzc3Vlcy8zMjI3M1xuICAgICAgaWYgKCFocmVmQXR0cmlidXRlIHx8ICFocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnLicpKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgICAgfVxuXG4gICAgICAvLyBKdXN0IGluIGNhc2Ugc29tZSBDTVMgcHV0cyBvdXQgYSBmdWxsIFVSTCB3aXRoIHRoZSBhbmNob3IgYXBwZW5kZWRcbiAgICAgIGlmIChocmVmQXR0cmlidXRlLmluY2x1ZGVzKCcjJykgJiYgIWhyZWZBdHRyaWJ1dGUuc3RhcnRzV2l0aCgnIycpKSB7XG4gICAgICAgIGhyZWZBdHRyaWJ1dGUgPSBgIyR7aHJlZkF0dHJpYnV0ZS5zcGxpdCgnIycpWzFdfWA7XG4gICAgICB9XG4gICAgICBzZWxlY3RvciA9IGhyZWZBdHRyaWJ1dGUgJiYgaHJlZkF0dHJpYnV0ZSAhPT0gJyMnID8gaHJlZkF0dHJpYnV0ZS50cmltKCkgOiBudWxsO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0b3IgPyBzZWxlY3Rvci5zcGxpdCgnLCcpLm1hcChzZWwgPT4gaW5kZXhfanMucGFyc2VTZWxlY3RvcihzZWwpKS5qb2luKCcsJykgOiBudWxsO1xuICB9O1xuICBjb25zdCBTZWxlY3RvckVuZ2luZSA9IHtcbiAgICBmaW5kKHNlbGVjdG9yLCBlbGVtZW50ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSB7XG4gICAgICByZXR1cm4gW10uY29uY2F0KC4uLkVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3JBbGwuY2FsbChlbGVtZW50LCBzZWxlY3RvcikpO1xuICAgIH0sXG4gICAgZmluZE9uZShzZWxlY3RvciwgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkge1xuICAgICAgcmV0dXJuIEVsZW1lbnQucHJvdG90eXBlLnF1ZXJ5U2VsZWN0b3IuY2FsbChlbGVtZW50LCBzZWxlY3Rvcik7XG4gICAgfSxcbiAgICBjaGlsZHJlbihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgcmV0dXJuIFtdLmNvbmNhdCguLi5lbGVtZW50LmNoaWxkcmVuKS5maWx0ZXIoY2hpbGQgPT4gY2hpbGQubWF0Y2hlcyhzZWxlY3RvcikpO1xuICAgIH0sXG4gICAgcGFyZW50cyhlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgY29uc3QgcGFyZW50cyA9IFtdO1xuICAgICAgbGV0IGFuY2VzdG9yID0gZWxlbWVudC5wYXJlbnROb2RlLmNsb3Nlc3Qoc2VsZWN0b3IpO1xuICAgICAgd2hpbGUgKGFuY2VzdG9yKSB7XG4gICAgICAgIHBhcmVudHMucHVzaChhbmNlc3Rvcik7XG4gICAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IucGFyZW50Tm9kZS5jbG9zZXN0KHNlbGVjdG9yKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBwYXJlbnRzO1xuICAgIH0sXG4gICAgcHJldihlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgbGV0IHByZXZpb3VzID0gZWxlbWVudC5wcmV2aW91c0VsZW1lbnRTaWJsaW5nO1xuICAgICAgd2hpbGUgKHByZXZpb3VzKSB7XG4gICAgICAgIGlmIChwcmV2aW91cy5tYXRjaGVzKHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBbcHJldmlvdXNdO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzID0gcHJldmlvdXMucHJldmlvdXNFbGVtZW50U2libGluZztcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9LFxuICAgIC8vIFRPRE86IHRoaXMgaXMgbm93IHVudXNlZDsgcmVtb3ZlIGxhdGVyIGFsb25nIHdpdGggcHJldigpXG4gICAgbmV4dChlbGVtZW50LCBzZWxlY3Rvcikge1xuICAgICAgbGV0IG5leHQgPSBlbGVtZW50Lm5leHRFbGVtZW50U2libGluZztcbiAgICAgIHdoaWxlIChuZXh0KSB7XG4gICAgICAgIGlmIChuZXh0Lm1hdGNoZXMoc2VsZWN0b3IpKSB7XG4gICAgICAgICAgcmV0dXJuIFtuZXh0XTtcbiAgICAgICAgfVxuICAgICAgICBuZXh0ID0gbmV4dC5uZXh0RWxlbWVudFNpYmxpbmc7XG4gICAgICB9XG4gICAgICByZXR1cm4gW107XG4gICAgfSxcbiAgICBmb2N1c2FibGVDaGlsZHJlbihlbGVtZW50KSB7XG4gICAgICBjb25zdCBmb2N1c2FibGVzID0gWydhJywgJ2J1dHRvbicsICdpbnB1dCcsICd0ZXh0YXJlYScsICdzZWxlY3QnLCAnZGV0YWlscycsICdbdGFiaW5kZXhdJywgJ1tjb250ZW50ZWRpdGFibGU9XCJ0cnVlXCJdJ10ubWFwKHNlbGVjdG9yID0+IGAke3NlbGVjdG9yfTpub3QoW3RhYmluZGV4Xj1cIi1cIl0pYCkuam9pbignLCcpO1xuICAgICAgcmV0dXJuIHRoaXMuZmluZChmb2N1c2FibGVzLCBlbGVtZW50KS5maWx0ZXIoZWwgPT4gIWluZGV4X2pzLmlzRGlzYWJsZWQoZWwpICYmIGluZGV4X2pzLmlzVmlzaWJsZShlbCkpO1xuICAgIH0sXG4gICAgZ2V0U2VsZWN0b3JGcm9tRWxlbWVudChlbGVtZW50KSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgaWYgKHNlbGVjdG9yKSB7XG4gICAgICAgIHJldHVybiBTZWxlY3RvckVuZ2luZS5maW5kT25lKHNlbGVjdG9yKSA/IHNlbGVjdG9yIDogbnVsbDtcbiAgICAgIH1cbiAgICAgIHJldHVybiBudWxsO1xuICAgIH0sXG4gICAgZ2V0RWxlbWVudEZyb21TZWxlY3RvcihlbGVtZW50KSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgcmV0dXJuIHNlbGVjdG9yID8gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShzZWxlY3RvcikgOiBudWxsO1xuICAgIH0sXG4gICAgZ2V0TXVsdGlwbGVFbGVtZW50c0Zyb21TZWxlY3RvcihlbGVtZW50KSB7XG4gICAgICBjb25zdCBzZWxlY3RvciA9IGdldFNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgcmV0dXJuIHNlbGVjdG9yID8gU2VsZWN0b3JFbmdpbmUuZmluZChzZWxlY3RvcikgOiBbXTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIFNlbGVjdG9yRW5naW5lO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1zZWxlY3Rvci1lbmdpbmUuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgbW9kYWwuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuL2Jhc2UtY29tcG9uZW50LmpzJyksIHJlcXVpcmUoJy4vZG9tL2V2ZW50LWhhbmRsZXIuanMnKSwgcmVxdWlyZSgnLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9iYWNrZHJvcC5qcycpLCByZXF1aXJlKCcuL3V0aWwvY29tcG9uZW50LWZ1bmN0aW9ucy5qcycpLCByZXF1aXJlKCcuL3V0aWwvZm9jdXN0cmFwLmpzJyksIHJlcXVpcmUoJy4vdXRpbC9pbmRleC5qcycpLCByZXF1aXJlKCcuL3V0aWwvc2Nyb2xsYmFyLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi9iYXNlLWNvbXBvbmVudCcsICcuL2RvbS9ldmVudC1oYW5kbGVyJywgJy4vZG9tL3NlbGVjdG9yLWVuZ2luZScsICcuL3V0aWwvYmFja2Ryb3AnLCAnLi91dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMnLCAnLi91dGlsL2ZvY3VzdHJhcCcsICcuL3V0aWwvaW5kZXgnLCAnLi91dGlsL3Njcm9sbGJhciddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Nb2RhbCA9IGZhY3RvcnkoZ2xvYmFsLkJhc2VDb21wb25lbnQsIGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkJhY2tkcm9wLCBnbG9iYWwuQ29tcG9uZW50RnVuY3Rpb25zLCBnbG9iYWwuRm9jdXN0cmFwLCBnbG9iYWwuSW5kZXgsIGdsb2JhbC5TY3JvbGxiYXIpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoQmFzZUNvbXBvbmVudCwgRXZlbnRIYW5kbGVyLCBTZWxlY3RvckVuZ2luZSwgQmFja2Ryb3AsIGNvbXBvbmVudEZ1bmN0aW9uc19qcywgRm9jdXNUcmFwLCBpbmRleF9qcywgU2Nyb2xsQmFySGVscGVyKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIG1vZGFsLmpzXG4gICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKi9cblxuXG4gIC8qKlxuICAgKiBDb25zdGFudHNcbiAgICovXG5cbiAgY29uc3QgTkFNRSA9ICdtb2RhbCc7XG4gIGNvbnN0IERBVEFfS0VZID0gJ2JzLm1vZGFsJztcbiAgY29uc3QgRVZFTlRfS0VZID0gYC4ke0RBVEFfS0VZfWA7XG4gIGNvbnN0IERBVEFfQVBJX0tFWSA9ICcuZGF0YS1hcGknO1xuICBjb25zdCBFU0NBUEVfS0VZID0gJ0VzY2FwZSc7XG4gIGNvbnN0IEVWRU5UX0hJREUgPSBgaGlkZSR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IEVWRU5UX0hJREVfUFJFVkVOVEVEID0gYGhpZGVQcmV2ZW50ZWQke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9ISURERU4gPSBgaGlkZGVuJHtFVkVOVF9LRVl9YDtcbiAgY29uc3QgRVZFTlRfU0hPVyA9IGBzaG93JHtFVkVOVF9LRVl9YDtcbiAgY29uc3QgRVZFTlRfU0hPV04gPSBgc2hvd24ke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9SRVNJWkUgPSBgcmVzaXplJHtFVkVOVF9LRVl9YDtcbiAgY29uc3QgRVZFTlRfQ0xJQ0tfRElTTUlTUyA9IGBjbGljay5kaXNtaXNzJHtFVkVOVF9LRVl9YDtcbiAgY29uc3QgRVZFTlRfTU9VU0VET1dOX0RJU01JU1MgPSBgbW91c2Vkb3duLmRpc21pc3Mke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9LRVlET1dOX0RJU01JU1MgPSBga2V5ZG93bi5kaXNtaXNzJHtFVkVOVF9LRVl9YDtcbiAgY29uc3QgRVZFTlRfQ0xJQ0tfREFUQV9BUEkgPSBgY2xpY2ske0VWRU5UX0tFWX0ke0RBVEFfQVBJX0tFWX1gO1xuICBjb25zdCBDTEFTU19OQU1FX09QRU4gPSAnbW9kYWwtb3Blbic7XG4gIGNvbnN0IENMQVNTX05BTUVfRkFERSA9ICdmYWRlJztcbiAgY29uc3QgQ0xBU1NfTkFNRV9TSE9XID0gJ3Nob3cnO1xuICBjb25zdCBDTEFTU19OQU1FX1NUQVRJQyA9ICdtb2RhbC1zdGF0aWMnO1xuICBjb25zdCBPUEVOX1NFTEVDVE9SID0gJy5tb2RhbC5zaG93JztcbiAgY29uc3QgU0VMRUNUT1JfRElBTE9HID0gJy5tb2RhbC1kaWFsb2cnO1xuICBjb25zdCBTRUxFQ1RPUl9NT0RBTF9CT0RZID0gJy5tb2RhbC1ib2R5JztcbiAgY29uc3QgU0VMRUNUT1JfREFUQV9UT0dHTEUgPSAnW2RhdGEtYnMtdG9nZ2xlPVwibW9kYWxcIl0nO1xuICBjb25zdCBEZWZhdWx0ID0ge1xuICAgIGJhY2tkcm9wOiB0cnVlLFxuICAgIGZvY3VzOiB0cnVlLFxuICAgIGtleWJvYXJkOiB0cnVlXG4gIH07XG4gIGNvbnN0IERlZmF1bHRUeXBlID0ge1xuICAgIGJhY2tkcm9wOiAnKGJvb2xlYW58c3RyaW5nKScsXG4gICAgZm9jdXM6ICdib29sZWFuJyxcbiAgICBrZXlib2FyZDogJ2Jvb2xlYW4nXG4gIH07XG5cbiAgLyoqXG4gICAqIENsYXNzIGRlZmluaXRpb25cbiAgICovXG5cbiAgY2xhc3MgTW9kYWwgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IHtcbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBjb25maWcpIHtcbiAgICAgIHN1cGVyKGVsZW1lbnQsIGNvbmZpZyk7XG4gICAgICB0aGlzLl9kaWFsb2cgPSBTZWxlY3RvckVuZ2luZS5maW5kT25lKFNFTEVDVE9SX0RJQUxPRywgdGhpcy5fZWxlbWVudCk7XG4gICAgICB0aGlzLl9iYWNrZHJvcCA9IHRoaXMuX2luaXRpYWxpemVCYWNrRHJvcCgpO1xuICAgICAgdGhpcy5fZm9jdXN0cmFwID0gdGhpcy5faW5pdGlhbGl6ZUZvY3VzVHJhcCgpO1xuICAgICAgdGhpcy5faXNTaG93biA9IGZhbHNlO1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICB0aGlzLl9zY3JvbGxCYXIgPSBuZXcgU2Nyb2xsQmFySGVscGVyKCk7XG4gICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVycygpO1xuICAgIH1cblxuICAgIC8vIEdldHRlcnNcbiAgICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdDtcbiAgICB9XG4gICAgc3RhdGljIGdldCBEZWZhdWx0VHlwZSgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0VHlwZTtcbiAgICB9XG4gICAgc3RhdGljIGdldCBOQU1FKCkge1xuICAgICAgcmV0dXJuIE5BTUU7XG4gICAgfVxuXG4gICAgLy8gUHVibGljXG4gICAgdG9nZ2xlKHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLl9pc1Nob3duID8gdGhpcy5oaWRlKCkgOiB0aGlzLnNob3cocmVsYXRlZFRhcmdldCk7XG4gICAgfVxuICAgIHNob3cocmVsYXRlZFRhcmdldCkge1xuICAgICAgaWYgKHRoaXMuX2lzU2hvd24gfHwgdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNob3dFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1csIHtcbiAgICAgICAgcmVsYXRlZFRhcmdldFxuICAgICAgfSk7XG4gICAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5faXNTaG93biA9IHRydWU7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSB0cnVlO1xuICAgICAgdGhpcy5fc2Nyb2xsQmFyLmhpZGUoKTtcbiAgICAgIGRvY3VtZW50LmJvZHkuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX09QRU4pO1xuICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgICB0aGlzLl9iYWNrZHJvcC5zaG93KCgpID0+IHRoaXMuX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpKTtcbiAgICB9XG4gICAgaGlkZSgpIHtcbiAgICAgIGlmICghdGhpcy5faXNTaG93biB8fCB0aGlzLl9pc1RyYW5zaXRpb25pbmcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgaGlkZUV2ZW50ID0gRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElERSk7XG4gICAgICBpZiAoaGlkZUV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5faXNTaG93biA9IGZhbHNlO1xuICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gdHJ1ZTtcbiAgICAgIHRoaXMuX2ZvY3VzdHJhcC5kZWFjdGl2YXRlKCk7XG4gICAgICB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKTtcbiAgICAgIHRoaXMuX3F1ZXVlQ2FsbGJhY2soKCkgPT4gdGhpcy5faGlkZU1vZGFsKCksIHRoaXMuX2VsZW1lbnQsIHRoaXMuX2lzQW5pbWF0ZWQoKSk7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKHdpbmRvdywgRVZFTlRfS0VZKTtcbiAgICAgIEV2ZW50SGFuZGxlci5vZmYodGhpcy5fZGlhbG9nLCBFVkVOVF9LRVkpO1xuICAgICAgdGhpcy5fYmFja2Ryb3AuZGlzcG9zZSgpO1xuICAgICAgdGhpcy5fZm9jdXN0cmFwLmRlYWN0aXZhdGUoKTtcbiAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgaGFuZGxlVXBkYXRlKCkge1xuICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIF9pbml0aWFsaXplQmFja0Ryb3AoKSB7XG4gICAgICByZXR1cm4gbmV3IEJhY2tkcm9wKHtcbiAgICAgICAgaXNWaXNpYmxlOiBCb29sZWFuKHRoaXMuX2NvbmZpZy5iYWNrZHJvcCksXG4gICAgICAgIC8vICdzdGF0aWMnIG9wdGlvbiB3aWxsIGJlIHRyYW5zbGF0ZWQgdG8gdHJ1ZSwgYW5kIGJvb2xlYW5zIHdpbGwga2VlcCB0aGVpciB2YWx1ZSxcbiAgICAgICAgaXNBbmltYXRlZDogdGhpcy5faXNBbmltYXRlZCgpXG4gICAgICB9KTtcbiAgICB9XG4gICAgX2luaXRpYWxpemVGb2N1c1RyYXAoKSB7XG4gICAgICByZXR1cm4gbmV3IEZvY3VzVHJhcCh7XG4gICAgICAgIHRyYXBFbGVtZW50OiB0aGlzLl9lbGVtZW50XG4gICAgICB9KTtcbiAgICB9XG4gICAgX3Nob3dFbGVtZW50KHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIC8vIHRyeSB0byBhcHBlbmQgZHluYW1pYyBtb2RhbFxuICAgICAgaWYgKCFkb2N1bWVudC5ib2R5LmNvbnRhaW5zKHRoaXMuX2VsZW1lbnQpKSB7XG4gICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kKHRoaXMuX2VsZW1lbnQpO1xuICAgICAgfVxuICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnLCB0cnVlKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdyb2xlJywgJ2RpYWxvZycpO1xuICAgICAgdGhpcy5fZWxlbWVudC5zY3JvbGxUb3AgPSAwO1xuICAgICAgY29uc3QgbW9kYWxCb2R5ID0gU2VsZWN0b3JFbmdpbmUuZmluZE9uZShTRUxFQ1RPUl9NT0RBTF9CT0RZLCB0aGlzLl9kaWFsb2cpO1xuICAgICAgaWYgKG1vZGFsQm9keSkge1xuICAgICAgICBtb2RhbEJvZHkuc2Nyb2xsVG9wID0gMDtcbiAgICAgIH1cbiAgICAgIGluZGV4X2pzLnJlZmxvdyh0aGlzLl9lbGVtZW50KTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpO1xuICAgICAgY29uc3QgdHJhbnNpdGlvbkNvbXBsZXRlID0gKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmZvY3VzKSB7XG4gICAgICAgICAgdGhpcy5fZm9jdXN0cmFwLmFjdGl2YXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5faXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG4gICAgICAgIEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX1NIT1dOLCB7XG4gICAgICAgICAgcmVsYXRlZFRhcmdldFxuICAgICAgICB9KTtcbiAgICAgIH07XG4gICAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKHRyYW5zaXRpb25Db21wbGV0ZSwgdGhpcy5fZGlhbG9nLCB0aGlzLl9pc0FuaW1hdGVkKCkpO1xuICAgIH1cbiAgICBfYWRkRXZlbnRMaXN0ZW5lcnMoKSB7XG4gICAgICBFdmVudEhhbmRsZXIub24odGhpcy5fZWxlbWVudCwgRVZFTlRfS0VZRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICAgIGlmIChldmVudC5rZXkgIT09IEVTQ0FQRV9LRVkpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5rZXlib2FyZCkge1xuICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgICB9KTtcbiAgICAgIEV2ZW50SGFuZGxlci5vbih3aW5kb3csIEVWRU5UX1JFU0laRSwgKCkgPT4ge1xuICAgICAgICBpZiAodGhpcy5faXNTaG93biAmJiAhdGhpcy5faXNUcmFuc2l0aW9uaW5nKSB7XG4gICAgICAgICAgdGhpcy5fYWRqdXN0RGlhbG9nKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgICAgRXZlbnRIYW5kbGVyLm9uKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTl9ESVNNSVNTLCBldmVudCA9PiB7XG4gICAgICAgIC8vIGEgYmFkIHRyaWNrIHRvIHNlZ3JlZ2F0ZSBjbGlja3MgdGhhdCBtYXkgc3RhcnQgaW5zaWRlIGRpYWxvZyBidXQgZW5kIG91dHNpZGUsIGFuZCBhdm9pZCBsaXN0ZW4gdG8gc2Nyb2xsYmFyIGNsaWNrc1xuICAgICAgICBFdmVudEhhbmRsZXIub25lKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0NMSUNLX0RJU01JU1MsIGV2ZW50MiA9PiB7XG4gICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQgIT09IGV2ZW50LnRhcmdldCB8fCB0aGlzLl9lbGVtZW50ICE9PSBldmVudDIudGFyZ2V0KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3AgPT09ICdzdGF0aWMnKSB7XG4gICAgICAgICAgICB0aGlzLl90cmlnZ2VyQmFja2Ryb3BUcmFuc2l0aW9uKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmICh0aGlzLl9jb25maWcuYmFja2Ryb3ApIHtcbiAgICAgICAgICAgIHRoaXMuaGlkZSgpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgX2hpZGVNb2RhbCgpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgICAgIHRoaXMuX2VsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsIHRydWUpO1xuICAgICAgdGhpcy5fZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtbW9kYWwnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdyb2xlJyk7XG4gICAgICB0aGlzLl9pc1RyYW5zaXRpb25pbmcgPSBmYWxzZTtcbiAgICAgIHRoaXMuX2JhY2tkcm9wLmhpZGUoKCkgPT4ge1xuICAgICAgICBkb2N1bWVudC5ib2R5LmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9PUEVOKTtcbiAgICAgICAgdGhpcy5fcmVzZXRBZGp1c3RtZW50cygpO1xuICAgICAgICB0aGlzLl9zY3JvbGxCYXIucmVzZXQoKTtcbiAgICAgICAgRXZlbnRIYW5kbGVyLnRyaWdnZXIodGhpcy5fZWxlbWVudCwgRVZFTlRfSElEREVOKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICBfaXNBbmltYXRlZCgpIHtcbiAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX0ZBREUpO1xuICAgIH1cbiAgICBfdHJpZ2dlckJhY2tkcm9wVHJhbnNpdGlvbigpIHtcbiAgICAgIGNvbnN0IGhpZGVFdmVudCA9IEV2ZW50SGFuZGxlci50cmlnZ2VyKHRoaXMuX2VsZW1lbnQsIEVWRU5UX0hJREVfUFJFVkVOVEVEKTtcbiAgICAgIGlmIChoaWRlRXZlbnQuZGVmYXVsdFByZXZlbnRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBpc01vZGFsT3ZlcmZsb3dpbmcgPSB0aGlzLl9lbGVtZW50LnNjcm9sbEhlaWdodCA+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQ7XG4gICAgICBjb25zdCBpbml0aWFsT3ZlcmZsb3dZID0gdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1k7XG4gICAgICAvLyByZXR1cm4gaWYgdGhlIGZvbGxvd2luZyBiYWNrZ3JvdW5kIHRyYW5zaXRpb24gaGFzbid0IHlldCBjb21wbGV0ZWRcbiAgICAgIGlmIChpbml0aWFsT3ZlcmZsb3dZID09PSAnaGlkZGVuJyB8fCB0aGlzLl9lbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhDTEFTU19OQU1FX1NUQVRJQykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgaWYgKCFpc01vZGFsT3ZlcmZsb3dpbmcpIHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSAnaGlkZGVuJztcbiAgICAgIH1cbiAgICAgIHRoaXMuX2VsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NUQVRJQyk7XG4gICAgICB0aGlzLl9xdWV1ZUNhbGxiYWNrKCgpID0+IHtcbiAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKENMQVNTX05BTUVfU1RBVElDKTtcbiAgICAgICAgdGhpcy5fcXVldWVDYWxsYmFjaygoKSA9PiB7XG4gICAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZS5vdmVyZmxvd1kgPSBpbml0aWFsT3ZlcmZsb3dZO1xuICAgICAgICB9LCB0aGlzLl9kaWFsb2cpO1xuICAgICAgfSwgdGhpcy5fZGlhbG9nKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuZm9jdXMoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gaGFuZGxlIG92ZXJmbG93aW5nIG1vZGFsc1xuICAgICAqL1xuXG4gICAgX2FkanVzdERpYWxvZygpIHtcbiAgICAgIGNvbnN0IGlzTW9kYWxPdmVyZmxvd2luZyA9IHRoaXMuX2VsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgIGNvbnN0IHNjcm9sbGJhcldpZHRoID0gdGhpcy5fc2Nyb2xsQmFyLmdldFdpZHRoKCk7XG4gICAgICBjb25zdCBpc0JvZHlPdmVyZmxvd2luZyA9IHNjcm9sbGJhcldpZHRoID4gMDtcbiAgICAgIGlmIChpc0JvZHlPdmVyZmxvd2luZyAmJiAhaXNNb2RhbE92ZXJmbG93aW5nKSB7XG4gICAgICAgIGNvbnN0IHByb3BlcnR5ID0gaW5kZXhfanMuaXNSVEwoKSA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0JztcbiAgICAgICAgdGhpcy5fZWxlbWVudC5zdHlsZVtwcm9wZXJ0eV0gPSBgJHtzY3JvbGxiYXJXaWR0aH1weGA7XG4gICAgICB9XG4gICAgICBpZiAoIWlzQm9keU92ZXJmbG93aW5nICYmIGlzTW9kYWxPdmVyZmxvd2luZykge1xuICAgICAgICBjb25zdCBwcm9wZXJ0eSA9IGluZGV4X2pzLmlzUlRMKCkgPyAncGFkZGluZ1JpZ2h0JyA6ICdwYWRkaW5nTGVmdCc7XG4gICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVbcHJvcGVydHldID0gYCR7c2Nyb2xsYmFyV2lkdGh9cHhgO1xuICAgICAgfVxuICAgIH1cbiAgICBfcmVzZXRBZGp1c3RtZW50cygpIHtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ0xlZnQgPSAnJztcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUucGFkZGluZ1JpZ2h0ID0gJyc7XG4gICAgfVxuXG4gICAgLy8gU3RhdGljXG4gICAgc3RhdGljIGpRdWVyeUludGVyZmFjZShjb25maWcsIHJlbGF0ZWRUYXJnZXQpIHtcbiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0aGlzLCBjb25maWcpO1xuICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHR5cGVvZiBkYXRhW2NvbmZpZ10gPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihgTm8gbWV0aG9kIG5hbWVkIFwiJHtjb25maWd9XCJgKTtcbiAgICAgICAgfVxuICAgICAgICBkYXRhW2NvbmZpZ10ocmVsYXRlZFRhcmdldCk7XG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRGF0YSBBUEkgaW1wbGVtZW50YXRpb25cbiAgICovXG5cbiAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9DTElDS19EQVRBX0FQSSwgU0VMRUNUT1JfREFUQV9UT0dHTEUsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGNvbnN0IHRhcmdldCA9IFNlbGVjdG9yRW5naW5lLmdldEVsZW1lbnRGcm9tU2VsZWN0b3IodGhpcyk7XG4gICAgaWYgKFsnQScsICdBUkVBJ10uaW5jbHVkZXModGhpcy50YWdOYW1lKSkge1xuICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgRXZlbnRIYW5kbGVyLm9uZSh0YXJnZXQsIEVWRU5UX1NIT1csIHNob3dFdmVudCA9PiB7XG4gICAgICBpZiAoc2hvd0V2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHtcbiAgICAgICAgLy8gb25seSByZWdpc3RlciBmb2N1cyByZXN0b3JlciBpZiBtb2RhbCB3aWxsIGFjdHVhbGx5IGdldCBzaG93blxuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBFdmVudEhhbmRsZXIub25lKHRhcmdldCwgRVZFTlRfSElEREVOLCAoKSA9PiB7XG4gICAgICAgIGlmIChpbmRleF9qcy5pc1Zpc2libGUodGhpcykpIHtcbiAgICAgICAgICB0aGlzLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgLy8gYXZvaWQgY29uZmxpY3Qgd2hlbiBjbGlja2luZyBtb2RhbCB0b2dnbGVyIHdoaWxlIGFub3RoZXIgb25lIGlzIG9wZW5cbiAgICBjb25zdCBhbHJlYWR5T3BlbiA9IFNlbGVjdG9yRW5naW5lLmZpbmRPbmUoT1BFTl9TRUxFQ1RPUik7XG4gICAgaWYgKGFscmVhZHlPcGVuKSB7XG4gICAgICBNb2RhbC5nZXRJbnN0YW5jZShhbHJlYWR5T3BlbikuaGlkZSgpO1xuICAgIH1cbiAgICBjb25zdCBkYXRhID0gTW9kYWwuZ2V0T3JDcmVhdGVJbnN0YW5jZSh0YXJnZXQpO1xuICAgIGRhdGEudG9nZ2xlKHRoaXMpO1xuICB9KTtcbiAgY29tcG9uZW50RnVuY3Rpb25zX2pzLmVuYWJsZURpc21pc3NUcmlnZ2VyKE1vZGFsKTtcblxuICAvKipcbiAgICogalF1ZXJ5XG4gICAqL1xuXG4gIGluZGV4X2pzLmRlZmluZUpRdWVyeVBsdWdpbihNb2RhbCk7XG5cbiAgcmV0dXJuIE1vZGFsO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1tb2RhbC5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBiYWNrZHJvcC5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KHJlcXVpcmUoJy4uL2RvbS9ldmVudC1oYW5kbGVyLmpzJyksIHJlcXVpcmUoJy4vY29uZmlnLmpzJyksIHJlcXVpcmUoJy4vaW5kZXguanMnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9kb20vZXZlbnQtaGFuZGxlcicsICcuL2NvbmZpZycsICcuL2luZGV4J10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZ2xvYmFsLkJhY2tkcm9wID0gZmFjdG9yeShnbG9iYWwuRXZlbnRIYW5kbGVyLCBnbG9iYWwuQ29uZmlnLCBnbG9iYWwuSW5kZXgpKTtcbn0pKHRoaXMsIChmdW5jdGlvbiAoRXZlbnRIYW5kbGVyLCBDb25maWcsIGluZGV4X2pzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIHV0aWwvYmFja2Ryb3AuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBOQU1FID0gJ2JhY2tkcm9wJztcbiAgY29uc3QgQ0xBU1NfTkFNRV9GQURFID0gJ2ZhZGUnO1xuICBjb25zdCBDTEFTU19OQU1FX1NIT1cgPSAnc2hvdyc7XG4gIGNvbnN0IEVWRU5UX01PVVNFRE9XTiA9IGBtb3VzZWRvd24uYnMuJHtOQU1FfWA7XG4gIGNvbnN0IERlZmF1bHQgPSB7XG4gICAgY2xhc3NOYW1lOiAnbW9kYWwtYmFja2Ryb3AnLFxuICAgIGNsaWNrQ2FsbGJhY2s6IG51bGwsXG4gICAgaXNBbmltYXRlZDogZmFsc2UsXG4gICAgaXNWaXNpYmxlOiB0cnVlLFxuICAgIC8vIGlmIGZhbHNlLCB3ZSB1c2UgdGhlIGJhY2tkcm9wIGhlbHBlciB3aXRob3V0IGFkZGluZyBhbnkgZWxlbWVudCB0byB0aGUgZG9tXG4gICAgcm9vdEVsZW1lbnQ6ICdib2R5JyAvLyBnaXZlIHRoZSBjaG9pY2UgdG8gcGxhY2UgYmFja2Ryb3AgdW5kZXIgZGlmZmVyZW50IGVsZW1lbnRzXG4gIH07XG4gIGNvbnN0IERlZmF1bHRUeXBlID0ge1xuICAgIGNsYXNzTmFtZTogJ3N0cmluZycsXG4gICAgY2xpY2tDYWxsYmFjazogJyhmdW5jdGlvbnxudWxsKScsXG4gICAgaXNBbmltYXRlZDogJ2Jvb2xlYW4nLFxuICAgIGlzVmlzaWJsZTogJ2Jvb2xlYW4nLFxuICAgIHJvb3RFbGVtZW50OiAnKGVsZW1lbnR8c3RyaW5nKSdcbiAgfTtcblxuICAvKipcbiAgICogQ2xhc3MgZGVmaW5pdGlvblxuICAgKi9cblxuICBjbGFzcyBCYWNrZHJvcCBleHRlbmRzIENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9pc0FwcGVuZGVkID0gZmFsc2U7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBHZXR0ZXJzXG4gICAgc3RhdGljIGdldCBEZWZhdWx0KCkge1xuICAgICAgcmV0dXJuIERlZmF1bHQ7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgICByZXR1cm4gRGVmYXVsdFR5cGU7XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICAgIHJldHVybiBOQU1FO1xuICAgIH1cblxuICAgIC8vIFB1YmxpY1xuICAgIHNob3coY2FsbGJhY2spIHtcbiAgICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgICBpbmRleF9qcy5leGVjdXRlKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fYXBwZW5kKCk7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0RWxlbWVudCgpO1xuICAgICAgaWYgKHRoaXMuX2NvbmZpZy5pc0FuaW1hdGVkKSB7XG4gICAgICAgIGluZGV4X2pzLnJlZmxvdyhlbGVtZW50KTtcbiAgICAgIH1cbiAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZChDTEFTU19OQU1FX1NIT1cpO1xuICAgICAgdGhpcy5fZW11bGF0ZUFuaW1hdGlvbigoKSA9PiB7XG4gICAgICAgIGluZGV4X2pzLmV4ZWN1dGUoY2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgfVxuICAgIGhpZGUoY2FsbGJhY2spIHtcbiAgICAgIGlmICghdGhpcy5fY29uZmlnLmlzVmlzaWJsZSkge1xuICAgICAgICBpbmRleF9qcy5leGVjdXRlKGNhbGxiYWNrKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fZ2V0RWxlbWVudCgpLmNsYXNzTGlzdC5yZW1vdmUoQ0xBU1NfTkFNRV9TSE9XKTtcbiAgICAgIHRoaXMuX2VtdWxhdGVBbmltYXRpb24oKCkgPT4ge1xuICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgaW5kZXhfanMuZXhlY3V0ZShjYWxsYmFjayk7XG4gICAgICB9KTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgIGlmICghdGhpcy5faXNBcHBlbmRlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKHRoaXMuX2VsZW1lbnQsIEVWRU5UX01PVVNFRE9XTik7XG4gICAgICB0aGlzLl9lbGVtZW50LnJlbW92ZSgpO1xuICAgICAgdGhpcy5faXNBcHBlbmRlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFByaXZhdGVcbiAgICBfZ2V0RWxlbWVudCgpIHtcbiAgICAgIGlmICghdGhpcy5fZWxlbWVudCkge1xuICAgICAgICBjb25zdCBiYWNrZHJvcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICBiYWNrZHJvcC5jbGFzc05hbWUgPSB0aGlzLl9jb25maWcuY2xhc3NOYW1lO1xuICAgICAgICBpZiAodGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpIHtcbiAgICAgICAgICBiYWNrZHJvcC5jbGFzc0xpc3QuYWRkKENMQVNTX05BTUVfRkFERSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fZWxlbWVudCA9IGJhY2tkcm9wO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQ7XG4gICAgfVxuICAgIF9jb25maWdBZnRlck1lcmdlKGNvbmZpZykge1xuICAgICAgLy8gdXNlIGdldEVsZW1lbnQoKSB3aXRoIHRoZSBkZWZhdWx0IFwiYm9keVwiIHRvIGdldCBhIGZyZXNoIEVsZW1lbnQgb24gZWFjaCBpbnN0YW50aWF0aW9uXG4gICAgICBjb25maWcucm9vdEVsZW1lbnQgPSBpbmRleF9qcy5nZXRFbGVtZW50KGNvbmZpZy5yb290RWxlbWVudCk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBfYXBwZW5kKCkge1xuICAgICAgaWYgKHRoaXMuX2lzQXBwZW5kZWQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2dldEVsZW1lbnQoKTtcbiAgICAgIHRoaXMuX2NvbmZpZy5yb290RWxlbWVudC5hcHBlbmQoZWxlbWVudCk7XG4gICAgICBFdmVudEhhbmRsZXIub24oZWxlbWVudCwgRVZFTlRfTU9VU0VET1dOLCAoKSA9PiB7XG4gICAgICAgIGluZGV4X2pzLmV4ZWN1dGUodGhpcy5fY29uZmlnLmNsaWNrQ2FsbGJhY2spO1xuICAgICAgfSk7XG4gICAgICB0aGlzLl9pc0FwcGVuZGVkID0gdHJ1ZTtcbiAgICB9XG4gICAgX2VtdWxhdGVBbmltYXRpb24oY2FsbGJhY2spIHtcbiAgICAgIGluZGV4X2pzLmV4ZWN1dGVBZnRlclRyYW5zaXRpb24oY2FsbGJhY2ssIHRoaXMuX2dldEVsZW1lbnQoKSwgdGhpcy5fY29uZmlnLmlzQW5pbWF0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBCYWNrZHJvcDtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9YmFja2Ryb3AuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgY29tcG9uZW50LWZ1bmN0aW9ucy5qcyB2NS4zLjMgKGh0dHBzOi8vZ2V0Ym9vdHN0cmFwLmNvbS8pXG4gICogQ29weXJpZ2h0IDIwMTEtMjAyNCBUaGUgQm9vdHN0cmFwIEF1dGhvcnMgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ncmFwaHMvY29udHJpYnV0b3JzKVxuICAqIExpY2Vuc2VkIHVuZGVyIE1JVCAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2Jsb2IvbWFpbi9MSUNFTlNFKVxuICAqL1xuKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gZmFjdG9yeShleHBvcnRzLCByZXF1aXJlKCcuLi9kb20vZXZlbnQtaGFuZGxlci5qcycpLCByZXF1aXJlKCcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJyksIHJlcXVpcmUoJy4vaW5kZXguanMnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJywgJy4uL2RvbS9ldmVudC1oYW5kbGVyJywgJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUnLCAnLi9pbmRleCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGZhY3RvcnkoZ2xvYmFsLkNvbXBvbmVudEZ1bmN0aW9ucyA9IHt9LCBnbG9iYWwuRXZlbnRIYW5kbGVyLCBnbG9iYWwuU2VsZWN0b3JFbmdpbmUsIGdsb2JhbC5JbmRleCkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChleHBvcnRzLCBFdmVudEhhbmRsZXIsIFNlbGVjdG9yRW5naW5lLCBpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCB1dGlsL2NvbXBvbmVudC1mdW5jdGlvbnMuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIGNvbnN0IGVuYWJsZURpc21pc3NUcmlnZ2VyID0gKGNvbXBvbmVudCwgbWV0aG9kID0gJ2hpZGUnKSA9PiB7XG4gICAgY29uc3QgY2xpY2tFdmVudCA9IGBjbGljay5kaXNtaXNzJHtjb21wb25lbnQuRVZFTlRfS0VZfWA7XG4gICAgY29uc3QgbmFtZSA9IGNvbXBvbmVudC5OQU1FO1xuICAgIEV2ZW50SGFuZGxlci5vbihkb2N1bWVudCwgY2xpY2tFdmVudCwgYFtkYXRhLWJzLWRpc21pc3M9XCIke25hbWV9XCJdYCwgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICBpZiAoWydBJywgJ0FSRUEnXS5pbmNsdWRlcyh0aGlzLnRhZ05hbWUpKSB7XG4gICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICB9XG4gICAgICBpZiAoaW5kZXhfanMuaXNEaXNhYmxlZCh0aGlzKSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCB0YXJnZXQgPSBTZWxlY3RvckVuZ2luZS5nZXRFbGVtZW50RnJvbVNlbGVjdG9yKHRoaXMpIHx8IHRoaXMuY2xvc2VzdChgLiR7bmFtZX1gKTtcbiAgICAgIGNvbnN0IGluc3RhbmNlID0gY29tcG9uZW50LmdldE9yQ3JlYXRlSW5zdGFuY2UodGFyZ2V0KTtcblxuICAgICAgLy8gTWV0aG9kIGFyZ3VtZW50IGlzIGxlZnQsIGZvciBBbGVydCBhbmQgb25seSwgYXMgaXQgZG9lc24ndCBpbXBsZW1lbnQgdGhlICdoaWRlJyBtZXRob2RcbiAgICAgIGluc3RhbmNlW21ldGhvZF0oKTtcbiAgICB9KTtcbiAgfTtcblxuICBleHBvcnRzLmVuYWJsZURpc21pc3NUcmlnZ2VyID0gZW5hYmxlRGlzbWlzc1RyaWdnZXI7XG5cbiAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFN5bWJvbC50b1N0cmluZ1RhZywgeyB2YWx1ZTogJ01vZHVsZScgfSk7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbXBvbmVudC1mdW5jdGlvbnMuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgY29uZmlnLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vZG9tL21hbmlwdWxhdG9yLmpzJyksIHJlcXVpcmUoJy4vaW5kZXguanMnKSkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWycuLi9kb20vbWFuaXB1bGF0b3InLCAnLi9pbmRleCddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Db25maWcgPSBmYWN0b3J5KGdsb2JhbC5NYW5pcHVsYXRvciwgZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKE1hbmlwdWxhdG9yLCBpbmRleF9qcykgeyAndXNlIHN0cmljdCc7XG5cbiAgLyoqXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqIEJvb3RzdHJhcCB1dGlsL2NvbmZpZy5qc1xuICAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICovXG5cblxuICAvKipcbiAgICogQ2xhc3MgZGVmaW5pdGlvblxuICAgKi9cblxuICBjbGFzcyBDb25maWcge1xuICAgIC8vIEdldHRlcnNcbiAgICBzdGF0aWMgZ2V0IERlZmF1bHQoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgRGVmYXVsdFR5cGUoKSB7XG4gICAgICByZXR1cm4ge307XG4gICAgfVxuICAgIHN0YXRpYyBnZXQgTkFNRSgpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignWW91IGhhdmUgdG8gaW1wbGVtZW50IHRoZSBzdGF0aWMgbWV0aG9kIFwiTkFNRVwiLCBmb3IgZWFjaCBjb21wb25lbnQhJyk7XG4gICAgfVxuICAgIF9nZXRDb25maWcoY29uZmlnKSB7XG4gICAgICBjb25maWcgPSB0aGlzLl9tZXJnZUNvbmZpZ09iaihjb25maWcpO1xuICAgICAgY29uZmlnID0gdGhpcy5fY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpO1xuICAgICAgdGhpcy5fdHlwZUNoZWNrQ29uZmlnKGNvbmZpZyk7XG4gICAgICByZXR1cm4gY29uZmlnO1xuICAgIH1cbiAgICBfY29uZmlnQWZ0ZXJNZXJnZShjb25maWcpIHtcbiAgICAgIHJldHVybiBjb25maWc7XG4gICAgfVxuICAgIF9tZXJnZUNvbmZpZ09iaihjb25maWcsIGVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGpzb25Db25maWcgPSBpbmRleF9qcy5pc0VsZW1lbnQoZWxlbWVudCkgPyBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsICdjb25maWcnKSA6IHt9OyAvLyB0cnkgdG8gcGFyc2VcblxuICAgICAgcmV0dXJuIHtcbiAgICAgICAgLi4udGhpcy5jb25zdHJ1Y3Rvci5EZWZhdWx0LFxuICAgICAgICAuLi4odHlwZW9mIGpzb25Db25maWcgPT09ICdvYmplY3QnID8ganNvbkNvbmZpZyA6IHt9KSxcbiAgICAgICAgLi4uKGluZGV4X2pzLmlzRWxlbWVudChlbGVtZW50KSA/IE1hbmlwdWxhdG9yLmdldERhdGFBdHRyaWJ1dGVzKGVsZW1lbnQpIDoge30pLFxuICAgICAgICAuLi4odHlwZW9mIGNvbmZpZyA9PT0gJ29iamVjdCcgPyBjb25maWcgOiB7fSlcbiAgICAgIH07XG4gICAgfVxuICAgIF90eXBlQ2hlY2tDb25maWcoY29uZmlnLCBjb25maWdUeXBlcyA9IHRoaXMuY29uc3RydWN0b3IuRGVmYXVsdFR5cGUpIHtcbiAgICAgIGZvciAoY29uc3QgW3Byb3BlcnR5LCBleHBlY3RlZFR5cGVzXSBvZiBPYmplY3QuZW50cmllcyhjb25maWdUeXBlcykpIHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcGVydHldO1xuICAgICAgICBjb25zdCB2YWx1ZVR5cGUgPSBpbmRleF9qcy5pc0VsZW1lbnQodmFsdWUpID8gJ2VsZW1lbnQnIDogaW5kZXhfanMudG9UeXBlKHZhbHVlKTtcbiAgICAgICAgaWYgKCFuZXcgUmVnRXhwKGV4cGVjdGVkVHlwZXMpLnRlc3QodmFsdWVUeXBlKSkge1xuICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYCR7dGhpcy5jb25zdHJ1Y3Rvci5OQU1FLnRvVXBwZXJDYXNlKCl9OiBPcHRpb24gXCIke3Byb3BlcnR5fVwiIHByb3ZpZGVkIHR5cGUgXCIke3ZhbHVlVHlwZX1cIiBidXQgZXhwZWN0ZWQgdHlwZSBcIiR7ZXhwZWN0ZWRUeXBlc31cIi5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBDb25maWc7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNvbmZpZy5qcy5tYXBcbiIsIi8qIVxuICAqIEJvb3RzdHJhcCBmb2N1c3RyYXAuanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShyZXF1aXJlKCcuLi9kb20vZXZlbnQtaGFuZGxlci5qcycpLCByZXF1aXJlKCcuLi9kb20vc2VsZWN0b3ItZW5naW5lLmpzJyksIHJlcXVpcmUoJy4vY29uZmlnLmpzJykpIDpcbiAgdHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kID8gZGVmaW5lKFsnLi4vZG9tL2V2ZW50LWhhbmRsZXInLCAnLi4vZG9tL3NlbGVjdG9yLWVuZ2luZScsICcuL2NvbmZpZyddLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIGdsb2JhbC5Gb2N1c3RyYXAgPSBmYWN0b3J5KGdsb2JhbC5FdmVudEhhbmRsZXIsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkNvbmZpZykpO1xufSkodGhpcywgKGZ1bmN0aW9uIChFdmVudEhhbmRsZXIsIFNlbGVjdG9yRW5naW5lLCBDb25maWcpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9mb2N1c3RyYXAuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBOQU1FID0gJ2ZvY3VzdHJhcCc7XG4gIGNvbnN0IERBVEFfS0VZID0gJ2JzLmZvY3VzdHJhcCc7XG4gIGNvbnN0IEVWRU5UX0tFWSA9IGAuJHtEQVRBX0tFWX1gO1xuICBjb25zdCBFVkVOVF9GT0NVU0lOID0gYGZvY3VzaW4ke0VWRU5UX0tFWX1gO1xuICBjb25zdCBFVkVOVF9LRVlET1dOX1RBQiA9IGBrZXlkb3duLnRhYiR7RVZFTlRfS0VZfWA7XG4gIGNvbnN0IFRBQl9LRVkgPSAnVGFiJztcbiAgY29uc3QgVEFCX05BVl9GT1JXQVJEID0gJ2ZvcndhcmQnO1xuICBjb25zdCBUQUJfTkFWX0JBQ0tXQVJEID0gJ2JhY2t3YXJkJztcbiAgY29uc3QgRGVmYXVsdCA9IHtcbiAgICBhdXRvZm9jdXM6IHRydWUsXG4gICAgdHJhcEVsZW1lbnQ6IG51bGwgLy8gVGhlIGVsZW1lbnQgdG8gdHJhcCBmb2N1cyBpbnNpZGUgb2ZcbiAgfTtcbiAgY29uc3QgRGVmYXVsdFR5cGUgPSB7XG4gICAgYXV0b2ZvY3VzOiAnYm9vbGVhbicsXG4gICAgdHJhcEVsZW1lbnQ6ICdlbGVtZW50J1xuICB9O1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIEZvY3VzVHJhcCBleHRlbmRzIENvbmZpZyB7XG4gICAgY29uc3RydWN0b3IoY29uZmlnKSB7XG4gICAgICBzdXBlcigpO1xuICAgICAgdGhpcy5fY29uZmlnID0gdGhpcy5fZ2V0Q29uZmlnKGNvbmZpZyk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlO1xuICAgICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IG51bGw7XG4gICAgfVxuXG4gICAgLy8gR2V0dGVyc1xuICAgIHN0YXRpYyBnZXQgRGVmYXVsdCgpIHtcbiAgICAgIHJldHVybiBEZWZhdWx0O1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IERlZmF1bHRUeXBlKCkge1xuICAgICAgcmV0dXJuIERlZmF1bHRUeXBlO1xuICAgIH1cbiAgICBzdGF0aWMgZ2V0IE5BTUUoKSB7XG4gICAgICByZXR1cm4gTkFNRTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICBhY3RpdmF0ZSgpIHtcbiAgICAgIGlmICh0aGlzLl9pc0FjdGl2ZSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodGhpcy5fY29uZmlnLmF1dG9mb2N1cykge1xuICAgICAgICB0aGlzLl9jb25maWcudHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH1cbiAgICAgIEV2ZW50SGFuZGxlci5vZmYoZG9jdW1lbnQsIEVWRU5UX0tFWSk7IC8vIGd1YXJkIGFnYWluc3QgaW5maW5pdGUgZm9jdXMgbG9vcFxuICAgICAgRXZlbnRIYW5kbGVyLm9uKGRvY3VtZW50LCBFVkVOVF9GT0NVU0lOLCBldmVudCA9PiB0aGlzLl9oYW5kbGVGb2N1c2luKGV2ZW50KSk7XG4gICAgICBFdmVudEhhbmRsZXIub24oZG9jdW1lbnQsIEVWRU5UX0tFWURPV05fVEFCLCBldmVudCA9PiB0aGlzLl9oYW5kbGVLZXlkb3duKGV2ZW50KSk7XG4gICAgICB0aGlzLl9pc0FjdGl2ZSA9IHRydWU7XG4gICAgfVxuICAgIGRlYWN0aXZhdGUoKSB7XG4gICAgICBpZiAoIXRoaXMuX2lzQWN0aXZlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuX2lzQWN0aXZlID0gZmFsc2U7XG4gICAgICBFdmVudEhhbmRsZXIub2ZmKGRvY3VtZW50LCBFVkVOVF9LRVkpO1xuICAgIH1cblxuICAgIC8vIFByaXZhdGVcbiAgICBfaGFuZGxlRm9jdXNpbihldmVudCkge1xuICAgICAgY29uc3Qge1xuICAgICAgICB0cmFwRWxlbWVudFxuICAgICAgfSA9IHRoaXMuX2NvbmZpZztcbiAgICAgIGlmIChldmVudC50YXJnZXQgPT09IGRvY3VtZW50IHx8IGV2ZW50LnRhcmdldCA9PT0gdHJhcEVsZW1lbnQgfHwgdHJhcEVsZW1lbnQuY29udGFpbnMoZXZlbnQudGFyZ2V0KSkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBjb25zdCBlbGVtZW50cyA9IFNlbGVjdG9yRW5naW5lLmZvY3VzYWJsZUNoaWxkcmVuKHRyYXBFbGVtZW50KTtcbiAgICAgIGlmIChlbGVtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdHJhcEVsZW1lbnQuZm9jdXMoKTtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9PT0gVEFCX05BVl9CQUNLV0FSRCkge1xuICAgICAgICBlbGVtZW50c1tlbGVtZW50cy5sZW5ndGggLSAxXS5mb2N1cygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZWxlbWVudHNbMF0uZm9jdXMoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHtcbiAgICAgIGlmIChldmVudC5rZXkgIT09IFRBQl9LRVkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgdGhpcy5fbGFzdFRhYk5hdkRpcmVjdGlvbiA9IGV2ZW50LnNoaWZ0S2V5ID8gVEFCX05BVl9CQUNLV0FSRCA6IFRBQl9OQVZfRk9SV0FSRDtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gRm9jdXNUcmFwO1xuXG59KSk7XG4vLyMgc291cmNlTWFwcGluZ1VSTD1mb2N1c3RyYXAuanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgaW5kZXguanMgdjUuMy4zIChodHRwczovL2dldGJvb3RzdHJhcC5jb20vKVxuICAqIENvcHlyaWdodCAyMDExLTIwMjQgVGhlIEJvb3RzdHJhcCBBdXRob3JzIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvZ3JhcGhzL2NvbnRyaWJ1dG9ycylcbiAgKiBMaWNlbnNlZCB1bmRlciBNSVQgKGh0dHBzOi8vZ2l0aHViLmNvbS90d2JzL2Jvb3RzdHJhcC9ibG9iL21haW4vTElDRU5TRSlcbiAgKi9cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgKGdsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiBnbG9iYWwgfHwgc2VsZiwgZmFjdG9yeShnbG9iYWwuSW5kZXggPSB7fSkpO1xufSkodGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxuICAvKipcbiAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICogQm9vdHN0cmFwIHV0aWwvaW5kZXguanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG4gIGNvbnN0IE1BWF9VSUQgPSAxMDAwMDAwO1xuICBjb25zdCBNSUxMSVNFQ09ORFNfTVVMVElQTElFUiA9IDEwMDA7XG4gIGNvbnN0IFRSQU5TSVRJT05fRU5EID0gJ3RyYW5zaXRpb25lbmQnO1xuXG4gIC8qKlxuICAgKiBQcm9wZXJseSBlc2NhcGUgSURzIHNlbGVjdG9ycyB0byBoYW5kbGUgd2VpcmQgSURzXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvclxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgY29uc3QgcGFyc2VTZWxlY3RvciA9IHNlbGVjdG9yID0+IHtcbiAgICBpZiAoc2VsZWN0b3IgJiYgd2luZG93LkNTUyAmJiB3aW5kb3cuQ1NTLmVzY2FwZSkge1xuICAgICAgLy8gZG9jdW1lbnQucXVlcnlTZWxlY3RvciBuZWVkcyBlc2NhcGluZyB0byBoYW5kbGUgSURzIChodG1sNSspIGNvbnRhaW5pbmcgZm9yIGluc3RhbmNlIC9cbiAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZSgvIyhbXlxcc1wiIyddKykvZywgKG1hdGNoLCBpZCkgPT4gYCMke0NTUy5lc2NhcGUoaWQpfWApO1xuICAgIH1cbiAgICByZXR1cm4gc2VsZWN0b3I7XG4gIH07XG5cbiAgLy8gU2hvdXQtb3V0IEFuZ3VzIENyb2xsIChodHRwczovL2dvby5nbC9weHdRR3ApXG4gIGNvbnN0IHRvVHlwZSA9IG9iamVjdCA9PiB7XG4gICAgaWYgKG9iamVjdCA9PT0gbnVsbCB8fCBvYmplY3QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIGAke29iamVjdH1gO1xuICAgIH1cbiAgICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkubWF0Y2goL1xccyhbYS16XSspL2kpWzFdLnRvTG93ZXJDYXNlKCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIFB1YmxpYyBVdGlsIEFQSVxuICAgKi9cblxuICBjb25zdCBnZXRVSUQgPSBwcmVmaXggPT4ge1xuICAgIGRvIHtcbiAgICAgIHByZWZpeCArPSBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBNQVhfVUlEKTtcbiAgICB9IHdoaWxlIChkb2N1bWVudC5nZXRFbGVtZW50QnlJZChwcmVmaXgpKTtcbiAgICByZXR1cm4gcHJlZml4O1xuICB9O1xuICBjb25zdCBnZXRUcmFuc2l0aW9uRHVyYXRpb25Gcm9tRWxlbWVudCA9IGVsZW1lbnQgPT4ge1xuICAgIGlmICghZWxlbWVudCkge1xuICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRyYW5zaXRpb24tZHVyYXRpb24gb2YgdGhlIGVsZW1lbnRcbiAgICBsZXQge1xuICAgICAgdHJhbnNpdGlvbkR1cmF0aW9uLFxuICAgICAgdHJhbnNpdGlvbkRlbGF5XG4gICAgfSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpO1xuICAgIGNvbnN0IGZsb2F0VHJhbnNpdGlvbkR1cmF0aW9uID0gTnVtYmVyLnBhcnNlRmxvYXQodHJhbnNpdGlvbkR1cmF0aW9uKTtcbiAgICBjb25zdCBmbG9hdFRyYW5zaXRpb25EZWxheSA9IE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EZWxheSk7XG5cbiAgICAvLyBSZXR1cm4gMCBpZiBlbGVtZW50IG9yIHRyYW5zaXRpb24gZHVyYXRpb24gaXMgbm90IGZvdW5kXG4gICAgaWYgKCFmbG9hdFRyYW5zaXRpb25EdXJhdGlvbiAmJiAhZmxvYXRUcmFuc2l0aW9uRGVsYXkpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH1cblxuICAgIC8vIElmIG11bHRpcGxlIGR1cmF0aW9ucyBhcmUgZGVmaW5lZCwgdGFrZSB0aGUgZmlyc3RcbiAgICB0cmFuc2l0aW9uRHVyYXRpb24gPSB0cmFuc2l0aW9uRHVyYXRpb24uc3BsaXQoJywnKVswXTtcbiAgICB0cmFuc2l0aW9uRGVsYXkgPSB0cmFuc2l0aW9uRGVsYXkuc3BsaXQoJywnKVswXTtcbiAgICByZXR1cm4gKE51bWJlci5wYXJzZUZsb2F0KHRyYW5zaXRpb25EdXJhdGlvbikgKyBOdW1iZXIucGFyc2VGbG9hdCh0cmFuc2l0aW9uRGVsYXkpKSAqIE1JTExJU0VDT05EU19NVUxUSVBMSUVSO1xuICB9O1xuICBjb25zdCB0cmlnZ2VyVHJhbnNpdGlvbkVuZCA9IGVsZW1lbnQgPT4ge1xuICAgIGVsZW1lbnQuZGlzcGF0Y2hFdmVudChuZXcgRXZlbnQoVFJBTlNJVElPTl9FTkQpKTtcbiAgfTtcbiAgY29uc3QgaXNFbGVtZW50ID0gb2JqZWN0ID0+IHtcbiAgICBpZiAoIW9iamVjdCB8fCB0eXBlb2Ygb2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iamVjdC5qcXVlcnkgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICBvYmplY3QgPSBvYmplY3RbMF07XG4gICAgfVxuICAgIHJldHVybiB0eXBlb2Ygb2JqZWN0Lm5vZGVUeXBlICE9PSAndW5kZWZpbmVkJztcbiAgfTtcbiAgY29uc3QgZ2V0RWxlbWVudCA9IG9iamVjdCA9PiB7XG4gICAgLy8gaXQncyBhIGpRdWVyeSBvYmplY3Qgb3IgYSBub2RlIGVsZW1lbnRcbiAgICBpZiAoaXNFbGVtZW50KG9iamVjdCkpIHtcbiAgICAgIHJldHVybiBvYmplY3QuanF1ZXJ5ID8gb2JqZWN0WzBdIDogb2JqZWN0O1xuICAgIH1cbiAgICBpZiAodHlwZW9mIG9iamVjdCA9PT0gJ3N0cmluZycgJiYgb2JqZWN0Lmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHBhcnNlU2VsZWN0b3Iob2JqZWN0KSk7XG4gICAgfVxuICAgIHJldHVybiBudWxsO1xuICB9O1xuICBjb25zdCBpc1Zpc2libGUgPSBlbGVtZW50ID0+IHtcbiAgICBpZiAoIWlzRWxlbWVudChlbGVtZW50KSB8fCBlbGVtZW50LmdldENsaWVudFJlY3RzKCkubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGNvbnN0IGVsZW1lbnRJc1Zpc2libGUgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUoJ3Zpc2liaWxpdHknKSA9PT0gJ3Zpc2libGUnO1xuICAgIC8vIEhhbmRsZSBgZGV0YWlsc2AgZWxlbWVudCBhcyBpdHMgY29udGVudCBtYXkgZmFsc2llIGFwcGVhciB2aXNpYmxlIHdoZW4gaXQgaXMgY2xvc2VkXG4gICAgY29uc3QgY2xvc2VkRGV0YWlscyA9IGVsZW1lbnQuY2xvc2VzdCgnZGV0YWlsczpub3QoW29wZW5dKScpO1xuICAgIGlmICghY2xvc2VkRGV0YWlscykge1xuICAgICAgcmV0dXJuIGVsZW1lbnRJc1Zpc2libGU7XG4gICAgfVxuICAgIGlmIChjbG9zZWREZXRhaWxzICE9PSBlbGVtZW50KSB7XG4gICAgICBjb25zdCBzdW1tYXJ5ID0gZWxlbWVudC5jbG9zZXN0KCdzdW1tYXJ5Jyk7XG4gICAgICBpZiAoc3VtbWFyeSAmJiBzdW1tYXJ5LnBhcmVudE5vZGUgIT09IGNsb3NlZERldGFpbHMpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKHN1bW1hcnkgPT09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudElzVmlzaWJsZTtcbiAgfTtcbiAgY29uc3QgaXNEaXNhYmxlZCA9IGVsZW1lbnQgPT4ge1xuICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50Lm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucygnZGlzYWJsZWQnKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgZWxlbWVudC5kaXNhYmxlZCAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHJldHVybiBlbGVtZW50LmRpc2FibGVkO1xuICAgIH1cbiAgICByZXR1cm4gZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgIT09ICdmYWxzZSc7XG4gIH07XG4gIGNvbnN0IGZpbmRTaGFkb3dSb290ID0gZWxlbWVudCA9PiB7XG4gICAgaWYgKCFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYXR0YWNoU2hhZG93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDYW4gZmluZCB0aGUgc2hhZG93IHJvb3Qgb3RoZXJ3aXNlIGl0J2xsIHJldHVybiB0aGUgZG9jdW1lbnRcbiAgICBpZiAodHlwZW9mIGVsZW1lbnQuZ2V0Um9vdE5vZGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIGNvbnN0IHJvb3QgPSBlbGVtZW50LmdldFJvb3ROb2RlKCk7XG4gICAgICByZXR1cm4gcm9vdCBpbnN0YW5jZW9mIFNoYWRvd1Jvb3QgPyByb290IDogbnVsbDtcbiAgICB9XG4gICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7XG4gICAgICByZXR1cm4gZWxlbWVudDtcbiAgICB9XG5cbiAgICAvLyB3aGVuIHdlIGRvbid0IGZpbmQgYSBzaGFkb3cgcm9vdFxuICAgIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIGZpbmRTaGFkb3dSb290KGVsZW1lbnQucGFyZW50Tm9kZSk7XG4gIH07XG4gIGNvbnN0IG5vb3AgPSAoKSA9PiB7fTtcblxuICAvKipcbiAgICogVHJpY2sgdG8gcmVzdGFydCBhbiBlbGVtZW50J3MgYW5pbWF0aW9uXG4gICAqXG4gICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnRcbiAgICogQHJldHVybiB2b2lkXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly93d3cuY2hhcmlzdGhlby5pby9ibG9nLzIwMjEvMDIvcmVzdGFydC1hLWNzcy1hbmltYXRpb24td2l0aC1qYXZhc2NyaXB0LyNyZXN0YXJ0aW5nLWEtY3NzLWFuaW1hdGlvblxuICAgKi9cbiAgY29uc3QgcmVmbG93ID0gZWxlbWVudCA9PiB7XG4gICAgZWxlbWVudC5vZmZzZXRIZWlnaHQ7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gIH07XG4gIGNvbnN0IGdldGpRdWVyeSA9ICgpID0+IHtcbiAgICBpZiAod2luZG93LmpRdWVyeSAmJiAhZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RhdGEtYnMtbm8tanF1ZXJ5JykpIHtcbiAgICAgIHJldHVybiB3aW5kb3cualF1ZXJ5O1xuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbiAgfTtcbiAgY29uc3QgRE9NQ29udGVudExvYWRlZENhbGxiYWNrcyA9IFtdO1xuICBjb25zdCBvbkRPTUNvbnRlbnRMb2FkZWQgPSBjYWxsYmFjayA9PiB7XG4gICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykge1xuICAgICAgLy8gYWRkIGxpc3RlbmVyIG9uIHRoZSBmaXJzdCBjYWxsIHdoZW4gdGhlIGRvY3VtZW50IGlzIGluIGxvYWRpbmcgc3RhdGVcbiAgICAgIGlmICghRE9NQ29udGVudExvYWRlZENhbGxiYWNrcy5sZW5ndGgpIHtcbiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignRE9NQ29udGVudExvYWRlZCcsICgpID0+IHtcbiAgICAgICAgICBmb3IgKGNvbnN0IGNhbGxiYWNrIG9mIERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIERPTUNvbnRlbnRMb2FkZWRDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGNhbGxiYWNrKCk7XG4gICAgfVxuICB9O1xuICBjb25zdCBpc1JUTCA9ICgpID0+IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5kaXIgPT09ICdydGwnO1xuICBjb25zdCBkZWZpbmVKUXVlcnlQbHVnaW4gPSBwbHVnaW4gPT4ge1xuICAgIG9uRE9NQ29udGVudExvYWRlZCgoKSA9PiB7XG4gICAgICBjb25zdCAkID0gZ2V0alF1ZXJ5KCk7XG4gICAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgaWYgKi9cbiAgICAgIGlmICgkKSB7XG4gICAgICAgIGNvbnN0IG5hbWUgPSBwbHVnaW4uTkFNRTtcbiAgICAgICAgY29uc3QgSlFVRVJZX05PX0NPTkZMSUNUID0gJC5mbltuYW1lXTtcbiAgICAgICAgJC5mbltuYW1lXSA9IHBsdWdpbi5qUXVlcnlJbnRlcmZhY2U7XG4gICAgICAgICQuZm5bbmFtZV0uQ29uc3RydWN0b3IgPSBwbHVnaW47XG4gICAgICAgICQuZm5bbmFtZV0ubm9Db25mbGljdCA9ICgpID0+IHtcbiAgICAgICAgICAkLmZuW25hbWVdID0gSlFVRVJZX05PX0NPTkZMSUNUO1xuICAgICAgICAgIHJldHVybiBwbHVnaW4ualF1ZXJ5SW50ZXJmYWNlO1xuICAgICAgICB9O1xuICAgICAgfVxuICAgIH0pO1xuICB9O1xuICBjb25zdCBleGVjdXRlID0gKHBvc3NpYmxlQ2FsbGJhY2ssIGFyZ3MgPSBbXSwgZGVmYXVsdFZhbHVlID0gcG9zc2libGVDYWxsYmFjaykgPT4ge1xuICAgIHJldHVybiB0eXBlb2YgcG9zc2libGVDYWxsYmFjayA9PT0gJ2Z1bmN0aW9uJyA/IHBvc3NpYmxlQ2FsbGJhY2soLi4uYXJncykgOiBkZWZhdWx0VmFsdWU7XG4gIH07XG4gIGNvbnN0IGV4ZWN1dGVBZnRlclRyYW5zaXRpb24gPSAoY2FsbGJhY2ssIHRyYW5zaXRpb25FbGVtZW50LCB3YWl0Rm9yVHJhbnNpdGlvbiA9IHRydWUpID0+IHtcbiAgICBpZiAoIXdhaXRGb3JUcmFuc2l0aW9uKSB7XG4gICAgICBleGVjdXRlKGNhbGxiYWNrKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZHVyYXRpb25QYWRkaW5nID0gNTtcbiAgICBjb25zdCBlbXVsYXRlZER1cmF0aW9uID0gZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQodHJhbnNpdGlvbkVsZW1lbnQpICsgZHVyYXRpb25QYWRkaW5nO1xuICAgIGxldCBjYWxsZWQgPSBmYWxzZTtcbiAgICBjb25zdCBoYW5kbGVyID0gKHtcbiAgICAgIHRhcmdldFxuICAgIH0pID0+IHtcbiAgICAgIGlmICh0YXJnZXQgIT09IHRyYW5zaXRpb25FbGVtZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIGNhbGxlZCA9IHRydWU7XG4gICAgICB0cmFuc2l0aW9uRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKFRSQU5TSVRJT05fRU5ELCBoYW5kbGVyKTtcbiAgICAgIGV4ZWN1dGUoY2FsbGJhY2spO1xuICAgIH07XG4gICAgdHJhbnNpdGlvbkVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihUUkFOU0lUSU9OX0VORCwgaGFuZGxlcik7XG4gICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICBpZiAoIWNhbGxlZCkge1xuICAgICAgICB0cmlnZ2VyVHJhbnNpdGlvbkVuZCh0cmFuc2l0aW9uRWxlbWVudCk7XG4gICAgICB9XG4gICAgfSwgZW11bGF0ZWREdXJhdGlvbik7XG4gIH07XG5cbiAgLyoqXG4gICAqIFJldHVybiB0aGUgcHJldmlvdXMvbmV4dCBlbGVtZW50IG9mIGEgbGlzdC5cbiAgICpcbiAgICogQHBhcmFtIHthcnJheX0gbGlzdCAgICBUaGUgbGlzdCBvZiBlbGVtZW50c1xuICAgKiBAcGFyYW0gYWN0aXZlRWxlbWVudCAgIFRoZSBhY3RpdmUgZWxlbWVudFxuICAgKiBAcGFyYW0gc2hvdWxkR2V0TmV4dCAgIENob29zZSB0byBnZXQgbmV4dCBvciBwcmV2aW91cyBlbGVtZW50XG4gICAqIEBwYXJhbSBpc0N5Y2xlQWxsb3dlZFxuICAgKiBAcmV0dXJuIHtFbGVtZW50fGVsZW19IFRoZSBwcm9wZXIgZWxlbWVudFxuICAgKi9cbiAgY29uc3QgZ2V0TmV4dEFjdGl2ZUVsZW1lbnQgPSAobGlzdCwgYWN0aXZlRWxlbWVudCwgc2hvdWxkR2V0TmV4dCwgaXNDeWNsZUFsbG93ZWQpID0+IHtcbiAgICBjb25zdCBsaXN0TGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gICAgbGV0IGluZGV4ID0gbGlzdC5pbmRleE9mKGFjdGl2ZUVsZW1lbnQpO1xuXG4gICAgLy8gaWYgdGhlIGVsZW1lbnQgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGxpc3QgcmV0dXJuIGFuIGVsZW1lbnRcbiAgICAvLyBkZXBlbmRpbmcgb24gdGhlIGRpcmVjdGlvbiBhbmQgaWYgY3ljbGUgaXMgYWxsb3dlZFxuICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgIHJldHVybiAhc2hvdWxkR2V0TmV4dCAmJiBpc0N5Y2xlQWxsb3dlZCA/IGxpc3RbbGlzdExlbmd0aCAtIDFdIDogbGlzdFswXTtcbiAgICB9XG4gICAgaW5kZXggKz0gc2hvdWxkR2V0TmV4dCA/IDEgOiAtMTtcbiAgICBpZiAoaXNDeWNsZUFsbG93ZWQpIHtcbiAgICAgIGluZGV4ID0gKGluZGV4ICsgbGlzdExlbmd0aCkgJSBsaXN0TGVuZ3RoO1xuICAgIH1cbiAgICByZXR1cm4gbGlzdFtNYXRoLm1heCgwLCBNYXRoLm1pbihpbmRleCwgbGlzdExlbmd0aCAtIDEpKV07XG4gIH07XG5cbiAgZXhwb3J0cy5kZWZpbmVKUXVlcnlQbHVnaW4gPSBkZWZpbmVKUXVlcnlQbHVnaW47XG4gIGV4cG9ydHMuZXhlY3V0ZSA9IGV4ZWN1dGU7XG4gIGV4cG9ydHMuZXhlY3V0ZUFmdGVyVHJhbnNpdGlvbiA9IGV4ZWN1dGVBZnRlclRyYW5zaXRpb247XG4gIGV4cG9ydHMuZmluZFNoYWRvd1Jvb3QgPSBmaW5kU2hhZG93Um9vdDtcbiAgZXhwb3J0cy5nZXRFbGVtZW50ID0gZ2V0RWxlbWVudDtcbiAgZXhwb3J0cy5nZXROZXh0QWN0aXZlRWxlbWVudCA9IGdldE5leHRBY3RpdmVFbGVtZW50O1xuICBleHBvcnRzLmdldFRyYW5zaXRpb25EdXJhdGlvbkZyb21FbGVtZW50ID0gZ2V0VHJhbnNpdGlvbkR1cmF0aW9uRnJvbUVsZW1lbnQ7XG4gIGV4cG9ydHMuZ2V0VUlEID0gZ2V0VUlEO1xuICBleHBvcnRzLmdldGpRdWVyeSA9IGdldGpRdWVyeTtcbiAgZXhwb3J0cy5pc0Rpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgZXhwb3J0cy5pc0VsZW1lbnQgPSBpc0VsZW1lbnQ7XG4gIGV4cG9ydHMuaXNSVEwgPSBpc1JUTDtcbiAgZXhwb3J0cy5pc1Zpc2libGUgPSBpc1Zpc2libGU7XG4gIGV4cG9ydHMubm9vcCA9IG5vb3A7XG4gIGV4cG9ydHMub25ET01Db250ZW50TG9hZGVkID0gb25ET01Db250ZW50TG9hZGVkO1xuICBleHBvcnRzLnBhcnNlU2VsZWN0b3IgPSBwYXJzZVNlbGVjdG9yO1xuICBleHBvcnRzLnJlZmxvdyA9IHJlZmxvdztcbiAgZXhwb3J0cy50b1R5cGUgPSB0b1R5cGU7XG4gIGV4cG9ydHMudHJpZ2dlclRyYW5zaXRpb25FbmQgPSB0cmlnZ2VyVHJhbnNpdGlvbkVuZDtcblxuICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgU3ltYm9sLnRvU3RyaW5nVGFnLCB7IHZhbHVlOiAnTW9kdWxlJyB9KTtcblxufSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXguanMubWFwXG4iLCIvKiFcbiAgKiBCb290c3RyYXAgc2Nyb2xsYmFyLmpzIHY1LjMuMyAoaHR0cHM6Ly9nZXRib290c3RyYXAuY29tLylcbiAgKiBDb3B5cmlnaHQgMjAxMS0yMDI0IFRoZSBCb290c3RyYXAgQXV0aG9ycyAoaHR0cHM6Ly9naXRodWIuY29tL3R3YnMvYm9vdHN0cmFwL2dyYXBocy9jb250cmlidXRvcnMpXG4gICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICovXG4oZnVuY3Rpb24gKGdsb2JhbCwgZmFjdG9yeSkge1xuICB0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcgJiYgdHlwZW9mIG1vZHVsZSAhPT0gJ3VuZGVmaW5lZCcgPyBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkocmVxdWlyZSgnLi4vZG9tL21hbmlwdWxhdG9yLmpzJyksIHJlcXVpcmUoJy4uL2RvbS9zZWxlY3Rvci1lbmdpbmUuanMnKSwgcmVxdWlyZSgnLi9pbmRleC5qcycpKSA6XG4gIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShbJy4uL2RvbS9tYW5pcHVsYXRvcicsICcuLi9kb20vc2VsZWN0b3ItZW5naW5lJywgJy4vaW5kZXgnXSwgZmFjdG9yeSkgOlxuICAoZ2xvYmFsID0gdHlwZW9mIGdsb2JhbFRoaXMgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsVGhpcyA6IGdsb2JhbCB8fCBzZWxmLCBnbG9iYWwuU2Nyb2xsYmFyID0gZmFjdG9yeShnbG9iYWwuTWFuaXB1bGF0b3IsIGdsb2JhbC5TZWxlY3RvckVuZ2luZSwgZ2xvYmFsLkluZGV4KSk7XG59KSh0aGlzLCAoZnVuY3Rpb24gKE1hbmlwdWxhdG9yLCBTZWxlY3RvckVuZ2luZSwgaW5kZXhfanMpIHsgJ3VzZSBzdHJpY3QnO1xuXG4gIC8qKlxuICAgKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgKiBCb290c3RyYXAgdXRpbC9zY3JvbGxCYXIuanNcbiAgICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vdHdicy9ib290c3RyYXAvYmxvYi9tYWluL0xJQ0VOU0UpXG4gICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAqL1xuXG5cbiAgLyoqXG4gICAqIENvbnN0YW50c1xuICAgKi9cblxuICBjb25zdCBTRUxFQ1RPUl9GSVhFRF9DT05URU5UID0gJy5maXhlZC10b3AsIC5maXhlZC1ib3R0b20sIC5pcy1maXhlZCwgLnN0aWNreS10b3AnO1xuICBjb25zdCBTRUxFQ1RPUl9TVElDS1lfQ09OVEVOVCA9ICcuc3RpY2t5LXRvcCc7XG4gIGNvbnN0IFBST1BFUlRZX1BBRERJTkcgPSAncGFkZGluZy1yaWdodCc7XG4gIGNvbnN0IFBST1BFUlRZX01BUkdJTiA9ICdtYXJnaW4tcmlnaHQnO1xuXG4gIC8qKlxuICAgKiBDbGFzcyBkZWZpbml0aW9uXG4gICAqL1xuXG4gIGNsYXNzIFNjcm9sbEJhckhlbHBlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICB0aGlzLl9lbGVtZW50ID0gZG9jdW1lbnQuYm9keTtcbiAgICB9XG5cbiAgICAvLyBQdWJsaWNcbiAgICBnZXRXaWR0aCgpIHtcbiAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9XaW5kb3cvaW5uZXJXaWR0aCN1c2FnZV9ub3Rlc1xuICAgICAgY29uc3QgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcbiAgICAgIHJldHVybiBNYXRoLmFicyh3aW5kb3cuaW5uZXJXaWR0aCAtIGRvY3VtZW50V2lkdGgpO1xuICAgIH1cbiAgICBoaWRlKCkge1xuICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgICB0aGlzLl9kaXNhYmxlT3ZlckZsb3coKTtcbiAgICAgIC8vIGdpdmUgcGFkZGluZyB0byBlbGVtZW50IHRvIGJhbGFuY2UgdGhlIGhpZGRlbiBzY3JvbGxiYXIgd2lkdGhcbiAgICAgIHRoaXMuX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsIFBST1BFUlRZX1BBRERJTkcsIGNhbGN1bGF0ZWRWYWx1ZSA9PiBjYWxjdWxhdGVkVmFsdWUgKyB3aWR0aCk7XG4gICAgICAvLyB0cmljazogV2UgYWRqdXN0IHBvc2l0aXZlIHBhZGRpbmdSaWdodCBhbmQgbmVnYXRpdmUgbWFyZ2luUmlnaHQgdG8gc3RpY2t5LXRvcCBlbGVtZW50cyB0byBrZWVwIHNob3dpbmcgZnVsbHdpZHRoXG4gICAgICB0aGlzLl9zZXRFbGVtZW50QXR0cmlidXRlcyhTRUxFQ1RPUl9GSVhFRF9DT05URU5ULCBQUk9QRVJUWV9QQURESU5HLCBjYWxjdWxhdGVkVmFsdWUgPT4gY2FsY3VsYXRlZFZhbHVlICsgd2lkdGgpO1xuICAgICAgdGhpcy5fc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfU1RJQ0tZX0NPTlRFTlQsIFBST1BFUlRZX01BUkdJTiwgY2FsY3VsYXRlZFZhbHVlID0+IGNhbGN1bGF0ZWRWYWx1ZSAtIHdpZHRoKTtcbiAgICB9XG4gICAgcmVzZXQoKSB7XG4gICAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKHRoaXMuX2VsZW1lbnQsICdvdmVyZmxvdycpO1xuICAgICAgdGhpcy5fcmVzZXRFbGVtZW50QXR0cmlidXRlcyh0aGlzLl9lbGVtZW50LCBQUk9QRVJUWV9QQURESU5HKTtcbiAgICAgIHRoaXMuX3Jlc2V0RWxlbWVudEF0dHJpYnV0ZXMoU0VMRUNUT1JfRklYRURfQ09OVEVOVCwgUFJPUEVSVFlfUEFERElORyk7XG4gICAgICB0aGlzLl9yZXNldEVsZW1lbnRBdHRyaWJ1dGVzKFNFTEVDVE9SX1NUSUNLWV9DT05URU5ULCBQUk9QRVJUWV9NQVJHSU4pO1xuICAgIH1cbiAgICBpc092ZXJmbG93aW5nKCkge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0V2lkdGgoKSA+IDA7XG4gICAgfVxuXG4gICAgLy8gUHJpdmF0ZVxuICAgIF9kaXNhYmxlT3ZlckZsb3coKSB7XG4gICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZSh0aGlzLl9lbGVtZW50LCAnb3ZlcmZsb3cnKTtcbiAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJztcbiAgICB9XG4gICAgX3NldEVsZW1lbnRBdHRyaWJ1dGVzKHNlbGVjdG9yLCBzdHlsZVByb3BlcnR5LCBjYWxsYmFjaykge1xuICAgICAgY29uc3Qgc2Nyb2xsYmFyV2lkdGggPSB0aGlzLmdldFdpZHRoKCk7XG4gICAgICBjb25zdCBtYW5pcHVsYXRpb25DYWxsQmFjayA9IGVsZW1lbnQgPT4ge1xuICAgICAgICBpZiAoZWxlbWVudCAhPT0gdGhpcy5fZWxlbWVudCAmJiB3aW5kb3cuaW5uZXJXaWR0aCA+IGVsZW1lbnQuY2xpZW50V2lkdGggKyBzY3JvbGxiYXJXaWR0aCkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zYXZlSW5pdGlhbEF0dHJpYnV0ZShlbGVtZW50LCBzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgY29uc3QgY2FsY3VsYXRlZFZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShzdHlsZVByb3BlcnR5KTtcbiAgICAgICAgZWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZVByb3BlcnR5LCBgJHtjYWxsYmFjayhOdW1iZXIucGFyc2VGbG9hdChjYWxjdWxhdGVkVmFsdWUpKX1weGApO1xuICAgICAgfTtcbiAgICAgIHRoaXMuX2FwcGx5TWFuaXB1bGF0aW9uQ2FsbGJhY2soc2VsZWN0b3IsIG1hbmlwdWxhdGlvbkNhbGxCYWNrKTtcbiAgICB9XG4gICAgX3NhdmVJbml0aWFsQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpIHtcbiAgICAgIGNvbnN0IGFjdHVhbFZhbHVlID0gZWxlbWVudC5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKHN0eWxlUHJvcGVydHkpO1xuICAgICAgaWYgKGFjdHVhbFZhbHVlKSB7XG4gICAgICAgIE1hbmlwdWxhdG9yLnNldERhdGFBdHRyaWJ1dGUoZWxlbWVudCwgc3R5bGVQcm9wZXJ0eSwgYWN0dWFsVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICBfcmVzZXRFbGVtZW50QXR0cmlidXRlcyhzZWxlY3Rvciwgc3R5bGVQcm9wZXJ0eSkge1xuICAgICAgY29uc3QgbWFuaXB1bGF0aW9uQ2FsbEJhY2sgPSBlbGVtZW50ID0+IHtcbiAgICAgICAgY29uc3QgdmFsdWUgPSBNYW5pcHVsYXRvci5nZXREYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgICAvLyBXZSBvbmx5IHdhbnQgdG8gcmVtb3ZlIHRoZSBwcm9wZXJ0eSBpZiB0aGUgdmFsdWUgaXMgYG51bGxgOyB0aGUgdmFsdWUgY2FuIGFsc28gYmUgemVyb1xuICAgICAgICBpZiAodmFsdWUgPT09IG51bGwpIHtcbiAgICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHN0eWxlUHJvcGVydHkpO1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBNYW5pcHVsYXRvci5yZW1vdmVEYXRhQXR0cmlidXRlKGVsZW1lbnQsIHN0eWxlUHJvcGVydHkpO1xuICAgICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHN0eWxlUHJvcGVydHksIHZhbHVlKTtcbiAgICAgIH07XG4gICAgICB0aGlzLl9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBtYW5pcHVsYXRpb25DYWxsQmFjayk7XG4gICAgfVxuICAgIF9hcHBseU1hbmlwdWxhdGlvbkNhbGxiYWNrKHNlbGVjdG9yLCBjYWxsQmFjaykge1xuICAgICAgaWYgKGluZGV4X2pzLmlzRWxlbWVudChzZWxlY3RvcikpIHtcbiAgICAgICAgY2FsbEJhY2soc2VsZWN0b3IpO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IHNlbCBvZiBTZWxlY3RvckVuZ2luZS5maW5kKHNlbGVjdG9yLCB0aGlzLl9lbGVtZW50KSkge1xuICAgICAgICBjYWxsQmFjayhzZWwpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBTY3JvbGxCYXJIZWxwZXI7XG5cbn0pKTtcbi8vIyBzb3VyY2VNYXBwaW5nVVJMPXNjcm9sbGJhci5qcy5tYXBcbiIsIi8vIHZhciB0ZW1wbGF0ZVVybCA9IHNpdGUudGhlbWVfdXJsOyAvLyB0aGlzIGNvbWVzIGZyb20gZnVuY3Rpb25zLnBocFxuXG4vLyBDdXN0b21pemUgQm9vdFN0cmFwIC0gaW1wb3J0IG9ubHkgd2hhdCB3ZSBuZWVkXG4vLyBpbXBvcnQgQWxlcnQgZnJvbSAnYm9vdHN0cmFwL2pzL2Rpc3QvYWxlcnQnO1xuLy8gaW1wb3J0IEJ1dHRvbiBmcm9tICdib290c3RyYXAvanMvZGlzdC9idXR0b24nO1xuLy8gaW1wb3J0IENhcm91c2VsIGZyb20gJ2Jvb3RzdHJhcC9qcy9kaXN0L2Nhcm91c2VsJztcbi8vIGltcG9ydCBDb2xsYXBzZSBmcm9tICdib290c3RyYXAvanMvZGlzdC9jb2xsYXBzZSc7XG4vLyBpbXBvcnQgRHJvcGRvd24gZnJvbSAnYm9vdHN0cmFwL2pzL2Rpc3QvZHJvcGRvd24nO1xuaW1wb3J0IE1vZGFsIGZyb20gJ2Jvb3RzdHJhcC9qcy9kaXN0L21vZGFsJztcbi8vIGltcG9ydCBPZmZjYW52YXMgZnJvbSAnYm9vdHN0cmFwL2pzL2Rpc3Qvb2ZmY2FudmFzJztcbi8vIGltcG9ydCBQb3BvdmVyIGZyb20gJ2Jvb3RzdHJhcC9qcy9kaXN0L3BvcG92ZXInO1xuLy8gaW1wb3J0IFNjcm9sbFNweSBmcm9tICdib290c3RyYXAvanMvZGlzdC9zY3JvbGxzcHknO1xuLy8gaW1wb3J0IFRhYiBmcm9tICdib290c3RyYXAvanMvZGlzdC90YWInO1xuLy8gaW1wb3J0IFRvYXN0IGZyb20gJ2Jvb3RzdHJhcC9qcy9kaXN0L3RvYXN0Jztcbi8vIGltcG9ydCBUb29sdGlwIGZyb20gJ2Jvb3RzdHJhcC9qcy9kaXN0L3Rvb2x0aXAnO1xuXG4vLyBBcHBcbmltcG9ydCB7IE1haW5NZW51IH0gZnJvbSAnLi9tb2R1bGVzL2dsb2JhbC9tYWluTWVudSc7XG4vLyBpbXBvcnQgeyBGcm9udFBhZ2UgfSBmcm9tICcuL21vZHVsZXMvcGFnZXMvZnJvbnRQYWdlJztcblxuY29uc3QgaW5pdEFwcCA9ICgpID0+IHtcbiAgY29uc3QgYm9keUVsID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXTtcblxuICAvLyBHTE9CQUxcbiAgY29uc3QgQmFubmVycyA9IHJlcXVpcmUoJy4vbW9kdWxlcy9nbG9iYWwvYmFubmVycycpO1xuICBCYW5uZXJzLmluaXQoKTtcblxuICBjb25zdCBGb3JtcyA9IHJlcXVpcmUoJy4vbW9kdWxlcy9nbG9iYWwvZm9ybXMnKTtcbiAgRm9ybXMuaW5pdCgpO1xuXG4gIGNvbnN0IEhlcm9zID0gcmVxdWlyZSgnLi9tb2R1bGVzL2dsb2JhbC9oZXJvcycpO1xuICBIZXJvcy5pbml0KCk7XG5cbiAgY29uc3QgTG9jYXRpb24gPSB3aW5kb3cuTG9jYXRpb24gPSByZXF1aXJlKCcuL21vZHVsZXMvZ2xvYmFsL2xvY2F0aW9uJyk7XG4gIExvY2F0aW9uLmluaXQoKTtcblxuICAvLyBHTE9CQUxcbiAgY29uc3QgbWFpbk1lbnUgPSBuZXcgTWFpbk1lbnUoKTtcbiAgbWFpbk1lbnUuaW5pdCgpO1xuXG4gIGNvbnN0IE1hcENsaWVudFRpbWVUb1NlcnZpY2UgPSB3aW5kb3cuTWFwQ2xpZW50VGltZVRvU2VydmljZSA9IHJlcXVpcmUoJy4vbW9kdWxlcy9nbG9iYWwvbWFwQ2xpZW50VGltZVRvU2VydmljZScpO1xuXG4gIGNvbnN0IE1vZGFscyA9IHJlcXVpcmUoJy4vbW9kdWxlcy9nbG9iYWwvbW9kYWxzJyk7XG4gIE1vZGFscy5pbml0KCk7XG5cbiAgLy8gUEFHRSBERVRFQ1RJT05cbiAgaWYgKGJvZHlFbC5jbGFzc0xpc3QuY29udGFpbnMoJ3BhZ2UtaG9tZScpKSB7XG4gICAgY29uc3QgRnJvbnRQYWdlID0gcmVxdWlyZSgnLi9tb2R1bGVzL3BhZ2VzL2Zyb250UGFnZScpO1xuICAgIEZyb250UGFnZS5pbml0KCk7XG4gIH1cblxuICBpZiAoYm9keUVsLmNsYXNzTGlzdC5jb250YWlucygncGFnZS1nYWxsZXJ5JykpIHtcbiAgICBjb25zdCBHYWxsZXJ5UGFnZSA9IHJlcXVpcmUoJy4vbW9kdWxlcy9wYWdlcy9nYWxsZXJ5UGFnZScpO1xuICAgIEdhbGxlcnlQYWdlLmluaXQoKTtcbiAgfVxuXG4gIGlmIChib2R5RWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdwYWdlLW1lbnUnKSkge1xuICAgIGNvbnN0IE1lbnVQYWdlID0gcmVxdWlyZSgnLi9tb2R1bGVzL3BhZ2VzL21lbnVQYWdlJyk7XG4gICAgTWVudVBhZ2UuaW5pdCgpO1xuICB9XG5cbiAgd2luZG93LnNob3dHbG9iYWxNb2RhbCA9IChzZWxlY3RvcikgPT4ge1xuICAgIGNvbnN0IHRhcmdldE1vZGFsID0gbmV3IE1vZGFsKHNlbGVjdG9yKTtcbiAgICB0YXJnZXRNb2RhbC5zaG93KCk7XG4gIH07XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnbm8tanMnKTtcbiAgaW5pdEFwcCggalF1ZXJ5ICk7XG59KSgpO1xuIiwiY29uc3QgQmFubmVycyA9ICgoJCkgPT4ge1xuICBsZXQgX2VscyA9IHt9O1xuICBsZXQgY3VycmVudEluZGV4ID0gMDtcbiAgbGV0IHRvdGFsSXRlbXM7XG4gIGxldCBkaXJlY3Rpb24gPSAnbmV4dCc7XG5cbiAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICBfZWxzLmJhbm5lciA9ICQoJy5iYW5uZXItLXRvcCcpO1xuICAgIF9lbHMubmF2UHJldiA9ICQoJy5iYW5uZXItLXRvcCAubmF2LWJ0bi0tcHJldicpO1xuICAgIF9lbHMubmF2TmV4dCA9ICQoJy5iYW5uZXItLXRvcCAubmF2LWJ0bi0tbmV4dCcpO1xuICAgIF9lbHMubWVzc2FnZXMgPSAkKCcuYmFubmVyLS10b3AgLmJhbm5lcl9fbWVzc2FnZScpO1xuICAgIF9lbHMuY3VycmVudFR4dCA9ICQoJy5iYW5uZXItLXRvcCAuY291bnRfX2N1cnJlbnQnKTtcblxuICAgIHRvdGFsSXRlbXMgPSBfZWxzLm1lc3NhZ2VzLmxlbmd0aDtcblxuICAgIF9hZGRMaXN0ZW5lcnMoKTtcbiAgfTtcblxuICBjb25zdCBfYWRkTGlzdGVuZXJzID0gKCkgPT4ge1xuICAgIF9lbHMubmF2UHJldi5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgY3VycmVudEluZGV4LS07XG4gICAgICBkaXJlY3Rpb24gPSAncHJldic7XG4gICAgICBfaW5jcmVtZW50QmFubmVyKCk7XG4gICAgfSk7XG5cbiAgICBfZWxzLm5hdk5leHQub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgIGN1cnJlbnRJbmRleCsrO1xuICAgICAgZGlyZWN0aW9uID0gJ25leHQnO1xuICAgICAgX2luY3JlbWVudEJhbm5lcigpO1xuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IF9pbmNyZW1lbnRCYW5uZXIgPSAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnRJbmRleCA8IDApIHtcbiAgICAgIGN1cnJlbnRJbmRleCA9IHRvdGFsSXRlbXMgLSAxO1xuICAgIH0gZWxzZSBpZiAoY3VycmVudEluZGV4ID49IHRvdGFsSXRlbXMpIHtcbiAgICAgIGN1cnJlbnRJbmRleCA9IDA7XG4gICAgfVxuXG4gICAgaWYgKGRpcmVjdGlvbiA9PT0gJ3ByZXYnKSB7XG4gICAgICBfZWxzLm1lc3NhZ2VzXG4gICAgICAgIC5yZW1vdmVDbGFzcygnaW4gaW4tLWxlZnQgaW4tLXJpZ2h0IG91dCBvdXQtLXJpZ2h0IG91dC0tbGVmdCcpXG4gICAgICAgIC5hZGRDbGFzcygnb3V0IG91dC0tcmlnaHQnKTtcbiAgICAgIF9lbHMubWVzc2FnZXNcbiAgICAgICAgLmVxKGN1cnJlbnRJbmRleClcbiAgICAgICAgLnJlbW92ZUNsYXNzKCdvdXQgb3V0LS1yaWdodCBvdXQtLWxlZnQnKVxuICAgICAgICAuYWRkQ2xhc3MoJ2luIGluLS1yaWdodCcpO1xuICAgIH0gZWxzZSBpZiAoZGlyZWN0aW9uID09PSAnbmV4dCcpIHtcbiAgICAgIF9lbHMubWVzc2FnZXNcbiAgICAgICAgLnJlbW92ZUNsYXNzKCdpbiBpbi0tbGVmdCBpbi0tcmlnaHQgb3V0IG91dC0tcmlnaHQgb3V0LS1sZWZ0JylcbiAgICAgICAgLmFkZENsYXNzKCdvdXQgb3V0LS1sZWZ0Jyk7XG4gICAgICBfZWxzLm1lc3NhZ2VzXG4gICAgICAgIC5lcShjdXJyZW50SW5kZXgpXG4gICAgICAgIC5yZW1vdmVDbGFzcygnb3V0IG91dC0tcmlnaHQgb3V0LS1sZWZ0JylcbiAgICAgICAgLmFkZENsYXNzKCdpbiBpbi0tbGVmdCcpO1xuICAgIH1cblxuICAgIF9lbHMuY3VycmVudFR4dC50ZXh0KGN1cnJlbnRJbmRleCArIDEpO1xuICAgIF9lbHMubmF2UHJldi5jc3MoeyAncG9pbnRlci1ldmVudHMnOiAnbm9uZScgfSk7XG4gICAgX2Vscy5uYXZOZXh0LmNzcyh7ICdwb2ludGVyLWV2ZW50cyc6ICdub25lJyB9KTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgX2Vscy5tZXNzYWdlcy5ub3QoJzplcSgnICsgY3VycmVudEluZGV4ICsgJyknKS5oaWRlKCk7XG4gICAgICBfZWxzLm1lc3NhZ2VzLmVxKGN1cnJlbnRJbmRleCkuc2hvdygpO1xuICAgICAgX2Vscy5uYXZQcmV2LmNzcyh7ICdwb2ludGVyLWV2ZW50cyc6ICdhbGwnIH0pO1xuICAgICAgX2Vscy5uYXZOZXh0LmNzcyh7ICdwb2ludGVyLWV2ZW50cyc6ICdhbGwnIH0pO1xuICAgIH0sIDM1MCk7XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaW5pdDogaW5pdCxcbiAgfTtcbn0pKGpRdWVyeSk7XG4iLCJjb25zdCBGb3JtcyA9ICgoJCkgPT4ge1xuICBsZXQgX2VscyA9IHt9O1xuXG4gIGNvbnN0IGluaXQgPSAoKSA9PiB7XG4gICAgX2Vscy5pbnB1dEdyb3VwcyA9ICQoJy5pbnB1dC1ncm91cCcpO1xuXG4gICAgX2FkZExpc3RlbmVycygpO1xuICB9O1xuXG4gIGNvbnN0IF9hZGRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgJC5lYWNoKF9lbHMuaW5wdXRHcm91cHMsIChpLCB2YWwpID0+IHtcbiAgICAgIGxldCBpbnB1dCA9ICQodmFsKS5maW5kKCdpbnB1dC5mb3JtLWNvbnRyb2wnKTtcbiAgICAgIGlucHV0Lm9uKCdmb2N1cycsIChlKSA9PiB7XG4gICAgICAgICQodmFsKS5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICB9KTtcbiAgICAgIGlucHV0Lm9uKCdibHVyJywgKGUpID0+IHtcbiAgICAgICAgJCh2YWwpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGluaXQ6IGluaXQsXG4gIH07XG59KShqUXVlcnkpO1xuIiwiY29uc3QgSGVyb3MgPSAoKCQpID0+IHtcbiAgbGV0IF9lbHMgPSB7fTtcbiAgbGV0IF9oZWFkZXJIZWlnaHQ7XG5cbiAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICBnc2FwLnJlZ2lzdGVyUGx1Z2luKFNjcm9sbFRyaWdnZXIpO1xuXG4gICAgX2luaXRTY3JvbGwoKTtcbiAgICBfaW5pdEhlcm9Sb3RhdG9yKCk7XG5cbiAgICAkKCcuYWN0aW9uLWxvY2F0aW9uLXNlbGVjdCcpLmNsaWNrKGZ1bmN0aW9uKGUpIHtcbiAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgIC8vICQoJyNtb2RhbC1sb2NhdGlvbicpLm1vZGFsKCk7IC8vIFRPRE8gQlM1XG4gICAgICB3aW5kb3cuc2hvd0dsb2JhbE1vZGFsKCcjbW9kYWwtbG9jYXRpb24nKTtcbiAgICB9KTtcblxuICB9O1xuXG4gIGNvbnN0IF9pbml0U2Nyb2xsID0gKCkgPT4ge1xuICAgIF9lbHMuaGVhZGVyID0gJCgnLnNlY3Rpb24taGVhZGVyIC5uYXZiYXInKTtcbiAgICBfZWxzLmhlcm9Db250ZW50ID0gJCgnLmhlcm9fX2NvbnRlbnQnKTtcblxuICAgIF9oZWFkZXJIZWlnaHQgPSBfZWxzLmhlYWRlci5vdXRlckhlaWdodCgpO1xuICAgIGxldCBoZWFkZXJIZWlnaHRQZXJjZW50ID0gMSAtIF9oZWFkZXJIZWlnaHQgLyB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICBjb25zdCBoZXJvVGwgPSBnc2FwLnRpbWVsaW5lKHtcbiAgICAgIHNjcm9sbFRyaWdnZXI6IHtcbiAgICAgICAgdHJpZ2dlcjogJy5oZXJvJyxcbiAgICAgICAgc3RhcnQ6ICd0b3AgdG9wJyxcbiAgICAgICAgc2NydWI6IHRydWUsXG4gICAgICAgIHBpbjogZmFsc2UsXG4gICAgICAgIHBpblNwYWNpbmc6IGZhbHNlLFxuICAgICAgICBvblVwZGF0ZTogKHNlbGYpID0+IHtcbiAgICAgICAgICAvLyBjb25zb2xlLmxvZyhzZWxmLnByb2dyZXNzKTtcbiAgICAgICAgICBpZiAoc2VsZi5wcm9ncmVzcyA+PSBoZWFkZXJIZWlnaHRQZXJjZW50ICsgMC4wNSkge1xuICAgICAgICAgICAgX2Vscy5oZWFkZXIuYWRkQ2xhc3MoJ25hdmJhci10aWdodCcpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfZWxzLmhlYWRlci5yZW1vdmVDbGFzcygnbmF2YmFyLXRpZ2h0Jyk7XG4gICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICB9KTtcbiAgfTtcblxuICBjb25zdCBfaW5pdEhlcm9Sb3RhdG9yID0gKCkgPT4ge1xuXG4gICAgbGV0ICRzbGlkZXMgPSAkKCcuaGVyb19fYmdfX2ltYWdlJyk7XG4gICAgbGV0IGN1cnJlbnRJbmRleCA9IDA7XG4gICAgbGV0IGl0ZW1JbnRlcnZhbCA9IDUwMDA7XG5cbiAgICAvLyByZXR1cm4gaWYgbm9uZSBmb3VuZFxuICAgIGlmICgkc2xpZGVzLmxlbmd0aCA8IDEpIHJldHVybjtcblxuICAgIC8vIHNob3cgdGhlIGZpcnN0IGl0ZW1cbiAgICAkc2xpZGVzLmVxKCBjdXJyZW50SW5kZXggKS5hZGRDbGFzcyggJ2FjdGl2ZScgKTtcblxuICAgIC8vIHJ1biB0aGUgaW50ZXJ2YWxcbiAgICBfaW50ZXJ2YWwoKCkgPT4ge1xuICAgICAgLy8gaGlkZSBjdXJyZW50XG4gICAgICAkc2xpZGVzLmVxKGN1cnJlbnRJbmRleCkucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuXG4gICAgICAvLyBpbmNyZW1lbnRcbiAgICAgIGlmIChjdXJyZW50SW5kZXggPT09ICRzbGlkZXMubGVuZ3RoIC0gMSkge1xuICAgICAgICBjdXJyZW50SW5kZXggPSAwO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY3VycmVudEluZGV4Kys7XG4gICAgICB9XG4gICAgICAvLyBzaG93IG5leHRcbiAgICAgICRzbGlkZXMuZXEoIGN1cnJlbnRJbmRleCApLmFkZENsYXNzKCdhY3RpdmUnKTtcblxuICAgIH0sIGl0ZW1JbnRlcnZhbCwgMTAwKTtcbiAgfTtcblxuICAvLyBDdXN0b20gaW50ZXJ2YWwgZnVuY3Rpb25cbiAgY29uc3QgX2ludGVydmFsID0gKGZ1bmMsIHdhaXQsIHRpbWVzKSA9PiB7XG4gICAgbGV0IGludGVydiA9ICgodywgdCkgPT4ge1xuICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiB0ID09PSAndW5kZWZpbmVkJyB8fCB0LS0gPiAwKSB7XG4gICAgICAgICAgc2V0VGltZW91dChpbnRlcnYsIHcpO1xuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBmdW5jLmNhbGwobnVsbCk7XG4gICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdCA9IDA7XG4gICAgICAgICAgICB0aHJvdyBlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9O1xuICAgIH0pKHdhaXQsIHRpbWVzKTtcblxuICAgIHNldFRpbWVvdXQoaW50ZXJ2LCB3YWl0KTtcbiAgfTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpbml0OiBpbml0LFxuICB9O1xufSkoalF1ZXJ5KTtcbiIsImNvbnN0IExvY2F0aW9uID0gKCgkKSA9PiB7XG4gIGxldCBfZWxzID0ge307XG5cbiAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICBfZWxzLmJvZHkgPSAkKCdib2R5Jyk7XG4gICAgX2Vscy5sb2FkaW5nT3ZlcmxheSA9ICQoJyNsb2FkaW5nLW92ZXJsYXknKTtcbiAgfTtcblxuICBjb25zdCBfc2hvd0xvYWRpbmdPdmVybGF5ID0gKCkgPT4ge1xuICAgIF9lbHMuYm9keS5hZGRDbGFzcygnbm8tc2Nyb2xsJyk7XG4gICAgX2Vscy5sb2FkaW5nT3ZlcmxheS5hZGRDbGFzcygnc2hvdycpO1xuICB9O1xuXG4gIGNvbnN0IHNldExvY2F0aW9uID0gKGxvY2F0aW9uLCByZWRpcmVjdD0nJykgPT4ge1xuICAgIGNvbnNvbGUubG9nKCAnc2V0TG9jYXRpb246ICcsIGxvY2F0aW9uLCByZWRpcmVjdCApO1xuXG4gICAgX3Nob3dMb2FkaW5nT3ZlcmxheSgpO1xuXG4gICAgalF1ZXJ5LmFqYXgoe1xuICAgICAgdXJsOiAnL3dwLWFkbWluL2FkbWluLWFqYXgucGhwJyxcbiAgICAgIHR5cGU6ICdQT1NUJyxcbiAgICAgIGRhdGFUeXBlOiAnSlNPTicsXG4gICAgICBkYXRhOiB7XG4gICAgICAgIGFjdGlvbjogJ3NldF9sb2NhdGlvbicsXG4gICAgICAgIGxvY2F0aW9uOiBsb2NhdGlvbixcbiAgICAgIH0sXG4gICAgICBzdWNjZXNzOiBmdW5jdGlvbiAocmVzcG9uc2UpIHtcblxuICAgICAgICBpZiAocmVzcG9uc2Uuc3VjY2VzcyA9PT0gdHJ1ZSkge1xuXG4gICAgICAgICAgaWYoIHJlZGlyZWN0ICl7XG5cbiAgICAgICAgICAgIC8vY29uc29sZS5sb2cgKCAneWVzIHJlZGlyZWN0ICcgKyByZWRpcmVjdCApO1xuICAgICAgICAgICAgLy8gaGlzdG9yeS5yZXBsYWNlU3RhdGUoIHt9ICwgJ1Jlc2VydmUnLCAnL3Jlc2VydmUnICk7XG4gICAgICAgICAgICAvLyB3aW5kb3cubG9jYXRpb24ucmVwbGFjZSggJy9yZXNlcnZlJyApO1xuICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmFzc2lnbiggcmVkaXJlY3QgKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXZlbnJvb21zX2Zvcm0nKS5jb250ZW50V2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuXG4gICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgLy9jb25zb2xlLmxvZyAoICdubyByZWRpcmVjdCcgKTtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nICggJ2Zvcm0nLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2V2ZW5yb29tc19mb3JtJykgKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5yZWxvYWQoIHRydWUgKTtcbiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzZXZlbnJvb21zX2Zvcm0nKS5jb250ZW50V2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnN1Y2Nlc3MgPT09IGZhbHNlKSB7XG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciA6OiBQcm9ibGVtIHNldHRpbmcgdGhlIGxvY2F0aW9uJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdGhpcyBcImVycm9yXCIgY2FzZSBtZWFucyB0aGUgYWpheCBjYWxsLCBpdHNlbGYsIHN1Y2NlZWRlZCwgYnV0IHRoZSBmdW5jdGlvbiBjYWxsZWQgcmV0dXJuZWQgYW4gZXJyb3IgY29uZGl0aW9uXG4gICAgICAgICAgY29uc29sZS53YXJuKCdFcnJvciA6OiBQcm9ibGVtIHJldHVybmVkIGZyb20gdGhlIFBIUCBmdW5jdGlvbicpO1xuICAgICAgICB9XG4gICAgICB9LFxuICAgICAgZXJyb3I6IGZ1bmN0aW9uICh4aHIsIGFqYXhPcHRpb25zLCB0aHJvd25FcnJvcikge1xuICAgICAgICAvLyB0aGlzIGVycm9yIGNhc2UgbWVhbnMgdGhhdCB0aGUgYWpheCBjYWxsLCBpdHNlbGYsIGZhaWxlZCwgZS5nLiwgYSBzeW50YXggZXJyb3IgaW4geW91cl9mdW5jdGlvbigpXG4gICAgICAgIGNvbnNvbGUud2FybignUmVxdWVzdCBmYWlsZWQgOjogJyArIHRocm93bkVycm9yKTtcbiAgICAgIH0sXG4gICAgfSk7XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaW5pdDogaW5pdCxcbiAgICBzZXRMb2NhdGlvbjogc2V0TG9jYXRpb24sXG4gIH07XG59KShqUXVlcnkpO1xuIiwiaW1wb3J0IE1vZGFsIGZyb20gJ2Jvb3RzdHJhcC9qcy9kaXN0L21vZGFsJztcblxuZXhwb3J0IGZ1bmN0aW9uIE1haW5NZW51KCkge1xuICBjb25zdCBfZWxzID0ge307XG5cbiAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICBfZWxzLm5hdmJhciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uYXZiYXInKTtcbiAgICBfZWxzLmhhbWJ1cmdlciA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5uYXZiYXIgLmhhbWJ1cmdlcicpO1xuICAgIF9lbHMubWFpbk1lbnUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnbWFwbGVhbmRhc2hNYWluTWVudScpO1xuICAgIF9lbHMubWFpbk1lbnVMb2NhdGlvbkRyb3Bkb3duID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLmFjdGlvbi1sb2NhdGlvbi1zZWxlY3QnKTtcbiAgICBfZWxzLmxvY2F0aW9uRHJvcEl0ZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI21hcGxlYW5kYXNoTWFpbk1lbnUgLmRyb3Bkb3duLWl0ZW0nKTtcbiAgICBfZWxzLmxvY2F0aW9uRHJvcFR4dCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJyNtYXBsZWFuZGFzaE1haW5NZW51IC5kcm9wZG93bi10b2dnbGUgc3BhbicpO1xuXG4gICAgY29uc29sZS5sb2coX2Vscy5sb2NhdGlvbkRyb3BJdGVtcyk7XG4gICAgX2FkZExpc3RlbmVycygpO1xuICB9O1xuXG4gIGNvbnN0IF9hZGRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgX2Vscy5tYWluTWVudUxvY2F0aW9uRHJvcGRvd24uYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgY29uc3QgbG9jYXRpb25Nb2RhbCA9IG5ldyBNb2RhbCgnI21vZGFsLWxvY2F0aW9uJyk7XG4gICAgICBsb2NhdGlvbk1vZGFsLnNob3coKTtcbiAgICB9KTtcblxuICAgIF9lbHMubWFpbk1lbnUuYWRkRXZlbnRMaXN0ZW5lcignc2hvdy5icy5jb2xsYXBzZScsIChlKSA9PiB7XG4gICAgICBfZWxzLmhhbWJ1cmdlci5jbGFzc0xpc3QuYWRkKCdpcy1hY3RpdmUnKTtcbiAgICB9KTtcblxuICAgIF9lbHMubWFpbk1lbnUuYWRkRXZlbnRMaXN0ZW5lcignaGlkZS5icy5jb2xsYXBzZScsIChlKSA9PiB7XG4gICAgICBfZWxzLmhhbWJ1cmdlci5jbGFzc0xpc3QucmVtb3ZlKCdpcy1hY3RpdmUnKTtcbiAgICB9KTtcblxuICAgIGlmIChudWxsICE9IF9lbHMubG9jYXRpb25Ecm9wSXRlbXMpIHtcbiAgICAgIF9lbHMubG9jYXRpb25Ecm9wSXRlbXMuZm9yRWFjaCgoZWwpID0+IHtcbiAgICAgICAgY29uc3QgJHRoaXMgPSBqUXVlcnkoZWwpO1xuICAgICAgICBfZWxzLmxvY2F0aW9uRHJvcEl0ZW1zLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpdGVtLmNsYXNzTGlzdC5yZW1vdmUoJ2FjdGl2ZScpO1xuICAgICAgICB9KTtcbiAgICAgICAgJHRoaXMuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICBfZWxzLmxvY2F0aW9uRHJvcFR4dC50ZXh0KCR0aGlzLnRleHQoKSk7XG5cbiAgICAgICAgd2luZG93LkxvY2F0aW9uLnNldExvY2F0aW9uKCR0aGlzLmRhdGEoJ2xvY2F0aW9uJykpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2Vscy5tYWluTWVudS5hZGRFdmVudExpc3RlbmVyKCdzaG93LmJzLmNvbGxhcHNlJywgKGUpID0+IHtcbiAgICAgIF9lbHMubmF2YmFyLmNsYXNzTGlzdC5hZGQoJ29wZW4nKTtcbiAgICB9KTtcblxuICAgIF9lbHMubWFpbk1lbnUuYWRkRXZlbnRMaXN0ZW5lcignaGlkZS5icy5jb2xsYXBzZScsIChlKSA9PiB7XG4gICAgICBfZWxzLm5hdmJhci5jbGFzc0xpc3QucmVtb3ZlKCdvcGVuJyk7XG4gICAgfSk7XG4gIH07XG5cbiAgcmV0dXJuIHsgaW5pdCB9O1xufVxuIiwiY29uc3QgTWFwQ2xpZW50VGltZVRvU2VydmljZSA9ICgoKSA9PiB7XG4gIGxldCBfY3VycmVudFNlcnZpY2U7XG5cbiAgY29uc3QgZ2V0Q3VycmVudFNlcnZpY2UgPSAoKSA9PiB7XG4gICAgLy8gZm9yIHRlc3RpbmcsIG1hbnVhbGx5IHNldCBjdXJyZW50RGF0ZSBhbmQgcGFzcyB0byBhbGwgaW5zdGFuY2VzIG9mIERhdGUoKSBiZWxvdztcbiAgICAvLyBsZXQgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgnRGVjZW1iZXIgMjAsIDIwMjAgMTA6Mjk6MDAnKTtcbiAgICBsZXQgY3VycmVudERhdGUgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBjdXJyZW50RGF5ID0gY3VycmVudERhdGUuZ2V0RGF5KCk7IC8vIDAgaXMgU3VuZGF5XG5cbiAgICAvLyBjb25zb2xlLmxvZyhjdXJyZW50RGF0ZSk7XG4gICAgLy8gY29uc29sZS5sb2coY3VycmVudERheSk7XG5cbiAgICAvLyBCcnVuY2ggLSAxMDozMGFtIC0gMzowMHBtIC0gU2F0dXJkYXlzICYgU3VuZGF5c1xuICAgIC8vIEx1bmNoIC0gMTI6MDBwbSAtIDM6MDBwbSAtIERhaWx5XG4gICAgLy8gUGl6emEgJiBCb296ZSAtIDM6MDBwbSAtIDU6MDBwbSAtIERhaWx5XG4gICAgLy8gRGlubmVyIC0gNTowMHBtIC0gMTA6MDBwbSAtIERhaWx5XG4gICAgLy8gSGFwcHkgSG91ciAtIDU6MDBwbSAtIDc6MDBwbSAtIFN1bmRheS1XZWRuZXNkYXlcblxuICAgIGxldCBzdGFydEJydW5jaCA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IHN0YXJ0THVuY2ggPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBzdGFydFBpenphID0gbmV3IERhdGUoKTtcbiAgICBsZXQgc3RhcnREaW5uZXIgPSBuZXcgRGF0ZSgpO1xuICAgIGxldCBzdGFydEhhcHB5SG91ciA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IGVuZEhhcHB5SG91ciA9IG5ldyBEYXRlKCk7XG5cbiAgICBzdGFydEJydW5jaC5zZXRIb3Vycyg0LCAwLCAwKTsgLy8gQWN0dWFsIDEwOjMwYW0gKHNldCBlYXJsaWVyIHNvIGl0IHNob3dzIGluIHRoZSBtb3JuaW5nIGluc3RlYWQgb2YgZGlubmVyKVxuICAgIHN0YXJ0THVuY2guc2V0SG91cnMoNCwgMCwgMCk7IC8vIEFjdHVhbCAxMjowMHBtIChzZXQgZWFybGllciBzbyBpdCBzaG93cyBpbiB0aGUgbW9ybmluZyBpbnN0ZWFkIG9mIGRpbm5lcilcbiAgICBzdGFydFBpenphLnNldEhvdXJzKDE1LCAwLCAwKTsgLy8gMzowMHBtXG4gICAgc3RhcnREaW5uZXIuc2V0SG91cnMoMTcsIDAsIDApOyAvLyA1OjAwcG1cbiAgICBzdGFydEhhcHB5SG91ci5zZXRIb3VycygxNywgMCwgMCk7IC8vIDU6MDBwbVxuICAgIGVuZEhhcHB5SG91ci5zZXRIb3VycygxOSwgMCwgMCk7IC8vIDc6MDBwbVxuXG4gICAgaWYgKGN1cnJlbnREYXkgPT09IDAgfHwgY3VycmVudERheSA9PT0gNikge1xuICAgICAgaWYgKGN1cnJlbnREYXRlID49IHN0YXJ0QnJ1bmNoICYmIGN1cnJlbnREYXRlIDwgc3RhcnRQaXp6YSkge1xuICAgICAgICAvLyBTYXQgJiBTdW4gQnJ1bmNoXG4gICAgICAgIF9jdXJyZW50U2VydmljZSA9ICdicnVuY2gnO1xuICAgICAgICByZXR1cm4gX2N1cnJlbnRTZXJ2aWNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoY3VycmVudERhdGUgPj0gc3RhcnRMdW5jaCAmJiBjdXJyZW50RGF0ZSA8IHN0YXJ0UGl6emEpIHtcbiAgICAgICAgLy8gQWxsIG90aGVyIGRheXMgTHVuY2hcbiAgICAgICAgX2N1cnJlbnRTZXJ2aWNlID0gJ2x1bmNoJztcbiAgICAgICAgcmV0dXJuIF9jdXJyZW50U2VydmljZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY3VycmVudERheSA8PSAzICYmIGN1cnJlbnREYXRlID49IHN0YXJ0SGFwcHlIb3VyICYmIGN1cnJlbnREYXRlIDwgZW5kSGFwcHlIb3VyKSB7XG4gICAgICAvLyBTdW5kYXkgdGhyb3VnaCBXZWRuZXNkYXkgSGFwcHkgSG91clxuICAgICAgX2N1cnJlbnRTZXJ2aWNlID0gJ2hhcHB5LWhvdXInO1xuICAgICAgcmV0dXJuIF9jdXJyZW50U2VydmljZTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gaGFuZGxlIHBpenphICYgYm9vemVcbiAgICAgIGlmIChjdXJyZW50RGF0ZSA+PSBzdGFydFBpenphICYmIGN1cnJlbnREYXRlIDwgc3RhcnREaW5uZXIpIHtcbiAgICAgICAgX2N1cnJlbnRTZXJ2aWNlID0gJ3BpenphLWJvb3plJztcbiAgICAgICAgcmV0dXJuIF9jdXJyZW50U2VydmljZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIF9jdXJyZW50U2VydmljZSA9ICdkaW5uZXInO1xuICAgICAgICByZXR1cm4gX2N1cnJlbnRTZXJ2aWNlO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBnZXRDdXJyZW50U2VydmljZTogZ2V0Q3VycmVudFNlcnZpY2UsXG4gIH07XG59KSgpO1xuIiwiY29uc3QgTW9kYWxzID0gKCgkKSA9PiB7XG4gIGxldCBfZWxzID0ge307XG5cbiAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICBfZWxzLmxvY2F0aW9uSXRlbXMgPSAkKCcjbW9kYWwtbG9jYXRpb24gLmxvY2F0aW9uLWJ0bicpO1xuICAgIF9hZGRMaXN0ZW5lcnMoKTtcbiAgfTtcblxuICBjb25zdCBfYWRkTGlzdGVuZXJzID0gKCkgPT4ge1xuICAgICQuZWFjaChfZWxzLmxvY2F0aW9uSXRlbXMsIChpLCB2YWwpID0+IHtcbiAgICAgIGxldCAkdGhpcyA9ICQodmFsKTtcblxuICAgICAgJHRoaXMub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgLy8gJC5mYW5jeWJveC5jbG9zZSgpO1xuICAgICAgICAkKCcjbW9kYWwtbG9jYXRpb24nKS5tb2RhbCgnaGlkZScpO1xuICAgICAgICB3aW5kb3cuTG9jYXRpb24uc2V0TG9jYXRpb24oICR0aGlzLmRhdGEoJ2xvY2F0aW9uJykgKTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9O1xuXG4gIG1vZHVsZS5leHBvcnRzID0ge1xuICAgIGluaXQ6IGluaXQsXG4gIH07XG59KShqUXVlcnkpO1xuIiwiY29uc3QgRnJvbnRQYWdlID0gKCgkKSA9PiB7XG4gIGxldCBfZWxzID0ge307XG4gIGxldCBfY3VycmVudFNlcnZpY2UgPSB3aW5kb3cuTWFwQ2xpZW50VGltZVRvU2VydmljZS5nZXRDdXJyZW50U2VydmljZSgpO1xuXG4gIGNvbnN0IGluaXQgPSAoKSA9PiB7XG4gICAgX2Vscy5iZ1JpZ2h0ID0gJCgnLmNvbnRlbnRfX2JnLXJpZ2h0Jyk7XG4gICAgX2Vscy5sb2NhdGlvbkxpbmtzID0gJCgnLmFjdGlvbi1zZXQtbG9jYXRpb24nKTtcbiAgICBfZWxzLmJnUmlnaHQuYWRkQ2xhc3MoX2N1cnJlbnRTZXJ2aWNlKTtcbiAgICAvLyBjb25zb2xlLmxvZyhfY3VycmVudFNlcnZpY2UpO1xuXG4gICAgX2FkZExpc3RlbmVycygpO1xuICB9O1xuXG4gIGNvbnN0IF9hZGRMaXN0ZW5lcnMgPSAoKSA9PiB7XG4gICAgX2Vscy5sb2NhdGlvbkxpbmtzLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICBsZXQgJHRoaXMgPSAkKGUudGFyZ2V0KTtcbiAgICAgIHdpbmRvdy5Mb2NhdGlvbi5zZXRMb2NhdGlvbiggJHRoaXMuZGF0YSgnbG9jYXRpb24nKSwgJHRoaXMuYXR0cihcImhyZWZcIikgKTtcbiAgICB9KTtcbiAgfTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpbml0OiBpbml0LFxuICB9O1xufSkoalF1ZXJ5KTtcbiIsImNvbnN0IEdhbGxlcnlQYWdlID0gKCgkKSA9PiB7XG4gIGxldCBfZWxzID0ge307XG5cbiAgY29uc3QgaW5pdCA9ICgpID0+IHtcbiAgICBfZWxzLmdhbGxlcnlDb250YWluZXIgPSAkKCcuc2VjdGlvbi1nYWxsZXJ5X19ncmlkJyk7XG4gICAgX2Vscy5hbGxJdGVtcyA9ICQoJy5zZWN0aW9uLWdhbGxlcnlfX2dyaWRfX2l0ZW0nKTtcbiAgICBfZWxzLmZpbHRlcnNBbGxCdG4gPSAkKCcjZmlsdGVycyAuYnRuJyk7XG4gICAgX2Vscy5maWx0ZXJSYWRpb3MgPSAkKCcjZmlsdGVycyBpbnB1dFt0eXBlPVwicmFkaW9cIl0nKTtcblxuICAgIF9lbHMuZ2FsbGVyeUNvbnRhaW5lci5pc290b3BlKHtcbiAgICAgIGl0ZW1TZWxlY3RvcjogJy5zZWN0aW9uLWdhbGxlcnlfX2dyaWRfX2l0ZW0nLFxuICAgICAgbGF5b3V0TW9kZTogJ3BhY2tlcnknLFxuICAgIH0pO1xuXG4gICAgLy8gQWxsIGJ1dHRvblxuICAgIF9lbHMuZmlsdGVyc0FsbEJ0bi5vbignY2xpY2snLCAoZSkgPT4ge1xuICAgICAgX2Vscy5nYWxsZXJ5Q29udGFpbmVyLmlzb3RvcGUoeyBmaWx0ZXI6ICcqJyB9KTtcbiAgICAgIF9lbHMuZmlsdGVyUmFkaW9zLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICBfcmVzZXRHYWxsZXJ5KCk7XG4gICAgfSk7XG5cbiAgICAvLyBMb2NhdGlvbiByYWRpb3NcbiAgICBfZWxzLmZpbHRlclJhZGlvcy5vbignY2hhbmdlJywgKGUpID0+IHtcbiAgICAgIGxldCAkdGhpcyA9ICQoZS50YXJnZXQpO1xuICAgICAgbGV0IGZpbHRlclZhbCA9ICR0aGlzLmF0dHIoJ2RhdGEtZmlsdGVyJyk7XG4gICAgICBfZWxzLmdhbGxlcnlDb250YWluZXIuaXNvdG9wZSh7IGZpbHRlcjogZmlsdGVyVmFsIH0pO1xuICAgICAgX3Jlc2V0R2FsbGVyeSgpO1xuICAgIH0pO1xuXG4gICAgLy8gZ2FsbGVyeVxuICAgIF9pbml0R2FsbGVyeSgpO1xuICB9O1xuXG4gIGNvbnN0IF9pbml0R2FsbGVyeSA9ICgpID0+IHtcbiAgICAkKCkuZmFuY3lib3goe1xuICAgICAgc2VsZWN0b3IgOiAnLmlzby12aXNpYmxlJyxcbiAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgXCJjbG9zZVwiXG4gICAgICBdLFxuICAgIH0pO1xuICB9O1xuXG4gIGNvbnN0IF9yZXNldEdhbGxlcnkgPSAoKSA9PiB7XG4gICAgLy8gZ2V0IGN1cnJlbnRseSBmaWx0ZXJlZCBpdGVtcyBmcm9tIGlzb3RvcGUgYW5kIGFkZCAvIHJlbW92ZSBjbGFzc1xuICAgIHZhciAkZmlsdGVyZWRJdGVtcyA9ICQoX2Vscy5nYWxsZXJ5Q29udGFpbmVyLmlzb3RvcGUoJ2dldEZpbHRlcmVkSXRlbUVsZW1lbnRzJykpO1xuICAgIF9lbHMuYWxsSXRlbXMucmVtb3ZlQ2xhc3MoJ2lzby12aXNpYmxlJyk7XG4gICAgJGZpbHRlcmVkSXRlbXMuYWRkQ2xhc3MoJ2lzby12aXNpYmxlJyk7XG4gIH07XG5cbiAgbW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgaW5pdDogaW5pdCxcbiAgfTtcbn0pKGpRdWVyeSk7XG4iLCJjb25zdCBNZW51UGFnZSA9ICgoJCkgPT4ge1xuICBsZXQgX2VscyA9IHt9O1xuICBsZXQgX2N1cnJlbnRTZXJ2aWNlID0gd2luZG93Lk1hcENsaWVudFRpbWVUb1NlcnZpY2UuZ2V0Q3VycmVudFNlcnZpY2UoKTtcblxuICBjb25zdCBpbml0ID0gKCkgPT4ge1xuICAgIF9lbHMubmF2QnRucyA9ICQoJy5tZW51LW5hdi0tdGFicyAuYnRuJyk7XG4gICAgX2Vscy5tZW51Q29udGFpbmVyID0gJCgnLm1lbnUtY29udGFpbmVyJyk7XG4gICAgX2Vscy5tZW51cyA9ICQoJy5tZW51Jyk7XG5cbiAgICBpZiAoX2Vscy5uYXZCdG5zLmxlbmd0aCkge1xuICAgICAgX2Vscy5uYXZCdG5zLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICBsZXQgJHRoaXMgPSAkKGUudGFyZ2V0KTtcbiAgICAgICAgbGV0IHRhcmdldE1lbnUgPSAkdGhpcy5hdHRyKCdkYXRhLXRhcmdldCcpO1xuXG4gICAgICAgIF9lbHMubmF2QnRucy5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgIF9lbHMubWVudXMucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICBfZWxzLm1lbnVzLmZpbHRlcignLicgKyB0YXJnZXRNZW51KS5hZGRDbGFzcygnYWN0aXZlJyk7XG5cbiAgICAgICAgJHRoaXMuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgfSk7XG5cbiAgICAgIC8vIFNldCBhIGRlZmF1bHRcbiAgICAgIF9lbHMubmF2QnRuc1swXS5jbGljaygpO1xuICAgIH1cbiAgfTtcblxuICBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBpbml0OiBpbml0LFxuICB9O1xufSkoalF1ZXJ5KTtcbiJdfQ=="}