{"version":3,"file":"bundle.js","sources":["../../../node_modules/svelte/internal/index.mjs","../../../node_modules/ssr-window/ssr-window.esm.js","../../../node_modules/dom7/dom7.esm.js","../../../node_modules/swiper/shared/dom.js","../../../node_modules/swiper/shared/utils.js","../../../node_modules/swiper/shared/get-support.js","../../../node_modules/swiper/shared/get-device.js","../../../node_modules/swiper/shared/get-browser.js","../../../node_modules/swiper/core/events-emitter.js","../../../node_modules/swiper/core/transition/transitionEmit.js","../../../node_modules/swiper/core/events/onTouchStart.js","../../../node_modules/swiper/core/events/onTouchMove.js","../../../node_modules/swiper/core/events/onTouchEnd.js","../../../node_modules/swiper/core/events/onResize.js","../../../node_modules/swiper/core/events/onClick.js","../../../node_modules/swiper/core/events/onScroll.js","../../../node_modules/swiper/core/events/index.js","../../../node_modules/swiper/core/breakpoints/setBreakpoint.js","../../../node_modules/swiper/core/defaults.js","../../../node_modules/swiper/core/moduleExtendParams.js","../../../node_modules/swiper/core/core.js","../../../node_modules/swiper/core/update/index.js","../../../node_modules/swiper/core/update/updateSize.js","../../../node_modules/swiper/core/update/updateSlides.js","../../../node_modules/swiper/core/update/updateAutoHeight.js","../../../node_modules/swiper/core/update/updateSlidesOffset.js","../../../node_modules/swiper/core/update/updateSlidesProgress.js","../../../node_modules/swiper/core/update/updateProgress.js","../../../node_modules/swiper/core/update/updateSlidesClasses.js","../../../node_modules/swiper/core/update/updateActiveIndex.js","../../../node_modules/swiper/core/update/updateClickedSlide.js","../../../node_modules/swiper/core/translate/index.js","../../../node_modules/swiper/core/translate/getTranslate.js","../../../node_modules/swiper/core/translate/setTranslate.js","../../../node_modules/swiper/core/translate/minTranslate.js","../../../node_modules/swiper/core/translate/maxTranslate.js","../../../node_modules/swiper/core/translate/translateTo.js","../../../node_modules/swiper/core/transition/index.js","../../../node_modules/swiper/core/transition/setTransition.js","../../../node_modules/swiper/core/transition/transitionStart.js","../../../node_modules/swiper/core/transition/transitionEnd.js","../../../node_modules/swiper/core/slide/index.js","../../../node_modules/swiper/core/slide/slideTo.js","../../../node_modules/swiper/core/slide/slideToLoop.js","../../../node_modules/swiper/core/slide/slideNext.js","../../../node_modules/swiper/core/slide/slidePrev.js","../../../node_modules/swiper/core/slide/slideReset.js","../../../node_modules/swiper/core/slide/slideToClosest.js","../../../node_modules/swiper/core/slide/slideToClickedSlide.js","../../../node_modules/swiper/core/loop/index.js","../../../node_modules/swiper/core/loop/loopCreate.js","../../../node_modules/swiper/core/loop/loopFix.js","../../../node_modules/swiper/core/loop/loopDestroy.js","../../../node_modules/swiper/core/grab-cursor/index.js","../../../node_modules/swiper/core/grab-cursor/setGrabCursor.js","../../../node_modules/swiper/core/grab-cursor/unsetGrabCursor.js","../../../node_modules/swiper/core/breakpoints/index.js","../../../node_modules/swiper/core/breakpoints/getBreakpoint.js","../../../node_modules/swiper/core/check-overflow/index.js","../../../node_modules/swiper/core/classes/index.js","../../../node_modules/swiper/core/classes/addClasses.js","../../../node_modules/swiper/core/classes/removeClasses.js","../../../node_modules/swiper/core/images/index.js","../../../node_modules/swiper/core/images/loadImage.js","../../../node_modules/swiper/core/images/preloadImages.js","../../../node_modules/swiper/shared/create-element-if-not-defined.js","../../../node_modules/swiper/modules/navigation/navigation.js","../../../node_modules/swiper/shared/classes-to-selector.js","../../../node_modules/swiper/modules/pagination/pagination.js","../../../node_modules/swiper/modules/scrollbar/scrollbar.js","../../../node_modules/swiper/modules/a11y/a11y.js","../../../node_modules/swiper/modules/autoplay/autoplay.js","../../../node_modules/swiper/svelte/utils.js","../../../node_modules/swiper/core/modules/resize/resize.js","../../../node_modules/swiper/core/modules/observer/observer.js","../../../node_modules/swiper/svelte/params-list.js","../../../node_modules/swiper/svelte/update-swiper.js","../../../node_modules/swiper/svelte/swiper.svelte","../../../node_modules/swiper/svelte/get-params.js","../../../node_modules/swiper/svelte/init-swiper.js","../../../node_modules/swiper/svelte/get-changed-params.js","../../../node_modules/swiper/svelte/swiper-slide.svelte","../../../svelte-components/src/filter_utils.js","../../../svelte-components/src/GameCard.svelte","../../../svelte-components/src/Lineup.svelte","../../../svelte-components/src/PlayerCard.svelte","../../../node_modules/gaussian/lib/box-muller.js","../../../node_modules/gaussian/lib/gaussian.js","../../../node_modules/chart.js/dist/chunks/helpers.segment.js","../../../node_modules/chart.js/dist/chart.esm.js","../../../node_modules/chartjs-plugin-annotation/dist/chartjs-plugin-annotation.esm.js","../../../svelte-components/src/OverUnderChart.svelte","../../../svelte-components/src/PremiumOnly.svelte","../../../svelte-components/src/PropCalculator.svelte","../../../svelte-components/src/Gamelog.svelte","../../../svelte-components/src/SeasonAvgTable.svelte","../../../svelte-components/src/PlayerSummary.svelte","../../../svelte-components/src/PlayerModal.svelte","../../../svelte-components/src/Optimizer.svelte","../../../svelte-components/src/NbaSchedule.svelte","../../../svelte-components/src/PlayerDiv.svelte","../../../svelte-components/src/NoProj.svelte","../../../svelte-components/src/NflProj.svelte","../../../svelte-components/src/NbaProj.svelte","../../../svelte-components/src/DailySwiper.svelte","../../../svelte-components/src/BatterTable.svelte","../../../svelte-components/src/PitcherTable.svelte","../../../svelte-components/src/MlbProj.svelte","../../../svelte-components/src/NhlProj.svelte","../../../svelte-components/src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n    // @ts-ignore\n    for (const k in src)\n        tar[k] = src[k];\n    return tar;\n}\nfunction is_promise(value) {\n    return value && typeof value === 'object' && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n    element.__svelte_meta = {\n        loc: { file, line, column, char }\n    };\n}\nfunction run(fn) {\n    return fn();\n}\nfunction blank_object() {\n    return Object.create(null);\n}\nfunction run_all(fns) {\n    fns.forEach(run);\n}\nfunction is_function(thing) {\n    return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n    return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n    if (!src_url_equal_anchor) {\n        src_url_equal_anchor = document.createElement('a');\n    }\n    src_url_equal_anchor.href = url;\n    return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n    return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n    return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n    if (store != null && typeof store.subscribe !== 'function') {\n        throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n    }\n}\nfunction subscribe(store, ...callbacks) {\n    if (store == null) {\n        return noop;\n    }\n    const unsub = store.subscribe(...callbacks);\n    return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n    let value;\n    subscribe(store, _ => value = _)();\n    return value;\n}\nfunction component_subscribe(component, store, callback) {\n    component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n    if (definition) {\n        const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n        return definition[0](slot_ctx);\n    }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n    return definition[1] && fn\n        ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n        : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n    if (definition[2] && fn) {\n        const lets = definition[2](fn(dirty));\n        if ($$scope.dirty === undefined) {\n            return lets;\n        }\n        if (typeof lets === 'object') {\n            const merged = [];\n            const len = Math.max($$scope.dirty.length, lets.length);\n            for (let i = 0; i < len; i += 1) {\n                merged[i] = $$scope.dirty[i] | lets[i];\n            }\n            return merged;\n        }\n        return $$scope.dirty | lets;\n    }\n    return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n    if (slot_changes) {\n        const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n        slot.p(slot_context, slot_changes);\n    }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n    const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n    update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n    if ($$scope.ctx.length > 32) {\n        const dirty = [];\n        const length = $$scope.ctx.length / 32;\n        for (let i = 0; i < length; i++) {\n            dirty[i] = -1;\n        }\n        return dirty;\n    }\n    return -1;\n}\nfunction exclude_internal_props(props) {\n    const result = {};\n    for (const k in props)\n        if (k[0] !== '$')\n            result[k] = props[k];\n    return result;\n}\nfunction compute_rest_props(props, keys) {\n    const rest = {};\n    keys = new Set(keys);\n    for (const k in props)\n        if (!keys.has(k) && k[0] !== '$')\n            rest[k] = props[k];\n    return rest;\n}\nfunction compute_slots(slots) {\n    const result = {};\n    for (const key in slots) {\n        result[key] = true;\n    }\n    return result;\n}\nfunction once(fn) {\n    let ran = false;\n    return function (...args) {\n        if (ran)\n            return;\n        ran = true;\n        fn.call(this, ...args);\n    };\n}\nfunction null_to_empty(value) {\n    return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n    store.set(value);\n    return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n    return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n    ? () => window.performance.now()\n    : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n    now = fn;\n}\nfunction set_raf(fn) {\n    raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n    tasks.forEach(task => {\n        if (!task.c(now)) {\n            tasks.delete(task);\n            task.f();\n        }\n    });\n    if (tasks.size !== 0)\n        raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n    tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n    let task;\n    if (tasks.size === 0)\n        raf(run_tasks);\n    return {\n        promise: new Promise(fulfill => {\n            tasks.add(task = { c: callback, f: fulfill });\n        }),\n        abort() {\n            tasks.delete(task);\n        }\n    };\n}\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n    is_hydrating = true;\n}\nfunction end_hydrating() {\n    is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n    // Return first index of value larger than input value in the range [low, high)\n    while (low < high) {\n        const mid = low + ((high - low) >> 1);\n        if (key(mid) <= value) {\n            low = mid + 1;\n        }\n        else {\n            high = mid;\n        }\n    }\n    return low;\n}\nfunction init_hydrate(target) {\n    if (target.hydrate_init)\n        return;\n    target.hydrate_init = true;\n    // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n    let children = target.childNodes;\n    // If target is <head>, there may be children without claim_order\n    if (target.nodeName === 'HEAD') {\n        const myChildren = [];\n        for (let i = 0; i < children.length; i++) {\n            const node = children[i];\n            if (node.claim_order !== undefined) {\n                myChildren.push(node);\n            }\n        }\n        children = myChildren;\n    }\n    /*\n    * Reorder claimed children optimally.\n    * We can reorder claimed children optimally by finding the longest subsequence of\n    * nodes that are already claimed in order and only moving the rest. The longest\n    * subsequence subsequence of nodes that are claimed in order can be found by\n    * computing the longest increasing subsequence of .claim_order values.\n    *\n    * This algorithm is optimal in generating the least amount of reorder operations\n    * possible.\n    *\n    * Proof:\n    * We know that, given a set of reordering operations, the nodes that do not move\n    * always form an increasing subsequence, since they do not move among each other\n    * meaning that they must be already ordered among each other. Thus, the maximal\n    * set of nodes that do not move form a longest increasing subsequence.\n    */\n    // Compute longest increasing subsequence\n    // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n    const m = new Int32Array(children.length + 1);\n    // Predecessor indices + 1\n    const p = new Int32Array(children.length);\n    m[0] = -1;\n    let longest = 0;\n    for (let i = 0; i < children.length; i++) {\n        const current = children[i].claim_order;\n        // Find the largest subsequence length such that it ends in a value less than our current value\n        // upper_bound returns first greater value, so we subtract one\n        // with fast path for when we are on the current longest subsequence\n        const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n        p[i] = m[seqLen] + 1;\n        const newLen = seqLen + 1;\n        // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n        m[newLen] = i;\n        longest = Math.max(newLen, longest);\n    }\n    // The longest increasing subsequence of nodes (initially reversed)\n    const lis = [];\n    // The rest of the nodes, nodes that will be moved\n    const toMove = [];\n    let last = children.length - 1;\n    for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n        lis.push(children[cur - 1]);\n        for (; last >= cur; last--) {\n            toMove.push(children[last]);\n        }\n        last--;\n    }\n    for (; last >= 0; last--) {\n        toMove.push(children[last]);\n    }\n    lis.reverse();\n    // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n    toMove.sort((a, b) => a.claim_order - b.claim_order);\n    // Finally, we move the nodes\n    for (let i = 0, j = 0; i < toMove.length; i++) {\n        while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n            j++;\n        }\n        const anchor = j < lis.length ? lis[j] : null;\n        target.insertBefore(toMove[i], anchor);\n    }\n}\nfunction append(target, node) {\n    target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n    const append_styles_to = get_root_for_style(target);\n    if (!append_styles_to.getElementById(style_sheet_id)) {\n        const style = element('style');\n        style.id = style_sheet_id;\n        style.textContent = styles;\n        append_stylesheet(append_styles_to, style);\n    }\n}\nfunction get_root_for_style(node) {\n    if (!node)\n        return document;\n    const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n    if (root && root.host) {\n        return root;\n    }\n    return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n    const style_element = element('style');\n    append_stylesheet(get_root_for_style(node), style_element);\n    return style_element;\n}\nfunction append_stylesheet(node, style) {\n    append(node.head || node, style);\n}\nfunction append_hydration(target, node) {\n    if (is_hydrating) {\n        init_hydrate(target);\n        if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentElement !== target))) {\n            target.actual_end_child = target.firstChild;\n        }\n        // Skip nodes of undefined ordering\n        while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n            target.actual_end_child = target.actual_end_child.nextSibling;\n        }\n        if (node !== target.actual_end_child) {\n            // We only insert if the ordering of this node should be modified or the parent node is not target\n            if (node.claim_order !== undefined || node.parentNode !== target) {\n                target.insertBefore(node, target.actual_end_child);\n            }\n        }\n        else {\n            target.actual_end_child = node.nextSibling;\n        }\n    }\n    else if (node.parentNode !== target || node.nextSibling !== null) {\n        target.appendChild(node);\n    }\n}\nfunction insert(target, node, anchor) {\n    target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n    if (is_hydrating && !anchor) {\n        append_hydration(target, node);\n    }\n    else if (node.parentNode !== target || node.nextSibling != anchor) {\n        target.insertBefore(node, anchor || null);\n    }\n}\nfunction detach(node) {\n    node.parentNode.removeChild(node);\n}\nfunction destroy_each(iterations, detaching) {\n    for (let i = 0; i < iterations.length; i += 1) {\n        if (iterations[i])\n            iterations[i].d(detaching);\n    }\n}\nfunction element(name) {\n    return document.createElement(name);\n}\nfunction element_is(name, is) {\n    return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n    const target = {};\n    for (const k in obj) {\n        if (has_prop(obj, k)\n            // @ts-ignore\n            && exclude.indexOf(k) === -1) {\n            // @ts-ignore\n            target[k] = obj[k];\n        }\n    }\n    return target;\n}\nfunction svg_element(name) {\n    return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n    return document.createTextNode(data);\n}\nfunction space() {\n    return text(' ');\n}\nfunction empty() {\n    return text('');\n}\nfunction listen(node, event, handler, options) {\n    node.addEventListener(event, handler, options);\n    return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n    return function (event) {\n        event.preventDefault();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction stop_propagation(fn) {\n    return function (event) {\n        event.stopPropagation();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction self(fn) {\n    return function (event) {\n        // @ts-ignore\n        if (event.target === this)\n            fn.call(this, event);\n    };\n}\nfunction trusted(fn) {\n    return function (event) {\n        // @ts-ignore\n        if (event.isTrusted)\n            fn.call(this, event);\n    };\n}\nfunction attr(node, attribute, value) {\n    if (value == null)\n        node.removeAttribute(attribute);\n    else if (node.getAttribute(attribute) !== value)\n        node.setAttribute(attribute, value);\n}\nfunction set_attributes(node, attributes) {\n    // @ts-ignore\n    const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n    for (const key in attributes) {\n        if (attributes[key] == null) {\n            node.removeAttribute(key);\n        }\n        else if (key === 'style') {\n            node.style.cssText = attributes[key];\n        }\n        else if (key === '__value') {\n            node.value = node[key] = attributes[key];\n        }\n        else if (descriptors[key] && descriptors[key].set) {\n            node[key] = attributes[key];\n        }\n        else {\n            attr(node, key, attributes[key]);\n        }\n    }\n}\nfunction set_svg_attributes(node, attributes) {\n    for (const key in attributes) {\n        attr(node, key, attributes[key]);\n    }\n}\nfunction set_custom_element_data(node, prop, value) {\n    if (prop in node) {\n        node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n    }\n    else {\n        attr(node, prop, value);\n    }\n}\nfunction xlink_attr(node, attribute, value) {\n    node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n    const value = new Set();\n    for (let i = 0; i < group.length; i += 1) {\n        if (group[i].checked)\n            value.add(group[i].__value);\n    }\n    if (!checked) {\n        value.delete(__value);\n    }\n    return Array.from(value);\n}\nfunction to_number(value) {\n    return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n    const array = [];\n    for (let i = 0; i < ranges.length; i += 1) {\n        array.push({ start: ranges.start(i), end: ranges.end(i) });\n    }\n    return array;\n}\nfunction children(element) {\n    return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n    if (nodes.claim_info === undefined) {\n        nodes.claim_info = { last_index: 0, total_claimed: 0 };\n    }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n    // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n    init_claim_info(nodes);\n    const resultNode = (() => {\n        // We first try to find an element after the previous one\n        for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n            const node = nodes[i];\n            if (predicate(node)) {\n                const replacement = processNode(node);\n                if (replacement === undefined) {\n                    nodes.splice(i, 1);\n                }\n                else {\n                    nodes[i] = replacement;\n                }\n                if (!dontUpdateLastIndex) {\n                    nodes.claim_info.last_index = i;\n                }\n                return node;\n            }\n        }\n        // Otherwise, we try to find one before\n        // We iterate in reverse so that we don't go too far back\n        for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n            const node = nodes[i];\n            if (predicate(node)) {\n                const replacement = processNode(node);\n                if (replacement === undefined) {\n                    nodes.splice(i, 1);\n                }\n                else {\n                    nodes[i] = replacement;\n                }\n                if (!dontUpdateLastIndex) {\n                    nodes.claim_info.last_index = i;\n                }\n                else if (replacement === undefined) {\n                    // Since we spliced before the last_index, we decrease it\n                    nodes.claim_info.last_index--;\n                }\n                return node;\n            }\n        }\n        // If we can't find any matching node, we create a new one\n        return createNode();\n    })();\n    resultNode.claim_order = nodes.claim_info.total_claimed;\n    nodes.claim_info.total_claimed += 1;\n    return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n    return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n        const remove = [];\n        for (let j = 0; j < node.attributes.length; j++) {\n            const attribute = node.attributes[j];\n            if (!attributes[attribute.name]) {\n                remove.push(attribute.name);\n            }\n        }\n        remove.forEach(v => node.removeAttribute(v));\n        return undefined;\n    }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n    return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n    return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n    return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n        const dataStr = '' + data;\n        if (node.data.startsWith(dataStr)) {\n            if (node.data.length !== dataStr.length) {\n                return node.splitText(dataStr.length);\n            }\n        }\n        else {\n            node.data = dataStr;\n        }\n    }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n    );\n}\nfunction claim_space(nodes) {\n    return claim_text(nodes, ' ');\n}\nfunction find_comment(nodes, text, start) {\n    for (let i = start; i < nodes.length; i += 1) {\n        const node = nodes[i];\n        if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n            return i;\n        }\n    }\n    return nodes.length;\n}\nfunction claim_html_tag(nodes) {\n    // find html opening tag\n    const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n    const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n    if (start_index === end_index) {\n        return new HtmlTagHydration();\n    }\n    init_claim_info(nodes);\n    const html_tag_nodes = nodes.splice(start_index, end_index + 1);\n    detach(html_tag_nodes[0]);\n    detach(html_tag_nodes[html_tag_nodes.length - 1]);\n    const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n    for (const n of claimed_nodes) {\n        n.claim_order = nodes.claim_info.total_claimed;\n        nodes.claim_info.total_claimed += 1;\n    }\n    return new HtmlTagHydration(claimed_nodes);\n}\nfunction set_data(text, data) {\n    data = '' + data;\n    if (text.wholeText !== data)\n        text.data = data;\n}\nfunction set_input_value(input, value) {\n    input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n    try {\n        input.type = type;\n    }\n    catch (e) {\n        // do nothing\n    }\n}\nfunction set_style(node, key, value, important) {\n    node.style.setProperty(key, value, important ? 'important' : '');\n}\nfunction select_option(select, value) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        if (option.__value === value) {\n            option.selected = true;\n            return;\n        }\n    }\n    select.selectedIndex = -1; // no option should be selected\n}\nfunction select_options(select, value) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        option.selected = ~value.indexOf(option.__value);\n    }\n}\nfunction select_value(select) {\n    const selected_option = select.querySelector(':checked') || select.options[0];\n    return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n    return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n    if (crossorigin === undefined) {\n        crossorigin = false;\n        try {\n            if (typeof window !== 'undefined' && window.parent) {\n                void window.parent.document;\n            }\n        }\n        catch (error) {\n            crossorigin = true;\n        }\n    }\n    return crossorigin;\n}\nfunction add_resize_listener(node, fn) {\n    const computed_style = getComputedStyle(node);\n    if (computed_style.position === 'static') {\n        node.style.position = 'relative';\n    }\n    const iframe = element('iframe');\n    iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n        'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n    iframe.setAttribute('aria-hidden', 'true');\n    iframe.tabIndex = -1;\n    const crossorigin = is_crossorigin();\n    let unsubscribe;\n    if (crossorigin) {\n        iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n        unsubscribe = listen(window, 'message', (event) => {\n            if (event.source === iframe.contentWindow)\n                fn();\n        });\n    }\n    else {\n        iframe.src = 'about:blank';\n        iframe.onload = () => {\n            unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n        };\n    }\n    append(node, iframe);\n    return () => {\n        if (crossorigin) {\n            unsubscribe();\n        }\n        else if (unsubscribe && iframe.contentWindow) {\n            unsubscribe();\n        }\n        detach(iframe);\n    };\n}\nfunction toggle_class(element, name, toggle) {\n    element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, bubbles = false) {\n    const e = document.createEvent('CustomEvent');\n    e.initCustomEvent(type, bubbles, false, detail);\n    return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n    return Array.from(parent.querySelectorAll(selector));\n}\nclass HtmlTag {\n    constructor() {\n        this.e = this.n = null;\n    }\n    c(html) {\n        this.h(html);\n    }\n    m(html, target, anchor = null) {\n        if (!this.e) {\n            this.e = element(target.nodeName);\n            this.t = target;\n            this.c(html);\n        }\n        this.i(anchor);\n    }\n    h(html) {\n        this.e.innerHTML = html;\n        this.n = Array.from(this.e.childNodes);\n    }\n    i(anchor) {\n        for (let i = 0; i < this.n.length; i += 1) {\n            insert(this.t, this.n[i], anchor);\n        }\n    }\n    p(html) {\n        this.d();\n        this.h(html);\n        this.i(this.a);\n    }\n    d() {\n        this.n.forEach(detach);\n    }\n}\nclass HtmlTagHydration extends HtmlTag {\n    constructor(claimed_nodes) {\n        super();\n        this.e = this.n = null;\n        this.l = claimed_nodes;\n    }\n    c(html) {\n        if (this.l) {\n            this.n = this.l;\n        }\n        else {\n            super.c(html);\n        }\n    }\n    i(anchor) {\n        for (let i = 0; i < this.n.length; i += 1) {\n            insert_hydration(this.t, this.n[i], anchor);\n        }\n    }\n}\nfunction attribute_to_object(attributes) {\n    const result = {};\n    for (const attribute of attributes) {\n        result[attribute.name] = attribute.value;\n    }\n    return result;\n}\nfunction get_custom_elements_slots(element) {\n    const result = {};\n    element.childNodes.forEach((node) => {\n        result[node.slot || 'default'] = true;\n    });\n    return result;\n}\n\nconst active_docs = new Set();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n    let hash = 5381;\n    let i = str.length;\n    while (i--)\n        hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n    return hash >>> 0;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n    const step = 16.666 / duration;\n    let keyframes = '{\\n';\n    for (let p = 0; p <= 1; p += step) {\n        const t = a + (b - a) * ease(p);\n        keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n    }\n    const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n    const name = `__svelte_${hash(rule)}_${uid}`;\n    const doc = get_root_for_style(node);\n    active_docs.add(doc);\n    const stylesheet = doc.__svelte_stylesheet || (doc.__svelte_stylesheet = append_empty_stylesheet(node).sheet);\n    const current_rules = doc.__svelte_rules || (doc.__svelte_rules = {});\n    if (!current_rules[name]) {\n        current_rules[name] = true;\n        stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n    }\n    const animation = node.style.animation || '';\n    node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n    active += 1;\n    return name;\n}\nfunction delete_rule(node, name) {\n    const previous = (node.style.animation || '').split(', ');\n    const next = previous.filter(name\n        ? anim => anim.indexOf(name) < 0 // remove specific animation\n        : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n    );\n    const deleted = previous.length - next.length;\n    if (deleted) {\n        node.style.animation = next.join(', ');\n        active -= deleted;\n        if (!active)\n            clear_rules();\n    }\n}\nfunction clear_rules() {\n    raf(() => {\n        if (active)\n            return;\n        active_docs.forEach(doc => {\n            const stylesheet = doc.__svelte_stylesheet;\n            let i = stylesheet.cssRules.length;\n            while (i--)\n                stylesheet.deleteRule(i);\n            doc.__svelte_rules = {};\n        });\n        active_docs.clear();\n    });\n}\n\nfunction create_animation(node, from, fn, params) {\n    if (!from)\n        return noop;\n    const to = node.getBoundingClientRect();\n    if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n        return noop;\n    const { delay = 0, duration = 300, easing = identity, \n    // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n    start: start_time = now() + delay, \n    // @ts-ignore todo:\n    end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n    let running = true;\n    let started = false;\n    let name;\n    function start() {\n        if (css) {\n            name = create_rule(node, 0, 1, duration, delay, easing, css);\n        }\n        if (!delay) {\n            started = true;\n        }\n    }\n    function stop() {\n        if (css)\n            delete_rule(node, name);\n        running = false;\n    }\n    loop(now => {\n        if (!started && now >= start_time) {\n            started = true;\n        }\n        if (started && now >= end) {\n            tick(1, 0);\n            stop();\n        }\n        if (!running) {\n            return false;\n        }\n        if (started) {\n            const p = now - start_time;\n            const t = 0 + 1 * easing(p / duration);\n            tick(t, 1 - t);\n        }\n        return true;\n    });\n    start();\n    tick(0, 1);\n    return stop;\n}\nfunction fix_position(node) {\n    const style = getComputedStyle(node);\n    if (style.position !== 'absolute' && style.position !== 'fixed') {\n        const { width, height } = style;\n        const a = node.getBoundingClientRect();\n        node.style.position = 'absolute';\n        node.style.width = width;\n        node.style.height = height;\n        add_transform(node, a);\n    }\n}\nfunction add_transform(node, a) {\n    const b = node.getBoundingClientRect();\n    if (a.left !== b.left || a.top !== b.top) {\n        const style = getComputedStyle(node);\n        const transform = style.transform === 'none' ? '' : style.transform;\n        node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n    }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n    current_component = component;\n}\nfunction get_current_component() {\n    if (!current_component)\n        throw new Error('Function called outside component initialization');\n    return current_component;\n}\nfunction beforeUpdate(fn) {\n    get_current_component().$$.before_update.push(fn);\n}\nfunction onMount(fn) {\n    get_current_component().$$.on_mount.push(fn);\n}\nfunction afterUpdate(fn) {\n    get_current_component().$$.after_update.push(fn);\n}\nfunction onDestroy(fn) {\n    get_current_component().$$.on_destroy.push(fn);\n}\nfunction createEventDispatcher() {\n    const component = get_current_component();\n    return (type, detail) => {\n        const callbacks = component.$$.callbacks[type];\n        if (callbacks) {\n            // TODO are there situations where events could be dispatched\n            // in a server (non-DOM) environment?\n            const event = custom_event(type, detail);\n            callbacks.slice().forEach(fn => {\n                fn.call(component, event);\n            });\n        }\n    };\n}\nfunction setContext(key, context) {\n    get_current_component().$$.context.set(key, context);\n}\nfunction getContext(key) {\n    return get_current_component().$$.context.get(key);\n}\nfunction getAllContexts() {\n    return get_current_component().$$.context;\n}\nfunction hasContext(key) {\n    return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n    const callbacks = component.$$.callbacks[event.type];\n    if (callbacks) {\n        // @ts-ignore\n        callbacks.slice().forEach(fn => fn.call(this, event));\n    }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nconst render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n    if (!update_scheduled) {\n        update_scheduled = true;\n        resolved_promise.then(flush);\n    }\n}\nfunction tick() {\n    schedule_update();\n    return resolved_promise;\n}\nfunction add_render_callback(fn) {\n    render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n    flush_callbacks.push(fn);\n}\nlet flushing = false;\nconst seen_callbacks = new Set();\nfunction flush() {\n    if (flushing)\n        return;\n    flushing = true;\n    do {\n        // first, call beforeUpdate functions\n        // and update components\n        for (let i = 0; i < dirty_components.length; i += 1) {\n            const component = dirty_components[i];\n            set_current_component(component);\n            update(component.$$);\n        }\n        set_current_component(null);\n        dirty_components.length = 0;\n        while (binding_callbacks.length)\n            binding_callbacks.pop()();\n        // then, once components are updated, call\n        // afterUpdate functions. This may cause\n        // subsequent updates...\n        for (let i = 0; i < render_callbacks.length; i += 1) {\n            const callback = render_callbacks[i];\n            if (!seen_callbacks.has(callback)) {\n                // ...so guard against infinite loops\n                seen_callbacks.add(callback);\n                callback();\n            }\n        }\n        render_callbacks.length = 0;\n    } while (dirty_components.length);\n    while (flush_callbacks.length) {\n        flush_callbacks.pop()();\n    }\n    update_scheduled = false;\n    flushing = false;\n    seen_callbacks.clear();\n}\nfunction update($$) {\n    if ($$.fragment !== null) {\n        $$.update();\n        run_all($$.before_update);\n        const dirty = $$.dirty;\n        $$.dirty = [-1];\n        $$.fragment && $$.fragment.p($$.ctx, dirty);\n        $$.after_update.forEach(add_render_callback);\n    }\n}\n\nlet promise;\nfunction wait() {\n    if (!promise) {\n        promise = Promise.resolve();\n        promise.then(() => {\n            promise = null;\n        });\n    }\n    return promise;\n}\nfunction dispatch(node, direction, kind) {\n    node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n    outros = {\n        r: 0,\n        c: [],\n        p: outros // parent group\n    };\n}\nfunction check_outros() {\n    if (!outros.r) {\n        run_all(outros.c);\n    }\n    outros = outros.p;\n}\nfunction transition_in(block, local) {\n    if (block && block.i) {\n        outroing.delete(block);\n        block.i(local);\n    }\n}\nfunction transition_out(block, local, detach, callback) {\n    if (block && block.o) {\n        if (outroing.has(block))\n            return;\n        outroing.add(block);\n        outros.c.push(() => {\n            outroing.delete(block);\n            if (callback) {\n                if (detach)\n                    block.d(1);\n                callback();\n            }\n        });\n        block.o(local);\n    }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n    let config = fn(node, params);\n    let running = false;\n    let animation_name;\n    let task;\n    let uid = 0;\n    function cleanup() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n        tick(0, 1);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        if (task)\n            task.abort();\n        running = true;\n        add_render_callback(() => dispatch(node, true, 'start'));\n        task = loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(1, 0);\n                    dispatch(node, true, 'end');\n                    cleanup();\n                    return running = false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(t, 1 - t);\n                }\n            }\n            return running;\n        });\n    }\n    let started = false;\n    return {\n        start() {\n            if (started)\n                return;\n            started = true;\n            delete_rule(node);\n            if (is_function(config)) {\n                config = config();\n                wait().then(go);\n            }\n            else {\n                go();\n            }\n        },\n        invalidate() {\n            started = false;\n        },\n        end() {\n            if (running) {\n                cleanup();\n                running = false;\n            }\n        }\n    };\n}\nfunction create_out_transition(node, fn, params) {\n    let config = fn(node, params);\n    let running = true;\n    let animation_name;\n    const group = outros;\n    group.r += 1;\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        add_render_callback(() => dispatch(node, false, 'start'));\n        loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(0, 1);\n                    dispatch(node, false, 'end');\n                    if (!--group.r) {\n                        // this will result in `end()` being called,\n                        // so we don't need to clean up here\n                        run_all(group.c);\n                    }\n                    return false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(1 - t, t);\n                }\n            }\n            return running;\n        });\n    }\n    if (is_function(config)) {\n        wait().then(() => {\n            // @ts-ignore\n            config = config();\n            go();\n        });\n    }\n    else {\n        go();\n    }\n    return {\n        end(reset) {\n            if (reset && config.tick) {\n                config.tick(1, 0);\n            }\n            if (running) {\n                if (animation_name)\n                    delete_rule(node, animation_name);\n                running = false;\n            }\n        }\n    };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n    let config = fn(node, params);\n    let t = intro ? 0 : 1;\n    let running_program = null;\n    let pending_program = null;\n    let animation_name = null;\n    function clear_animation() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function init(program, duration) {\n        const d = (program.b - t);\n        duration *= Math.abs(d);\n        return {\n            a: t,\n            b: program.b,\n            d,\n            duration,\n            start: program.start,\n            end: program.start + duration,\n            group: program.group\n        };\n    }\n    function go(b) {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        const program = {\n            start: now() + delay,\n            b\n        };\n        if (!b) {\n            // @ts-ignore todo: improve typings\n            program.group = outros;\n            outros.r += 1;\n        }\n        if (running_program || pending_program) {\n            pending_program = program;\n        }\n        else {\n            // if this is an intro, and there's a delay, we need to do\n            // an initial tick and/or apply CSS animation immediately\n            if (css) {\n                clear_animation();\n                animation_name = create_rule(node, t, b, duration, delay, easing, css);\n            }\n            if (b)\n                tick(0, 1);\n            running_program = init(program, duration);\n            add_render_callback(() => dispatch(node, b, 'start'));\n            loop(now => {\n                if (pending_program && now > pending_program.start) {\n                    running_program = init(pending_program, duration);\n                    pending_program = null;\n                    dispatch(node, running_program.b, 'start');\n                    if (css) {\n                        clear_animation();\n                        animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n                    }\n                }\n                if (running_program) {\n                    if (now >= running_program.end) {\n                        tick(t = running_program.b, 1 - t);\n                        dispatch(node, running_program.b, 'end');\n                        if (!pending_program) {\n                            // we're done\n                            if (running_program.b) {\n                                // intro — we can tidy up immediately\n                                clear_animation();\n                            }\n                            else {\n                                // outro — needs to be coordinated\n                                if (!--running_program.group.r)\n                                    run_all(running_program.group.c);\n                            }\n                        }\n                        running_program = null;\n                    }\n                    else if (now >= running_program.start) {\n                        const p = now - running_program.start;\n                        t = running_program.a + running_program.d * easing(p / running_program.duration);\n                        tick(t, 1 - t);\n                    }\n                }\n                return !!(running_program || pending_program);\n            });\n        }\n    }\n    return {\n        run(b) {\n            if (is_function(config)) {\n                wait().then(() => {\n                    // @ts-ignore\n                    config = config();\n                    go(b);\n                });\n            }\n            else {\n                go(b);\n            }\n        },\n        end() {\n            clear_animation();\n            running_program = pending_program = null;\n        }\n    };\n}\n\nfunction handle_promise(promise, info) {\n    const token = info.token = {};\n    function update(type, index, key, value) {\n        if (info.token !== token)\n            return;\n        info.resolved = value;\n        let child_ctx = info.ctx;\n        if (key !== undefined) {\n            child_ctx = child_ctx.slice();\n            child_ctx[key] = value;\n        }\n        const block = type && (info.current = type)(child_ctx);\n        let needs_flush = false;\n        if (info.block) {\n            if (info.blocks) {\n                info.blocks.forEach((block, i) => {\n                    if (i !== index && block) {\n                        group_outros();\n                        transition_out(block, 1, 1, () => {\n                            if (info.blocks[i] === block) {\n                                info.blocks[i] = null;\n                            }\n                        });\n                        check_outros();\n                    }\n                });\n            }\n            else {\n                info.block.d(1);\n            }\n            block.c();\n            transition_in(block, 1);\n            block.m(info.mount(), info.anchor);\n            needs_flush = true;\n        }\n        info.block = block;\n        if (info.blocks)\n            info.blocks[index] = block;\n        if (needs_flush) {\n            flush();\n        }\n    }\n    if (is_promise(promise)) {\n        const current_component = get_current_component();\n        promise.then(value => {\n            set_current_component(current_component);\n            update(info.then, 1, info.value, value);\n            set_current_component(null);\n        }, error => {\n            set_current_component(current_component);\n            update(info.catch, 2, info.error, error);\n            set_current_component(null);\n            if (!info.hasCatch) {\n                throw error;\n            }\n        });\n        // if we previously had a then/catch block, destroy it\n        if (info.current !== info.pending) {\n            update(info.pending, 0);\n            return true;\n        }\n    }\n    else {\n        if (info.current !== info.then) {\n            update(info.then, 1, info.value, promise);\n            return true;\n        }\n        info.resolved = promise;\n    }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n    const child_ctx = ctx.slice();\n    const { resolved } = info;\n    if (info.current === info.then) {\n        child_ctx[info.value] = resolved;\n    }\n    if (info.current === info.catch) {\n        child_ctx[info.error] = resolved;\n    }\n    info.block.p(child_ctx, dirty);\n}\n\nconst globals = (typeof window !== 'undefined'\n    ? window\n    : typeof globalThis !== 'undefined'\n        ? globalThis\n        : global);\n\nfunction destroy_block(block, lookup) {\n    block.d(1);\n    lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n    transition_out(block, 1, 1, () => {\n        lookup.delete(block.key);\n    });\n}\nfunction fix_and_destroy_block(block, lookup) {\n    block.f();\n    destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n    block.f();\n    outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n    let o = old_blocks.length;\n    let n = list.length;\n    let i = o;\n    const old_indexes = {};\n    while (i--)\n        old_indexes[old_blocks[i].key] = i;\n    const new_blocks = [];\n    const new_lookup = new Map();\n    const deltas = new Map();\n    i = n;\n    while (i--) {\n        const child_ctx = get_context(ctx, list, i);\n        const key = get_key(child_ctx);\n        let block = lookup.get(key);\n        if (!block) {\n            block = create_each_block(key, child_ctx);\n            block.c();\n        }\n        else if (dynamic) {\n            block.p(child_ctx, dirty);\n        }\n        new_lookup.set(key, new_blocks[i] = block);\n        if (key in old_indexes)\n            deltas.set(key, Math.abs(i - old_indexes[key]));\n    }\n    const will_move = new Set();\n    const did_move = new Set();\n    function insert(block) {\n        transition_in(block, 1);\n        block.m(node, next);\n        lookup.set(block.key, block);\n        next = block.first;\n        n--;\n    }\n    while (o && n) {\n        const new_block = new_blocks[n - 1];\n        const old_block = old_blocks[o - 1];\n        const new_key = new_block.key;\n        const old_key = old_block.key;\n        if (new_block === old_block) {\n            // do nothing\n            next = new_block.first;\n            o--;\n            n--;\n        }\n        else if (!new_lookup.has(old_key)) {\n            // remove old block\n            destroy(old_block, lookup);\n            o--;\n        }\n        else if (!lookup.has(new_key) || will_move.has(new_key)) {\n            insert(new_block);\n        }\n        else if (did_move.has(old_key)) {\n            o--;\n        }\n        else if (deltas.get(new_key) > deltas.get(old_key)) {\n            did_move.add(new_key);\n            insert(new_block);\n        }\n        else {\n            will_move.add(old_key);\n            o--;\n        }\n    }\n    while (o--) {\n        const old_block = old_blocks[o];\n        if (!new_lookup.has(old_block.key))\n            destroy(old_block, lookup);\n    }\n    while (n)\n        insert(new_blocks[n - 1]);\n    return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n    const keys = new Set();\n    for (let i = 0; i < list.length; i++) {\n        const key = get_key(get_context(ctx, list, i));\n        if (keys.has(key)) {\n            throw new Error('Cannot have duplicate keys in a keyed each');\n        }\n        keys.add(key);\n    }\n}\n\nfunction get_spread_update(levels, updates) {\n    const update = {};\n    const to_null_out = {};\n    const accounted_for = { $$scope: 1 };\n    let i = levels.length;\n    while (i--) {\n        const o = levels[i];\n        const n = updates[i];\n        if (n) {\n            for (const key in o) {\n                if (!(key in n))\n                    to_null_out[key] = 1;\n            }\n            for (const key in n) {\n                if (!accounted_for[key]) {\n                    update[key] = n[key];\n                    accounted_for[key] = 1;\n                }\n            }\n            levels[i] = n;\n        }\n        else {\n            for (const key in o) {\n                accounted_for[key] = 1;\n            }\n        }\n    }\n    for (const key in to_null_out) {\n        if (!(key in update))\n            update[key] = undefined;\n    }\n    return update;\n}\nfunction get_spread_object(spread_props) {\n    return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\n// source: https://html.spec.whatwg.org/multipage/indices.html\nconst boolean_attributes = new Set([\n    'allowfullscreen',\n    'allowpaymentrequest',\n    'async',\n    'autofocus',\n    'autoplay',\n    'checked',\n    'controls',\n    'default',\n    'defer',\n    'disabled',\n    'formnovalidate',\n    'hidden',\n    'ismap',\n    'loop',\n    'multiple',\n    'muted',\n    'nomodule',\n    'novalidate',\n    'open',\n    'playsinline',\n    'readonly',\n    'required',\n    'reversed',\n    'selected'\n]);\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, classes_to_add) {\n    const attributes = Object.assign({}, ...args);\n    if (classes_to_add) {\n        if (attributes.class == null) {\n            attributes.class = classes_to_add;\n        }\n        else {\n            attributes.class += ' ' + classes_to_add;\n        }\n    }\n    let str = '';\n    Object.keys(attributes).forEach(name => {\n        if (invalid_attribute_name_character.test(name))\n            return;\n        const value = attributes[name];\n        if (value === true)\n            str += ' ' + name;\n        else if (boolean_attributes.has(name.toLowerCase())) {\n            if (value)\n                str += ' ' + name;\n        }\n        else if (value != null) {\n            str += ` ${name}=\"${value}\"`;\n        }\n    });\n    return str;\n}\nconst escaped = {\n    '\"': '&quot;',\n    \"'\": '&#39;',\n    '&': '&amp;',\n    '<': '&lt;',\n    '>': '&gt;'\n};\nfunction escape(html) {\n    return String(html).replace(/[\"'&<>]/g, match => escaped[match]);\n}\nfunction escape_attribute_value(value) {\n    return typeof value === 'string' ? escape(value) : value;\n}\nfunction escape_object(obj) {\n    const result = {};\n    for (const key in obj) {\n        result[key] = escape_attribute_value(obj[key]);\n    }\n    return result;\n}\nfunction each(items, fn) {\n    let str = '';\n    for (let i = 0; i < items.length; i += 1) {\n        str += fn(items[i], i);\n    }\n    return str;\n}\nconst missing_component = {\n    $$render: () => ''\n};\nfunction validate_component(component, name) {\n    if (!component || !component.$$render) {\n        if (name === 'svelte:component')\n            name += ' this={...}';\n        throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules`);\n    }\n    return component;\n}\nfunction debug(file, line, column, values) {\n    console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n    console.log(values); // eslint-disable-line no-console\n    return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n    function $$render(result, props, bindings, slots, context) {\n        const parent_component = current_component;\n        const $$ = {\n            on_destroy,\n            context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n            // these will be immediately discarded\n            on_mount: [],\n            before_update: [],\n            after_update: [],\n            callbacks: blank_object()\n        };\n        set_current_component({ $$ });\n        const html = fn(result, props, bindings, slots);\n        set_current_component(parent_component);\n        return html;\n    }\n    return {\n        render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n            on_destroy = [];\n            const result = { title: '', head: '', css: new Set() };\n            const html = $$render(result, props, {}, $$slots, context);\n            run_all(on_destroy);\n            return {\n                html,\n                css: {\n                    code: Array.from(result.css).map(css => css.code).join('\\n'),\n                    map: null // TODO\n                },\n                head: result.title + result.head\n            };\n        },\n        $$render\n    };\n}\nfunction add_attribute(name, value, boolean) {\n    if (value == null || (boolean && !value))\n        return '';\n    return ` ${name}${value === true ? '' : `=${typeof value === 'string' ? JSON.stringify(escape(value)) : `\"${value}\"`}`}`;\n}\nfunction add_classes(classes) {\n    return classes ? ` class=\"${classes}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n    const index = component.$$.props[name];\n    if (index !== undefined) {\n        component.$$.bound[index] = callback;\n        callback(component.$$.ctx[index]);\n    }\n}\nfunction create_component(block) {\n    block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n    block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n    const { fragment, on_mount, on_destroy, after_update } = component.$$;\n    fragment && fragment.m(target, anchor);\n    if (!customElement) {\n        // onMount happens before the initial afterUpdate\n        add_render_callback(() => {\n            const new_on_destroy = on_mount.map(run).filter(is_function);\n            if (on_destroy) {\n                on_destroy.push(...new_on_destroy);\n            }\n            else {\n                // Edge case - component was destroyed immediately,\n                // most likely as a result of a binding initialising\n                run_all(new_on_destroy);\n            }\n            component.$$.on_mount = [];\n        });\n    }\n    after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n    const $$ = component.$$;\n    if ($$.fragment !== null) {\n        run_all($$.on_destroy);\n        $$.fragment && $$.fragment.d(detaching);\n        // TODO null out other refs, including component.$$ (but need to\n        // preserve final state?)\n        $$.on_destroy = $$.fragment = null;\n        $$.ctx = [];\n    }\n}\nfunction make_dirty(component, i) {\n    if (component.$$.dirty[0] === -1) {\n        dirty_components.push(component);\n        schedule_update();\n        component.$$.dirty.fill(0);\n    }\n    component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n    const parent_component = current_component;\n    set_current_component(component);\n    const $$ = component.$$ = {\n        fragment: null,\n        ctx: null,\n        // state\n        props,\n        update: noop,\n        not_equal,\n        bound: blank_object(),\n        // lifecycle\n        on_mount: [],\n        on_destroy: [],\n        on_disconnect: [],\n        before_update: [],\n        after_update: [],\n        context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n        // everything else\n        callbacks: blank_object(),\n        dirty,\n        skip_bound: false,\n        root: options.target || parent_component.$$.root\n    };\n    append_styles && append_styles($$.root);\n    let ready = false;\n    $$.ctx = instance\n        ? instance(component, options.props || {}, (i, ret, ...rest) => {\n            const value = rest.length ? rest[0] : ret;\n            if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n                if (!$$.skip_bound && $$.bound[i])\n                    $$.bound[i](value);\n                if (ready)\n                    make_dirty(component, i);\n            }\n            return ret;\n        })\n        : [];\n    $$.update();\n    ready = true;\n    run_all($$.before_update);\n    // `false` as a special case of no DOM component\n    $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n    if (options.target) {\n        if (options.hydrate) {\n            start_hydrating();\n            const nodes = children(options.target);\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.l(nodes);\n            nodes.forEach(detach);\n        }\n        else {\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.c();\n        }\n        if (options.intro)\n            transition_in(component.$$.fragment);\n        mount_component(component, options.target, options.anchor, options.customElement);\n        end_hydrating();\n        flush();\n    }\n    set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n    SvelteElement = class extends HTMLElement {\n        constructor() {\n            super();\n            this.attachShadow({ mode: 'open' });\n        }\n        connectedCallback() {\n            const { on_mount } = this.$$;\n            this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n            // @ts-ignore todo: improve typings\n            for (const key in this.$$.slotted) {\n                // @ts-ignore todo: improve typings\n                this.appendChild(this.$$.slotted[key]);\n            }\n        }\n        attributeChangedCallback(attr, _oldValue, newValue) {\n            this[attr] = newValue;\n        }\n        disconnectedCallback() {\n            run_all(this.$$.on_disconnect);\n        }\n        $destroy() {\n            destroy_component(this, 1);\n            this.$destroy = noop;\n        }\n        $on(type, callback) {\n            // TODO should this delegate to addEventListener?\n            const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n            callbacks.push(callback);\n            return () => {\n                const index = callbacks.indexOf(callback);\n                if (index !== -1)\n                    callbacks.splice(index, 1);\n            };\n        }\n        $set($$props) {\n            if (this.$$set && !is_empty($$props)) {\n                this.$$.skip_bound = true;\n                this.$$set($$props);\n                this.$$.skip_bound = false;\n            }\n        }\n    };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n    $destroy() {\n        destroy_component(this, 1);\n        this.$destroy = noop;\n    }\n    $on(type, callback) {\n        const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n        callbacks.push(callback);\n        return () => {\n            const index = callbacks.indexOf(callback);\n            if (index !== -1)\n                callbacks.splice(index, 1);\n        };\n    }\n    $set($$props) {\n        if (this.$$set && !is_empty($$props)) {\n            this.$$.skip_bound = true;\n            this.$$set($$props);\n            this.$$.skip_bound = false;\n        }\n    }\n}\n\nfunction dispatch_dev(type, detail) {\n    document.dispatchEvent(custom_event(type, Object.assign({ version: '3.43.1' }, detail), true));\n}\nfunction append_dev(target, node) {\n    dispatch_dev('SvelteDOMInsert', { target, node });\n    append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n    dispatch_dev('SvelteDOMInsert', { target, node });\n    append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n    dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n    insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n    dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n    insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n    dispatch_dev('SvelteDOMRemove', { node });\n    detach(node);\n}\nfunction detach_between_dev(before, after) {\n    while (before.nextSibling && before.nextSibling !== after) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction detach_before_dev(after) {\n    while (after.previousSibling) {\n        detach_dev(after.previousSibling);\n    }\n}\nfunction detach_after_dev(before) {\n    while (before.nextSibling) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation) {\n    const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n    if (has_prevent_default)\n        modifiers.push('preventDefault');\n    if (has_stop_propagation)\n        modifiers.push('stopPropagation');\n    dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n    const dispose = listen(node, event, handler, options);\n    return () => {\n        dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n        dispose();\n    };\n}\nfunction attr_dev(node, attribute, value) {\n    attr(node, attribute, value);\n    if (value == null)\n        dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n    else\n        dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n    node[property] = value;\n    dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n    node.dataset[property] = value;\n    dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n    data = '' + data;\n    if (text.wholeText === data)\n        return;\n    dispatch_dev('SvelteDOMSetData', { node: text, data });\n    text.data = data;\n}\nfunction validate_each_argument(arg) {\n    if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n        let msg = '{#each} only iterates over array-like objects.';\n        if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n            msg += ' You can use a spread to convert this iterable into an array.';\n        }\n        throw new Error(msg);\n    }\n}\nfunction validate_slots(name, slot, keys) {\n    for (const slot_key of Object.keys(slot)) {\n        if (!~keys.indexOf(slot_key)) {\n            console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n        }\n    }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n    constructor(options) {\n        if (!options || (!options.target && !options.$$inline)) {\n            throw new Error(\"'target' is a required option\");\n        }\n        super();\n    }\n    $destroy() {\n        super.$destroy();\n        this.$destroy = () => {\n            console.warn('Component was already destroyed'); // eslint-disable-line no-console\n        };\n    }\n    $capture_state() { }\n    $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n    constructor(options) {\n        super(options);\n    }\n}\nfunction loop_guard(timeout) {\n    const start = Date.now();\n    return () => {\n        if (Date.now() - start > timeout) {\n            throw new Error('Infinite loop detected');\n        }\n    };\n}\n\nexport { HtmlTag, HtmlTagHydration, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_location, add_render_callback, add_resize_listener, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, component_subscribe, compute_rest_props, compute_slots, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, escaped, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, identity, init, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, listen, listen_dev, loop, loop_guard, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_data, set_data_dev, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, spread, src_url_equal, start_hydrating, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_each_argument, validate_each_keys, validate_slots, validate_store, xlink_attr };\n","/**\n * SSR Window 4.0.1\n * Better handling for window object in SSR environment\n * https://github.com/nolimits4web/ssr-window\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\n/* eslint-disable no-param-reassign */\nfunction isObject(obj) {\n    return (obj !== null &&\n        typeof obj === 'object' &&\n        'constructor' in obj &&\n        obj.constructor === Object);\n}\nfunction extend(target = {}, src = {}) {\n    Object.keys(src).forEach((key) => {\n        if (typeof target[key] === 'undefined')\n            target[key] = src[key];\n        else if (isObject(src[key]) &&\n            isObject(target[key]) &&\n            Object.keys(src[key]).length > 0) {\n            extend(target[key], src[key]);\n        }\n    });\n}\n\nconst ssrDocument = {\n    body: {},\n    addEventListener() { },\n    removeEventListener() { },\n    activeElement: {\n        blur() { },\n        nodeName: '',\n    },\n    querySelector() {\n        return null;\n    },\n    querySelectorAll() {\n        return [];\n    },\n    getElementById() {\n        return null;\n    },\n    createEvent() {\n        return {\n            initEvent() { },\n        };\n    },\n    createElement() {\n        return {\n            children: [],\n            childNodes: [],\n            style: {},\n            setAttribute() { },\n            getElementsByTagName() {\n                return [];\n            },\n        };\n    },\n    createElementNS() {\n        return {};\n    },\n    importNode() {\n        return null;\n    },\n    location: {\n        hash: '',\n        host: '',\n        hostname: '',\n        href: '',\n        origin: '',\n        pathname: '',\n        protocol: '',\n        search: '',\n    },\n};\nfunction getDocument() {\n    const doc = typeof document !== 'undefined' ? document : {};\n    extend(doc, ssrDocument);\n    return doc;\n}\n\nconst ssrWindow = {\n    document: ssrDocument,\n    navigator: {\n        userAgent: '',\n    },\n    location: {\n        hash: '',\n        host: '',\n        hostname: '',\n        href: '',\n        origin: '',\n        pathname: '',\n        protocol: '',\n        search: '',\n    },\n    history: {\n        replaceState() { },\n        pushState() { },\n        go() { },\n        back() { },\n    },\n    CustomEvent: function CustomEvent() {\n        return this;\n    },\n    addEventListener() { },\n    removeEventListener() { },\n    getComputedStyle() {\n        return {\n            getPropertyValue() {\n                return '';\n            },\n        };\n    },\n    Image() { },\n    Date() { },\n    screen: {},\n    setTimeout() { },\n    clearTimeout() { },\n    matchMedia() {\n        return {};\n    },\n    requestAnimationFrame(callback) {\n        if (typeof setTimeout === 'undefined') {\n            callback();\n            return null;\n        }\n        return setTimeout(callback, 0);\n    },\n    cancelAnimationFrame(id) {\n        if (typeof setTimeout === 'undefined') {\n            return;\n        }\n        clearTimeout(id);\n    },\n};\nfunction getWindow() {\n    const win = typeof window !== 'undefined' ? window : {};\n    extend(win, ssrWindow);\n    return win;\n}\n\nexport { extend, getDocument, getWindow, ssrDocument, ssrWindow };\n","/**\n * Dom7 4.0.1\n * Minimalistic JavaScript library for DOM manipulation, with a jQuery-compatible API\n * https://framework7.io/docs/dom7.html\n *\n * Copyright 2021, Vladimir Kharlampidi\n *\n * Licensed under MIT\n *\n * Released on: October 27, 2021\n */\nimport { getWindow, getDocument } from 'ssr-window';\n\n/* eslint-disable no-proto */\nfunction makeReactive(obj) {\n  const proto = obj.__proto__;\n  Object.defineProperty(obj, '__proto__', {\n    get() {\n      return proto;\n    },\n\n    set(value) {\n      proto.__proto__ = value;\n    }\n\n  });\n}\n\nclass Dom7 extends Array {\n  constructor(items) {\n    super(...(items || []));\n    makeReactive(this);\n  }\n\n}\n\nfunction arrayFlat(arr = []) {\n  const res = [];\n  arr.forEach(el => {\n    if (Array.isArray(el)) {\n      res.push(...arrayFlat(el));\n    } else {\n      res.push(el);\n    }\n  });\n  return res;\n}\nfunction arrayFilter(arr, callback) {\n  return Array.prototype.filter.call(arr, callback);\n}\nfunction arrayUnique(arr) {\n  const uniqueArray = [];\n\n  for (let i = 0; i < arr.length; i += 1) {\n    if (uniqueArray.indexOf(arr[i]) === -1) uniqueArray.push(arr[i]);\n  }\n\n  return uniqueArray;\n}\nfunction toCamelCase(string) {\n  return string.toLowerCase().replace(/-(.)/g, (match, group) => group.toUpperCase());\n}\n\n// eslint-disable-next-line\n\nfunction qsa(selector, context) {\n  if (typeof selector !== 'string') {\n    return [selector];\n  }\n\n  const a = [];\n  const res = context.querySelectorAll(selector);\n\n  for (let i = 0; i < res.length; i += 1) {\n    a.push(res[i]);\n  }\n\n  return a;\n}\n\nfunction $(selector, context) {\n  const window = getWindow();\n  const document = getDocument();\n  let arr = [];\n\n  if (!context && selector instanceof Dom7) {\n    return selector;\n  }\n\n  if (!selector) {\n    return new Dom7(arr);\n  }\n\n  if (typeof selector === 'string') {\n    const html = selector.trim();\n\n    if (html.indexOf('<') >= 0 && html.indexOf('>') >= 0) {\n      let toCreate = 'div';\n      if (html.indexOf('<li') === 0) toCreate = 'ul';\n      if (html.indexOf('<tr') === 0) toCreate = 'tbody';\n      if (html.indexOf('<td') === 0 || html.indexOf('<th') === 0) toCreate = 'tr';\n      if (html.indexOf('<tbody') === 0) toCreate = 'table';\n      if (html.indexOf('<option') === 0) toCreate = 'select';\n      const tempParent = document.createElement(toCreate);\n      tempParent.innerHTML = html;\n\n      for (let i = 0; i < tempParent.childNodes.length; i += 1) {\n        arr.push(tempParent.childNodes[i]);\n      }\n    } else {\n      arr = qsa(selector.trim(), context || document);\n    } // arr = qsa(selector, document);\n\n  } else if (selector.nodeType || selector === window || selector === document) {\n    arr.push(selector);\n  } else if (Array.isArray(selector)) {\n    if (selector instanceof Dom7) return selector;\n    arr = selector;\n  }\n\n  return new Dom7(arrayUnique(arr));\n}\n\n$.fn = Dom7.prototype;\n\n// eslint-disable-next-line\n\nfunction addClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.add(...classNames);\n  });\n  return this;\n}\n\nfunction removeClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    el.classList.remove(...classNames);\n  });\n  return this;\n}\n\nfunction toggleClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  this.forEach(el => {\n    classNames.forEach(className => {\n      el.classList.toggle(className);\n    });\n  });\n}\n\nfunction hasClass(...classes) {\n  const classNames = arrayFlat(classes.map(c => c.split(' ')));\n  return arrayFilter(this, el => {\n    return classNames.filter(className => el.classList.contains(className)).length > 0;\n  }).length > 0;\n}\n\nfunction attr(attrs, value) {\n  if (arguments.length === 1 && typeof attrs === 'string') {\n    // Get attr\n    if (this[0]) return this[0].getAttribute(attrs);\n    return undefined;\n  } // Set attrs\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (arguments.length === 2) {\n      // String\n      this[i].setAttribute(attrs, value);\n    } else {\n      // Object\n      for (const attrName in attrs) {\n        this[i][attrName] = attrs[attrName];\n        this[i].setAttribute(attrName, attrs[attrName]);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction removeAttr(attr) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].removeAttribute(attr);\n  }\n\n  return this;\n}\n\nfunction prop(props, value) {\n  if (arguments.length === 1 && typeof props === 'string') {\n    // Get prop\n    if (this[0]) return this[0][props];\n  } else {\n    // Set props\n    for (let i = 0; i < this.length; i += 1) {\n      if (arguments.length === 2) {\n        // String\n        this[i][props] = value;\n      } else {\n        // Object\n        for (const propName in props) {\n          this[i][propName] = props[propName];\n        }\n      }\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction data(key, value) {\n  let el;\n\n  if (typeof value === 'undefined') {\n    el = this[0];\n    if (!el) return undefined; // Get value\n\n    if (el.dom7ElementDataStorage && key in el.dom7ElementDataStorage) {\n      return el.dom7ElementDataStorage[key];\n    }\n\n    const dataKey = el.getAttribute(`data-${key}`);\n\n    if (dataKey) {\n      return dataKey;\n    }\n\n    return undefined;\n  } // Set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    el = this[i];\n    if (!el.dom7ElementDataStorage) el.dom7ElementDataStorage = {};\n    el.dom7ElementDataStorage[key] = value;\n  }\n\n  return this;\n}\n\nfunction removeData(key) {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.dom7ElementDataStorage && el.dom7ElementDataStorage[key]) {\n      el.dom7ElementDataStorage[key] = null;\n      delete el.dom7ElementDataStorage[key];\n    }\n  }\n}\n\nfunction dataset() {\n  const el = this[0];\n  if (!el) return undefined;\n  const dataset = {}; // eslint-disable-line\n\n  if (el.dataset) {\n    for (const dataKey in el.dataset) {\n      dataset[dataKey] = el.dataset[dataKey];\n    }\n  } else {\n    for (let i = 0; i < el.attributes.length; i += 1) {\n      const attr = el.attributes[i];\n\n      if (attr.name.indexOf('data-') >= 0) {\n        dataset[toCamelCase(attr.name.split('data-')[1])] = attr.value;\n      }\n    }\n  }\n\n  for (const key in dataset) {\n    if (dataset[key] === 'false') dataset[key] = false;else if (dataset[key] === 'true') dataset[key] = true;else if (parseFloat(dataset[key]) === dataset[key] * 1) dataset[key] *= 1;\n  }\n\n  return dataset;\n}\n\nfunction val(value) {\n  if (typeof value === 'undefined') {\n    // get value\n    const el = this[0];\n    if (!el) return undefined;\n\n    if (el.multiple && el.nodeName.toLowerCase() === 'select') {\n      const values = [];\n\n      for (let i = 0; i < el.selectedOptions.length; i += 1) {\n        values.push(el.selectedOptions[i].value);\n      }\n\n      return values;\n    }\n\n    return el.value;\n  } // set value\n\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (Array.isArray(value) && el.multiple && el.nodeName.toLowerCase() === 'select') {\n      for (let j = 0; j < el.options.length; j += 1) {\n        el.options[j].selected = value.indexOf(el.options[j].value) >= 0;\n      }\n    } else {\n      el.value = value;\n    }\n  }\n\n  return this;\n}\n\nfunction value(value) {\n  return this.val(value);\n}\n\nfunction transform(transform) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transform = transform;\n  }\n\n  return this;\n}\n\nfunction transition(duration) {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.transitionDuration = typeof duration !== 'string' ? `${duration}ms` : duration;\n  }\n\n  return this;\n}\n\nfunction on(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n\n  function handleLiveEvent(e) {\n    const target = e.target;\n    if (!target) return;\n    const eventData = e.target.dom7EventData || [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    if ($(target).is(targetSelector)) listener.apply(target, eventData);else {\n      const parents = $(target).parents(); // eslint-disable-line\n\n      for (let k = 0; k < parents.length; k += 1) {\n        if ($(parents[k]).is(targetSelector)) listener.apply(parents[k], eventData);\n      }\n    }\n  }\n\n  function handleEvent(e) {\n    const eventData = e && e.target ? e.target.dom7EventData || [] : [];\n\n    if (eventData.indexOf(e) < 0) {\n      eventData.unshift(e);\n    }\n\n    listener.apply(this, eventData);\n  }\n\n  const events = eventType.split(' ');\n  let j;\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (!targetSelector) {\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7Listeners) el.dom7Listeners = {};\n        if (!el.dom7Listeners[event]) el.dom7Listeners[event] = [];\n        el.dom7Listeners[event].push({\n          listener,\n          proxyListener: handleEvent\n        });\n        el.addEventListener(event, handleEvent, capture);\n      }\n    } else {\n      // Live events\n      for (j = 0; j < events.length; j += 1) {\n        const event = events[j];\n        if (!el.dom7LiveListeners) el.dom7LiveListeners = {};\n        if (!el.dom7LiveListeners[event]) el.dom7LiveListeners[event] = [];\n        el.dom7LiveListeners[event].push({\n          listener,\n          proxyListener: handleLiveEvent\n        });\n        el.addEventListener(event, handleLiveEvent, capture);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction off(...args) {\n  let [eventType, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventType, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  if (!capture) capture = false;\n  const events = eventType.split(' ');\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n      let handlers;\n\n      if (!targetSelector && el.dom7Listeners) {\n        handlers = el.dom7Listeners[event];\n      } else if (targetSelector && el.dom7LiveListeners) {\n        handlers = el.dom7LiveListeners[event];\n      }\n\n      if (handlers && handlers.length) {\n        for (let k = handlers.length - 1; k >= 0; k -= 1) {\n          const handler = handlers[k];\n\n          if (listener && handler.listener === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (listener && handler.listener && handler.listener.dom7proxy && handler.listener.dom7proxy === listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          } else if (!listener) {\n            el.removeEventListener(event, handler.proxyListener, capture);\n            handlers.splice(k, 1);\n          }\n        }\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction once(...args) {\n  const dom = this;\n  let [eventName, targetSelector, listener, capture] = args;\n\n  if (typeof args[1] === 'function') {\n    [eventName, listener, capture] = args;\n    targetSelector = undefined;\n  }\n\n  function onceHandler(...eventArgs) {\n    listener.apply(this, eventArgs);\n    dom.off(eventName, targetSelector, onceHandler, capture);\n\n    if (onceHandler.dom7proxy) {\n      delete onceHandler.dom7proxy;\n    }\n  }\n\n  onceHandler.dom7proxy = listener;\n  return dom.on(eventName, targetSelector, onceHandler, capture);\n}\n\nfunction trigger(...args) {\n  const window = getWindow();\n  const events = args[0].split(' ');\n  const eventData = args[1];\n\n  for (let i = 0; i < events.length; i += 1) {\n    const event = events[i];\n\n    for (let j = 0; j < this.length; j += 1) {\n      const el = this[j];\n\n      if (window.CustomEvent) {\n        const evt = new window.CustomEvent(event, {\n          detail: eventData,\n          bubbles: true,\n          cancelable: true\n        });\n        el.dom7EventData = args.filter((data, dataIndex) => dataIndex > 0);\n        el.dispatchEvent(evt);\n        el.dom7EventData = [];\n        delete el.dom7EventData;\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction transitionEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('transitionend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('transitionend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction animationEnd(callback) {\n  const dom = this;\n\n  function fireCallBack(e) {\n    if (e.target !== this) return;\n    callback.call(this, e);\n    dom.off('animationend', fireCallBack);\n  }\n\n  if (callback) {\n    dom.on('animationend', fireCallBack);\n  }\n\n  return this;\n}\n\nfunction width() {\n  const window = getWindow();\n\n  if (this[0] === window) {\n    return window.innerWidth;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('width'));\n  }\n\n  return null;\n}\n\nfunction outerWidth(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetWidth + parseFloat(styles.getPropertyValue('margin-right')) + parseFloat(styles.getPropertyValue('margin-left'));\n    }\n\n    return this[0].offsetWidth;\n  }\n\n  return null;\n}\n\nfunction height() {\n  const window = getWindow();\n\n  if (this[0] === window) {\n    return window.innerHeight;\n  }\n\n  if (this.length > 0) {\n    return parseFloat(this.css('height'));\n  }\n\n  return null;\n}\n\nfunction outerHeight(includeMargins) {\n  if (this.length > 0) {\n    if (includeMargins) {\n      const styles = this.styles();\n      return this[0].offsetHeight + parseFloat(styles.getPropertyValue('margin-top')) + parseFloat(styles.getPropertyValue('margin-bottom'));\n    }\n\n    return this[0].offsetHeight;\n  }\n\n  return null;\n}\n\nfunction offset() {\n  if (this.length > 0) {\n    const window = getWindow();\n    const document = getDocument();\n    const el = this[0];\n    const box = el.getBoundingClientRect();\n    const body = document.body;\n    const clientTop = el.clientTop || body.clientTop || 0;\n    const clientLeft = el.clientLeft || body.clientLeft || 0;\n    const scrollTop = el === window ? window.scrollY : el.scrollTop;\n    const scrollLeft = el === window ? window.scrollX : el.scrollLeft;\n    return {\n      top: box.top + scrollTop - clientTop,\n      left: box.left + scrollLeft - clientLeft\n    };\n  }\n\n  return null;\n}\n\nfunction hide() {\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].style.display = 'none';\n  }\n\n  return this;\n}\n\nfunction show() {\n  const window = getWindow();\n\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.style.display === 'none') {\n      el.style.display = '';\n    }\n\n    if (window.getComputedStyle(el, null).getPropertyValue('display') === 'none') {\n      // Still not visible\n      el.style.display = 'block';\n    }\n  }\n\n  return this;\n}\n\nfunction styles() {\n  const window = getWindow();\n  if (this[0]) return window.getComputedStyle(this[0], null);\n  return {};\n}\n\nfunction css(props, value) {\n  const window = getWindow();\n  let i;\n\n  if (arguments.length === 1) {\n    if (typeof props === 'string') {\n      // .css('width')\n      if (this[0]) return window.getComputedStyle(this[0], null).getPropertyValue(props);\n    } else {\n      // .css({ width: '100px' })\n      for (i = 0; i < this.length; i += 1) {\n        for (const prop in props) {\n          this[i].style[prop] = props[prop];\n        }\n      }\n\n      return this;\n    }\n  }\n\n  if (arguments.length === 2 && typeof props === 'string') {\n    // .css('width', '100px')\n    for (i = 0; i < this.length; i += 1) {\n      this[i].style[props] = value;\n    }\n\n    return this;\n  }\n\n  return this;\n}\n\nfunction each(callback) {\n  if (!callback) return this;\n  this.forEach((el, index) => {\n    callback.apply(el, [el, index]);\n  });\n  return this;\n}\n\nfunction filter(callback) {\n  const result = arrayFilter(this, callback);\n  return $(result);\n}\n\nfunction html(html) {\n  if (typeof html === 'undefined') {\n    return this[0] ? this[0].innerHTML : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].innerHTML = html;\n  }\n\n  return this;\n}\n\nfunction text(text) {\n  if (typeof text === 'undefined') {\n    return this[0] ? this[0].textContent.trim() : null;\n  }\n\n  for (let i = 0; i < this.length; i += 1) {\n    this[i].textContent = text;\n  }\n\n  return this;\n}\n\nfunction is(selector) {\n  const window = getWindow();\n  const document = getDocument();\n  const el = this[0];\n  let compareWith;\n  let i;\n  if (!el || typeof selector === 'undefined') return false;\n\n  if (typeof selector === 'string') {\n    if (el.matches) return el.matches(selector);\n    if (el.webkitMatchesSelector) return el.webkitMatchesSelector(selector);\n    if (el.msMatchesSelector) return el.msMatchesSelector(selector);\n    compareWith = $(selector);\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  if (selector === document) {\n    return el === document;\n  }\n\n  if (selector === window) {\n    return el === window;\n  }\n\n  if (selector.nodeType || selector instanceof Dom7) {\n    compareWith = selector.nodeType ? [selector] : selector;\n\n    for (i = 0; i < compareWith.length; i += 1) {\n      if (compareWith[i] === el) return true;\n    }\n\n    return false;\n  }\n\n  return false;\n}\n\nfunction index() {\n  let child = this[0];\n  let i;\n\n  if (child) {\n    i = 0; // eslint-disable-next-line\n\n    while ((child = child.previousSibling) !== null) {\n      if (child.nodeType === 1) i += 1;\n    }\n\n    return i;\n  }\n\n  return undefined;\n}\n\nfunction eq(index) {\n  if (typeof index === 'undefined') return this;\n  const length = this.length;\n\n  if (index > length - 1) {\n    return $([]);\n  }\n\n  if (index < 0) {\n    const returnIndex = length + index;\n    if (returnIndex < 0) return $([]);\n    return $([this[returnIndex]]);\n  }\n\n  return $([this[index]]);\n}\n\nfunction append(...els) {\n  let newChild;\n  const document = getDocument();\n\n  for (let k = 0; k < els.length; k += 1) {\n    newChild = els[k];\n\n    for (let i = 0; i < this.length; i += 1) {\n      if (typeof newChild === 'string') {\n        const tempDiv = document.createElement('div');\n        tempDiv.innerHTML = newChild;\n\n        while (tempDiv.firstChild) {\n          this[i].appendChild(tempDiv.firstChild);\n        }\n      } else if (newChild instanceof Dom7) {\n        for (let j = 0; j < newChild.length; j += 1) {\n          this[i].appendChild(newChild[j]);\n        }\n      } else {\n        this[i].appendChild(newChild);\n      }\n    }\n  }\n\n  return this;\n}\n\nfunction appendTo(parent) {\n  $(parent).append(this);\n  return this;\n}\n\nfunction prepend(newChild) {\n  const document = getDocument();\n  let i;\n  let j;\n\n  for (i = 0; i < this.length; i += 1) {\n    if (typeof newChild === 'string') {\n      const tempDiv = document.createElement('div');\n      tempDiv.innerHTML = newChild;\n\n      for (j = tempDiv.childNodes.length - 1; j >= 0; j -= 1) {\n        this[i].insertBefore(tempDiv.childNodes[j], this[i].childNodes[0]);\n      }\n    } else if (newChild instanceof Dom7) {\n      for (j = 0; j < newChild.length; j += 1) {\n        this[i].insertBefore(newChild[j], this[i].childNodes[0]);\n      }\n    } else {\n      this[i].insertBefore(newChild, this[i].childNodes[0]);\n    }\n  }\n\n  return this;\n}\n\nfunction prependTo(parent) {\n  $(parent).prepend(this);\n  return this;\n}\n\nfunction insertBefore(selector) {\n  const before = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (before.length === 1) {\n      before[0].parentNode.insertBefore(this[i], before[0]);\n    } else if (before.length > 1) {\n      for (let j = 0; j < before.length; j += 1) {\n        before[j].parentNode.insertBefore(this[i].cloneNode(true), before[j]);\n      }\n    }\n  }\n}\n\nfunction insertAfter(selector) {\n  const after = $(selector);\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (after.length === 1) {\n      after[0].parentNode.insertBefore(this[i], after[0].nextSibling);\n    } else if (after.length > 1) {\n      for (let j = 0; j < after.length; j += 1) {\n        after[j].parentNode.insertBefore(this[i].cloneNode(true), after[j].nextSibling);\n      }\n    }\n  }\n}\n\nfunction next(selector) {\n  if (this.length > 0) {\n    if (selector) {\n      if (this[0].nextElementSibling && $(this[0].nextElementSibling).is(selector)) {\n        return $([this[0].nextElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (this[0].nextElementSibling) return $([this[0].nextElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction nextAll(selector) {\n  const nextEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.nextElementSibling) {\n    const next = el.nextElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(next).is(selector)) nextEls.push(next);\n    } else nextEls.push(next);\n\n    el = next;\n  }\n\n  return $(nextEls);\n}\n\nfunction prev(selector) {\n  if (this.length > 0) {\n    const el = this[0];\n\n    if (selector) {\n      if (el.previousElementSibling && $(el.previousElementSibling).is(selector)) {\n        return $([el.previousElementSibling]);\n      }\n\n      return $([]);\n    }\n\n    if (el.previousElementSibling) return $([el.previousElementSibling]);\n    return $([]);\n  }\n\n  return $([]);\n}\n\nfunction prevAll(selector) {\n  const prevEls = [];\n  let el = this[0];\n  if (!el) return $([]);\n\n  while (el.previousElementSibling) {\n    const prev = el.previousElementSibling; // eslint-disable-line\n\n    if (selector) {\n      if ($(prev).is(selector)) prevEls.push(prev);\n    } else prevEls.push(prev);\n\n    el = prev;\n  }\n\n  return $(prevEls);\n}\n\nfunction siblings(selector) {\n  return this.nextAll(selector).add(this.prevAll(selector));\n}\n\nfunction parent(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode !== null) {\n      if (selector) {\n        if ($(this[i].parentNode).is(selector)) parents.push(this[i].parentNode);\n      } else {\n        parents.push(this[i].parentNode);\n      }\n    }\n  }\n\n  return $(parents);\n}\n\nfunction parents(selector) {\n  const parents = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    let parent = this[i].parentNode; // eslint-disable-line\n\n    while (parent) {\n      if (selector) {\n        if ($(parent).is(selector)) parents.push(parent);\n      } else {\n        parents.push(parent);\n      }\n\n      parent = parent.parentNode;\n    }\n  }\n\n  return $(parents);\n}\n\nfunction closest(selector) {\n  let closest = this; // eslint-disable-line\n\n  if (typeof selector === 'undefined') {\n    return $([]);\n  }\n\n  if (!closest.is(selector)) {\n    closest = closest.parents(selector).eq(0);\n  }\n\n  return closest;\n}\n\nfunction find(selector) {\n  const foundElements = [];\n\n  for (let i = 0; i < this.length; i += 1) {\n    const found = this[i].querySelectorAll(selector);\n\n    for (let j = 0; j < found.length; j += 1) {\n      foundElements.push(found[j]);\n    }\n  }\n\n  return $(foundElements);\n}\n\nfunction children(selector) {\n  const children = []; // eslint-disable-line\n\n  for (let i = 0; i < this.length; i += 1) {\n    const childNodes = this[i].children;\n\n    for (let j = 0; j < childNodes.length; j += 1) {\n      if (!selector || $(childNodes[j]).is(selector)) {\n        children.push(childNodes[j]);\n      }\n    }\n  }\n\n  return $(children);\n}\n\nfunction remove() {\n  for (let i = 0; i < this.length; i += 1) {\n    if (this[i].parentNode) this[i].parentNode.removeChild(this[i]);\n  }\n\n  return this;\n}\n\nfunction detach() {\n  return this.remove();\n}\n\nfunction add(...els) {\n  const dom = this;\n  let i;\n  let j;\n\n  for (i = 0; i < els.length; i += 1) {\n    const toAdd = $(els[i]);\n\n    for (j = 0; j < toAdd.length; j += 1) {\n      dom.push(toAdd[j]);\n    }\n  }\n\n  return dom;\n}\n\nfunction empty() {\n  for (let i = 0; i < this.length; i += 1) {\n    const el = this[i];\n\n    if (el.nodeType === 1) {\n      for (let j = 0; j < el.childNodes.length; j += 1) {\n        if (el.childNodes[j].parentNode) {\n          el.childNodes[j].parentNode.removeChild(el.childNodes[j]);\n        }\n      }\n\n      el.textContent = '';\n    }\n  }\n\n  return this;\n}\n\n// eslint-disable-next-line\n\nfunction scrollTo(...args) {\n  const window = getWindow();\n  let [left, top, duration, easing, callback] = args;\n\n  if (args.length === 4 && typeof easing === 'function') {\n    callback = easing;\n    [left, top, duration, callback, easing] = args;\n  }\n\n  if (typeof easing === 'undefined') easing = 'swing';\n  return this.each(function animate() {\n    const el = this;\n    let currentTop;\n    let currentLeft;\n    let maxTop;\n    let maxLeft;\n    let newTop;\n    let newLeft;\n    let scrollTop; // eslint-disable-line\n\n    let scrollLeft; // eslint-disable-line\n\n    let animateTop = top > 0 || top === 0;\n    let animateLeft = left > 0 || left === 0;\n\n    if (typeof easing === 'undefined') {\n      easing = 'swing';\n    }\n\n    if (animateTop) {\n      currentTop = el.scrollTop;\n\n      if (!duration) {\n        el.scrollTop = top;\n      }\n    }\n\n    if (animateLeft) {\n      currentLeft = el.scrollLeft;\n\n      if (!duration) {\n        el.scrollLeft = left;\n      }\n    }\n\n    if (!duration) return;\n\n    if (animateTop) {\n      maxTop = el.scrollHeight - el.offsetHeight;\n      newTop = Math.max(Math.min(top, maxTop), 0);\n    }\n\n    if (animateLeft) {\n      maxLeft = el.scrollWidth - el.offsetWidth;\n      newLeft = Math.max(Math.min(left, maxLeft), 0);\n    }\n\n    let startTime = null;\n    if (animateTop && newTop === currentTop) animateTop = false;\n    if (animateLeft && newLeft === currentLeft) animateLeft = false;\n\n    function render(time = new Date().getTime()) {\n      if (startTime === null) {\n        startTime = time;\n      }\n\n      const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n      const easeProgress = easing === 'linear' ? progress : 0.5 - Math.cos(progress * Math.PI) / 2;\n      let done;\n      if (animateTop) scrollTop = currentTop + easeProgress * (newTop - currentTop);\n      if (animateLeft) scrollLeft = currentLeft + easeProgress * (newLeft - currentLeft);\n\n      if (animateTop && newTop > currentTop && scrollTop >= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateTop && newTop < currentTop && scrollTop <= newTop) {\n        el.scrollTop = newTop;\n        done = true;\n      }\n\n      if (animateLeft && newLeft > currentLeft && scrollLeft >= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (animateLeft && newLeft < currentLeft && scrollLeft <= newLeft) {\n        el.scrollLeft = newLeft;\n        done = true;\n      }\n\n      if (done) {\n        if (callback) callback();\n        return;\n      }\n\n      if (animateTop) el.scrollTop = scrollTop;\n      if (animateLeft) el.scrollLeft = scrollLeft;\n      window.requestAnimationFrame(render);\n    }\n\n    window.requestAnimationFrame(render);\n  });\n} // scrollTop(top, duration, easing, callback) {\n\n\nfunction scrollTop(...args) {\n  let [top, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [top, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof top === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollTop;\n    return null;\n  }\n\n  return dom.scrollTo(undefined, top, duration, easing, callback);\n}\n\nfunction scrollLeft(...args) {\n  let [left, duration, easing, callback] = args;\n\n  if (args.length === 3 && typeof easing === 'function') {\n    [left, duration, callback, easing] = args;\n  }\n\n  const dom = this;\n\n  if (typeof left === 'undefined') {\n    if (dom.length > 0) return dom[0].scrollLeft;\n    return null;\n  }\n\n  return dom.scrollTo(left, undefined, duration, easing, callback);\n}\n\n// eslint-disable-next-line\n\nfunction animate(initialProps, initialParams) {\n  const window = getWindow();\n  const els = this;\n  const a = {\n    props: Object.assign({}, initialProps),\n    params: Object.assign({\n      duration: 300,\n      easing: 'swing' // or 'linear'\n\n      /* Callbacks\n      begin(elements)\n      complete(elements)\n      progress(elements, complete, remaining, start, tweenValue)\n      */\n\n    }, initialParams),\n    elements: els,\n    animating: false,\n    que: [],\n\n    easingProgress(easing, progress) {\n      if (easing === 'swing') {\n        return 0.5 - Math.cos(progress * Math.PI) / 2;\n      }\n\n      if (typeof easing === 'function') {\n        return easing(progress);\n      }\n\n      return progress;\n    },\n\n    stop() {\n      if (a.frameId) {\n        window.cancelAnimationFrame(a.frameId);\n      }\n\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      a.que = [];\n    },\n\n    done(complete) {\n      a.animating = false;\n      a.elements.each(el => {\n        const element = el;\n        delete element.dom7AnimateInstance;\n      });\n      if (complete) complete(els);\n\n      if (a.que.length > 0) {\n        const que = a.que.shift();\n        a.animate(que[0], que[1]);\n      }\n    },\n\n    animate(props, params) {\n      if (a.animating) {\n        a.que.push([props, params]);\n        return a;\n      }\n\n      const elements = []; // Define & Cache Initials & Units\n\n      a.elements.each((el, index) => {\n        let initialFullValue;\n        let initialValue;\n        let unit;\n        let finalValue;\n        let finalFullValue;\n        if (!el.dom7AnimateInstance) a.elements[index].dom7AnimateInstance = a;\n        elements[index] = {\n          container: el\n        };\n        Object.keys(props).forEach(prop => {\n          initialFullValue = window.getComputedStyle(el, null).getPropertyValue(prop).replace(',', '.');\n          initialValue = parseFloat(initialFullValue);\n          unit = initialFullValue.replace(initialValue, '');\n          finalValue = parseFloat(props[prop]);\n          finalFullValue = props[prop] + unit;\n          elements[index][prop] = {\n            initialFullValue,\n            initialValue,\n            unit,\n            finalValue,\n            finalFullValue,\n            currentValue: initialValue\n          };\n        });\n      });\n      let startTime = null;\n      let time;\n      let elementsDone = 0;\n      let propsDone = 0;\n      let done;\n      let began = false;\n      a.animating = true;\n\n      function render() {\n        time = new Date().getTime();\n        let progress;\n        let easeProgress; // let el;\n\n        if (!began) {\n          began = true;\n          if (params.begin) params.begin(els);\n        }\n\n        if (startTime === null) {\n          startTime = time;\n        }\n\n        if (params.progress) {\n          // eslint-disable-next-line\n          params.progress(els, Math.max(Math.min((time - startTime) / params.duration, 1), 0), startTime + params.duration - time < 0 ? 0 : startTime + params.duration - time, startTime);\n        }\n\n        elements.forEach(element => {\n          const el = element;\n          if (done || el.done) return;\n          Object.keys(props).forEach(prop => {\n            if (done || el.done) return;\n            progress = Math.max(Math.min((time - startTime) / params.duration, 1), 0);\n            easeProgress = a.easingProgress(params.easing, progress);\n            const {\n              initialValue,\n              finalValue,\n              unit\n            } = el[prop];\n            el[prop].currentValue = initialValue + easeProgress * (finalValue - initialValue);\n            const currentValue = el[prop].currentValue;\n\n            if (finalValue > initialValue && currentValue >= finalValue || finalValue < initialValue && currentValue <= finalValue) {\n              el.container.style[prop] = finalValue + unit;\n              propsDone += 1;\n\n              if (propsDone === Object.keys(props).length) {\n                el.done = true;\n                elementsDone += 1;\n              }\n\n              if (elementsDone === elements.length) {\n                done = true;\n              }\n            }\n\n            if (done) {\n              a.done(params.complete);\n              return;\n            }\n\n            el.container.style[prop] = currentValue + unit;\n          });\n        });\n        if (done) return; // Then call\n\n        a.frameId = window.requestAnimationFrame(render);\n      }\n\n      a.frameId = window.requestAnimationFrame(render);\n      return a;\n    }\n\n  };\n\n  if (a.elements.length === 0) {\n    return els;\n  }\n\n  let animateInstance;\n\n  for (let i = 0; i < a.elements.length; i += 1) {\n    if (a.elements[i].dom7AnimateInstance) {\n      animateInstance = a.elements[i].dom7AnimateInstance;\n    } else a.elements[i].dom7AnimateInstance = a;\n  }\n\n  if (!animateInstance) {\n    animateInstance = a;\n  }\n\n  if (initialProps === 'stop') {\n    animateInstance.stop();\n  } else {\n    animateInstance.animate(a.props, a.params);\n  }\n\n  return els;\n}\n\nfunction stop() {\n  const els = this;\n\n  for (let i = 0; i < els.length; i += 1) {\n    if (els[i].dom7AnimateInstance) {\n      els[i].dom7AnimateInstance.stop();\n    }\n  }\n}\n\nconst noTrigger = 'resize scroll'.split(' ');\n\nfunction shortcut(name) {\n  function eventHandler(...args) {\n    if (typeof args[0] === 'undefined') {\n      for (let i = 0; i < this.length; i += 1) {\n        if (noTrigger.indexOf(name) < 0) {\n          if (name in this[i]) this[i][name]();else {\n            $(this[i]).trigger(name);\n          }\n        }\n      }\n\n      return this;\n    }\n\n    return this.on(name, ...args);\n  }\n\n  return eventHandler;\n}\n\nconst click = shortcut('click');\nconst blur = shortcut('blur');\nconst focus = shortcut('focus');\nconst focusin = shortcut('focusin');\nconst focusout = shortcut('focusout');\nconst keyup = shortcut('keyup');\nconst keydown = shortcut('keydown');\nconst keypress = shortcut('keypress');\nconst submit = shortcut('submit');\nconst change = shortcut('change');\nconst mousedown = shortcut('mousedown');\nconst mousemove = shortcut('mousemove');\nconst mouseup = shortcut('mouseup');\nconst mouseenter = shortcut('mouseenter');\nconst mouseleave = shortcut('mouseleave');\nconst mouseout = shortcut('mouseout');\nconst mouseover = shortcut('mouseover');\nconst touchstart = shortcut('touchstart');\nconst touchend = shortcut('touchend');\nconst touchmove = shortcut('touchmove');\nconst resize = shortcut('resize');\nconst scroll = shortcut('scroll');\n\nexport default $;\nexport { $, add, addClass, animate, animationEnd, append, appendTo, attr, blur, change, children, click, closest, css, data, dataset, detach, each, empty, eq, filter, find, focus, focusin, focusout, hasClass, height, hide, html, index, insertAfter, insertBefore, is, keydown, keypress, keyup, mousedown, mouseenter, mouseleave, mousemove, mouseout, mouseover, mouseup, next, nextAll, off, offset, on, once, outerHeight, outerWidth, parent, parents, prepend, prependTo, prev, prevAll, prop, remove, removeAttr, removeClass, removeData, resize, scroll, scrollLeft, scrollTo, scrollTop, show, siblings, stop, styles, submit, text, toggleClass, touchend, touchmove, touchstart, transform, transition, transitionEnd, trigger, val, value, width };\n","import { $, addClass, removeClass, hasClass, toggleClass, attr, removeAttr, transform, transition, on, off, trigger, transitionEnd, outerWidth, outerHeight, styles, offset, css, each, html, text, is, index, eq, append, prepend, next, nextAll, prev, prevAll, parent, parents, closest, find, children, filter, remove } from 'dom7';\nconst Methods = {\n  addClass,\n  removeClass,\n  hasClass,\n  toggleClass,\n  attr,\n  removeAttr,\n  transform,\n  transition,\n  on,\n  off,\n  trigger,\n  transitionEnd,\n  outerWidth,\n  outerHeight,\n  styles,\n  offset,\n  css,\n  each,\n  html,\n  text,\n  is,\n  index,\n  eq,\n  append,\n  prepend,\n  next,\n  nextAll,\n  prev,\n  prevAll,\n  parent,\n  parents,\n  closest,\n  find,\n  children,\n  filter,\n  remove\n};\nObject.keys(Methods).forEach(methodName => {\n  Object.defineProperty($.fn, methodName, {\n    value: Methods[methodName],\n    writable: true\n  });\n});\nexport default $;","import { getWindow } from 'ssr-window';\n\nfunction deleteProps(obj) {\n  const object = obj;\n  Object.keys(object).forEach(key => {\n    try {\n      object[key] = null;\n    } catch (e) {// no getter for object\n    }\n\n    try {\n      delete object[key];\n    } catch (e) {// something got wrong\n    }\n  });\n}\n\nfunction nextTick(callback, delay = 0) {\n  return setTimeout(callback, delay);\n}\n\nfunction now() {\n  return Date.now();\n}\n\nfunction getComputedStyle(el) {\n  const window = getWindow();\n  let style;\n\n  if (window.getComputedStyle) {\n    style = window.getComputedStyle(el, null);\n  }\n\n  if (!style && el.currentStyle) {\n    style = el.currentStyle;\n  }\n\n  if (!style) {\n    style = el.style;\n  }\n\n  return style;\n}\n\nfunction getTranslate(el, axis = 'x') {\n  const window = getWindow();\n  let matrix;\n  let curTransform;\n  let transformMatrix;\n  const curStyle = getComputedStyle(el, null);\n\n  if (window.WebKitCSSMatrix) {\n    curTransform = curStyle.transform || curStyle.webkitTransform;\n\n    if (curTransform.split(',').length > 6) {\n      curTransform = curTransform.split(', ').map(a => a.replace(',', '.')).join(', ');\n    } // Some old versions of Webkit choke when 'none' is passed; pass\n    // empty string instead in this case\n\n\n    transformMatrix = new window.WebKitCSSMatrix(curTransform === 'none' ? '' : curTransform);\n  } else {\n    transformMatrix = curStyle.MozTransform || curStyle.OTransform || curStyle.MsTransform || curStyle.msTransform || curStyle.transform || curStyle.getPropertyValue('transform').replace('translate(', 'matrix(1, 0, 0, 1,');\n    matrix = transformMatrix.toString().split(',');\n  }\n\n  if (axis === 'x') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m41; // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[12]); // Normal Browsers\n    else curTransform = parseFloat(matrix[4]);\n  }\n\n  if (axis === 'y') {\n    // Latest Chrome and webkits Fix\n    if (window.WebKitCSSMatrix) curTransform = transformMatrix.m42; // Crazy IE10 Matrix\n    else if (matrix.length === 16) curTransform = parseFloat(matrix[13]); // Normal Browsers\n    else curTransform = parseFloat(matrix[5]);\n  }\n\n  return curTransform || 0;\n}\n\nfunction isObject(o) {\n  return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';\n}\n\nfunction isNode(node) {\n  // eslint-disable-next-line\n  if (typeof window !== 'undefined' && typeof window.HTMLElement !== 'undefined') {\n    return node instanceof HTMLElement;\n  }\n\n  return node && (node.nodeType === 1 || node.nodeType === 11);\n}\n\nfunction extend(...args) {\n  const to = Object(args[0]);\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n\n  for (let i = 1; i < args.length; i += 1) {\n    const nextSource = args[i];\n\n    if (nextSource !== undefined && nextSource !== null && !isNode(nextSource)) {\n      const keysArray = Object.keys(Object(nextSource)).filter(key => noExtend.indexOf(key) < 0);\n\n      for (let nextIndex = 0, len = keysArray.length; nextIndex < len; nextIndex += 1) {\n        const nextKey = keysArray[nextIndex];\n        const desc = Object.getOwnPropertyDescriptor(nextSource, nextKey);\n\n        if (desc !== undefined && desc.enumerable) {\n          if (isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else if (!isObject(to[nextKey]) && isObject(nextSource[nextKey])) {\n            to[nextKey] = {};\n\n            if (nextSource[nextKey].__swiper__) {\n              to[nextKey] = nextSource[nextKey];\n            } else {\n              extend(to[nextKey], nextSource[nextKey]);\n            }\n          } else {\n            to[nextKey] = nextSource[nextKey];\n          }\n        }\n      }\n    }\n  }\n\n  return to;\n}\n\nfunction setCSSProperty(el, varName, varValue) {\n  el.style.setProperty(varName, varValue);\n}\n\nfunction animateCSSModeScroll({\n  swiper,\n  targetPosition,\n  side\n}) {\n  const window = getWindow();\n  const startPosition = -swiper.translate;\n  let startTime = null;\n  let time;\n  const duration = swiper.params.speed;\n  swiper.wrapperEl.style.scrollSnapType = 'none';\n  window.cancelAnimationFrame(swiper.cssModeFrameID);\n  const dir = targetPosition > startPosition ? 'next' : 'prev';\n\n  const isOutOfBound = (current, target) => {\n    return dir === 'next' && current >= target || dir === 'prev' && current <= target;\n  };\n\n  const animate = () => {\n    time = new Date().getTime();\n\n    if (startTime === null) {\n      startTime = time;\n    }\n\n    const progress = Math.max(Math.min((time - startTime) / duration, 1), 0);\n    const easeProgress = 0.5 - Math.cos(progress * Math.PI) / 2;\n    let currentPosition = startPosition + easeProgress * (targetPosition - startPosition);\n\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      currentPosition = targetPosition;\n    }\n\n    swiper.wrapperEl.scrollTo({\n      [side]: currentPosition\n    });\n\n    if (isOutOfBound(currentPosition, targetPosition)) {\n      swiper.wrapperEl.style.overflow = 'hidden';\n      swiper.wrapperEl.style.scrollSnapType = '';\n      setTimeout(() => {\n        swiper.wrapperEl.style.overflow = '';\n        swiper.wrapperEl.scrollTo({\n          [side]: currentPosition\n        });\n      });\n      window.cancelAnimationFrame(swiper.cssModeFrameID);\n      return;\n    }\n\n    swiper.cssModeFrameID = window.requestAnimationFrame(animate);\n  };\n\n  animate();\n}\n\nexport { animateCSSModeScroll, deleteProps, nextTick, now, getTranslate, isObject, extend, getComputedStyle, setCSSProperty };","import { getWindow, getDocument } from 'ssr-window';\nlet support;\n\nfunction calcSupport() {\n  const window = getWindow();\n  const document = getDocument();\n  return {\n    smoothScroll: document.documentElement && 'scrollBehavior' in document.documentElement.style,\n    touch: !!('ontouchstart' in window || window.DocumentTouch && document instanceof window.DocumentTouch),\n    passiveListener: function checkPassiveListener() {\n      let supportsPassive = false;\n\n      try {\n        const opts = Object.defineProperty({}, 'passive', {\n          // eslint-disable-next-line\n          get() {\n            supportsPassive = true;\n          }\n\n        });\n        window.addEventListener('testPassiveListener', null, opts);\n      } catch (e) {// No support\n      }\n\n      return supportsPassive;\n    }(),\n    gestures: function checkGestures() {\n      return 'ongesturestart' in window;\n    }()\n  };\n}\n\nfunction getSupport() {\n  if (!support) {\n    support = calcSupport();\n  }\n\n  return support;\n}\n\nexport { getSupport };","import { getWindow } from 'ssr-window';\nimport { getSupport } from './get-support.js';\nlet deviceCached;\n\nfunction calcDevice({\n  userAgent\n} = {}) {\n  const support = getSupport();\n  const window = getWindow();\n  const platform = window.navigator.platform;\n  const ua = userAgent || window.navigator.userAgent;\n  const device = {\n    ios: false,\n    android: false\n  };\n  const screenWidth = window.screen.width;\n  const screenHeight = window.screen.height;\n  const android = ua.match(/(Android);?[\\s\\/]+([\\d.]+)?/); // eslint-disable-line\n\n  let ipad = ua.match(/(iPad).*OS\\s([\\d_]+)/);\n  const ipod = ua.match(/(iPod)(.*OS\\s([\\d_]+))?/);\n  const iphone = !ipad && ua.match(/(iPhone\\sOS|iOS)\\s([\\d_]+)/);\n  const windows = platform === 'Win32';\n  let macos = platform === 'MacIntel'; // iPadOs 13 fix\n\n  const iPadScreens = ['1024x1366', '1366x1024', '834x1194', '1194x834', '834x1112', '1112x834', '768x1024', '1024x768', '820x1180', '1180x820', '810x1080', '1080x810'];\n\n  if (!ipad && macos && support.touch && iPadScreens.indexOf(`${screenWidth}x${screenHeight}`) >= 0) {\n    ipad = ua.match(/(Version)\\/([\\d.]+)/);\n    if (!ipad) ipad = [0, 1, '13_0_0'];\n    macos = false;\n  } // Android\n\n\n  if (android && !windows) {\n    device.os = 'android';\n    device.android = true;\n  }\n\n  if (ipad || iphone || ipod) {\n    device.os = 'ios';\n    device.ios = true;\n  } // Export object\n\n\n  return device;\n}\n\nfunction getDevice(overrides = {}) {\n  if (!deviceCached) {\n    deviceCached = calcDevice(overrides);\n  }\n\n  return deviceCached;\n}\n\nexport { getDevice };","import { getWindow } from 'ssr-window';\nlet browser;\n\nfunction calcBrowser() {\n  const window = getWindow();\n\n  function isSafari() {\n    const ua = window.navigator.userAgent.toLowerCase();\n    return ua.indexOf('safari') >= 0 && ua.indexOf('chrome') < 0 && ua.indexOf('android') < 0;\n  }\n\n  return {\n    isSafari: isSafari(),\n    isWebView: /(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(window.navigator.userAgent)\n  };\n}\n\nfunction getBrowser() {\n  if (!browser) {\n    browser = calcBrowser();\n  }\n\n  return browser;\n}\n\nexport { getBrowser };","/* eslint-disable no-underscore-dangle */\nexport default {\n  on(events, handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n    events.split(' ').forEach(event => {\n      if (!self.eventsListeners[event]) self.eventsListeners[event] = [];\n      self.eventsListeners[event][method](handler);\n    });\n    return self;\n  },\n\n  once(events, handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n\n    function onceHandler(...args) {\n      self.off(events, onceHandler);\n\n      if (onceHandler.__emitterProxy) {\n        delete onceHandler.__emitterProxy;\n      }\n\n      handler.apply(self, args);\n    }\n\n    onceHandler.__emitterProxy = handler;\n    return self.on(events, onceHandler, priority);\n  },\n\n  onAny(handler, priority) {\n    const self = this;\n    if (typeof handler !== 'function') return self;\n    const method = priority ? 'unshift' : 'push';\n\n    if (self.eventsAnyListeners.indexOf(handler) < 0) {\n      self.eventsAnyListeners[method](handler);\n    }\n\n    return self;\n  },\n\n  offAny(handler) {\n    const self = this;\n    if (!self.eventsAnyListeners) return self;\n    const index = self.eventsAnyListeners.indexOf(handler);\n\n    if (index >= 0) {\n      self.eventsAnyListeners.splice(index, 1);\n    }\n\n    return self;\n  },\n\n  off(events, handler) {\n    const self = this;\n    if (!self.eventsListeners) return self;\n    events.split(' ').forEach(event => {\n      if (typeof handler === 'undefined') {\n        self.eventsListeners[event] = [];\n      } else if (self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach((eventHandler, index) => {\n          if (eventHandler === handler || eventHandler.__emitterProxy && eventHandler.__emitterProxy === handler) {\n            self.eventsListeners[event].splice(index, 1);\n          }\n        });\n      }\n    });\n    return self;\n  },\n\n  emit(...args) {\n    const self = this;\n    if (!self.eventsListeners) return self;\n    let events;\n    let data;\n    let context;\n\n    if (typeof args[0] === 'string' || Array.isArray(args[0])) {\n      events = args[0];\n      data = args.slice(1, args.length);\n      context = self;\n    } else {\n      events = args[0].events;\n      data = args[0].data;\n      context = args[0].context || self;\n    }\n\n    data.unshift(context);\n    const eventsArray = Array.isArray(events) ? events : events.split(' ');\n    eventsArray.forEach(event => {\n      if (self.eventsAnyListeners && self.eventsAnyListeners.length) {\n        self.eventsAnyListeners.forEach(eventHandler => {\n          eventHandler.apply(context, [event, ...data]);\n        });\n      }\n\n      if (self.eventsListeners && self.eventsListeners[event]) {\n        self.eventsListeners[event].forEach(eventHandler => {\n          eventHandler.apply(context, data);\n        });\n      }\n    });\n    return self;\n  }\n\n};","export default function transitionEmit({\n  swiper,\n  runCallbacks,\n  direction,\n  step\n}) {\n  const {\n    activeIndex,\n    previousIndex\n  } = swiper;\n  let dir = direction;\n\n  if (!dir) {\n    if (activeIndex > previousIndex) dir = 'next';else if (activeIndex < previousIndex) dir = 'prev';else dir = 'reset';\n  }\n\n  swiper.emit(`transition${step}`);\n\n  if (runCallbacks && activeIndex !== previousIndex) {\n    if (dir === 'reset') {\n      swiper.emit(`slideResetTransition${step}`);\n      return;\n    }\n\n    swiper.emit(`slideChangeTransition${step}`);\n\n    if (dir === 'next') {\n      swiper.emit(`slideNextTransition${step}`);\n    } else {\n      swiper.emit(`slidePrevTransition${step}`);\n    }\n  }\n}","import { getWindow, getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js'; // Modified from https://stackoverflow.com/questions/54520554/custom-element-getrootnode-closest-function-crossing-multiple-parent-shadowd\n\nfunction closestElement(selector, base = this) {\n  function __closestFrom(el) {\n    if (!el || el === getDocument() || el === getWindow()) return null;\n    if (el.assignedSlot) el = el.assignedSlot;\n    const found = el.closest(selector);\n    return found || __closestFrom(el.getRootNode().host);\n  }\n\n  return __closestFrom(base);\n}\n\nexport default function onTouchStart(event) {\n  const swiper = this;\n  const document = getDocument();\n  const window = getWindow();\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return;\n  }\n\n  if (!swiper.animating && params.cssMode && params.loop) {\n    swiper.loopFix();\n  }\n\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n  let $targetEl = $(e.target);\n\n  if (params.touchEventsTarget === 'wrapper') {\n    if (!$targetEl.closest(swiper.wrapperEl).length) return;\n  }\n\n  data.isTouchEvent = e.type === 'touchstart';\n  if (!data.isTouchEvent && 'which' in e && e.which === 3) return;\n  if (!data.isTouchEvent && 'button' in e && e.button > 0) return;\n  if (data.isTouched && data.isMoved) return; // change target el for shadow root component\n\n  const swipingClassHasValue = !!params.noSwipingClass && params.noSwipingClass !== '';\n\n  if (swipingClassHasValue && e.target && e.target.shadowRoot && event.path && event.path[0]) {\n    $targetEl = $(event.path[0]);\n  }\n\n  const noSwipingSelector = params.noSwipingSelector ? params.noSwipingSelector : `.${params.noSwipingClass}`;\n  const isTargetShadow = !!(e.target && e.target.shadowRoot); // use closestElement for shadow root element to get the actual closest for nested shadow root element\n\n  if (params.noSwiping && (isTargetShadow ? closestElement(noSwipingSelector, e.target) : $targetEl.closest(noSwipingSelector)[0])) {\n    swiper.allowClick = true;\n    return;\n  }\n\n  if (params.swipeHandler) {\n    if (!$targetEl.closest(params.swipeHandler)[0]) return;\n  }\n\n  touches.currentX = e.type === 'touchstart' ? e.targetTouches[0].pageX : e.pageX;\n  touches.currentY = e.type === 'touchstart' ? e.targetTouches[0].pageY : e.pageY;\n  const startX = touches.currentX;\n  const startY = touches.currentY; // Do NOT start if iOS edge swipe is detected. Otherwise iOS app cannot swipe-to-go-back anymore\n\n  const edgeSwipeDetection = params.edgeSwipeDetection || params.iOSEdgeSwipeDetection;\n  const edgeSwipeThreshold = params.edgeSwipeThreshold || params.iOSEdgeSwipeThreshold;\n\n  if (edgeSwipeDetection && (startX <= edgeSwipeThreshold || startX >= window.innerWidth - edgeSwipeThreshold)) {\n    if (edgeSwipeDetection === 'prevent') {\n      event.preventDefault();\n    } else {\n      return;\n    }\n  }\n\n  Object.assign(data, {\n    isTouched: true,\n    isMoved: false,\n    allowTouchCallbacks: true,\n    isScrolling: undefined,\n    startMoving: undefined\n  });\n  touches.startX = startX;\n  touches.startY = startY;\n  data.touchStartTime = now();\n  swiper.allowClick = true;\n  swiper.updateSize();\n  swiper.swipeDirection = undefined;\n  if (params.threshold > 0) data.allowThresholdMove = false;\n\n  if (e.type !== 'touchstart') {\n    let preventDefault = true;\n    if ($targetEl.is(data.focusableElements)) preventDefault = false;\n\n    if (document.activeElement && $(document.activeElement).is(data.focusableElements) && document.activeElement !== $targetEl[0]) {\n      document.activeElement.blur();\n    }\n\n    const shouldPreventDefault = preventDefault && swiper.allowTouchMove && params.touchStartPreventDefault;\n\n    if ((params.touchStartForcePreventDefault || shouldPreventDefault) && !$targetEl[0].isContentEditable) {\n      e.preventDefault();\n    }\n  }\n\n  swiper.emit('touchStart', e);\n}","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { now } from '../../shared/utils.js';\nexport default function onTouchMove(event) {\n  const document = getDocument();\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n\n  if (!data.isTouched) {\n    if (data.startMoving && data.isScrolling) {\n      swiper.emit('touchMoveOpposite', e);\n    }\n\n    return;\n  }\n\n  if (data.isTouchEvent && e.type !== 'touchmove') return;\n  const targetTouch = e.type === 'touchmove' && e.targetTouches && (e.targetTouches[0] || e.changedTouches[0]);\n  const pageX = e.type === 'touchmove' ? targetTouch.pageX : e.pageX;\n  const pageY = e.type === 'touchmove' ? targetTouch.pageY : e.pageY;\n\n  if (e.preventedByNestedSwiper) {\n    touches.startX = pageX;\n    touches.startY = pageY;\n    return;\n  }\n\n  if (!swiper.allowTouchMove) {\n    // isMoved = true;\n    swiper.allowClick = false;\n\n    if (data.isTouched) {\n      Object.assign(touches, {\n        startX: pageX,\n        startY: pageY,\n        currentX: pageX,\n        currentY: pageY\n      });\n      data.touchStartTime = now();\n    }\n\n    return;\n  }\n\n  if (data.isTouchEvent && params.touchReleaseOnEdges && !params.loop) {\n    if (swiper.isVertical()) {\n      // Vertical\n      if (pageY < touches.startY && swiper.translate <= swiper.maxTranslate() || pageY > touches.startY && swiper.translate >= swiper.minTranslate()) {\n        data.isTouched = false;\n        data.isMoved = false;\n        return;\n      }\n    } else if (pageX < touches.startX && swiper.translate <= swiper.maxTranslate() || pageX > touches.startX && swiper.translate >= swiper.minTranslate()) {\n      return;\n    }\n  }\n\n  if (data.isTouchEvent && document.activeElement) {\n    if (e.target === document.activeElement && $(e.target).is(data.focusableElements)) {\n      data.isMoved = true;\n      swiper.allowClick = false;\n      return;\n    }\n  }\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchMove', e);\n  }\n\n  if (e.targetTouches && e.targetTouches.length > 1) return;\n  touches.currentX = pageX;\n  touches.currentY = pageY;\n  const diffX = touches.currentX - touches.startX;\n  const diffY = touches.currentY - touches.startY;\n  if (swiper.params.threshold && Math.sqrt(diffX ** 2 + diffY ** 2) < swiper.params.threshold) return;\n\n  if (typeof data.isScrolling === 'undefined') {\n    let touchAngle;\n\n    if (swiper.isHorizontal() && touches.currentY === touches.startY || swiper.isVertical() && touches.currentX === touches.startX) {\n      data.isScrolling = false;\n    } else {\n      // eslint-disable-next-line\n      if (diffX * diffX + diffY * diffY >= 25) {\n        touchAngle = Math.atan2(Math.abs(diffY), Math.abs(diffX)) * 180 / Math.PI;\n        data.isScrolling = swiper.isHorizontal() ? touchAngle > params.touchAngle : 90 - touchAngle > params.touchAngle;\n      }\n    }\n  }\n\n  if (data.isScrolling) {\n    swiper.emit('touchMoveOpposite', e);\n  }\n\n  if (typeof data.startMoving === 'undefined') {\n    if (touches.currentX !== touches.startX || touches.currentY !== touches.startY) {\n      data.startMoving = true;\n    }\n  }\n\n  if (data.isScrolling) {\n    data.isTouched = false;\n    return;\n  }\n\n  if (!data.startMoving) {\n    return;\n  }\n\n  swiper.allowClick = false;\n\n  if (!params.cssMode && e.cancelable) {\n    e.preventDefault();\n  }\n\n  if (params.touchMoveStopPropagation && !params.nested) {\n    e.stopPropagation();\n  }\n\n  if (!data.isMoved) {\n    if (params.loop && !params.cssMode) {\n      swiper.loopFix();\n    }\n\n    data.startTranslate = swiper.getTranslate();\n    swiper.setTransition(0);\n\n    if (swiper.animating) {\n      swiper.$wrapperEl.trigger('webkitTransitionEnd transitionend');\n    }\n\n    data.allowMomentumBounce = false; // Grab Cursor\n\n    if (params.grabCursor && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n      swiper.setGrabCursor(true);\n    }\n\n    swiper.emit('sliderFirstMove', e);\n  }\n\n  swiper.emit('sliderMove', e);\n  data.isMoved = true;\n  let diff = swiper.isHorizontal() ? diffX : diffY;\n  touches.diff = diff;\n  diff *= params.touchRatio;\n  if (rtl) diff = -diff;\n  swiper.swipeDirection = diff > 0 ? 'prev' : 'next';\n  data.currentTranslate = diff + data.startTranslate;\n  let disableParentSwiper = true;\n  let resistanceRatio = params.resistanceRatio;\n\n  if (params.touchReleaseOnEdges) {\n    resistanceRatio = 0;\n  }\n\n  if (diff > 0 && data.currentTranslate > swiper.minTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance) data.currentTranslate = swiper.minTranslate() - 1 + (-swiper.minTranslate() + data.startTranslate + diff) ** resistanceRatio;\n  } else if (diff < 0 && data.currentTranslate < swiper.maxTranslate()) {\n    disableParentSwiper = false;\n    if (params.resistance) data.currentTranslate = swiper.maxTranslate() + 1 - (swiper.maxTranslate() - data.startTranslate - diff) ** resistanceRatio;\n  }\n\n  if (disableParentSwiper) {\n    e.preventedByNestedSwiper = true;\n  } // Directions locks\n\n\n  if (!swiper.allowSlideNext && swiper.swipeDirection === 'next' && data.currentTranslate < data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  if (!swiper.allowSlidePrev && swiper.swipeDirection === 'prev' && data.currentTranslate > data.startTranslate) {\n    data.currentTranslate = data.startTranslate;\n  }\n\n  if (!swiper.allowSlidePrev && !swiper.allowSlideNext) {\n    data.currentTranslate = data.startTranslate;\n  } // Threshold\n\n\n  if (params.threshold > 0) {\n    if (Math.abs(diff) > params.threshold || data.allowThresholdMove) {\n      if (!data.allowThresholdMove) {\n        data.allowThresholdMove = true;\n        touches.startX = touches.currentX;\n        touches.startY = touches.currentY;\n        data.currentTranslate = data.startTranslate;\n        touches.diff = swiper.isHorizontal() ? touches.currentX - touches.startX : touches.currentY - touches.startY;\n        return;\n      }\n    } else {\n      data.currentTranslate = data.startTranslate;\n      return;\n    }\n  }\n\n  if (!params.followFinger || params.cssMode) return; // Update active index in free mode\n\n  if (params.freeMode && params.freeMode.enabled && swiper.freeMode || params.watchSlidesProgress) {\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  if (swiper.params.freeMode && params.freeMode.enabled && swiper.freeMode) {\n    swiper.freeMode.onTouchMove();\n  } // Update progress\n\n\n  swiper.updateProgress(data.currentTranslate); // Update translate\n\n  swiper.setTranslate(data.currentTranslate);\n}","import { now, nextTick } from '../../shared/utils.js';\nexport default function onTouchEnd(event) {\n  const swiper = this;\n  const data = swiper.touchEventsData;\n  const {\n    params,\n    touches,\n    rtlTranslate: rtl,\n    slidesGrid,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  let e = event;\n  if (e.originalEvent) e = e.originalEvent;\n\n  if (data.allowTouchCallbacks) {\n    swiper.emit('touchEnd', e);\n  }\n\n  data.allowTouchCallbacks = false;\n\n  if (!data.isTouched) {\n    if (data.isMoved && params.grabCursor) {\n      swiper.setGrabCursor(false);\n    }\n\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  } // Return Grab Cursor\n\n\n  if (params.grabCursor && data.isMoved && data.isTouched && (swiper.allowSlideNext === true || swiper.allowSlidePrev === true)) {\n    swiper.setGrabCursor(false);\n  } // Time diff\n\n\n  const touchEndTime = now();\n  const timeDiff = touchEndTime - data.touchStartTime; // Tap, doubleTap, Click\n\n  if (swiper.allowClick) {\n    swiper.updateClickedSlide(e);\n    swiper.emit('tap click', e);\n\n    if (timeDiff < 300 && touchEndTime - data.lastClickTime < 300) {\n      swiper.emit('doubleTap doubleClick', e);\n    }\n  }\n\n  data.lastClickTime = now();\n  nextTick(() => {\n    if (!swiper.destroyed) swiper.allowClick = true;\n  });\n\n  if (!data.isTouched || !data.isMoved || !swiper.swipeDirection || touches.diff === 0 || data.currentTranslate === data.startTranslate) {\n    data.isTouched = false;\n    data.isMoved = false;\n    data.startMoving = false;\n    return;\n  }\n\n  data.isTouched = false;\n  data.isMoved = false;\n  data.startMoving = false;\n  let currentPos;\n\n  if (params.followFinger) {\n    currentPos = rtl ? swiper.translate : -swiper.translate;\n  } else {\n    currentPos = -data.currentTranslate;\n  }\n\n  if (params.cssMode) {\n    return;\n  }\n\n  if (swiper.params.freeMode && params.freeMode.enabled) {\n    swiper.freeMode.onTouchEnd({\n      currentPos\n    });\n    return;\n  } // Find current slide\n\n\n  let stopIndex = 0;\n  let groupSize = swiper.slidesSizesGrid[0];\n\n  for (let i = 0; i < slidesGrid.length; i += i < params.slidesPerGroupSkip ? 1 : params.slidesPerGroup) {\n    const increment = i < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n    if (typeof slidesGrid[i + increment] !== 'undefined') {\n      if (currentPos >= slidesGrid[i] && currentPos < slidesGrid[i + increment]) {\n        stopIndex = i;\n        groupSize = slidesGrid[i + increment] - slidesGrid[i];\n      }\n    } else if (currentPos >= slidesGrid[i]) {\n      stopIndex = i;\n      groupSize = slidesGrid[slidesGrid.length - 1] - slidesGrid[slidesGrid.length - 2];\n    }\n  } // Find current slide size\n\n\n  const ratio = (currentPos - slidesGrid[stopIndex]) / groupSize;\n  const increment = stopIndex < params.slidesPerGroupSkip - 1 ? 1 : params.slidesPerGroup;\n\n  if (timeDiff > params.longSwipesMs) {\n    // Long touches\n    if (!params.longSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n\n    if (swiper.swipeDirection === 'next') {\n      if (ratio >= params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);\n    }\n\n    if (swiper.swipeDirection === 'prev') {\n      if (ratio > 1 - params.longSwipesRatio) swiper.slideTo(stopIndex + increment);else swiper.slideTo(stopIndex);\n    }\n  } else {\n    // Short swipes\n    if (!params.shortSwipes) {\n      swiper.slideTo(swiper.activeIndex);\n      return;\n    }\n\n    const isNavButtonTarget = swiper.navigation && (e.target === swiper.navigation.nextEl || e.target === swiper.navigation.prevEl);\n\n    if (!isNavButtonTarget) {\n      if (swiper.swipeDirection === 'next') {\n        swiper.slideTo(stopIndex + increment);\n      }\n\n      if (swiper.swipeDirection === 'prev') {\n        swiper.slideTo(stopIndex);\n      }\n    } else if (e.target === swiper.navigation.nextEl) {\n      swiper.slideTo(stopIndex + increment);\n    } else {\n      swiper.slideTo(stopIndex);\n    }\n  }\n}","export default function onResize() {\n  const swiper = this;\n  const {\n    params,\n    el\n  } = swiper;\n  if (el && el.offsetWidth === 0) return; // Breakpoints\n\n  if (params.breakpoints) {\n    swiper.setBreakpoint();\n  } // Save locks\n\n\n  const {\n    allowSlideNext,\n    allowSlidePrev,\n    snapGrid\n  } = swiper; // Disable locks on resize\n\n  swiper.allowSlideNext = true;\n  swiper.allowSlidePrev = true;\n  swiper.updateSize();\n  swiper.updateSlides();\n  swiper.updateSlidesClasses();\n\n  if ((params.slidesPerView === 'auto' || params.slidesPerView > 1) && swiper.isEnd && !swiper.isBeginning && !swiper.params.centeredSlides) {\n    swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n  } else {\n    swiper.slideTo(swiper.activeIndex, 0, false, true);\n  }\n\n  if (swiper.autoplay && swiper.autoplay.running && swiper.autoplay.paused) {\n    swiper.autoplay.run();\n  } // Return locks after resize\n\n\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n\n  if (swiper.params.watchOverflow && snapGrid !== swiper.snapGrid) {\n    swiper.checkOverflow();\n  }\n}","export default function onClick(e) {\n  const swiper = this;\n  if (!swiper.enabled) return;\n\n  if (!swiper.allowClick) {\n    if (swiper.params.preventClicks) e.preventDefault();\n\n    if (swiper.params.preventClicksPropagation && swiper.animating) {\n      e.stopPropagation();\n      e.stopImmediatePropagation();\n    }\n  }\n}","export default function onScroll() {\n  const swiper = this;\n  const {\n    wrapperEl,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return;\n  swiper.previousTranslate = swiper.translate;\n\n  if (swiper.isHorizontal()) {\n    swiper.translate = -wrapperEl.scrollLeft;\n  } else {\n    swiper.translate = -wrapperEl.scrollTop;\n  } // eslint-disable-next-line\n\n\n  if (swiper.translate === -0) swiper.translate = 0;\n  swiper.updateActiveIndex();\n  swiper.updateSlidesClasses();\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (swiper.translate - swiper.minTranslate()) / translatesDiff;\n  }\n\n  if (newProgress !== swiper.progress) {\n    swiper.updateProgress(rtlTranslate ? -swiper.translate : swiper.translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, false);\n}","import { getDocument } from 'ssr-window';\nimport onTouchStart from './onTouchStart.js';\nimport onTouchMove from './onTouchMove.js';\nimport onTouchEnd from './onTouchEnd.js';\nimport onResize from './onResize.js';\nimport onClick from './onClick.js';\nimport onScroll from './onScroll.js';\nlet dummyEventAttached = false;\n\nfunction dummyEventListener() {}\n\nconst events = (swiper, method) => {\n  const document = getDocument();\n  const {\n    params,\n    touchEvents,\n    el,\n    wrapperEl,\n    device,\n    support\n  } = swiper;\n  const capture = !!params.nested;\n  const domMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n  const swiperMethod = method; // Touch Events\n\n  if (!support.touch) {\n    el[domMethod](touchEvents.start, swiper.onTouchStart, false);\n    document[domMethod](touchEvents.move, swiper.onTouchMove, capture);\n    document[domMethod](touchEvents.end, swiper.onTouchEnd, false);\n  } else {\n    const passiveListener = touchEvents.start === 'touchstart' && support.passiveListener && params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    el[domMethod](touchEvents.start, swiper.onTouchStart, passiveListener);\n    el[domMethod](touchEvents.move, swiper.onTouchMove, support.passiveListener ? {\n      passive: false,\n      capture\n    } : capture);\n    el[domMethod](touchEvents.end, swiper.onTouchEnd, passiveListener);\n\n    if (touchEvents.cancel) {\n      el[domMethod](touchEvents.cancel, swiper.onTouchEnd, passiveListener);\n    }\n  } // Prevent Links Clicks\n\n\n  if (params.preventClicks || params.preventClicksPropagation) {\n    el[domMethod]('click', swiper.onClick, true);\n  }\n\n  if (params.cssMode) {\n    wrapperEl[domMethod]('scroll', swiper.onScroll);\n  } // Resize handler\n\n\n  if (params.updateOnWindowResize) {\n    swiper[swiperMethod](device.ios || device.android ? 'resize orientationchange observerUpdate' : 'resize observerUpdate', onResize, true);\n  } else {\n    swiper[swiperMethod]('observerUpdate', onResize, true);\n  }\n};\n\nfunction attachEvents() {\n  const swiper = this;\n  const document = getDocument();\n  const {\n    params,\n    support\n  } = swiper;\n  swiper.onTouchStart = onTouchStart.bind(swiper);\n  swiper.onTouchMove = onTouchMove.bind(swiper);\n  swiper.onTouchEnd = onTouchEnd.bind(swiper);\n\n  if (params.cssMode) {\n    swiper.onScroll = onScroll.bind(swiper);\n  }\n\n  swiper.onClick = onClick.bind(swiper);\n\n  if (support.touch && !dummyEventAttached) {\n    document.addEventListener('touchstart', dummyEventListener);\n    dummyEventAttached = true;\n  }\n\n  events(swiper, 'on');\n}\n\nfunction detachEvents() {\n  const swiper = this;\n  events(swiper, 'off');\n}\n\nexport default {\n  attachEvents,\n  detachEvents\n};","import { extend } from '../../shared/utils.js';\n\nconst isGridEnabled = (swiper, params) => {\n  return swiper.grid && params.grid && params.grid.rows > 1;\n};\n\nexport default function setBreakpoint() {\n  const swiper = this;\n  const {\n    activeIndex,\n    initialized,\n    loopedSlides = 0,\n    params,\n    $el\n  } = swiper;\n  const breakpoints = params.breakpoints;\n  if (!breakpoints || breakpoints && Object.keys(breakpoints).length === 0) return; // Get breakpoint for window width and update parameters\n\n  const breakpoint = swiper.getBreakpoint(breakpoints, swiper.params.breakpointsBase, swiper.el);\n  if (!breakpoint || swiper.currentBreakpoint === breakpoint) return;\n  const breakpointOnlyParams = breakpoint in breakpoints ? breakpoints[breakpoint] : undefined;\n  const breakpointParams = breakpointOnlyParams || swiper.originalParams;\n  const wasMultiRow = isGridEnabled(swiper, params);\n  const isMultiRow = isGridEnabled(swiper, breakpointParams);\n  const wasEnabled = params.enabled;\n\n  if (wasMultiRow && !isMultiRow) {\n    $el.removeClass(`${params.containerModifierClass}grid ${params.containerModifierClass}grid-column`);\n    swiper.emitContainerClasses();\n  } else if (!wasMultiRow && isMultiRow) {\n    $el.addClass(`${params.containerModifierClass}grid`);\n\n    if (breakpointParams.grid.fill && breakpointParams.grid.fill === 'column' || !breakpointParams.grid.fill && params.grid.fill === 'column') {\n      $el.addClass(`${params.containerModifierClass}grid-column`);\n    }\n\n    swiper.emitContainerClasses();\n  }\n\n  const directionChanged = breakpointParams.direction && breakpointParams.direction !== params.direction;\n  const needsReLoop = params.loop && (breakpointParams.slidesPerView !== params.slidesPerView || directionChanged);\n\n  if (directionChanged && initialized) {\n    swiper.changeDirection();\n  }\n\n  extend(swiper.params, breakpointParams);\n  const isEnabled = swiper.params.enabled;\n  Object.assign(swiper, {\n    allowTouchMove: swiper.params.allowTouchMove,\n    allowSlideNext: swiper.params.allowSlideNext,\n    allowSlidePrev: swiper.params.allowSlidePrev\n  });\n\n  if (wasEnabled && !isEnabled) {\n    swiper.disable();\n  } else if (!wasEnabled && isEnabled) {\n    swiper.enable();\n  }\n\n  swiper.currentBreakpoint = breakpoint;\n  swiper.emit('_beforeBreakpoint', breakpointParams);\n\n  if (needsReLoop && initialized) {\n    swiper.loopDestroy();\n    swiper.loopCreate();\n    swiper.updateSlides();\n    swiper.slideTo(activeIndex - loopedSlides + swiper.loopedSlides, 0, false);\n  }\n\n  swiper.emit('breakpoint', breakpointParams);\n}","export default {\n  init: true,\n  direction: 'horizontal',\n  touchEventsTarget: 'wrapper',\n  initialSlide: 0,\n  speed: 300,\n  cssMode: false,\n  updateOnWindowResize: true,\n  resizeObserver: true,\n  nested: false,\n  createElements: false,\n  enabled: true,\n  focusableElements: 'input, select, option, textarea, button, video, label',\n  // Overrides\n  width: null,\n  height: null,\n  //\n  preventInteractionOnTransition: false,\n  // ssr\n  userAgent: null,\n  url: null,\n  // To support iOS's swipe-to-go-back gesture (when being used in-app).\n  edgeSwipeDetection: false,\n  edgeSwipeThreshold: 20,\n  // Autoheight\n  autoHeight: false,\n  // Set wrapper width\n  setWrapperSize: false,\n  // Virtual Translate\n  virtualTranslate: false,\n  // Effects\n  effect: 'slide',\n  // 'slide' or 'fade' or 'cube' or 'coverflow' or 'flip'\n  // Breakpoints\n  breakpoints: undefined,\n  breakpointsBase: 'window',\n  // Slides grid\n  spaceBetween: 0,\n  slidesPerView: 1,\n  slidesPerGroup: 1,\n  slidesPerGroupSkip: 0,\n  slidesPerGroupAuto: false,\n  centeredSlides: false,\n  centeredSlidesBounds: false,\n  slidesOffsetBefore: 0,\n  // in px\n  slidesOffsetAfter: 0,\n  // in px\n  normalizeSlideIndex: true,\n  centerInsufficientSlides: false,\n  // Disable swiper and hide navigation when container not overflow\n  watchOverflow: true,\n  // Round length\n  roundLengths: false,\n  // Touches\n  touchRatio: 1,\n  touchAngle: 45,\n  simulateTouch: true,\n  shortSwipes: true,\n  longSwipes: true,\n  longSwipesRatio: 0.5,\n  longSwipesMs: 300,\n  followFinger: true,\n  allowTouchMove: true,\n  threshold: 0,\n  touchMoveStopPropagation: false,\n  touchStartPreventDefault: true,\n  touchStartForcePreventDefault: false,\n  touchReleaseOnEdges: false,\n  // Unique Navigation Elements\n  uniqueNavElements: true,\n  // Resistance\n  resistance: true,\n  resistanceRatio: 0.85,\n  // Progress\n  watchSlidesProgress: false,\n  // Cursor\n  grabCursor: false,\n  // Clicks\n  preventClicks: true,\n  preventClicksPropagation: true,\n  slideToClickedSlide: false,\n  // Images\n  preloadImages: true,\n  updateOnImagesReady: true,\n  // loop\n  loop: false,\n  loopAdditionalSlides: 0,\n  loopedSlides: null,\n  loopFillGroupWithBlank: false,\n  loopPreventsSlide: true,\n  // Swiping/no swiping\n  allowSlidePrev: true,\n  allowSlideNext: true,\n  swipeHandler: null,\n  // '.swipe-handler',\n  noSwiping: true,\n  noSwipingClass: 'swiper-no-swiping',\n  noSwipingSelector: null,\n  // Passive Listeners\n  passiveListeners: true,\n  // NS\n  containerModifierClass: 'swiper-',\n  // NEW\n  slideClass: 'swiper-slide',\n  slideBlankClass: 'swiper-slide-invisible-blank',\n  slideActiveClass: 'swiper-slide-active',\n  slideDuplicateActiveClass: 'swiper-slide-duplicate-active',\n  slideVisibleClass: 'swiper-slide-visible',\n  slideDuplicateClass: 'swiper-slide-duplicate',\n  slideNextClass: 'swiper-slide-next',\n  slideDuplicateNextClass: 'swiper-slide-duplicate-next',\n  slidePrevClass: 'swiper-slide-prev',\n  slideDuplicatePrevClass: 'swiper-slide-duplicate-prev',\n  wrapperClass: 'swiper-wrapper',\n  // Callbacks\n  runCallbacksOnInit: true,\n  // Internals\n  _emitClasses: false\n};","import { extend } from '../shared/utils.js';\nexport default function moduleExtendParams(params, allModulesParams) {\n  return function extendParams(obj = {}) {\n    const moduleParamName = Object.keys(obj)[0];\n    const moduleParams = obj[moduleParamName];\n\n    if (typeof moduleParams !== 'object' || moduleParams === null) {\n      extend(allModulesParams, obj);\n      return;\n    }\n\n    if (['navigation', 'pagination', 'scrollbar'].indexOf(moduleParamName) >= 0 && params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        auto: true\n      };\n    }\n\n    if (!(moduleParamName in params && 'enabled' in moduleParams)) {\n      extend(allModulesParams, obj);\n      return;\n    }\n\n    if (params[moduleParamName] === true) {\n      params[moduleParamName] = {\n        enabled: true\n      };\n    }\n\n    if (typeof params[moduleParamName] === 'object' && !('enabled' in params[moduleParamName])) {\n      params[moduleParamName].enabled = true;\n    }\n\n    if (!params[moduleParamName]) params[moduleParamName] = {\n      enabled: false\n    };\n    extend(allModulesParams, obj);\n  };\n}","/* eslint no-param-reassign: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport $ from '../shared/dom.js';\nimport { extend, now, deleteProps } from '../shared/utils.js';\nimport { getSupport } from '../shared/get-support.js';\nimport { getDevice } from '../shared/get-device.js';\nimport { getBrowser } from '../shared/get-browser.js';\nimport Resize from './modules/resize/resize.js';\nimport Observer from './modules/observer/observer.js';\nimport eventsEmitter from './events-emitter.js';\nimport update from './update/index.js';\nimport translate from './translate/index.js';\nimport transition from './transition/index.js';\nimport slide from './slide/index.js';\nimport loop from './loop/index.js';\nimport grabCursor from './grab-cursor/index.js';\nimport events from './events/index.js';\nimport breakpoints from './breakpoints/index.js';\nimport classes from './classes/index.js';\nimport images from './images/index.js';\nimport checkOverflow from './check-overflow/index.js';\nimport defaults from './defaults.js';\nimport moduleExtendParams from './moduleExtendParams.js';\nconst prototypes = {\n  eventsEmitter,\n  update,\n  translate,\n  transition,\n  slide,\n  loop,\n  grabCursor,\n  events,\n  breakpoints,\n  checkOverflow,\n  classes,\n  images\n};\nconst extendedDefaults = {};\n\nclass Swiper {\n  constructor(...args) {\n    let el;\n    let params;\n\n    if (args.length === 1 && args[0].constructor && Object.prototype.toString.call(args[0]).slice(8, -1) === 'Object') {\n      params = args[0];\n    } else {\n      [el, params] = args;\n    }\n\n    if (!params) params = {};\n    params = extend({}, params);\n    if (el && !params.el) params.el = el;\n\n    if (params.el && $(params.el).length > 1) {\n      const swipers = [];\n      $(params.el).each(containerEl => {\n        const newParams = extend({}, params, {\n          el: containerEl\n        });\n        swipers.push(new Swiper(newParams));\n      });\n      return swipers;\n    } // Swiper Instance\n\n\n    const swiper = this;\n    swiper.__swiper__ = true;\n    swiper.support = getSupport();\n    swiper.device = getDevice({\n      userAgent: params.userAgent\n    });\n    swiper.browser = getBrowser();\n    swiper.eventsListeners = {};\n    swiper.eventsAnyListeners = [];\n    swiper.modules = [...swiper.__modules__];\n\n    if (params.modules && Array.isArray(params.modules)) {\n      swiper.modules.push(...params.modules);\n    }\n\n    const allModulesParams = {};\n    swiper.modules.forEach(mod => {\n      mod({\n        swiper,\n        extendParams: moduleExtendParams(params, allModulesParams),\n        on: swiper.on.bind(swiper),\n        once: swiper.once.bind(swiper),\n        off: swiper.off.bind(swiper),\n        emit: swiper.emit.bind(swiper)\n      });\n    }); // Extend defaults with modules params\n\n    const swiperParams = extend({}, defaults, allModulesParams); // Extend defaults with passed params\n\n    swiper.params = extend({}, swiperParams, extendedDefaults, params);\n    swiper.originalParams = extend({}, swiper.params);\n    swiper.passedParams = extend({}, params); // add event listeners\n\n    if (swiper.params && swiper.params.on) {\n      Object.keys(swiper.params.on).forEach(eventName => {\n        swiper.on(eventName, swiper.params.on[eventName]);\n      });\n    }\n\n    if (swiper.params && swiper.params.onAny) {\n      swiper.onAny(swiper.params.onAny);\n    } // Save Dom lib\n\n\n    swiper.$ = $; // Extend Swiper\n\n    Object.assign(swiper, {\n      enabled: swiper.params.enabled,\n      el,\n      // Classes\n      classNames: [],\n      // Slides\n      slides: $(),\n      slidesGrid: [],\n      snapGrid: [],\n      slidesSizesGrid: [],\n\n      // isDirection\n      isHorizontal() {\n        return swiper.params.direction === 'horizontal';\n      },\n\n      isVertical() {\n        return swiper.params.direction === 'vertical';\n      },\n\n      // Indexes\n      activeIndex: 0,\n      realIndex: 0,\n      //\n      isBeginning: true,\n      isEnd: false,\n      // Props\n      translate: 0,\n      previousTranslate: 0,\n      progress: 0,\n      velocity: 0,\n      animating: false,\n      // Locks\n      allowSlideNext: swiper.params.allowSlideNext,\n      allowSlidePrev: swiper.params.allowSlidePrev,\n      // Touch Events\n      touchEvents: function touchEvents() {\n        const touch = ['touchstart', 'touchmove', 'touchend', 'touchcancel'];\n        const desktop = ['pointerdown', 'pointermove', 'pointerup'];\n        swiper.touchEventsTouch = {\n          start: touch[0],\n          move: touch[1],\n          end: touch[2],\n          cancel: touch[3]\n        };\n        swiper.touchEventsDesktop = {\n          start: desktop[0],\n          move: desktop[1],\n          end: desktop[2]\n        };\n        return swiper.support.touch || !swiper.params.simulateTouch ? swiper.touchEventsTouch : swiper.touchEventsDesktop;\n      }(),\n      touchEventsData: {\n        isTouched: undefined,\n        isMoved: undefined,\n        allowTouchCallbacks: undefined,\n        touchStartTime: undefined,\n        isScrolling: undefined,\n        currentTranslate: undefined,\n        startTranslate: undefined,\n        allowThresholdMove: undefined,\n        // Form elements to match\n        focusableElements: swiper.params.focusableElements,\n        // Last click time\n        lastClickTime: now(),\n        clickTimeout: undefined,\n        // Velocities\n        velocities: [],\n        allowMomentumBounce: undefined,\n        isTouchEvent: undefined,\n        startMoving: undefined\n      },\n      // Clicks\n      allowClick: true,\n      // Touches\n      allowTouchMove: swiper.params.allowTouchMove,\n      touches: {\n        startX: 0,\n        startY: 0,\n        currentX: 0,\n        currentY: 0,\n        diff: 0\n      },\n      // Images\n      imagesToLoad: [],\n      imagesLoaded: 0\n    });\n    swiper.emit('_swiper'); // Init\n\n    if (swiper.params.init) {\n      swiper.init();\n    } // Return app instance\n\n\n    return swiper;\n  }\n\n  enable() {\n    const swiper = this;\n    if (swiper.enabled) return;\n    swiper.enabled = true;\n\n    if (swiper.params.grabCursor) {\n      swiper.setGrabCursor();\n    }\n\n    swiper.emit('enable');\n  }\n\n  disable() {\n    const swiper = this;\n    if (!swiper.enabled) return;\n    swiper.enabled = false;\n\n    if (swiper.params.grabCursor) {\n      swiper.unsetGrabCursor();\n    }\n\n    swiper.emit('disable');\n  }\n\n  setProgress(progress, speed) {\n    const swiper = this;\n    progress = Math.min(Math.max(progress, 0), 1);\n    const min = swiper.minTranslate();\n    const max = swiper.maxTranslate();\n    const current = (max - min) * progress + min;\n    swiper.translateTo(current, typeof speed === 'undefined' ? 0 : speed);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  emitContainerClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const cls = swiper.el.className.split(' ').filter(className => {\n      return className.indexOf('swiper') === 0 || className.indexOf(swiper.params.containerModifierClass) === 0;\n    });\n    swiper.emit('_containerClasses', cls.join(' '));\n  }\n\n  getSlideClasses(slideEl) {\n    const swiper = this;\n    return slideEl.className.split(' ').filter(className => {\n      return className.indexOf('swiper-slide') === 0 || className.indexOf(swiper.params.slideClass) === 0;\n    }).join(' ');\n  }\n\n  emitSlidesClasses() {\n    const swiper = this;\n    if (!swiper.params._emitClasses || !swiper.el) return;\n    const updates = [];\n    swiper.slides.each(slideEl => {\n      const classNames = swiper.getSlideClasses(slideEl);\n      updates.push({\n        slideEl,\n        classNames\n      });\n      swiper.emit('_slideClass', slideEl, classNames);\n    });\n    swiper.emit('_slideClasses', updates);\n  }\n\n  slidesPerViewDynamic(view = 'current', exact = false) {\n    const swiper = this;\n    const {\n      params,\n      slides,\n      slidesGrid,\n      slidesSizesGrid,\n      size: swiperSize,\n      activeIndex\n    } = swiper;\n    let spv = 1;\n\n    if (params.centeredSlides) {\n      let slideSize = slides[activeIndex].swiperSlideSize;\n      let breakLoop;\n\n      for (let i = activeIndex + 1; i < slides.length; i += 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n\n      for (let i = activeIndex - 1; i >= 0; i -= 1) {\n        if (slides[i] && !breakLoop) {\n          slideSize += slides[i].swiperSlideSize;\n          spv += 1;\n          if (slideSize > swiperSize) breakLoop = true;\n        }\n      }\n    } else {\n      // eslint-disable-next-line\n      if (view === 'current') {\n        for (let i = activeIndex + 1; i < slides.length; i += 1) {\n          const slideInView = exact ? slidesGrid[i] + slidesSizesGrid[i] - slidesGrid[activeIndex] < swiperSize : slidesGrid[i] - slidesGrid[activeIndex] < swiperSize;\n\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      } else {\n        // previous\n        for (let i = activeIndex - 1; i >= 0; i -= 1) {\n          const slideInView = slidesGrid[activeIndex] - slidesGrid[i] < swiperSize;\n\n          if (slideInView) {\n            spv += 1;\n          }\n        }\n      }\n    }\n\n    return spv;\n  }\n\n  update() {\n    const swiper = this;\n    if (!swiper || swiper.destroyed) return;\n    const {\n      snapGrid,\n      params\n    } = swiper; // Breakpoints\n\n    if (params.breakpoints) {\n      swiper.setBreakpoint();\n    }\n\n    swiper.updateSize();\n    swiper.updateSlides();\n    swiper.updateProgress();\n    swiper.updateSlidesClasses();\n\n    function setTranslate() {\n      const translateValue = swiper.rtlTranslate ? swiper.translate * -1 : swiper.translate;\n      const newTranslate = Math.min(Math.max(translateValue, swiper.maxTranslate()), swiper.minTranslate());\n      swiper.setTranslate(newTranslate);\n      swiper.updateActiveIndex();\n      swiper.updateSlidesClasses();\n    }\n\n    let translated;\n\n    if (swiper.params.freeMode && swiper.params.freeMode.enabled) {\n      setTranslate();\n\n      if (swiper.params.autoHeight) {\n        swiper.updateAutoHeight();\n      }\n    } else {\n      if ((swiper.params.slidesPerView === 'auto' || swiper.params.slidesPerView > 1) && swiper.isEnd && !swiper.params.centeredSlides) {\n        translated = swiper.slideTo(swiper.slides.length - 1, 0, false, true);\n      } else {\n        translated = swiper.slideTo(swiper.activeIndex, 0, false, true);\n      }\n\n      if (!translated) {\n        setTranslate();\n      }\n    }\n\n    if (params.watchOverflow && snapGrid !== swiper.snapGrid) {\n      swiper.checkOverflow();\n    }\n\n    swiper.emit('update');\n  }\n\n  changeDirection(newDirection, needUpdate = true) {\n    const swiper = this;\n    const currentDirection = swiper.params.direction;\n\n    if (!newDirection) {\n      // eslint-disable-next-line\n      newDirection = currentDirection === 'horizontal' ? 'vertical' : 'horizontal';\n    }\n\n    if (newDirection === currentDirection || newDirection !== 'horizontal' && newDirection !== 'vertical') {\n      return swiper;\n    }\n\n    swiper.$el.removeClass(`${swiper.params.containerModifierClass}${currentDirection}`).addClass(`${swiper.params.containerModifierClass}${newDirection}`);\n    swiper.emitContainerClasses();\n    swiper.params.direction = newDirection;\n    swiper.slides.each(slideEl => {\n      if (newDirection === 'vertical') {\n        slideEl.style.width = '';\n      } else {\n        slideEl.style.height = '';\n      }\n    });\n    swiper.emit('changeDirection');\n    if (needUpdate) swiper.update();\n    return swiper;\n  }\n\n  mount(el) {\n    const swiper = this;\n    if (swiper.mounted) return true; // Find el\n\n    const $el = $(el || swiper.params.el);\n    el = $el[0];\n\n    if (!el) {\n      return false;\n    }\n\n    el.swiper = swiper;\n\n    const getWrapperSelector = () => {\n      return `.${(swiper.params.wrapperClass || '').trim().split(' ').join('.')}`;\n    };\n\n    const getWrapper = () => {\n      if (el && el.shadowRoot && el.shadowRoot.querySelector) {\n        const res = $(el.shadowRoot.querySelector(getWrapperSelector())); // Children needs to return slot items\n\n        res.children = options => $el.children(options);\n\n        return res;\n      }\n\n      return $el.children(getWrapperSelector());\n    }; // Find Wrapper\n\n\n    let $wrapperEl = getWrapper();\n\n    if ($wrapperEl.length === 0 && swiper.params.createElements) {\n      const document = getDocument();\n      const wrapper = document.createElement('div');\n      $wrapperEl = $(wrapper);\n      wrapper.className = swiper.params.wrapperClass;\n      $el.append(wrapper);\n      $el.children(`.${swiper.params.slideClass}`).each(slideEl => {\n        $wrapperEl.append(slideEl);\n      });\n    }\n\n    Object.assign(swiper, {\n      $el,\n      el,\n      $wrapperEl,\n      wrapperEl: $wrapperEl[0],\n      mounted: true,\n      // RTL\n      rtl: el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl',\n      rtlTranslate: swiper.params.direction === 'horizontal' && (el.dir.toLowerCase() === 'rtl' || $el.css('direction') === 'rtl'),\n      wrongRTL: $wrapperEl.css('display') === '-webkit-box'\n    });\n    return true;\n  }\n\n  init(el) {\n    const swiper = this;\n    if (swiper.initialized) return swiper;\n    const mounted = swiper.mount(el);\n    if (mounted === false) return swiper;\n    swiper.emit('beforeInit'); // Set breakpoint\n\n    if (swiper.params.breakpoints) {\n      swiper.setBreakpoint();\n    } // Add Classes\n\n\n    swiper.addClasses(); // Create loop\n\n    if (swiper.params.loop) {\n      swiper.loopCreate();\n    } // Update size\n\n\n    swiper.updateSize(); // Update slides\n\n    swiper.updateSlides();\n\n    if (swiper.params.watchOverflow) {\n      swiper.checkOverflow();\n    } // Set Grab Cursor\n\n\n    if (swiper.params.grabCursor && swiper.enabled) {\n      swiper.setGrabCursor();\n    }\n\n    if (swiper.params.preloadImages) {\n      swiper.preloadImages();\n    } // Slide To Initial Slide\n\n\n    if (swiper.params.loop) {\n      swiper.slideTo(swiper.params.initialSlide + swiper.loopedSlides, 0, swiper.params.runCallbacksOnInit, false, true);\n    } else {\n      swiper.slideTo(swiper.params.initialSlide, 0, swiper.params.runCallbacksOnInit, false, true);\n    } // Attach events\n\n\n    swiper.attachEvents(); // Init Flag\n\n    swiper.initialized = true; // Emit\n\n    swiper.emit('init');\n    swiper.emit('afterInit');\n    return swiper;\n  }\n\n  destroy(deleteInstance = true, cleanStyles = true) {\n    const swiper = this;\n    const {\n      params,\n      $el,\n      $wrapperEl,\n      slides\n    } = swiper;\n\n    if (typeof swiper.params === 'undefined' || swiper.destroyed) {\n      return null;\n    }\n\n    swiper.emit('beforeDestroy'); // Init Flag\n\n    swiper.initialized = false; // Detach events\n\n    swiper.detachEvents(); // Destroy loop\n\n    if (params.loop) {\n      swiper.loopDestroy();\n    } // Cleanup styles\n\n\n    if (cleanStyles) {\n      swiper.removeClasses();\n      $el.removeAttr('style');\n      $wrapperEl.removeAttr('style');\n\n      if (slides && slides.length) {\n        slides.removeClass([params.slideVisibleClass, params.slideActiveClass, params.slideNextClass, params.slidePrevClass].join(' ')).removeAttr('style').removeAttr('data-swiper-slide-index');\n      }\n    }\n\n    swiper.emit('destroy'); // Detach emitter events\n\n    Object.keys(swiper.eventsListeners).forEach(eventName => {\n      swiper.off(eventName);\n    });\n\n    if (deleteInstance !== false) {\n      swiper.$el[0].swiper = null;\n      deleteProps(swiper);\n    }\n\n    swiper.destroyed = true;\n    return null;\n  }\n\n  static extendDefaults(newDefaults) {\n    extend(extendedDefaults, newDefaults);\n  }\n\n  static get extendedDefaults() {\n    return extendedDefaults;\n  }\n\n  static get defaults() {\n    return defaults;\n  }\n\n  static installModule(mod) {\n    if (!Swiper.prototype.__modules__) Swiper.prototype.__modules__ = [];\n    const modules = Swiper.prototype.__modules__;\n\n    if (typeof mod === 'function' && modules.indexOf(mod) < 0) {\n      modules.push(mod);\n    }\n  }\n\n  static use(module) {\n    if (Array.isArray(module)) {\n      module.forEach(m => Swiper.installModule(m));\n      return Swiper;\n    }\n\n    Swiper.installModule(module);\n    return Swiper;\n  }\n\n}\n\nObject.keys(prototypes).forEach(prototypeGroup => {\n  Object.keys(prototypes[prototypeGroup]).forEach(protoMethod => {\n    Swiper.prototype[protoMethod] = prototypes[prototypeGroup][protoMethod];\n  });\n});\nSwiper.use([Resize, Observer]);\nexport default Swiper;","import updateSize from './updateSize.js';\nimport updateSlides from './updateSlides.js';\nimport updateAutoHeight from './updateAutoHeight.js';\nimport updateSlidesOffset from './updateSlidesOffset.js';\nimport updateSlidesProgress from './updateSlidesProgress.js';\nimport updateProgress from './updateProgress.js';\nimport updateSlidesClasses from './updateSlidesClasses.js';\nimport updateActiveIndex from './updateActiveIndex.js';\nimport updateClickedSlide from './updateClickedSlide.js';\nexport default {\n  updateSize,\n  updateSlides,\n  updateAutoHeight,\n  updateSlidesOffset,\n  updateSlidesProgress,\n  updateProgress,\n  updateSlidesClasses,\n  updateActiveIndex,\n  updateClickedSlide\n};","export default function updateSize() {\n  const swiper = this;\n  let width;\n  let height;\n  const $el = swiper.$el;\n\n  if (typeof swiper.params.width !== 'undefined' && swiper.params.width !== null) {\n    width = swiper.params.width;\n  } else {\n    width = $el[0].clientWidth;\n  }\n\n  if (typeof swiper.params.height !== 'undefined' && swiper.params.height !== null) {\n    height = swiper.params.height;\n  } else {\n    height = $el[0].clientHeight;\n  }\n\n  if (width === 0 && swiper.isHorizontal() || height === 0 && swiper.isVertical()) {\n    return;\n  } // Subtract paddings\n\n\n  width = width - parseInt($el.css('padding-left') || 0, 10) - parseInt($el.css('padding-right') || 0, 10);\n  height = height - parseInt($el.css('padding-top') || 0, 10) - parseInt($el.css('padding-bottom') || 0, 10);\n  if (Number.isNaN(width)) width = 0;\n  if (Number.isNaN(height)) height = 0;\n  Object.assign(swiper, {\n    width,\n    height,\n    size: swiper.isHorizontal() ? width : height\n  });\n}","import { setCSSProperty } from '../../shared/utils.js';\nexport default function updateSlides() {\n  const swiper = this;\n\n  function getDirectionLabel(property) {\n    if (swiper.isHorizontal()) {\n      return property;\n    } // prettier-ignore\n\n\n    return {\n      'width': 'height',\n      'margin-top': 'margin-left',\n      'margin-bottom ': 'margin-right',\n      'margin-left': 'margin-top',\n      'margin-right': 'margin-bottom',\n      'padding-left': 'padding-top',\n      'padding-right': 'padding-bottom',\n      'marginRight': 'marginBottom'\n    }[property];\n  }\n\n  function getDirectionPropertyValue(node, label) {\n    return parseFloat(node.getPropertyValue(getDirectionLabel(label)) || 0);\n  }\n\n  const params = swiper.params;\n  const {\n    $wrapperEl,\n    size: swiperSize,\n    rtlTranslate: rtl,\n    wrongRTL\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  const previousSlidesLength = isVirtual ? swiper.virtual.slides.length : swiper.slides.length;\n  const slides = $wrapperEl.children(`.${swiper.params.slideClass}`);\n  const slidesLength = isVirtual ? swiper.virtual.slides.length : slides.length;\n  let snapGrid = [];\n  const slidesGrid = [];\n  const slidesSizesGrid = [];\n  let offsetBefore = params.slidesOffsetBefore;\n\n  if (typeof offsetBefore === 'function') {\n    offsetBefore = params.slidesOffsetBefore.call(swiper);\n  }\n\n  let offsetAfter = params.slidesOffsetAfter;\n\n  if (typeof offsetAfter === 'function') {\n    offsetAfter = params.slidesOffsetAfter.call(swiper);\n  }\n\n  const previousSnapGridLength = swiper.snapGrid.length;\n  const previousSlidesGridLength = swiper.slidesGrid.length;\n  let spaceBetween = params.spaceBetween;\n  let slidePosition = -offsetBefore;\n  let prevSlideSize = 0;\n  let index = 0;\n\n  if (typeof swiperSize === 'undefined') {\n    return;\n  }\n\n  if (typeof spaceBetween === 'string' && spaceBetween.indexOf('%') >= 0) {\n    spaceBetween = parseFloat(spaceBetween.replace('%', '')) / 100 * swiperSize;\n  }\n\n  swiper.virtualSize = -spaceBetween; // reset margins\n\n  if (rtl) slides.css({\n    marginLeft: '',\n    marginBottom: '',\n    marginTop: ''\n  });else slides.css({\n    marginRight: '',\n    marginBottom: '',\n    marginTop: ''\n  }); // reset cssMode offsets\n\n  if (params.centeredSlides && params.cssMode) {\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', '');\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', '');\n  }\n\n  const gridEnabled = params.grid && params.grid.rows > 1 && swiper.grid;\n\n  if (gridEnabled) {\n    swiper.grid.initSlides(slidesLength);\n  } // Calc slides\n\n\n  let slideSize;\n  const shouldResetSlideSize = params.slidesPerView === 'auto' && params.breakpoints && Object.keys(params.breakpoints).filter(key => {\n    return typeof params.breakpoints[key].slidesPerView !== 'undefined';\n  }).length > 0;\n\n  for (let i = 0; i < slidesLength; i += 1) {\n    slideSize = 0;\n    const slide = slides.eq(i);\n\n    if (gridEnabled) {\n      swiper.grid.updateSlide(i, slide, slidesLength, getDirectionLabel);\n    }\n\n    if (slide.css('display') === 'none') continue; // eslint-disable-line\n\n    if (params.slidesPerView === 'auto') {\n      if (shouldResetSlideSize) {\n        slides[i].style[getDirectionLabel('width')] = ``;\n      }\n\n      const slideStyles = getComputedStyle(slide[0]);\n      const currentTransform = slide[0].style.transform;\n      const currentWebKitTransform = slide[0].style.webkitTransform;\n\n      if (currentTransform) {\n        slide[0].style.transform = 'none';\n      }\n\n      if (currentWebKitTransform) {\n        slide[0].style.webkitTransform = 'none';\n      }\n\n      if (params.roundLengths) {\n        slideSize = swiper.isHorizontal() ? slide.outerWidth(true) : slide.outerHeight(true);\n      } else {\n        // eslint-disable-next-line\n        const width = getDirectionPropertyValue(slideStyles, 'width');\n        const paddingLeft = getDirectionPropertyValue(slideStyles, 'padding-left');\n        const paddingRight = getDirectionPropertyValue(slideStyles, 'padding-right');\n        const marginLeft = getDirectionPropertyValue(slideStyles, 'margin-left');\n        const marginRight = getDirectionPropertyValue(slideStyles, 'margin-right');\n        const boxSizing = slideStyles.getPropertyValue('box-sizing');\n\n        if (boxSizing && boxSizing === 'border-box') {\n          slideSize = width + marginLeft + marginRight;\n        } else {\n          const {\n            clientWidth,\n            offsetWidth\n          } = slide[0];\n          slideSize = width + paddingLeft + paddingRight + marginLeft + marginRight + (offsetWidth - clientWidth);\n        }\n      }\n\n      if (currentTransform) {\n        slide[0].style.transform = currentTransform;\n      }\n\n      if (currentWebKitTransform) {\n        slide[0].style.webkitTransform = currentWebKitTransform;\n      }\n\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n    } else {\n      slideSize = (swiperSize - (params.slidesPerView - 1) * spaceBetween) / params.slidesPerView;\n      if (params.roundLengths) slideSize = Math.floor(slideSize);\n\n      if (slides[i]) {\n        slides[i].style[getDirectionLabel('width')] = `${slideSize}px`;\n      }\n    }\n\n    if (slides[i]) {\n      slides[i].swiperSlideSize = slideSize;\n    }\n\n    slidesSizesGrid.push(slideSize);\n\n    if (params.centeredSlides) {\n      slidePosition = slidePosition + slideSize / 2 + prevSlideSize / 2 + spaceBetween;\n      if (prevSlideSize === 0 && i !== 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (i === 0) slidePosition = slidePosition - swiperSize / 2 - spaceBetween;\n      if (Math.abs(slidePosition) < 1 / 1000) slidePosition = 0;\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if (index % params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n    } else {\n      if (params.roundLengths) slidePosition = Math.floor(slidePosition);\n      if ((index - Math.min(swiper.params.slidesPerGroupSkip, index)) % swiper.params.slidesPerGroup === 0) snapGrid.push(slidePosition);\n      slidesGrid.push(slidePosition);\n      slidePosition = slidePosition + slideSize + spaceBetween;\n    }\n\n    swiper.virtualSize += slideSize + spaceBetween;\n    prevSlideSize = slideSize;\n    index += 1;\n  }\n\n  swiper.virtualSize = Math.max(swiper.virtualSize, swiperSize) + offsetAfter;\n\n  if (rtl && wrongRTL && (params.effect === 'slide' || params.effect === 'coverflow')) {\n    $wrapperEl.css({\n      width: `${swiper.virtualSize + params.spaceBetween}px`\n    });\n  }\n\n  if (params.setWrapperSize) {\n    $wrapperEl.css({\n      [getDirectionLabel('width')]: `${swiper.virtualSize + params.spaceBetween}px`\n    });\n  }\n\n  if (gridEnabled) {\n    swiper.grid.updateWrapperSize(slideSize, snapGrid, getDirectionLabel);\n  } // Remove last grid elements depending on width\n\n\n  if (!params.centeredSlides) {\n    const newSlidesGrid = [];\n\n    for (let i = 0; i < snapGrid.length; i += 1) {\n      let slidesGridItem = snapGrid[i];\n      if (params.roundLengths) slidesGridItem = Math.floor(slidesGridItem);\n\n      if (snapGrid[i] <= swiper.virtualSize - swiperSize) {\n        newSlidesGrid.push(slidesGridItem);\n      }\n    }\n\n    snapGrid = newSlidesGrid;\n\n    if (Math.floor(swiper.virtualSize - swiperSize) - Math.floor(snapGrid[snapGrid.length - 1]) > 1) {\n      snapGrid.push(swiper.virtualSize - swiperSize);\n    }\n  }\n\n  if (snapGrid.length === 0) snapGrid = [0];\n\n  if (params.spaceBetween !== 0) {\n    const key = swiper.isHorizontal() && rtl ? 'marginLeft' : getDirectionLabel('marginRight');\n    slides.filter((_, slideIndex) => {\n      if (!params.cssMode) return true;\n\n      if (slideIndex === slides.length - 1) {\n        return false;\n      }\n\n      return true;\n    }).css({\n      [key]: `${spaceBetween}px`\n    });\n  }\n\n  if (params.centeredSlides && params.centeredSlidesBounds) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.spaceBetween;\n    const maxSnap = allSlidesSize - swiperSize;\n    snapGrid = snapGrid.map(snap => {\n      if (snap < 0) return -offsetBefore;\n      if (snap > maxSnap) return maxSnap + offsetAfter;\n      return snap;\n    });\n  }\n\n  if (params.centerInsufficientSlides) {\n    let allSlidesSize = 0;\n    slidesSizesGrid.forEach(slideSizeValue => {\n      allSlidesSize += slideSizeValue + (params.spaceBetween ? params.spaceBetween : 0);\n    });\n    allSlidesSize -= params.spaceBetween;\n\n    if (allSlidesSize < swiperSize) {\n      const allSlidesOffset = (swiperSize - allSlidesSize) / 2;\n      snapGrid.forEach((snap, snapIndex) => {\n        snapGrid[snapIndex] = snap - allSlidesOffset;\n      });\n      slidesGrid.forEach((snap, snapIndex) => {\n        slidesGrid[snapIndex] = snap + allSlidesOffset;\n      });\n    }\n  }\n\n  Object.assign(swiper, {\n    slides,\n    snapGrid,\n    slidesGrid,\n    slidesSizesGrid\n  });\n\n  if (params.centeredSlides && params.cssMode && !params.centeredSlidesBounds) {\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-before', `${-snapGrid[0]}px`);\n    setCSSProperty(swiper.wrapperEl, '--swiper-centered-offset-after', `${swiper.size / 2 - slidesSizesGrid[slidesSizesGrid.length - 1] / 2}px`);\n    const addToSnapGrid = -swiper.snapGrid[0];\n    const addToSlidesGrid = -swiper.slidesGrid[0];\n    swiper.snapGrid = swiper.snapGrid.map(v => v + addToSnapGrid);\n    swiper.slidesGrid = swiper.slidesGrid.map(v => v + addToSlidesGrid);\n  }\n\n  if (slidesLength !== previousSlidesLength) {\n    swiper.emit('slidesLengthChange');\n  }\n\n  if (snapGrid.length !== previousSnapGridLength) {\n    if (swiper.params.watchOverflow) swiper.checkOverflow();\n    swiper.emit('snapGridLengthChange');\n  }\n\n  if (slidesGrid.length !== previousSlidesGridLength) {\n    swiper.emit('slidesGridLengthChange');\n  }\n\n  if (params.watchSlidesProgress) {\n    swiper.updateSlidesOffset();\n  }\n}","export default function updateAutoHeight(speed) {\n  const swiper = this;\n  const activeSlides = [];\n  const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n  let newHeight = 0;\n  let i;\n\n  if (typeof speed === 'number') {\n    swiper.setTransition(speed);\n  } else if (speed === true) {\n    swiper.setTransition(swiper.params.speed);\n  }\n\n  const getSlideByIndex = index => {\n    if (isVirtual) {\n      return swiper.slides.filter(el => parseInt(el.getAttribute('data-swiper-slide-index'), 10) === index)[0];\n    }\n\n    return swiper.slides.eq(index)[0];\n  }; // Find slides currently in view\n\n\n  if (swiper.params.slidesPerView !== 'auto' && swiper.params.slidesPerView > 1) {\n    if (swiper.params.centeredSlides) {\n      swiper.visibleSlides.each(slide => {\n        activeSlides.push(slide);\n      });\n    } else {\n      for (i = 0; i < Math.ceil(swiper.params.slidesPerView); i += 1) {\n        const index = swiper.activeIndex + i;\n        if (index > swiper.slides.length && !isVirtual) break;\n        activeSlides.push(getSlideByIndex(index));\n      }\n    }\n  } else {\n    activeSlides.push(getSlideByIndex(swiper.activeIndex));\n  } // Find new height from highest slide in view\n\n\n  for (i = 0; i < activeSlides.length; i += 1) {\n    if (typeof activeSlides[i] !== 'undefined') {\n      const height = activeSlides[i].offsetHeight;\n      newHeight = height > newHeight ? height : newHeight;\n    }\n  } // Update Height\n\n\n  if (newHeight) swiper.$wrapperEl.css('height', `${newHeight}px`);\n}","export default function updateSlidesOffset() {\n  const swiper = this;\n  const slides = swiper.slides;\n\n  for (let i = 0; i < slides.length; i += 1) {\n    slides[i].swiperSlideOffset = swiper.isHorizontal() ? slides[i].offsetLeft : slides[i].offsetTop;\n  }\n}","import $ from '../../shared/dom.js';\nexport default function updateSlidesProgress(translate = this && this.translate || 0) {\n  const swiper = this;\n  const params = swiper.params;\n  const {\n    slides,\n    rtlTranslate: rtl,\n    snapGrid\n  } = swiper;\n  if (slides.length === 0) return;\n  if (typeof slides[0].swiperSlideOffset === 'undefined') swiper.updateSlidesOffset();\n  let offsetCenter = -translate;\n  if (rtl) offsetCenter = translate; // Visible Slides\n\n  slides.removeClass(params.slideVisibleClass);\n  swiper.visibleSlidesIndexes = [];\n  swiper.visibleSlides = [];\n\n  for (let i = 0; i < slides.length; i += 1) {\n    const slide = slides[i];\n    let slideOffset = slide.swiperSlideOffset;\n\n    if (params.cssMode && params.centeredSlides) {\n      slideOffset -= slides[0].swiperSlideOffset;\n    }\n\n    const slideProgress = (offsetCenter + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween);\n    const originalSlideProgress = (offsetCenter - snapGrid[0] + (params.centeredSlides ? swiper.minTranslate() : 0) - slideOffset) / (slide.swiperSlideSize + params.spaceBetween);\n    const slideBefore = -(offsetCenter - slideOffset);\n    const slideAfter = slideBefore + swiper.slidesSizesGrid[i];\n    const isVisible = slideBefore >= 0 && slideBefore < swiper.size - 1 || slideAfter > 1 && slideAfter <= swiper.size || slideBefore <= 0 && slideAfter >= swiper.size;\n\n    if (isVisible) {\n      swiper.visibleSlides.push(slide);\n      swiper.visibleSlidesIndexes.push(i);\n      slides.eq(i).addClass(params.slideVisibleClass);\n    }\n\n    slide.progress = rtl ? -slideProgress : slideProgress;\n    slide.originalProgress = rtl ? -originalSlideProgress : originalSlideProgress;\n  }\n\n  swiper.visibleSlides = $(swiper.visibleSlides);\n}","export default function updateProgress(translate) {\n  const swiper = this;\n\n  if (typeof translate === 'undefined') {\n    const multiplier = swiper.rtlTranslate ? -1 : 1; // eslint-disable-next-line\n\n    translate = swiper && swiper.translate && swiper.translate * multiplier || 0;\n  }\n\n  const params = swiper.params;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n  let {\n    progress,\n    isBeginning,\n    isEnd\n  } = swiper;\n  const wasBeginning = isBeginning;\n  const wasEnd = isEnd;\n\n  if (translatesDiff === 0) {\n    progress = 0;\n    isBeginning = true;\n    isEnd = true;\n  } else {\n    progress = (translate - swiper.minTranslate()) / translatesDiff;\n    isBeginning = progress <= 0;\n    isEnd = progress >= 1;\n  }\n\n  Object.assign(swiper, {\n    progress,\n    isBeginning,\n    isEnd\n  });\n  if (params.watchSlidesProgress || params.centeredSlides && params.autoHeight) swiper.updateSlidesProgress(translate);\n\n  if (isBeginning && !wasBeginning) {\n    swiper.emit('reachBeginning toEdge');\n  }\n\n  if (isEnd && !wasEnd) {\n    swiper.emit('reachEnd toEdge');\n  }\n\n  if (wasBeginning && !isBeginning || wasEnd && !isEnd) {\n    swiper.emit('fromEdge');\n  }\n\n  swiper.emit('progress', progress);\n}","export default function updateSlidesClasses() {\n  const swiper = this;\n  const {\n    slides,\n    params,\n    $wrapperEl,\n    activeIndex,\n    realIndex\n  } = swiper;\n  const isVirtual = swiper.virtual && params.virtual.enabled;\n  slides.removeClass(`${params.slideActiveClass} ${params.slideNextClass} ${params.slidePrevClass} ${params.slideDuplicateActiveClass} ${params.slideDuplicateNextClass} ${params.slideDuplicatePrevClass}`);\n  let activeSlide;\n\n  if (isVirtual) {\n    activeSlide = swiper.$wrapperEl.find(`.${params.slideClass}[data-swiper-slide-index=\"${activeIndex}\"]`);\n  } else {\n    activeSlide = slides.eq(activeIndex);\n  } // Active classes\n\n\n  activeSlide.addClass(params.slideActiveClass);\n\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (activeSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${realIndex}\"]`).addClass(params.slideDuplicateActiveClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${realIndex}\"]`).addClass(params.slideDuplicateActiveClass);\n    }\n  } // Next Slide\n\n\n  let nextSlide = activeSlide.nextAll(`.${params.slideClass}`).eq(0).addClass(params.slideNextClass);\n\n  if (params.loop && nextSlide.length === 0) {\n    nextSlide = slides.eq(0);\n    nextSlide.addClass(params.slideNextClass);\n  } // Prev Slide\n\n\n  let prevSlide = activeSlide.prevAll(`.${params.slideClass}`).eq(0).addClass(params.slidePrevClass);\n\n  if (params.loop && prevSlide.length === 0) {\n    prevSlide = slides.eq(-1);\n    prevSlide.addClass(params.slidePrevClass);\n  }\n\n  if (params.loop) {\n    // Duplicate to all looped slides\n    if (nextSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicateNextClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${nextSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicateNextClass);\n    }\n\n    if (prevSlide.hasClass(params.slideDuplicateClass)) {\n      $wrapperEl.children(`.${params.slideClass}:not(.${params.slideDuplicateClass})[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicatePrevClass);\n    } else {\n      $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass}[data-swiper-slide-index=\"${prevSlide.attr('data-swiper-slide-index')}\"]`).addClass(params.slideDuplicatePrevClass);\n    }\n  }\n\n  swiper.emitSlidesClasses();\n}","export default function updateActiveIndex(newActiveIndex) {\n  const swiper = this;\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n  const {\n    slidesGrid,\n    snapGrid,\n    params,\n    activeIndex: previousIndex,\n    realIndex: previousRealIndex,\n    snapIndex: previousSnapIndex\n  } = swiper;\n  let activeIndex = newActiveIndex;\n  let snapIndex;\n\n  if (typeof activeIndex === 'undefined') {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1] - (slidesGrid[i + 1] - slidesGrid[i]) / 2) {\n          activeIndex = i;\n        } else if (translate >= slidesGrid[i] && translate < slidesGrid[i + 1]) {\n          activeIndex = i + 1;\n        }\n      } else if (translate >= slidesGrid[i]) {\n        activeIndex = i;\n      }\n    } // Normalize slideIndex\n\n\n    if (params.normalizeSlideIndex) {\n      if (activeIndex < 0 || typeof activeIndex === 'undefined') activeIndex = 0;\n    }\n  }\n\n  if (snapGrid.indexOf(translate) >= 0) {\n    snapIndex = snapGrid.indexOf(translate);\n  } else {\n    const skip = Math.min(params.slidesPerGroupSkip, activeIndex);\n    snapIndex = skip + Math.floor((activeIndex - skip) / params.slidesPerGroup);\n  }\n\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n  if (activeIndex === previousIndex) {\n    if (snapIndex !== previousSnapIndex) {\n      swiper.snapIndex = snapIndex;\n      swiper.emit('snapIndexChange');\n    }\n\n    return;\n  } // Get real index\n\n\n  const realIndex = parseInt(swiper.slides.eq(activeIndex).attr('data-swiper-slide-index') || activeIndex, 10);\n  Object.assign(swiper, {\n    snapIndex,\n    realIndex,\n    previousIndex,\n    activeIndex\n  });\n  swiper.emit('activeIndexChange');\n  swiper.emit('snapIndexChange');\n\n  if (previousRealIndex !== realIndex) {\n    swiper.emit('realIndexChange');\n  }\n\n  if (swiper.initialized || swiper.params.runCallbacksOnInit) {\n    swiper.emit('slideChange');\n  }\n}","import $ from '../../shared/dom.js';\nexport default function updateClickedSlide(e) {\n  const swiper = this;\n  const params = swiper.params;\n  const slide = $(e.target).closest(`.${params.slideClass}`)[0];\n  let slideFound = false;\n  let slideIndex;\n\n  if (slide) {\n    for (let i = 0; i < swiper.slides.length; i += 1) {\n      if (swiper.slides[i] === slide) {\n        slideFound = true;\n        slideIndex = i;\n        break;\n      }\n    }\n  }\n\n  if (slide && slideFound) {\n    swiper.clickedSlide = slide;\n\n    if (swiper.virtual && swiper.params.virtual.enabled) {\n      swiper.clickedIndex = parseInt($(slide).attr('data-swiper-slide-index'), 10);\n    } else {\n      swiper.clickedIndex = slideIndex;\n    }\n  } else {\n    swiper.clickedSlide = undefined;\n    swiper.clickedIndex = undefined;\n    return;\n  }\n\n  if (params.slideToClickedSlide && swiper.clickedIndex !== undefined && swiper.clickedIndex !== swiper.activeIndex) {\n    swiper.slideToClickedSlide();\n  }\n}","import getTranslate from './getTranslate.js';\nimport setTranslate from './setTranslate.js';\nimport minTranslate from './minTranslate.js';\nimport maxTranslate from './maxTranslate.js';\nimport translateTo from './translateTo.js';\nexport default {\n  getTranslate,\n  setTranslate,\n  minTranslate,\n  maxTranslate,\n  translateTo\n};","import { getTranslate } from '../../shared/utils.js';\nexport default function getSwiperTranslate(axis = this.isHorizontal() ? 'x' : 'y') {\n  const swiper = this;\n  const {\n    params,\n    rtlTranslate: rtl,\n    translate,\n    $wrapperEl\n  } = swiper;\n\n  if (params.virtualTranslate) {\n    return rtl ? -translate : translate;\n  }\n\n  if (params.cssMode) {\n    return translate;\n  }\n\n  let currentTranslate = getTranslate($wrapperEl[0], axis);\n  if (rtl) currentTranslate = -currentTranslate;\n  return currentTranslate || 0;\n}","export default function setTranslate(translate, byController) {\n  const swiper = this;\n  const {\n    rtlTranslate: rtl,\n    params,\n    $wrapperEl,\n    wrapperEl,\n    progress\n  } = swiper;\n  let x = 0;\n  let y = 0;\n  const z = 0;\n\n  if (swiper.isHorizontal()) {\n    x = rtl ? -translate : translate;\n  } else {\n    y = translate;\n  }\n\n  if (params.roundLengths) {\n    x = Math.floor(x);\n    y = Math.floor(y);\n  }\n\n  if (params.cssMode) {\n    wrapperEl[swiper.isHorizontal() ? 'scrollLeft' : 'scrollTop'] = swiper.isHorizontal() ? -x : -y;\n  } else if (!params.virtualTranslate) {\n    $wrapperEl.transform(`translate3d(${x}px, ${y}px, ${z}px)`);\n  }\n\n  swiper.previousTranslate = swiper.translate;\n  swiper.translate = swiper.isHorizontal() ? x : y; // Check if we need to update progress\n\n  let newProgress;\n  const translatesDiff = swiper.maxTranslate() - swiper.minTranslate();\n\n  if (translatesDiff === 0) {\n    newProgress = 0;\n  } else {\n    newProgress = (translate - swiper.minTranslate()) / translatesDiff;\n  }\n\n  if (newProgress !== progress) {\n    swiper.updateProgress(translate);\n  }\n\n  swiper.emit('setTranslate', swiper.translate, byController);\n}","export default function minTranslate() {\n  return -this.snapGrid[0];\n}","export default function maxTranslate() {\n  return -this.snapGrid[this.snapGrid.length - 1];\n}","import { animateCSSModeScroll } from '../../shared/utils.js';\nexport default function translateTo(translate = 0, speed = this.params.speed, runCallbacks = true, translateBounds = true, internal) {\n  const swiper = this;\n  const {\n    params,\n    wrapperEl\n  } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition) {\n    return false;\n  }\n\n  const minTranslate = swiper.minTranslate();\n  const maxTranslate = swiper.maxTranslate();\n  let newTranslate;\n  if (translateBounds && translate > minTranslate) newTranslate = minTranslate;else if (translateBounds && translate < maxTranslate) newTranslate = maxTranslate;else newTranslate = translate; // Update progress\n\n  swiper.updateProgress(newTranslate);\n\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n\n    if (speed === 0) {\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = -newTranslate;\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: -newTranslate,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: -newTranslate,\n        behavior: 'smooth'\n      });\n    }\n\n    return true;\n  }\n\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(newTranslate);\n\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionEnd');\n    }\n  } else {\n    swiper.setTransition(speed);\n    swiper.setTranslate(newTranslate);\n\n    if (runCallbacks) {\n      swiper.emit('beforeTransitionStart', speed, internal);\n      swiper.emit('transitionStart');\n    }\n\n    if (!swiper.animating) {\n      swiper.animating = true;\n\n      if (!swiper.onTranslateToWrapperTransitionEnd) {\n        swiper.onTranslateToWrapperTransitionEnd = function transitionEnd(e) {\n          if (!swiper || swiper.destroyed) return;\n          if (e.target !== this) return;\n          swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);\n          swiper.onTranslateToWrapperTransitionEnd = null;\n          delete swiper.onTranslateToWrapperTransitionEnd;\n\n          if (runCallbacks) {\n            swiper.emit('transitionEnd');\n          }\n        };\n      }\n\n      swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onTranslateToWrapperTransitionEnd);\n      swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onTranslateToWrapperTransitionEnd);\n    }\n  }\n\n  return true;\n}","import setTransition from './setTransition.js';\nimport transitionStart from './transitionStart.js';\nimport transitionEnd from './transitionEnd.js';\nexport default {\n  setTransition,\n  transitionStart,\n  transitionEnd\n};","export default function setTransition(duration, byController) {\n  const swiper = this;\n\n  if (!swiper.params.cssMode) {\n    swiper.$wrapperEl.transition(duration);\n  }\n\n  swiper.emit('setTransition', duration, byController);\n}","import transitionEmit from './transitionEmit.js';\nexport default function transitionStart(runCallbacks = true, direction) {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  if (params.cssMode) return;\n\n  if (params.autoHeight) {\n    swiper.updateAutoHeight();\n  }\n\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'Start'\n  });\n}","import transitionEmit from './transitionEmit.js';\nexport default function transitionEnd(runCallbacks = true, direction) {\n  const swiper = this;\n  const {\n    params\n  } = swiper;\n  swiper.animating = false;\n  if (params.cssMode) return;\n  swiper.setTransition(0);\n  transitionEmit({\n    swiper,\n    runCallbacks,\n    direction,\n    step: 'End'\n  });\n}","import slideTo from './slideTo.js';\nimport slideToLoop from './slideToLoop.js';\nimport slideNext from './slideNext.js';\nimport slidePrev from './slidePrev.js';\nimport slideReset from './slideReset.js';\nimport slideToClosest from './slideToClosest.js';\nimport slideToClickedSlide from './slideToClickedSlide.js';\nexport default {\n  slideTo,\n  slideToLoop,\n  slideNext,\n  slidePrev,\n  slideReset,\n  slideToClosest,\n  slideToClickedSlide\n};","import { animateCSSModeScroll } from '../../shared/utils.js';\nexport default function slideTo(index = 0, speed = this.params.speed, runCallbacks = true, internal, initial) {\n  if (typeof index !== 'number' && typeof index !== 'string') {\n    throw new Error(`The 'index' argument cannot have type other than 'number' or 'string'. [${typeof index}] given.`);\n  }\n\n  if (typeof index === 'string') {\n    /**\n     * The `index` argument converted from `string` to `number`.\n     * @type {number}\n     */\n    const indexAsNumber = parseInt(index, 10);\n    /**\n     * Determines whether the `index` argument is a valid `number`\n     * after being converted from the `string` type.\n     * @type {boolean}\n     */\n\n    const isValidNumber = isFinite(indexAsNumber);\n\n    if (!isValidNumber) {\n      throw new Error(`The passed-in 'index' (string) couldn't be converted to 'number'. [${index}] given.`);\n    } // Knowing that the converted `index` is a valid number,\n    // we can update the original argument's value.\n\n\n    index = indexAsNumber;\n  }\n\n  const swiper = this;\n  let slideIndex = index;\n  if (slideIndex < 0) slideIndex = 0;\n  const {\n    params,\n    snapGrid,\n    slidesGrid,\n    previousIndex,\n    activeIndex,\n    rtlTranslate: rtl,\n    wrapperEl,\n    enabled\n  } = swiper;\n\n  if (swiper.animating && params.preventInteractionOnTransition || !enabled && !internal && !initial) {\n    return false;\n  }\n\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, slideIndex);\n  let snapIndex = skip + Math.floor((slideIndex - skip) / swiper.params.slidesPerGroup);\n  if (snapIndex >= snapGrid.length) snapIndex = snapGrid.length - 1;\n\n  if ((activeIndex || params.initialSlide || 0) === (previousIndex || 0) && runCallbacks) {\n    swiper.emit('beforeSlideChangeStart');\n  }\n\n  const translate = -snapGrid[snapIndex]; // Update progress\n\n  swiper.updateProgress(translate); // Normalize slideIndex\n\n  if (params.normalizeSlideIndex) {\n    for (let i = 0; i < slidesGrid.length; i += 1) {\n      const normalizedTranslate = -Math.floor(translate * 100);\n      const normalizedGrid = Math.floor(slidesGrid[i] * 100);\n      const normalizedGridNext = Math.floor(slidesGrid[i + 1] * 100);\n\n      if (typeof slidesGrid[i + 1] !== 'undefined') {\n        if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext - (normalizedGridNext - normalizedGrid) / 2) {\n          slideIndex = i;\n        } else if (normalizedTranslate >= normalizedGrid && normalizedTranslate < normalizedGridNext) {\n          slideIndex = i + 1;\n        }\n      } else if (normalizedTranslate >= normalizedGrid) {\n        slideIndex = i;\n      }\n    }\n  } // Directions locks\n\n\n  if (swiper.initialized && slideIndex !== activeIndex) {\n    if (!swiper.allowSlideNext && translate < swiper.translate && translate < swiper.minTranslate()) {\n      return false;\n    }\n\n    if (!swiper.allowSlidePrev && translate > swiper.translate && translate > swiper.maxTranslate()) {\n      if ((activeIndex || 0) !== slideIndex) return false;\n    }\n  }\n\n  let direction;\n  if (slideIndex > activeIndex) direction = 'next';else if (slideIndex < activeIndex) direction = 'prev';else direction = 'reset'; // Update Index\n\n  if (rtl && -translate === swiper.translate || !rtl && translate === swiper.translate) {\n    swiper.updateActiveIndex(slideIndex); // Update Height\n\n    if (params.autoHeight) {\n      swiper.updateAutoHeight();\n    }\n\n    swiper.updateSlidesClasses();\n\n    if (params.effect !== 'slide') {\n      swiper.setTranslate(translate);\n    }\n\n    if (direction !== 'reset') {\n      swiper.transitionStart(runCallbacks, direction);\n      swiper.transitionEnd(runCallbacks, direction);\n    }\n\n    return false;\n  }\n\n  if (params.cssMode) {\n    const isH = swiper.isHorizontal();\n    const t = rtl ? translate : -translate;\n\n    if (speed === 0) {\n      const isVirtual = swiper.virtual && swiper.params.virtual.enabled;\n\n      if (isVirtual) {\n        swiper.wrapperEl.style.scrollSnapType = 'none';\n        swiper._immediateVirtual = true;\n      }\n\n      wrapperEl[isH ? 'scrollLeft' : 'scrollTop'] = t;\n\n      if (isVirtual) {\n        requestAnimationFrame(() => {\n          swiper.wrapperEl.style.scrollSnapType = '';\n          swiper._swiperImmediateVirtual = false;\n        });\n      }\n    } else {\n      if (!swiper.support.smoothScroll) {\n        animateCSSModeScroll({\n          swiper,\n          targetPosition: t,\n          side: isH ? 'left' : 'top'\n        });\n        return true;\n      }\n\n      wrapperEl.scrollTo({\n        [isH ? 'left' : 'top']: t,\n        behavior: 'smooth'\n      });\n    }\n\n    return true;\n  }\n\n  if (speed === 0) {\n    swiper.setTransition(0);\n    swiper.setTranslate(translate);\n    swiper.updateActiveIndex(slideIndex);\n    swiper.updateSlidesClasses();\n    swiper.emit('beforeTransitionStart', speed, internal);\n    swiper.transitionStart(runCallbacks, direction);\n    swiper.transitionEnd(runCallbacks, direction);\n  } else {\n    swiper.setTransition(speed);\n    swiper.setTranslate(translate);\n    swiper.updateActiveIndex(slideIndex);\n    swiper.updateSlidesClasses();\n    swiper.emit('beforeTransitionStart', speed, internal);\n    swiper.transitionStart(runCallbacks, direction);\n\n    if (!swiper.animating) {\n      swiper.animating = true;\n\n      if (!swiper.onSlideToWrapperTransitionEnd) {\n        swiper.onSlideToWrapperTransitionEnd = function transitionEnd(e) {\n          if (!swiper || swiper.destroyed) return;\n          if (e.target !== this) return;\n          swiper.$wrapperEl[0].removeEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n          swiper.$wrapperEl[0].removeEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n          swiper.onSlideToWrapperTransitionEnd = null;\n          delete swiper.onSlideToWrapperTransitionEnd;\n          swiper.transitionEnd(runCallbacks, direction);\n        };\n      }\n\n      swiper.$wrapperEl[0].addEventListener('transitionend', swiper.onSlideToWrapperTransitionEnd);\n      swiper.$wrapperEl[0].addEventListener('webkitTransitionEnd', swiper.onSlideToWrapperTransitionEnd);\n    }\n  }\n\n  return true;\n}","export default function slideToLoop(index = 0, speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  let newIndex = index;\n\n  if (swiper.params.loop) {\n    newIndex += swiper.loopedSlides;\n  }\n\n  return swiper.slideTo(newIndex, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slideNext(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const {\n    animating,\n    enabled,\n    params\n  } = swiper;\n  if (!enabled) return swiper;\n  let perGroup = params.slidesPerGroup;\n\n  if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n    perGroup = Math.max(swiper.slidesPerViewDynamic('current', true), 1);\n  }\n\n  const increment = swiper.activeIndex < params.slidesPerGroupSkip ? 1 : perGroup;\n\n  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix(); // eslint-disable-next-line\n\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n\n  return swiper.slideTo(swiper.activeIndex + increment, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slidePrev(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  const {\n    params,\n    animating,\n    snapGrid,\n    slidesGrid,\n    rtlTranslate,\n    enabled\n  } = swiper;\n  if (!enabled) return swiper;\n\n  if (params.loop) {\n    if (animating && params.loopPreventsSlide) return false;\n    swiper.loopFix(); // eslint-disable-next-line\n\n    swiper._clientLeft = swiper.$wrapperEl[0].clientLeft;\n  }\n\n  const translate = rtlTranslate ? swiper.translate : -swiper.translate;\n\n  function normalize(val) {\n    if (val < 0) return -Math.floor(Math.abs(val));\n    return Math.floor(val);\n  }\n\n  const normalizedTranslate = normalize(translate);\n  const normalizedSnapGrid = snapGrid.map(val => normalize(val));\n  let prevSnap = snapGrid[normalizedSnapGrid.indexOf(normalizedTranslate) - 1];\n\n  if (typeof prevSnap === 'undefined' && params.cssMode) {\n    let prevSnapIndex;\n    snapGrid.forEach((snap, snapIndex) => {\n      if (normalizedTranslate >= snap) {\n        // prevSnap = snap;\n        prevSnapIndex = snapIndex;\n      }\n    });\n\n    if (typeof prevSnapIndex !== 'undefined') {\n      prevSnap = snapGrid[prevSnapIndex > 0 ? prevSnapIndex - 1 : prevSnapIndex];\n    }\n  }\n\n  let prevIndex = 0;\n\n  if (typeof prevSnap !== 'undefined') {\n    prevIndex = slidesGrid.indexOf(prevSnap);\n    if (prevIndex < 0) prevIndex = swiper.activeIndex - 1;\n\n    if (params.slidesPerView === 'auto' && params.slidesPerGroup === 1 && params.slidesPerGroupAuto) {\n      prevIndex = prevIndex - swiper.slidesPerViewDynamic('previous', true) + 1;\n      prevIndex = Math.max(prevIndex, 0);\n    }\n  }\n\n  return swiper.slideTo(prevIndex, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slideReset(speed = this.params.speed, runCallbacks = true, internal) {\n  const swiper = this;\n  return swiper.slideTo(swiper.activeIndex, speed, runCallbacks, internal);\n}","/* eslint no-unused-vars: \"off\" */\nexport default function slideToClosest(speed = this.params.speed, runCallbacks = true, internal, threshold = 0.5) {\n  const swiper = this;\n  let index = swiper.activeIndex;\n  const skip = Math.min(swiper.params.slidesPerGroupSkip, index);\n  const snapIndex = skip + Math.floor((index - skip) / swiper.params.slidesPerGroup);\n  const translate = swiper.rtlTranslate ? swiper.translate : -swiper.translate;\n\n  if (translate >= swiper.snapGrid[snapIndex]) {\n    // The current translate is on or after the current snap index, so the choice\n    // is between the current index and the one after it.\n    const currentSnap = swiper.snapGrid[snapIndex];\n    const nextSnap = swiper.snapGrid[snapIndex + 1];\n\n    if (translate - currentSnap > (nextSnap - currentSnap) * threshold) {\n      index += swiper.params.slidesPerGroup;\n    }\n  } else {\n    // The current translate is before the current snap index, so the choice\n    // is between the current index and the one before it.\n    const prevSnap = swiper.snapGrid[snapIndex - 1];\n    const currentSnap = swiper.snapGrid[snapIndex];\n\n    if (translate - prevSnap <= (currentSnap - prevSnap) * threshold) {\n      index -= swiper.params.slidesPerGroup;\n    }\n  }\n\n  index = Math.max(index, 0);\n  index = Math.min(index, swiper.slidesGrid.length - 1);\n  return swiper.slideTo(index, speed, runCallbacks, internal);\n}","import $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nexport default function slideToClickedSlide() {\n  const swiper = this;\n  const {\n    params,\n    $wrapperEl\n  } = swiper;\n  const slidesPerView = params.slidesPerView === 'auto' ? swiper.slidesPerViewDynamic() : params.slidesPerView;\n  let slideToIndex = swiper.clickedIndex;\n  let realIndex;\n\n  if (params.loop) {\n    if (swiper.animating) return;\n    realIndex = parseInt($(swiper.clickedSlide).attr('data-swiper-slide-index'), 10);\n\n    if (params.centeredSlides) {\n      if (slideToIndex < swiper.loopedSlides - slidesPerView / 2 || slideToIndex > swiper.slides.length - swiper.loopedSlides + slidesPerView / 2) {\n        swiper.loopFix();\n        slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`).eq(0).index();\n        nextTick(() => {\n          swiper.slideTo(slideToIndex);\n        });\n      } else {\n        swiper.slideTo(slideToIndex);\n      }\n    } else if (slideToIndex > swiper.slides.length - slidesPerView) {\n      swiper.loopFix();\n      slideToIndex = $wrapperEl.children(`.${params.slideClass}[data-swiper-slide-index=\"${realIndex}\"]:not(.${params.slideDuplicateClass})`).eq(0).index();\n      nextTick(() => {\n        swiper.slideTo(slideToIndex);\n      });\n    } else {\n      swiper.slideTo(slideToIndex);\n    }\n  } else {\n    swiper.slideTo(slideToIndex);\n  }\n}","import loopCreate from './loopCreate.js';\nimport loopFix from './loopFix.js';\nimport loopDestroy from './loopDestroy.js';\nexport default {\n  loopCreate,\n  loopFix,\n  loopDestroy\n};","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nexport default function loopCreate() {\n  const swiper = this;\n  const document = getDocument();\n  const {\n    params,\n    $wrapperEl\n  } = swiper; // Remove duplicated slides\n\n  const $selector = $($wrapperEl.children()[0].parentNode);\n  $selector.children(`.${params.slideClass}.${params.slideDuplicateClass}`).remove();\n  let slides = $selector.children(`.${params.slideClass}`);\n\n  if (params.loopFillGroupWithBlank) {\n    const blankSlidesNum = params.slidesPerGroup - slides.length % params.slidesPerGroup;\n\n    if (blankSlidesNum !== params.slidesPerGroup) {\n      for (let i = 0; i < blankSlidesNum; i += 1) {\n        const blankNode = $(document.createElement('div')).addClass(`${params.slideClass} ${params.slideBlankClass}`);\n        $selector.append(blankNode);\n      }\n\n      slides = $selector.children(`.${params.slideClass}`);\n    }\n  }\n\n  if (params.slidesPerView === 'auto' && !params.loopedSlides) params.loopedSlides = slides.length;\n  swiper.loopedSlides = Math.ceil(parseFloat(params.loopedSlides || params.slidesPerView, 10));\n  swiper.loopedSlides += params.loopAdditionalSlides;\n\n  if (swiper.loopedSlides > slides.length) {\n    swiper.loopedSlides = slides.length;\n  }\n\n  const prependSlides = [];\n  const appendSlides = [];\n  slides.each((el, index) => {\n    const slide = $(el);\n\n    if (index < swiper.loopedSlides) {\n      appendSlides.push(el);\n    }\n\n    if (index < slides.length && index >= slides.length - swiper.loopedSlides) {\n      prependSlides.push(el);\n    }\n\n    slide.attr('data-swiper-slide-index', index);\n  });\n\n  for (let i = 0; i < appendSlides.length; i += 1) {\n    $selector.append($(appendSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n\n  for (let i = prependSlides.length - 1; i >= 0; i -= 1) {\n    $selector.prepend($(prependSlides[i].cloneNode(true)).addClass(params.slideDuplicateClass));\n  }\n}","export default function loopFix() {\n  const swiper = this;\n  swiper.emit('beforeLoopFix');\n  const {\n    activeIndex,\n    slides,\n    loopedSlides,\n    allowSlidePrev,\n    allowSlideNext,\n    snapGrid,\n    rtlTranslate: rtl\n  } = swiper;\n  let newIndex;\n  swiper.allowSlidePrev = true;\n  swiper.allowSlideNext = true;\n  const snapTranslate = -snapGrid[activeIndex];\n  const diff = snapTranslate - swiper.getTranslate(); // Fix For Negative Oversliding\n\n  if (activeIndex < loopedSlides) {\n    newIndex = slides.length - loopedSlides * 3 + activeIndex;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  } else if (activeIndex >= slides.length - loopedSlides) {\n    // Fix For Positive Oversliding\n    newIndex = -slides.length + activeIndex + loopedSlides;\n    newIndex += loopedSlides;\n    const slideChanged = swiper.slideTo(newIndex, 0, false, true);\n\n    if (slideChanged && diff !== 0) {\n      swiper.setTranslate((rtl ? -swiper.translate : swiper.translate) - diff);\n    }\n  }\n\n  swiper.allowSlidePrev = allowSlidePrev;\n  swiper.allowSlideNext = allowSlideNext;\n  swiper.emit('loopFix');\n}","export default function loopDestroy() {\n  const swiper = this;\n  const {\n    $wrapperEl,\n    params,\n    slides\n  } = swiper;\n  $wrapperEl.children(`.${params.slideClass}.${params.slideDuplicateClass},.${params.slideClass}.${params.slideBlankClass}`).remove();\n  slides.removeAttr('data-swiper-slide-index');\n}","import setGrabCursor from './setGrabCursor.js';\nimport unsetGrabCursor from './unsetGrabCursor.js';\nexport default {\n  setGrabCursor,\n  unsetGrabCursor\n};","export default function setGrabCursor(moving) {\n  const swiper = this;\n  if (swiper.support.touch || !swiper.params.simulateTouch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) return;\n  const el = swiper.params.touchEventsTarget === 'container' ? swiper.el : swiper.wrapperEl;\n  el.style.cursor = 'move';\n  el.style.cursor = moving ? '-webkit-grabbing' : '-webkit-grab';\n  el.style.cursor = moving ? '-moz-grabbin' : '-moz-grab';\n  el.style.cursor = moving ? 'grabbing' : 'grab';\n}","export default function unsetGrabCursor() {\n  const swiper = this;\n\n  if (swiper.support.touch || swiper.params.watchOverflow && swiper.isLocked || swiper.params.cssMode) {\n    return;\n  }\n\n  swiper[swiper.params.touchEventsTarget === 'container' ? 'el' : 'wrapperEl'].style.cursor = '';\n}","import setBreakpoint from './setBreakpoint.js';\nimport getBreakpoint from './getBreakpoint.js';\nexport default {\n  setBreakpoint,\n  getBreakpoint\n};","import { getWindow } from 'ssr-window';\nexport default function getBreakpoint(breakpoints, base = 'window', containerEl) {\n  if (!breakpoints || base === 'container' && !containerEl) return undefined;\n  let breakpoint = false;\n  const window = getWindow();\n  const currentHeight = base === 'window' ? window.innerHeight : containerEl.clientHeight;\n  const points = Object.keys(breakpoints).map(point => {\n    if (typeof point === 'string' && point.indexOf('@') === 0) {\n      const minRatio = parseFloat(point.substr(1));\n      const value = currentHeight * minRatio;\n      return {\n        value,\n        point\n      };\n    }\n\n    return {\n      value: point,\n      point\n    };\n  });\n  points.sort((a, b) => parseInt(a.value, 10) - parseInt(b.value, 10));\n\n  for (let i = 0; i < points.length; i += 1) {\n    const {\n      point,\n      value\n    } = points[i];\n\n    if (base === 'window') {\n      if (window.matchMedia(`(min-width: ${value}px)`).matches) {\n        breakpoint = point;\n      }\n    } else if (value <= containerEl.clientWidth) {\n      breakpoint = point;\n    }\n  }\n\n  return breakpoint || 'max';\n}","function checkOverflow() {\n  const swiper = this;\n  const {\n    isLocked: wasLocked,\n    params\n  } = swiper;\n  const {\n    slidesOffsetBefore\n  } = params;\n\n  if (slidesOffsetBefore) {\n    const lastSlideIndex = swiper.slides.length - 1;\n    const lastSlideRightEdge = swiper.slidesGrid[lastSlideIndex] + swiper.slidesSizesGrid[lastSlideIndex] + slidesOffsetBefore * 2;\n    swiper.isLocked = swiper.size > lastSlideRightEdge;\n  } else {\n    swiper.isLocked = swiper.snapGrid.length === 1;\n  }\n\n  if (params.allowSlideNext === true) {\n    swiper.allowSlideNext = !swiper.isLocked;\n  }\n\n  if (params.allowSlidePrev === true) {\n    swiper.allowSlidePrev = !swiper.isLocked;\n  }\n\n  if (wasLocked && wasLocked !== swiper.isLocked) {\n    swiper.isEnd = false;\n  }\n\n  if (wasLocked !== swiper.isLocked) {\n    swiper.emit(swiper.isLocked ? 'lock' : 'unlock');\n  }\n}\n\nexport default {\n  checkOverflow\n};","import addClasses from './addClasses.js';\nimport removeClasses from './removeClasses.js';\nexport default {\n  addClasses,\n  removeClasses\n};","function prepareClasses(entries, prefix) {\n  const resultClasses = [];\n  entries.forEach(item => {\n    if (typeof item === 'object') {\n      Object.keys(item).forEach(classNames => {\n        if (item[classNames]) {\n          resultClasses.push(prefix + classNames);\n        }\n      });\n    } else if (typeof item === 'string') {\n      resultClasses.push(prefix + item);\n    }\n  });\n  return resultClasses;\n}\n\nexport default function addClasses() {\n  const swiper = this;\n  const {\n    classNames,\n    params,\n    rtl,\n    $el,\n    device,\n    support\n  } = swiper; // prettier-ignore\n\n  const suffixes = prepareClasses(['initialized', params.direction, {\n    'pointer-events': !support.touch\n  }, {\n    'free-mode': swiper.params.freeMode && params.freeMode.enabled\n  }, {\n    'autoheight': params.autoHeight\n  }, {\n    'rtl': rtl\n  }, {\n    'grid': params.grid && params.grid.rows > 1\n  }, {\n    'grid-column': params.grid && params.grid.rows > 1 && params.grid.fill === 'column'\n  }, {\n    'android': device.android\n  }, {\n    'ios': device.ios\n  }, {\n    'css-mode': params.cssMode\n  }, {\n    'centered': params.cssMode && params.centeredSlides\n  }], params.containerModifierClass);\n  classNames.push(...suffixes);\n  $el.addClass([...classNames].join(' '));\n  swiper.emitContainerClasses();\n}","export default function removeClasses() {\n  const swiper = this;\n  const {\n    $el,\n    classNames\n  } = swiper;\n  $el.removeClass(classNames.join(' '));\n  swiper.emitContainerClasses();\n}","import loadImage from './loadImage.js';\nimport preloadImages from './preloadImages.js';\nexport default {\n  loadImage,\n  preloadImages\n};","import { getWindow } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nexport default function loadImage(imageEl, src, srcset, sizes, checkForComplete, callback) {\n  const window = getWindow();\n  let image;\n\n  function onReady() {\n    if (callback) callback();\n  }\n\n  const isPicture = $(imageEl).parent('picture')[0];\n\n  if (!isPicture && (!imageEl.complete || !checkForComplete)) {\n    if (src) {\n      image = new window.Image();\n      image.onload = onReady;\n      image.onerror = onReady;\n\n      if (sizes) {\n        image.sizes = sizes;\n      }\n\n      if (srcset) {\n        image.srcset = srcset;\n      }\n\n      if (src) {\n        image.src = src;\n      }\n    } else {\n      onReady();\n    }\n  } else {\n    // image already loaded...\n    onReady();\n  }\n}","export default function preloadImages() {\n  const swiper = this;\n  swiper.imagesToLoad = swiper.$el.find('img');\n\n  function onReady() {\n    if (typeof swiper === 'undefined' || swiper === null || !swiper || swiper.destroyed) return;\n    if (swiper.imagesLoaded !== undefined) swiper.imagesLoaded += 1;\n\n    if (swiper.imagesLoaded === swiper.imagesToLoad.length) {\n      if (swiper.params.updateOnImagesReady) swiper.update();\n      swiper.emit('imagesReady');\n    }\n  }\n\n  for (let i = 0; i < swiper.imagesToLoad.length; i += 1) {\n    const imageEl = swiper.imagesToLoad[i];\n    swiper.loadImage(imageEl, imageEl.currentSrc || imageEl.getAttribute('src'), imageEl.srcset || imageEl.getAttribute('srcset'), imageEl.sizes || imageEl.getAttribute('sizes'), true, onReady);\n  }\n}","import { getDocument } from 'ssr-window';\nexport default function createElementIfNotDefined(swiper, originalParams, params, checkProps) {\n  const document = getDocument();\n\n  if (swiper.params.createElements) {\n    Object.keys(checkProps).forEach(key => {\n      if (!params[key] && params.auto === true) {\n        let element = swiper.$el.children(`.${checkProps[key]}`)[0];\n\n        if (!element) {\n          element = document.createElement('div');\n          element.className = checkProps[key];\n          swiper.$el.append(element);\n        }\n\n        params[key] = element;\n        originalParams[key] = element;\n      }\n    });\n  }\n\n  return params;\n}","import createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nimport $ from '../../shared/dom.js';\nexport default function Navigation({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  extendParams({\n    navigation: {\n      nextEl: null,\n      prevEl: null,\n      hideOnClick: false,\n      disabledClass: 'swiper-button-disabled',\n      hiddenClass: 'swiper-button-hidden',\n      lockClass: 'swiper-button-lock'\n    }\n  });\n  swiper.navigation = {\n    nextEl: null,\n    $nextEl: null,\n    prevEl: null,\n    $prevEl: null\n  };\n\n  function getEl(el) {\n    let $el;\n\n    if (el) {\n      $el = $(el);\n\n      if (swiper.params.uniqueNavElements && typeof el === 'string' && $el.length > 1 && swiper.$el.find(el).length === 1) {\n        $el = swiper.$el.find(el);\n      }\n    }\n\n    return $el;\n  }\n\n  function toggleEl($el, disabled) {\n    const params = swiper.params.navigation;\n\n    if ($el && $el.length > 0) {\n      $el[disabled ? 'addClass' : 'removeClass'](params.disabledClass);\n      if ($el[0] && $el[0].tagName === 'BUTTON') $el[0].disabled = disabled;\n\n      if (swiper.params.watchOverflow && swiper.enabled) {\n        $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n      }\n    }\n  }\n\n  function update() {\n    // Update Navigation Buttons\n    if (swiper.params.loop) return;\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n    toggleEl($prevEl, swiper.isBeginning);\n    toggleEl($nextEl, swiper.isEnd);\n  }\n\n  function onPrevClick(e) {\n    e.preventDefault();\n    if (swiper.isBeginning && !swiper.params.loop) return;\n    swiper.slidePrev();\n  }\n\n  function onNextClick(e) {\n    e.preventDefault();\n    if (swiper.isEnd && !swiper.params.loop) return;\n    swiper.slideNext();\n  }\n\n  function init() {\n    const params = swiper.params.navigation;\n    swiper.params.navigation = createElementIfNotDefined(swiper, swiper.originalParams.navigation, swiper.params.navigation, {\n      nextEl: 'swiper-button-next',\n      prevEl: 'swiper-button-prev'\n    });\n    if (!(params.nextEl || params.prevEl)) return;\n    const $nextEl = getEl(params.nextEl);\n    const $prevEl = getEl(params.prevEl);\n\n    if ($nextEl && $nextEl.length > 0) {\n      $nextEl.on('click', onNextClick);\n    }\n\n    if ($prevEl && $prevEl.length > 0) {\n      $prevEl.on('click', onPrevClick);\n    }\n\n    Object.assign(swiper.navigation, {\n      $nextEl,\n      nextEl: $nextEl && $nextEl[0],\n      $prevEl,\n      prevEl: $prevEl && $prevEl[0]\n    });\n\n    if (!swiper.enabled) {\n      if ($nextEl) $nextEl.addClass(params.lockClass);\n      if ($prevEl) $prevEl.addClass(params.lockClass);\n    }\n  }\n\n  function destroy() {\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n\n    if ($nextEl && $nextEl.length) {\n      $nextEl.off('click', onNextClick);\n      $nextEl.removeClass(swiper.params.navigation.disabledClass);\n    }\n\n    if ($prevEl && $prevEl.length) {\n      $prevEl.off('click', onPrevClick);\n      $prevEl.removeClass(swiper.params.navigation.disabledClass);\n    }\n  }\n\n  on('init', () => {\n    init();\n    update();\n  });\n  on('toEdge fromEdge lock unlock', () => {\n    update();\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n\n    if ($nextEl) {\n      $nextEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n    }\n\n    if ($prevEl) {\n      $prevEl[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.navigation.lockClass);\n    }\n  });\n  on('click', (_s, e) => {\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n    const targetEl = e.target;\n\n    if (swiper.params.navigation.hideOnClick && !$(targetEl).is($prevEl) && !$(targetEl).is($nextEl)) {\n      if (swiper.pagination && swiper.params.pagination && swiper.params.pagination.clickable && (swiper.pagination.el === targetEl || swiper.pagination.el.contains(targetEl))) return;\n      let isHidden;\n\n      if ($nextEl) {\n        isHidden = $nextEl.hasClass(swiper.params.navigation.hiddenClass);\n      } else if ($prevEl) {\n        isHidden = $prevEl.hasClass(swiper.params.navigation.hiddenClass);\n      }\n\n      if (isHidden === true) {\n        emit('navigationShow');\n      } else {\n        emit('navigationHide');\n      }\n\n      if ($nextEl) {\n        $nextEl.toggleClass(swiper.params.navigation.hiddenClass);\n      }\n\n      if ($prevEl) {\n        $prevEl.toggleClass(swiper.params.navigation.hiddenClass);\n      }\n    }\n  });\n  Object.assign(swiper.navigation, {\n    update,\n    init,\n    destroy\n  });\n}","export default function classesToSelector(classes = '') {\n  return `.${classes.trim().replace(/([\\.:!\\/])/g, '\\\\$1') // eslint-disable-line\n  .replace(/ /g, '.')}`;\n}","import $ from '../../shared/dom.js';\nimport classesToSelector from '../../shared/classes-to-selector.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nexport default function Pagination({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const pfx = 'swiper-pagination';\n  extendParams({\n    pagination: {\n      el: null,\n      bulletElement: 'span',\n      clickable: false,\n      hideOnClick: false,\n      renderBullet: null,\n      renderProgressbar: null,\n      renderFraction: null,\n      renderCustom: null,\n      progressbarOpposite: false,\n      type: 'bullets',\n      // 'bullets' or 'progressbar' or 'fraction' or 'custom'\n      dynamicBullets: false,\n      dynamicMainBullets: 1,\n      formatFractionCurrent: number => number,\n      formatFractionTotal: number => number,\n      bulletClass: `${pfx}-bullet`,\n      bulletActiveClass: `${pfx}-bullet-active`,\n      modifierClass: `${pfx}-`,\n      currentClass: `${pfx}-current`,\n      totalClass: `${pfx}-total`,\n      hiddenClass: `${pfx}-hidden`,\n      progressbarFillClass: `${pfx}-progressbar-fill`,\n      progressbarOppositeClass: `${pfx}-progressbar-opposite`,\n      clickableClass: `${pfx}-clickable`,\n      lockClass: `${pfx}-lock`,\n      horizontalClass: `${pfx}-horizontal`,\n      verticalClass: `${pfx}-vertical`\n    }\n  });\n  swiper.pagination = {\n    el: null,\n    $el: null,\n    bullets: []\n  };\n  let bulletSize;\n  let dynamicBulletIndex = 0;\n\n  function isPaginationDisabled() {\n    return !swiper.params.pagination.el || !swiper.pagination.el || !swiper.pagination.$el || swiper.pagination.$el.length === 0;\n  }\n\n  function setSideBullets($bulletEl, position) {\n    const {\n      bulletActiveClass\n    } = swiper.params.pagination;\n    $bulletEl[position]().addClass(`${bulletActiveClass}-${position}`)[position]().addClass(`${bulletActiveClass}-${position}-${position}`);\n  }\n\n  function update() {\n    // Render || Update Pagination bullets/items\n    const rtl = swiper.rtl;\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n    const $el = swiper.pagination.$el; // Current/Total\n\n    let current;\n    const total = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n\n    if (swiper.params.loop) {\n      current = Math.ceil((swiper.activeIndex - swiper.loopedSlides) / swiper.params.slidesPerGroup);\n\n      if (current > slidesLength - 1 - swiper.loopedSlides * 2) {\n        current -= slidesLength - swiper.loopedSlides * 2;\n      }\n\n      if (current > total - 1) current -= total;\n      if (current < 0 && swiper.params.paginationType !== 'bullets') current = total + current;\n    } else if (typeof swiper.snapIndex !== 'undefined') {\n      current = swiper.snapIndex;\n    } else {\n      current = swiper.activeIndex || 0;\n    } // Types\n\n\n    if (params.type === 'bullets' && swiper.pagination.bullets && swiper.pagination.bullets.length > 0) {\n      const bullets = swiper.pagination.bullets;\n      let firstIndex;\n      let lastIndex;\n      let midIndex;\n\n      if (params.dynamicBullets) {\n        bulletSize = bullets.eq(0)[swiper.isHorizontal() ? 'outerWidth' : 'outerHeight'](true);\n        $el.css(swiper.isHorizontal() ? 'width' : 'height', `${bulletSize * (params.dynamicMainBullets + 4)}px`);\n\n        if (params.dynamicMainBullets > 1 && swiper.previousIndex !== undefined) {\n          dynamicBulletIndex += current - swiper.previousIndex;\n\n          if (dynamicBulletIndex > params.dynamicMainBullets - 1) {\n            dynamicBulletIndex = params.dynamicMainBullets - 1;\n          } else if (dynamicBulletIndex < 0) {\n            dynamicBulletIndex = 0;\n          }\n        }\n\n        firstIndex = current - dynamicBulletIndex;\n        lastIndex = firstIndex + (Math.min(bullets.length, params.dynamicMainBullets) - 1);\n        midIndex = (lastIndex + firstIndex) / 2;\n      }\n\n      bullets.removeClass(['', '-next', '-next-next', '-prev', '-prev-prev', '-main'].map(suffix => `${params.bulletActiveClass}${suffix}`).join(' '));\n\n      if ($el.length > 1) {\n        bullets.each(bullet => {\n          const $bullet = $(bullet);\n          const bulletIndex = $bullet.index();\n\n          if (bulletIndex === current) {\n            $bullet.addClass(params.bulletActiveClass);\n          }\n\n          if (params.dynamicBullets) {\n            if (bulletIndex >= firstIndex && bulletIndex <= lastIndex) {\n              $bullet.addClass(`${params.bulletActiveClass}-main`);\n            }\n\n            if (bulletIndex === firstIndex) {\n              setSideBullets($bullet, 'prev');\n            }\n\n            if (bulletIndex === lastIndex) {\n              setSideBullets($bullet, 'next');\n            }\n          }\n        });\n      } else {\n        const $bullet = bullets.eq(current);\n        const bulletIndex = $bullet.index();\n        $bullet.addClass(params.bulletActiveClass);\n\n        if (params.dynamicBullets) {\n          const $firstDisplayedBullet = bullets.eq(firstIndex);\n          const $lastDisplayedBullet = bullets.eq(lastIndex);\n\n          for (let i = firstIndex; i <= lastIndex; i += 1) {\n            bullets.eq(i).addClass(`${params.bulletActiveClass}-main`);\n          }\n\n          if (swiper.params.loop) {\n            if (bulletIndex >= bullets.length - params.dynamicMainBullets) {\n              for (let i = params.dynamicMainBullets; i >= 0; i -= 1) {\n                bullets.eq(bullets.length - i).addClass(`${params.bulletActiveClass}-main`);\n              }\n\n              bullets.eq(bullets.length - params.dynamicMainBullets - 1).addClass(`${params.bulletActiveClass}-prev`);\n            } else {\n              setSideBullets($firstDisplayedBullet, 'prev');\n              setSideBullets($lastDisplayedBullet, 'next');\n            }\n          } else {\n            setSideBullets($firstDisplayedBullet, 'prev');\n            setSideBullets($lastDisplayedBullet, 'next');\n          }\n        }\n      }\n\n      if (params.dynamicBullets) {\n        const dynamicBulletsLength = Math.min(bullets.length, params.dynamicMainBullets + 4);\n        const bulletsOffset = (bulletSize * dynamicBulletsLength - bulletSize) / 2 - midIndex * bulletSize;\n        const offsetProp = rtl ? 'right' : 'left';\n        bullets.css(swiper.isHorizontal() ? offsetProp : 'top', `${bulletsOffset}px`);\n      }\n    }\n\n    if (params.type === 'fraction') {\n      $el.find(classesToSelector(params.currentClass)).text(params.formatFractionCurrent(current + 1));\n      $el.find(classesToSelector(params.totalClass)).text(params.formatFractionTotal(total));\n    }\n\n    if (params.type === 'progressbar') {\n      let progressbarDirection;\n\n      if (params.progressbarOpposite) {\n        progressbarDirection = swiper.isHorizontal() ? 'vertical' : 'horizontal';\n      } else {\n        progressbarDirection = swiper.isHorizontal() ? 'horizontal' : 'vertical';\n      }\n\n      const scale = (current + 1) / total;\n      let scaleX = 1;\n      let scaleY = 1;\n\n      if (progressbarDirection === 'horizontal') {\n        scaleX = scale;\n      } else {\n        scaleY = scale;\n      }\n\n      $el.find(classesToSelector(params.progressbarFillClass)).transform(`translate3d(0,0,0) scaleX(${scaleX}) scaleY(${scaleY})`).transition(swiper.params.speed);\n    }\n\n    if (params.type === 'custom' && params.renderCustom) {\n      $el.html(params.renderCustom(swiper, current + 1, total));\n      emit('paginationRender', $el[0]);\n    } else {\n      emit('paginationUpdate', $el[0]);\n    }\n\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      $el[swiper.isLocked ? 'addClass' : 'removeClass'](params.lockClass);\n    }\n  }\n\n  function render() {\n    // Render Container\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const slidesLength = swiper.virtual && swiper.params.virtual.enabled ? swiper.virtual.slides.length : swiper.slides.length;\n    const $el = swiper.pagination.$el;\n    let paginationHTML = '';\n\n    if (params.type === 'bullets') {\n      let numberOfBullets = swiper.params.loop ? Math.ceil((slidesLength - swiper.loopedSlides * 2) / swiper.params.slidesPerGroup) : swiper.snapGrid.length;\n\n      if (swiper.params.freeMode && swiper.params.freeMode.enabled && !swiper.params.loop && numberOfBullets > slidesLength) {\n        numberOfBullets = slidesLength;\n      }\n\n      for (let i = 0; i < numberOfBullets; i += 1) {\n        if (params.renderBullet) {\n          paginationHTML += params.renderBullet.call(swiper, i, params.bulletClass);\n        } else {\n          paginationHTML += `<${params.bulletElement} class=\"${params.bulletClass}\"></${params.bulletElement}>`;\n        }\n      }\n\n      $el.html(paginationHTML);\n      swiper.pagination.bullets = $el.find(classesToSelector(params.bulletClass));\n    }\n\n    if (params.type === 'fraction') {\n      if (params.renderFraction) {\n        paginationHTML = params.renderFraction.call(swiper, params.currentClass, params.totalClass);\n      } else {\n        paginationHTML = `<span class=\"${params.currentClass}\"></span>` + ' / ' + `<span class=\"${params.totalClass}\"></span>`;\n      }\n\n      $el.html(paginationHTML);\n    }\n\n    if (params.type === 'progressbar') {\n      if (params.renderProgressbar) {\n        paginationHTML = params.renderProgressbar.call(swiper, params.progressbarFillClass);\n      } else {\n        paginationHTML = `<span class=\"${params.progressbarFillClass}\"></span>`;\n      }\n\n      $el.html(paginationHTML);\n    }\n\n    if (params.type !== 'custom') {\n      emit('paginationRender', swiper.pagination.$el[0]);\n    }\n  }\n\n  function init() {\n    swiper.params.pagination = createElementIfNotDefined(swiper, swiper.originalParams.pagination, swiper.params.pagination, {\n      el: 'swiper-pagination'\n    });\n    const params = swiper.params.pagination;\n    if (!params.el) return;\n    let $el = $(params.el);\n    if ($el.length === 0) return;\n\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1) {\n      $el = swiper.$el.find(params.el); // check if it belongs to another nested Swiper\n\n      if ($el.length > 1) {\n        $el = $el.filter(el => {\n          if ($(el).parents('.swiper')[0] !== swiper.el) return false;\n          return true;\n        });\n      }\n    }\n\n    if (params.type === 'bullets' && params.clickable) {\n      $el.addClass(params.clickableClass);\n    }\n\n    $el.addClass(params.modifierClass + params.type);\n    $el.addClass(params.modifierClass + swiper.params.direction);\n\n    if (params.type === 'bullets' && params.dynamicBullets) {\n      $el.addClass(`${params.modifierClass}${params.type}-dynamic`);\n      dynamicBulletIndex = 0;\n\n      if (params.dynamicMainBullets < 1) {\n        params.dynamicMainBullets = 1;\n      }\n    }\n\n    if (params.type === 'progressbar' && params.progressbarOpposite) {\n      $el.addClass(params.progressbarOppositeClass);\n    }\n\n    if (params.clickable) {\n      $el.on('click', classesToSelector(params.bulletClass), function onClick(e) {\n        e.preventDefault();\n        let index = $(this).index() * swiper.params.slidesPerGroup;\n        if (swiper.params.loop) index += swiper.loopedSlides;\n        swiper.slideTo(index);\n      });\n    }\n\n    Object.assign(swiper.pagination, {\n      $el,\n      el: $el[0]\n    });\n\n    if (!swiper.enabled) {\n      $el.addClass(params.lockClass);\n    }\n  }\n\n  function destroy() {\n    const params = swiper.params.pagination;\n    if (isPaginationDisabled()) return;\n    const $el = swiper.pagination.$el;\n    $el.removeClass(params.hiddenClass);\n    $el.removeClass(params.modifierClass + params.type);\n    $el.removeClass(params.modifierClass + swiper.params.direction);\n    if (swiper.pagination.bullets && swiper.pagination.bullets.removeClass) swiper.pagination.bullets.removeClass(params.bulletActiveClass);\n\n    if (params.clickable) {\n      $el.off('click', classesToSelector(params.bulletClass));\n    }\n  }\n\n  on('init', () => {\n    init();\n    render();\n    update();\n  });\n  on('activeIndexChange', () => {\n    if (swiper.params.loop) {\n      update();\n    } else if (typeof swiper.snapIndex === 'undefined') {\n      update();\n    }\n  });\n  on('snapIndexChange', () => {\n    if (!swiper.params.loop) {\n      update();\n    }\n  });\n  on('slidesLengthChange', () => {\n    if (swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('snapGridLengthChange', () => {\n    if (!swiper.params.loop) {\n      render();\n      update();\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  on('enable disable', () => {\n    const {\n      $el\n    } = swiper.pagination;\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.pagination.lockClass);\n    }\n  });\n  on('lock unlock', () => {\n    update();\n  });\n  on('click', (_s, e) => {\n    const targetEl = e.target;\n    const {\n      $el\n    } = swiper.pagination;\n\n    if (swiper.params.pagination.el && swiper.params.pagination.hideOnClick && $el.length > 0 && !$(targetEl).hasClass(swiper.params.pagination.bulletClass)) {\n      if (swiper.navigation && (swiper.navigation.nextEl && targetEl === swiper.navigation.nextEl || swiper.navigation.prevEl && targetEl === swiper.navigation.prevEl)) return;\n      const isHidden = $el.hasClass(swiper.params.pagination.hiddenClass);\n\n      if (isHidden === true) {\n        emit('paginationShow');\n      } else {\n        emit('paginationHide');\n      }\n\n      $el.toggleClass(swiper.params.pagination.hiddenClass);\n    }\n  });\n  Object.assign(swiper.pagination, {\n    render,\n    update,\n    init,\n    destroy\n  });\n}","import { getDocument } from 'ssr-window';\nimport $ from '../../shared/dom.js';\nimport { nextTick } from '../../shared/utils.js';\nimport createElementIfNotDefined from '../../shared/create-element-if-not-defined.js';\nexport default function Scrollbar({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const document = getDocument();\n  let isTouched = false;\n  let timeout = null;\n  let dragTimeout = null;\n  let dragStartPos;\n  let dragSize;\n  let trackSize;\n  let divider;\n  extendParams({\n    scrollbar: {\n      el: null,\n      dragSize: 'auto',\n      hide: false,\n      draggable: false,\n      snapOnRelease: true,\n      lockClass: 'swiper-scrollbar-lock',\n      dragClass: 'swiper-scrollbar-drag'\n    }\n  });\n  swiper.scrollbar = {\n    el: null,\n    dragEl: null,\n    $el: null,\n    $dragEl: null\n  };\n\n  function setTranslate() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar,\n      rtlTranslate: rtl,\n      progress\n    } = swiper;\n    const {\n      $dragEl,\n      $el\n    } = scrollbar;\n    const params = swiper.params.scrollbar;\n    let newSize = dragSize;\n    let newPos = (trackSize - dragSize) * progress;\n\n    if (rtl) {\n      newPos = -newPos;\n\n      if (newPos > 0) {\n        newSize = dragSize - newPos;\n        newPos = 0;\n      } else if (-newPos + dragSize > trackSize) {\n        newSize = trackSize + newPos;\n      }\n    } else if (newPos < 0) {\n      newSize = dragSize + newPos;\n      newPos = 0;\n    } else if (newPos + dragSize > trackSize) {\n      newSize = trackSize - newPos;\n    }\n\n    if (swiper.isHorizontal()) {\n      $dragEl.transform(`translate3d(${newPos}px, 0, 0)`);\n      $dragEl[0].style.width = `${newSize}px`;\n    } else {\n      $dragEl.transform(`translate3d(0px, ${newPos}px, 0)`);\n      $dragEl[0].style.height = `${newSize}px`;\n    }\n\n    if (params.hide) {\n      clearTimeout(timeout);\n      $el[0].style.opacity = 1;\n      timeout = setTimeout(() => {\n        $el[0].style.opacity = 0;\n        $el.transition(400);\n      }, 1000);\n    }\n  }\n\n  function setTransition(duration) {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    swiper.scrollbar.$dragEl.transition(duration);\n  }\n\n  function updateSize() {\n    if (!swiper.params.scrollbar.el || !swiper.scrollbar.el) return;\n    const {\n      scrollbar\n    } = swiper;\n    const {\n      $dragEl,\n      $el\n    } = scrollbar;\n    $dragEl[0].style.width = '';\n    $dragEl[0].style.height = '';\n    trackSize = swiper.isHorizontal() ? $el[0].offsetWidth : $el[0].offsetHeight;\n    divider = swiper.size / (swiper.virtualSize + swiper.params.slidesOffsetBefore - (swiper.params.centeredSlides ? swiper.snapGrid[0] : 0));\n\n    if (swiper.params.scrollbar.dragSize === 'auto') {\n      dragSize = trackSize * divider;\n    } else {\n      dragSize = parseInt(swiper.params.scrollbar.dragSize, 10);\n    }\n\n    if (swiper.isHorizontal()) {\n      $dragEl[0].style.width = `${dragSize}px`;\n    } else {\n      $dragEl[0].style.height = `${dragSize}px`;\n    }\n\n    if (divider >= 1) {\n      $el[0].style.display = 'none';\n    } else {\n      $el[0].style.display = '';\n    }\n\n    if (swiper.params.scrollbar.hide) {\n      $el[0].style.opacity = 0;\n    }\n\n    if (swiper.params.watchOverflow && swiper.enabled) {\n      scrollbar.$el[swiper.isLocked ? 'addClass' : 'removeClass'](swiper.params.scrollbar.lockClass);\n    }\n  }\n\n  function getPointerPosition(e) {\n    if (swiper.isHorizontal()) {\n      return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientX : e.clientX;\n    }\n\n    return e.type === 'touchstart' || e.type === 'touchmove' ? e.targetTouches[0].clientY : e.clientY;\n  }\n\n  function setDragPosition(e) {\n    const {\n      scrollbar,\n      rtlTranslate: rtl\n    } = swiper;\n    const {\n      $el\n    } = scrollbar;\n    let positionRatio;\n    positionRatio = (getPointerPosition(e) - $el.offset()[swiper.isHorizontal() ? 'left' : 'top'] - (dragStartPos !== null ? dragStartPos : dragSize / 2)) / (trackSize - dragSize);\n    positionRatio = Math.max(Math.min(positionRatio, 1), 0);\n\n    if (rtl) {\n      positionRatio = 1 - positionRatio;\n    }\n\n    const position = swiper.minTranslate() + (swiper.maxTranslate() - swiper.minTranslate()) * positionRatio;\n    swiper.updateProgress(position);\n    swiper.setTranslate(position);\n    swiper.updateActiveIndex();\n    swiper.updateSlidesClasses();\n  }\n\n  function onDragStart(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      $wrapperEl\n    } = swiper;\n    const {\n      $el,\n      $dragEl\n    } = scrollbar;\n    isTouched = true;\n    dragStartPos = e.target === $dragEl[0] || e.target === $dragEl ? getPointerPosition(e) - e.target.getBoundingClientRect()[swiper.isHorizontal() ? 'left' : 'top'] : null;\n    e.preventDefault();\n    e.stopPropagation();\n    $wrapperEl.transition(100);\n    $dragEl.transition(100);\n    setDragPosition(e);\n    clearTimeout(dragTimeout);\n    $el.transition(0);\n\n    if (params.hide) {\n      $el.css('opacity', 1);\n    }\n\n    if (swiper.params.cssMode) {\n      swiper.$wrapperEl.css('scroll-snap-type', 'none');\n    }\n\n    emit('scrollbarDragStart', e);\n  }\n\n  function onDragMove(e) {\n    const {\n      scrollbar,\n      $wrapperEl\n    } = swiper;\n    const {\n      $el,\n      $dragEl\n    } = scrollbar;\n    if (!isTouched) return;\n    if (e.preventDefault) e.preventDefault();else e.returnValue = false;\n    setDragPosition(e);\n    $wrapperEl.transition(0);\n    $el.transition(0);\n    $dragEl.transition(0);\n    emit('scrollbarDragMove', e);\n  }\n\n  function onDragEnd(e) {\n    const params = swiper.params.scrollbar;\n    const {\n      scrollbar,\n      $wrapperEl\n    } = swiper;\n    const {\n      $el\n    } = scrollbar;\n    if (!isTouched) return;\n    isTouched = false;\n\n    if (swiper.params.cssMode) {\n      swiper.$wrapperEl.css('scroll-snap-type', '');\n      $wrapperEl.transition('');\n    }\n\n    if (params.hide) {\n      clearTimeout(dragTimeout);\n      dragTimeout = nextTick(() => {\n        $el.css('opacity', 0);\n        $el.transition(400);\n      }, 1000);\n    }\n\n    emit('scrollbarDragEnd', e);\n\n    if (params.snapOnRelease) {\n      swiper.slideToClosest();\n    }\n  }\n\n  function events(method) {\n    const {\n      scrollbar,\n      touchEventsTouch,\n      touchEventsDesktop,\n      params,\n      support\n    } = swiper;\n    const $el = scrollbar.$el;\n    const target = $el[0];\n    const activeListener = support.passiveListener && params.passiveListeners ? {\n      passive: false,\n      capture: false\n    } : false;\n    const passiveListener = support.passiveListener && params.passiveListeners ? {\n      passive: true,\n      capture: false\n    } : false;\n    if (!target) return;\n    const eventMethod = method === 'on' ? 'addEventListener' : 'removeEventListener';\n\n    if (!support.touch) {\n      target[eventMethod](touchEventsDesktop.start, onDragStart, activeListener);\n      document[eventMethod](touchEventsDesktop.move, onDragMove, activeListener);\n      document[eventMethod](touchEventsDesktop.end, onDragEnd, passiveListener);\n    } else {\n      target[eventMethod](touchEventsTouch.start, onDragStart, activeListener);\n      target[eventMethod](touchEventsTouch.move, onDragMove, activeListener);\n      target[eventMethod](touchEventsTouch.end, onDragEnd, passiveListener);\n    }\n  }\n\n  function enableDraggable() {\n    if (!swiper.params.scrollbar.el) return;\n    events('on');\n  }\n\n  function disableDraggable() {\n    if (!swiper.params.scrollbar.el) return;\n    events('off');\n  }\n\n  function init() {\n    const {\n      scrollbar,\n      $el: $swiperEl\n    } = swiper;\n    swiper.params.scrollbar = createElementIfNotDefined(swiper, swiper.originalParams.scrollbar, swiper.params.scrollbar, {\n      el: 'swiper-scrollbar'\n    });\n    const params = swiper.params.scrollbar;\n    if (!params.el) return;\n    let $el = $(params.el);\n\n    if (swiper.params.uniqueNavElements && typeof params.el === 'string' && $el.length > 1 && $swiperEl.find(params.el).length === 1) {\n      $el = $swiperEl.find(params.el);\n    }\n\n    let $dragEl = $el.find(`.${swiper.params.scrollbar.dragClass}`);\n\n    if ($dragEl.length === 0) {\n      $dragEl = $(`<div class=\"${swiper.params.scrollbar.dragClass}\"></div>`);\n      $el.append($dragEl);\n    }\n\n    Object.assign(scrollbar, {\n      $el,\n      el: $el[0],\n      $dragEl,\n      dragEl: $dragEl[0]\n    });\n\n    if (params.draggable) {\n      enableDraggable();\n    }\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n    }\n  }\n\n  function destroy() {\n    disableDraggable();\n  }\n\n  on('init', () => {\n    init();\n    updateSize();\n    setTranslate();\n  });\n  on('update resize observerUpdate lock unlock', () => {\n    updateSize();\n  });\n  on('setTranslate', () => {\n    setTranslate();\n  });\n  on('setTransition', (_s, duration) => {\n    setTransition(duration);\n  });\n  on('enable disable', () => {\n    const {\n      $el\n    } = swiper.scrollbar;\n\n    if ($el) {\n      $el[swiper.enabled ? 'removeClass' : 'addClass'](swiper.params.scrollbar.lockClass);\n    }\n  });\n  on('destroy', () => {\n    destroy();\n  });\n  Object.assign(swiper.scrollbar, {\n    updateSize,\n    setTranslate,\n    init,\n    destroy\n  });\n}","import classesToSelector from '../../shared/classes-to-selector.js';\nimport $ from '../../shared/dom.js';\nexport default function A11y({\n  swiper,\n  extendParams,\n  on\n}) {\n  extendParams({\n    a11y: {\n      enabled: true,\n      notificationClass: 'swiper-notification',\n      prevSlideMessage: 'Previous slide',\n      nextSlideMessage: 'Next slide',\n      firstSlideMessage: 'This is the first slide',\n      lastSlideMessage: 'This is the last slide',\n      paginationBulletMessage: 'Go to slide {{index}}',\n      slideLabelMessage: '{{index}} / {{slidesLength}}',\n      containerMessage: null,\n      containerRoleDescriptionMessage: null,\n      itemRoleDescriptionMessage: null,\n      slideRole: 'group'\n    }\n  });\n  let liveRegion = null;\n\n  function notify(message) {\n    const notification = liveRegion;\n    if (notification.length === 0) return;\n    notification.html('');\n    notification.html(message);\n  }\n\n  function getRandomNumber(size = 16) {\n    const randomChar = () => Math.round(16 * Math.random()).toString(16);\n\n    return 'x'.repeat(size).replace(/x/g, randomChar);\n  }\n\n  function makeElFocusable($el) {\n    $el.attr('tabIndex', '0');\n  }\n\n  function makeElNotFocusable($el) {\n    $el.attr('tabIndex', '-1');\n  }\n\n  function addElRole($el, role) {\n    $el.attr('role', role);\n  }\n\n  function addElRoleDescription($el, description) {\n    $el.attr('aria-roledescription', description);\n  }\n\n  function addElControls($el, controls) {\n    $el.attr('aria-controls', controls);\n  }\n\n  function addElLabel($el, label) {\n    $el.attr('aria-label', label);\n  }\n\n  function addElId($el, id) {\n    $el.attr('id', id);\n  }\n\n  function addElLive($el, live) {\n    $el.attr('aria-live', live);\n  }\n\n  function disableEl($el) {\n    $el.attr('aria-disabled', true);\n  }\n\n  function enableEl($el) {\n    $el.attr('aria-disabled', false);\n  }\n\n  function onEnterOrSpaceKey(e) {\n    if (e.keyCode !== 13 && e.keyCode !== 32) return;\n    const params = swiper.params.a11y;\n    const $targetEl = $(e.target);\n\n    if (swiper.navigation && swiper.navigation.$nextEl && $targetEl.is(swiper.navigation.$nextEl)) {\n      if (!(swiper.isEnd && !swiper.params.loop)) {\n        swiper.slideNext();\n      }\n\n      if (swiper.isEnd) {\n        notify(params.lastSlideMessage);\n      } else {\n        notify(params.nextSlideMessage);\n      }\n    }\n\n    if (swiper.navigation && swiper.navigation.$prevEl && $targetEl.is(swiper.navigation.$prevEl)) {\n      if (!(swiper.isBeginning && !swiper.params.loop)) {\n        swiper.slidePrev();\n      }\n\n      if (swiper.isBeginning) {\n        notify(params.firstSlideMessage);\n      } else {\n        notify(params.prevSlideMessage);\n      }\n    }\n\n    if (swiper.pagination && $targetEl.is(classesToSelector(swiper.params.pagination.bulletClass))) {\n      $targetEl[0].click();\n    }\n  }\n\n  function updateNavigation() {\n    if (swiper.params.loop || !swiper.navigation) return;\n    const {\n      $nextEl,\n      $prevEl\n    } = swiper.navigation;\n\n    if ($prevEl && $prevEl.length > 0) {\n      if (swiper.isBeginning) {\n        disableEl($prevEl);\n        makeElNotFocusable($prevEl);\n      } else {\n        enableEl($prevEl);\n        makeElFocusable($prevEl);\n      }\n    }\n\n    if ($nextEl && $nextEl.length > 0) {\n      if (swiper.isEnd) {\n        disableEl($nextEl);\n        makeElNotFocusable($nextEl);\n      } else {\n        enableEl($nextEl);\n        makeElFocusable($nextEl);\n      }\n    }\n  }\n\n  function hasPagination() {\n    return swiper.pagination && swiper.params.pagination.clickable && swiper.pagination.bullets && swiper.pagination.bullets.length;\n  }\n\n  function updatePagination() {\n    const params = swiper.params.a11y;\n\n    if (hasPagination()) {\n      swiper.pagination.bullets.each(bulletEl => {\n        const $bulletEl = $(bulletEl);\n        makeElFocusable($bulletEl);\n\n        if (!swiper.params.pagination.renderBullet) {\n          addElRole($bulletEl, 'button');\n          addElLabel($bulletEl, params.paginationBulletMessage.replace(/\\{\\{index\\}\\}/, $bulletEl.index() + 1));\n        }\n      });\n    }\n  }\n\n  const initNavEl = ($el, wrapperId, message) => {\n    makeElFocusable($el);\n\n    if ($el[0].tagName !== 'BUTTON') {\n      addElRole($el, 'button');\n      $el.on('keydown', onEnterOrSpaceKey);\n    }\n\n    addElLabel($el, message);\n    addElControls($el, wrapperId);\n  };\n\n  function init() {\n    const params = swiper.params.a11y;\n    swiper.$el.append(liveRegion); // Container\n\n    const $containerEl = swiper.$el;\n\n    if (params.containerRoleDescriptionMessage) {\n      addElRoleDescription($containerEl, params.containerRoleDescriptionMessage);\n    }\n\n    if (params.containerMessage) {\n      addElLabel($containerEl, params.containerMessage);\n    } // Wrapper\n\n\n    const $wrapperEl = swiper.$wrapperEl;\n    const wrapperId = $wrapperEl.attr('id') || `swiper-wrapper-${getRandomNumber(16)}`;\n    const live = swiper.params.autoplay && swiper.params.autoplay.enabled ? 'off' : 'polite';\n    addElId($wrapperEl, wrapperId);\n    addElLive($wrapperEl, live); // Slide\n\n    if (params.itemRoleDescriptionMessage) {\n      addElRoleDescription($(swiper.slides), params.itemRoleDescriptionMessage);\n    }\n\n    addElRole($(swiper.slides), params.slideRole);\n    const slidesLength = swiper.params.loop ? swiper.slides.filter(el => !el.classList.contains(swiper.params.slideDuplicateClass)).length : swiper.slides.length;\n    swiper.slides.each((slideEl, index) => {\n      const $slideEl = $(slideEl);\n      const slideIndex = swiper.params.loop ? parseInt($slideEl.attr('data-swiper-slide-index'), 10) : index;\n      const ariaLabelMessage = params.slideLabelMessage.replace(/\\{\\{index\\}\\}/, slideIndex + 1).replace(/\\{\\{slidesLength\\}\\}/, slidesLength);\n      addElLabel($slideEl, ariaLabelMessage);\n    }); // Navigation\n\n    let $nextEl;\n    let $prevEl;\n\n    if (swiper.navigation && swiper.navigation.$nextEl) {\n      $nextEl = swiper.navigation.$nextEl;\n    }\n\n    if (swiper.navigation && swiper.navigation.$prevEl) {\n      $prevEl = swiper.navigation.$prevEl;\n    }\n\n    if ($nextEl && $nextEl.length) {\n      initNavEl($nextEl, wrapperId, params.nextSlideMessage);\n    }\n\n    if ($prevEl && $prevEl.length) {\n      initNavEl($prevEl, wrapperId, params.prevSlideMessage);\n    } // Pagination\n\n\n    if (hasPagination()) {\n      swiper.pagination.$el.on('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey);\n    }\n  }\n\n  function destroy() {\n    if (liveRegion && liveRegion.length > 0) liveRegion.remove();\n    let $nextEl;\n    let $prevEl;\n\n    if (swiper.navigation && swiper.navigation.$nextEl) {\n      $nextEl = swiper.navigation.$nextEl;\n    }\n\n    if (swiper.navigation && swiper.navigation.$prevEl) {\n      $prevEl = swiper.navigation.$prevEl;\n    }\n\n    if ($nextEl) {\n      $nextEl.off('keydown', onEnterOrSpaceKey);\n    }\n\n    if ($prevEl) {\n      $prevEl.off('keydown', onEnterOrSpaceKey);\n    } // Pagination\n\n\n    if (hasPagination()) {\n      swiper.pagination.$el.off('keydown', classesToSelector(swiper.params.pagination.bulletClass), onEnterOrSpaceKey);\n    }\n  }\n\n  on('beforeInit', () => {\n    liveRegion = $(`<span class=\"${swiper.params.a11y.notificationClass}\" aria-live=\"assertive\" aria-atomic=\"true\"></span>`);\n  });\n  on('afterInit', () => {\n    if (!swiper.params.a11y.enabled) return;\n    init();\n    updateNavigation();\n  });\n  on('toEdge', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updateNavigation();\n  });\n  on('fromEdge', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updateNavigation();\n  });\n  on('paginationUpdate', () => {\n    if (!swiper.params.a11y.enabled) return;\n    updatePagination();\n  });\n  on('destroy', () => {\n    if (!swiper.params.a11y.enabled) return;\n    destroy();\n  });\n}","/* eslint no-underscore-dangle: \"off\" */\n\n/* eslint no-use-before-define: \"off\" */\nimport { getDocument } from 'ssr-window';\nimport { nextTick } from '../../shared/utils.js';\nexport default function Autoplay({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  let timeout;\n  swiper.autoplay = {\n    running: false,\n    paused: false\n  };\n  extendParams({\n    autoplay: {\n      enabled: false,\n      delay: 3000,\n      waitForTransition: true,\n      disableOnInteraction: true,\n      stopOnLastSlide: false,\n      reverseDirection: false,\n      pauseOnMouseEnter: false\n    }\n  });\n\n  function run() {\n    const $activeSlideEl = swiper.slides.eq(swiper.activeIndex);\n    let delay = swiper.params.autoplay.delay;\n\n    if ($activeSlideEl.attr('data-swiper-autoplay')) {\n      delay = $activeSlideEl.attr('data-swiper-autoplay') || swiper.params.autoplay.delay;\n    }\n\n    clearTimeout(timeout);\n    timeout = nextTick(() => {\n      let autoplayResult;\n\n      if (swiper.params.autoplay.reverseDirection) {\n        if (swiper.params.loop) {\n          swiper.loopFix();\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.isBeginning) {\n          autoplayResult = swiper.slidePrev(swiper.params.speed, true, true);\n          emit('autoplay');\n        } else if (!swiper.params.autoplay.stopOnLastSlide) {\n          autoplayResult = swiper.slideTo(swiper.slides.length - 1, swiper.params.speed, true, true);\n          emit('autoplay');\n        } else {\n          stop();\n        }\n      } else if (swiper.params.loop) {\n        swiper.loopFix();\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.isEnd) {\n        autoplayResult = swiper.slideNext(swiper.params.speed, true, true);\n        emit('autoplay');\n      } else if (!swiper.params.autoplay.stopOnLastSlide) {\n        autoplayResult = swiper.slideTo(0, swiper.params.speed, true, true);\n        emit('autoplay');\n      } else {\n        stop();\n      }\n\n      if (swiper.params.cssMode && swiper.autoplay.running) run();else if (autoplayResult === false) {\n        run();\n      }\n    }, delay);\n  }\n\n  function start() {\n    if (typeof timeout !== 'undefined') return false;\n    if (swiper.autoplay.running) return false;\n    swiper.autoplay.running = true;\n    emit('autoplayStart');\n    run();\n    return true;\n  }\n\n  function stop() {\n    if (!swiper.autoplay.running) return false;\n    if (typeof timeout === 'undefined') return false;\n\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = undefined;\n    }\n\n    swiper.autoplay.running = false;\n    emit('autoplayStop');\n    return true;\n  }\n\n  function pause(speed) {\n    if (!swiper.autoplay.running) return;\n    if (swiper.autoplay.paused) return;\n    if (timeout) clearTimeout(timeout);\n    swiper.autoplay.paused = true;\n\n    if (speed === 0 || !swiper.params.autoplay.waitForTransition) {\n      swiper.autoplay.paused = false;\n      run();\n    } else {\n      ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n        swiper.$wrapperEl[0].addEventListener(event, onTransitionEnd);\n      });\n    }\n  }\n\n  function onVisibilityChange() {\n    const document = getDocument();\n\n    if (document.visibilityState === 'hidden' && swiper.autoplay.running) {\n      pause();\n    }\n\n    if (document.visibilityState === 'visible' && swiper.autoplay.paused) {\n      run();\n      swiper.autoplay.paused = false;\n    }\n  }\n\n  function onTransitionEnd(e) {\n    if (!swiper || swiper.destroyed || !swiper.$wrapperEl) return;\n    if (e.target !== swiper.$wrapperEl[0]) return;\n    ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n    swiper.autoplay.paused = false;\n\n    if (!swiper.autoplay.running) {\n      stop();\n    } else {\n      run();\n    }\n  }\n\n  function onMouseEnter() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      stop();\n    } else {\n      pause();\n    }\n\n    ['transitionend', 'webkitTransitionEnd'].forEach(event => {\n      swiper.$wrapperEl[0].removeEventListener(event, onTransitionEnd);\n    });\n  }\n\n  function onMouseLeave() {\n    if (swiper.params.autoplay.disableOnInteraction) {\n      return;\n    }\n\n    swiper.autoplay.paused = false;\n    run();\n  }\n\n  function attachMouseEvents() {\n    if (swiper.params.autoplay.pauseOnMouseEnter) {\n      swiper.$el.on('mouseenter', onMouseEnter);\n      swiper.$el.on('mouseleave', onMouseLeave);\n    }\n  }\n\n  function detachMouseEvents() {\n    swiper.$el.off('mouseenter', onMouseEnter);\n    swiper.$el.off('mouseleave', onMouseLeave);\n  }\n\n  on('init', () => {\n    if (swiper.params.autoplay.enabled) {\n      start();\n      const document = getDocument();\n      document.addEventListener('visibilitychange', onVisibilityChange);\n      attachMouseEvents();\n    }\n  });\n  on('beforeTransitionStart', (_s, speed, internal) => {\n    if (swiper.autoplay.running) {\n      if (internal || !swiper.params.autoplay.disableOnInteraction) {\n        swiper.autoplay.pause(speed);\n      } else {\n        stop();\n      }\n    }\n  });\n  on('sliderFirstMove', () => {\n    if (swiper.autoplay.running) {\n      if (swiper.params.autoplay.disableOnInteraction) {\n        stop();\n      } else {\n        pause();\n      }\n    }\n  });\n  on('touchEnd', () => {\n    if (swiper.params.cssMode && swiper.autoplay.paused && !swiper.params.autoplay.disableOnInteraction) {\n      run();\n    }\n  });\n  on('destroy', () => {\n    detachMouseEvents();\n\n    if (swiper.autoplay.running) {\n      stop();\n    }\n\n    const document = getDocument();\n    document.removeEventListener('visibilitychange', onVisibilityChange);\n  });\n  Object.assign(swiper.autoplay, {\n    pause,\n    run,\n    start,\n    stop\n  });\n}","function isObject(o) {\n  return typeof o === 'object' && o !== null && o.constructor && Object.prototype.toString.call(o).slice(8, -1) === 'Object';\n}\n\nfunction extend(target, src) {\n  const noExtend = ['__proto__', 'constructor', 'prototype'];\n  Object.keys(src).filter(key => noExtend.indexOf(key) < 0).forEach(key => {\n    if (typeof target[key] === 'undefined') target[key] = src[key];else if (isObject(src[key]) && isObject(target[key]) && Object.keys(src[key]).length > 0) {\n      if (src[key].__swiper__) target[key] = src[key];else extend(target[key], src[key]);\n    } else {\n      target[key] = src[key];\n    }\n  });\n}\n\nfunction needsNavigation(params = {}) {\n  return params.navigation && typeof params.navigation.nextEl === 'undefined' && typeof params.navigation.prevEl === 'undefined';\n}\n\nfunction needsPagination(params = {}) {\n  return params.pagination && typeof params.pagination.el === 'undefined';\n}\n\nfunction needsScrollbar(params = {}) {\n  return params.scrollbar && typeof params.scrollbar.el === 'undefined';\n}\n\nfunction uniqueClasses(classNames = '') {\n  const classes = classNames.split(' ').map(c => c.trim()).filter(c => !!c);\n  const unique = [];\n  classes.forEach(c => {\n    if (unique.indexOf(c) < 0) unique.push(c);\n  });\n  return unique.join(' ');\n}\n\nexport { isObject, extend, needsNavigation, needsPagination, needsScrollbar, uniqueClasses };","import { getWindow } from 'ssr-window';\nexport default function Resize({\n  swiper,\n  on,\n  emit\n}) {\n  const window = getWindow();\n  let observer = null;\n\n  const resizeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('beforeResize');\n    emit('resize');\n  };\n\n  const createObserver = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    observer = new ResizeObserver(entries => {\n      const {\n        width,\n        height\n      } = swiper;\n      let newWidth = width;\n      let newHeight = height;\n      entries.forEach(({\n        contentBoxSize,\n        contentRect,\n        target\n      }) => {\n        if (target && target !== swiper.el) return;\n        newWidth = contentRect ? contentRect.width : (contentBoxSize[0] || contentBoxSize).inlineSize;\n        newHeight = contentRect ? contentRect.height : (contentBoxSize[0] || contentBoxSize).blockSize;\n      });\n\n      if (newWidth !== width || newHeight !== height) {\n        resizeHandler();\n      }\n    });\n    observer.observe(swiper.el);\n  };\n\n  const removeObserver = () => {\n    if (observer && observer.unobserve && swiper.el) {\n      observer.unobserve(swiper.el);\n      observer = null;\n    }\n  };\n\n  const orientationChangeHandler = () => {\n    if (!swiper || swiper.destroyed || !swiper.initialized) return;\n    emit('orientationchange');\n  };\n\n  on('init', () => {\n    if (swiper.params.resizeObserver && typeof window.ResizeObserver !== 'undefined') {\n      createObserver();\n      return;\n    }\n\n    window.addEventListener('resize', resizeHandler);\n    window.addEventListener('orientationchange', orientationChangeHandler);\n  });\n  on('destroy', () => {\n    removeObserver();\n    window.removeEventListener('resize', resizeHandler);\n    window.removeEventListener('orientationchange', orientationChangeHandler);\n  });\n}","import { getWindow } from 'ssr-window';\nexport default function Observer({\n  swiper,\n  extendParams,\n  on,\n  emit\n}) {\n  const observers = [];\n  const window = getWindow();\n\n  const attach = (target, options = {}) => {\n    const ObserverFunc = window.MutationObserver || window.WebkitMutationObserver;\n    const observer = new ObserverFunc(mutations => {\n      // The observerUpdate event should only be triggered\n      // once despite the number of mutations.  Additional\n      // triggers are redundant and are very costly\n      if (mutations.length === 1) {\n        emit('observerUpdate', mutations[0]);\n        return;\n      }\n\n      const observerUpdate = function observerUpdate() {\n        emit('observerUpdate', mutations[0]);\n      };\n\n      if (window.requestAnimationFrame) {\n        window.requestAnimationFrame(observerUpdate);\n      } else {\n        window.setTimeout(observerUpdate, 0);\n      }\n    });\n    observer.observe(target, {\n      attributes: typeof options.attributes === 'undefined' ? true : options.attributes,\n      childList: typeof options.childList === 'undefined' ? true : options.childList,\n      characterData: typeof options.characterData === 'undefined' ? true : options.characterData\n    });\n    observers.push(observer);\n  };\n\n  const init = () => {\n    if (!swiper.params.observer) return;\n\n    if (swiper.params.observeParents) {\n      const containerParents = swiper.$el.parents();\n\n      for (let i = 0; i < containerParents.length; i += 1) {\n        attach(containerParents[i]);\n      }\n    } // Observe container\n\n\n    attach(swiper.$el[0], {\n      childList: swiper.params.observeSlideChildren\n    }); // Observe wrapper\n\n    attach(swiper.$wrapperEl[0], {\n      attributes: false\n    });\n  };\n\n  const destroy = () => {\n    observers.forEach(observer => {\n      observer.disconnect();\n    });\n    observers.splice(0, observers.length);\n  };\n\n  extendParams({\n    observer: false,\n    observeParents: false,\n    observeSlideChildren: false\n  });\n  on('init', init);\n  on('destroy', destroy);\n}","/* underscore in name -> watch for changes */\nconst paramsList = ['modules', 'init', '_direction', 'touchEventsTarget', 'initialSlide', '_speed', 'cssMode', 'updateOnWindowResize', 'resizeObserver', 'nested', 'focusableElements', '_enabled', '_width', '_height', 'preventInteractionOnTransition', 'userAgent', 'url', '_edgeSwipeDetection', '_edgeSwipeThreshold', '_freeMode', '_autoHeight', 'setWrapperSize', 'virtualTranslate', '_effect', 'breakpoints', '_spaceBetween', '_slidesPerView', '_grid', '_slidesPerGroup', '_slidesPerGroupSkip', '_slidesPerGroupAuto', '_centeredSlides', '_centeredSlidesBounds', '_slidesOffsetBefore', '_slidesOffsetAfter', 'normalizeSlideIndex', '_centerInsufficientSlides', '_watchOverflow', 'roundLengths', 'touchRatio', 'touchAngle', 'simulateTouch', '_shortSwipes', '_longSwipes', 'longSwipesRatio', 'longSwipesMs', '_followFinger', 'allowTouchMove', '_threshold', 'touchMoveStopPropagation', 'touchStartPreventDefault', 'touchStartForcePreventDefault', 'touchReleaseOnEdges', 'uniqueNavElements', '_resistance', '_resistanceRatio', '_watchSlidesProgress', '_grabCursor', 'preventClicks', 'preventClicksPropagation', '_slideToClickedSlide', '_preloadImages', 'updateOnImagesReady', '_loop', '_loopAdditionalSlides', '_loopedSlides', '_loopFillGroupWithBlank', 'loopPreventsSlide', '_allowSlidePrev', '_allowSlideNext', '_swipeHandler', '_noSwiping', 'noSwipingClass', 'noSwipingSelector', 'passiveListeners', 'containerModifierClass', 'slideClass', 'slideBlankClass', 'slideActiveClass', 'slideDuplicateActiveClass', 'slideVisibleClass', 'slideDuplicateClass', 'slideNextClass', 'slideDuplicateNextClass', 'slidePrevClass', 'slideDuplicatePrevClass', 'wrapperClass', 'runCallbacksOnInit', 'observer', 'observeParents', 'observeSlideChildren', // modules\n'a11y', 'autoplay', '_controller', 'coverflowEffect', 'cubeEffect', 'fadeEffect', 'flipEffect', 'creativeEffect', 'cardsEffect', 'hashNavigation', 'history', 'keyboard', 'lazy', 'mousewheel', '_navigation', '_pagination', 'parallax', '_scrollbar', '_thumbs', '_virtual', 'zoom'];\nexport { paramsList };","import { isObject, extend } from './utils.js';\n\nfunction updateSwiper({\n  swiper,\n  passedParams,\n  changedParams,\n  nextEl,\n  prevEl,\n  scrollbarEl,\n  paginationEl\n}) {\n  const updateParams = changedParams.filter(key => key !== 'children' && key !== 'direction');\n  const {\n    params: currentParams,\n    pagination,\n    navigation,\n    scrollbar,\n    thumbs\n  } = swiper;\n  let needThumbsInit;\n  let needControllerInit;\n  let needPaginationInit;\n  let needScrollbarInit;\n  let needNavigationInit;\n\n  if (changedParams.includes('thumbs') && passedParams.thumbs && passedParams.thumbs.swiper && currentParams.thumbs && !currentParams.thumbs.swiper) {\n    needThumbsInit = true;\n  }\n\n  if (changedParams.includes('controller') && passedParams.controller && passedParams.controller.control && currentParams.controller && !currentParams.controller.control) {\n    needControllerInit = true;\n  }\n\n  if (changedParams.includes('pagination') && passedParams.pagination && (passedParams.pagination.el || paginationEl) && (currentParams.pagination || currentParams.pagination === false) && pagination && !pagination.el) {\n    needPaginationInit = true;\n  }\n\n  if (changedParams.includes('scrollbar') && passedParams.scrollbar && (passedParams.scrollbar.el || scrollbarEl) && (currentParams.scrollbar || currentParams.scrollbar === false) && scrollbar && !scrollbar.el) {\n    needScrollbarInit = true;\n  }\n\n  if (changedParams.includes('navigation') && passedParams.navigation && (passedParams.navigation.prevEl || prevEl) && (passedParams.navigation.nextEl || nextEl) && (currentParams.navigation || currentParams.navigation === false) && navigation && !navigation.prevEl && !navigation.nextEl) {\n    needNavigationInit = true;\n  }\n\n  if (changedParams.includes('virtual')) {\n    if (passedParams.virtual && passedParams.virtual.slides && swiper.virtual) {\n      swiper.virtual.slides = passedParams.virtual.slides;\n      swiper.virtual.update();\n    }\n  }\n\n  const destroyModule = mod => {\n    if (!swiper[mod]) return;\n    swiper[mod].destroy();\n\n    if (mod === 'navigation') {\n      currentParams[mod].prevEl = undefined;\n      currentParams[mod].nextEl = undefined;\n      swiper[mod].prevEl = undefined;\n      swiper[mod].nextEl = undefined;\n    } else {\n      currentParams[mod].el = undefined;\n      swiper[mod].el = undefined;\n    }\n  };\n\n  updateParams.forEach(key => {\n    if (isObject(currentParams[key]) && isObject(passedParams[key])) {\n      extend(currentParams[key], passedParams[key]);\n    } else {\n      const newValue = passedParams[key];\n\n      if ((newValue === true || newValue === false) && (key === 'navigation' || key === 'pagination' || key === 'scrollbar')) {\n        if (newValue === false) {\n          destroyModule(key);\n        }\n      } else {\n        currentParams[key] = passedParams[key];\n      }\n    }\n  });\n\n  if (needThumbsInit) {\n    const initialized = thumbs.init();\n\n    if (initialized) {\n      thumbs.update(true);\n    }\n  }\n\n  if (needControllerInit) {\n    swiper.controller.control = currentParams.controller.control;\n  }\n\n  if (needPaginationInit) {\n    if (paginationEl) currentParams.pagination.el = paginationEl;\n    pagination.init();\n    pagination.render();\n    pagination.update();\n  }\n\n  if (needScrollbarInit) {\n    if (scrollbarEl) currentParams.scrollbar.el = scrollbarEl;\n    scrollbar.init();\n    scrollbar.updateSize();\n    scrollbar.setTranslate();\n  }\n\n  if (needNavigationInit) {\n    if (nextEl) currentParams.navigation.nextEl = nextEl;\n    if (prevEl) currentParams.navigation.prevEl = prevEl;\n    navigation.init();\n    navigation.update();\n  }\n\n  if (changedParams.includes('allowSlideNext')) {\n    swiper.allowSlideNext = passedParams.allowSlideNext;\n  }\n\n  if (changedParams.includes('allowSlidePrev')) {\n    swiper.allowSlidePrev = passedParams.allowSlidePrev;\n  }\n\n  if (changedParams.includes('direction')) {\n    swiper.changeDirection(passedParams.direction, false);\n  }\n\n  swiper.update();\n}\n\nexport { updateSwiper };","<script>\n  import {\n    onMount,\n    onDestroy,\n    afterUpdate,\n    createEventDispatcher,\n    tick,\n    beforeUpdate,\n  } from 'svelte';\n  import { getParams } from './get-params.js';\n  import { initSwiper, mountSwiper } from './init-swiper.js';\n  import {\n    needsScrollbar,\n    needsNavigation,\n    needsPagination,\n    uniqueClasses,\n    extend,\n  } from './utils.js';\n  import { getChangedParams } from './get-changed-params.js';\n  import { updateSwiper } from './update-swiper.js';\n\n  const dispatch = createEventDispatcher();\n\n  let className = undefined;\n  export { className as class };\n\n  let containerClasses = 'swiper';\n  let breakpointChanged = false;\n  let swiperInstance = null;\n  let oldPassedParams = null;\n\n  let paramsData;\n  let swiperParams;\n  let passedParams;\n  let restProps;\n\n  let swiperEl = null;\n  let prevEl = null;\n  let nextEl = null;\n  let scrollbarEl = null;\n  let paginationEl = null;\n  let virtualData = { slides: [] };\n\n  export function swiper() {\n    return swiperInstance;\n  }\n\n  const setVirtualData = (data) => {\n    virtualData = data;\n\n    tick().then(() => {\n      swiperInstance.$wrapperEl.children('.swiper-slide').each((el) => {\n        if (el.onSwiper) el.onSwiper(swiperInstance);\n      });\n      swiperInstance.updateSlides();\n      swiperInstance.updateProgress();\n      swiperInstance.updateSlidesClasses();\n      if (swiperInstance.lazy && swiperInstance.params.lazy.enabled) {\n        swiperInstance.lazy.load();\n      }\n    });\n  };\n\n  const calcParams = () => {\n    paramsData = getParams($$restProps);\n    swiperParams = paramsData.params;\n    passedParams = paramsData.passedParams;\n    restProps = paramsData.rest;\n  };\n\n  calcParams();\n  oldPassedParams = passedParams;\n\n  const onBeforeBreakpoint = () => {\n    breakpointChanged = true;\n  };\n\n  swiperParams.onAny = (event, ...args) => {\n    dispatch(event, [args]);\n  };\n  Object.assign(swiperParams.on, {\n    _beforeBreakpoint: onBeforeBreakpoint,\n    _containerClasses(_swiper, classes) {\n      containerClasses = classes;\n    },\n  });\n\n  swiperInstance = initSwiper(swiperParams);\n  if (swiperInstance.virtual && swiperInstance.params.virtual.enabled) {\n    const extendWith = {\n      cache: false,\n      renderExternal: (data) => {\n        setVirtualData(data);\n        if (swiperParams.virtual && swiperParams.virtual.renderExternal) {\n          swiperParams.virtual.renderExternal(data);\n        }\n      },\n      renderExternalUpdate: false,\n    };\n    extend(swiperInstance.params.virtual, extendWith);\n    extend(swiperInstance.originalParams.virtual, extendWith);\n  }\n\n  onMount(() => {\n    if (!swiperEl) return;\n    mountSwiper(\n      {\n        el: swiperEl,\n        nextEl: nextEl,\n        prevEl: prevEl,\n        paginationEl: paginationEl,\n        scrollbarEl: scrollbarEl,\n        swiper: swiperInstance,\n      },\n      swiperParams,\n    );\n    dispatch('swiper', [swiperInstance]);\n    if (swiperParams.virtual) return;\n    swiperInstance.slides.each((el) => {\n      if (el.onSwiper) el.onSwiper(swiperInstance);\n    });\n  });\n\n  afterUpdate(() => {\n    if (!swiperInstance) return;\n    calcParams();\n\n    const changedParams = getChangedParams(passedParams, oldPassedParams);\n    if (\n      (changedParams.length || breakpointChanged) &&\n      swiperInstance &&\n      !swiperInstance.destroyed\n    ) {\n      updateSwiper({\n        swiper: swiperInstance,\n        passedParams,\n        changedParams,\n        nextEl,\n        prevEl,\n        scrollbarEl,\n        paginationEl,\n      });\n    }\n    breakpointChanged = false;\n    oldPassedParams = passedParams;\n  });\n\n  onDestroy(() => {\n    // eslint-disable-next-line\n    if (typeof window !== 'undefined' && swiperInstance && !swiperInstance.destroyed) {\n      swiperInstance.destroy(true, false);\n    }\n  });\n</script>\n\n<div\n  bind:this={swiperEl}\n  class={uniqueClasses(`${containerClasses}${className ? ` ${className}` : ''}`)}\n  {...restProps}\n>\n  <slot name=\"container-start\" />\n  {#if needsNavigation(swiperParams)}\n    <div bind:this={prevEl} class=\"swiper-button-prev\" />\n    <div bind:this={nextEl} class=\"swiper-button-next\" />\n  {/if}\n  {#if needsScrollbar(swiperParams)}\n    <div bind:this={scrollbarEl} class=\"swiper-scrollbar\" />\n  {/if}\n  {#if needsPagination(swiperParams)}\n    <div bind:this={paginationEl} class=\"swiper-pagination\" />\n  {/if}\n  <div class=\"swiper-wrapper\">\n    <slot name=\"wrapper-start\" />\n    <slot {virtualData} />\n    <slot name=\"wrapper-end\" />\n  </div>\n  <slot name=\"container-end\" />\n</div>\n","import Swiper from 'swiper';\nimport { isObject, extend } from './utils.js';\nimport { paramsList } from './params-list.js';\n\nfunction getParams(obj = {}) {\n  const params = {\n    on: {}\n  };\n  const passedParams = {};\n  extend(params, Swiper.defaults);\n  extend(params, Swiper.extendedDefaults);\n  params._emitClasses = true;\n  params.init = false;\n  const rest = {};\n  const allowedParams = paramsList.map(key => key.replace(/_/, ''));\n  Object.keys(obj).forEach(key => {\n    if (allowedParams.indexOf(key) >= 0) {\n      if (isObject(obj[key])) {\n        params[key] = {};\n        passedParams[key] = {};\n        extend(params[key], obj[key]);\n        extend(passedParams[key], obj[key]);\n      } else {\n        params[key] = obj[key];\n        passedParams[key] = obj[key];\n      }\n    } else if (key.search(/on[A-Z]/) === 0 && typeof obj[key] === 'function') {\n      params.on[`${key[2].toLowerCase()}${key.substr(3)}`] = obj[key];\n    } else {\n      rest[key] = obj[key];\n    }\n  });\n  ['navigation', 'pagination', 'scrollbar'].forEach(key => {\n    if (params[key] === true) params[key] = {};\n    if (params[key] === false) delete params[key];\n  });\n  return {\n    params,\n    passedParams,\n    rest\n  };\n}\n\nexport { getParams };","import Swiper from 'swiper';\nimport { needsNavigation, needsPagination, needsScrollbar } from './utils.js';\n\nfunction initSwiper(swiperParams) {\n  return new Swiper(swiperParams);\n}\n\nfunction mountSwiper({\n  el,\n  nextEl,\n  prevEl,\n  paginationEl,\n  scrollbarEl,\n  swiper\n}, swiperParams) {\n  if (needsNavigation(swiperParams) && nextEl && prevEl) {\n    swiper.params.navigation.nextEl = nextEl;\n    swiper.originalParams.navigation.nextEl = nextEl;\n    swiper.params.navigation.prevEl = prevEl;\n    swiper.originalParams.navigation.prevEl = prevEl;\n  }\n\n  if (needsPagination(swiperParams) && paginationEl) {\n    swiper.params.pagination.el = paginationEl;\n    swiper.originalParams.pagination.el = paginationEl;\n  }\n\n  if (needsScrollbar(swiperParams) && scrollbarEl) {\n    swiper.params.scrollbar.el = scrollbarEl;\n    swiper.originalParams.scrollbar.el = scrollbarEl;\n  }\n\n  swiper.init(el);\n}\n\nexport { initSwiper, mountSwiper };","import { isObject } from './utils.js';\nimport { paramsList } from './params-list.js';\n\nfunction getChangedParams(swiperParams, oldParams) {\n  const keys = [];\n  if (!oldParams) return keys;\n\n  const addKey = key => {\n    if (keys.indexOf(key) < 0) keys.push(key);\n  };\n\n  const watchParams = paramsList.filter(key => key[0] === '_').map(key => key.replace(/_/, ''));\n  watchParams.forEach(key => {\n    if (key in swiperParams && key in oldParams) {\n      if (isObject(swiperParams[key]) && isObject(oldParams[key])) {\n        const newKeys = Object.keys(swiperParams[key]);\n        const oldKeys = Object.keys(oldParams[key]);\n\n        if (newKeys.length !== oldKeys.length) {\n          addKey(key);\n        } else {\n          newKeys.forEach(newKey => {\n            if (swiperParams[key][newKey] !== oldParams[key][newKey]) {\n              addKey(key);\n            }\n          });\n          oldKeys.forEach(oldKey => {\n            if (swiperParams[key][oldKey] !== oldParams[key][oldKey]) addKey(key);\n          });\n        }\n      } else if (swiperParams[key] !== oldParams[key]) {\n        addKey(key);\n      }\n    }\n  });\n  return keys;\n}\n\nexport { getChangedParams };","<script>\n  import { onMount, onDestroy, beforeUpdate, afterUpdate } from 'svelte';\n  import { uniqueClasses } from './utils.js';\n\n  export let zoom = undefined;\n  export let virtualIndex = undefined;\n\n  let className = undefined;\n  export { className as class };\n\n  let slideEl = null;\n  let slideClasses = 'swiper-slide';\n\n  let swiper = null;\n  let eventAttached = false;\n\n  const updateClasses = (_, el, classNames) => {\n    if (el === slideEl) {\n      slideClasses = classNames;\n    }\n  };\n\n  const attachEvent = () => {\n    if (!swiper || eventAttached) return;\n    swiper.on('_slideClass', updateClasses);\n    eventAttached = true;\n  };\n\n  const detachEvent = () => {\n    if (!swiper) return;\n    swiper.off('_slideClass', updateClasses);\n    eventAttached = false;\n  };\n\n  $: slideData = {\n    isActive:\n      slideClasses.indexOf('swiper-slide-active') >= 0 ||\n      slideClasses.indexOf('swiper-slide-duplicate-active') >= 0,\n    isVisible: slideClasses.indexOf('swiper-slide-visible') >= 0,\n    isDuplicate: slideClasses.indexOf('swiper-slide-duplicate') >= 0,\n    isPrev:\n      slideClasses.indexOf('swiper-slide-prev') >= 0 ||\n      slideClasses.indexOf('swiper-slide-duplicate-prev') >= 0,\n    isNext:\n      slideClasses.indexOf('swiper-slide-next') >= 0 ||\n      slideClasses.indexOf('swiper-slide-duplicate-next') >= 0,\n  };\n\n  onMount(() => {\n    if (typeof virtualIndex === 'undefined') return;\n    slideEl.onSwiper = (_swiper) => {\n      swiper = _swiper;\n      attachEvent();\n    };\n    attachEvent();\n  });\n\n  afterUpdate(() => {\n    if (!slideEl || !swiper) return;\n    if (swiper.destroyed) {\n      if (slideClasses !== 'swiper-slide') {\n        slideClasses = 'swiper-slide';\n      }\n      return;\n    }\n    attachEvent();\n  });\n\n  beforeUpdate(() => {\n    attachEvent();\n  });\n\n  onDestroy(() => {\n    if (!swiper) return;\n    detachEvent();\n  });\n</script>\n\n<div\n  bind:this={slideEl}\n  class={uniqueClasses(`${slideClasses}${className ? ` ${className}` : ''}`)}\n  data-swiper-slide-index={virtualIndex}\n  {...$$restProps}\n>\n  {#if zoom}\n    <div\n      class=\"swiper-zoom-container\"\n      data-swiper-zoom={typeof zoom === 'number' ? zoom : undefined}\n    >\n      <slot data={slideData} />\n    </div>\n  {:else}\n    <slot data={slideData} />\n  {/if}\n</div>\n","export function searchFilter(player, searchString){\n    return player.name.toLowerCase().includes(searchString.toLowerCase());\n}\nexport function positionFilter(player, pos_filter){\n    return pos_filter === \"all\" || player.positions.includes(pos_filter);\n}\nexport function getTeams(games) {\n    let teams = [];\n    //iterate through games and add teams\n    for(let i = 0; i < games.length; i++) {\n        let game = games[i];\n        let home_team = game.home_team;\n        let away_team = game.away_team;\n        if(!teams.includes(home_team)) {\n            teams.push(home_team);\n        }\n        if(!teams.includes(away_team)) {\n            teams.push(away_team);\n        }\n    }\n    //sort teams by property short_name\n    teams.sort(function(a, b) {\n        return a.short_name.localeCompare(b.short_name);\n    });\n    return teams;\n}\nexport function filterByTeam(playerTeam, selectedTeam){\n    if(playerTeam == selectedTeam || selectedTeam == \"all\") {\n        return true;\n    } else {\n        return false;\n    }\n}\nexport function gameStrings(games) {\n    let gameStrings = {};\n    for(let i = 0; i < games.length; i++) {\n        let game = games[i];\n        gameStrings[game.away_team.short_name] = `<b>${game.away_team.short_name}</b> @ ${game.home_team.short_name}`;\n        gameStrings[game.home_team.short_name] = `${game.away_team.short_name} @ <b>${game.home_team.short_name}</b>`;\n    }\n    return gameStrings;\n}","<script>\n    export let home_team;\n    export let away_team;\n    export let game_time;\n    game_time = new Date(game_time);\n</script>\n<div class=\"card mb-4 p-2 text-center\">\n    <div class=\"d-flex flex-column\">\n        <div class=\"home-team d-flex align-items-center\">\n            <img style=\"aspect-ratio: 1/1;\" loading=\"lazy\" class=\"w-25 h-25\" src=\"{home_team.logo}\" alt=\"{home_team.short_name} logo\">\n            <div class=\"display-6\">{home_team.short_name}</div>\n        </div>\n        <div class=\"away-team d-flex align-items-center\">\n            <img style=\"aspect-ratio: 1/1;\" loading=\"lazy\" class=\"w-25 h-25\" src=\"{away_team.logo}\" alt=\"{away_team.short_name} logo\">\n            <div class=\"display-6\">{away_team.short_name}</div>\n        </div>\n    </div>\n</div>","<script>\n    export let lineup_details;\n</script>\n<div id=\"lineup-holder\" class=\"card border shadow\" style=\"border-radius: 10px;\">\n    <div class=\"d-flex h4 bold text-center border-bottom py-2\">\n        <div id=\"salary-summary\" class=\"px-3\">\n            <div>Salary</div>\n            <div>${lineup_details.salary}</div>\n        </div>\n        <div id=\"fp-summary\" class=\"px-3\">\n            <div>Projection</div>\n            <div>{lineup_details.fantasy_points} FP</div>\n        </div>\n    </div>\n    <div class=\"d-flex flex-column\">\n        {#each Object.entries(lineup_details.lineup) as [pos, player]}\n        {#if player}\n            <div class=\"hidden-border roster-slot d-flex border-bottom align-items-center\">\n                <div class=\"display-5 col-4\"><img alt=\"{player.name}\" onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\" height=\"70\" src=\"{player.img_thumb}\"></div>\n                <div class=\"col-8 h6 my-0 d-flex align-items-center\">\n                    <div class=\"d-flex flex-column\">\n                        <div>{player.name}\n                            {#if player.inj_tag == \"O\"}\n                            <span class=\"badge bg-danger\">OUT</span>\n                            {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                            <span class=\"badge bg-warning\">{player.inj_tag}</span>\n                            {/if}\n                        </div>\n                        <div><span class=\"text-success\">💸{player.salary.toLocaleString()}</span> | <span class=\"text-primary\">{player.proj}</span></div>\n                    </div>\n                </div>\n            </div>\n        {/if}\n        {/each}\n    </div>\n</div>","<script>\n    export let index;\n    export let player_name;\n    export let player_image;\n    export let positions;\n    export let salary;\n    export let projection;\n    export let included;\n    export let rosterPlayer;\n    export let excludePlayer;\n    export let includePlayer;\n    export let rosterable = \"\";\n    export let inj_tag = \"H\";\n    export let game_details;\n    export let player;\n    export let showPlayerModal;\n</script>\n<style>\n    .unrosterable{\n        opacity: 0.5;\n    }\n</style>\n<div class=\"{rosterable} row border-top border-start border-end\">\n    <div class=\"col-9\">\n        <div class=\"row\">\n            <div class=\"col-4 pt-1 mt-auto px-0 text-center\">\n                <img alt=\"{player_name}\" style=\"object-fit: contain;\" loading=\"lazy\" height=\"65\" width=\"89\" src=\"{player_image}\" onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\">\n            </div>\n            <div class=\"col-8\">\n                <div class=\"d-flex flex-column\">\n                    <div style=\"cursor: pointer;\" on:click={()=>{showPlayerModal(player)}}>\n                        <span class=\"bg-light px-1 border\">{positions}</span> <span class=\"text-primary fw-normal\">{player_name}</span>\n                    </div>\n                </div>\n                <div>\n                    <span class=\"text-success\">💸{salary.toLocaleString()}</span> | \n                    <span class=\"text-primary\">📊{projection}</span>\n                    <span>\n                        {#if inj_tag == \"O\"}\n                        <span class=\"badge bg-danger\">OUT</span>\n                        {:else if inj_tag == \"Q\" || inj_tag == \"D\" || inj_tag == \"GTD\"}\n                        <span class=\"badge bg-warning\">{inj_tag}</span>\n                        {/if}\n                    </span>\n                </div>\n                <div>\n                    <span class=\"text-secondary\">{@html game_details}</span>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div class=\"col-3 p-0 pe-1 my-auto ms-auto\">\n        <div>\n            <div class=\"flex-wrap btn-group w-100 shadow\" role=\"group\" aria-label=\"Basic example\">\n                {#if included}\n                <button on:click={()=>rosterPlayer(index)} type=\"button\" class=\"btn btn-primary\">🔒</button>\n                <button on:click={()=>excludePlayer(index)} type=\"button\" class=\"btn btn-danger\">✖️</button>\n                {:else}\n                <button on:click={()=>includePlayer(index)} type=\"button\" class=\"btn btn-success\">✔️</button>\n                {/if}\n            </div>\n        </div>\n    </div>\n</div>","/** \n * Box-Muller implementation\n * https://en.wikipedia.org/wiki/Box%E2%80%93Muller_transform\n */\n\n(function(exports){\n  const PRECISION = 1e9;\n  const _2PI = Math.PI * 2;\n  function generateGaussian(mean,std){\n    var u1 = Math.random();\n    var u2 = Math.random();\n    \n    var z0 = Math.sqrt(-2.0 * Math.log(u1)) * Math.cos(_2PI * u2);\n    var z1 = Math.sqrt(-2.0 * Math.log(u1)) * Math.sin(_2PI * u2);\n\n    return z0 * std + mean;\n  }\n\n  exports(generateGaussian)\n})\n(typeof(exports) !== \"undefined\"\n    ? function(e) { module.exports = e; }\n    : function(e) { this[\"boxmuller\"] = e; });\n  \n","(function(exports) {\n\n  const generateGaussian = require('./box-muller');\n\n  // Complementary error function\n  // From Numerical Recipes in C 2e p221\n  var erfc = function(x) {\n    var z = Math.abs(x);\n    var t = 1 / (1 + z / 2);\n    var r = t * Math.exp(-z * z - 1.26551223 + t * (1.00002368 +\n            t * (0.37409196 + t * (0.09678418 + t * (-0.18628806 +\n            t * (0.27886807 + t * (-1.13520398 + t * (1.48851587 +\n            t * (-0.82215223 + t * 0.17087277)))))))))\n    return x >= 0 ? r : 2 - r;\n  };\n\n  // Inverse complementary error function\n  // From Numerical Recipes 3e p265\n  var ierfc = function(x) {\n    if (x >= 2) { return -100; }\n    if (x <= 0) { return 100; }\n\n    var xx = (x < 1) ? x : 2 - x;\n    var t = Math.sqrt(-2 * Math.log(xx / 2));\n\n    var r = -0.70711 * ((2.30753 + t * 0.27061) /\n            (1 + t * (0.99229 + t * 0.04481)) - t);\n\n    for (var j = 0; j < 2; j++) {\n      var err = erfc(r) - xx;\n      r += err / (1.12837916709551257 * Math.exp(-(r * r)) - r * err);\n    }\n\n    return (x < 1) ? r : -r;\n  };\n\n  // Models the normal distribution\n  var Gaussian = function(mean, variance) {\n    if (variance <= 0) {\n      throw new Error('Variance must be > 0 (but was ' + variance + ')');\n    }\n    this.mean = mean;\n    this.variance = variance;\n    this.standardDeviation = Math.sqrt(variance);\n  }\n\n  // Probability density function\n  Gaussian.prototype.pdf = function(x) {\n    var m = this.standardDeviation * Math.sqrt(2 * Math.PI);\n    var e = Math.exp(-Math.pow(x - this.mean, 2) / (2 * this.variance));\n    return e / m;\n  };\n\n  // Cumulative density function\n  Gaussian.prototype.cdf = function(x) {\n    return 0.5 * erfc(-(x - this.mean) / (this.standardDeviation * Math.sqrt(2)));\n  };\n\n  // Percent point function\n  Gaussian.prototype.ppf = function(x) {\n    return this.mean - this.standardDeviation * Math.sqrt(2) * ierfc(2 * x);\n  };\n\n  // Product distribution of this and d (scale for constant)\n  Gaussian.prototype.mul = function(d) {\n    if (typeof(d) === \"number\") {\n      return this.scale(d);\n    }\n    var precision = 1 / this.variance;\n    var dprecision = 1 / d.variance;\n    return fromPrecisionMean(\n        precision + dprecision, \n        precision * this.mean + dprecision * d.mean);\n  };\n\n  // Quotient distribution of this and d (scale for constant)\n  Gaussian.prototype.div = function(d) {\n    if (typeof(d) === \"number\") {\n      return this.scale(1 / d);\n    }\n    var precision = 1 / this.variance;\n    var dprecision = 1 / d.variance;\n    return fromPrecisionMean(\n        precision - dprecision, \n        precision * this.mean - dprecision * d.mean);\n  };\n\n  // Addition of this and d\n  Gaussian.prototype.add = function(d) {\n    return gaussian(this.mean + d.mean, this.variance + d.variance);\n  };\n\n  // Subtraction of this and d\n  Gaussian.prototype.sub = function(d) {\n    return gaussian(this.mean - d.mean, this.variance + d.variance);\n  };\n\n  // Scale this by constant c\n  Gaussian.prototype.scale = function(c) {\n    return gaussian(this.mean * c, this.variance * c * c);\n  };\n\n  // Generate [num] random samples\n  Gaussian.prototype.random = function(num){\n    let mean = this.mean;\n    let std = this.standardDeviation;\n    return Array(num).fill(0).map(() => {\n      return generateGaussian(mean,std)\n    })\n  };\n\n  var gaussian = function(mean, variance) {\n    return new Gaussian(mean, variance);\n  };\n\n  var fromPrecisionMean = function(precision, precisionmean) {\n    return gaussian(precisionmean / precision, 1 / precision);\n  };\n\n  exports(gaussian);\n})\n(typeof(exports) !== \"undefined\"\n    ? function(e) { module.exports = e; }\n    : function(e) { this[\"gaussian\"] = e; });\n","/*!\n * Chart.js v3.7.1\n * https://www.chartjs.org\n * (c) 2022 Chart.js Contributors\n * Released under the MIT License\n */\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n  return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\nconst requestAnimFrame = (function() {\n  if (typeof window === 'undefined') {\n    return function(callback) {\n      return callback();\n    };\n  }\n  return window.requestAnimationFrame;\n}());\nfunction throttled(fn, thisArg, updateFn) {\n  const updateArgs = updateFn || ((args) => Array.prototype.slice.call(args));\n  let ticking = false;\n  let args = [];\n  return function(...rest) {\n    args = updateArgs(rest);\n    if (!ticking) {\n      ticking = true;\n      requestAnimFrame.call(window, () => {\n        ticking = false;\n        fn.apply(thisArg, args);\n      });\n    }\n  };\n}\nfunction debounce(fn, delay) {\n  let timeout;\n  return function(...args) {\n    if (delay) {\n      clearTimeout(timeout);\n      timeout = setTimeout(fn, delay, args);\n    } else {\n      fn.apply(this, args);\n    }\n    return delay;\n  };\n}\nconst _toLeftRightCenter = (align) => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\nconst _alignStartEnd = (align, start, end) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\nconst _textX = (align, left, right, rtl) => {\n  const check = rtl ? 'left' : 'right';\n  return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\nfunction noop() {}\nconst uid = (function() {\n  let id = 0;\n  return function() {\n    return id++;\n  };\n}());\nfunction isNullOrUndef(value) {\n  return value === null || typeof value === 'undefined';\n}\nfunction isArray(value) {\n  if (Array.isArray && Array.isArray(value)) {\n    return true;\n  }\n  const type = Object.prototype.toString.call(value);\n  if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n    return true;\n  }\n  return false;\n}\nfunction isObject(value) {\n  return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\nconst isNumberFinite = (value) => (typeof value === 'number' || value instanceof Number) && isFinite(+value);\nfunction finiteOrDefault(value, defaultValue) {\n  return isNumberFinite(value) ? value : defaultValue;\n}\nfunction valueOrDefault(value, defaultValue) {\n  return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension) =>\n  typeof value === 'string' && value.endsWith('%') ?\n    parseFloat(value) / 100\n    : value / dimension;\nconst toDimension = (value, dimension) =>\n  typeof value === 'string' && value.endsWith('%') ?\n    parseFloat(value) / 100 * dimension\n    : +value;\nfunction callback(fn, args, thisArg) {\n  if (fn && typeof fn.call === 'function') {\n    return fn.apply(thisArg, args);\n  }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n  let i, len, keys;\n  if (isArray(loopable)) {\n    len = loopable.length;\n    if (reverse) {\n      for (i = len - 1; i >= 0; i--) {\n        fn.call(thisArg, loopable[i], i);\n      }\n    } else {\n      for (i = 0; i < len; i++) {\n        fn.call(thisArg, loopable[i], i);\n      }\n    }\n  } else if (isObject(loopable)) {\n    keys = Object.keys(loopable);\n    len = keys.length;\n    for (i = 0; i < len; i++) {\n      fn.call(thisArg, loopable[keys[i]], keys[i]);\n    }\n  }\n}\nfunction _elementsEqual(a0, a1) {\n  let i, ilen, v0, v1;\n  if (!a0 || !a1 || a0.length !== a1.length) {\n    return false;\n  }\n  for (i = 0, ilen = a0.length; i < ilen; ++i) {\n    v0 = a0[i];\n    v1 = a1[i];\n    if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n      return false;\n    }\n  }\n  return true;\n}\nfunction clone$1(source) {\n  if (isArray(source)) {\n    return source.map(clone$1);\n  }\n  if (isObject(source)) {\n    const target = Object.create(null);\n    const keys = Object.keys(source);\n    const klen = keys.length;\n    let k = 0;\n    for (; k < klen; ++k) {\n      target[keys[k]] = clone$1(source[keys[k]]);\n    }\n    return target;\n  }\n  return source;\n}\nfunction isValidKey(key) {\n  return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\nfunction _merger(key, target, source, options) {\n  if (!isValidKey(key)) {\n    return;\n  }\n  const tval = target[key];\n  const sval = source[key];\n  if (isObject(tval) && isObject(sval)) {\n    merge(tval, sval, options);\n  } else {\n    target[key] = clone$1(sval);\n  }\n}\nfunction merge(target, source, options) {\n  const sources = isArray(source) ? source : [source];\n  const ilen = sources.length;\n  if (!isObject(target)) {\n    return target;\n  }\n  options = options || {};\n  const merger = options.merger || _merger;\n  for (let i = 0; i < ilen; ++i) {\n    source = sources[i];\n    if (!isObject(source)) {\n      continue;\n    }\n    const keys = Object.keys(source);\n    for (let k = 0, klen = keys.length; k < klen; ++k) {\n      merger(keys[k], target, source, options);\n    }\n  }\n  return target;\n}\nfunction mergeIf(target, source) {\n  return merge(target, source, {merger: _mergerIf});\n}\nfunction _mergerIf(key, target, source) {\n  if (!isValidKey(key)) {\n    return;\n  }\n  const tval = target[key];\n  const sval = source[key];\n  if (isObject(tval) && isObject(sval)) {\n    mergeIf(tval, sval);\n  } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n    target[key] = clone$1(sval);\n  }\n}\nfunction _deprecated(scope, value, previous, current) {\n  if (value !== undefined) {\n    console.warn(scope + ': \"' + previous +\n\t\t\t'\" is deprecated. Please use \"' + current + '\" instead');\n  }\n}\nconst emptyString = '';\nconst dot = '.';\nfunction indexOfDotOrLength(key, start) {\n  const idx = key.indexOf(dot, start);\n  return idx === -1 ? key.length : idx;\n}\nfunction resolveObjectKey(obj, key) {\n  if (key === emptyString) {\n    return obj;\n  }\n  let pos = 0;\n  let idx = indexOfDotOrLength(key, pos);\n  while (obj && idx > pos) {\n    obj = obj[key.substr(pos, idx - pos)];\n    pos = idx + 1;\n    idx = indexOfDotOrLength(key, pos);\n  }\n  return obj;\n}\nfunction _capitalize(str) {\n  return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value) => typeof value !== 'undefined';\nconst isFunction = (value) => typeof value === 'function';\nconst setsEqual = (a, b) => {\n  if (a.size !== b.size) {\n    return false;\n  }\n  for (const item of a) {\n    if (!b.has(item)) {\n      return false;\n    }\n  }\n  return true;\n};\nfunction _isClickEvent(e) {\n  return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\nconst PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction niceNum(range) {\n  const roundedRange = Math.round(range);\n  range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n  const niceRange = Math.pow(10, Math.floor(log10(range)));\n  const fraction = range / niceRange;\n  const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n  return niceFraction * niceRange;\n}\nfunction _factorize(value) {\n  const result = [];\n  const sqrt = Math.sqrt(value);\n  let i;\n  for (i = 1; i < sqrt; i++) {\n    if (value % i === 0) {\n      result.push(i);\n      result.push(value / i);\n    }\n  }\n  if (sqrt === (sqrt | 0)) {\n    result.push(sqrt);\n  }\n  result.sort((a, b) => a - b).pop();\n  return result;\n}\nfunction isNumber(n) {\n  return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostEquals(x, y, epsilon) {\n  return Math.abs(x - y) < epsilon;\n}\nfunction almostWhole(x, epsilon) {\n  const rounded = Math.round(x);\n  return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\nfunction _setMinAndMaxByKey(array, target, property) {\n  let i, ilen, value;\n  for (i = 0, ilen = array.length; i < ilen; i++) {\n    value = array[i][property];\n    if (!isNaN(value)) {\n      target.min = Math.min(target.min, value);\n      target.max = Math.max(target.max, value);\n    }\n  }\n}\nfunction toRadians(degrees) {\n  return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n  return radians * (180 / PI);\n}\nfunction _decimalPlaces(x) {\n  if (!isNumberFinite(x)) {\n    return;\n  }\n  let e = 1;\n  let p = 0;\n  while (Math.round(x * e) / e !== x) {\n    e *= 10;\n    p++;\n  }\n  return p;\n}\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n  const distanceFromXCenter = anglePoint.x - centrePoint.x;\n  const distanceFromYCenter = anglePoint.y - centrePoint.y;\n  const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n  let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n  if (angle < (-0.5 * PI)) {\n    angle += TAU;\n  }\n  return {\n    angle,\n    distance: radialDistanceFromCenter\n  };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n  return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\nfunction _angleDiff(a, b) {\n  return (a - b + PITAU) % TAU - PI;\n}\nfunction _normalizeAngle(a) {\n  return (a % TAU + TAU) % TAU;\n}\nfunction _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n  const a = _normalizeAngle(angle);\n  const s = _normalizeAngle(start);\n  const e = _normalizeAngle(end);\n  const angleToStart = _normalizeAngle(s - a);\n  const angleToEnd = _normalizeAngle(e - a);\n  const startToAngle = _normalizeAngle(a - s);\n  const endToAngle = _normalizeAngle(a - e);\n  return a === s || a === e || (sameAngleIsFullCircle && s === e)\n    || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\nfunction _limitValue(value, min, max) {\n  return Math.max(min, Math.min(max, value));\n}\nfunction _int16Range(value) {\n  return _limitValue(value, -32768, 32767);\n}\nfunction _isBetween(value, start, end, epsilon = 1e-6) {\n  return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nconst atEdge = (t) => t === 0 || t === 1;\nconst elasticIn = (t, s, p) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\nconst effects = {\n  linear: t => t,\n  easeInQuad: t => t * t,\n  easeOutQuad: t => -t * (t - 2),\n  easeInOutQuad: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t\n    : -0.5 * ((--t) * (t - 2) - 1),\n  easeInCubic: t => t * t * t,\n  easeOutCubic: t => (t -= 1) * t * t + 1,\n  easeInOutCubic: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t\n    : 0.5 * ((t -= 2) * t * t + 2),\n  easeInQuart: t => t * t * t * t,\n  easeOutQuart: t => -((t -= 1) * t * t * t - 1),\n  easeInOutQuart: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t * t\n    : -0.5 * ((t -= 2) * t * t * t - 2),\n  easeInQuint: t => t * t * t * t * t,\n  easeOutQuint: t => (t -= 1) * t * t * t * t + 1,\n  easeInOutQuint: t => ((t /= 0.5) < 1)\n    ? 0.5 * t * t * t * t * t\n    : 0.5 * ((t -= 2) * t * t * t * t + 2),\n  easeInSine: t => -Math.cos(t * HALF_PI) + 1,\n  easeOutSine: t => Math.sin(t * HALF_PI),\n  easeInOutSine: t => -0.5 * (Math.cos(PI * t) - 1),\n  easeInExpo: t => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n  easeOutExpo: t => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n  easeInOutExpo: t => atEdge(t) ? t : t < 0.5\n    ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n    : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n  easeInCirc: t => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n  easeOutCirc: t => Math.sqrt(1 - (t -= 1) * t),\n  easeInOutCirc: t => ((t /= 0.5) < 1)\n    ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n    : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n  easeInElastic: t => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n  easeOutElastic: t => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n  easeInOutElastic(t) {\n    const s = 0.1125;\n    const p = 0.45;\n    return atEdge(t) ? t :\n      t < 0.5\n        ? 0.5 * elasticIn(t * 2, s, p)\n        : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n  },\n  easeInBack(t) {\n    const s = 1.70158;\n    return t * t * ((s + 1) * t - s);\n  },\n  easeOutBack(t) {\n    const s = 1.70158;\n    return (t -= 1) * t * ((s + 1) * t + s) + 1;\n  },\n  easeInOutBack(t) {\n    let s = 1.70158;\n    if ((t /= 0.5) < 1) {\n      return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n    }\n    return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n  },\n  easeInBounce: t => 1 - effects.easeOutBounce(1 - t),\n  easeOutBounce(t) {\n    const m = 7.5625;\n    const d = 2.75;\n    if (t < (1 / d)) {\n      return m * t * t;\n    }\n    if (t < (2 / d)) {\n      return m * (t -= (1.5 / d)) * t + 0.75;\n    }\n    if (t < (2.5 / d)) {\n      return m * (t -= (2.25 / d)) * t + 0.9375;\n    }\n    return m * (t -= (2.625 / d)) * t + 0.984375;\n  },\n  easeInOutBounce: t => (t < 0.5)\n    ? effects.easeInBounce(t * 2) * 0.5\n    : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n};\n\n/*!\n * @kurkle/color v0.1.9\n * https://github.com/kurkle/color#readme\n * (c) 2020 Jukka Kurkela\n * Released under the MIT License\n */\nconst map = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = '0123456789ABCDEF';\nconst h1 = (b) => hex[b & 0xF];\nconst h2 = (b) => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = (b) => (((b & 0xF0) >> 4) === (b & 0xF));\nfunction isShort(v) {\n\treturn eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\n}\nfunction hexParse(str) {\n\tvar len = str.length;\n\tvar ret;\n\tif (str[0] === '#') {\n\t\tif (len === 4 || len === 5) {\n\t\t\tret = {\n\t\t\t\tr: 255 & map[str[1]] * 17,\n\t\t\t\tg: 255 & map[str[2]] * 17,\n\t\t\t\tb: 255 & map[str[3]] * 17,\n\t\t\t\ta: len === 5 ? map[str[4]] * 17 : 255\n\t\t\t};\n\t\t} else if (len === 7 || len === 9) {\n\t\t\tret = {\n\t\t\t\tr: map[str[1]] << 4 | map[str[2]],\n\t\t\t\tg: map[str[3]] << 4 | map[str[4]],\n\t\t\t\tb: map[str[5]] << 4 | map[str[6]],\n\t\t\t\ta: len === 9 ? (map[str[7]] << 4 | map[str[8]]) : 255\n\t\t\t};\n\t\t}\n\t}\n\treturn ret;\n}\nfunction hexString(v) {\n\tvar f = isShort(v) ? h1 : h2;\n\treturn v\n\t\t? '#' + f(v.r) + f(v.g) + f(v.b) + (v.a < 255 ? f(v.a) : '')\n\t\t: v;\n}\nfunction round(v) {\n\treturn v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n\treturn lim(round(v * 2.55), 0, 255);\n}\nfunction n2b(v) {\n\treturn lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n\treturn lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n\treturn lim(round(v * 100), 0, 100);\n}\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n\tconst m = RGB_RE.exec(str);\n\tlet a = 255;\n\tlet r, g, b;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[7] !== r) {\n\t\tconst v = +m[7];\n\t\ta = 255 & (m[8] ? p2b(v) : v * 255);\n\t}\n\tr = +m[1];\n\tg = +m[3];\n\tb = +m[5];\n\tr = 255 & (m[2] ? p2b(r) : r);\n\tg = 255 & (m[4] ? p2b(g) : g);\n\tb = 255 & (m[6] ? p2b(b) : b);\n\treturn {\n\t\tr: r,\n\t\tg: g,\n\t\tb: b,\n\t\ta: a\n\t};\n}\nfunction rgbString(v) {\n\treturn v && (\n\t\tv.a < 255\n\t\t\t? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n\t\t\t: `rgb(${v.r}, ${v.g}, ${v.b})`\n\t);\n}\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n\tconst a = s * Math.min(l, 1 - l);\n\tconst f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\treturn [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n\tconst f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n\treturn [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n\tconst rgb = hsl2rgbn(h, 1, 0.5);\n\tlet i;\n\tif (w + b > 1) {\n\t\ti = 1 / (w + b);\n\t\tw *= i;\n\t\tb *= i;\n\t}\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] *= 1 - w - b;\n\t\trgb[i] += w;\n\t}\n\treturn rgb;\n}\nfunction rgb2hsl(v) {\n\tconst range = 255;\n\tconst r = v.r / range;\n\tconst g = v.g / range;\n\tconst b = v.b / range;\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tconst l = (max + min) / 2;\n\tlet h, s, d;\n\tif (max !== min) {\n\t\td = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\th = max === r\n\t\t\t? ((g - b) / d) + (g < b ? 6 : 0)\n\t\t\t: max === g\n\t\t\t\t? (b - r) / d + 2\n\t\t\t\t: (r - g) / d + 4;\n\t\th = h * 60 + 0.5;\n\t}\n\treturn [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n\treturn (\n\t\tArray.isArray(a)\n\t\t\t? f(a[0], a[1], a[2])\n\t\t\t: f(a, b, c)\n\t).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n\treturn calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n\treturn calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n\treturn calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n\treturn (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n\tconst m = HUE_RE.exec(str);\n\tlet a = 255;\n\tlet v;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[5] !== v) {\n\t\ta = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n\t}\n\tconst h = hue(+m[2]);\n\tconst p1 = +m[3] / 100;\n\tconst p2 = +m[4] / 100;\n\tif (m[1] === 'hwb') {\n\t\tv = hwb2rgb(h, p1, p2);\n\t} else if (m[1] === 'hsv') {\n\t\tv = hsv2rgb(h, p1, p2);\n\t} else {\n\t\tv = hsl2rgb(h, p1, p2);\n\t}\n\treturn {\n\t\tr: v[0],\n\t\tg: v[1],\n\t\tb: v[2],\n\t\ta: a\n\t};\n}\nfunction rotate(v, deg) {\n\tvar h = rgb2hsl(v);\n\th[0] = hue(h[0] + deg);\n\th = hsl2rgb(h);\n\tv.r = h[0];\n\tv.g = h[1];\n\tv.b = h[2];\n}\nfunction hslString(v) {\n\tif (!v) {\n\t\treturn;\n\t}\n\tconst a = rgb2hsl(v);\n\tconst h = a[0];\n\tconst s = n2p(a[1]);\n\tconst l = n2p(a[2]);\n\treturn v.a < 255\n\t\t? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n\t\t: `hsl(${h}, ${s}%, ${l}%)`;\n}\nconst map$1 = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n\tconst unpacked = {};\n\tconst keys = Object.keys(names);\n\tconst tkeys = Object.keys(map$1);\n\tlet i, j, k, ok, nk;\n\tfor (i = 0; i < keys.length; i++) {\n\t\tok = nk = keys[i];\n\t\tfor (j = 0; j < tkeys.length; j++) {\n\t\t\tk = tkeys[j];\n\t\t\tnk = nk.replace(k, map$1[k]);\n\t\t}\n\t\tk = parseInt(names[ok], 16);\n\t\tunpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n\t}\n\treturn unpacked;\n}\nlet names$1;\nfunction nameParse(str) {\n\tif (!names$1) {\n\t\tnames$1 = unpack();\n\t\tnames$1.transparent = [0, 0, 0, 0];\n\t}\n\tconst a = names$1[str.toLowerCase()];\n\treturn a && {\n\t\tr: a[0],\n\t\tg: a[1],\n\t\tb: a[2],\n\t\ta: a.length === 4 ? a[3] : 255\n\t};\n}\nfunction modHSL(v, i, ratio) {\n\tif (v) {\n\t\tlet tmp = rgb2hsl(v);\n\t\ttmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n\t\ttmp = hsl2rgb(tmp);\n\t\tv.r = tmp[0];\n\t\tv.g = tmp[1];\n\t\tv.b = tmp[2];\n\t}\n}\nfunction clone(v, proto) {\n\treturn v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n\tvar v = {r: 0, g: 0, b: 0, a: 255};\n\tif (Array.isArray(input)) {\n\t\tif (input.length >= 3) {\n\t\t\tv = {r: input[0], g: input[1], b: input[2], a: 255};\n\t\t\tif (input.length > 3) {\n\t\t\t\tv.a = n2b(input[3]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tv = clone(input, {r: 0, g: 0, b: 0, a: 1});\n\t\tv.a = n2b(v.a);\n\t}\n\treturn v;\n}\nfunction functionParse(str) {\n\tif (str.charAt(0) === 'r') {\n\t\treturn rgbParse(str);\n\t}\n\treturn hueParse(str);\n}\nclass Color {\n\tconstructor(input) {\n\t\tif (input instanceof Color) {\n\t\t\treturn input;\n\t\t}\n\t\tconst type = typeof input;\n\t\tlet v;\n\t\tif (type === 'object') {\n\t\t\tv = fromObject(input);\n\t\t} else if (type === 'string') {\n\t\t\tv = hexParse(input) || nameParse(input) || functionParse(input);\n\t\t}\n\t\tthis._rgb = v;\n\t\tthis._valid = !!v;\n\t}\n\tget valid() {\n\t\treturn this._valid;\n\t}\n\tget rgb() {\n\t\tvar v = clone(this._rgb);\n\t\tif (v) {\n\t\t\tv.a = b2n(v.a);\n\t\t}\n\t\treturn v;\n\t}\n\tset rgb(obj) {\n\t\tthis._rgb = fromObject(obj);\n\t}\n\trgbString() {\n\t\treturn this._valid ? rgbString(this._rgb) : this._rgb;\n\t}\n\thexString() {\n\t\treturn this._valid ? hexString(this._rgb) : this._rgb;\n\t}\n\thslString() {\n\t\treturn this._valid ? hslString(this._rgb) : this._rgb;\n\t}\n\tmix(color, weight) {\n\t\tconst me = this;\n\t\tif (color) {\n\t\t\tconst c1 = me.rgb;\n\t\t\tconst c2 = color.rgb;\n\t\t\tlet w2;\n\t\t\tconst p = weight === w2 ? 0.5 : weight;\n\t\t\tconst w = 2 * p - 1;\n\t\t\tconst a = c1.a - c2.a;\n\t\t\tconst w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\t\tw2 = 1 - w1;\n\t\t\tc1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n\t\t\tc1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n\t\t\tc1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n\t\t\tc1.a = p * c1.a + (1 - p) * c2.a;\n\t\t\tme.rgb = c1;\n\t\t}\n\t\treturn me;\n\t}\n\tclone() {\n\t\treturn new Color(this.rgb);\n\t}\n\talpha(a) {\n\t\tthis._rgb.a = n2b(a);\n\t\treturn this;\n\t}\n\tclearer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 - ratio;\n\t\treturn this;\n\t}\n\tgreyscale() {\n\t\tconst rgb = this._rgb;\n\t\tconst val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n\t\trgb.r = rgb.g = rgb.b = val;\n\t\treturn this;\n\t}\n\topaquer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 + ratio;\n\t\treturn this;\n\t}\n\tnegate() {\n\t\tconst v = this._rgb;\n\t\tv.r = 255 - v.r;\n\t\tv.g = 255 - v.g;\n\t\tv.b = 255 - v.b;\n\t\treturn this;\n\t}\n\tlighten(ratio) {\n\t\tmodHSL(this._rgb, 2, ratio);\n\t\treturn this;\n\t}\n\tdarken(ratio) {\n\t\tmodHSL(this._rgb, 2, -ratio);\n\t\treturn this;\n\t}\n\tsaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, ratio);\n\t\treturn this;\n\t}\n\tdesaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, -ratio);\n\t\treturn this;\n\t}\n\trotate(deg) {\n\t\trotate(this._rgb, deg);\n\t\treturn this;\n\t}\n}\nfunction index_esm(input) {\n\treturn new Color(input);\n}\n\nconst isPatternOrGradient = (value) => value instanceof CanvasGradient || value instanceof CanvasPattern;\nfunction color(value) {\n  return isPatternOrGradient(value) ? value : index_esm(value);\n}\nfunction getHoverColor(value) {\n  return isPatternOrGradient(value)\n    ? value\n    : index_esm(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\nfunction getScope$1(node, key) {\n  if (!key) {\n    return node;\n  }\n  const keys = key.split('.');\n  for (let i = 0, n = keys.length; i < n; ++i) {\n    const k = keys[i];\n    node = node[k] || (node[k] = Object.create(null));\n  }\n  return node;\n}\nfunction set(root, scope, values) {\n  if (typeof scope === 'string') {\n    return merge(getScope$1(root, scope), values);\n  }\n  return merge(getScope$1(root, ''), scope);\n}\nclass Defaults {\n  constructor(_descriptors) {\n    this.animation = undefined;\n    this.backgroundColor = 'rgba(0,0,0,0.1)';\n    this.borderColor = 'rgba(0,0,0,0.1)';\n    this.color = '#666';\n    this.datasets = {};\n    this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n    this.elements = {};\n    this.events = [\n      'mousemove',\n      'mouseout',\n      'click',\n      'touchstart',\n      'touchmove'\n    ];\n    this.font = {\n      family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n      size: 12,\n      style: 'normal',\n      lineHeight: 1.2,\n      weight: null\n    };\n    this.hover = {};\n    this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n    this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n    this.hoverColor = (ctx, options) => getHoverColor(options.color);\n    this.indexAxis = 'x';\n    this.interaction = {\n      mode: 'nearest',\n      intersect: true\n    };\n    this.maintainAspectRatio = true;\n    this.onHover = null;\n    this.onClick = null;\n    this.parsing = true;\n    this.plugins = {};\n    this.responsive = true;\n    this.scale = undefined;\n    this.scales = {};\n    this.showLine = true;\n    this.drawActiveElementsOnTop = true;\n    this.describe(_descriptors);\n  }\n  set(scope, values) {\n    return set(this, scope, values);\n  }\n  get(scope) {\n    return getScope$1(this, scope);\n  }\n  describe(scope, values) {\n    return set(descriptors, scope, values);\n  }\n  override(scope, values) {\n    return set(overrides, scope, values);\n  }\n  route(scope, name, targetScope, targetName) {\n    const scopeObject = getScope$1(this, scope);\n    const targetScopeObject = getScope$1(this, targetScope);\n    const privateName = '_' + name;\n    Object.defineProperties(scopeObject, {\n      [privateName]: {\n        value: scopeObject[name],\n        writable: true\n      },\n      [name]: {\n        enumerable: true,\n        get() {\n          const local = this[privateName];\n          const target = targetScopeObject[targetName];\n          if (isObject(local)) {\n            return Object.assign({}, target, local);\n          }\n          return valueOrDefault(local, target);\n        },\n        set(value) {\n          this[privateName] = value;\n        }\n      }\n    });\n  }\n}\nvar defaults = new Defaults({\n  _scriptable: (name) => !name.startsWith('on'),\n  _indexable: (name) => name !== 'events',\n  hover: {\n    _fallback: 'interaction'\n  },\n  interaction: {\n    _scriptable: false,\n    _indexable: false,\n  }\n});\n\nfunction toFontString(font) {\n  if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n    return null;\n  }\n  return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\nfunction _measureText(ctx, data, gc, longest, string) {\n  let textWidth = data[string];\n  if (!textWidth) {\n    textWidth = data[string] = ctx.measureText(string).width;\n    gc.push(string);\n  }\n  if (textWidth > longest) {\n    longest = textWidth;\n  }\n  return longest;\n}\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n  cache = cache || {};\n  let data = cache.data = cache.data || {};\n  let gc = cache.garbageCollect = cache.garbageCollect || [];\n  if (cache.font !== font) {\n    data = cache.data = {};\n    gc = cache.garbageCollect = [];\n    cache.font = font;\n  }\n  ctx.save();\n  ctx.font = font;\n  let longest = 0;\n  const ilen = arrayOfThings.length;\n  let i, j, jlen, thing, nestedThing;\n  for (i = 0; i < ilen; i++) {\n    thing = arrayOfThings[i];\n    if (thing !== undefined && thing !== null && isArray(thing) !== true) {\n      longest = _measureText(ctx, data, gc, longest, thing);\n    } else if (isArray(thing)) {\n      for (j = 0, jlen = thing.length; j < jlen; j++) {\n        nestedThing = thing[j];\n        if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n          longest = _measureText(ctx, data, gc, longest, nestedThing);\n        }\n      }\n    }\n  }\n  ctx.restore();\n  const gcLen = gc.length / 2;\n  if (gcLen > arrayOfThings.length) {\n    for (i = 0; i < gcLen; i++) {\n      delete data[gc[i]];\n    }\n    gc.splice(0, gcLen);\n  }\n  return longest;\n}\nfunction _alignPixel(chart, pixel, width) {\n  const devicePixelRatio = chart.currentDevicePixelRatio;\n  const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n  return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\nfunction clearCanvas(canvas, ctx) {\n  ctx = ctx || canvas.getContext('2d');\n  ctx.save();\n  ctx.resetTransform();\n  ctx.clearRect(0, 0, canvas.width, canvas.height);\n  ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n  let type, xOffset, yOffset, size, cornerRadius;\n  const style = options.pointStyle;\n  const rotation = options.rotation;\n  const radius = options.radius;\n  let rad = (rotation || 0) * RAD_PER_DEG;\n  if (style && typeof style === 'object') {\n    type = style.toString();\n    if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n      ctx.save();\n      ctx.translate(x, y);\n      ctx.rotate(rad);\n      ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n      ctx.restore();\n      return;\n    }\n  }\n  if (isNaN(radius) || radius <= 0) {\n    return;\n  }\n  ctx.beginPath();\n  switch (style) {\n  default:\n    ctx.arc(x, y, radius, 0, TAU);\n    ctx.closePath();\n    break;\n  case 'triangle':\n    ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    rad += TWO_THIRDS_PI;\n    ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    rad += TWO_THIRDS_PI;\n    ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n    ctx.closePath();\n    break;\n  case 'rectRounded':\n    cornerRadius = radius * 0.516;\n    size = radius - cornerRadius;\n    xOffset = Math.cos(rad + QUARTER_PI) * size;\n    yOffset = Math.sin(rad + QUARTER_PI) * size;\n    ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n    ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n    ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n    ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n    ctx.closePath();\n    break;\n  case 'rect':\n    if (!rotation) {\n      size = Math.SQRT1_2 * radius;\n      ctx.rect(x - size, y - size, 2 * size, 2 * size);\n      break;\n    }\n    rad += QUARTER_PI;\n  case 'rectRot':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    ctx.closePath();\n    break;\n  case 'crossRot':\n    rad += QUARTER_PI;\n  case 'cross':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    break;\n  case 'star':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    rad += QUARTER_PI;\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    ctx.moveTo(x + yOffset, y - xOffset);\n    ctx.lineTo(x - yOffset, y + xOffset);\n    break;\n  case 'line':\n    xOffset = Math.cos(rad) * radius;\n    yOffset = Math.sin(rad) * radius;\n    ctx.moveTo(x - xOffset, y - yOffset);\n    ctx.lineTo(x + xOffset, y + yOffset);\n    break;\n  case 'dash':\n    ctx.moveTo(x, y);\n    ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n    break;\n  }\n  ctx.fill();\n  if (options.borderWidth > 0) {\n    ctx.stroke();\n  }\n}\nfunction _isPointInArea(point, area, margin) {\n  margin = margin || 0.5;\n  return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\nfunction clipArea(ctx, area) {\n  ctx.save();\n  ctx.beginPath();\n  ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n  ctx.clip();\n}\nfunction unclipArea(ctx) {\n  ctx.restore();\n}\nfunction _steppedLineTo(ctx, previous, target, flip, mode) {\n  if (!previous) {\n    return ctx.lineTo(target.x, target.y);\n  }\n  if (mode === 'middle') {\n    const midpoint = (previous.x + target.x) / 2.0;\n    ctx.lineTo(midpoint, previous.y);\n    ctx.lineTo(midpoint, target.y);\n  } else if (mode === 'after' !== !!flip) {\n    ctx.lineTo(previous.x, target.y);\n  } else {\n    ctx.lineTo(target.x, previous.y);\n  }\n  ctx.lineTo(target.x, target.y);\n}\nfunction _bezierCurveTo(ctx, previous, target, flip) {\n  if (!previous) {\n    return ctx.lineTo(target.x, target.y);\n  }\n  ctx.bezierCurveTo(\n    flip ? previous.cp1x : previous.cp2x,\n    flip ? previous.cp1y : previous.cp2y,\n    flip ? target.cp2x : target.cp1x,\n    flip ? target.cp2y : target.cp1y,\n    target.x,\n    target.y);\n}\nfunction renderText(ctx, text, x, y, font, opts = {}) {\n  const lines = isArray(text) ? text : [text];\n  const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n  let i, line;\n  ctx.save();\n  ctx.font = font.string;\n  setRenderOpts(ctx, opts);\n  for (i = 0; i < lines.length; ++i) {\n    line = lines[i];\n    if (stroke) {\n      if (opts.strokeColor) {\n        ctx.strokeStyle = opts.strokeColor;\n      }\n      if (!isNullOrUndef(opts.strokeWidth)) {\n        ctx.lineWidth = opts.strokeWidth;\n      }\n      ctx.strokeText(line, x, y, opts.maxWidth);\n    }\n    ctx.fillText(line, x, y, opts.maxWidth);\n    decorateText(ctx, x, y, line, opts);\n    y += font.lineHeight;\n  }\n  ctx.restore();\n}\nfunction setRenderOpts(ctx, opts) {\n  if (opts.translation) {\n    ctx.translate(opts.translation[0], opts.translation[1]);\n  }\n  if (!isNullOrUndef(opts.rotation)) {\n    ctx.rotate(opts.rotation);\n  }\n  if (opts.color) {\n    ctx.fillStyle = opts.color;\n  }\n  if (opts.textAlign) {\n    ctx.textAlign = opts.textAlign;\n  }\n  if (opts.textBaseline) {\n    ctx.textBaseline = opts.textBaseline;\n  }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n  if (opts.strikethrough || opts.underline) {\n    const metrics = ctx.measureText(line);\n    const left = x - metrics.actualBoundingBoxLeft;\n    const right = x + metrics.actualBoundingBoxRight;\n    const top = y - metrics.actualBoundingBoxAscent;\n    const bottom = y + metrics.actualBoundingBoxDescent;\n    const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n    ctx.strokeStyle = ctx.fillStyle;\n    ctx.beginPath();\n    ctx.lineWidth = opts.decorationWidth || 2;\n    ctx.moveTo(left, yDecoration);\n    ctx.lineTo(right, yDecoration);\n    ctx.stroke();\n  }\n}\nfunction addRoundedRectPath(ctx, rect) {\n  const {x, y, w, h, radius} = rect;\n  ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n  ctx.lineTo(x, y + h - radius.bottomLeft);\n  ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n  ctx.lineTo(x + w - radius.bottomRight, y + h);\n  ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n  ctx.lineTo(x + w, y + radius.topRight);\n  ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n  ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = new RegExp(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\nconst FONT_STYLE = new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);\nfunction toLineHeight(value, size) {\n  const matches = ('' + value).match(LINE_HEIGHT);\n  if (!matches || matches[1] === 'normal') {\n    return size * 1.2;\n  }\n  value = +matches[2];\n  switch (matches[3]) {\n  case 'px':\n    return value;\n  case '%':\n    value /= 100;\n    break;\n  }\n  return size * value;\n}\nconst numberOrZero = v => +v || 0;\nfunction _readValueToProps(value, props) {\n  const ret = {};\n  const objProps = isObject(props);\n  const keys = objProps ? Object.keys(props) : props;\n  const read = isObject(value)\n    ? objProps\n      ? prop => valueOrDefault(value[prop], value[props[prop]])\n      : prop => value[prop]\n    : () => value;\n  for (const prop of keys) {\n    ret[prop] = numberOrZero(read(prop));\n  }\n  return ret;\n}\nfunction toTRBL(value) {\n  return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\nfunction toTRBLCorners(value) {\n  return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\nfunction toPadding(value) {\n  const obj = toTRBL(value);\n  obj.width = obj.left + obj.right;\n  obj.height = obj.top + obj.bottom;\n  return obj;\n}\nfunction toFont(options, fallback) {\n  options = options || {};\n  fallback = fallback || defaults.font;\n  let size = valueOrDefault(options.size, fallback.size);\n  if (typeof size === 'string') {\n    size = parseInt(size, 10);\n  }\n  let style = valueOrDefault(options.style, fallback.style);\n  if (style && !('' + style).match(FONT_STYLE)) {\n    console.warn('Invalid font style specified: \"' + style + '\"');\n    style = '';\n  }\n  const font = {\n    family: valueOrDefault(options.family, fallback.family),\n    lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n    size,\n    style,\n    weight: valueOrDefault(options.weight, fallback.weight),\n    string: ''\n  };\n  font.string = toFontString(font);\n  return font;\n}\nfunction resolve(inputs, context, index, info) {\n  let cacheable = true;\n  let i, ilen, value;\n  for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n    value = inputs[i];\n    if (value === undefined) {\n      continue;\n    }\n    if (context !== undefined && typeof value === 'function') {\n      value = value(context);\n      cacheable = false;\n    }\n    if (index !== undefined && isArray(value)) {\n      value = value[index % value.length];\n      cacheable = false;\n    }\n    if (value !== undefined) {\n      if (info && !cacheable) {\n        info.cacheable = false;\n      }\n      return value;\n    }\n  }\n}\nfunction _addGrace(minmax, grace, beginAtZero) {\n  const {min, max} = minmax;\n  const change = toDimension(grace, (max - min) / 2);\n  const keepZero = (value, add) => beginAtZero && value === 0 ? 0 : value + add;\n  return {\n    min: keepZero(min, -Math.abs(change)),\n    max: keepZero(max, change)\n  };\n}\nfunction createContext(parentContext, context) {\n  return Object.assign(Object.create(parentContext), context);\n}\n\nfunction _lookup(table, value, cmp) {\n  cmp = cmp || ((index) => table[index] < value);\n  let hi = table.length - 1;\n  let lo = 0;\n  let mid;\n  while (hi - lo > 1) {\n    mid = (lo + hi) >> 1;\n    if (cmp(mid)) {\n      lo = mid;\n    } else {\n      hi = mid;\n    }\n  }\n  return {lo, hi};\n}\nconst _lookupByKey = (table, key, value) =>\n  _lookup(table, value, index => table[index][key] < value);\nconst _rlookupByKey = (table, key, value) =>\n  _lookup(table, value, index => table[index][key] >= value);\nfunction _filterBetween(values, min, max) {\n  let start = 0;\n  let end = values.length;\n  while (start < end && values[start] < min) {\n    start++;\n  }\n  while (end > start && values[end - 1] > max) {\n    end--;\n  }\n  return start > 0 || end < values.length\n    ? values.slice(start, end)\n    : values;\n}\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\nfunction listenArrayEvents(array, listener) {\n  if (array._chartjs) {\n    array._chartjs.listeners.push(listener);\n    return;\n  }\n  Object.defineProperty(array, '_chartjs', {\n    configurable: true,\n    enumerable: false,\n    value: {\n      listeners: [listener]\n    }\n  });\n  arrayEvents.forEach((key) => {\n    const method = '_onData' + _capitalize(key);\n    const base = array[key];\n    Object.defineProperty(array, key, {\n      configurable: true,\n      enumerable: false,\n      value(...args) {\n        const res = base.apply(this, args);\n        array._chartjs.listeners.forEach((object) => {\n          if (typeof object[method] === 'function') {\n            object[method](...args);\n          }\n        });\n        return res;\n      }\n    });\n  });\n}\nfunction unlistenArrayEvents(array, listener) {\n  const stub = array._chartjs;\n  if (!stub) {\n    return;\n  }\n  const listeners = stub.listeners;\n  const index = listeners.indexOf(listener);\n  if (index !== -1) {\n    listeners.splice(index, 1);\n  }\n  if (listeners.length > 0) {\n    return;\n  }\n  arrayEvents.forEach((key) => {\n    delete array[key];\n  });\n  delete array._chartjs;\n}\nfunction _arrayUnique(items) {\n  const set = new Set();\n  let i, ilen;\n  for (i = 0, ilen = items.length; i < ilen; ++i) {\n    set.add(items[i]);\n  }\n  if (set.size === ilen) {\n    return items;\n  }\n  return Array.from(set);\n}\n\nfunction _createResolver(scopes, prefixes = [''], rootScopes = scopes, fallback, getTarget = () => scopes[0]) {\n  if (!defined(fallback)) {\n    fallback = _resolve('_fallback', scopes);\n  }\n  const cache = {\n    [Symbol.toStringTag]: 'Object',\n    _cacheable: true,\n    _scopes: scopes,\n    _rootScopes: rootScopes,\n    _fallback: fallback,\n    _getTarget: getTarget,\n    override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback),\n  };\n  return new Proxy(cache, {\n    deleteProperty(target, prop) {\n      delete target[prop];\n      delete target._keys;\n      delete scopes[0][prop];\n      return true;\n    },\n    get(target, prop) {\n      return _cached(target, prop,\n        () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n    },\n    getOwnPropertyDescriptor(target, prop) {\n      return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n    },\n    getPrototypeOf() {\n      return Reflect.getPrototypeOf(scopes[0]);\n    },\n    has(target, prop) {\n      return getKeysFromAllScopes(target).includes(prop);\n    },\n    ownKeys(target) {\n      return getKeysFromAllScopes(target);\n    },\n    set(target, prop, value) {\n      const storage = target._storage || (target._storage = getTarget());\n      target[prop] = storage[prop] = value;\n      delete target._keys;\n      return true;\n    }\n  });\n}\nfunction _attachContext(proxy, context, subProxy, descriptorDefaults) {\n  const cache = {\n    _cacheable: false,\n    _proxy: proxy,\n    _context: context,\n    _subProxy: subProxy,\n    _stack: new Set(),\n    _descriptors: _descriptors(proxy, descriptorDefaults),\n    setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n    override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n  };\n  return new Proxy(cache, {\n    deleteProperty(target, prop) {\n      delete target[prop];\n      delete proxy[prop];\n      return true;\n    },\n    get(target, prop, receiver) {\n      return _cached(target, prop,\n        () => _resolveWithContext(target, prop, receiver));\n    },\n    getOwnPropertyDescriptor(target, prop) {\n      return target._descriptors.allKeys\n        ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n        : Reflect.getOwnPropertyDescriptor(proxy, prop);\n    },\n    getPrototypeOf() {\n      return Reflect.getPrototypeOf(proxy);\n    },\n    has(target, prop) {\n      return Reflect.has(proxy, prop);\n    },\n    ownKeys() {\n      return Reflect.ownKeys(proxy);\n    },\n    set(target, prop, value) {\n      proxy[prop] = value;\n      delete target[prop];\n      return true;\n    }\n  });\n}\nfunction _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {\n  const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n  return {\n    allKeys: _allKeys,\n    scriptable: _scriptable,\n    indexable: _indexable,\n    isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n    isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n  };\n}\nconst readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters' &&\n  (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n  if (Object.prototype.hasOwnProperty.call(target, prop)) {\n    return target[prop];\n  }\n  const value = resolve();\n  target[prop] = value;\n  return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n  const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n  let value = _proxy[prop];\n  if (isFunction(value) && descriptors.isScriptable(prop)) {\n    value = _resolveScriptable(prop, value, target, receiver);\n  }\n  if (isArray(value) && value.length) {\n    value = _resolveArray(prop, value, target, descriptors.isIndexable);\n  }\n  if (needsSubResolver(prop, value)) {\n    value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n  }\n  return value;\n}\nfunction _resolveScriptable(prop, value, target, receiver) {\n  const {_proxy, _context, _subProxy, _stack} = target;\n  if (_stack.has(prop)) {\n    throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n  }\n  _stack.add(prop);\n  value = value(_context, _subProxy || receiver);\n  _stack.delete(prop);\n  if (needsSubResolver(prop, value)) {\n    value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n  }\n  return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n  const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n  if (defined(_context.index) && isIndexable(prop)) {\n    value = value[_context.index % value.length];\n  } else if (isObject(value[0])) {\n    const arr = value;\n    const scopes = _proxy._scopes.filter(s => s !== arr);\n    value = [];\n    for (const item of arr) {\n      const resolver = createSubResolver(scopes, _proxy, prop, item);\n      value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n    }\n  }\n  return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n  return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent) => key === true ? parent\n  : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n  for (const parent of parentScopes) {\n    const scope = getScope(key, parent);\n    if (scope) {\n      set.add(scope);\n      const fallback = resolveFallback(scope._fallback, key, value);\n      if (defined(fallback) && fallback !== key && fallback !== parentFallback) {\n        return fallback;\n      }\n    } else if (scope === false && defined(parentFallback) && key !== parentFallback) {\n      return null;\n    }\n  }\n  return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n  const rootScopes = resolver._rootScopes;\n  const fallback = resolveFallback(resolver._fallback, prop, value);\n  const allScopes = [...parentScopes, ...rootScopes];\n  const set = new Set();\n  set.add(value);\n  let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n  if (key === null) {\n    return false;\n  }\n  if (defined(fallback) && fallback !== prop) {\n    key = addScopesFromKey(set, allScopes, fallback, key, value);\n    if (key === null) {\n      return false;\n    }\n  }\n  return _createResolver(Array.from(set), [''], rootScopes, fallback,\n    () => subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n  while (key) {\n    key = addScopes(set, allScopes, key, fallback, item);\n  }\n  return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n  const parent = resolver._getTarget();\n  if (!(prop in parent)) {\n    parent[prop] = {};\n  }\n  const target = parent[prop];\n  if (isArray(target) && isObject(value)) {\n    return value;\n  }\n  return target;\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n  let value;\n  for (const prefix of prefixes) {\n    value = _resolve(readKey(prefix, prop), scopes);\n    if (defined(value)) {\n      return needsSubResolver(prop, value)\n        ? createSubResolver(scopes, proxy, prop, value)\n        : value;\n    }\n  }\n}\nfunction _resolve(key, scopes) {\n  for (const scope of scopes) {\n    if (!scope) {\n      continue;\n    }\n    const value = scope[key];\n    if (defined(value)) {\n      return value;\n    }\n  }\n}\nfunction getKeysFromAllScopes(target) {\n  let keys = target._keys;\n  if (!keys) {\n    keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n  }\n  return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n  const set = new Set();\n  for (const scope of scopes) {\n    for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n      set.add(key);\n    }\n  }\n  return Array.from(set);\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i) => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis) => indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n  const previous = firstPoint.skip ? middlePoint : firstPoint;\n  const current = middlePoint;\n  const next = afterPoint.skip ? middlePoint : afterPoint;\n  const d01 = distanceBetweenPoints(current, previous);\n  const d12 = distanceBetweenPoints(next, current);\n  let s01 = d01 / (d01 + d12);\n  let s12 = d12 / (d01 + d12);\n  s01 = isNaN(s01) ? 0 : s01;\n  s12 = isNaN(s12) ? 0 : s12;\n  const fa = t * s01;\n  const fb = t * s12;\n  return {\n    previous: {\n      x: current.x - fa * (next.x - previous.x),\n      y: current.y - fa * (next.y - previous.y)\n    },\n    next: {\n      x: current.x + fb * (next.x - previous.x),\n      y: current.y + fb * (next.y - previous.y)\n    }\n  };\n}\nfunction monotoneAdjust(points, deltaK, mK) {\n  const pointsLen = points.length;\n  let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n  let pointAfter = getPoint(points, 0);\n  for (let i = 0; i < pointsLen - 1; ++i) {\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent || !pointAfter) {\n      continue;\n    }\n    if (almostEquals(deltaK[i], 0, EPSILON)) {\n      mK[i] = mK[i + 1] = 0;\n      continue;\n    }\n    alphaK = mK[i] / deltaK[i];\n    betaK = mK[i + 1] / deltaK[i];\n    squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n    if (squaredMagnitude <= 9) {\n      continue;\n    }\n    tauK = 3 / Math.sqrt(squaredMagnitude);\n    mK[i] = alphaK * tauK * deltaK[i];\n    mK[i + 1] = betaK * tauK * deltaK[i];\n  }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n  const valueAxis = getValueAxis(indexAxis);\n  const pointsLen = points.length;\n  let delta, pointBefore, pointCurrent;\n  let pointAfter = getPoint(points, 0);\n  for (let i = 0; i < pointsLen; ++i) {\n    pointBefore = pointCurrent;\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent) {\n      continue;\n    }\n    const iPixel = pointCurrent[indexAxis];\n    const vPixel = pointCurrent[valueAxis];\n    if (pointBefore) {\n      delta = (iPixel - pointBefore[indexAxis]) / 3;\n      pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n      pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n    }\n    if (pointAfter) {\n      delta = (pointAfter[indexAxis] - iPixel) / 3;\n      pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n      pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n    }\n  }\n}\nfunction splineCurveMonotone(points, indexAxis = 'x') {\n  const valueAxis = getValueAxis(indexAxis);\n  const pointsLen = points.length;\n  const deltaK = Array(pointsLen).fill(0);\n  const mK = Array(pointsLen);\n  let i, pointBefore, pointCurrent;\n  let pointAfter = getPoint(points, 0);\n  for (i = 0; i < pointsLen; ++i) {\n    pointBefore = pointCurrent;\n    pointCurrent = pointAfter;\n    pointAfter = getPoint(points, i + 1);\n    if (!pointCurrent) {\n      continue;\n    }\n    if (pointAfter) {\n      const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n      deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n    }\n    mK[i] = !pointBefore ? deltaK[i]\n      : !pointAfter ? deltaK[i - 1]\n      : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n      : (deltaK[i - 1] + deltaK[i]) / 2;\n  }\n  monotoneAdjust(points, deltaK, mK);\n  monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n  return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n  let i, ilen, point, inArea, inAreaPrev;\n  let inAreaNext = _isPointInArea(points[0], area);\n  for (i = 0, ilen = points.length; i < ilen; ++i) {\n    inAreaPrev = inArea;\n    inArea = inAreaNext;\n    inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n    if (!inArea) {\n      continue;\n    }\n    point = points[i];\n    if (inAreaPrev) {\n      point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n      point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n    }\n    if (inAreaNext) {\n      point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n      point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n    }\n  }\n}\nfunction _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n  let i, ilen, point, controlPoints;\n  if (options.spanGaps) {\n    points = points.filter((pt) => !pt.skip);\n  }\n  if (options.cubicInterpolationMode === 'monotone') {\n    splineCurveMonotone(points, indexAxis);\n  } else {\n    let prev = loop ? points[points.length - 1] : points[0];\n    for (i = 0, ilen = points.length; i < ilen; ++i) {\n      point = points[i];\n      controlPoints = splineCurve(\n        prev,\n        point,\n        points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n        options.tension\n      );\n      point.cp1x = controlPoints.previous.x;\n      point.cp1y = controlPoints.previous.y;\n      point.cp2x = controlPoints.next.x;\n      point.cp2y = controlPoints.next.y;\n      prev = point;\n    }\n  }\n  if (options.capBezierPoints) {\n    capBezierPoints(points, area);\n  }\n}\n\nfunction _isDomSupported() {\n  return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\nfunction _getParentNode(domNode) {\n  let parent = domNode.parentNode;\n  if (parent && parent.toString() === '[object ShadowRoot]') {\n    parent = parent.host;\n  }\n  return parent;\n}\nfunction parseMaxStyle(styleValue, node, parentProperty) {\n  let valueInPixels;\n  if (typeof styleValue === 'string') {\n    valueInPixels = parseInt(styleValue, 10);\n    if (styleValue.indexOf('%') !== -1) {\n      valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n    }\n  } else {\n    valueInPixels = styleValue;\n  }\n  return valueInPixels;\n}\nconst getComputedStyle = (element) => window.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n  return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles, style, suffix) {\n  const result = {};\n  suffix = suffix ? '-' + suffix : '';\n  for (let i = 0; i < 4; i++) {\n    const pos = positions[i];\n    result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n  }\n  result.width = result.left + result.right;\n  result.height = result.top + result.bottom;\n  return result;\n}\nconst useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot);\nfunction getCanvasPosition(evt, canvas) {\n  const e = evt.native || evt;\n  const touches = e.touches;\n  const source = touches && touches.length ? touches[0] : e;\n  const {offsetX, offsetY} = source;\n  let box = false;\n  let x, y;\n  if (useOffsetPos(offsetX, offsetY, e.target)) {\n    x = offsetX;\n    y = offsetY;\n  } else {\n    const rect = canvas.getBoundingClientRect();\n    x = source.clientX - rect.left;\n    y = source.clientY - rect.top;\n    box = true;\n  }\n  return {x, y, box};\n}\nfunction getRelativePosition(evt, chart) {\n  const {canvas, currentDevicePixelRatio} = chart;\n  const style = getComputedStyle(canvas);\n  const borderBox = style.boxSizing === 'border-box';\n  const paddings = getPositionedStyle(style, 'padding');\n  const borders = getPositionedStyle(style, 'border', 'width');\n  const {x, y, box} = getCanvasPosition(evt, canvas);\n  const xOffset = paddings.left + (box && borders.left);\n  const yOffset = paddings.top + (box && borders.top);\n  let {width, height} = chart;\n  if (borderBox) {\n    width -= paddings.width + borders.width;\n    height -= paddings.height + borders.height;\n  }\n  return {\n    x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n    y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n  };\n}\nfunction getContainerSize(canvas, width, height) {\n  let maxWidth, maxHeight;\n  if (width === undefined || height === undefined) {\n    const container = _getParentNode(canvas);\n    if (!container) {\n      width = canvas.clientWidth;\n      height = canvas.clientHeight;\n    } else {\n      const rect = container.getBoundingClientRect();\n      const containerStyle = getComputedStyle(container);\n      const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n      const containerPadding = getPositionedStyle(containerStyle, 'padding');\n      width = rect.width - containerPadding.width - containerBorder.width;\n      height = rect.height - containerPadding.height - containerBorder.height;\n      maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n      maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n    }\n  }\n  return {\n    width,\n    height,\n    maxWidth: maxWidth || INFINITY,\n    maxHeight: maxHeight || INFINITY\n  };\n}\nconst round1 = v => Math.round(v * 10) / 10;\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n  const style = getComputedStyle(canvas);\n  const margins = getPositionedStyle(style, 'margin');\n  const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n  const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n  const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n  let {width, height} = containerSize;\n  if (style.boxSizing === 'content-box') {\n    const borders = getPositionedStyle(style, 'border', 'width');\n    const paddings = getPositionedStyle(style, 'padding');\n    width -= paddings.width + borders.width;\n    height -= paddings.height + borders.height;\n  }\n  width = Math.max(0, width - margins.width);\n  height = Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height - margins.height);\n  width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n  height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n  if (width && !height) {\n    height = round1(width / 2);\n  }\n  return {\n    width,\n    height\n  };\n}\nfunction retinaScale(chart, forceRatio, forceStyle) {\n  const pixelRatio = forceRatio || 1;\n  const deviceHeight = Math.floor(chart.height * pixelRatio);\n  const deviceWidth = Math.floor(chart.width * pixelRatio);\n  chart.height = deviceHeight / pixelRatio;\n  chart.width = deviceWidth / pixelRatio;\n  const canvas = chart.canvas;\n  if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n    canvas.style.height = `${chart.height}px`;\n    canvas.style.width = `${chart.width}px`;\n  }\n  if (chart.currentDevicePixelRatio !== pixelRatio\n      || canvas.height !== deviceHeight\n      || canvas.width !== deviceWidth) {\n    chart.currentDevicePixelRatio = pixelRatio;\n    canvas.height = deviceHeight;\n    canvas.width = deviceWidth;\n    chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n    return true;\n  }\n  return false;\n}\nconst supportsEventListenerOptions = (function() {\n  let passiveSupported = false;\n  try {\n    const options = {\n      get passive() {\n        passiveSupported = true;\n        return false;\n      }\n    };\n    window.addEventListener('test', null, options);\n    window.removeEventListener('test', null, options);\n  } catch (e) {\n  }\n  return passiveSupported;\n}());\nfunction readUsedSize(element, property) {\n  const value = getStyle(element, property);\n  const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n  return matches ? +matches[1] : undefined;\n}\n\nfunction _pointInLine(p1, p2, t, mode) {\n  return {\n    x: p1.x + t * (p2.x - p1.x),\n    y: p1.y + t * (p2.y - p1.y)\n  };\n}\nfunction _steppedInterpolation(p1, p2, t, mode) {\n  return {\n    x: p1.x + t * (p2.x - p1.x),\n    y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n    : mode === 'after' ? t < 1 ? p1.y : p2.y\n    : t > 0 ? p2.y : p1.y\n  };\n}\nfunction _bezierInterpolation(p1, p2, t, mode) {\n  const cp1 = {x: p1.cp2x, y: p1.cp2y};\n  const cp2 = {x: p2.cp1x, y: p2.cp1y};\n  const a = _pointInLine(p1, cp1, t);\n  const b = _pointInLine(cp1, cp2, t);\n  const c = _pointInLine(cp2, p2, t);\n  const d = _pointInLine(a, b, t);\n  const e = _pointInLine(b, c, t);\n  return _pointInLine(d, e, t);\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n  options = options || {};\n  const cacheKey = locale + JSON.stringify(options);\n  let formatter = intlCache.get(cacheKey);\n  if (!formatter) {\n    formatter = new Intl.NumberFormat(locale, options);\n    intlCache.set(cacheKey, formatter);\n  }\n  return formatter;\n}\nfunction formatNumber(num, locale, options) {\n  return getNumberFormat(locale, options).format(num);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n  return {\n    x(x) {\n      return rectX + rectX + width - x;\n    },\n    setWidth(w) {\n      width = w;\n    },\n    textAlign(align) {\n      if (align === 'center') {\n        return align;\n      }\n      return align === 'right' ? 'left' : 'right';\n    },\n    xPlus(x, value) {\n      return x - value;\n    },\n    leftForLtr(x, itemWidth) {\n      return x - itemWidth;\n    },\n  };\n};\nconst getLeftToRightAdapter = function() {\n  return {\n    x(x) {\n      return x;\n    },\n    setWidth(w) {\n    },\n    textAlign(align) {\n      return align;\n    },\n    xPlus(x, value) {\n      return x + value;\n    },\n    leftForLtr(x, _itemWidth) {\n      return x;\n    },\n  };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n  return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n  let style, original;\n  if (direction === 'ltr' || direction === 'rtl') {\n    style = ctx.canvas.style;\n    original = [\n      style.getPropertyValue('direction'),\n      style.getPropertyPriority('direction'),\n    ];\n    style.setProperty('direction', direction, 'important');\n    ctx.prevTextDirection = original;\n  }\n}\nfunction restoreTextDirection(ctx, original) {\n  if (original !== undefined) {\n    delete ctx.prevTextDirection;\n    ctx.canvas.style.setProperty('direction', original[0], original[1]);\n  }\n}\n\nfunction propertyFn(property) {\n  if (property === 'angle') {\n    return {\n      between: _angleBetween,\n      compare: _angleDiff,\n      normalize: _normalizeAngle,\n    };\n  }\n  return {\n    between: _isBetween,\n    compare: (a, b) => a - b,\n    normalize: x => x\n  };\n}\nfunction normalizeSegment({start, end, count, loop, style}) {\n  return {\n    start: start % count,\n    end: end % count,\n    loop: loop && (end - start + 1) % count === 0,\n    style\n  };\n}\nfunction getSegment(segment, points, bounds) {\n  const {property, start: startBound, end: endBound} = bounds;\n  const {between, normalize} = propertyFn(property);\n  const count = points.length;\n  let {start, end, loop} = segment;\n  let i, ilen;\n  if (loop) {\n    start += count;\n    end += count;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n        break;\n      }\n      start--;\n      end--;\n    }\n    start %= count;\n    end %= count;\n  }\n  if (end < start) {\n    end += count;\n  }\n  return {start, end, loop, style: segment.style};\n}\nfunction _boundSegment(segment, points, bounds) {\n  if (!bounds) {\n    return [segment];\n  }\n  const {property, start: startBound, end: endBound} = bounds;\n  const count = points.length;\n  const {compare, between, normalize} = propertyFn(property);\n  const {start, end, loop, style} = getSegment(segment, points, bounds);\n  const result = [];\n  let inside = false;\n  let subStart = null;\n  let value, point, prevValue;\n  const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n  const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n  const shouldStart = () => inside || startIsBefore();\n  const shouldStop = () => !inside || endIsBefore();\n  for (let i = start, prev = start; i <= end; ++i) {\n    point = points[i % count];\n    if (point.skip) {\n      continue;\n    }\n    value = normalize(point[property]);\n    if (value === prevValue) {\n      continue;\n    }\n    inside = between(value, startBound, endBound);\n    if (subStart === null && shouldStart()) {\n      subStart = compare(value, startBound) === 0 ? i : prev;\n    }\n    if (subStart !== null && shouldStop()) {\n      result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n      subStart = null;\n    }\n    prev = i;\n    prevValue = value;\n  }\n  if (subStart !== null) {\n    result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n  }\n  return result;\n}\nfunction _boundSegments(line, bounds) {\n  const result = [];\n  const segments = line.segments;\n  for (let i = 0; i < segments.length; i++) {\n    const sub = _boundSegment(segments[i], line.points, bounds);\n    if (sub.length) {\n      result.push(...sub);\n    }\n  }\n  return result;\n}\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n  let start = 0;\n  let end = count - 1;\n  if (loop && !spanGaps) {\n    while (start < count && !points[start].skip) {\n      start++;\n    }\n  }\n  while (start < count && points[start].skip) {\n    start++;\n  }\n  start %= count;\n  if (loop) {\n    end += start;\n  }\n  while (end > start && points[end % count].skip) {\n    end--;\n  }\n  end %= count;\n  return {start, end};\n}\nfunction solidSegments(points, start, max, loop) {\n  const count = points.length;\n  const result = [];\n  let last = start;\n  let prev = points[start];\n  let end;\n  for (end = start + 1; end <= max; ++end) {\n    const cur = points[end % count];\n    if (cur.skip || cur.stop) {\n      if (!prev.skip) {\n        loop = false;\n        result.push({start: start % count, end: (end - 1) % count, loop});\n        start = last = cur.stop ? end : null;\n      }\n    } else {\n      last = end;\n      if (prev.skip) {\n        start = end;\n      }\n    }\n    prev = cur;\n  }\n  if (last !== null) {\n    result.push({start: start % count, end: last % count, loop});\n  }\n  return result;\n}\nfunction _computeSegments(line, segmentOptions) {\n  const points = line.points;\n  const spanGaps = line.options.spanGaps;\n  const count = points.length;\n  if (!count) {\n    return [];\n  }\n  const loop = !!line._loop;\n  const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n  if (spanGaps === true) {\n    return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n  }\n  const max = end < start ? end + count : end;\n  const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n  return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\nfunction splitByStyles(line, segments, points, segmentOptions) {\n  if (!segmentOptions || !segmentOptions.setContext || !points) {\n    return segments;\n  }\n  return doSplitByStyles(line, segments, points, segmentOptions);\n}\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n  const chartContext = line._chart.getContext();\n  const baseStyle = readStyle(line.options);\n  const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n  const count = points.length;\n  const result = [];\n  let prevStyle = baseStyle;\n  let start = segments[0].start;\n  let i = start;\n  function addStyle(s, e, l, st) {\n    const dir = spanGaps ? -1 : 1;\n    if (s === e) {\n      return;\n    }\n    s += count;\n    while (points[s % count].skip) {\n      s -= dir;\n    }\n    while (points[e % count].skip) {\n      e += dir;\n    }\n    if (s % count !== e % count) {\n      result.push({start: s % count, end: e % count, loop: l, style: st});\n      prevStyle = st;\n      start = e % count;\n    }\n  }\n  for (const segment of segments) {\n    start = spanGaps ? start : segment.start;\n    let prev = points[start % count];\n    let style;\n    for (i = start + 1; i <= segment.end; i++) {\n      const pt = points[i % count];\n      style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n        type: 'segment',\n        p0: prev,\n        p1: pt,\n        p0DataIndex: (i - 1) % count,\n        p1DataIndex: i % count,\n        datasetIndex\n      })));\n      if (styleChanged(style, prevStyle)) {\n        addStyle(start, i - 1, segment.loop, prevStyle);\n      }\n      prev = pt;\n      prevStyle = style;\n    }\n    if (start < i - 1) {\n      addStyle(start, i - 1, segment.loop, prevStyle);\n    }\n  }\n  return result;\n}\nfunction readStyle(options) {\n  return {\n    backgroundColor: options.backgroundColor,\n    borderCapStyle: options.borderCapStyle,\n    borderDash: options.borderDash,\n    borderDashOffset: options.borderDashOffset,\n    borderJoinStyle: options.borderJoinStyle,\n    borderWidth: options.borderWidth,\n    borderColor: options.borderColor\n  };\n}\nfunction styleChanged(style, prevStyle) {\n  return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle);\n}\n\nexport { _toLeftRightCenter as $, _rlookupByKey as A, getAngleFromPoint as B, toPadding as C, each as D, getMaximumSize as E, _getParentNode as F, readUsedSize as G, HALF_PI as H, throttled as I, supportsEventListenerOptions as J, _isDomSupported as K, log10 as L, _factorize as M, finiteOrDefault as N, callback as O, PI as P, _addGrace as Q, toDegrees as R, _measureText as S, TAU as T, _int16Range as U, _alignPixel as V, clipArea as W, renderText as X, unclipArea as Y, toFont as Z, _arrayUnique as _, resolve as a, _angleDiff as a$, _alignStartEnd as a0, overrides as a1, merge as a2, _capitalize as a3, descriptors as a4, isFunction as a5, _attachContext as a6, _createResolver as a7, _descriptors as a8, mergeIf as a9, restoreTextDirection as aA, noop as aB, distanceBetweenPoints as aC, _setMinAndMaxByKey as aD, niceNum as aE, almostWhole as aF, almostEquals as aG, _decimalPlaces as aH, _longestText as aI, _filterBetween as aJ, _lookup as aK, getHoverColor as aL, clone$1 as aM, _merger as aN, _mergerIf as aO, _deprecated as aP, toFontString as aQ, splineCurve as aR, splineCurveMonotone as aS, getStyle as aT, fontString as aU, toLineHeight as aV, PITAU as aW, INFINITY as aX, RAD_PER_DEG as aY, QUARTER_PI as aZ, TWO_THIRDS_PI as a_, uid as aa, debounce as ab, retinaScale as ac, clearCanvas as ad, setsEqual as ae, _elementsEqual as af, _isClickEvent as ag, _isBetween as ah, _readValueToProps as ai, _updateBezierControlPoints as aj, _computeSegments as ak, _boundSegments as al, _steppedInterpolation as am, _bezierInterpolation as an, _pointInLine as ao, _steppedLineTo as ap, _bezierCurveTo as aq, drawPoint as ar, addRoundedRectPath as as, toTRBL as at, toTRBLCorners as au, _boundSegment as av, _normalizeAngle as aw, getRtlAdapter as ax, overrideTextDirection as ay, _textX as az, isArray as b, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, createContext as h, isObject as i, defined as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, isNumber as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _limitValue as w, _lookupByKey as x, getRelativePosition as y, _isPointInArea as z };\n","/*!\n * Chart.js v3.7.1\n * https://www.chartjs.org\n * (c) 2022 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, d as defaults, i as isObject, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as createContext, j as defined, s as sign, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as isNumber, w as _limitValue, x as _lookupByKey, y as getRelativePosition$1, z as _isPointInArea, A as _rlookupByKey, B as getAngleFromPoint, C as toPadding, D as each, E as getMaximumSize, F as _getParentNode, G as readUsedSize, I as throttled, J as supportsEventListenerOptions, K as _isDomSupported, L as log10, M as _factorize, N as finiteOrDefault, O as callback, Q as _addGrace, R as toDegrees, S as _measureText, U as _int16Range, V as _alignPixel, W as clipArea, X as renderText, Y as unclipArea, Z as toFont, $ as _toLeftRightCenter, a0 as _alignStartEnd, a1 as overrides, a2 as merge, a3 as _capitalize, a4 as descriptors, a5 as isFunction, a6 as _attachContext, a7 as _createResolver, a8 as _descriptors, a9 as mergeIf, aa as uid, ab as debounce, ac as retinaScale, ad as clearCanvas, ae as setsEqual, af as _elementsEqual, ag as _isClickEvent, ah as _isBetween, ai as _readValueToProps, aj as _updateBezierControlPoints, ak as _computeSegments, al as _boundSegments, am as _steppedInterpolation, an as _bezierInterpolation, ao as _pointInLine, ap as _steppedLineTo, aq as _bezierCurveTo, ar as drawPoint, as as addRoundedRectPath, at as toTRBL, au as toTRBLCorners, av as _boundSegment, aw as _normalizeAngle, ax as getRtlAdapter, ay as overrideTextDirection, az as _textX, aA as restoreTextDirection, aB as noop, aC as distanceBetweenPoints, aD as _setMinAndMaxByKey, aE as niceNum, aF as almostWhole, aG as almostEquals, aH as _decimalPlaces, aI as _longestText, aJ as _filterBetween, aK as _lookup } from './chunks/helpers.segment.js';\nexport { d as defaults } from './chunks/helpers.segment.js';\n\nclass Animator {\n  constructor() {\n    this._request = null;\n    this._charts = new Map();\n    this._running = false;\n    this._lastDate = undefined;\n  }\n  _notify(chart, anims, date, type) {\n    const callbacks = anims.listeners[type];\n    const numSteps = anims.duration;\n    callbacks.forEach(fn => fn({\n      chart,\n      initial: anims.initial,\n      numSteps,\n      currentStep: Math.min(date - anims.start, numSteps)\n    }));\n  }\n  _refresh() {\n    if (this._request) {\n      return;\n    }\n    this._running = true;\n    this._request = requestAnimFrame.call(window, () => {\n      this._update();\n      this._request = null;\n      if (this._running) {\n        this._refresh();\n      }\n    });\n  }\n  _update(date = Date.now()) {\n    let remaining = 0;\n    this._charts.forEach((anims, chart) => {\n      if (!anims.running || !anims.items.length) {\n        return;\n      }\n      const items = anims.items;\n      let i = items.length - 1;\n      let draw = false;\n      let item;\n      for (; i >= 0; --i) {\n        item = items[i];\n        if (item._active) {\n          if (item._total > anims.duration) {\n            anims.duration = item._total;\n          }\n          item.tick(date);\n          draw = true;\n        } else {\n          items[i] = items[items.length - 1];\n          items.pop();\n        }\n      }\n      if (draw) {\n        chart.draw();\n        this._notify(chart, anims, date, 'progress');\n      }\n      if (!items.length) {\n        anims.running = false;\n        this._notify(chart, anims, date, 'complete');\n        anims.initial = false;\n      }\n      remaining += items.length;\n    });\n    this._lastDate = date;\n    if (remaining === 0) {\n      this._running = false;\n    }\n  }\n  _getAnims(chart) {\n    const charts = this._charts;\n    let anims = charts.get(chart);\n    if (!anims) {\n      anims = {\n        running: false,\n        initial: true,\n        items: [],\n        listeners: {\n          complete: [],\n          progress: []\n        }\n      };\n      charts.set(chart, anims);\n    }\n    return anims;\n  }\n  listen(chart, event, cb) {\n    this._getAnims(chart).listeners[event].push(cb);\n  }\n  add(chart, items) {\n    if (!items || !items.length) {\n      return;\n    }\n    this._getAnims(chart).items.push(...items);\n  }\n  has(chart) {\n    return this._getAnims(chart).items.length > 0;\n  }\n  start(chart) {\n    const anims = this._charts.get(chart);\n    if (!anims) {\n      return;\n    }\n    anims.running = true;\n    anims.start = Date.now();\n    anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n    this._refresh();\n  }\n  running(chart) {\n    if (!this._running) {\n      return false;\n    }\n    const anims = this._charts.get(chart);\n    if (!anims || !anims.running || !anims.items.length) {\n      return false;\n    }\n    return true;\n  }\n  stop(chart) {\n    const anims = this._charts.get(chart);\n    if (!anims || !anims.items.length) {\n      return;\n    }\n    const items = anims.items;\n    let i = items.length - 1;\n    for (; i >= 0; --i) {\n      items[i].cancel();\n    }\n    anims.items = [];\n    this._notify(chart, anims, Date.now(), 'complete');\n  }\n  remove(chart) {\n    return this._charts.delete(chart);\n  }\n}\nvar animator = new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n  boolean(from, to, factor) {\n    return factor > 0.5 ? to : from;\n  },\n  color(from, to, factor) {\n    const c0 = color(from || transparent);\n    const c1 = c0.valid && color(to || transparent);\n    return c1 && c1.valid\n      ? c1.mix(c0, factor).hexString()\n      : to;\n  },\n  number(from, to, factor) {\n    return from + (to - from) * factor;\n  }\n};\nclass Animation {\n  constructor(cfg, target, prop, to) {\n    const currentValue = target[prop];\n    to = resolve([cfg.to, to, currentValue, cfg.from]);\n    const from = resolve([cfg.from, currentValue, to]);\n    this._active = true;\n    this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n    this._easing = effects[cfg.easing] || effects.linear;\n    this._start = Math.floor(Date.now() + (cfg.delay || 0));\n    this._duration = this._total = Math.floor(cfg.duration);\n    this._loop = !!cfg.loop;\n    this._target = target;\n    this._prop = prop;\n    this._from = from;\n    this._to = to;\n    this._promises = undefined;\n  }\n  active() {\n    return this._active;\n  }\n  update(cfg, to, date) {\n    if (this._active) {\n      this._notify(false);\n      const currentValue = this._target[this._prop];\n      const elapsed = date - this._start;\n      const remain = this._duration - elapsed;\n      this._start = date;\n      this._duration = Math.floor(Math.max(remain, cfg.duration));\n      this._total += elapsed;\n      this._loop = !!cfg.loop;\n      this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n      this._from = resolve([cfg.from, currentValue, to]);\n    }\n  }\n  cancel() {\n    if (this._active) {\n      this.tick(Date.now());\n      this._active = false;\n      this._notify(false);\n    }\n  }\n  tick(date) {\n    const elapsed = date - this._start;\n    const duration = this._duration;\n    const prop = this._prop;\n    const from = this._from;\n    const loop = this._loop;\n    const to = this._to;\n    let factor;\n    this._active = from !== to && (loop || (elapsed < duration));\n    if (!this._active) {\n      this._target[prop] = to;\n      this._notify(true);\n      return;\n    }\n    if (elapsed < 0) {\n      this._target[prop] = from;\n      return;\n    }\n    factor = (elapsed / duration) % 2;\n    factor = loop && factor > 1 ? 2 - factor : factor;\n    factor = this._easing(Math.min(1, Math.max(0, factor)));\n    this._target[prop] = this._fn(from, to, factor);\n  }\n  wait() {\n    const promises = this._promises || (this._promises = []);\n    return new Promise((res, rej) => {\n      promises.push({res, rej});\n    });\n  }\n  _notify(resolved) {\n    const method = resolved ? 'res' : 'rej';\n    const promises = this._promises || [];\n    for (let i = 0; i < promises.length; i++) {\n      promises[i][method]();\n    }\n  }\n}\n\nconst numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\ndefaults.set('animation', {\n  delay: undefined,\n  duration: 1000,\n  easing: 'easeOutQuart',\n  fn: undefined,\n  from: undefined,\n  loop: undefined,\n  to: undefined,\n  type: undefined,\n});\nconst animationOptions = Object.keys(defaults.animation);\ndefaults.describe('animation', {\n  _fallback: false,\n  _indexable: false,\n  _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n});\ndefaults.set('animations', {\n  colors: {\n    type: 'color',\n    properties: colors\n  },\n  numbers: {\n    type: 'number',\n    properties: numbers\n  },\n});\ndefaults.describe('animations', {\n  _fallback: 'animation',\n});\ndefaults.set('transitions', {\n  active: {\n    animation: {\n      duration: 400\n    }\n  },\n  resize: {\n    animation: {\n      duration: 0\n    }\n  },\n  show: {\n    animations: {\n      colors: {\n        from: 'transparent'\n      },\n      visible: {\n        type: 'boolean',\n        duration: 0\n      },\n    }\n  },\n  hide: {\n    animations: {\n      colors: {\n        to: 'transparent'\n      },\n      visible: {\n        type: 'boolean',\n        easing: 'linear',\n        fn: v => v | 0\n      },\n    }\n  }\n});\nclass Animations {\n  constructor(chart, config) {\n    this._chart = chart;\n    this._properties = new Map();\n    this.configure(config);\n  }\n  configure(config) {\n    if (!isObject(config)) {\n      return;\n    }\n    const animatedProps = this._properties;\n    Object.getOwnPropertyNames(config).forEach(key => {\n      const cfg = config[key];\n      if (!isObject(cfg)) {\n        return;\n      }\n      const resolved = {};\n      for (const option of animationOptions) {\n        resolved[option] = cfg[option];\n      }\n      (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n        if (prop === key || !animatedProps.has(prop)) {\n          animatedProps.set(prop, resolved);\n        }\n      });\n    });\n  }\n  _animateOptions(target, values) {\n    const newOptions = values.options;\n    const options = resolveTargetOptions(target, newOptions);\n    if (!options) {\n      return [];\n    }\n    const animations = this._createAnimations(options, newOptions);\n    if (newOptions.$shared) {\n      awaitAll(target.options.$animations, newOptions).then(() => {\n        target.options = newOptions;\n      }, () => {\n      });\n    }\n    return animations;\n  }\n  _createAnimations(target, values) {\n    const animatedProps = this._properties;\n    const animations = [];\n    const running = target.$animations || (target.$animations = {});\n    const props = Object.keys(values);\n    const date = Date.now();\n    let i;\n    for (i = props.length - 1; i >= 0; --i) {\n      const prop = props[i];\n      if (prop.charAt(0) === '$') {\n        continue;\n      }\n      if (prop === 'options') {\n        animations.push(...this._animateOptions(target, values));\n        continue;\n      }\n      const value = values[prop];\n      let animation = running[prop];\n      const cfg = animatedProps.get(prop);\n      if (animation) {\n        if (cfg && animation.active()) {\n          animation.update(cfg, value, date);\n          continue;\n        } else {\n          animation.cancel();\n        }\n      }\n      if (!cfg || !cfg.duration) {\n        target[prop] = value;\n        continue;\n      }\n      running[prop] = animation = new Animation(cfg, target, prop, value);\n      animations.push(animation);\n    }\n    return animations;\n  }\n  update(target, values) {\n    if (this._properties.size === 0) {\n      Object.assign(target, values);\n      return;\n    }\n    const animations = this._createAnimations(target, values);\n    if (animations.length) {\n      animator.add(this._chart, animations);\n      return true;\n    }\n  }\n}\nfunction awaitAll(animations, properties) {\n  const running = [];\n  const keys = Object.keys(properties);\n  for (let i = 0; i < keys.length; i++) {\n    const anim = animations[keys[i]];\n    if (anim && anim.active()) {\n      running.push(anim.wait());\n    }\n  }\n  return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n  if (!newOptions) {\n    return;\n  }\n  let options = target.options;\n  if (!options) {\n    target.options = newOptions;\n    return;\n  }\n  if (options.$shared) {\n    target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n  }\n  return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n  const opts = scale && scale.options || {};\n  const reverse = opts.reverse;\n  const min = opts.min === undefined ? allowedOverflow : 0;\n  const max = opts.max === undefined ? allowedOverflow : 0;\n  return {\n    start: reverse ? max : min,\n    end: reverse ? min : max\n  };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n  if (allowedOverflow === false) {\n    return false;\n  }\n  const x = scaleClip(xScale, allowedOverflow);\n  const y = scaleClip(yScale, allowedOverflow);\n  return {\n    top: y.end,\n    right: x.end,\n    bottom: y.start,\n    left: x.start\n  };\n}\nfunction toClip(value) {\n  let t, r, b, l;\n  if (isObject(value)) {\n    t = value.top;\n    r = value.right;\n    b = value.bottom;\n    l = value.left;\n  } else {\n    t = r = b = l = value;\n  }\n  return {\n    top: t,\n    right: r,\n    bottom: b,\n    left: l,\n    disabled: value === false\n  };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n  const keys = [];\n  const metasets = chart._getSortedDatasetMetas(filterVisible);\n  let i, ilen;\n  for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n    keys.push(metasets[i].index);\n  }\n  return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n  const keys = stack.keys;\n  const singleMode = options.mode === 'single';\n  let i, ilen, datasetIndex, otherValue;\n  if (value === null) {\n    return;\n  }\n  for (i = 0, ilen = keys.length; i < ilen; ++i) {\n    datasetIndex = +keys[i];\n    if (datasetIndex === dsIndex) {\n      if (options.all) {\n        continue;\n      }\n      break;\n    }\n    otherValue = stack.values[datasetIndex];\n    if (isNumberFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n      value += otherValue;\n    }\n  }\n  return value;\n}\nfunction convertObjectDataToArray(data) {\n  const keys = Object.keys(data);\n  const adata = new Array(keys.length);\n  let i, ilen, key;\n  for (i = 0, ilen = keys.length; i < ilen; ++i) {\n    key = keys[i];\n    adata[i] = {\n      x: key,\n      y: data[key]\n    };\n  }\n  return adata;\n}\nfunction isStacked(scale, meta) {\n  const stacked = scale && scale.options.stacked;\n  return stacked || (stacked === undefined && meta.stack !== undefined);\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n  return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n  const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n  return {\n    min: minDefined ? min : Number.NEGATIVE_INFINITY,\n    max: maxDefined ? max : Number.POSITIVE_INFINITY\n  };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n  const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n  return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n  for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n    const value = stack[meta.index];\n    if ((positive && value > 0) || (!positive && value < 0)) {\n      return meta.index;\n    }\n  }\n  return null;\n}\nfunction updateStacks(controller, parsed) {\n  const {chart, _cachedMeta: meta} = controller;\n  const stacks = chart._stacks || (chart._stacks = {});\n  const {iScale, vScale, index: datasetIndex} = meta;\n  const iAxis = iScale.axis;\n  const vAxis = vScale.axis;\n  const key = getStackKey(iScale, vScale, meta);\n  const ilen = parsed.length;\n  let stack;\n  for (let i = 0; i < ilen; ++i) {\n    const item = parsed[i];\n    const {[iAxis]: index, [vAxis]: value} = item;\n    const itemStacks = item._stacks || (item._stacks = {});\n    stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n    stack[datasetIndex] = value;\n    stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n    stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n  }\n}\nfunction getFirstScaleId(chart, axis) {\n  const scales = chart.scales;\n  return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n  return createContext(parent,\n    {\n      active: false,\n      dataset: undefined,\n      datasetIndex: index,\n      index,\n      mode: 'default',\n      type: 'dataset'\n    }\n  );\n}\nfunction createDataContext(parent, index, element) {\n  return createContext(parent, {\n    active: false,\n    dataIndex: index,\n    parsed: undefined,\n    raw: undefined,\n    element,\n    index,\n    mode: 'default',\n    type: 'data'\n  });\n}\nfunction clearStacks(meta, items) {\n  const datasetIndex = meta.controller.index;\n  const axis = meta.vScale && meta.vScale.axis;\n  if (!axis) {\n    return;\n  }\n  items = items || meta._parsed;\n  for (const parsed of items) {\n    const stacks = parsed._stacks;\n    if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n      return;\n    }\n    delete stacks[axis][datasetIndex];\n  }\n}\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n  && {keys: getSortedDatasetIndices(chart, true), values: null};\nclass DatasetController {\n  constructor(chart, datasetIndex) {\n    this.chart = chart;\n    this._ctx = chart.ctx;\n    this.index = datasetIndex;\n    this._cachedDataOpts = {};\n    this._cachedMeta = this.getMeta();\n    this._type = this._cachedMeta.type;\n    this.options = undefined;\n    this._parsing = false;\n    this._data = undefined;\n    this._objectData = undefined;\n    this._sharedOptions = undefined;\n    this._drawStart = undefined;\n    this._drawCount = undefined;\n    this.enableOptionSharing = false;\n    this.$context = undefined;\n    this._syncList = [];\n    this.initialize();\n  }\n  initialize() {\n    const meta = this._cachedMeta;\n    this.configure();\n    this.linkScales();\n    meta._stacked = isStacked(meta.vScale, meta);\n    this.addElements();\n  }\n  updateIndex(datasetIndex) {\n    if (this.index !== datasetIndex) {\n      clearStacks(this._cachedMeta);\n    }\n    this.index = datasetIndex;\n  }\n  linkScales() {\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const dataset = this.getDataset();\n    const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n    const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n    const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n    const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n    const indexAxis = meta.indexAxis;\n    const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n    const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n    meta.xScale = this.getScaleForId(xid);\n    meta.yScale = this.getScaleForId(yid);\n    meta.rScale = this.getScaleForId(rid);\n    meta.iScale = this.getScaleForId(iid);\n    meta.vScale = this.getScaleForId(vid);\n  }\n  getDataset() {\n    return this.chart.data.datasets[this.index];\n  }\n  getMeta() {\n    return this.chart.getDatasetMeta(this.index);\n  }\n  getScaleForId(scaleID) {\n    return this.chart.scales[scaleID];\n  }\n  _getOtherScale(scale) {\n    const meta = this._cachedMeta;\n    return scale === meta.iScale\n      ? meta.vScale\n      : meta.iScale;\n  }\n  reset() {\n    this._update('reset');\n  }\n  _destroy() {\n    const meta = this._cachedMeta;\n    if (this._data) {\n      unlistenArrayEvents(this._data, this);\n    }\n    if (meta._stacked) {\n      clearStacks(meta);\n    }\n  }\n  _dataCheck() {\n    const dataset = this.getDataset();\n    const data = dataset.data || (dataset.data = []);\n    const _data = this._data;\n    if (isObject(data)) {\n      this._data = convertObjectDataToArray(data);\n    } else if (_data !== data) {\n      if (_data) {\n        unlistenArrayEvents(_data, this);\n        const meta = this._cachedMeta;\n        clearStacks(meta);\n        meta._parsed = [];\n      }\n      if (data && Object.isExtensible(data)) {\n        listenArrayEvents(data, this);\n      }\n      this._syncList = [];\n      this._data = data;\n    }\n  }\n  addElements() {\n    const meta = this._cachedMeta;\n    this._dataCheck();\n    if (this.datasetElementType) {\n      meta.dataset = new this.datasetElementType();\n    }\n  }\n  buildOrUpdateElements(resetNewElements) {\n    const meta = this._cachedMeta;\n    const dataset = this.getDataset();\n    let stackChanged = false;\n    this._dataCheck();\n    const oldStacked = meta._stacked;\n    meta._stacked = isStacked(meta.vScale, meta);\n    if (meta.stack !== dataset.stack) {\n      stackChanged = true;\n      clearStacks(meta);\n      meta.stack = dataset.stack;\n    }\n    this._resyncElements(resetNewElements);\n    if (stackChanged || oldStacked !== meta._stacked) {\n      updateStacks(this, meta._parsed);\n    }\n  }\n  configure() {\n    const config = this.chart.config;\n    const scopeKeys = config.datasetScopeKeys(this._type);\n    const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n    this.options = config.createResolver(scopes, this.getContext());\n    this._parsing = this.options.parsing;\n    this._cachedDataOpts = {};\n  }\n  parse(start, count) {\n    const {_cachedMeta: meta, _data: data} = this;\n    const {iScale, _stacked} = meta;\n    const iAxis = iScale.axis;\n    let sorted = start === 0 && count === data.length ? true : meta._sorted;\n    let prev = start > 0 && meta._parsed[start - 1];\n    let i, cur, parsed;\n    if (this._parsing === false) {\n      meta._parsed = data;\n      meta._sorted = true;\n      parsed = data;\n    } else {\n      if (isArray(data[start])) {\n        parsed = this.parseArrayData(meta, data, start, count);\n      } else if (isObject(data[start])) {\n        parsed = this.parseObjectData(meta, data, start, count);\n      } else {\n        parsed = this.parsePrimitiveData(meta, data, start, count);\n      }\n      const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n      for (i = 0; i < count; ++i) {\n        meta._parsed[i + start] = cur = parsed[i];\n        if (sorted) {\n          if (isNotInOrderComparedToPrev()) {\n            sorted = false;\n          }\n          prev = cur;\n        }\n      }\n      meta._sorted = sorted;\n    }\n    if (_stacked) {\n      updateStacks(this, parsed);\n    }\n  }\n  parsePrimitiveData(meta, data, start, count) {\n    const {iScale, vScale} = meta;\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const labels = iScale.getLabels();\n    const singleScale = iScale === vScale;\n    const parsed = new Array(count);\n    let i, ilen, index;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      parsed[i] = {\n        [iAxis]: singleScale || iScale.parse(labels[index], index),\n        [vAxis]: vScale.parse(data[index], index)\n      };\n    }\n    return parsed;\n  }\n  parseArrayData(meta, data, start, count) {\n    const {xScale, yScale} = meta;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      item = data[index];\n      parsed[i] = {\n        x: xScale.parse(item[0], index),\n        y: yScale.parse(item[1], index)\n      };\n    }\n    return parsed;\n  }\n  parseObjectData(meta, data, start, count) {\n    const {xScale, yScale} = meta;\n    const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n    for (i = 0, ilen = count; i < ilen; ++i) {\n      index = i + start;\n      item = data[index];\n      parsed[i] = {\n        x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n        y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n      };\n    }\n    return parsed;\n  }\n  getParsed(index) {\n    return this._cachedMeta._parsed[index];\n  }\n  getDataElement(index) {\n    return this._cachedMeta.data[index];\n  }\n  applyStack(scale, parsed, mode) {\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const value = parsed[scale.axis];\n    const stack = {\n      keys: getSortedDatasetIndices(chart, true),\n      values: parsed._stacks[scale.axis]\n    };\n    return applyStack(stack, value, meta.index, {mode});\n  }\n  updateRangeFromParsed(range, scale, parsed, stack) {\n    const parsedValue = parsed[scale.axis];\n    let value = parsedValue === null ? NaN : parsedValue;\n    const values = stack && parsed._stacks[scale.axis];\n    if (stack && values) {\n      stack.values = values;\n      value = applyStack(stack, parsedValue, this._cachedMeta.index);\n    }\n    range.min = Math.min(range.min, value);\n    range.max = Math.max(range.max, value);\n  }\n  getMinMax(scale, canStack) {\n    const meta = this._cachedMeta;\n    const _parsed = meta._parsed;\n    const sorted = meta._sorted && scale === meta.iScale;\n    const ilen = _parsed.length;\n    const otherScale = this._getOtherScale(scale);\n    const stack = createStack(canStack, meta, this.chart);\n    const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n    const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n    let i, parsed;\n    function _skip() {\n      parsed = _parsed[i];\n      const otherValue = parsed[otherScale.axis];\n      return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n    }\n    for (i = 0; i < ilen; ++i) {\n      if (_skip()) {\n        continue;\n      }\n      this.updateRangeFromParsed(range, scale, parsed, stack);\n      if (sorted) {\n        break;\n      }\n    }\n    if (sorted) {\n      for (i = ilen - 1; i >= 0; --i) {\n        if (_skip()) {\n          continue;\n        }\n        this.updateRangeFromParsed(range, scale, parsed, stack);\n        break;\n      }\n    }\n    return range;\n  }\n  getAllParsedValues(scale) {\n    const parsed = this._cachedMeta._parsed;\n    const values = [];\n    let i, ilen, value;\n    for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n      value = parsed[i][scale.axis];\n      if (isNumberFinite(value)) {\n        values.push(value);\n      }\n    }\n    return values;\n  }\n  getMaxOverflow() {\n    return false;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const vScale = meta.vScale;\n    const parsed = this.getParsed(index);\n    return {\n      label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n      value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n    };\n  }\n  _update(mode) {\n    const meta = this._cachedMeta;\n    this.update(mode || 'default');\n    meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n  }\n  update(mode) {}\n  draw() {\n    const ctx = this._ctx;\n    const chart = this.chart;\n    const meta = this._cachedMeta;\n    const elements = meta.data || [];\n    const area = chart.chartArea;\n    const active = [];\n    const start = this._drawStart || 0;\n    const count = this._drawCount || (elements.length - start);\n    const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n    let i;\n    if (meta.dataset) {\n      meta.dataset.draw(ctx, area, start, count);\n    }\n    for (i = start; i < start + count; ++i) {\n      const element = elements[i];\n      if (element.hidden) {\n        continue;\n      }\n      if (element.active && drawActiveElementsOnTop) {\n        active.push(element);\n      } else {\n        element.draw(ctx, area);\n      }\n    }\n    for (i = 0; i < active.length; ++i) {\n      active[i].draw(ctx, area);\n    }\n  }\n  getStyle(index, active) {\n    const mode = active ? 'active' : 'default';\n    return index === undefined && this._cachedMeta.dataset\n      ? this.resolveDatasetElementOptions(mode)\n      : this.resolveDataElementOptions(index || 0, mode);\n  }\n  getContext(index, active, mode) {\n    const dataset = this.getDataset();\n    let context;\n    if (index >= 0 && index < this._cachedMeta.data.length) {\n      const element = this._cachedMeta.data[index];\n      context = element.$context ||\n        (element.$context = createDataContext(this.getContext(), index, element));\n      context.parsed = this.getParsed(index);\n      context.raw = dataset.data[index];\n      context.index = context.dataIndex = index;\n    } else {\n      context = this.$context ||\n        (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n      context.dataset = dataset;\n      context.index = context.datasetIndex = this.index;\n    }\n    context.active = !!active;\n    context.mode = mode;\n    return context;\n  }\n  resolveDatasetElementOptions(mode) {\n    return this._resolveElementOptions(this.datasetElementType.id, mode);\n  }\n  resolveDataElementOptions(index, mode) {\n    return this._resolveElementOptions(this.dataElementType.id, mode, index);\n  }\n  _resolveElementOptions(elementType, mode = 'default', index) {\n    const active = mode === 'active';\n    const cache = this._cachedDataOpts;\n    const cacheKey = elementType + '-' + mode;\n    const cached = cache[cacheKey];\n    const sharing = this.enableOptionSharing && defined(index);\n    if (cached) {\n      return cloneIfNotShared(cached, sharing);\n    }\n    const config = this.chart.config;\n    const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n    const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n    const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n    const names = Object.keys(defaults.elements[elementType]);\n    const context = () => this.getContext(index, active);\n    const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n    if (values.$shared) {\n      values.$shared = sharing;\n      cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n    }\n    return values;\n  }\n  _resolveAnimations(index, transition, active) {\n    const chart = this.chart;\n    const cache = this._cachedDataOpts;\n    const cacheKey = `animation-${transition}`;\n    const cached = cache[cacheKey];\n    if (cached) {\n      return cached;\n    }\n    let options;\n    if (chart.options.animation !== false) {\n      const config = this.chart.config;\n      const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n      const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n      options = config.createResolver(scopes, this.getContext(index, active, transition));\n    }\n    const animations = new Animations(chart, options && options.animations);\n    if (options && options._cacheable) {\n      cache[cacheKey] = Object.freeze(animations);\n    }\n    return animations;\n  }\n  getSharedOptions(options) {\n    if (!options.$shared) {\n      return;\n    }\n    return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n  }\n  includeOptions(mode, sharedOptions) {\n    return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n  }\n  updateElement(element, index, properties, mode) {\n    if (isDirectUpdateMode(mode)) {\n      Object.assign(element, properties);\n    } else {\n      this._resolveAnimations(index, mode).update(element, properties);\n    }\n  }\n  updateSharedOptions(sharedOptions, mode, newOptions) {\n    if (sharedOptions && !isDirectUpdateMode(mode)) {\n      this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n    }\n  }\n  _setStyle(element, index, mode, active) {\n    element.active = active;\n    const options = this.getStyle(index, active);\n    this._resolveAnimations(index, mode, active).update(element, {\n      options: (!active && this.getSharedOptions(options)) || options\n    });\n  }\n  removeHoverStyle(element, datasetIndex, index) {\n    this._setStyle(element, index, 'active', false);\n  }\n  setHoverStyle(element, datasetIndex, index) {\n    this._setStyle(element, index, 'active', true);\n  }\n  _removeDatasetHoverStyle() {\n    const element = this._cachedMeta.dataset;\n    if (element) {\n      this._setStyle(element, undefined, 'active', false);\n    }\n  }\n  _setDatasetHoverStyle() {\n    const element = this._cachedMeta.dataset;\n    if (element) {\n      this._setStyle(element, undefined, 'active', true);\n    }\n  }\n  _resyncElements(resetNewElements) {\n    const data = this._data;\n    const elements = this._cachedMeta.data;\n    for (const [method, arg1, arg2] of this._syncList) {\n      this[method](arg1, arg2);\n    }\n    this._syncList = [];\n    const numMeta = elements.length;\n    const numData = data.length;\n    const count = Math.min(numData, numMeta);\n    if (count) {\n      this.parse(0, count);\n    }\n    if (numData > numMeta) {\n      this._insertElements(numMeta, numData - numMeta, resetNewElements);\n    } else if (numData < numMeta) {\n      this._removeElements(numData, numMeta - numData);\n    }\n  }\n  _insertElements(start, count, resetNewElements = true) {\n    const meta = this._cachedMeta;\n    const data = meta.data;\n    const end = start + count;\n    let i;\n    const move = (arr) => {\n      arr.length += count;\n      for (i = arr.length - 1; i >= end; i--) {\n        arr[i] = arr[i - count];\n      }\n    };\n    move(data);\n    for (i = start; i < end; ++i) {\n      data[i] = new this.dataElementType();\n    }\n    if (this._parsing) {\n      move(meta._parsed);\n    }\n    this.parse(start, count);\n    if (resetNewElements) {\n      this.updateElements(data, start, count, 'reset');\n    }\n  }\n  updateElements(element, start, count, mode) {}\n  _removeElements(start, count) {\n    const meta = this._cachedMeta;\n    if (this._parsing) {\n      const removed = meta._parsed.splice(start, count);\n      if (meta._stacked) {\n        clearStacks(meta, removed);\n      }\n    }\n    meta.data.splice(start, count);\n  }\n  _sync(args) {\n    if (this._parsing) {\n      this._syncList.push(args);\n    } else {\n      const [method, arg1, arg2] = args;\n      this[method](arg1, arg2);\n    }\n    this.chart._dataChanges.push([this.index, ...args]);\n  }\n  _onDataPush() {\n    const count = arguments.length;\n    this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n  }\n  _onDataPop() {\n    this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n  }\n  _onDataShift() {\n    this._sync(['_removeElements', 0, 1]);\n  }\n  _onDataSplice(start, count) {\n    if (count) {\n      this._sync(['_removeElements', start, count]);\n    }\n    const newCount = arguments.length - 2;\n    if (newCount) {\n      this._sync(['_insertElements', start, newCount]);\n    }\n  }\n  _onDataUnshift() {\n    this._sync(['_insertElements', 0, arguments.length]);\n  }\n}\nDatasetController.defaults = {};\nDatasetController.prototype.datasetElementType = null;\nDatasetController.prototype.dataElementType = null;\n\nfunction getAllScaleValues(scale, type) {\n  if (!scale._cache.$bar) {\n    const visibleMetas = scale.getMatchingVisibleMetas(type);\n    let values = [];\n    for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n      values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n    }\n    scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n  }\n  return scale._cache.$bar;\n}\nfunction computeMinSampleSize(meta) {\n  const scale = meta.iScale;\n  const values = getAllScaleValues(scale, meta.type);\n  let min = scale._length;\n  let i, ilen, curr, prev;\n  const updateMinAndPrev = () => {\n    if (curr === 32767 || curr === -32768) {\n      return;\n    }\n    if (defined(prev)) {\n      min = Math.min(min, Math.abs(curr - prev) || min);\n    }\n    prev = curr;\n  };\n  for (i = 0, ilen = values.length; i < ilen; ++i) {\n    curr = scale.getPixelForValue(values[i]);\n    updateMinAndPrev();\n  }\n  prev = undefined;\n  for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n    curr = scale.getPixelForTick(i);\n    updateMinAndPrev();\n  }\n  return min;\n}\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n  const thickness = options.barThickness;\n  let size, ratio;\n  if (isNullOrUndef(thickness)) {\n    size = ruler.min * options.categoryPercentage;\n    ratio = options.barPercentage;\n  } else {\n    size = thickness * stackCount;\n    ratio = 1;\n  }\n  return {\n    chunk: size / stackCount,\n    ratio,\n    start: ruler.pixels[index] - (size / 2)\n  };\n}\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n  const pixels = ruler.pixels;\n  const curr = pixels[index];\n  let prev = index > 0 ? pixels[index - 1] : null;\n  let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n  const percent = options.categoryPercentage;\n  if (prev === null) {\n    prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n  }\n  if (next === null) {\n    next = curr + curr - prev;\n  }\n  const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n  const size = Math.abs(next - prev) / 2 * percent;\n  return {\n    chunk: size / stackCount,\n    ratio: options.barPercentage,\n    start\n  };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n  const startValue = vScale.parse(entry[0], i);\n  const endValue = vScale.parse(entry[1], i);\n  const min = Math.min(startValue, endValue);\n  const max = Math.max(startValue, endValue);\n  let barStart = min;\n  let barEnd = max;\n  if (Math.abs(min) > Math.abs(max)) {\n    barStart = max;\n    barEnd = min;\n  }\n  item[vScale.axis] = barEnd;\n  item._custom = {\n    barStart,\n    barEnd,\n    start: startValue,\n    end: endValue,\n    min,\n    max\n  };\n}\nfunction parseValue(entry, item, vScale, i) {\n  if (isArray(entry)) {\n    parseFloatBar(entry, item, vScale, i);\n  } else {\n    item[vScale.axis] = vScale.parse(entry, i);\n  }\n  return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n  const iScale = meta.iScale;\n  const vScale = meta.vScale;\n  const labels = iScale.getLabels();\n  const singleScale = iScale === vScale;\n  const parsed = [];\n  let i, ilen, item, entry;\n  for (i = start, ilen = start + count; i < ilen; ++i) {\n    entry = data[i];\n    item = {};\n    item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n    parsed.push(parseValue(entry, item, vScale, i));\n  }\n  return parsed;\n}\nfunction isFloatBar(custom) {\n  return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n  if (size !== 0) {\n    return sign(size);\n  }\n  return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n  let reverse, start, end, top, bottom;\n  if (properties.horizontal) {\n    reverse = properties.base > properties.x;\n    start = 'left';\n    end = 'right';\n  } else {\n    reverse = properties.base < properties.y;\n    start = 'bottom';\n    end = 'top';\n  }\n  if (reverse) {\n    top = 'end';\n    bottom = 'start';\n  } else {\n    top = 'start';\n    bottom = 'end';\n  }\n  return {start, end, reverse, top, bottom};\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n  let edge = options.borderSkipped;\n  const res = {};\n  if (!edge) {\n    properties.borderSkipped = res;\n    return;\n  }\n  const {start, end, reverse, top, bottom} = borderProps(properties);\n  if (edge === 'middle' && stack) {\n    properties.enableBorderRadius = true;\n    if ((stack._top || 0) === index) {\n      edge = top;\n    } else if ((stack._bottom || 0) === index) {\n      edge = bottom;\n    } else {\n      res[parseEdge(bottom, start, end, reverse)] = true;\n      edge = top;\n    }\n  }\n  res[parseEdge(edge, start, end, reverse)] = true;\n  properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n  if (reverse) {\n    edge = swap(edge, a, b);\n    edge = startEnd(edge, b, a);\n  } else {\n    edge = startEnd(edge, a, b);\n  }\n  return edge;\n}\nfunction swap(orig, v1, v2) {\n  return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n  return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n  properties.inflateAmount = inflateAmount === 'auto'\n    ? ratio === 1 ? 0.33 : 0\n    : inflateAmount;\n}\nclass BarController extends DatasetController {\n  parsePrimitiveData(meta, data, start, count) {\n    return parseArrayOrPrimitive(meta, data, start, count);\n  }\n  parseArrayData(meta, data, start, count) {\n    return parseArrayOrPrimitive(meta, data, start, count);\n  }\n  parseObjectData(meta, data, start, count) {\n    const {iScale, vScale} = meta;\n    const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n    const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n    const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n    const parsed = [];\n    let i, ilen, item, obj;\n    for (i = start, ilen = start + count; i < ilen; ++i) {\n      obj = data[i];\n      item = {};\n      item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n      parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n    }\n    return parsed;\n  }\n  updateRangeFromParsed(range, scale, parsed, stack) {\n    super.updateRangeFromParsed(range, scale, parsed, stack);\n    const custom = parsed._custom;\n    if (custom && scale === this._cachedMeta.vScale) {\n      range.min = Math.min(range.min, custom.min);\n      range.max = Math.max(range.max, custom.max);\n    }\n  }\n  getMaxOverflow() {\n    return 0;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const {iScale, vScale} = meta;\n    const parsed = this.getParsed(index);\n    const custom = parsed._custom;\n    const value = isFloatBar(custom)\n      ? '[' + custom.start + ', ' + custom.end + ']'\n      : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n    return {\n      label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n      value\n    };\n  }\n  initialize() {\n    this.enableOptionSharing = true;\n    super.initialize();\n    const meta = this._cachedMeta;\n    meta.stack = this.getDataset().stack;\n  }\n  update(mode) {\n    const meta = this._cachedMeta;\n    this.updateElements(meta.data, 0, meta.data.length, mode);\n  }\n  updateElements(bars, start, count, mode) {\n    const reset = mode === 'reset';\n    const {index, _cachedMeta: {vScale}} = this;\n    const base = vScale.getBasePixel();\n    const horizontal = vScale.isHorizontal();\n    const ruler = this._getRuler();\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n    for (let i = start; i < start + count; i++) {\n      const parsed = this.getParsed(i);\n      const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n      const ipixels = this._calculateBarIndexPixels(i, ruler);\n      const stack = (parsed._stacks || {})[vScale.axis];\n      const properties = {\n        horizontal,\n        base: vpixels.base,\n        enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n        x: horizontal ? vpixels.head : ipixels.center,\n        y: horizontal ? ipixels.center : vpixels.head,\n        height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n        width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n      };\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n      }\n      const options = properties.options || bars[i].options;\n      setBorderSkipped(properties, options, stack, index);\n      setInflateAmount(properties, options, ruler.ratio);\n      this.updateElement(bars[i], i, properties, mode);\n    }\n  }\n  _getStacks(last, dataIndex) {\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const metasets = iScale.getMatchingVisibleMetas(this._type);\n    const stacked = iScale.options.stacked;\n    const ilen = metasets.length;\n    const stacks = [];\n    let i, item;\n    for (i = 0; i < ilen; ++i) {\n      item = metasets[i];\n      if (!item.controller.options.grouped) {\n        continue;\n      }\n      if (typeof dataIndex !== 'undefined') {\n        const val = item.controller.getParsed(dataIndex)[\n          item.controller._cachedMeta.vScale.axis\n        ];\n        if (isNullOrUndef(val) || isNaN(val)) {\n          continue;\n        }\n      }\n      if (stacked === false || stacks.indexOf(item.stack) === -1 ||\n\t\t\t\t(stacked === undefined && item.stack === undefined)) {\n        stacks.push(item.stack);\n      }\n      if (item.index === last) {\n        break;\n      }\n    }\n    if (!stacks.length) {\n      stacks.push(undefined);\n    }\n    return stacks;\n  }\n  _getStackCount(index) {\n    return this._getStacks(undefined, index).length;\n  }\n  _getStackIndex(datasetIndex, name, dataIndex) {\n    const stacks = this._getStacks(datasetIndex, dataIndex);\n    const index = (name !== undefined)\n      ? stacks.indexOf(name)\n      : -1;\n    return (index === -1)\n      ? stacks.length - 1\n      : index;\n  }\n  _getRuler() {\n    const opts = this.options;\n    const meta = this._cachedMeta;\n    const iScale = meta.iScale;\n    const pixels = [];\n    let i, ilen;\n    for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n      pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n    }\n    const barThickness = opts.barThickness;\n    const min = barThickness || computeMinSampleSize(meta);\n    return {\n      min,\n      pixels,\n      start: iScale._startPixel,\n      end: iScale._endPixel,\n      stackCount: this._getStackCount(),\n      scale: iScale,\n      grouped: opts.grouped,\n      ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n    };\n  }\n  _calculateBarValuePixels(index) {\n    const {_cachedMeta: {vScale, _stacked}, options: {base: baseValue, minBarLength}} = this;\n    const actualBase = baseValue || 0;\n    const parsed = this.getParsed(index);\n    const custom = parsed._custom;\n    const floating = isFloatBar(custom);\n    let value = parsed[vScale.axis];\n    let start = 0;\n    let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n    let head, size;\n    if (length !== value) {\n      start = length - value;\n      length = value;\n    }\n    if (floating) {\n      value = custom.barStart;\n      length = custom.barEnd - custom.barStart;\n      if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n        start = 0;\n      }\n      start += value;\n    }\n    const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n    let base = vScale.getPixelForValue(startValue);\n    if (this.chart.getDataVisibility(index)) {\n      head = vScale.getPixelForValue(start + length);\n    } else {\n      head = base;\n    }\n    size = head - base;\n    if (Math.abs(size) < minBarLength) {\n      size = barSign(size, vScale, actualBase) * minBarLength;\n      if (value === actualBase) {\n        base -= size / 2;\n      }\n      head = base + size;\n    }\n    if (base === vScale.getPixelForValue(actualBase)) {\n      const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n      base += halfGrid;\n      size -= halfGrid;\n    }\n    return {\n      size,\n      base,\n      head,\n      center: head + size / 2\n    };\n  }\n  _calculateBarIndexPixels(index, ruler) {\n    const scale = ruler.scale;\n    const options = this.options;\n    const skipNull = options.skipNull;\n    const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n    let center, size;\n    if (ruler.grouped) {\n      const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n      const range = options.barThickness === 'flex'\n        ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n        : computeFitCategoryTraits(index, ruler, options, stackCount);\n      const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n      center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n      size = Math.min(maxBarThickness, range.chunk * range.ratio);\n    } else {\n      center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n      size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n    }\n    return {\n      base: center - size / 2,\n      head: center + size / 2,\n      center,\n      size\n    };\n  }\n  draw() {\n    const meta = this._cachedMeta;\n    const vScale = meta.vScale;\n    const rects = meta.data;\n    const ilen = rects.length;\n    let i = 0;\n    for (; i < ilen; ++i) {\n      if (this.getParsed(i)[vScale.axis] !== null) {\n        rects[i].draw(this._ctx);\n      }\n    }\n  }\n}\nBarController.id = 'bar';\nBarController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'bar',\n  categoryPercentage: 0.8,\n  barPercentage: 0.9,\n  grouped: true,\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['x', 'y', 'base', 'width', 'height']\n    }\n  }\n};\nBarController.overrides = {\n  scales: {\n    _index_: {\n      type: 'category',\n      offset: true,\n      grid: {\n        offset: true\n      }\n    },\n    _value_: {\n      type: 'linear',\n      beginAtZero: true,\n    }\n  }\n};\n\nclass BubbleController extends DatasetController {\n  initialize() {\n    this.enableOptionSharing = true;\n    super.initialize();\n  }\n  parsePrimitiveData(meta, data, start, count) {\n    const parsed = super.parsePrimitiveData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n    }\n    return parsed;\n  }\n  parseArrayData(meta, data, start, count) {\n    const parsed = super.parseArrayData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      const item = data[start + i];\n      parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n    }\n    return parsed;\n  }\n  parseObjectData(meta, data, start, count) {\n    const parsed = super.parseObjectData(meta, data, start, count);\n    for (let i = 0; i < parsed.length; i++) {\n      const item = data[start + i];\n      parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n    }\n    return parsed;\n  }\n  getMaxOverflow() {\n    const data = this._cachedMeta.data;\n    let max = 0;\n    for (let i = data.length - 1; i >= 0; --i) {\n      max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n    }\n    return max > 0 && max;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const {xScale, yScale} = meta;\n    const parsed = this.getParsed(index);\n    const x = xScale.getLabelForValue(parsed.x);\n    const y = yScale.getLabelForValue(parsed.y);\n    const r = parsed._custom;\n    return {\n      label: meta.label,\n      value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n    };\n  }\n  update(mode) {\n    const points = this._cachedMeta.data;\n    this.updateElements(points, 0, points.length, mode);\n  }\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale} = this._cachedMeta;\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    for (let i = start; i < start + count; i++) {\n      const point = points[i];\n      const parsed = !reset && this.getParsed(i);\n      const properties = {};\n      const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n      const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n      properties.skip = isNaN(iPixel) || isNaN(vPixel);\n      if (includeOptions) {\n        properties.options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n        if (reset) {\n          properties.options.radius = 0;\n        }\n      }\n      this.updateElement(point, i, properties, mode);\n    }\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n  }\n  resolveDataElementOptions(index, mode) {\n    const parsed = this.getParsed(index);\n    let values = super.resolveDataElementOptions(index, mode);\n    if (values.$shared) {\n      values = Object.assign({}, values, {$shared: false});\n    }\n    const radius = values.radius;\n    if (mode !== 'active') {\n      values.radius = 0;\n    }\n    values.radius += valueOrDefault(parsed && parsed._custom, radius);\n    return values;\n  }\n}\nBubbleController.id = 'bubble';\nBubbleController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'point',\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['x', 'y', 'borderWidth', 'radius']\n    }\n  }\n};\nBubbleController.overrides = {\n  scales: {\n    x: {\n      type: 'linear'\n    },\n    y: {\n      type: 'linear'\n    }\n  },\n  plugins: {\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        }\n      }\n    }\n  }\n};\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n  let ratioX = 1;\n  let ratioY = 1;\n  let offsetX = 0;\n  let offsetY = 0;\n  if (circumference < TAU) {\n    const startAngle = rotation;\n    const endAngle = startAngle + circumference;\n    const startX = Math.cos(startAngle);\n    const startY = Math.sin(startAngle);\n    const endX = Math.cos(endAngle);\n    const endY = Math.sin(endAngle);\n    const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n    const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n    const maxX = calcMax(0, startX, endX);\n    const maxY = calcMax(HALF_PI, startY, endY);\n    const minX = calcMin(PI, startX, endX);\n    const minY = calcMin(PI + HALF_PI, startY, endY);\n    ratioX = (maxX - minX) / 2;\n    ratioY = (maxY - minY) / 2;\n    offsetX = -(maxX + minX) / 2;\n    offsetY = -(maxY + minY) / 2;\n  }\n  return {ratioX, ratioY, offsetX, offsetY};\n}\nclass DoughnutController extends DatasetController {\n  constructor(chart, datasetIndex) {\n    super(chart, datasetIndex);\n    this.enableOptionSharing = true;\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n    this.offsetX = undefined;\n    this.offsetY = undefined;\n  }\n  linkScales() {}\n  parse(start, count) {\n    const data = this.getDataset().data;\n    const meta = this._cachedMeta;\n    if (this._parsing === false) {\n      meta._parsed = data;\n    } else {\n      let getter = (i) => +data[i];\n      if (isObject(data[start])) {\n        const {key = 'value'} = this._parsing;\n        getter = (i) => +resolveObjectKey(data[i], key);\n      }\n      let i, ilen;\n      for (i = start, ilen = start + count; i < ilen; ++i) {\n        meta._parsed[i] = getter(i);\n      }\n    }\n  }\n  _getRotation() {\n    return toRadians(this.options.rotation - 90);\n  }\n  _getCircumference() {\n    return toRadians(this.options.circumference);\n  }\n  _getRotationExtents() {\n    let min = TAU;\n    let max = -TAU;\n    for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n      if (this.chart.isDatasetVisible(i)) {\n        const controller = this.chart.getDatasetMeta(i).controller;\n        const rotation = controller._getRotation();\n        const circumference = controller._getCircumference();\n        min = Math.min(min, rotation);\n        max = Math.max(max, rotation + circumference);\n      }\n    }\n    return {\n      rotation: min,\n      circumference: max - min,\n    };\n  }\n  update(mode) {\n    const chart = this.chart;\n    const {chartArea} = chart;\n    const meta = this._cachedMeta;\n    const arcs = meta.data;\n    const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n    const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n    const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n    const chartWeight = this._getRingWeight(this.index);\n    const {circumference, rotation} = this._getRotationExtents();\n    const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n    const maxWidth = (chartArea.width - spacing) / ratioX;\n    const maxHeight = (chartArea.height - spacing) / ratioY;\n    const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n    const outerRadius = toDimension(this.options.radius, maxRadius);\n    const innerRadius = Math.max(outerRadius * cutout, 0);\n    const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n    this.offsetX = offsetX * outerRadius;\n    this.offsetY = offsetY * outerRadius;\n    meta.total = this.calculateTotal();\n    this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n    this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n    this.updateElements(arcs, 0, arcs.length, mode);\n  }\n  _circumference(i, reset) {\n    const opts = this.options;\n    const meta = this._cachedMeta;\n    const circumference = this._getCircumference();\n    if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n      return 0;\n    }\n    return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n  }\n  updateElements(arcs, start, count, mode) {\n    const reset = mode === 'reset';\n    const chart = this.chart;\n    const chartArea = chart.chartArea;\n    const opts = chart.options;\n    const animationOpts = opts.animation;\n    const centerX = (chartArea.left + chartArea.right) / 2;\n    const centerY = (chartArea.top + chartArea.bottom) / 2;\n    const animateScale = reset && animationOpts.animateScale;\n    const innerRadius = animateScale ? 0 : this.innerRadius;\n    const outerRadius = animateScale ? 0 : this.outerRadius;\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    let startAngle = this._getRotation();\n    let i;\n    for (i = 0; i < start; ++i) {\n      startAngle += this._circumference(i, reset);\n    }\n    for (i = start; i < start + count; ++i) {\n      const circumference = this._circumference(i, reset);\n      const arc = arcs[i];\n      const properties = {\n        x: centerX + this.offsetX,\n        y: centerY + this.offsetY,\n        startAngle,\n        endAngle: startAngle + circumference,\n        circumference,\n        outerRadius,\n        innerRadius\n      };\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n      }\n      startAngle += circumference;\n      this.updateElement(arc, i, properties, mode);\n    }\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n  }\n  calculateTotal() {\n    const meta = this._cachedMeta;\n    const metaData = meta.data;\n    let total = 0;\n    let i;\n    for (i = 0; i < metaData.length; i++) {\n      const value = meta._parsed[i];\n      if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n        total += Math.abs(value);\n      }\n    }\n    return total;\n  }\n  calculateCircumference(value) {\n    const total = this._cachedMeta.total;\n    if (total > 0 && !isNaN(value)) {\n      return TAU * (Math.abs(value) / total);\n    }\n    return 0;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const chart = this.chart;\n    const labels = chart.data.labels || [];\n    const value = formatNumber(meta._parsed[index], chart.options.locale);\n    return {\n      label: labels[index] || '',\n      value,\n    };\n  }\n  getMaxBorderWidth(arcs) {\n    let max = 0;\n    const chart = this.chart;\n    let i, ilen, meta, controller, options;\n    if (!arcs) {\n      for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n        if (chart.isDatasetVisible(i)) {\n          meta = chart.getDatasetMeta(i);\n          arcs = meta.data;\n          controller = meta.controller;\n          break;\n        }\n      }\n    }\n    if (!arcs) {\n      return 0;\n    }\n    for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n      options = controller.resolveDataElementOptions(i);\n      if (options.borderAlign !== 'inner') {\n        max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n      }\n    }\n    return max;\n  }\n  getMaxOffset(arcs) {\n    let max = 0;\n    for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n      const options = this.resolveDataElementOptions(i);\n      max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n    }\n    return max;\n  }\n  _getRingWeightOffset(datasetIndex) {\n    let ringWeightOffset = 0;\n    for (let i = 0; i < datasetIndex; ++i) {\n      if (this.chart.isDatasetVisible(i)) {\n        ringWeightOffset += this._getRingWeight(i);\n      }\n    }\n    return ringWeightOffset;\n  }\n  _getRingWeight(datasetIndex) {\n    return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n  }\n  _getVisibleDatasetWeightTotal() {\n    return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n  }\n}\nDoughnutController.id = 'doughnut';\nDoughnutController.defaults = {\n  datasetElementType: false,\n  dataElementType: 'arc',\n  animation: {\n    animateRotate: true,\n    animateScale: false\n  },\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n    },\n  },\n  cutout: '50%',\n  rotation: 0,\n  circumference: 360,\n  radius: '100%',\n  spacing: 0,\n  indexAxis: 'r',\n};\nDoughnutController.descriptors = {\n  _scriptable: (name) => name !== 'spacing',\n  _indexable: (name) => name !== 'spacing',\n};\nDoughnutController.overrides = {\n  aspectRatio: 1,\n  plugins: {\n    legend: {\n      labels: {\n        generateLabels(chart) {\n          const data = chart.data;\n          if (data.labels.length && data.datasets.length) {\n            const {labels: {pointStyle}} = chart.legend.options;\n            return data.labels.map((label, i) => {\n              const meta = chart.getDatasetMeta(0);\n              const style = meta.controller.getStyle(i);\n              return {\n                text: label,\n                fillStyle: style.backgroundColor,\n                strokeStyle: style.borderColor,\n                lineWidth: style.borderWidth,\n                pointStyle: pointStyle,\n                hidden: !chart.getDataVisibility(i),\n                index: i\n              };\n            });\n          }\n          return [];\n        }\n      },\n      onClick(e, legendItem, legend) {\n        legend.chart.toggleDataVisibility(legendItem.index);\n        legend.chart.update();\n      }\n    },\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        },\n        label(tooltipItem) {\n          let dataLabel = tooltipItem.label;\n          const value = ': ' + tooltipItem.formattedValue;\n          if (isArray(dataLabel)) {\n            dataLabel = dataLabel.slice();\n            dataLabel[0] += value;\n          } else {\n            dataLabel += value;\n          }\n          return dataLabel;\n        }\n      }\n    }\n  }\n};\n\nclass LineController extends DatasetController {\n  initialize() {\n    this.enableOptionSharing = true;\n    super.initialize();\n  }\n  update(mode) {\n    const meta = this._cachedMeta;\n    const {dataset: line, data: points = [], _dataset} = meta;\n    const animationsDisabled = this.chart._animationsDisabled;\n    let {start, count} = getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n    this._drawStart = start;\n    this._drawCount = count;\n    if (scaleRangesChanged(meta)) {\n      start = 0;\n      count = points.length;\n    }\n    line._chart = this.chart;\n    line._datasetIndex = this.index;\n    line._decimated = !!_dataset._decimated;\n    line.points = points;\n    const options = this.resolveDatasetElementOptions(mode);\n    if (!this.options.showLine) {\n      options.borderWidth = 0;\n    }\n    options.segment = this.options.segment;\n    this.updateElement(line, undefined, {\n      animated: !animationsDisabled,\n      options\n    }, mode);\n    this.updateElements(points, start, count, mode);\n  }\n  updateElements(points, start, count, mode) {\n    const reset = mode === 'reset';\n    const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n    const firstOpts = this.resolveDataElementOptions(start, mode);\n    const sharedOptions = this.getSharedOptions(firstOpts);\n    const includeOptions = this.includeOptions(mode, sharedOptions);\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const {spanGaps, segment} = this.options;\n    const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n    const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n    let prevParsed = start > 0 && this.getParsed(start - 1);\n    for (let i = start; i < start + count; ++i) {\n      const point = points[i];\n      const parsed = this.getParsed(i);\n      const properties = directUpdate ? point : {};\n      const nullData = isNullOrUndef(parsed[vAxis]);\n      const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n      const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n      properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n      properties.stop = i > 0 && (parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n      if (segment) {\n        properties.parsed = parsed;\n        properties.raw = _dataset.data[i];\n      }\n      if (includeOptions) {\n        properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      }\n      if (!directUpdate) {\n        this.updateElement(point, i, properties, mode);\n      }\n      prevParsed = parsed;\n    }\n    this.updateSharedOptions(sharedOptions, mode, firstOpts);\n  }\n  getMaxOverflow() {\n    const meta = this._cachedMeta;\n    const dataset = meta.dataset;\n    const border = dataset.options && dataset.options.borderWidth || 0;\n    const data = meta.data || [];\n    if (!data.length) {\n      return border;\n    }\n    const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n    const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n    return Math.max(border, firstPoint, lastPoint) / 2;\n  }\n  draw() {\n    const meta = this._cachedMeta;\n    meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n    super.draw();\n  }\n}\nLineController.id = 'line';\nLineController.defaults = {\n  datasetElementType: 'line',\n  dataElementType: 'point',\n  showLine: true,\n  spanGaps: false,\n};\nLineController.overrides = {\n  scales: {\n    _index_: {\n      type: 'category',\n    },\n    _value_: {\n      type: 'linear',\n    },\n  }\n};\nfunction getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n  const pointCount = points.length;\n  let start = 0;\n  let count = pointCount;\n  if (meta._sorted) {\n    const {iScale, _parsed} = meta;\n    const axis = iScale.axis;\n    const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n    if (minDefined) {\n      start = _limitValue(Math.min(\n        _lookupByKey(_parsed, iScale.axis, min).lo,\n        animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n      0, pointCount - 1);\n    }\n    if (maxDefined) {\n      count = _limitValue(Math.max(\n        _lookupByKey(_parsed, iScale.axis, max).hi + 1,\n        animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max)).hi + 1),\n      start, pointCount) - start;\n    } else {\n      count = pointCount - start;\n    }\n  }\n  return {start, count};\n}\nfunction scaleRangesChanged(meta) {\n  const {xScale, yScale, _scaleRanges} = meta;\n  const newRanges = {\n    xmin: xScale.min,\n    xmax: xScale.max,\n    ymin: yScale.min,\n    ymax: yScale.max\n  };\n  if (!_scaleRanges) {\n    meta._scaleRanges = newRanges;\n    return true;\n  }\n  const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n  Object.assign(_scaleRanges, newRanges);\n  return changed;\n}\n\nclass PolarAreaController extends DatasetController {\n  constructor(chart, datasetIndex) {\n    super(chart, datasetIndex);\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n  }\n  getLabelAndValue(index) {\n    const meta = this._cachedMeta;\n    const chart = this.chart;\n    const labels = chart.data.labels || [];\n    const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n    return {\n      label: labels[index] || '',\n      value,\n    };\n  }\n  update(mode) {\n    const arcs = this._cachedMeta.data;\n    this._updateRadius();\n    this.updateElements(arcs, 0, arcs.length, mode);\n  }\n  _updateRadius() {\n    const chart = this.chart;\n    const chartArea = chart.chartArea;\n    const opts = chart.options;\n    const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n    const outerRadius = Math.max(minSize / 2, 0);\n    const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n    const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n    this.outerRadius = outerRadius - (radiusLength * this.index);\n    this.innerRadius = this.outerRadius - radiusLength;\n  }\n  updateElements(arcs, start, count, mode) {\n    const reset = mode === 'reset';\n    const chart = this.chart;\n    const dataset = this.getDataset();\n    const opts = chart.options;\n    const animationOpts = opts.animation;\n    const scale = this._cachedMeta.rScale;\n    const centerX = scale.xCenter;\n    const centerY = scale.yCenter;\n    const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n    let angle = datasetStartAngle;\n    let i;\n    const defaultAngle = 360 / this.countVisibleElements();\n    for (i = 0; i < start; ++i) {\n      angle += this._computeAngle(i, mode, defaultAngle);\n    }\n    for (i = start; i < start + count; i++) {\n      const arc = arcs[i];\n      let startAngle = angle;\n      let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n      let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset.data[i]) : 0;\n      angle = endAngle;\n      if (reset) {\n        if (animationOpts.animateScale) {\n          outerRadius = 0;\n        }\n        if (animationOpts.animateRotate) {\n          startAngle = endAngle = datasetStartAngle;\n        }\n      }\n      const properties = {\n        x: centerX,\n        y: centerY,\n        innerRadius: 0,\n        outerRadius,\n        startAngle,\n        endAngle,\n        options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n      };\n      this.updateElement(arc, i, properties, mode);\n    }\n  }\n  countVisibleElements() {\n    const dataset = this.getDataset();\n    const meta = this._cachedMeta;\n    let count = 0;\n    meta.data.forEach((element, index) => {\n      if (!isNaN(dataset.data[index]) && this.chart.getDataVisibility(index)) {\n        count++;\n      }\n    });\n    return count;\n  }\n  _computeAngle(index, mode, defaultAngle) {\n    return this.chart.getDataVisibility(index)\n      ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n      : 0;\n  }\n}\nPolarAreaController.id = 'polarArea';\nPolarAreaController.defaults = {\n  dataElementType: 'arc',\n  animation: {\n    animateRotate: true,\n    animateScale: true\n  },\n  animations: {\n    numbers: {\n      type: 'number',\n      properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n    },\n  },\n  indexAxis: 'r',\n  startAngle: 0,\n};\nPolarAreaController.overrides = {\n  aspectRatio: 1,\n  plugins: {\n    legend: {\n      labels: {\n        generateLabels(chart) {\n          const data = chart.data;\n          if (data.labels.length && data.datasets.length) {\n            const {labels: {pointStyle}} = chart.legend.options;\n            return data.labels.map((label, i) => {\n              const meta = chart.getDatasetMeta(0);\n              const style = meta.controller.getStyle(i);\n              return {\n                text: label,\n                fillStyle: style.backgroundColor,\n                strokeStyle: style.borderColor,\n                lineWidth: style.borderWidth,\n                pointStyle: pointStyle,\n                hidden: !chart.getDataVisibility(i),\n                index: i\n              };\n            });\n          }\n          return [];\n        }\n      },\n      onClick(e, legendItem, legend) {\n        legend.chart.toggleDataVisibility(legendItem.index);\n        legend.chart.update();\n      }\n    },\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        },\n        label(context) {\n          return context.chart.data.labels[context.dataIndex] + ': ' + context.formattedValue;\n        }\n      }\n    }\n  },\n  scales: {\n    r: {\n      type: 'radialLinear',\n      angleLines: {\n        display: false\n      },\n      beginAtZero: true,\n      grid: {\n        circular: true\n      },\n      pointLabels: {\n        display: false\n      },\n      startAngle: 0\n    }\n  }\n};\n\nclass PieController extends DoughnutController {\n}\nPieController.id = 'pie';\nPieController.defaults = {\n  cutout: 0,\n  rotation: 0,\n  circumference: 360,\n  radius: '100%'\n};\n\nclass RadarController extends DatasetController {\n  getLabelAndValue(index) {\n    const vScale = this._cachedMeta.vScale;\n    const parsed = this.getParsed(index);\n    return {\n      label: vScale.getLabels()[index],\n      value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n    };\n  }\n  update(mode) {\n    const meta = this._cachedMeta;\n    const line = meta.dataset;\n    const points = meta.data || [];\n    const labels = meta.iScale.getLabels();\n    line.points = points;\n    if (mode !== 'resize') {\n      const options = this.resolveDatasetElementOptions(mode);\n      if (!this.options.showLine) {\n        options.borderWidth = 0;\n      }\n      const properties = {\n        _loop: true,\n        _fullLoop: labels.length === points.length,\n        options\n      };\n      this.updateElement(line, undefined, properties, mode);\n    }\n    this.updateElements(points, 0, points.length, mode);\n  }\n  updateElements(points, start, count, mode) {\n    const dataset = this.getDataset();\n    const scale = this._cachedMeta.rScale;\n    const reset = mode === 'reset';\n    for (let i = start; i < start + count; i++) {\n      const point = points[i];\n      const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n      const pointPosition = scale.getPointPositionForValue(i, dataset.data[i]);\n      const x = reset ? scale.xCenter : pointPosition.x;\n      const y = reset ? scale.yCenter : pointPosition.y;\n      const properties = {\n        x,\n        y,\n        angle: pointPosition.angle,\n        skip: isNaN(x) || isNaN(y),\n        options\n      };\n      this.updateElement(point, i, properties, mode);\n    }\n  }\n}\nRadarController.id = 'radar';\nRadarController.defaults = {\n  datasetElementType: 'line',\n  dataElementType: 'point',\n  indexAxis: 'r',\n  showLine: true,\n  elements: {\n    line: {\n      fill: 'start'\n    }\n  },\n};\nRadarController.overrides = {\n  aspectRatio: 1,\n  scales: {\n    r: {\n      type: 'radialLinear',\n    }\n  }\n};\n\nclass ScatterController extends LineController {\n}\nScatterController.id = 'scatter';\nScatterController.defaults = {\n  showLine: false,\n  fill: false\n};\nScatterController.overrides = {\n  interaction: {\n    mode: 'point'\n  },\n  plugins: {\n    tooltip: {\n      callbacks: {\n        title() {\n          return '';\n        },\n        label(item) {\n          return '(' + item.label + ', ' + item.formattedValue + ')';\n        }\n      }\n    }\n  },\n  scales: {\n    x: {\n      type: 'linear'\n    },\n    y: {\n      type: 'linear'\n    }\n  }\n};\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPolarAreaController: PolarAreaController,\nPieController: PieController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\nfunction abstract() {\n  throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\nclass DateAdapter {\n  constructor(options) {\n    this.options = options || {};\n  }\n  formats() {\n    return abstract();\n  }\n  parse(value, format) {\n    return abstract();\n  }\n  format(timestamp, format) {\n    return abstract();\n  }\n  add(timestamp, amount, unit) {\n    return abstract();\n  }\n  diff(a, b, unit) {\n    return abstract();\n  }\n  startOf(timestamp, unit, weekday) {\n    return abstract();\n  }\n  endOf(timestamp, unit) {\n    return abstract();\n  }\n}\nDateAdapter.override = function(members) {\n  Object.assign(DateAdapter.prototype, members);\n};\nvar adapters = {\n  _date: DateAdapter\n};\n\nfunction getRelativePosition(e, chart) {\n  if ('native' in e) {\n    return {\n      x: e.x,\n      y: e.y\n    };\n  }\n  return getRelativePosition$1(e, chart);\n}\nfunction evaluateAllVisibleItems(chart, handler) {\n  const metasets = chart.getSortedVisibleDatasetMetas();\n  let index, data, element;\n  for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n    ({index, data} = metasets[i]);\n    for (let j = 0, jlen = data.length; j < jlen; ++j) {\n      element = data[j];\n      if (!element.skip) {\n        handler(element, index, j);\n      }\n    }\n  }\n}\nfunction binarySearch(metaset, axis, value, intersect) {\n  const {controller, data, _sorted} = metaset;\n  const iScale = controller._cachedMeta.iScale;\n  if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n    const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n    if (!intersect) {\n      return lookupMethod(data, axis, value);\n    } else if (controller._sharedOptions) {\n      const el = data[0];\n      const range = typeof el.getRange === 'function' && el.getRange(axis);\n      if (range) {\n        const start = lookupMethod(data, axis, value - range);\n        const end = lookupMethod(data, axis, value + range);\n        return {lo: start.lo, hi: end.hi};\n      }\n    }\n  }\n  return {lo: 0, hi: data.length - 1};\n}\nfunction optimizedEvaluateItems(chart, axis, position, handler, intersect) {\n  const metasets = chart.getSortedVisibleDatasetMetas();\n  const value = position[axis];\n  for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n    const {index, data} = metasets[i];\n    const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n    for (let j = lo; j <= hi; ++j) {\n      const element = data[j];\n      if (!element.skip) {\n        handler(element, index, j);\n      }\n    }\n  }\n}\nfunction getDistanceMetricForAxis(axis) {\n  const useX = axis.indexOf('x') !== -1;\n  const useY = axis.indexOf('y') !== -1;\n  return function(pt1, pt2) {\n    const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n    const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n    return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n  };\n}\nfunction getIntersectItems(chart, position, axis, useFinalPosition) {\n  const items = [];\n  if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n    return items;\n  }\n  const evaluationFunc = function(element, datasetIndex, index) {\n    if (element.inRange(position.x, position.y, useFinalPosition)) {\n      items.push({element, datasetIndex, index});\n    }\n  };\n  optimizedEvaluateItems(chart, axis, position, evaluationFunc, true);\n  return items;\n}\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n  let items = [];\n  function evaluationFunc(element, datasetIndex, index) {\n    const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n    const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n    if (_angleBetween(angle, startAngle, endAngle)) {\n      items.push({element, datasetIndex, index});\n    }\n  }\n  optimizedEvaluateItems(chart, axis, position, evaluationFunc);\n  return items;\n}\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition) {\n  let items = [];\n  const distanceMetric = getDistanceMetricForAxis(axis);\n  let minDistance = Number.POSITIVE_INFINITY;\n  function evaluationFunc(element, datasetIndex, index) {\n    const inRange = element.inRange(position.x, position.y, useFinalPosition);\n    if (intersect && !inRange) {\n      return;\n    }\n    const center = element.getCenterPoint(useFinalPosition);\n    const pointInArea = _isPointInArea(center, chart.chartArea, chart._minPadding);\n    if (!pointInArea && !inRange) {\n      return;\n    }\n    const distance = distanceMetric(position, center);\n    if (distance < minDistance) {\n      items = [{element, datasetIndex, index}];\n      minDistance = distance;\n    } else if (distance === minDistance) {\n      items.push({element, datasetIndex, index});\n    }\n  }\n  optimizedEvaluateItems(chart, axis, position, evaluationFunc);\n  return items;\n}\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition) {\n  if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n    return [];\n  }\n  return axis === 'r' && !intersect\n    ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n    : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition);\n}\nfunction getAxisItems(chart, e, options, useFinalPosition) {\n  const position = getRelativePosition(e, chart);\n  const items = [];\n  const axis = options.axis;\n  const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n  let intersectsItem = false;\n  evaluateAllVisibleItems(chart, (element, datasetIndex, index) => {\n    if (element[rangeMethod](position[axis], useFinalPosition)) {\n      items.push({element, datasetIndex, index});\n    }\n    if (element.inRange(position.x, position.y, useFinalPosition)) {\n      intersectsItem = true;\n    }\n  });\n  if (options.intersect && !intersectsItem) {\n    return [];\n  }\n  return items;\n}\nvar Interaction = {\n  modes: {\n    index(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'x';\n      const items = options.intersect\n        ? getIntersectItems(chart, position, axis, useFinalPosition)\n        : getNearestItems(chart, position, axis, false, useFinalPosition);\n      const elements = [];\n      if (!items.length) {\n        return [];\n      }\n      chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n        const index = items[0].index;\n        const element = meta.data[index];\n        if (element && !element.skip) {\n          elements.push({element, datasetIndex: meta.index, index});\n        }\n      });\n      return elements;\n    },\n    dataset(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      let items = options.intersect\n        ? getIntersectItems(chart, position, axis, useFinalPosition) :\n        getNearestItems(chart, position, axis, false, useFinalPosition);\n      if (items.length > 0) {\n        const datasetIndex = items[0].datasetIndex;\n        const data = chart.getDatasetMeta(datasetIndex).data;\n        items = [];\n        for (let i = 0; i < data.length; ++i) {\n          items.push({element: data[i], datasetIndex, index: i});\n        }\n      }\n      return items;\n    },\n    point(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      return getIntersectItems(chart, position, axis, useFinalPosition);\n    },\n    nearest(chart, e, options, useFinalPosition) {\n      const position = getRelativePosition(e, chart);\n      const axis = options.axis || 'xy';\n      return getNearestItems(chart, position, axis, options.intersect, useFinalPosition);\n    },\n    x(chart, e, options, useFinalPosition) {\n      return getAxisItems(chart, e, {axis: 'x', intersect: options.intersect}, useFinalPosition);\n    },\n    y(chart, e, options, useFinalPosition) {\n      return getAxisItems(chart, e, {axis: 'y', intersect: options.intersect}, useFinalPosition);\n    }\n  }\n};\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\nfunction filterByPosition(array, position) {\n  return array.filter(v => v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n  return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n  return array.sort((a, b) => {\n    const v0 = reverse ? b : a;\n    const v1 = reverse ? a : b;\n    return v0.weight === v1.weight ?\n      v0.index - v1.index :\n      v0.weight - v1.weight;\n  });\n}\nfunction wrapBoxes(boxes) {\n  const layoutBoxes = [];\n  let i, ilen, box, pos, stack, stackWeight;\n  for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n    box = boxes[i];\n    ({position: pos, options: {stack, stackWeight = 1}} = box);\n    layoutBoxes.push({\n      index: i,\n      box,\n      pos,\n      horizontal: box.isHorizontal(),\n      weight: box.weight,\n      stack: stack && (pos + stack),\n      stackWeight\n    });\n  }\n  return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n  const stacks = {};\n  for (const wrap of layouts) {\n    const {stack, pos, stackWeight} = wrap;\n    if (!stack || !STATIC_POSITIONS.includes(pos)) {\n      continue;\n    }\n    const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n    _stack.count++;\n    _stack.weight += stackWeight;\n  }\n  return stacks;\n}\nfunction setLayoutDims(layouts, params) {\n  const stacks = buildStacks(layouts);\n  const {vBoxMaxWidth, hBoxMaxHeight} = params;\n  let i, ilen, layout;\n  for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n    layout = layouts[i];\n    const {fullSize} = layout.box;\n    const stack = stacks[layout.stack];\n    const factor = stack && layout.stackWeight / stack.weight;\n    if (layout.horizontal) {\n      layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n      layout.height = hBoxMaxHeight;\n    } else {\n      layout.width = vBoxMaxWidth;\n      layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n    }\n  }\n  return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n  const layoutBoxes = wrapBoxes(boxes);\n  const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n  const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n  const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n  const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n  const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n  const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n  const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n  return {\n    fullSize,\n    leftAndTop: left.concat(top),\n    rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n    chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n    vertical: left.concat(right).concat(centerVertical),\n    horizontal: top.concat(bottom).concat(centerHorizontal)\n  };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n  return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n  maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n  maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n  maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n  maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n  const {pos, box} = layout;\n  const maxPadding = chartArea.maxPadding;\n  if (!isObject(pos)) {\n    if (layout.size) {\n      chartArea[pos] -= layout.size;\n    }\n    const stack = stacks[layout.stack] || {size: 0, count: 1};\n    stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n    layout.size = stack.size / stack.count;\n    chartArea[pos] += layout.size;\n  }\n  if (box.getPadding) {\n    updateMaxPadding(maxPadding, box.getPadding());\n  }\n  const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n  const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n  const widthChanged = newWidth !== chartArea.w;\n  const heightChanged = newHeight !== chartArea.h;\n  chartArea.w = newWidth;\n  chartArea.h = newHeight;\n  return layout.horizontal\n    ? {same: widthChanged, other: heightChanged}\n    : {same: heightChanged, other: widthChanged};\n}\nfunction handleMaxPadding(chartArea) {\n  const maxPadding = chartArea.maxPadding;\n  function updatePos(pos) {\n    const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n    chartArea[pos] += change;\n    return change;\n  }\n  chartArea.y += updatePos('top');\n  chartArea.x += updatePos('left');\n  updatePos('right');\n  updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n  const maxPadding = chartArea.maxPadding;\n  function marginForPositions(positions) {\n    const margin = {left: 0, top: 0, right: 0, bottom: 0};\n    positions.forEach((pos) => {\n      margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n    });\n    return margin;\n  }\n  return horizontal\n    ? marginForPositions(['left', 'right'])\n    : marginForPositions(['top', 'bottom']);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n  const refitBoxes = [];\n  let i, ilen, layout, box, refit, changed;\n  for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n    layout = boxes[i];\n    box = layout.box;\n    box.update(\n      layout.width || chartArea.w,\n      layout.height || chartArea.h,\n      getMargins(layout.horizontal, chartArea)\n    );\n    const {same, other} = updateDims(chartArea, params, layout, stacks);\n    refit |= same && refitBoxes.length;\n    changed = changed || other;\n    if (!box.fullSize) {\n      refitBoxes.push(layout);\n    }\n  }\n  return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n  box.top = top;\n  box.left = left;\n  box.right = left + width;\n  box.bottom = top + height;\n  box.width = width;\n  box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n  const userPadding = params.padding;\n  let {x, y} = chartArea;\n  for (const layout of boxes) {\n    const box = layout.box;\n    const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n    const weight = (layout.stackWeight / stack.weight) || 1;\n    if (layout.horizontal) {\n      const width = chartArea.w * weight;\n      const height = stack.size || box.height;\n      if (defined(stack.start)) {\n        y = stack.start;\n      }\n      if (box.fullSize) {\n        setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n      } else {\n        setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n      }\n      stack.start = y;\n      stack.placed += width;\n      y = box.bottom;\n    } else {\n      const height = chartArea.h * weight;\n      const width = stack.size || box.width;\n      if (defined(stack.start)) {\n        x = stack.start;\n      }\n      if (box.fullSize) {\n        setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n      } else {\n        setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n      }\n      stack.start = x;\n      stack.placed += height;\n      x = box.right;\n    }\n  }\n  chartArea.x = x;\n  chartArea.y = y;\n}\ndefaults.set('layout', {\n  autoPadding: true,\n  padding: {\n    top: 0,\n    right: 0,\n    bottom: 0,\n    left: 0\n  }\n});\nvar layouts = {\n  addBox(chart, item) {\n    if (!chart.boxes) {\n      chart.boxes = [];\n    }\n    item.fullSize = item.fullSize || false;\n    item.position = item.position || 'top';\n    item.weight = item.weight || 0;\n    item._layers = item._layers || function() {\n      return [{\n        z: 0,\n        draw(chartArea) {\n          item.draw(chartArea);\n        }\n      }];\n    };\n    chart.boxes.push(item);\n  },\n  removeBox(chart, layoutItem) {\n    const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n    if (index !== -1) {\n      chart.boxes.splice(index, 1);\n    }\n  },\n  configure(chart, item, options) {\n    item.fullSize = options.fullSize;\n    item.position = options.position;\n    item.weight = options.weight;\n  },\n  update(chart, width, height, minPadding) {\n    if (!chart) {\n      return;\n    }\n    const padding = toPadding(chart.options.layout.padding);\n    const availableWidth = Math.max(width - padding.width, 0);\n    const availableHeight = Math.max(height - padding.height, 0);\n    const boxes = buildLayoutBoxes(chart.boxes);\n    const verticalBoxes = boxes.vertical;\n    const horizontalBoxes = boxes.horizontal;\n    each(chart.boxes, box => {\n      if (typeof box.beforeLayout === 'function') {\n        box.beforeLayout();\n      }\n    });\n    const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n      wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n    const params = Object.freeze({\n      outerWidth: width,\n      outerHeight: height,\n      padding,\n      availableWidth,\n      availableHeight,\n      vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n      hBoxMaxHeight: availableHeight / 2\n    });\n    const maxPadding = Object.assign({}, padding);\n    updateMaxPadding(maxPadding, toPadding(minPadding));\n    const chartArea = Object.assign({\n      maxPadding,\n      w: availableWidth,\n      h: availableHeight,\n      x: padding.left,\n      y: padding.top\n    }, padding);\n    const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n    fitBoxes(boxes.fullSize, chartArea, params, stacks);\n    fitBoxes(verticalBoxes, chartArea, params, stacks);\n    if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n      fitBoxes(verticalBoxes, chartArea, params, stacks);\n    }\n    handleMaxPadding(chartArea);\n    placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n    chartArea.x += chartArea.w;\n    chartArea.y += chartArea.h;\n    placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n    chart.chartArea = {\n      left: chartArea.left,\n      top: chartArea.top,\n      right: chartArea.left + chartArea.w,\n      bottom: chartArea.top + chartArea.h,\n      height: chartArea.h,\n      width: chartArea.w,\n    };\n    each(boxes.chartArea, (layout) => {\n      const box = layout.box;\n      Object.assign(box, chart.chartArea);\n      box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n    });\n  }\n};\n\nclass BasePlatform {\n  acquireContext(canvas, aspectRatio) {}\n  releaseContext(context) {\n    return false;\n  }\n  addEventListener(chart, type, listener) {}\n  removeEventListener(chart, type, listener) {}\n  getDevicePixelRatio() {\n    return 1;\n  }\n  getMaximumSize(element, width, height, aspectRatio) {\n    width = Math.max(0, width || element.width);\n    height = height || element.height;\n    return {\n      width,\n      height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n    };\n  }\n  isAttached(canvas) {\n    return true;\n  }\n  updateConfig(config) {\n  }\n}\n\nclass BasicPlatform extends BasePlatform {\n  acquireContext(item) {\n    return item && item.getContext && item.getContext('2d') || null;\n  }\n  updateConfig(config) {\n    config.options.animation = false;\n  }\n}\n\nconst EXPANDO_KEY = '$chartjs';\nconst EVENT_TYPES = {\n  touchstart: 'mousedown',\n  touchmove: 'mousemove',\n  touchend: 'mouseup',\n  pointerenter: 'mouseenter',\n  pointerdown: 'mousedown',\n  pointermove: 'mousemove',\n  pointerup: 'mouseup',\n  pointerleave: 'mouseout',\n  pointerout: 'mouseout'\n};\nconst isNullOrEmpty = value => value === null || value === '';\nfunction initCanvas(canvas, aspectRatio) {\n  const style = canvas.style;\n  const renderHeight = canvas.getAttribute('height');\n  const renderWidth = canvas.getAttribute('width');\n  canvas[EXPANDO_KEY] = {\n    initial: {\n      height: renderHeight,\n      width: renderWidth,\n      style: {\n        display: style.display,\n        height: style.height,\n        width: style.width\n      }\n    }\n  };\n  style.display = style.display || 'block';\n  style.boxSizing = style.boxSizing || 'border-box';\n  if (isNullOrEmpty(renderWidth)) {\n    const displayWidth = readUsedSize(canvas, 'width');\n    if (displayWidth !== undefined) {\n      canvas.width = displayWidth;\n    }\n  }\n  if (isNullOrEmpty(renderHeight)) {\n    if (canvas.style.height === '') {\n      canvas.height = canvas.width / (aspectRatio || 2);\n    } else {\n      const displayHeight = readUsedSize(canvas, 'height');\n      if (displayHeight !== undefined) {\n        canvas.height = displayHeight;\n      }\n    }\n  }\n  return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\nfunction addListener(node, type, listener) {\n  node.addEventListener(type, listener, eventListenerOptions);\n}\nfunction removeListener(chart, type, listener) {\n  chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\nfunction fromNativeEvent(event, chart) {\n  const type = EVENT_TYPES[event.type] || event.type;\n  const {x, y} = getRelativePosition$1(event, chart);\n  return {\n    type,\n    chart,\n    native: event,\n    x: x !== undefined ? x : null,\n    y: y !== undefined ? y : null,\n  };\n}\nfunction nodeListContains(nodeList, canvas) {\n  for (const node of nodeList) {\n    if (node === canvas || node.contains(canvas)) {\n      return true;\n    }\n  }\n}\nfunction createAttachObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const observer = new MutationObserver(entries => {\n    let trigger = false;\n    for (const entry of entries) {\n      trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n      trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n    }\n    if (trigger) {\n      listener();\n    }\n  });\n  observer.observe(document, {childList: true, subtree: true});\n  return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const observer = new MutationObserver(entries => {\n    let trigger = false;\n    for (const entry of entries) {\n      trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n      trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n    }\n    if (trigger) {\n      listener();\n    }\n  });\n  observer.observe(document, {childList: true, subtree: true});\n  return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n  const dpr = window.devicePixelRatio;\n  if (dpr === oldDevicePixelRatio) {\n    return;\n  }\n  oldDevicePixelRatio = dpr;\n  drpListeningCharts.forEach((resize, chart) => {\n    if (chart.currentDevicePixelRatio !== dpr) {\n      resize();\n    }\n  });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n  if (!drpListeningCharts.size) {\n    window.addEventListener('resize', onWindowResize);\n  }\n  drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n  drpListeningCharts.delete(chart);\n  if (!drpListeningCharts.size) {\n    window.removeEventListener('resize', onWindowResize);\n  }\n}\nfunction createResizeObserver(chart, type, listener) {\n  const canvas = chart.canvas;\n  const container = canvas && _getParentNode(canvas);\n  if (!container) {\n    return;\n  }\n  const resize = throttled((width, height) => {\n    const w = container.clientWidth;\n    listener(width, height);\n    if (w < container.clientWidth) {\n      listener();\n    }\n  }, window);\n  const observer = new ResizeObserver(entries => {\n    const entry = entries[0];\n    const width = entry.contentRect.width;\n    const height = entry.contentRect.height;\n    if (width === 0 && height === 0) {\n      return;\n    }\n    resize(width, height);\n  });\n  observer.observe(container);\n  listenDevicePixelRatioChanges(chart, resize);\n  return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n  if (observer) {\n    observer.disconnect();\n  }\n  if (type === 'resize') {\n    unlistenDevicePixelRatioChanges(chart);\n  }\n}\nfunction createProxyAndListen(chart, type, listener) {\n  const canvas = chart.canvas;\n  const proxy = throttled((event) => {\n    if (chart.ctx !== null) {\n      listener(fromNativeEvent(event, chart));\n    }\n  }, chart, (args) => {\n    const event = args[0];\n    return [event, event.offsetX, event.offsetY];\n  });\n  addListener(canvas, type, proxy);\n  return proxy;\n}\nclass DomPlatform extends BasePlatform {\n  acquireContext(canvas, aspectRatio) {\n    const context = canvas && canvas.getContext && canvas.getContext('2d');\n    if (context && context.canvas === canvas) {\n      initCanvas(canvas, aspectRatio);\n      return context;\n    }\n    return null;\n  }\n  releaseContext(context) {\n    const canvas = context.canvas;\n    if (!canvas[EXPANDO_KEY]) {\n      return false;\n    }\n    const initial = canvas[EXPANDO_KEY].initial;\n    ['height', 'width'].forEach((prop) => {\n      const value = initial[prop];\n      if (isNullOrUndef(value)) {\n        canvas.removeAttribute(prop);\n      } else {\n        canvas.setAttribute(prop, value);\n      }\n    });\n    const style = initial.style || {};\n    Object.keys(style).forEach((key) => {\n      canvas.style[key] = style[key];\n    });\n    canvas.width = canvas.width;\n    delete canvas[EXPANDO_KEY];\n    return true;\n  }\n  addEventListener(chart, type, listener) {\n    this.removeEventListener(chart, type);\n    const proxies = chart.$proxies || (chart.$proxies = {});\n    const handlers = {\n      attach: createAttachObserver,\n      detach: createDetachObserver,\n      resize: createResizeObserver\n    };\n    const handler = handlers[type] || createProxyAndListen;\n    proxies[type] = handler(chart, type, listener);\n  }\n  removeEventListener(chart, type) {\n    const proxies = chart.$proxies || (chart.$proxies = {});\n    const proxy = proxies[type];\n    if (!proxy) {\n      return;\n    }\n    const handlers = {\n      attach: releaseObserver,\n      detach: releaseObserver,\n      resize: releaseObserver\n    };\n    const handler = handlers[type] || removeListener;\n    handler(chart, type, proxy);\n    proxies[type] = undefined;\n  }\n  getDevicePixelRatio() {\n    return window.devicePixelRatio;\n  }\n  getMaximumSize(canvas, width, height, aspectRatio) {\n    return getMaximumSize(canvas, width, height, aspectRatio);\n  }\n  isAttached(canvas) {\n    const container = _getParentNode(canvas);\n    return !!(container && container.isConnected);\n  }\n}\n\nfunction _detectPlatform(canvas) {\n  if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n    return BasicPlatform;\n  }\n  return DomPlatform;\n}\n\nclass Element {\n  constructor() {\n    this.x = undefined;\n    this.y = undefined;\n    this.active = false;\n    this.options = undefined;\n    this.$animations = undefined;\n  }\n  tooltipPosition(useFinalPosition) {\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return {x, y};\n  }\n  hasValue() {\n    return isNumber(this.x) && isNumber(this.y);\n  }\n  getProps(props, final) {\n    const anims = this.$animations;\n    if (!final || !anims) {\n      return this;\n    }\n    const ret = {};\n    props.forEach(prop => {\n      ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n    });\n    return ret;\n  }\n}\nElement.defaults = {};\nElement.defaultRoutes = undefined;\n\nconst formatters = {\n  values(value) {\n    return isArray(value) ? value : '' + value;\n  },\n  numeric(tickValue, index, ticks) {\n    if (tickValue === 0) {\n      return '0';\n    }\n    const locale = this.chart.options.locale;\n    let notation;\n    let delta = tickValue;\n    if (ticks.length > 1) {\n      const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n      if (maxTick < 1e-4 || maxTick > 1e+15) {\n        notation = 'scientific';\n      }\n      delta = calculateDelta(tickValue, ticks);\n    }\n    const logDelta = log10(Math.abs(delta));\n    const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n    const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n    Object.assign(options, this.options.ticks.format);\n    return formatNumber(tickValue, locale, options);\n  },\n  logarithmic(tickValue, index, ticks) {\n    if (tickValue === 0) {\n      return '0';\n    }\n    const remain = tickValue / (Math.pow(10, Math.floor(log10(tickValue))));\n    if (remain === 1 || remain === 2 || remain === 5) {\n      return formatters.numeric.call(this, tickValue, index, ticks);\n    }\n    return '';\n  }\n};\nfunction calculateDelta(tickValue, ticks) {\n  let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n  if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n    delta = tickValue - Math.floor(tickValue);\n  }\n  return delta;\n}\nvar Ticks = {formatters};\n\ndefaults.set('scale', {\n  display: true,\n  offset: false,\n  reverse: false,\n  beginAtZero: false,\n  bounds: 'ticks',\n  grace: 0,\n  grid: {\n    display: true,\n    lineWidth: 1,\n    drawBorder: true,\n    drawOnChartArea: true,\n    drawTicks: true,\n    tickLength: 8,\n    tickWidth: (_ctx, options) => options.lineWidth,\n    tickColor: (_ctx, options) => options.color,\n    offset: false,\n    borderDash: [],\n    borderDashOffset: 0.0,\n    borderWidth: 1\n  },\n  title: {\n    display: false,\n    text: '',\n    padding: {\n      top: 4,\n      bottom: 4\n    }\n  },\n  ticks: {\n    minRotation: 0,\n    maxRotation: 50,\n    mirror: false,\n    textStrokeWidth: 0,\n    textStrokeColor: '',\n    padding: 3,\n    display: true,\n    autoSkip: true,\n    autoSkipPadding: 3,\n    labelOffset: 0,\n    callback: Ticks.formatters.values,\n    minor: {},\n    major: {},\n    align: 'center',\n    crossAlign: 'near',\n    showLabelBackdrop: false,\n    backdropColor: 'rgba(255, 255, 255, 0.75)',\n    backdropPadding: 2,\n  }\n});\ndefaults.route('scale.ticks', 'color', '', 'color');\ndefaults.route('scale.grid', 'color', '', 'borderColor');\ndefaults.route('scale.grid', 'borderColor', '', 'borderColor');\ndefaults.route('scale.title', 'color', '', 'color');\ndefaults.describe('scale', {\n  _fallback: false,\n  _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n  _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash',\n});\ndefaults.describe('scales', {\n  _fallback: 'scale',\n});\ndefaults.describe('scale.ticks', {\n  _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n  _indexable: (name) => name !== 'backdropPadding',\n});\n\nfunction autoSkip(scale, ticks) {\n  const tickOpts = scale.options.ticks;\n  const ticksLimit = tickOpts.maxTicksLimit || determineMaxTicks(scale);\n  const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n  const numMajorIndices = majorIndices.length;\n  const first = majorIndices[0];\n  const last = majorIndices[numMajorIndices - 1];\n  const newTicks = [];\n  if (numMajorIndices > ticksLimit) {\n    skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n    return newTicks;\n  }\n  const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n  if (numMajorIndices > 0) {\n    let i, ilen;\n    const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n    skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n    for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n      skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n    }\n    skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n    return newTicks;\n  }\n  skip(ticks, newTicks, spacing);\n  return newTicks;\n}\nfunction determineMaxTicks(scale) {\n  const offset = scale.options.offset;\n  const tickLength = scale._tickSize();\n  const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n  const maxChart = scale._maxLength / tickLength;\n  return Math.floor(Math.min(maxScale, maxChart));\n}\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n  const evenMajorSpacing = getEvenSpacing(majorIndices);\n  const spacing = ticks.length / ticksLimit;\n  if (!evenMajorSpacing) {\n    return Math.max(spacing, 1);\n  }\n  const factors = _factorize(evenMajorSpacing);\n  for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n    const factor = factors[i];\n    if (factor > spacing) {\n      return factor;\n    }\n  }\n  return Math.max(spacing, 1);\n}\nfunction getMajorIndices(ticks) {\n  const result = [];\n  let i, ilen;\n  for (i = 0, ilen = ticks.length; i < ilen; i++) {\n    if (ticks[i].major) {\n      result.push(i);\n    }\n  }\n  return result;\n}\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n  let count = 0;\n  let next = majorIndices[0];\n  let i;\n  spacing = Math.ceil(spacing);\n  for (i = 0; i < ticks.length; i++) {\n    if (i === next) {\n      newTicks.push(ticks[i]);\n      count++;\n      next = majorIndices[count * spacing];\n    }\n  }\n}\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n  const start = valueOrDefault(majorStart, 0);\n  const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n  let count = 0;\n  let length, i, next;\n  spacing = Math.ceil(spacing);\n  if (majorEnd) {\n    length = majorEnd - majorStart;\n    spacing = length / Math.floor(length / spacing);\n  }\n  next = start;\n  while (next < 0) {\n    count++;\n    next = Math.round(start + count * spacing);\n  }\n  for (i = Math.max(start, 0); i < end; i++) {\n    if (i === next) {\n      newTicks.push(ticks[i]);\n      count++;\n      next = Math.round(start + count * spacing);\n    }\n  }\n}\nfunction getEvenSpacing(arr) {\n  const len = arr.length;\n  let i, diff;\n  if (len < 2) {\n    return false;\n  }\n  for (diff = arr[0], i = 1; i < len; ++i) {\n    if (arr[i] - arr[i - 1] !== diff) {\n      return false;\n    }\n  }\n  return diff;\n}\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nfunction sample(arr, numItems) {\n  const result = [];\n  const increment = arr.length / numItems;\n  const len = arr.length;\n  let i = 0;\n  for (; i < len; i += increment) {\n    result.push(arr[Math.floor(i)]);\n  }\n  return result;\n}\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n  const length = scale.ticks.length;\n  const validIndex = Math.min(index, length - 1);\n  const start = scale._startPixel;\n  const end = scale._endPixel;\n  const epsilon = 1e-6;\n  let lineValue = scale.getPixelForTick(validIndex);\n  let offset;\n  if (offsetGridLines) {\n    if (length === 1) {\n      offset = Math.max(lineValue - start, end - lineValue);\n    } else if (index === 0) {\n      offset = (scale.getPixelForTick(1) - lineValue) / 2;\n    } else {\n      offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n    }\n    lineValue += validIndex < index ? offset : -offset;\n    if (lineValue < start - epsilon || lineValue > end + epsilon) {\n      return;\n    }\n  }\n  return lineValue;\n}\nfunction garbageCollect(caches, length) {\n  each(caches, (cache) => {\n    const gc = cache.gc;\n    const gcLen = gc.length / 2;\n    let i;\n    if (gcLen > length) {\n      for (i = 0; i < gcLen; ++i) {\n        delete cache.data[gc[i]];\n      }\n      gc.splice(0, gcLen);\n    }\n  });\n}\nfunction getTickMarkLength(options) {\n  return options.drawTicks ? options.tickLength : 0;\n}\nfunction getTitleHeight(options, fallback) {\n  if (!options.display) {\n    return 0;\n  }\n  const font = toFont(options.font, fallback);\n  const padding = toPadding(options.padding);\n  const lines = isArray(options.text) ? options.text.length : 1;\n  return (lines * font.lineHeight) + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n  return createContext(parent, {\n    scale,\n    type: 'scale'\n  });\n}\nfunction createTickContext(parent, index, tick) {\n  return createContext(parent, {\n    tick,\n    index,\n    type: 'tick'\n  });\n}\nfunction titleAlign(align, position, reverse) {\n  let ret = _toLeftRightCenter(align);\n  if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n    ret = reverseAlign(ret);\n  }\n  return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n  const {top, left, bottom, right, chart} = scale;\n  const {chartArea, scales} = chart;\n  let rotation = 0;\n  let maxWidth, titleX, titleY;\n  const height = bottom - top;\n  const width = right - left;\n  if (scale.isHorizontal()) {\n    titleX = _alignStartEnd(align, left, right);\n    if (isObject(position)) {\n      const positionAxisID = Object.keys(position)[0];\n      const value = position[positionAxisID];\n      titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n    } else if (position === 'center') {\n      titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n    } else {\n      titleY = offsetFromEdge(scale, position, offset);\n    }\n    maxWidth = right - left;\n  } else {\n    if (isObject(position)) {\n      const positionAxisID = Object.keys(position)[0];\n      const value = position[positionAxisID];\n      titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n    } else if (position === 'center') {\n      titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n    } else {\n      titleX = offsetFromEdge(scale, position, offset);\n    }\n    titleY = _alignStartEnd(align, bottom, top);\n    rotation = position === 'left' ? -HALF_PI : HALF_PI;\n  }\n  return {titleX, titleY, maxWidth, rotation};\n}\nclass Scale extends Element {\n  constructor(cfg) {\n    super();\n    this.id = cfg.id;\n    this.type = cfg.type;\n    this.options = undefined;\n    this.ctx = cfg.ctx;\n    this.chart = cfg.chart;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this._margins = {\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    };\n    this.maxWidth = undefined;\n    this.maxHeight = undefined;\n    this.paddingTop = undefined;\n    this.paddingBottom = undefined;\n    this.paddingLeft = undefined;\n    this.paddingRight = undefined;\n    this.axis = undefined;\n    this.labelRotation = undefined;\n    this.min = undefined;\n    this.max = undefined;\n    this._range = undefined;\n    this.ticks = [];\n    this._gridLineItems = null;\n    this._labelItems = null;\n    this._labelSizes = null;\n    this._length = 0;\n    this._maxLength = 0;\n    this._longestTextCache = {};\n    this._startPixel = undefined;\n    this._endPixel = undefined;\n    this._reversePixels = false;\n    this._userMax = undefined;\n    this._userMin = undefined;\n    this._suggestedMax = undefined;\n    this._suggestedMin = undefined;\n    this._ticksLength = 0;\n    this._borderValue = 0;\n    this._cache = {};\n    this._dataLimitsCached = false;\n    this.$context = undefined;\n  }\n  init(options) {\n    this.options = options.setContext(this.getContext());\n    this.axis = options.axis;\n    this._userMin = this.parse(options.min);\n    this._userMax = this.parse(options.max);\n    this._suggestedMin = this.parse(options.suggestedMin);\n    this._suggestedMax = this.parse(options.suggestedMax);\n  }\n  parse(raw, index) {\n    return raw;\n  }\n  getUserBounds() {\n    let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n    _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n    _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n    _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n    _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n    return {\n      min: finiteOrDefault(_userMin, _suggestedMin),\n      max: finiteOrDefault(_userMax, _suggestedMax),\n      minDefined: isNumberFinite(_userMin),\n      maxDefined: isNumberFinite(_userMax)\n    };\n  }\n  getMinMax(canStack) {\n    let {min, max, minDefined, maxDefined} = this.getUserBounds();\n    let range;\n    if (minDefined && maxDefined) {\n      return {min, max};\n    }\n    const metas = this.getMatchingVisibleMetas();\n    for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n      range = metas[i].controller.getMinMax(this, canStack);\n      if (!minDefined) {\n        min = Math.min(min, range.min);\n      }\n      if (!maxDefined) {\n        max = Math.max(max, range.max);\n      }\n    }\n    min = maxDefined && min > max ? max : min;\n    max = minDefined && min > max ? min : max;\n    return {\n      min: finiteOrDefault(min, finiteOrDefault(max, min)),\n      max: finiteOrDefault(max, finiteOrDefault(min, max))\n    };\n  }\n  getPadding() {\n    return {\n      left: this.paddingLeft || 0,\n      top: this.paddingTop || 0,\n      right: this.paddingRight || 0,\n      bottom: this.paddingBottom || 0\n    };\n  }\n  getTicks() {\n    return this.ticks;\n  }\n  getLabels() {\n    const data = this.chart.data;\n    return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n  }\n  beforeLayout() {\n    this._cache = {};\n    this._dataLimitsCached = false;\n  }\n  beforeUpdate() {\n    callback(this.options.beforeUpdate, [this]);\n  }\n  update(maxWidth, maxHeight, margins) {\n    const {beginAtZero, grace, ticks: tickOpts} = this.options;\n    const sampleSize = tickOpts.sampleSize;\n    this.beforeUpdate();\n    this.maxWidth = maxWidth;\n    this.maxHeight = maxHeight;\n    this._margins = margins = Object.assign({\n      left: 0,\n      right: 0,\n      top: 0,\n      bottom: 0\n    }, margins);\n    this.ticks = null;\n    this._labelSizes = null;\n    this._gridLineItems = null;\n    this._labelItems = null;\n    this.beforeSetDimensions();\n    this.setDimensions();\n    this.afterSetDimensions();\n    this._maxLength = this.isHorizontal()\n      ? this.width + margins.left + margins.right\n      : this.height + margins.top + margins.bottom;\n    if (!this._dataLimitsCached) {\n      this.beforeDataLimits();\n      this.determineDataLimits();\n      this.afterDataLimits();\n      this._range = _addGrace(this, grace, beginAtZero);\n      this._dataLimitsCached = true;\n    }\n    this.beforeBuildTicks();\n    this.ticks = this.buildTicks() || [];\n    this.afterBuildTicks();\n    const samplingEnabled = sampleSize < this.ticks.length;\n    this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n    this.configure();\n    this.beforeCalculateLabelRotation();\n    this.calculateLabelRotation();\n    this.afterCalculateLabelRotation();\n    if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n      this.ticks = autoSkip(this, this.ticks);\n      this._labelSizes = null;\n    }\n    if (samplingEnabled) {\n      this._convertTicksToLabels(this.ticks);\n    }\n    this.beforeFit();\n    this.fit();\n    this.afterFit();\n    this.afterUpdate();\n  }\n  configure() {\n    let reversePixels = this.options.reverse;\n    let startPixel, endPixel;\n    if (this.isHorizontal()) {\n      startPixel = this.left;\n      endPixel = this.right;\n    } else {\n      startPixel = this.top;\n      endPixel = this.bottom;\n      reversePixels = !reversePixels;\n    }\n    this._startPixel = startPixel;\n    this._endPixel = endPixel;\n    this._reversePixels = reversePixels;\n    this._length = endPixel - startPixel;\n    this._alignToPixels = this.options.alignToPixels;\n  }\n  afterUpdate() {\n    callback(this.options.afterUpdate, [this]);\n  }\n  beforeSetDimensions() {\n    callback(this.options.beforeSetDimensions, [this]);\n  }\n  setDimensions() {\n    if (this.isHorizontal()) {\n      this.width = this.maxWidth;\n      this.left = 0;\n      this.right = this.width;\n    } else {\n      this.height = this.maxHeight;\n      this.top = 0;\n      this.bottom = this.height;\n    }\n    this.paddingLeft = 0;\n    this.paddingTop = 0;\n    this.paddingRight = 0;\n    this.paddingBottom = 0;\n  }\n  afterSetDimensions() {\n    callback(this.options.afterSetDimensions, [this]);\n  }\n  _callHooks(name) {\n    this.chart.notifyPlugins(name, this.getContext());\n    callback(this.options[name], [this]);\n  }\n  beforeDataLimits() {\n    this._callHooks('beforeDataLimits');\n  }\n  determineDataLimits() {}\n  afterDataLimits() {\n    this._callHooks('afterDataLimits');\n  }\n  beforeBuildTicks() {\n    this._callHooks('beforeBuildTicks');\n  }\n  buildTicks() {\n    return [];\n  }\n  afterBuildTicks() {\n    this._callHooks('afterBuildTicks');\n  }\n  beforeTickToLabelConversion() {\n    callback(this.options.beforeTickToLabelConversion, [this]);\n  }\n  generateTickLabels(ticks) {\n    const tickOpts = this.options.ticks;\n    let i, ilen, tick;\n    for (i = 0, ilen = ticks.length; i < ilen; i++) {\n      tick = ticks[i];\n      tick.label = callback(tickOpts.callback, [tick.value, i, ticks], this);\n    }\n  }\n  afterTickToLabelConversion() {\n    callback(this.options.afterTickToLabelConversion, [this]);\n  }\n  beforeCalculateLabelRotation() {\n    callback(this.options.beforeCalculateLabelRotation, [this]);\n  }\n  calculateLabelRotation() {\n    const options = this.options;\n    const tickOpts = options.ticks;\n    const numTicks = this.ticks.length;\n    const minRotation = tickOpts.minRotation || 0;\n    const maxRotation = tickOpts.maxRotation;\n    let labelRotation = minRotation;\n    let tickWidth, maxHeight, maxLabelDiagonal;\n    if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n      this.labelRotation = minRotation;\n      return;\n    }\n    const labelSizes = this._getLabelSizes();\n    const maxLabelWidth = labelSizes.widest.width;\n    const maxLabelHeight = labelSizes.highest.height;\n    const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n    tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n    if (maxLabelWidth + 6 > tickWidth) {\n      tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n      maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n      maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n      labelRotation = toDegrees(Math.min(\n        Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n        Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n      ));\n      labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n    }\n    this.labelRotation = labelRotation;\n  }\n  afterCalculateLabelRotation() {\n    callback(this.options.afterCalculateLabelRotation, [this]);\n  }\n  beforeFit() {\n    callback(this.options.beforeFit, [this]);\n  }\n  fit() {\n    const minSize = {\n      width: 0,\n      height: 0\n    };\n    const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n    const display = this._isVisible();\n    const isHorizontal = this.isHorizontal();\n    if (display) {\n      const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n      if (isHorizontal) {\n        minSize.width = this.maxWidth;\n        minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n      } else {\n        minSize.height = this.maxHeight;\n        minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n      }\n      if (tickOpts.display && this.ticks.length) {\n        const {first, last, widest, highest} = this._getLabelSizes();\n        const tickPadding = tickOpts.padding * 2;\n        const angleRadians = toRadians(this.labelRotation);\n        const cos = Math.cos(angleRadians);\n        const sin = Math.sin(angleRadians);\n        if (isHorizontal) {\n          const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n          minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n        } else {\n          const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n          minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n        }\n        this._calculatePadding(first, last, sin, cos);\n      }\n    }\n    this._handleMargins();\n    if (isHorizontal) {\n      this.width = this._length = chart.width - this._margins.left - this._margins.right;\n      this.height = minSize.height;\n    } else {\n      this.width = minSize.width;\n      this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n    }\n  }\n  _calculatePadding(first, last, sin, cos) {\n    const {ticks: {align, padding}, position} = this.options;\n    const isRotated = this.labelRotation !== 0;\n    const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n    if (this.isHorizontal()) {\n      const offsetLeft = this.getPixelForTick(0) - this.left;\n      const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n      let paddingLeft = 0;\n      let paddingRight = 0;\n      if (isRotated) {\n        if (labelsBelowTicks) {\n          paddingLeft = cos * first.width;\n          paddingRight = sin * last.height;\n        } else {\n          paddingLeft = sin * first.height;\n          paddingRight = cos * last.width;\n        }\n      } else if (align === 'start') {\n        paddingRight = last.width;\n      } else if (align === 'end') {\n        paddingLeft = first.width;\n      } else {\n        paddingLeft = first.width / 2;\n        paddingRight = last.width / 2;\n      }\n      this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n      this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n    } else {\n      let paddingTop = last.height / 2;\n      let paddingBottom = first.height / 2;\n      if (align === 'start') {\n        paddingTop = 0;\n        paddingBottom = first.height;\n      } else if (align === 'end') {\n        paddingTop = last.height;\n        paddingBottom = 0;\n      }\n      this.paddingTop = paddingTop + padding;\n      this.paddingBottom = paddingBottom + padding;\n    }\n  }\n  _handleMargins() {\n    if (this._margins) {\n      this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n      this._margins.top = Math.max(this.paddingTop, this._margins.top);\n      this._margins.right = Math.max(this.paddingRight, this._margins.right);\n      this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n    }\n  }\n  afterFit() {\n    callback(this.options.afterFit, [this]);\n  }\n  isHorizontal() {\n    const {axis, position} = this.options;\n    return position === 'top' || position === 'bottom' || axis === 'x';\n  }\n  isFullSize() {\n    return this.options.fullSize;\n  }\n  _convertTicksToLabels(ticks) {\n    this.beforeTickToLabelConversion();\n    this.generateTickLabels(ticks);\n    let i, ilen;\n    for (i = 0, ilen = ticks.length; i < ilen; i++) {\n      if (isNullOrUndef(ticks[i].label)) {\n        ticks.splice(i, 1);\n        ilen--;\n        i--;\n      }\n    }\n    this.afterTickToLabelConversion();\n  }\n  _getLabelSizes() {\n    let labelSizes = this._labelSizes;\n    if (!labelSizes) {\n      const sampleSize = this.options.ticks.sampleSize;\n      let ticks = this.ticks;\n      if (sampleSize < ticks.length) {\n        ticks = sample(ticks, sampleSize);\n      }\n      this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length);\n    }\n    return labelSizes;\n  }\n  _computeLabelSizes(ticks, length) {\n    const {ctx, _longestTextCache: caches} = this;\n    const widths = [];\n    const heights = [];\n    let widestLabelSize = 0;\n    let highestLabelSize = 0;\n    let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n    for (i = 0; i < length; ++i) {\n      label = ticks[i].label;\n      tickFont = this._resolveTickFontOptions(i);\n      ctx.font = fontString = tickFont.string;\n      cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n      lineHeight = tickFont.lineHeight;\n      width = height = 0;\n      if (!isNullOrUndef(label) && !isArray(label)) {\n        width = _measureText(ctx, cache.data, cache.gc, width, label);\n        height = lineHeight;\n      } else if (isArray(label)) {\n        for (j = 0, jlen = label.length; j < jlen; ++j) {\n          nestedLabel = label[j];\n          if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n            width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n            height += lineHeight;\n          }\n        }\n      }\n      widths.push(width);\n      heights.push(height);\n      widestLabelSize = Math.max(width, widestLabelSize);\n      highestLabelSize = Math.max(height, highestLabelSize);\n    }\n    garbageCollect(caches, length);\n    const widest = widths.indexOf(widestLabelSize);\n    const highest = heights.indexOf(highestLabelSize);\n    const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n    return {\n      first: valueAt(0),\n      last: valueAt(length - 1),\n      widest: valueAt(widest),\n      highest: valueAt(highest),\n      widths,\n      heights,\n    };\n  }\n  getLabelForValue(value) {\n    return value;\n  }\n  getPixelForValue(value, index) {\n    return NaN;\n  }\n  getValueForPixel(pixel) {}\n  getPixelForTick(index) {\n    const ticks = this.ticks;\n    if (index < 0 || index > ticks.length - 1) {\n      return null;\n    }\n    return this.getPixelForValue(ticks[index].value);\n  }\n  getPixelForDecimal(decimal) {\n    if (this._reversePixels) {\n      decimal = 1 - decimal;\n    }\n    const pixel = this._startPixel + decimal * this._length;\n    return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n  }\n  getDecimalForPixel(pixel) {\n    const decimal = (pixel - this._startPixel) / this._length;\n    return this._reversePixels ? 1 - decimal : decimal;\n  }\n  getBasePixel() {\n    return this.getPixelForValue(this.getBaseValue());\n  }\n  getBaseValue() {\n    const {min, max} = this;\n    return min < 0 && max < 0 ? max :\n      min > 0 && max > 0 ? min :\n      0;\n  }\n  getContext(index) {\n    const ticks = this.ticks || [];\n    if (index >= 0 && index < ticks.length) {\n      const tick = ticks[index];\n      return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n    }\n    return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n  }\n  _tickSize() {\n    const optionTicks = this.options.ticks;\n    const rot = toRadians(this.labelRotation);\n    const cos = Math.abs(Math.cos(rot));\n    const sin = Math.abs(Math.sin(rot));\n    const labelSizes = this._getLabelSizes();\n    const padding = optionTicks.autoSkipPadding || 0;\n    const w = labelSizes ? labelSizes.widest.width + padding : 0;\n    const h = labelSizes ? labelSizes.highest.height + padding : 0;\n    return this.isHorizontal()\n      ? h * cos > w * sin ? w / cos : h / sin\n      : h * sin < w * cos ? h / cos : w / sin;\n  }\n  _isVisible() {\n    const display = this.options.display;\n    if (display !== 'auto') {\n      return !!display;\n    }\n    return this.getMatchingVisibleMetas().length > 0;\n  }\n  _computeGridLineItems(chartArea) {\n    const axis = this.axis;\n    const chart = this.chart;\n    const options = this.options;\n    const {grid, position} = options;\n    const offset = grid.offset;\n    const isHorizontal = this.isHorizontal();\n    const ticks = this.ticks;\n    const ticksLength = ticks.length + (offset ? 1 : 0);\n    const tl = getTickMarkLength(grid);\n    const items = [];\n    const borderOpts = grid.setContext(this.getContext());\n    const axisWidth = borderOpts.drawBorder ? borderOpts.borderWidth : 0;\n    const axisHalfWidth = axisWidth / 2;\n    const alignBorderValue = function(pixel) {\n      return _alignPixel(chart, pixel, axisWidth);\n    };\n    let borderValue, i, lineValue, alignedLineValue;\n    let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n    if (position === 'top') {\n      borderValue = alignBorderValue(this.bottom);\n      ty1 = this.bottom - tl;\n      ty2 = borderValue - axisHalfWidth;\n      y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n      y2 = chartArea.bottom;\n    } else if (position === 'bottom') {\n      borderValue = alignBorderValue(this.top);\n      y1 = chartArea.top;\n      y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n      ty1 = borderValue + axisHalfWidth;\n      ty2 = this.top + tl;\n    } else if (position === 'left') {\n      borderValue = alignBorderValue(this.right);\n      tx1 = this.right - tl;\n      tx2 = borderValue - axisHalfWidth;\n      x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n      x2 = chartArea.right;\n    } else if (position === 'right') {\n      borderValue = alignBorderValue(this.left);\n      x1 = chartArea.left;\n      x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n      tx1 = borderValue + axisHalfWidth;\n      tx2 = this.left + tl;\n    } else if (axis === 'x') {\n      if (position === 'center') {\n        borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n      }\n      y1 = chartArea.top;\n      y2 = chartArea.bottom;\n      ty1 = borderValue + axisHalfWidth;\n      ty2 = ty1 + tl;\n    } else if (axis === 'y') {\n      if (position === 'center') {\n        borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n      }\n      tx1 = borderValue - axisHalfWidth;\n      tx2 = tx1 - tl;\n      x1 = chartArea.left;\n      x2 = chartArea.right;\n    }\n    const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n    const step = Math.max(1, Math.ceil(ticksLength / limit));\n    for (i = 0; i < ticksLength; i += step) {\n      const optsAtIndex = grid.setContext(this.getContext(i));\n      const lineWidth = optsAtIndex.lineWidth;\n      const lineColor = optsAtIndex.color;\n      const borderDash = grid.borderDash || [];\n      const borderDashOffset = optsAtIndex.borderDashOffset;\n      const tickWidth = optsAtIndex.tickWidth;\n      const tickColor = optsAtIndex.tickColor;\n      const tickBorderDash = optsAtIndex.tickBorderDash || [];\n      const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n      lineValue = getPixelForGridLine(this, i, offset);\n      if (lineValue === undefined) {\n        continue;\n      }\n      alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n      if (isHorizontal) {\n        tx1 = tx2 = x1 = x2 = alignedLineValue;\n      } else {\n        ty1 = ty2 = y1 = y2 = alignedLineValue;\n      }\n      items.push({\n        tx1,\n        ty1,\n        tx2,\n        ty2,\n        x1,\n        y1,\n        x2,\n        y2,\n        width: lineWidth,\n        color: lineColor,\n        borderDash,\n        borderDashOffset,\n        tickWidth,\n        tickColor,\n        tickBorderDash,\n        tickBorderDashOffset,\n      });\n    }\n    this._ticksLength = ticksLength;\n    this._borderValue = borderValue;\n    return items;\n  }\n  _computeLabelItems(chartArea) {\n    const axis = this.axis;\n    const options = this.options;\n    const {position, ticks: optionTicks} = options;\n    const isHorizontal = this.isHorizontal();\n    const ticks = this.ticks;\n    const {align, crossAlign, padding, mirror} = optionTicks;\n    const tl = getTickMarkLength(options.grid);\n    const tickAndPadding = tl + padding;\n    const hTickAndPadding = mirror ? -padding : tickAndPadding;\n    const rotation = -toRadians(this.labelRotation);\n    const items = [];\n    let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n    let textBaseline = 'middle';\n    if (position === 'top') {\n      y = this.bottom - hTickAndPadding;\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (position === 'bottom') {\n      y = this.top + hTickAndPadding;\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (position === 'left') {\n      const ret = this._getYAxisLabelAlignment(tl);\n      textAlign = ret.textAlign;\n      x = ret.x;\n    } else if (position === 'right') {\n      const ret = this._getYAxisLabelAlignment(tl);\n      textAlign = ret.textAlign;\n      x = ret.x;\n    } else if (axis === 'x') {\n      if (position === 'center') {\n        y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n      }\n      textAlign = this._getXAxisLabelAlignment();\n    } else if (axis === 'y') {\n      if (position === 'center') {\n        x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n      } else if (isObject(position)) {\n        const positionAxisID = Object.keys(position)[0];\n        const value = position[positionAxisID];\n        x = this.chart.scales[positionAxisID].getPixelForValue(value);\n      }\n      textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n    }\n    if (axis === 'y') {\n      if (align === 'start') {\n        textBaseline = 'top';\n      } else if (align === 'end') {\n        textBaseline = 'bottom';\n      }\n    }\n    const labelSizes = this._getLabelSizes();\n    for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n      tick = ticks[i];\n      label = tick.label;\n      const optsAtIndex = optionTicks.setContext(this.getContext(i));\n      pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n      font = this._resolveTickFontOptions(i);\n      lineHeight = font.lineHeight;\n      lineCount = isArray(label) ? label.length : 1;\n      const halfCount = lineCount / 2;\n      const color = optsAtIndex.color;\n      const strokeColor = optsAtIndex.textStrokeColor;\n      const strokeWidth = optsAtIndex.textStrokeWidth;\n      if (isHorizontal) {\n        x = pixel;\n        if (position === 'top') {\n          if (crossAlign === 'near' || rotation !== 0) {\n            textOffset = -lineCount * lineHeight + lineHeight / 2;\n          } else if (crossAlign === 'center') {\n            textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n          } else {\n            textOffset = -labelSizes.highest.height + lineHeight / 2;\n          }\n        } else {\n          if (crossAlign === 'near' || rotation !== 0) {\n            textOffset = lineHeight / 2;\n          } else if (crossAlign === 'center') {\n            textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n          } else {\n            textOffset = labelSizes.highest.height - lineCount * lineHeight;\n          }\n        }\n        if (mirror) {\n          textOffset *= -1;\n        }\n      } else {\n        y = pixel;\n        textOffset = (1 - lineCount) * lineHeight / 2;\n      }\n      let backdrop;\n      if (optsAtIndex.showLabelBackdrop) {\n        const labelPadding = toPadding(optsAtIndex.backdropPadding);\n        const height = labelSizes.heights[i];\n        const width = labelSizes.widths[i];\n        let top = y + textOffset - labelPadding.top;\n        let left = x - labelPadding.left;\n        switch (textBaseline) {\n        case 'middle':\n          top -= height / 2;\n          break;\n        case 'bottom':\n          top -= height;\n          break;\n        }\n        switch (textAlign) {\n        case 'center':\n          left -= width / 2;\n          break;\n        case 'right':\n          left -= width;\n          break;\n        }\n        backdrop = {\n          left,\n          top,\n          width: width + labelPadding.width,\n          height: height + labelPadding.height,\n          color: optsAtIndex.backdropColor,\n        };\n      }\n      items.push({\n        rotation,\n        label,\n        font,\n        color,\n        strokeColor,\n        strokeWidth,\n        textOffset,\n        textAlign,\n        textBaseline,\n        translation: [x, y],\n        backdrop,\n      });\n    }\n    return items;\n  }\n  _getXAxisLabelAlignment() {\n    const {position, ticks} = this.options;\n    const rotation = -toRadians(this.labelRotation);\n    if (rotation) {\n      return position === 'top' ? 'left' : 'right';\n    }\n    let align = 'center';\n    if (ticks.align === 'start') {\n      align = 'left';\n    } else if (ticks.align === 'end') {\n      align = 'right';\n    }\n    return align;\n  }\n  _getYAxisLabelAlignment(tl) {\n    const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n    const labelSizes = this._getLabelSizes();\n    const tickAndPadding = tl + padding;\n    const widest = labelSizes.widest.width;\n    let textAlign;\n    let x;\n    if (position === 'left') {\n      if (mirror) {\n        x = this.right + padding;\n        if (crossAlign === 'near') {\n          textAlign = 'left';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x += (widest / 2);\n        } else {\n          textAlign = 'right';\n          x += widest;\n        }\n      } else {\n        x = this.right - tickAndPadding;\n        if (crossAlign === 'near') {\n          textAlign = 'right';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x -= (widest / 2);\n        } else {\n          textAlign = 'left';\n          x = this.left;\n        }\n      }\n    } else if (position === 'right') {\n      if (mirror) {\n        x = this.left + padding;\n        if (crossAlign === 'near') {\n          textAlign = 'right';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x -= (widest / 2);\n        } else {\n          textAlign = 'left';\n          x -= widest;\n        }\n      } else {\n        x = this.left + tickAndPadding;\n        if (crossAlign === 'near') {\n          textAlign = 'left';\n        } else if (crossAlign === 'center') {\n          textAlign = 'center';\n          x += widest / 2;\n        } else {\n          textAlign = 'right';\n          x = this.right;\n        }\n      }\n    } else {\n      textAlign = 'right';\n    }\n    return {textAlign, x};\n  }\n  _computeLabelArea() {\n    if (this.options.ticks.mirror) {\n      return;\n    }\n    const chart = this.chart;\n    const position = this.options.position;\n    if (position === 'left' || position === 'right') {\n      return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n    } if (position === 'top' || position === 'bottom') {\n      return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n    }\n  }\n  drawBackground() {\n    const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n    if (backgroundColor) {\n      ctx.save();\n      ctx.fillStyle = backgroundColor;\n      ctx.fillRect(left, top, width, height);\n      ctx.restore();\n    }\n  }\n  getLineWidthForValue(value) {\n    const grid = this.options.grid;\n    if (!this._isVisible() || !grid.display) {\n      return 0;\n    }\n    const ticks = this.ticks;\n    const index = ticks.findIndex(t => t.value === value);\n    if (index >= 0) {\n      const opts = grid.setContext(this.getContext(index));\n      return opts.lineWidth;\n    }\n    return 0;\n  }\n  drawGrid(chartArea) {\n    const grid = this.options.grid;\n    const ctx = this.ctx;\n    const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n    let i, ilen;\n    const drawLine = (p1, p2, style) => {\n      if (!style.width || !style.color) {\n        return;\n      }\n      ctx.save();\n      ctx.lineWidth = style.width;\n      ctx.strokeStyle = style.color;\n      ctx.setLineDash(style.borderDash || []);\n      ctx.lineDashOffset = style.borderDashOffset;\n      ctx.beginPath();\n      ctx.moveTo(p1.x, p1.y);\n      ctx.lineTo(p2.x, p2.y);\n      ctx.stroke();\n      ctx.restore();\n    };\n    if (grid.display) {\n      for (i = 0, ilen = items.length; i < ilen; ++i) {\n        const item = items[i];\n        if (grid.drawOnChartArea) {\n          drawLine(\n            {x: item.x1, y: item.y1},\n            {x: item.x2, y: item.y2},\n            item\n          );\n        }\n        if (grid.drawTicks) {\n          drawLine(\n            {x: item.tx1, y: item.ty1},\n            {x: item.tx2, y: item.ty2},\n            {\n              color: item.tickColor,\n              width: item.tickWidth,\n              borderDash: item.tickBorderDash,\n              borderDashOffset: item.tickBorderDashOffset\n            }\n          );\n        }\n      }\n    }\n  }\n  drawBorder() {\n    const {chart, ctx, options: {grid}} = this;\n    const borderOpts = grid.setContext(this.getContext());\n    const axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;\n    if (!axisWidth) {\n      return;\n    }\n    const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n    const borderValue = this._borderValue;\n    let x1, x2, y1, y2;\n    if (this.isHorizontal()) {\n      x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n      x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n      y1 = y2 = borderValue;\n    } else {\n      y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n      y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n      x1 = x2 = borderValue;\n    }\n    ctx.save();\n    ctx.lineWidth = borderOpts.borderWidth;\n    ctx.strokeStyle = borderOpts.borderColor;\n    ctx.beginPath();\n    ctx.moveTo(x1, y1);\n    ctx.lineTo(x2, y2);\n    ctx.stroke();\n    ctx.restore();\n  }\n  drawLabels(chartArea) {\n    const optionTicks = this.options.ticks;\n    if (!optionTicks.display) {\n      return;\n    }\n    const ctx = this.ctx;\n    const area = this._computeLabelArea();\n    if (area) {\n      clipArea(ctx, area);\n    }\n    const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n    let i, ilen;\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      const item = items[i];\n      const tickFont = item.font;\n      const label = item.label;\n      if (item.backdrop) {\n        ctx.fillStyle = item.backdrop.color;\n        ctx.fillRect(item.backdrop.left, item.backdrop.top, item.backdrop.width, item.backdrop.height);\n      }\n      let y = item.textOffset;\n      renderText(ctx, label, 0, y, tickFont, item);\n    }\n    if (area) {\n      unclipArea(ctx);\n    }\n  }\n  drawTitle() {\n    const {ctx, options: {position, title, reverse}} = this;\n    if (!title.display) {\n      return;\n    }\n    const font = toFont(title.font);\n    const padding = toPadding(title.padding);\n    const align = title.align;\n    let offset = font.lineHeight / 2;\n    if (position === 'bottom' || position === 'center' || isObject(position)) {\n      offset += padding.bottom;\n      if (isArray(title.text)) {\n        offset += font.lineHeight * (title.text.length - 1);\n      }\n    } else {\n      offset += padding.top;\n    }\n    const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n    renderText(ctx, title.text, 0, 0, font, {\n      color: title.color,\n      maxWidth,\n      rotation,\n      textAlign: titleAlign(align, position, reverse),\n      textBaseline: 'middle',\n      translation: [titleX, titleY],\n    });\n  }\n  draw(chartArea) {\n    if (!this._isVisible()) {\n      return;\n    }\n    this.drawBackground();\n    this.drawGrid(chartArea);\n    this.drawBorder();\n    this.drawTitle();\n    this.drawLabels(chartArea);\n  }\n  _layers() {\n    const opts = this.options;\n    const tz = opts.ticks && opts.ticks.z || 0;\n    const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n    if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n      return [{\n        z: tz,\n        draw: (chartArea) => {\n          this.draw(chartArea);\n        }\n      }];\n    }\n    return [{\n      z: gz,\n      draw: (chartArea) => {\n        this.drawBackground();\n        this.drawGrid(chartArea);\n        this.drawTitle();\n      }\n    }, {\n      z: gz + 1,\n      draw: () => {\n        this.drawBorder();\n      }\n    }, {\n      z: tz,\n      draw: (chartArea) => {\n        this.drawLabels(chartArea);\n      }\n    }];\n  }\n  getMatchingVisibleMetas(type) {\n    const metas = this.chart.getSortedVisibleDatasetMetas();\n    const axisID = this.axis + 'AxisID';\n    const result = [];\n    let i, ilen;\n    for (i = 0, ilen = metas.length; i < ilen; ++i) {\n      const meta = metas[i];\n      if (meta[axisID] === this.id && (!type || meta.type === type)) {\n        result.push(meta);\n      }\n    }\n    return result;\n  }\n  _resolveTickFontOptions(index) {\n    const opts = this.options.ticks.setContext(this.getContext(index));\n    return toFont(opts.font);\n  }\n  _maxDigits() {\n    const fontSize = this._resolveTickFontOptions(0).lineHeight;\n    return (this.isHorizontal() ? this.width : this.height) / fontSize;\n  }\n}\n\nclass TypedRegistry {\n  constructor(type, scope, override) {\n    this.type = type;\n    this.scope = scope;\n    this.override = override;\n    this.items = Object.create(null);\n  }\n  isForType(type) {\n    return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n  }\n  register(item) {\n    const proto = Object.getPrototypeOf(item);\n    let parentScope;\n    if (isIChartComponent(proto)) {\n      parentScope = this.register(proto);\n    }\n    const items = this.items;\n    const id = item.id;\n    const scope = this.scope + '.' + id;\n    if (!id) {\n      throw new Error('class does not have id: ' + item);\n    }\n    if (id in items) {\n      return scope;\n    }\n    items[id] = item;\n    registerDefaults(item, scope, parentScope);\n    if (this.override) {\n      defaults.override(item.id, item.overrides);\n    }\n    return scope;\n  }\n  get(id) {\n    return this.items[id];\n  }\n  unregister(item) {\n    const items = this.items;\n    const id = item.id;\n    const scope = this.scope;\n    if (id in items) {\n      delete items[id];\n    }\n    if (scope && id in defaults[scope]) {\n      delete defaults[scope][id];\n      if (this.override) {\n        delete overrides[id];\n      }\n    }\n  }\n}\nfunction registerDefaults(item, scope, parentScope) {\n  const itemDefaults = merge(Object.create(null), [\n    parentScope ? defaults.get(parentScope) : {},\n    defaults.get(scope),\n    item.defaults\n  ]);\n  defaults.set(scope, itemDefaults);\n  if (item.defaultRoutes) {\n    routeDefaults(scope, item.defaultRoutes);\n  }\n  if (item.descriptors) {\n    defaults.describe(scope, item.descriptors);\n  }\n}\nfunction routeDefaults(scope, routes) {\n  Object.keys(routes).forEach(property => {\n    const propertyParts = property.split('.');\n    const sourceName = propertyParts.pop();\n    const sourceScope = [scope].concat(propertyParts).join('.');\n    const parts = routes[property].split('.');\n    const targetName = parts.pop();\n    const targetScope = parts.join('.');\n    defaults.route(sourceScope, sourceName, targetScope, targetName);\n  });\n}\nfunction isIChartComponent(proto) {\n  return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n  constructor() {\n    this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n    this.elements = new TypedRegistry(Element, 'elements');\n    this.plugins = new TypedRegistry(Object, 'plugins');\n    this.scales = new TypedRegistry(Scale, 'scales');\n    this._typedRegistries = [this.controllers, this.scales, this.elements];\n  }\n  add(...args) {\n    this._each('register', args);\n  }\n  remove(...args) {\n    this._each('unregister', args);\n  }\n  addControllers(...args) {\n    this._each('register', args, this.controllers);\n  }\n  addElements(...args) {\n    this._each('register', args, this.elements);\n  }\n  addPlugins(...args) {\n    this._each('register', args, this.plugins);\n  }\n  addScales(...args) {\n    this._each('register', args, this.scales);\n  }\n  getController(id) {\n    return this._get(id, this.controllers, 'controller');\n  }\n  getElement(id) {\n    return this._get(id, this.elements, 'element');\n  }\n  getPlugin(id) {\n    return this._get(id, this.plugins, 'plugin');\n  }\n  getScale(id) {\n    return this._get(id, this.scales, 'scale');\n  }\n  removeControllers(...args) {\n    this._each('unregister', args, this.controllers);\n  }\n  removeElements(...args) {\n    this._each('unregister', args, this.elements);\n  }\n  removePlugins(...args) {\n    this._each('unregister', args, this.plugins);\n  }\n  removeScales(...args) {\n    this._each('unregister', args, this.scales);\n  }\n  _each(method, args, typedRegistry) {\n    [...args].forEach(arg => {\n      const reg = typedRegistry || this._getRegistryForType(arg);\n      if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n        this._exec(method, reg, arg);\n      } else {\n        each(arg, item => {\n          const itemReg = typedRegistry || this._getRegistryForType(item);\n          this._exec(method, itemReg, item);\n        });\n      }\n    });\n  }\n  _exec(method, registry, component) {\n    const camelMethod = _capitalize(method);\n    callback(component['before' + camelMethod], [], component);\n    registry[method](component);\n    callback(component['after' + camelMethod], [], component);\n  }\n  _getRegistryForType(type) {\n    for (let i = 0; i < this._typedRegistries.length; i++) {\n      const reg = this._typedRegistries[i];\n      if (reg.isForType(type)) {\n        return reg;\n      }\n    }\n    return this.plugins;\n  }\n  _get(id, typedRegistry, type) {\n    const item = typedRegistry.get(id);\n    if (item === undefined) {\n      throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n    }\n    return item;\n  }\n}\nvar registry = new Registry();\n\nclass PluginService {\n  constructor() {\n    this._init = [];\n  }\n  notify(chart, hook, args, filter) {\n    if (hook === 'beforeInit') {\n      this._init = this._createDescriptors(chart, true);\n      this._notify(this._init, chart, 'install');\n    }\n    const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n    const result = this._notify(descriptors, chart, hook, args);\n    if (hook === 'afterDestroy') {\n      this._notify(descriptors, chart, 'stop');\n      this._notify(this._init, chart, 'uninstall');\n    }\n    return result;\n  }\n  _notify(descriptors, chart, hook, args) {\n    args = args || {};\n    for (const descriptor of descriptors) {\n      const plugin = descriptor.plugin;\n      const method = plugin[hook];\n      const params = [chart, args, descriptor.options];\n      if (callback(method, params, plugin) === false && args.cancelable) {\n        return false;\n      }\n    }\n    return true;\n  }\n  invalidate() {\n    if (!isNullOrUndef(this._cache)) {\n      this._oldCache = this._cache;\n      this._cache = undefined;\n    }\n  }\n  _descriptors(chart) {\n    if (this._cache) {\n      return this._cache;\n    }\n    const descriptors = this._cache = this._createDescriptors(chart);\n    this._notifyStateChanges(chart);\n    return descriptors;\n  }\n  _createDescriptors(chart, all) {\n    const config = chart && chart.config;\n    const options = valueOrDefault(config.options && config.options.plugins, {});\n    const plugins = allPlugins(config);\n    return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n  }\n  _notifyStateChanges(chart) {\n    const previousDescriptors = this._oldCache || [];\n    const descriptors = this._cache;\n    const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n    this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n    this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n  }\n}\nfunction allPlugins(config) {\n  const plugins = [];\n  const keys = Object.keys(registry.plugins.items);\n  for (let i = 0; i < keys.length; i++) {\n    plugins.push(registry.getPlugin(keys[i]));\n  }\n  const local = config.plugins || [];\n  for (let i = 0; i < local.length; i++) {\n    const plugin = local[i];\n    if (plugins.indexOf(plugin) === -1) {\n      plugins.push(plugin);\n    }\n  }\n  return plugins;\n}\nfunction getOpts(options, all) {\n  if (!all && options === false) {\n    return null;\n  }\n  if (options === true) {\n    return {};\n  }\n  return options;\n}\nfunction createDescriptors(chart, plugins, options, all) {\n  const result = [];\n  const context = chart.getContext();\n  for (let i = 0; i < plugins.length; i++) {\n    const plugin = plugins[i];\n    const id = plugin.id;\n    const opts = getOpts(options[id], all);\n    if (opts === null) {\n      continue;\n    }\n    result.push({\n      plugin,\n      options: pluginOpts(chart.config, plugin, opts, context)\n    });\n  }\n  return result;\n}\nfunction pluginOpts(config, plugin, opts, context) {\n  const keys = config.pluginScopeKeys(plugin);\n  const scopes = config.getOptionScopes(opts, keys);\n  return config.createResolver(scopes, context, [''], {scriptable: false, indexable: false, allKeys: true});\n}\n\nfunction getIndexAxis(type, options) {\n  const datasetDefaults = defaults.datasets[type] || {};\n  const datasetOptions = (options.datasets || {})[type] || {};\n  return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n  let axis = id;\n  if (id === '_index_') {\n    axis = indexAxis;\n  } else if (id === '_value_') {\n    axis = indexAxis === 'x' ? 'y' : 'x';\n  }\n  return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n  return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction axisFromPosition(position) {\n  if (position === 'top' || position === 'bottom') {\n    return 'x';\n  }\n  if (position === 'left' || position === 'right') {\n    return 'y';\n  }\n}\nfunction determineAxis(id, scaleOptions) {\n  if (id === 'x' || id === 'y') {\n    return id;\n  }\n  return scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.charAt(0).toLowerCase();\n}\nfunction mergeScaleConfig(config, options) {\n  const chartDefaults = overrides[config.type] || {scales: {}};\n  const configScales = options.scales || {};\n  const chartIndexAxis = getIndexAxis(config.type, options);\n  const firstIDs = Object.create(null);\n  const scales = Object.create(null);\n  Object.keys(configScales).forEach(id => {\n    const scaleConf = configScales[id];\n    if (!isObject(scaleConf)) {\n      return console.error(`Invalid scale configuration for scale: ${id}`);\n    }\n    if (scaleConf._proxy) {\n      return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n    }\n    const axis = determineAxis(id, scaleConf);\n    const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n    const defaultScaleOptions = chartDefaults.scales || {};\n    firstIDs[axis] = firstIDs[axis] || id;\n    scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n  });\n  config.data.datasets.forEach(dataset => {\n    const type = dataset.type || config.type;\n    const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n    const datasetDefaults = overrides[type] || {};\n    const defaultScaleOptions = datasetDefaults.scales || {};\n    Object.keys(defaultScaleOptions).forEach(defaultID => {\n      const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n      const id = dataset[axis + 'AxisID'] || firstIDs[axis] || axis;\n      scales[id] = scales[id] || Object.create(null);\n      mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n    });\n  });\n  Object.keys(scales).forEach(key => {\n    const scale = scales[key];\n    mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n  });\n  return scales;\n}\nfunction initOptions(config) {\n  const options = config.options || (config.options = {});\n  options.plugins = valueOrDefault(options.plugins, {});\n  options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n  data = data || {};\n  data.datasets = data.datasets || [];\n  data.labels = data.labels || [];\n  return data;\n}\nfunction initConfig(config) {\n  config = config || {};\n  config.data = initData(config.data);\n  initOptions(config);\n  return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n  let keys = keyCache.get(cacheKey);\n  if (!keys) {\n    keys = generate();\n    keyCache.set(cacheKey, keys);\n    keysCached.add(keys);\n  }\n  return keys;\n}\nconst addIfFound = (set, obj, key) => {\n  const opts = resolveObjectKey(obj, key);\n  if (opts !== undefined) {\n    set.add(opts);\n  }\n};\nclass Config {\n  constructor(config) {\n    this._config = initConfig(config);\n    this._scopeCache = new Map();\n    this._resolverCache = new Map();\n  }\n  get platform() {\n    return this._config.platform;\n  }\n  get type() {\n    return this._config.type;\n  }\n  set type(type) {\n    this._config.type = type;\n  }\n  get data() {\n    return this._config.data;\n  }\n  set data(data) {\n    this._config.data = initData(data);\n  }\n  get options() {\n    return this._config.options;\n  }\n  set options(options) {\n    this._config.options = options;\n  }\n  get plugins() {\n    return this._config.plugins;\n  }\n  update() {\n    const config = this._config;\n    this.clearCache();\n    initOptions(config);\n  }\n  clearCache() {\n    this._scopeCache.clear();\n    this._resolverCache.clear();\n  }\n  datasetScopeKeys(datasetType) {\n    return cachedKeys(datasetType,\n      () => [[\n        `datasets.${datasetType}`,\n        ''\n      ]]);\n  }\n  datasetAnimationScopeKeys(datasetType, transition) {\n    return cachedKeys(`${datasetType}.transition.${transition}`,\n      () => [\n        [\n          `datasets.${datasetType}.transitions.${transition}`,\n          `transitions.${transition}`,\n        ],\n        [\n          `datasets.${datasetType}`,\n          ''\n        ]\n      ]);\n  }\n  datasetElementScopeKeys(datasetType, elementType) {\n    return cachedKeys(`${datasetType}-${elementType}`,\n      () => [[\n        `datasets.${datasetType}.elements.${elementType}`,\n        `datasets.${datasetType}`,\n        `elements.${elementType}`,\n        ''\n      ]]);\n  }\n  pluginScopeKeys(plugin) {\n    const id = plugin.id;\n    const type = this.type;\n    return cachedKeys(`${type}-plugin-${id}`,\n      () => [[\n        `plugins.${id}`,\n        ...plugin.additionalOptionScopes || [],\n      ]]);\n  }\n  _cachedScopes(mainScope, resetCache) {\n    const _scopeCache = this._scopeCache;\n    let cache = _scopeCache.get(mainScope);\n    if (!cache || resetCache) {\n      cache = new Map();\n      _scopeCache.set(mainScope, cache);\n    }\n    return cache;\n  }\n  getOptionScopes(mainScope, keyLists, resetCache) {\n    const {options, type} = this;\n    const cache = this._cachedScopes(mainScope, resetCache);\n    const cached = cache.get(keyLists);\n    if (cached) {\n      return cached;\n    }\n    const scopes = new Set();\n    keyLists.forEach(keys => {\n      if (mainScope) {\n        scopes.add(mainScope);\n        keys.forEach(key => addIfFound(scopes, mainScope, key));\n      }\n      keys.forEach(key => addIfFound(scopes, options, key));\n      keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n      keys.forEach(key => addIfFound(scopes, defaults, key));\n      keys.forEach(key => addIfFound(scopes, descriptors, key));\n    });\n    const array = Array.from(scopes);\n    if (array.length === 0) {\n      array.push(Object.create(null));\n    }\n    if (keysCached.has(keyLists)) {\n      cache.set(keyLists, array);\n    }\n    return array;\n  }\n  chartOptionScopes() {\n    const {options, type} = this;\n    return [\n      options,\n      overrides[type] || {},\n      defaults.datasets[type] || {},\n      {type},\n      defaults,\n      descriptors\n    ];\n  }\n  resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n    const result = {$shared: true};\n    const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n    let options = resolver;\n    if (needContext(resolver, names)) {\n      result.$shared = false;\n      context = isFunction(context) ? context() : context;\n      const subResolver = this.createResolver(scopes, context, subPrefixes);\n      options = _attachContext(resolver, context, subResolver);\n    }\n    for (const prop of names) {\n      result[prop] = options[prop];\n    }\n    return result;\n  }\n  createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n    const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n    return isObject(context)\n      ? _attachContext(resolver, context, undefined, descriptorDefaults)\n      : resolver;\n  }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n  let cache = resolverCache.get(scopes);\n  if (!cache) {\n    cache = new Map();\n    resolverCache.set(scopes, cache);\n  }\n  const cacheKey = prefixes.join();\n  let cached = cache.get(cacheKey);\n  if (!cached) {\n    const resolver = _createResolver(scopes, prefixes);\n    cached = {\n      resolver,\n      subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n    };\n    cache.set(cacheKey, cached);\n  }\n  return cached;\n}\nconst hasFunction = value => isObject(value)\n  && Object.getOwnPropertyNames(value).reduce((acc, key) => acc || isFunction(value[key]), false);\nfunction needContext(proxy, names) {\n  const {isScriptable, isIndexable} = _descriptors(proxy);\n  for (const prop of names) {\n    const scriptable = isScriptable(prop);\n    const indexable = isIndexable(prop);\n    const value = (indexable || scriptable) && proxy[prop];\n    if ((scriptable && (isFunction(value) || hasFunction(value)))\n      || (indexable && isArray(value))) {\n      return true;\n    }\n  }\n  return false;\n}\n\nvar version = \"3.7.1\";\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n  return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\nfunction compare2Level(l1, l2) {\n  return function(a, b) {\n    return a[l1] === b[l1]\n      ? a[l2] - b[l2]\n      : a[l1] - b[l1];\n  };\n}\nfunction onAnimationsComplete(context) {\n  const chart = context.chart;\n  const animationOptions = chart.options.animation;\n  chart.notifyPlugins('afterRender');\n  callback(animationOptions && animationOptions.onComplete, [context], chart);\n}\nfunction onAnimationProgress(context) {\n  const chart = context.chart;\n  const animationOptions = chart.options.animation;\n  callback(animationOptions && animationOptions.onProgress, [context], chart);\n}\nfunction getCanvas(item) {\n  if (_isDomSupported() && typeof item === 'string') {\n    item = document.getElementById(item);\n  } else if (item && item.length) {\n    item = item[0];\n  }\n  if (item && item.canvas) {\n    item = item.canvas;\n  }\n  return item;\n}\nconst instances = {};\nconst getChart = (key) => {\n  const canvas = getCanvas(key);\n  return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n  const keys = Object.keys(obj);\n  for (const key of keys) {\n    const intKey = +key;\n    if (intKey >= start) {\n      const value = obj[key];\n      delete obj[key];\n      if (move > 0 || intKey > start) {\n        obj[intKey + move] = value;\n      }\n    }\n  }\n}\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n  if (!inChartArea || e.type === 'mouseout') {\n    return null;\n  }\n  if (isClick) {\n    return lastEvent;\n  }\n  return e;\n}\nclass Chart {\n  constructor(item, userConfig) {\n    const config = this.config = new Config(userConfig);\n    const initialCanvas = getCanvas(item);\n    const existingChart = getChart(initialCanvas);\n    if (existingChart) {\n      throw new Error(\n        'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas can be reused.'\n      );\n    }\n    const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n    this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n    this.platform.updateConfig(config);\n    const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n    const canvas = context && context.canvas;\n    const height = canvas && canvas.height;\n    const width = canvas && canvas.width;\n    this.id = uid();\n    this.ctx = context;\n    this.canvas = canvas;\n    this.width = width;\n    this.height = height;\n    this._options = options;\n    this._aspectRatio = this.aspectRatio;\n    this._layers = [];\n    this._metasets = [];\n    this._stacks = undefined;\n    this.boxes = [];\n    this.currentDevicePixelRatio = undefined;\n    this.chartArea = undefined;\n    this._active = [];\n    this._lastEvent = undefined;\n    this._listeners = {};\n    this._responsiveListeners = undefined;\n    this._sortedMetasets = [];\n    this.scales = {};\n    this._plugins = new PluginService();\n    this.$proxies = {};\n    this._hiddenIndices = {};\n    this.attached = false;\n    this._animationsDisabled = undefined;\n    this.$context = undefined;\n    this._doResize = debounce(mode => this.update(mode), options.resizeDelay || 0);\n    this._dataChanges = [];\n    instances[this.id] = this;\n    if (!context || !canvas) {\n      console.error(\"Failed to create chart: can't acquire context from the given item\");\n      return;\n    }\n    animator.listen(this, 'complete', onAnimationsComplete);\n    animator.listen(this, 'progress', onAnimationProgress);\n    this._initialize();\n    if (this.attached) {\n      this.update();\n    }\n  }\n  get aspectRatio() {\n    const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n    if (!isNullOrUndef(aspectRatio)) {\n      return aspectRatio;\n    }\n    if (maintainAspectRatio && _aspectRatio) {\n      return _aspectRatio;\n    }\n    return height ? width / height : null;\n  }\n  get data() {\n    return this.config.data;\n  }\n  set data(data) {\n    this.config.data = data;\n  }\n  get options() {\n    return this._options;\n  }\n  set options(options) {\n    this.config.options = options;\n  }\n  _initialize() {\n    this.notifyPlugins('beforeInit');\n    if (this.options.responsive) {\n      this.resize();\n    } else {\n      retinaScale(this, this.options.devicePixelRatio);\n    }\n    this.bindEvents();\n    this.notifyPlugins('afterInit');\n    return this;\n  }\n  clear() {\n    clearCanvas(this.canvas, this.ctx);\n    return this;\n  }\n  stop() {\n    animator.stop(this);\n    return this;\n  }\n  resize(width, height) {\n    if (!animator.running(this)) {\n      this._resize(width, height);\n    } else {\n      this._resizeBeforeDraw = {width, height};\n    }\n  }\n  _resize(width, height) {\n    const options = this.options;\n    const canvas = this.canvas;\n    const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n    const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n    const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n    const mode = this.width ? 'resize' : 'attach';\n    this.width = newSize.width;\n    this.height = newSize.height;\n    this._aspectRatio = this.aspectRatio;\n    if (!retinaScale(this, newRatio, true)) {\n      return;\n    }\n    this.notifyPlugins('resize', {size: newSize});\n    callback(options.onResize, [this, newSize], this);\n    if (this.attached) {\n      if (this._doResize(mode)) {\n        this.render();\n      }\n    }\n  }\n  ensureScalesHaveIDs() {\n    const options = this.options;\n    const scalesOptions = options.scales || {};\n    each(scalesOptions, (axisOptions, axisID) => {\n      axisOptions.id = axisID;\n    });\n  }\n  buildOrUpdateScales() {\n    const options = this.options;\n    const scaleOpts = options.scales;\n    const scales = this.scales;\n    const updated = Object.keys(scales).reduce((obj, id) => {\n      obj[id] = false;\n      return obj;\n    }, {});\n    let items = [];\n    if (scaleOpts) {\n      items = items.concat(\n        Object.keys(scaleOpts).map((id) => {\n          const scaleOptions = scaleOpts[id];\n          const axis = determineAxis(id, scaleOptions);\n          const isRadial = axis === 'r';\n          const isHorizontal = axis === 'x';\n          return {\n            options: scaleOptions,\n            dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n            dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n          };\n        })\n      );\n    }\n    each(items, (item) => {\n      const scaleOptions = item.options;\n      const id = scaleOptions.id;\n      const axis = determineAxis(id, scaleOptions);\n      const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n      if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n        scaleOptions.position = item.dposition;\n      }\n      updated[id] = true;\n      let scale = null;\n      if (id in scales && scales[id].type === scaleType) {\n        scale = scales[id];\n      } else {\n        const scaleClass = registry.getScale(scaleType);\n        scale = new scaleClass({\n          id,\n          type: scaleType,\n          ctx: this.ctx,\n          chart: this\n        });\n        scales[scale.id] = scale;\n      }\n      scale.init(scaleOptions, options);\n    });\n    each(updated, (hasUpdated, id) => {\n      if (!hasUpdated) {\n        delete scales[id];\n      }\n    });\n    each(scales, (scale) => {\n      layouts.configure(this, scale, scale.options);\n      layouts.addBox(this, scale);\n    });\n  }\n  _updateMetasets() {\n    const metasets = this._metasets;\n    const numData = this.data.datasets.length;\n    const numMeta = metasets.length;\n    metasets.sort((a, b) => a.index - b.index);\n    if (numMeta > numData) {\n      for (let i = numData; i < numMeta; ++i) {\n        this._destroyDatasetMeta(i);\n      }\n      metasets.splice(numData, numMeta - numData);\n    }\n    this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n  }\n  _removeUnreferencedMetasets() {\n    const {_metasets: metasets, data: {datasets}} = this;\n    if (metasets.length > datasets.length) {\n      delete this._stacks;\n    }\n    metasets.forEach((meta, index) => {\n      if (datasets.filter(x => x === meta._dataset).length === 0) {\n        this._destroyDatasetMeta(index);\n      }\n    });\n  }\n  buildOrUpdateControllers() {\n    const newControllers = [];\n    const datasets = this.data.datasets;\n    let i, ilen;\n    this._removeUnreferencedMetasets();\n    for (i = 0, ilen = datasets.length; i < ilen; i++) {\n      const dataset = datasets[i];\n      let meta = this.getDatasetMeta(i);\n      const type = dataset.type || this.config.type;\n      if (meta.type && meta.type !== type) {\n        this._destroyDatasetMeta(i);\n        meta = this.getDatasetMeta(i);\n      }\n      meta.type = type;\n      meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n      meta.order = dataset.order || 0;\n      meta.index = i;\n      meta.label = '' + dataset.label;\n      meta.visible = this.isDatasetVisible(i);\n      if (meta.controller) {\n        meta.controller.updateIndex(i);\n        meta.controller.linkScales();\n      } else {\n        const ControllerClass = registry.getController(type);\n        const {datasetElementType, dataElementType} = defaults.datasets[type];\n        Object.assign(ControllerClass.prototype, {\n          dataElementType: registry.getElement(dataElementType),\n          datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n        });\n        meta.controller = new ControllerClass(this, i);\n        newControllers.push(meta.controller);\n      }\n    }\n    this._updateMetasets();\n    return newControllers;\n  }\n  _resetElements() {\n    each(this.data.datasets, (dataset, datasetIndex) => {\n      this.getDatasetMeta(datasetIndex).controller.reset();\n    }, this);\n  }\n  reset() {\n    this._resetElements();\n    this.notifyPlugins('reset');\n  }\n  update(mode) {\n    const config = this.config;\n    config.update();\n    const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n    const animsDisabled = this._animationsDisabled = !options.animation;\n    this._updateScales();\n    this._checkEventBindings();\n    this._updateHiddenIndices();\n    this._plugins.invalidate();\n    if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n      return;\n    }\n    const newControllers = this.buildOrUpdateControllers();\n    this.notifyPlugins('beforeElementsUpdate');\n    let minPadding = 0;\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n      const {controller} = this.getDatasetMeta(i);\n      const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n      controller.buildOrUpdateElements(reset);\n      minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n    }\n    minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n    this._updateLayout(minPadding);\n    if (!animsDisabled) {\n      each(newControllers, (controller) => {\n        controller.reset();\n      });\n    }\n    this._updateDatasets(mode);\n    this.notifyPlugins('afterUpdate', {mode});\n    this._layers.sort(compare2Level('z', '_idx'));\n    const {_active, _lastEvent} = this;\n    if (_lastEvent) {\n      this._eventHandler(_lastEvent, true);\n    } else if (_active.length) {\n      this._updateHoverStyles(_active, _active, true);\n    }\n    this.render();\n  }\n  _updateScales() {\n    each(this.scales, (scale) => {\n      layouts.removeBox(this, scale);\n    });\n    this.ensureScalesHaveIDs();\n    this.buildOrUpdateScales();\n  }\n  _checkEventBindings() {\n    const options = this.options;\n    const existingEvents = new Set(Object.keys(this._listeners));\n    const newEvents = new Set(options.events);\n    if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n      this.unbindEvents();\n      this.bindEvents();\n    }\n  }\n  _updateHiddenIndices() {\n    const {_hiddenIndices} = this;\n    const changes = this._getUniformDataChanges() || [];\n    for (const {method, start, count} of changes) {\n      const move = method === '_removeElements' ? -count : count;\n      moveNumericKeys(_hiddenIndices, start, move);\n    }\n  }\n  _getUniformDataChanges() {\n    const _dataChanges = this._dataChanges;\n    if (!_dataChanges || !_dataChanges.length) {\n      return;\n    }\n    this._dataChanges = [];\n    const datasetCount = this.data.datasets.length;\n    const makeSet = (idx) => new Set(\n      _dataChanges\n        .filter(c => c[0] === idx)\n        .map((c, i) => i + ',' + c.splice(1).join(','))\n    );\n    const changeSet = makeSet(0);\n    for (let i = 1; i < datasetCount; i++) {\n      if (!setsEqual(changeSet, makeSet(i))) {\n        return;\n      }\n    }\n    return Array.from(changeSet)\n      .map(c => c.split(','))\n      .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n  }\n  _updateLayout(minPadding) {\n    if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n      return;\n    }\n    layouts.update(this, this.width, this.height, minPadding);\n    const area = this.chartArea;\n    const noArea = area.width <= 0 || area.height <= 0;\n    this._layers = [];\n    each(this.boxes, (box) => {\n      if (noArea && box.position === 'chartArea') {\n        return;\n      }\n      if (box.configure) {\n        box.configure();\n      }\n      this._layers.push(...box._layers());\n    }, this);\n    this._layers.forEach((item, index) => {\n      item._idx = index;\n    });\n    this.notifyPlugins('afterLayout');\n  }\n  _updateDatasets(mode) {\n    if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n      return;\n    }\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this.getDatasetMeta(i).controller.configure();\n    }\n    for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n    }\n    this.notifyPlugins('afterDatasetsUpdate', {mode});\n  }\n  _updateDataset(index, mode) {\n    const meta = this.getDatasetMeta(index);\n    const args = {meta, index, mode, cancelable: true};\n    if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n      return;\n    }\n    meta.controller._update(mode);\n    args.cancelable = false;\n    this.notifyPlugins('afterDatasetUpdate', args);\n  }\n  render() {\n    if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n      return;\n    }\n    if (animator.has(this)) {\n      if (this.attached && !animator.running(this)) {\n        animator.start(this);\n      }\n    } else {\n      this.draw();\n      onAnimationsComplete({chart: this});\n    }\n  }\n  draw() {\n    let i;\n    if (this._resizeBeforeDraw) {\n      const {width, height} = this._resizeBeforeDraw;\n      this._resize(width, height);\n      this._resizeBeforeDraw = null;\n    }\n    this.clear();\n    if (this.width <= 0 || this.height <= 0) {\n      return;\n    }\n    if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n      return;\n    }\n    const layers = this._layers;\n    for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n      layers[i].draw(this.chartArea);\n    }\n    this._drawDatasets();\n    for (; i < layers.length; ++i) {\n      layers[i].draw(this.chartArea);\n    }\n    this.notifyPlugins('afterDraw');\n  }\n  _getSortedDatasetMetas(filterVisible) {\n    const metasets = this._sortedMetasets;\n    const result = [];\n    let i, ilen;\n    for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n      const meta = metasets[i];\n      if (!filterVisible || meta.visible) {\n        result.push(meta);\n      }\n    }\n    return result;\n  }\n  getSortedVisibleDatasetMetas() {\n    return this._getSortedDatasetMetas(true);\n  }\n  _drawDatasets() {\n    if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n      return;\n    }\n    const metasets = this.getSortedVisibleDatasetMetas();\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      this._drawDataset(metasets[i]);\n    }\n    this.notifyPlugins('afterDatasetsDraw');\n  }\n  _drawDataset(meta) {\n    const ctx = this.ctx;\n    const clip = meta._clip;\n    const useClip = !clip.disabled;\n    const area = this.chartArea;\n    const args = {\n      meta,\n      index: meta.index,\n      cancelable: true\n    };\n    if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n      return;\n    }\n    if (useClip) {\n      clipArea(ctx, {\n        left: clip.left === false ? 0 : area.left - clip.left,\n        right: clip.right === false ? this.width : area.right + clip.right,\n        top: clip.top === false ? 0 : area.top - clip.top,\n        bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n      });\n    }\n    meta.controller.draw();\n    if (useClip) {\n      unclipArea(ctx);\n    }\n    args.cancelable = false;\n    this.notifyPlugins('afterDatasetDraw', args);\n  }\n  getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n    const method = Interaction.modes[mode];\n    if (typeof method === 'function') {\n      return method(this, e, options, useFinalPosition);\n    }\n    return [];\n  }\n  getDatasetMeta(datasetIndex) {\n    const dataset = this.data.datasets[datasetIndex];\n    const metasets = this._metasets;\n    let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n    if (!meta) {\n      meta = {\n        type: null,\n        data: [],\n        dataset: null,\n        controller: null,\n        hidden: null,\n        xAxisID: null,\n        yAxisID: null,\n        order: dataset && dataset.order || 0,\n        index: datasetIndex,\n        _dataset: dataset,\n        _parsed: [],\n        _sorted: false\n      };\n      metasets.push(meta);\n    }\n    return meta;\n  }\n  getContext() {\n    return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n  }\n  getVisibleDatasetCount() {\n    return this.getSortedVisibleDatasetMetas().length;\n  }\n  isDatasetVisible(datasetIndex) {\n    const dataset = this.data.datasets[datasetIndex];\n    if (!dataset) {\n      return false;\n    }\n    const meta = this.getDatasetMeta(datasetIndex);\n    return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n  }\n  setDatasetVisibility(datasetIndex, visible) {\n    const meta = this.getDatasetMeta(datasetIndex);\n    meta.hidden = !visible;\n  }\n  toggleDataVisibility(index) {\n    this._hiddenIndices[index] = !this._hiddenIndices[index];\n  }\n  getDataVisibility(index) {\n    return !this._hiddenIndices[index];\n  }\n  _updateVisibility(datasetIndex, dataIndex, visible) {\n    const mode = visible ? 'show' : 'hide';\n    const meta = this.getDatasetMeta(datasetIndex);\n    const anims = meta.controller._resolveAnimations(undefined, mode);\n    if (defined(dataIndex)) {\n      meta.data[dataIndex].hidden = !visible;\n      this.update();\n    } else {\n      this.setDatasetVisibility(datasetIndex, visible);\n      anims.update(meta, {visible});\n      this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n    }\n  }\n  hide(datasetIndex, dataIndex) {\n    this._updateVisibility(datasetIndex, dataIndex, false);\n  }\n  show(datasetIndex, dataIndex) {\n    this._updateVisibility(datasetIndex, dataIndex, true);\n  }\n  _destroyDatasetMeta(datasetIndex) {\n    const meta = this._metasets[datasetIndex];\n    if (meta && meta.controller) {\n      meta.controller._destroy();\n    }\n    delete this._metasets[datasetIndex];\n  }\n  _stop() {\n    let i, ilen;\n    this.stop();\n    animator.remove(this);\n    for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n      this._destroyDatasetMeta(i);\n    }\n  }\n  destroy() {\n    this.notifyPlugins('beforeDestroy');\n    const {canvas, ctx} = this;\n    this._stop();\n    this.config.clearCache();\n    if (canvas) {\n      this.unbindEvents();\n      clearCanvas(canvas, ctx);\n      this.platform.releaseContext(ctx);\n      this.canvas = null;\n      this.ctx = null;\n    }\n    this.notifyPlugins('destroy');\n    delete instances[this.id];\n    this.notifyPlugins('afterDestroy');\n  }\n  toBase64Image(...args) {\n    return this.canvas.toDataURL(...args);\n  }\n  bindEvents() {\n    this.bindUserEvents();\n    if (this.options.responsive) {\n      this.bindResponsiveEvents();\n    } else {\n      this.attached = true;\n    }\n  }\n  bindUserEvents() {\n    const listeners = this._listeners;\n    const platform = this.platform;\n    const _add = (type, listener) => {\n      platform.addEventListener(this, type, listener);\n      listeners[type] = listener;\n    };\n    const listener = (e, x, y) => {\n      e.offsetX = x;\n      e.offsetY = y;\n      this._eventHandler(e);\n    };\n    each(this.options.events, (type) => _add(type, listener));\n  }\n  bindResponsiveEvents() {\n    if (!this._responsiveListeners) {\n      this._responsiveListeners = {};\n    }\n    const listeners = this._responsiveListeners;\n    const platform = this.platform;\n    const _add = (type, listener) => {\n      platform.addEventListener(this, type, listener);\n      listeners[type] = listener;\n    };\n    const _remove = (type, listener) => {\n      if (listeners[type]) {\n        platform.removeEventListener(this, type, listener);\n        delete listeners[type];\n      }\n    };\n    const listener = (width, height) => {\n      if (this.canvas) {\n        this.resize(width, height);\n      }\n    };\n    let detached;\n    const attached = () => {\n      _remove('attach', attached);\n      this.attached = true;\n      this.resize();\n      _add('resize', listener);\n      _add('detach', detached);\n    };\n    detached = () => {\n      this.attached = false;\n      _remove('resize', listener);\n      this._stop();\n      this._resize(0, 0);\n      _add('attach', attached);\n    };\n    if (platform.isAttached(this.canvas)) {\n      attached();\n    } else {\n      detached();\n    }\n  }\n  unbindEvents() {\n    each(this._listeners, (listener, type) => {\n      this.platform.removeEventListener(this, type, listener);\n    });\n    this._listeners = {};\n    each(this._responsiveListeners, (listener, type) => {\n      this.platform.removeEventListener(this, type, listener);\n    });\n    this._responsiveListeners = undefined;\n  }\n  updateHoverStyle(items, mode, enabled) {\n    const prefix = enabled ? 'set' : 'remove';\n    let meta, item, i, ilen;\n    if (mode === 'dataset') {\n      meta = this.getDatasetMeta(items[0].datasetIndex);\n      meta.controller['_' + prefix + 'DatasetHoverStyle']();\n    }\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      item = items[i];\n      const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n      if (controller) {\n        controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n      }\n    }\n  }\n  getActiveElements() {\n    return this._active || [];\n  }\n  setActiveElements(activeElements) {\n    const lastActive = this._active || [];\n    const active = activeElements.map(({datasetIndex, index}) => {\n      const meta = this.getDatasetMeta(datasetIndex);\n      if (!meta) {\n        throw new Error('No dataset found at index ' + datasetIndex);\n      }\n      return {\n        datasetIndex,\n        element: meta.data[index],\n        index,\n      };\n    });\n    const changed = !_elementsEqual(active, lastActive);\n    if (changed) {\n      this._active = active;\n      this._lastEvent = null;\n      this._updateHoverStyles(active, lastActive);\n    }\n  }\n  notifyPlugins(hook, args, filter) {\n    return this._plugins.notify(this, hook, args, filter);\n  }\n  _updateHoverStyles(active, lastActive, replay) {\n    const hoverOptions = this.options.hover;\n    const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n    const deactivated = diff(lastActive, active);\n    const activated = replay ? active : diff(active, lastActive);\n    if (deactivated.length) {\n      this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n    }\n    if (activated.length && hoverOptions.mode) {\n      this.updateHoverStyle(activated, hoverOptions.mode, true);\n    }\n  }\n  _eventHandler(e, replay) {\n    const args = {\n      event: e,\n      replay,\n      cancelable: true,\n      inChartArea: _isPointInArea(e, this.chartArea, this._minPadding)\n    };\n    const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n    if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n      return;\n    }\n    const changed = this._handleEvent(e, replay, args.inChartArea);\n    args.cancelable = false;\n    this.notifyPlugins('afterEvent', args, eventFilter);\n    if (changed || args.changed) {\n      this.render();\n    }\n    return this;\n  }\n  _handleEvent(e, replay, inChartArea) {\n    const {_active: lastActive = [], options} = this;\n    const useFinalPosition = replay;\n    const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n    const isClick = _isClickEvent(e);\n    const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n    if (inChartArea) {\n      this._lastEvent = null;\n      callback(options.onHover, [e, active, this], this);\n      if (isClick) {\n        callback(options.onClick, [e, active, this], this);\n      }\n    }\n    const changed = !_elementsEqual(active, lastActive);\n    if (changed || replay) {\n      this._active = active;\n      this._updateHoverStyles(active, lastActive, replay);\n    }\n    this._lastEvent = lastEvent;\n    return changed;\n  }\n  _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n    if (e.type === 'mouseout') {\n      return [];\n    }\n    if (!inChartArea) {\n      return lastActive;\n    }\n    const hoverOptions = this.options.hover;\n    return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n  }\n}\nconst invalidatePlugins = () => each(Chart.instances, (chart) => chart._plugins.invalidate());\nconst enumerable = true;\nObject.defineProperties(Chart, {\n  defaults: {\n    enumerable,\n    value: defaults\n  },\n  instances: {\n    enumerable,\n    value: instances\n  },\n  overrides: {\n    enumerable,\n    value: overrides\n  },\n  registry: {\n    enumerable,\n    value: registry\n  },\n  version: {\n    enumerable,\n    value: version\n  },\n  getChart: {\n    enumerable,\n    value: getChart\n  },\n  register: {\n    enumerable,\n    value: (...items) => {\n      registry.add(...items);\n      invalidatePlugins();\n    }\n  },\n  unregister: {\n    enumerable,\n    value: (...items) => {\n      registry.remove(...items);\n      invalidatePlugins();\n    }\n  }\n});\n\nfunction clipArc(ctx, element, endAngle) {\n  const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n  let angleMargin = pixelMargin / outerRadius;\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n  if (innerRadius > pixelMargin) {\n    angleMargin = pixelMargin / innerRadius;\n    ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n  } else {\n    ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n  }\n  ctx.closePath();\n  ctx.clip();\n}\nfunction toRadiusCorners(value) {\n  return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\nfunction parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n  const o = toRadiusCorners(arc.options.borderRadius);\n  const halfThickness = (outerRadius - innerRadius) / 2;\n  const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n  const computeOuterLimit = (val) => {\n    const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n    return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n  };\n  return {\n    outerStart: computeOuterLimit(o.outerStart),\n    outerEnd: computeOuterLimit(o.outerEnd),\n    innerStart: _limitValue(o.innerStart, 0, innerLimit),\n    innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n  };\n}\nfunction rThetaToXY(r, theta, x, y) {\n  return {\n    x: x + r * Math.cos(theta),\n    y: y + r * Math.sin(theta),\n  };\n}\nfunction pathArc(ctx, element, offset, spacing, end) {\n  const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n  const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n  const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n  let spacingOffset = 0;\n  const alpha = end - start;\n  if (spacing) {\n    const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n    const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n    const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n    const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n    spacingOffset = (alpha - adjustedAngle) / 2;\n  }\n  const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n  const angleOffset = (alpha - beta) / 2;\n  const startAngle = start + angleOffset + spacingOffset;\n  const endAngle = end - angleOffset - spacingOffset;\n  const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n  const outerStartAdjustedRadius = outerRadius - outerStart;\n  const outerEndAdjustedRadius = outerRadius - outerEnd;\n  const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n  const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n  const innerStartAdjustedRadius = innerRadius + innerStart;\n  const innerEndAdjustedRadius = innerRadius + innerEnd;\n  const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n  const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerEndAdjustedAngle);\n  if (outerEnd > 0) {\n    const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n    ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n  }\n  const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n  ctx.lineTo(p4.x, p4.y);\n  if (innerEnd > 0) {\n    const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n    ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n  }\n  ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), startAngle + (innerStart / innerRadius), true);\n  if (innerStart > 0) {\n    const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n    ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n  }\n  const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n  ctx.lineTo(p8.x, p8.y);\n  if (outerStart > 0) {\n    const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n    ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n  }\n  ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing) {\n  const {fullCircles, startAngle, circumference} = element;\n  let endAngle = element.endAngle;\n  if (fullCircles) {\n    pathArc(ctx, element, offset, spacing, startAngle + TAU);\n    for (let i = 0; i < fullCircles; ++i) {\n      ctx.fill();\n    }\n    if (!isNaN(circumference)) {\n      endAngle = startAngle + circumference % TAU;\n      if (circumference % TAU === 0) {\n        endAngle += TAU;\n      }\n    }\n  }\n  pathArc(ctx, element, offset, spacing, endAngle);\n  ctx.fill();\n  return endAngle;\n}\nfunction drawFullCircleBorders(ctx, element, inner) {\n  const {x, y, startAngle, pixelMargin, fullCircles} = element;\n  const outerRadius = Math.max(element.outerRadius - pixelMargin, 0);\n  const innerRadius = element.innerRadius + pixelMargin;\n  let i;\n  if (inner) {\n    clipArc(ctx, element, startAngle + TAU);\n  }\n  ctx.beginPath();\n  ctx.arc(x, y, innerRadius, startAngle + TAU, startAngle, true);\n  for (i = 0; i < fullCircles; ++i) {\n    ctx.stroke();\n  }\n  ctx.beginPath();\n  ctx.arc(x, y, outerRadius, startAngle, startAngle + TAU);\n  for (i = 0; i < fullCircles; ++i) {\n    ctx.stroke();\n  }\n}\nfunction drawBorder(ctx, element, offset, spacing, endAngle) {\n  const {options} = element;\n  const {borderWidth, borderJoinStyle} = options;\n  const inner = options.borderAlign === 'inner';\n  if (!borderWidth) {\n    return;\n  }\n  if (inner) {\n    ctx.lineWidth = borderWidth * 2;\n    ctx.lineJoin = borderJoinStyle || 'round';\n  } else {\n    ctx.lineWidth = borderWidth;\n    ctx.lineJoin = borderJoinStyle || 'bevel';\n  }\n  if (element.fullCircles) {\n    drawFullCircleBorders(ctx, element, inner);\n  }\n  if (inner) {\n    clipArc(ctx, element, endAngle);\n  }\n  pathArc(ctx, element, offset, spacing, endAngle);\n  ctx.stroke();\n}\nclass ArcElement extends Element {\n  constructor(cfg) {\n    super();\n    this.options = undefined;\n    this.circumference = undefined;\n    this.startAngle = undefined;\n    this.endAngle = undefined;\n    this.innerRadius = undefined;\n    this.outerRadius = undefined;\n    this.pixelMargin = 0;\n    this.fullCircles = 0;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  inRange(chartX, chartY, useFinalPosition) {\n    const point = this.getProps(['x', 'y'], useFinalPosition);\n    const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n    const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n      'startAngle',\n      'endAngle',\n      'innerRadius',\n      'outerRadius',\n      'circumference'\n    ], useFinalPosition);\n    const rAdjust = this.options.spacing / 2;\n    const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n    const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n    const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n    return (betweenAngles && withinRadius);\n  }\n  getCenterPoint(useFinalPosition) {\n    const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n      'x',\n      'y',\n      'startAngle',\n      'endAngle',\n      'innerRadius',\n      'outerRadius',\n      'circumference',\n    ], useFinalPosition);\n    const {offset, spacing} = this.options;\n    const halfAngle = (startAngle + endAngle) / 2;\n    const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n    return {\n      x: x + Math.cos(halfAngle) * halfRadius,\n      y: y + Math.sin(halfAngle) * halfRadius\n    };\n  }\n  tooltipPosition(useFinalPosition) {\n    return this.getCenterPoint(useFinalPosition);\n  }\n  draw(ctx) {\n    const {options, circumference} = this;\n    const offset = (options.offset || 0) / 2;\n    const spacing = (options.spacing || 0) / 2;\n    this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n    this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n    if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n      return;\n    }\n    ctx.save();\n    let radiusOffset = 0;\n    if (offset) {\n      radiusOffset = offset / 2;\n      const halfAngle = (this.startAngle + this.endAngle) / 2;\n      ctx.translate(Math.cos(halfAngle) * radiusOffset, Math.sin(halfAngle) * radiusOffset);\n      if (this.circumference >= PI) {\n        radiusOffset = offset;\n      }\n    }\n    ctx.fillStyle = options.backgroundColor;\n    ctx.strokeStyle = options.borderColor;\n    const endAngle = drawArc(ctx, this, radiusOffset, spacing);\n    drawBorder(ctx, this, radiusOffset, spacing, endAngle);\n    ctx.restore();\n  }\n}\nArcElement.id = 'arc';\nArcElement.defaults = {\n  borderAlign: 'center',\n  borderColor: '#fff',\n  borderJoinStyle: undefined,\n  borderRadius: 0,\n  borderWidth: 2,\n  offset: 0,\n  spacing: 0,\n  angle: undefined,\n};\nArcElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor'\n};\n\nfunction setStyle(ctx, options, style = options) {\n  ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n  ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n  ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n  ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n  ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n  ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n  ctx.lineTo(target.x, target.y);\n}\nfunction getLineMethod(options) {\n  if (options.stepped) {\n    return _steppedLineTo;\n  }\n  if (options.tension || options.cubicInterpolationMode === 'monotone') {\n    return _bezierCurveTo;\n  }\n  return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n  const count = points.length;\n  const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n  const {start: segmentStart, end: segmentEnd} = segment;\n  const start = Math.max(paramsStart, segmentStart);\n  const end = Math.min(paramsEnd, segmentEnd);\n  const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n  return {\n    count,\n    start,\n    loop: segment.loop,\n    ilen: end < start && !outside ? count + end - start : end - start\n  };\n}\nfunction pathSegment(ctx, line, segment, params) {\n  const {points, options} = line;\n  const {count, start, loop, ilen} = pathVars(points, segment, params);\n  const lineMethod = getLineMethod(options);\n  let {move = true, reverse} = params || {};\n  let i, point, prev;\n  for (i = 0; i <= ilen; ++i) {\n    point = points[(start + (reverse ? ilen - i : i)) % count];\n    if (point.skip) {\n      continue;\n    } else if (move) {\n      ctx.moveTo(point.x, point.y);\n      move = false;\n    } else {\n      lineMethod(ctx, prev, point, reverse, options.stepped);\n    }\n    prev = point;\n  }\n  if (loop) {\n    point = points[(start + (reverse ? ilen : 0)) % count];\n    lineMethod(ctx, prev, point, reverse, options.stepped);\n  }\n  return !!loop;\n}\nfunction fastPathSegment(ctx, line, segment, params) {\n  const points = line.points;\n  const {count, start, ilen} = pathVars(points, segment, params);\n  const {move = true, reverse} = params || {};\n  let avgX = 0;\n  let countX = 0;\n  let i, point, prevX, minY, maxY, lastY;\n  const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n  const drawX = () => {\n    if (minY !== maxY) {\n      ctx.lineTo(avgX, maxY);\n      ctx.lineTo(avgX, minY);\n      ctx.lineTo(avgX, lastY);\n    }\n  };\n  if (move) {\n    point = points[pointIndex(0)];\n    ctx.moveTo(point.x, point.y);\n  }\n  for (i = 0; i <= ilen; ++i) {\n    point = points[pointIndex(i)];\n    if (point.skip) {\n      continue;\n    }\n    const x = point.x;\n    const y = point.y;\n    const truncX = x | 0;\n    if (truncX === prevX) {\n      if (y < minY) {\n        minY = y;\n      } else if (y > maxY) {\n        maxY = y;\n      }\n      avgX = (countX * avgX + x) / ++countX;\n    } else {\n      drawX();\n      ctx.lineTo(x, y);\n      prevX = truncX;\n      countX = 0;\n      minY = maxY = y;\n    }\n    lastY = y;\n  }\n  drawX();\n}\nfunction _getSegmentMethod(line) {\n  const opts = line.options;\n  const borderDash = opts.borderDash && opts.borderDash.length;\n  const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n  return useFastPath ? fastPathSegment : pathSegment;\n}\nfunction _getInterpolationMethod(options) {\n  if (options.stepped) {\n    return _steppedInterpolation;\n  }\n  if (options.tension || options.cubicInterpolationMode === 'monotone') {\n    return _bezierInterpolation;\n  }\n  return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n  let path = line._path;\n  if (!path) {\n    path = line._path = new Path2D();\n    if (line.path(path, start, count)) {\n      path.closePath();\n    }\n  }\n  setStyle(ctx, line.options);\n  ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n  const {segments, options} = line;\n  const segmentMethod = _getSegmentMethod(line);\n  for (const segment of segments) {\n    setStyle(ctx, options, segment.style);\n    ctx.beginPath();\n    if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n      ctx.closePath();\n    }\n    ctx.stroke();\n  }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n  if (usePath2D && !line.options.segment) {\n    strokePathWithCache(ctx, line, start, count);\n  } else {\n    strokePathDirect(ctx, line, start, count);\n  }\n}\nclass LineElement extends Element {\n  constructor(cfg) {\n    super();\n    this.animated = true;\n    this.options = undefined;\n    this._chart = undefined;\n    this._loop = undefined;\n    this._fullLoop = undefined;\n    this._path = undefined;\n    this._points = undefined;\n    this._segments = undefined;\n    this._decimated = false;\n    this._pointsUpdated = false;\n    this._datasetIndex = undefined;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  updateControlPoints(chartArea, indexAxis) {\n    const options = this.options;\n    if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n      const loop = options.spanGaps ? this._loop : this._fullLoop;\n      _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n      this._pointsUpdated = true;\n    }\n  }\n  set points(points) {\n    this._points = points;\n    delete this._segments;\n    delete this._path;\n    this._pointsUpdated = false;\n  }\n  get points() {\n    return this._points;\n  }\n  get segments() {\n    return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n  }\n  first() {\n    const segments = this.segments;\n    const points = this.points;\n    return segments.length && points[segments[0].start];\n  }\n  last() {\n    const segments = this.segments;\n    const points = this.points;\n    const count = segments.length;\n    return count && points[segments[count - 1].end];\n  }\n  interpolate(point, property) {\n    const options = this.options;\n    const value = point[property];\n    const points = this.points;\n    const segments = _boundSegments(this, {property, start: value, end: value});\n    if (!segments.length) {\n      return;\n    }\n    const result = [];\n    const _interpolate = _getInterpolationMethod(options);\n    let i, ilen;\n    for (i = 0, ilen = segments.length; i < ilen; ++i) {\n      const {start, end} = segments[i];\n      const p1 = points[start];\n      const p2 = points[end];\n      if (p1 === p2) {\n        result.push(p1);\n        continue;\n      }\n      const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n      const interpolated = _interpolate(p1, p2, t, options.stepped);\n      interpolated[property] = point[property];\n      result.push(interpolated);\n    }\n    return result.length === 1 ? result[0] : result;\n  }\n  pathSegment(ctx, segment, params) {\n    const segmentMethod = _getSegmentMethod(this);\n    return segmentMethod(ctx, this, segment, params);\n  }\n  path(ctx, start, count) {\n    const segments = this.segments;\n    const segmentMethod = _getSegmentMethod(this);\n    let loop = this._loop;\n    start = start || 0;\n    count = count || (this.points.length - start);\n    for (const segment of segments) {\n      loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n    }\n    return !!loop;\n  }\n  draw(ctx, chartArea, start, count) {\n    const options = this.options || {};\n    const points = this.points || [];\n    if (points.length && options.borderWidth) {\n      ctx.save();\n      draw(ctx, this, start, count);\n      ctx.restore();\n    }\n    if (this.animated) {\n      this._pointsUpdated = false;\n      this._path = undefined;\n    }\n  }\n}\nLineElement.id = 'line';\nLineElement.defaults = {\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderWidth: 3,\n  capBezierPoints: true,\n  cubicInterpolationMode: 'default',\n  fill: false,\n  spanGaps: false,\n  stepped: false,\n  tension: 0,\n};\nLineElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor',\n  borderColor: 'borderColor'\n};\nLineElement.descriptors = {\n  _scriptable: true,\n  _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n};\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n  const options = el.options;\n  const {[axis]: value} = el.getProps([axis], useFinalPosition);\n  return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\nclass PointElement extends Element {\n  constructor(cfg) {\n    super();\n    this.options = undefined;\n    this.parsed = undefined;\n    this.skip = undefined;\n    this.stop = undefined;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const options = this.options;\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n  }\n  inXRange(mouseX, useFinalPosition) {\n    return inRange$1(this, mouseX, 'x', useFinalPosition);\n  }\n  inYRange(mouseY, useFinalPosition) {\n    return inRange$1(this, mouseY, 'y', useFinalPosition);\n  }\n  getCenterPoint(useFinalPosition) {\n    const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n    return {x, y};\n  }\n  size(options) {\n    options = options || this.options || {};\n    let radius = options.radius || 0;\n    radius = Math.max(radius, radius && options.hoverRadius || 0);\n    const borderWidth = radius && options.borderWidth || 0;\n    return (radius + borderWidth) * 2;\n  }\n  draw(ctx, area) {\n    const options = this.options;\n    if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n      return;\n    }\n    ctx.strokeStyle = options.borderColor;\n    ctx.lineWidth = options.borderWidth;\n    ctx.fillStyle = options.backgroundColor;\n    drawPoint(ctx, options, this.x, this.y);\n  }\n  getRange() {\n    const options = this.options || {};\n    return options.radius + options.hitRadius;\n  }\n}\nPointElement.id = 'point';\nPointElement.defaults = {\n  borderWidth: 1,\n  hitRadius: 1,\n  hoverBorderWidth: 1,\n  hoverRadius: 4,\n  pointStyle: 'circle',\n  radius: 3,\n  rotation: 0\n};\nPointElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor',\n  borderColor: 'borderColor'\n};\n\nfunction getBarBounds(bar, useFinalPosition) {\n  const {x, y, base, width, height} = bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition);\n  let left, right, top, bottom, half;\n  if (bar.horizontal) {\n    half = height / 2;\n    left = Math.min(x, base);\n    right = Math.max(x, base);\n    top = y - half;\n    bottom = y + half;\n  } else {\n    half = width / 2;\n    left = x - half;\n    right = x + half;\n    top = Math.min(y, base);\n    bottom = Math.max(y, base);\n  }\n  return {left, top, right, bottom};\n}\nfunction skipOrLimit(skip, value, min, max) {\n  return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n  const value = bar.options.borderWidth;\n  const skip = bar.borderSkipped;\n  const o = toTRBL(value);\n  return {\n    t: skipOrLimit(skip.top, o.top, 0, maxH),\n    r: skipOrLimit(skip.right, o.right, 0, maxW),\n    b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n    l: skipOrLimit(skip.left, o.left, 0, maxW)\n  };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n  const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n  const value = bar.options.borderRadius;\n  const o = toTRBLCorners(value);\n  const maxR = Math.min(maxW, maxH);\n  const skip = bar.borderSkipped;\n  const enableBorder = enableBorderRadius || isObject(value);\n  return {\n    topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n    topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n    bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n    bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n  };\n}\nfunction boundingRects(bar) {\n  const bounds = getBarBounds(bar);\n  const width = bounds.right - bounds.left;\n  const height = bounds.bottom - bounds.top;\n  const border = parseBorderWidth(bar, width / 2, height / 2);\n  const radius = parseBorderRadius(bar, width / 2, height / 2);\n  return {\n    outer: {\n      x: bounds.left,\n      y: bounds.top,\n      w: width,\n      h: height,\n      radius\n    },\n    inner: {\n      x: bounds.left + border.l,\n      y: bounds.top + border.t,\n      w: width - border.l - border.r,\n      h: height - border.t - border.b,\n      radius: {\n        topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n        topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n        bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n        bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n      }\n    }\n  };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n  const skipX = x === null;\n  const skipY = y === null;\n  const skipBoth = skipX && skipY;\n  const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n  return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n  return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\nfunction addNormalRectPath(ctx, rect) {\n  ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n  const x = rect.x !== refRect.x ? -amount : 0;\n  const y = rect.y !== refRect.y ? -amount : 0;\n  const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n  const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n  return {\n    x: rect.x + x,\n    y: rect.y + y,\n    w: rect.w + w,\n    h: rect.h + h,\n    radius: rect.radius\n  };\n}\nclass BarElement extends Element {\n  constructor(cfg) {\n    super();\n    this.options = undefined;\n    this.horizontal = undefined;\n    this.base = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this.inflateAmount = undefined;\n    if (cfg) {\n      Object.assign(this, cfg);\n    }\n  }\n  draw(ctx) {\n    const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n    const {inner, outer} = boundingRects(this);\n    const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n    ctx.save();\n    if (outer.w !== inner.w || outer.h !== inner.h) {\n      ctx.beginPath();\n      addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n      ctx.clip();\n      addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n      ctx.fillStyle = borderColor;\n      ctx.fill('evenodd');\n    }\n    ctx.beginPath();\n    addRectPath(ctx, inflateRect(inner, inflateAmount));\n    ctx.fillStyle = backgroundColor;\n    ctx.fill();\n    ctx.restore();\n  }\n  inRange(mouseX, mouseY, useFinalPosition) {\n    return inRange(this, mouseX, mouseY, useFinalPosition);\n  }\n  inXRange(mouseX, useFinalPosition) {\n    return inRange(this, mouseX, null, useFinalPosition);\n  }\n  inYRange(mouseY, useFinalPosition) {\n    return inRange(this, null, mouseY, useFinalPosition);\n  }\n  getCenterPoint(useFinalPosition) {\n    const {x, y, base, horizontal} = this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition);\n    return {\n      x: horizontal ? (x + base) / 2 : x,\n      y: horizontal ? y : (y + base) / 2\n    };\n  }\n  getRange(axis) {\n    return axis === 'x' ? this.width / 2 : this.height / 2;\n  }\n}\nBarElement.id = 'bar';\nBarElement.defaults = {\n  borderSkipped: 'start',\n  borderWidth: 0,\n  borderRadius: 0,\n  inflateAmount: 'auto',\n  pointStyle: undefined\n};\nBarElement.defaultRoutes = {\n  backgroundColor: 'backgroundColor',\n  borderColor: 'borderColor'\n};\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nLineElement: LineElement,\nPointElement: PointElement,\nBarElement: BarElement\n});\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n  const samples = options.samples || availableWidth;\n  if (samples >= count) {\n    return data.slice(start, start + count);\n  }\n  const decimated = [];\n  const bucketWidth = (count - 2) / (samples - 2);\n  let sampledIndex = 0;\n  const endIndex = start + count - 1;\n  let a = start;\n  let i, maxAreaPoint, maxArea, area, nextA;\n  decimated[sampledIndex++] = data[a];\n  for (i = 0; i < samples - 2; i++) {\n    let avgX = 0;\n    let avgY = 0;\n    let j;\n    const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n    const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n    const avgRangeLength = avgRangeEnd - avgRangeStart;\n    for (j = avgRangeStart; j < avgRangeEnd; j++) {\n      avgX += data[j].x;\n      avgY += data[j].y;\n    }\n    avgX /= avgRangeLength;\n    avgY /= avgRangeLength;\n    const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n    const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n    const {x: pointAx, y: pointAy} = data[a];\n    maxArea = area = -1;\n    for (j = rangeOffs; j < rangeTo; j++) {\n      area = 0.5 * Math.abs(\n        (pointAx - avgX) * (data[j].y - pointAy) -\n        (pointAx - data[j].x) * (avgY - pointAy)\n      );\n      if (area > maxArea) {\n        maxArea = area;\n        maxAreaPoint = data[j];\n        nextA = j;\n      }\n    }\n    decimated[sampledIndex++] = maxAreaPoint;\n    a = nextA;\n  }\n  decimated[sampledIndex++] = data[endIndex];\n  return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n  let avgX = 0;\n  let countX = 0;\n  let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n  const decimated = [];\n  const endIndex = start + count - 1;\n  const xMin = data[start].x;\n  const xMax = data[endIndex].x;\n  const dx = xMax - xMin;\n  for (i = start; i < start + count; ++i) {\n    point = data[i];\n    x = (point.x - xMin) / dx * availableWidth;\n    y = point.y;\n    const truncX = x | 0;\n    if (truncX === prevX) {\n      if (y < minY) {\n        minY = y;\n        minIndex = i;\n      } else if (y > maxY) {\n        maxY = y;\n        maxIndex = i;\n      }\n      avgX = (countX * avgX + point.x) / ++countX;\n    } else {\n      const lastIndex = i - 1;\n      if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n        const intermediateIndex1 = Math.min(minIndex, maxIndex);\n        const intermediateIndex2 = Math.max(minIndex, maxIndex);\n        if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n          decimated.push({\n            ...data[intermediateIndex1],\n            x: avgX,\n          });\n        }\n        if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n          decimated.push({\n            ...data[intermediateIndex2],\n            x: avgX\n          });\n        }\n      }\n      if (i > 0 && lastIndex !== startIndex) {\n        decimated.push(data[lastIndex]);\n      }\n      decimated.push(point);\n      prevX = truncX;\n      countX = 0;\n      minY = maxY = y;\n      minIndex = maxIndex = startIndex = i;\n    }\n  }\n  return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n  if (dataset._decimated) {\n    const data = dataset._data;\n    delete dataset._decimated;\n    delete dataset._data;\n    Object.defineProperty(dataset, 'data', {value: data});\n  }\n}\nfunction cleanDecimatedData(chart) {\n  chart.data.datasets.forEach((dataset) => {\n    cleanDecimatedDataset(dataset);\n  });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n  const pointCount = points.length;\n  let start = 0;\n  let count;\n  const {iScale} = meta;\n  const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n  if (minDefined) {\n    start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n  }\n  if (maxDefined) {\n    count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n  } else {\n    count = pointCount - start;\n  }\n  return {start, count};\n}\nvar plugin_decimation = {\n  id: 'decimation',\n  defaults: {\n    algorithm: 'min-max',\n    enabled: false,\n  },\n  beforeElementsUpdate: (chart, args, options) => {\n    if (!options.enabled) {\n      cleanDecimatedData(chart);\n      return;\n    }\n    const availableWidth = chart.width;\n    chart.data.datasets.forEach((dataset, datasetIndex) => {\n      const {_data, indexAxis} = dataset;\n      const meta = chart.getDatasetMeta(datasetIndex);\n      const data = _data || dataset.data;\n      if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n        return;\n      }\n      if (meta.type !== 'line') {\n        return;\n      }\n      const xAxis = chart.scales[meta.xAxisID];\n      if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n        return;\n      }\n      if (chart.options.parsing) {\n        return;\n      }\n      let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n      const threshold = options.threshold || 4 * availableWidth;\n      if (count <= threshold) {\n        cleanDecimatedDataset(dataset);\n        return;\n      }\n      if (isNullOrUndef(_data)) {\n        dataset._data = data;\n        delete dataset.data;\n        Object.defineProperty(dataset, 'data', {\n          configurable: true,\n          enumerable: true,\n          get: function() {\n            return this._decimated;\n          },\n          set: function(d) {\n            this._data = d;\n          }\n        });\n      }\n      let decimated;\n      switch (options.algorithm) {\n      case 'lttb':\n        decimated = lttbDecimation(data, start, count, availableWidth, options);\n        break;\n      case 'min-max':\n        decimated = minMaxDecimation(data, start, count, availableWidth);\n        break;\n      default:\n        throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n      }\n      dataset._decimated = decimated;\n    });\n  },\n  destroy(chart) {\n    cleanDecimatedData(chart);\n  }\n};\n\nfunction getLineByIndex(chart, index) {\n  const meta = chart.getDatasetMeta(index);\n  const visible = meta && chart.isDatasetVisible(index);\n  return visible ? meta.dataset : null;\n}\nfunction parseFillOption(line) {\n  const options = line.options;\n  const fillOption = options.fill;\n  let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n  if (fill === undefined) {\n    fill = !!options.backgroundColor;\n  }\n  if (fill === false || fill === null) {\n    return false;\n  }\n  if (fill === true) {\n    return 'origin';\n  }\n  return fill;\n}\nfunction decodeFill(line, index, count) {\n  const fill = parseFillOption(line);\n  if (isObject(fill)) {\n    return isNaN(fill.value) ? false : fill;\n  }\n  let target = parseFloat(fill);\n  if (isNumberFinite(target) && Math.floor(target) === target) {\n    if (fill[0] === '-' || fill[0] === '+') {\n      target = index + target;\n    }\n    if (target === index || target < 0 || target >= count) {\n      return false;\n    }\n    return target;\n  }\n  return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\nfunction computeLinearBoundary(source) {\n  const {scale = {}, fill} = source;\n  let target = null;\n  let horizontal;\n  if (fill === 'start') {\n    target = scale.bottom;\n  } else if (fill === 'end') {\n    target = scale.top;\n  } else if (isObject(fill)) {\n    target = scale.getPixelForValue(fill.value);\n  } else if (scale.getBasePixel) {\n    target = scale.getBasePixel();\n  }\n  if (isNumberFinite(target)) {\n    horizontal = scale.isHorizontal();\n    return {\n      x: horizontal ? target : null,\n      y: horizontal ? null : target\n    };\n  }\n  return null;\n}\nclass simpleArc {\n  constructor(opts) {\n    this.x = opts.x;\n    this.y = opts.y;\n    this.radius = opts.radius;\n  }\n  pathSegment(ctx, bounds, opts) {\n    const {x, y, radius} = this;\n    bounds = bounds || {start: 0, end: TAU};\n    ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n    return !opts.bounds;\n  }\n  interpolate(point) {\n    const {x, y, radius} = this;\n    const angle = point.angle;\n    return {\n      x: x + Math.cos(angle) * radius,\n      y: y + Math.sin(angle) * radius,\n      angle\n    };\n  }\n}\nfunction computeCircularBoundary(source) {\n  const {scale, fill} = source;\n  const options = scale.options;\n  const length = scale.getLabels().length;\n  const target = [];\n  const start = options.reverse ? scale.max : scale.min;\n  const end = options.reverse ? scale.min : scale.max;\n  let i, center, value;\n  if (fill === 'start') {\n    value = start;\n  } else if (fill === 'end') {\n    value = end;\n  } else if (isObject(fill)) {\n    value = fill.value;\n  } else {\n    value = scale.getBaseValue();\n  }\n  if (options.grid.circular) {\n    center = scale.getPointPositionForValue(0, start);\n    return new simpleArc({\n      x: center.x,\n      y: center.y,\n      radius: scale.getDistanceFromCenterForValue(value)\n    });\n  }\n  for (i = 0; i < length; ++i) {\n    target.push(scale.getPointPositionForValue(i, value));\n  }\n  return target;\n}\nfunction computeBoundary(source) {\n  const scale = source.scale || {};\n  if (scale.getPointPositionForValue) {\n    return computeCircularBoundary(source);\n  }\n  return computeLinearBoundary(source);\n}\nfunction findSegmentEnd(start, end, points) {\n  for (;end > start; end--) {\n    const point = points[end];\n    if (!isNaN(point.x) && !isNaN(point.y)) {\n      break;\n    }\n  }\n  return end;\n}\nfunction pointsFromSegments(boundary, line) {\n  const {x = null, y = null} = boundary || {};\n  const linePoints = line.points;\n  const points = [];\n  line.segments.forEach(({start, end}) => {\n    end = findSegmentEnd(start, end, linePoints);\n    const first = linePoints[start];\n    const last = linePoints[end];\n    if (y !== null) {\n      points.push({x: first.x, y});\n      points.push({x: last.x, y});\n    } else if (x !== null) {\n      points.push({x, y: first.y});\n      points.push({x, y: last.y});\n    }\n  });\n  return points;\n}\nfunction buildStackLine(source) {\n  const {scale, index, line} = source;\n  const points = [];\n  const segments = line.segments;\n  const sourcePoints = line.points;\n  const linesBelow = getLinesBelow(scale, index);\n  linesBelow.push(createBoundaryLine({x: null, y: scale.bottom}, line));\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    for (let j = segment.start; j <= segment.end; j++) {\n      addPointsBelow(points, sourcePoints[j], linesBelow);\n    }\n  }\n  return new LineElement({points, options: {}});\n}\nfunction getLinesBelow(scale, index) {\n  const below = [];\n  const metas = scale.getMatchingVisibleMetas('line');\n  for (let i = 0; i < metas.length; i++) {\n    const meta = metas[i];\n    if (meta.index === index) {\n      break;\n    }\n    if (!meta.hidden) {\n      below.unshift(meta.dataset);\n    }\n  }\n  return below;\n}\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n  const postponed = [];\n  for (let j = 0; j < linesBelow.length; j++) {\n    const line = linesBelow[j];\n    const {first, last, point} = findPoint(line, sourcePoint, 'x');\n    if (!point || (first && last)) {\n      continue;\n    }\n    if (first) {\n      postponed.unshift(point);\n    } else {\n      points.push(point);\n      if (!last) {\n        break;\n      }\n    }\n  }\n  points.push(...postponed);\n}\nfunction findPoint(line, sourcePoint, property) {\n  const point = line.interpolate(sourcePoint, property);\n  if (!point) {\n    return {};\n  }\n  const pointValue = point[property];\n  const segments = line.segments;\n  const linePoints = line.points;\n  let first = false;\n  let last = false;\n  for (let i = 0; i < segments.length; i++) {\n    const segment = segments[i];\n    const firstValue = linePoints[segment.start][property];\n    const lastValue = linePoints[segment.end][property];\n    if (_isBetween(pointValue, firstValue, lastValue)) {\n      first = pointValue === firstValue;\n      last = pointValue === lastValue;\n      break;\n    }\n  }\n  return {first, last, point};\n}\nfunction getTarget(source) {\n  const {chart, fill, line} = source;\n  if (isNumberFinite(fill)) {\n    return getLineByIndex(chart, fill);\n  }\n  if (fill === 'stack') {\n    return buildStackLine(source);\n  }\n  if (fill === 'shape') {\n    return true;\n  }\n  const boundary = computeBoundary(source);\n  if (boundary instanceof simpleArc) {\n    return boundary;\n  }\n  return createBoundaryLine(boundary, line);\n}\nfunction createBoundaryLine(boundary, line) {\n  let points = [];\n  let _loop = false;\n  if (isArray(boundary)) {\n    _loop = true;\n    points = boundary;\n  } else {\n    points = pointsFromSegments(boundary, line);\n  }\n  return points.length ? new LineElement({\n    points,\n    options: {tension: 0},\n    _loop,\n    _fullLoop: _loop\n  }) : null;\n}\nfunction resolveTarget(sources, index, propagate) {\n  const source = sources[index];\n  let fill = source.fill;\n  const visited = [index];\n  let target;\n  if (!propagate) {\n    return fill;\n  }\n  while (fill !== false && visited.indexOf(fill) === -1) {\n    if (!isNumberFinite(fill)) {\n      return fill;\n    }\n    target = sources[fill];\n    if (!target) {\n      return false;\n    }\n    if (target.visible) {\n      return fill;\n    }\n    visited.push(fill);\n    fill = target.fill;\n  }\n  return false;\n}\nfunction _clip(ctx, target, clipY) {\n  const {segments, points} = target;\n  let first = true;\n  let lineLoop = false;\n  ctx.beginPath();\n  for (const segment of segments) {\n    const {start, end} = segment;\n    const firstPoint = points[start];\n    const lastPoint = points[findSegmentEnd(start, end, points)];\n    if (first) {\n      ctx.moveTo(firstPoint.x, firstPoint.y);\n      first = false;\n    } else {\n      ctx.lineTo(firstPoint.x, clipY);\n      ctx.lineTo(firstPoint.x, firstPoint.y);\n    }\n    lineLoop = !!target.pathSegment(ctx, segment, {move: lineLoop});\n    if (lineLoop) {\n      ctx.closePath();\n    } else {\n      ctx.lineTo(lastPoint.x, clipY);\n    }\n  }\n  ctx.lineTo(target.first().x, clipY);\n  ctx.closePath();\n  ctx.clip();\n}\nfunction getBounds(property, first, last, loop) {\n  if (loop) {\n    return;\n  }\n  let start = first[property];\n  let end = last[property];\n  if (property === 'angle') {\n    start = _normalizeAngle(start);\n    end = _normalizeAngle(end);\n  }\n  return {property, start, end};\n}\nfunction _getEdge(a, b, prop, fn) {\n  if (a && b) {\n    return fn(a[prop], b[prop]);\n  }\n  return a ? a[prop] : b ? b[prop] : 0;\n}\nfunction _segments(line, target, property) {\n  const segments = line.segments;\n  const points = line.points;\n  const tpoints = target.points;\n  const parts = [];\n  for (const segment of segments) {\n    let {start, end} = segment;\n    end = findSegmentEnd(start, end, points);\n    const bounds = getBounds(property, points[start], points[end], segment.loop);\n    if (!target.segments) {\n      parts.push({\n        source: segment,\n        target: bounds,\n        start: points[start],\n        end: points[end]\n      });\n      continue;\n    }\n    const targetSegments = _boundSegments(target, bounds);\n    for (const tgt of targetSegments) {\n      const subBounds = getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n      const fillSources = _boundSegment(segment, points, subBounds);\n      for (const fillSource of fillSources) {\n        parts.push({\n          source: fillSource,\n          target: tgt,\n          start: {\n            [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n          },\n          end: {\n            [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n          }\n        });\n      }\n    }\n  }\n  return parts;\n}\nfunction clipBounds(ctx, scale, bounds) {\n  const {top, bottom} = scale.chart.chartArea;\n  const {property, start, end} = bounds || {};\n  if (property === 'x') {\n    ctx.beginPath();\n    ctx.rect(start, top, end - start, bottom - top);\n    ctx.clip();\n  }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n  const interpolatedPoint = target.interpolate(point, property);\n  if (interpolatedPoint) {\n    ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n  }\n}\nfunction _fill(ctx, cfg) {\n  const {line, target, property, color, scale} = cfg;\n  const segments = _segments(line, target, property);\n  for (const {source: src, target: tgt, start, end} of segments) {\n    const {style: {backgroundColor = color} = {}} = src;\n    const notShape = target !== true;\n    ctx.save();\n    ctx.fillStyle = backgroundColor;\n    clipBounds(ctx, scale, notShape && getBounds(property, start, end));\n    ctx.beginPath();\n    const lineLoop = !!line.pathSegment(ctx, src);\n    let loop;\n    if (notShape) {\n      if (lineLoop) {\n        ctx.closePath();\n      } else {\n        interpolatedLineTo(ctx, target, end, property);\n      }\n      const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n      loop = lineLoop && targetLoop;\n      if (!loop) {\n        interpolatedLineTo(ctx, target, start, property);\n      }\n    }\n    ctx.closePath();\n    ctx.fill(loop ? 'evenodd' : 'nonzero');\n    ctx.restore();\n  }\n}\nfunction doFill(ctx, cfg) {\n  const {line, target, above, below, area, scale} = cfg;\n  const property = line._loop ? 'angle' : cfg.axis;\n  ctx.save();\n  if (property === 'x' && below !== above) {\n    _clip(ctx, target, area.top);\n    _fill(ctx, {line, target, color: above, scale, property});\n    ctx.restore();\n    ctx.save();\n    _clip(ctx, target, area.bottom);\n  }\n  _fill(ctx, {line, target, color: below, scale, property});\n  ctx.restore();\n}\nfunction drawfill(ctx, source, area) {\n  const target = getTarget(source);\n  const {line, scale, axis} = source;\n  const lineOpts = line.options;\n  const fillOption = lineOpts.fill;\n  const color = lineOpts.backgroundColor;\n  const {above = color, below = color} = fillOption || {};\n  if (target && line.points.length) {\n    clipArea(ctx, area);\n    doFill(ctx, {line, target, above, below, area, scale, axis});\n    unclipArea(ctx);\n  }\n}\nvar plugin_filler = {\n  id: 'filler',\n  afterDatasetsUpdate(chart, _args, options) {\n    const count = (chart.data.datasets || []).length;\n    const sources = [];\n    let meta, i, line, source;\n    for (i = 0; i < count; ++i) {\n      meta = chart.getDatasetMeta(i);\n      line = meta.dataset;\n      source = null;\n      if (line && line.options && line instanceof LineElement) {\n        source = {\n          visible: chart.isDatasetVisible(i),\n          index: i,\n          fill: decodeFill(line, i, count),\n          chart,\n          axis: meta.controller.options.indexAxis,\n          scale: meta.vScale,\n          line,\n        };\n      }\n      meta.$filler = source;\n      sources.push(source);\n    }\n    for (i = 0; i < count; ++i) {\n      source = sources[i];\n      if (!source || source.fill === false) {\n        continue;\n      }\n      source.fill = resolveTarget(sources, i, options.propagate);\n    }\n  },\n  beforeDraw(chart, _args, options) {\n    const draw = options.drawTime === 'beforeDraw';\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    const area = chart.chartArea;\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      const source = metasets[i].$filler;\n      if (!source) {\n        continue;\n      }\n      source.line.updateControlPoints(area, source.axis);\n      if (draw) {\n        drawfill(chart.ctx, source, area);\n      }\n    }\n  },\n  beforeDatasetsDraw(chart, _args, options) {\n    if (options.drawTime !== 'beforeDatasetsDraw') {\n      return;\n    }\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    for (let i = metasets.length - 1; i >= 0; --i) {\n      const source = metasets[i].$filler;\n      if (source) {\n        drawfill(chart.ctx, source, chart.chartArea);\n      }\n    }\n  },\n  beforeDatasetDraw(chart, args, options) {\n    const source = args.meta.$filler;\n    if (!source || source.fill === false || options.drawTime !== 'beforeDatasetDraw') {\n      return;\n    }\n    drawfill(chart.ctx, source, chart.chartArea);\n  },\n  defaults: {\n    propagate: true,\n    drawTime: 'beforeDatasetDraw'\n  }\n};\n\nconst getBoxSize = (labelOpts, fontSize) => {\n  let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n  if (labelOpts.usePointStyle) {\n    boxHeight = Math.min(boxHeight, fontSize);\n    boxWidth = Math.min(boxWidth, fontSize);\n  }\n  return {\n    boxWidth,\n    boxHeight,\n    itemHeight: Math.max(fontSize, boxHeight)\n  };\n};\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n  constructor(config) {\n    super();\n    this._added = false;\n    this.legendHitBoxes = [];\n    this._hoveredItem = null;\n    this.doughnutMode = false;\n    this.chart = config.chart;\n    this.options = config.options;\n    this.ctx = config.ctx;\n    this.legendItems = undefined;\n    this.columnSizes = undefined;\n    this.lineWidths = undefined;\n    this.maxHeight = undefined;\n    this.maxWidth = undefined;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.height = undefined;\n    this.width = undefined;\n    this._margins = undefined;\n    this.position = undefined;\n    this.weight = undefined;\n    this.fullSize = undefined;\n  }\n  update(maxWidth, maxHeight, margins) {\n    this.maxWidth = maxWidth;\n    this.maxHeight = maxHeight;\n    this._margins = margins;\n    this.setDimensions();\n    this.buildLabels();\n    this.fit();\n  }\n  setDimensions() {\n    if (this.isHorizontal()) {\n      this.width = this.maxWidth;\n      this.left = this._margins.left;\n      this.right = this.width;\n    } else {\n      this.height = this.maxHeight;\n      this.top = this._margins.top;\n      this.bottom = this.height;\n    }\n  }\n  buildLabels() {\n    const labelOpts = this.options.labels || {};\n    let legendItems = callback(labelOpts.generateLabels, [this.chart], this) || [];\n    if (labelOpts.filter) {\n      legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n    }\n    if (labelOpts.sort) {\n      legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n    }\n    if (this.options.reverse) {\n      legendItems.reverse();\n    }\n    this.legendItems = legendItems;\n  }\n  fit() {\n    const {options, ctx} = this;\n    if (!options.display) {\n      this.width = this.height = 0;\n      return;\n    }\n    const labelOpts = options.labels;\n    const labelFont = toFont(labelOpts.font);\n    const fontSize = labelFont.size;\n    const titleHeight = this._computeTitleHeight();\n    const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n    let width, height;\n    ctx.font = labelFont.string;\n    if (this.isHorizontal()) {\n      width = this.maxWidth;\n      height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n    } else {\n      height = this.maxHeight;\n      width = this._fitCols(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n    }\n    this.width = Math.min(width, options.maxWidth || this.maxWidth);\n    this.height = Math.min(height, options.maxHeight || this.maxHeight);\n  }\n  _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n    const {ctx, maxWidth, options: {labels: {padding}}} = this;\n    const hitboxes = this.legendHitBoxes = [];\n    const lineWidths = this.lineWidths = [0];\n    const lineHeight = itemHeight + padding;\n    let totalHeight = titleHeight;\n    ctx.textAlign = 'left';\n    ctx.textBaseline = 'middle';\n    let row = -1;\n    let top = -lineHeight;\n    this.legendItems.forEach((legendItem, i) => {\n      const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n      if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n        totalHeight += lineHeight;\n        lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n        top += lineHeight;\n        row++;\n      }\n      hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n      lineWidths[lineWidths.length - 1] += itemWidth + padding;\n    });\n    return totalHeight;\n  }\n  _fitCols(titleHeight, fontSize, boxWidth, itemHeight) {\n    const {ctx, maxHeight, options: {labels: {padding}}} = this;\n    const hitboxes = this.legendHitBoxes = [];\n    const columnSizes = this.columnSizes = [];\n    const heightLimit = maxHeight - titleHeight;\n    let totalWidth = padding;\n    let currentColWidth = 0;\n    let currentColHeight = 0;\n    let left = 0;\n    let col = 0;\n    this.legendItems.forEach((legendItem, i) => {\n      const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n      if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n        totalWidth += currentColWidth + padding;\n        columnSizes.push({width: currentColWidth, height: currentColHeight});\n        left += currentColWidth + padding;\n        col++;\n        currentColWidth = currentColHeight = 0;\n      }\n      hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n      currentColWidth = Math.max(currentColWidth, itemWidth);\n      currentColHeight += itemHeight + padding;\n    });\n    totalWidth += currentColWidth;\n    columnSizes.push({width: currentColWidth, height: currentColHeight});\n    return totalWidth;\n  }\n  adjustHitBoxes() {\n    if (!this.options.display) {\n      return;\n    }\n    const titleHeight = this._computeTitleHeight();\n    const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n    const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n    if (this.isHorizontal()) {\n      let row = 0;\n      let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n      for (const hitbox of hitboxes) {\n        if (row !== hitbox.row) {\n          row = hitbox.row;\n          left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n        }\n        hitbox.top += this.top + titleHeight + padding;\n        hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n        left += hitbox.width + padding;\n      }\n    } else {\n      let col = 0;\n      let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n      for (const hitbox of hitboxes) {\n        if (hitbox.col !== col) {\n          col = hitbox.col;\n          top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n        }\n        hitbox.top = top;\n        hitbox.left += this.left + padding;\n        hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n        top += hitbox.height + padding;\n      }\n    }\n  }\n  isHorizontal() {\n    return this.options.position === 'top' || this.options.position === 'bottom';\n  }\n  draw() {\n    if (this.options.display) {\n      const ctx = this.ctx;\n      clipArea(ctx, this);\n      this._draw();\n      unclipArea(ctx);\n    }\n  }\n  _draw() {\n    const {options: opts, columnSizes, lineWidths, ctx} = this;\n    const {align, labels: labelOpts} = opts;\n    const defaultColor = defaults.color;\n    const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n    const labelFont = toFont(labelOpts.font);\n    const {color: fontColor, padding} = labelOpts;\n    const fontSize = labelFont.size;\n    const halfFontSize = fontSize / 2;\n    let cursor;\n    this.drawTitle();\n    ctx.textAlign = rtlHelper.textAlign('left');\n    ctx.textBaseline = 'middle';\n    ctx.lineWidth = 0.5;\n    ctx.font = labelFont.string;\n    const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n    const drawLegendBox = function(x, y, legendItem) {\n      if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n        return;\n      }\n      ctx.save();\n      const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n      ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n      ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n      ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n      ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n      ctx.lineWidth = lineWidth;\n      ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n      ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n      if (labelOpts.usePointStyle) {\n        const drawOptions = {\n          radius: boxWidth * Math.SQRT2 / 2,\n          pointStyle: legendItem.pointStyle,\n          rotation: legendItem.rotation,\n          borderWidth: lineWidth\n        };\n        const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n        const centerY = y + halfFontSize;\n        drawPoint(ctx, drawOptions, centerX, centerY);\n      } else {\n        const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n        const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n        const borderRadius = toTRBLCorners(legendItem.borderRadius);\n        ctx.beginPath();\n        if (Object.values(borderRadius).some(v => v !== 0)) {\n          addRoundedRectPath(ctx, {\n            x: xBoxLeft,\n            y: yBoxTop,\n            w: boxWidth,\n            h: boxHeight,\n            radius: borderRadius,\n          });\n        } else {\n          ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n        }\n        ctx.fill();\n        if (lineWidth !== 0) {\n          ctx.stroke();\n        }\n      }\n      ctx.restore();\n    };\n    const fillText = function(x, y, legendItem) {\n      renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n        strikethrough: legendItem.hidden,\n        textAlign: rtlHelper.textAlign(legendItem.textAlign)\n      });\n    };\n    const isHorizontal = this.isHorizontal();\n    const titleHeight = this._computeTitleHeight();\n    if (isHorizontal) {\n      cursor = {\n        x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n        y: this.top + padding + titleHeight,\n        line: 0\n      };\n    } else {\n      cursor = {\n        x: this.left + padding,\n        y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n        line: 0\n      };\n    }\n    overrideTextDirection(this.ctx, opts.textDirection);\n    const lineHeight = itemHeight + padding;\n    this.legendItems.forEach((legendItem, i) => {\n      ctx.strokeStyle = legendItem.fontColor || fontColor;\n      ctx.fillStyle = legendItem.fontColor || fontColor;\n      const textWidth = ctx.measureText(legendItem.text).width;\n      const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n      const width = boxWidth + halfFontSize + textWidth;\n      let x = cursor.x;\n      let y = cursor.y;\n      rtlHelper.setWidth(this.width);\n      if (isHorizontal) {\n        if (i > 0 && x + width + padding > this.right) {\n          y = cursor.y += lineHeight;\n          cursor.line++;\n          x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n        }\n      } else if (i > 0 && y + lineHeight > this.bottom) {\n        x = cursor.x = x + columnSizes[cursor.line].width + padding;\n        cursor.line++;\n        y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n      }\n      const realX = rtlHelper.x(x);\n      drawLegendBox(realX, y, legendItem);\n      x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n      fillText(rtlHelper.x(x), y, legendItem);\n      if (isHorizontal) {\n        cursor.x += width + padding;\n      } else {\n        cursor.y += lineHeight;\n      }\n    });\n    restoreTextDirection(this.ctx, opts.textDirection);\n  }\n  drawTitle() {\n    const opts = this.options;\n    const titleOpts = opts.title;\n    const titleFont = toFont(titleOpts.font);\n    const titlePadding = toPadding(titleOpts.padding);\n    if (!titleOpts.display) {\n      return;\n    }\n    const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n    const ctx = this.ctx;\n    const position = titleOpts.position;\n    const halfFontSize = titleFont.size / 2;\n    const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n    let y;\n    let left = this.left;\n    let maxWidth = this.width;\n    if (this.isHorizontal()) {\n      maxWidth = Math.max(...this.lineWidths);\n      y = this.top + topPaddingPlusHalfFontSize;\n      left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n    } else {\n      const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n      y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n    }\n    const x = _alignStartEnd(position, left, left + maxWidth);\n    ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n    ctx.textBaseline = 'middle';\n    ctx.strokeStyle = titleOpts.color;\n    ctx.fillStyle = titleOpts.color;\n    ctx.font = titleFont.string;\n    renderText(ctx, titleOpts.text, x, y, titleFont);\n  }\n  _computeTitleHeight() {\n    const titleOpts = this.options.title;\n    const titleFont = toFont(titleOpts.font);\n    const titlePadding = toPadding(titleOpts.padding);\n    return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n  }\n  _getLegendItemAt(x, y) {\n    let i, hitBox, lh;\n    if (_isBetween(x, this.left, this.right)\n      && _isBetween(y, this.top, this.bottom)) {\n      lh = this.legendHitBoxes;\n      for (i = 0; i < lh.length; ++i) {\n        hitBox = lh[i];\n        if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n          && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n          return this.legendItems[i];\n        }\n      }\n    }\n    return null;\n  }\n  handleEvent(e) {\n    const opts = this.options;\n    if (!isListened(e.type, opts)) {\n      return;\n    }\n    const hoveredItem = this._getLegendItemAt(e.x, e.y);\n    if (e.type === 'mousemove') {\n      const previous = this._hoveredItem;\n      const sameItem = itemsEqual(previous, hoveredItem);\n      if (previous && !sameItem) {\n        callback(opts.onLeave, [e, previous, this], this);\n      }\n      this._hoveredItem = hoveredItem;\n      if (hoveredItem && !sameItem) {\n        callback(opts.onHover, [e, hoveredItem, this], this);\n      }\n    } else if (hoveredItem) {\n      callback(opts.onClick, [e, hoveredItem, this], this);\n    }\n  }\n}\nfunction isListened(type, opts) {\n  if (type === 'mousemove' && (opts.onHover || opts.onLeave)) {\n    return true;\n  }\n  if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n    return true;\n  }\n  return false;\n}\nvar plugin_legend = {\n  id: 'legend',\n  _element: Legend,\n  start(chart, _args, options) {\n    const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n    layouts.configure(chart, legend, options);\n    layouts.addBox(chart, legend);\n  },\n  stop(chart) {\n    layouts.removeBox(chart, chart.legend);\n    delete chart.legend;\n  },\n  beforeUpdate(chart, _args, options) {\n    const legend = chart.legend;\n    layouts.configure(chart, legend, options);\n    legend.options = options;\n  },\n  afterUpdate(chart) {\n    const legend = chart.legend;\n    legend.buildLabels();\n    legend.adjustHitBoxes();\n  },\n  afterEvent(chart, args) {\n    if (!args.replay) {\n      chart.legend.handleEvent(args.event);\n    }\n  },\n  defaults: {\n    display: true,\n    position: 'top',\n    align: 'center',\n    fullSize: true,\n    reverse: false,\n    weight: 1000,\n    onClick(e, legendItem, legend) {\n      const index = legendItem.datasetIndex;\n      const ci = legend.chart;\n      if (ci.isDatasetVisible(index)) {\n        ci.hide(index);\n        legendItem.hidden = true;\n      } else {\n        ci.show(index);\n        legendItem.hidden = false;\n      }\n    },\n    onHover: null,\n    onLeave: null,\n    labels: {\n      color: (ctx) => ctx.chart.options.color,\n      boxWidth: 40,\n      padding: 10,\n      generateLabels(chart) {\n        const datasets = chart.data.datasets;\n        const {labels: {usePointStyle, pointStyle, textAlign, color}} = chart.legend.options;\n        return chart._getSortedDatasetMetas().map((meta) => {\n          const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n          const borderWidth = toPadding(style.borderWidth);\n          return {\n            text: datasets[meta.index].label,\n            fillStyle: style.backgroundColor,\n            fontColor: color,\n            hidden: !meta.visible,\n            lineCap: style.borderCapStyle,\n            lineDash: style.borderDash,\n            lineDashOffset: style.borderDashOffset,\n            lineJoin: style.borderJoinStyle,\n            lineWidth: (borderWidth.width + borderWidth.height) / 4,\n            strokeStyle: style.borderColor,\n            pointStyle: pointStyle || style.pointStyle,\n            rotation: style.rotation,\n            textAlign: textAlign || style.textAlign,\n            borderRadius: 0,\n            datasetIndex: meta.index\n          };\n        }, this);\n      }\n    },\n    title: {\n      color: (ctx) => ctx.chart.options.color,\n      display: false,\n      position: 'center',\n      text: '',\n    }\n  },\n  descriptors: {\n    _scriptable: (name) => !name.startsWith('on'),\n    labels: {\n      _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n    }\n  },\n};\n\nclass Title extends Element {\n  constructor(config) {\n    super();\n    this.chart = config.chart;\n    this.options = config.options;\n    this.ctx = config.ctx;\n    this._padding = undefined;\n    this.top = undefined;\n    this.bottom = undefined;\n    this.left = undefined;\n    this.right = undefined;\n    this.width = undefined;\n    this.height = undefined;\n    this.position = undefined;\n    this.weight = undefined;\n    this.fullSize = undefined;\n  }\n  update(maxWidth, maxHeight) {\n    const opts = this.options;\n    this.left = 0;\n    this.top = 0;\n    if (!opts.display) {\n      this.width = this.height = this.right = this.bottom = 0;\n      return;\n    }\n    this.width = this.right = maxWidth;\n    this.height = this.bottom = maxHeight;\n    const lineCount = isArray(opts.text) ? opts.text.length : 1;\n    this._padding = toPadding(opts.padding);\n    const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n    if (this.isHorizontal()) {\n      this.height = textSize;\n    } else {\n      this.width = textSize;\n    }\n  }\n  isHorizontal() {\n    const pos = this.options.position;\n    return pos === 'top' || pos === 'bottom';\n  }\n  _drawArgs(offset) {\n    const {top, left, bottom, right, options} = this;\n    const align = options.align;\n    let rotation = 0;\n    let maxWidth, titleX, titleY;\n    if (this.isHorizontal()) {\n      titleX = _alignStartEnd(align, left, right);\n      titleY = top + offset;\n      maxWidth = right - left;\n    } else {\n      if (options.position === 'left') {\n        titleX = left + offset;\n        titleY = _alignStartEnd(align, bottom, top);\n        rotation = PI * -0.5;\n      } else {\n        titleX = right - offset;\n        titleY = _alignStartEnd(align, top, bottom);\n        rotation = PI * 0.5;\n      }\n      maxWidth = bottom - top;\n    }\n    return {titleX, titleY, maxWidth, rotation};\n  }\n  draw() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    if (!opts.display) {\n      return;\n    }\n    const fontOpts = toFont(opts.font);\n    const lineHeight = fontOpts.lineHeight;\n    const offset = lineHeight / 2 + this._padding.top;\n    const {titleX, titleY, maxWidth, rotation} = this._drawArgs(offset);\n    renderText(ctx, opts.text, 0, 0, fontOpts, {\n      color: opts.color,\n      maxWidth,\n      rotation,\n      textAlign: _toLeftRightCenter(opts.align),\n      textBaseline: 'middle',\n      translation: [titleX, titleY],\n    });\n  }\n}\nfunction createTitle(chart, titleOpts) {\n  const title = new Title({\n    ctx: chart.ctx,\n    options: titleOpts,\n    chart\n  });\n  layouts.configure(chart, title, titleOpts);\n  layouts.addBox(chart, title);\n  chart.titleBlock = title;\n}\nvar plugin_title = {\n  id: 'title',\n  _element: Title,\n  start(chart, _args, options) {\n    createTitle(chart, options);\n  },\n  stop(chart) {\n    const titleBlock = chart.titleBlock;\n    layouts.removeBox(chart, titleBlock);\n    delete chart.titleBlock;\n  },\n  beforeUpdate(chart, _args, options) {\n    const title = chart.titleBlock;\n    layouts.configure(chart, title, options);\n    title.options = options;\n  },\n  defaults: {\n    align: 'center',\n    display: false,\n    font: {\n      weight: 'bold',\n    },\n    fullSize: true,\n    padding: 10,\n    position: 'top',\n    text: '',\n    weight: 2000\n  },\n  defaultRoutes: {\n    color: 'color'\n  },\n  descriptors: {\n    _scriptable: true,\n    _indexable: false,\n  },\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n  id: 'subtitle',\n  start(chart, _args, options) {\n    const title = new Title({\n      ctx: chart.ctx,\n      options,\n      chart\n    });\n    layouts.configure(chart, title, options);\n    layouts.addBox(chart, title);\n    map.set(chart, title);\n  },\n  stop(chart) {\n    layouts.removeBox(chart, map.get(chart));\n    map.delete(chart);\n  },\n  beforeUpdate(chart, _args, options) {\n    const title = map.get(chart);\n    layouts.configure(chart, title, options);\n    title.options = options;\n  },\n  defaults: {\n    align: 'center',\n    display: false,\n    font: {\n      weight: 'normal',\n    },\n    fullSize: true,\n    padding: 0,\n    position: 'top',\n    text: '',\n    weight: 1500\n  },\n  defaultRoutes: {\n    color: 'color'\n  },\n  descriptors: {\n    _scriptable: true,\n    _indexable: false,\n  },\n};\n\nconst positioners = {\n  average(items) {\n    if (!items.length) {\n      return false;\n    }\n    let i, len;\n    let x = 0;\n    let y = 0;\n    let count = 0;\n    for (i = 0, len = items.length; i < len; ++i) {\n      const el = items[i].element;\n      if (el && el.hasValue()) {\n        const pos = el.tooltipPosition();\n        x += pos.x;\n        y += pos.y;\n        ++count;\n      }\n    }\n    return {\n      x: x / count,\n      y: y / count\n    };\n  },\n  nearest(items, eventPosition) {\n    if (!items.length) {\n      return false;\n    }\n    let x = eventPosition.x;\n    let y = eventPosition.y;\n    let minDistance = Number.POSITIVE_INFINITY;\n    let i, len, nearestElement;\n    for (i = 0, len = items.length; i < len; ++i) {\n      const el = items[i].element;\n      if (el && el.hasValue()) {\n        const center = el.getCenterPoint();\n        const d = distanceBetweenPoints(eventPosition, center);\n        if (d < minDistance) {\n          minDistance = d;\n          nearestElement = el;\n        }\n      }\n    }\n    if (nearestElement) {\n      const tp = nearestElement.tooltipPosition();\n      x = tp.x;\n      y = tp.y;\n    }\n    return {\n      x,\n      y\n    };\n  }\n};\nfunction pushOrConcat(base, toPush) {\n  if (toPush) {\n    if (isArray(toPush)) {\n      Array.prototype.push.apply(base, toPush);\n    } else {\n      base.push(toPush);\n    }\n  }\n  return base;\n}\nfunction splitNewlines(str) {\n  if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n    return str.split('\\n');\n  }\n  return str;\n}\nfunction createTooltipItem(chart, item) {\n  const {element, datasetIndex, index} = item;\n  const controller = chart.getDatasetMeta(datasetIndex).controller;\n  const {label, value} = controller.getLabelAndValue(index);\n  return {\n    chart,\n    label,\n    parsed: controller.getParsed(index),\n    raw: chart.data.datasets[datasetIndex].data[index],\n    formattedValue: value,\n    dataset: controller.getDataset(),\n    dataIndex: index,\n    datasetIndex,\n    element\n  };\n}\nfunction getTooltipSize(tooltip, options) {\n  const ctx = tooltip.chart.ctx;\n  const {body, footer, title} = tooltip;\n  const {boxWidth, boxHeight} = options;\n  const bodyFont = toFont(options.bodyFont);\n  const titleFont = toFont(options.titleFont);\n  const footerFont = toFont(options.footerFont);\n  const titleLineCount = title.length;\n  const footerLineCount = footer.length;\n  const bodyLineItemCount = body.length;\n  const padding = toPadding(options.padding);\n  let height = padding.height;\n  let width = 0;\n  let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n  combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n  if (titleLineCount) {\n    height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n  }\n  if (combinedBodyLength) {\n    const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n    height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n  }\n  if (footerLineCount) {\n    height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n  }\n  let widthPadding = 0;\n  const maxLineWidth = function(line) {\n    width = Math.max(width, ctx.measureText(line).width + widthPadding);\n  };\n  ctx.save();\n  ctx.font = titleFont.string;\n  each(tooltip.title, maxLineWidth);\n  ctx.font = bodyFont.string;\n  each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n  widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n  each(body, (bodyItem) => {\n    each(bodyItem.before, maxLineWidth);\n    each(bodyItem.lines, maxLineWidth);\n    each(bodyItem.after, maxLineWidth);\n  });\n  widthPadding = 0;\n  ctx.font = footerFont.string;\n  each(tooltip.footer, maxLineWidth);\n  ctx.restore();\n  width += padding.width;\n  return {width, height};\n}\nfunction determineYAlign(chart, size) {\n  const {y, height} = size;\n  if (y < height / 2) {\n    return 'top';\n  } else if (y > (chart.height - height / 2)) {\n    return 'bottom';\n  }\n  return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n  const {x, width} = size;\n  const caret = options.caretSize + options.caretPadding;\n  if (xAlign === 'left' && x + width + caret > chart.width) {\n    return true;\n  }\n  if (xAlign === 'right' && x - width - caret < 0) {\n    return true;\n  }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n  const {x, width} = size;\n  const {width: chartWidth, chartArea: {left, right}} = chart;\n  let xAlign = 'center';\n  if (yAlign === 'center') {\n    xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n  } else if (x <= width / 2) {\n    xAlign = 'left';\n  } else if (x >= chartWidth - width / 2) {\n    xAlign = 'right';\n  }\n  if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n    xAlign = 'center';\n  }\n  return xAlign;\n}\nfunction determineAlignment(chart, options, size) {\n  const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n  return {\n    xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n    yAlign\n  };\n}\nfunction alignX(size, xAlign) {\n  let {x, width} = size;\n  if (xAlign === 'right') {\n    x -= width;\n  } else if (xAlign === 'center') {\n    x -= (width / 2);\n  }\n  return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n  let {y, height} = size;\n  if (yAlign === 'top') {\n    y += paddingAndSize;\n  } else if (yAlign === 'bottom') {\n    y -= height + paddingAndSize;\n  } else {\n    y -= (height / 2);\n  }\n  return y;\n}\nfunction getBackgroundPoint(options, size, alignment, chart) {\n  const {caretSize, caretPadding, cornerRadius} = options;\n  const {xAlign, yAlign} = alignment;\n  const paddingAndSize = caretSize + caretPadding;\n  const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n  let x = alignX(size, xAlign);\n  const y = alignY(size, yAlign, paddingAndSize);\n  if (yAlign === 'center') {\n    if (xAlign === 'left') {\n      x += paddingAndSize;\n    } else if (xAlign === 'right') {\n      x -= paddingAndSize;\n    }\n  } else if (xAlign === 'left') {\n    x -= Math.max(topLeft, bottomLeft) + caretSize;\n  } else if (xAlign === 'right') {\n    x += Math.max(topRight, bottomRight) + caretSize;\n  }\n  return {\n    x: _limitValue(x, 0, chart.width - size.width),\n    y: _limitValue(y, 0, chart.height - size.height)\n  };\n}\nfunction getAlignedX(tooltip, align, options) {\n  const padding = toPadding(options.padding);\n  return align === 'center'\n    ? tooltip.x + tooltip.width / 2\n    : align === 'right'\n      ? tooltip.x + tooltip.width - padding.right\n      : tooltip.x + padding.left;\n}\nfunction getBeforeAfterBodyLines(callback) {\n  return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n  return createContext(parent, {\n    tooltip,\n    tooltipItems,\n    type: 'tooltip'\n  });\n}\nfunction overrideCallbacks(callbacks, context) {\n  const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n  return override ? callbacks.override(override) : callbacks;\n}\nclass Tooltip extends Element {\n  constructor(config) {\n    super();\n    this.opacity = 0;\n    this._active = [];\n    this._eventPosition = undefined;\n    this._size = undefined;\n    this._cachedAnimations = undefined;\n    this._tooltipItems = [];\n    this.$animations = undefined;\n    this.$context = undefined;\n    this.chart = config.chart || config._chart;\n    this._chart = this.chart;\n    this.options = config.options;\n    this.dataPoints = undefined;\n    this.title = undefined;\n    this.beforeBody = undefined;\n    this.body = undefined;\n    this.afterBody = undefined;\n    this.footer = undefined;\n    this.xAlign = undefined;\n    this.yAlign = undefined;\n    this.x = undefined;\n    this.y = undefined;\n    this.height = undefined;\n    this.width = undefined;\n    this.caretX = undefined;\n    this.caretY = undefined;\n    this.labelColors = undefined;\n    this.labelPointStyles = undefined;\n    this.labelTextColors = undefined;\n  }\n  initialize(options) {\n    this.options = options;\n    this._cachedAnimations = undefined;\n    this.$context = undefined;\n  }\n  _resolveAnimations() {\n    const cached = this._cachedAnimations;\n    if (cached) {\n      return cached;\n    }\n    const chart = this.chart;\n    const options = this.options.setContext(this.getContext());\n    const opts = options.enabled && chart.options.animation && options.animations;\n    const animations = new Animations(this.chart, opts);\n    if (opts._cacheable) {\n      this._cachedAnimations = Object.freeze(animations);\n    }\n    return animations;\n  }\n  getContext() {\n    return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n  }\n  getTitle(context, options) {\n    const {callbacks} = options;\n    const beforeTitle = callbacks.beforeTitle.apply(this, [context]);\n    const title = callbacks.title.apply(this, [context]);\n    const afterTitle = callbacks.afterTitle.apply(this, [context]);\n    let lines = [];\n    lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n    lines = pushOrConcat(lines, splitNewlines(title));\n    lines = pushOrConcat(lines, splitNewlines(afterTitle));\n    return lines;\n  }\n  getBeforeBody(tooltipItems, options) {\n    return getBeforeAfterBodyLines(options.callbacks.beforeBody.apply(this, [tooltipItems]));\n  }\n  getBody(tooltipItems, options) {\n    const {callbacks} = options;\n    const bodyItems = [];\n    each(tooltipItems, (context) => {\n      const bodyItem = {\n        before: [],\n        lines: [],\n        after: []\n      };\n      const scoped = overrideCallbacks(callbacks, context);\n      pushOrConcat(bodyItem.before, splitNewlines(scoped.beforeLabel.call(this, context)));\n      pushOrConcat(bodyItem.lines, scoped.label.call(this, context));\n      pushOrConcat(bodyItem.after, splitNewlines(scoped.afterLabel.call(this, context)));\n      bodyItems.push(bodyItem);\n    });\n    return bodyItems;\n  }\n  getAfterBody(tooltipItems, options) {\n    return getBeforeAfterBodyLines(options.callbacks.afterBody.apply(this, [tooltipItems]));\n  }\n  getFooter(tooltipItems, options) {\n    const {callbacks} = options;\n    const beforeFooter = callbacks.beforeFooter.apply(this, [tooltipItems]);\n    const footer = callbacks.footer.apply(this, [tooltipItems]);\n    const afterFooter = callbacks.afterFooter.apply(this, [tooltipItems]);\n    let lines = [];\n    lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n    lines = pushOrConcat(lines, splitNewlines(footer));\n    lines = pushOrConcat(lines, splitNewlines(afterFooter));\n    return lines;\n  }\n  _createItems(options) {\n    const active = this._active;\n    const data = this.chart.data;\n    const labelColors = [];\n    const labelPointStyles = [];\n    const labelTextColors = [];\n    let tooltipItems = [];\n    let i, len;\n    for (i = 0, len = active.length; i < len; ++i) {\n      tooltipItems.push(createTooltipItem(this.chart, active[i]));\n    }\n    if (options.filter) {\n      tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n    }\n    if (options.itemSort) {\n      tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n    }\n    each(tooltipItems, (context) => {\n      const scoped = overrideCallbacks(options.callbacks, context);\n      labelColors.push(scoped.labelColor.call(this, context));\n      labelPointStyles.push(scoped.labelPointStyle.call(this, context));\n      labelTextColors.push(scoped.labelTextColor.call(this, context));\n    });\n    this.labelColors = labelColors;\n    this.labelPointStyles = labelPointStyles;\n    this.labelTextColors = labelTextColors;\n    this.dataPoints = tooltipItems;\n    return tooltipItems;\n  }\n  update(changed, replay) {\n    const options = this.options.setContext(this.getContext());\n    const active = this._active;\n    let properties;\n    let tooltipItems = [];\n    if (!active.length) {\n      if (this.opacity !== 0) {\n        properties = {\n          opacity: 0\n        };\n      }\n    } else {\n      const position = positioners[options.position].call(this, active, this._eventPosition);\n      tooltipItems = this._createItems(options);\n      this.title = this.getTitle(tooltipItems, options);\n      this.beforeBody = this.getBeforeBody(tooltipItems, options);\n      this.body = this.getBody(tooltipItems, options);\n      this.afterBody = this.getAfterBody(tooltipItems, options);\n      this.footer = this.getFooter(tooltipItems, options);\n      const size = this._size = getTooltipSize(this, options);\n      const positionAndSize = Object.assign({}, position, size);\n      const alignment = determineAlignment(this.chart, options, positionAndSize);\n      const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n      this.xAlign = alignment.xAlign;\n      this.yAlign = alignment.yAlign;\n      properties = {\n        opacity: 1,\n        x: backgroundPoint.x,\n        y: backgroundPoint.y,\n        width: size.width,\n        height: size.height,\n        caretX: position.x,\n        caretY: position.y\n      };\n    }\n    this._tooltipItems = tooltipItems;\n    this.$context = undefined;\n    if (properties) {\n      this._resolveAnimations().update(this, properties);\n    }\n    if (changed && options.external) {\n      options.external.call(this, {chart: this.chart, tooltip: this, replay});\n    }\n  }\n  drawCaret(tooltipPoint, ctx, size, options) {\n    const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n    ctx.lineTo(caretPosition.x1, caretPosition.y1);\n    ctx.lineTo(caretPosition.x2, caretPosition.y2);\n    ctx.lineTo(caretPosition.x3, caretPosition.y3);\n  }\n  getCaretPosition(tooltipPoint, size, options) {\n    const {xAlign, yAlign} = this;\n    const {caretSize, cornerRadius} = options;\n    const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n    const {x: ptX, y: ptY} = tooltipPoint;\n    const {width, height} = size;\n    let x1, x2, x3, y1, y2, y3;\n    if (yAlign === 'center') {\n      y2 = ptY + (height / 2);\n      if (xAlign === 'left') {\n        x1 = ptX;\n        x2 = x1 - caretSize;\n        y1 = y2 + caretSize;\n        y3 = y2 - caretSize;\n      } else {\n        x1 = ptX + width;\n        x2 = x1 + caretSize;\n        y1 = y2 - caretSize;\n        y3 = y2 + caretSize;\n      }\n      x3 = x1;\n    } else {\n      if (xAlign === 'left') {\n        x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n      } else if (xAlign === 'right') {\n        x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n      } else {\n        x2 = this.caretX;\n      }\n      if (yAlign === 'top') {\n        y1 = ptY;\n        y2 = y1 - caretSize;\n        x1 = x2 - caretSize;\n        x3 = x2 + caretSize;\n      } else {\n        y1 = ptY + height;\n        y2 = y1 + caretSize;\n        x1 = x2 + caretSize;\n        x3 = x2 - caretSize;\n      }\n      y3 = y1;\n    }\n    return {x1, x2, x3, y1, y2, y3};\n  }\n  drawTitle(pt, ctx, options) {\n    const title = this.title;\n    const length = title.length;\n    let titleFont, titleSpacing, i;\n    if (length) {\n      const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n      pt.x = getAlignedX(this, options.titleAlign, options);\n      ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n      ctx.textBaseline = 'middle';\n      titleFont = toFont(options.titleFont);\n      titleSpacing = options.titleSpacing;\n      ctx.fillStyle = options.titleColor;\n      ctx.font = titleFont.string;\n      for (i = 0; i < length; ++i) {\n        ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n        pt.y += titleFont.lineHeight + titleSpacing;\n        if (i + 1 === length) {\n          pt.y += options.titleMarginBottom - titleSpacing;\n        }\n      }\n    }\n  }\n  _drawColorBox(ctx, pt, i, rtlHelper, options) {\n    const labelColors = this.labelColors[i];\n    const labelPointStyle = this.labelPointStyles[i];\n    const {boxHeight, boxWidth, boxPadding} = options;\n    const bodyFont = toFont(options.bodyFont);\n    const colorX = getAlignedX(this, 'left', options);\n    const rtlColorX = rtlHelper.x(colorX);\n    const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n    const colorY = pt.y + yOffSet;\n    if (options.usePointStyle) {\n      const drawOptions = {\n        radius: Math.min(boxWidth, boxHeight) / 2,\n        pointStyle: labelPointStyle.pointStyle,\n        rotation: labelPointStyle.rotation,\n        borderWidth: 1\n      };\n      const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n      const centerY = colorY + boxHeight / 2;\n      ctx.strokeStyle = options.multiKeyBackground;\n      ctx.fillStyle = options.multiKeyBackground;\n      drawPoint(ctx, drawOptions, centerX, centerY);\n      ctx.strokeStyle = labelColors.borderColor;\n      ctx.fillStyle = labelColors.backgroundColor;\n      drawPoint(ctx, drawOptions, centerX, centerY);\n    } else {\n      ctx.lineWidth = labelColors.borderWidth || 1;\n      ctx.strokeStyle = labelColors.borderColor;\n      ctx.setLineDash(labelColors.borderDash || []);\n      ctx.lineDashOffset = labelColors.borderDashOffset || 0;\n      const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth - boxPadding);\n      const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - boxPadding - 2);\n      const borderRadius = toTRBLCorners(labelColors.borderRadius);\n      if (Object.values(borderRadius).some(v => v !== 0)) {\n        ctx.beginPath();\n        ctx.fillStyle = options.multiKeyBackground;\n        addRoundedRectPath(ctx, {\n          x: outerX,\n          y: colorY,\n          w: boxWidth,\n          h: boxHeight,\n          radius: borderRadius,\n        });\n        ctx.fill();\n        ctx.stroke();\n        ctx.fillStyle = labelColors.backgroundColor;\n        ctx.beginPath();\n        addRoundedRectPath(ctx, {\n          x: innerX,\n          y: colorY + 1,\n          w: boxWidth - 2,\n          h: boxHeight - 2,\n          radius: borderRadius,\n        });\n        ctx.fill();\n      } else {\n        ctx.fillStyle = options.multiKeyBackground;\n        ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n        ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n        ctx.fillStyle = labelColors.backgroundColor;\n        ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n      }\n    }\n    ctx.fillStyle = this.labelTextColors[i];\n  }\n  drawBody(pt, ctx, options) {\n    const {body} = this;\n    const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n    const bodyFont = toFont(options.bodyFont);\n    let bodyLineHeight = bodyFont.lineHeight;\n    let xLinePadding = 0;\n    const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n    const fillLineOfText = function(line) {\n      ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n      pt.y += bodyLineHeight + bodySpacing;\n    };\n    const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n    let bodyItem, textColor, lines, i, j, ilen, jlen;\n    ctx.textAlign = bodyAlign;\n    ctx.textBaseline = 'middle';\n    ctx.font = bodyFont.string;\n    pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n    ctx.fillStyle = options.bodyColor;\n    each(this.beforeBody, fillLineOfText);\n    xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n      ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n      : 0;\n    for (i = 0, ilen = body.length; i < ilen; ++i) {\n      bodyItem = body[i];\n      textColor = this.labelTextColors[i];\n      ctx.fillStyle = textColor;\n      each(bodyItem.before, fillLineOfText);\n      lines = bodyItem.lines;\n      if (displayColors && lines.length) {\n        this._drawColorBox(ctx, pt, i, rtlHelper, options);\n        bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n      }\n      for (j = 0, jlen = lines.length; j < jlen; ++j) {\n        fillLineOfText(lines[j]);\n        bodyLineHeight = bodyFont.lineHeight;\n      }\n      each(bodyItem.after, fillLineOfText);\n    }\n    xLinePadding = 0;\n    bodyLineHeight = bodyFont.lineHeight;\n    each(this.afterBody, fillLineOfText);\n    pt.y -= bodySpacing;\n  }\n  drawFooter(pt, ctx, options) {\n    const footer = this.footer;\n    const length = footer.length;\n    let footerFont, i;\n    if (length) {\n      const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n      pt.x = getAlignedX(this, options.footerAlign, options);\n      pt.y += options.footerMarginTop;\n      ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n      ctx.textBaseline = 'middle';\n      footerFont = toFont(options.footerFont);\n      ctx.fillStyle = options.footerColor;\n      ctx.font = footerFont.string;\n      for (i = 0; i < length; ++i) {\n        ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n        pt.y += footerFont.lineHeight + options.footerSpacing;\n      }\n    }\n  }\n  drawBackground(pt, ctx, tooltipSize, options) {\n    const {xAlign, yAlign} = this;\n    const {x, y} = pt;\n    const {width, height} = tooltipSize;\n    const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n    ctx.fillStyle = options.backgroundColor;\n    ctx.strokeStyle = options.borderColor;\n    ctx.lineWidth = options.borderWidth;\n    ctx.beginPath();\n    ctx.moveTo(x + topLeft, y);\n    if (yAlign === 'top') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + width - topRight, y);\n    ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n    if (yAlign === 'center' && xAlign === 'right') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + width, y + height - bottomRight);\n    ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n    if (yAlign === 'bottom') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x + bottomLeft, y + height);\n    ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n    if (yAlign === 'center' && xAlign === 'left') {\n      this.drawCaret(pt, ctx, tooltipSize, options);\n    }\n    ctx.lineTo(x, y + topLeft);\n    ctx.quadraticCurveTo(x, y, x + topLeft, y);\n    ctx.closePath();\n    ctx.fill();\n    if (options.borderWidth > 0) {\n      ctx.stroke();\n    }\n  }\n  _updateAnimationTarget(options) {\n    const chart = this.chart;\n    const anims = this.$animations;\n    const animX = anims && anims.x;\n    const animY = anims && anims.y;\n    if (animX || animY) {\n      const position = positioners[options.position].call(this, this._active, this._eventPosition);\n      if (!position) {\n        return;\n      }\n      const size = this._size = getTooltipSize(this, options);\n      const positionAndSize = Object.assign({}, position, this._size);\n      const alignment = determineAlignment(chart, options, positionAndSize);\n      const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n      if (animX._to !== point.x || animY._to !== point.y) {\n        this.xAlign = alignment.xAlign;\n        this.yAlign = alignment.yAlign;\n        this.width = size.width;\n        this.height = size.height;\n        this.caretX = position.x;\n        this.caretY = position.y;\n        this._resolveAnimations().update(this, point);\n      }\n    }\n  }\n  draw(ctx) {\n    const options = this.options.setContext(this.getContext());\n    let opacity = this.opacity;\n    if (!opacity) {\n      return;\n    }\n    this._updateAnimationTarget(options);\n    const tooltipSize = {\n      width: this.width,\n      height: this.height\n    };\n    const pt = {\n      x: this.x,\n      y: this.y\n    };\n    opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n    const padding = toPadding(options.padding);\n    const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n    if (options.enabled && hasTooltipContent) {\n      ctx.save();\n      ctx.globalAlpha = opacity;\n      this.drawBackground(pt, ctx, tooltipSize, options);\n      overrideTextDirection(ctx, options.textDirection);\n      pt.y += padding.top;\n      this.drawTitle(pt, ctx, options);\n      this.drawBody(pt, ctx, options);\n      this.drawFooter(pt, ctx, options);\n      restoreTextDirection(ctx, options.textDirection);\n      ctx.restore();\n    }\n  }\n  getActiveElements() {\n    return this._active || [];\n  }\n  setActiveElements(activeElements, eventPosition) {\n    const lastActive = this._active;\n    const active = activeElements.map(({datasetIndex, index}) => {\n      const meta = this.chart.getDatasetMeta(datasetIndex);\n      if (!meta) {\n        throw new Error('Cannot find a dataset at index ' + datasetIndex);\n      }\n      return {\n        datasetIndex,\n        element: meta.data[index],\n        index,\n      };\n    });\n    const changed = !_elementsEqual(lastActive, active);\n    const positionChanged = this._positionChanged(active, eventPosition);\n    if (changed || positionChanged) {\n      this._active = active;\n      this._eventPosition = eventPosition;\n      this._ignoreReplayEvents = true;\n      this.update(true);\n    }\n  }\n  handleEvent(e, replay, inChartArea = true) {\n    if (replay && this._ignoreReplayEvents) {\n      return false;\n    }\n    this._ignoreReplayEvents = false;\n    const options = this.options;\n    const lastActive = this._active || [];\n    const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n    const positionChanged = this._positionChanged(active, e);\n    const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n    if (changed) {\n      this._active = active;\n      if (options.enabled || options.external) {\n        this._eventPosition = {\n          x: e.x,\n          y: e.y\n        };\n        this.update(true, replay);\n      }\n    }\n    return changed;\n  }\n  _getActiveElements(e, lastActive, replay, inChartArea) {\n    const options = this.options;\n    if (e.type === 'mouseout') {\n      return [];\n    }\n    if (!inChartArea) {\n      return lastActive;\n    }\n    const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n    if (options.reverse) {\n      active.reverse();\n    }\n    return active;\n  }\n  _positionChanged(active, e) {\n    const {caretX, caretY, options} = this;\n    const position = positioners[options.position].call(this, active, e);\n    return position !== false && (caretX !== position.x || caretY !== position.y);\n  }\n}\nTooltip.positioners = positioners;\nvar plugin_tooltip = {\n  id: 'tooltip',\n  _element: Tooltip,\n  positioners,\n  afterInit(chart, _args, options) {\n    if (options) {\n      chart.tooltip = new Tooltip({chart, options});\n    }\n  },\n  beforeUpdate(chart, _args, options) {\n    if (chart.tooltip) {\n      chart.tooltip.initialize(options);\n    }\n  },\n  reset(chart, _args, options) {\n    if (chart.tooltip) {\n      chart.tooltip.initialize(options);\n    }\n  },\n  afterDraw(chart) {\n    const tooltip = chart.tooltip;\n    const args = {\n      tooltip\n    };\n    if (chart.notifyPlugins('beforeTooltipDraw', args) === false) {\n      return;\n    }\n    if (tooltip) {\n      tooltip.draw(chart.ctx);\n    }\n    chart.notifyPlugins('afterTooltipDraw', args);\n  },\n  afterEvent(chart, args) {\n    if (chart.tooltip) {\n      const useFinalPosition = args.replay;\n      if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n        args.changed = true;\n      }\n    }\n  },\n  defaults: {\n    enabled: true,\n    external: null,\n    position: 'average',\n    backgroundColor: 'rgba(0,0,0,0.8)',\n    titleColor: '#fff',\n    titleFont: {\n      weight: 'bold',\n    },\n    titleSpacing: 2,\n    titleMarginBottom: 6,\n    titleAlign: 'left',\n    bodyColor: '#fff',\n    bodySpacing: 2,\n    bodyFont: {\n    },\n    bodyAlign: 'left',\n    footerColor: '#fff',\n    footerSpacing: 2,\n    footerMarginTop: 6,\n    footerFont: {\n      weight: 'bold',\n    },\n    footerAlign: 'left',\n    padding: 6,\n    caretPadding: 2,\n    caretSize: 5,\n    cornerRadius: 6,\n    boxHeight: (ctx, opts) => opts.bodyFont.size,\n    boxWidth: (ctx, opts) => opts.bodyFont.size,\n    multiKeyBackground: '#fff',\n    displayColors: true,\n    boxPadding: 0,\n    borderColor: 'rgba(0,0,0,0)',\n    borderWidth: 0,\n    animation: {\n      duration: 400,\n      easing: 'easeOutQuart',\n    },\n    animations: {\n      numbers: {\n        type: 'number',\n        properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n      },\n      opacity: {\n        easing: 'linear',\n        duration: 200\n      }\n    },\n    callbacks: {\n      beforeTitle: noop,\n      title(tooltipItems) {\n        if (tooltipItems.length > 0) {\n          const item = tooltipItems[0];\n          const labels = item.chart.data.labels;\n          const labelCount = labels ? labels.length : 0;\n          if (this && this.options && this.options.mode === 'dataset') {\n            return item.dataset.label || '';\n          } else if (item.label) {\n            return item.label;\n          } else if (labelCount > 0 && item.dataIndex < labelCount) {\n            return labels[item.dataIndex];\n          }\n        }\n        return '';\n      },\n      afterTitle: noop,\n      beforeBody: noop,\n      beforeLabel: noop,\n      label(tooltipItem) {\n        if (this && this.options && this.options.mode === 'dataset') {\n          return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n        }\n        let label = tooltipItem.dataset.label || '';\n        if (label) {\n          label += ': ';\n        }\n        const value = tooltipItem.formattedValue;\n        if (!isNullOrUndef(value)) {\n          label += value;\n        }\n        return label;\n      },\n      labelColor(tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n          borderColor: options.borderColor,\n          backgroundColor: options.backgroundColor,\n          borderWidth: options.borderWidth,\n          borderDash: options.borderDash,\n          borderDashOffset: options.borderDashOffset,\n          borderRadius: 0,\n        };\n      },\n      labelTextColor() {\n        return this.options.bodyColor;\n      },\n      labelPointStyle(tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n          pointStyle: options.pointStyle,\n          rotation: options.rotation,\n        };\n      },\n      afterLabel: noop,\n      afterBody: noop,\n      beforeFooter: noop,\n      footer: noop,\n      afterFooter: noop\n    }\n  },\n  defaultRoutes: {\n    bodyFont: 'font',\n    footerFont: 'font',\n    titleFont: 'font'\n  },\n  descriptors: {\n    _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n    _indexable: false,\n    callbacks: {\n      _scriptable: false,\n      _indexable: false,\n    },\n    animation: {\n      _fallback: false\n    },\n    animations: {\n      _fallback: 'animation'\n    }\n  },\n  additionalOptionScopes: ['interaction']\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nDecimation: plugin_decimation,\nFiller: plugin_filler,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n  if (typeof raw === 'string') {\n    index = labels.push(raw) - 1;\n    addedLabels.unshift({index, label: raw});\n  } else if (isNaN(raw)) {\n    index = null;\n  }\n  return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n  const first = labels.indexOf(raw);\n  if (first === -1) {\n    return addIfString(labels, raw, index, addedLabels);\n  }\n  const last = labels.lastIndexOf(raw);\n  return first !== last ? index : first;\n}\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\nclass CategoryScale extends Scale {\n  constructor(cfg) {\n    super(cfg);\n    this._startValue = undefined;\n    this._valueRange = 0;\n    this._addedLabels = [];\n  }\n  init(scaleOptions) {\n    const added = this._addedLabels;\n    if (added.length) {\n      const labels = this.getLabels();\n      for (const {index, label} of added) {\n        if (labels[index] === label) {\n          labels.splice(index, 1);\n        }\n      }\n      this._addedLabels = [];\n    }\n    super.init(scaleOptions);\n  }\n  parse(raw, index) {\n    if (isNullOrUndef(raw)) {\n      return null;\n    }\n    const labels = this.getLabels();\n    index = isFinite(index) && labels[index] === raw ? index\n      : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n    return validIndex(index, labels.length - 1);\n  }\n  determineDataLimits() {\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let {min, max} = this.getMinMax(true);\n    if (this.options.bounds === 'ticks') {\n      if (!minDefined) {\n        min = 0;\n      }\n      if (!maxDefined) {\n        max = this.getLabels().length - 1;\n      }\n    }\n    this.min = min;\n    this.max = max;\n  }\n  buildTicks() {\n    const min = this.min;\n    const max = this.max;\n    const offset = this.options.offset;\n    const ticks = [];\n    let labels = this.getLabels();\n    labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n    this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n    this._startValue = this.min - (offset ? 0.5 : 0);\n    for (let value = min; value <= max; value++) {\n      ticks.push({value});\n    }\n    return ticks;\n  }\n  getLabelForValue(value) {\n    const labels = this.getLabels();\n    if (value >= 0 && value < labels.length) {\n      return labels[value];\n    }\n    return value;\n  }\n  configure() {\n    super.configure();\n    if (!this.isHorizontal()) {\n      this._reversePixels = !this._reversePixels;\n    }\n  }\n  getPixelForValue(value) {\n    if (typeof value !== 'number') {\n      value = this.parse(value);\n    }\n    return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n  }\n  getPixelForTick(index) {\n    const ticks = this.ticks;\n    if (index < 0 || index > ticks.length - 1) {\n      return null;\n    }\n    return this.getPixelForValue(ticks[index].value);\n  }\n  getValueForPixel(pixel) {\n    return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n  }\n  getBasePixel() {\n    return this.bottom;\n  }\n}\nCategoryScale.id = 'category';\nCategoryScale.defaults = {\n  ticks: {\n    callback: CategoryScale.prototype.getLabelForValue\n  }\n};\n\nfunction generateTicks$1(generationOptions, dataRange) {\n  const ticks = [];\n  const MIN_SPACING = 1e-14;\n  const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n  const unit = step || 1;\n  const maxSpaces = maxTicks - 1;\n  const {min: rmin, max: rmax} = dataRange;\n  const minDefined = !isNullOrUndef(min);\n  const maxDefined = !isNullOrUndef(max);\n  const countDefined = !isNullOrUndef(count);\n  const minSpacing = (rmax - rmin) / (maxDigits + 1);\n  let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n  let factor, niceMin, niceMax, numSpaces;\n  if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n    return [{value: rmin}, {value: rmax}];\n  }\n  numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n  if (numSpaces > maxSpaces) {\n    spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n  }\n  if (!isNullOrUndef(precision)) {\n    factor = Math.pow(10, precision);\n    spacing = Math.ceil(spacing * factor) / factor;\n  }\n  if (bounds === 'ticks') {\n    niceMin = Math.floor(rmin / spacing) * spacing;\n    niceMax = Math.ceil(rmax / spacing) * spacing;\n  } else {\n    niceMin = rmin;\n    niceMax = rmax;\n  }\n  if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n    numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n    spacing = (max - min) / numSpaces;\n    niceMin = min;\n    niceMax = max;\n  } else if (countDefined) {\n    niceMin = minDefined ? min : niceMin;\n    niceMax = maxDefined ? max : niceMax;\n    numSpaces = count - 1;\n    spacing = (niceMax - niceMin) / numSpaces;\n  } else {\n    numSpaces = (niceMax - niceMin) / spacing;\n    if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n      numSpaces = Math.round(numSpaces);\n    } else {\n      numSpaces = Math.ceil(numSpaces);\n    }\n  }\n  const decimalPlaces = Math.max(\n    _decimalPlaces(spacing),\n    _decimalPlaces(niceMin)\n  );\n  factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n  niceMin = Math.round(niceMin * factor) / factor;\n  niceMax = Math.round(niceMax * factor) / factor;\n  let j = 0;\n  if (minDefined) {\n    if (includeBounds && niceMin !== min) {\n      ticks.push({value: min});\n      if (niceMin < min) {\n        j++;\n      }\n      if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n        j++;\n      }\n    } else if (niceMin < min) {\n      j++;\n    }\n  }\n  for (; j < numSpaces; ++j) {\n    ticks.push({value: Math.round((niceMin + j * spacing) * factor) / factor});\n  }\n  if (maxDefined && includeBounds && niceMax !== max) {\n    if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n      ticks[ticks.length - 1].value = max;\n    } else {\n      ticks.push({value: max});\n    }\n  } else if (!maxDefined || niceMax === max) {\n    ticks.push({value: niceMax});\n  }\n  return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n  const rad = toRadians(minRotation);\n  const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n  const length = 0.75 * minSpacing * ('' + value).length;\n  return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n  constructor(cfg) {\n    super(cfg);\n    this.start = undefined;\n    this.end = undefined;\n    this._startValue = undefined;\n    this._endValue = undefined;\n    this._valueRange = 0;\n  }\n  parse(raw, index) {\n    if (isNullOrUndef(raw)) {\n      return null;\n    }\n    if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n      return null;\n    }\n    return +raw;\n  }\n  handleTickRangeOptions() {\n    const {beginAtZero} = this.options;\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let {min, max} = this;\n    const setMin = v => (min = minDefined ? min : v);\n    const setMax = v => (max = maxDefined ? max : v);\n    if (beginAtZero) {\n      const minSign = sign(min);\n      const maxSign = sign(max);\n      if (minSign < 0 && maxSign < 0) {\n        setMax(0);\n      } else if (minSign > 0 && maxSign > 0) {\n        setMin(0);\n      }\n    }\n    if (min === max) {\n      let offset = 1;\n      if (max >= Number.MAX_SAFE_INTEGER || min <= Number.MIN_SAFE_INTEGER) {\n        offset = Math.abs(max * 0.05);\n      }\n      setMax(max + offset);\n      if (!beginAtZero) {\n        setMin(min - offset);\n      }\n    }\n    this.min = min;\n    this.max = max;\n  }\n  getTickLimit() {\n    const tickOpts = this.options.ticks;\n    let {maxTicksLimit, stepSize} = tickOpts;\n    let maxTicks;\n    if (stepSize) {\n      maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n      if (maxTicks > 1000) {\n        console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n        maxTicks = 1000;\n      }\n    } else {\n      maxTicks = this.computeTickLimit();\n      maxTicksLimit = maxTicksLimit || 11;\n    }\n    if (maxTicksLimit) {\n      maxTicks = Math.min(maxTicksLimit, maxTicks);\n    }\n    return maxTicks;\n  }\n  computeTickLimit() {\n    return Number.POSITIVE_INFINITY;\n  }\n  buildTicks() {\n    const opts = this.options;\n    const tickOpts = opts.ticks;\n    let maxTicks = this.getTickLimit();\n    maxTicks = Math.max(2, maxTicks);\n    const numericGeneratorOptions = {\n      maxTicks,\n      bounds: opts.bounds,\n      min: opts.min,\n      max: opts.max,\n      precision: tickOpts.precision,\n      step: tickOpts.stepSize,\n      count: tickOpts.count,\n      maxDigits: this._maxDigits(),\n      horizontal: this.isHorizontal(),\n      minRotation: tickOpts.minRotation || 0,\n      includeBounds: tickOpts.includeBounds !== false\n    };\n    const dataRange = this._range || this;\n    const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n    if (opts.bounds === 'ticks') {\n      _setMinAndMaxByKey(ticks, this, 'value');\n    }\n    if (opts.reverse) {\n      ticks.reverse();\n      this.start = this.max;\n      this.end = this.min;\n    } else {\n      this.start = this.min;\n      this.end = this.max;\n    }\n    return ticks;\n  }\n  configure() {\n    const ticks = this.ticks;\n    let start = this.min;\n    let end = this.max;\n    super.configure();\n    if (this.options.offset && ticks.length) {\n      const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n      start -= offset;\n      end += offset;\n    }\n    this._startValue = start;\n    this._endValue = end;\n    this._valueRange = end - start;\n  }\n  getLabelForValue(value) {\n    return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n  }\n}\n\nclass LinearScale extends LinearScaleBase {\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(true);\n    this.min = isNumberFinite(min) ? min : 0;\n    this.max = isNumberFinite(max) ? max : 1;\n    this.handleTickRangeOptions();\n  }\n  computeTickLimit() {\n    const horizontal = this.isHorizontal();\n    const length = horizontal ? this.width : this.height;\n    const minRotation = toRadians(this.options.ticks.minRotation);\n    const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n    const tickFont = this._resolveTickFontOptions(0);\n    return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n  }\n  getPixelForValue(value) {\n    return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n  }\n  getValueForPixel(pixel) {\n    return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n  }\n}\nLinearScale.id = 'linear';\nLinearScale.defaults = {\n  ticks: {\n    callback: Ticks.formatters.numeric\n  }\n};\n\nfunction isMajor(tickVal) {\n  const remain = tickVal / (Math.pow(10, Math.floor(log10(tickVal))));\n  return remain === 1;\n}\nfunction generateTicks(generationOptions, dataRange) {\n  const endExp = Math.floor(log10(dataRange.max));\n  const endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n  const ticks = [];\n  let tickVal = finiteOrDefault(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));\n  let exp = Math.floor(log10(tickVal));\n  let significand = Math.floor(tickVal / Math.pow(10, exp));\n  let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n  do {\n    ticks.push({value: tickVal, major: isMajor(tickVal)});\n    ++significand;\n    if (significand === 10) {\n      significand = 1;\n      ++exp;\n      precision = exp >= 0 ? 1 : precision;\n    }\n    tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n  } while (exp < endExp || (exp === endExp && significand < endSignificand));\n  const lastTick = finiteOrDefault(generationOptions.max, tickVal);\n  ticks.push({value: lastTick, major: isMajor(tickVal)});\n  return ticks;\n}\nclass LogarithmicScale extends Scale {\n  constructor(cfg) {\n    super(cfg);\n    this.start = undefined;\n    this.end = undefined;\n    this._startValue = undefined;\n    this._valueRange = 0;\n  }\n  parse(raw, index) {\n    const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n    if (value === 0) {\n      this._zero = true;\n      return undefined;\n    }\n    return isNumberFinite(value) && value > 0 ? value : null;\n  }\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(true);\n    this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n    this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n    if (this.options.beginAtZero) {\n      this._zero = true;\n    }\n    this.handleTickRangeOptions();\n  }\n  handleTickRangeOptions() {\n    const {minDefined, maxDefined} = this.getUserBounds();\n    let min = this.min;\n    let max = this.max;\n    const setMin = v => (min = minDefined ? min : v);\n    const setMax = v => (max = maxDefined ? max : v);\n    const exp = (v, m) => Math.pow(10, Math.floor(log10(v)) + m);\n    if (min === max) {\n      if (min <= 0) {\n        setMin(1);\n        setMax(10);\n      } else {\n        setMin(exp(min, -1));\n        setMax(exp(max, +1));\n      }\n    }\n    if (min <= 0) {\n      setMin(exp(max, -1));\n    }\n    if (max <= 0) {\n      setMax(exp(min, +1));\n    }\n    if (this._zero && this.min !== this._suggestedMin && min === exp(this.min, 0)) {\n      setMin(exp(min, -1));\n    }\n    this.min = min;\n    this.max = max;\n  }\n  buildTicks() {\n    const opts = this.options;\n    const generationOptions = {\n      min: this._userMin,\n      max: this._userMax\n    };\n    const ticks = generateTicks(generationOptions, this);\n    if (opts.bounds === 'ticks') {\n      _setMinAndMaxByKey(ticks, this, 'value');\n    }\n    if (opts.reverse) {\n      ticks.reverse();\n      this.start = this.max;\n      this.end = this.min;\n    } else {\n      this.start = this.min;\n      this.end = this.max;\n    }\n    return ticks;\n  }\n  getLabelForValue(value) {\n    return value === undefined\n      ? '0'\n      : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n  }\n  configure() {\n    const start = this.min;\n    super.configure();\n    this._startValue = log10(start);\n    this._valueRange = log10(this.max) - log10(start);\n  }\n  getPixelForValue(value) {\n    if (value === undefined || value === 0) {\n      value = this.min;\n    }\n    if (value === null || isNaN(value)) {\n      return NaN;\n    }\n    return this.getPixelForDecimal(value === this.min\n      ? 0\n      : (log10(value) - this._startValue) / this._valueRange);\n  }\n  getValueForPixel(pixel) {\n    const decimal = this.getDecimalForPixel(pixel);\n    return Math.pow(10, this._startValue + decimal * this._valueRange);\n  }\n}\nLogarithmicScale.id = 'logarithmic';\nLogarithmicScale.defaults = {\n  ticks: {\n    callback: Ticks.formatters.logarithmic,\n    major: {\n      enabled: true\n    }\n  }\n};\n\nfunction getTickBackdropHeight(opts) {\n  const tickOpts = opts.ticks;\n  if (tickOpts.display && opts.display) {\n    const padding = toPadding(tickOpts.backdropPadding);\n    return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n  }\n  return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n  label = isArray(label) ? label : [label];\n  return {\n    w: _longestText(ctx, font.string, label),\n    h: label.length * font.lineHeight\n  };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n  if (angle === min || angle === max) {\n    return {\n      start: pos - (size / 2),\n      end: pos + (size / 2)\n    };\n  } else if (angle < min || angle > max) {\n    return {\n      start: pos - size,\n      end: pos\n    };\n  }\n  return {\n    start: pos,\n    end: pos + size\n  };\n}\nfunction fitWithPointLabels(scale) {\n  const orig = {\n    l: scale.left + scale._padding.left,\n    r: scale.right - scale._padding.right,\n    t: scale.top + scale._padding.top,\n    b: scale.bottom - scale._padding.bottom\n  };\n  const limits = Object.assign({}, orig);\n  const labelSizes = [];\n  const padding = [];\n  const valueCount = scale._pointLabels.length;\n  const pointLabelOpts = scale.options.pointLabels;\n  const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n  for (let i = 0; i < valueCount; i++) {\n    const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n    padding[i] = opts.padding;\n    const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n    const plFont = toFont(opts.font);\n    const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n    labelSizes[i] = textSize;\n    const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n    const angle = Math.round(toDegrees(angleRadians));\n    const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n    const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n    updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n  }\n  scale.setCenterPoint(\n    orig.l - limits.l,\n    limits.r - orig.r,\n    orig.t - limits.t,\n    limits.b - orig.b\n  );\n  scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n  const sin = Math.abs(Math.sin(angle));\n  const cos = Math.abs(Math.cos(angle));\n  let x = 0;\n  let y = 0;\n  if (hLimits.start < orig.l) {\n    x = (orig.l - hLimits.start) / sin;\n    limits.l = Math.min(limits.l, orig.l - x);\n  } else if (hLimits.end > orig.r) {\n    x = (hLimits.end - orig.r) / sin;\n    limits.r = Math.max(limits.r, orig.r + x);\n  }\n  if (vLimits.start < orig.t) {\n    y = (orig.t - vLimits.start) / cos;\n    limits.t = Math.min(limits.t, orig.t - y);\n  } else if (vLimits.end > orig.b) {\n    y = (vLimits.end - orig.b) / cos;\n    limits.b = Math.max(limits.b, orig.b + y);\n  }\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n  const items = [];\n  const valueCount = scale._pointLabels.length;\n  const opts = scale.options;\n  const extra = getTickBackdropHeight(opts) / 2;\n  const outerDistance = scale.drawingArea;\n  const additionalAngle = opts.pointLabels.centerPointLabels ? PI / valueCount : 0;\n  for (let i = 0; i < valueCount; i++) {\n    const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i], additionalAngle);\n    const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n    const size = labelSizes[i];\n    const y = yForAngle(pointLabelPosition.y, size.h, angle);\n    const textAlign = getTextAlignForAngle(angle);\n    const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n    items.push({\n      x: pointLabelPosition.x,\n      y,\n      textAlign,\n      left,\n      top: y,\n      right: left + size.w,\n      bottom: y + size.h\n    });\n  }\n  return items;\n}\nfunction getTextAlignForAngle(angle) {\n  if (angle === 0 || angle === 180) {\n    return 'center';\n  } else if (angle < 180) {\n    return 'left';\n  }\n  return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n  if (align === 'right') {\n    x -= w;\n  } else if (align === 'center') {\n    x -= (w / 2);\n  }\n  return x;\n}\nfunction yForAngle(y, h, angle) {\n  if (angle === 90 || angle === 270) {\n    y -= (h / 2);\n  } else if (angle > 270 || angle < 90) {\n    y -= h;\n  }\n  return y;\n}\nfunction drawPointLabels(scale, labelCount) {\n  const {ctx, options: {pointLabels}} = scale;\n  for (let i = labelCount - 1; i >= 0; i--) {\n    const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n    const plFont = toFont(optsAtIndex.font);\n    const {x, y, textAlign, left, top, right, bottom} = scale._pointLabelItems[i];\n    const {backdropColor} = optsAtIndex;\n    if (!isNullOrUndef(backdropColor)) {\n      const padding = toPadding(optsAtIndex.backdropPadding);\n      ctx.fillStyle = backdropColor;\n      ctx.fillRect(left - padding.left, top - padding.top, right - left + padding.width, bottom - top + padding.height);\n    }\n    renderText(\n      ctx,\n      scale._pointLabels[i],\n      x,\n      y + (plFont.lineHeight / 2),\n      plFont,\n      {\n        color: optsAtIndex.color,\n        textAlign: textAlign,\n        textBaseline: 'middle'\n      }\n    );\n  }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n  const {ctx} = scale;\n  if (circular) {\n    ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n  } else {\n    let pointPosition = scale.getPointPosition(0, radius);\n    ctx.moveTo(pointPosition.x, pointPosition.y);\n    for (let i = 1; i < labelCount; i++) {\n      pointPosition = scale.getPointPosition(i, radius);\n      ctx.lineTo(pointPosition.x, pointPosition.y);\n    }\n  }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount) {\n  const ctx = scale.ctx;\n  const circular = gridLineOpts.circular;\n  const {color, lineWidth} = gridLineOpts;\n  if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n    return;\n  }\n  ctx.save();\n  ctx.strokeStyle = color;\n  ctx.lineWidth = lineWidth;\n  ctx.setLineDash(gridLineOpts.borderDash);\n  ctx.lineDashOffset = gridLineOpts.borderDashOffset;\n  ctx.beginPath();\n  pathRadiusLine(scale, radius, circular, labelCount);\n  ctx.closePath();\n  ctx.stroke();\n  ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n  return createContext(parent, {\n    label,\n    index,\n    type: 'pointLabel'\n  });\n}\nclass RadialLinearScale extends LinearScaleBase {\n  constructor(cfg) {\n    super(cfg);\n    this.xCenter = undefined;\n    this.yCenter = undefined;\n    this.drawingArea = undefined;\n    this._pointLabels = [];\n    this._pointLabelItems = [];\n  }\n  setDimensions() {\n    const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n    const w = this.width = this.maxWidth - padding.width;\n    const h = this.height = this.maxHeight - padding.height;\n    this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n    this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n    this.drawingArea = Math.floor(Math.min(w, h) / 2);\n  }\n  determineDataLimits() {\n    const {min, max} = this.getMinMax(false);\n    this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n    this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n    this.handleTickRangeOptions();\n  }\n  computeTickLimit() {\n    return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n  }\n  generateTickLabels(ticks) {\n    LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n    this._pointLabels = this.getLabels()\n      .map((value, index) => {\n        const label = callback(this.options.pointLabels.callback, [value, index], this);\n        return label || label === 0 ? label : '';\n      })\n      .filter((v, i) => this.chart.getDataVisibility(i));\n  }\n  fit() {\n    const opts = this.options;\n    if (opts.display && opts.pointLabels.display) {\n      fitWithPointLabels(this);\n    } else {\n      this.setCenterPoint(0, 0, 0, 0);\n    }\n  }\n  setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n    this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n    this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n    this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n  }\n  getIndexAngle(index) {\n    const angleMultiplier = TAU / (this._pointLabels.length || 1);\n    const startAngle = this.options.startAngle || 0;\n    return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n  }\n  getDistanceFromCenterForValue(value) {\n    if (isNullOrUndef(value)) {\n      return NaN;\n    }\n    const scalingFactor = this.drawingArea / (this.max - this.min);\n    if (this.options.reverse) {\n      return (this.max - value) * scalingFactor;\n    }\n    return (value - this.min) * scalingFactor;\n  }\n  getValueForDistanceFromCenter(distance) {\n    if (isNullOrUndef(distance)) {\n      return NaN;\n    }\n    const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n    return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n  }\n  getPointLabelContext(index) {\n    const pointLabels = this._pointLabels || [];\n    if (index >= 0 && index < pointLabels.length) {\n      const pointLabel = pointLabels[index];\n      return createPointLabelContext(this.getContext(), index, pointLabel);\n    }\n  }\n  getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n    const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n    return {\n      x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n      y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n      angle\n    };\n  }\n  getPointPositionForValue(index, value) {\n    return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n  }\n  getBasePosition(index) {\n    return this.getPointPositionForValue(index || 0, this.getBaseValue());\n  }\n  getPointLabelPosition(index) {\n    const {left, top, right, bottom} = this._pointLabelItems[index];\n    return {\n      left,\n      top,\n      right,\n      bottom,\n    };\n  }\n  drawBackground() {\n    const {backgroundColor, grid: {circular}} = this.options;\n    if (backgroundColor) {\n      const ctx = this.ctx;\n      ctx.save();\n      ctx.beginPath();\n      pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n      ctx.closePath();\n      ctx.fillStyle = backgroundColor;\n      ctx.fill();\n      ctx.restore();\n    }\n  }\n  drawGrid() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    const {angleLines, grid} = opts;\n    const labelCount = this._pointLabels.length;\n    let i, offset, position;\n    if (opts.pointLabels.display) {\n      drawPointLabels(this, labelCount);\n    }\n    if (grid.display) {\n      this.ticks.forEach((tick, index) => {\n        if (index !== 0) {\n          offset = this.getDistanceFromCenterForValue(tick.value);\n          const optsAtIndex = grid.setContext(this.getContext(index - 1));\n          drawRadiusLine(this, optsAtIndex, offset, labelCount);\n        }\n      });\n    }\n    if (angleLines.display) {\n      ctx.save();\n      for (i = labelCount - 1; i >= 0; i--) {\n        const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n        const {color, lineWidth} = optsAtIndex;\n        if (!lineWidth || !color) {\n          continue;\n        }\n        ctx.lineWidth = lineWidth;\n        ctx.strokeStyle = color;\n        ctx.setLineDash(optsAtIndex.borderDash);\n        ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n        offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);\n        position = this.getPointPosition(i, offset);\n        ctx.beginPath();\n        ctx.moveTo(this.xCenter, this.yCenter);\n        ctx.lineTo(position.x, position.y);\n        ctx.stroke();\n      }\n      ctx.restore();\n    }\n  }\n  drawBorder() {}\n  drawLabels() {\n    const ctx = this.ctx;\n    const opts = this.options;\n    const tickOpts = opts.ticks;\n    if (!tickOpts.display) {\n      return;\n    }\n    const startAngle = this.getIndexAngle(0);\n    let offset, width;\n    ctx.save();\n    ctx.translate(this.xCenter, this.yCenter);\n    ctx.rotate(startAngle);\n    ctx.textAlign = 'center';\n    ctx.textBaseline = 'middle';\n    this.ticks.forEach((tick, index) => {\n      if (index === 0 && !opts.reverse) {\n        return;\n      }\n      const optsAtIndex = tickOpts.setContext(this.getContext(index));\n      const tickFont = toFont(optsAtIndex.font);\n      offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n      if (optsAtIndex.showLabelBackdrop) {\n        ctx.font = tickFont.string;\n        width = ctx.measureText(tick.label).width;\n        ctx.fillStyle = optsAtIndex.backdropColor;\n        const padding = toPadding(optsAtIndex.backdropPadding);\n        ctx.fillRect(\n          -width / 2 - padding.left,\n          -offset - tickFont.size / 2 - padding.top,\n          width + padding.width,\n          tickFont.size + padding.height\n        );\n      }\n      renderText(ctx, tick.label, 0, -offset, tickFont, {\n        color: optsAtIndex.color,\n      });\n    });\n    ctx.restore();\n  }\n  drawTitle() {}\n}\nRadialLinearScale.id = 'radialLinear';\nRadialLinearScale.defaults = {\n  display: true,\n  animate: true,\n  position: 'chartArea',\n  angleLines: {\n    display: true,\n    lineWidth: 1,\n    borderDash: [],\n    borderDashOffset: 0.0\n  },\n  grid: {\n    circular: false\n  },\n  startAngle: 0,\n  ticks: {\n    showLabelBackdrop: true,\n    callback: Ticks.formatters.numeric\n  },\n  pointLabels: {\n    backdropColor: undefined,\n    backdropPadding: 2,\n    display: true,\n    font: {\n      size: 10\n    },\n    callback(label) {\n      return label;\n    },\n    padding: 5,\n    centerPointLabels: false\n  }\n};\nRadialLinearScale.defaultRoutes = {\n  'angleLines.color': 'borderColor',\n  'pointLabels.color': 'color',\n  'ticks.color': 'color'\n};\nRadialLinearScale.descriptors = {\n  angleLines: {\n    _fallback: 'grid'\n  }\n};\n\nconst INTERVALS = {\n  millisecond: {common: true, size: 1, steps: 1000},\n  second: {common: true, size: 1000, steps: 60},\n  minute: {common: true, size: 60000, steps: 60},\n  hour: {common: true, size: 3600000, steps: 24},\n  day: {common: true, size: 86400000, steps: 30},\n  week: {common: false, size: 604800000, steps: 4},\n  month: {common: true, size: 2.628e9, steps: 12},\n  quarter: {common: false, size: 7.884e9, steps: 4},\n  year: {common: true, size: 3.154e10}\n};\nconst UNITS = (Object.keys(INTERVALS));\nfunction sorter(a, b) {\n  return a - b;\n}\nfunction parse(scale, input) {\n  if (isNullOrUndef(input)) {\n    return null;\n  }\n  const adapter = scale._adapter;\n  const {parser, round, isoWeekday} = scale._parseOpts;\n  let value = input;\n  if (typeof parser === 'function') {\n    value = parser(value);\n  }\n  if (!isNumberFinite(value)) {\n    value = typeof parser === 'string'\n      ? adapter.parse(value, parser)\n      : adapter.parse(value);\n  }\n  if (value === null) {\n    return null;\n  }\n  if (round) {\n    value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n      ? adapter.startOf(value, 'isoWeek', isoWeekday)\n      : adapter.startOf(value, round);\n  }\n  return +value;\n}\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n  const ilen = UNITS.length;\n  for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n    const interval = INTERVALS[UNITS[i]];\n    const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n    if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n      return UNITS[i];\n    }\n  }\n  return UNITS[ilen - 1];\n}\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n  for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n    const unit = UNITS[i];\n    if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n      return unit;\n    }\n  }\n  return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\nfunction determineMajorUnit(unit) {\n  for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n    if (INTERVALS[UNITS[i]].common) {\n      return UNITS[i];\n    }\n  }\n}\nfunction addTick(ticks, time, timestamps) {\n  if (!timestamps) {\n    ticks[time] = true;\n  } else if (timestamps.length) {\n    const {lo, hi} = _lookup(timestamps, time);\n    const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n    ticks[timestamp] = true;\n  }\n}\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n  const adapter = scale._adapter;\n  const first = +adapter.startOf(ticks[0].value, majorUnit);\n  const last = ticks[ticks.length - 1].value;\n  let major, index;\n  for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n    index = map[major];\n    if (index >= 0) {\n      ticks[index].major = true;\n    }\n  }\n  return ticks;\n}\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n  const ticks = [];\n  const map = {};\n  const ilen = values.length;\n  let i, value;\n  for (i = 0; i < ilen; ++i) {\n    value = values[i];\n    map[value] = i;\n    ticks.push({\n      value,\n      major: false\n    });\n  }\n  return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n  constructor(props) {\n    super(props);\n    this._cache = {\n      data: [],\n      labels: [],\n      all: []\n    };\n    this._unit = 'day';\n    this._majorUnit = undefined;\n    this._offsets = {};\n    this._normalized = false;\n    this._parseOpts = undefined;\n  }\n  init(scaleOpts, opts) {\n    const time = scaleOpts.time || (scaleOpts.time = {});\n    const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n    mergeIf(time.displayFormats, adapter.formats());\n    this._parseOpts = {\n      parser: time.parser,\n      round: time.round,\n      isoWeekday: time.isoWeekday\n    };\n    super.init(scaleOpts);\n    this._normalized = opts.normalized;\n  }\n  parse(raw, index) {\n    if (raw === undefined) {\n      return null;\n    }\n    return parse(this, raw);\n  }\n  beforeLayout() {\n    super.beforeLayout();\n    this._cache = {\n      data: [],\n      labels: [],\n      all: []\n    };\n  }\n  determineDataLimits() {\n    const options = this.options;\n    const adapter = this._adapter;\n    const unit = options.time.unit || 'day';\n    let {min, max, minDefined, maxDefined} = this.getUserBounds();\n    function _applyBounds(bounds) {\n      if (!minDefined && !isNaN(bounds.min)) {\n        min = Math.min(min, bounds.min);\n      }\n      if (!maxDefined && !isNaN(bounds.max)) {\n        max = Math.max(max, bounds.max);\n      }\n    }\n    if (!minDefined || !maxDefined) {\n      _applyBounds(this._getLabelBounds());\n      if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n        _applyBounds(this.getMinMax(false));\n      }\n    }\n    min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n    max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n    this.min = Math.min(min, max - 1);\n    this.max = Math.max(min + 1, max);\n  }\n  _getLabelBounds() {\n    const arr = this.getLabelTimestamps();\n    let min = Number.POSITIVE_INFINITY;\n    let max = Number.NEGATIVE_INFINITY;\n    if (arr.length) {\n      min = arr[0];\n      max = arr[arr.length - 1];\n    }\n    return {min, max};\n  }\n  buildTicks() {\n    const options = this.options;\n    const timeOpts = options.time;\n    const tickOpts = options.ticks;\n    const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n    if (options.bounds === 'ticks' && timestamps.length) {\n      this.min = this._userMin || timestamps[0];\n      this.max = this._userMax || timestamps[timestamps.length - 1];\n    }\n    const min = this.min;\n    const max = this.max;\n    const ticks = _filterBetween(timestamps, min, max);\n    this._unit = timeOpts.unit || (tickOpts.autoSkip\n      ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n      : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n    this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n      : determineMajorUnit(this._unit);\n    this.initOffsets(timestamps);\n    if (options.reverse) {\n      ticks.reverse();\n    }\n    return ticksFromTimestamps(this, ticks, this._majorUnit);\n  }\n  initOffsets(timestamps) {\n    let start = 0;\n    let end = 0;\n    let first, last;\n    if (this.options.offset && timestamps.length) {\n      first = this.getDecimalForValue(timestamps[0]);\n      if (timestamps.length === 1) {\n        start = 1 - first;\n      } else {\n        start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n      }\n      last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n      if (timestamps.length === 1) {\n        end = last;\n      } else {\n        end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n      }\n    }\n    const limit = timestamps.length < 3 ? 0.5 : 0.25;\n    start = _limitValue(start, 0, limit);\n    end = _limitValue(end, 0, limit);\n    this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n  }\n  _generate() {\n    const adapter = this._adapter;\n    const min = this.min;\n    const max = this.max;\n    const options = this.options;\n    const timeOpts = options.time;\n    const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n    const stepSize = valueOrDefault(timeOpts.stepSize, 1);\n    const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n    const hasWeekday = isNumber(weekday) || weekday === true;\n    const ticks = {};\n    let first = min;\n    let time, count;\n    if (hasWeekday) {\n      first = +adapter.startOf(first, 'isoWeek', weekday);\n    }\n    first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n    if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n      throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n    }\n    const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n    for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n      addTick(ticks, time, timestamps);\n    }\n    if (time === max || options.bounds === 'ticks' || count === 1) {\n      addTick(ticks, time, timestamps);\n    }\n    return Object.keys(ticks).sort((a, b) => a - b).map(x => +x);\n  }\n  getLabelForValue(value) {\n    const adapter = this._adapter;\n    const timeOpts = this.options.time;\n    if (timeOpts.tooltipFormat) {\n      return adapter.format(value, timeOpts.tooltipFormat);\n    }\n    return adapter.format(value, timeOpts.displayFormats.datetime);\n  }\n  _tickFormatFunction(time, index, ticks, format) {\n    const options = this.options;\n    const formats = options.time.displayFormats;\n    const unit = this._unit;\n    const majorUnit = this._majorUnit;\n    const minorFormat = unit && formats[unit];\n    const majorFormat = majorUnit && formats[majorUnit];\n    const tick = ticks[index];\n    const major = majorUnit && majorFormat && tick && tick.major;\n    const label = this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n    const formatter = options.ticks.callback;\n    return formatter ? callback(formatter, [label, index, ticks], this) : label;\n  }\n  generateTickLabels(ticks) {\n    let i, ilen, tick;\n    for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n      tick = ticks[i];\n      tick.label = this._tickFormatFunction(tick.value, i, ticks);\n    }\n  }\n  getDecimalForValue(value) {\n    return value === null ? NaN : (value - this.min) / (this.max - this.min);\n  }\n  getPixelForValue(value) {\n    const offsets = this._offsets;\n    const pos = this.getDecimalForValue(value);\n    return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n  }\n  getValueForPixel(pixel) {\n    const offsets = this._offsets;\n    const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n    return this.min + pos * (this.max - this.min);\n  }\n  _getLabelSize(label) {\n    const ticksOpts = this.options.ticks;\n    const tickLabelWidth = this.ctx.measureText(label).width;\n    const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n    const cosRotation = Math.cos(angle);\n    const sinRotation = Math.sin(angle);\n    const tickFontSize = this._resolveTickFontOptions(0).size;\n    return {\n      w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n      h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n    };\n  }\n  _getLabelCapacity(exampleTime) {\n    const timeOpts = this.options.time;\n    const displayFormats = timeOpts.displayFormats;\n    const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n    const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n    const size = this._getLabelSize(exampleLabel);\n    const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n    return capacity > 0 ? capacity : 1;\n  }\n  getDataTimestamps() {\n    let timestamps = this._cache.data || [];\n    let i, ilen;\n    if (timestamps.length) {\n      return timestamps;\n    }\n    const metas = this.getMatchingVisibleMetas();\n    if (this._normalized && metas.length) {\n      return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n    }\n    for (i = 0, ilen = metas.length; i < ilen; ++i) {\n      timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n    }\n    return (this._cache.data = this.normalize(timestamps));\n  }\n  getLabelTimestamps() {\n    const timestamps = this._cache.labels || [];\n    let i, ilen;\n    if (timestamps.length) {\n      return timestamps;\n    }\n    const labels = this.getLabels();\n    for (i = 0, ilen = labels.length; i < ilen; ++i) {\n      timestamps.push(parse(this, labels[i]));\n    }\n    return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n  }\n  normalize(values) {\n    return _arrayUnique(values.sort(sorter));\n  }\n}\nTimeScale.id = 'time';\nTimeScale.defaults = {\n  bounds: 'data',\n  adapters: {},\n  time: {\n    parser: false,\n    unit: false,\n    round: false,\n    isoWeekday: false,\n    minUnit: 'millisecond',\n    displayFormats: {}\n  },\n  ticks: {\n    source: 'auto',\n    major: {\n      enabled: false\n    }\n  }\n};\n\nfunction interpolate(table, val, reverse) {\n  let lo = 0;\n  let hi = table.length - 1;\n  let prevSource, nextSource, prevTarget, nextTarget;\n  if (reverse) {\n    if (val >= table[lo].pos && val <= table[hi].pos) {\n      ({lo, hi} = _lookupByKey(table, 'pos', val));\n    }\n    ({pos: prevSource, time: prevTarget} = table[lo]);\n    ({pos: nextSource, time: nextTarget} = table[hi]);\n  } else {\n    if (val >= table[lo].time && val <= table[hi].time) {\n      ({lo, hi} = _lookupByKey(table, 'time', val));\n    }\n    ({time: prevSource, pos: prevTarget} = table[lo]);\n    ({time: nextSource, pos: nextTarget} = table[hi]);\n  }\n  const span = nextSource - prevSource;\n  return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n  constructor(props) {\n    super(props);\n    this._table = [];\n    this._minPos = undefined;\n    this._tableRange = undefined;\n  }\n  initOffsets() {\n    const timestamps = this._getTimestampsForTable();\n    const table = this._table = this.buildLookupTable(timestamps);\n    this._minPos = interpolate(table, this.min);\n    this._tableRange = interpolate(table, this.max) - this._minPos;\n    super.initOffsets(timestamps);\n  }\n  buildLookupTable(timestamps) {\n    const {min, max} = this;\n    const items = [];\n    const table = [];\n    let i, ilen, prev, curr, next;\n    for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n      curr = timestamps[i];\n      if (curr >= min && curr <= max) {\n        items.push(curr);\n      }\n    }\n    if (items.length < 2) {\n      return [\n        {time: min, pos: 0},\n        {time: max, pos: 1}\n      ];\n    }\n    for (i = 0, ilen = items.length; i < ilen; ++i) {\n      next = items[i + 1];\n      prev = items[i - 1];\n      curr = items[i];\n      if (Math.round((next + prev) / 2) !== curr) {\n        table.push({time: curr, pos: i / (ilen - 1)});\n      }\n    }\n    return table;\n  }\n  _getTimestampsForTable() {\n    let timestamps = this._cache.all || [];\n    if (timestamps.length) {\n      return timestamps;\n    }\n    const data = this.getDataTimestamps();\n    const label = this.getLabelTimestamps();\n    if (data.length && label.length) {\n      timestamps = this.normalize(data.concat(label));\n    } else {\n      timestamps = data.length ? data : label;\n    }\n    timestamps = this._cache.all = timestamps;\n    return timestamps;\n  }\n  getDecimalForValue(value) {\n    return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n  }\n  getValueForPixel(pixel) {\n    const offsets = this._offsets;\n    const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n    return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n  }\n}\nTimeSeriesScale.id = 'timeseries';\nTimeSeriesScale.defaults = TimeScale.defaults;\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n  controllers,\n  elements,\n  plugins,\n  scales,\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, plugin_filler as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, elements, layouts, plugins, registerables, registry, scales };\n","/*!\n* chartjs-plugin-annotation v1.4.0\n* https://www.chartjs.org/chartjs-plugin-annotation/index\n * (c) 2022 chartjs-plugin-annotation Contributors\n * Released under the MIT License\n */\nimport { Element, defaults, Animations, Chart } from 'chart.js';\nimport { defined, distanceBetweenPoints, callback, isFinite, valueOrDefault, isObject, toRadians, toFont, isArray, addRoundedRectPath, toTRBLCorners, toPadding, PI, drawPoint, RAD_PER_DEG, clipArea, unclipArea } from 'chart.js/helpers';\n\nconst clickHooks = ['click', 'dblclick'];\nconst moveHooks = ['enter', 'leave'];\nconst hooks = clickHooks.concat(moveHooks);\n\nfunction updateListeners(chart, state, options) {\n  state.listened = false;\n  state.moveListened = false;\n\n  hooks.forEach(hook => {\n    if (typeof options[hook] === 'function') {\n      state.listened = true;\n      state.listeners[hook] = options[hook];\n    } else if (defined(state.listeners[hook])) {\n      delete state.listeners[hook];\n    }\n  });\n  moveHooks.forEach(hook => {\n    if (typeof options[hook] === 'function') {\n      state.moveListened = true;\n    }\n  });\n\n  if (!state.listened || !state.moveListened) {\n    state.annotations.forEach(scope => {\n      if (!state.listened) {\n        clickHooks.forEach(hook => {\n          if (typeof scope[hook] === 'function') {\n            state.listened = true;\n          }\n        });\n      }\n      if (!state.moveListened) {\n        moveHooks.forEach(hook => {\n          if (typeof scope[hook] === 'function') {\n            state.listened = true;\n            state.moveListened = true;\n          }\n        });\n      }\n    });\n  }\n}\n\nfunction handleEvent(state, event, options) {\n  if (state.listened) {\n    switch (event.type) {\n    case 'mousemove':\n    case 'mouseout':\n      handleMoveEvents(state, event);\n      break;\n    case 'click':\n      handleClickEvents(state, event, options);\n      break;\n    }\n  }\n}\n\nfunction handleMoveEvents(state, event) {\n  if (!state.moveListened) {\n    return;\n  }\n\n  let element;\n\n  if (event.type === 'mousemove') {\n    element = getNearestItem(state.elements, event);\n  }\n\n  const previous = state.hovered;\n  state.hovered = element;\n\n  dispatchMoveEvents(state, {previous, element}, event);\n}\n\nfunction dispatchMoveEvents(state, elements, event) {\n  const {previous, element} = elements;\n  if (previous && previous !== element) {\n    dispatchEvent(previous.options.leave || state.listeners.leave, previous, event);\n  }\n  if (element && element !== previous) {\n    dispatchEvent(element.options.enter || state.listeners.enter, element, event);\n  }\n}\n\nfunction handleClickEvents(state, event, options) {\n  const listeners = state.listeners;\n  const element = getNearestItem(state.elements, event);\n  if (element) {\n    const elOpts = element.options;\n    const dblclick = elOpts.dblclick || listeners.dblclick;\n    const click = elOpts.click || listeners.click;\n    if (element.clickTimeout) {\n      // 2nd click before timeout, so its a double click\n      clearTimeout(element.clickTimeout);\n      delete element.clickTimeout;\n      dispatchEvent(dblclick, element, event);\n    } else if (dblclick) {\n      // if there is a dblclick handler, wait for dblClickSpeed ms before deciding its a click\n      element.clickTimeout = setTimeout(() => {\n        delete element.clickTimeout;\n        dispatchEvent(click, element, event);\n      }, options.dblClickSpeed);\n    } else {\n      // no double click handler, just call the click handler directly\n      dispatchEvent(click, element, event);\n    }\n  }\n}\n\nfunction dispatchEvent(handler, element, event) {\n  callback(handler, [element.$context, event]);\n}\n\nfunction getNearestItem(elements, position) {\n  let minDistance = Number.POSITIVE_INFINITY;\n\n  return elements\n    .filter((element) => element.options.display && element.inRange(position.x, position.y))\n    .reduce((nearestItems, element) => {\n      const center = element.getCenterPoint();\n      const distance = distanceBetweenPoints(position, center);\n\n      if (distance < minDistance) {\n        nearestItems = [element];\n        minDistance = distance;\n      } else if (distance === minDistance) {\n        // Can have multiple items at the same distance in which case we sort by size\n        nearestItems.push(element);\n      }\n\n      return nearestItems;\n    }, [])\n    .sort((a, b) => a._index - b._index)\n    .slice(0, 1)[0]; // return only the top item\n}\n\nfunction adjustScaleRange(chart, scale, annotations) {\n  const range = getScaleLimits(scale, annotations);\n  let changed = changeScaleLimit(scale, range, 'min', 'suggestedMin');\n  changed = changeScaleLimit(scale, range, 'max', 'suggestedMax') || changed;\n  if (changed && typeof scale.handleTickRangeOptions === 'function') {\n    scale.handleTickRangeOptions();\n  }\n}\n\nfunction verifyScaleOptions(annotations, scales) {\n  for (const annotation of annotations) {\n    verifyScaleIDs(annotation, scales);\n  }\n}\n\nfunction changeScaleLimit(scale, range, limit, suggestedLimit) {\n  if (isFinite(range[limit]) && !scaleLimitDefined(scale.options, limit, suggestedLimit)) {\n    const changed = scale[limit] !== range[limit];\n    scale[limit] = range[limit];\n    return changed;\n  }\n}\n\nfunction scaleLimitDefined(scaleOptions, limit, suggestedLimit) {\n  return defined(scaleOptions[limit]) || defined(scaleOptions[suggestedLimit]);\n}\n\nfunction verifyScaleIDs(annotation, scales) {\n  for (const key of ['scaleID', 'xScaleID', 'yScaleID']) {\n    if (annotation[key] && !scales[annotation[key]] && verifyProperties(annotation, key)) {\n      console.warn(`No scale found with id '${annotation[key]}' for annotation '${annotation.id}'`);\n    }\n  }\n}\n\nfunction verifyProperties(annotation, key) {\n  if (key === 'scaleID') {\n    return true;\n  }\n  const axis = key.charAt(0);\n  for (const prop of ['Min', 'Max', 'Value']) {\n    if (defined(annotation[axis + prop])) {\n      return true;\n    }\n  }\n  return false;\n}\n\nfunction getScaleLimits(scale, annotations) {\n  const axis = scale.axis;\n  const scaleID = scale.id;\n  const scaleIDOption = axis + 'ScaleID';\n  const limits = {\n    min: valueOrDefault(scale.min, Number.NEGATIVE_INFINITY),\n    max: valueOrDefault(scale.max, Number.POSITIVE_INFINITY)\n  };\n  for (const annotation of annotations) {\n    if (annotation.scaleID === scaleID) {\n      updateLimits(annotation, scale, ['value', 'endValue'], limits);\n    } else if (annotation[scaleIDOption] === scaleID) {\n      updateLimits(annotation, scale, [axis + 'Min', axis + 'Max', axis + 'Value'], limits);\n    }\n  }\n  return limits;\n}\n\nfunction updateLimits(annotation, scale, props, limits) {\n  for (const prop of props) {\n    const raw = annotation[prop];\n    if (defined(raw)) {\n      const value = scale.parse(raw);\n      limits.min = Math.min(limits.min, value);\n      limits.max = Math.max(limits.max, value);\n    }\n  }\n}\n\nconst EPSILON = 0.001;\n\nconst clamp = (x, from, to) => Math.min(to, Math.max(from, x));\n\nfunction clampAll(obj, from, to) {\n  for (const key of Object.keys(obj)) {\n    obj[key] = clamp(obj[key], from, to);\n  }\n  return obj;\n}\n\nfunction inPointRange(point, center, radius, borderWidth) {\n  if (!point || !center || radius <= 0) {\n    return false;\n  }\n  const hBorderWidth = borderWidth / 2 || 0;\n  return (Math.pow(point.x - center.x, 2) + Math.pow(point.y - center.y, 2)) <= Math.pow(radius + hBorderWidth, 2);\n}\n\nfunction inBoxRange(mouseX, mouseY, {x, y, width, height}, borderWidth) {\n  const hBorderWidth = borderWidth / 2;\n  return mouseX >= x - hBorderWidth - EPSILON &&\n         mouseX <= x + width + hBorderWidth + EPSILON &&\n         mouseY >= y - hBorderWidth - EPSILON &&\n         mouseY <= y + height + hBorderWidth + EPSILON;\n}\n\nfunction getElementCenterPoint(element, useFinalPosition) {\n  const {x, y} = element.getProps(['x', 'y'], useFinalPosition);\n  return {x, y};\n}\n\nconst isOlderPart = (act, req) => req > act || (act.length > req.length && act.substr(0, req.length) === req);\n\nfunction requireVersion(pkg, min, ver, strict = true) {\n  const parts = ver.split('.');\n  let i = 0;\n  for (const req of min.split('.')) {\n    const act = parts[i++];\n    if (parseInt(req, 10) < parseInt(act, 10)) {\n      break;\n    }\n    if (isOlderPart(act, req)) {\n      if (strict) {\n        throw new Error(`${pkg} v${ver} is not supported. v${min} or newer is required.`);\n      } else {\n        return false;\n      }\n    }\n  }\n  return true;\n}\n\nconst isPercentString = (s) => typeof s === 'string' && s.endsWith('%');\nconst toPercent = (s) => clamp(parseFloat(s) / 100, 0, 1);\n\nfunction getRelativePosition(size, positionOption) {\n  if (positionOption === 'start') {\n    return 0;\n  }\n  if (positionOption === 'end') {\n    return size;\n  }\n  if (isPercentString(positionOption)) {\n    return toPercent(positionOption) * size;\n  }\n  return size / 2;\n}\n\nfunction getSize(size, value) {\n  if (typeof value === 'number') {\n    return value;\n  } else if (isPercentString(value)) {\n    return toPercent(value) * size;\n  }\n  return size;\n}\n\nfunction calculateTextAlignment(size, options) {\n  const {x, width} = size;\n  const textAlign = options.textAlign;\n  if (textAlign === 'center') {\n    return x + width / 2;\n  } else if (textAlign === 'end' || textAlign === 'right') {\n    return x + width;\n  }\n  return x;\n}\n\nfunction toPosition(value) {\n  if (isObject(value)) {\n    return {\n      x: valueOrDefault(value.x, 'center'),\n      y: valueOrDefault(value.y, 'center'),\n    };\n  }\n  value = valueOrDefault(value, 'center');\n  return {\n    x: value,\n    y: value\n  };\n}\n\nfunction isBoundToPoint(options) {\n  return options && (defined(options.xValue) || defined(options.yValue));\n}\n\nconst widthCache = new Map();\n\n/**\n * Determine if content is an image or a canvas.\n * @param {*} content\n * @returns boolean|undefined\n * @todo move this function to chart.js helpers\n */\nfunction isImageOrCanvas(content) {\n  if (content && typeof content === 'object') {\n    const type = content.toString();\n    return (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]');\n  }\n}\n\n/**\n * Set the translation on the canvas if the rotation must be applied.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Element} element - annotation element to use for applying the translation\n * @param {number} rotation - rotation (in degrees) to apply\n */\nfunction translate(ctx, element, rotation) {\n  if (rotation) {\n    const center = element.getCenterPoint();\n    ctx.translate(center.x, center.y);\n    ctx.rotate(toRadians(rotation));\n    ctx.translate(-center.x, -center.y);\n  }\n}\n\n/**\n * Apply border options to the canvas context before drawing a shape\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Object} options - options with border configuration\n * @returns {boolean} true is the border options have been applied\n */\nfunction setBorderStyle(ctx, options) {\n  if (options && options.borderWidth) {\n    ctx.lineCap = options.borderCapStyle;\n    ctx.setLineDash(options.borderDash);\n    ctx.lineDashOffset = options.borderDashOffset;\n    ctx.lineJoin = options.borderJoinStyle;\n    ctx.lineWidth = options.borderWidth;\n    ctx.strokeStyle = options.borderColor;\n    return true;\n  }\n}\n\n/**\n * Apply shadow options to the canvas context before drawing a shape\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Object} options - options with shadow configuration\n */\nfunction setShadowStyle(ctx, options) {\n  ctx.shadowColor = options.backgroundShadowColor;\n  ctx.shadowBlur = options.shadowBlur;\n  ctx.shadowOffsetX = options.shadowOffsetX;\n  ctx.shadowOffsetY = options.shadowOffsetY;\n}\n\n/**\n * Measure the label size using the label options.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Object} options - options to configure the label\n * @returns {{width: number, height: number}} the measured size of the label\n */\nfunction measureLabelSize(ctx, options) {\n  const content = options.content;\n  if (isImageOrCanvas(content)) {\n    return {\n      width: getSize(content.width, options.width),\n      height: getSize(content.height, options.height)\n    };\n  }\n  const font = toFont(options.font);\n  const strokeWidth = options.textStrokeWidth;\n  const lines = isArray(content) ? content : [content];\n  const mapKey = lines.join() + font.string + strokeWidth + (ctx._measureText ? '-spriting' : '');\n  if (!widthCache.has(mapKey)) {\n    ctx.save();\n    ctx.font = font.string;\n    const count = lines.length;\n    let width = 0;\n    for (let i = 0; i < count; i++) {\n      const text = lines[i];\n      width = Math.max(width, ctx.measureText(text).width + strokeWidth);\n    }\n    ctx.restore();\n    const height = count * font.lineHeight + strokeWidth;\n    widthCache.set(mapKey, {width, height});\n  }\n  return widthCache.get(mapKey);\n}\n\n/**\n * Draw a box with the size and the styling options.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {{x: number, y: number, width: number, height: number}} rect - rect to draw\n * @param {Object} options - options to style the box\n * @returns {undefined}\n */\nfunction drawBox(ctx, rect, options) {\n  const {x, y, width, height} = rect;\n  ctx.save();\n  setShadowStyle(ctx, options);\n  const stroke = setBorderStyle(ctx, options);\n  ctx.fillStyle = options.backgroundColor;\n  ctx.beginPath();\n  addRoundedRectPath(ctx, {\n    x, y, w: width, h: height,\n    // TODO: v2 remove support for cornerRadius\n    radius: clampAll(toTRBLCorners(valueOrDefault(options.cornerRadius, options.borderRadius)), 0, Math.min(width, height) / 2)\n  });\n  ctx.closePath();\n  ctx.fill();\n  if (stroke) {\n    ctx.shadowColor = options.borderShadowColor;\n    ctx.stroke();\n  }\n  ctx.restore();\n}\n\n/**\n * Draw a label with the size and the styling options.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {{x: number, y: number, width: number, height: number}} rect - rect to map teh label\n * @param {Object} options - options to style the label\n * @returns {undefined}\n */\nfunction drawLabel(ctx, rect, options) {\n  const content = options.content;\n  if (isImageOrCanvas(content)) {\n    ctx.drawImage(content, rect.x, rect.y, rect.width, rect.height);\n    return;\n  }\n  const labels = isArray(content) ? content : [content];\n  const font = toFont(options.font);\n  const lh = font.lineHeight;\n  const x = calculateTextAlignment(rect, options);\n  const y = rect.y + (lh / 2) + options.textStrokeWidth / 2;\n  ctx.save();\n  ctx.font = font.string;\n  ctx.textBaseline = 'middle';\n  ctx.textAlign = options.textAlign;\n  if (setTextStrokeStyle(ctx, options)) {\n    labels.forEach((l, i) => ctx.strokeText(l, x, y + (i * lh)));\n  }\n  ctx.fillStyle = options.color;\n  labels.forEach((l, i) => ctx.fillText(l, x, y + (i * lh)));\n  ctx.restore();\n}\n\nfunction setTextStrokeStyle(ctx, options) {\n  if (options.textStrokeWidth > 0) {\n    // https://stackoverflow.com/questions/13627111/drawing-text-with-an-outer-stroke-with-html5s-canvas\n    ctx.lineJoin = 'round';\n    ctx.miterLimit = 2;\n    ctx.lineWidth = options.textStrokeWidth;\n    ctx.strokeStyle = options.textStrokeColor;\n    return true;\n  }\n}\n\n/**\n * @typedef {import('chart.js').Point} Point\n */\n\n/**\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @returns {Point}\n */\nfunction getRectCenterPoint(rect) {\n  const {x, y, width, height} = rect;\n  return {\n    x: x + width / 2,\n    y: y + height / 2\n  };\n}\n\n/**\n * Rotate a `point` relative to `center` point by `angle`\n * @param {Point} point - the point to rotate\n * @param {Point} center - center point for rotation\n * @param {number} angle - angle for rotation, in radians\n * @returns {Point} rotated point\n */\nfunction rotated(point, center, angle) {\n  const cos = Math.cos(angle);\n  const sin = Math.sin(angle);\n  const cx = center.x;\n  const cy = center.y;\n\n  return {\n    x: cx + cos * (point.x - cx) - sin * (point.y - cy),\n    y: cy + sin * (point.x - cx) + cos * (point.y - cy)\n  };\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import(\"chart.js\").Point } Point\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n */\n\n/**\n * @param {Scale} scale\n * @param {number|string} value\n * @param {number} fallback\n * @returns {number}\n */\nfunction scaleValue(scale, value, fallback) {\n  value = typeof value === 'number' ? value : scale.parse(value);\n  return isFinite(value) ? scale.getPixelForValue(value) : fallback;\n}\n\n/**\n * @param {Scale} scale\n * @param {{start: number, end: number}} options\n * @returns {{start: number, end: number}}\n */\nfunction getChartDimensionByScale(scale, options) {\n  if (scale) {\n    const min = scaleValue(scale, options.min, options.start);\n    const max = scaleValue(scale, options.max, options.end);\n    return {\n      start: Math.min(min, max),\n      end: Math.max(min, max)\n    };\n  }\n  return {\n    start: options.start,\n    end: options.end\n  };\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {Point}\n */\nfunction getChartPoint(chart, options) {\n  const {chartArea, scales} = chart;\n  const xScale = scales[options.xScaleID];\n  const yScale = scales[options.yScaleID];\n  let x = chartArea.width / 2;\n  let y = chartArea.height / 2;\n\n  if (xScale) {\n    x = scaleValue(xScale, options.xValue, x);\n  }\n\n  if (yScale) {\n    y = scaleValue(yScale, options.yValue, y);\n  }\n  return {x, y};\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {{x?:number, y?: number, x2?: number, y2?: number, width?: number, height?: number}}\n */\nfunction getChartRect(chart, options) {\n  const xScale = chart.scales[options.xScaleID];\n  const yScale = chart.scales[options.yScaleID];\n  let {top: y, left: x, bottom: y2, right: x2} = chart.chartArea;\n\n  if (!xScale && !yScale) {\n    return {};\n  }\n\n  const xDim = getChartDimensionByScale(xScale, {min: options.xMin, max: options.xMax, start: x, end: x2});\n  x = xDim.start;\n  x2 = xDim.end;\n  const yDim = getChartDimensionByScale(yScale, {min: options.yMin, max: options.yMax, start: y, end: y2});\n  y = yDim.start;\n  y2 = yDim.end;\n\n  return {\n    x,\n    y,\n    x2,\n    y2,\n    width: x2 - x,\n    height: y2 - y\n  };\n}\n\n/**\n * @param {Chart} chart\n * @param {PointAnnotationOptions} options\n */\nfunction getChartCircle(chart, options) {\n  const point = getChartPoint(chart, options);\n  return {\n    x: point.x + options.xAdjust,\n    y: point.y + options.yAdjust,\n    width: options.radius * 2,\n    height: options.radius * 2\n  };\n}\n\n/**\n * @param {Chart} chart\n * @param {PointAnnotationOptions} options\n * @returns\n */\nfunction resolvePointPosition(chart, options) {\n  if (!isBoundToPoint(options)) {\n    const box = getChartRect(chart, options);\n    const point = getRectCenterPoint(box);\n    let radius = options.radius;\n    if (!radius || isNaN(radius)) {\n      radius = Math.min(box.width, box.height) / 2;\n      options.radius = radius;\n    }\n    return {\n      x: point.x + options.xAdjust,\n      y: point.y + options.yAdjust,\n      width: radius * 2,\n      height: radius * 2\n    };\n  }\n  return getChartCircle(chart, options);\n}\n\nclass BoxAnnotation extends Element {\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n    return inBoxRange(x, y, this.getProps(['x', 'y', 'width', 'height'], useFinalPosition), this.options.borderWidth);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getRectCenterPoint(this.getProps(['x', 'y', 'width', 'height'], useFinalPosition));\n  }\n\n  draw(ctx) {\n    ctx.save();\n    translate(ctx, this, this.options.rotation);\n    drawBox(ctx, this, this.options);\n    ctx.restore();\n  }\n\n  drawLabel(ctx) {\n    const {x, y, width, height, options} = this;\n    const {label, borderWidth} = options;\n    const halfBorder = borderWidth / 2;\n    const position = toPosition(label.position);\n    const padding = toPadding(label.padding);\n    const labelSize = measureLabelSize(ctx, label);\n    const labelRect = {\n      x: calculateX(this, labelSize, position, padding),\n      y: calculateY(this, labelSize, position, padding),\n      width: labelSize.width,\n      height: labelSize.height\n    };\n\n    ctx.save();\n    translate(ctx, this, label.rotation);\n    ctx.beginPath();\n    ctx.rect(x + halfBorder + padding.left, y + halfBorder + padding.top,\n      width - borderWidth - padding.width, height - borderWidth - padding.height);\n    ctx.clip();\n    drawLabel(ctx, labelRect, label);\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    return getChartRect(chart, options);\n  }\n}\n\nBoxAnnotation.id = 'boxAnnotation';\n\nBoxAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderRadius: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  cornerRadius: undefined, // TODO: v2 remove support for cornerRadius\n  display: true,\n  label: {\n    borderWidth: undefined,\n    color: 'black',\n    content: null,\n    drawTime: undefined,\n    enabled: false,\n    font: {\n      family: undefined,\n      lineHeight: undefined,\n      size: undefined,\n      style: undefined,\n      weight: 'bold'\n    },\n    height: undefined,\n    padding: 6,\n    position: 'center',\n    rotation: undefined,\n    textAlign: 'start',\n    textStrokeColor: undefined,\n    textStrokeWidth: 0,\n    xAdjust: 0,\n    yAdjust: 0,\n    width: undefined\n  },\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y'\n};\n\nBoxAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nBoxAnnotation.descriptors = {\n  label: {\n    _fallback: true\n  }\n};\n\nfunction calculateX(box, labelSize, position, padding) {\n  const {x: start, x2: end, width: size, options} = box;\n  const {xAdjust: adjust, borderWidth} = options.label;\n  return calculatePosition$1({start, end, size}, {\n    position: position.x,\n    padding: {start: padding.left, end: padding.right},\n    adjust, borderWidth,\n    size: labelSize.width\n  });\n}\n\nfunction calculateY(box, labelSize, position, padding) {\n  const {y: start, y2: end, height: size, options} = box;\n  const {yAdjust: adjust, borderWidth} = options.label;\n  return calculatePosition$1({start, end, size}, {\n    position: position.y,\n    padding: {start: padding.top, end: padding.bottom},\n    adjust, borderWidth,\n    size: labelSize.height\n  });\n}\n\nfunction calculatePosition$1(boxOpts, labelOpts) {\n  const {start, end} = boxOpts;\n  const {position, padding: {start: padStart, end: padEnd}, adjust, borderWidth} = labelOpts;\n  const availableSize = end - borderWidth - start - padStart - padEnd - labelOpts.size;\n  return start + borderWidth / 2 + adjust + padStart + getRelativePosition(availableSize, position);\n}\n\nconst pointInLine = (p1, p2, t) => ({x: p1.x + t * (p2.x - p1.x), y: p1.y + t * (p2.y - p1.y)});\nconst interpolateX = (y, p1, p2) => pointInLine(p1, p2, Math.abs((y - p1.y) / (p2.y - p1.y))).x;\nconst interpolateY = (x, p1, p2) => pointInLine(p1, p2, Math.abs((x - p1.x) / (p2.x - p1.x))).y;\nconst sqr = v => v * v;\nconst defaultEpsilon = 0.001;\n\nfunction isLineInArea({x, y, x2, y2}, {top, right, bottom, left}) {\n  return !(\n    (x < left && x2 < left) ||\n    (x > right && x2 > right) ||\n    (y < top && y2 < top) ||\n    (y > bottom && y2 > bottom)\n  );\n}\n\nfunction limitPointToArea({x, y}, p2, {top, right, bottom, left}) {\n  if (x < left) {\n    y = interpolateY(left, {x, y}, p2);\n    x = left;\n  }\n  if (x > right) {\n    y = interpolateY(right, {x, y}, p2);\n    x = right;\n  }\n  if (y < top) {\n    x = interpolateX(top, {x, y}, p2);\n    y = top;\n  }\n  if (y > bottom) {\n    x = interpolateX(bottom, {x, y}, p2);\n    y = bottom;\n  }\n  return {x, y};\n}\n\nfunction limitLineToArea(p1, p2, area) {\n  const {x, y} = limitPointToArea(p1, p2, area);\n  const {x: x2, y: y2} = limitPointToArea(p2, p1, area);\n  return {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n}\n\nclass LineAnnotation extends Element {\n\n  // TODO: make private in v2\n  intersects(x, y, epsilon = defaultEpsilon, useFinalPosition) {\n    // Adapted from https://stackoverflow.com/a/6853926/25507\n    const {x: x1, y: y1, x2, y2} = this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n    const dx = x2 - x1;\n    const dy = y2 - y1;\n    const lenSq = sqr(dx) + sqr(dy);\n    const t = lenSq === 0 ? -1 : ((x - x1) * dx + (y - y1) * dy) / lenSq;\n    let xx, yy;\n    if (t < 0) {\n      xx = x1;\n      yy = y1;\n    } else if (t > 1) {\n      xx = x2;\n      yy = y2;\n    } else {\n      xx = x1 + t * dx;\n      yy = y1 + t * dy;\n    }\n    return (sqr(x - xx) + sqr(y - yy)) <= epsilon;\n  }\n\n  /**\n   * @todo make private in v2\n   * @param {boolean} useFinalPosition - use the element's animation target instead of current position\n   * @param {top, right, bottom, left} [chartArea] - optional, area of the chart\n   * @returns {boolean} true if the label is visible\n   */\n  labelIsVisible(useFinalPosition, chartArea) {\n    const labelOpts = this.options.label;\n    if (!labelOpts || !labelOpts.enabled) {\n      return false;\n    }\n    return !chartArea || isLineInArea(this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), chartArea);\n  }\n\n  // TODO: make private in v2\n  isOnLabel(mouseX, mouseY, useFinalPosition) {\n    if (!this.labelIsVisible(useFinalPosition)) {\n      return false;\n    }\n    const {labelX, labelY, labelWidth, labelHeight, labelRotation} = this.getProps(['labelX', 'labelY', 'labelWidth', 'labelHeight', 'labelRotation'], useFinalPosition);\n    const {x, y} = rotated({x: mouseX, y: mouseY}, {x: labelX, y: labelY}, -labelRotation);\n    const hBorderWidth = this.options.label.borderWidth / 2 || 0;\n    const w2 = labelWidth / 2 + hBorderWidth;\n    const h2 = labelHeight / 2 + hBorderWidth;\n    return x >= labelX - w2 - defaultEpsilon && x <= labelX + w2 + defaultEpsilon &&\n      y >= labelY - h2 - defaultEpsilon && y <= labelY + h2 + defaultEpsilon;\n  }\n\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const epsilon = sqr(this.options.borderWidth / 2);\n    return this.intersects(mouseX, mouseY, epsilon, useFinalPosition) || this.isOnLabel(mouseX, mouseY, useFinalPosition);\n  }\n\n  getCenterPoint() {\n    return {\n      x: (this.x2 + this.x) / 2,\n      y: (this.y2 + this.y) / 2\n    };\n  }\n\n  draw(ctx) {\n    const {x, y, x2, y2, options} = this;\n\n    ctx.save();\n    if (!setBorderStyle(ctx, options)) {\n      // no border width, then line is not drawn\n      return ctx.restore();\n    }\n    setShadowStyle(ctx, options);\n    const angle = Math.atan2(y2 - y, x2 - x);\n    const length = Math.sqrt(Math.pow(x2 - x, 2) + Math.pow(y2 - y, 2));\n    const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(this);\n\n    ctx.translate(x, y);\n    ctx.rotate(angle);\n    ctx.beginPath();\n    ctx.moveTo(0 + startAdjust, 0);\n    ctx.lineTo(length - endAdjust, 0);\n    ctx.shadowColor = options.borderShadowColor;\n    ctx.stroke();\n    drawArrowHead(ctx, 0, startAdjust, startOpts);\n    drawArrowHead(ctx, length, -endAdjust, endOpts);\n    ctx.restore();\n  }\n\n  drawLabel(ctx, chartArea) {\n    if (!this.labelIsVisible(false, chartArea)) {\n      return;\n    }\n    const {labelX, labelY, labelWidth, labelHeight, labelRotation, labelPadding, labelTextSize, options: {label}} = this;\n\n    ctx.save();\n    ctx.translate(labelX, labelY);\n    ctx.rotate(labelRotation);\n\n    const boxRect = {\n      x: -(labelWidth / 2),\n      y: -(labelHeight / 2),\n      width: labelWidth,\n      height: labelHeight\n    };\n    drawBox(ctx, boxRect, label);\n\n    const labelTextRect = {\n      x: -(labelWidth / 2) + labelPadding.left + label.borderWidth / 2,\n      y: -(labelHeight / 2) + labelPadding.top + label.borderWidth / 2,\n      width: labelTextSize.width,\n      height: labelTextSize.height\n    };\n    drawLabel(ctx, labelTextRect, label);\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    const scale = chart.scales[options.scaleID];\n    let {top: y, left: x, bottom: y2, right: x2} = chart.chartArea;\n    let min, max;\n\n    if (scale) {\n      min = scaleValue(scale, options.value, NaN);\n      max = scaleValue(scale, options.endValue, min);\n      if (scale.isHorizontal()) {\n        x = min;\n        x2 = max;\n      } else {\n        y = min;\n        y2 = max;\n      }\n    } else {\n      const xScale = chart.scales[options.xScaleID];\n      const yScale = chart.scales[options.yScaleID];\n\n      if (xScale) {\n        x = scaleValue(xScale, options.xMin, x);\n        x2 = scaleValue(xScale, options.xMax, x2);\n      }\n\n      if (yScale) {\n        y = scaleValue(yScale, options.yMin, y);\n        y2 = scaleValue(yScale, options.yMax, y2);\n      }\n    }\n    const inside = isLineInArea({x, y, x2, y2}, chart.chartArea);\n    const properties = inside\n      ? limitLineToArea({x, y}, {x: x2, y: y2}, chart.chartArea)\n      : {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n\n    const label = options.label;\n    if (label && label.content) {\n      return loadLabelRect(properties, chart, label);\n    }\n    return properties;\n  }\n}\n\nLineAnnotation.id = 'lineAnnotation';\n\nconst arrowHeadsDefaults = {\n  backgroundColor: undefined,\n  backgroundShadowColor: undefined,\n  borderColor: undefined,\n  borderDash: undefined,\n  borderDashOffset: undefined,\n  borderShadowColor: undefined,\n  borderWidth: undefined,\n  enabled: undefined,\n  fill: undefined,\n  length: undefined,\n  shadowBlur: undefined,\n  shadowOffsetX: undefined,\n  shadowOffsetY: undefined,\n  width: undefined\n};\n\nLineAnnotation.defaults = {\n  adjustScaleRange: true,\n  arrowHeads: {\n    enabled: false,\n    end: Object.assign({}, arrowHeadsDefaults),\n    fill: false,\n    length: 12,\n    start: Object.assign({}, arrowHeadsDefaults),\n    width: 6\n  },\n  borderDash: [],\n  borderDashOffset: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 2,\n  display: true,\n  endValue: undefined,\n  label: {\n    backgroundColor: 'rgba(0,0,0,0.8)',\n    backgroundShadowColor: 'transparent',\n    borderCapStyle: 'butt',\n    borderColor: 'black',\n    borderDash: [],\n    borderDashOffset: 0,\n    borderJoinStyle: 'miter',\n    borderRadius: 6,\n    borderShadowColor: 'transparent',\n    borderWidth: 0,\n    color: '#fff',\n    content: null,\n    cornerRadius: undefined, // TODO: v2 remove support for cornerRadius\n    drawTime: undefined,\n    enabled: false,\n    font: {\n      family: undefined,\n      lineHeight: undefined,\n      size: undefined,\n      style: undefined,\n      weight: 'bold'\n    },\n    height: undefined,\n    padding: 6,\n    position: 'center',\n    rotation: 0,\n    shadowBlur: 0,\n    shadowOffsetX: 0,\n    shadowOffsetY: 0,\n    textAlign: 'center',\n    textStrokeColor: undefined,\n    textStrokeWidth: 0,\n    width: undefined,\n    xAdjust: 0,\n    xPadding: undefined, // TODO: v2 remove support for xPadding\n    yAdjust: 0,\n    yPadding: undefined, // TODO: v2 remove support for yPadding\n  },\n  scaleID: undefined,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  value: undefined,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y'\n};\n\nLineAnnotation.descriptors = {\n  arrowHeads: {\n    start: {\n      _fallback: true\n    },\n    end: {\n      _fallback: true\n    },\n    _fallback: true\n  }\n};\n\nLineAnnotation.defaultRoutes = {\n  borderColor: 'color'\n};\n\nfunction loadLabelRect(line, chart, options) {\n  // TODO: v2 remove support for xPadding and yPadding\n  const {padding: lblPadding, xPadding, yPadding, borderWidth} = options;\n  const padding = getPadding(lblPadding, xPadding, yPadding);\n  const textSize = measureLabelSize(chart.ctx, options);\n  const width = textSize.width + padding.width + borderWidth;\n  const height = textSize.height + padding.height + borderWidth;\n  const labelRect = calculateLabelPosition(line, options, {width, height, padding}, chart.chartArea);\n  line.labelX = labelRect.x;\n  line.labelY = labelRect.y;\n  line.labelWidth = labelRect.width;\n  line.labelHeight = labelRect.height;\n  line.labelRotation = labelRect.rotation;\n  line.labelPadding = padding;\n  line.labelTextSize = textSize;\n  return line;\n}\n\nfunction calculateAutoRotation(line) {\n  const {x, y, x2, y2} = line;\n  const rotation = Math.atan2(y2 - y, x2 - x);\n  // Flip the rotation if it goes > PI/2 or < -PI/2, so label stays upright\n  return rotation > PI / 2 ? rotation - PI : rotation < PI / -2 ? rotation + PI : rotation;\n}\n\n// TODO: v2 remove support for xPadding and yPadding\nfunction getPadding(padding, xPadding, yPadding) {\n  let tempPadding = padding;\n  if (xPadding || yPadding) {\n    tempPadding = {x: xPadding || 6, y: yPadding || 6};\n  }\n  return toPadding(tempPadding);\n}\n\nfunction calculateLabelPosition(line, label, sizes, chartArea) {\n  const {width, height, padding} = sizes;\n  const {xAdjust, yAdjust} = label;\n  const p1 = {x: line.x, y: line.y};\n  const p2 = {x: line.x2, y: line.y2};\n  const rotation = label.rotation === 'auto' ? calculateAutoRotation(line) : toRadians(label.rotation);\n  const size = rotatedSize(width, height, rotation);\n  const t = calculateT(line, label, {labelSize: size, padding}, chartArea);\n  const pt = pointInLine(p1, p2, t);\n  const xCoordinateSizes = {size: size.w, min: chartArea.left, max: chartArea.right, padding: padding.left};\n  const yCoordinateSizes = {size: size.h, min: chartArea.top, max: chartArea.bottom, padding: padding.top};\n\n  return {\n    x: adjustLabelCoordinate(pt.x, xCoordinateSizes) + xAdjust,\n    y: adjustLabelCoordinate(pt.y, yCoordinateSizes) + yAdjust,\n    width,\n    height,\n    rotation\n  };\n}\n\nfunction rotatedSize(width, height, rotation) {\n  const cos = Math.cos(rotation);\n  const sin = Math.sin(rotation);\n  return {\n    w: Math.abs(width * cos) + Math.abs(height * sin),\n    h: Math.abs(width * sin) + Math.abs(height * cos)\n  };\n}\n\nfunction calculateT(line, label, sizes, chartArea) {\n  let t;\n  const space = spaceAround(line, chartArea);\n  if (label.position === 'start') {\n    t = calculateTAdjust({w: line.x2 - line.x, h: line.y2 - line.y}, sizes, label, space);\n  } else if (label.position === 'end') {\n    t = 1 - calculateTAdjust({w: line.x - line.x2, h: line.y - line.y2}, sizes, label, space);\n  } else {\n    t = getRelativePosition(1, label.position);\n  }\n  return t;\n}\n\nfunction calculateTAdjust(lineSize, sizes, label, space) {\n  const {labelSize, padding} = sizes;\n  const lineW = lineSize.w * space.dx;\n  const lineH = lineSize.h * space.dy;\n  const x = (lineW > 0) && ((labelSize.w / 2 + padding.left - space.x) / lineW);\n  const y = (lineH > 0) && ((labelSize.h / 2 + padding.top - space.y) / lineH);\n  return clamp(Math.max(x, y), 0, 0.25);\n}\n\nfunction spaceAround(line, chartArea) {\n  const {x, x2, y, y2} = line;\n  const t = Math.min(y, y2) - chartArea.top;\n  const l = Math.min(x, x2) - chartArea.left;\n  const b = chartArea.bottom - Math.max(y, y2);\n  const r = chartArea.right - Math.max(x, x2);\n  return {\n    x: Math.min(l, r),\n    y: Math.min(t, b),\n    dx: l <= r ? 1 : -1,\n    dy: t <= b ? 1 : -1\n  };\n}\n\nfunction adjustLabelCoordinate(coordinate, labelSizes) {\n  const {size, min, max, padding} = labelSizes;\n  const halfSize = size / 2;\n  if (size > max - min) {\n    // if it does not fit, display as much as possible\n    return (max + min) / 2;\n  }\n  if (min >= (coordinate - padding - halfSize)) {\n    coordinate = min + padding + halfSize;\n  }\n  if (max <= (coordinate + padding + halfSize)) {\n    coordinate = max - padding - halfSize;\n  }\n  return coordinate;\n}\n\nfunction getArrowHeads(line) {\n  const options = line.options;\n  const arrowStartOpts = options.arrowHeads && options.arrowHeads.start;\n  const arrowEndOpts = options.arrowHeads && options.arrowHeads.end;\n  return {\n    startOpts: arrowStartOpts,\n    endOpts: arrowEndOpts,\n    startAdjust: getLineAdjust(line, arrowStartOpts),\n    endAdjust: getLineAdjust(line, arrowEndOpts)\n  };\n}\n\nfunction getLineAdjust(line, arrowOpts) {\n  if (!arrowOpts || !arrowOpts.enabled) {\n    return 0;\n  }\n  const {length, width} = arrowOpts;\n  const adjust = line.options.borderWidth / 2;\n  const p1 = {x: length, y: width + adjust};\n  const p2 = {x: 0, y: adjust};\n  return Math.abs(interpolateX(0, p1, p2));\n}\n\nfunction drawArrowHead(ctx, offset, adjust, arrowOpts) {\n  if (!arrowOpts || !arrowOpts.enabled) {\n    return;\n  }\n  const {length, width, fill, backgroundColor, borderColor} = arrowOpts;\n  const arrowOffsetX = Math.abs(offset - length) + adjust;\n  ctx.beginPath();\n  setShadowStyle(ctx, arrowOpts);\n  setBorderStyle(ctx, arrowOpts);\n  ctx.moveTo(arrowOffsetX, -width);\n  ctx.lineTo(offset + adjust, 0);\n  ctx.lineTo(arrowOffsetX, width);\n  if (fill === true) {\n    ctx.fillStyle = backgroundColor || borderColor;\n    ctx.closePath();\n    ctx.fill();\n    ctx.shadowColor = 'transparent';\n  } else {\n    ctx.shadowColor = arrowOpts.borderShadowColor;\n  }\n  ctx.stroke();\n}\n\nclass EllipseAnnotation extends Element {\n\n  inRange(mouseX, mouseY, useFinalPosition) {\n    return pointInEllipse({x: mouseX, y: mouseY}, this.getProps(['width', 'height'], useFinalPosition), this.options.rotation, this.options.borderWidth);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getRectCenterPoint(this.getProps(['x', 'y', 'width', 'height'], useFinalPosition));\n  }\n\n  draw(ctx) {\n    const {width, height, options} = this;\n    const center = this.getCenterPoint();\n\n    ctx.save();\n    translate(ctx, this, options.rotation);\n    setShadowStyle(ctx, this.options);\n    ctx.beginPath();\n    ctx.fillStyle = options.backgroundColor;\n    const stroke = setBorderStyle(ctx, options);\n    ctx.ellipse(center.x, center.y, height / 2, width / 2, PI / 2, 0, 2 * PI);\n    ctx.fill();\n    if (stroke) {\n      ctx.shadowColor = options.borderShadowColor;\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    return getChartRect(chart, options);\n  }\n\n}\n\nEllipseAnnotation.id = 'ellipseAnnotation';\n\nEllipseAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y'\n};\n\nEllipseAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nfunction pointInEllipse(p, ellipse, rotation, borderWidth) {\n  const {width, height} = ellipse;\n  const center = ellipse.getCenterPoint(true);\n  const xRadius = width / 2;\n  const yRadius = height / 2;\n\n  if (xRadius <= 0 || yRadius <= 0) {\n    return false;\n  }\n  // https://stackoverflow.com/questions/7946187/point-and-ellipse-rotated-position-test-algorithm\n  const angle = toRadians(rotation || 0);\n  const hBorderWidth = borderWidth / 2 || 0;\n  const cosAngle = Math.cos(angle);\n  const sinAngle = Math.sin(angle);\n  const a = Math.pow(cosAngle * (p.x - center.x) + sinAngle * (p.y - center.y), 2);\n  const b = Math.pow(sinAngle * (p.x - center.x) - cosAngle * (p.y - center.y), 2);\n  return (a / Math.pow(xRadius + hBorderWidth, 2)) + (b / Math.pow(yRadius + hBorderWidth, 2)) <= 1.0001;\n}\n\nclass LabelAnnotation extends Element {\n\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n    return inBoxRange(x, y, this.getProps(['x', 'y', 'width', 'height'], useFinalPosition), this.options.borderWidth);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getRectCenterPoint(this.getProps(['x', 'y', 'width', 'height'], useFinalPosition));\n  }\n\n  draw(ctx) {\n    if (!this.options.content) {\n      return;\n    }\n    const {labelX, labelY, labelWidth, labelHeight, options} = this;\n    ctx.save();\n    translate(ctx, this, options.rotation);\n    drawCallout(ctx, this);\n    drawBox(ctx, this, options);\n    drawLabel(ctx, {x: labelX, y: labelY, width: labelWidth, height: labelHeight}, options);\n    ctx.restore();\n  }\n\n  // TODO: make private in v2\n  resolveElementProperties(chart, options) {\n    const point = !isBoundToPoint(options) ? getRectCenterPoint(getChartRect(chart, options)) : getChartPoint(chart, options);\n    const padding = toPadding(options.padding);\n    const labelSize = measureLabelSize(chart.ctx, options);\n    const boxSize = measureRect(point, labelSize, options, padding);\n    const hBorderWidth = options.borderWidth / 2;\n    const properties = {\n      pointX: point.x,\n      pointY: point.y,\n      ...boxSize,\n      labelX: boxSize.x + padding.left + hBorderWidth,\n      labelY: boxSize.y + padding.top + hBorderWidth,\n      labelWidth: labelSize.width,\n      labelHeight: labelSize.height\n    };\n    properties.calloutPosition = options.callout.enabled && resolveCalloutPosition(properties, options.callout, options.rotation);\n    return properties;\n  }\n}\n\nLabelAnnotation.id = 'labelAnnotation';\n\nLabelAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundColor: 'transparent',\n  backgroundShadowColor: 'transparent',\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderRadius: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 0,\n  callout: {\n    borderCapStyle: 'butt',\n    borderColor: undefined,\n    borderDash: [],\n    borderDashOffset: 0,\n    borderJoinStyle: 'miter',\n    borderWidth: 1,\n    enabled: false,\n    margin: 5,\n    position: 'auto',\n    side: 5,\n    start: '50%',\n  },\n  color: 'black',\n  content: null,\n  display: true,\n  font: {\n    family: undefined,\n    lineHeight: undefined,\n    size: undefined,\n    style: undefined,\n    weight: undefined\n  },\n  height: undefined,\n  padding: 6,\n  position: 'center',\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  textAlign: 'center',\n  textStrokeColor: undefined,\n  textStrokeWidth: 0,\n  width: undefined,\n  xAdjust: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  xValue: undefined,\n  yAdjust: 0,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y',\n  yValue: undefined\n};\n\nLabelAnnotation.defaultRoutes = {\n  borderColor: 'color'\n};\n\nfunction measureRect(point, size, options, padding) {\n  const width = size.width + padding.width + options.borderWidth;\n  const height = size.height + padding.height + options.borderWidth;\n  const position = toPosition(options.position);\n\n  return {\n    x: calculatePosition(point.x, width, options.xAdjust, position.x),\n    y: calculatePosition(point.y, height, options.yAdjust, position.y),\n    width,\n    height\n  };\n}\n\nfunction calculatePosition(start, size, adjust = 0, position) {\n  return start - getRelativePosition(size, position) + adjust;\n}\n\nfunction drawCallout(ctx, element) {\n  const {pointX, pointY, calloutPosition, options} = element;\n  if (!calloutPosition || element.inRange(pointX, pointY)) {\n    return;\n  }\n  const callout = options.callout;\n\n  ctx.save();\n  ctx.beginPath();\n  const stroke = setBorderStyle(ctx, callout);\n  if (!stroke) {\n    return ctx.restore();\n  }\n  const {separatorStart, separatorEnd} = getCalloutSeparatorCoord(element, calloutPosition);\n  const {sideStart, sideEnd} = getCalloutSideCoord(element, calloutPosition, separatorStart);\n  if (callout.margin > 0 || options.borderWidth === 0) {\n    ctx.moveTo(separatorStart.x, separatorStart.y);\n    ctx.lineTo(separatorEnd.x, separatorEnd.y);\n  }\n  ctx.moveTo(sideStart.x, sideStart.y);\n  ctx.lineTo(sideEnd.x, sideEnd.y);\n  const rotatedPoint = rotated({x: pointX, y: pointY}, element.getCenterPoint(), toRadians(-options.rotation));\n  ctx.lineTo(rotatedPoint.x, rotatedPoint.y);\n  ctx.stroke();\n  ctx.restore();\n}\n\nfunction getCalloutSeparatorCoord(element, position) {\n  const {x, y, width, height} = element;\n  const adjust = getCalloutSeparatorAdjust(element, position);\n  let separatorStart, separatorEnd;\n  if (position === 'left' || position === 'right') {\n    separatorStart = {x: x + adjust, y};\n    separatorEnd = {x: separatorStart.x, y: separatorStart.y + height};\n  } else {\n    //  position 'top' or 'bottom'\n    separatorStart = {x, y: y + adjust};\n    separatorEnd = {x: separatorStart.x + width, y: separatorStart.y};\n  }\n  return {separatorStart, separatorEnd};\n}\n\nfunction getCalloutSeparatorAdjust(element, position) {\n  const {width, height, options} = element;\n  const adjust = options.callout.margin + options.borderWidth / 2;\n  if (position === 'right') {\n    return width + adjust;\n  } else if (position === 'bottom') {\n    return height + adjust;\n  }\n  return -adjust;\n}\n\nfunction getCalloutSideCoord(element, position, separatorStart) {\n  const {y, width, height, options} = element;\n  const start = options.callout.start;\n  const side = getCalloutSideAdjust(position, options.callout);\n  let sideStart, sideEnd;\n  if (position === 'left' || position === 'right') {\n    sideStart = {x: separatorStart.x, y: y + getSize(height, start)};\n    sideEnd = {x: sideStart.x + side, y: sideStart.y};\n  } else {\n    //  position 'top' or 'bottom'\n    sideStart = {x: separatorStart.x + getSize(width, start), y: separatorStart.y};\n    sideEnd = {x: sideStart.x, y: sideStart.y + side};\n  }\n  return {sideStart, sideEnd};\n}\n\nfunction getCalloutSideAdjust(position, options) {\n  const side = options.side;\n  if (position === 'left' || position === 'top') {\n    return -side;\n  }\n  return side;\n}\n\nfunction resolveCalloutPosition(properties, options, rotation) {\n  const position = options.position;\n  if (position === 'left' || position === 'right' || position === 'top' || position === 'bottom') {\n    return position;\n  }\n  return resolveCalloutAutoPosition(properties, options, rotation);\n}\n\nconst positions = ['left', 'bottom', 'top', 'right'];\n\nfunction resolveCalloutAutoPosition(properties, options, rotation) {\n  const {x, y, width, height, pointX, pointY} = properties;\n  const center = {x: x + width / 2, y: y + height / 2};\n  const start = options.start;\n  const xAdjust = getSize(width, start);\n  const yAdjust = getSize(height, start);\n  const xPoints = [x, x + xAdjust, x + xAdjust, x + width];\n  const yPoints = [y + yAdjust, y + height, y, y + yAdjust];\n  const result = [];\n  for (let index = 0; index < 4; index++) {\n    const rotatedPoint = rotated({x: xPoints[index], y: yPoints[index]}, center, toRadians(rotation));\n    result.push({\n      position: positions[index],\n      distance: distanceBetweenPoints(rotatedPoint, {x: pointX, y: pointY})\n    });\n  }\n  return result.sort((a, b) => a.distance - b.distance)[0].position;\n}\n\nclass PointAnnotation extends Element {\n\n  inRange(mouseX, mouseY, useFinalPosition) {\n    const {width} = this.getProps(['width'], useFinalPosition);\n    return inPointRange({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), width / 2, this.options.borderWidth);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const options = this.options;\n    const borderWidth = options.borderWidth;\n    if (options.radius < 0.1) {\n      return;\n    }\n    ctx.save();\n    ctx.fillStyle = options.backgroundColor;\n    setShadowStyle(ctx, options);\n    const stroke = setBorderStyle(ctx, options);\n    options.borderWidth = 0;\n    drawPoint(ctx, options, this.x, this.y);\n    if (stroke && !isImageOrCanvas(options.pointStyle)) {\n      ctx.shadowColor = options.borderShadowColor;\n      ctx.stroke();\n    }\n    ctx.restore();\n    options.borderWidth = borderWidth;\n  }\n\n  resolveElementProperties(chart, options) {\n    return resolvePointPosition(chart, options);\n  }\n}\n\nPointAnnotation.id = 'pointAnnotation';\n\nPointAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  pointStyle: 'circle',\n  radius: 10,\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  xAdjust: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  xValue: undefined,\n  yAdjust: 0,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y',\n  yValue: undefined\n};\n\nPointAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\nclass PolygonAnnotation extends Element {\n  inRange(mouseX, mouseY, useFinalPosition) {\n    return this.options.radius >= 0.1 && this.elements.length > 1 && pointIsInPolygon(this.elements, mouseX, mouseY, useFinalPosition);\n  }\n\n  getCenterPoint(useFinalPosition) {\n    return getElementCenterPoint(this, useFinalPosition);\n  }\n\n  draw(ctx) {\n    const {elements, options} = this;\n    ctx.save();\n    ctx.beginPath();\n    ctx.fillStyle = options.backgroundColor;\n    setShadowStyle(ctx, options);\n    const stroke = setBorderStyle(ctx, options);\n    let first = true;\n    for (const el of elements) {\n      if (first) {\n        ctx.moveTo(el.x, el.y);\n        first = false;\n      } else {\n        ctx.lineTo(el.x, el.y);\n      }\n    }\n    ctx.closePath();\n    ctx.fill();\n    // If no border, don't draw it\n    if (stroke) {\n      ctx.shadowColor = options.borderShadowColor;\n      ctx.stroke();\n    }\n    ctx.restore();\n  }\n\n  resolveElementProperties(chart, options) {\n    const {x, y, width, height} = resolvePointPosition(chart, options);\n    const {sides, radius, rotation, borderWidth} = options;\n    const halfBorder = borderWidth / 2;\n    const elements = [];\n    const angle = (2 * PI) / sides;\n    let rad = rotation * RAD_PER_DEG;\n    for (let i = 0; i < sides; i++, rad += angle) {\n      const sin = Math.sin(rad);\n      const cos = Math.cos(rad);\n      elements.push({\n        type: 'point',\n        optionScope: 'point',\n        properties: {\n          x: x + sin * radius,\n          y: y - cos * radius,\n          bX: x + sin * (radius + halfBorder),\n          bY: y - cos * (radius + halfBorder)\n        }\n      });\n    }\n    return {x, y, width, height, elements, initProperties: {x, y}};\n  }\n}\n\nPolygonAnnotation.id = 'polygonAnnotation';\n\nPolygonAnnotation.defaults = {\n  adjustScaleRange: true,\n  backgroundShadowColor: 'transparent',\n  borderCapStyle: 'butt',\n  borderDash: [],\n  borderDashOffset: 0,\n  borderJoinStyle: 'miter',\n  borderShadowColor: 'transparent',\n  borderWidth: 1,\n  display: true,\n  point: {\n    radius: 0\n  },\n  radius: 10,\n  rotation: 0,\n  shadowBlur: 0,\n  shadowOffsetX: 0,\n  shadowOffsetY: 0,\n  sides: 3,\n  xAdjust: 0,\n  xMax: undefined,\n  xMin: undefined,\n  xScaleID: 'x',\n  xValue: undefined,\n  yAdjust: 0,\n  yMax: undefined,\n  yMin: undefined,\n  yScaleID: 'y',\n  yValue: undefined\n};\n\nPolygonAnnotation.defaultRoutes = {\n  borderColor: 'color',\n  backgroundColor: 'color'\n};\n\n\nfunction pointIsInPolygon(points, x, y, useFinalPosition) {\n  let isInside = false;\n  let A = points[points.length - 1].getProps(['bX', 'bY'], useFinalPosition);\n  for (const point of points) {\n    const B = point.getProps(['bX', 'bY'], useFinalPosition);\n    if ((B.bY > y) !== (A.bY > y) && x < (A.bX - B.bX) * (y - B.bY) / (A.bY - B.bY) + B.bX) {\n      isInside = !isInside;\n    }\n    A = B;\n  }\n  return isInside;\n}\n\nconst annotationTypes = {\n  box: BoxAnnotation,\n  ellipse: EllipseAnnotation,\n  label: LabelAnnotation,\n  line: LineAnnotation,\n  point: PointAnnotation,\n  polygon: PolygonAnnotation\n};\n\n/**\n * Register fallback for annotation elements\n * For example lineAnnotation options would be looked through:\n * - the annotation object (options.plugins.annotation.annotations[id])\n * - element options (options.elements.lineAnnotation)\n * - element defaults (defaults.elements.lineAnnotation)\n * - annotation plugin defaults (defaults.plugins.annotation, this is what we are registering here)\n */\nObject.keys(annotationTypes).forEach(key => {\n  defaults.describe(`elements.${annotationTypes[key].id}`, {\n    _fallback: 'plugins.annotation'\n  });\n});\n\nconst directUpdater = {\n  update: Object.assign\n};\n\n/**\n * Resolve the annotation type, checking if is supported.\n * @param {string} [type=line] - annotation type\n * @returns {string} resolved annotation type\n */\nfunction resolveType(type = 'line') {\n  if (annotationTypes[type]) {\n    return type;\n  }\n  console.warn(`Unknown annotation type: '${type}', defaulting to 'line'`);\n  return 'line';\n}\n\n/**\n * Create or update all annotation elements, configured to the plugin.\n * @param {Chart} chart - the chart where the plugin is enabled\n * @param {Object} state - the state of the plugin\n * @param {Object} options - annotation options to use\n * @param {UpdateMode} mode - The update mode\n */\nfunction updateElements(chart, state, options, mode) {\n  const animations = resolveAnimations(chart, options.animations, mode);\n\n  const annotations = state.annotations;\n  const elements = resyncElements(state.elements, annotations);\n\n  for (let i = 0; i < annotations.length; i++) {\n    const annotationOptions = annotations[i];\n    const element = getOrCreateElement(elements, i, annotationOptions.type);\n    const resolver = annotationOptions.setContext(getContext(chart, element, annotationOptions));\n    const properties = element.resolveElementProperties(chart, resolver);\n\n    properties.skip = toSkip(properties);\n\n    if ('elements' in properties) {\n      updateSubElements(element, properties, resolver, animations);\n      // Remove the sub-element definitions from properties, so the actual elements\n      // are not overwritten by their definitions\n      delete properties.elements;\n    }\n\n    if (!defined(element.x)) {\n      // If the element is newly created, assing the properties directly - to\n      // make them readily awailable to any scriptable options. If we do not do this,\n      // the properties retruned by `resolveElementProperties` are available only\n      // after options resolution.\n      Object.assign(element, properties);\n    }\n\n    properties.options = resolveAnnotationOptions(resolver);\n\n    animations.update(element, properties);\n  }\n}\n\nfunction toSkip(properties) {\n  return isNaN(properties.x) || isNaN(properties.y);\n}\n\nfunction resolveAnimations(chart, animOpts, mode) {\n  if (mode === 'reset' || mode === 'none' || mode === 'resize') {\n    return directUpdater;\n  }\n  return new Animations(chart, animOpts);\n}\n\nfunction updateSubElements(mainElement, {elements, initProperties}, resolver, animations) {\n  const subElements = mainElement.elements || (mainElement.elements = []);\n  subElements.length = elements.length;\n  for (let i = 0; i < elements.length; i++) {\n    const definition = elements[i];\n    const properties = definition.properties;\n    const subElement = getOrCreateElement(subElements, i, definition.type, initProperties);\n    const subResolver = resolver[definition.optionScope].override(definition);\n    properties.options = resolveAnnotationOptions(subResolver);\n    animations.update(subElement, properties);\n  }\n}\n\nfunction getOrCreateElement(elements, index, type, initProperties) {\n  const elementClass = annotationTypes[resolveType(type)];\n  let element = elements[index];\n  if (!element || !(element instanceof elementClass)) {\n    element = elements[index] = new elementClass();\n    if (isObject(initProperties)) {\n      Object.assign(element, initProperties);\n    }\n  }\n  return element;\n}\n\nfunction resolveAnnotationOptions(resolver) {\n  const elementClass = annotationTypes[resolveType(resolver.type)];\n  const result = {};\n  result.id = resolver.id;\n  result.type = resolver.type;\n  result.drawTime = resolver.drawTime;\n  Object.assign(result,\n    resolveObj(resolver, elementClass.defaults),\n    resolveObj(resolver, elementClass.defaultRoutes));\n  for (const hook of hooks) {\n    result[hook] = resolver[hook];\n  }\n  return result;\n}\n\nfunction resolveObj(resolver, defs) {\n  const result = {};\n  for (const prop of Object.keys(defs)) {\n    const optDefs = defs[prop];\n    const value = resolver[prop];\n    result[prop] = isObject(optDefs) ? resolveObj(value, optDefs) : value;\n  }\n  return result;\n}\n\nfunction getContext(chart, element, annotation) {\n  return element.$context || (element.$context = Object.assign(Object.create(chart.getContext()), {\n    element,\n    id: annotation.id,\n    type: 'annotation'\n  }));\n}\n\nfunction resyncElements(elements, annotations) {\n  const count = annotations.length;\n  const start = elements.length;\n\n  if (start < count) {\n    const add = count - start;\n    elements.splice(start, 0, ...new Array(add));\n  } else if (start > count) {\n    elements.splice(count, start - count);\n  }\n  return elements;\n}\n\nvar name = \"chartjs-plugin-annotation\";\nvar version = \"1.4.0\";\n\nconst chartStates = new Map();\n\nvar annotation = {\n  id: 'annotation',\n\n  version,\n\n  /* TODO: enable in v2\n  beforeRegister() {\n    requireVersion('chart.js', '3.7', Chart.version);\n  },\n  */\n\n  afterRegister() {\n    Chart.register(annotationTypes);\n\n    // TODO: Remove this check, warning and workaround in v2\n    if (!requireVersion('chart.js', '3.7', Chart.version, false)) {\n      console.warn(`${name} has known issues with chart.js versions prior to 3.7, please consider upgrading.`);\n\n      // Workaround for https://github.com/chartjs/chartjs-plugin-annotation/issues/572\n      Chart.defaults.set('elements.lineAnnotation', {\n        callout: {},\n        font: {},\n        padding: 6\n      });\n    }\n  },\n\n  afterUnregister() {\n    Chart.unregister(annotationTypes);\n  },\n\n  beforeInit(chart) {\n    chartStates.set(chart, {\n      annotations: [],\n      elements: [],\n      visibleElements: [],\n      listeners: {},\n      listened: false,\n      moveListened: false\n    });\n  },\n\n  beforeUpdate(chart, args, options) {\n    const state = chartStates.get(chart);\n    const annotations = state.annotations = [];\n\n    let annotationOptions = options.annotations;\n    if (isObject(annotationOptions)) {\n      Object.keys(annotationOptions).forEach(key => {\n        const value = annotationOptions[key];\n        if (isObject(value)) {\n          value.id = key;\n          annotations.push(value);\n        }\n      });\n    } else if (isArray(annotationOptions)) {\n      annotations.push(...annotationOptions);\n    }\n    verifyScaleOptions(annotations, chart.scales);\n  },\n\n  afterDataLimits(chart, args) {\n    const state = chartStates.get(chart);\n    adjustScaleRange(chart, args.scale, state.annotations.filter(a => a.display && a.adjustScaleRange));\n  },\n\n  afterUpdate(chart, args, options) {\n    const state = chartStates.get(chart);\n    updateListeners(chart, state, options);\n    updateElements(chart, state, options, args.mode);\n    state.visibleElements = state.elements.filter(el => !el.skip && el.options.display);\n  },\n\n  beforeDatasetsDraw(chart, _args, options) {\n    draw(chart, 'beforeDatasetsDraw', options.clip);\n  },\n\n  afterDatasetsDraw(chart, _args, options) {\n    draw(chart, 'afterDatasetsDraw', options.clip);\n  },\n\n  beforeDraw(chart, _args, options) {\n    draw(chart, 'beforeDraw', options.clip);\n  },\n\n  afterDraw(chart, _args, options) {\n    draw(chart, 'afterDraw', options.clip);\n  },\n\n  beforeEvent(chart, args, options) {\n    const state = chartStates.get(chart);\n    handleEvent(state, args.event, options);\n  },\n\n  destroy(chart) {\n    chartStates.delete(chart);\n  },\n\n  _getState(chart) {\n    return chartStates.get(chart);\n  },\n\n  defaults: {\n    animations: {\n      numbers: {\n        properties: ['x', 'y', 'x2', 'y2', 'width', 'height', 'pointX', 'pointY', 'labelX', 'labelY', 'labelWidth', 'labelHeight', 'radius'],\n        type: 'number'\n      },\n    },\n    clip: true,\n    dblClickSpeed: 350, // ms\n    drawTime: 'afterDatasetsDraw',\n    label: {\n      drawTime: null\n    }\n  },\n\n  descriptors: {\n    _indexable: false,\n    _scriptable: (prop) => !hooks.includes(prop),\n    annotations: {\n      _allKeys: false,\n      _fallback: (prop, opts) => `elements.${annotationTypes[resolveType(opts.type)].id}`,\n    },\n  },\n\n  additionalOptionScopes: ['']\n};\n\nfunction draw(chart, caller, clip) {\n  const {ctx, chartArea} = chart;\n  const {visibleElements} = chartStates.get(chart);\n\n  if (clip) {\n    clipArea(ctx, chartArea);\n  }\n\n  drawElements(ctx, visibleElements, caller);\n  drawSubElements(ctx, visibleElements, caller);\n\n  if (clip) {\n    unclipArea(ctx);\n  }\n\n  visibleElements.forEach(el => {\n    if (!('drawLabel' in el)) {\n      return;\n    }\n    const label = el.options.label;\n    if (label && label.enabled && label.content && (label.drawTime || el.options.drawTime) === caller) {\n      el.drawLabel(ctx, chartArea);\n    }\n  });\n}\n\nfunction drawElements(ctx, elements, caller) {\n  for (const el of elements) {\n    if (el.options.drawTime === caller) {\n      el.draw(ctx);\n    }\n  }\n}\n\nfunction drawSubElements(ctx, elements, caller) {\n  for (const el of elements) {\n    if (isArray(el.elements)) {\n      drawElements(ctx, el.elements, caller);\n    }\n  }\n}\n\nexport { annotation as default };\n","<script>\n    import { onMount } from \"svelte\";\n    import { Chart, registerables } from \"chart.js\";\n    import annotationPlugin from \"chartjs-plugin-annotation\";\n\n    Chart.register(...registerables);\n    Chart.register(annotationPlugin);\n\n    let canvas;\n    let chart;\n    let ctx;\n    export let line_value = 25;\n    export let chart_data;\n    export let selected_prop;\n    export let league = \"nba\";\n    $: if(chart) updateChart(chart, false, line_value);\n    $: if(chart) updateChart(chart, true, chart_data, selected_prop);\n    function getChartData() {\n        let labels = [];\n        let data = [];\n        if(league == \"nba\"){\n            //add points+rebounds+assists and blocks+steals to data\n            for (var stat_entry of chart_data) {\n                stat_entry[\"points+reb+ast\"] = parseInt(stat_entry[\"points\"]) + parseInt(stat_entry[\"rebounds\"]) + parseInt(stat_entry[\"assists\"]);\n                stat_entry[\"steals+blocks\"] = parseInt(stat_entry[\"blocks\"]) + parseInt(stat_entry[\"steals\"]);\n            }\n        }\n        else if (league == \"mlb\"){\n            for (var stat_entry of chart_data) {\n                // check if stat_entry contains the prop strikouts so that we can distinguish pitchers from batters\n                stat_entry[\"earned runs\"] = parseInt(stat_entry[\"earned_runs\"]);\n                stat_entry[\"hits allowed\"] = parseInt(stat_entry[\"hits_allowed\"]);\n                stat_entry[\"walks allowed\"] = parseInt(stat_entry[\"walks_allowed\"]);\n                stat_entry[\"innings pitched\"] = parseFloat(stat_entry[\"innings_pitched\"]);\n\n                stat_entry[\"total bases\"] = parseInt(stat_entry.singles) + parseInt(stat_entry.doubles) * 2 + parseInt(stat_entry.triples) * 3  + parseInt(stat_entry.homeruns) * 4;\n                stat_entry[\"runs+rbis\"] = parseInt(stat_entry.runs) + parseInt(stat_entry.rbis);\n                stat_entry[\"hits\"] = parseInt(stat_entry.singles) + parseInt(stat_entry.doubles) + parseInt(stat_entry.triples) + parseInt(stat_entry.homeruns);\n                stat_entry[\"hits+walks\"] = parseInt(stat_entry.singles) + parseInt(stat_entry.doubles) + parseInt(stat_entry.triples)  + parseInt(stat_entry.homeruns) + parseInt(stat_entry.walks);\n            }\n        }\n        else if(league == \"nhl\"){\n            for(var stat_entry of chart_data){\n                stat_entry[\"points\"] = parseInt(stat_entry.goals) + parseInt(stat_entry.assists);\n                stat_entry[\"shots on goal\"] = parseInt(stat_entry.shots);\n                stat_entry[\"blocked shots\"] = parseInt(stat_entry.blocked_shots);\n                stat_entry[\"power play points\"] = parseInt(stat_entry.power_play_goals) + parseInt(stat_entry.power_play_assists);\n                stat_entry[\"shots against\"] = parseInt(stat_entry.shots_against);\n                stat_entry[\"goals against\"] = parseInt(stat_entry.goals_against);\n            }\n        }\n        else if(league == \"nfl\"){\n            for(var stat_entry of chart_data){\n                stat_entry[\"rush yards\"] = parseInt(stat_entry.rush_yards);\n                stat_entry[\"pass yards\"] = parseInt(stat_entry.pass_yards);\n                stat_entry[\"rec yards\"] = parseInt(stat_entry.rec_yards);\n                stat_entry[\"rush tds\"] = parseInt(stat_entry.rush_tds);\n                stat_entry[\"pass tds\"] = parseInt(stat_entry.pass_tds);\n                stat_entry[\"rec tds\"] = parseInt(stat_entry.rec_tds);\n                stat_entry[\"total yards\"] = parseInt(stat_entry.rush_yards) + parseInt(stat_entry.pass_yards) + parseInt(stat_entry.rec_yards);\n                stat_entry[\"total tds\"] = parseInt(stat_entry.rush_tds) + parseInt(stat_entry.pass_tds) + parseInt(stat_entry.rec_tds);\n                stat_entry[\"interceptions\"] = parseInt(stat_entry.off_interceptions);\n            }\n        }\n        for (var game of chart_data){\n            labels.unshift(new Date(game.player_game.game.start_time.replace(/-/g, \"/\")).toLocaleDateString(\"default\",{month:'short', day:\"numeric\"}));\n            data.unshift(parseFloat(game[selected_prop]));\n        }\n        return {\n            labels: labels,\n            datasets: [\n                {\n                    backgroundColor: [\n                        \"rgb(255, 99, 132)\",\n                        \"rgb(255, 99, 132)\",\n                        \"rgb(255, 99, 132)\",\n                        \"rgb(255, 99, 132)\",\n                        \"rgb(54, 162, 235)\",\n                        \"rgb(54, 162, 235)\",\n                        \"rgb(54, 162, 235)\",\n                    ],\n                    data: data,\n                },\n            ],\n        };\n    }\n    function getChartOptions() {\n        let annotations = {};\n        //check if line_value is not null\n        if(line_value){\n            annotations = {\n                line1: {\n                    type: \"line\",\n                    yMin: line_value,\n                    yMax: line_value,\n                    borderDash: [10, 10],\n                    borderColor: \"gray\",\n                    borderWidth: 2,\n                },\n            }\n        }\n        else{\n            annotations = {\n            }\n        }\n        return {\n            plugins: {\n                legend: {\n                    display: false\n                },\n                annotation: {\n                    annotations: annotations,\n                },\n            },\n        };\n    }\n    function setColors(myChart){\n        var bars = myChart.data.datasets[0].data;\n        for (let i = 0; i < bars.length; i++) {\n            if (bars[i] < line_value) {\n                myChart.data.datasets[0].backgroundColor[i] = 'rgb(255, 99, 132)';\n            } else if (bars[i] > line_value) {\n                myChart.data.datasets[0].backgroundColor[i] = \"#4CB963\";\n            } else {\n                myChart.data.datasets[0].backgroundColor[i] = \"gray\";\n            }\n        }\n    }\n    function updateChart(myChart, updateData = false) {\n        if (updateData) {\n            myChart.data = getChartData();\n        }\n        setColors(myChart);\n        myChart.options = getChartOptions();\n        myChart.update();\n    }\n    function initChart() {\n        ctx = canvas.getContext(\"2d\");\n        chart = new Chart(ctx, {\n            type: \"bar\",\n            data: getChartData(),\n            options: getChartOptions(),\n        });\n        setColors(chart);\n        chart.update();\n    }\n    onMount(() => {\n        initChart();\n    });\n</script>\n\n<canvas style=\"max-height:250px;\" bind:this={canvas} />\n","<script>\n    export let title_text = \"\";\n    export let text = \"\";\n    export let logo_url = \"\";\n</script>\n<div class=\"p-1 text-center\">\n    <img width=\"200\" height=\"188\" class=\"d-block mx-auto img-fluid\" src=\"{logo_url}\" alt=\"DFStud's cartoon horse mascot Studly\"\n        style=\"max-width: 200px;\">\n    <div class=\"col-lg-6 mx-auto p-2 glass\">\n        <h1 class=\"display-5 fw-bold\">{title_text}</h1>\n        <p class=\"lead\">{@html text}</p>\n    </div>\n</div>","<script>\n\timport gaussian from 'gaussian';\n\timport OverUnderChart from './OverUnderChart.svelte';\n\timport PremiumOnly from \"./PremiumOnly.svelte\";\n\texport let stats = [];\n\texport let gamelog = [];\n\t//not needed iterate over stats instead\n\texport let props = [\"points\", \"rebounds\", \"assists\", \"fantasy points\", \"points+rebounds+assists\", \"steals+blocks\"];\n\texport let league = \"nba\";\n\texport let premium_membership = true;\n\t// {stat: {lines: [...], p_over: [...], mean, sd}} from the fair-odds API\n\texport let fair_odds = null;\n\t// {stat: [{book, line, over, under, p_over}]} sportsbook lines for this game\n\texport let market_lines = null;\n\t$: market_rows = marketRows(selected_prop, market_lines, my_dist);\n\tfunction marketRows(prop, lines, dist) {\n\t\tif (!lines || !lines[prop] || !dist) return [];\n\t\treturn lines[prop].filter(r => r.p_over !== null).slice(0, 6).map(r => ({\n\t\t\tbook: r.book, line: r.line, over: r.over, under: r.under,\n\t\t\tbook_p: r.p_over, model_p: 1 - dist.cdf(r.line)\n\t\t}));\n\t}\n\tfunction fmtOdds(o) { return (o > 0 ? \"+\" : \"\") + o; }\n\t$: setPropMetrics(stats, fair_odds);\n\tlet using_curve = false;\n\tlet selected_prop;\n\tlet value_to_beat;\n\tlet min_value;\n\tlet max_value;\n\tlet my_dist;\n\tlet probability;\n\tselected_prop = props[0];\n\tsetPropMetrics();\n\tfunction probabilityToMoneyLine(probability) {\n\t\tif (probability > 0.5) {\n\t\t\treturn \"-\" + Math.round((probability / (1 - probability)) * 100);\n\t\t}\n\t\telse{\n\t\t\treturn \"+\" + Math.round(((1-probability) / probability) * 100);\n\t\t}\n\t\t\n\t}\n\tfunction setPropMetrics(){\n\t\t//check if props contains selected_prop\n\t\tif (!props.includes(selected_prop)) {\n\t\t\tselected_prop = props[0];\n\t\t}\n\t\tlet my_prop = stats.find(obj => {return obj.name === selected_prop});\n\t\tmy_prop.projection = parseFloat(my_prop.projection);\n\t\tlet curve = fair_odds ? fair_odds[selected_prop] : null;\n\t\tusing_curve = !!(curve && curve.lines && curve.lines.length);\n\t\tlet sd = using_curve ? curve.sd : my_prop.sd;\n\t\tvalue_to_beat = roundHalf(my_prop.projection);\n\t\tmin_value = roundHalf(my_prop.projection - sd * 2);\n\t\tif (min_value < 0) {\n\t\t\tmin_value = 0;\n\t\t}\n\t\tmax_value = roundHalf(my_prop.projection + sd * 2);\n\t\t// The curve is the empirical distribution of what happened in past games\n\t\t// projected like this one (see fantasy/fair_odds.py); cdf(x) = P(under x)\n\t\tmy_dist = using_curve ? curveDist(curve) : new gaussian(my_prop.projection, my_prop.sd * my_prop.sd);\n\t\tprobability = my_dist.cdf(value_to_beat);\n\t}\n\tfunction curveDist(curve) {\n\t\tlet lines = curve.lines;\n\t\tlet p_over = curve.p_over;\n\t\tlet step = lines.length > 1 ? lines[1] - lines[0] : 0.5;\n\t\treturn {\n\t\t\tcdf: function(x) {\n\t\t\t\tlet over;\n\t\t\t\tif (x < lines[0]) {\n\t\t\t\t\tover = 1 - (1 - p_over[0]) * (x / lines[0]);\n\t\t\t\t} else if (x >= lines[lines.length - 1]) {\n\t\t\t\t\tover = p_over[p_over.length - 1];\n\t\t\t\t} else {\n\t\t\t\t\tlet i = Math.floor((x - lines[0]) / step);\n\t\t\t\t\tlet frac = (x - lines[i]) / step;\n\t\t\t\t\tover = p_over[i] + (p_over[i + 1] - p_over[i]) * frac;\n\t\t\t\t}\n\t\t\t\treturn 1 - over;\n\t\t\t}\n\t\t};\n\t}\n\tfunction roundHalf(num) {\n        return Math.round(num*2)/2;\n\t}\n</script>\n<div class=\"p-2\">\n\t<label for=\"prop-select\">Choose a prop</label>\n\t<select bind:value={selected_prop} on:change={()=>{setPropMetrics()}} class=\"form-select form-select-lg\" id=\"prop-select\">\n\t\t{#each props as prop}\n\t\t<option value=\"{prop}\">{prop}</option>\n\t\t{/each}\n\t</select>\n\t\n\t\n\t<div class=\"mt-2 d-flex justify-content-center align-items-center\">\n\t\t<input style=\"width:95px;\" class=\"form-control form-control-lg d-inline-block\" min=\"{min_value}\" max=\"{max_value}\" step=\".5\" type=number bind:value={value_to_beat} on:input={()=>{probability = my_dist.cdf(value_to_beat)}}> <h6 class=\"lead ps-1 my-0\">{selected_prop}</h6>\n\t</div>\n\t<div class=\"text-center text-muted small\">\n\t\t{#if using_curve}\n\t\t\tBased on {fair_odds[selected_prop].n} past games projected like this one\n\t\t{:else}\n\t\t\tBased on a normal curve around the projection\n\t\t{/if}\n\t</div>\n\t{#if premium_membership && market_rows.length}\n\t<div class=\"mx-auto mt-1 small\" style=\"max-width: 420px;\">\n\t\t<table class=\"table table-sm table-borderless mb-0 text-center\">\n\t\t\t<thead><tr class=\"text-muted\"><th>Book</th><th>Line</th><th>Odds</th><th>Book over %</th><th>Model over %</th></tr></thead>\n\t\t\t<tbody>\n\t\t\t\t{#each market_rows as r}\n\t\t\t\t<tr>\n\t\t\t\t\t<td>{r.book}</td>\n\t\t\t\t\t<td>{r.line}</td>\n\t\t\t\t\t<td class=\"font-monospace\">{fmtOdds(r.over)} / {fmtOdds(r.under)}</td>\n\t\t\t\t\t<td>{(r.book_p * 100).toFixed(0)}%</td>\n\t\t\t\t\t<td class:text-success={r.model_p - r.book_p > 0.04} class:text-danger={r.book_p - r.model_p > 0.04}>{(r.model_p * 100).toFixed(0)}%</td>\n\t\t\t\t</tr>\n\t\t\t\t{/each}\n\t\t\t</tbody>\n\t\t</table>\n\t</div>\n\t{/if}\n\t<div class=\"px-5\" style=\"max-height: 275px;\">\n\t\t<OverUnderChart league={league} selected_prop={selected_prop} line_value={value_to_beat} chart_data={gamelog}/>\n\t</div>\n\t<div class=\"my-1 mx-4\">\n\t\t<input class=\"form-range\" min=\"{min_value}\" max=\"{max_value}\" step=\".5\" type=range bind:value={value_to_beat} on:input={()=>{probability = my_dist.cdf(value_to_beat)}}>\n\t</div>\n\t<div class=\"row mt-2\">\n\t\t{#if !premium_membership}\n\t\t<PremiumOnly title_text={\"GigaStuds Only!\"} text={\"Prop Bet Probabilities only available for GigaStuds. <a class='text-decoration-none' href='/purchase-premium'>Become a GigaStud</a> to gain access to all DFStud features!!\"} logo_url={window.logo_url}/>\n\t\t{:else}\n\t\t<div class=\"text-center col-6\">\n\t\t\t<div class=\"d-flex flex-column\">\n\t\t\t\t<h4>Under</h4>\n\t\t\t\t<h4 class=\"lead\">Probability: {(probability).toFixed(2)}</h4>\n\t\t\t\t<h4 class=\"lead\">Moneyline: {probabilityToMoneyLine(probability)}</h4>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"text-center col-6\">\n\t\t\t<div class=\"d-flex flex-column\">\n\t\t\t\t<h4>Over</h4>\n\t\t\t\t<h4 class=\"lead\">Probability: {(1-probability).toFixed(2)}</h4>\n\t\t\t\t<h4 class=\"lead\">Moneyline: {probabilityToMoneyLine(1-probability)}</h4>\n\t\t\t</div>\n\t\t</div>\n\t\t{/if}\n\t</div>\n</div>\n","<script>\n    export let gamelog = [];\n    export let league = \"nba\";\n    export let is_pitcher = false;\n    export let is_qb = false;\n    export let is_goalie = false;\n</script>\n<div class=\"p-2\">\n    <h2>GameLog</h2>\n    <div class=\"card\" style=\"max-height: 500px; overflow-y:auto; overflow-x:hidden;\">\n        {#each gamelog as entry, index}\n        <div class=\"p-1 border-bottom\">\n            <div class=\"lead text-center\">\n            <span><span class=\"fw-normal\">{entry[\"fantasy points\"].toFixed(1)}</span> FP </span>\n            {#if entry.player_game.team.id == entry.player_game.game.home_team.id}\n                <span class=\"text-muted\">VS {entry.player_game.game.away_team.short_name}</span>\n            {:else}\n                <span class=\"text-muted\">@ {entry.player_game.game.home_team.short_name}</span>\n            {/if}\n                {new Date(entry.player_game.game.start_time.replace(/-/g, \"/\")).toLocaleDateString(\"default\",{month:'short', day:\"numeric\"})}\n            </div>\n            <div class=\"text-center\">\n                {#if league == \"nba\"}\n                <div class=\"row\">\n                    <div class=\"col-2 pb-1 fw-bold border-end\">M</div>\n                    <div class=\"col-2 fw-bold border-end\">P</div>\n                    <div class=\"col-2 fw-bold border-end\">R</div>\n                    <div class=\"col-2 fw-bold border-end\">A</div>\n                    <div class=\"col-2 fw-bold border-end\">B</div>\n                    <div class=\"col-2 fw-bold\">S</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.minutes)}</div>\n                    <div class=\"col-2 border-end\">{entry.points}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rebounds)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.assists)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.blocks)}</div>\n                    <div class=\"col-2\">{parseInt(entry.steals)}</div>\n                </div>\n                {:else if league == \"mlb\" && is_pitcher}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">K</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">W</div>\n                    <div class=\"col-2 fw-bold border-end\">PT</div>\n                    <div class=\"col-2 fw-bold border-end\">H</div>\n                    <div class=\"col-2 fw-bold border-end\">BB</div>\n                    <div class=\"col-2 fw-bold\">ER</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{entry.strikeouts}</div>\n                    <div class=\"col-2 border-end\">{entry.wins}</div>\n                    <div class=\"col-2 border-end\">{entry.pitches_thrown}</div>\n                    <div class=\"col-2 border-end\">{entry.hits_allowed}</div>\n                    <div class=\"col-2 border-end\">{entry.walks_allowed}</div>\n                    <div class=\"col-2\">{entry.earned_runs}</div>\n                </div>\n                {:else if league == \"mlb\"}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">Hits</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">Runs</div>\n                    <div class=\"col-2 fw-bold border-end\">RBI</div>\n                    <div class=\"col-2 fw-bold border-end\">SB</div>\n                    <div class=\"col-2 fw-bold border-end\">BB</div>\n                    <div class=\"col-2 fw-bold\">K</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.singles)+parseInt(entry.doubles)+parseInt(entry.triples)+parseInt(entry.homeruns)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.runs)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rbis)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.stolen_bases)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.walks)}</div>\n                    <div class=\"col-2\">{parseInt(entry.batter_strikeouts)}</div>\n                </div>\n                {:else if league == \"nfl\" && is_qb}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">Pass Yds</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">Pass Tds</div>\n                    <div class=\"col-2 fw-bold\">Comp / Att</div>\n                    <div class=\"col-2 fw-bold border-end\">Int</div>\n                    <div class=\"col-2 fw-bold border-end\">Rush Yds</div>\n                    <div class=\"col-2 fw-bold border-end\">Rush Tds</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.pass_yards)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.pass_tds)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.completions)} / {parseInt(entry.attempts)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.off_interceptions)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rush_yards)}</div>\n                    <div class=\"col-2\">{parseInt(entry.rush_tds)}</div>\n                </div>\n                {:else if league == \"nhl\" && is_goalie}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">SV</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">SA</div>\n                    <div class=\"col-2 fw-bold border-end\">GA</div>\n                    <div class=\"col-2 fw-bold border-end\">W</div>\n                    <div class=\"col-2 fw-bold border-end\">SO</div>\n                    <div class=\"col-2 fw-bold\">TOI</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.saves)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.shots_against)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.goals_against)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.wins)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.shutouts)}</div>\n                    <div class=\"col-2\">{parseFloat(entry.time_on_ice).toFixed(0)}</div>\n                </div>\n                {:else if league == \"nhl\"}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">G</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">A</div>\n                    <div class=\"col-2 fw-bold border-end\">SOG</div>\n                    <div class=\"col-2 fw-bold border-end\">BLK</div>\n                    <div class=\"col-2 fw-bold border-end\">PPP</div>\n                    <div class=\"col-2 fw-bold\">TOI</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.goals)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.assists)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.shots)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.blocked_shots)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.power_play_goals) + parseInt(entry.power_play_assists)}</div>\n                    <div class=\"col-2\">{parseFloat(entry.time_on_ice).toFixed(1)}</div>\n                </div>\n                {:else if league == \"nfl\"}\n                <div class=\"row\">\n                    <div class=\"col-2 fw-bold border-end\">Rec Yds</div>\n                    <div class=\"col-2 pb-1 fw-bold border-end\">Rec Tds</div>\n                    <div class=\"col-2 fw-bold\">Receptions</div>\n                    <div class=\"col-2 fw-bold border-end\">Targets</div>\n                    <div class=\"col-2 fw-bold border-end\">Rush Yds</div>\n                    <div class=\"col-2 fw-bold border-end\">Rush Tds</div>\n                </div>\n                <div class=\"row\">\n                    <div class=\"col-2 border-end\">{parseInt(entry.rec_yards)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rec_tds)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.receptions)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.targets)}</div>\n                    <div class=\"col-2 border-end\">{parseInt(entry.rush_yards)}</div>\n                    <div class=\"col-2\">{parseInt(entry.rush_tds)}</div>\n                </div>\n                {/if}\n            </div>\n        </div>\n        {/each}\n    </div>\n</div>","<script>\n    export let averages = false;\n    export let league = \"nba\";\n    export let is_goalie = false;\n    import { afterUpdate } from 'svelte';\n    function roundToTenth(number) {\n        //check if number is a number\n        if (isNaN(number)) {\n            return \"\";\n        }\n        return number.toFixed(1);\n    }\n    function destroyTooltips() {\n        var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n        var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {\n            return new bootstrap.Tooltip(tooltipTriggerEl).dispose();\n        })\n    }\n    function enableTooltips() {\n        //run after .5 seconds\n        var tooltipTriggerList = [].slice.call(document.querySelectorAll('[data-bs-toggle=\"tooltip\"]'))\n        var tooltipList = tooltipTriggerList.map(function (tooltipTriggerEl) {\n            return new bootstrap.Tooltip(tooltipTriggerEl)\n        })\n    }\n    function reInitTooltips() {\n        destroyTooltips();\n        enableTooltips();\n    }\n    afterUpdate(() => {\n\t\treInitTooltips();\n\t});\n</script>\n<h4 class=\"m-0\">Season Stats\n    {#if averages}\n    <small class=\"text-muted\"> - {roundToTenth(averages['fantasy points'])} FP</small>\n    {/if}\n</h4>\n<div class=\"border rounded-2 w-100 row mx-0 my-1\">\n    {#if league == \"nba\"}\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\" data-bs-toggle=\"tooltip\" data-bs-placement=\"bottom\" data-bs-html=\"true\" title=\"\n    <div>FG {roundToTenth(parseInt(averages['two_point_fgm'])+parseInt(averages['three_point_fgm']))} / {roundToTenth(parseInt(averages['two_point_fga'])+parseInt(averages['three_point_fga']))}</div>\n    <div>3FG {roundToTenth(averages['three_point_fgm'])} / {roundToTenth(averages['three_point_fga'])}</div>\n    <div>FT {roundToTenth(averages['ftm'])} / {roundToTenth(averages['fta'])}</div>\">\n        <div class=\"fw-bold\">PTS</div>\n        <div>{roundToTenth(averages['points'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">REB</div>\n        <div>{roundToTenth(averages['rebounds'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">AST</div>\n        <div>{roundToTenth(averages['assists'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">STL</div>\n        <div>{roundToTenth(averages['steals'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">BLK</div>\n        <div>{roundToTenth(averages['blocks'])}</div>\n    </div>\n    <div class=\"col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">TO</div>\n        <div>{roundToTenth(averages['turnovers'])}</div>\n    </div>\n    {:else if league == \"nhl\" && is_goalie}\n    <div class=\"border-end col-sm-3 col-6 p-1 text-center\">\n        <div class=\"fw-bold\">SV</div>\n        <div>{roundToTenth(averages['saves'])}</div>\n    </div>\n    <div class=\"border-end col-sm-3 col-6 p-1 text-center\">\n        <div class=\"fw-bold\">GA</div>\n        <div>{roundToTenth(averages['goals_against'])}</div>\n    </div>\n    <div class=\"border-end col-sm-3 col-6 p-1 text-center\">\n        <div class=\"fw-bold\">SV%</div>\n        <div>{averages['shots_against'] > 0 ? (averages['saves'] / averages['shots_against']).toFixed(3) : \"\"}</div>\n    </div>\n    <div class=\"col-sm-3 col-6 p-1 text-center\">\n        <div class=\"fw-bold\">W%</div>\n        <div>{isNaN(averages['wins']) ? \"\" : Math.round(averages['wins'] * 100) + \"%\"}</div>\n    </div>\n    {:else if league == \"nhl\"}\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">G</div>\n        <div>{roundToTenth(averages['goals'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">A</div>\n        <div>{roundToTenth(averages['assists'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">PTS</div>\n        <div>{roundToTenth(averages['points'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">SOG</div>\n        <div>{roundToTenth(averages['shots on goal'])}</div>\n    </div>\n    <div class=\"border-end col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">BLK</div>\n        <div>{roundToTenth(averages['blocked shots'])}</div>\n    </div>\n    <div class=\"col-sm-2 col-4 p-1 text-center\">\n        <div class=\"fw-bold\">TOI</div>\n        <div>{roundToTenth(averages['time_on_ice'])}</div>\n    </div>\n    {/if}\n</div>","<script>\n    import PropCalculator from './PropCalculator.svelte';\n    import Gamelog from './Gamelog.svelte';\n    import SeasonAvgTable from './SeasonAvgTable.svelte';\n    export let player;\n    export let proj_id;\n    export let league = \"nba\";\n    export let premium_membership = true;\n    export let placeholder_variances;\n    // TODO consider passing in the categories as a prop\n    let player_stats;\n    let variances;\n    let projections;\n    let player_id = player.id;\n    let props;\n    let prop_metrics;\n    let means = {};\n    // Empirical over/under curves from /<league>/fair_odds/<proj_id>/ (null\n    // when unavailable, in which case the calculator falls back to a normal curve)\n    let fair_odds = null;\n    let market_lines = null;\n    // NHL goalies and skaters project different stats\n    $: is_goalie = league == \"nhl\" && player.positions.includes(\"G\");\n    $: player_id = player.id;\n    $: refreshPlayer(player_id);\n    function refreshPlayer() {\n        let prom1 = getPlayerStats(player_id);\n        let prom2 = getProjection(proj_id);\n        let prom3 = getFairOdds(proj_id);\n        //wait till all promises are resolved - move this to child component\n        Promise.all([prom1, prom2, prom3]).then(values => {\n            prop_metrics = combineStats(projections, variances);\n        });  \n    }\n    function getFairOdds(proj_id) {\n        fair_odds = null;\n        return fetch(`/${league}/fair_odds/${proj_id}/`)\n            .then(response => response.ok ? response.json() : null)\n            .then(data => {\n                fair_odds = data && data.stats ? data.stats : null;\n                market_lines = data && data.market ? data.market : null;\n            })\n            .catch(() => { fair_odds = null; market_lines = null; });\n    }\n    function combineStats(projections, variances) {\n        let combined = [];\n        props = [];\n        for (let stat in projections) {\n            let obj = {};\n            if (league == \"mlb\" && ['singles', 'doubles', 'triples', 'homeruns', 'walks'].includes(stat)) {\n                continue;\n            }\n            if (league == \"nfl\" && ['off interceptions'].includes(stat)) {\n                continue;\n            }\n            if (league == \"nhl\" && ['shots', 'power play goals', 'power play assists'].includes(stat)) {\n                continue;\n            }\n            props.push(stat);\n            obj.name = stat;\n            obj.projection = projections[stat];\n            // turn variance to standard deviation\n            obj.variance = variances[stat];\n            if(!obj.variance){\n                let stat_name_underscore = stat.replace(/ /g, \"_\");\n                obj.variance = variances[stat_name_underscore];\n            }\n            obj.sd = Math.sqrt(obj.variance);\n            combined.push(obj);\n        }\n        return combined;\n    }\n    function getPlayerStats(player_id){\n        return fetch(`/${league}/stats/${player_id}/`)\n        .then(response => response.json())\n        .then(data => {\n                //iterate over data\n                player_stats = [];\n                for(var stats of data){\n                    //append fields to player_stats TODO add points here\n                    if(league == \"nba\"){\n                        stats.fields.points = parseInt(stats.fields.ftm) + parseInt(stats.fields.two_point_fgm) * 2 + parseInt(stats.fields.three_point_fgm) * 3;\n                        stats.fields[\"fantasy points\"] = stats.fields.points + parseInt(stats.fields.rebounds) * 1.2 + parseInt(stats.fields.assists) * 1.5 + parseInt(stats.fields.steals) * 3 + parseInt(stats.fields.blocks) * 3 - parseInt(stats.fields.turnovers);\n                    }\n                    else if (league == \"mlb\"){\n                        if (player.positions.includes(\"P\")){\n                            // calculate fantasy points for pitchers\n                            stats.fields[\"fantasy points\"] = parseInt(stats.fields.earned_runs) * -3 + parseInt(stats.fields.innings_pitched) * 3 + parseInt(stats.fields.quality_starts) * 4 + parseInt(stats.fields.strikeouts) * 3 + parseInt(stats.fields.wins) * 6;\n                        }\n                        else{\n                            // calculate fantasy points for batters\n                            stats.fields[\"fantasy points\"] = parseInt(stats.fields.singles) * 3 + parseInt(stats.fields.doubles) * 6 + parseInt(stats.fields.triples) * 9 + parseInt(stats.fields.homeruns) * 12 + parseInt(stats.fields.walks) * 3 + parseInt(stats.fields.runs) * 3.2 + parseInt(stats.fields.stolen_bases) * 6 + parseInt(stats.fields.rbis) * 3.5;\n                        }\n                    }\n                    else if(league == \"nhl\"){\n                        if (is_goalie){\n                            stats.fields[\"fantasy points\"] = parseInt(stats.fields.wins) * 12 + parseInt(stats.fields.saves) * 0.8 - parseInt(stats.fields.goals_against) * 4 + parseInt(stats.fields.shutouts) * 8;\n                        }\n                        else{\n                            stats.fields[\"fantasy points\"] = parseInt(stats.fields.goals) * 12 + parseInt(stats.fields.assists) * 8 + (parseInt(stats.fields.shots) + parseInt(stats.fields.blocked_shots)) * 1.6 + (parseInt(stats.fields.power_play_goals) + parseInt(stats.fields.power_play_assists)) * 0.5;\n                        }\n                    }\n                    else if(league == \"nfl\"){\n                        stats.fields[\"fantasy points\"] = parseInt(stats.fields.pass_yards) * 0.04 + parseInt(stats.fields.pass_tds) * 4 + parseInt(stats.fields.off_interceptions) * -2 + parseInt(stats.fields.rush_yards) * 0.1 + parseInt(stats.fields.rush_tds) * 6 + parseInt(stats.fields.rec_yards) * 0.1 + parseInt(stats.fields.rec_tds) * 6 + parseInt(stats.fields.fumbles_lost) * -2 * parseInt(stats.fields.rush_2pc) * 2 + parseInt(stats.fields.rec_2pc) * 2 + parseInt(stats.fields.receptions) * .5;\n                    }\n                    player_stats.push(stats.fields);\n                }\n                buildPropCalcMetrics();\n            }\n        );\n    }\n    function getProjection(proj_id){\n        return fetch(`/${league}/projections/${proj_id}/`)\n        .then(response => response.json())\n        .then(data => {\n                //create cats\n                let cats = {};\n                let sport_cats = [];\n                if (league == \"nba\"){\n                    sport_cats = [\"points\", \"rebounds\", \"assists\", \"steals\", \"blocks\", \"turnovers\", \"fantasy points\"];\n                }\n                else if (league == \"mlb\"){\n                    if(player.positions.includes('P')){\n                        sport_cats = [\"strikeouts\", \"fantasy points\", \"walks allowed\", \"earned runs\", \"innings pitched\"];\n                    }\n                    else{\n                        sport_cats = [\"rbis\", \"singles\", \"doubles\", \"triples\", \"homeruns\", \"walks\", \"runs\", \"fantasy points\"];\n                    }\n                }\n                else if (league == \"nfl\"){\n                    if (player.positions.includes('QB')){\n                        sport_cats = [ \"pass yards\", \"pass tds\", \"rush yards\", \"rush tds\", \"fantasy points\", \"off interceptions\", \"attempts\", \"completions\"];\n                    }\n                    else{\n                        sport_cats = [\"rush yards\", \"rush tds\", \"rec yards\", \"rec tds\", \"receptions\", \"fantasy points\", \"carries\", \"targets\"];\n                    }\n                    \n                }\n                else if (league == \"nhl\"){\n                    if (is_goalie){\n                        sport_cats = [\"saves\", \"shots against\", \"goals against\", \"fantasy points\"];\n                    }\n                    else{\n                        sport_cats = [\"goals\", \"assists\", \"points\", \"shots\", \"blocked shots\", \"power play goals\", \"power play assists\", \"fantasy points\"];\n                    }\n                }\n                for (var cat in data[0].fields){\n                    let cat_no_underscore = cat.replace(/_/g, \" \");\n                    if(cat == \"fanduel_proj\"){\n                        cats[\"fantasy points\"] = data[0].fields[cat];\n                    }\n                    else if (sport_cats.includes(cat_no_underscore)){\n                        cats[cat_no_underscore] = data[0].fields[cat];\n                    }\n                }\n                projections = cats;\n                //add aggragate stats\n                if (league == \"nba\"){\n                    projections[\"steals+blocks\"] = parseFloat(projections.steals) + parseFloat(projections.blocks);\n                    projections[\"points+reb+ast\"] = parseFloat(projections.points) + parseFloat(projections.rebounds) + parseFloat(projections.assists);\n                }\n                else if (league == \"mlb\"){\n                    if(player.positions.includes('P')){\n                        \n                    }\n                    else{\n                        //hack total bases to give a better estimate for bets even though it's no longer accurate\n                        projections[\"total bases\"] = parseFloat(projections.singles) + parseFloat(projections.doubles) * 2 + parseFloat(projections.triples) * 2  + parseFloat(projections.homeruns) * 2;\n                        projections[\"runs+rbis\"] = parseFloat(projections.runs) + parseFloat(projections.rbis);\n                        projections[\"hits+walks\"] = parseFloat(projections.singles) + parseFloat(projections.doubles) + parseFloat(projections.triples) + parseFloat(projections.homeruns) + parseFloat(projections.walks);\n                        projections[\"hits\"] = parseFloat(projections.singles) + parseFloat(projections.doubles) + parseFloat(projections.triples) + parseFloat(projections.homeruns);\n                    }\n                }\n                else if (league == \"nhl\" && !is_goalie){\n                    projections[\"shots on goal\"] = parseFloat(projections.shots);\n                    projections[\"power play points\"] = parseFloat(projections[\"power play goals\"]) + parseFloat(projections[\"power play assists\"]);\n                    if (!parseFloat(projections.points)){\n                        projections[\"points\"] = parseFloat(projections.goals) + parseFloat(projections.assists);\n                    }\n                }\n                else if (league == \"nfl\"){\n                    if (player.positions.includes('QB')){\n                        projections[\"total yards\"] = parseFloat(projections[\"pass yards\"]) + parseFloat(projections[\"rush yards\"]);\n                        projections[\"total tds\"] = parseFloat(projections[\"pass tds\"]) + parseFloat(projections[\"rush tds\"]);\n                        projections[\"interceptions\"] = parseFloat(projections[\"off interceptions\"]);\n                    }\n                    else{\n                        projections[\"total yards\"] = parseFloat(projections[\"rush yards\"]) + parseFloat(projections[\"rec yards\"]);\n                        projections[\"total tds\"] = parseFloat(projections[\"rush tds\"]) + parseFloat(projections[\"rec tds\"]);\n                    }\n                }\n            }\n        );\n    }\n    function buildPropCalcMetrics() {\n        let totals = {};\n        means = {};\n        //check that player_stats has at least 5 entries\n        if (player_stats.length < 5){\n            //use the placeholder variances instead\n            let vars = placeholder_variances;\n            let formatted_vars = {};\n            for (let stat in vars){\n                if(player.positions.includes('P') && league == \"mlb\" && stat == \"pitching_fantasy_points\"){\n                    formatted_vars[\"fantasy points\"] = vars[stat];\n                }\n                else if(league == \"nhl\" && stat == \"goalie_fantasy_points\"){\n                    if (is_goalie){\n                        formatted_vars[\"fantasy points\"] = vars[stat];\n                    }\n                }\n                else if(league == \"nhl\" && is_goalie && stat == \"fantasy_points\"){\n                    // the skater total; the goalie one is set above\n                }\n                else{\n                    let formatted_stat_key = stat.replace(/_plus_/g, \"+\");\n                    formatted_stat_key = formatted_stat_key.replace(/_/g, \" \");\n                    formatted_vars[formatted_stat_key] = vars[stat];\n                }\n            }\n            variances = formatted_vars;\n        }\n        else{\n            //calculate the variances for the stats\n            for(var gamelog of player_stats){\n                for(var stat in gamelog){\n                    //if totals[stat] is undefined, set it to 0\n                    if(totals[stat] === undefined){\n                        totals[stat] = 0;\n                    }\n                    totals[stat] += parseFloat(gamelog[stat]);\n                }\n            }\n            for(var stat in totals){\n                means[stat] = totals[stat] / player_stats.length;\n            }\n            if (league == \"nba\"){\n                means[\"steals+blocks\"] = parseFloat(means.steals) + parseFloat(means.blocks);\n                means[\"points+reb+ast\"] = parseFloat(means.points) + parseFloat(means.rebounds) + parseFloat(means.assists);\n            }\n            else if (league == \"mlb\"){\n                if(player.positions.includes('P')){\n                    \n                }\n                else{\n                    means[\"total bases\"] = parseFloat(means.singles) + parseFloat(means.doubles) * 2 + parseFloat(means.triples) * 3  + parseFloat(means.homeruns) * 4;\n                    means[\"runs+rbis\"] = parseFloat(means.runs) + parseFloat(means.rbis);\n                    means[\"hits\"] = parseFloat(means.singles) + parseFloat(means.doubles) + parseFloat(means.triples) + parseFloat(means.homeruns);\n                    means[\"hits+walks\"] = parseFloat(means.singles) + parseFloat(means.doubles) + parseFloat(means.triples) + parseFloat(means.homeruns) + parseFloat(means.walks);\n\n                }\n            }\n            else if (league == \"nhl\"){\n                means[\"points\"] = parseFloat(means.goals) + parseFloat(means.assists);\n                means[\"shots on goal\"] = parseFloat(means.shots);\n                means[\"blocked shots\"] = parseFloat(means.blocked_shots);\n                means[\"power play points\"] = parseFloat(means.power_play_goals) + parseFloat(means.power_play_assists);\n                means[\"shots against\"] = parseFloat(means.shots_against);\n                means[\"goals against\"] = parseFloat(means.goals_against);\n            }\n            else if (league == \"nfl\"){\n                means[\"interceptions\"] = parseFloat(means[\"off_interceptions\"]);\n                means[\"total_yards\"] = parseFloat(means.pass_yards) + parseFloat(means.rush_yards) + parseFloat(means.rec_yards);\n                means[\"total_tds\"] = parseFloat(means.pass_tds) + parseFloat(means.rush_tds) + parseFloat(means.rec_tds);\n            }\n            //for each number: subtract the Mean and square the result then get the mean of this\n            variances = {};\n            if (league == \"nba\"){\n                variances[\"points\"] = 0;\n                variances[\"rebounds\"] = 0;\n                variances[\"assists\"] = 0;\n                variances[\"steals\"] = 0;\n                variances[\"blocks\"] = 0;\n                variances[\"steals+blocks\"] = 0;\n                variances[\"points+reb+ast\"] = 0;\n                variances[\"fantasy points\"] = 0;\n            }\n            else if (league == \"mlb\"){\n                variances[\"fantasy points\"] = 0;\n                if(player.positions.includes('P')){\n                    variances[\"strikeouts\"] = 0;\n                    variances[\"earned_runs\"] = 0;\n                    variances[\"innings_pitched\"] = 0;\n                    variances[\"walks_allowed\"] = 0;\n                }\n                else{\n                    variances[\"rbis\"] = 0;\n                    variances[\"runs\"] = 0;\n                    variances[\"runs+rbis\"] = 0;\n                    variances[\"total bases\"] = 0;\n                    variances[\"hits\"] = 0;\n                    variances[\"hits+walks\"] = 0;\n                }\n            }\n            else if (league == \"nhl\"){\n                variances[\"fantasy points\"] = 0;\n                if (is_goalie){\n                    variances[\"saves\"] = 0;\n                    variances[\"shots against\"] = 0;\n                    variances[\"goals against\"] = 0;\n                }\n                else{\n                    variances[\"goals\"] = 0;\n                    variances[\"assists\"] = 0;\n                    variances[\"points\"] = 0;\n                    variances[\"shots on goal\"] = 0;\n                    variances[\"blocked shots\"] = 0;\n                    variances[\"power play points\"] = 0;\n                }\n            }\n            else if (league == \"nfl\"){\n                variances[\"fantasy points\"] = 0;\n                variances[\"pass_yards\"] = 0;\n                variances[\"rush_yards\"] = 0;\n                variances[\"rec_yards\"] = 0;\n                variances[\"total_yards\"] = 0;\n                variances[\"total_tds\"] = 0;\n                variances[\"receptions\"] = 0;\n                variances[\"pass_tds\"] = 0;\n                variances[\"rush_tds\"] = 0;\n                variances[\"rec_tds\"] = 0;\n                variances[\"interceptions\"] = 0;\n                variances[\"attempts\"] = 0;\n                variances[\"completions\"] = 0;\n                variances[\"carries\"] = 0;\n                variances[\"targets\"] = 0;\n            }\n            for(var gamelog of player_stats){\n                variances[\"fantasy points\"] += Math.pow(parseFloat(gamelog[\"fantasy points\"]) - means[\"fantasy points\"], 2);\n                if (league == \"nba\"){\n                    variances[\"points\"] += Math.pow(parseFloat(gamelog[\"points\"]) - means[\"points\"], 2);\n                    variances[\"rebounds\"] += Math.pow(parseFloat(gamelog[\"rebounds\"]) - means[\"rebounds\"], 2);\n                    variances[\"assists\"] += Math.pow(parseFloat(gamelog[\"assists\"]) - means[\"assists\"], 2);\n                    variances[\"steals\"] += Math.pow(parseFloat(gamelog[\"steals\"]) - means[\"steals\"], 2);\n                    variances[\"blocks\"] += Math.pow(parseFloat(gamelog[\"blocks\"]) - means[\"blocks\"], 2);\n                    variances[\"points+reb+ast\"] += Math.pow(parseFloat(gamelog[\"points\"]) + parseFloat(gamelog[\"rebounds\"]) + parseFloat(gamelog[\"assists\"]) - parseFloat(means[\"points+reb+ast\"]), 2);\n                    variances[\"steals+blocks\"] += Math.pow(parseFloat(gamelog[\"steals\"]) + parseFloat(gamelog[\"blocks\"]) - parseFloat(means[\"steals+blocks\"]), 2);\n                }\n                else if (league == \"mlb\"){\n                    if(player.positions.includes('P')){\n                        variances[\"strikeouts\"] += Math.pow(parseFloat(gamelog[\"strikeouts\"]) - means[\"strikeouts\"], 2);\n                        variances[\"earned_runs\"] += Math.pow(parseFloat(gamelog[\"earned_runs\"]) - means[\"earned_runs\"], 2);\n                        variances[\"innings_pitched\"] += Math.pow(parseFloat(gamelog[\"innings_pitched\"]) - means[\"innings_pitched\"], 2);\n                        variances[\"walks_allowed\"] += Math.pow(parseFloat(gamelog[\"walks_allowed\"]) - means[\"walks_allowed\"], 2);\n                    }\n                    else{\n                        variances[\"rbis\"] += Math.pow(parseFloat(gamelog[\"rbis\"]) - means[\"rbis\"], 2);\n                        variances[\"runs\"] += Math.pow(parseFloat(gamelog[\"runs\"]) - means[\"runs\"], 2);\n                        variances[\"runs+rbis\"] += Math.pow(parseFloat(gamelog[\"runs\"]) + parseFloat(gamelog[\"rbis\"]) - parseFloat(means[\"runs+rbis\"]), 2);\n                        variances[\"total bases\"] += Math.pow(parseFloat(gamelog.singles) + parseFloat(gamelog.doubles) * 2 + parseFloat(gamelog.triples) * 3  + parseFloat(gamelog.homeruns) * 4 - parseFloat(means[\"total bases\"]), 2);\n                        variances[\"hits\"] += Math.pow(parseFloat(gamelog.singles) + parseFloat(gamelog.doubles) + parseFloat(gamelog.triples) + parseFloat(gamelog.homeruns) - parseFloat(means[\"hits\"]), 2);\n                        variances[\"hits+walks\"] += Math.pow(parseFloat(gamelog.singles) + parseFloat(gamelog.doubles) + parseFloat(gamelog.triples) + parseFloat(gamelog.homeruns) + parseFloat(gamelog.walks) - parseFloat(means[\"hits+walks\"]), 2);\n                    }\n                }\n                else if(league == \"nhl\"){\n                    if (is_goalie){\n                        variances[\"saves\"] += Math.pow(parseFloat(gamelog[\"saves\"]) - means[\"saves\"], 2);\n                        variances[\"shots against\"] += Math.pow(parseFloat(gamelog[\"shots_against\"]) - means[\"shots against\"], 2);\n                        variances[\"goals against\"] += Math.pow(parseFloat(gamelog[\"goals_against\"]) - means[\"goals against\"], 2);\n                    }\n                    else{\n                        variances[\"goals\"] += Math.pow(parseFloat(gamelog[\"goals\"]) - means[\"goals\"], 2);\n                        variances[\"assists\"] += Math.pow(parseFloat(gamelog[\"assists\"]) - means[\"assists\"], 2);\n                        variances[\"points\"] += Math.pow(parseFloat(gamelog[\"goals\"]) + parseFloat(gamelog[\"assists\"]) - means[\"points\"], 2);\n                        variances[\"shots on goal\"] += Math.pow(parseFloat(gamelog[\"shots\"]) - means[\"shots on goal\"], 2);\n                        variances[\"blocked shots\"] += Math.pow(parseFloat(gamelog[\"blocked_shots\"]) - means[\"blocked shots\"], 2);\n                        variances[\"power play points\"] += Math.pow(parseFloat(gamelog[\"power_play_goals\"]) + parseFloat(gamelog[\"power_play_assists\"]) - means[\"power play points\"], 2);\n                    }\n                }\n                else if(league == \"nfl\"){\n                    variances[\"pass_yards\"] += Math.pow(parseFloat(gamelog[\"pass_yards\"]) - means[\"pass_yards\"], 2);\n                    variances[\"rush_yards\"] += Math.pow(parseFloat(gamelog[\"rush_yards\"]) - means[\"rush_yards\"], 2);\n                    variances[\"rec_yards\"] += Math.pow(parseFloat(gamelog[\"rec_yards\"]) - means[\"rec_yards\"], 2);\n                    variances[\"total_yards\"] += Math.pow(parseFloat(gamelog[\"pass_yards\"]) + parseFloat(gamelog[\"rush_yards\"]) + parseFloat(gamelog[\"rec_yards\"]) - parseFloat(means[\"total_yards\"]), 2);\n                    variances[\"total_tds\"] += Math.pow(parseFloat(gamelog[\"pass_tds\"]) + parseFloat(gamelog[\"rush_tds\"]) + parseFloat(gamelog[\"rec_tds\"]) - parseFloat(means[\"total_tds\"]), 2);\n                    variances[\"interceptions\"] += Math.pow(parseFloat(gamelog[\"off_interceptions\"]) - means[\"interceptions\"], 2);\n                    variances[\"receptions\"] += Math.pow(parseFloat(gamelog[\"receptions\"]) - means[\"receptions\"], 2);\n                    variances[\"pass_tds\"] += Math.pow(parseFloat(gamelog[\"pass_tds\"]) - means[\"pass_tds\"], 2);\n                    variances[\"rush_tds\"] += Math.pow(parseFloat(gamelog[\"rush_tds\"]) - means[\"rush_tds\"], 2);\n                    variances[\"rec_tds\"] += Math.pow(parseFloat(gamelog[\"rec_tds\"]) - means[\"rec_tds\"], 2);\n                    variances[\"attempts\"] += Math.pow(parseFloat(gamelog[\"attempts\"]) - parseFloat(means[\"attempts\"]), 2);\n                    variances[\"completions\"] += Math.pow(parseFloat(gamelog[\"completions\"]) - means[\"completions\"], 2);\n                    variances[\"carries\"] += Math.pow(parseFloat(gamelog[\"carries\"]) - means[\"carries\"], 2);\n                    variances[\"targets\"] += Math.pow(parseFloat(gamelog[\"targets\"]) - means[\"targets\"], 2);\n                }\n            }\n            for(var stat in variances){\n                variances[stat] = variances[stat] / player_stats.length;\n                //make sure the variance is not 0\n                if(variances[stat] == 0){\n                    variances[stat] = 0.25;\n                }\n            }\n        }\n    }\n</script>\n<style>\n    .consistent-height .tab-content {\n        display: flex;\n    }\n\n    .consistent-height .tab-content > .tab-pane {\n        display: block; /* undo \"display: none;\" */\n        visibility: hidden;\n        margin-right: -100%;\n        width: 100%;\n    }\n\n    .consistent-height .tab-content > .active {\n        visibility: visible;\n    }\n</style>\n<div>\n    <div id=\"player-info-holder\">\n        <div class=\"d-flex px-2 pt-2 flex-md-row border-bottom\">\n            <div class=\"col-6 align-self-end\">\n                <div class=\"d-none d-lg-block\" id=\"team-bg\" style=\"height: 0px; position:relative; z-index:0; max-height:200px;\">\n                    {#if league == \"mlb\"}\n                    <img style=\"position:absolute; aspect-ratio:1/1; opacity:.4; z-index:0; height:205px;\" alt=\"{player.team.short_name}\" id=\"team-photo\" src=\"{player.team_img}\" class=\"d-block mx-md-auto img-fluid\" loading=\"lazy\">\n                    {:else}\n                    <img style=\"position:absolute; top:-40px; opacity:.4; z-index:0; height:295px;\" alt=\"{player.team.short_name}\" id=\"team-photo\" src=\"{player.team_img}\" class=\"d-block mx-md-auto img-fluid\" loading=\"lazy\">\n                    {/if}\n                </div>\n                <div id=\"player-photo-holder\"  style=\"max-height: 200px; z-index:1; position:relative;\">\n                    <img style=\"max-height: 200px;\" id=\"player-photo\" onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\" src=\"{player.img}\" class=\"d-block mx-md-auto img-fluid\" alt=\"{player.name}\" loading=\"lazy\">\n                </div>\n            </div>\n            <div class=\"col-6 align-self-center\">\n                <h1 class=\"display-5 fw-bold lh-1 mb-1\" style=\"overflow-x:clip;\">{player.name}</h1>\n                <SeasonAvgTable league={league} averages={means} is_goalie={is_goalie}/>\n            </div>\n        </div>\n    </div>\n    <div class=\"consistent-height bg-white\" style=\"position: relative; z-index:1;\">\n        <ul class=\"nav nav-tabs\" id=\"myTab\" role=\"tablist\">\n            <li class=\"nav-item\" role=\"presentation\">\n            <button class=\"nav-link active\" id=\"prop-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#prop\" type=\"button\" role=\"tab\" aria-controls=\"home\" aria-selected=\"true\">Prop Calculator</button>\n            </li>\n            <li class=\"nav-item\" role=\"presentation\">\n            <button class=\"nav-link\" id=\"gamelog-tab\" data-bs-toggle=\"tab\" data-bs-target=\"#gamelog\" type=\"button\" role=\"tab\" aria-controls=\"profile\" aria-selected=\"false\">Gamelog</button>\n            </li>\n        </ul>\n        <div class=\"tab-content\">\n            <div class=\"tab-pane fade show active\" id=\"prop\" role=\"tabpanel\" aria-labelledby=\"prop-tab\">\n                <div id=\"prop-calc-holder\" class=\"bg-white\" style=\"position: relative; z-index:1;\">\n                    {#if prop_metrics}\n                        <PropCalculator premium_membership={premium_membership} league={league} stats={prop_metrics} props={props} fair_odds={fair_odds} market_lines={market_lines} gamelog={player_stats.slice(0, Math.min(player_stats.length, 5))}/>\n                    {/if}\n                </div>\n            </div>\n            <div class=\"tab-pane fade\" id=\"gamelog\" role=\"tabpanel\" aria-labelledby=\"gamelog-tab\">\n                <div id=\"game-log-holder\" class=\"bg-white\" style=\"position: relative; z-index:1;\">\n                    {#if player_stats}\n                        <Gamelog gamelog={player_stats} league={league} is_pitcher={player.positions.includes(\"P\")} is_qb={player.positions.includes(\"QB\")} is_goalie={is_goalie}/>\n                    {/if}\n                </div>\n            </div>\n        </div>\n    </div>\n</div>","<script>\n    import PlayerSummary from './PlayerSummary.svelte';\n    export let player;\n    export let league = \"nba\";\n    export let proj_id;\n    export let premium_membership = true;\n    export let placeholder_variances;\n</script>\n<div class=\"modal fade\" id=\"player-modal\" data-bs-keyboard=\"false\" tabindex=\"-1\" aria-labelledby=\"staticBackdropLabel\" aria-hidden=\"true\">\n    <div class=\"modal-dialog modal-dialog-centered modal-xl\">\n      <div class=\"modal-content\">\n        <div class=\"modal-body p-0\">\n            {#if player}\n            <PlayerSummary placeholder_variances={placeholder_variances} premium_membership={premium_membership} player={player} league={league} proj_id={proj_id}></PlayerSummary>\n            {/if}\n        </div>\n        <div class=\"modal-footer\">\n\t\t\t<div class=\"btn-group\" role=\"group\">\n\t\t\t\t<button type=\"button\" class=\"btn btn-secondary\" data-bs-dismiss=\"modal\">Close</button>\n\t\t\t</div>\n        </div>\n      </div>\n    </div>\n</div>","<script>\n    // Import Swiper Svelte components\n    import { Navigation, Pagination, Scrollbar, A11y } from \"swiper\";\n    import { Swiper, SwiperSlide } from \"swiper/svelte/swiper-svelte.js\";\n    import {\n        searchFilter,\n        positionFilter,\n        getTeams,\n        filterByTeam,\n        gameStrings,\n    } from \"./filter_utils.js\";\n    import GameCard from \"./GameCard.svelte\";\n    import Lineup from \"./Lineup.svelte\";\n    import PlayerCard from \"./PlayerCard.svelte\";\n    import PlayerModal from \"./PlayerModal.svelte\";\n    import PremiumOnly from \"./PremiumOnly.svelte\";\n    import \"swiper/swiper-bundle.min.css\";\n    // swiper core styles\n    import \"swiper/swiper.min.css\";\n    import { onMount } from \"svelte\";\n    // modules styles\n    import \"swiper/modules/navigation/navigation.min.css\";\n    import \"swiper/modules/pagination/pagination.min.css\";\n    let pos_filter = \"all\";\n\n    let projFP = 0;\n    let strategy = \"projection\";\n    let strategy_impact = 1;\n    let exposure_strategy = \"none\";\n    let exposure_strategy_impact = 0.5;\n    var generated_lineups = [];\n    var lineups_summary = [];\n    let playerSearchString = \"\";\n    let sortableCols = { name: 0, salary: 0, proj: 0, val: 0 };\n    export let players;\n    export let games;\n    export let salary;\n    export let slate_id;\n    export let upcoming_slates;\n    export let roster;\n    export let ruleset_name;\n    export let league;\n    export let position_filters = [\"PG\", \"SG\", \"SF\", \"PF\", \"C\"];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n    let num_lineups = \"3\";\n    if (!premium_membership){\n        num_lineups = \"1\";\n    }\n    let teamStacks = [];\n    let gameStacks = [];\n    let positionStacks = [];\n    let selectedTeam = \"all\";\n    let teams = getTeams(games);\n    let mobile = window.innerWidth < 768;\n    let startSalary = salary;\n    let dragged_player_index = null;\n    let players_rostered = 0;\n    let roster_size = Object.keys(roster).length;\n    let teamGameStrings = gameStrings(games);\n    let modal_projection_id;\n    let modal_player;\n    function showPremiumModal() {\n        let myModal = new bootstrap.Modal(\n            document.getElementById(\"premium-modal\")\n        );\n        myModal.show();\n    }\n    function showPlayerModal(player) {\n        modal_projection_id = player.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(\n            document.getElementById(\"player-modal\")\n        );\n        myModal.show();\n    }\n    onMount(() => {\n        sortByX(\"salary\");\n    });\n    function checkMobile() {\n        if (window.innerWidth < 768) {\n            mobile = true;\n        } else {\n            mobile = false;\n        }\n    }\n    window.onresize = checkMobile;\n    function sortByX(key, toggle = 1) {\n        if (key == \"val\") {\n            sortByValue(toggle);\n            return;\n        }\n        if (sortableCols[key] == 1) {\n            sortableCols[key] = -1 * toggle;\n        } else {\n            sortableCols[key] = 1 * toggle;\n        }\n        players.sort((a, b) =>\n            a[key] > b[key] ? -1 * sortableCols[key] : 1 * sortableCols[key]\n        );\n        players = players;\n        for (var prop in sortableCols) {\n            if (prop != key) {\n                sortableCols[prop] = 0;\n            }\n        }\n        sortableCols = sortableCols;\n    }\n    function showSlateSelect() {\n        //check if slate_id is in upcoming_slates\n        for (let i = 0; i < upcoming_slates.length; i++) {\n            if (upcoming_slates[i].slate_id == slate_id) {\n                return true;\n            }\n        }\n        return false;\n    }\n    function sortByValue(toggle = 1) {\n        if (sortableCols[\"val\"] == 1) {\n            sortableCols[\"val\"] = -1 * toggle;\n        } else {\n            sortableCols[\"val\"] = 1 * toggle;\n        }\n        players.sort((a, b) =>\n            a.proj / a.salary > b.proj / b.salary\n                ? -1 * sortableCols[\"val\"]\n                : 1 * sortableCols[\"val\"]\n        );\n        for (var prop in sortableCols) {\n            if (prop != \"val\") {\n                sortableCols[prop] = 0;\n            }\n        }\n        sortableCols = sortableCols;\n        players = players;\n    }\n    function optimizeLineup() {\n        window.showLoadingDiv(\"Optimizing Lineups...\");\n        fetch(`/optimize/${league}/`, {\n            method: \"POST\",\n            headers: {\n                \"Content-Type\": \"application/json\",\n                Accept: \"application/json\",\n                \"X-CSRFToken\": window.getCookie(\"csrftoken\"), //global function\n            },\n            body: JSON.stringify({\n                roster: roster,\n                available_players: players,\n                num_lineups: num_lineups,\n                ruleset_name: ruleset_name,\n                strategy: strategy,\n                strategy_impact: strategy_impact,\n                exposure_strategy: exposure_strategy,\n                exposure_strategy_impact: exposure_strategy_impact,\n                gameStacks: gameStacks,\n                teamStacks: teamStacks,\n                positionStacks: positionStacks,\n                games: games,\n            }),\n        })\n            .then((response) => response.json())\n            .then((data) => {\n                window.hideLoadingDiv();\n                generated_lineups = data.lineups;\n                lineups_summary = data.summary;\n                let myModal = new bootstrap.Modal(\n                    document.getElementById(\"lineup-modal\")\n                );\n                myModal.show();\n            })\n            .catch((error) => {\n                window.hideLoadingDiv();\n                console.log(error);\n                alert(\"Error Creating Lineups! Please edit your criteria and try again.\");\n            });\n    }\n    function positionsValid(player) {\n        for (var pos of player.positions) {\n            for (var key in roster) {\n                if (\n                    roster[key].fillable_by.includes(pos) &&\n                    roster[key].player == null\n                ) {\n                    return key;\n                }\n            }\n        }\n        return false;\n    }\n    function salaryValid(player) {\n        return canRosterAnywhere(player);\n    }\n    // Helpers for slot-based salary multipliers (fallback to points multiplier if salary_multiplier is missing)\n    function getSlotSalaryMultiplier(pos) {\n        const slot = roster[pos] || {};\n        if (slot.salary_multiplier != null) return slot.salary_multiplier;\n        if (slot.multiplier != null) return slot.multiplier;\n        return 1;\n    }\n    function calcSlotCost(player, pos) {\n        return Math.round(player.salary * getSlotSalaryMultiplier(pos));\n    }\n    function displayedSlotSalary(pos) {\n        const slot = roster[pos];\n        if (!slot || !slot.player) return 0;\n        return calcSlotCost(slot.player, pos);\n    }\n\n    // Find all open, fillable, and affordable slots for a player\n    function affordableSlotsFor(player) {\n        const options = [];\n        for (const key in roster) {\n            const slot = roster[key];\n            if (!slot || slot.player != null) continue;\n            for (const dp_pos of player.positions) {\n                if (slot.fillable_by.includes(dp_pos)) {\n                    const cost = calcSlotCost(player, key);\n                    if (cost <= salary) {\n                        options.push({ key, cost });\n                        break;\n                    }\n                }\n            }\n        }\n        return options;\n    }\n    // Choose the cheapest affordable slot for a player\n    function findAffordableSlot(player) {\n        const options = affordableSlotsFor(player);\n        if (options.length === 0) return false;\n        options.sort((a, b) => {\n            const am = (roster[a.key] && roster[a.key].multiplier != null) ? roster[a.key].multiplier : 1;\n            const bm = (roster[b.key] && roster[b.key].multiplier != null) ? roster[b.key].multiplier : 1;\n            if (players_rostered === 0 && am !== bm) return bm - am; // favor highest multiplier (e.g., MVP) when nothing is locked\n            return a.cost - b.cost; // otherwise cheapest slot\n        });\n        return options[0].key;\n    }\n    // Can the player be rostered in any valid slot given current salary?\n    function canRosterAnywhere(player) {\n        return affordableSlotsFor(player).length > 0;\n    }\n    function includePlayer(index) {\n        players[index].considered = true;\n    }\n    function excludePlayer(index) {\n        players[index].considered = false;\n    }\n    function rosterPlayer(index) {\n        let player = players[index];\n        let pos = findAffordableSlot(player);\n        if (!pos) {\n            alert(\"You have no open roster slots for this player!\");\n            return;\n        }\n        const cost = calcSlotCost(player, pos);\n        players.splice(index, 1);\n        players = players;\n        roster[pos].player = player;\n        salary -= cost;\n        projFP += player.proj * roster[pos].multiplier;\n        projFP = Math.round(projFP * 10) / 10;\n        players_rostered += 1;\n    }\n    function clearRoster() {\n        for (var pos in roster) {\n            if (roster[pos].player === null) {\n                continue;\n            } else {\n                players.push(roster[pos].player);\n                roster[pos].player = null;\n            }\n        }\n        roster = roster;\n        players = players;\n        salary = startSalary;\n        projFP = 0;\n        players_rostered = 0;\n        for (var prop in sortableCols) {\n            if (sortableCols[prop] != 0) {\n                sortByX(prop, -1);\n            }\n        }\n    }\n    function unrosterPlayer(pos) {\n        if (roster[pos].player === null) {\n            return;\n        }\n        let player = roster[pos].player;\n        players.push(player);\n        players = players;\n        salary += calcSlotCost(player, pos);\n        projFP -= player.proj * roster[pos].multiplier;\n        projFP = Math.round(projFP * 10) / 10;\n        roster[pos].player = null;\n        for (var prop in sortableCols) {\n            if (sortableCols[prop] != 0) {\n                sortByX(prop, -1);\n            }\n        }\n        players_rostered -= 1;\n    }\n    function drag(event, index) {\n        dragged_player_index = index;\n        let dragged_player = players[index];\n        setTimeout(function () {\n            event.target.classList.add(\"hide\");\n        });\n        for (var pos of dragged_player.positions) {\n            // check if pos starts with a number\n            if (pos == \"1B\") {\n                pos = \"\\\\31 B\";\n            }\n            else if(pos == \"C/1B\"){\n                pos = \"C\\\\/1B\";\n            }\n            else if(pos == \"2B\"){\n                pos = \"\\\\32 B\";\n            }\n            else if(pos == \"3B\"){\n                pos = \"\\\\33 B\";\n            }\n            document.querySelectorAll(`[class*=\"${pos}\"]`).forEach((ref) => {\n                ref.classList.add(\"highlight\");\n            });\n        }\n        const newDiv = document.createElement(\"div\");\n        newDiv.classList.add(\"drag-ele\");\n        newDiv.classList.add(\"card\");\n        newDiv.classList.add(\"px-2\");\n        newDiv.classList.add(\"d-flex\");\n        newDiv.classList.add(\"flex-row\");\n        newDiv.style.borderRadius = \"10px\";\n        const dragImg = document.createElement(\"img\");\n        dragImg.setAttribute(\"src\", dragged_player.img_thumb);\n        dragImg.classList.add(\"img-fluid\");\n        dragImg.style.height = \"100px\";\n        const playerDiv = document.createElement(\"div\");\n        playerDiv.classList.add(\"d-flex\");\n        playerDiv.classList.add(\"flex-column\");\n        playerDiv.classList.add(\"align-items-center\");\n        playerDiv.classList.add(\"justify-content-center\");\n        playerDiv.classList.add(\"text-center\");\n        const textDiv = document.createElement(\"div\");\n        textDiv.classList.add(\"d-flex\");\n        textDiv.classList.add(\"flex-column\");\n        textDiv.classList.add(\"align-items-center\");\n        textDiv.classList.add(\"justify-content-center\");\n        textDiv.classList.add(\"text-center\");\n        const imgDiv = document.createElement(\"div\");\n        const nameDiv = document.createElement(\"div\");\n        const salaryDiv = document.createElement(\"div\");\n        salaryDiv.classList.add(\"text-success\");\n        const projDiv = document.createElement(\"div\");\n        salaryDiv.style.whiteSpace = \"nowrap\";\n        projDiv.style.whiteSpace = \"nowrap\";\n        projDiv.classList.add(\"text-primary\");\n        const nameText = document.createTextNode(`${dragged_player.name}`);\n        const salaryText = document.createTextNode(\n            `💸${dragged_player.salary}`\n        );\n        const projText = document.createTextNode(`📊${dragged_player.proj}`);\n\n        imgDiv.appendChild(dragImg);\n        nameDiv.appendChild(nameText);\n        salaryDiv.appendChild(salaryText);\n        projDiv.appendChild(projText);\n        playerDiv.appendChild(imgDiv);\n        textDiv.appendChild(nameDiv);\n        textDiv.appendChild(salaryDiv);\n        textDiv.appendChild(projDiv);\n        newDiv.appendChild(playerDiv);\n        newDiv.appendChild(textDiv);\n        newDiv.style.position = \"absolute\";\n        newDiv.style.top = \"-1000px\";\n        document.body.appendChild(newDiv);\n        event.dataTransfer.setDragImage(newDiv, 230, 10);\n    }\n    function dragend(event) {\n        setTimeout(function () {\n            event.target.classList.remove(\"hide\");\n        });\n        document.querySelectorAll(\".highlight\").forEach((ele) => {\n            ele.classList.remove(\"highlight\");\n        });\n    }\n    function drop(pos) {\n        document.querySelectorAll(\".highlight\").forEach((ele) => {\n            ele.classList.remove(\"highlight\");\n        });\n        let dragged_player = players[dragged_player_index];\n        const cost = calcSlotCost(dragged_player, pos);\n        if (cost > salary) {\n            alert(\"Not enough salary to roster this player!\");\n            return;\n        }\n        players.splice(dragged_player_index, 1);\n        players = players;\n        roster[pos].player = dragged_player;\n        salary -= cost;\n        projFP += dragged_player.proj * roster[pos].multiplier;\n        projFP = Math.round(projFP * 10) / 10;\n        players_rostered += 1;\n    }\n    function allowDrop(event, pos) {\n        let dragged_player = players[dragged_player_index];\n        let allowable = false;\n\n        for (var dp_pos of dragged_player.positions) {\n            if (roster[pos].fillable_by.includes(dp_pos)) {\n                allowable = true;\n            }\n        }\n        if (!allowable) {\n            return;\n        }\n        // Ensure sufficient salary for this slot considering multiplier\n        if (calcSlotCost(dragged_player, pos) > salary) {\n            return;\n        }\n        if (pos == \"1B\") {\n            pos = \"\\\\31 B\";\n        }\n        else if(pos == \"C/1B\"){\n            pos = \"C\\\\/1B\";\n        }\n        else if(pos == \"2B\"){\n            pos = \"\\\\32 B\";\n        }\n        else if(pos == \"3B\"){\n            pos = \"\\\\33 B\";\n        }\n        event.target.classList.add(\"over\");\n        event.preventDefault();\n    }\n    function handleLeave(event) {\n        event.target.classList.remove(\"over\");\n    }\n    function createCSVContent(include_header = true, delimiter = \",\") {\n        let csv = \"\";\n        //add the position names to top row of the csv\n        if (include_header) {\n            for (var pos in roster) {\n                csv += `${roster[pos].csv_name}${delimiter}`;\n            }\n            csv += \"\\n\";\n        }\n        //add player ids from generated_lineups to csv\n        for (var lineup_info of generated_lineups) {\n            for (var player of lineup_info.lineup) {\n                csv += `${player.slate_id}${delimiter}`;\n            }\n            csv += \"\\n\";\n        }\n        return csv;\n    }\n    function createCSV() {\n        let csv = createCSVContent();\n        //download csv\n        var hiddenElement = document.createElement(\"a\");\n        hiddenElement.href = \"data:text/csv;charset=utf-8,\" + encodeURI(csv);\n        hiddenElement.target = \"_blank\";\n        //current timestamp\n        let timestamp = new Date().getTime();\n        hiddenElement.download = `generated_linups-${timestamp}.csv`;\n        hiddenElement.click();\n    }\n    function copyToClipboard() {\n        let csv = createCSVContent(false, \"\\t\");\n        navigator.clipboard.writeText(csv);\n    }\n</script>\n\n<div\n    class=\"modal fade\"\n    id=\"premium-modal\"\n    data-bs-keyboard=\"false\"\n    tabindex=\"-1\"\n    aria-labelledby=\"staticBackdropLabel\"\n    aria-hidden=\"true\"\n>\n    <div class=\"modal-dialog modal-dialog-centered modal-xl\">\n        <div class=\"modal-content\">\n            <div class=\"modal-body p-0\">\n                <PremiumOnly\n                    title_text={\"GigaStuds Only!\"}\n                    text={\"The ability to generate additional lineups is only available to GigaStuds. <a class='text-decoration-none' href='/purchase-premium'>Become a GigaStud</a> to gain access to all DFStud features!!\"}\n                    logo_url={window.logo_url}\n                />\n            </div>\n            <div class=\"modal-footer\">\n                <div class=\"btn-group\" role=\"group\">\n                    <button\n                        type=\"button\"\n                        class=\"btn btn-secondary\"\n                        data-bs-dismiss=\"modal\">Close</button\n                    >\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n\n<PlayerModal\n    placeholder_variances={placeholder_variances}\n    player={modal_player}\n    proj_id={modal_projection_id}\n    premium_membership={premium_membership}\n    league={league}\n/>\n{#if generated_lineups}\n    <div\n        class=\"modal fade\"\n        id=\"lineup-modal\"\n        data-bs-backdrop=\"static\"\n        data-bs-keyboard=\"false\"\n        tabindex=\"-1\"\n        aria-labelledby=\"staticBackdropLabel\"\n        aria-hidden=\"true\"\n    >\n        <div class=\"modal-dialog modal-dialog-centered modal-xl\">\n            <div class=\"modal-content\" style=\"background: rgb(233, 236, 239);\">\n                <div class=\"modal-header\">\n                    <h5 class=\"modal-title\" id=\"staticBackdropLabel\">\n                        Generated Lineups\n                    </h5>\n                    <button\n                        type=\"button\"\n                        class=\"btn-close\"\n                        data-bs-dismiss=\"modal\"\n                        aria-label=\"Close\"\n                    />\n                </div>\n                <div class=\"modal-body\">\n                    <Swiper\n                        modules={[Navigation, Pagination, Scrollbar, A11y]}\n                        spaceBetween={10}\n                        navigation={!mobile}\n                        pagination={{ type: \"progressbar\", clickable: true }}\n                        breakpoints={{\n                            320: {\n                                slidesPerView: 1,\n                                spaceBetween: 10,\n                            },\n                            768: {\n                                slidesPerView: 1,\n                                spaceBetween: 10,\n                            },\n                            1024: {\n                                slidesPerView: 2,\n                                spaceBetween: 10,\n                            },\n                            1280: {\n                                slidesPerView: 2,\n                                spaceBetween: 10,\n                            },\n                            1920: {\n                                slidesPerView: 3,\n                                spaceBetween: 10,\n                            },\n                        }}\n                    >\n                        {#each generated_lineups as lineup}\n                            <SwiperSlide\n                                ><Lineup lineup_details={lineup} /></SwiperSlide\n                            >\n                        {/each}\n                    </Swiper>\n                </div>\n                <div class=\"modal-footer\">\n                    <div class=\"btn-group\" role=\"group\">\n                        <button\n                            type=\"button\"\n                            class=\"btn btn-outline-secondary\"\n                            data-bs-dismiss=\"modal\"\n                            >Generate More Lineups</button\n                        >\n                        <button\n                            class=\"btn btn-secondary\"\n                            data-bs-target=\"#summary-modal\"\n                            data-bs-toggle=\"modal\"\n                            data-bs-dismiss=\"modal\">Lineups Summary</button\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"btn btn-outline-primary\"\n                            on:click={() => copyToClipboard()}>📋Copy to Clipboard</button\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"btn btn-primary\"\n                            on:click={() => createCSV()}>💾Export to CSV</button\n                        >\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n    <div\n        class=\"modal fade\"\n        id=\"summary-modal\"\n        aria-hidden=\"true\"\n        aria-labelledby=\"exampleModalToggleLabel2\"\n        tabindex=\"-1\"\n    >\n        <div\n            class=\"modal-dialog modal-dialog-centered modal-dialog-scrollable modal-xl\"\n        >\n            <div class=\"modal-content\">\n                <div class=\"modal-header\">\n                    <h5 class=\"modal-title\" id=\"exampleModalToggleLabel2\">\n                        Summary\n                    </h5>\n                    <button\n                        type=\"button\"\n                        class=\"btn-close\"\n                        data-bs-dismiss=\"modal\"\n                        aria-label=\"Close\"\n                    />\n                </div>\n                <div class=\"modal-body\">\n                    <h5>Lineups Generated: {generated_lineups.length}</h5>\n                    <h5>Distinct Players Played: {lineups_summary.length}</h5>\n                    {#if lineups_summary.length > 0}\n                        <h5>\n                            Most Played: {lineups_summary[0][1][0].name} | {lineups_summary[1][1][0]\n                                .name} | {lineups_summary[2][1][0].name}\n                        </h5>\n                        <h5>\n                            Least Played: {lineups_summary[\n                                lineups_summary.length - 1\n                            ][1][0].name} | {lineups_summary[\n                                lineups_summary.length - 2\n                            ][1][0].name} | {lineups_summary[\n                                lineups_summary.length - 3\n                            ][1][0].name}\n                        </h5>\n                    {/if}\n                    <!--table of the summary-->\n                    <table class=\"table table-hover\">\n                        <thead\n                            ><tr>\n                                <th>Player</th><th>Exposure</th><th\n                                    >Times Rostered</th\n                                >\n                            </tr></thead\n                        >\n                        <tbody>\n                            {#each lineups_summary as player}\n                                <tr\n                                    ><td class=\"pb-0\"\n                                        ><img\n                                            alt=\"{player[1][0].name}\"\n                                            loading=\"lazy\"\n                                            height=\"50\"\n                                            src={player[1][0].img_thumb}\n                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                        />{player[1][0].name}</td\n                                    ><td\n                                        >{(\n                                            player[1][1] /\n                                            generated_lineups.length\n                                        ).toFixed(2)}</td\n                                    ><td>{player[1][1]}</td></tr\n                                >\n                            {/each}\n                        </tbody>\n                    </table>\n                </div>\n                <div class=\"modal-footer\">\n                    <button\n                        class=\"btn btn-primary\"\n                        data-bs-target=\"#lineup-modal\"\n                        data-bs-toggle=\"modal\"\n                        data-bs-dismiss=\"modal\">Back to Lineups</button\n                    >\n                </div>\n            </div>\n        </div>\n    </div>\n{/if}\n<div\n    class=\"modal fade\"\n    id=\"settings-modal\"\n    tabindex=\"-1\"\n    aria-labelledby=\"settings-modal-label\"\n    aria-hidden=\"true\"\n>\n    <div class=\"modal-dialog modal-xl\">\n        <div class=\"modal-content\">\n            <div class=\"modal-header\">\n                <h5 class=\"modal-title\" id=\"settings-modal-label\">\n                    ⚙️Advanced Settings\n                </h5>\n                <button\n                    type=\"button\"\n                    class=\"btn-close\"\n                    data-bs-dismiss=\"modal\"\n                    aria-label=\"Close\"\n                />\n            </div>\n            <div class=\"modal-body\">\n                {#if premium_membership}\n                    <h4>Fantasy Points Strategy</h4>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"fp_strategy\"\n                            bind:group={strategy}\n                            id=\"inlineRadio1\"\n                            value={\"projection\"}\n                        />\n                        <label class=\"form-check-label\" for=\"inlineRadio1\"\n                            >Projection only</label\n                        >\n                    </div>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"fp_strategy\"\n                            bind:group={strategy}\n                            id=\"inlineRadio2\"\n                            value={\"random\"}\n                        />\n                        <label class=\"form-check-label\" for=\"inlineRadio2\"\n                            >Randomization</label\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"rounded\"\n                            data-bs-toggle=\"tooltip\"\n                            data-bs-placement=\"top\"\n                            title=\"Randomization adds some deviation for players projection for creating less optimized but more randomized lineups. Low sets the max deviation to 12%, Mid to 18%, and High to 24%\"\n                            >❔</button\n                        >\n                    </div>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"fp_strategy\"\n                            bind:group={strategy}\n                            id=\"inlineRadio3\"\n                            value={\"progressive\"}\n                        />\n                        <label class=\"form-check-label\" for=\"inlineRadio3\"\n                            >Progressive</label\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"rounded\"\n                            data-bs-toggle=\"tooltip\"\n                            data-bs-placement=\"top\"\n                            title=\"Progressive increases fantasy points for each player that wasn’t used in the previous lineup by some specified percent (Low 1%, Mid 2%, High 3%) of original fantasy points. It works cumulatively so fantasy points will be greater if the player wasn’t used in the lineup multiple times. After the player will be selected to lineup his points will be reset to the original value. This method will automatically exclude players with non-viable value projections.\"\n                            >❔</button\n                        >\n                    </div>\n                    {#if strategy != \"projection\"}\n                        <!--slider to select low medium high for strategy impact-->\n                        <div class=\"form-group\">\n                            <label for=\"customRange2\" class=\"form-label h6\"\n                                >Strategy Impact -\n                                {#if strategy_impact == 0}\n                                    Low\n                                {:else if strategy_impact == 1}\n                                    Medium\n                                {:else if strategy_impact == 2}\n                                    High\n                                {/if}\n                            </label>\n                            <input\n                                type=\"range\"\n                                bind:value={strategy_impact}\n                                class=\"form-range\"\n                                min=\"0\"\n                                max=\"2\"\n                                id=\"customRange2\"\n                            />\n                        </div>\n                    {/if}\n                    <hr />\n                    <h4>Exposure Strategy</h4>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"exposure_strategy\"\n                            bind:group={exposure_strategy}\n                            id=\"exposeRadio1\"\n                            value={\"none\"}\n                        />\n                        <label class=\"form-check-label\" for=\"exposeRadio1\"\n                            >None</label\n                        >\n                    </div>\n                    <div class=\"form-check\">\n                        <input\n                            class=\"form-check-input\"\n                            type=\"radio\"\n                            name=\"exposure_strategy\"\n                            bind:group={exposure_strategy}\n                            id=\"exposeRadio2\"\n                            value={\"exposure\"}\n                        />\n                        <label class=\"form-check-label\" for=\"exposeRadio2\"\n                            >Limit Exposure</label\n                        >\n                        <button\n                            type=\"button\"\n                            class=\"rounded\"\n                            data-bs-toggle=\"tooltip\"\n                            data-bs-placement=\"top\"\n                            title=\"Limiting Exposure limits the maximum percentage of lineups that a player can appear in. Note: Locking a player ignores maximum exposure and they will still appear in every lineup.\"\n                            >❔</button\n                        >\n                    </div>\n                    {#if exposure_strategy != \"none\"}\n                        <!--slider to select low medium high for strategy impact-->\n                        <div class=\"form-group\">\n                            <label for=\"customRange3\" class=\"form-label h6\"\n                                >Max Exposure - {exposure_strategy_impact}</label\n                            >\n                            <input\n                                type=\"range\"\n                                bind:value={exposure_strategy_impact}\n                                class=\"form-range\"\n                                min=\"0\"\n                                step=\".01\"\n                                max=\"1\"\n                                id=\"customRange3\"\n                            />\n                        </div>\n                    {/if}\n                        <hr />\n                        <h4 class=\"text-center\">Stacking</h4>\n                        {#if games.length > 1}\n                        <div>\n                            <h5>Game Stack</h5>\n                            <p>Specify how many \n                            {#if league == \"mlb\"}\n                                batters\n                            {:else}\n                                players\n                            {/if} you want from the same game</p>\n                            {#each gameStacks as gs}\n                                <form class=\"row row-cols-lg-auto g-3 align-items-center mb-1 justify-content-center\">\n                                    <div class=\"col-12\">At Least</div>\n                                    <div class=\"col-12\">\n                                        <input min=\"2\" max=\"8\" class=\"form-control\" bind:value={gs.min} type=\"number\">\n                                    </div>\n                                    <div class=\"col-12\">\n                                    {#if league == \"mlb\"}\n                                        batter(s)\n                                    {:else}\n                                        player(s)\n                                    {/if} from the same game with at least</div>\n                                    <div class=\"col-12\">\n                                        <input min=\"1\" max=\"4\" class=\"form-control\" bind:value={gs.min_each_team} type=\"number\">\n                                    </div>\n                                    <div class=\"col-12\">\n                                    {#if league == \"mlb\"}\n                                        batter(s)\n                                    {:else}\n                                        player(s)\n                                    {/if} from each team</div>\n                                    \n                                    <div style=\"cursor:pointer;\" on:click={() => {gameStacks = gameStacks.filter(function(item){return item !== gs})}} class=\"col-12\">❌</div>\n                                </form>\n                            {/each}\n                            <div class=\"d-flex\">\n                                {#if gameStacks.length == 0}\n                                <button\n                                type=\"button\"\n                                class=\"btn btn-primary mx-auto\"\n                                on:click={() => {gameStacks=[];gameStacks.push({min: 2, game: games[0].game_id, min_each_team: 1}); gameStacks=gameStacks;}}\n                                >Add a Game Stack</button>\n                                {/if}\n                            </div>\n                        </div>\n                        <hr>\n                        {/if}\n                        <div>\n                            <h5>Team Stacks</h5>\n                            <p>Specify how many \n                            {#if league == \"mlb\"}\n                                batters\n                            {:else}\n                                players\n                            {/if} you want from certain teams</p>\n                            {#each teamStacks as ts}\n                                <form class=\"row row-cols-lg-auto g-3 align-items-center mb-1 justify-content-center\">\n                                    <div class=\"col-12\">At Least</div>\n                                    <div class=\"col-12\">\n                                        <input min=\"1\" max=\"4\" class=\"form-control\" bind:value={ts.min} type=\"number\">\n                                    </div>\n                                    <div class=\"col-12\">\n                                        {#if league == \"mlb\"}\n                                            batter(s)\n                                        {:else}\n                                            player(s)\n                                        {/if}\n                                     from the</div>\n                                    <div class=\"col-12\">\n                                    <select class=\"form-select\" bind:value={ts.team}>\n                                        {#each teams as team}\n                                            <option value={team.short_name}\n                                                >{team.city} {team.mascot}</option\n                                            >\n                                        {/each}\n                                        </select>\n                                    </div>\n                                    <div style=\"cursor:pointer;\" on:click={() => {teamStacks = teamStacks.filter(function(item){return item !== ts})}} class=\"col-12\">❌</div>\n                                </form>\n                            {/each}\n                            <div class=\"d-flex\">\n                                <button\n                                type=\"button\"\n                                class=\"btn btn-primary mx-auto\"\n                                on:click={() => {teamStacks.push({min: 2, team: teams[0].short_name}); teamStacks=teamStacks;}}\n                                >Add a Team Stack</button>\n                            </div>\n                        </div>\n                        <hr>\n\n                        <div>\n                            <h5>Position Stacks</h5>\n                            <p>The Optimizer will create lineups with \n                                {#if league == \"mlb\"}\n                                    batters\n                                {:else}\n                                    players\n                                {/if}\n                            on the same team that play the specified positions. You can select more than one position per dropdown.</p>\n                            {#each positionStacks as ps}\n                                <form class=\"row row-cols-lg-auto g-3 align-items-center mb-1 justify-content-center\">\n                                    {#each ps.positions as pos}\n                                        <div class=\"col-12\">\n                                            \n                                            <select class=\"form-select\" bind:value={pos} multiple>\n                                                {#if league == \"nfl\"}\n                                                <option value=\"QB\">QB</option>\n                                                <option value=\"RB\">RB</option>\n                                                <option value=\"WR\">WR</option>\n                                                <option value=\"TE\">TE</option>\n                                                <option value=\"DST\">DST</option>\n                                                {/if}\n                                                {#if league == \"nba\"}\n                                                <option value=\"PG\">PG</option>\n                                                <option value=\"SG\">SG</option>\n                                                <option value=\"SF\">SF</option>\n                                                <option value=\"PF\">PF</option>\n                                                <option value=\"C\">C</option>\n                                                {/if}\n                                                {#if league == \"mlb\"}\n                                                <option value=\"P\">P</option>\n                                                <option value=\"C\">C</option>\n                                                <option value=\"\\1B\">1B</option>\n                                                <option value=\"\\2B\">2B</option>\n                                                <option value=\"\\3B\">3B</option>\n                                                <option value=\"SS\">SS</option>\n                                                <option value=\"OF\">OF</option>\n                                                {/if}\n                                                {#if league == \"nhl\"}\n                                                <option value=\"C\">C</option>\n                                                <option value=\"W\">W</option>\n                                                <option value=\"D\">D</option>\n                                                <option value=\"G\">G</option>\n                                                {/if}\n                                            </select>\n                                        </div>\n                                    {/each}\n                                    <div class=\"col-12\">\n                                        <button\n                                        type=\"button\"\n                                        class=\"btn btn-primary mx-auto\"\n                                        on:click={() => {\n                                            if (league == \"nfl\"){\n                                                ps.positions.push(\"QB\"); ps.positions=ps.positions;\n                                            }\n                                            if (league == \"nba\"){\n                                                ps.positions.push(\"PG\"); ps.positions=ps.positions;\n                                            }\n                                            if (league == \"mlb\"){\n                                                ps.positions.push(\"C\"); ps.positions=ps.positions;\n                                            }\n                                            if (league == \"nhl\"){\n                                                ps.positions.push(\"C\"); ps.positions=ps.positions;\n                                            }\n                                            }}\n                                        >Add a Position Group</button>\n                                    </div>\n                                    <div style=\"cursor:pointer;\" on:click={() => {positionStacks = positionStacks.filter(function(item){return item !== ps})}} class=\"col-12\">❌</div>\n                                </form>\n                            {/each}\n                            <div class=\"d-flex\">\n                                <button\n                                type=\"button\"\n                                class=\"btn btn-primary mx-auto\"\n                                on:click={() => {\n                                    let my_stack = {positions: []};\n                                    if (league == \"nfl\"){\n                                        my_stack.positions.push(\"QB\");\n                                        my_stack.positions.push(\"WR\");\n                                    }\n                                    if (league == \"nba\"){\n                                        my_stack.positions.push(\"PG\");\n                                        my_stack.positions.push(\"PF\");\n                                    }\n                                    if (league == \"mlb\"){\n                                        my_stack.positions.push(\"C\");\n                                        my_stack.positions.push(\"OF\");\n                                    }\n                                    if (league == \"nhl\"){\n                                        my_stack.positions.push(\"C\");\n                                        my_stack.positions.push(\"W\");\n                                    }\n                                    positionStacks.push(my_stack);\n                                    positionStacks=positionStacks;\n                                }}\n                                >Add a Position Stack</button>\n                            </div>\n                        </div>\n                {:else}\n                    <PremiumOnly\n                        title_text={\"GigaStuds Only!\"}\n                        text={\"Advanced Lineup Settings are only available to GigaStuds. <a class='text-decoration-none' href='/purchase-premium'>Become a GigaStud</a> to gain access to all DFStud features!!\"}\n                        logo_url={window.logo_url}\n                    />\n                {/if}\n            </div>\n\n            <div class=\"modal-footer\">\n                <button\n                    type=\"button\"\n                    class=\"btn btn-secondary\"\n                    data-bs-dismiss=\"modal\">Close</button\n                >\n            </div>\n        </div>\n    </div>\n</div>\n<div\n    style=\"background-color:#e9ecef;\"\n    class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\"\n>\n    <h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n    <Swiper\n        modules={[Navigation, Pagination, Scrollbar, A11y]}\n        spaceBetween={10}\n        navigation={!mobile}\n        pagination={{ clickable: true }}\n        breakpoints={{\n            320: {\n                slidesPerView: 1,\n                spaceBetween: 10,\n            },\n            768: {\n                slidesPerView: 2,\n                spaceBetween: 10,\n            },\n            1024: {\n                slidesPerView: 3,\n                spaceBetween: 10,\n            },\n            1280: {\n                slidesPerView: 4,\n                spaceBetween: 10,\n            },\n            1920: {\n                slidesPerView: 5,\n                spaceBetween: 10,\n            },\n        }}\n    >\n        {#each games as game}\n            <SwiperSlide\n                ><GameCard\n                    home_team={game.home_team}\n                    away_team={game.away_team}\n                    game_time={game.game_time}\n                /></SwiperSlide\n            >\n        {/each}\n    </Swiper>\n</div>\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-lg-8\">\n            <div class=\"row\">\n                {#if showSlateSelect()}\n                    <div class=\"col-lg-5 mb-1\">\n                        <label for=\"slate-select\">Choose a Slate</label>\n                        <select\n                            :value={slate_id}\n                            on:change={() => {\n                                window.location =\n                                    document.getElementById(\n                                        \"slate-select\"\n                                    ).value;\n                            }}\n                            class=\"form-select form-select-lg\"\n                            id=\"slate-select\"\n                        >\n                            {#each upcoming_slates as slate}\n                                {#if slate.slate_id == slate_id}\n                                    <option value={slate.slate_id} selected\n                                        >{slate.slate_name}</option\n                                    >\n                                {:else}\n                                    <option value={slate.slate_id}\n                                        >{slate.slate_name}</option\n                                    >\n                                {/if}\n                            {/each}\n                        </select>\n                    </div>\n                {/if}\n                <div class=\"col-lg-5 mb-1\">\n                    <label for=\"team-select\">Filter By Team</label>\n                    <select\n                        bind:value={selectedTeam}\n                        on:change={() => {\n                            players = players;\n                        }}\n                        class=\"form-select form-select-lg\"\n                        id=\"team-select\"\n                    >\n                        <option value=\"all\">All</option>\n                        {#each teams as team}\n                            <option value={team.short_name}\n                                >{team.city} {team.mascot}</option\n                            >\n                        {/each}\n                    </select>\n                </div>\n                {#if premium_membership}\n                    <div class=\"col-lg-2 mb-1\">\n                        <label for=\"num-lineup\">Lineups</label>\n                        <select\n                            bind:value={num_lineups}\n                            id=\"num-lineup\"\n                            class=\"form-select form-select-lg\"\n                            aria-label=\".form-select-lg example\"\n                        >\n                            <option value=\"1\">1</option>\n                            <option value=\"3\">3</option>\n                            <option value=\"5\">5</option>\n                            <option value=\"10\">10</option>\n                            <option value=\"25\">25</option>\n                        </select>\n                    </div>\n                {:else}\n                    <div\n                        class=\"col-lg-2 mb-1\"\n                        on:click={() => {\n                            showPremiumModal();\n                        }}\n                    >\n                        <label for=\"num-lineup\">Lineups</label>\n                        <div style=\"cursor: not-allowed;\">\n                            <select\n                                disabled\n                                bind:value={num_lineups}\n                                id=\"num-lineup\"\n                                class=\"form-select form-select-lg\"\n                                aria-label=\".form-select-lg example\"\n                                style=\"pointer-events:none;\"\n                            >\n                                <option value=\"1\">1</option>\n                                <option value=\"3\">3</option>\n                            </select>\n                        </div>\n                    </div>\n                {/if}\n            </div>\n            <div>\n                <ul class=\"nav nav-pills mb-3 h4\" id=\"pills-tab\" role=\"tablist\">\n                    <li class=\"nav-item\" role=\"presentation\">\n                        <button\n                            class=\"nav-link active\"\n                            id=\"pills-consider-tab\"\n                            data-bs-toggle=\"pill\"\n                            data-bs-target=\"#pills-consider\"\n                            type=\"button\"\n                            role=\"tab\"\n                            aria-controls=\"pills-consider\"\n                            aria-selected=\"true\">Considering</button\n                        >\n                    </li>\n                    <li class=\"nav-item\" role=\"presentation\">\n                        <button\n                            class=\"nav-link\"\n                            id=\"pills-exclude-tab\"\n                            data-bs-toggle=\"pill\"\n                            data-bs-target=\"#pills-exclude\"\n                            type=\"button\"\n                            role=\"tab\"\n                            aria-controls=\"pills-exclude\"\n                            aria-selected=\"false\">Excluded</button\n                        >\n                    </li>\n                    <div class=\"my-auto\">\n                        <button\n                            type=\"button\"\n                            class=\"btn btn-lg btn-secondary\"\n                            data-bs-toggle=\"modal\"\n                            data-bs-target=\"#settings-modal\"\n                            >⚙️Advanced Settings</button\n                        >\n                    </div>\n                </ul>\n                <div class=\"row d-lg-none\">\n                    <div\n                        class=\"col-12 mb-2 col-12 mb-2 d-flex align-items-center\"\n                    >\n                        <span class=\"h6 me-auto\">\n                            ${salary.toLocaleString()} Rem | {projFP} proj | {players_rostered}\n                            / {roster_size} Locked</span\n                        ><button\n                            class=\"btn btn-primary\"\n                            type=\"button\"\n                            data-bs-toggle=\"offcanvas\"\n                            data-bs-target=\"#offcanvasScrolling\"\n                            aria-controls=\"offcanvasScrolling\"\n                            >Show Roster</button\n                        >\n                    </div>\n                </div>\n                <div class=\"row pb-2\">\n                    <div class=\"col-xl-4 mb-1\">\n                        <div\n                            class=\"d-flex align-items-center h-100 btn-group\"\n                            role=\"group\"\n                            aria-label=\"Basic radio toggle button group\"\n                        >\n                            <input\n                                type=\"radio\"\n                                bind:group={pos_filter}\n                                on:click={() => (players = players)}\n                                value=\"all\"\n                                class=\"btn-check\"\n                                name=\"btnradio\"\n                                id=\"btnradio1\"\n                                autocomplete=\"off\"\n                            />\n                            <label\n                                class=\"w-100 btn btn-outline-primary\"\n                                for=\"btnradio1\">All</label\n                            >\n                            {#each position_filters as position, index}\n                                <input\n                                    type=\"radio\"\n                                    bind:group={pos_filter}\n                                    on:click={() => (players = players)}\n                                    class=\"btn-check\"\n                                    name=\"btnradio\"\n                                    id=\"btnradio{index + 2}\"\n                                    value={position}\n                                    autocomplete=\"off\"\n                                />\n                                <label\n                                    class=\"w-100 btn btn-outline-primary\"\n                                    for=\"btnradio{index + 2}\">{position}</label\n                                >\n                            {/each}\n                        </div>\n                    </div>\n                    <div class=\"col-xl-4 mb-1\">\n                        <div class=\"input-group flex-nowrap input-group-lg\">\n                            <span\n                                class=\"input-group-text\"\n                                id=\"inputGroup-sizing-lg\">🔍</span\n                            >\n                            <input\n                                on:keyup={() => {\n                                    setTimeout((players = players), 500);\n                                }}\n                                bind:value={playerSearchString}\n                                autocomplete=\"off\"\n                                id=\"player-search\"\n                                type=\"text\"\n                                class=\"form-control\"\n                                aria-label=\"Sizing example input\"\n                                placeholder=\"Search for a Player...\"\n                                aria-describedby=\"inputGroup-sizing-lg\"\n                            />\n                        </div>\n                    </div>\n                    <div class=\"col-xl-4 mb-1\">\n                        <div class=\"d-flex\">\n                            <button\n                                on:click={() => clearRoster()}\n                                class=\"w-50 me-1 btn btn-lg btn-danger\"\n                            >\n                                🚫Reset\n                            </button>\n                            <button\n                                on:click={() => optimizeLineup()}\n                                class=\"w-50 ms-1 btn btn-lg btn-primary\" style=\"white-space: nowrap;\"\n                            >\n                                📈Optimize\n                            </button>\n                        </div>\n                    </div>\n                </div>\n                <div class=\"tab-content\" id=\"pills-tabContent\">\n                    <div\n                        class=\"tab-pane fade show active\"\n                        id=\"pills-consider\"\n                        role=\"tabpanel\"\n                        aria-labelledby=\"pills-consider-tab\"\n                    >\n                        <div class=\"d-md-none\">\n                            <div class=\"\">\n                                {#each players as player, index}\n                                    {#if canRosterAnywhere(player) && player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                        <PlayerCard\n                                            {player}\n                                            {showPlayerModal}\n                                            {index}\n                                            player_name={player.name}\n                                            player_image={player.img_thumb}\n                                            inj_tag={player.inj_tag}\n                                            positions={player.positions}\n                                            salary={player.salary}\n                                            projection={player.proj}\n                                            {rosterPlayer}\n                                            {excludePlayer}\n                                            included={true}\n                                            {includePlayer}\n                                            game_details={teamGameStrings[\n                                                player.team\n                                            ]}\n                                        />\n                                    {:else if player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                        <PlayerCard\n                                            {player}\n                                            {showPlayerModal}\n                                            {index}\n                                            player_name={player.name}\n                                            player_image={player.img_thumb}\n                                            inj_tag={player.inj_tag}\n                                            positions={player.positions}\n                                            salary={player.salary}\n                                            projection={player.proj}\n                                            {rosterPlayer}\n                                            {excludePlayer}\n                                            included={true}\n                                            {includePlayer}\n                                            rosterable=\"unrosterable\"\n                                            game_details={teamGameStrings[\n                                                player.team\n                                            ]}\n                                        />\n                                    {/if}\n                                {/each}\n                            </div>\n                        </div>\n\n                        <div\n                            class=\"table-responsive card modern-card p-3 d-none d-md-block\"\n                            id=\"considered-players\"\n                        >\n                            <table class=\"table\">\n                                <thead class=\"text-center\">\n                                    {#if sortableCols[\"name\"] == 1}\n                                        <th\n                                            class=\"text-start sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {:else if sortableCols[\"name\"] == -1}\n                                        <th\n                                            class=\"text-start sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {:else}\n                                        <th\n                                            draggable=\"true\"\n                                            class=\"text-start sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"salary\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {:else if sortableCols[\"salary\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"proj\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {:else if sortableCols[\"proj\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"val\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {:else if sortableCols[\"val\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {/if}\n                                    <th>Lock</th><th>Exclude</th>\n                                </thead>\n                                <tbody>\n                                    {#each players as player, index}\n                                        {#if canRosterAnywhere(player) && player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                            <tr\n                                                class=\"draggable\"\n                                                draggable=\"true\"\n                                                on:dragend={function (event) {\n                                                    dragend(event);\n                                                }}\n                                                on:dragstart={(event) =>\n                                                    drag(event, index)}\n                                            >\n                                                <td class=\"pb-0\">\n                                                    <div class=\"d-flex\">\n                                                        <img\n                                                            class=\"mt-auto\"\n                                                            style=\"object-fit: contain;\"\n                                                            alt=\"{player.name}\"\n                                                            loading=\"lazy\"\n                                                            height=\"65\"\n                                                            width=\"89\"\n                                                            src={player.img_thumb}\n                                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                                        />\n                                                        <div\n                                                            class=\"lead d-flex flex-column\"\n                                                        >\n                                                            <span\n                                                                class=\"pointer\"\n                                                                on:click={() => {\n                                                                    showPlayerModal(\n                                                                        player\n                                                                    );\n                                                                }}\n                                                                ><span\n                                                                    class=\"px-1 border bg-light\"\n                                                                    >{player.positions}</span\n                                                                >\n                                                                <span class=\"text-primary fw-normal\">{player.name}</span></span\n                                                            >\n                                                            <span\n                                                                >{@html teamGameStrings[\n                                                                    player.team\n                                                                ]}\n                                                                {#if player.inj_tag == \"O\"}\n                                                                    <span\n                                                                        class=\"badge bg-danger\"\n                                                                        >OUT</span\n                                                                    >\n                                                                {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                                                                    <span\n                                                                        class=\"badge bg-warning\"\n                                                                        >{player.inj_tag}</span\n                                                                    >\n                                                                {/if}\n                                                            </span>\n                                                        </div>\n                                                    </div>\n                                                </td>\n                                                <td class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{player.salary.toLocaleString()}</td\n                                                >\n                                                <td class=\"text-primary\">\n                                                    <div\n                                                        style=\"width:fit-content;\"\n                                                        class=\"input-group flex-nowrap mx-auto\"\n                                                    >\n                                                        <span\n                                                            class=\"input-group-text\"\n                                                            >📊</span\n                                                        >\n                                                        <input\n                                                            class=\"form-control\"\n                                                            style=\"width:75px;\"\n                                                            type=\"number\"\n                                                            bind:value={player.proj}\n                                                        />\n                                                    </div>\n                                                </td>\n                                                <td\n                                                    >{Math.round(\n                                                        (player.proj /\n                                                            (player.salary /\n                                                                1000)) *\n                                                            100\n                                                    ) / 100}</td\n                                                ><td\n                                                    class=\"pointer h5 text-center\"\n                                                    on:click={() =>\n                                                        rosterPlayer(index)}\n                                                    >🔒</td\n                                                ><td\n                                                    class=\"text-center h5 pointer\"\n                                                    on:click={() =>\n                                                        excludePlayer(index)}\n                                                    >❌</td\n                                                ></tr\n                                            >\n                                        {:else if player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                            <tr class=\"unrosterable\">\n                                                <td class=\"pb-0\">\n                                                    <div class=\"d-flex\">\n                                                        <img\n                                                            class=\"mt-auto\"\n                                                            style=\"object-fit: contain;\"\n                                                            alt=\"{player.name}\"\n                                                            loading=\"lazy\"\n                                                            height=\"65\"\n                                                            width=\"89\"\n                                                            src={player.img_thumb}\n                                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                                        />\n                                                        <div\n                                                            class=\"lead d-flex flex-column\"\n                                                        >\n                                                            <span\n                                                                class=\"pointer\"\n                                                                on:click={() => {\n                                                                    showPlayerModal(\n                                                                        player\n                                                                    );\n                                                                }}\n                                                                ><span\n                                                                    class=\"px-1 border bg-light\"\n                                                                    >{player.positions}</span\n                                                                >\n                                                                <span class=\"text-primary fw-normal\">{player.name}</span></span\n                                                            >\n                                                            <span\n                                                                >{@html teamGameStrings[\n                                                                    player.team\n                                                                ]}\n                                                                {#if player.inj_tag == \"O\"}\n                                                                    <span\n                                                                        class=\"badge bg-danger\"\n                                                                        >OUT</span\n                                                                    >\n                                                                {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                                                                    <span\n                                                                        class=\"badge bg-warning\"\n                                                                        >{player.inj_tag}</span\n                                                                    >\n                                                                {/if}\n                                                            </span>\n                                                        </div>\n                                                    </div>\n                                                </td>\n                                                <td class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{player.salary.toLocaleString()}</td\n                                                >\n                                                <td class=\"text-primary\">\n                                                    <div\n                                                        style=\"width:fit-content;\"\n                                                        class=\"input-group flex-nowrap mx-auto\"\n                                                    >\n                                                        <span\n                                                            class=\"input-group-text\"\n                                                            >📊</span\n                                                        >\n                                                        <input\n                                                            class=\"form-control\"\n                                                            style=\"width:75px;\"\n                                                            type=\"number\"\n                                                            bind:value={player.proj}\n                                                        />\n                                                    </div>\n                                                </td>\n                                                <td\n                                                    >{Math.round(\n                                                        (player.proj /\n                                                            (player.salary /\n                                                                1000)) *\n                                                            100\n                                                    ) / 100}</td\n                                                ><td\n                                                    class=\"pointer text-center h5\"\n                                                    on:click={() =>\n                                                        rosterPlayer(index)}\n                                                    >🔒</td\n                                                ><td\n                                                    class=\"pointer h5 text-center\"\n                                                    on:click={() =>\n                                                        excludePlayer(index)}\n                                                    >❌</td\n                                                ></tr\n                                            >\n                                        {/if}\n                                    {/each}\n                                </tbody>\n                            </table>\n                        </div>\n                    </div>\n                    <div\n                        class=\"tab-pane fade\"\n                        id=\"pills-exclude\"\n                        role=\"tabpanel\"\n                        aria-labelledby=\"pills-exclude-tab\"\n                    >\n                        <div class=\"d-md-none\">\n                            <div class=\"\">\n                                {#each players as player, index}\n                                    {#if canRosterAnywhere(player) && !player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                        <PlayerCard\n                                            {player}\n                                            {showPlayerModal}\n                                            {index}\n                                            player_name={player.name}\n                                            player_image={player.img_thumb}\n                                            inj_tag={player.inj_tag}\n                                            positions={player.positions}\n                                            salary={player.salary}\n                                            projection={player.proj}\n                                            {rosterPlayer}\n                                            {excludePlayer}\n                                            included={false}\n                                            {includePlayer}\n                                            game_details={teamGameStrings[\n                                                player.team\n                                            ]}\n                                        />\n                                    {:else if !player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                        <PlayerCard\n                                            {player}\n                                            {showPlayerModal}\n                                            {index}\n                                            player_name={player.name}\n                                            player_image={player.img_thumb}\n                                            inj_tag={player.inj_tag}\n                                            positions={player.positions}\n                                            salary={player.salary}\n                                            projection={player.proj}\n                                            {rosterPlayer}\n                                            {excludePlayer}\n                                            included={false}\n                                            {includePlayer}\n                                            rosterable=\"unrosterable\"\n                                            game_details={teamGameStrings[\n                                                player.team\n                                            ]}\n                                        />\n                                    {/if}\n                                {/each}\n                            </div>\n                        </div>\n                        <div\n                            class=\"table-responsive modern-card p-3 d-none d-md-block\"\n                            id=\"excluded-players\"\n                        >\n                            <table class=\"table\">\n                                <thead class=\"text-center\">\n                                    {#if sortableCols[\"name\"] == 1}\n                                        <th\n                                            class=\"text-start sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {:else if sortableCols[\"name\"] == -1}\n                                        <th\n                                            class=\"text-start sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {:else}\n                                        <th\n                                            draggable=\"true\"\n                                            class=\"text-start sorter pointer\"\n                                            on:click={() => sortByX(\"name\")}\n                                            >Player</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"salary\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {:else if sortableCols[\"salary\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByX(\"salary\")}\n                                            >Salary</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"proj\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {:else if sortableCols[\"proj\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByX(\"proj\")}\n                                            >FP</th\n                                        >\n                                    {/if}\n                                    {#if sortableCols[\"val\"] == 1}\n                                        <th\n                                            class=\"sort-desc sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {:else if sortableCols[\"val\"] == -1}\n                                        <th\n                                            class=\"sort-asc sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {:else}\n                                        <th\n                                            class=\"sorter pointer\"\n                                            on:click={() => sortByValue()}\n                                            >Value</th\n                                        >\n                                    {/if}\n                                    <th>Include</th>\n                                </thead>\n                                <tbody>\n                                    {#each players as player, index}\n                                        {#if canRosterAnywhere(player) && !player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                            <tr>\n                                                <td class=\"pb-0\">\n                                                    <div class=\"d-flex\">\n                                                        <img\n                                                            class=\"mt-auto\"\n                                                            style=\"object-fit: contain;\"\n                                                            alt=\"{player.name}\"\n                                                            loading=\"lazy\"\n                                                            height=\"65\"\n                                                            width=\"89\"\n                                                            src={player.img_thumb}\n                                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                                        />\n                                                        <div\n                                                            class=\"lead d-flex flex-column\"\n                                                        >\n                                                            <span\n                                                                class=\"pointer\"\n                                                                on:click={() => {\n                                                                    showPlayerModal(\n                                                                        player\n                                                                    );\n                                                                }}\n                                                                ><span\n                                                                    class=\"px-1 border bg-light\"\n                                                                    >{player.positions}</span\n                                                                >\n                                                                <span class=\"text-primary fw-normal\">{player.name}</span></span\n                                                            >\n                                                            <span\n                                                                >{@html teamGameStrings[\n                                                                    player.team\n                                                                ]}\n                                                                {#if player.inj_tag == \"O\"}\n                                                                    <span\n                                                                        class=\"badge bg-danger\"\n                                                                        >OUT</span\n                                                                    >\n                                                                {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                                                                    <span\n                                                                        class=\"badge bg-warning\"\n                                                                        >{player.inj_tag}</span\n                                                                    >\n                                                                {/if}\n                                                            </span>\n                                                        </div>\n                                                    </div>\n                                                </td>\n                                                <td class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{player.salary.toLocaleString()}</td\n                                                ><td class=\"text-primary\"\n                                                    >📊{player.proj}</td\n                                                ><td\n                                                    >{Math.round(\n                                                        (player.proj /\n                                                            (player.salary /\n                                                                1000)) *\n                                                            100\n                                                    ) / 100}</td\n                                                ><td\n                                                    class=\"pointer text-center h5\"\n                                                    on:click={() =>\n                                                        includePlayer(index)}\n                                                    >✔️</td\n                                                ></tr\n                                            >\n                                        {:else if !player.considered && !player.rostered && positionFilter(player, pos_filter) && searchFilter(player, playerSearchString) && filterByTeam(player.team, selectedTeam)}\n                                            <tr class=\"unrosterable\">\n                                                <td class=\"pb-0\">\n                                                    <div class=\"d-flex\">\n                                                        <img\n                                                            class=\"mt-auto\"\n                                                            height=\"65\"\n                                                            width=\"89\"\n                                                            loading=\"lazy\"\n                                                            alt=\"{player.name}\"\n                                                            src={player.img_thumb}\n                                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                                        />\n                                                        <div\n                                                            class=\"lead d-flex flex-column\"\n                                                        >\n                                                            <span\n                                                                class=\"pointer\"\n                                                                on:click={() => {\n                                                                    showPlayerModal(\n                                                                        player\n                                                                    );\n                                                                }}\n                                                                ><span\n                                                                    class=\"px-1 border bg-light\"\n                                                                    >{player.positions}</span\n                                                                >\n                                                                <span class=\"text-primary fw-normal\">{player.name}</span></span\n                                                            >\n                                                            <span\n                                                                >{@html teamGameStrings[\n                                                                    player.team\n                                                                ]}\n                                                                {#if player.inj_tag == \"O\"}\n                                                                    <span\n                                                                        class=\"badge bg-danger\"\n                                                                        >OUT</span\n                                                                    >\n                                                                {:else if player.inj_tag == \"Q\" || player.inj_tag == \"D\" || player.inj_tag == \"GTD\"}\n                                                                    <span\n                                                                        class=\"badge bg-warning\"\n                                                                        >{player.inj_tag}</span\n                                                                    >\n                                                                {/if}\n                                                            </span>\n                                                        </div>\n                                                    </div>\n                                                </td>\n                                                <td class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{player.salary.toLocaleString()}</td\n                                                ><td class=\"text-primary\"\n                                                    >📊{player.proj}</td\n                                                ><td\n                                                    >{Math.round(\n                                                        (player.proj /\n                                                            (player.salary /\n                                                                1000)) *\n                                                            100\n                                                    ) / 100}</td\n                                                ><td\n                                                    class=\"pointer text-center h5\"\n                                                    on:click={() =>\n                                                        includePlayer(index)}\n                                                    >✔️</td\n                                                ></tr\n                                            >\n                                        {/if}\n                                    {/each}\n                                </tbody>\n                            </table>\n                        </div>\n                    </div>\n                </div>\n            </div>\n        </div>\n        <div class=\"col-lg-4 d-none d-lg-block\">\n            <div class=\"roster-holder card modern-card\">\n                <div class=\"px-3 d-flex h5 bold text-center border-bottom py-2\">\n                    <div id=\"salary-summary\" class=\"px-3\">\n                        <div>Salary</div>\n                        <div>${salary.toLocaleString()}</div>\n                    </div>\n                    <div id=\"fp-summary\" class=\"px-3\">\n                        <div>Projection</div>\n                        <div>{projFP} FP</div>\n                    </div>\n                </div>\n                <div class=\"d-flex flex-column\">\n                    {#each Object.entries(roster) as [pos, slot]}\n                        {#if slot.player}\n                            <div\n                                style=\"border-radius: 10px;\"\n                                class=\"px-3 hidden-border border-bottom roster-slot d-flex align-items-center\"\n                            >\n                                <div class=\"display-5 col-4\">\n                                    <img\n                                        alt=\"{slot.player.name}\"\n                                        height=\"70\"\n                                        src={slot.player.img_thumb}\n                                        loading=\"lazy\"\n                                        onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                    />\n                                </div>\n                                <div\n                                    class=\"col-8 h6 my-0 d-flex align-items-center\"\n                                >\n                                    <div class=\"d-flex flex-column\">\n                                        <div>\n                                            {slot.player.name}\n                                            {#if slot.player.inj_tag == \"O\"}\n                                                <span class=\"badge bg-danger\"\n                                                    >OUT</span\n                                                >\n                                            {:else if slot.player.inj_tag == \"Q\" || slot.player.inj_tag == \"D\" || slot.player.inj_tag == \"GTD\"}\n                                                <span class=\"badge bg-warning\"\n                                                    >{slot.player.inj_tag}</span\n                                                >\n                                            {/if}\n                                        </div>\n                                        <div>\n                                            <span class=\"text-success\" style=\"white-space: nowrap;\"\n                                                >💸{displayedSlotSalary(pos).toLocaleString()}</span\n                                            >\n                                            |\n                                            <span class=\"text-primary\"\n                                                >📊{slot.player.proj}</span\n                                            >\n                                        </div>\n                                    </div>\n                                    <span\n                                        class=\"ms-auto h5 pointer\"\n                                        on:click={() => unrosterPlayer(pos)}\n                                        >🔓</span\n                                    >\n                                </div>\n                            </div>\n                        {:else}\n                            <div\n                                style=\"border-radius: 10px;\"\n                                on:drop={drop(pos)}\n                                on:dragover={function (event) {\n                                    allowDrop(event, pos);\n                                }}\n                                on:dragleave={function (event) {\n                                    handleLeave(event);\n                                }}\n                                class=\"hidden-border roster-slot {slot.fillable_by\n                                    .replaceAll(',', ' ')\n                                    .replaceAll('[', '')\n                                    .replaceAll(']', '')\n                                    .replaceAll(\"'\", '')\n                                    .replaceAll(\n                                        '\"',\n                                        ''\n                                    )} {pos} d-flex align-items-center py-2 px-3\"\n                            >\n                                <div class=\"no-pointer-events display-5 col-4\">\n                                    {slot.display_name}\n                                </div>\n                                <div\n                                    class=\"no-pointer-events col-8 h6 my-0 d-flex align-items-center\"\n                                >\n                                    Choose a Player\n                                </div>\n                            </div>\n                        {/if}\n                    {/each}\n                </div>\n            </div>\n        </div>\n        <div\n            class=\"offcanvas offcanvas-end d-lg-none\"\n            data-bs-scroll=\"true\"\n            data-bs-backdrop=\"false\"\n            tabindex=\"-1\"\n            id=\"offcanvasScrolling\"\n            aria-labelledby=\"offcanvasScrollingLabel\"\n        >\n            <div class=\"offcanvas-header\">\n                <div class=\"d-flex h5 bold text-center border-bottom py-2\">\n                    <div id=\"salary-summary\" class=\"px-3\">\n                        <div>Salary</div>\n                        <div>${salary.toLocaleString()}</div>\n                    </div>\n                    <div id=\"fp-summary\" class=\"px-3\">\n                        <div>Projection</div>\n                        <div>{projFP} FP</div>\n                    </div>\n                </div>\n                <button\n                    type=\"button\"\n                    class=\"btn-close text-reset\"\n                    data-bs-dismiss=\"offcanvas\"\n                    aria-label=\"Close\"\n                />\n            </div>\n            <div class=\"offcanvas-body\">\n                <div class=\"roster-holder\">\n                    <div class=\"d-flex flex-column\">\n                        {#each Object.entries(roster) as [pos, slot]}\n                            {#if slot.player}\n                                <div\n                                    class=\"hidden-border border-bottom roster-slot d-flex align-items-center\"\n                                >\n                                    <div class=\"display-5 col-4\">\n                                        <img\n                                            alt=\"{slot.player.name}\"\n                                            height=\"70\"\n                                            src={slot.player.img_thumb}\n                                            loading=\"lazy\"\n                                            onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\"\n                                        />\n                                    </div>\n                                    <div\n                                        class=\"col-8 h6 my-0 d-flex align-items-center\"\n                                    >\n                                        <div class=\"d-flex flex-column\">\n                                            <div>\n                                                {slot.player.name}\n                                                <div>\n                                                    {#if slot.player.inj_tag == \"O\"}\n                                                        <span\n                                                            class=\"badge bg-danger\"\n                                                            >OUT</span\n                                                        >\n                                                    {:else if slot.player.inj_tag == \"Q\" || slot.player.inj_tag == \"D\" || slot.player.inj_tag == \"GTD\"}\n                                                        <span\n                                                            class=\"badge bg-warning\"\n                                                            >{slot.player\n                                                                .inj_tag}</span\n                                                        >\n                                                    {/if}\n                                                </div>\n                                            </div>\n                                            <div>\n                                                <span class=\"text-success\" style=\"white-space: nowrap;\"\n                                                    >💸{displayedSlotSalary(pos).toLocaleString()}</span\n                                                >\n                                                |\n                                                <span class=\"text-primary\"\n                                                    >📊{slot.player.proj}</span\n                                                >\n                                            </div>\n                                        </div>\n                                        <span\n                                            class=\"ms-auto h5 pointer\"\n                                            on:click={() => unrosterPlayer(pos)}\n                                            >🔓</span\n                                        >\n                                    </div>\n                                </div>\n                            {:else}\n                                <div\n                                    on:drop={drop(pos)}\n                                    on:dragover={function (event) {\n                                        allowDrop(event, pos);\n                                    }}\n                                    on:dragleave={function (event) {\n                                        handleLeave(event);\n                                    }}\n                                    class=\"hidden-border roster-slot {slot.fillable_by\n                                        .replaceAll(',', ' ')\n                                        .replaceAll('[', '')\n                                        .replaceAll(']', '')\n                                        .replaceAll(\"'\", '')\n                                        .replaceAll(\n                                            '\"',\n                                            ''\n                                        )} {pos} d-flex align-items-center py-2\"\n                                >\n                                    <div class=\"no-pointer-events display-5 col-4\">\n                                        {slot.display_name}\n                                    </div>\n                                    <div\n                                        class=\"no-pointer-events col-8 h6 my-0 d-flex align-items-center\"\n                                    >\n                                        Choose a Player\n                                    </div>\n                                </div>\n                            {/if}\n                        {/each}\n                    </div>\n                </div>\n            </div>\n        </div>\n    </div>\n</div>\n\n<style>\n    td {\n        vertical-align: bottom;\n    }\n    .hidden-border {\n        border: 1px solid white;\n        border-collapse: collapse;\n    }\n    .over {\n        background-color: #f5ee9e;\n    }\n    .highlight {\n        border: 1px dotted black;\n        border-collapse: collapse;\n        border-radius: 5px;\n    }\n    .hide {\n        transform: translateX(-9999px);\n    }\n    .unrosterable {\n        opacity: 0.5;\n    }\n    .pointer {\n        cursor: pointer;\n    }\n    .sorter:after,\n    .sorter:before {\n        position: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: 0.3;\n        height: 100%;\n    }\n    .sorter:after {\n        right: 0.5em;\n        content: \"↓\";\n    }\n    .sorter:before {\n        right: 1em;\n        content: \"↑\";\n    }\n    .sorter {\n        padding-right: 30px;\n        position: relative;\n    }\n    .sorter.sort-asc:before {\n        opacity: 1 !important;\n    }\n    .sorter.sort-desc:after {\n        opacity: 1 !important;\n    }\n    .draggable {\n        cursor: grab;\n    }\n    .roster-holder {\n        position: sticky;\n        top: 65px;\n    }\n    .roster-slot {\n        max-height: 75px;\n    }\n    .padding-r-30 {\n        padding-right: 30px;\n    }\n    .invisible_div {\n        width: -webkit-fill-available;\n        height: 55px;\n        background: rgba(255, 0, 0, 0);\n        margin-top: -50px;\n        z-index: 1;\n        position: absolute;\n    }\n    .no-pointer-events {\n        pointer-events: none;\n    }\n</style>\n","<script>\n    export let schedule;\n    export let weeks;\n    let selectedWeek;\n    let selectedWeeksDays;\n    let selectedDays = [];\n    \n    export let currWeek = 0;\n    function updateDOWArray(index){\n        selectedWeek = weeks[index];\n        selectedWeeksDays = weeks[index].days;\n        selectedDays = [];\n        schedule = schedule;\n    }\n    function teamGamesOnSelectedWeek(teamGames){\n        let startDate = new Date(selectedWeek.start);\n        let endDate = new Date(selectedWeek.trueEnd);\n        let ret_val = teamGames.filter(game => \n        {\n            let gameDate = new Date(game.date);\n            return startDate <= gameDate && gameDate <= endDate;\n        });\n        return ret_val;\n    }\n    function gamesOnSelectedDays(team) {\n        var gameDays = [];\n        let weeksGames = teamGamesOnSelectedWeek(schedule[team]);\n        for (var game of weeksGames) {\n            gameDays.push(game.date);\n        }\n        for (var day of selectedDays) {\n            if (!gameDays.includes(day)) {\n                return false;\n            }\n        }\n        return true;\n    }\n    function buildTableRow(team) {\n        let tableRow = `<tr><td>${team}</td>`;\n        let weeksGames = teamGamesOnSelectedWeek(schedule[team]);\n        for (var day of selectedWeeksDays) {\n            var tableData = \"<td></td>\";\n            for (var game of weeksGames) {\n                if(game.date == day.date){\n                    let atSymbol = game.home ? '@' : '';\n                    tableData = `<td>${atSymbol}${game.opp}</td>`;\n                    break;\n                }\n            }\n            tableRow += tableData;\n        }\n        return tableRow+\"</tr>\";\n    }\n    function toShortDate(dateString){\n        let date = new Date(dateString.replace(/-/g, '\\/'));\n        return date.toLocaleDateString('en-US', {month: 'short', day: 'numeric'});\n    }\n    updateDOWArray(currWeek);\n</script>\n<div>\n    <div class=\"h4 fw-bold\">Select Fantasy Week</div>\n    <div class=\"btn-group\">\n        <div class=\"row\">\n        {#each weeks as week, index}\n        <input id=\"option-{index}\" class=\"btn-check\" type=radio on:change={() => updateDOWArray(index)} bind:group={selectedWeeksDays} value={week.days}>\n        <label for=\"option-{index}\" class=\"col-4 btn btn-outline-primary\">W{index+1}: {toShortDate(week.start)} - {toShortDate(week.end)} </label>\n        {/each}\n        </div>\n    </div>\n    <div class=\"h4 fw-bold\">Show Teams Playing On</div>\n    <div class=\"btn-group flex-wrap\">\n    {#each selectedWeek.days as swd, index}\n    <input id=\"btn-check-{index}\" autocomplete=\"off\" class=\"btn-check\" type=checkbox bind:group={selectedDays} value={swd.date} on:change={()=>{schedule=schedule}}>\n    <label class=\"btn btn-outline-primary\" for=\"btn-check-{index}\">{swd.buttonName}</label>  \n    {/each}\n    </div>\n    <div class=\"table-responsive card my-3 shadow\" style=\"border-radius: 10px;\">\n        <table class=\"table overflow-hidden table-light table-hover table-bordered text-center\" style=\"margin-bottom: 0px;\">\n            <thead class=\"table-dark\"><tr><th>Team</th>\n                {#each selectedWeeksDays as swd}\n                <th>{swd.buttonName}</th>\n                {/each}\n                </tr>\n            </thead>\n            <tbody>\n                {#each Object.entries(schedule) as [team_name, team_sched]}\n                {#if gamesOnSelectedDays(team_name)}\n                {@html buildTableRow(team_name)}\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n</div>","<script>\n    export let player_image;\n    export let player_positions;\n    export let player_name;\n    export let player_inj_tag = \"H\";\n    export let detail_string = \"\";\n</script>\n<div class=\"d-flex\">\n    <img class=\"d-none d-sm-block mt-auto\" style=\"object-fit: contain;\" alt=\"{player_name}\" loading=\"lazy\" height=\"65\" width=\"89\" src=\"{player_image}\" onerror=\"this.src='https://dfstud.nyc3.digitaloceanspaces.com/dfstud/static/fantasy/img/brand/horse_default_profile2.png';\">\n    <span class=\"d-block d-sm-none text-primary fw-normal\">{player_name}</span>\n    <div class=\"lead d-flex flex-column\">\n        <span class=\"d-none d-sm-block\"><span class=\"px-1 border bg-light\">{player_positions}</span> <span class=\"text-primary fw-normal\">{player_name}</span></span>\n        <span class=\"d-none d-sm-block\">{@html detail_string}\n            {#if player_inj_tag == \"O\"}\n            <span class=\"badge bg-danger\">OUT</span>\n            {:else if player_inj_tag == \"Q\" || player_inj_tag == \"D\" || player_inj_tag == \"GTD\"}\n            <span class=\"badge bg-warning\">{player_inj_tag}</span>\n            {/if}\n        </span>\n    </div>\n</div>","<script>\n    export let logo_url = \"\";\n    export let league = \"\";\n</script>\n<div class=\"py-3 overflow-hidden\">\n    <div class=\"px-4 py-5 my-3 text-center animate__animated animate__jackInTheBox\">\n        <img height=\"188\" width=\"200\" class=\"d-block mx-auto img-fluid\" src=\"{logo_url}\" alt=\"DFStud's cartoon horse mascot Studly\"\n            style=\"max-width: 200px;\">\n        <div class=\"col-lg-6 mx-auto p-3 modern-card card\">\n            <h1 class=\"display-5 fw-bold\">Check Back Later for {league.toUpperCase()} Projections!</h1>\n            <p class=\"lead mb-3\">DFStud's {league.toUpperCase()} Projections will be available soon! In the meantime try checking out some other Sports!!</p>\n            <div class=\"d-grid gap-2 d-sm-flex justify-content-sm-center\">\n                {#if league.toUpperCase() == \"NBA\"}\n                <a href=\"/nfl/optimizer\" class=\"btn btn-primary btn-lg px-4 gap-3\">Optimize 🏈 NFL</a>\n                <a href=\"/mlb/optimizer\" class=\"btn btn-outline-secondary btn-lg px-4\">Optimize ⚾ MLB</a>\n                {:else if league.toUpperCase() == \"MLB\"}\n                <a href=\"/nfl/optimizer\" class=\"btn btn-primary btn-lg px-4 gap-3\">Optimize 🏈 NFL</a>\n                <a href=\"/nba/optimizer\" class=\"btn btn-outline-secondary btn-lg px-4\">Optimize 🏀 NBA</a>\n                {:else if league.toUpperCase() == \"NFL\"}\n                <a href=\"/nba/optimizer\" class=\"btn btn-primary btn-lg px-4 gap-3\">Optimize 🏀 NBA</a>\n                <a href=\"/mlb/optimizer\" class=\"btn btn-outline-secondary btn-lg px-4\">Optimize ⚾ MLB</a>\n                {:else if league.toUpperCase() == \"NHL\"}\n                <a href=\"/nba/optimizer\" class=\"btn btn-primary btn-lg px-4 gap-3\">Optimize 🏀 NBA</a>\n                <a href=\"/nfl/optimizer\" class=\"btn btn-outline-secondary btn-lg px-4\">Optimize 🏈 NFL</a>\n                {/if}\n            </div>\n        </div>\n    </div>\n</div>","<script>\n\timport PlayerDiv from './PlayerDiv.svelte';\n    import PlayerModal from './PlayerModal.svelte';\n    import NoProj from './NoProj.svelte';\n    import { Navigation, Pagination, Scrollbar, A11y } from 'swiper';\n\timport { Swiper, SwiperSlide } from 'swiper/svelte/swiper-svelte.js';\n\timport GameCard from './GameCard.svelte';\n    import 'swiper/swiper-bundle.min.css';\n\t// swiper core styles\n\timport 'swiper/swiper.min.css';\n\t// modules styles\n\timport 'swiper/modules/navigation/navigation.min.css';\n\timport 'swiper/modules/pagination/pagination.min.css';\n    import { searchFilter, positionFilter, getTeams, filterByTeam, gameStrings } from './filter_utils.js';\n\texport let player_stats;\n    export let games = [];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n\tlet selectedTeam = \"all\";\n\tlet pos_filter = \"all\";\n\tlet position_filters = [\"QB\", \"RB\",\"WR\",\"TE\"];\n\tlet modal_player;\n    let modal_projection_id;\n\tlet playerSearchString = \"\";\n\tlet teams = getTeams(games);\n\tlet mobile = window.innerWidth < 768;\n\tlet teamGameStrings = gameStrings(games);\n\tlet sortableCols = {name:0, pass_yards:0, pass_tds:0, rush_yards:0, rush_tds:0, rec_yards:0, rec_tds:0, fp:0, dk_fp:0, anytime_tds:0, completions:0, carries:0, receptions:0};\n\tlet sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    function checkMobile() {\n\t\tif(window.innerWidth < 768) {\n\t\t\tmobile = true;\n\t\t} else {\n\t\t\tmobile = false;\n\t\t}\n\t}\n\twindow.onresize = checkMobile;\n\tfunction setPosFilter(pos){\n\t\tpos_filter = pos;\n\t\tplayer_stats=player_stats;\n\t}\n\tfunction showPlayerModal(player) {\n        modal_projection_id = player.stats.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(document.getElementById('player-modal'));\n\t\tmyModal.show();\n    }\n    function sortByX(key, sortableCols, players, toggle=1){\n\t\tif(key == \"val\"){\n\t\t\tsortByValue(toggle);\n\t\t\treturn;\n\t\t}\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        //check if players has property stats\n        if(key != \"name\" && players[0].stats){\n            players.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            players.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:players, sortableCols:sortableCols};\n\t}\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n{#if games.length > 0}\n<PlayerModal placeholder_variances={placeholder_variances} league={'nfl'} player={modal_player} proj_id={modal_projection_id} premium_membership={premium_membership}></PlayerModal>\n<div style=\"background-color:#e9ecef;\" class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\">\n\t<h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n\t<Swiper\n\t\tmodules={[Navigation, Pagination, Scrollbar, A11y]}\n\t\tspaceBetween={10}\n\t\tnavigation=\"{!mobile}\"\n\t\tpagination={{ clickable: true }}\n\t\tbreakpoints={{\n\t\t\t320: {\n\t\t\t\tslidesPerView: 1,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t768: {\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1024: {\n\t\t\t\tslidesPerView: 3,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1280: {\n\t\t\t\tslidesPerView: 4,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1920: {\n\t\t\t\tslidesPerView: 5,\n\t\t\t\tspaceBetween: 10\n\t\t\t}\n\t\t}}\n\t>\n\t\t{#each games as game}\n\t\t<SwiperSlide><GameCard home_team={game.home_team} away_team={game.away_team} game_time={game.game_time}></GameCard></SwiperSlide>\n\t\t{/each}\n\t</Swiper>\n</div>\n<div class=\"container-fluid\">\n\t<div class=\"row\">\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <label for=\"team-select\">Filter By Team</label>\n            <select bind:value={selectedTeam} on:change=\"{()=>{player_stats=player_stats}}\" class=\"form-select form-select-lg\" id=\"team-select\">\n                <option value=\"all\">All</option>\n                {#each teams as team}\n                    <option value=\"{team.short_name}\">{team.city_name} {team.mascot_name}</option>\n                {/each}\n            </select>\n        </div>\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Basic radio toggle button group\">\n\t\t\t\t<input type=\"radio\" bind:group={pos_filter} on:click={()=>{player_stats=player_stats;}} value=\"all\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio1\" autocomplete=\"off\">\n\t\t\t\t<label class=\"w-100 btn btn-outline-primary\" for=\"btnradio1\">All</label>\n\t\t\t\t{#each position_filters as position, index}\n\t\t\t\t<input type=\"radio\" on:click={()=>setPosFilter(position)} class=\"btn-check\" name=\"btnradio\" id=\"btnradio{index+2}\" autocomplete=\"off\">\n\t\t\t\t<label class=\"w-100 btn btn-outline-primary\" for=\"btnradio{index+2}\">{position}</label>\n            {/each}\n            </div>\n        </div>\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <div class=\"input-group input-group-lg\">\n                <span class=\"input-group-text\" id=\"inputGroup-sizing-lg\">🔍</span>\n                <input bind:value={playerSearchString} on:keyup={()=>{setTimeout(player_stats=player_stats,500)}} autocomplete=\"off\" id=\"player-search\" type=\"text\" class=\"form-control\" aria-label=\"Sizing example input\" placeholder=\"Search for a Player...\" aria-describedby=\"inputGroup-sizing-lg\">\n            </div>\n        </div>\n    </div>\n\t<div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n        <table class=\"table\">\n            <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n\t\t\t\t<tr class=\"ps-2\">\n\t\t\t\t\t<th class=\"sticky-col sticky-shadow-right\" style=\"border-bottom: 0px !important;\"></th>\n\t\t\t\t\t<th colspan=\"3\" class=\"text-center border-end\" style=\"border-bottom: 0px !important;\">Passing</th>\n\t\t\t\t\t<th colspan=\"3\" class=\"text-center border-end\" style=\"border-bottom: 0px !important;\">Rushing</th>\n\t\t\t\t\t<th colspan=\"3\" class=\"text-center border-end\" style=\"border-bottom: 0px !important;\">Receiving</th>\n\t\t\t\t\t<th colspan=\"3\" class=\"text-center\" style=\"border-bottom: 0px !important;\"></th>\n\t\t\t\t</tr>\n                <tr class=\"ps-2\">\n                    <th on:click={()=>{let sortResult = sortByX(\"name\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}} class=\"sticky-col sticky-shadow-right {sortClasses[sortableCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n\t\t\t\t\t<th class=\"{sortClasses[sortableCols[\"completions\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"completions\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Com / Att</th>\n                    <th class=\"{sortClasses[sortableCols[\"pass_yards\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"pass_yards\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Pass Yards</th>\n                    <th class=\"{sortClasses[sortableCols[\"pass_tds\"]+1]} padding-r-30 text-center  sorter pointer border-end\" on:click={()=>{let sortResult = sortByX(\"pass_tds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Pass TDs</th>\n\t\t\t\t\t<th class=\"{sortClasses[sortableCols[\"carries\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"carries\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Carries</th>\n                    <th class=\"{sortClasses[sortableCols[\"rush_yards\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"rush_yards\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rush Yards</th>\n                    <th class=\"{sortClasses[sortableCols[\"rush_tds\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>{let sortResult = sortByX(\"rush_tds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rush TDs</th>\n\t\t\t\t\t<th class=\"{sortClasses[sortableCols[\"receptions\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"receptions\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rec / Tgt</th>\n                    <th class=\"{sortClasses[sortableCols[\"rec_yards\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"rec_yards\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rec Yards</th>\n                    <th class=\"{sortClasses[sortableCols[\"rec_tds\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>{let sortResult = sortByX(\"rec_tds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rec TDs</th>\n\t\t\t\t\t<th class=\"{sortClasses[sortableCols[\"anytime_tds\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"anytime_tds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>TDs</th>\n                    <th class=\"{sortClasses[sortableCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"fp\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>FD FP</th>\n                    <th class=\"{sortClasses[sortableCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"dk_fp\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>DK FP</th></tr>\n            </thead>\n            <tbody class=\"border-top-0\">\n                {#each player_stats as ps}\n                {#if positionFilter(ps, pos_filter) && searchFilter(ps, playerSearchString) && filterByTeam(ps.team, selectedTeam)}\n                <tr class=\"ps-2\">\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(ps)}}>\n                        <PlayerDiv player_image={ps.img_thumb} player_positions={ps.positions} player_name={ps.name} detail_string={teamGameStrings[ps.team]} player_inj_tag={ps.injury_tag}/>\n                    </td>\n\t\t\t\t\t<td class=\"align-bottom padding-r-30 text-center\">{ps.stats.completions} / {ps.stats.attempts}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.pass_yards}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.pass_tds}</td>\n\t\t\t\t\t<td class=\"align-bottom padding-r-30 text-center\">{ps.stats.carries}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.rush_yards}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.rush_tds}</td>\n\t\t\t\t\t<td class=\"align-bottom padding-r-30 text-center\">{ps.stats.receptions} / {ps.stats.targets}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.rec_yards}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.rec_tds}</td>\n\t\t\t\t\t<td class=\"align-bottom padding-r-30 text-center\">{ps.stats.anytime_tds}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.dk_fp}</td>\n                </tr>\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n</div>\n{:else}\n<NoProj league={\"NFL\"} logo_url={window.logo_url}></NoProj>\n{/if}\n","<script>\n    import PlayerDiv from './PlayerDiv.svelte';\n    import PlayerModal from './PlayerModal.svelte';\n    import NoProj from './NoProj.svelte';\n    import { Navigation, Pagination, Scrollbar, A11y } from 'swiper';\n\timport { Swiper, SwiperSlide } from 'swiper/svelte/swiper-svelte.js';\n\timport GameCard from './GameCard.svelte';\n    import 'swiper/swiper-bundle.min.css';\n\t// swiper core styles\n\timport 'swiper/swiper.min.css';\n\t// modules styles\n\timport 'swiper/modules/navigation/navigation.min.css';\n\timport 'swiper/modules/pagination/pagination.min.css';\n    import { searchFilter, positionFilter, getTeams, filterByTeam, gameStrings } from './filter_utils.js';\n\texport let player_stats;\n    export let games = [];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n    let mobile = window.innerWidth < 768;\n    function checkMobile() {\n\t\tif(window.innerWidth < 768) {\n\t\t\tmobile = true;\n\t\t} else {\n\t\t\tmobile = false;\n\t\t}\n\t}\n\twindow.onresize = checkMobile;\n    let playerSearchString = \"\";\n    let selectedTeam = \"all\";\n    let pos_filter = \"all\";\n    let teams = getTeams(games);\n    let position_filters = [\"PG\", \"SG\", \"SF\", \"PF\", \"C\"];\n    let teamGameStrings = gameStrings(games);\n    let sortableCols = {name:0, min:0, points:0, rebounds:0, assists:0, blocks:0, steals:0, turnovers:0, fp:0, dk_fp:0};\n    let sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    let modal_player;\n    let modal_projection_id;\n    function showPlayerModal(player) {\n        modal_projection_id = player.stats.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(document.getElementById('player-modal'));\n\t\tmyModal.show();\n    }\n    function sortByX(key, sortableCols, players, toggle=1){\n\t\tif(key == \"val\"){\n\t\t\tsortByValue(toggle);\n\t\t\treturn;\n\t\t}\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        //check if players has property stats\n        if(key != \"name\" && players[0].stats){\n            players.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            players.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:players, sortableCols:sortableCols};\n\t}\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n{#if games.length > 0}\n<PlayerModal placeholder_variances={placeholder_variances} player={modal_player} proj_id={modal_projection_id} premium_membership={premium_membership}></PlayerModal>\n<div style=\"background-color:#e9ecef;\" class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\">\n\t<h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n\t<Swiper\n\t\tmodules={[Navigation, Pagination, Scrollbar, A11y]}\n\t\tspaceBetween={10}\n\t\tnavigation=\"{!mobile}\"\n\t\tpagination={{ clickable: true }}\n\t\tbreakpoints={{\n\t\t\t320: {\n\t\t\t\tslidesPerView: 1,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t768: {\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1024: {\n\t\t\t\tslidesPerView: 3,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1280: {\n\t\t\t\tslidesPerView: 4,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1920: {\n\t\t\t\tslidesPerView: 5,\n\t\t\t\tspaceBetween: 10\n\t\t\t}\n\t\t}}\n\t>\n\t\t{#each games as game}\n\t\t<SwiperSlide><GameCard home_team={game.home_team} away_team={game.away_team} game_time={game.game_time}></GameCard></SwiperSlide>\n\t\t{/each}\n\t</Swiper>\n</div>\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <label for=\"team-select\">Filter By Team</label>\n            <select bind:value={selectedTeam} on:change=\"{()=>{player_stats=player_stats}}\" class=\"form-select form-select-lg\" id=\"team-select\">\n                <option value=\"all\">All</option>\n                {#each teams as team}\n                    <option value=\"{team.short_name}\">{team.city_name} {team.mascot_name}</option>\n                {/each}\n            </select>\n        </div>\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Basic radio toggle button group\">\n            <input type=\"radio\" bind:group={pos_filter} on:click={()=>{player_stats=player_stats;}} value=\"all\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio1\" autocomplete=\"off\">\n            <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio1\">All</label>\n            {#each position_filters as position, index}\n            <input type=\"radio\" bind:group={pos_filter} on:click={()=>{player_stats=player_stats;}} class=\"btn-check\" name=\"btnradio\" id=\"btnradio{index+2}\" value=\"{position}\" autocomplete=\"off\">\n            <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio{index+2}\">{position}</label>\n            {/each}\n            </div>\n        </div>\n        <div class=\"col-lg-4 pb-1 mt-auto\">\n            <div class=\"input-group input-group-lg\">\n                <span class=\"input-group-text\" id=\"inputGroup-sizing-lg\">🔍</span>\n                <input bind:value={playerSearchString} on:keyup={()=>{setTimeout(player_stats=player_stats,500)}} autocomplete=\"off\" id=\"player-search\" type=\"text\" class=\"form-control\" aria-label=\"Sizing example input\" placeholder=\"Search for a Player...\" aria-describedby=\"inputGroup-sizing-lg\">\n            </div>\n        </div>\n    </div>\n    \n    <div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n        <table class=\"table\">\n            <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n                <tr class=\"ps-2\">\n                    <th on:click={()=>{let sortResult = sortByX(\"name\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}} class=\"sticky-col sticky-shadow-right {sortClasses[sortableCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                    <th class=\"{sortClasses[sortableCols[\"min\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"min\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Min</th>\n                    <th class=\"{sortClasses[sortableCols[\"points\"]+1]} padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"points\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Points</th>\n                    <th class=\"{sortClasses[sortableCols[\"rebounds\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"rebounds\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Rebounds</th>\n                    <th class=\"{sortClasses[sortableCols[\"assists\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"assists\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Assists</th>\n                    <th class=\"{sortClasses[sortableCols[\"blocks\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"blocks\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Blocks</th>\n                    <th class=\"{sortClasses[sortableCols[\"steals\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"steals\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Steals</th>\n                    <th class=\"{sortClasses[sortableCols[\"turnovers\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"turnovers\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>Turnovers</th>\n                    <th class=\"{sortClasses[sortableCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"fp\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>FD FP</th>\n                    <th class=\"{sortClasses[sortableCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"dk_fp\", sortableCols, player_stats); player_stats = sortResult.players; sortableCols = sortResult.sortableCols;}}>DK FP</th></tr>\n            </thead>\n            <tbody class=\"border-top-0\">\n                {#each player_stats as ps}\n                {#if positionFilter(ps, pos_filter) && searchFilter(ps, playerSearchString) && filterByTeam(ps.team, selectedTeam)}\n                <tr class=\"ps-2\">\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(ps)}}>\n                        <PlayerDiv player_image={ps.img_thumb} player_positions={ps.positions} player_name={ps.name} detail_string={teamGameStrings[ps.team]} player_inj_tag={ps.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.min}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.points}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.rebounds}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.assists}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.blocks}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.steals}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.turnovers}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.dk_fp}</td>\n                </tr>\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n</div>\n{:else}\n<NoProj league={\"NBA\"} logo_url={window.logo_url}></NoProj>\n{/if}\n","<script>\n    // Import Swiper Svelte components\n    import { Navigation, Pagination, Scrollbar, A11y, Autoplay } from \"swiper\";\n    import { Swiper, SwiperSlide } from \"swiper/svelte/swiper-svelte.js\";\n    import \"swiper/swiper-bundle.min.css\";\n    // swiper core styles\n    import \"swiper/swiper.min.css\";\n    import { onMount } from \"svelte\";\n    // modules styles\n    import \"swiper/modules/navigation/navigation.min.css\";\n    import \"swiper/modules/pagination/pagination.min.css\";\n    let mobile = window.innerWidth < 768;\n</script>\n\n<div>\n    <Swiper\n        effect={\"coverflow\"}\n        grabCursor={true}\n        centeredSlides={true}\n        slidesPerView=\"1\"\n        autoplay={{\n            delay: 100000,\n            disableOnInteraction: false,\n        }}\n        loop={true}\n        loopFillGroupWithBlank={true}\n        pagination={{\n            clickable: true,\n        }}\n        navigation={true}\n        modules={[Autoplay, Pagination, Navigation]}\n        class=\"mySwiper\"\n    >\n        <SwiperSlide>\n            <a href=\"/nba/projections\" class=\"text-decoration-none\">\n                <div class=\"bg-white mb-4 h-100 px-5\">\n                    <h5 class=\"card-title\">Projections</h5>\n                    <p class=\"card-text text-dark\">\n                        This is a wider card with supporting text below as a\n                        natural lead-in to additional content. This content\n                        is a little bit longer.\n                    </p>\n                </div>\n            </a>\n        </SwiperSlide>\n        <SwiperSlide>\n            <a href=\"/nba/fantasy/daily/optimizer\" class=\"text-decoration-none\">\n                <div class=\"bg-white mb-4 h-100 px-5\">\n                    <h5 class=\"card-title\">Optimizer</h5>\n                    <p class=\"card-text text-dark\">\n                        This is a wider card with supporting text below as a\n                        natural lead-in to additional content. This content\n                        is a little bit longer.This is a wider card with supporting text below as a natural\n                        lead-in to\n                        additional content. This content is a little bit longer.\n                        This is a wider card with supporting text below as a natural lead-in to\n                        additional content. This content is a little bit longer.\n                    </p>\n                </div>\n            </a>\n        </SwiperSlide>\n    </Swiper>\n</div>\n","<script>\n    import PlayerDiv from './PlayerDiv.svelte';\n\texport let batters = [];\n\texport let player_search = \"\";\n\texport let selected_team = \"\";\n\texport let pos_filter = \"\";\n    export let showPlayerModal;\n    export let game_strings = [];\n    let sortableCols = {name:0, singles:0, doubles:0, triples:0, homeruns:0, runs:0, rbis:0, stolen_bases:0, fp:0, dk_fp:0};\n    let sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    function sortByX(key, sortableCols, players, toggle=1){\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        //check if players has property stats\n        if(key != \"name\" && players[0].stats){\n            players.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            players.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:players, sortableCols:sortableCols};\n\t}\n\tfunction filterPlayer(batter, name_search, team_search, pos_search){\n\t\treturn batter.name.toLowerCase().includes(name_search.toLowerCase()) && (team_search == \"all\" || batter.team == team_search) && (pos_search == \"all\" || batter.positions.includes(pos_search));\n\t}\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n<div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n    <table class=\"table\">\n        <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n            <tr class=\"ps-2\">\n                <th on:click={()=>{let sortResult = sortByX(\"name\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}} class=\"sticky-col sticky-shadow-right {sortClasses[sortableCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                <th class=\"{sortClasses[sortableCols[\"singles\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"singles\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Singles</th>\n                <th class=\"{sortClasses[sortableCols[\"doubles\"]+1]} padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"doubles\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Doubles</th>\n                <th class=\"{sortClasses[sortableCols[\"triples\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"triples\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Triples</th>\n                <th class=\"{sortClasses[sortableCols[\"homeruns\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"homeruns\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Homeruns</th>\n                <th class=\"{sortClasses[sortableCols[\"runs\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"runs\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Runs</th>\n                <th class=\"{sortClasses[sortableCols[\"rbis\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"rbis\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>RBIs</th>\n                <th class=\"{sortClasses[sortableCols[\"stolen_bases\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"stolen_bases\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>Stolen Bases</th>\n                <th class=\"{sortClasses[sortableCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"fp\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>FD FP</th>\n                <th class=\"{sortClasses[sortableCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"dk_fp\", sortableCols, batters); batters = sortResult.players; sortableCols = sortResult.sortableCols;}}>DK FP</th></tr>\n        </thead>\n        <tbody>\n            {#each batters as batter}\n                {#if filterPlayer(batter, player_search, selected_team, pos_filter)}\n                <tr>\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(batter)}}>\n                        <PlayerDiv player_image={batter.img_thumb} player_positions={batter.positions} player_name={batter.name} detail_string={game_strings[batter.team]} player_inj_tag={batter.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.singles}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.doubles}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.triples}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.homeruns}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.runs}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.rbis}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.stolen_bases}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{batter.stats.dk_fp}</td>\n                </tr>\n                {/if}\n            {/each}\n        </tbody>\n    </table>\n</div>\n\n","<script>\n    import PlayerDiv from './PlayerDiv.svelte';\n\texport let pitchers = [];\n\texport let player_search = \"\";\n\texport let selected_team = \"\";\n    export let showPlayerModal;\n    export let game_strings = [];\n    let sortableCols = {name:0, earned_runs:0, innings_pitched:0, strikeouts:0, wins:0, fp:0, dk_fp:0};\n    let sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    function sortByX(key, sortableCols, players, toggle=1){\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        //check if players has property stats\n        if(key != \"name\" && players[0].stats){\n            players.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            players.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:players, sortableCols:sortableCols};\n\t}\n\tfunction filterPlayer(pitcher, name_search, team_search){\n\t\treturn pitcher.name.toLowerCase().includes(name_search.toLowerCase()) && (team_search == \"all\" || pitcher.team == team_search);\n\t}\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        /*add webkit box shadow to fix safari bug*/\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n<div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n    <table class=\"table\">\n        <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n            <tr class=\"ps-2\">\n                <th on:click={()=>{let sortResult = sortByX(\"name\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}} class=\"sticky-col sticky-shadow-right {sortClasses[sortableCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                <th class=\"{sortClasses[sortableCols[\"earned_runs\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"earned_runs\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>Earned Runs</th>\n                <th class=\"{sortClasses[sortableCols[\"innings_pitched\"]+1]} padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"innings_pitched\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>Innings Pitched</th>\n                <th class=\"{sortClasses[sortableCols[\"strikeouts\"]+1]}padding-r-30 text-center  sorter pointer\" on:click={()=>{let sortResult = sortByX(\"strikeouts\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>Strikeouts</th>\n                <th class=\"{sortClasses[sortableCols[\"wins\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>{let sortResult = sortByX(\"wins\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>Wins</th>\n                <th class=\"{sortClasses[sortableCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"fp\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>FD FP</th>\n                <th class=\"{sortClasses[sortableCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>{let sortResult = sortByX(\"dk_fp\", sortableCols, pitchers); pitchers = sortResult.players; sortableCols = sortResult.sortableCols;}}>DK FP</th></tr>\n        </thead>\n        <tbody>\n            {#each pitchers as pitcher}\n                {#if filterPlayer(pitcher, player_search, selected_team)}\n                <tr>\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(pitcher)}}>\n                        <PlayerDiv player_image={pitcher.img_thumb} player_positions={pitcher.positions} player_name={pitcher.name} detail_string={game_strings[pitcher.team]} player_inj_tag={pitcher.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.earned_runs}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.innings_pitched}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.strikeouts}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.wins}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pitcher.stats.dk_fp}</td>\n                </tr>\n                {/if}\n            {/each}\n        </tbody>\n    </table>\n</div>\n\n","<script>\n    import PlayerModal from './PlayerModal.svelte';\n    import BatterTable from \"./BatterTable.svelte\";\n    import PitcherTable from \"./PitcherTable.svelte\";\n    import NoProj from './NoProj.svelte';\n    import { onMount } from 'svelte';\n    import { getTeams, gameStrings } from './filter_utils.js';\n    import { Navigation, Pagination, Scrollbar, A11y } from 'swiper';\n\timport { Swiper, SwiperSlide } from 'swiper/svelte/swiper-svelte.js';\n\timport GameCard from './GameCard.svelte';\n    import 'swiper/swiper-bundle.min.css';\n\t// swiper core styles\n\timport 'swiper/swiper.min.css';\n\t// modules styles\n\timport 'swiper/modules/navigation/navigation.min.css';\n\timport 'swiper/modules/pagination/pagination.min.css';\n    export let games = [];\n    export let players = [];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n    let teams = [];\n    let pos_filter = \"all\";\n    let pitching_batting_select = \"pitching\";\n    let position_filters = [\"C\", \"1B\" ,\"2B\", \"3B\", \"SS\", \"OF\"];\n    let selected_team = \"all\";\n    let batters = [];\n    let pitchers = [];\n    let player_search = \"\";\n    let game_strings = gameStrings(games);\n    let modal_player;\n    let modal_projection_id;\n    function showPlayerModal(player) {\n        modal_projection_id = player.stats.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(document.getElementById('player-modal'));\n\t\tmyModal.show();\n    }\n    onMount(() => {\n\t\t// split players into batters and pitchers\n        for (let player of players) {\n            if (player.positions.includes(\"P\")) {\n                pitchers.push(player);\n            } else {\n                batters.push(player);\n            }\n        }\n        // add teams in the games\n        teams = getTeams(games);\n        pitchers = pitchers;\n        batters = batters;\n\t});\n</script>\n{#if games.length > 0 && players.length > 0}\n<PlayerModal placeholder_variances={placeholder_variances} league={'mlb'} player={modal_player} proj_id={modal_projection_id} premium_membership={premium_membership}></PlayerModal>\n<div style=\"background-color:#e9ecef;\" class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\">\n\t<h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n\t<Swiper\n\t\tmodules={[Navigation, Pagination, Scrollbar, A11y]}\n\t\tspaceBetween={10}\n\t\tnavigation=\"{true}\"\n\t\tpagination={{ clickable: true }}\n\t\tbreakpoints={{\n\t\t\t320: {\n\t\t\t\tslidesPerView: 1,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t768: {\n\t\t\t\tslidesPerView: 2,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1024: {\n\t\t\t\tslidesPerView: 3,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1280: {\n\t\t\t\tslidesPerView: 4,\n\t\t\t\tspaceBetween: 10\n\t\t\t},\n\t\t\t1920: {\n\t\t\t\tslidesPerView: 5,\n\t\t\t\tspaceBetween: 10\n\t\t\t}\n\t\t}}\n\t>\n\t\t{#each games as game}\n\t\t<SwiperSlide><GameCard home_team={game.home_team} away_team={game.away_team} game_time={game.game_time}></GameCard></SwiperSlide>\n\t\t{/each}\n\t</Swiper>\n</div>\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-12\">\n            <div\n                class=\"d-flex h-100 align-items-center btn-group\"\n                role=\"group\"\n                aria-label=\"Basic radio toggle button group\"\n            >\n                <input\n                    type=\"radio\"\n                    bind:group={pitching_batting_select}\n                    value=\"pitching\"\n                    class=\"btn-check\"\n                    name=\"btnradio\"\n                    id=\"btnradio1\"\n                    autocomplete=\"off\"\n\t\t\t\t\tchecked\n                />\n                <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio1\">Pitching</label>\n                <input\n                    type=\"radio\"\n                    bind:group={pitching_batting_select}\n                    class=\"btn-check\"\n                    name=\"btnradio\"\n                    id=\"btnradio2\"\n                    value={\"batting\"}\n                    autocomplete=\"off\"\n                />\n                <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio2\">Batting</label>\n            </div>\n        </div>\n        <div class=\"{pitching_batting_select === 'pitching' ? 'col-md-6' : 'col-lg-4'} pb-1 mt-auto\">\n            <label for=\"team-select\">Filter By Team</label>\n            <select bind:value={selected_team}  class=\"form-select form-select-lg\" id=\"team-select\">\n                <option value=\"all\">All</option>\n                {#each teams as team}\n                    <option value=\"{team.short_name}\">{team.city_name} {team.mascot_name}</option>\n                {/each}\n            </select>\n        </div>\n        <div class=\"{pitching_batting_select === 'pitching' ? 'd-none' : 'col-lg-4'} pb-1 mt-auto\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Basic radio toggle button group\">\n            <input type=\"radio\" bind:group={pos_filter} value=\"all\" class=\"btn-check\" name=\"pos-radio\" id=\"posradio1\" autocomplete=\"off\" checked>\n            <label class=\"w-100 btn btn-outline-primary\" for=\"posradio1\">All</label>\n            {#each position_filters as position, index}\n            <input type=\"radio\" bind:group={pos_filter} class=\"btn-check\" name=\"pos-radio\" id=\"posradio{index+2}\" value=\"{position}\" autocomplete=\"off\">\n            <label class=\"w-100 btn btn-outline-primary\" for=\"posradio{index+2}\">{position}</label>\n            {/each}\n            </div>\n        </div>\n        <div class=\"{pitching_batting_select === 'pitching' ? 'col-md-6' : 'col-lg-4'} pb-1 mt-auto\">\n            <div class=\"input-group input-group-lg\">\n                <span class=\"input-group-text\" id=\"inputGroup-sizing-lg\">🔍</span>\n                <input bind:value={player_search} autocomplete=\"off\" id=\"player-search\" type=\"text\" class=\"form-control\" aria-label=\"Sizing example input\" placeholder=\"Search for a Player...\" aria-describedby=\"inputGroup-sizing-lg\">\n            </div>\n        </div>\n    </div>\n    {#if pitching_batting_select == \"pitching\"}\n        <PitcherTable pitchers={pitchers} player_search={player_search} selected_team={selected_team} game_strings={game_strings} showPlayerModal={showPlayerModal}/>\n    {:else}\n        <BatterTable batters={batters} player_search={player_search} selected_team={selected_team} pos_filter={pos_filter} game_strings={game_strings} showPlayerModal={showPlayerModal}/>\n    {/if}\n</div>\n{:else}\n<NoProj league={\"MLB\"} logo_url={window.logo_url}></NoProj>\n{/if}","<script>\n    import PlayerDiv from './PlayerDiv.svelte';\n    import PlayerModal from './PlayerModal.svelte';\n    import NoProj from './NoProj.svelte';\n    import { Navigation, Pagination, Scrollbar, A11y } from 'swiper';\n\timport { Swiper, SwiperSlide } from 'swiper/svelte/swiper-svelte.js';\n\timport GameCard from './GameCard.svelte';\n    import 'swiper/swiper-bundle.min.css';\n\t// swiper core styles\n\timport 'swiper/swiper.min.css';\n\t// modules styles\n\timport 'swiper/modules/navigation/navigation.min.css';\n\timport 'swiper/modules/pagination/pagination.min.css';\n    import { searchFilter, positionFilter, getTeams, filterByTeam, gameStrings } from './filter_utils.js';\n    export let players = [];\n    export let games = [];\n    export let premium_membership = true;\n    export let placeholder_variances = {};\n    let mobile = window.innerWidth < 768;\n    function checkMobile() {\n\t\tmobile = window.innerWidth < 768;\n\t}\n\twindow.onresize = checkMobile;\n    let playerSearchString = \"\";\n    let selectedTeam = \"all\";\n    let pos_filter = \"all\";\n    let skater_goalie_select = \"skaters\";\n    let teams = getTeams(games);\n    let position_filters = [\"C\", \"W\", \"D\"];\n    let teamGameStrings = gameStrings(games);\n    // Skaters and goalies project different stats, so they get their own tables\n    let skaters = players.filter(p => !p.positions.includes(\"G\"));\n    let goalies = players.filter(p => p.positions.includes(\"G\"));\n    let skaterCols = {name:0, toi:0, goals:0, assists:0, points:0, shots:0, blocked_shots:0, power_play_points:0, fp:0, dk_fp:0};\n    let goalieCols = {name:0, wins:0, saves:0, shots_against:0, goals_against:0, shutouts:0, fp:0, dk_fp:0};\n    let sortClasses = [\"sort-asc\", \"\", \"sort-desc\"];\n    let modal_player;\n    let modal_projection_id;\n    function showPlayerModal(player) {\n        modal_projection_id = player.stats.proj_id;\n        modal_player = player;\n        let myModal = new bootstrap.Modal(document.getElementById('player-modal'));\n\t\tmyModal.show();\n    }\n    function sortByX(key, sortableCols, list, toggle=1){\n\t\tif(sortableCols[key] == 1){\n\t\t\tsortableCols[key] = -1 * toggle;\n\t\t}\n\t\telse{\n\t\t\tsortableCols[key] = 1 * toggle;\n\t\t}\n        if(key != \"name\" && list.length && list[0].stats){\n            list.sort((a, b) => (a.stats[key] > b.stats[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        else{\n            list.sort((a, b) => (a[key] > b[key]) ? -1 * sortableCols[key]: 1 * sortableCols[key]);\n        }\n        for(var prop in sortableCols){\n\t\t\tif(prop != key){\n\t\t\t\tsortableCols[prop] = 0;\n\t\t\t}\n\t\t}\n        return {players:list, sortableCols:sortableCols};\n\t}\n    function sortSkaters(key) {\n        let r = sortByX(key, skaterCols, skaters);\n        skaters = r.players;\n        skaterCols = r.sortableCols;\n    }\n    function sortGoalies(key) {\n        let r = sortByX(key, goalieCols, goalies);\n        goalies = r.players;\n        goalieCols = r.sortableCols;\n    }\n    function pct(v) {\n        return Math.round(v * 100) + \"%\";\n    }\n</script>\n<style>\n    .sorter{\n\t\tpadding-right: 30px;\n\t\tposition:relative;\n\t}\n    .padding-r-30{\n        padding-right: 30px;\n    }\n    .sticky-col {\n        position: -webkit-sticky;\n        position: sticky;\n        left: 0px;\n        background-color: #fff;\n        z-index: 1;\n    }\n    .sticky-table-head{\n        position: -webkit-sticky;\n        position: sticky;\n        top: 0px;\n        background-color: #fff;\n        z-index: 2;\n    }\n    .sticky-shadow-right{\n        -webkit-box-shadow: inset -1px 0px 0px 0px #ccc;\n        box-shadow: inset -1px 0px 0px 0px #ccc;\n    }\n    .sticky-shadow-bottom{\n        -webkit-box-shadow: inset 0px -1px 0px 0px #ccc;\n        box-shadow: inset 0px -1px 0px 0px #ccc;\n    }\n    .pointer{\n\t\tcursor:pointer;\n\t}\n    .sorter.sort-asc:before{\n\t\topacity: 1 !important;\n\t}\n\t.sorter.sort-desc:after{\n\t\topacity: 1 !important;\n\t}\n\t.sorter:after,.sorter:before{\n\t\tposition: absolute;\n        bottom: 0em;\n        display: block;\n        opacity: .3;\n\t\theight:100%;\n\t}\n\t.sorter:after{\n\t\tright: .5em;\n\t\tcontent: \"↓\";\n\t}\n\t.sorter:before{\n\t\tright: 1em;\n        content: \"↑\";\n\t}\n</style>\n{#if games.length > 0 && players.length > 0}\n<PlayerModal placeholder_variances={placeholder_variances} league={'nhl'} player={modal_player} proj_id={modal_projection_id} premium_membership={premium_membership}></PlayerModal>\n<div style=\"background-color:#e9ecef;\" class=\"bg-gradient shadow border-top border-bottom py-2 mb-4\">\n\t<h1 class=\"ps-2 display-6 lh-1\">Games</h1>\n\t<Swiper\n\t\tmodules={[Navigation, Pagination, Scrollbar, A11y]}\n\t\tspaceBetween={10}\n\t\tnavigation=\"{!mobile}\"\n\t\tpagination={{ clickable: true }}\n\t\tbreakpoints={{\n\t\t\t320: { slidesPerView: 1, spaceBetween: 10 },\n\t\t\t768: { slidesPerView: 2, spaceBetween: 10 },\n\t\t\t1024: { slidesPerView: 3, spaceBetween: 10 },\n\t\t\t1280: { slidesPerView: 4, spaceBetween: 10 },\n\t\t\t1920: { slidesPerView: 5, spaceBetween: 10 }\n\t\t}}\n\t>\n\t\t{#each games as game}\n\t\t<SwiperSlide><GameCard home_team={game.home_team} away_team={game.away_team} game_time={game.game_time}></GameCard></SwiperSlide>\n\t\t{/each}\n\t</Swiper>\n</div>\n<div class=\"container-fluid\">\n    <div class=\"row\">\n        <div class=\"col-12\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Skaters or goalies\">\n                <input type=\"radio\" bind:group={skater_goalie_select} value=\"skaters\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio1\" autocomplete=\"off\" checked>\n                <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio1\">Skaters</label>\n                <input type=\"radio\" bind:group={skater_goalie_select} value=\"goalies\" class=\"btn-check\" name=\"btnradio\" id=\"btnradio2\" autocomplete=\"off\">\n                <label class=\"w-100 btn btn-outline-primary\" for=\"btnradio2\">Goalies</label>\n            </div>\n        </div>\n        <div class=\"{skater_goalie_select === 'skaters' ? 'col-lg-4' : 'col-md-6'} pb-1 mt-auto\">\n            <label for=\"team-select\">Filter By Team</label>\n            <select bind:value={selectedTeam} class=\"form-select form-select-lg\" id=\"team-select\">\n                <option value=\"all\">All</option>\n                {#each teams as team}\n                    <option value=\"{team.short_name}\">{team.city_name} {team.mascot_name}</option>\n                {/each}\n            </select>\n        </div>\n        <div class=\"{skater_goalie_select === 'skaters' ? 'col-lg-4' : 'd-none'} pb-1 mt-auto\">\n            <div class=\"d-flex h-100 align-items-center btn-group\" role=\"group\" aria-label=\"Position filter\">\n                <input type=\"radio\" bind:group={pos_filter} value=\"all\" class=\"btn-check\" name=\"pos-radio\" id=\"posradio1\" autocomplete=\"off\" checked>\n                <label class=\"w-100 btn btn-outline-primary\" for=\"posradio1\">All</label>\n                {#each position_filters as position, index}\n                <input type=\"radio\" bind:group={pos_filter} class=\"btn-check\" name=\"pos-radio\" id=\"posradio{index+2}\" value=\"{position}\" autocomplete=\"off\">\n                <label class=\"w-100 btn btn-outline-primary\" for=\"posradio{index+2}\">{position}</label>\n                {/each}\n            </div>\n        </div>\n        <div class=\"{skater_goalie_select === 'skaters' ? 'col-lg-4' : 'col-md-6'} pb-1 mt-auto\">\n            <div class=\"input-group input-group-lg\">\n                <span class=\"input-group-text\" id=\"inputGroup-sizing-lg\">🔍</span>\n                <input bind:value={playerSearchString} autocomplete=\"off\" id=\"player-search\" type=\"text\" class=\"form-control\" aria-label=\"Search for a player\" placeholder=\"Search for a Player...\" aria-describedby=\"inputGroup-sizing-lg\">\n            </div>\n        </div>\n    </div>\n    {#if skater_goalie_select == \"skaters\"}\n    <div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n        <table class=\"table\">\n            <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n                <tr class=\"ps-2\">\n                    <th on:click={()=>sortSkaters(\"name\")} class=\"sticky-col sticky-shadow-right {sortClasses[skaterCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                    <th class=\"{sortClasses[skaterCols[\"toi\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"toi\")}>TOI</th>\n                    <th class=\"{sortClasses[skaterCols[\"goals\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"goals\")}>Goals</th>\n                    <th class=\"{sortClasses[skaterCols[\"assists\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"assists\")}>Assists</th>\n                    <th class=\"{sortClasses[skaterCols[\"points\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>sortSkaters(\"points\")}>Points</th>\n                    <th class=\"{sortClasses[skaterCols[\"shots\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"shots\")}>SOG</th>\n                    <th class=\"{sortClasses[skaterCols[\"blocked_shots\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortSkaters(\"blocked_shots\")}>Blocks</th>\n                    <th class=\"{sortClasses[skaterCols[\"power_play_points\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>sortSkaters(\"power_play_points\")}>PP Pts</th>\n                    <th class=\"{sortClasses[skaterCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>sortSkaters(\"fp\")}>FD FP</th>\n                    <th class=\"{sortClasses[skaterCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>sortSkaters(\"dk_fp\")}>DK FP</th>\n                </tr>\n            </thead>\n            <tbody class=\"border-top-0\">\n                {#each skaters as ps}\n                {#if positionFilter(ps, pos_filter) && searchFilter(ps, playerSearchString) && filterByTeam(ps.team, selectedTeam)}\n                <tr class=\"ps-2\">\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(ps)}}>\n                        <PlayerDiv player_image={ps.img_thumb} player_positions={ps.positions} player_name={ps.name} detail_string={teamGameStrings[ps.team]} player_inj_tag={ps.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.toi.toFixed(1)}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.goals}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.assists}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.points}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.shots}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.blocked_shots}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{ps.stats.power_play_points}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.dk_fp}</td>\n                </tr>\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n    {:else}\n    <div class=\"table-responsive modern-card bg-light m-2 pb-2\" style=\"max-height: 75vh;\">\n        <table class=\"table\">\n            <thead class=\"sticky-table-head sticky-shadow-bottom pt-2\">\n                <tr class=\"ps-2\">\n                    <th on:click={()=>sortGoalies(\"name\")} class=\"sticky-col sticky-shadow-right {sortClasses[goalieCols[\"name\"]+1]} padding-r-30 sorter pointer\">Name</th>\n                    <th class=\"{sortClasses[goalieCols[\"wins\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortGoalies(\"wins\")}>Win %</th>\n                    <th class=\"{sortClasses[goalieCols[\"saves\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortGoalies(\"saves\")}>Saves</th>\n                    <th class=\"{sortClasses[goalieCols[\"shots_against\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortGoalies(\"shots_against\")}>Shots Against</th>\n                    <th class=\"{sortClasses[goalieCols[\"goals_against\"]+1]} padding-r-30 text-center sorter pointer\" on:click={()=>sortGoalies(\"goals_against\")}>Goals Against</th>\n                    <th class=\"{sortClasses[goalieCols[\"shutouts\"]+1]} padding-r-30 text-center sorter pointer border-end\" on:click={()=>sortGoalies(\"shutouts\")}>Shutout %</th>\n                    <th class=\"{sortClasses[goalieCols[\"fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>sortGoalies(\"fp\")}>FD FP</th>\n                    <th class=\"{sortClasses[goalieCols[\"dk_fp\"]+1]} padding-r-30 sorter text-center pointer\" on:click={()=>sortGoalies(\"dk_fp\")}>DK FP</th>\n                </tr>\n            </thead>\n            <tbody class=\"border-top-0\">\n                {#each goalies as ps}\n                {#if searchFilter(ps, playerSearchString) && filterByTeam(ps.team, selectedTeam)}\n                <tr class=\"ps-2\">\n                    <td class=\"pointer sticky-col sticky-shadow-right pb-0\" on:click={()=>{showPlayerModal(ps)}}>\n                        <PlayerDiv player_image={ps.img_thumb} player_positions={ps.positions} player_name={ps.name} detail_string={teamGameStrings[ps.team]} player_inj_tag={ps.injury_tag}/>\n                    </td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{pct(ps.stats.wins)}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.saves}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.shots_against}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.goals_against}</td>\n                    <td class=\"align-bottom padding-r-30 text-center border-end\">{pct(ps.stats.shutouts)}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.fp}</td>\n                    <td class=\"align-bottom padding-r-30 text-center\">{ps.stats.dk_fp}</td>\n                </tr>\n                {/if}\n                {/each}\n            </tbody>\n        </table>\n    </div>\n    {/if}\n</div>\n{:else}\n<NoProj league={\"NHL\"} logo_url={window.logo_url}></NoProj>\n{/if}\n","import Optimizer from './Optimizer.svelte';\nimport NbaSchedule from './NbaSchedule.svelte';\nimport NflProj from './NflProj.svelte';\nimport NbaProj from './NbaProj.svelte';\nimport DailySwiper from './DailySwiper.svelte';\nimport MlbProj from './MlbProj.svelte';\nimport NhlProj from './NhlProj.svelte';\nwindow.Optimizer = function (options) {\n    return new Optimizer(options);\n};\nwindow.NbaSchedule = function (options) {\n    return new NbaSchedule(options);\n};\nwindow.NflProj = function (options) {\n    return new NflProj(options);\n};\nwindow.NbaProj = function (options) {\n    return new NbaProj(options);\n};\nwindow.DailySwiper = function (options) {\n    return new DailySwiper(options);\n};\nwindow.MlbProj = function (options) {\n    return new MlbProj(options);\n};\nwindow.NhlProj = function (options) {\n    return new NhlProj(options);\n};\n"],"names":["noop","assign","tar","src","k","run","fn","blank_object","Object","create","run_all","fns","forEach","is_function","thing","safe_not_equal","a","b","src_url_equal_anchor","current_component","src_url_equal","element_src","url","document","createElement","href","create_slot","definition","ctx","$$scope","slot_ctx","get_slot_context","slice","get_slot_changes","dirty","lets","undefined","merged","len","Math","max","length","i","update_slot_base","slot","slot_definition","slot_changes","get_slot_context_fn","slot_context","p","get_all_dirty_from_scope","exclude_internal_props","props","result","compute_rest_props","keys","rest","Set","has","append","target","node","appendChild","insert","anchor","insertBefore","detach","parentNode","removeChild","destroy_each","iterations","detaching","d","element","name","text","data","createTextNode","space","empty","listen","event","handler","options","addEventListener","removeEventListener","attr","attribute","value","removeAttribute","getAttribute","setAttribute","set_attributes","attributes","descriptors","getOwnPropertyDescriptors","__proto__","key","style","cssText","set","to_number","set_data","wholeText","set_input_value","input","set_style","important","setProperty","select_option","select","option","__value","selected","selectedIndex","select_options","indexOf","select_value","selected_option","querySelector","toggle_class","toggle","classList","HtmlTag","[object Object]","this","e","n","html","h","nodeName","t","c","innerHTML","Array","from","childNodes","set_current_component","component","get_current_component","Error","onMount","$$","on_mount","push","afterUpdate","after_update","onDestroy","on_destroy","createEventDispatcher","type","detail","callbacks","bubbles","createEvent","initCustomEvent","custom_event","call","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","schedule_update","then","flush","add_render_callback","flushing","seen_callbacks","update","pop","callback","add","clear","fragment","before_update","outroing","outros","group_outros","r","check_outros","transition_in","block","local","delete","transition_out","o","get_spread_update","levels","updates","to_null_out","accounted_for","create_component","mount_component","customElement","m","new_on_destroy","map","filter","destroy_component","init","instance","create_fragment","not_equal","append_styles","parent_component","bound","on_disconnect","context","Map","skip_bound","root","ready","ret","fill","make_dirty","hydrate","nodes","children","l","intro","SvelteComponent","$destroy","index","splice","$$props","obj","$$set","isObject","constructor","extend","ssrDocument","body","activeElement","querySelectorAll","getElementById","getElementsByTagName","createElementNS","importNode","location","hash","host","hostname","origin","pathname","protocol","search","getDocument","doc","ssrWindow","navigator","userAgent","history","CustomEvent","getComputedStyle","getPropertyValue","screen","matchMedia","requestAnimationFrame","setTimeout","id","clearTimeout","getWindow","win","window","Dom7","items","super","proto","defineProperty","get","makeReactive","arrayFlat","arr","res","el","isArray","arrayFilter","prototype","$","selector","trim","toCreate","tempParent","qsa","nodeType","uniqueArray","arrayUnique","Methods","addClass","classes","classNames","split","removeClass","remove","hasClass","className","contains","toggleClass","attrs","arguments","attrName","removeAttr","transform","transition","duration","transitionDuration","on","args","eventType","targetSelector","listener","capture","handleLiveEvent","eventData","dom7EventData","unshift","is","apply","parents","handleEvent","events","j","dom7LiveListeners","proxyListener","dom7Listeners","off","handlers","dom7proxy","trigger","evt","cancelable","dataIndex","dispatchEvent","transitionEnd","dom","fireCallBack","outerWidth","includeMargins","styles","offsetWidth","parseFloat","outerHeight","offsetHeight","offset","box","getBoundingClientRect","clientTop","clientLeft","scrollTop","scrollY","scrollLeft","scrollX","top","left","css","prop","each","textContent","compareWith","matches","webkitMatchesSelector","msMatchesSelector","child","previousSibling","eq","returnIndex","els","newChild","tempDiv","firstChild","prepend","next","nextElementSibling","nextAll","nextEls","prev","previousElementSibling","prevAll","prevEls","parent","closest","find","foundElements","found","nextTick","delay","now","Date","getTranslate","axis","matrix","curTransform","transformMatrix","curStyle","currentStyle","WebKitCSSMatrix","webkitTransform","replace","join","MozTransform","OTransform","MsTransform","msTransform","toString","m41","m42","to","noExtend","nextSource","HTMLElement","keysArray","nextIndex","nextKey","desc","getOwnPropertyDescriptor","enumerable","__swiper__","setCSSProperty","varName","varValue","animateCSSModeScroll","swiper","targetPosition","side","startPosition","translate","time","startTime","params","speed","wrapperEl","scrollSnapType","cancelAnimationFrame","cssModeFrameID","dir","isOutOfBound","current","animate","getTime","progress","min","easeProgress","cos","PI","currentPosition","scrollTo","overflow","support","deviceCached","browser","getSupport","smoothScroll","documentElement","touch","DocumentTouch","passiveListener","supportsPassive","opts","gestures","calcSupport","getDevice","overrides","platform","ua","device","ios","android","screenWidth","width","screenHeight","height","match","ipad","ipod","iphone","windows","macos","os","calcDevice","getBrowser","isSafari","toLowerCase","isWebView","test","calcBrowser","methodName","writable","priority","self","method","eventsListeners","onceHandler","__emitterProxy","eventsAnyListeners","eventHandler","transitionEmit","runCallbacks","direction","step","activeIndex","previousIndex","emit","onTouchStart","touchEventsData","touches","enabled","animating","preventInteractionOnTransition","cssMode","loop","loopFix","originalEvent","$targetEl","touchEventsTarget","isTouchEvent","which","button","isTouched","isMoved","noSwipingClass","shadowRoot","path","noSwipingSelector","isTargetShadow","noSwiping","base","__closestFrom","assignedSlot","getRootNode","closestElement","allowClick","swipeHandler","currentX","targetTouches","pageX","currentY","pageY","startX","startY","edgeSwipeDetection","iOSEdgeSwipeDetection","edgeSwipeThreshold","iOSEdgeSwipeThreshold","innerWidth","preventDefault","allowTouchCallbacks","isScrolling","startMoving","touchStartTime","updateSize","swipeDirection","threshold","allowThresholdMove","focusableElements","blur","shouldPreventDefault","allowTouchMove","touchStartPreventDefault","touchStartForcePreventDefault","isContentEditable","onTouchMove","rtlTranslate","rtl","targetTouch","changedTouches","preventedByNestedSwiper","touchReleaseOnEdges","isVertical","maxTranslate","minTranslate","diffX","diffY","sqrt","touchAngle","isHorizontal","atan2","abs","touchMoveStopPropagation","nested","stopPropagation","startTranslate","setTransition","$wrapperEl","allowMomentumBounce","grabCursor","allowSlideNext","allowSlidePrev","setGrabCursor","diff","touchRatio","currentTranslate","disableParentSwiper","resistanceRatio","resistance","followFinger","freeMode","watchSlidesProgress","updateActiveIndex","updateSlidesClasses","updateProgress","setTranslate","onTouchEnd","slidesGrid","touchEndTime","timeDiff","updateClickedSlide","lastClickTime","destroyed","currentPos","stopIndex","groupSize","slidesSizesGrid","slidesPerGroupSkip","slidesPerGroup","increment","ratio","longSwipesMs","longSwipes","slideTo","longSwipesRatio","shortSwipes","navigation","nextEl","prevEl","onResize","breakpoints","setBreakpoint","snapGrid","updateSlides","slidesPerView","isEnd","isBeginning","centeredSlides","slides","autoplay","running","paused","watchOverflow","checkOverflow","onClick","preventClicks","preventClicksPropagation","stopImmediatePropagation","onScroll","newProgress","previousTranslate","translatesDiff","dummyEventAttached","dummyEventListener","touchEvents","domMethod","swiperMethod","start","passiveListeners","passive","move","end","cancel","updateOnWindowResize","isGridEnabled","grid","rows","initialSlide","resizeObserver","createElements","autoHeight","setWrapperSize","virtualTranslate","effect","breakpointsBase","spaceBetween","slidesPerGroupAuto","centeredSlidesBounds","slidesOffsetBefore","slidesOffsetAfter","normalizeSlideIndex","centerInsufficientSlides","roundLengths","simulateTouch","uniqueNavElements","slideToClickedSlide","preloadImages","updateOnImagesReady","loopAdditionalSlides","loopedSlides","loopFillGroupWithBlank","loopPreventsSlide","containerModifierClass","slideClass","slideBlankClass","slideActiveClass","slideDuplicateActiveClass","slideVisibleClass","slideDuplicateClass","slideNextClass","slideDuplicateNextClass","slidePrevClass","slideDuplicatePrevClass","wrapperClass","runCallbacksOnInit","_emitClasses","moduleExtendParams","allModulesParams","moduleParamName","moduleParams","auto","prototypes","eventsEmitter","$el","clientWidth","clientHeight","parseInt","Number","isNaN","size","getDirectionLabel","property","margin-top","margin-bottom ","margin-left","margin-right","padding-left","padding-right","marginRight","getDirectionPropertyValue","label","swiperSize","wrongRTL","isVirtual","virtual","previousSlidesLength","slidesLength","offsetBefore","offsetAfter","previousSnapGridLength","previousSlidesGridLength","slidePosition","prevSlideSize","virtualSize","marginLeft","marginBottom","marginTop","gridEnabled","slideSize","initSlides","shouldResetSlideSize","slide","updateSlide","slideStyles","currentTransform","currentWebKitTransform","paddingLeft","paddingRight","boxSizing","floor","swiperSlideSize","updateWrapperSize","newSlidesGrid","slidesGridItem","_","slideIndex","allSlidesSize","slideSizeValue","maxSnap","snap","allSlidesOffset","snapIndex","addToSnapGrid","addToSlidesGrid","v","updateSlidesOffset","updateAutoHeight","activeSlides","newHeight","getSlideByIndex","visibleSlides","ceil","swiperSlideOffset","offsetLeft","offsetTop","updateSlidesProgress","offsetCenter","visibleSlidesIndexes","slideOffset","slideProgress","originalSlideProgress","slideBefore","slideAfter","originalProgress","multiplier","wasBeginning","wasEnd","realIndex","activeSlide","nextSlide","prevSlide","emitSlidesClasses","newActiveIndex","previousRealIndex","previousSnapIndex","skip","initialized","slideFound","clickedSlide","clickedIndex","byController","x","y","translateTo","translateBounds","internal","newTranslate","isH","behavior","onTranslateToWrapperTransitionEnd","transitionStart","initial","indexAsNumber","isFinite","normalizedTranslate","normalizedGrid","normalizedGridNext","_immediateVirtual","_swiperImmediateVirtual","onSlideToWrapperTransitionEnd","slideToLoop","newIndex","slideNext","perGroup","slidesPerViewDynamic","_clientLeft","slidePrev","normalize","val","normalizedSnapGrid","prevSnap","prevSnapIndex","prevIndex","slideReset","slideToClosest","currentSnap","slideToIndex","loopCreate","$selector","blankSlidesNum","blankNode","prependSlides","appendSlides","cloneNode","loopDestroy","moving","isLocked","cursor","unsetGrabCursor","attachEvents","bind","detachEvents","breakpoint","getBreakpoint","currentBreakpoint","breakpointParams","originalParams","wasMultiRow","isMultiRow","wasEnabled","emitContainerClasses","directionChanged","needsReLoop","changeDirection","isEnabled","disable","enable","containerEl","currentHeight","innerHeight","points","point","minRatio","substr","sort","wasLocked","lastSlideIndex","lastSlideRightEdge","addClasses","suffixes","entries","prefix","resultClasses","item","prepareClasses","pointer-events","free-mode","autoheight","grid-column","css-mode","centered","removeClasses","images","loadImage","imageEl","srcset","sizes","checkForComplete","image","onReady","complete","Image","onload","onerror","imagesLoaded","imagesToLoad","currentSrc","extendedDefaults","Swiper","swipers","newParams","modules","__modules__","mod","extendParams","once","swiperParams","defaults","passedParams","eventName","onAny","velocity","desktop","touchEventsTouch","touchEventsDesktop","clickTimeout","velocities","cls","slideEl","getSlideClasses","view","exact","spv","breakLoop","translateValue","translated","newDirection","needUpdate","currentDirection","mounted","getWrapperSelector","getWrapper","wrapper","mount","deleteInstance","cleanStyles","object","deleteProps","newDefaults","module","installModule","createElementIfNotDefined","checkProps","Navigation","getEl","toggleEl","disabled","disabledClass","tagName","lockClass","$nextEl","$prevEl","onPrevClick","onNextClick","destroy","hideOnClick","hiddenClass","_s","targetEl","pagination","clickable","isHidden","classesToSelector","Pagination","pfx","bulletSize","bulletElement","renderBullet","renderProgressbar","renderFraction","renderCustom","progressbarOpposite","dynamicBullets","dynamicMainBullets","formatFractionCurrent","number","formatFractionTotal","bulletClass","bulletActiveClass","modifierClass","currentClass","totalClass","progressbarFillClass","progressbarOppositeClass","clickableClass","horizontalClass","verticalClass","bullets","dynamicBulletIndex","isPaginationDisabled","setSideBullets","$bulletEl","position","total","paginationType","firstIndex","lastIndex","midIndex","suffix","bullet","$bullet","bulletIndex","$firstDisplayedBullet","$lastDisplayedBullet","dynamicBulletsLength","bulletsOffset","offsetProp","progressbarDirection","scale","scaleX","scaleY","render","paginationHTML","numberOfBullets","Scrollbar","dragStartPos","dragSize","trackSize","divider","timeout","dragTimeout","scrollbar","$dragEl","newSize","newPos","hide","opacity","display","getPointerPosition","clientX","clientY","setDragPosition","positionRatio","onDragStart","onDragMove","returnValue","onDragEnd","snapOnRelease","activeListener","eventMethod","$swiperEl","dragClass","dragEl","draggable","A11y","a11y","notificationClass","prevSlideMessage","nextSlideMessage","firstSlideMessage","lastSlideMessage","paginationBulletMessage","slideLabelMessage","containerMessage","containerRoleDescriptionMessage","itemRoleDescriptionMessage","slideRole","liveRegion","notify","message","notification","makeElFocusable","makeElNotFocusable","addElRole","role","addElRoleDescription","description","addElLabel","disableEl","enableEl","onEnterOrSpaceKey","keyCode","click","updateNavigation","hasPagination","initNavEl","wrapperId","controls","addElControls","$containerEl","repeat","round","random","getRandomNumber","live","addElLive","$slideEl","bulletEl","updatePagination","Autoplay","$activeSlideEl","autoplayResult","reverseDirection","stopOnLastSlide","stop","pause","waitForTransition","onTransitionEnd","onVisibilityChange","visibilityState","onMouseEnter","disableOnInteraction","onMouseLeave","pauseOnMouseEnter","needsNavigation","needsPagination","needsScrollbar","uniqueClasses","unique","prototypeGroup","protoMethod","use","observer","resizeHandler","orientationChangeHandler","ResizeObserver","newWidth","contentBoxSize","contentRect","inlineSize","blockSize","observe","unobserve","observers","attach","MutationObserver","WebkitMutationObserver","mutations","observerUpdate","childList","characterData","observeParents","observeSlideChildren","containerParents","disconnect","paramsList","updateSwiper","changedParams","scrollbarEl","paginationEl","updateParams","currentParams","thumbs","needThumbsInit","needControllerInit","needPaginationInit","needScrollbarInit","needNavigationInit","includes","controller","control","newValue","dispatch","paramsData","restProps","containerClasses","breakpointChanged","swiperInstance","oldPassedParams","swiperEl","virtualData","setVirtualData","onSwiper","lazy","load","calcParams","allowedParams","getParams","$$restProps","_beforeBreakpoint","_swiper","initSwiper","extendWith","cache","renderExternal","renderExternalUpdate","mountSwiper","oldParams","addKey","newKeys","oldKeys","newKey","oldKey","getChangedParams","zoom","virtualIndex","slideClasses","eventAttached","updateClasses","attachEvent","slideData","isActive","isVisible","isDuplicate","isPrev","isNext","searchFilter","player","searchString","positionFilter","pos_filter","positions","getTeams","games","teams","game","home_team","away_team","short_name","localeCompare","filterByTeam","playerTeam","selectedTeam","gameStrings","logo","game_time","salary","toLocaleString","proj","inj_tag","img_thumb","fantasy_points","lineup","lineup_details","player_name","player_image","projection","included","rosterPlayer","excludePlayer","includePlayer","rosterable","game_details","showPlayerModal","exports","_2PI","mean","std","u1","u2","log","generateGaussian","require$$0","erfc","z","exp","Gaussian","variance","standardDeviation","pdf","pow","cdf","ppf","xx","err","ierfc","mul","precision","dprecision","fromPrecisionMean","div","gaussian","sub","num","precisionmean","requestAnimFrame","throttled","thisArg","updateFn","updateArgs","ticking","_toLeftRightCenter","align","_alignStartEnd","uid","isNullOrUndef","isNumberFinite","finiteOrDefault","defaultValue","valueOrDefault","toDimension","dimension","endsWith","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","clone$1","source","klen","isValidKey","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","indexOfDotOrLength","idx","resolveObjectKey","pos","_capitalize","str","charAt","toUpperCase","defined","isFunction","setsEqual","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","niceNum","range","roundedRange","almostEquals","niceRange","fraction","isNumber","epsilon","_setMinAndMaxByKey","array","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","angle","distance","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","s","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_isBetween","atEdge","elasticIn","sin","elasticOut","effects","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInBounce","easeOutBounce","easeInOutBounce","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","f","hex","h1","h2","hexString","g","isShort","lim","p2b","n2b","b2n","n2p","RGB_RE","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","w","rgb","rgb2hsl","calln","hsl2rgb","hue","hueParse","exec","p1","p2","hwb2rgb","hsv2rgb","map$1","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","names$1","nameParse","unpacked","tkeys","ok","nk","unpack","transparent","modHSL","tmp","clone","fromObject","functionParse","rgbParse","Color","_rgb","_valid","valid","hslString","color","weight","me","c1","c2","w2","w1","deg","rotate","index_esm","isPatternOrGradient","CanvasGradient","CanvasPattern","getHoverColor","saturate","darken","getScope$1","scope","values","_descriptors","animation","backgroundColor","borderColor","datasets","devicePixelRatio","chart","getDevicePixelRatio","elements","font","family","lineHeight","hover","hoverBackgroundColor","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","maintainAspectRatio","onHover","parsing","plugins","responsive","scales","showLine","drawActiveElementsOnTop","describe","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","_scriptable","startsWith","_indexable","_fallback","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","garbageCollect","save","jlen","nestedThing","restore","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","canvas","getContext","resetTransform","clearRect","drawPoint","xOffset","yOffset","cornerRadius","pointStyle","rotation","radius","rad","drawImage","beginPath","arc","closePath","moveTo","lineTo","SQRT1_2","rect","borderWidth","stroke","_isPointInArea","area","margin","right","bottom","clipArea","clip","unclipArea","_steppedLineTo","previous","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","renderText","lines","strokeWidth","strokeColor","line","translation","fillStyle","textAlign","textBaseline","setRenderOpts","strokeStyle","lineWidth","strokeText","maxWidth","fillText","decorateText","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","RegExp","FONT_STYLE","toLineHeight","_readValueToProps","objProps","read","toTRBL","toTRBLCorners","toPadding","toFont","fallback","console","warn","toFontString","inputs","info","cacheable","createContext","parentContext","_lookup","table","cmp","mid","hi","lo","_lookupByKey","_rlookupByKey","arrayEvents","unlistenArrayEvents","stub","_chartjs","listeners","_arrayUnique","_createResolver","scopes","prefixes","rootScopes","getTarget","_resolve","Symbol","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","override","Proxy","deleteProperty","_keys","_cached","proxy","readKey","needsSubResolver","createSubResolver","_resolveWithPrefixes","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","storage","_storage","_attachContext","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","isScriptable","_resolveScriptable","isIndexable","resolver","_resolveArray","_resolveWithContext","allKeys","configurable","scriptable","indexable","_allKeys","resolveFallback","getScope","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","EPSILON","getPoint","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","d01","d12","s01","s12","fa","fb","splineCurveMonotone","valueAxis","pointsLen","deltaK","mK","pointBefore","pointCurrent","pointAfter","slopeDelta","alphaK","betaK","tauK","squaredMagnitude","monotoneAdjust","delta","iPixel","vPixel","monotoneCompute","capControlPoint","pt","_updateBezierControlPoints","controlPoints","spanGaps","cubicInterpolationMode","tension","capBezierPoints","inArea","inAreaPrev","inAreaNext","_isDomSupported","_getParentNode","domNode","parseMaxStyle","styleValue","parentProperty","valueInPixels","getPositionedStyle","getRelativePosition","borderBox","paddings","borders","native","offsetX","offsetY","useOffsetPos","getCanvasPosition","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","maxHeight","containerSize","container","containerStyle","containerBorder","containerPadding","getContainerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","readUsedSize","getStyle","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","intlCache","formatNumber","locale","cacheKey","JSON","stringify","formatter","Intl","NumberFormat","getNumberFormat","format","getRtlAdapter","rectX","xPlus","leftForLtr","itemWidth","getRightToLeftAdapter","_itemWidth","overrideTextDirection","original","getPropertyPriority","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalizeSegment","count","_boundSegment","segment","bounds","startBound","endBound","getSegment","prevValue","inside","subStart","shouldStart","shouldStop","_boundSegments","segments","splitByStyles","segmentOptions","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","p0","p0DataIndex","p1DataIndex","styleChanged","doSplitByStyles","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","animator","_request","_charts","_running","_lastDate","anims","date","numSteps","currentStep","_update","_refresh","remaining","draw","_active","_total","tick","_notify","charts","cb","_getAnims","reduce","acc","cur","_duration","interpolators","boolean","factor","c0","mix","Animation","cfg","currentValue","_fn","_easing","easing","_start","_loop","_target","_prop","_from","_to","_promises","elapsed","remain","promises","rej","resolved","animationOptions","colors","properties","numbers","active","resize","show","animations","visible","Animations","config","_properties","configure","animatedProps","getOwnPropertyNames","newOptions","$shared","$animations","resolveTargetOptions","_createAnimations","anim","wait","all","awaitAll","_animateOptions","scaleClip","allowedOverflow","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","stack","dsIndex","singleMode","otherValue","isStacked","meta","stacked","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","getMatchingVisibleMetas","updateStacks","parsed","_cachedMeta","_stacks","iScale","iAxis","vAxis","indexScale","valueScale","getStackKey","_top","_bottom","getFirstScaleId","shift","clearStacks","_parsed","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","_ctx","_cachedDataOpts","getMeta","_type","_parsing","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","$context","_syncList","initialize","linkScales","_stacked","addElements","dataset","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","xScale","getScaleForId","yScale","rScale","getDatasetMeta","scaleID","adata","convertObjectDataToArray","isExtensible","_dataCheck","datasetElementType","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","_sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","parse","xAxisKey","yAxisKey","parsedValue","NaN","canStack","otherScale","_getOtherScale","hidden","createStack","NEGATIVE_INFINITY","otherMin","otherMax","minDefined","maxDefined","getUserBounds","_skip","updateRangeFromParsed","getParsed","getLabelForValue","_clip","toClip","defaultClip","getMaxOverflow","chartArea","resolveDatasetElementOptions","resolveDataElementOptions","raw","createDataContext","createDatasetContext","_resolveElementOptions","dataElementType","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","datasetAnimationScopeKeys","sharedOptions","_animationsDisabled","_resolveAnimations","getSharedOptions","_setStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","updateElements","removed","_dataChanges","_sync","newCount","computeMinSampleSize","_cache","$bar","visibleMetas","concat","getAllParsedValues","getAllScaleValues","curr","_length","updateMinAndPrev","getPixelForValue","ticks","getPixelForTick","parseValue","entry","startValue","endValue","barStart","barEnd","_custom","parseFloatBar","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","edge","borderSkipped","horizontal","borderProps","enableBorderRadius","parseEdge","orig","v2","startEnd","setInflateAmount","inflateAmount","BarController","iAxisKey","vAxisKey","bars","reset","getBasePixel","ruler","_getRuler","firstOpts","includeOptions","updateSharedOptions","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","updateElement","last","grouped","_getStacks","pixels","barThickness","_startPixel","_endPixel","stackCount","_getStackCount","categoryPercentage","barPercentage","baseValue","minBarLength","actualBase","floating","getDataVisibility","barSign","halfGrid","getLineWidthForValue","skipNull","maxBarThickness","Infinity","percent","chunk","computeFlexCategoryTraits","thickness","computeFitCategoryTraits","stackIndex","_getStackIndex","rects","_index_","_value_","beginAtZero","BubbleController","getPixelForDecimal","tooltip","title","DoughnutController","innerRadius","outerRadius","getter","circumference","isDatasetVisible","_getRotation","_getCircumference","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","cutout","chartWeight","_getRingWeight","_getRotationExtents","ratioX","ratioY","startAngle","endAngle","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","getRatioAndOffset","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","calculateTotal","_getRingWeightOffset","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","_circumference","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","legend","legendItem","toggleDataVisibility","tooltipItem","dataLabel","formattedValue","LineController","_dataset","animationsDisabled","pointCount","getStartAndCountOfVisiblePoints","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","scaleRangesChanged","_decimated","animated","maxGapLength","directUpdate","prevParsed","nullData","border","lastPoint","updateControlPoints","PolarAreaController","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","circular","pointLabels","PieController","RadarController","_fullLoop","pointPosition","getPointPositionForValue","ScatterController","controllers","abstract","DateAdapter","timestamp","amount","unit","weekday","members","adapters","_date","getRelativePosition$1","binarySearch","metaset","lookupMethod","_reversePixels","getRange","optimizedEvaluateItems","getSortedVisibleDatasetMetas","getIntersectItems","useFinalPosition","_minPadding","inRange","getNearestCartesianItems","distanceMetric","useX","useY","deltaX","deltaY","getDistanceMetricForAxis","minDistance","getCenterPoint","getNearestItems","getProps","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","evaluateAllVisibleItems","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","setLayoutDims","layouts","wrap","stackWeight","placed","buildStacks","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","widthChanged","heightChanged","same","other","getMargins","marginForPositions","fitBoxes","boxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","padding","autoPadding","_layers","layoutItem","minPadding","layoutBoxes","wrapBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","updatePos","change","handleMaxPadding","BasePlatform","BasicPlatform","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","removeListener","nodeListContains","nodeList","createAttachObserver","addedNodes","removedNodes","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","createResizeObserver","listenDevicePixelRatioChanges","releaseObserver","unlistenDevicePixelRatioChanges","createProxyAndListen","fromNativeEvent","addListener","DomPlatform","renderHeight","renderWidth","displayWidth","displayHeight","initCanvas","proxies","$proxies","isConnected","Element","final","defaultRoutes","formatters","tickValue","notation","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","numeric","Ticks","autoSkip","tickOpts","ticksLimit","maxTicksLimit","tickLength","_tickSize","maxScale","maxChart","_maxLength","determineMaxTicks","majorIndices","major","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","evenMajorSpacing","getEvenSpacing","factors","_factorize","calculateSpacing","avgMajorSpacing","majorStart","majorEnd","grace","drawBorder","drawOnChartArea","drawTicks","tickWidth","tickColor","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkipPadding","labelOffset","minor","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","offsetFromEdge","sample","numItems","getPixelForGridLine","offsetGridLines","validIndex","lineValue","getTickMarkLength","getTitleHeight","titleAlign","reverseAlign","Scale","_margins","paddingTop","paddingBottom","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getMinMax","xLabels","yLabels","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","minmax","keepZero","_addGrace","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","beforeFit","fit","afterFit","startPixel","endPixel","reversePixels","_alignToPixels","alignToPixels","notifyPlugins","_callHooks","beforeTickToLabelConversion","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetRight","generateTickLabels","_computeLabelSizes","caches","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","decimal","getBaseValue","createTickContext","createScaleContext","optionTicks","rot","ticksLength","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","positionAxisID","limit","optsAtIndex","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","backdrop","labelPadding","fillRect","findIndex","_computeGridLineItems","drawLine","setLineDash","lineDashOffset","lastLineWidth","_computeLabelArea","_computeLabelItems","titleX","titleY","titleArgs","drawBackground","drawGrid","drawTitle","drawLabels","tz","gz","axisID","fontSize","TypedRegistry","isPrototypeOf","parentScope","isIChartComponent","register","itemDefaults","routes","propertyParts","sourceName","sourceScope","parts","routeDefaults","registerDefaults","registry","_typedRegistries","_each","_get","typedRegistry","arg","reg","_getRegistryForType","isForType","_exec","itemReg","camelMethod","PluginService","_init","hook","_createDescriptors","descriptor","plugin","_oldCache","_notifyStateChanges","getPlugin","allPlugins","getOpts","pluginOpts","createDescriptors","previousDescriptors","some","pluginScopeKeys","getIndexAxis","datasetDefaults","determineAxis","scaleOptions","initOptions","chartDefaults","configScales","chartIndexAxis","firstIDs","scaleConf","error","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","defaultID","getAxisFromDefaultScaleID","mergeScaleConfig","initData","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","initConfig","_scopeCache","_resolverCache","clearCache","datasetType","additionalOptionScopes","mainScope","resetCache","keyLists","_cachedScopes","subPrefixes","getResolver","hasFunction","needContext","resolverCache","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","instances","getChart","moveNumericKeys","intKey","Chart","userConfig","initialCanvas","existingChart","chartOptionScopes","OffscreenCanvas","_detectPlatform","updateConfig","acquireContext","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","debounce","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newRatio","axisOptions","scaleOpts","updated","isRadial","dposition","dtype","scaleType","getScale","hasUpdated","addBox","_destroyDatasetMeta","newControllers","_removeUnreferencedMetasets","order","updateIndex","ControllerClass","getController","getElement","_updateMetasets","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","invalidate","buildOrUpdateControllers","buildOrUpdateElements","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","removeBox","ensureScalesHaveIDs","buildOrUpdateScales","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","setDatasetVisibility","_updateVisibility","_destroy","_stop","releaseContext","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","isAttached","activeElements","lastActive","replay","hoverOptions","deactivated","activated","updateHoverStyle","inChartArea","eventFilter","_handleEvent","_getActiveElements","isClick","_isClickEvent","lastEvent","determineLastEvent","getElementsAtEventForMode","invalidatePlugins","clipArc","pixelMargin","angleMargin","parseBorderRadius$1","angleDelta","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","alpha","avNogSpacingRadius","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","pCenter","p4","p8","inner","lineJoin","fullCircles","drawFullCircleBorders","version","unregister","ArcElement","chartX","chartY","rAdjust","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","drawArc","setStyle","lineCap","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","stepped","getLineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","_path","strokePathWithCache","segmentMethod","strokePathDirect","LineElement","_points","_segments","_pointsUpdated","findStartAndEnd","solidSegments","_computeSegments","_interpolate","_getInterpolationMethod","interpolated","inRange$1","hitRadius","PointElement","mouseX","mouseY","hoverRadius","getBarBounds","bar","half","skipOrLimit","boundingRects","maxW","maxH","parseBorderWidth","maxR","enableBorder","parseBorderRadius","outer","skipX","skipY","addNormalRectPath","inflateRect","refRect","BarElement","addRectPath","cleanDecimatedDataset","cleanDecimatedData","plugin_decimation","algorithm","beforeElementsUpdate","xAxis","getStartAndCountOfVisiblePointsSimplified","decimated","samples","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","lttbDecimation","minIndex","maxIndex","startIndex","xMin","dx","intermediateIndex1","intermediateIndex2","minMaxDecimation","decodeFill","fillOption","parseFillOption","simpleArc","computeBoundary","computeCircularBoundary","computeLinearBoundary","findSegmentEnd","addPointsBelow","sourcePoint","linesBelow","postponed","findPoint","interpolate","pointValue","linePoints","firstValue","lastValue","getLineByIndex","sourcePoints","below","getLinesBelow","createBoundaryLine","buildStackLine","boundary","pointsFromSegments","resolveTarget","propagate","visited","clipY","lineLoop","getBounds","_getEdge","clipBounds","interpolatedLineTo","interpolatedPoint","_fill","tpoints","targetSegments","tgt","subBounds","fillSources","fillSource","notShape","targetLoop","drawfill","lineOpts","above","doFill","plugin_filler","_args","$filler","drawTime","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","itemHeight","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","generateLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","heightLimit","totalWidth","currentColWidth","currentColHeight","col","rtlHelper","hitbox","_draw","defaultColor","fontColor","halfFontSize","textDirection","setWidth","lineDash","drawOptions","SQRT2","yBoxTop","xBoxLeft","drawLegendBox","_textX","titleFont","titlePadding","topPaddingPlusHalfFontSize","hitBox","lh","onLeave","isListened","hoveredItem","_getLegendItemAt","sameItem","plugin_legend","_element","adjustHitBoxes","ci","Title","_padding","textSize","fontOpts","_drawArgs","plugin_title","titleBlock","createTitle","WeakMap","plugin_subtitle","positioners","hasValue","tooltipPosition","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","String","createTooltipItem","getLabelAndValue","getTooltipSize","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","xAlign","caret","caretSize","caretPadding","doesNotFitWithAlign","determineAlignment","determineYAlign","getBackgroundPoint","alignment","paddingAndSize","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","Tooltip","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","tooltipItems","createTooltipContext","beforeTitle","afterTitle","bodyItems","scoped","beforeLabel","afterLabel","beforeFooter","afterFooter","itemSort","labelColor","labelPointStyle","labelTextColor","_createItems","getTitle","getBeforeBody","getBody","getAfterBody","getFooter","positionAndSize","backgroundPoint","external","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","bodyColor","_drawColorBox","footerAlign","footerColor","tooltipSize","drawCaret","quadraticCurveTo","animX","animY","_updateAnimationTarget","hasTooltipContent","globalAlpha","drawBody","drawFooter","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","labelCount","Decimation","Filler","SubTitle","findOrAddLabel","addedLabels","addIfString","lastIndexOf","CategoryScale","_startValue","_valueRange","_addedLabels","added","getDecimalForPixel","generateTicks$1","generationOptions","dataRange","maxTicks","maxDigits","includeBounds","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","rounded","almostWhole","decimalPlaces","relativeLabelSize","LinearScaleBase","_endValue","setMin","setMax","minSign","maxSign","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","stepSize","computeTickLimit","getTickLimit","_maxDigits","LinearScale","handleTickRangeOptions","isMajor","tickVal","LogarithmicScale","_zero","endExp","endSignificand","significand","lastTick","generateTicks","getTickBackdropHeight","determineLimits","fitWithPointLabels","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","updateLimits","setCenterPoint","_pointLabelItems","extra","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","buildPointLabelItems","hLimits","vLimits","pathRadiusLine","logarithmic","RadialLinearScale","leftMovement","rightMovement","topMovement","bottomMovement","scalingFactor","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","drawPointLabels","gridLineOpts","drawRadiusLine","angleLines.color","pointLabels.color","ticks.color","INTERVALS","millisecond","common","steps","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","startOf","determineUnitForAutoTicks","minUnit","capacity","interval","addTick","timestamps","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","formats","normalized","_applyBounds","_getLabelBounds","endOf","getLabelTimestamps","timeOpts","_generate","_filterBetween","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","minorFormat","majorFormat","_tickFormatFunction","offsets","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","_getLabelSize","prevSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","registerables","clickHooks","moveHooks","hooks","state","listened","moveListened","getNearestItem","hovered","leave","enter","dispatchMoveEvents","handleMoveEvents","elOpts","dblclick","dblClickSpeed","handleClickEvents","nearestItems","_index","adjustScaleRange","annotations","scaleIDOption","annotation","getScaleLimits","changeScaleLimit","suggestedLimit","scaleLimitDefined","verifyScaleIDs","verifyProperties","clamp","clampAll","inBoxRange","hBorderWidth","getElementCenterPoint","isOlderPart","act","req","isPercentString","toPercent","positionOption","getSize","toPosition","isBoundToPoint","xValue","yValue","widthCache","isImageOrCanvas","content","setBorderStyle","setShadowStyle","shadowColor","backgroundShadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","measureLabelSize","mapKey","drawBox","borderShadowColor","drawLabel","calculateTextAlignment","miterLimit","setTextStrokeStyle","getRectCenterPoint","rotated","cx","cy","scaleValue","getChartDimensionByScale","getChartPoint","xScaleID","yScaleID","getChartRect","xDim","xMax","yDim","yMin","yMax","resolvePointPosition","xAdjust","yAdjust","getChartCircle","BoxAnnotation","halfBorder","labelSize","labelRect","calculateX","calculateY","adjust","calculatePosition$1","boxOpts","padStart","padEnd","pointInLine","interpolateX","interpolateY","sqr","isLineInArea","limitPointToArea","LineAnnotation","dy","lenSq","yy","labelIsVisible","labelX","labelY","intersects","isOnLabel","startOpts","endOpts","startAdjust","endAdjust","arrowStartOpts","arrowHeads","arrowEndOpts","getLineAdjust","getArrowHeads","drawArrowHead","labelTextSize","limitLineToArea","lblPadding","xPadding","yPadding","tempPadding","calculateAutoRotation","rotatedSize","spaceAround","calculateTAdjust","calculateT","xCoordinateSizes","yCoordinateSizes","adjustLabelCoordinate","calculateLabelPosition","loadLabelRect","arrowHeadsDefaults","lineSize","lineW","lineH","coordinate","halfSize","arrowOpts","arrowOffsetX","EllipseAnnotation","ellipse","xRadius","yRadius","cosAngle","sinAngle","pointInEllipse","LabelAnnotation","pointX","pointY","calloutPosition","callout","separatorStart","separatorEnd","getCalloutSeparatorAdjust","getCalloutSeparatorCoord","sideStart","sideEnd","getCalloutSideAdjust","getCalloutSideCoord","rotatedPoint","drawCallout","boxSize","calculatePosition","measureRect","xPoints","yPoints","resolveCalloutAutoPosition","resolveCalloutPosition","PointAnnotation","inPointRange","PolygonAnnotation","isInside","bY","bX","pointIsInPolygon","sides","optionScope","initProperties","annotationTypes","polygon","directUpdater","resolveType","animOpts","resolveAnimations","resyncElements","annotationOptions","getOrCreateElement","resolveElementProperties","toSkip","updateSubElements","resolveAnnotationOptions","mainElement","subElements","subElement","subResolver","elementClass","resolveObj","defs","optDefs","chartStates","pkg","ver","strict","requireVersion","visibleElements","verifyScaleOptions","updateListeners","_getState","caller","drawElements","drawSubElements","annotationPlugin","line_value","chart_data","selected_prop","league","getChartData","stat_entry","singles","doubles","triples","homeruns","runs","rbis","walks","goals","assists","shots","blocked_shots","power_play_goals","power_play_assists","shots_against","goals_against","rush_yards","pass_yards","rec_yards","rush_tds","pass_tds","rec_tds","off_interceptions","player_game","start_time","toLocaleDateString","getChartOptions","line1","setColors","myChart","updateChart","updateData","title_text","logo_url","book","fmtOdds","over","under","book_p","toFixed","model_p","probabilityToMoneyLine","probability","roundHalf","value_to_beat","min_value","max_value","my_dist","stats","gamelog","premium_membership","fair_odds","market_lines","using_curve","setPropMetrics","my_prop","curve","sd","p_over","frac","curveDist","dist","market_rows","receptions","targets","time_on_ice","saves","wins","shutouts","completions","attempts","stolen_bases","batter_strikeouts","strikeouts","pitches_thrown","hits_allowed","walks_allowed","earned_runs","minutes","rebounds","blocks","steals","team","is_pitcher","is_qb","is_goalie","roundToTenth","reInitTooltips","tooltipTriggerEl","bootstrap","dispose","averages","team_img","img","player_stats","variances","projections","prop_metrics","proj_id","placeholder_variances","player_id","means","refreshPlayer","prom1","fetch","response","json","fields","ftm","two_point_fgm","three_point_fgm","turnovers","innings_pitched","quality_starts","fumbles_lost","rush_2pc","rec_2pc","totals","vars","formatted_vars","stat","formatted_stat_key","buildPropCalcMetrics","getPlayerStats","prom2","cats","sport_cats","cat","cat_no_underscore","getProjection","prom3","market","catch","getFairOdds","combined","stat_name_underscore","combineStats","320","768","1024","1280","1920","min_each_team","city","mascot","slate_name","slate_id","considered","rostered","display_name","fillable_by","replaceAll","handleLeave","projFP","strategy","strategy_impact","exposure_strategy","exposure_strategy_impact","generated_lineups","lineups_summary","playerSearchString","sortableCols","players","upcoming_slates","roster","ruleset_name","position_filters","num_lineups","modal_projection_id","modal_player","teamStacks","gameStacks","positionStacks","mobile","startSalary","dragged_player_index","players_rostered","roster_size","teamGameStrings","Modal","sortByX","sortByValue","optimizeLineup","showLoadingDiv","headers","Content-Type","Accept","X-CSRFToken","getCookie","available_players","hideLoadingDiv","lineups","summary","alert","calcSlotCost","salary_multiplier","getSlotSalaryMultiplier","affordableSlotsFor","dp_pos","cost","am","bm","findAffordableSlot","clearRoster","unrosterPlayer","drag","dragged_player","ref","newDiv","dragImg","playerDiv","textDiv","imgDiv","nameDiv","salaryDiv","projDiv","whiteSpace","nameText","salaryText","projText","dataTransfer","setDragImage","allowDrop","allowable","createCSVContent","include_header","delimiter","csv","csv_name","lineup_info","createCSV","hiddenElement","encodeURI","download","copyToClipboard","clipboard","writeText","onresize","ele","gs","game_id","ts","ps","my_stack","dragend","toShortDate","days","buttonName","dateString","selectedWeek","selectedWeeksDays","schedule","weeks","selectedDays","currWeek","updateDOWArray","teamGamesOnSelectedWeek","teamGames","startDate","endDate","trueEnd","gameDate","gameDays","weeksGames","tableRow","tableData","home","opp","group","checked","player_positions","player_inj_tag","detail_string","city_name","mascot_name","carries","anytime_tds","fp","dk_fp","injury_tag","setPosFilter","sortResult","filterPlayer","batter","name_search","team_search","pos_search","batters","player_search","selected_team","game_strings","pitcher","pitchers","pitching_batting_select","pct","toi","power_play_points","list","skater_goalie_select","skaters","goalies","skaterCols","goalieCols","sortSkaters","sortGoalies","Optimizer","NbaSchedule","NflProj","NbaProj","DailySwiper","MlbProj","NhlProj"],"mappings":"yBAAA,SAASA,KAET,SAASC,EAAOC,EAAKC,GAEjB,IAAK,MAAMC,KAAKD,EACZD,EAAIE,GAAKD,EAAIC,GACjB,OAAOF,EAUX,SAASG,EAAIC,GACT,OAAOA,IAEX,SAASC,IACL,OAAOC,OAAOC,OAAO,MAEzB,SAASC,EAAQC,GACbA,EAAIC,QAAQP,GAEhB,SAASQ,EAAYC,GACjB,MAAwB,mBAAVA,EAElB,SAASC,EAAeC,EAAGC,GACvB,OAAOD,GAAKA,EAAIC,GAAKA,EAAID,IAAMC,GAAOD,GAAkB,iBAANA,GAAgC,mBAANA,EAEhF,IAAIE,EAo4BAC,EAn4BJ,SAASC,EAAcC,EAAaC,GAKhC,OAJKJ,IACDA,EAAuBK,SAASC,cAAc,MAElDN,EAAqBO,KAAOH,EACrBD,IAAgBH,EAAqBO,KA4BhD,SAASC,EAAYC,EAAYC,EAAKC,EAASvB,GAC3C,GAAIqB,EAAY,CACZ,MAAMG,EAAWC,EAAiBJ,EAAYC,EAAKC,EAASvB,GAC5D,OAAOqB,EAAW,GAAGG,IAG7B,SAASC,EAAiBJ,EAAYC,EAAKC,EAASvB,GAChD,OAAOqB,EAAW,IAAMrB,EAClBL,EAAO4B,EAAQD,IAAII,QAASL,EAAW,GAAGrB,EAAGsB,KAC7CC,EAAQD,IAElB,SAASK,EAAiBN,EAAYE,EAASK,EAAO5B,GAClD,GAAIqB,EAAW,IAAMrB,EAAI,CACrB,MAAM6B,EAAOR,EAAW,GAAGrB,EAAG4B,IAC9B,QAAsBE,IAAlBP,EAAQK,MACR,OAAOC,EAEX,GAAoB,iBAATA,EAAmB,CAC1B,MAAME,EAAS,GACTC,EAAMC,KAAKC,IAAIX,EAAQK,MAAMO,OAAQN,EAAKM,QAChD,IAAK,IAAIC,EAAI,EAAGA,EAAIJ,EAAKI,GAAK,EAC1BL,EAAOK,GAAKb,EAAQK,MAAMQ,GAAKP,EAAKO,GAExC,OAAOL,EAEX,OAAOR,EAAQK,MAAQC,EAE3B,OAAON,EAAQK,MAEnB,SAASS,EAAiBC,EAAMC,EAAiBjB,EAAKC,EAASiB,EAAcC,GACzE,GAAID,EAAc,CACd,MAAME,EAAejB,EAAiBc,EAAiBjB,EAAKC,EAASkB,GACrEH,EAAKK,EAAED,EAAcF,IAO7B,SAASI,EAAyBrB,GAC9B,GAAIA,EAAQD,IAAIa,OAAS,GAAI,CACzB,MAAMP,EAAQ,GACRO,EAASZ,EAAQD,IAAIa,OAAS,GACpC,IAAK,IAAIC,EAAI,EAAGA,EAAID,EAAQC,IACxBR,EAAMQ,IAAM,EAEhB,OAAOR,EAEX,OAAQ,EAEZ,SAASiB,EAAuBC,GAC5B,MAAMC,EAAS,GACf,IAAK,MAAMjD,KAAKgD,EACC,MAAThD,EAAE,KACFiD,EAAOjD,GAAKgD,EAAMhD,IAC1B,OAAOiD,EAEX,SAASC,EAAmBF,EAAOG,GAC/B,MAAMC,EAAO,GACbD,EAAO,IAAIE,IAAIF,GACf,IAAK,MAAMnD,KAAKgD,EACPG,EAAKG,IAAItD,IAAe,MAATA,EAAE,KAClBoD,EAAKpD,GAAKgD,EAAMhD,IACxB,OAAOoD,EAmLX,SAASG,EAAOC,EAAQC,GACpBD,EAAOE,YAAYD,GAoDvB,SAASE,EAAOH,EAAQC,EAAMG,GAC1BJ,EAAOK,aAAaJ,EAAMG,GAAU,MAUxC,SAASE,EAAOL,GACZA,EAAKM,WAAWC,YAAYP,GAEhC,SAASQ,EAAaC,EAAYC,GAC9B,IAAK,IAAI7B,EAAI,EAAGA,EAAI4B,EAAW7B,OAAQC,GAAK,EACpC4B,EAAW5B,IACX4B,EAAW5B,GAAG8B,EAAED,GAG5B,SAASE,EAAQC,GACb,OAAOnD,SAASC,cAAckD,GAoBlC,SAASC,EAAKC,GACV,OAAOrD,SAASsD,eAAeD,GAEnC,SAASE,IACL,OAAOH,EAAK,KAEhB,SAASI,IACL,OAAOJ,EAAK,IAEhB,SAASK,EAAOnB,EAAMoB,EAAOC,EAASC,GAElC,OADAtB,EAAKuB,iBAAiBH,EAAOC,EAASC,GAC/B,IAAMtB,EAAKwB,oBAAoBJ,EAAOC,EAASC,GA8B1D,SAASG,EAAKzB,EAAM0B,EAAWC,GACd,MAATA,EACA3B,EAAK4B,gBAAgBF,GAChB1B,EAAK6B,aAAaH,KAAeC,GACtC3B,EAAK8B,aAAaJ,EAAWC,GAErC,SAASI,EAAe/B,EAAMgC,GAE1B,MAAMC,EAActF,OAAOuF,0BAA0BlC,EAAKmC,WAC1D,IAAK,MAAMC,KAAOJ,EACS,MAAnBA,EAAWI,GACXpC,EAAK4B,gBAAgBQ,GAER,UAARA,EACLpC,EAAKqC,MAAMC,QAAUN,EAAWI,GAEnB,YAARA,EACLpC,EAAK2B,MAAQ3B,EAAKoC,GAAOJ,EAAWI,GAE/BH,EAAYG,IAAQH,EAAYG,GAAKG,IAC1CvC,EAAKoC,GAAOJ,EAAWI,GAGvBX,EAAKzB,EAAMoC,EAAKJ,EAAWI,IA+BvC,SAASI,EAAUb,GACf,MAAiB,KAAVA,EAAe,MAAQA,EAkIlC,SAASc,EAAS3B,EAAMC,GACpBA,EAAO,GAAKA,EACRD,EAAK4B,YAAc3B,IACnBD,EAAKC,KAAOA,GAEpB,SAAS4B,EAAgBC,EAAOjB,GAC5BiB,EAAMjB,MAAiB,MAATA,EAAgB,GAAKA,EAUvC,SAASkB,EAAU7C,EAAMoC,EAAKT,EAAOmB,GACjC9C,EAAKqC,MAAMU,YAAYX,EAAKT,EAAOmB,EAAY,YAAc,IAEjE,SAASE,EAAcC,EAAQtB,GAC3B,IAAK,IAAI9C,EAAI,EAAGA,EAAIoE,EAAO3B,QAAQ1C,OAAQC,GAAK,EAAG,CAC/C,MAAMqE,EAASD,EAAO3B,QAAQzC,GAC9B,GAAIqE,EAAOC,UAAYxB,EAEnB,YADAuB,EAAOE,UAAW,GAI1BH,EAAOI,eAAiB,EAE5B,SAASC,EAAeL,EAAQtB,GAC5B,IAAK,IAAI9C,EAAI,EAAGA,EAAIoE,EAAO3B,QAAQ1C,OAAQC,GAAK,EAAG,CAC/C,MAAMqE,EAASD,EAAO3B,QAAQzC,GAC9BqE,EAAOE,UAAYzB,EAAM4B,QAAQL,EAAOC,UAGhD,SAASK,EAAaP,GAClB,MAAMQ,EAAkBR,EAAOS,cAAc,aAAeT,EAAO3B,QAAQ,GAC3E,OAAOmC,GAAmBA,EAAgBN,QA0D9C,SAASQ,EAAa/C,EAASC,EAAM+C,GACjChD,EAAQiD,UAAUD,EAAS,MAAQ,UAAU/C,GAUjD,MAAMiD,EACFC,cACIC,KAAKC,EAAID,KAAKE,EAAI,KAEtBH,EAAEI,GACEH,KAAKI,EAAED,GAEXJ,EAAEI,EAAMpE,EAAQI,EAAS,MAChB6D,KAAKC,IACND,KAAKC,EAAIrD,EAAQb,EAAOsE,UACxBL,KAAKM,EAAIvE,EACTiE,KAAKO,EAAEJ,IAEXH,KAAKnF,EAAEsB,GAEX4D,EAAEI,GACEH,KAAKC,EAAEO,UAAYL,EACnBH,KAAKE,EAAIO,MAAMC,KAAKV,KAAKC,EAAEU,YAE/BZ,EAAE5D,GACE,IAAK,IAAItB,EAAI,EAAGA,EAAImF,KAAKE,EAAEtF,OAAQC,GAAK,EACpCqB,EAAO8D,KAAKM,EAAGN,KAAKE,EAAErF,GAAIsB,GAGlC4D,EAAEI,GACEH,KAAKrD,IACLqD,KAAKI,EAAED,GACPH,KAAKnF,EAAEmF,KAAK7G,GAEhB4G,IACIC,KAAKE,EAAEnH,QAAQsD,IAyKvB,SAASuE,EAAsBC,GAC3BvH,EAAoBuH,EAExB,SAASC,IACL,IAAKxH,EACD,MAAM,IAAIyH,MAAM,oDACpB,OAAOzH,EAKX,SAAS0H,EAAQvI,GACbqI,IAAwBG,GAAGC,SAASC,KAAK1I,GAE7C,SAAS2I,EAAY3I,GACjBqI,IAAwBG,GAAGI,aAAaF,KAAK1I,GAEjD,SAAS6I,EAAU7I,GACfqI,IAAwBG,GAAGM,WAAWJ,KAAK1I,GAE/C,SAAS+I,IACL,MAAMX,EAAYC,IAClB,MAAO,CAACW,EAAMC,KACV,MAAMC,EAAYd,EAAUI,GAAGU,UAAUF,GACzC,GAAIE,EAAW,CAGX,MAAMvE,EA1OlB,SAAsBqE,EAAMC,EAAQE,GAAU,GAC1C,MAAM3B,EAAIvG,SAASmI,YAAY,eAE/B,OADA5B,EAAE6B,gBAAgBL,EAAMG,GAAS,EAAOF,GACjCzB,EAuOe8B,CAAaN,EAAMC,GACjCC,EAAUxH,QAAQpB,QAAQN,IACtBA,EAAGuJ,KAAKnB,EAAWzD,OA4BnC,MAAM6E,EAAmB,GAEnBC,EAAoB,GACpBC,EAAmB,GACnBC,EAAkB,GAClBC,EAAmBC,QAAQC,UACjC,IAAIC,GAAmB,EACvB,SAASC,IACAD,IACDA,GAAmB,EACnBH,EAAiBK,KAAKC,IAO9B,SAASC,EAAoBnK,GACzB0J,EAAiBhB,KAAK1I,GAK1B,IAAIoK,GAAW,EACf,MAAMC,EAAiB,IAAIlH,IAC3B,SAAS+G,IACL,IAAIE,EAAJ,CAEAA,GAAW,EACX,EAAG,CAGC,IAAK,IAAIhI,EAAI,EAAGA,EAAIoH,EAAiBrH,OAAQC,GAAK,EAAG,CACjD,MAAMgG,EAAYoB,EAAiBpH,GACnC+F,EAAsBC,GACtBkC,GAAOlC,EAAUI,IAIrB,IAFAL,EAAsB,MACtBqB,EAAiBrH,OAAS,EACnBsH,EAAkBtH,QACrBsH,EAAkBc,KAAlBd,GAIJ,IAAK,IAAIrH,EAAI,EAAGA,EAAIsH,EAAiBvH,OAAQC,GAAK,EAAG,CACjD,MAAMoI,EAAWd,EAAiBtH,GAC7BiI,EAAejH,IAAIoH,KAEpBH,EAAeI,IAAID,GACnBA,KAGRd,EAAiBvH,OAAS,QACrBqH,EAAiBrH,QAC1B,KAAOwH,EAAgBxH,QACnBwH,EAAgBY,KAAhBZ,GAEJI,GAAmB,EACnBK,GAAW,EACXC,EAAeK,SAEnB,SAASJ,GAAO9B,GACZ,GAAoB,OAAhBA,EAAGmC,SAAmB,CACtBnC,EAAG8B,SACHlK,EAAQoI,EAAGoC,eACX,MAAMhJ,EAAQ4G,EAAG5G,MACjB4G,EAAG5G,MAAQ,EAAE,GACb4G,EAAGmC,UAAYnC,EAAGmC,SAAShI,EAAE6F,EAAGlH,IAAKM,GACrC4G,EAAGI,aAAatI,QAAQ6J,IAiBhC,MAAMU,GAAW,IAAI1H,IACrB,IAAI2H,GACJ,SAASC,KACLD,GAAS,CACLE,EAAG,EACHlD,EAAG,GACHnF,EAAGmI,IAGX,SAASG,KACAH,GAAOE,GACR5K,EAAQ0K,GAAOhD,GAEnBgD,GAASA,GAAOnI,EAEpB,SAASuI,GAAcC,EAAOC,GACtBD,GAASA,EAAM/I,IACfyI,GAASQ,OAAOF,GAChBA,EAAM/I,EAAEgJ,IAGhB,SAASE,GAAeH,EAAOC,EAAOxH,EAAQ4G,GAC1C,GAAIW,GAASA,EAAMI,EAAG,CAClB,GAAIV,GAASzH,IAAI+H,GACb,OACJN,GAASJ,IAAIU,GACbL,GAAOhD,EAAEY,KAAK,KACVmC,GAASQ,OAAOF,GACZX,IACI5G,GACAuH,EAAMjH,EAAE,GACZsG,OAGRW,EAAMI,EAAEH,IAoahB,SAASI,GAAkBC,EAAQC,GAC/B,MAAMpB,EAAS,GACTqB,EAAc,GACdC,EAAgB,CAAErK,QAAS,GACjC,IAAIa,EAAIqJ,EAAOtJ,OACf,KAAOC,KAAK,CACR,MAAMmJ,EAAIE,EAAOrJ,GACXqF,EAAIiE,EAAQtJ,GAClB,GAAIqF,EAAG,CACH,IAAK,MAAM9B,KAAO4F,EACR5F,KAAO8B,IACTkE,EAAYhG,GAAO,GAE3B,IAAK,MAAMA,KAAO8B,EACTmE,EAAcjG,KACf2E,EAAO3E,GAAO8B,EAAE9B,GAChBiG,EAAcjG,GAAO,GAG7B8F,EAAOrJ,GAAKqF,OAGZ,IAAK,MAAM9B,KAAO4F,EACdK,EAAcjG,GAAO,EAIjC,IAAK,MAAMA,KAAOgG,EACRhG,KAAO2E,IACTA,EAAO3E,QAAO7D,GAEtB,OAAOwI,EA+JX,SAASuB,GAAiBV,GACtBA,GAASA,EAAMrD,IAKnB,SAASgE,GAAgB1D,EAAW9E,EAAQI,EAAQqI,GAChD,MAAMpB,SAAEA,EAAQlC,SAAEA,EAAQK,WAAEA,EAAUF,aAAEA,GAAiBR,EAAUI,GACnEmC,GAAYA,EAASqB,EAAE1I,EAAQI,GAC1BqI,GAED5B,EAAoB,KAChB,MAAM8B,EAAiBxD,EAASyD,IAAInM,GAAKoM,OAAO5L,GAC5CuI,EACAA,EAAWJ,QAAQuD,GAKnB7L,EAAQ6L,GAEZ7D,EAAUI,GAAGC,SAAW,KAGhCG,EAAatI,QAAQ6J,GAEzB,SAASiC,GAAkBhE,EAAWnE,GAClC,MAAMuE,EAAKJ,EAAUI,GACD,OAAhBA,EAAGmC,WACHvK,EAAQoI,EAAGM,YACXN,EAAGmC,UAAYnC,EAAGmC,SAASzG,EAAED,GAG7BuE,EAAGM,WAAaN,EAAGmC,SAAW,KAC9BnC,EAAGlH,IAAM,IAWjB,SAAS+K,GAAKjE,EAAWvD,EAASyH,EAAUC,EAAiBC,EAAW1J,EAAO2J,EAAe7K,EAAQ,EAAE,IACpG,MAAM8K,EAAmB7L,EACzBsH,EAAsBC,GACtB,MAAMI,EAAKJ,EAAUI,GAAK,CACtBmC,SAAU,KACVrJ,IAAK,KAELwB,MAAAA,EACAwH,OAAQ5K,EACR8M,UAAAA,EACAG,MAAO1M,IAEPwI,SAAU,GACVK,WAAY,GACZ8D,cAAe,GACfhC,cAAe,GACfhC,aAAc,GACdiE,QAAS,IAAIC,IAAIjI,EAAQgI,UAAYH,EAAmBA,EAAiBlE,GAAGqE,QAAU,KAEtF3D,UAAWjJ,IACX2B,MAAAA,EACAmL,YAAY,EACZC,KAAMnI,EAAQvB,QAAUoJ,EAAiBlE,GAAGwE,MAEhDP,GAAiBA,EAAcjE,EAAGwE,MAClC,IAAIC,GAAQ,EAkBZ,GAjBAzE,EAAGlH,IAAMgL,EACHA,EAASlE,EAAWvD,EAAQ/B,OAAS,GAAI,CAACV,EAAG8K,KAAQhK,KACnD,MAAMgC,EAAQhC,EAAKf,OAASe,EAAK,GAAKgK,EAOtC,OANI1E,EAAGlH,KAAOkL,EAAUhE,EAAGlH,IAAIc,GAAIoG,EAAGlH,IAAIc,GAAK8C,MACtCsD,EAAGuE,YAAcvE,EAAGmE,MAAMvK,IAC3BoG,EAAGmE,MAAMvK,GAAG8C,GACZ+H,GAxCpB,SAAoB7E,EAAWhG,IACI,IAA3BgG,EAAUI,GAAG5G,MAAM,KACnB4H,EAAiBd,KAAKN,GACtB4B,IACA5B,EAAUI,GAAG5G,MAAMuL,KAAK,IAE5B/E,EAAUI,GAAG5G,MAAOQ,EAAI,GAAM,IAAO,GAAMA,EAAI,GAmC/BgL,CAAWhF,EAAWhG,IAEvB8K,IAET,GACN1E,EAAG8B,SACH2C,GAAQ,EACR7M,EAAQoI,EAAGoC,eAEXpC,EAAGmC,WAAW4B,GAAkBA,EAAgB/D,EAAGlH,KAC/CuD,EAAQvB,OAAQ,CAChB,GAAIuB,EAAQwI,QAAS,CAEjB,MAAMC,EAvxClB,SAAkBnJ,GACd,OAAO6D,MAAMC,KAAK9D,EAAQ+D,YAsxCJqF,CAAS1I,EAAQvB,QAE/BkF,EAAGmC,UAAYnC,EAAGmC,SAAS6C,EAAEF,GAC7BA,EAAMhN,QAAQsD,QAId4E,EAAGmC,UAAYnC,EAAGmC,SAAS7C,IAE3BjD,EAAQ4I,OACRvC,GAAc9C,EAAUI,GAAGmC,UAC/BmB,GAAgB1D,EAAWvD,EAAQvB,OAAQuB,EAAQnB,OAAQmB,EAAQkH,eAEnE7B,IAEJ/B,EAAsBuE,GAkD1B,MAAMgB,GACFpG,WACI8E,GAAkB7E,KAAM,GACxBA,KAAKoG,SAAWjO,EAEpB4H,IAAI0B,EAAMwB,GACN,MAAMtB,EAAa3B,KAAKiB,GAAGU,UAAUF,KAAUzB,KAAKiB,GAAGU,UAAUF,GAAQ,IAEzE,OADAE,EAAUR,KAAK8B,GACR,KACH,MAAMoD,EAAQ1E,EAAUpC,QAAQ0D,IACjB,IAAXoD,GACA1E,EAAU2E,OAAOD,EAAO,IAGpCtG,KAAKwG,GAtzDT,IAAkBC,EAuzDNxG,KAAKyG,QAvzDCD,EAuzDkBD,EAtzDG,IAA5B5N,OAAO+C,KAAK8K,GAAK5L,UAuzDhBoF,KAAKiB,GAAGuE,YAAa,EACrBxF,KAAKyG,MAAMF,GACXvG,KAAKiB,GAAGuE,YAAa,ICx1DjC,SAASkB,GAASF,GACd,OAAgB,OAARA,GACW,iBAARA,GACP,gBAAiBA,GACjBA,EAAIG,cAAgBhO,OAE5B,SAASiO,GAAO7K,EAAS,GAAIzD,EAAM,IAC/BK,OAAO+C,KAAKpD,GAAKS,QAASqF,SACK,IAAhBrC,EAAOqC,GACdrC,EAAOqC,GAAO9F,EAAI8F,GACbsI,GAASpO,EAAI8F,KAClBsI,GAAS3K,EAAOqC,KAChBzF,OAAO+C,KAAKpD,EAAI8F,IAAMxD,OAAS,GAC/BgM,GAAO7K,EAAOqC,GAAM9F,EAAI8F,MAKpC,MAAMyI,GAAc,CAChBC,KAAM,GACN/G,qBACAA,wBACAgH,cAAe,CACXhH,SACAM,SAAU,IAEdX,cAAa,IACF,KAEXsH,iBAAgB,IACL,GAEXC,eAAc,IACH,KAEXpF,YAAW,KACA,CACH9B,gBAGRpG,cAAa,KACF,CACHqM,SAAU,GACVrF,WAAY,GACZtC,MAAO,GACP0B,iBACAmH,qBAAoB,IACT,KAInBC,gBAAe,KACJ,IAEXC,WAAU,IACC,KAEXC,SAAU,CACNC,KAAM,GACNC,KAAM,GACNC,SAAU,GACV5N,KAAM,GACN6N,OAAQ,GACRC,SAAU,GACVC,SAAU,GACVC,OAAQ,KAGhB,SAASC,KACL,MAAMC,EAA0B,oBAAbpO,SAA2BA,SAAW,GAEzD,OADAkN,GAAOkB,EAAKjB,IACLiB,EAGX,MAAMC,GAAY,CACdrO,SAAUmN,GACVmB,UAAW,CACPC,UAAW,IAEfZ,SAAU,CACNC,KAAM,GACNC,KAAM,GACNC,SAAU,GACV5N,KAAM,GACN6N,OAAQ,GACRC,SAAU,GACVC,SAAU,GACVC,OAAQ,IAEZM,QAAS,CACLnI,iBACAA,cACAA,OACAA,UAEJoI,YAAa,WACT,OAAOnI,MAEXD,qBACAA,wBACAqI,iBAAgB,KACL,CACHC,iBAAgB,IACL,KAInBtI,UACAA,SACAuI,OAAQ,GACRvI,eACAA,iBACAwI,WAAU,KACC,IAEXC,sBAAsBvF,GACQ,oBAAfwF,YACPxF,IACO,MAEJwF,WAAWxF,EAAU,GAEhClD,qBAAqB2I,GACS,oBAAfD,YAGXE,aAAaD,KAGrB,SAASE,KACL,MAAMC,EAAwB,oBAAXC,OAAyBA,OAAS,GAErD,OADAlC,GAAOiC,EAAKd,IACLc,ECpHX,MAAME,WAAatI,MACjBV,YAAYiJ,GACVC,SAAUD,GAAS,IAhBvB,SAAsBxC,GACpB,MAAM0C,EAAQ1C,EAAIrI,UAClBxF,OAAOwQ,eAAe3C,EAAK,YAAa,CACtC4C,IAAG,IACMF,EAGTnJ,IAAIpC,GACFuL,EAAM/K,UAAYR,KASpB0L,CAAarJ,OAKjB,SAASsJ,GAAUC,EAAM,IACvB,MAAMC,EAAM,GAQZ,OAPAD,EAAIxQ,QAAQ0Q,IACNhJ,MAAMiJ,QAAQD,GAChBD,EAAIrI,QAAQmI,GAAUG,IAEtBD,EAAIrI,KAAKsI,KAGND,EAET,SAASG,GAAYJ,EAAKtG,GACxB,OAAOxC,MAAMmJ,UAAUhF,OAAO5C,KAAKuH,EAAKtG,GAgC1C,SAAS4G,GAAEC,EAAUxE,GACnB,MAAMwD,EAASF,KACTlP,EAAWmO,KACjB,IAAI0B,EAAM,GAEV,IAAKjE,GAAWwE,aAAoBf,GAClC,OAAOe,EAGT,IAAKA,EACH,OAAO,IAAIf,GAAKQ,GAGlB,GAAwB,iBAAbO,EAAuB,CAChC,MAAM3J,EAAO2J,EAASC,OAEtB,GAAI5J,EAAKZ,QAAQ,MAAQ,GAAKY,EAAKZ,QAAQ,MAAQ,EAAG,CACpD,IAAIyK,EAAW,MACa,IAAxB7J,EAAKZ,QAAQ,SAAcyK,EAAW,MACd,IAAxB7J,EAAKZ,QAAQ,SAAcyK,EAAW,SACd,IAAxB7J,EAAKZ,QAAQ,QAAwC,IAAxBY,EAAKZ,QAAQ,SAAcyK,EAAW,MACxC,IAA3B7J,EAAKZ,QAAQ,YAAiByK,EAAW,SACb,IAA5B7J,EAAKZ,QAAQ,aAAkByK,EAAW,UAC9C,MAAMC,EAAavQ,EAASC,cAAcqQ,GAC1CC,EAAWzJ,UAAYL,EAEvB,IAAK,IAAItF,EAAI,EAAGA,EAAIoP,EAAWtJ,WAAW/F,OAAQC,GAAK,EACrD0O,EAAIpI,KAAK8I,EAAWtJ,WAAW9F,SAGjC0O,EA7CN,SAAaO,EAAUxE,GACrB,GAAwB,iBAAbwE,EACT,MAAO,CAACA,GAGV,MAAM3Q,EAAI,GACJqQ,EAAMlE,EAAQ0B,iBAAiB8C,GAErC,IAAK,IAAIjP,EAAI,EAAGA,EAAI2O,EAAI5O,OAAQC,GAAK,EACnC1B,EAAEgI,KAAKqI,EAAI3O,IAGb,OAAO1B,EAiCG+Q,CAAIJ,EAASC,OAAQzE,GAAW5L,QAGnC,GAAIoQ,EAASK,UAAYL,IAAahB,GAAUgB,IAAapQ,EAClE6P,EAAIpI,KAAK2I,QACJ,GAAIrJ,MAAMiJ,QAAQI,GAAW,CAClC,GAAIA,aAAoBf,GAAM,OAAOe,EACrCP,EAAMO,EAGR,OAAO,IAAIf,GAtEb,SAAqBQ,GACnB,MAAMa,EAAc,GAEpB,IAAK,IAAIvP,EAAI,EAAGA,EAAI0O,EAAI3O,OAAQC,GAAK,GACE,IAAjCuP,EAAY7K,QAAQgK,EAAI1O,KAAYuP,EAAYjJ,KAAKoI,EAAI1O,IAG/D,OAAOuP,EA+DSC,CAAYd,IAG9BM,GAAEpR,GAAKsQ,GAAKa,UC1HZ,MAAMU,GAAU,CACdC,SD6HF,YAAqBC,GACnB,MAAMC,EAAanB,GAAUkB,EAAQ7F,IAAIpE,GAAKA,EAAEmK,MAAM,OAItD,OAHA1K,KAAKjH,QAAQ0Q,IACXA,EAAG5J,UAAUqD,OAAOuH,KAEfzK,MCjIP2K,YDoIF,YAAwBH,GACtB,MAAMC,EAAanB,GAAUkB,EAAQ7F,IAAIpE,GAAKA,EAAEmK,MAAM,OAItD,OAHA1K,KAAKjH,QAAQ0Q,IACXA,EAAG5J,UAAU+K,UAAUH,KAElBzK,MCxIP6K,SDoJF,YAAqBL,GACnB,MAAMC,EAAanB,GAAUkB,EAAQ7F,IAAIpE,GAAKA,EAAEmK,MAAM,OACtD,OAAOf,GAAY3J,KAAMyJ,GAChBgB,EAAW7F,OAAOkG,GAAarB,EAAG5J,UAAUkL,SAASD,IAAYlQ,OAAS,GAChFA,OAAS,GCvJZoQ,YD0IF,YAAwBR,GACtB,MAAMC,EAAanB,GAAUkB,EAAQ7F,IAAIpE,GAAKA,EAAEmK,MAAM,OACtD1K,KAAKjH,QAAQ0Q,IACXgB,EAAW1R,QAAQ+R,IACjBrB,EAAG5J,UAAUD,OAAOkL,aAY1B,SAAcG,EAAOtN,GACnB,GAAyB,IAArBuN,UAAUtQ,QAAiC,iBAAVqQ,EAEnC,OAAIjL,KAAK,GAAWA,KAAK,GAAGnC,aAAaoN,QACzC,EAIF,IAAK,IAAIpQ,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EACpC,GAAyB,IAArBqQ,UAAUtQ,OAEZoF,KAAKnF,GAAGiD,aAAamN,EAAOtN,QAG5B,IAAK,MAAMwN,KAAYF,EACrBjL,KAAKnF,GAAGsQ,GAAYF,EAAME,GAC1BnL,KAAKnF,GAAGiD,aAAaqN,EAAUF,EAAME,IAK3C,OAAOnL,MC7KPoL,WDgLF,SAAoB3N,GAClB,IAAK,IAAI5C,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EACpCmF,KAAKnF,GAAG+C,gBAAgBH,GAG1B,OAAOuC,MCpLPqL,UDyTF,SAAmBA,GACjB,IAAK,IAAIxQ,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EACpCmF,KAAKnF,GAAGwD,MAAMgN,UAAYA,EAG5B,OAAOrL,MC7TPsL,WDgUF,SAAoBC,GAClB,IAAK,IAAI1Q,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EACpCmF,KAAKnF,GAAGwD,MAAMmN,mBAAyC,iBAAbD,EAA2BA,EAAH,KAAkBA,EAGtF,OAAOvL,MCpUPyL,GDuUF,YAAeC,GACb,IAAKC,EAAWC,EAAgBC,EAAUC,GAAWJ,EASrD,SAASK,EAAgB9L,GACvB,MAAMlE,EAASkE,EAAElE,OACjB,IAAKA,EAAQ,OACb,MAAMiQ,EAAY/L,EAAElE,OAAOkQ,eAAiB,GAM5C,GAJID,EAAUzM,QAAQU,GAAK,GACzB+L,EAAUE,QAAQjM,GAGhB4J,GAAE9N,GAAQoQ,GAAGP,GAAiBC,EAASO,MAAMrQ,EAAQiQ,OAAgB,CACvE,MAAMK,EAAUxC,GAAE9N,GAAQsQ,UAE1B,IAAK,IAAI9T,EAAI,EAAGA,EAAI8T,EAAQzR,OAAQrC,GAAK,EACnCsR,GAAEwC,EAAQ9T,IAAI4T,GAAGP,IAAiBC,EAASO,MAAMC,EAAQ9T,GAAIyT,IAKvE,SAASM,EAAYrM,GACnB,MAAM+L,EAAY/L,GAAKA,EAAElE,QAASkE,EAAElE,OAAOkQ,eAAsB,GAE7DD,EAAUzM,QAAQU,GAAK,GACzB+L,EAAUE,QAAQjM,GAGpB4L,EAASO,MAAMpM,KAAMgM,GAhCA,mBAAZN,EAAK,MACbC,EAAWE,EAAUC,GAAWJ,EACjCE,OAAiBrR,GAGduR,IAASA,GAAU,GA8BxB,MAAMS,EAASZ,EAAUjB,MAAM,KAC/B,IAAI8B,EAEJ,IAAK,IAAI3R,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EAAG,CACvC,MAAM4O,EAAKzJ,KAAKnF,GAEhB,GAAK+Q,EAaH,IAAKY,EAAI,EAAGA,EAAID,EAAO3R,OAAQ4R,GAAK,EAAG,CACrC,MAAMpP,EAAQmP,EAAOC,GAChB/C,EAAGgD,oBAAmBhD,EAAGgD,kBAAoB,IAC7ChD,EAAGgD,kBAAkBrP,KAAQqM,EAAGgD,kBAAkBrP,GAAS,IAChEqM,EAAGgD,kBAAkBrP,GAAO+D,KAAK,CAC/B0K,SAAAA,EACAa,cAAeX,IAEjBtC,EAAGlM,iBAAiBH,EAAO2O,EAAiBD,QApB9C,IAAKU,EAAI,EAAGA,EAAID,EAAO3R,OAAQ4R,GAAK,EAAG,CACrC,MAAMpP,EAAQmP,EAAOC,GAChB/C,EAAGkD,gBAAelD,EAAGkD,cAAgB,IACrClD,EAAGkD,cAAcvP,KAAQqM,EAAGkD,cAAcvP,GAAS,IACxDqM,EAAGkD,cAAcvP,GAAO+D,KAAK,CAC3B0K,SAAAA,EACAa,cAAeJ,IAEjB7C,EAAGlM,iBAAiBH,EAAOkP,EAAaR,IAiB9C,OAAO9L,MC5YP4M,ID+YF,YAAgBlB,GACd,IAAKC,EAAWC,EAAgBC,EAAUC,GAAWJ,EAE9B,mBAAZA,EAAK,MACbC,EAAWE,EAAUC,GAAWJ,EACjCE,OAAiBrR,GAGduR,IAASA,GAAU,GACxB,MAAMS,EAASZ,EAAUjB,MAAM,KAE/B,IAAK,IAAI7P,EAAI,EAAGA,EAAI0R,EAAO3R,OAAQC,GAAK,EAAG,CACzC,MAAMuC,EAAQmP,EAAO1R,GAErB,IAAK,IAAI2R,EAAI,EAAGA,EAAIxM,KAAKpF,OAAQ4R,GAAK,EAAG,CACvC,MAAM/C,EAAKzJ,KAAKwM,GAChB,IAAIK,EAQJ,IANKjB,GAAkBnC,EAAGkD,cACxBE,EAAWpD,EAAGkD,cAAcvP,GACnBwO,GAAkBnC,EAAGgD,oBAC9BI,EAAWpD,EAAGgD,kBAAkBrP,IAG9ByP,GAAYA,EAASjS,OACvB,IAAK,IAAIrC,EAAIsU,EAASjS,OAAS,EAAGrC,GAAK,EAAGA,GAAK,EAAG,CAChD,MAAM8E,EAAUwP,EAAStU,GAErBsT,GAAYxO,EAAQwO,WAAaA,GAG1BA,GAAYxO,EAAQwO,UAAYxO,EAAQwO,SAASiB,WAAazP,EAAQwO,SAASiB,YAAcjB,GAFtGpC,EAAGjM,oBAAoBJ,EAAOC,EAAQqP,cAAeZ,GACrDe,EAASvG,OAAO/N,EAAG,IAITsT,IACVpC,EAAGjM,oBAAoBJ,EAAOC,EAAQqP,cAAeZ,GACrDe,EAASvG,OAAO/N,EAAG,MAO7B,OAAOyH,MCzbP+M,QDkdF,YAAoBrB,GAClB,MAAM5C,EAASF,KACT2D,EAASb,EAAK,GAAGhB,MAAM,KACvBsB,EAAYN,EAAK,GAEvB,IAAK,IAAI7Q,EAAI,EAAGA,EAAI0R,EAAO3R,OAAQC,GAAK,EAAG,CACzC,MAAMuC,EAAQmP,EAAO1R,GAErB,IAAK,IAAI2R,EAAI,EAAGA,EAAIxM,KAAKpF,OAAQ4R,GAAK,EAAG,CACvC,MAAM/C,EAAKzJ,KAAKwM,GAEhB,GAAI1D,EAAOX,YAAa,CACtB,MAAM6E,EAAM,IAAIlE,EAAOX,YAAY/K,EAAO,CACxCsE,OAAQsK,EACRpK,SAAS,EACTqL,YAAY,IAEdxD,EAAGwC,cAAgBP,EAAK9G,OAAO,CAAC7H,EAAMmQ,IAAcA,EAAY,GAChEzD,EAAG0D,cAAcH,GACjBvD,EAAGwC,cAAgB,UACZxC,EAAGwC,gBAKhB,OAAOjM,MC1ePoN,cD6eF,SAAuBnK,GACrB,MAAMoK,EAAMrN,KAYZ,OAJIiD,GACFoK,EAAI5B,GAAG,iBAPT,SAAS6B,EAAarN,GAChBA,EAAElE,SAAWiE,OACjBiD,EAASjB,KAAKhC,KAAMC,GACpBoN,EAAIT,IAAI,gBAAiBU,OAOpBtN,MCzfPuN,WD0hBF,SAAoBC,GAClB,GAAIxN,KAAKpF,OAAS,EAAG,CACnB,GAAI4S,EAAgB,CAClB,MAAMC,EAASzN,KAAKyN,SACpB,OAAOzN,KAAK,GAAG0N,YAAcC,WAAWF,EAAOpF,iBAAiB,iBAAmBsF,WAAWF,EAAOpF,iBAAiB,gBAGxH,OAAOrI,KAAK,GAAG0N,YAGjB,OAAO,MCniBPE,YDojBF,SAAqBJ,GACnB,GAAIxN,KAAKpF,OAAS,EAAG,CACnB,GAAI4S,EAAgB,CAClB,MAAMC,EAASzN,KAAKyN,SACpB,OAAOzN,KAAK,GAAG6N,aAAeF,WAAWF,EAAOpF,iBAAiB,eAAiBsF,WAAWF,EAAOpF,iBAAiB,kBAGvH,OAAOrI,KAAK,GAAG6N,aAGjB,OAAO,MC7jBPJ,OD+mBF,WACE,MAAM3E,EAASF,KACf,OAAI5I,KAAK,GAAW8I,EAAOV,iBAAiBpI,KAAK,GAAI,MAC9C,ICjnBP8N,OD+jBF,WACE,GAAI9N,KAAKpF,OAAS,EAAG,CACnB,MAAMkO,EAASF,KACTlP,EAAWmO,KACX4B,EAAKzJ,KAAK,GACV+N,EAAMtE,EAAGuE,wBACTlH,EAAOpN,EAASoN,KAChBmH,EAAYxE,EAAGwE,WAAanH,EAAKmH,WAAa,EAC9CC,EAAazE,EAAGyE,YAAcpH,EAAKoH,YAAc,EACjDC,EAAY1E,IAAOX,EAASA,EAAOsF,QAAU3E,EAAG0E,UAChDE,EAAa5E,IAAOX,EAASA,EAAOwF,QAAU7E,EAAG4E,WACvD,MAAO,CACLE,IAAKR,EAAIQ,IAAMJ,EAAYF,EAC3BO,KAAMT,EAAIS,KAAOH,EAAaH,GAIlC,OAAO,MC/kBPO,IDmnBF,SAAalT,EAAOoC,GAClB,MAAMmL,EAASF,KACf,IAAI/N,EAEJ,GAAyB,IAArBqQ,UAAUtQ,OAAc,CAC1B,GAAqB,iBAAVW,EAGJ,CAEL,IAAKV,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EAChC,IAAK,MAAM6T,KAAQnT,EACjByE,KAAKnF,GAAGwD,MAAMqQ,GAAQnT,EAAMmT,GAIhC,OAAO1O,KATP,GAAIA,KAAK,GAAI,OAAO8I,EAAOV,iBAAiBpI,KAAK,GAAI,MAAMqI,iBAAiB9M,GAahF,GAAyB,IAArB2P,UAAUtQ,QAAiC,iBAAVW,EAAoB,CAEvD,IAAKV,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EAChCmF,KAAKnF,GAAGwD,MAAM9C,GAASoC,EAGzB,OAAOqC,KAGT,OAAOA,MC/oBP2O,KDkpBF,SAAc1L,GACZ,OAAKA,GACLjD,KAAKjH,QAAQ,CAAC0Q,EAAIpD,KAChBpD,EAASmJ,MAAM3C,EAAI,CAACA,EAAIpD,MAEnBrG,MAJeA,MClpBtBG,KD8pBF,SAAcA,GACZ,QAAoB,IAATA,EACT,OAAOH,KAAK,GAAKA,KAAK,GAAGQ,UAAY,KAGvC,IAAK,IAAI3F,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EACpCmF,KAAKnF,GAAG2F,UAAYL,EAGtB,OAAOH,WAGT,SAAclD,GACZ,QAAoB,IAATA,EACT,OAAOkD,KAAK,GAAKA,KAAK,GAAG4O,YAAY7E,OAAS,KAGhD,IAAK,IAAIlP,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EACpCmF,KAAKnF,GAAG+T,YAAc9R,EAGxB,OAAOkD,MCjrBPmM,GDorBF,SAAYrC,GACV,MAAMhB,EAASF,KACTlP,EAAWmO,KACX4B,EAAKzJ,KAAK,GAChB,IAAI6O,EACAhU,EACJ,IAAK4O,QAA0B,IAAbK,EAA0B,OAAO,EAEnD,GAAwB,iBAAbA,EAAuB,CAChC,GAAIL,EAAGqF,QAAS,OAAOrF,EAAGqF,QAAQhF,GAClC,GAAIL,EAAGsF,sBAAuB,OAAOtF,EAAGsF,sBAAsBjF,GAC9D,GAAIL,EAAGuF,kBAAmB,OAAOvF,EAAGuF,kBAAkBlF,GAGtD,IAFA+E,EAAchF,GAAEC,GAEXjP,EAAI,EAAGA,EAAIgU,EAAYjU,OAAQC,GAAK,EACvC,GAAIgU,EAAYhU,KAAO4O,EAAI,OAAO,EAGpC,OAAO,EAGT,GAAIK,IAAapQ,EACf,OAAO+P,IAAO/P,EAGhB,GAAIoQ,IAAahB,EACf,OAAOW,IAAOX,EAGhB,GAAIgB,EAASK,UAAYL,aAAoBf,GAAM,CAGjD,IAFA8F,EAAc/E,EAASK,SAAW,CAACL,GAAYA,EAE1CjP,EAAI,EAAGA,EAAIgU,EAAYjU,OAAQC,GAAK,EACvC,GAAIgU,EAAYhU,KAAO4O,EAAI,OAAO,EAGpC,OAAO,EAGT,OAAO,GC1tBPpD,MD6tBF,WACE,IACIxL,EADAoU,EAAQjP,KAAK,GAGjB,GAAIiP,EAAO,CAGT,IAFApU,EAAI,EAEuC,QAAnCoU,EAAQA,EAAMC,kBACG,IAAnBD,EAAM9E,WAAgBtP,GAAK,GAGjC,OAAOA,ICvuBTsU,GD6uBF,SAAY9I,GACV,QAAqB,IAAVA,EAAuB,OAAOrG,KACzC,MAAMpF,EAASoF,KAAKpF,OAEpB,GAAIyL,EAAQzL,EAAS,EACnB,OAAOiP,GAAE,IAGX,GAAIxD,EAAQ,EAAG,CACb,MAAM+I,EAAcxU,EAASyL,EAC7B,OAA4BwD,GAAxBuF,EAAc,EAAY,GACrB,CAACpP,KAAKoP,KAGjB,OAAOvF,GAAE,CAAC7J,KAAKqG,aAGjB,YAAmBgJ,GACjB,IAAIC,EACJ,MAAM5V,EAAWmO,KAEjB,IAAK,IAAItP,EAAI,EAAGA,EAAI8W,EAAIzU,OAAQrC,GAAK,EAAG,CACtC+W,EAAWD,EAAI9W,GAEf,IAAK,IAAIsC,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EACpC,GAAwB,iBAAbyU,EAAuB,CAChC,MAAMC,EAAU7V,EAASC,cAAc,OAGvC,IAFA4V,EAAQ/O,UAAY8O,EAEbC,EAAQC,YACbxP,KAAKnF,GAAGoB,YAAYsT,EAAQC,iBAEzB,GAAIF,aAAoBvG,GAC7B,IAAK,IAAIyD,EAAI,EAAGA,EAAI8C,EAAS1U,OAAQ4R,GAAK,EACxCxM,KAAKnF,GAAGoB,YAAYqT,EAAS9C,SAG/BxM,KAAKnF,GAAGoB,YAAYqT,GAK1B,OAAOtP,MCrxBPyP,QD6xBF,SAAiBH,GACf,MAAM5V,EAAWmO,KACjB,IAAIhN,EACA2R,EAEJ,IAAK3R,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EAChC,GAAwB,iBAAbyU,EAAuB,CAChC,MAAMC,EAAU7V,EAASC,cAAc,OAGvC,IAFA4V,EAAQ/O,UAAY8O,EAEf9C,EAAI+C,EAAQ5O,WAAW/F,OAAS,EAAG4R,GAAK,EAAGA,GAAK,EACnDxM,KAAKnF,GAAGuB,aAAamT,EAAQ5O,WAAW6L,GAAIxM,KAAKnF,GAAG8F,WAAW,SAE5D,GAAI2O,aAAoBvG,GAC7B,IAAKyD,EAAI,EAAGA,EAAI8C,EAAS1U,OAAQ4R,GAAK,EACpCxM,KAAKnF,GAAGuB,aAAakT,EAAS9C,GAAIxM,KAAKnF,GAAG8F,WAAW,SAGvDX,KAAKnF,GAAGuB,aAAakT,EAAUtP,KAAKnF,GAAG8F,WAAW,IAItD,OAAOX,MClzBP0P,KDs1BF,SAAc5F,GACZ,OAAI9J,KAAKpF,OAAS,EACZkP,EACE9J,KAAK,GAAG2P,oBAAsB9F,GAAE7J,KAAK,GAAG2P,oBAAoBxD,GAAGrC,GAC1DD,GAAE,CAAC7J,KAAK,GAAG2P,qBAGb9F,GAAE,IAGP7J,KAAK,GAAG2P,mBAA2B9F,GAAE,CAAC7J,KAAK,GAAG2P,qBAC3C9F,GAAE,IAGJA,GAAE,KCn2BT+F,QDs2BF,SAAiB9F,GACf,MAAM+F,EAAU,GAChB,IAAIpG,EAAKzJ,KAAK,GACd,IAAKyJ,EAAI,OAAOI,GAAE,IAElB,KAAOJ,EAAGkG,oBAAoB,CAC5B,MAAMD,EAAOjG,EAAGkG,mBAEZ7F,EACED,GAAE6F,GAAMvD,GAAGrC,IAAW+F,EAAQ1O,KAAKuO,GAClCG,EAAQ1O,KAAKuO,GAEpBjG,EAAKiG,EAGP,OAAO7F,GAAEgG,ICp3BTC,KDu3BF,SAAchG,GACZ,GAAI9J,KAAKpF,OAAS,EAAG,CACnB,MAAM6O,EAAKzJ,KAAK,GAEhB,OAAI8J,EACEL,EAAGsG,wBAA0BlG,GAAEJ,EAAGsG,wBAAwB5D,GAAGrC,GACxDD,GAAE,CAACJ,EAAGsG,yBAGRlG,GAAE,IAGPJ,EAAGsG,uBAA+BlG,GAAE,CAACJ,EAAGsG,yBACrClG,GAAE,IAGX,OAAOA,GAAE,KCt4BTmG,QDy4BF,SAAiBlG,GACf,MAAMmG,EAAU,GAChB,IAAIxG,EAAKzJ,KAAK,GACd,IAAKyJ,EAAI,OAAOI,GAAE,IAElB,KAAOJ,EAAGsG,wBAAwB,CAChC,MAAMD,EAAOrG,EAAGsG,uBAEZjG,EACED,GAAEiG,GAAM3D,GAAGrC,IAAWmG,EAAQ9O,KAAK2O,GAClCG,EAAQ9O,KAAK2O,GAEpBrG,EAAKqG,EAGP,OAAOjG,GAAEoG,ICv5BTC,OD85BF,SAAgBpG,GACd,MAAMuC,EAAU,GAEhB,IAAK,IAAIxR,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EACT,OAAvBmF,KAAKnF,GAAGyB,aACNwN,EACED,GAAE7J,KAAKnF,GAAGyB,YAAY6P,GAAGrC,IAAWuC,EAAQlL,KAAKnB,KAAKnF,GAAGyB,YAE7D+P,EAAQlL,KAAKnB,KAAKnF,GAAGyB,aAK3B,OAAOuN,GAAEwC,IC16BTA,QD66BF,SAAiBvC,GACf,MAAMuC,EAAU,GAEhB,IAAK,IAAIxR,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EAAG,CACvC,IAAIqV,EAASlQ,KAAKnF,GAAGyB,WAErB,KAAO4T,GACDpG,EACED,GAAEqG,GAAQ/D,GAAGrC,IAAWuC,EAAQlL,KAAK+O,GAEzC7D,EAAQlL,KAAK+O,GAGfA,EAASA,EAAO5T,WAIpB,OAAOuN,GAAEwC,IC77BT8D,QDg8BF,SAAiBrG,GACf,IAAIqG,EAAUnQ,KAEd,YAAwB,IAAb8J,EACFD,GAAE,KAGNsG,EAAQhE,GAAGrC,KACdqG,EAAUA,EAAQ9D,QAAQvC,GAAUqF,GAAG,IAGlCgB,IC18BPC,KD68BF,SAActG,GACZ,MAAMuG,EAAgB,GAEtB,IAAK,IAAIxV,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EAAG,CACvC,MAAMyV,EAAQtQ,KAAKnF,GAAGmM,iBAAiB8C,GAEvC,IAAK,IAAI0C,EAAI,EAAGA,EAAI8D,EAAM1V,OAAQ4R,GAAK,EACrC6D,EAAclP,KAAKmP,EAAM9D,IAI7B,OAAO3C,GAAEwG,aAGX,SAAkBvG,GAChB,MAAM9D,EAAW,GAEjB,IAAK,IAAInL,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EAAG,CACvC,MAAM8F,EAAaX,KAAKnF,GAAGmL,SAE3B,IAAK,IAAIwG,EAAI,EAAGA,EAAI7L,EAAW/F,OAAQ4R,GAAK,EACrC1C,IAAYD,GAAElJ,EAAW6L,IAAIL,GAAGrC,IACnC9D,EAAS7E,KAAKR,EAAW6L,IAK/B,OAAO3C,GAAE7D,ICt+BTpB,ODyoBF,SAAgB3B,GAEd,OAAO4G,GADQF,GAAY3J,KAAMiD,KCzoBjC2H,ODw+BF,WACE,IAAK,IAAI/P,EAAI,EAAGA,EAAImF,KAAKpF,OAAQC,GAAK,EAChCmF,KAAKnF,GAAGyB,YAAY0D,KAAKnF,GAAGyB,WAAWC,YAAYyD,KAAKnF,IAG9D,OAAOmF,OEjgCT,SAASuQ,GAAStN,EAAUuN,EAAQ,GAClC,OAAO/H,WAAWxF,EAAUuN,GAG9B,SAASC,KACP,OAAOC,KAAKD,MAsBd,SAASE,GAAalH,EAAImH,EAAO,KAC/B,MAAM9H,EAASF,KACf,IAAIiI,EACAC,EACAC,EACJ,MAAMC,EAxBR,SAA0BvH,GACxB,MAAMX,EAASF,KACf,IAAIvK,EAcJ,OAZIyK,EAAOV,mBACT/J,EAAQyK,EAAOV,iBAAiBqB,EAAI,QAGjCpL,GAASoL,EAAGwH,eACf5S,EAAQoL,EAAGwH,cAGR5S,IACHA,EAAQoL,EAAGpL,OAGNA,EAQU+J,CAAiBqB,GA+BlC,OA7BIX,EAAOoI,iBACTJ,EAAeE,EAAS3F,WAAa2F,EAASG,gBAE1CL,EAAapG,MAAM,KAAK9P,OAAS,IACnCkW,EAAeA,EAAapG,MAAM,MAAM/F,IAAIxL,GAAKA,EAAEiY,QAAQ,IAAK,MAAMC,KAAK,OAK7EN,EAAkB,IAAIjI,EAAOoI,gBAAiC,SAAjBJ,EAA0B,GAAKA,KAE5EC,EAAkBC,EAASM,cAAgBN,EAASO,YAAcP,EAASQ,aAAeR,EAASS,aAAeT,EAAS3F,WAAa2F,EAAS3I,iBAAiB,aAAa+I,QAAQ,aAAc,sBACrMP,EAASE,EAAgBW,WAAWhH,MAAM,MAG/B,MAATkG,IAE0BE,EAAxBhI,EAAOoI,gBAAgCH,EAAgBY,IAChC,KAAlBd,EAAOjW,OAA8B+S,WAAWkD,EAAO,KAC5ClD,WAAWkD,EAAO,KAG3B,MAATD,IAE0BE,EAAxBhI,EAAOoI,gBAAgCH,EAAgBa,IAChC,KAAlBf,EAAOjW,OAA8B+S,WAAWkD,EAAO,KAC5ClD,WAAWkD,EAAO,KAGjCC,GAAgB,EAGzB,SAASpK,GAAS1C,GAChB,MAAoB,iBAANA,GAAwB,OAANA,GAAcA,EAAE2C,aAAkE,WAAnDhO,OAAOiR,UAAU8H,SAAS1P,KAAKgC,GAAG7J,MAAM,GAAI,GAY7G,SAASyM,MAAU8E,GACjB,MAAMmG,EAAKlZ,OAAO+S,EAAK,IACjBoG,EAAW,CAAC,YAAa,cAAe,aAE9C,IAAK,IAAIjX,EAAI,EAAGA,EAAI6Q,EAAK9Q,OAAQC,GAAK,EAAG,CACvC,MAAMkX,EAAarG,EAAK7Q,GAExB,GAAIkX,MAAAA,IAhBQ/V,EAgBmD+V,IAd3C,oBAAXjJ,aAAwD,IAAvBA,OAAOkJ,YAC1ChW,aAAgBgW,YAGlBhW,IAA2B,IAAlBA,EAAKmO,UAAoC,KAAlBnO,EAAKmO,YAUkC,CAC1E,MAAM8H,EAAYtZ,OAAO+C,KAAK/C,OAAOoZ,IAAanN,OAAOxG,GAAO0T,EAASvS,QAAQnB,GAAO,GAExF,IAAK,IAAI8T,EAAY,EAAGzX,EAAMwX,EAAUrX,OAAQsX,EAAYzX,EAAKyX,GAAa,EAAG,CAC/E,MAAMC,EAAUF,EAAUC,GACpBE,EAAOzZ,OAAO0Z,yBAAyBN,EAAYI,QAE5C5X,IAAT6X,GAAsBA,EAAKE,aACzB5L,GAASmL,EAAGM,KAAazL,GAASqL,EAAWI,IAC3CJ,EAAWI,GAASI,WACtBV,EAAGM,GAAWJ,EAAWI,GAEzBvL,GAAOiL,EAAGM,GAAUJ,EAAWI,KAEvBzL,GAASmL,EAAGM,KAAazL,GAASqL,EAAWI,KACvDN,EAAGM,GAAW,GAEVJ,EAAWI,GAASI,WACtBV,EAAGM,GAAWJ,EAAWI,GAEzBvL,GAAOiL,EAAGM,GAAUJ,EAAWI,KAGjCN,EAAGM,GAAWJ,EAAWI,MAvCrC,IAAgBnW,EA8Cd,OAAO6V,EAGT,SAASW,GAAe/I,EAAIgJ,EAASC,GACnCjJ,EAAGpL,MAAMU,YAAY0T,EAASC,GAGhC,SAASC,IAAqBC,OAC5BA,EAAMC,eACNA,EAAcC,KACdA,IAEA,MAAMhK,EAASF,KACTmK,GAAiBH,EAAOI,UAC9B,IACIC,EADAC,EAAY,KAEhB,MAAM3H,EAAWqH,EAAOO,OAAOC,MAC/BR,EAAOS,UAAUhV,MAAMiV,eAAiB,OACxCxK,EAAOyK,qBAAqBX,EAAOY,gBACnC,MAAMC,EAAMZ,EAAiBE,EAAgB,OAAS,OAEhDW,EAAe,CAACC,EAAS5X,IACd,SAAR0X,GAAkBE,GAAW5X,GAAkB,SAAR0X,GAAkBE,GAAW5X,EAGvE6X,EAAU,KACdX,GAAO,IAAIvC,MAAOmD,UAEA,OAAdX,IACFA,EAAYD,GAGd,MAAMa,EAAWpZ,KAAKC,IAAID,KAAKqZ,KAAKd,EAAOC,GAAa3H,EAAU,GAAI,GAChEyI,EAAe,GAAMtZ,KAAKuZ,IAAIH,EAAWpZ,KAAKwZ,IAAM,EAC1D,IAAIC,EAAkBpB,EAAgBiB,GAAgBnB,EAAiBE,GAUvE,GARIW,EAAaS,EAAiBtB,KAChCsB,EAAkBtB,GAGpBD,EAAOS,UAAUe,SAAS,CACxBrU,CAAC+S,GAAOqB,IAGNT,EAAaS,EAAiBtB,GAUhC,OATAD,EAAOS,UAAUhV,MAAMgW,SAAW,SAClCzB,EAAOS,UAAUhV,MAAMiV,eAAiB,GACxC7K,WAAW,KACTmK,EAAOS,UAAUhV,MAAMgW,SAAW,GAClCzB,EAAOS,UAAUe,SAAS,CACxBrU,CAAC+S,GAAOqB,WAGZrL,EAAOyK,qBAAqBX,EAAOY,gBAIrCZ,EAAOY,eAAiB1K,EAAON,sBAAsBoL,IAGvDA,IChMF,IAAIU,GCCAC,GCDAC,GF+BJ,SAASC,KAKP,OAJKH,KACHA,GA/BJ,WACE,MAAMxL,EAASF,KACTlP,EAAWmO,KACjB,MAAO,CACL6M,aAAchb,EAASib,iBAAmB,mBAAoBjb,EAASib,gBAAgBtW,MACvFuW,SAAU,iBAAkB9L,GAAUA,EAAO+L,eAAiBnb,aAAoBoP,EAAO+L,eACzFC,gBAAiB,WACf,IAAIC,GAAkB,EAEtB,IACE,MAAMC,EAAOrc,OAAOwQ,eAAe,GAAI,UAAW,CAEhDpJ,MACEgV,GAAkB,KAItBjM,EAAOvL,iBAAiB,sBAAuB,KAAMyX,GACrD,MAAO/U,IAGT,OAAO8U,EAfQ,GAiBjBE,SACS,mBAAoBnM,GAOnBoM,IAGLZ,GCWT,SAASa,GAAUC,EAAY,IAK7B,OAJKb,KACHA,GA9CJ,UAAoBtM,UAClBA,GACE,IACF,MAAMqM,EAAUG,KACV3L,EAASF,KACTyM,EAAWvM,EAAOd,UAAUqN,SAC5BC,EAAKrN,GAAaa,EAAOd,UAAUC,UACnCsN,EAAS,CACbC,KAAK,EACLC,SAAS,GAELC,EAAc5M,EAAOR,OAAOqN,MAC5BC,EAAe9M,EAAOR,OAAOuN,OAC7BJ,EAAUH,EAAGQ,MAAM,+BAEzB,IAAIC,EAAOT,EAAGQ,MAAM,wBACpB,MAAME,EAAOV,EAAGQ,MAAM,2BAChBG,GAAUF,GAAQT,EAAGQ,MAAM,8BAC3BI,EAAuB,UAAbb,EAChB,IAAIc,EAAqB,aAAbd,EAsBZ,OAlBKU,GAAQI,GAAS7B,EAAQM,OAFV,CAAC,YAAa,YAAa,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,WAAY,YAExGrV,QAAQ,GAAGmW,KAAeE,MAAmB,IAC9FG,EAAOT,EAAGQ,MAAM,uBACXC,IAAMA,EAAO,CAAC,EAAG,EAAG,WACzBI,GAAQ,GAINV,IAAYS,IACdX,EAAOa,GAAK,UACZb,EAAOE,SAAU,IAGfM,GAAQE,GAAUD,KACpBT,EAAOa,GAAK,MACZb,EAAOC,KAAM,GAIRD,EAKUc,CAAWjB,IAGrBb,GCpCT,SAAS+B,KAKP,OAJK9B,KACHA,GAhBJ,WACE,MAAM1L,EAASF,KAOf,MAAO,CACL2N,SANF,WACE,MAAMjB,EAAKxM,EAAOd,UAAUC,UAAUuO,cACtC,OAAOlB,EAAG/V,QAAQ,WAAa,GAAK+V,EAAG/V,QAAQ,UAAY,GAAK+V,EAAG/V,QAAQ,WAAa,EAI9EgX,GACVE,UAAW,+CAA+CC,KAAK5N,EAAOd,UAAUC,YAMtE0O,IAGLnC,GJiBT7b,OAAO+C,KAAK4O,IAASvR,QAAQ6d,IAC3Bje,OAAOwQ,eAAeU,GAAEpR,GAAIme,EAAY,CACtCjZ,MAAO2M,GAAQsM,GACfC,UAAU,aKzCC,CACb9W,GAAGwM,EAAQlP,EAASyZ,GAClB,MAAMC,EAAO/W,KACb,GAAuB,mBAAZ3C,EAAwB,OAAO0Z,EAC1C,MAAMC,EAASF,EAAW,UAAY,OAKtC,OAJAvK,EAAO7B,MAAM,KAAK3R,QAAQqE,IACnB2Z,EAAKE,gBAAgB7Z,KAAQ2Z,EAAKE,gBAAgB7Z,GAAS,IAChE2Z,EAAKE,gBAAgB7Z,GAAO4Z,GAAQ3Z,KAE/B0Z,GAGThX,KAAKwM,EAAQlP,EAASyZ,GACpB,MAAMC,EAAO/W,KACb,GAAuB,mBAAZ3C,EAAwB,OAAO0Z,EAE1C,SAASG,KAAexL,GACtBqL,EAAKnK,IAAIL,EAAQ2K,GAEbA,EAAYC,uBACPD,EAAYC,eAGrB9Z,EAAQ+O,MAAM2K,EAAMrL,GAItB,OADAwL,EAAYC,eAAiB9Z,EACtB0Z,EAAKtL,GAAGc,EAAQ2K,EAAaJ,IAGtC/W,MAAM1C,EAASyZ,GACb,MAAMC,EAAO/W,KACb,GAAuB,mBAAZ3C,EAAwB,OAAO0Z,EAC1C,MAAMC,EAASF,EAAW,UAAY,OAMtC,OAJIC,EAAKK,mBAAmB7X,QAAQlC,GAAW,GAC7C0Z,EAAKK,mBAAmBJ,GAAQ3Z,GAG3B0Z,GAGThX,OAAO1C,GACL,MAAM0Z,EAAO/W,KACb,IAAK+W,EAAKK,mBAAoB,OAAOL,EACrC,MAAM1Q,EAAQ0Q,EAAKK,mBAAmB7X,QAAQlC,GAM9C,OAJIgJ,GAAS,GACX0Q,EAAKK,mBAAmB9Q,OAAOD,EAAO,GAGjC0Q,GAGThX,IAAIwM,EAAQlP,GACV,MAAM0Z,EAAO/W,KACb,OAAK+W,EAAKE,iBACV1K,EAAO7B,MAAM,KAAK3R,QAAQqE,SACD,IAAZC,EACT0Z,EAAKE,gBAAgB7Z,GAAS,GACrB2Z,EAAKE,gBAAgB7Z,IAC9B2Z,EAAKE,gBAAgB7Z,GAAOrE,QAAQ,CAACse,EAAchR,MAC7CgR,IAAiBha,GAAWga,EAAaF,gBAAkBE,EAAaF,iBAAmB9Z,IAC7F0Z,EAAKE,gBAAgB7Z,GAAOkJ,OAAOD,EAAO,OAK3C0Q,GAZ2BA,GAepChX,QAAQ2L,GACN,MAAMqL,EAAO/W,KACb,IAAK+W,EAAKE,gBAAiB,OAAOF,EAClC,IAAIxK,EACAxP,EACAuI,EAEmB,iBAAZoG,EAAK,IAAmBjL,MAAMiJ,QAAQgC,EAAK,KACpDa,EAASb,EAAK,GACd3O,EAAO2O,EAAKvR,MAAM,EAAGuR,EAAK9Q,QAC1B0K,EAAUyR,IAEVxK,EAASb,EAAK,GAAGa,OACjBxP,EAAO2O,EAAK,GAAG3O,KACfuI,EAAUoG,EAAK,GAAGpG,SAAWyR,GAG/Bha,EAAKmP,QAAQ5G,GAeb,OAdoB7E,MAAMiJ,QAAQ6C,GAAUA,EAASA,EAAO7B,MAAM,MACtD3R,QAAQqE,IACd2Z,EAAKK,oBAAsBL,EAAKK,mBAAmBxc,QACrDmc,EAAKK,mBAAmBre,QAAQse,IAC9BA,EAAajL,MAAM9G,EAAS,CAAClI,KAAUL,MAIvCga,EAAKE,iBAAmBF,EAAKE,gBAAgB7Z,IAC/C2Z,EAAKE,gBAAgB7Z,GAAOrE,QAAQse,IAClCA,EAAajL,MAAM9G,EAASvI,OAI3Bga,aCxGaO,IAAe1E,OACrCA,EAAM2E,aACNA,EAAYC,UACZA,EAASC,KACTA,IAEA,MAAMC,YACJA,EAAWC,cACXA,GACE/E,EACJ,IAAIa,EAAM+D,EAQV,GANK/D,IAC8BA,EAA7BiE,EAAcC,EAAqB,OAAgBD,EAAcC,EAAqB,OAAkB,SAG9G/E,EAAOgF,KAAK,aAAaH,GAErBF,GAAgBG,IAAgBC,EAAe,CACjD,GAAY,UAARlE,EAEF,YADAb,EAAOgF,KAAK,uBAAuBH,GAIrC7E,EAAOgF,KAAK,wBAAwBH,GAExB,SAARhE,EACFb,EAAOgF,KAAK,sBAAsBH,GAElC7E,EAAOgF,KAAK,sBAAsBH,ICdzB,SAASI,GAAaza,GACnC,MAAMwV,EAAS5S,KACTtG,EAAWmO,KACXiB,EAASF,KACT7L,EAAO6V,EAAOkF,iBACd3E,OACJA,EAAM4E,QACNA,EAAOC,QACPA,GACEpF,EACJ,IAAKoF,EAAS,OAEd,GAAIpF,EAAOqF,WAAa9E,EAAO+E,+BAC7B,QAGGtF,EAAOqF,WAAa9E,EAAOgF,SAAWhF,EAAOiF,MAChDxF,EAAOyF,UAGT,IAAIpY,EAAI7C,EACJ6C,EAAEqY,gBAAerY,EAAIA,EAAEqY,eAC3B,IAAIC,EAAY1O,GAAE5J,EAAElE,QAEpB,GAAiC,YAA7BoX,EAAOqF,oBACJD,EAAUpI,QAAQyC,EAAOS,WAAWzY,OAAQ,OAInD,GADAmC,EAAK0b,aAA0B,eAAXxY,EAAEwB,MACjB1E,EAAK0b,cAAgB,UAAWxY,GAAiB,IAAZA,EAAEyY,MAAa,OACzD,IAAK3b,EAAK0b,cAAgB,WAAYxY,GAAKA,EAAE0Y,OAAS,EAAG,OACzD,GAAI5b,EAAK6b,WAAa7b,EAAK8b,QAAS,SAEL1F,EAAO2F,gBAA4C,KAA1B3F,EAAO2F,gBAEnC7Y,EAAElE,QAAUkE,EAAElE,OAAOgd,YAAc3b,EAAM4b,MAAQ5b,EAAM4b,KAAK,KACtFT,EAAY1O,GAAEzM,EAAM4b,KAAK,KAG3B,MAAMC,EAAoB9F,EAAO8F,kBAAoB9F,EAAO8F,kBAAoB,IAAI9F,EAAO2F,eACrFI,KAAoBjZ,EAAElE,SAAUkE,EAAElE,OAAOgd,YAE/C,GAAI5F,EAAOgG,YAAcD,WArDHpP,EAAUsP,EAAOpZ,MAQvC,OAPA,SAASqZ,EAAc5P,GACrB,OAAKA,GAAMA,IAAO5B,MAAiB4B,IAAOb,MACtCa,EAAG6P,eAAc7P,EAAKA,EAAG6P,cACf7P,EAAG0G,QAAQrG,IACTuP,EAAc5P,EAAG8P,cAAchS,OAHe,KAMzD8R,CAAcD,GA6CqBI,CAAeP,EAAmBhZ,EAAElE,QAAUwc,EAAUpI,QAAQ8I,GAAmB,IAE3H,YADArG,EAAO6G,YAAa,GAItB,GAAItG,EAAOuG,eACJnB,EAAUpI,QAAQgD,EAAOuG,cAAc,GAAI,OAGlD3B,EAAQ4B,SAAsB,eAAX1Z,EAAEwB,KAAwBxB,EAAE2Z,cAAc,GAAGC,MAAQ5Z,EAAE4Z,MAC1E9B,EAAQ+B,SAAsB,eAAX7Z,EAAEwB,KAAwBxB,EAAE2Z,cAAc,GAAGG,MAAQ9Z,EAAE8Z,MAC1E,MAAMC,EAASjC,EAAQ4B,SACjBM,EAASlC,EAAQ+B,SAEjBI,EAAqB/G,EAAO+G,oBAAsB/G,EAAOgH,sBACzDC,EAAqBjH,EAAOiH,oBAAsBjH,EAAOkH,sBAE/D,GAAIH,IAAuBF,GAAUI,GAAsBJ,GAAUlR,EAAOwR,WAAaF,GAAqB,CAC5G,GAA2B,YAAvBF,EAGF,OAFA9c,EAAMmd,iBAqBV,GAfA5hB,OAAOP,OAAO2E,EAAM,CAClB6b,WAAW,EACXC,SAAS,EACT2B,qBAAqB,EACrBC,iBAAalgB,EACbmgB,iBAAangB,IAEfwd,EAAQiC,OAASA,EACjBjC,EAAQkC,OAASA,EACjBld,EAAK4d,eAAiBlK,KACtBmC,EAAO6G,YAAa,EACpB7G,EAAOgI,aACPhI,EAAOiI,oBAAiBtgB,EACpB4Y,EAAO2H,UAAY,IAAG/d,EAAKge,oBAAqB,GAErC,eAAX9a,EAAEwB,KAAuB,CAC3B,IAAI8Y,GAAiB,EACjBhC,EAAUpM,GAAGpP,EAAKie,qBAAoBT,GAAiB,GAEvD7gB,EAASqN,eAAiB8C,GAAEnQ,EAASqN,eAAeoF,GAAGpP,EAAKie,oBAAsBthB,EAASqN,gBAAkBwR,EAAU,IACzH7e,EAASqN,cAAckU,OAGzB,MAAMC,EAAuBX,GAAkB3H,EAAOuI,gBAAkBhI,EAAOiI,0BAE1EjI,EAAOkI,gCAAiCH,GAA0B3C,EAAU,GAAG+C,mBAClFrb,EAAEsa,iBAIN3H,EAAOgF,KAAK,aAAc3X,GC7Gb,SAASsb,GAAYne,GAClC,MAAM1D,EAAWmO,KACX+K,EAAS5S,KACTjD,EAAO6V,EAAOkF,iBACd3E,OACJA,EAAM4E,QACNA,EACAyD,aAAcC,EAAGzD,QACjBA,GACEpF,EACJ,IAAKoF,EAAS,OACd,IAAI/X,EAAI7C,EAGR,GAFI6C,EAAEqY,gBAAerY,EAAIA,EAAEqY,gBAEtBvb,EAAK6b,UAKR,YAJI7b,EAAK2d,aAAe3d,EAAK0d,aAC3B7H,EAAOgF,KAAK,oBAAqB3X,IAMrC,GAAIlD,EAAK0b,cAA2B,cAAXxY,EAAEwB,KAAsB,OACjD,MAAMia,EAAyB,cAAXzb,EAAEwB,MAAwBxB,EAAE2Z,gBAAkB3Z,EAAE2Z,cAAc,IAAM3Z,EAAE0b,eAAe,IACnG9B,EAAmB,cAAX5Z,EAAEwB,KAAuBia,EAAY7B,MAAQ5Z,EAAE4Z,MACvDE,EAAmB,cAAX9Z,EAAEwB,KAAuBia,EAAY3B,MAAQ9Z,EAAE8Z,MAE7D,GAAI9Z,EAAE2b,wBAGJ,OAFA7D,EAAQiC,OAASH,OACjB9B,EAAQkC,OAASF,GAInB,IAAKnH,EAAOuI,eAcV,OAZAvI,EAAO6G,YAAa,OAEhB1c,EAAK6b,YACPjgB,OAAOP,OAAO2f,EAAS,CACrBiC,OAAQH,EACRI,OAAQF,EACRJ,SAAUE,EACVC,SAAUC,IAEZhd,EAAK4d,eAAiBlK,OAM1B,GAAI1T,EAAK0b,cAAgBtF,EAAO0I,sBAAwB1I,EAAOiF,KAC7D,GAAIxF,EAAOkJ,cAET,GAAI/B,EAAQhC,EAAQkC,QAAUrH,EAAOI,WAAaJ,EAAOmJ,gBAAkBhC,EAAQhC,EAAQkC,QAAUrH,EAAOI,WAAaJ,EAAOoJ,eAG9H,OAFAjf,EAAK6b,WAAY,OACjB7b,EAAK8b,SAAU,QAGZ,GAAIgB,EAAQ9B,EAAQiC,QAAUpH,EAAOI,WAAaJ,EAAOmJ,gBAAkBlC,EAAQ9B,EAAQiC,QAAUpH,EAAOI,WAAaJ,EAAOoJ,eACrI,OAIJ,GAAIjf,EAAK0b,cAAgB/e,EAASqN,eAC5B9G,EAAElE,SAAWrC,EAASqN,eAAiB8C,GAAE5J,EAAElE,QAAQoQ,GAAGpP,EAAKie,mBAG7D,OAFAje,EAAK8b,SAAU,OACfjG,EAAO6G,YAAa,GASxB,GAJI1c,EAAKyd,qBACP5H,EAAOgF,KAAK,YAAa3X,GAGvBA,EAAE2Z,eAAiB3Z,EAAE2Z,cAAchf,OAAS,EAAG,OACnDmd,EAAQ4B,SAAWE,EACnB9B,EAAQ+B,SAAWC,EACnB,MAAMkC,EAAQlE,EAAQ4B,SAAW5B,EAAQiC,OACnCkC,EAAQnE,EAAQ+B,SAAW/B,EAAQkC,OACzC,GAAIrH,EAAOO,OAAO2H,WAAapgB,KAAKyhB,KAAKF,GAAS,EAAIC,GAAS,GAAKtJ,EAAOO,OAAO2H,UAAW,OAE7F,QAAgC,IAArB/d,EAAK0d,YAA6B,CAC3C,IAAI2B,EAEAxJ,EAAOyJ,gBAAkBtE,EAAQ+B,WAAa/B,EAAQkC,QAAUrH,EAAOkJ,cAAgB/D,EAAQ4B,WAAa5B,EAAQiC,OACtHjd,EAAK0d,aAAc,EAGfwB,EAAQA,EAAQC,EAAQA,GAAS,KACnCE,EAA4D,IAA/C1hB,KAAK4hB,MAAM5hB,KAAK6hB,IAAIL,GAAQxhB,KAAK6hB,IAAIN,IAAgBvhB,KAAKwZ,GACvEnX,EAAK0d,YAAc7H,EAAOyJ,eAAiBD,EAAajJ,EAAOiJ,WAAa,GAAKA,EAAajJ,EAAOiJ,YAe3G,GAVIrf,EAAK0d,aACP7H,EAAOgF,KAAK,oBAAqB3X,QAGH,IAArBlD,EAAK2d,cACV3C,EAAQ4B,WAAa5B,EAAQiC,QAAUjC,EAAQ+B,WAAa/B,EAAQkC,SACtEld,EAAK2d,aAAc,IAInB3d,EAAK0d,YAEP,YADA1d,EAAK6b,WAAY,GAInB,IAAK7b,EAAK2d,YACR,OAGF9H,EAAO6G,YAAa,GAEftG,EAAOgF,SAAWlY,EAAEgN,YACvBhN,EAAEsa,iBAGApH,EAAOqJ,2BAA6BrJ,EAAOsJ,QAC7Cxc,EAAEyc,kBAGC3f,EAAK8b,UACJ1F,EAAOiF,OAASjF,EAAOgF,SACzBvF,EAAOyF,UAGTtb,EAAK4f,eAAiB/J,EAAOjC,eAC7BiC,EAAOgK,cAAc,GAEjBhK,EAAOqF,WACTrF,EAAOiK,WAAW9P,QAAQ,qCAG5BhQ,EAAK+f,qBAAsB,GAEvB3J,EAAO4J,aAAyC,IAA1BnK,EAAOoK,iBAAqD,IAA1BpK,EAAOqK,gBACjErK,EAAOsK,eAAc,GAGvBtK,EAAOgF,KAAK,kBAAmB3X,IAGjC2S,EAAOgF,KAAK,aAAc3X,GAC1BlD,EAAK8b,SAAU,EACf,IAAIsE,EAAOvK,EAAOyJ,eAAiBJ,EAAQC,EAC3CnE,EAAQoF,KAAOA,EACfA,GAAQhK,EAAOiK,WACX3B,IAAK0B,GAAQA,GACjBvK,EAAOiI,eAAiBsC,EAAO,EAAI,OAAS,OAC5CpgB,EAAKsgB,iBAAmBF,EAAOpgB,EAAK4f,eACpC,IAAIW,GAAsB,EACtBC,EAAkBpK,EAAOoK,gBAgC7B,GA9BIpK,EAAO0I,sBACT0B,EAAkB,GAGhBJ,EAAO,GAAKpgB,EAAKsgB,iBAAmBzK,EAAOoJ,gBAC7CsB,GAAsB,EAClBnK,EAAOqK,aAAYzgB,EAAKsgB,iBAAmBzK,EAAOoJ,eAAiB,IAAMpJ,EAAOoJ,eAAiBjf,EAAK4f,eAAiBQ,IAASI,IAC3HJ,EAAO,GAAKpgB,EAAKsgB,iBAAmBzK,EAAOmJ,iBACpDuB,GAAsB,EAClBnK,EAAOqK,aAAYzgB,EAAKsgB,iBAAmBzK,EAAOmJ,eAAiB,GAAKnJ,EAAOmJ,eAAiBhf,EAAK4f,eAAiBQ,IAASI,IAGjID,IACFrd,EAAE2b,yBAA0B,IAIzBhJ,EAAOoK,gBAA4C,SAA1BpK,EAAOiI,gBAA6B9d,EAAKsgB,iBAAmBtgB,EAAK4f,iBAC7F5f,EAAKsgB,iBAAmBtgB,EAAK4f,iBAG1B/J,EAAOqK,gBAA4C,SAA1BrK,EAAOiI,gBAA6B9d,EAAKsgB,iBAAmBtgB,EAAK4f,iBAC7F5f,EAAKsgB,iBAAmBtgB,EAAK4f,gBAG1B/J,EAAOqK,gBAAmBrK,EAAOoK,iBACpCjgB,EAAKsgB,iBAAmBtgB,EAAK4f,gBAI3BxJ,EAAO2H,UAAY,EAAG,CACxB,KAAIpgB,KAAK6hB,IAAIY,GAAQhK,EAAO2H,WAAa/d,EAAKge,oBAW5C,YADAhe,EAAKsgB,iBAAmBtgB,EAAK4f,gBAT7B,IAAK5f,EAAKge,mBAMR,OALAhe,EAAKge,oBAAqB,EAC1BhD,EAAQiC,OAASjC,EAAQ4B,SACzB5B,EAAQkC,OAASlC,EAAQ+B,SACzB/c,EAAKsgB,iBAAmBtgB,EAAK4f,oBAC7B5E,EAAQoF,KAAOvK,EAAOyJ,eAAiBtE,EAAQ4B,SAAW5B,EAAQiC,OAASjC,EAAQ+B,SAAW/B,EAAQkC,QASvG9G,EAAOsK,eAAgBtK,EAAOgF,WAE/BhF,EAAOuK,UAAYvK,EAAOuK,SAAS1F,SAAWpF,EAAO8K,UAAYvK,EAAOwK,uBAC1E/K,EAAOgL,oBACPhL,EAAOiL,uBAGLjL,EAAOO,OAAOuK,UAAYvK,EAAOuK,SAAS1F,SAAWpF,EAAO8K,UAC9D9K,EAAO8K,SAASnC,cAIlB3I,EAAOkL,eAAe/gB,EAAKsgB,kBAE3BzK,EAAOmL,aAAahhB,EAAKsgB,mBC3NZ,SAASW,GAAW5gB,GACjC,MAAMwV,EAAS5S,KACTjD,EAAO6V,EAAOkF,iBACd3E,OACJA,EAAM4E,QACNA,EACAyD,aAAcC,EAAGwC,WACjBA,EAAUjG,QACVA,GACEpF,EACJ,IAAKoF,EAAS,OACd,IAAI/X,EAAI7C,EASR,GARI6C,EAAEqY,gBAAerY,EAAIA,EAAEqY,eAEvBvb,EAAKyd,qBACP5H,EAAOgF,KAAK,WAAY3X,GAG1BlD,EAAKyd,qBAAsB,GAEtBzd,EAAK6b,UAOR,OANI7b,EAAK8b,SAAW1F,EAAO4J,YACzBnK,EAAOsK,eAAc,GAGvBngB,EAAK8b,SAAU,OACf9b,EAAK2d,aAAc,GAKjBvH,EAAO4J,YAAchgB,EAAK8b,SAAW9b,EAAK6b,aAAwC,IAA1BhG,EAAOoK,iBAAqD,IAA1BpK,EAAOqK,iBACnGrK,EAAOsK,eAAc,GAIvB,MAAMgB,EAAezN,KACf0N,EAAWD,EAAenhB,EAAK4d,eAgBrC,GAdI/H,EAAO6G,aACT7G,EAAOwL,mBAAmBne,GAC1B2S,EAAOgF,KAAK,YAAa3X,GAErBke,EAAW,KAAOD,EAAenhB,EAAKshB,cAAgB,KACxDzL,EAAOgF,KAAK,wBAAyB3X,IAIzClD,EAAKshB,cAAgB5N,KACrBF,GAAS,KACFqC,EAAO0L,YAAW1L,EAAO6G,YAAa,MAGxC1c,EAAK6b,YAAc7b,EAAK8b,UAAYjG,EAAOiI,gBAAmC,IAAjB9C,EAAQoF,MAAcpgB,EAAKsgB,mBAAqBtgB,EAAK4f,eAIrH,OAHA5f,EAAK6b,WAAY,EACjB7b,EAAK8b,SAAU,OACf9b,EAAK2d,aAAc,GAOrB,IAAI6D,EAQJ,GAXAxhB,EAAK6b,WAAY,EACjB7b,EAAK8b,SAAU,EACf9b,EAAK2d,aAAc,EAIjB6D,EADEpL,EAAOsK,aACIhC,EAAM7I,EAAOI,WAAaJ,EAAOI,WAEhCjW,EAAKsgB,iBAGjBlK,EAAOgF,QACT,OAGF,GAAIvF,EAAOO,OAAOuK,UAAYvK,EAAOuK,SAAS1F,QAI5C,YAHApF,EAAO8K,SAASM,WAAW,CACzBO,WAAAA,IAMJ,IAAIC,EAAY,EACZC,EAAY7L,EAAO8L,gBAAgB,GAEvC,IAAK,IAAI7jB,EAAI,EAAGA,EAAIojB,EAAWrjB,OAAQC,GAAKA,EAAIsY,EAAOwL,mBAAqB,EAAIxL,EAAOyL,eAAgB,CACrG,MAAMC,EAAYhkB,EAAIsY,EAAOwL,mBAAqB,EAAI,EAAIxL,EAAOyL,oBAExB,IAA9BX,EAAWpjB,EAAIgkB,GACpBN,GAAcN,EAAWpjB,IAAM0jB,EAAaN,EAAWpjB,EAAIgkB,KAC7DL,EAAY3jB,EACZ4jB,EAAYR,EAAWpjB,EAAIgkB,GAAaZ,EAAWpjB,IAE5C0jB,GAAcN,EAAWpjB,KAClC2jB,EAAY3jB,EACZ4jB,EAAYR,EAAWA,EAAWrjB,OAAS,GAAKqjB,EAAWA,EAAWrjB,OAAS,IAKnF,MAAMkkB,GAASP,EAAaN,EAAWO,IAAcC,EAC/CI,EAAYL,EAAYrL,EAAOwL,mBAAqB,EAAI,EAAIxL,EAAOyL,eAEzE,GAAIT,EAAWhL,EAAO4L,aAAc,CAElC,IAAK5L,EAAO6L,WAEV,YADApM,EAAOqM,QAAQrM,EAAO8E,aAIM,SAA1B9E,EAAOiI,iBACLiE,GAAS3L,EAAO+L,gBAAiBtM,EAAOqM,QAAQT,EAAYK,GAAgBjM,EAAOqM,QAAQT,IAGnE,SAA1B5L,EAAOiI,iBACLiE,EAAQ,EAAI3L,EAAO+L,gBAAiBtM,EAAOqM,QAAQT,EAAYK,GAAgBjM,EAAOqM,QAAQT,QAE/F,CAEL,IAAKrL,EAAOgM,YAEV,YADAvM,EAAOqM,QAAQrM,EAAO8E,aAIE9E,EAAOwM,aAAenf,EAAElE,SAAW6W,EAAOwM,WAAWC,QAAUpf,EAAElE,SAAW6W,EAAOwM,WAAWE,QAU7Grf,EAAElE,SAAW6W,EAAOwM,WAAWC,OACxCzM,EAAOqM,QAAQT,EAAYK,GAE3BjM,EAAOqM,QAAQT,IAVe,SAA1B5L,EAAOiI,gBACTjI,EAAOqM,QAAQT,EAAYK,GAGC,SAA1BjM,EAAOiI,gBACTjI,EAAOqM,QAAQT,cCtICe,KACtB,MAAM3M,EAAS5S,MACTmT,OACJA,EAAM1J,GACNA,GACEmJ,EACJ,GAAInJ,GAAyB,IAAnBA,EAAGiE,YAAmB,OAE5ByF,EAAOqM,aACT5M,EAAO6M,gBAIT,MAAMzC,eACJA,EAAcC,eACdA,EAAcyC,SACdA,GACE9M,EAEJA,EAAOoK,gBAAiB,EACxBpK,EAAOqK,gBAAiB,EACxBrK,EAAOgI,aACPhI,EAAO+M,eACP/M,EAAOiL,uBAEuB,SAAzB1K,EAAOyM,eAA4BzM,EAAOyM,cAAgB,IAAMhN,EAAOiN,QAAUjN,EAAOkN,cAAgBlN,EAAOO,OAAO4M,eACzHnN,EAAOqM,QAAQrM,EAAOoN,OAAOplB,OAAS,EAAG,GAAG,GAAO,GAEnDgY,EAAOqM,QAAQrM,EAAO8E,YAAa,GAAG,GAAO,GAG3C9E,EAAOqN,UAAYrN,EAAOqN,SAASC,SAAWtN,EAAOqN,SAASE,QAChEvN,EAAOqN,SAASznB,MAIlBoa,EAAOqK,eAAiBA,EACxBrK,EAAOoK,eAAiBA,EAEpBpK,EAAOO,OAAOiN,eAAiBV,IAAa9M,EAAO8M,UACrD9M,EAAOyN,gBCxCI,SAASC,GAAQrgB,GAC9B,MAAM2S,EAAS5S,KACV4S,EAAOoF,UAEPpF,EAAO6G,aACN7G,EAAOO,OAAOoN,eAAetgB,EAAEsa,iBAE/B3H,EAAOO,OAAOqN,0BAA4B5N,EAAOqF,YACnDhY,EAAEyc,kBACFzc,EAAEwgB,uCCTgBC,KACtB,MAAM9N,EAAS5S,MACTqT,UACJA,EAASmI,aACTA,EAAYxD,QACZA,GACEpF,EACJ,IAAKoF,EAAS,OAad,IAAI2I,EAZJ/N,EAAOgO,kBAAoBhO,EAAOI,UAE9BJ,EAAOyJ,eACTzJ,EAAOI,WAAaK,EAAUhF,WAE9BuE,EAAOI,WAAaK,EAAUlF,WAIN,IAAtByE,EAAOI,YAAkBJ,EAAOI,UAAY,GAChDJ,EAAOgL,oBACPhL,EAAOiL,sBAEP,MAAMgD,EAAiBjO,EAAOmJ,eAAiBnJ,EAAOoJ,eAGpD2E,EADqB,IAAnBE,EACY,GAECjO,EAAOI,UAAYJ,EAAOoJ,gBAAkB6E,EAGzDF,IAAgB/N,EAAOkB,UACzBlB,EAAOkL,eAAetC,GAAgB5I,EAAOI,UAAYJ,EAAOI,WAGlEJ,EAAOgF,KAAK,eAAgBhF,EAAOI,WAAW,GC1BhD,IAAI8N,IAAqB,EAEzB,SAASC,MAET,MAAMxU,GAAS,CAACqG,EAAQoE,KACtB,MAAMtd,EAAWmO,MACXsL,OACJA,EAAM6N,YACNA,EAAWvX,GACXA,EAAE4J,UACFA,EAASkC,OACTA,EAAMjB,QACNA,GACE1B,EACE9G,IAAYqH,EAAOsJ,OACnBwE,EAAuB,OAAXjK,EAAkB,mBAAqB,sBACnDkK,EAAelK,EAErB,GAAK1C,EAAQM,MAIN,CACL,MAAME,IAAwC,eAAtBkM,EAAYG,QAA0B7M,EAAQQ,kBAAmB3B,EAAOiO,mBAAmB,CACjHC,SAAS,EACTvV,SAAS,GAEXrC,EAAGwX,GAAWD,EAAYG,MAAOvO,EAAOiF,aAAc/C,GACtDrL,EAAGwX,GAAWD,EAAYM,KAAM1O,EAAO2I,YAAajH,EAAQQ,gBAAkB,CAC5EuM,SAAS,EACTvV,QAAAA,GACEA,GACJrC,EAAGwX,GAAWD,EAAYO,IAAK3O,EAAOoL,WAAYlJ,GAE9CkM,EAAYQ,QACd/X,EAAGwX,GAAWD,EAAYQ,OAAQ5O,EAAOoL,WAAYlJ,QAhBvDrL,EAAGwX,GAAWD,EAAYG,MAAOvO,EAAOiF,cAAc,GACtDne,EAASunB,GAAWD,EAAYM,KAAM1O,EAAO2I,YAAazP,GAC1DpS,EAASunB,GAAWD,EAAYO,IAAK3O,EAAOoL,YAAY,IAmBtD7K,EAAOoN,eAAiBpN,EAAOqN,2BACjC/W,EAAGwX,GAAW,QAASrO,EAAO0N,SAAS,GAGrCnN,EAAOgF,SACT9E,EAAU4N,GAAW,SAAUrO,EAAO8N,UAIpCvN,EAAOsO,qBACT7O,EAAOsO,GAAc3L,EAAOC,KAAOD,EAAOE,QAAU,0CAA4C,wBAAyB8J,IAAU,GAEnI3M,EAAOsO,GAAc,iBAAkB3B,IAAU,ICzDrD,MAAMmC,GAAgB,CAAC9O,EAAQO,IACtBP,EAAO+O,MAAQxO,EAAOwO,MAAQxO,EAAOwO,KAAKC,KAAO,SCH3C,CACb9c,MAAM,EACN0S,UAAW,aACXgB,kBAAmB,UACnBqJ,aAAc,EACdzO,MAAO,IACP+E,SAAS,EACTsJ,sBAAsB,EACtBK,gBAAgB,EAChBrF,QAAQ,EACRsF,gBAAgB,EAChB/J,SAAS,EACTgD,kBAAmB,wDAEnBrF,MAAO,KACPE,OAAQ,KAERqC,gCAAgC,EAEhCjQ,UAAW,KACXxO,IAAK,KAELygB,oBAAoB,EACpBE,mBAAoB,GAEpB4H,YAAY,EAEZC,gBAAgB,EAEhBC,kBAAkB,EAElBC,OAAQ,QAGR3C,iBAAajlB,EACb6nB,gBAAiB,SAEjBC,aAAc,EACdzC,cAAe,EACfhB,eAAgB,EAChBD,mBAAoB,EACpB2D,oBAAoB,EACpBvC,gBAAgB,EAChBwC,sBAAsB,EACtBC,mBAAoB,EAEpBC,kBAAmB,EAEnBC,qBAAqB,EACrBC,0BAA0B,EAE1BvC,eAAe,EAEfwC,cAAc,EAEdxF,WAAY,EACZhB,WAAY,GACZyG,eAAe,EACf1D,aAAa,EACbH,YAAY,EACZE,gBAAiB,GACjBH,aAAc,IACdtB,cAAc,EACdtC,gBAAgB,EAChBL,UAAW,EACX0B,0BAA0B,EAC1BpB,0BAA0B,EAC1BC,+BAA+B,EAC/BQ,qBAAqB,EAErBiH,mBAAmB,EAEnBtF,YAAY,EACZD,gBAAiB,IAEjBI,qBAAqB,EAErBZ,YAAY,EAEZwD,eAAe,EACfC,0BAA0B,EAC1BuC,qBAAqB,EAErBC,eAAe,EACfC,qBAAqB,EAErB7K,MAAM,EACN8K,qBAAsB,EACtBC,aAAc,KACdC,wBAAwB,EACxBC,mBAAmB,EAEnBpG,gBAAgB,EAChBD,gBAAgB,EAChBtD,aAAc,KAEdP,WAAW,EACXL,eAAgB,oBAChBG,kBAAmB,KAEnBmI,kBAAkB,EAElBkC,uBAAwB,UAExBC,WAAY,eACZC,gBAAiB,+BACjBC,iBAAkB,sBAClBC,0BAA2B,gCAC3BC,kBAAmB,uBACnBC,oBAAqB,yBACrBC,eAAgB,oBAChBC,wBAAyB,8BACzBC,eAAgB,oBAChBC,wBAAyB,8BACzBC,aAAc,iBAEdC,oBAAoB,EAEpBC,cAAc,GCrHD,SAASC,GAAmBjR,EAAQkR,GACjD,OAAO,SAAsB7d,EAAM,IACjC,MAAM8d,EAAkB3rB,OAAO+C,KAAK8K,GAAK,GACnC+d,EAAe/d,EAAI8d,GAEG,iBAAjBC,GAA8C,OAAjBA,GAKpC,CAAC,aAAc,aAAc,aAAahlB,QAAQ+kB,IAAoB,IAAiC,IAA5BnR,EAAOmR,KACpFnR,EAAOmR,GAAmB,CACxBE,MAAM,IAIJF,KAAmBnR,GAAU,YAAaoR,IAKhB,IAA5BpR,EAAOmR,KACTnR,EAAOmR,GAAmB,CACxBtM,SAAS,IAI0B,iBAA5B7E,EAAOmR,IAAmC,YAAanR,EAAOmR,KACvEnR,EAAOmR,GAAiBtM,SAAU,GAG/B7E,EAAOmR,KAAkBnR,EAAOmR,GAAmB,CACtDtM,SAAS,IAEXpR,GAAOyd,EAAkB7d,IAjBvBI,GAAOyd,EAAkB7d,IAXzBI,GAAOyd,EAAkB7d,ICgB/B,MAAMie,GAAa,CACjBC,cAAAA,UCfa,CACb9J,sBCTA,MAAMhI,EAAS5S,KACf,IAAI2V,EACAE,EACJ,MAAM8O,EAAM/R,EAAO+R,IAGjBhP,OADiC,IAAxB/C,EAAOO,OAAOwC,OAAiD,OAAxB/C,EAAOO,OAAOwC,MACtD/C,EAAOO,OAAOwC,MAEdgP,EAAI,GAAGC,YAIf/O,OADkC,IAAzBjD,EAAOO,OAAO0C,QAAmD,OAAzBjD,EAAOO,OAAO0C,OACtDjD,EAAOO,OAAO0C,OAEd8O,EAAI,GAAGE,aAGJ,IAAVlP,GAAe/C,EAAOyJ,gBAA6B,IAAXxG,GAAgBjD,EAAOkJ,eAKnEnG,EAAQA,EAAQmP,SAASH,EAAIlW,IAAI,iBAAmB,EAAG,IAAMqW,SAASH,EAAIlW,IAAI,kBAAoB,EAAG,IACrGoH,EAASA,EAASiP,SAASH,EAAIlW,IAAI,gBAAkB,EAAG,IAAMqW,SAASH,EAAIlW,IAAI,mBAAqB,EAAG,IACnGsW,OAAOC,MAAMrP,KAAQA,EAAQ,GAC7BoP,OAAOC,MAAMnP,KAASA,EAAS,GACnCld,OAAOP,OAAOwa,EAAQ,CACpB+C,MAAAA,EACAE,OAAAA,EACAoP,KAAMrS,EAAOyJ,eAAiB1G,EAAQE,MDnBxC8J,wBETA,MAAM/M,EAAS5S,KAEf,SAASklB,EAAkBC,GACzB,OAAIvS,EAAOyJ,eACF8I,EAIF,CACLxP,MAAS,SACTyP,aAAc,cACdC,iBAAkB,eAClBC,cAAe,aACfC,eAAgB,gBAChBC,eAAgB,cAChBC,gBAAiB,iBACjBC,YAAe,gBACfP,GAGJ,SAASQ,EAA0B3pB,EAAM4pB,GACvC,OAAOjY,WAAW3R,EAAKqM,iBAAiB6c,EAAkBU,KAAW,GAGvE,MAAMzS,EAASP,EAAOO,QAChB0J,WACJA,EACAoI,KAAMY,EACNrK,aAAcC,EAAGqK,SACjBA,GACElT,EACEmT,EAAYnT,EAAOoT,SAAW7S,EAAO6S,QAAQhO,QAC7CiO,EAAuBF,EAAYnT,EAAOoT,QAAQhG,OAAOplB,OAASgY,EAAOoN,OAAOplB,OAChFolB,EAASnD,EAAW7W,SAAS,IAAI4M,EAAOO,OAAOoQ,YAC/C2C,EAAeH,EAAYnT,EAAOoT,QAAQhG,OAAOplB,OAASolB,EAAOplB,OACvE,IAAI8kB,EAAW,GACf,MAAMzB,EAAa,GACbS,EAAkB,GACxB,IAAIyH,EAAehT,EAAOqP,mBAEE,mBAAjB2D,IACTA,EAAehT,EAAOqP,mBAAmBxgB,KAAK4Q,IAGhD,IAAIwT,EAAcjT,EAAOsP,kBAEE,mBAAhB2D,IACTA,EAAcjT,EAAOsP,kBAAkBzgB,KAAK4Q,IAG9C,MAAMyT,EAAyBzT,EAAO8M,SAAS9kB,OACzC0rB,EAA2B1T,EAAOqL,WAAWrjB,OACnD,IAAIynB,EAAelP,EAAOkP,aACtBkE,GAAiBJ,EACjBK,EAAgB,EAChBngB,EAAQ,EAEZ,QAA0B,IAAfwf,EACT,OAG0B,iBAAjBxD,GAA6BA,EAAa9iB,QAAQ,MAAQ,IACnE8iB,EAAe1U,WAAW0U,EAAajR,QAAQ,IAAK,KAAO,IAAMyU,GAGnEjT,EAAO6T,aAAepE,EAElB5G,EAAKuE,EAAOvR,IAAI,CAClBiY,WAAY,GACZC,aAAc,GACdC,UAAW,KACL5G,EAAOvR,IAAI,CACjBiX,YAAa,GACbiB,aAAc,GACdC,UAAW,KAGTzT,EAAO4M,gBAAkB5M,EAAOgF,UAClC3F,GAAeI,EAAOS,UAAW,kCAAmC,IACpEb,GAAeI,EAAOS,UAAW,iCAAkC,KAGrE,MAAMwT,EAAc1T,EAAOwO,MAAQxO,EAAOwO,KAAKC,KAAO,GAAKhP,EAAO+O,KAOlE,IAAImF,EALAD,GACFjU,EAAO+O,KAAKoF,WAAWb,GAKzB,MAAMc,EAAgD,SAAzB7T,EAAOyM,eAA4BzM,EAAOqM,aAAe7mB,OAAO+C,KAAKyX,EAAOqM,aAAa5a,OAAOxG,QACnE,IAA1C+U,EAAOqM,YAAYphB,GAAKwhB,eACrChlB,OAAS,EAEZ,IAAK,IAAIC,EAAI,EAAGA,EAAIqrB,EAAcrrB,GAAK,EAAG,CACxCisB,EAAY,EACZ,MAAMG,EAAQjH,EAAO7Q,GAAGtU,GAMxB,GAJIgsB,GACFjU,EAAO+O,KAAKuF,YAAYrsB,EAAGosB,EAAOf,EAAchB,GAGrB,SAAzB+B,EAAMxY,IAAI,WAAd,CAEA,GAA6B,SAAzB0E,EAAOyM,cAA0B,CAC/BoH,IACFhH,EAAOnlB,GAAGwD,MAAM6mB,EAAkB,UAAY,IAGhD,MAAMiC,EAAc/e,iBAAiB6e,EAAM,IACrCG,EAAmBH,EAAM,GAAG5oB,MAAMgN,UAClCgc,EAAyBJ,EAAM,GAAG5oB,MAAM8S,gBAU9C,GARIiW,IACFH,EAAM,GAAG5oB,MAAMgN,UAAY,QAGzBgc,IACFJ,EAAM,GAAG5oB,MAAM8S,gBAAkB,QAG/BgC,EAAOyP,aACTkE,EAAYlU,EAAOyJ,eAAiB4K,EAAM1Z,YAAW,GAAQ0Z,EAAMrZ,aAAY,OAC1E,CAEL,MAAM+H,EAAQgQ,EAA0BwB,EAAa,SAC/CG,EAAc3B,EAA0BwB,EAAa,gBACrDI,EAAe5B,EAA0BwB,EAAa,iBACtDT,EAAaf,EAA0BwB,EAAa,eACpDzB,EAAcC,EAA0BwB,EAAa,gBACrDK,EAAYL,EAAY9e,iBAAiB,cAE/C,GAAImf,GAA2B,eAAdA,EACfV,EAAYnR,EAAQ+Q,EAAahB,MAC5B,CACL,MAAMd,YACJA,EAAWlX,YACXA,GACEuZ,EAAM,GACVH,EAAYnR,EAAQ2R,EAAcC,EAAeb,EAAahB,GAAehY,EAAckX,IAI3FwC,IACFH,EAAM,GAAG5oB,MAAMgN,UAAY+b,GAGzBC,IACFJ,EAAM,GAAG5oB,MAAM8S,gBAAkBkW,GAG/BlU,EAAOyP,eAAckE,EAAYpsB,KAAK+sB,MAAMX,SAEhDA,GAAajB,GAAc1S,EAAOyM,cAAgB,GAAKyC,GAAgBlP,EAAOyM,cAC1EzM,EAAOyP,eAAckE,EAAYpsB,KAAK+sB,MAAMX,IAE5C9G,EAAOnlB,KACTmlB,EAAOnlB,GAAGwD,MAAM6mB,EAAkB,UAAe4B,EAAH,MAI9C9G,EAAOnlB,KACTmlB,EAAOnlB,GAAG6sB,gBAAkBZ,GAG9BpI,EAAgBvd,KAAK2lB,GAEjB3T,EAAO4M,gBACTwG,EAAgBA,EAAgBO,EAAY,EAAIN,EAAgB,EAAInE,EAC9C,IAAlBmE,GAA6B,IAAN3rB,IAAS0rB,EAAgBA,EAAgBV,EAAa,EAAIxD,GAC3E,IAANxnB,IAAS0rB,EAAgBA,EAAgBV,EAAa,EAAIxD,GAC1D3nB,KAAK6hB,IAAIgK,GAAiB,OAAUA,EAAgB,GACpDpT,EAAOyP,eAAc2D,EAAgB7rB,KAAK+sB,MAAMlB,IAChDlgB,EAAQ8M,EAAOyL,gBAAmB,GAAGc,EAASve,KAAKolB,GACvDtI,EAAW9c,KAAKolB,KAEZpT,EAAOyP,eAAc2D,EAAgB7rB,KAAK+sB,MAAMlB,KAC/ClgB,EAAQ3L,KAAKqZ,IAAInB,EAAOO,OAAOwL,mBAAoBtY,IAAUuM,EAAOO,OAAOyL,gBAAmB,GAAGc,EAASve,KAAKolB,GACpHtI,EAAW9c,KAAKolB,GAChBA,EAAgBA,EAAgBO,EAAYzE,GAG9CzP,EAAO6T,aAAeK,EAAYzE,EAClCmE,EAAgBM,EAChBzgB,GAAS,GAsBX,GAnBAuM,EAAO6T,YAAc/rB,KAAKC,IAAIiY,EAAO6T,YAAaZ,GAAcO,EAE5D3K,GAAOqK,IAA+B,UAAlB3S,EAAOgP,QAAwC,cAAlBhP,EAAOgP,SAC1DtF,EAAWpO,IAAI,CACbkH,MAAU/C,EAAO6T,YAActT,EAAOkP,aAA/B,OAIPlP,EAAO8O,gBACTpF,EAAWpO,IAAI,CACb1O,CAACmlB,EAAkB,UAActS,EAAO6T,YAActT,EAAOkP,aAA/B,OAI9BwE,GACFjU,EAAO+O,KAAKgG,kBAAkBb,EAAWpH,EAAUwF,IAIhD/R,EAAO4M,eAAgB,CAC1B,MAAM6H,EAAgB,GAEtB,IAAK,IAAI/sB,EAAI,EAAGA,EAAI6kB,EAAS9kB,OAAQC,GAAK,EAAG,CAC3C,IAAIgtB,EAAiBnI,EAAS7kB,GAC1BsY,EAAOyP,eAAciF,EAAiBntB,KAAK+sB,MAAMI,IAEjDnI,EAAS7kB,IAAM+X,EAAO6T,YAAcZ,GACtC+B,EAAczmB,KAAK0mB,GAIvBnI,EAAWkI,EAEPltB,KAAK+sB,MAAM7U,EAAO6T,YAAcZ,GAAcnrB,KAAK+sB,MAAM/H,EAASA,EAAS9kB,OAAS,IAAM,GAC5F8kB,EAASve,KAAKyR,EAAO6T,YAAcZ,GAMvC,GAFwB,IAApBnG,EAAS9kB,SAAc8kB,EAAW,CAAC,IAEX,IAAxBvM,EAAOkP,aAAoB,CAC7B,MAAMjkB,EAAMwU,EAAOyJ,gBAAkBZ,EAAM,aAAeyJ,EAAkB,eAC5ElF,EAAOpb,OAAO,CAACkjB,EAAGC,KACX5U,EAAOgF,SAER4P,IAAe/H,EAAOplB,OAAS,GAKlC6T,IAAI,CACL1O,CAAC3B,GAASikB,EAAH,OAIX,GAAIlP,EAAO4M,gBAAkB5M,EAAOoP,qBAAsB,CACxD,IAAIyF,EAAgB,EACpBtJ,EAAgB3lB,QAAQkvB,IACtBD,GAAiBC,GAAkB9U,EAAOkP,aAAelP,EAAOkP,aAAe,KAEjF2F,GAAiB7U,EAAOkP,aACxB,MAAM6F,EAAUF,EAAgBnC,EAChCnG,EAAWA,EAAS/a,IAAIwjB,GAClBA,EAAO,GAAWhC,EAClBgC,EAAOD,EAAgBA,EAAU9B,EAC9B+B,GAIX,GAAIhV,EAAOwP,yBAA0B,CACnC,IAAIqF,EAAgB,EAMpB,GALAtJ,EAAgB3lB,QAAQkvB,IACtBD,GAAiBC,GAAkB9U,EAAOkP,aAAelP,EAAOkP,aAAe,KAEjF2F,GAAiB7U,EAAOkP,aAEpB2F,EAAgBnC,EAAY,CAC9B,MAAMuC,GAAmBvC,EAAamC,GAAiB,EACvDtI,EAAS3mB,QAAQ,CAACovB,EAAME,KACtB3I,EAAS2I,GAAaF,EAAOC,IAE/BnK,EAAWllB,QAAQ,CAACovB,EAAME,KACxBpK,EAAWoK,GAAaF,EAAOC,KAYrC,GAPAzvB,OAAOP,OAAOwa,EAAQ,CACpBoN,OAAAA,EACAN,SAAAA,EACAzB,WAAAA,EACAS,gBAAAA,IAGEvL,EAAO4M,gBAAkB5M,EAAOgF,UAAYhF,EAAOoP,qBAAsB,CAC3E/P,GAAeI,EAAOS,UAAW,mCAAuCqM,EAAS,GAAb,MACpElN,GAAeI,EAAOS,UAAW,iCAAqCT,EAAOqS,KAAO,EAAIvG,EAAgBA,EAAgB9jB,OAAS,GAAK,EAAnE,MACnE,MAAM0tB,GAAiB1V,EAAO8M,SAAS,GACjC6I,GAAmB3V,EAAOqL,WAAW,GAC3CrL,EAAO8M,SAAW9M,EAAO8M,SAAS/a,IAAI6jB,GAAKA,EAAIF,GAC/C1V,EAAOqL,WAAarL,EAAOqL,WAAWtZ,IAAI6jB,GAAKA,EAAID,GAGjDrC,IAAiBD,GACnBrT,EAAOgF,KAAK,sBAGV8H,EAAS9kB,SAAWyrB,IAClBzT,EAAOO,OAAOiN,eAAexN,EAAOyN,gBACxCzN,EAAOgF,KAAK,yBAGVqG,EAAWrjB,SAAW0rB,GACxB1T,EAAOgF,KAAK,0BAGVzE,EAAOwK,qBACT/K,EAAO6V,sBFtSTC,iBGZa,SAA0BtV,GACvC,MAAMR,EAAS5S,KACT2oB,EAAe,GACf5C,EAAYnT,EAAOoT,SAAWpT,EAAOO,OAAO6S,QAAQhO,QAC1D,IACInd,EADA+tB,EAAY,EAGK,iBAAVxV,EACTR,EAAOgK,cAAcxJ,IACF,IAAVA,GACTR,EAAOgK,cAAchK,EAAOO,OAAOC,OAGrC,MAAMyV,EAAkBxiB,GAClB0f,EACKnT,EAAOoN,OAAOpb,OAAO6E,GAAMqb,SAASrb,EAAG5L,aAAa,2BAA4B,MAAQwI,GAAO,GAGjGuM,EAAOoN,OAAO7Q,GAAG9I,GAAO,GAIjC,GAAoC,SAAhCuM,EAAOO,OAAOyM,eAA4BhN,EAAOO,OAAOyM,cAAgB,EAC1E,GAAIhN,EAAOO,OAAO4M,eAChBnN,EAAOkW,cAAcna,KAAKsY,IACxB0B,EAAaxnB,KAAK8lB,UAGpB,IAAKpsB,EAAI,EAAGA,EAAIH,KAAKquB,KAAKnW,EAAOO,OAAOyM,eAAgB/kB,GAAK,EAAG,CAC9D,MAAMwL,EAAQuM,EAAO8E,YAAc7c,EACnC,GAAIwL,EAAQuM,EAAOoN,OAAOplB,SAAWmrB,EAAW,MAChD4C,EAAaxnB,KAAK0nB,EAAgBxiB,SAItCsiB,EAAaxnB,KAAK0nB,EAAgBjW,EAAO8E,cAI3C,IAAK7c,EAAI,EAAGA,EAAI8tB,EAAa/tB,OAAQC,GAAK,EACxC,QAA+B,IAApB8tB,EAAa9tB,GAAoB,CAC1C,MAAMgb,EAAS8S,EAAa9tB,GAAGgT,aAC/B+a,EAAY/S,EAAS+S,EAAY/S,EAAS+S,EAK1CA,GAAWhW,EAAOiK,WAAWpO,IAAI,SAAama,EAAH,OHlC/CH,8BIZA,MAAM7V,EAAS5S,KACTggB,EAASpN,EAAOoN,OAEtB,IAAK,IAAInlB,EAAI,EAAGA,EAAImlB,EAAOplB,OAAQC,GAAK,EACtCmlB,EAAOnlB,GAAGmuB,kBAAoBpW,EAAOyJ,eAAiB2D,EAAOnlB,GAAGouB,WAAajJ,EAAOnlB,GAAGquB,WJSzFC,qBKba,SAA8BnW,EAAYhT,MAAQA,KAAKgT,WAAa,GACjF,MAAMJ,EAAS5S,KACTmT,EAASP,EAAOO,QAChB6M,OACJA,EACAxE,aAAcC,EAAGiE,SACjBA,GACE9M,EACJ,GAAsB,IAAlBoN,EAAOplB,OAAc,YACkB,IAAhColB,EAAO,GAAGgJ,mBAAmCpW,EAAO6V,qBAC/D,IAAIW,GAAgBpW,EAChByI,IAAK2N,EAAepW,GAExBgN,EAAOrV,YAAYwI,EAAOwQ,mBAC1B/Q,EAAOyW,qBAAuB,GAC9BzW,EAAOkW,cAAgB,GAEvB,IAAK,IAAIjuB,EAAI,EAAGA,EAAImlB,EAAOplB,OAAQC,GAAK,EAAG,CACzC,MAAMosB,EAAQjH,EAAOnlB,GACrB,IAAIyuB,EAAcrC,EAAM+B,kBAEpB7V,EAAOgF,SAAWhF,EAAO4M,iBAC3BuJ,GAAetJ,EAAO,GAAGgJ,mBAG3B,MAAMO,GAAiBH,GAAgBjW,EAAO4M,eAAiBnN,EAAOoJ,eAAiB,GAAKsN,IAAgBrC,EAAMS,gBAAkBvU,EAAOkP,cACrImH,GAAyBJ,EAAe1J,EAAS,IAAMvM,EAAO4M,eAAiBnN,EAAOoJ,eAAiB,GAAKsN,IAAgBrC,EAAMS,gBAAkBvU,EAAOkP,cAC3JoH,IAAgBL,EAAeE,GAC/BI,EAAaD,EAAc7W,EAAO8L,gBAAgB7jB,IACtC4uB,GAAe,GAAKA,EAAc7W,EAAOqS,KAAO,GAAKyE,EAAa,GAAKA,GAAc9W,EAAOqS,MAAQwE,GAAe,GAAKC,GAAc9W,EAAOqS,QAG7JrS,EAAOkW,cAAc3nB,KAAK8lB,GAC1BrU,EAAOyW,qBAAqBloB,KAAKtG,GACjCmlB,EAAO7Q,GAAGtU,GAAG0P,SAAS4I,EAAOwQ,oBAG/BsD,EAAMnT,SAAW2H,GAAO8N,EAAgBA,EACxCtC,EAAM0C,iBAAmBlO,GAAO+N,EAAwBA,EAG1D5W,EAAOkW,cAAgBjf,GAAE+I,EAAOkW,gBL3BhChL,eMfa,SAAwB9K,GACrC,MAAMJ,EAAS5S,KAEf,QAAyB,IAAdgT,EAA2B,CACpC,MAAM4W,EAAahX,EAAO4I,cAAgB,EAAI,EAE9CxI,EAAYJ,GAAUA,EAAOI,WAAaJ,EAAOI,UAAY4W,GAAc,EAG7E,MAAMzW,EAASP,EAAOO,OAChB0N,EAAiBjO,EAAOmJ,eAAiBnJ,EAAOoJ,eACtD,IAAIlI,SACFA,EAAQgM,YACRA,EAAWD,MACXA,GACEjN,EACJ,MAAMiX,EAAe/J,EACfgK,EAASjK,EAEQ,IAAnBgB,GACF/M,EAAW,EACXgM,GAAc,EACdD,GAAQ,IAER/L,GAAYd,EAAYJ,EAAOoJ,gBAAkB6E,EACjDf,EAAchM,GAAY,EAC1B+L,EAAQ/L,GAAY,GAGtBnb,OAAOP,OAAOwa,EAAQ,CACpBkB,SAAAA,EACAgM,YAAAA,EACAD,MAAAA,KAEE1M,EAAOwK,qBAAuBxK,EAAO4M,gBAAkB5M,EAAO6O,aAAYpP,EAAOuW,qBAAqBnW,GAEtG8M,IAAgB+J,GAClBjX,EAAOgF,KAAK,yBAGViI,IAAUiK,GACZlX,EAAOgF,KAAK,oBAGViS,IAAiB/J,GAAegK,IAAWjK,IAC7CjN,EAAOgF,KAAK,YAGdhF,EAAOgF,KAAK,WAAY9D,INhCxB+J,+BOfA,MAAMjL,EAAS5S,MACTggB,OACJA,EAAM7M,OACNA,EAAM0J,WACNA,EAAUnF,YACVA,EAAWqS,UACXA,GACEnX,EACEmT,EAAYnT,EAAOoT,SAAW7S,EAAO6S,QAAQhO,QAEnD,IAAIgS,EADJhK,EAAOrV,YAAY,GAAGwI,EAAOsQ,oBAAoBtQ,EAAO0Q,kBAAkB1Q,EAAO4Q,kBAAkB5Q,EAAOuQ,6BAA6BvQ,EAAO2Q,2BAA2B3Q,EAAO6Q,2BAI9KgG,EADEjE,EACYnT,EAAOiK,WAAWzM,KAAK,IAAI+C,EAAOoQ,uCAAuC7L,OAEzEsI,EAAO7Q,GAAGuI,GAI1BsS,EAAYzf,SAAS4I,EAAOsQ,kBAExBtQ,EAAOiF,OAEL4R,EAAYnf,SAASsI,EAAOyQ,qBAC9B/G,EAAW7W,SAAS,IAAImN,EAAOoQ,mBAAmBpQ,EAAOyQ,iDAAiDmG,OAAexf,SAAS4I,EAAOuQ,2BAEzI7G,EAAW7W,SAAS,IAAImN,EAAOoQ,cAAcpQ,EAAOyQ,gDAAgDmG,OAAexf,SAAS4I,EAAOuQ,4BAKvI,IAAIuG,EAAYD,EAAYpa,QAAQ,IAAIuD,EAAOoQ,YAAcpU,GAAG,GAAG5E,SAAS4I,EAAO0Q,gBAE/E1Q,EAAOiF,MAA6B,IAArB6R,EAAUrvB,SAC3BqvB,EAAYjK,EAAO7Q,GAAG,GACtB8a,EAAU1f,SAAS4I,EAAO0Q,iBAI5B,IAAIqG,EAAYF,EAAYha,QAAQ,IAAImD,EAAOoQ,YAAcpU,GAAG,GAAG5E,SAAS4I,EAAO4Q,gBAE/E5Q,EAAOiF,MAA6B,IAArB8R,EAAUtvB,SAC3BsvB,EAAYlK,EAAO7Q,IAAI,GACvB+a,EAAU3f,SAAS4I,EAAO4Q,iBAGxB5Q,EAAOiF,OAEL6R,EAAUpf,SAASsI,EAAOyQ,qBAC5B/G,EAAW7W,SAAS,IAAImN,EAAOoQ,mBAAmBpQ,EAAOyQ,iDAAiDqG,EAAUxsB,KAAK,gCAAgC8M,SAAS4I,EAAO2Q,yBAEzKjH,EAAW7W,SAAS,IAAImN,EAAOoQ,cAAcpQ,EAAOyQ,gDAAgDqG,EAAUxsB,KAAK,gCAAgC8M,SAAS4I,EAAO2Q,yBAGjKoG,EAAUrf,SAASsI,EAAOyQ,qBAC5B/G,EAAW7W,SAAS,IAAImN,EAAOoQ,mBAAmBpQ,EAAOyQ,iDAAiDsG,EAAUzsB,KAAK,gCAAgC8M,SAAS4I,EAAO6Q,yBAEzKnH,EAAW7W,SAAS,IAAImN,EAAOoQ,cAAcpQ,EAAOyQ,gDAAgDsG,EAAUzsB,KAAK,gCAAgC8M,SAAS4I,EAAO6Q,0BAIvKpR,EAAOuX,qBP7CPvM,kBQjBa,SAA2BwM,GACxC,MAAMxX,EAAS5S,KACTgT,EAAYJ,EAAO4I,aAAe5I,EAAOI,WAAaJ,EAAOI,WAC7DiL,WACJA,EAAUyB,SACVA,EAAQvM,OACRA,EACAuE,YAAaC,EACboS,UAAWM,EACXhC,UAAWiC,GACT1X,EACJ,IACIyV,EADA3Q,EAAc0S,EAGlB,QAA2B,IAAhB1S,EAA6B,CACtC,IAAK,IAAI7c,EAAI,EAAGA,EAAIojB,EAAWrjB,OAAQC,GAAK,OACT,IAAtBojB,EAAWpjB,EAAI,GACpBmY,GAAaiL,EAAWpjB,IAAMmY,EAAYiL,EAAWpjB,EAAI,IAAMojB,EAAWpjB,EAAI,GAAKojB,EAAWpjB,IAAM,EACtG6c,EAAc7c,EACLmY,GAAaiL,EAAWpjB,IAAMmY,EAAYiL,EAAWpjB,EAAI,KAClE6c,EAAc7c,EAAI,GAEXmY,GAAaiL,EAAWpjB,KACjC6c,EAAc7c,GAKdsY,EAAOuP,sBACLhL,EAAc,QAA4B,IAAhBA,KAA6BA,EAAc,GAI7E,GAAIgI,EAASngB,QAAQyT,IAAc,EACjCqV,EAAY3I,EAASngB,QAAQyT,OACxB,CACL,MAAMuX,EAAO7vB,KAAKqZ,IAAIZ,EAAOwL,mBAAoBjH,GACjD2Q,EAAYkC,EAAO7vB,KAAK+sB,OAAO/P,EAAc6S,GAAQpX,EAAOyL,gBAK9D,GAFIyJ,GAAa3I,EAAS9kB,SAAQytB,EAAY3I,EAAS9kB,OAAS,GAE5D8c,IAAgBC,EAMlB,YALI0Q,IAAciC,IAChB1X,EAAOyV,UAAYA,EACnBzV,EAAOgF,KAAK,qBAOhB,MAAMmS,EAAYjF,SAASlS,EAAOoN,OAAO7Q,GAAGuI,GAAaja,KAAK,4BAA8Bia,EAAa,IACzG/e,OAAOP,OAAOwa,EAAQ,CACpByV,UAAAA,EACA0B,UAAAA,EACApS,cAAAA,EACAD,YAAAA,IAEF9E,EAAOgF,KAAK,qBACZhF,EAAOgF,KAAK,mBAERyS,IAAsBN,GACxBnX,EAAOgF,KAAK,oBAGVhF,EAAO4X,aAAe5X,EAAOO,OAAO+Q,qBACtCtR,EAAOgF,KAAK,gBRjDdwG,mBSjBa,SAA4Bne,GACzC,MAAM2S,EAAS5S,KACTmT,EAASP,EAAOO,OAChB8T,EAAQpd,GAAE5J,EAAElE,QAAQoU,QAAQ,IAAIgD,EAAOoQ,YAAc,GAC3D,IACIwE,EADA0C,GAAa,EAGjB,GAAIxD,EACF,IAAK,IAAIpsB,EAAI,EAAGA,EAAI+X,EAAOoN,OAAOplB,OAAQC,GAAK,EAC7C,GAAI+X,EAAOoN,OAAOnlB,KAAOosB,EAAO,CAC9BwD,GAAa,EACb1C,EAAaltB,EACb,MAKN,IAAIosB,IAASwD,EAWX,OAFA7X,EAAO8X,kBAAenwB,OACtBqY,EAAO+X,kBAAepwB,GATtBqY,EAAO8X,aAAezD,EAElBrU,EAAOoT,SAAWpT,EAAOO,OAAO6S,QAAQhO,QAC1CpF,EAAO+X,aAAe7F,SAASjb,GAAEod,GAAOxpB,KAAK,2BAA4B,IAEzEmV,EAAO+X,aAAe5C,EAQtB5U,EAAO4P,0BAA+CxoB,IAAxBqY,EAAO+X,cAA8B/X,EAAO+X,eAAiB/X,EAAO8E,aACpG9E,EAAOmQ,wBVPT/P,UWrBa,cCJA,SAA4BpC,GAAO5Q,KAAKqc,eAAiB,IAAM,MAC5E,MACMlJ,OACJA,EACAqI,aAAcC,EAAGzI,UACjBA,EAAS6J,WACTA,GALa7c,KAQf,GAAImT,EAAO+O,iBACT,OAAOzG,GAAOzI,EAAYA,EAG5B,GAAIG,EAAOgF,QACT,OAAOnF,EAGT,IAAIqK,EAAmB1M,GAAakM,EAAW,GAAIjM,GAEnD,OADI6K,IAAK4B,GAAoBA,GACtBA,GAAoB,GDb3BU,aEPa,SAAsB/K,EAAW4X,GAC9C,MAAMhY,EAAS5S,MAEbwb,aAAcC,EAAGtI,OACjBA,EAAM0J,WACNA,EAAUxJ,UACVA,EAASS,SACTA,GACElB,EACJ,IAwBI+N,EAxBAkK,EAAI,EACJC,EAAI,EAGJlY,EAAOyJ,eACTwO,EAAIpP,GAAOzI,EAAYA,EAEvB8X,EAAI9X,EAGFG,EAAOyP,eACTiI,EAAInwB,KAAK+sB,MAAMoD,GACfC,EAAIpwB,KAAK+sB,MAAMqD,IAGb3X,EAAOgF,QACT9E,EAAUT,EAAOyJ,eAAiB,aAAe,aAAezJ,EAAOyJ,gBAAkBwO,GAAKC,EACpF3X,EAAO+O,kBACjBrF,EAAWxR,UAAU,eAAewf,QAAQC,aAG9ClY,EAAOgO,kBAAoBhO,EAAOI,UAClCJ,EAAOI,UAAYJ,EAAOyJ,eAAiBwO,EAAIC,EAG/C,MAAMjK,EAAiBjO,EAAOmJ,eAAiBnJ,EAAOoJ,eAGpD2E,EADqB,IAAnBE,EACY,GAEC7N,EAAYJ,EAAOoJ,gBAAkB6E,EAGlDF,IAAgB7M,GAClBlB,EAAOkL,eAAe9K,GAGxBJ,EAAOgF,KAAK,eAAgBhF,EAAOI,UAAW4X,IFtC9C5O,wBGPA,OAAQhc,KAAK0f,SAAS,IHQtB3D,wBIRA,OAAQ/b,KAAK0f,SAAS1f,KAAK0f,SAAS9kB,OAAS,IJS7CmwB,qBKTkC/X,EAAY,EAAGI,EAAQpT,KAAKmT,OAAOC,MAAOmE,GAAe,EAAMyT,GAAkB,EAAMC,GACzH,MAAMrY,EAAS5S,MACTmT,OACJA,EAAME,UACNA,GACET,EAEJ,GAAIA,EAAOqF,WAAa9E,EAAO+E,+BAC7B,OAAO,EAGT,MAAM8D,EAAepJ,EAAOoJ,eACtBD,EAAenJ,EAAOmJ,eAC5B,IAAImP,EAKJ,GAJiDA,EAA7CF,GAAmBhY,EAAYgJ,EAA6BA,EAAsBgP,GAAmBhY,EAAY+I,EAA6BA,EAAiC/I,EAEnLJ,EAAOkL,eAAeoN,GAElB/X,EAAOgF,QAAS,CAClB,MAAMgT,EAAMvY,EAAOyJ,eAEnB,GAAc,IAAVjJ,EACFC,EAAU8X,EAAM,aAAe,cAAgBD,MAC1C,CACL,IAAKtY,EAAO0B,QAAQI,aAMlB,OALA/B,GAAqB,CACnBC,OAAAA,EACAC,gBAAiBqY,EACjBpY,KAAMqY,EAAM,OAAS,SAEhB,EAGT9X,EAAUe,SAAS,CACjBrU,CAACorB,EAAM,OAAS,QAASD,EACzBE,SAAU,WAId,OAAO,EA2CT,OAxCc,IAAVhY,GACFR,EAAOgK,cAAc,GACrBhK,EAAOmL,aAAamN,GAEhB3T,IACF3E,EAAOgF,KAAK,wBAAyBxE,EAAO6X,GAC5CrY,EAAOgF,KAAK,oBAGdhF,EAAOgK,cAAcxJ,GACrBR,EAAOmL,aAAamN,GAEhB3T,IACF3E,EAAOgF,KAAK,wBAAyBxE,EAAO6X,GAC5CrY,EAAOgF,KAAK,oBAGThF,EAAOqF,YACVrF,EAAOqF,WAAY,EAEdrF,EAAOyY,oCACVzY,EAAOyY,kCAAoC,SAAuBprB,GAC3D2S,IAAUA,EAAO0L,WAClBre,EAAElE,SAAWiE,OACjB4S,EAAOiK,WAAW,GAAGrf,oBAAoB,gBAAiBoV,EAAOyY,mCACjEzY,EAAOiK,WAAW,GAAGrf,oBAAoB,sBAAuBoV,EAAOyY,mCACvEzY,EAAOyY,kCAAoC,YACpCzY,EAAOyY,kCAEV9T,GACF3E,EAAOgF,KAAK,oBAKlBhF,EAAOiK,WAAW,GAAGtf,iBAAiB,gBAAiBqV,EAAOyY,mCAC9DzY,EAAOiK,WAAW,GAAGtf,iBAAiB,sBAAuBqV,EAAOyY,sCAIjE,eChFM,CACbzO,cCJa,SAAuBrR,EAAUqf,GAC9C,MAAMhY,EAAS5S,KAEV4S,EAAOO,OAAOgF,SACjBvF,EAAOiK,WAAWvR,WAAWC,GAG/BqH,EAAOgF,KAAK,gBAAiBrM,EAAUqf,IDFvCU,yBEJsC/T,GAAe,EAAMC,GAC3D,MAAM5E,EAAS5S,MACTmT,OACJA,GACEP,EACAO,EAAOgF,UAEPhF,EAAO6O,YACTpP,EAAO8V,mBAGTpR,GAAe,CACb1E,OAAAA,EACA2E,aAAAA,EACAC,UAAAA,EACAC,KAAM,mCCf4BF,GAAe,EAAMC,GACzD,MACMrE,OACJA,GAFanT,KAAAA,KAIRiY,WAAY,EACf9E,EAAOgF,UALInY,KAMR4c,cAAc,GACrBtF,GAAe,CACb1E,OARa5S,KASbuX,aAAAA,EACAC,UAAAA,EACAC,KAAM,WpBeRwP,MqBrBa,CACbhI,iBCP8B5Y,EAAQ,EAAG+M,EAAQpT,KAAKmT,OAAOC,MAAOmE,GAAe,EAAM0T,EAAUM,GACnG,GAAqB,iBAAVllB,GAAuC,iBAAVA,EACtC,MAAM,IAAItF,MAAM,kFAAkFsF,aAGpG,GAAqB,iBAAVA,EAAoB,CAK7B,MAAMmlB,EAAgB1G,SAASze,EAAO,IAStC,IAFsBolB,SAASD,GAG7B,MAAM,IAAIzqB,MAAM,sEAAsEsF,aAKxFA,EAAQmlB,EAGV,MAAM5Y,EAAS5S,KACf,IAAI+nB,EAAa1hB,EACb0hB,EAAa,IAAGA,EAAa,GACjC,MAAM5U,OACJA,EAAMuM,SACNA,EAAQzB,WACRA,EAAUtG,cACVA,EAAaD,YACbA,EACA8D,aAAcC,EAAGpI,UACjBA,EAAS2E,QACTA,GACEpF,EAEJ,GAAIA,EAAOqF,WAAa9E,EAAO+E,iCAAmCF,IAAYiT,IAAaM,EACzF,OAAO,EAGT,MAAMhB,EAAO7vB,KAAKqZ,IAAInB,EAAOO,OAAOwL,mBAAoBoJ,GACxD,IAAIM,EAAYkC,EAAO7vB,KAAK+sB,OAAOM,EAAawC,GAAQ3X,EAAOO,OAAOyL,gBAClEyJ,GAAa3I,EAAS9kB,SAAQytB,EAAY3I,EAAS9kB,OAAS,IAE3D8c,GAAevE,EAAO0O,cAAgB,MAAQlK,GAAiB,IAAMJ,GACxE3E,EAAOgF,KAAK,0BAGd,MAAM5E,GAAa0M,EAAS2I,GAI5B,GAFAzV,EAAOkL,eAAe9K,GAElBG,EAAOuP,oBACT,IAAK,IAAI7nB,EAAI,EAAGA,EAAIojB,EAAWrjB,OAAQC,GAAK,EAAG,CAC7C,MAAM6wB,GAAuBhxB,KAAK+sB,MAAkB,IAAZzU,GAClC2Y,EAAiBjxB,KAAK+sB,MAAsB,IAAhBxJ,EAAWpjB,IACvC+wB,EAAqBlxB,KAAK+sB,MAA0B,IAApBxJ,EAAWpjB,EAAI,SAEpB,IAAtBojB,EAAWpjB,EAAI,GACpB6wB,GAAuBC,GAAkBD,EAAsBE,GAAsBA,EAAqBD,GAAkB,EAC9H5D,EAAaltB,EACJ6wB,GAAuBC,GAAkBD,EAAsBE,IACxE7D,EAAaltB,EAAI,GAEV6wB,GAAuBC,IAChC5D,EAAaltB,GAMnB,GAAI+X,EAAO4X,aAAezC,IAAerQ,EAAa,CACpD,IAAK9E,EAAOoK,gBAAkBhK,EAAYJ,EAAOI,WAAaA,EAAYJ,EAAOoJ,eAC/E,OAAO,EAGT,IAAKpJ,EAAOqK,gBAAkBjK,EAAYJ,EAAOI,WAAaA,EAAYJ,EAAOmJ,iBAC1ErE,GAAe,KAAOqQ,EAAY,OAAO,EAIlD,IAAIvQ,EAGJ,GAF8BA,EAA1BuQ,EAAarQ,EAAyB,OAAgBqQ,EAAarQ,EAAyB,OAAwB,QAEpH+D,IAAQzI,IAAcJ,EAAOI,YAAcyI,GAAOzI,IAAcJ,EAAOI,UAkBzE,OAjBAJ,EAAOgL,kBAAkBmK,GAErB5U,EAAO6O,YACTpP,EAAO8V,mBAGT9V,EAAOiL,sBAEe,UAAlB1K,EAAOgP,QACTvP,EAAOmL,aAAa/K,GAGJ,UAAdwE,IACF5E,EAAO0Y,gBAAgB/T,EAAcC,GACrC5E,EAAOxF,cAAcmK,EAAcC,KAG9B,EAGT,GAAIrE,EAAOgF,QAAS,CAClB,MAAMgT,EAAMvY,EAAOyJ,eACb/b,EAAImb,EAAMzI,GAAaA,EAE7B,GAAc,IAAVI,EAAa,CACf,MAAM2S,EAAYnT,EAAOoT,SAAWpT,EAAOO,OAAO6S,QAAQhO,QAEtD+N,IACFnT,EAAOS,UAAUhV,MAAMiV,eAAiB,OACxCV,EAAOiZ,mBAAoB,GAG7BxY,EAAU8X,EAAM,aAAe,aAAe7qB,EAE1CylB,GACFvd,sBAAsB,KACpBoK,EAAOS,UAAUhV,MAAMiV,eAAiB,GACxCV,EAAOkZ,yBAA0B,QAGhC,CACL,IAAKlZ,EAAO0B,QAAQI,aAMlB,OALA/B,GAAqB,CACnBC,OAAAA,EACAC,eAAgBvS,EAChBwS,KAAMqY,EAAM,OAAS,SAEhB,EAGT9X,EAAUe,SAAS,CACjBrU,CAACorB,EAAM,OAAS,OAAQ7qB,EACxB8qB,SAAU,WAId,OAAO,EAuCT,OApCc,IAAVhY,GACFR,EAAOgK,cAAc,GACrBhK,EAAOmL,aAAa/K,GACpBJ,EAAOgL,kBAAkBmK,GACzBnV,EAAOiL,sBACPjL,EAAOgF,KAAK,wBAAyBxE,EAAO6X,GAC5CrY,EAAO0Y,gBAAgB/T,EAAcC,GACrC5E,EAAOxF,cAAcmK,EAAcC,KAEnC5E,EAAOgK,cAAcxJ,GACrBR,EAAOmL,aAAa/K,GACpBJ,EAAOgL,kBAAkBmK,GACzBnV,EAAOiL,sBACPjL,EAAOgF,KAAK,wBAAyBxE,EAAO6X,GAC5CrY,EAAO0Y,gBAAgB/T,EAAcC,GAEhC5E,EAAOqF,YACVrF,EAAOqF,WAAY,EAEdrF,EAAOmZ,gCACVnZ,EAAOmZ,8BAAgC,SAAuB9rB,GACvD2S,IAAUA,EAAO0L,WAClBre,EAAElE,SAAWiE,OACjB4S,EAAOiK,WAAW,GAAGrf,oBAAoB,gBAAiBoV,EAAOmZ,+BACjEnZ,EAAOiK,WAAW,GAAGrf,oBAAoB,sBAAuBoV,EAAOmZ,+BACvEnZ,EAAOmZ,8BAAgC,YAChCnZ,EAAOmZ,8BACdnZ,EAAOxF,cAAcmK,EAAcC,MAIvC5E,EAAOiK,WAAW,GAAGtf,iBAAiB,gBAAiBqV,EAAOmZ,+BAC9DnZ,EAAOiK,WAAW,GAAGtf,iBAAiB,sBAAuBqV,EAAOmZ,kCAIjE,GDlLPC,qBETkC3lB,EAAQ,EAAG+M,EAAQpT,KAAKmT,OAAOC,MAAOmE,GAAe,EAAM0T,GAC7F,MAAMrY,EAAS5S,KACf,IAAIisB,EAAW5lB,EAMf,OAJIuM,EAAOO,OAAOiF,OAChB6T,GAAYrZ,EAAOuQ,cAGdvQ,EAAOqM,QAAQgN,EAAU7Y,EAAOmE,EAAc0T,IFErDiB,UGTa,SAAmB9Y,EAAQpT,KAAKmT,OAAOC,MAAOmE,GAAe,EAAM0T,GAChF,MAAMrY,EAAS5S,MACTiY,UACJA,EAASD,QACTA,EAAO7E,OACPA,GACEP,EACJ,IAAKoF,EAAS,OAAOpF,EACrB,IAAIuZ,EAAWhZ,EAAOyL,eAEO,SAAzBzL,EAAOyM,eAAsD,IAA1BzM,EAAOyL,gBAAwBzL,EAAOmP,qBAC3E6J,EAAWzxB,KAAKC,IAAIiY,EAAOwZ,qBAAqB,WAAW,GAAO,IAGpE,MAAMvN,EAAYjM,EAAO8E,YAAcvE,EAAOwL,mBAAqB,EAAIwN,EAEvE,GAAIhZ,EAAOiF,KAAM,CACf,GAAIH,GAAa9E,EAAOkQ,kBAAmB,OAAO,EAClDzQ,EAAOyF,UAEPzF,EAAOyZ,YAAczZ,EAAOiK,WAAW,GAAG3O,WAG5C,OAAO0E,EAAOqM,QAAQrM,EAAO8E,YAAcmH,EAAWzL,EAAOmE,EAAc0T,IHb3EqB,UIVa,SAAmBlZ,EAAQpT,KAAKmT,OAAOC,MAAOmE,GAAe,EAAM0T,GAChF,MAAMrY,EAAS5S,MACTmT,OACJA,EAAM8E,UACNA,EAASyH,SACTA,EAAQzB,WACRA,EAAUzC,aACVA,EAAYxD,QACZA,GACEpF,EACJ,IAAKoF,EAAS,OAAOpF,EAErB,GAAIO,EAAOiF,KAAM,CACf,GAAIH,GAAa9E,EAAOkQ,kBAAmB,OAAO,EAClDzQ,EAAOyF,UAEPzF,EAAOyZ,YAAczZ,EAAOiK,WAAW,GAAG3O,WAK5C,SAASqe,EAAUC,GACjB,OAAIA,EAAM,GAAW9xB,KAAK+sB,MAAM/sB,KAAK6hB,IAAIiQ,IAClC9xB,KAAK+sB,MAAM+E,GAGpB,MAAMd,EAAsBa,EAPV/Q,EAAe5I,EAAOI,WAAaJ,EAAOI,WAQtDyZ,EAAqB/M,EAAS/a,IAAI6nB,GAAOD,EAAUC,IACzD,IAAIE,EAAWhN,EAAS+M,EAAmBltB,QAAQmsB,GAAuB,GAE1E,QAAwB,IAAbgB,GAA4BvZ,EAAOgF,QAAS,CACrD,IAAIwU,EACJjN,EAAS3mB,QAAQ,CAACovB,EAAME,KAClBqD,GAAuBvD,IAEzBwE,EAAgBtE,UAIS,IAAlBsE,IACTD,EAAWhN,EAASiN,EAAgB,EAAIA,EAAgB,EAAIA,IAIhE,IAAIC,EAAY,EAYhB,YAVwB,IAAbF,IACTE,EAAY3O,EAAW1e,QAAQmtB,GAC3BE,EAAY,IAAGA,EAAYha,EAAO8E,YAAc,GAEvB,SAAzBvE,EAAOyM,eAAsD,IAA1BzM,EAAOyL,gBAAwBzL,EAAOmP,qBAC3EsK,EAAYA,EAAYha,EAAOwZ,qBAAqB,YAAY,GAAQ,EACxEQ,EAAYlyB,KAAKC,IAAIiyB,EAAW,KAI7Bha,EAAOqM,QAAQ2N,EAAWxZ,EAAOmE,EAAc0T,IJ7CtD4B,WKXa,SAAoBzZ,EAAQpT,KAAKmT,OAAOC,MAAOmE,GAAe,EAAM0T,GAEjF,OADejrB,KACDif,QADCjf,KACc0X,YAAatE,EAAOmE,EAAc0T,ILU/D6B,eMZa,SAAwB1Z,EAAQpT,KAAKmT,OAAOC,MAAOmE,GAAe,EAAM0T,EAAUnQ,EAAY,IAC3G,MAAMlI,EAAS5S,KACf,IAAIqG,EAAQuM,EAAO8E,YACnB,MAAM6S,EAAO7vB,KAAKqZ,IAAInB,EAAOO,OAAOwL,mBAAoBtY,GAClDgiB,EAAYkC,EAAO7vB,KAAK+sB,OAAOphB,EAAQkkB,GAAQ3X,EAAOO,OAAOyL,gBAC7D5L,EAAYJ,EAAO4I,aAAe5I,EAAOI,WAAaJ,EAAOI,UAEnE,GAAIA,GAAaJ,EAAO8M,SAAS2I,GAAY,CAG3C,MAAM0E,EAAcna,EAAO8M,SAAS2I,GAGhCrV,EAAY+Z,GAFCna,EAAO8M,SAAS2I,EAAY,GAEH0E,GAAejS,IACvDzU,GAASuM,EAAOO,OAAOyL,oBAEpB,CAGL,MAAM8N,EAAW9Z,EAAO8M,SAAS2I,EAAY,GAGzCrV,EAAY0Z,IAFI9Z,EAAO8M,SAAS2I,GAEOqE,GAAY5R,IACrDzU,GAASuM,EAAOO,OAAOyL,gBAM3B,OAFAvY,EAAQ3L,KAAKC,IAAI0L,EAAO,GACxBA,EAAQ3L,KAAKqZ,IAAI1N,EAAOuM,EAAOqL,WAAWrjB,OAAS,GAC5CgY,EAAOqM,QAAQ5Y,EAAO+M,EAAOmE,EAAc0T,INhBlDlI,+BOXA,MAAMnQ,EAAS5S,MACTmT,OACJA,EAAM0J,WACNA,GACEjK,EACEgN,EAAyC,SAAzBzM,EAAOyM,cAA2BhN,EAAOwZ,uBAAyBjZ,EAAOyM,cAC/F,IACImK,EADAiD,EAAepa,EAAO+X,aAG1B,GAAIxX,EAAOiF,KAAM,CACf,GAAIxF,EAAOqF,UAAW,OACtB8R,EAAYjF,SAASjb,GAAE+I,EAAO8X,cAAcjtB,KAAK,2BAA4B,IAEzE0V,EAAO4M,eACLiN,EAAepa,EAAOuQ,aAAevD,EAAgB,GAAKoN,EAAepa,EAAOoN,OAAOplB,OAASgY,EAAOuQ,aAAevD,EAAgB,GACxIhN,EAAOyF,UACP2U,EAAenQ,EAAW7W,SAAS,IAAImN,EAAOoQ,uCAAuCwG,YAAoB5W,EAAOyQ,wBAAwBzU,GAAG,GAAG9I,QAC9IkK,GAAS,KACPqC,EAAOqM,QAAQ+N,MAGjBpa,EAAOqM,QAAQ+N,GAERA,EAAepa,EAAOoN,OAAOplB,OAASglB,GAC/ChN,EAAOyF,UACP2U,EAAenQ,EAAW7W,SAAS,IAAImN,EAAOoQ,uCAAuCwG,YAAoB5W,EAAOyQ,wBAAwBzU,GAAG,GAAG9I,QAC9IkK,GAAS,KACPqC,EAAOqM,QAAQ+N,MAGjBpa,EAAOqM,QAAQ+N,QAGjBpa,EAAOqM,QAAQ+N,K5BPjB5U,K6B1Ba,CACb6U,sBCDA,MAAMra,EAAS5S,KACTtG,EAAWmO,MACXsL,OACJA,EAAM0J,WACNA,GACEjK,EAEEsa,EAAYrjB,GAAEgT,EAAW7W,WAAW,GAAG1J,YAC7C4wB,EAAUlnB,SAAS,IAAImN,EAAOoQ,cAAcpQ,EAAOyQ,uBAAuBhZ,SAC1E,IAAIoV,EAASkN,EAAUlnB,SAAS,IAAImN,EAAOoQ,YAE3C,GAAIpQ,EAAOiQ,uBAAwB,CACjC,MAAM+J,EAAiBha,EAAOyL,eAAiBoB,EAAOplB,OAASuY,EAAOyL,eAEtE,GAAIuO,IAAmBha,EAAOyL,eAAgB,CAC5C,IAAK,IAAI/jB,EAAI,EAAGA,EAAIsyB,EAAgBtyB,GAAK,EAAG,CAC1C,MAAMuyB,EAAYvjB,GAAEnQ,EAASC,cAAc,QAAQ4Q,SAAS,GAAG4I,EAAOoQ,cAAcpQ,EAAOqQ,mBAC3F0J,EAAUpxB,OAAOsxB,GAGnBpN,EAASkN,EAAUlnB,SAAS,IAAImN,EAAOoQ,aAId,SAAzBpQ,EAAOyM,eAA6BzM,EAAOgQ,eAAchQ,EAAOgQ,aAAenD,EAAOplB,QAC1FgY,EAAOuQ,aAAezoB,KAAKquB,KAAKpb,WAAWwF,EAAOgQ,cAAgBhQ,EAAOyM,cAAe,KACxFhN,EAAOuQ,cAAgBhQ,EAAO+P,qBAE1BtQ,EAAOuQ,aAAenD,EAAOplB,SAC/BgY,EAAOuQ,aAAenD,EAAOplB,QAG/B,MAAMyyB,EAAgB,GAChBC,EAAe,GACrBtN,EAAOrR,KAAK,CAAClF,EAAIpD,KACf,MAAM4gB,EAAQpd,GAAEJ,GAEZpD,EAAQuM,EAAOuQ,cACjBmK,EAAansB,KAAKsI,GAGhBpD,EAAQ2Z,EAAOplB,QAAUyL,GAAS2Z,EAAOplB,OAASgY,EAAOuQ,cAC3DkK,EAAclsB,KAAKsI,GAGrBwd,EAAMxpB,KAAK,0BAA2B4I,KAGxC,IAAK,IAAIxL,EAAI,EAAGA,EAAIyyB,EAAa1yB,OAAQC,GAAK,EAC5CqyB,EAAUpxB,OAAO+N,GAAEyjB,EAAazyB,GAAG0yB,WAAU,IAAOhjB,SAAS4I,EAAOyQ,sBAGtE,IAAK,IAAI/oB,EAAIwyB,EAAczyB,OAAS,EAAGC,GAAK,EAAGA,GAAK,EAClDqyB,EAAUzd,QAAQ5F,GAAEwjB,EAAcxyB,GAAG0yB,WAAU,IAAOhjB,SAAS4I,EAAOyQ,uBDnDxEvL,mBEJA,MAAMzF,EAAS5S,KACf4S,EAAOgF,KAAK,iBACZ,MAAMF,YACJA,EAAWsI,OACXA,EAAMmD,aACNA,EAAYlG,eACZA,EAAcD,eACdA,EAAc0C,SACdA,EACAlE,aAAcC,GACZ7I,EACJ,IAAIqZ,EACJrZ,EAAOqK,gBAAiB,EACxBrK,EAAOoK,gBAAiB,EACxB,MACMG,GADiBuC,EAAShI,GACH9E,EAAOjC,eAEpC,GAAI+G,EAAcyL,EAAc,CAC9B8I,EAAWjM,EAAOplB,OAAwB,EAAfuoB,EAAmBzL,EAC9CuU,GAAY9I,EACSvQ,EAAOqM,QAAQgN,EAAU,GAAG,GAAO,IAE3B,IAAT9O,GAClBvK,EAAOmL,cAActC,GAAO7I,EAAOI,UAAYJ,EAAOI,WAAamK,QAEhE,GAAIzF,GAAesI,EAAOplB,OAASuoB,EAAc,CAEtD8I,GAAYjM,EAAOplB,OAAS8c,EAAcyL,EAC1C8I,GAAY9I,EACSvQ,EAAOqM,QAAQgN,EAAU,GAAG,GAAO,IAE3B,IAAT9O,GAClBvK,EAAOmL,cAActC,GAAO7I,EAAOI,UAAYJ,EAAOI,WAAamK,GAIvEvK,EAAOqK,eAAiBA,EACxBrK,EAAOoK,eAAiBA,EACxBpK,EAAOgF,KAAK,YFjCZ4V,uBGLA,MACM3Q,WACJA,EAAU1J,OACVA,EAAM6M,OACNA,GAJahgB,KAMf6c,EAAW7W,SAAS,IAAImN,EAAOoQ,cAAcpQ,EAAOyQ,wBAAwBzQ,EAAOoQ,cAAcpQ,EAAOqQ,mBAAmB5Y,SAC3HoV,EAAO5U,WAAW,6BhCsBlB2R,WiC5Ba,CACbG,cCHa,SAAuBuQ,GAEpC,GADeztB,KACJsU,QAAQM,QADJ5U,KACqBmT,OAAO0P,eAD5B7iB,KACoDmT,OAAOiN,eAD3DpgB,KACmF0tB,UADnF1tB,KACsGmT,OAAOgF,QAAS,OACrI,MAAM1O,EAAyC,cAFhCzJ,KAEGmT,OAAOqF,kBAFVxY,KAEqDyJ,GAFrDzJ,KAEiEqT,UAChF5J,EAAGpL,MAAMsvB,OAAS,OAClBlkB,EAAGpL,MAAMsvB,OAASF,EAAS,mBAAqB,eAChDhkB,EAAGpL,MAAMsvB,OAASF,EAAS,eAAiB,YAC5ChkB,EAAGpL,MAAMsvB,OAASF,EAAS,WAAa,QDHxCG,2BEHe5tB,KAEJsU,QAAQM,OAFJ5U,KAEoBmT,OAAOiN,eAF3BpgB,KAEmD0tB,UAFnD1tB,KAEsEmT,OAAOgF,UAF7EnY,KAM4B,cAN5BA,KAMDmT,OAAOqF,kBAAoC,KAAO,aAAana,MAAMsvB,OAAS,avCsF/E,CACbE,aA/BF,WACE,MAAMjb,EAAS5S,KACTtG,EAAWmO,MACXsL,OACJA,EAAMmB,QACNA,GACE1B,EACJA,EAAOiF,aAAeA,GAAaiW,KAAKlb,GACxCA,EAAO2I,YAAcA,GAAYuS,KAAKlb,GACtCA,EAAOoL,WAAaA,GAAW8P,KAAKlb,GAEhCO,EAAOgF,UACTvF,EAAO8N,SAAWA,GAASoN,KAAKlb,IAGlCA,EAAO0N,QAAUA,GAAQwN,KAAKlb,GAE1B0B,EAAQM,QAAUkM,KACpBpnB,EAAS6D,iBAAiB,aAAcwjB,IACxCD,IAAqB,GAGvBvU,GAAOqG,EAAQ,OAUfmb,aAPF,WAEExhB,GADevM,KACA,SI1Dfwf,YoC9Ba,CACbC,cvCGa,WACb,MAAM7M,EAAS5S,MACT0X,YACJA,EAAW8S,YACXA,EAAWrH,aACXA,EAAe,EAAChQ,OAChBA,EAAMwR,IACNA,GACE/R,EACE4M,EAAcrM,EAAOqM,YAC3B,IAAKA,GAAeA,GAAmD,IAApC7mB,OAAO+C,KAAK8jB,GAAa5kB,OAAc,OAE1E,MAAMozB,EAAapb,EAAOqb,cAAczO,EAAa5M,EAAOO,OAAOiP,gBAAiBxP,EAAOnJ,IAC3F,IAAKukB,GAAcpb,EAAOsb,oBAAsBF,EAAY,OAC5D,MACMG,GADuBH,KAAcxO,EAAcA,EAAYwO,QAAczzB,IAClCqY,EAAOwb,eAClDC,EAAc3M,GAAc9O,EAAQO,GACpCmb,EAAa5M,GAAc9O,EAAQub,GACnCI,EAAapb,EAAO6E,QAEtBqW,IAAgBC,GAClB3J,EAAIha,YAAY,GAAGwI,EAAOmQ,8BAA8BnQ,EAAOmQ,qCAC/D1Q,EAAO4b,yBACGH,GAAeC,IACzB3J,EAAIpa,SAAY4I,EAAOmQ,uBAAV,SAET6K,EAAiBxM,KAAK/b,MAAuC,WAA/BuoB,EAAiBxM,KAAK/b,OAAsBuoB,EAAiBxM,KAAK/b,MAA6B,WAArBuN,EAAOwO,KAAK/b,OACtH+e,EAAIpa,SAAY4I,EAAOmQ,uBAAV,eAGf1Q,EAAO4b,wBAGT,MAAMC,EAAmBN,EAAiB3W,WAAa2W,EAAiB3W,YAAcrE,EAAOqE,UACvFkX,EAAcvb,EAAOiF,OAAS+V,EAAiBvO,gBAAkBzM,EAAOyM,eAAiB6O,GAE3FA,GAAoBjE,GACtB5X,EAAO+b,kBAGT/nB,GAAOgM,EAAOO,OAAQgb,GACtB,MAAMS,EAAYhc,EAAOO,OAAO6E,QAChCrf,OAAOP,OAAOwa,EAAQ,CACpBuI,eAAgBvI,EAAOO,OAAOgI,eAC9B6B,eAAgBpK,EAAOO,OAAO6J,eAC9BC,eAAgBrK,EAAOO,OAAO8J,iBAG5BsR,IAAeK,EACjBhc,EAAOic,WACGN,GAAcK,GACxBhc,EAAOkc,SAGTlc,EAAOsb,kBAAoBF,EAC3Bpb,EAAOgF,KAAK,oBAAqBuW,GAE7BO,GAAelE,IACjB5X,EAAO4a,cACP5a,EAAOqa,aACPra,EAAO+M,eACP/M,EAAOqM,QAAQvH,EAAcyL,EAAevQ,EAAOuQ,aAAc,GAAG,IAGtEvQ,EAAOgF,KAAK,aAAcuW,IuClE1BF,uBCHoCzO,EAAapG,EAAO,SAAU2V,GAClE,IAAKvP,GAAwB,cAATpG,IAAyB2V,EAAa,OAC1D,IAAIf,GAAa,EACjB,MAAMllB,EAASF,KACTomB,EAAyB,WAAT5V,EAAoBtQ,EAAOmmB,YAAcF,EAAYlK,aACrEqK,EAASv2B,OAAO+C,KAAK8jB,GAAa7a,IAAIwqB,IAC1C,GAAqB,iBAAVA,GAA6C,IAAvBA,EAAM5vB,QAAQ,KAAY,CACzD,MAAM6vB,EAAWzhB,WAAWwhB,EAAME,OAAO,IAEzC,MAAO,CACL1xB,MAFYqxB,EAAgBI,EAG5BD,MAAAA,GAIJ,MAAO,CACLxxB,MAAOwxB,EACPA,MAAAA,KAGJD,EAAOI,KAAK,CAACn2B,EAAGC,IAAM0rB,SAAS3rB,EAAEwE,MAAO,IAAMmnB,SAAS1rB,EAAEuE,MAAO,KAEhE,IAAK,IAAI9C,EAAI,EAAGA,EAAIq0B,EAAOt0B,OAAQC,GAAK,EAAG,CACzC,MAAMs0B,MACJA,EAAKxxB,MACLA,GACEuxB,EAAOr0B,GAEE,WAATue,EACEtQ,EAAOP,WAAW,eAAe5K,QAAYmR,UAC/Ckf,EAAamB,GAENxxB,GAASoxB,EAAYnK,cAC9BoJ,EAAamB,GAIjB,OAAOnB,GAAc,sBCHR,CACb3N,cApCF,WACE,MAAMzN,EAAS5S,MAEb0tB,SAAU6B,EAASpc,OACnBA,GACEP,GACE4P,mBACJA,GACErP,EAEJ,GAAIqP,EAAoB,CACtB,MAAMgN,EAAiB5c,EAAOoN,OAAOplB,OAAS,EACxC60B,EAAqB7c,EAAOqL,WAAWuR,GAAkB5c,EAAO8L,gBAAgB8Q,GAAuC,EAArBhN,EACxG5P,EAAO8a,SAAW9a,EAAOqS,KAAOwK,OAEhC7c,EAAO8a,SAAsC,IAA3B9a,EAAO8M,SAAS9kB,QAGN,IAA1BuY,EAAO6J,iBACTpK,EAAOoK,gBAAkBpK,EAAO8a,WAGJ,IAA1Bva,EAAO8J,iBACTrK,EAAOqK,gBAAkBrK,EAAO8a,UAG9B6B,GAAaA,IAAc3c,EAAO8a,WACpC9a,EAAOiN,OAAQ,GAGb0P,IAAc3c,EAAO8a,UACvB9a,EAAOgF,KAAKhF,EAAO8a,SAAW,OAAS,YtCGzCljB,QuChCa,CACbklB,WCaa,WACb,MACMjlB,WACJA,EAAU0I,OACVA,EAAMsI,IACNA,EAAGkJ,IACHA,EAAGpP,OACHA,EAAMjB,QACNA,GAPatU,KAUT2vB,EA3BR,SAAwBC,EAASC,GAC/B,MAAMC,EAAgB,GAYtB,OAXAF,EAAQ72B,QAAQg3B,IACM,iBAATA,EACTp3B,OAAO+C,KAAKq0B,GAAMh3B,QAAQ0R,IACpBslB,EAAKtlB,IACPqlB,EAAc3uB,KAAK0uB,EAASplB,KAGP,iBAATslB,GAChBD,EAAc3uB,KAAK0uB,EAASE,KAGzBD,EAcUE,CAAe,CAAC,cAAe7c,EAAOqE,UAAW,CAChEyY,kBAAmB3b,EAAQM,OAC1B,CACDsb,YAbalwB,KAaOmT,OAAOuK,UAAYvK,EAAOuK,SAAS1F,SACtD,CACDmY,WAAchd,EAAO6O,YACpB,CACDvG,IAAOA,GACN,CACDkG,KAAQxO,EAAOwO,MAAQxO,EAAOwO,KAAKC,KAAO,GACzC,CACDwO,cAAejd,EAAOwO,MAAQxO,EAAOwO,KAAKC,KAAO,GAA0B,WAArBzO,EAAOwO,KAAK/b,MACjE,CACD6P,QAAWF,EAAOE,SACjB,CACDD,IAAOD,EAAOC,KACb,CACD6a,WAAYld,EAAOgF,SAClB,CACDmY,SAAYnd,EAAOgF,SAAWhF,EAAO4M,iBACnC5M,EAAOmQ,wBACX7Y,EAAWtJ,QAAQwuB,GACnBhL,EAAIpa,SAAS,IAAIE,GAAY4G,KAAK,MAhCnBrR,KAiCRwuB,wBD9CP+B,yBEHA,MACM5L,IACJA,EAAGla,WACHA,GAHazK,KAKf2kB,EAAIha,YAAYF,EAAW4G,KAAK,MALjBrR,KAMRwuB,yBzC4BPgC,O0CjCa,CACbC,UCDa,SAAmBC,EAASp4B,EAAKq4B,EAAQC,EAAOC,EAAkB5tB,GAC/E,MAAM6F,EAASF,KACf,IAAIkoB,EAEJ,SAASC,IACH9tB,GAAUA,IAGE4G,GAAE6mB,GAASxgB,OAAO,WAAW,IAE3BwgB,EAAQM,UAAaH,EAsBvCE,IArBIz4B,GACFw4B,EAAQ,IAAIhoB,EAAOmoB,MACnBH,EAAMI,OAASH,EACfD,EAAMK,QAAUJ,EAEZH,IACFE,EAAMF,MAAQA,GAGZD,IACFG,EAAMH,OAASA,GAGbr4B,IACFw4B,EAAMx4B,IAAMA,IAGdy4B,KD1BJ/N,yBEHA,MAAMpQ,EAAS5S,KAGf,SAAS+wB,IACH,MAAOne,GAA8CA,IAAUA,EAAO0L,iBAC9C/jB,IAAxBqY,EAAOwe,eAA4Bxe,EAAOwe,cAAgB,GAE1Dxe,EAAOwe,eAAiBxe,EAAOye,aAAaz2B,SAC1CgY,EAAOO,OAAO8P,qBAAqBrQ,EAAO7P,SAC9C6P,EAAOgF,KAAK,iBARhBhF,EAAOye,aAAeze,EAAO+R,IAAIvU,KAAK,OAYtC,IAAK,IAAIvV,EAAI,EAAGA,EAAI+X,EAAOye,aAAaz2B,OAAQC,GAAK,EAAG,CACtD,MAAM61B,EAAU9d,EAAOye,aAAax2B,GACpC+X,EAAO6d,UAAUC,EAASA,EAAQY,YAAcZ,EAAQ7yB,aAAa,OAAQ6yB,EAAQC,QAAUD,EAAQ7yB,aAAa,UAAW6yB,EAAQE,OAASF,EAAQ7yB,aAAa,UAAU,EAAMkzB,O5CqBnLQ,GAAmB,GAEzB,MAAMC,GACJzxB,eAAe2L,GACb,IAAIjC,EACA0J,EAYJ,GAVoB,IAAhBzH,EAAK9Q,QAAgB8Q,EAAK,GAAG/E,aAAwE,WAAzDhO,OAAOiR,UAAU8H,SAAS1P,KAAK0J,EAAK,IAAIvR,MAAM,GAAI,GAChGgZ,EAASzH,EAAK,IAEbjC,EAAI0J,GAAUzH,EAGZyH,IAAQA,EAAS,IACtBA,EAASvM,GAAO,GAAIuM,GAChB1J,IAAO0J,EAAO1J,KAAI0J,EAAO1J,GAAKA,GAE9B0J,EAAO1J,IAAMI,GAAEsJ,EAAO1J,IAAI7O,OAAS,EAAG,CACxC,MAAM62B,EAAU,GAOhB,OANA5nB,GAAEsJ,EAAO1J,IAAIkF,KAAKogB,IAChB,MAAM2C,EAAY9qB,GAAO,GAAIuM,EAAQ,CACnC1J,GAAIslB,IAEN0C,EAAQtwB,KAAK,IAAIqwB,GAAOE,MAEnBD,EAIT,MAAM7e,EAAS5S,KACf4S,EAAOL,YAAa,EACpBK,EAAO0B,QAAUG,KACjB7B,EAAO2C,OAASJ,GAAU,CACxBlN,UAAWkL,EAAOlL,YAEpB2K,EAAO4B,QAAU8B,KACjB1D,EAAOqE,gBAAkB,GACzBrE,EAAOwE,mBAAqB,GAC5BxE,EAAO+e,QAAU,IAAI/e,EAAOgf,aAExBze,EAAOwe,SAAWlxB,MAAMiJ,QAAQyJ,EAAOwe,UACzC/e,EAAO+e,QAAQxwB,QAAQgS,EAAOwe,SAGhC,MAAMtN,EAAmB,GACzBzR,EAAO+e,QAAQ54B,QAAQ84B,IACrBA,EAAI,CACFjf,OAAAA,EACAkf,aAAc1N,GAAmBjR,EAAQkR,GACzC5Y,GAAImH,EAAOnH,GAAGqiB,KAAKlb,GACnBmf,KAAMnf,EAAOmf,KAAKjE,KAAKlb,GACvBhG,IAAKgG,EAAOhG,IAAIkhB,KAAKlb,GACrBgF,KAAMhF,EAAOgF,KAAKkW,KAAKlb,OAI3B,MAAMof,EAAeprB,GAAO,GAAIqrB,GAAU5N,GAiH1C,OA/GAzR,EAAOO,OAASvM,GAAO,GAAIorB,EAAcT,GAAkBpe,GAC3DP,EAAOwb,eAAiBxnB,GAAO,GAAIgM,EAAOO,QAC1CP,EAAOsf,aAAetrB,GAAO,GAAIuM,GAE7BP,EAAOO,QAAUP,EAAOO,OAAO1H,IACjC9S,OAAO+C,KAAKkX,EAAOO,OAAO1H,IAAI1S,QAAQo5B,IACpCvf,EAAOnH,GAAG0mB,EAAWvf,EAAOO,OAAO1H,GAAG0mB,MAItCvf,EAAOO,QAAUP,EAAOO,OAAOif,OACjCxf,EAAOwf,MAAMxf,EAAOO,OAAOif,OAI7Bxf,EAAO/I,EAAIA,GAEXlR,OAAOP,OAAOwa,EAAQ,CACpBoF,QAASpF,EAAOO,OAAO6E,QACvBvO,GAAAA,EAEAgB,WAAY,GAEZuV,OAAQnW,KACRoU,WAAY,GACZyB,SAAU,GACVhB,gBAAiB,GAGjBrC,aAAY,IACyB,eAA5BzJ,EAAOO,OAAOqE,UAGvBsE,WAAU,IAC2B,aAA5BlJ,EAAOO,OAAOqE,UAIvBE,YAAa,EACbqS,UAAW,EAEXjK,aAAa,EACbD,OAAO,EAEP7M,UAAW,EACX4N,kBAAmB,EACnB9M,SAAU,EACVue,SAAU,EACVpa,WAAW,EAEX+E,eAAgBpK,EAAOO,OAAO6J,eAC9BC,eAAgBrK,EAAOO,OAAO8J,eAE9B+D,YAAa,WACX,MAAMpM,EAAQ,CAAC,aAAc,YAAa,WAAY,eAChD0d,EAAU,CAAC,cAAe,cAAe,aAY/C,OAXA1f,EAAO2f,iBAAmB,CACxBpR,MAAOvM,EAAM,GACb0M,KAAM1M,EAAM,GACZ2M,IAAK3M,EAAM,GACX4M,OAAQ5M,EAAM,IAEhBhC,EAAO4f,mBAAqB,CAC1BrR,MAAOmR,EAAQ,GACfhR,KAAMgR,EAAQ,GACd/Q,IAAK+Q,EAAQ,IAER1f,EAAO0B,QAAQM,QAAUhC,EAAOO,OAAO0P,cAAgBjQ,EAAO2f,iBAAmB3f,EAAO4f,mBAdpF,GAgBb1a,gBAAiB,CACfc,eAAWre,EACXse,aAASte,EACTigB,yBAAqBjgB,EACrBogB,oBAAgBpgB,EAChBkgB,iBAAalgB,EACb8iB,sBAAkB9iB,EAClBoiB,oBAAgBpiB,EAChBwgB,wBAAoBxgB,EAEpBygB,kBAAmBpI,EAAOO,OAAO6H,kBAEjCqD,cAAe5N,KACfgiB,kBAAcl4B,EAEdm4B,WAAY,GACZ5V,yBAAqBviB,EACrBke,kBAAcle,EACdmgB,iBAAangB,GAGfkf,YAAY,EAEZ0B,eAAgBvI,EAAOO,OAAOgI,eAC9BpD,QAAS,CACPiC,OAAQ,EACRC,OAAQ,EACRN,SAAU,EACVG,SAAU,EACVqD,KAAM,GAGRkU,aAAc,GACdD,aAAc,IAEhBxe,EAAOgF,KAAK,WAERhF,EAAOO,OAAOrO,MAChB8N,EAAO9N,OAIF8N,EAGT7S,SACE,MAAM6S,EAAS5S,KACX4S,EAAOoF,UACXpF,EAAOoF,SAAU,EAEbpF,EAAOO,OAAO4J,YAChBnK,EAAOsK,gBAGTtK,EAAOgF,KAAK,WAGd7X,UACE,MAAM6S,EAAS5S,KACV4S,EAAOoF,UACZpF,EAAOoF,SAAU,EAEbpF,EAAOO,OAAO4J,YAChBnK,EAAOgb,kBAGThb,EAAOgF,KAAK,YAGd7X,YAAY+T,EAAUV,GAEpBU,EAAWpZ,KAAKqZ,IAAIrZ,KAAKC,IAAImZ,EAAU,GAAI,GAC3C,MAAMC,EAFS/T,KAEIgc,eAEbrI,GAJS3T,KAGI+b,eACIhI,GAAOD,EAAWC,EAJ1B/T,KAKR+qB,YAAYpX,OAA0B,IAAVP,EAAwB,EAAIA,GALhDpT,KAMR4d,oBANQ5d,KAOR6d,sBAGT9d,uBACE,MAAM6S,EAAS5S,KACf,IAAK4S,EAAOO,OAAOgR,eAAiBvR,EAAOnJ,GAAI,OAC/C,MAAMkpB,EAAM/f,EAAOnJ,GAAGqB,UAAUJ,MAAM,KAAK9F,OAAOkG,GACT,IAAhCA,EAAUvL,QAAQ,WAA+E,IAA5DuL,EAAUvL,QAAQqT,EAAOO,OAAOmQ,yBAE9E1Q,EAAOgF,KAAK,oBAAqB+a,EAAIthB,KAAK,MAG5CtR,gBAAgB6yB,GACd,MAAMhgB,EAAS5S,KACf,OAAO4yB,EAAQ9nB,UAAUJ,MAAM,KAAK9F,OAAOkG,GACI,IAAtCA,EAAUvL,QAAQ,iBAAyE,IAAhDuL,EAAUvL,QAAQqT,EAAOO,OAAOoQ,aACjFlS,KAAK,KAGVtR,oBACE,MAAM6S,EAAS5S,KACf,IAAK4S,EAAOO,OAAOgR,eAAiBvR,EAAOnJ,GAAI,OAC/C,MAAMtF,EAAU,GAChByO,EAAOoN,OAAOrR,KAAKikB,IACjB,MAAMnoB,EAAamI,EAAOigB,gBAAgBD,GAC1CzuB,EAAQhD,KAAK,CACXyxB,QAAAA,EACAnoB,WAAAA,IAEFmI,EAAOgF,KAAK,cAAegb,EAASnoB,KAEtCmI,EAAOgF,KAAK,gBAAiBzT,GAG/BpE,qBAAqB+yB,EAAO,UAAWC,GAAQ,GAC7C,MACM5f,OACJA,EAAM6M,OACNA,EAAM/B,WACNA,EAAUS,gBACVA,EACAuG,KAAMY,EAAUnO,YAChBA,GAPa1X,KASf,IAAIgzB,EAAM,EAEV,GAAI7f,EAAO4M,eAAgB,CACzB,IACIkT,EADAnM,EAAY9G,EAAOtI,GAAagQ,gBAGpC,IAAK,IAAI7sB,EAAI6c,EAAc,EAAG7c,EAAImlB,EAAOplB,OAAQC,GAAK,EAChDmlB,EAAOnlB,KAAOo4B,IAChBnM,GAAa9G,EAAOnlB,GAAG6sB,gBACvBsL,GAAO,EACHlM,EAAYjB,IAAYoN,GAAY,IAI5C,IAAK,IAAIp4B,EAAI6c,EAAc,EAAG7c,GAAK,EAAGA,GAAK,EACrCmlB,EAAOnlB,KAAOo4B,IAChBnM,GAAa9G,EAAOnlB,GAAG6sB,gBACvBsL,GAAO,EACHlM,EAAYjB,IAAYoN,GAAY,SAK5C,GAAa,YAATH,EACF,IAAK,IAAIj4B,EAAI6c,EAAc,EAAG7c,EAAImlB,EAAOplB,OAAQC,GAAK,EAAG,EACnCk4B,EAAQ9U,EAAWpjB,GAAK6jB,EAAgB7jB,GAAKojB,EAAWvG,GAAemO,EAAa5H,EAAWpjB,GAAKojB,EAAWvG,GAAemO,KAGhJmN,GAAO,QAKX,IAAK,IAAIn4B,EAAI6c,EAAc,EAAG7c,GAAK,EAAGA,GAAK,EAAG,CACxBojB,EAAWvG,GAAeuG,EAAWpjB,GAAKgrB,IAG5DmN,GAAO,GAMf,OAAOA,EAGTjzB,SACE,MAAM6S,EAAS5S,KACf,IAAK4S,GAAUA,EAAO0L,UAAW,OACjC,MAAMoB,SACJA,EAAQvM,OACRA,GACEP,EAWJ,SAASmL,IACP,MAAMmV,EAAiBtgB,EAAO4I,cAAmC,EAApB5I,EAAOI,UAAiBJ,EAAOI,UACtEkY,EAAexwB,KAAKqZ,IAAIrZ,KAAKC,IAAIu4B,EAAgBtgB,EAAOmJ,gBAAiBnJ,EAAOoJ,gBACtFpJ,EAAOmL,aAAamN,GACpBtY,EAAOgL,oBACPhL,EAAOiL,sBAGT,IAAIsV,EAjBAhgB,EAAOqM,aACT5M,EAAO6M,gBAGT7M,EAAOgI,aACPhI,EAAO+M,eACP/M,EAAOkL,iBACPlL,EAAOiL,sBAYHjL,EAAOO,OAAOuK,UAAY9K,EAAOO,OAAOuK,SAAS1F,SACnD+F,IAEInL,EAAOO,OAAO6O,YAChBpP,EAAO8V,qBAIPyK,GADmC,SAAhCvgB,EAAOO,OAAOyM,eAA4BhN,EAAOO,OAAOyM,cAAgB,IAAMhN,EAAOiN,QAAUjN,EAAOO,OAAO4M,eACnGnN,EAAOqM,QAAQrM,EAAOoN,OAAOplB,OAAS,EAAG,GAAG,GAAO,GAEnDgY,EAAOqM,QAAQrM,EAAO8E,YAAa,GAAG,GAAO,GAGvDyb,GACHpV,KAIA5K,EAAOiN,eAAiBV,IAAa9M,EAAO8M,UAC9C9M,EAAOyN,gBAGTzN,EAAOgF,KAAK,UAGd7X,gBAAgBqzB,EAAcC,GAAa,GACzC,MAAMzgB,EAAS5S,KACTszB,EAAmB1gB,EAAOO,OAAOqE,UAOvC,OALK4b,IAEHA,EAAoC,eAArBE,EAAoC,WAAa,cAG9DF,IAAiBE,GAAqC,eAAjBF,GAAkD,aAAjBA,IAI1ExgB,EAAO+R,IAAIha,YAAY,GAAGiI,EAAOO,OAAOmQ,yBAAyBgQ,KAAoB/oB,SAAS,GAAGqI,EAAOO,OAAOmQ,yBAAyB8P,KACxIxgB,EAAO4b,uBACP5b,EAAOO,OAAOqE,UAAY4b,EAC1BxgB,EAAOoN,OAAOrR,KAAKikB,IACI,aAAjBQ,EACFR,EAAQv0B,MAAMsX,MAAQ,GAEtBid,EAAQv0B,MAAMwX,OAAS,KAG3BjD,EAAOgF,KAAK,mBACRyb,GAAYzgB,EAAO7P,UAdd6P,EAkBX7S,MAAM0J,GACJ,MAAMmJ,EAAS5S,KACf,GAAI4S,EAAO2gB,QAAS,OAAO,EAE3B,MAAM5O,EAAM9a,GAAEJ,GAAMmJ,EAAOO,OAAO1J,IAGlC,KAFAA,EAAKkb,EAAI,IAGP,OAAO,EAGTlb,EAAGmJ,OAASA,EAEZ,MAAM4gB,EAAqB,IAClB,KAAK5gB,EAAOO,OAAO8Q,cAAgB,IAAIla,OAAOW,MAAM,KAAK2G,KAAK,KAgBvE,IAAIwL,EAbe,MACjB,GAAIpT,GAAMA,EAAGsP,YAActP,EAAGsP,WAAWrZ,cAAe,CACtD,MAAM8J,EAAMK,GAAEJ,EAAGsP,WAAWrZ,cAAc8zB,MAI1C,OAFAhqB,EAAIxD,SAAW1I,GAAWqnB,EAAI3e,SAAS1I,GAEhCkM,EAGT,OAAOmb,EAAI3e,SAASwtB,MAILC,GAEjB,GAA0B,IAAtB5W,EAAWjiB,QAAgBgY,EAAOO,OAAO4O,eAAgB,CAC3D,MACM2R,EADW7rB,KACQlO,cAAc,OACvCkjB,EAAahT,GAAE6pB,GACfA,EAAQ5oB,UAAY8H,EAAOO,OAAO8Q,aAClCU,EAAI7oB,OAAO43B,GACX/O,EAAI3e,SAAS,IAAI4M,EAAOO,OAAOoQ,YAAc5U,KAAKikB,IAChD/V,EAAW/gB,OAAO82B,KAetB,OAXAj6B,OAAOP,OAAOwa,EAAQ,CACpB+R,IAAAA,EACAlb,GAAAA,EACAoT,WAAAA,EACAxJ,UAAWwJ,EAAW,GACtB0W,SAAS,EAET9X,IAA8B,QAAzBhS,EAAGgK,IAAI+C,eAAoD,QAAzBmO,EAAIlW,IAAI,aAC/C+M,aAA0C,eAA5B5I,EAAOO,OAAOqE,YAAwD,QAAzB/N,EAAGgK,IAAI+C,eAAoD,QAAzBmO,EAAIlW,IAAI,cACrGqX,SAAwC,gBAA9BjJ,EAAWpO,IAAI,cAEpB,EAGT1O,KAAK0J,GACH,MAAMmJ,EAAS5S,KACf,GAAI4S,EAAO4X,YAAa,OAAO5X,EAE/B,OAAgB,IADAA,EAAO+gB,MAAMlqB,KAE7BmJ,EAAOgF,KAAK,cAERhF,EAAOO,OAAOqM,aAChB5M,EAAO6M,gBAIT7M,EAAO8c,aAEH9c,EAAOO,OAAOiF,MAChBxF,EAAOqa,aAITra,EAAOgI,aAEPhI,EAAO+M,eAEH/M,EAAOO,OAAOiN,eAChBxN,EAAOyN,gBAILzN,EAAOO,OAAO4J,YAAcnK,EAAOoF,SACrCpF,EAAOsK,gBAGLtK,EAAOO,OAAO6P,eAChBpQ,EAAOoQ,gBAILpQ,EAAOO,OAAOiF,KAChBxF,EAAOqM,QAAQrM,EAAOO,OAAO0O,aAAejP,EAAOuQ,aAAc,EAAGvQ,EAAOO,OAAO+Q,oBAAoB,GAAO,GAE7GtR,EAAOqM,QAAQrM,EAAOO,OAAO0O,aAAc,EAAGjP,EAAOO,OAAO+Q,oBAAoB,GAAO,GAIzFtR,EAAOib,eAEPjb,EAAO4X,aAAc,EAErB5X,EAAOgF,KAAK,QACZhF,EAAOgF,KAAK,cA7CkBhF,EAiDhC7S,QAAQ6zB,GAAiB,EAAMC,GAAc,GAC3C,MAAMjhB,EAAS5S,MACTmT,OACJA,EAAMwR,IACNA,EAAG9H,WACHA,EAAUmD,OACVA,GACEpN,EAEJ,YAA6B,IAAlBA,EAAOO,QAA0BP,EAAO0L,YAInD1L,EAAOgF,KAAK,iBAEZhF,EAAO4X,aAAc,EAErB5X,EAAOmb,eAEH5a,EAAOiF,MACTxF,EAAO4a,cAILqG,IACFjhB,EAAO2d,gBACP5L,EAAIvZ,WAAW,SACfyR,EAAWzR,WAAW,SAElB4U,GAAUA,EAAOplB,QACnBolB,EAAOrV,YAAY,CAACwI,EAAOwQ,kBAAmBxQ,EAAOsQ,iBAAkBtQ,EAAO0Q,eAAgB1Q,EAAO4Q,gBAAgB1S,KAAK,MAAMjG,WAAW,SAASA,WAAW,4BAInKwH,EAAOgF,KAAK,WAEZjf,OAAO+C,KAAKkX,EAAOqE,iBAAiBle,QAAQo5B,IAC1Cvf,EAAOhG,IAAIulB,MAGU,IAAnByB,IACFhhB,EAAO+R,IAAI,GAAG/R,OAAS,KhBhjB7B,SAAqBpM,GACnB,MAAMstB,EAASttB,EACf7N,OAAO+C,KAAKo4B,GAAQ/6B,QAAQqF,IAC1B,IACE01B,EAAO11B,GAAO,KACd,MAAO6B,IAGT,WACS6zB,EAAO11B,GACd,MAAO6B,OgBuiBP8zB,CAAYnhB,IAGdA,EAAO0L,WAAY,GAnCV,KAuCXve,sBAAsBi0B,GACpBptB,GAAO2qB,GAAkByC,GAG3BzC,8BACE,OAAOA,GAGTU,sBACE,OAAOA,GAGTlyB,qBAAqB8xB,GACdL,GAAO5nB,UAAUgoB,cAAaJ,GAAO5nB,UAAUgoB,YAAc,IAClE,MAAMD,EAAUH,GAAO5nB,UAAUgoB,YAEd,mBAARC,GAAsBF,EAAQpyB,QAAQsyB,GAAO,GACtDF,EAAQxwB,KAAK0wB,GAIjB9xB,WAAWk0B,GACT,OAAIxzB,MAAMiJ,QAAQuqB,IAChBA,EAAOl7B,QAAQ0L,GAAK+sB,GAAO0C,cAAczvB,IAClC+sB,KAGTA,GAAO0C,cAAcD,GACdzC,K6CrlBI,SAAS2C,GAA0BvhB,EAAQwb,EAAgBjb,EAAQihB,GAChF,MAAM16B,EAAWmO,KAmBjB,OAjBI+K,EAAOO,OAAO4O,gBAChBppB,OAAO+C,KAAK04B,GAAYr7B,QAAQqF,IAC9B,IAAK+U,EAAO/U,KAAwB,IAAhB+U,EAAOqR,KAAe,CACxC,IAAI5nB,EAAUgW,EAAO+R,IAAI3e,SAAS,IAAIouB,EAAWh2B,IAAQ,GAEpDxB,IACHA,EAAUlD,EAASC,cAAc,OACjCiD,EAAQkO,UAAYspB,EAAWh2B,GAC/BwU,EAAO+R,IAAI7oB,OAAOc,IAGpBuW,EAAO/U,GAAOxB,EACdwxB,EAAehwB,GAAOxB,KAKrBuW,WCnBekhB,IAAWzhB,OACjCA,EAAMkf,aACNA,EAAYrmB,GACZA,EAAEmM,KACFA,IAmBA,SAAS0c,EAAM7qB,GACb,IAAIkb,EAUJ,OARIlb,IACFkb,EAAM9a,GAAEJ,GAEJmJ,EAAOO,OAAO2P,mBAAmC,iBAAPrZ,GAAmBkb,EAAI/pB,OAAS,GAAoC,IAA/BgY,EAAO+R,IAAIvU,KAAK3G,GAAI7O,SACrG+pB,EAAM/R,EAAO+R,IAAIvU,KAAK3G,KAInBkb,EAGT,SAAS4P,EAAS5P,EAAK6P,GACrB,MAAMrhB,EAASP,EAAOO,OAAOiM,WAEzBuF,GAAOA,EAAI/pB,OAAS,IACtB+pB,EAAI6P,EAAW,WAAa,eAAerhB,EAAOshB,eAC9C9P,EAAI,IAAyB,WAAnBA,EAAI,GAAG+P,UAAsB/P,EAAI,GAAG6P,SAAWA,GAEzD5hB,EAAOO,OAAOiN,eAAiBxN,EAAOoF,SACxC2M,EAAI/R,EAAO8a,SAAW,WAAa,eAAeva,EAAOwhB,YAK/D,SAAS5xB,IAEP,GAAI6P,EAAOO,OAAOiF,KAAM,OACxB,MAAMwc,QACJA,EAAOC,QACPA,GACEjiB,EAAOwM,WACXmV,EAASM,EAASjiB,EAAOkN,aACzByU,EAASK,EAAShiB,EAAOiN,OAG3B,SAASiV,EAAY70B,GACnBA,EAAEsa,iBACE3H,EAAOkN,cAAgBlN,EAAOO,OAAOiF,MACzCxF,EAAO0Z,YAGT,SAASyI,EAAY90B,GACnBA,EAAEsa,iBACE3H,EAAOiN,QAAUjN,EAAOO,OAAOiF,MACnCxF,EAAOsZ,YAGT,SAASpnB,IACP,MAAMqO,EAASP,EAAOO,OAAOiM,WAK7B,GAJAxM,EAAOO,OAAOiM,WAAa+U,GAA0BvhB,EAAQA,EAAOwb,eAAehP,WAAYxM,EAAOO,OAAOiM,WAAY,CACvHC,OAAQ,qBACRC,OAAQ,wBAEJnM,EAAOkM,SAAUlM,EAAOmM,OAAS,OACvC,MAAMsV,EAAUN,EAAMnhB,EAAOkM,QACvBwV,EAAUP,EAAMnhB,EAAOmM,QAEzBsV,GAAWA,EAAQh6B,OAAS,GAC9Bg6B,EAAQnpB,GAAG,QAASspB,GAGlBF,GAAWA,EAAQj6B,OAAS,GAC9Bi6B,EAAQppB,GAAG,QAASqpB,GAGtBn8B,OAAOP,OAAOwa,EAAOwM,WAAY,CAC/BwV,QAAAA,EACAvV,OAAQuV,GAAWA,EAAQ,GAC3BC,QAAAA,EACAvV,OAAQuV,GAAWA,EAAQ,KAGxBjiB,EAAOoF,UACN4c,GAASA,EAAQrqB,SAAS4I,EAAOwhB,WACjCE,GAASA,EAAQtqB,SAAS4I,EAAOwhB,YAIzC,SAASK,IACP,MAAMJ,QACJA,EAAOC,QACPA,GACEjiB,EAAOwM,WAEPwV,GAAWA,EAAQh6B,SACrBg6B,EAAQhoB,IAAI,QAASmoB,GACrBH,EAAQjqB,YAAYiI,EAAOO,OAAOiM,WAAWqV,gBAG3CI,GAAWA,EAAQj6B,SACrBi6B,EAAQjoB,IAAI,QAASkoB,GACrBD,EAAQlqB,YAAYiI,EAAOO,OAAOiM,WAAWqV,gBA/GjD3C,EAAa,CACX1S,WAAY,CACVC,OAAQ,KACRC,OAAQ,KACR2V,aAAa,EACbR,cAAe,yBACfS,YAAa,uBACbP,UAAW,wBAGf/hB,EAAOwM,WAAa,CAClBC,OAAQ,KACRuV,QAAS,KACTtV,OAAQ,KACRuV,QAAS,MAqGXppB,EAAG,OAAQ,KACT3G,IACA/B,MAEF0I,EAAG,8BAA+B,KAChC1I,MAEF0I,EAAG,UAAW,KACZupB,MAEFvpB,EAAG,iBAAkB,KACnB,MAAMmpB,QACJA,EAAOC,QACPA,GACEjiB,EAAOwM,WAEPwV,GACFA,EAAQhiB,EAAOoF,QAAU,cAAgB,YAAYpF,EAAOO,OAAOiM,WAAWuV,WAG5EE,GACFA,EAAQjiB,EAAOoF,QAAU,cAAgB,YAAYpF,EAAOO,OAAOiM,WAAWuV,aAGlFlpB,EAAG,QAAS,CAAC0pB,EAAIl1B,KACf,MAAM20B,QACJA,EAAOC,QACPA,GACEjiB,EAAOwM,WACLgW,EAAWn1B,EAAElE,OAEnB,GAAI6W,EAAOO,OAAOiM,WAAW6V,cAAgBprB,GAAEurB,GAAUjpB,GAAG0oB,KAAahrB,GAAEurB,GAAUjpB,GAAGyoB,GAAU,CAChG,GAAIhiB,EAAOyiB,YAAcziB,EAAOO,OAAOkiB,YAAcziB,EAAOO,OAAOkiB,WAAWC,YAAc1iB,EAAOyiB,WAAW5rB,KAAO2rB,GAAYxiB,EAAOyiB,WAAW5rB,GAAGsB,SAASqqB,IAAY,OAC3K,IAAIG,EAEAX,EACFW,EAAWX,EAAQ/pB,SAAS+H,EAAOO,OAAOiM,WAAW8V,aAC5CL,IACTU,EAAWV,EAAQhqB,SAAS+H,EAAOO,OAAOiM,WAAW8V,cAIrDtd,GADe,IAAb2d,EACG,iBAEA,kBAGHX,GACFA,EAAQ5pB,YAAY4H,EAAOO,OAAOiM,WAAW8V,aAG3CL,GACFA,EAAQ7pB,YAAY4H,EAAOO,OAAOiM,WAAW8V,gBAInDv8B,OAAOP,OAAOwa,EAAOwM,WAAY,CAC/Brc,OAAAA,EACA+B,KAAAA,EACAkwB,QAAAA,ICtLW,SAASQ,GAAkBhrB,EAAU,IAClD,MAAO,IAAIA,EAAQT,OAAOqH,QAAQ,cAAe,QAChDA,QAAQ,KAAM,cCCOqkB,IAAW7iB,OACjCA,EAAMkf,aACNA,EAAYrmB,GACZA,EAAEmM,KACFA,IAEA,MAAM8d,EAAM,oBAqCZ,IAAIC,EApCJ7D,EAAa,CACXuD,WAAY,CACV5rB,GAAI,KACJmsB,cAAe,OACfN,WAAW,EACXL,aAAa,EACbY,aAAc,KACdC,kBAAmB,KACnBC,eAAgB,KAChBC,aAAc,KACdC,qBAAqB,EACrBx0B,KAAM,UAENy0B,gBAAgB,EAChBC,mBAAoB,EACpBC,sBAAuBC,GAAUA,EACjCC,oBAAqBD,GAAUA,EAC/BE,YAAgBb,EAAH,UACbc,kBAAsBd,EAAH,iBACnBe,cAAkBf,EAAH,IACfgB,aAAiBhB,EAAH,WACdiB,WAAejB,EAAH,SACZR,YAAgBQ,EAAH,UACbkB,qBAAyBlB,EAAH,oBACtBmB,yBAA6BnB,EAAH,wBAC1BoB,eAAmBpB,EAAH,aAChBf,UAAce,EAAH,QACXqB,gBAAoBrB,EAAH,cACjBsB,cAAkBtB,EAAH,eAGnB9iB,EAAOyiB,WAAa,CAClB5rB,GAAI,KACJkb,IAAK,KACLsS,QAAS,IAGX,IAAIC,EAAqB,EAEzB,SAASC,IACP,OAAQvkB,EAAOO,OAAOkiB,WAAW5rB,KAAOmJ,EAAOyiB,WAAW5rB,KAAOmJ,EAAOyiB,WAAW1Q,KAAwC,IAAjC/R,EAAOyiB,WAAW1Q,IAAI/pB,OAGlH,SAASw8B,EAAeC,EAAWC,GACjC,MAAMd,kBACJA,GACE5jB,EAAOO,OAAOkiB,WAClBgC,EAAUC,KAAY/sB,SAAS,GAAGisB,KAAqBc,KAAYA,KAAY/sB,SAAS,GAAGisB,KAAqBc,KAAYA,KAG9H,SAASv0B,IAEP,MAAM0Y,EAAM7I,EAAO6I,IACbtI,EAASP,EAAOO,OAAOkiB,WAC7B,GAAI8B,IAAwB,OAC5B,MAAMjR,EAAetT,EAAOoT,SAAWpT,EAAOO,OAAO6S,QAAQhO,QAAUpF,EAAOoT,QAAQhG,OAAOplB,OAASgY,EAAOoN,OAAOplB,OAC9G+pB,EAAM/R,EAAOyiB,WAAW1Q,IAE9B,IAAIhR,EACJ,MAAM4jB,EAAQ3kB,EAAOO,OAAOiF,KAAO1d,KAAKquB,MAAM7C,EAAqC,EAAtBtT,EAAOuQ,cAAoBvQ,EAAOO,OAAOyL,gBAAkBhM,EAAO8M,SAAS9kB,OAkBxI,GAhBIgY,EAAOO,OAAOiF,MAChBzE,EAAUjZ,KAAKquB,MAAMnW,EAAO8E,YAAc9E,EAAOuQ,cAAgBvQ,EAAOO,OAAOyL,gBAE3EjL,EAAUuS,EAAe,EAA0B,EAAtBtT,EAAOuQ,eACtCxP,GAAWuS,EAAqC,EAAtBtT,EAAOuQ,cAG/BxP,EAAU4jB,EAAQ,IAAG5jB,GAAW4jB,GAChC5jB,EAAU,GAAsC,YAAjCf,EAAOO,OAAOqkB,iBAA8B7jB,EAAU4jB,EAAQ5jB,IAEjFA,OADqC,IAArBf,EAAOyV,UACbzV,EAAOyV,UAEPzV,EAAO8E,aAAe,EAId,YAAhBvE,EAAO1R,MAAsBmR,EAAOyiB,WAAW4B,SAAWrkB,EAAOyiB,WAAW4B,QAAQr8B,OAAS,EAAG,CAClG,MAAMq8B,EAAUrkB,EAAOyiB,WAAW4B,QAClC,IAAIQ,EACAC,EACAC,EAuBJ,GArBIxkB,EAAO+iB,iBACTP,EAAasB,EAAQ9nB,GAAG,GAAGyD,EAAOyJ,eAAiB,aAAe,gBAAe,GACjFsI,EAAIlW,IAAImE,EAAOyJ,eAAiB,QAAU,SAAasZ,GAAcxiB,EAAOgjB,mBAAqB,GAA7C,MAEhDhjB,EAAOgjB,mBAAqB,QAA8B57B,IAAzBqY,EAAO+E,gBAC1Cuf,GAAsBvjB,EAAUf,EAAO+E,cAEnCuf,EAAqB/jB,EAAOgjB,mBAAqB,EACnDe,EAAqB/jB,EAAOgjB,mBAAqB,EACxCe,EAAqB,IAC9BA,EAAqB,IAIzBO,EAAa9jB,EAAUujB,EACvBQ,EAAYD,GAAc/8B,KAAKqZ,IAAIkjB,EAAQr8B,OAAQuY,EAAOgjB,oBAAsB,GAChFwB,GAAYD,EAAYD,GAAc,GAGxCR,EAAQtsB,YAAY,CAAC,GAAI,QAAS,aAAc,QAAS,aAAc,SAAShG,IAAIizB,GAAU,GAAGzkB,EAAOqjB,oBAAoBoB,KAAUvmB,KAAK,MAEvIsT,EAAI/pB,OAAS,EACfq8B,EAAQtoB,KAAKkpB,IACX,MAAMC,EAAUjuB,GAAEguB,GACZE,EAAcD,EAAQzxB,QAExB0xB,IAAgBpkB,GAClBmkB,EAAQvtB,SAAS4I,EAAOqjB,mBAGtBrjB,EAAO+iB,iBACL6B,GAAeN,GAAcM,GAAeL,GAC9CI,EAAQvtB,SAAY4I,EAAOqjB,kBAAV,SAGfuB,IAAgBN,GAClBL,EAAeU,EAAS,QAGtBC,IAAgBL,GAClBN,EAAeU,EAAS,eAIzB,CACL,MAAMA,EAAUb,EAAQ9nB,GAAGwE,GACrBokB,EAAcD,EAAQzxB,QAG5B,GAFAyxB,EAAQvtB,SAAS4I,EAAOqjB,mBAEpBrjB,EAAO+iB,eAAgB,CACzB,MAAM8B,EAAwBf,EAAQ9nB,GAAGsoB,GACnCQ,EAAuBhB,EAAQ9nB,GAAGuoB,GAExC,IAAK,IAAI78B,EAAI48B,EAAY58B,GAAK68B,EAAW78B,GAAK,EAC5Co8B,EAAQ9nB,GAAGtU,GAAG0P,SAAY4I,EAAOqjB,kBAAV,SAGzB,GAAI5jB,EAAOO,OAAOiF,KAChB,GAAI2f,GAAed,EAAQr8B,OAASuY,EAAOgjB,mBAAoB,CAC7D,IAAK,IAAIt7B,EAAIsY,EAAOgjB,mBAAoBt7B,GAAK,EAAGA,GAAK,EACnDo8B,EAAQ9nB,GAAG8nB,EAAQr8B,OAASC,GAAG0P,SAAY4I,EAAOqjB,kBAAV,SAG1CS,EAAQ9nB,GAAG8nB,EAAQr8B,OAASuY,EAAOgjB,mBAAqB,GAAG5rB,SAAY4I,EAAOqjB,kBAAV,cAEpEY,EAAeY,EAAuB,QACtCZ,EAAea,EAAsB,aAGvCb,EAAeY,EAAuB,QACtCZ,EAAea,EAAsB,SAK3C,GAAI9kB,EAAO+iB,eAAgB,CACzB,MAAMgC,EAAuBx9B,KAAKqZ,IAAIkjB,EAAQr8B,OAAQuY,EAAOgjB,mBAAqB,GAC5EgC,GAAiBxC,EAAauC,EAAuBvC,GAAc,EAAIgC,EAAWhC,EAClFyC,EAAa3c,EAAM,QAAU,OACnCwb,EAAQxoB,IAAImE,EAAOyJ,eAAiB+b,EAAa,MAAUD,EAAH,OAS5D,GALoB,aAAhBhlB,EAAO1R,OACTkjB,EAAIvU,KAAKolB,GAAkBriB,EAAOujB,eAAe55B,KAAKqW,EAAOijB,sBAAsBziB,EAAU,IAC7FgR,EAAIvU,KAAKolB,GAAkBriB,EAAOwjB,aAAa75B,KAAKqW,EAAOmjB,oBAAoBiB,KAG7D,gBAAhBpkB,EAAO1R,KAAwB,CACjC,IAAI42B,EAGFA,EADEllB,EAAO8iB,oBACcrjB,EAAOyJ,eAAiB,WAAa,aAErCzJ,EAAOyJ,eAAiB,aAAe,WAGhE,MAAMic,GAAS3kB,EAAU,GAAK4jB,EAC9B,IAAIgB,EAAS,EACTC,EAAS,EAEgB,eAAzBH,EACFE,EAASD,EAETE,EAASF,EAGX3T,EAAIvU,KAAKolB,GAAkBriB,EAAOyjB,uBAAuBvrB,UAAU,6BAA6BktB,aAAkBC,MAAWltB,WAAWsH,EAAOO,OAAOC,OAGpI,WAAhBD,EAAO1R,MAAqB0R,EAAO6iB,cACrCrR,EAAIxkB,KAAKgT,EAAO6iB,aAAapjB,EAAQe,EAAU,EAAG4jB,IAClD3f,EAAK,mBAAoB+M,EAAI,KAE7B/M,EAAK,mBAAoB+M,EAAI,IAG3B/R,EAAOO,OAAOiN,eAAiBxN,EAAOoF,SACxC2M,EAAI/R,EAAO8a,SAAW,WAAa,eAAeva,EAAOwhB,WAI7D,SAAS8D,IAEP,MAAMtlB,EAASP,EAAOO,OAAOkiB,WAC7B,GAAI8B,IAAwB,OAC5B,MAAMjR,EAAetT,EAAOoT,SAAWpT,EAAOO,OAAO6S,QAAQhO,QAAUpF,EAAOoT,QAAQhG,OAAOplB,OAASgY,EAAOoN,OAAOplB,OAC9G+pB,EAAM/R,EAAOyiB,WAAW1Q,IAC9B,IAAI+T,EAAiB,GAErB,GAAoB,YAAhBvlB,EAAO1R,KAAoB,CAC7B,IAAIk3B,EAAkB/lB,EAAOO,OAAOiF,KAAO1d,KAAKquB,MAAM7C,EAAqC,EAAtBtT,EAAOuQ,cAAoBvQ,EAAOO,OAAOyL,gBAAkBhM,EAAO8M,SAAS9kB,OAE5IgY,EAAOO,OAAOuK,UAAY9K,EAAOO,OAAOuK,SAAS1F,UAAYpF,EAAOO,OAAOiF,MAAQugB,EAAkBzS,IACvGyS,EAAkBzS,GAGpB,IAAK,IAAIrrB,EAAI,EAAGA,EAAI89B,EAAiB99B,GAAK,EACpCsY,EAAO0iB,aACT6C,GAAkBvlB,EAAO0iB,aAAa7zB,KAAK4Q,EAAQ/X,EAAGsY,EAAOojB,aAE7DmC,GAAkB,IAAIvlB,EAAOyiB,wBAAwBziB,EAAOojB,kBAAkBpjB,EAAOyiB,iBAIzFjR,EAAIxkB,KAAKu4B,GACT9lB,EAAOyiB,WAAW4B,QAAUtS,EAAIvU,KAAKolB,GAAkBriB,EAAOojB,cAG5C,aAAhBpjB,EAAO1R,OAEPi3B,EADEvlB,EAAO4iB,eACQ5iB,EAAO4iB,eAAe/zB,KAAK4Q,EAAQO,EAAOujB,aAAcvjB,EAAOwjB,YAE/D,gBAAgBxjB,EAAOujB,wCAAkDvjB,EAAOwjB,sBAGnGhS,EAAIxkB,KAAKu4B,IAGS,gBAAhBvlB,EAAO1R,OAEPi3B,EADEvlB,EAAO2iB,kBACQ3iB,EAAO2iB,kBAAkB9zB,KAAK4Q,EAAQO,EAAOyjB,sBAE7C,gBAAgBzjB,EAAOyjB,gCAG1CjS,EAAIxkB,KAAKu4B,IAGS,WAAhBvlB,EAAO1R,MACTmW,EAAK,mBAAoBhF,EAAOyiB,WAAW1Q,IAAI,IAInD,SAAS7f,IACP8N,EAAOO,OAAOkiB,WAAalB,GAA0BvhB,EAAQA,EAAOwb,eAAeiH,WAAYziB,EAAOO,OAAOkiB,WAAY,CACvH5rB,GAAI,sBAEN,MAAM0J,EAASP,EAAOO,OAAOkiB,WAC7B,IAAKliB,EAAO1J,GAAI,OAChB,IAAIkb,EAAM9a,GAAEsJ,EAAO1J,IACA,IAAfkb,EAAI/pB,SAEJgY,EAAOO,OAAO2P,mBAA0C,iBAAd3P,EAAO1J,IAAmBkb,EAAI/pB,OAAS,IACnF+pB,EAAM/R,EAAO+R,IAAIvU,KAAK+C,EAAO1J,IAEzBkb,EAAI/pB,OAAS,IACf+pB,EAAMA,EAAI/f,OAAO6E,GACXI,GAAEJ,GAAI4C,QAAQ,WAAW,KAAOuG,EAAOnJ,MAM7B,YAAhB0J,EAAO1R,MAAsB0R,EAAOmiB,WACtC3Q,EAAIpa,SAAS4I,EAAO2jB,gBAGtBnS,EAAIpa,SAAS4I,EAAOsjB,cAAgBtjB,EAAO1R,MAC3CkjB,EAAIpa,SAAS4I,EAAOsjB,cAAgB7jB,EAAOO,OAAOqE,WAE9B,YAAhBrE,EAAO1R,MAAsB0R,EAAO+iB,iBACtCvR,EAAIpa,SAAS,GAAG4I,EAAOsjB,gBAAgBtjB,EAAO1R,gBAC9Cy1B,EAAqB,EAEjB/jB,EAAOgjB,mBAAqB,IAC9BhjB,EAAOgjB,mBAAqB,IAIZ,gBAAhBhjB,EAAO1R,MAA0B0R,EAAO8iB,qBAC1CtR,EAAIpa,SAAS4I,EAAO0jB,0BAGlB1jB,EAAOmiB,WACT3Q,EAAIlZ,GAAG,QAAS+pB,GAAkBriB,EAAOojB,cAAc,SAAiBt2B,GACtEA,EAAEsa,iBACF,IAAIlU,EAAQwD,GAAE7J,MAAMqG,QAAUuM,EAAOO,OAAOyL,eACxChM,EAAOO,OAAOiF,OAAM/R,GAASuM,EAAOuQ,cACxCvQ,EAAOqM,QAAQ5Y,MAInB1N,OAAOP,OAAOwa,EAAOyiB,WAAY,CAC/B1Q,IAAAA,EACAlb,GAAIkb,EAAI,KAGL/R,EAAOoF,SACV2M,EAAIpa,SAAS4I,EAAOwhB,YAIxB,SAASK,IACP,MAAM7hB,EAASP,EAAOO,OAAOkiB,WAC7B,GAAI8B,IAAwB,OAC5B,MAAMxS,EAAM/R,EAAOyiB,WAAW1Q,IAC9BA,EAAIha,YAAYwI,EAAO+hB,aACvBvQ,EAAIha,YAAYwI,EAAOsjB,cAAgBtjB,EAAO1R,MAC9CkjB,EAAIha,YAAYwI,EAAOsjB,cAAgB7jB,EAAOO,OAAOqE,WACjD5E,EAAOyiB,WAAW4B,SAAWrkB,EAAOyiB,WAAW4B,QAAQtsB,aAAaiI,EAAOyiB,WAAW4B,QAAQtsB,YAAYwI,EAAOqjB,mBAEjHrjB,EAAOmiB,WACT3Q,EAAI/X,IAAI,QAAS4oB,GAAkBriB,EAAOojB,cAI9C9qB,EAAG,OAAQ,KACT3G,IACA2zB,IACA11B,MAEF0I,EAAG,oBAAqB,MAClBmH,EAAOO,OAAOiF,WAEqB,IAArBxF,EAAOyV,YADvBtlB,MAKJ0I,EAAG,kBAAmB,KACfmH,EAAOO,OAAOiF,MACjBrV,MAGJ0I,EAAG,qBAAsB,KACnBmH,EAAOO,OAAOiF,OAChBqgB,IACA11B,OAGJ0I,EAAG,uBAAwB,KACpBmH,EAAOO,OAAOiF,OACjBqgB,IACA11B,OAGJ0I,EAAG,UAAW,KACZupB,MAEFvpB,EAAG,iBAAkB,KACnB,MAAMkZ,IACJA,GACE/R,EAAOyiB,WAEP1Q,GACFA,EAAI/R,EAAOoF,QAAU,cAAgB,YAAYpF,EAAOO,OAAOkiB,WAAWV,aAG9ElpB,EAAG,cAAe,KAChB1I,MAEF0I,EAAG,QAAS,CAAC0pB,EAAIl1B,KACf,MAAMm1B,EAAWn1B,EAAElE,QACb4oB,IACJA,GACE/R,EAAOyiB,WAEX,GAAIziB,EAAOO,OAAOkiB,WAAW5rB,IAAMmJ,EAAOO,OAAOkiB,WAAWJ,aAAetQ,EAAI/pB,OAAS,IAAMiP,GAAEurB,GAAUvqB,SAAS+H,EAAOO,OAAOkiB,WAAWkB,aAAc,CACxJ,GAAI3jB,EAAOwM,aAAexM,EAAOwM,WAAWC,QAAU+V,IAAaxiB,EAAOwM,WAAWC,QAAUzM,EAAOwM,WAAWE,QAAU8V,IAAaxiB,EAAOwM,WAAWE,QAAS,OACnK,MAAMiW,EAAW5Q,EAAI9Z,SAAS+H,EAAOO,OAAOkiB,WAAWH,aAGrDtd,GADe,IAAb2d,EACG,iBAEA,kBAGP5Q,EAAI3Z,YAAY4H,EAAOO,OAAOkiB,WAAWH,gBAG7Cv8B,OAAOP,OAAOwa,EAAOyiB,WAAY,CAC/BoD,OAAAA,EACA11B,OAAAA,EACA+B,KAAAA,EACAkwB,QAAAA,aCnZoB4D,IAAUhmB,OAChCA,EAAMkf,aACNA,EAAYrmB,GACZA,EAAEmM,KACFA,IAEA,MAAMle,EAAWmO,KACjB,IAGIgxB,EACAC,EACAC,EACAC,EANApgB,GAAY,EACZqgB,EAAU,KACVC,EAAc,KAuBlB,SAASnb,IACP,IAAKnL,EAAOO,OAAOgmB,UAAU1vB,KAAOmJ,EAAOumB,UAAU1vB,GAAI,OACzD,MAAM0vB,UACJA,EACA3d,aAAcC,EAAG3H,SACjBA,GACElB,GACEwmB,QACJA,EAAOzU,IACPA,GACEwU,EACEhmB,EAASP,EAAOO,OAAOgmB,UAC7B,IAAIE,EAAUP,EACVQ,GAAUP,EAAYD,GAAYhlB,EAElC2H,GACF6d,GAAUA,EAENA,EAAS,GACXD,EAAUP,EAAWQ,EACrBA,EAAS,IACCA,EAASR,EAAWC,IAC9BM,EAAUN,EAAYO,IAEfA,EAAS,GAClBD,EAAUP,EAAWQ,EACrBA,EAAS,GACAA,EAASR,EAAWC,IAC7BM,EAAUN,EAAYO,GAGpB1mB,EAAOyJ,gBACT+c,EAAQ/tB,UAAU,eAAeiuB,cACjCF,EAAQ,GAAG/6B,MAAMsX,MAAW0jB,EAAH,OAEzBD,EAAQ/tB,UAAU,oBAAoBiuB,WACtCF,EAAQ,GAAG/6B,MAAMwX,OAAYwjB,EAAH,MAGxBlmB,EAAOomB,OACT5wB,aAAaswB,GACbtU,EAAI,GAAGtmB,MAAMm7B,QAAU,EACvBP,EAAUxwB,WAAW,KACnBkc,EAAI,GAAGtmB,MAAMm7B,QAAU,EACvB7U,EAAIrZ,WAAW,MACd,MASP,SAASsP,IACP,IAAKhI,EAAOO,OAAOgmB,UAAU1vB,KAAOmJ,EAAOumB,UAAU1vB,GAAI,OACzD,MAAM0vB,UACJA,GACEvmB,GACEwmB,QACJA,EAAOzU,IACPA,GACEwU,EACJC,EAAQ,GAAG/6B,MAAMsX,MAAQ,GACzByjB,EAAQ,GAAG/6B,MAAMwX,OAAS,GAC1BkjB,EAAYnmB,EAAOyJ,eAAiBsI,EAAI,GAAGjX,YAAciX,EAAI,GAAG9W,aAChEmrB,EAAUpmB,EAAOqS,MAAQrS,EAAO6T,YAAc7T,EAAOO,OAAOqP,oBAAsB5P,EAAOO,OAAO4M,eAAiBnN,EAAO8M,SAAS,GAAK,IAGpIoZ,EADuC,SAArClmB,EAAOO,OAAOgmB,UAAUL,SACfC,EAAYC,EAEZlU,SAASlS,EAAOO,OAAOgmB,UAAUL,SAAU,IAGpDlmB,EAAOyJ,eACT+c,EAAQ,GAAG/6B,MAAMsX,MAAWmjB,EAAH,KAEzBM,EAAQ,GAAG/6B,MAAMwX,OAAYijB,EAAH,KAI1BnU,EAAI,GAAGtmB,MAAMo7B,QADXT,GAAW,EACU,OAEA,GAGrBpmB,EAAOO,OAAOgmB,UAAUI,OAC1B5U,EAAI,GAAGtmB,MAAMm7B,QAAU,GAGrB5mB,EAAOO,OAAOiN,eAAiBxN,EAAOoF,SACxCmhB,EAAUxU,IAAI/R,EAAO8a,SAAW,WAAa,eAAe9a,EAAOO,OAAOgmB,UAAUxE,WAIxF,SAAS+E,EAAmBz5B,GAC1B,OAAI2S,EAAOyJ,eACS,eAAXpc,EAAEwB,MAAoC,cAAXxB,EAAEwB,KAAuBxB,EAAE2Z,cAAc,GAAG+f,QAAU15B,EAAE05B,QAG1E,eAAX15B,EAAEwB,MAAoC,cAAXxB,EAAEwB,KAAuBxB,EAAE2Z,cAAc,GAAGggB,QAAU35B,EAAE25B,QAG5F,SAASC,EAAgB55B,GACvB,MAAMk5B,UACJA,EACA3d,aAAcC,GACZ7I,GACE+R,IACJA,GACEwU,EACJ,IAAIW,EACJA,GAAiBJ,EAAmBz5B,GAAK0kB,EAAI7W,SAAS8E,EAAOyJ,eAAiB,OAAS,QAA2B,OAAjBwc,EAAwBA,EAAeC,EAAW,KAAOC,EAAYD,GACtKgB,EAAgBp/B,KAAKC,IAAID,KAAKqZ,IAAI+lB,EAAe,GAAI,GAEjDre,IACFqe,EAAgB,EAAIA,GAGtB,MAAMxC,EAAW1kB,EAAOoJ,gBAAkBpJ,EAAOmJ,eAAiBnJ,EAAOoJ,gBAAkB8d,EAC3FlnB,EAAOkL,eAAewZ,GACtB1kB,EAAOmL,aAAauZ,GACpB1kB,EAAOgL,oBACPhL,EAAOiL,sBAGT,SAASkc,EAAY95B,GACnB,MAAMkT,EAASP,EAAOO,OAAOgmB,WACvBA,UACJA,EAAStc,WACTA,GACEjK,GACE+R,IACJA,EAAGyU,QACHA,GACED,EACJvgB,GAAY,EACZigB,EAAe54B,EAAElE,SAAWq9B,EAAQ,IAAMn5B,EAAElE,SAAWq9B,EAAUM,EAAmBz5B,GAAKA,EAAElE,OAAOiS,wBAAwB4E,EAAOyJ,eAAiB,OAAS,OAAS,KACpKpc,EAAEsa,iBACFta,EAAEyc,kBACFG,EAAWvR,WAAW,KACtB8tB,EAAQ9tB,WAAW,KACnBuuB,EAAgB55B,GAChB0I,aAAauwB,GACbvU,EAAIrZ,WAAW,GAEX6H,EAAOomB,MACT5U,EAAIlW,IAAI,UAAW,GAGjBmE,EAAOO,OAAOgF,SAChBvF,EAAOiK,WAAWpO,IAAI,mBAAoB,QAG5CmJ,EAAK,qBAAsB3X,GAG7B,SAAS+5B,EAAW/5B,GAClB,MAAMk5B,UACJA,EAAStc,WACTA,GACEjK,GACE+R,IACJA,EAAGyU,QACHA,GACED,EACCvgB,IACD3Y,EAAEsa,eAAgBta,EAAEsa,iBAAsBta,EAAEg6B,aAAc,EAC9DJ,EAAgB55B,GAChB4c,EAAWvR,WAAW,GACtBqZ,EAAIrZ,WAAW,GACf8tB,EAAQ9tB,WAAW,GACnBsM,EAAK,oBAAqB3X,IAG5B,SAASi6B,EAAUj6B,GACjB,MAAMkT,EAASP,EAAOO,OAAOgmB,WACvBA,UACJA,EAAStc,WACTA,GACEjK,GACE+R,IACJA,GACEwU,EACCvgB,IACLA,GAAY,EAERhG,EAAOO,OAAOgF,UAChBvF,EAAOiK,WAAWpO,IAAI,mBAAoB,IAC1CoO,EAAWvR,WAAW,KAGpB6H,EAAOomB,OACT5wB,aAAauwB,GACbA,EAAc3oB,GAAS,KACrBoU,EAAIlW,IAAI,UAAW,GACnBkW,EAAIrZ,WAAW,MACd,MAGLsM,EAAK,mBAAoB3X,GAErBkT,EAAOgnB,eACTvnB,EAAOka,kBAIX,SAASvgB,EAAOyK,GACd,MAAMmiB,UACJA,EAAS5G,iBACTA,EAAgBC,mBAChBA,EAAkBrf,OAClBA,EAAMmB,QACNA,GACE1B,EAEE7W,EADMo9B,EAAUxU,IACH,GACbyV,KAAiB9lB,EAAQQ,kBAAmB3B,EAAOiO,mBAAmB,CAC1EC,SAAS,EACTvV,SAAS,GAELgJ,KAAkBR,EAAQQ,kBAAmB3B,EAAOiO,mBAAmB,CAC3EC,SAAS,EACTvV,SAAS,GAEX,IAAK/P,EAAQ,OACb,MAAMs+B,EAAyB,OAAXrjB,EAAkB,mBAAqB,sBAEtD1C,EAAQM,OAKX7Y,EAAOs+B,GAAa9H,EAAiBpR,MAAO4Y,EAAaK,GACzDr+B,EAAOs+B,GAAa9H,EAAiBjR,KAAM0Y,EAAYI,GACvDr+B,EAAOs+B,GAAa9H,EAAiBhR,IAAK2Y,EAAWplB,KANrD/Y,EAAOs+B,GAAa7H,EAAmBrR,MAAO4Y,EAAaK,GAC3D1gC,EAAS2gC,GAAa7H,EAAmBlR,KAAM0Y,EAAYI,GAC3D1gC,EAAS2gC,GAAa7H,EAAmBjR,IAAK2Y,EAAWplB,IAkB7D,SAAShQ,IACP,MAAMq0B,UACJA,EACAxU,IAAK2V,GACH1nB,EACJA,EAAOO,OAAOgmB,UAAYhF,GAA0BvhB,EAAQA,EAAOwb,eAAe+K,UAAWvmB,EAAOO,OAAOgmB,UAAW,CACpH1vB,GAAI,qBAEN,MAAM0J,EAASP,EAAOO,OAAOgmB,UAC7B,IAAKhmB,EAAO1J,GAAI,OAChB,IAAIkb,EAAM9a,GAAEsJ,EAAO1J,IAEfmJ,EAAOO,OAAO2P,mBAA0C,iBAAd3P,EAAO1J,IAAmBkb,EAAI/pB,OAAS,GAA0C,IAArC0/B,EAAUlqB,KAAK+C,EAAO1J,IAAI7O,SAClH+pB,EAAM2V,EAAUlqB,KAAK+C,EAAO1J,KAG9B,IAAI2vB,EAAUzU,EAAIvU,KAAK,IAAIwC,EAAOO,OAAOgmB,UAAUoB,WAE5B,IAAnBnB,EAAQx+B,SACVw+B,EAAUvvB,GAAE,eAAe+I,EAAOO,OAAOgmB,UAAUoB,qBACnD5V,EAAI7oB,OAAOs9B,IAGbzgC,OAAOP,OAAO+gC,EAAW,CACvBxU,IAAAA,EACAlb,GAAIkb,EAAI,GACRyU,QAAAA,EACAoB,OAAQpB,EAAQ,KAGdjmB,EAAOsnB,WAvCN7nB,EAAOO,OAAOgmB,UAAU1vB,IAC7B8C,EAAO,MA0CHoY,GACFA,EAAI/R,EAAOoF,QAAU,cAAgB,YAAYpF,EAAOO,OAAOgmB,UAAUxE,WAI7E,SAASK,IA3CFpiB,EAAOO,OAAOgmB,UAAU1vB,IAC7B8C,EAAO,OAxQTulB,EAAa,CACXqH,UAAW,CACT1vB,GAAI,KACJqvB,SAAU,OACVS,MAAM,EACNkB,WAAW,EACXN,eAAe,EACfxF,UAAW,wBACX4F,UAAW,2BAGf3nB,EAAOumB,UAAY,CACjB1vB,GAAI,KACJ+wB,OAAQ,KACR7V,IAAK,KACLyU,QAAS,MAuSX3tB,EAAG,OAAQ,KACT3G,IACA8V,IACAmD,MAEFtS,EAAG,2CAA4C,KAC7CmP,MAEFnP,EAAG,eAAgB,KACjBsS,MAEFtS,EAAG,gBAAiB,CAAC0pB,EAAI5pB,MA9PzB,SAAuBA,GAChBqH,EAAOO,OAAOgmB,UAAU1vB,IAAOmJ,EAAOumB,UAAU1vB,IACrDmJ,EAAOumB,UAAUC,QAAQ9tB,WAAWC,GA6PpCqR,CAAcrR,KAEhBE,EAAG,iBAAkB,KACnB,MAAMkZ,IACJA,GACE/R,EAAOumB,UAEPxU,GACFA,EAAI/R,EAAOoF,QAAU,cAAgB,YAAYpF,EAAOO,OAAOgmB,UAAUxE,aAG7ElpB,EAAG,UAAW,KACZupB,MAEFr8B,OAAOP,OAAOwa,EAAOumB,UAAW,CAC9Bve,WAAAA,EACAmD,aAAAA,EACAjZ,KAAAA,EACAkwB,QAAAA,aCpWoB0F,IAAK9nB,OAC3BA,EAAMkf,aACNA,EAAYrmB,GACZA,IAEAqmB,EAAa,CACX6I,KAAM,CACJ3iB,SAAS,EACT4iB,kBAAmB,sBACnBC,iBAAkB,iBAClBC,iBAAkB,aAClBC,kBAAmB,0BACnBC,iBAAkB,yBAClBC,wBAAyB,wBACzBC,kBAAmB,+BACnBC,iBAAkB,KAClBC,gCAAiC,KACjCC,2BAA4B,KAC5BC,UAAW,WAGf,IAAIC,EAAa,KAEjB,SAASC,EAAOC,GACd,MAAMC,EAAeH,EACO,IAAxBG,EAAa9gC,SACjB8gC,EAAav7B,KAAK,IAClBu7B,EAAav7B,KAAKs7B,IASpB,SAASE,EAAgBhX,GACvBA,EAAIlnB,KAAK,WAAY,KAGvB,SAASm+B,EAAmBjX,GAC1BA,EAAIlnB,KAAK,WAAY,MAGvB,SAASo+B,EAAUlX,EAAKmX,GACtBnX,EAAIlnB,KAAK,OAAQq+B,GAGnB,SAASC,EAAqBpX,EAAKqX,GACjCrX,EAAIlnB,KAAK,uBAAwBu+B,GAOnC,SAASC,EAAWtX,EAAKiB,GACvBjB,EAAIlnB,KAAK,aAAcmoB,GAWzB,SAASsW,EAAUvX,GACjBA,EAAIlnB,KAAK,iBAAiB,GAG5B,SAAS0+B,EAASxX,GAChBA,EAAIlnB,KAAK,iBAAiB,GAG5B,SAAS2+B,EAAkBn8B,GACzB,GAAkB,KAAdA,EAAEo8B,SAAgC,KAAdp8B,EAAEo8B,QAAgB,OAC1C,MAAMlpB,EAASP,EAAOO,OAAOwnB,KACvBpiB,EAAY1O,GAAE5J,EAAElE,QAElB6W,EAAOwM,YAAcxM,EAAOwM,WAAWwV,SAAWrc,EAAUpM,GAAGyG,EAAOwM,WAAWwV,WAC7EhiB,EAAOiN,QAAUjN,EAAOO,OAAOiF,MACnCxF,EAAOsZ,YAGLtZ,EAAOiN,MACT2b,EAAOroB,EAAO6nB,kBAEdQ,EAAOroB,EAAO2nB,mBAIdloB,EAAOwM,YAAcxM,EAAOwM,WAAWyV,SAAWtc,EAAUpM,GAAGyG,EAAOwM,WAAWyV,WAC7EjiB,EAAOkN,cAAgBlN,EAAOO,OAAOiF,MACzCxF,EAAO0Z,YAGL1Z,EAAOkN,YACT0b,EAAOroB,EAAO4nB,mBAEdS,EAAOroB,EAAO0nB,mBAIdjoB,EAAOyiB,YAAc9c,EAAUpM,GAAGqpB,GAAkB5iB,EAAOO,OAAOkiB,WAAWkB,eAC/Ehe,EAAU,GAAG+jB,QAIjB,SAASC,IACP,GAAI3pB,EAAOO,OAAOiF,OAASxF,EAAOwM,WAAY,OAC9C,MAAMwV,QACJA,EAAOC,QACPA,GACEjiB,EAAOwM,WAEPyV,GAAWA,EAAQj6B,OAAS,IAC1BgY,EAAOkN,aACToc,EAAUrH,GACV+G,EAAmB/G,KAEnBsH,EAAStH,GACT8G,EAAgB9G,KAIhBD,GAAWA,EAAQh6B,OAAS,IAC1BgY,EAAOiN,OACTqc,EAAUtH,GACVgH,EAAmBhH,KAEnBuH,EAASvH,GACT+G,EAAgB/G,KAKtB,SAAS4H,IACP,OAAO5pB,EAAOyiB,YAAcziB,EAAOO,OAAOkiB,WAAWC,WAAa1iB,EAAOyiB,WAAW4B,SAAWrkB,EAAOyiB,WAAW4B,QAAQr8B,OAmB3H,MAAM6hC,EAAY,CAAC9X,EAAK+X,EAAWjB,KACjCE,EAAgBhX,GAEO,WAAnBA,EAAI,GAAG+P,UACTmH,EAAUlX,EAAK,UACfA,EAAIlZ,GAAG,UAAW2wB,IAGpBH,EAAWtX,EAAK8W,GAlHlB,SAAuB9W,EAAKgY,GAC1BhY,EAAIlnB,KAAK,gBAAiBk/B,GAkH1BC,CAAcjY,EAAK+X,IAGrB,SAAS53B,IACP,MAAMqO,EAASP,EAAOO,OAAOwnB,KAC7B/nB,EAAO+R,IAAI7oB,OAAOy/B,GAElB,MAAMsB,EAAejqB,EAAO+R,IAExBxR,EAAOioB,iCACTW,EAAqBc,EAAc1pB,EAAOioB,iCAGxCjoB,EAAOgoB,kBACTc,EAAWY,EAAc1pB,EAAOgoB,kBAIlC,MAAMte,EAAajK,EAAOiK,WACpB6f,EAAY7f,EAAWpf,KAAK,OAAS,kBA5J7C,SAAyBwnB,EAAO,IAG9B,MAAO,IAAI6X,OAAO7X,GAAM7T,QAAQ,KAFb,IAAM1W,KAAKqiC,MAAM,GAAKriC,KAAKsiC,UAAUtrB,SAAS,KA2JJurB,CAAgB,IACvEC,EAAOtqB,EAAOO,OAAO8M,UAAYrN,EAAOO,OAAO8M,SAASjI,QAAU,MAAQ,SA/HlF,IAAsBtP,EAAAA,EAgIAg0B,EAAZ7f,EA/HJpf,KAAK,KAAMiL,GAGjB,SAAmBic,EAAKuY,GACtBvY,EAAIlnB,KAAK,YAAay/B,GA4HtBC,CAAUtgB,EAAYqgB,GAElB/pB,EAAOkoB,4BACTU,EAAqBlyB,GAAE+I,EAAOoN,QAAS7M,EAAOkoB,4BAGhDQ,EAAUhyB,GAAE+I,EAAOoN,QAAS7M,EAAOmoB,WACnC,MAAMpV,EAAetT,EAAOO,OAAOiF,KAAOxF,EAAOoN,OAAOpb,OAAO6E,IAAOA,EAAG5J,UAAUkL,SAAS6H,EAAOO,OAAOyQ,sBAAsBhpB,OAASgY,EAAOoN,OAAOplB,OAQvJ,IAAIg6B,EACAC,EARJjiB,EAAOoN,OAAOrR,KAAK,CAACikB,EAASvsB,KAC3B,MAAM+2B,EAAWvzB,GAAE+oB,GACb7K,EAAanV,EAAOO,OAAOiF,KAAO0M,SAASsY,EAAS3/B,KAAK,2BAA4B,IAAM4I,EAEjG41B,EAAWmB,EADcjqB,EAAO+nB,kBAAkB9pB,QAAQ,gBAAiB2W,EAAa,GAAG3W,QAAQ,uBAAwB8U,MAOzHtT,EAAOwM,YAAcxM,EAAOwM,WAAWwV,UACzCA,EAAUhiB,EAAOwM,WAAWwV,SAG1BhiB,EAAOwM,YAAcxM,EAAOwM,WAAWyV,UACzCA,EAAUjiB,EAAOwM,WAAWyV,SAG1BD,GAAWA,EAAQh6B,QACrB6hC,EAAU7H,EAAS8H,EAAWvpB,EAAO2nB,kBAGnCjG,GAAWA,EAAQj6B,QACrB6hC,EAAU5H,EAAS6H,EAAWvpB,EAAO0nB,kBAInC2B,KACF5pB,EAAOyiB,WAAW1Q,IAAIlZ,GAAG,UAAW+pB,GAAkB5iB,EAAOO,OAAOkiB,WAAWkB,aAAc6F,GA+BjG3wB,EAAG,aAAc,KACf8vB,EAAa1xB,GAAE,gBAAgB+I,EAAOO,OAAOwnB,KAAKC,yEAEpDnvB,EAAG,YAAa,KACTmH,EAAOO,OAAOwnB,KAAK3iB,UACxBlT,IACAy3B,OAEF9wB,EAAG,SAAU,KACNmH,EAAOO,OAAOwnB,KAAK3iB,SACxBukB,MAEF9wB,EAAG,WAAY,KACRmH,EAAOO,OAAOwnB,KAAK3iB,SACxBukB,MAEF9wB,EAAG,mBAAoB,KAChBmH,EAAOO,OAAOwnB,KAAK3iB,SAnI1B,WACE,MAAM7E,EAASP,EAAOO,OAAOwnB,KAEzB6B,KACF5pB,EAAOyiB,WAAW4B,QAAQtoB,KAAK0uB,IAC7B,MAAMhG,EAAYxtB,GAAEwzB,GACpB1B,EAAgBtE,GAEXzkB,EAAOO,OAAOkiB,WAAWQ,eAC5BgG,EAAUxE,EAAW,UACrB4E,EAAW5E,EAAWlkB,EAAO8nB,wBAAwB7pB,QAAQ,gBAAiBimB,EAAUhxB,QAAU,OA0HxGi3B,KAEF7xB,EAAG,UAAW,KACPmH,EAAOO,OAAOwnB,KAAK3iB,SAhD1B,WAEE,IAAI4c,EACAC,EAFA0G,GAAcA,EAAW3gC,OAAS,GAAG2gC,EAAW3wB,SAIhDgI,EAAOwM,YAAcxM,EAAOwM,WAAWwV,UACzCA,EAAUhiB,EAAOwM,WAAWwV,SAG1BhiB,EAAOwM,YAAcxM,EAAOwM,WAAWyV,UACzCA,EAAUjiB,EAAOwM,WAAWyV,SAG1BD,GACFA,EAAQhoB,IAAI,UAAWwvB,GAGrBvH,GACFA,EAAQjoB,IAAI,UAAWwvB,GAIrBI,KACF5pB,EAAOyiB,WAAW1Q,IAAI/X,IAAI,UAAW4oB,GAAkB5iB,EAAOO,OAAOkiB,WAAWkB,aAAc6F,GA0BhGpH,KCnRW,SAASuI,IAAS3qB,OAC/BA,EAAMkf,aACNA,EAAYrmB,GACZA,EAAEmM,KACFA,IAEA,IAAIqhB,EAiBJ,SAASzgC,IACP,MAAMglC,EAAiB5qB,EAAOoN,OAAO7Q,GAAGyD,EAAO8E,aAC/C,IAAIlH,EAAQoC,EAAOO,OAAO8M,SAASzP,MAE/BgtB,EAAe//B,KAAK,0BACtB+S,EAAQgtB,EAAe//B,KAAK,yBAA2BmV,EAAOO,OAAO8M,SAASzP,OAGhF7H,aAAaswB,GACbA,EAAU1oB,GAAS,KACjB,IAAIktB,EAEA7qB,EAAOO,OAAO8M,SAASyd,iBACrB9qB,EAAOO,OAAOiF,MAChBxF,EAAOyF,UACPolB,EAAiB7qB,EAAO0Z,UAAU1Z,EAAOO,OAAOC,OAAO,GAAM,GAC7DwE,EAAK,aACKhF,EAAOkN,YAGPlN,EAAOO,OAAO8M,SAAS0d,gBAIjCC,KAHAH,EAAiB7qB,EAAOqM,QAAQrM,EAAOoN,OAAOplB,OAAS,EAAGgY,EAAOO,OAAOC,OAAO,GAAM,GACrFwE,EAAK,cAJL6lB,EAAiB7qB,EAAO0Z,UAAU1Z,EAAOO,OAAOC,OAAO,GAAM,GAC7DwE,EAAK,aAOEhF,EAAOO,OAAOiF,MACvBxF,EAAOyF,UACPolB,EAAiB7qB,EAAOsZ,UAAUtZ,EAAOO,OAAOC,OAAO,GAAM,GAC7DwE,EAAK,aACKhF,EAAOiN,MAGPjN,EAAOO,OAAO8M,SAAS0d,gBAIjCC,KAHAH,EAAiB7qB,EAAOqM,QAAQ,EAAGrM,EAAOO,OAAOC,OAAO,GAAM,GAC9DwE,EAAK,cAJL6lB,EAAiB7qB,EAAOsZ,UAAUtZ,EAAOO,OAAOC,OAAO,GAAM,GAC7DwE,EAAK,cAQHhF,EAAOO,OAAOgF,SAAWvF,EAAOqN,SAASC,UAA2C,IAAnBud,IAAfjlC,KAGrDgY,GAGL,SAAS2Q,IACP,YAAuB,IAAZ8X,KACPrmB,EAAOqN,SAASC,UACpBtN,EAAOqN,SAASC,SAAU,EAC1BtI,EAAK,iBACLpf,KACO,IAGT,SAASolC,IACP,QAAKhrB,EAAOqN,SAASC,eACE,IAAZ+Y,IAEPA,IACFtwB,aAAaswB,GACbA,OAAU1+B,GAGZqY,EAAOqN,SAASC,SAAU,EAC1BtI,EAAK,iBACE,IAGT,SAASimB,EAAMzqB,GACRR,EAAOqN,SAASC,UACjBtN,EAAOqN,SAASE,SAChB8Y,GAAStwB,aAAaswB,GAC1BrmB,EAAOqN,SAASE,QAAS,EAEX,IAAV/M,GAAgBR,EAAOO,OAAO8M,SAAS6d,kBAIzC,CAAC,gBAAiB,uBAAuB/kC,QAAQqE,IAC/CwV,EAAOiK,WAAW,GAAGtf,iBAAiBH,EAAO2gC,MAJ/CnrB,EAAOqN,SAASE,QAAS,EACzB3nB,OAQJ,SAASwlC,IACP,MAAMtkC,EAAWmO,KAEgB,WAA7BnO,EAASukC,iBAAgCrrB,EAAOqN,SAASC,SAC3D2d,IAG+B,YAA7BnkC,EAASukC,iBAAiCrrB,EAAOqN,SAASE,SAC5D3nB,IACAoa,EAAOqN,SAASE,QAAS,GAI7B,SAAS4d,EAAgB99B,GAClB2S,IAAUA,EAAO0L,WAAc1L,EAAOiK,YACvC5c,EAAElE,SAAW6W,EAAOiK,WAAW,KACnC,CAAC,gBAAiB,uBAAuB9jB,QAAQqE,IAC/CwV,EAAOiK,WAAW,GAAGrf,oBAAoBJ,EAAO2gC,KAElDnrB,EAAOqN,SAASE,QAAS,EAEpBvN,EAAOqN,SAASC,QAGnB1nB,IAFAolC,KAMJ,SAASM,IACHtrB,EAAOO,OAAO8M,SAASke,qBACzBP,IAEAC,IAGF,CAAC,gBAAiB,uBAAuB9kC,QAAQqE,IAC/CwV,EAAOiK,WAAW,GAAGrf,oBAAoBJ,EAAO2gC,KAIpD,SAASK,IACHxrB,EAAOO,OAAO8M,SAASke,uBAI3BvrB,EAAOqN,SAASE,QAAS,EACzB3nB,KAnJFoa,EAAOqN,SAAW,CAChBC,SAAS,EACTC,QAAQ,GAEV2R,EAAa,CACX7R,SAAU,CACRjI,SAAS,EACTxH,MAAO,IACPstB,mBAAmB,EACnBK,sBAAsB,EACtBR,iBAAiB,EACjBD,kBAAkB,EAClBW,mBAAmB,KAsJvB5yB,EAAG,OAAQ,KACT,GAAImH,EAAOO,OAAO8M,SAASjI,QAAS,CAClCmJ,IACiBtZ,KACRtK,iBAAiB,mBAAoBygC,GAf5CprB,EAAOO,OAAO8M,SAASoe,oBACzBzrB,EAAO+R,IAAIlZ,GAAG,aAAcyyB,GAC5BtrB,EAAO+R,IAAIlZ,GAAG,aAAc2yB,OAiBhC3yB,EAAG,wBAAyB,CAAC0pB,EAAI/hB,EAAO6X,KAClCrY,EAAOqN,SAASC,UACd+K,IAAarY,EAAOO,OAAO8M,SAASke,qBACtCvrB,EAAOqN,SAAS4d,MAAMzqB,GAEtBwqB,OAINnyB,EAAG,kBAAmB,KAChBmH,EAAOqN,SAASC,UACdtN,EAAOO,OAAO8M,SAASke,qBACzBP,IAEAC,OAINpyB,EAAG,WAAY,KACTmH,EAAOO,OAAOgF,SAAWvF,EAAOqN,SAASE,SAAWvN,EAAOO,OAAO8M,SAASke,sBAC7E3lC,MAGJiT,EAAG,UAAW,KAnCZmH,EAAO+R,IAAI/X,IAAI,aAAcsxB,GAC7BtrB,EAAO+R,IAAI/X,IAAI,aAAcwxB,GAqCzBxrB,EAAOqN,SAASC,SAClB0d,IAGe/1B,KACRrK,oBAAoB,mBAAoBwgC,KAEnDrlC,OAAOP,OAAOwa,EAAOqN,SAAU,CAC7B4d,MAAAA,EACArlC,IAAAA,EACA2oB,MAAAA,EACAyc,KAAAA,IC3NJ,SAASl3B,GAAS1C,GAChB,MAAoB,iBAANA,GAAwB,OAANA,GAAcA,EAAE2C,aAAkE,WAAnDhO,OAAOiR,UAAU8H,SAAS1P,KAAKgC,GAAG7J,MAAM,GAAI,GAG7G,SAASyM,GAAO7K,EAAQzD,GACtB,MAAMwZ,EAAW,CAAC,YAAa,cAAe,aAC9CnZ,OAAO+C,KAAKpD,GAAKsM,OAAOxG,GAAO0T,EAASvS,QAAQnB,GAAO,GAAGrF,QAAQqF,SACrC,IAAhBrC,EAAOqC,GAAsBrC,EAAOqC,GAAO9F,EAAI8F,GAAcsI,GAASpO,EAAI8F,KAASsI,GAAS3K,EAAOqC,KAASzF,OAAO+C,KAAKpD,EAAI8F,IAAMxD,OAAS,EAChJtC,EAAI8F,GAAKmU,WAAYxW,EAAOqC,GAAO9F,EAAI8F,GAAUwI,GAAO7K,EAAOqC,GAAM9F,EAAI8F,IAE7ErC,EAAOqC,GAAO9F,EAAI8F,KAKxB,SAASkgC,GAAgBnrB,EAAS,IAChC,OAAOA,EAAOiM,iBAAkD,IAA7BjM,EAAOiM,WAAWC,aAA8D,IAA7BlM,EAAOiM,WAAWE,OAG1G,SAASif,GAAgBprB,EAAS,IAChC,OAAOA,EAAOkiB,iBAA8C,IAAzBliB,EAAOkiB,WAAW5rB,GAGvD,SAAS+0B,GAAerrB,EAAS,IAC/B,OAAOA,EAAOgmB,gBAA4C,IAAxBhmB,EAAOgmB,UAAU1vB,GAGrD,SAASg1B,GAAch0B,EAAa,IAClC,MAAMD,EAAUC,EAAWC,MAAM,KAAK/F,IAAIpE,GAAKA,EAAEwJ,QAAQnF,OAAOrE,KAAOA,GACjEm+B,EAAS,GAIf,OAHAl0B,EAAQzR,QAAQwH,IACVm+B,EAAOn/B,QAAQgB,GAAK,GAAGm+B,EAAOv9B,KAAKZ,KAElCm+B,EAAOrtB,KAAK,KpD0jBrB1Y,OAAO+C,KAAK+oB,IAAY1rB,QAAQ4lC,IAC9BhmC,OAAO+C,KAAK+oB,GAAWka,IAAiB5lC,QAAQ6lC,IAC9CpN,GAAO5nB,UAAUg1B,GAAena,GAAWka,GAAgBC,OAG/DpN,GAAOqN,IAAI,CqD/lBI,UAAgBjsB,OAC7BA,EAAMnH,GACNA,EAAEmM,KACFA,IAEA,MAAM9O,EAASF,KACf,IAAIk2B,EAAW,KAEf,MAAMC,EAAgB,KACfnsB,IAAUA,EAAO0L,WAAc1L,EAAO4X,cAC3C5S,EAAK,gBACLA,EAAK,YAoCDonB,EAA2B,KAC1BpsB,IAAUA,EAAO0L,WAAc1L,EAAO4X,aAC3C5S,EAAK,sBAGPnM,EAAG,OAAQ,KACLmH,EAAOO,OAAO2O,qBAAmD,IAA1BhZ,EAAOm2B,eAtC7CrsB,IAAUA,EAAO0L,WAAc1L,EAAO4X,cAC3CsU,EAAW,IAAIG,eAAerP,IAC5B,MAAMja,MACJA,EAAKE,OACLA,GACEjD,EACJ,IAAIssB,EAAWvpB,EACXiT,EAAY/S,EAChB+Z,EAAQ72B,QAAQ,EACdomC,eAAAA,EACAC,YAAAA,EACArjC,OAAAA,MAEIA,GAAUA,IAAW6W,EAAOnJ,KAChCy1B,EAAWE,EAAcA,EAAYzpB,OAASwpB,EAAe,IAAMA,GAAgBE,WACnFzW,EAAYwW,EAAcA,EAAYvpB,QAAUspB,EAAe,IAAMA,GAAgBG,aAGnFJ,IAAavpB,GAASiT,IAAc/S,GACtCkpB,MAGJD,EAASS,QAAQ3sB,EAAOnJ,MAqBxBX,EAAOvL,iBAAiB,SAAUwhC,GAClCj2B,EAAOvL,iBAAiB,oBAAqByhC,MAE/CvzB,EAAG,UAAW,KApBRqzB,GAAYA,EAASU,WAAa5sB,EAAOnJ,KAC3Cq1B,EAASU,UAAU5sB,EAAOnJ,IAC1Bq1B,EAAW,MAoBbh2B,EAAOtL,oBAAoB,SAAUuhC,GACrCj2B,EAAOtL,oBAAoB,oBAAqBwhC,gBChEnBpsB,OAC/BA,EAAMkf,aACNA,EAAYrmB,GACZA,EAAEmM,KACFA,IAEA,MAAM6nB,EAAY,GACZ32B,EAASF,KAET82B,EAAS,CAAC3jC,EAAQuB,EAAU,MAChC,MACMwhC,EAAW,IADIh2B,EAAO62B,kBAAoB72B,EAAO82B,wBACrBC,IAIhC,GAAyB,IAArBA,EAAUjlC,OAEZ,YADAgd,EAAK,iBAAkBioB,EAAU,IAInC,MAAMC,EAAiB,WACrBloB,EAAK,iBAAkBioB,EAAU,KAG/B/2B,EAAON,sBACTM,EAAON,sBAAsBs3B,GAE7Bh3B,EAAOL,WAAWq3B,EAAgB,KAGtChB,EAASS,QAAQxjC,EAAQ,CACvBiC,gBAA0C,IAAvBV,EAAQU,YAAoCV,EAAQU,WACvE+hC,eAAwC,IAAtBziC,EAAQyiC,WAAmCziC,EAAQyiC,UACrEC,mBAAgD,IAA1B1iC,EAAQ0iC,eAAuC1iC,EAAQ0iC,gBAE/EP,EAAUt+B,KAAK29B,IA+BjBhN,EAAa,CACXgN,UAAU,EACVmB,gBAAgB,EAChBC,sBAAsB,IAExBz0B,EAAG,OAjCU,KACX,GAAKmH,EAAOO,OAAO2rB,SAAnB,CAEA,GAAIlsB,EAAOO,OAAO8sB,eAAgB,CAChC,MAAME,EAAmBvtB,EAAO+R,IAAItY,UAEpC,IAAK,IAAIxR,EAAI,EAAGA,EAAIslC,EAAiBvlC,OAAQC,GAAK,EAChD6kC,EAAOS,EAAiBtlC,IAK5B6kC,EAAO9sB,EAAO+R,IAAI,GAAI,CACpBob,UAAWntB,EAAOO,OAAO+sB,uBAG3BR,EAAO9sB,EAAOiK,WAAW,GAAI,CAC3B7e,YAAY,OAiBhByN,EAAG,UAba,KACdg0B,EAAU1mC,QAAQ+lC,IAChBA,EAASsB,eAEXX,EAAUn5B,OAAO,EAAGm5B,EAAU7kC,aC/DlC,MAAMylC,GAAa,CAAC,UAAW,OAAQ,aAAc,oBAAqB,eAAgB,SAAU,UAAW,uBAAwB,iBAAkB,SAAU,oBAAqB,WAAY,SAAU,UAAW,iCAAkC,YAAa,MAAO,sBAAuB,sBAAuB,YAAa,cAAe,iBAAkB,mBAAoB,UAAW,cAAe,gBAAiB,iBAAkB,QAAS,kBAAmB,sBAAuB,sBAAuB,kBAAmB,wBAAyB,sBAAuB,qBAAsB,sBAAuB,4BAA6B,iBAAkB,eAAgB,aAAc,aAAc,gBAAiB,eAAgB,cAAe,kBAAmB,eAAgB,gBAAiB,iBAAkB,aAAc,2BAA4B,2BAA4B,gCAAiC,sBAAuB,oBAAqB,cAAe,mBAAoB,uBAAwB,cAAe,gBAAiB,2BAA4B,uBAAwB,iBAAkB,sBAAuB,QAAS,wBAAyB,gBAAiB,0BAA2B,oBAAqB,kBAAmB,kBAAmB,gBAAiB,aAAc,iBAAkB,oBAAqB,mBAAoB,yBAA0B,aAAc,kBAAmB,mBAAoB,4BAA6B,oBAAqB,sBAAuB,iBAAkB,0BAA2B,iBAAkB,0BAA2B,eAAgB,qBAAsB,WAAY,iBAAkB,uBAC3qD,OAAQ,WAAY,cAAe,kBAAmB,aAAc,aAAc,aAAc,iBAAkB,cAAe,iBAAkB,UAAW,WAAY,OAAQ,aAAc,cAAe,cAAe,WAAY,aAAc,UAAW,WAAY,QCA/Q,SAASC,IAAa1tB,OACpBA,EAAMsf,aACNA,EAAYqO,cACZA,EAAalhB,OACbA,EAAMC,OACNA,EAAMkhB,YACNA,EAAWC,aACXA,IAEA,MAAMC,EAAeH,EAAc37B,OAAOxG,GAAe,aAARA,GAA8B,cAARA,IAErE+U,OAAQwtB,EAAatL,WACrBA,EAAUjW,WACVA,EAAU+Z,UACVA,EAASyH,OACTA,GACEhuB,EACJ,IAAIiuB,EACAC,EACAC,EACAC,EACAC,EAEAV,EAAcW,SAAS,WAAahP,EAAa0O,QAAU1O,EAAa0O,OAAOhuB,QAAU+tB,EAAcC,SAAWD,EAAcC,OAAOhuB,SACzIiuB,GAAiB,GAGfN,EAAcW,SAAS,eAAiBhP,EAAaiP,YAAcjP,EAAaiP,WAAWC,SAAWT,EAAcQ,aAAeR,EAAcQ,WAAWC,UAC9JN,GAAqB,GAGnBP,EAAcW,SAAS,eAAiBhP,EAAamD,aAAenD,EAAamD,WAAW5rB,IAAMg3B,KAAkBE,EAActL,aAA2C,IAA7BsL,EAActL,aAAyBA,IAAeA,EAAW5rB,KACnNs3B,GAAqB,GAGnBR,EAAcW,SAAS,cAAgBhP,EAAaiH,YAAcjH,EAAaiH,UAAU1vB,IAAM+2B,KAAiBG,EAAcxH,YAAyC,IAA5BwH,EAAcxH,YAAwBA,IAAcA,EAAU1vB,KAC3Mu3B,GAAoB,GAGlBT,EAAcW,SAAS,eAAiBhP,EAAa9S,aAAe8S,EAAa9S,WAAWE,QAAUA,KAAY4S,EAAa9S,WAAWC,QAAUA,KAAYshB,EAAcvhB,aAA2C,IAA7BuhB,EAAcvhB,aAAyBA,IAAeA,EAAWE,SAAWF,EAAWC,SACrR4hB,GAAqB,GAGnBV,EAAcW,SAAS,YACrBhP,EAAalM,SAAWkM,EAAalM,QAAQhG,QAAUpN,EAAOoT,UAChEpT,EAAOoT,QAAQhG,OAASkS,EAAalM,QAAQhG,OAC7CpN,EAAOoT,QAAQjjB,UAmCnB,GAhBA29B,EAAa3nC,QAAQqF,IACnB,GAAIsI,GAASi6B,EAAcviC,KAASsI,GAASwrB,EAAa9zB,IACxDwI,GAAO+5B,EAAcviC,GAAM8zB,EAAa9zB,QACnC,CACL,MAAMijC,EAAWnP,EAAa9zB,IAEZ,IAAbijC,IAAkC,IAAbA,GAAgC,eAARjjC,GAAgC,eAARA,GAAgC,cAARA,EAKhGuiC,EAAcviC,GAAO8zB,EAAa9zB,IAJjB,IAAbijC,GArBHzuB,EADeif,EAuBAzzB,KArBpBwU,EAAOif,GAAKmD,UAEA,eAARnD,GACF8O,EAAc9O,GAAKvS,YAAS/kB,EAC5BomC,EAAc9O,GAAKxS,YAAS9kB,EAC5BqY,EAAOif,GAAKvS,YAAS/kB,EACrBqY,EAAOif,GAAKxS,YAAS9kB,IAErBomC,EAAc9O,GAAKpoB,QAAKlP,EACxBqY,EAAOif,GAAKpoB,QAAKlP,IAXCs3B,IAAAA,IA+BlBgP,EAAgB,CACED,EAAO97B,QAGzB87B,EAAO79B,QAAO,GAId+9B,IACFluB,EAAOuuB,WAAWC,QAAUT,EAAcQ,WAAWC,SAGnDL,IACEN,IAAcE,EAActL,WAAW5rB,GAAKg3B,GAChDpL,EAAWvwB,OACXuwB,EAAWoD,SACXpD,EAAWtyB,UAGTi+B,IACER,IAAaG,EAAcxH,UAAU1vB,GAAK+2B,GAC9CrH,EAAUr0B,OACVq0B,EAAUve,aACVue,EAAUpb,gBAGRkjB,IACE5hB,IAAQshB,EAAcvhB,WAAWC,OAASA,GAC1CC,IAAQqhB,EAAcvhB,WAAWE,OAASA,GAC9CF,EAAWta,OACXsa,EAAWrc,UAGTw9B,EAAcW,SAAS,oBACzBtuB,EAAOoK,eAAiBkV,EAAalV,gBAGnCujB,EAAcW,SAAS,oBACzBtuB,EAAOqK,eAAiBiV,EAAajV,gBAGnCsjB,EAAcW,SAAS,cACzBtuB,EAAO+b,gBAAgBuD,EAAa1a,WAAW,GAGjD5E,EAAO7P,8aCkCL7G,2BACAA,iKAGAA,sIAGAA,6FARGoiC,GAAgBvkC,QAIhBykC,GAAezkC,QAGfwkC,GAAgBxkC,qRAXd0kC,MAAiB1kC,OAAmBA,SAAgBA,KAAc,OACrEA,mPAHNmC,iGAgBEJ,2LAVKwiC,GAAgBvkC,wEAIhBykC,GAAezkC,wEAGfwkC,GAAgBxkC,yWAXd0kC,MAAiB1kC,OAAmBA,SAAgBA,KAAc,wBACrEA,wTAzIEunC,EAAW9/B,QAUb+/B,EACAvP,EACAE,EACAsP,SAXA12B,KAGA22B,EAAmB,SACnBC,GAAoB,EACpBC,EAAiB,KACjBC,EAAkB,KAOlBC,EAAW,KACXviB,EAAS,KACTD,EAAS,KACTmhB,EAAc,KACdC,EAAe,KACfqB,GAAgB9hB,iBAMd+hB,EAAkBhlC,QACtB+kC,EAAc/kC,I7E27Bd0F,IACOJ,G6E17BAK,UACLi/B,EAAe9kB,WAAW7W,SAAS,iBAAiB2I,KAAMlF,IACpDA,EAAGu4B,UAAUv4B,EAAGu4B,SAASL,KAE/BA,EAAehiB,eACfgiB,EAAe7jB,iBACf6jB,EAAe9jB,sBACX8jB,EAAeM,MAAQN,EAAexuB,OAAO8uB,KAAKjqB,SACpD2pB,EAAeM,KAAKC,UAKpBC,OACJZ,EC5DJ,SAAmB/6B,EAAM,IACvB,MAAM2M,EAAS,CACb1H,GAAI,IAEAymB,EAAe,GACrBtrB,GAAOuM,EAAQqe,GAAOS,UACtBrrB,GAAOuM,EAAQqe,GAAOD,kBACtBpe,EAAOgR,cAAe,EACtBhR,EAAOrO,MAAO,EACd,MAAMnJ,EAAO,GACPymC,EAAgB/B,GAAW17B,IAAIvG,GAAOA,EAAIgT,QAAQ,IAAK,KAsB7D,OArBAzY,OAAO+C,KAAK8K,GAAKzN,QAAQqF,IACnBgkC,EAAc7iC,QAAQnB,IAAQ,EAC5BsI,GAASF,EAAIpI,KACf+U,EAAO/U,GAAO,GACd8zB,EAAa9zB,GAAO,GACpBwI,GAAOuM,EAAO/U,GAAMoI,EAAIpI,IACxBwI,GAAOsrB,EAAa9zB,GAAMoI,EAAIpI,MAE9B+U,EAAO/U,GAAOoI,EAAIpI,GAClB8zB,EAAa9zB,GAAOoI,EAAIpI,IAES,IAA1BA,EAAIwJ,OAAO,YAAwC,mBAAbpB,EAAIpI,GACnD+U,EAAO1H,GAAG,GAAGrN,EAAI,GAAGoY,gBAAgBpY,EAAIixB,OAAO,MAAQ7oB,EAAIpI,GAE3DzC,EAAKyC,GAAOoI,EAAIpI,KAGpB,CAAC,aAAc,aAAc,aAAarF,QAAQqF,KAC5B,IAAhB+U,EAAO/U,KAAe+U,EAAO/U,GAAO,KACpB,IAAhB+U,EAAO/U,WAAuB+U,EAAO/U,KAEpC,CACL+U,OAAAA,EACA+e,aAAAA,EACAv2B,KAAAA,GDyBa0mC,CAAUC,OACvBtQ,EAAeuP,EAAWpuB,QAC1B+e,EAAeqP,EAAWrP,iBAC1BsP,EAAYD,EAAW5lC,OAGzBwmC,IACAP,EAAkB1P,KAMlBF,EAAaI,OAASh1B,KAAUsO,KAC9B41B,EAASlkC,GAAQsO,KAEnB/S,OAAOP,OAAO45B,EAAavmB,IACzB82B,uBAPAb,GAAoB,GAQpB3hC,kBAAkByiC,EAASh4B,OACzBi3B,EAAmBj3B,MAIvBm3B,EEpFF,SAAoB3P,GAClB,OAAO,IAAIR,GAAOQ,GFmFDyQ,CAAWzQ,GACxB2P,EAAe3b,SAAW2b,EAAexuB,OAAO6S,QAAQhO,eACpD0qB,GACJC,OAAO,EACPC,eAAiB7lC,IACfglC,EAAehlC,GACXi1B,EAAahM,SAAWgM,EAAahM,QAAQ4c,gBAC/C5Q,EAAahM,QAAQ4c,eAAe7lC,IAGxC8lC,sBAAsB,GAExBj8B,GAAO+6B,EAAexuB,OAAO6S,QAAS0c,GACtC97B,GAAO+6B,EAAevT,eAAepI,QAAS0c,UAGhD1hC,OACO6gC,KEjGT,UAAqBp4B,GACnBA,EAAE4V,OACFA,EAAMC,OACNA,EAAMmhB,aACNA,EAAYD,YACZA,EAAW5tB,OACXA,GACCof,GACGsM,GAAgBtM,IAAiB3S,GAAUC,IAC7C1M,EAAOO,OAAOiM,WAAWC,OAASA,EAClCzM,EAAOwb,eAAehP,WAAWC,OAASA,EAC1CzM,EAAOO,OAAOiM,WAAWE,OAASA,EAClC1M,EAAOwb,eAAehP,WAAWE,OAASA,GAGxCif,GAAgBvM,IAAiByO,IACnC7tB,EAAOO,OAAOkiB,WAAW5rB,GAAKg3B,EAC9B7tB,EAAOwb,eAAeiH,WAAW5rB,GAAKg3B,GAGpCjC,GAAexM,IAAiBwO,IAClC5tB,EAAOO,OAAOgmB,UAAU1vB,GAAK+2B,EAC7B5tB,EAAOwb,eAAe+K,UAAU1vB,GAAK+2B,GAGvC5tB,EAAO9N,KAAK2E,GFyEVq5B,EAEIr5B,GAAIo4B,EACIxiB,OAAAA,EACAC,OAAAA,EACMmhB,aAAAA,EACDD,YAAAA,EACb5tB,OAAQ+uB,GAEV3P,GAEFsP,EAAS,UAAWK,IAChB3P,EAAahM,SACjB2b,EAAe3hB,OAAOrR,KAAMlF,IACtBA,EAAGu4B,UAAUv4B,EAAGu4B,SAASL,QAIjCvgC,WACOugC,SACLQ,UAEM5B,EG5HV,SAA0BvO,EAAc+Q,GACtC,MAAMrnC,EAAO,GACb,IAAKqnC,EAAW,OAAOrnC,EAEvB,MAAMsnC,EAAS5kC,IACT1C,EAAK6D,QAAQnB,GAAO,GAAG1C,EAAKyF,KAAK/C,IA2BvC,OAxBoBiiC,GAAWz7B,OAAOxG,GAAkB,MAAXA,EAAI,IAAYuG,IAAIvG,GAAOA,EAAIgT,QAAQ,IAAK,KAC7ErY,QAAQqF,IAClB,GAAIA,KAAO4zB,GAAgB5zB,KAAO2kC,EAChC,GAAIr8B,GAASsrB,EAAa5zB,KAASsI,GAASq8B,EAAU3kC,IAAO,CAC3D,MAAM6kC,EAAUtqC,OAAO+C,KAAKs2B,EAAa5zB,IACnC8kC,EAAUvqC,OAAO+C,KAAKqnC,EAAU3kC,IAElC6kC,EAAQroC,SAAWsoC,EAAQtoC,OAC7BooC,EAAO5kC,IAEP6kC,EAAQlqC,QAAQoqC,IACVnR,EAAa5zB,GAAK+kC,KAAYJ,EAAU3kC,GAAK+kC,IAC/CH,EAAO5kC,KAGX8kC,EAAQnqC,QAAQqqC,IACVpR,EAAa5zB,GAAKglC,KAAYL,EAAU3kC,GAAKglC,IAASJ,EAAO5kC,WAG5D4zB,EAAa5zB,KAAS2kC,EAAU3kC,IACzC4kC,EAAO5kC,KAIN1C,EH4FiB2nC,CAAiBnR,EAAc0P,IAElDrB,EAAc3lC,QAAU8mC,IACzBC,IACCA,EAAerjB,WAEhBgiB,IACE1tB,OAAQ+uB,EACRzP,aAAAA,EACAqO,cAAAA,EACAlhB,OAAAA,EACAC,OAAAA,EACAkhB,YAAAA,EACAC,aAAAA,IAGJiB,GAAoB,EACpBE,EAAkB1P,IAGpB5wB,OAEwB,oBAAXwH,QAA0B64B,IAAmBA,EAAerjB,WACrEqjB,EAAe3M,SAAQ,GAAM,uJA1GxB2M,8CAsHSriB,qDACAD,qDAGAmhB,qDAGAC,qDAbPoB,6KIhEG9nC,wCAHEA,+YAFsB,iBAATA,KAAoBA,UAAOQ,WAFtD2B,qHAEoC,iBAATnC,KAAoBA,UAAOQ,6KAHnDR,+CAJE0kC,MAAiB1kC,OAAeA,SAAgBA,KAAc,kCAC5CA,MACrBA,8FAJNmC,oNAESuiC,MAAiB1kC,OAAeA,SAAgBA,KAAc,yDAC5CA,YACrBA,kMA9EOupC,mBACAC,YAEPz4B,KAGA8nB,EAAU,KACV4Q,EAAe,eAEf5wB,EAAS,KACT6wB,GAAgB,QAEdC,GAAiB5b,EAAGre,EAAIgB,KACxBhB,IAAOmpB,OACT4Q,EAAe/4B,IAIbk5B,OACC/wB,IAAU6wB,IACf7wB,EAAOnH,GAAG,cAAei4B,GACzBD,GAAgB,IjFm5BpB,IAAsBhrC,SiF53BpBuI,YAC8B,IAAjBuiC,QACX3Q,EAAQoP,SAAYQ,IAClB5vB,EAAS4vB,EACTmB,QAEFA,OAGFviC,OACOwxB,GAAYhgB,IACbA,EAAO0L,UACY,iBAAjBklB,OACFA,EAAe,gBAInBG,OjF22BkBlrC,OiFv2BlBkrC,KjFw2BA7iC,IAAwBG,GAAGoC,cAAclC,KAAK1I,GiFr2BhD6I,OACOsR,GA5CAA,IACLA,EAAOhG,IAAI,cAAe82B,GAC1BD,GAAgB,qNAGfG,GACDC,SACEL,EAAajkC,QAAQ,wBAA0B,GAC/CikC,EAAajkC,QAAQ,kCAAoC,EAC3DukC,UAAWN,EAAajkC,QAAQ,yBAA2B,EAC3DwkC,YAAaP,EAAajkC,QAAQ,2BAA6B,EAC/DykC,OACER,EAAajkC,QAAQ,sBAAwB,GAC7CikC,EAAajkC,QAAQ,gCAAkC,EACzD0kC,OACET,EAAajkC,QAAQ,sBAAwB,GAC7CikC,EAAajkC,QAAQ,gCAAkC,+DAkChDqzB,8GC/EN,SAASsR,GAAaC,EAAQC,GACjC,OAAOD,EAAOtnC,KAAK2Z,cAAc0qB,SAASkD,EAAa5tB,eAEpD,SAAS6tB,GAAeF,EAAQG,GACnC,MAAsB,QAAfA,GAAwBH,EAAOI,UAAUrD,SAASoD,GAEtD,SAASE,GAASC,GACrB,IAAIC,EAAQ,GAEZ,IAAI,IAAI7pC,EAAI,EAAGA,EAAI4pC,EAAM7pC,OAAQC,IAAK,CAClC,IAAI8pC,EAAOF,EAAM5pC,GACb+pC,EAAYD,EAAKC,UACjBC,EAAYF,EAAKE,UACjBH,EAAMxD,SAAS0D,IACfF,EAAMvjC,KAAKyjC,GAEXF,EAAMxD,SAAS2D,IACfH,EAAMvjC,KAAK0jC,GAOnB,OAHAH,EAAMpV,MAAK,SAASn2B,EAAGC,GACnB,OAAOD,EAAE2rC,WAAWC,cAAc3rC,EAAE0rC,eAEjCJ,EAEJ,SAASM,GAAaC,EAAYC,GACrC,OAAGD,GAAcC,GAAgC,OAAhBA,EAM9B,SAASC,GAAYV,GACxB,IAAIU,EAAc,GAClB,IAAI,IAAItqC,EAAI,EAAGA,EAAI4pC,EAAM7pC,OAAQC,IAAK,CAClC,IAAI8pC,EAAOF,EAAM5pC,GACjBsqC,EAAYR,EAAKE,UAAUC,YAAc,MAAMH,EAAKE,UAAUC,oBAAoBH,EAAKC,UAAUE,aACjGK,EAAYR,EAAKC,UAAUE,YAAc,GAAGH,EAAKE,UAAUC,mBAAmBH,EAAKC,UAAUE,iBAEjG,OAAOK,yDC9ByBprC,KAAU+qC,gBAIV/qC,KAAU+qC,oOALqC/qC,KAAUqrC,gCAAarrC,KAAU+qC,mLAIjC/qC,KAAUqrC,gCAAarrC,KAAU+qC,mLAPpH5oC,SACIJ,OACIA,OACIA,cACAA,qBAEJA,OACIA,cACAA,wCALuE/B,KAAUqrC,gCAAarrC,KAAU+qC,8CAChF/qC,KAAU+qC,uCAGqC/qC,KAAUqrC,gCAAarrC,KAAU+qC,8CAChF/qC,KAAU+qC,gFAb/BF,gBACAC,gBACAQ,YACXA,MAAgB30B,KAAK20B,8WCiBKtrC,KAAO8C,UAOsB9C,KAAOurC,OAAOC,sBAAuDxrC,KAAOyrC,8BANpF,KAAlBzrC,KAAO0rC,WAEgB,KAAlB1rC,KAAO0rC,SAAoC,KAAlB1rC,KAAO0rC,SAAoC,OAAlB1rC,KAAO0rC,iLAIvC,iBAAyC,4CAVzC1rC,KAAO8C,sKAAqJ9C,KAAO2rC,kSAD/MxpC,SACIJ,OAA6BA,cAC7BA,OACIA,OACIA,2CAOAA,OAAKA,4BAAuEA,yCAV5C/B,KAAO8C,oCAAqJ9C,KAAO2rC,qCAG7L3rC,KAAO8C,mGAOsB9C,KAAOurC,OAAOC,yCAAuDxrC,KAAOyrC,mEAH3EzrC,KAAO0rC,iFAAvCvpC,oCAAgCnC,KAAO0rC,2IAFvCvpC,oDAPfnC,2EAAAA,wJATMA,KAAeurC,YAIhBvrC,KAAe4rC,oBAIlBhtC,OAAOi3B,QAAQ71B,KAAe6rC,6BAAnChrC,kIARO,+FAI+B,sVARhDsB,SACIJ,OACIA,OACIA,cACAA,4BAEJA,OACIA,cACAA,4BAGRA,2EAPe/B,KAAeurC,+BAIhBvrC,KAAe4rC,4CAIlBhtC,OAAOi3B,QAAQ71B,KAAe6rC,gBAAnChrC,+HAAAA,6EAdKirC,+MCwCyC9rC,+CAAhCmC,oCAAgCnC,8HAFhCmC,8JAmBRA,oSAHAA,kBACAA,wMArBkCnC,KAAOwrC,0CAGjB,KAAXxrC,SAEgB,KAAXA,OAA6B,KAAXA,OAA6B,OAAXA,4DAcjDA,yJAvBuCA,4BAAwDA,uCAIrE,iBAAkC,6CAClC,UAAGA,sHAVvBA,uGAAuFA,moBAJrGA,wEAAbmC,SACIJ,OACIA,OACIA,OACIA,cAEJA,OACIA,OACIA,OACIA,qBAAsDA,qBAG9DA,OACIA,4BACAA,4BACAA,6BAQJA,OACIA,mBAAoC/B,aAKpD+B,OACIA,OACIA,4EA3Be/B,sBAAuFA,6BAKtDA,eAAwDA,mBAIlEA,KAAOwrC,uCACPxrC,iGAUMA,gGAxB3CA,8JArBEsM,kBACAy/B,mBACAC,gBACAxB,aACAe,iBACAU,eACAC,mBACAC,oBACAC,oBACAC,iBACAC,EAAa,eACbZ,EAAU,qBACVa,aACAnC,sBACAoC,0nBAekDA,EAAgBpC,QAyB3C+B,EAAa7/B,OACb8/B,EAAc9/B,OAEd+/B,EAAc//B,oWCrDpD,SAAUmgC,GAER,MAAMC,EAAiB,EAAV/rC,KAAKwZ,GAcd,IAASjU,EAAAA,EAbb,SAA0BymC,EAAKC,GAC7B,IAAIC,EAAKlsC,KAAKsiC,SACV6J,EAAKnsC,KAAKsiC,SAKd,OAHStiC,KAAKyhB,MAAM,EAAMzhB,KAAKosC,IAAIF,IAAOlsC,KAAKuZ,IAAIwyB,EAAOI,GAG9CF,EAAMD,GAMFzS,UAAiBh0B,EAhBrC,4BCLA,SAAUumC,GAER,MAAMO,EAAmBC,GAIzB,IAAIC,EAAO,SAASpc,GAClB,IAAIqc,EAAIxsC,KAAK6hB,IAAIsO,GACbvqB,EAAI,GAAK,EAAI4mC,EAAI,GACjBzjC,EAAInD,EAAI5F,KAAKysC,KAAKD,EAAIA,EAAI,WAAa5mC,GAAK,WACxCA,GAAK,UAAaA,GAAK,UAAaA,GACpCA,GAAK,UAAaA,GAAmBA,GAAK,WAC1CA,GAAuB,UAAJA,EAAb,YADkB,aADkB,eAGlD,OAAOuqB,GAAK,EAAIpnB,EAAI,EAAIA,GAwBtB2jC,EAAW,SAASV,EAAMW,GAC5B,GAAIA,GAAY,EACd,MAAM,IAAItmC,MAAM,iCAAmCsmC,EAAW,KAEhErnC,KAAK0mC,KAAOA,EACZ1mC,KAAKqnC,SAAWA,EAChBrnC,KAAKsnC,kBAAoB5sC,KAAKyhB,KAAKkrB,IAIrCD,EAASx9B,UAAU29B,IAAM,SAAS1c,GAChC,IAAIpmB,EAAIzE,KAAKsnC,kBAAoB5sC,KAAKyhB,KAAK,EAAIzhB,KAAKwZ,IAEpD,OADQxZ,KAAKysC,KAAKzsC,KAAK8sC,IAAI3c,EAAI7qB,KAAK0mC,KAAM,IAAM,EAAI1mC,KAAKqnC,WAC9C5iC,GAIb2iC,EAASx9B,UAAU69B,IAAM,SAAS5c,GAChC,MAAO,GAAMoc,IAAOpc,EAAI7qB,KAAK0mC,OAAS1mC,KAAKsnC,kBAAoB5sC,KAAKyhB,KAAK,MAI3EirB,EAASx9B,UAAU89B,IAAM,SAAS7c,GAChC,OAAO7qB,KAAK0mC,KAAO1mC,KAAKsnC,kBAAoB5sC,KAAKyhB,KAAK,GA1C5C,SAAS0O,GACnB,GAAIA,GAAK,EAAK,OAAQ,IACtB,GAAIA,GAAK,EAAK,OAAO,IAQrB,IANA,IAAI8c,EAAM9c,EAAI,EAAKA,EAAI,EAAIA,EACvBvqB,EAAI5F,KAAKyhB,MAAM,EAAIzhB,KAAKosC,IAAIa,EAAK,IAEjClkC,GAAK,SAAY,QAAc,OAAJnD,IACtB,EAAIA,GAAK,OAAc,OAAJA,IAAgBA,GAEnCkM,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,IAAIo7B,EAAMX,EAAKxjC,GAAKkkC,EACpBlkC,GAAKmkC,GAAO,mBAAsBltC,KAAKysC,KAAM1jC,EAAIA,GAAMA,EAAImkC,GAG7D,OAAQ/c,EAAI,EAAKpnB,GAAKA,EA2BqCokC,CAAM,EAAIhd,IAIvEuc,EAASx9B,UAAUk+B,IAAM,SAASnrC,GAChC,GAAkB,mBAChB,OAAOqD,KAAKs4B,MAAM37B,GAEpB,IAAIorC,EAAY,EAAI/nC,KAAKqnC,SACrBW,EAAa,EAAIrrC,EAAE0qC,SACvB,OAAOY,EACHF,EAAYC,EACZD,EAAY/nC,KAAK0mC,KAAOsB,EAAarrC,EAAE+pC,OAI7CU,EAASx9B,UAAUs+B,IAAM,SAASvrC,GAChC,GAAkB,mBAChB,OAAOqD,KAAKs4B,MAAM,EAAI37B,GAExB,IAAIorC,EAAY,EAAI/nC,KAAKqnC,SACrBW,EAAa,EAAIrrC,EAAE0qC,SACvB,OAAOY,EACHF,EAAYC,EACZD,EAAY/nC,KAAK0mC,KAAOsB,EAAarrC,EAAE+pC,OAI7CU,EAASx9B,UAAU1G,IAAM,SAASvG,GAChC,OAAOwrC,EAASnoC,KAAK0mC,KAAO/pC,EAAE+pC,KAAM1mC,KAAKqnC,SAAW1qC,EAAE0qC,WAIxDD,EAASx9B,UAAUw+B,IAAM,SAASzrC,GAChC,OAAOwrC,EAASnoC,KAAK0mC,KAAO/pC,EAAE+pC,KAAM1mC,KAAKqnC,SAAW1qC,EAAE0qC,WAIxDD,EAASx9B,UAAU0uB,MAAQ,SAAS/3B,GAClC,OAAO4nC,EAASnoC,KAAK0mC,KAAOnmC,EAAGP,KAAKqnC,SAAW9mC,EAAIA,IAIrD6mC,EAASx9B,UAAUozB,OAAS,SAASqL,GACnC,IAAI3B,EAAO1mC,KAAK0mC,KACZC,EAAM3mC,KAAKsnC,kBACf,OAAO7mC,MAAM4nC,GAAKziC,KAAK,GAAGjB,IAAI,IACrBoiC,EAAiBL,EAAKC,KAIjC,IAWa1mC,EAXTkoC,EAAW,SAASzB,EAAMW,GAC5B,OAAO,IAAID,EAASV,EAAMW,IAGxBY,EAAoB,SAASF,EAAWO,GAC1C,OAAOH,EAASG,EAAgBP,EAAW,EAAIA,IAMpC9nC,EAHLkoC,EAGUlU,UAAiBh0B,EA1HrC;;;;;;;ACSA,MAAMsoC,GACkB,oBAAXz/B,OACF,SAAS7F,GACd,OAAOA,KAGJ6F,OAAON,sBAEhB,SAASggC,GAAU/vC,EAAIgwC,EAASC,GAC9B,MAAMC,EAAaD,IAAch9B,GAASjL,MAAMmJ,UAAUzP,MAAM6H,KAAK0J,IACrE,IAAIk9B,GAAU,EACVl9B,EAAO,GACX,OAAO,YAAY/P,GACjB+P,EAAOi9B,EAAWhtC,GACbitC,IACHA,GAAU,EACVL,GAAiBvmC,KAAK8G,OAAQ,KAC5B8/B,GAAU,EACVnwC,EAAG2T,MAAMq8B,EAAS/8B,OAiB1B,MAAMm9B,GAAsBC,GAAoB,UAAVA,EAAoB,OAAmB,QAAVA,EAAkB,QAAU,SACzFC,GAAiB,CAACD,EAAO3nB,EAAOI,IAAkB,UAAVunB,EAAoB3nB,EAAkB,QAAV2nB,EAAkBvnB,GAAOJ,EAAQI,GAAO,EAMlH,SAASppB,MACT,MAAM6wC,GAAO,WACX,IAAItgC,EAAK,EACT,OAAO,WACL,OAAOA,QAGX,SAASugC,GAActrC,GACrB,OAAOA,MAAAA,EAET,SAAS+L,GAAQ/L,GACf,GAAI8C,MAAMiJ,SAAWjJ,MAAMiJ,QAAQ/L,GACjC,OAAO,EAET,MAAM8D,EAAO9I,OAAOiR,UAAU8H,SAAS1P,KAAKrE,GAC5C,MAA0B,YAAtB8D,EAAK4tB,OAAO,EAAG,IAAwC,WAApB5tB,EAAK4tB,QAAQ,GAKtD,SAAS3oB,GAAS/I,GAChB,OAAiB,OAAVA,GAA4D,oBAA1ChF,OAAOiR,UAAU8H,SAAS1P,KAAKrE,GAE1D,MAAMurC,GAAkBvrC,IAA4B,iBAAVA,GAAsBA,aAAiBonB,SAAW0G,UAAU9tB,GACtG,SAASwrC,GAAgBxrC,EAAOyrC,GAC9B,OAAOF,GAAevrC,GAASA,EAAQyrC,EAEzC,SAASC,GAAe1rC,EAAOyrC,GAC7B,YAAwB,IAAVzrC,EAAwByrC,EAAezrC,EAEvD,MAIM2rC,GAAc,CAAC3rC,EAAO4rC,IACT,iBAAV5rC,GAAsBA,EAAM6rC,SAAS,KAC1C77B,WAAWhQ,GAAS,IAAM4rC,GACvB5rC,EACP,SAASsF,GAASxK,EAAIiT,EAAM+8B,GAC1B,GAAIhwC,GAAyB,mBAAZA,EAAGuJ,KAClB,OAAOvJ,EAAG2T,MAAMq8B,EAAS/8B,GAG7B,SAASiD,GAAK86B,EAAUhxC,EAAIgwC,EAASiB,GACnC,IAAI7uC,EAAGJ,EAAKiB,EACZ,GAAIgO,GAAQ+/B,GAEV,GADAhvC,EAAMgvC,EAAS7uC,OACX8uC,EACF,IAAK7uC,EAAIJ,EAAM,EAAGI,GAAK,EAAGA,IACxBpC,EAAGuJ,KAAKymC,EAASgB,EAAS5uC,GAAIA,QAGhC,IAAKA,EAAI,EAAGA,EAAIJ,EAAKI,IACnBpC,EAAGuJ,KAAKymC,EAASgB,EAAS5uC,GAAIA,QAG7B,GAAI6L,GAAS+iC,GAGlB,IAFA/tC,EAAO/C,OAAO+C,KAAK+tC,GACnBhvC,EAAMiB,EAAKd,OACNC,EAAI,EAAGA,EAAIJ,EAAKI,IACnBpC,EAAGuJ,KAAKymC,EAASgB,EAAS/tC,EAAKb,IAAKa,EAAKb,IAI/C,SAAS8uC,GAAeC,EAAIC,GAC1B,IAAIhvC,EAAGivC,EAAMC,EAAIC,EACjB,IAAKJ,IAAOC,GAAMD,EAAGhvC,SAAWivC,EAAGjvC,OACjC,OAAO,EAET,IAAKC,EAAI,EAAGivC,EAAOF,EAAGhvC,OAAQC,EAAIivC,IAAQjvC,EAGxC,GAFAkvC,EAAKH,EAAG/uC,GACRmvC,EAAKH,EAAGhvC,GACJkvC,EAAGE,eAAiBD,EAAGC,cAAgBF,EAAG1jC,QAAU2jC,EAAG3jC,MACzD,OAAO,EAGX,OAAO,EAET,SAAS6jC,GAAQC,GACf,GAAIzgC,GAAQygC,GACV,OAAOA,EAAOxlC,IAAIulC,IAEpB,GAAIxjC,GAASyjC,GAAS,CACpB,MAAMpuC,EAASpD,OAAOC,OAAO,MACvB8C,EAAO/C,OAAO+C,KAAKyuC,GACnBC,EAAO1uC,EAAKd,OAClB,IAAIrC,EAAI,EACR,KAAOA,EAAI6xC,IAAQ7xC,EACjBwD,EAAOL,EAAKnD,IAAM2xC,GAAQC,EAAOzuC,EAAKnD,KAExC,OAAOwD,EAET,OAAOouC,EAET,SAASE,GAAWjsC,GAClB,OAAmE,IAA5D,CAAC,YAAa,YAAa,eAAemB,QAAQnB,GAE3D,SAASksC,GAAQlsC,EAAKrC,EAAQouC,EAAQ7sC,GACpC,IAAK+sC,GAAWjsC,GACd,OAEF,MAAMmsC,EAAOxuC,EAAOqC,GACdosC,EAAOL,EAAO/rC,GAChBsI,GAAS6jC,IAAS7jC,GAAS8jC,GAC7BC,GAAMF,EAAMC,EAAMltC,GAElBvB,EAAOqC,GAAO8rC,GAAQM,GAG1B,SAASC,GAAM1uC,EAAQouC,EAAQ7sC,GAC7B,MAAMotC,EAAUhhC,GAAQygC,GAAUA,EAAS,CAACA,GACtCL,EAAOY,EAAQ9vC,OACrB,IAAK8L,GAAS3K,GACZ,OAAOA,EAGT,MAAM4uC,GADNrtC,EAAUA,GAAW,IACEqtC,QAAUL,GACjC,IAAK,IAAIzvC,EAAI,EAAGA,EAAIivC,IAAQjvC,EAAG,CAE7B,IAAK6L,GADLyjC,EAASO,EAAQ7vC,IAEf,SAEF,MAAMa,EAAO/C,OAAO+C,KAAKyuC,GACzB,IAAK,IAAI5xC,EAAI,EAAG6xC,EAAO1uC,EAAKd,OAAQrC,EAAI6xC,IAAQ7xC,EAC9CoyC,EAAOjvC,EAAKnD,GAAIwD,EAAQouC,EAAQ7sC,GAGpC,OAAOvB,EAET,SAAS6uC,GAAQ7uC,EAAQouC,GACvB,OAAOM,GAAM1uC,EAAQouC,EAAQ,CAACQ,OAAQE,KAExC,SAASA,GAAUzsC,EAAKrC,EAAQouC,GAC9B,IAAKE,GAAWjsC,GACd,OAEF,MAAMmsC,EAAOxuC,EAAOqC,GACdosC,EAAOL,EAAO/rC,GAChBsI,GAAS6jC,IAAS7jC,GAAS8jC,GAC7BI,GAAQL,EAAMC,GACJ7xC,OAAOiR,UAAUkhC,eAAe9oC,KAAKjG,EAAQqC,KACvDrC,EAAOqC,GAAO8rC,GAAQM,IAW1B,SAASO,GAAmB3sC,EAAK+iB,GAC/B,MAAM6pB,EAAM5sC,EAAImB,QAFN,IAEmB4hB,GAC7B,OAAgB,IAAT6pB,EAAa5sC,EAAIxD,OAASowC,EAEnC,SAASC,GAAiBzkC,EAAKpI,GAC7B,GAPkB,KAOdA,EACF,OAAOoI,EAET,IAAI0kC,EAAM,EACNF,EAAMD,GAAmB3sC,EAAK8sC,GAClC,KAAO1kC,GAAOwkC,EAAME,GAClB1kC,EAAMA,EAAIpI,EAAIixB,OAAO6b,EAAKF,EAAME,IAChCA,EAAMF,EAAM,EACZA,EAAMD,GAAmB3sC,EAAK8sC,GAEhC,OAAO1kC,EAET,SAAS2kC,GAAYC,GACnB,OAAOA,EAAIC,OAAO,GAAGC,cAAgBF,EAAIjxC,MAAM,GAEjD,MAAMoxC,GAAW5tC,QAA2B,IAAVA,EAC5B6tC,GAAc7tC,GAA2B,mBAAVA,EAC/B8tC,GAAY,CAACtyC,EAAGC,KACpB,GAAID,EAAE8rB,OAAS7rB,EAAE6rB,KACf,OAAO,EAET,IAAK,MAAM8K,KAAQ52B,EACjB,IAAKC,EAAEyC,IAAIk0B,GACT,OAAO,EAGX,OAAO,GAMT,MAAM7b,GAAKxZ,KAAKwZ,GACVw3B,GAAM,EAAIx3B,GACVy3B,GAAQD,GAAMx3B,GACd03B,GAAW7mB,OAAO8mB,kBAClBC,GAAc53B,GAAK,IACnB63B,GAAU73B,GAAK,EACf83B,GAAa93B,GAAK,EAClB+3B,GAAqB,EAAL/3B,GAAS,EACzBg4B,GAAQxxC,KAAKwxC,MACbC,GAAOzxC,KAAKyxC,KAClB,SAASC,GAAQC,GACf,MAAMC,EAAe5xC,KAAKqiC,MAAMsP,GAChCA,EAAQE,GAAaF,EAAOC,EAAcD,EAAQ,KAAQC,EAAeD,EACzE,MAAMG,EAAY9xC,KAAK8sC,IAAI,GAAI9sC,KAAK+sB,MAAMykB,GAAMG,KAC1CI,EAAWJ,EAAQG,EAEzB,OADqBC,GAAY,EAAI,EAAIA,GAAY,EAAI,EAAIA,GAAY,EAAI,EAAI,IAC3DD,EAkBxB,SAASE,GAASxsC,GAChB,OAAQ8kB,MAAMrX,WAAWzN,KAAOurB,SAASvrB,GAE3C,SAASqsC,GAAa1hB,EAAGC,EAAG6hB,GAC1B,OAAOjyC,KAAK6hB,IAAIsO,EAAIC,GAAK6hB,EAM3B,SAASC,GAAmBC,EAAO9wC,EAAQopB,GACzC,IAAItqB,EAAGivC,EAAMnsC,EACb,IAAK9C,EAAI,EAAGivC,EAAO+C,EAAMjyC,OAAQC,EAAIivC,EAAMjvC,IACzC8C,EAAQkvC,EAAMhyC,GAAGsqB,GACZH,MAAMrnB,KACT5B,EAAOgY,IAAMrZ,KAAKqZ,IAAIhY,EAAOgY,IAAKpW,GAClC5B,EAAOpB,IAAMD,KAAKC,IAAIoB,EAAOpB,IAAKgD,IAIxC,SAASmvC,GAAUC,GACjB,OAAOA,GAAW74B,GAAK,KAEzB,SAAS84B,GAAUC,GACjB,OAAOA,GAAW,IAAM/4B,IAE1B,SAASg5B,GAAeriB,GACtB,IAAKqe,GAAere,GAClB,OAEF,IAAI5qB,EAAI,EACJ7E,EAAI,EACR,KAAOV,KAAKqiC,MAAMlS,EAAI5qB,GAAKA,IAAM4qB,GAC/B5qB,GAAK,GACL7E,IAEF,OAAOA,EAET,SAAS+xC,GAAkBC,EAAaC,GACtC,MAAMC,EAAsBD,EAAWxiB,EAAIuiB,EAAYviB,EACjD0iB,EAAsBF,EAAWviB,EAAIsiB,EAAYtiB,EACjD0iB,EAA2B9yC,KAAKyhB,KAAKmxB,EAAsBA,EAAsBC,EAAsBA,GAC7G,IAAIE,EAAQ/yC,KAAK4hB,MAAMixB,EAAqBD,GAI5C,OAHIG,GAAU,GAAMv5B,KAClBu5B,GAAS/B,IAEJ,CACL+B,MAAAA,EACAC,SAAUF,GAGd,SAASG,GAAsBC,EAAKC,GAClC,OAAOnzC,KAAKyhB,KAAKzhB,KAAK8sC,IAAIqG,EAAIhjB,EAAI+iB,EAAI/iB,EAAG,GAAKnwB,KAAK8sC,IAAIqG,EAAI/iB,EAAI8iB,EAAI9iB,EAAG,IAExE,SAASgjB,GAAW30C,EAAGC,GACrB,OAAQD,EAAIC,EAAIuyC,IAASD,GAAMx3B,GAEjC,SAAS65B,GAAgB50C,GACvB,OAAQA,EAAIuyC,GAAMA,IAAOA,GAE3B,SAASsC,GAAcP,EAAOtsB,EAAOI,EAAK0sB,GACxC,MAAM90C,EAAI40C,GAAgBN,GACpBS,EAAIH,GAAgB5sB,GACpBlhB,EAAI8tC,GAAgBxsB,GACpB4sB,EAAeJ,GAAgBG,EAAI/0C,GACnCi1C,EAAaL,GAAgB9tC,EAAI9G,GACjCk1C,EAAeN,GAAgB50C,EAAI+0C,GACnCI,EAAaP,GAAgB50C,EAAI8G,GACvC,OAAO9G,IAAM+0C,GAAK/0C,IAAM8G,GAAMguC,GAAyBC,IAAMjuC,GACvDkuC,EAAeC,GAAcC,EAAeC,EAEpD,SAASC,GAAY5wC,EAAOoW,EAAKpZ,GAC/B,OAAOD,KAAKC,IAAIoZ,EAAKrZ,KAAKqZ,IAAIpZ,EAAKgD,IAKrC,SAAS6wC,GAAW7wC,EAAOwjB,EAAOI,EAAKorB,EAAU,MAC/C,OAAOhvC,GAASjD,KAAKqZ,IAAIoN,EAAOI,GAAOorB,GAAWhvC,GAASjD,KAAKC,IAAIwmB,EAAOI,GAAOorB,EAGpF,MAAM8B,GAAUnuC,GAAY,IAANA,GAAiB,IAANA,EAC3BouC,GAAY,CAACpuC,EAAG4tC,EAAG9yC,KAAQV,KAAK8sC,IAAI,EAAG,IAAMlnC,GAAK,IAAM5F,KAAKi0C,KAAKruC,EAAI4tC,GAAKxC,GAAMtwC,GACjFwzC,GAAa,CAACtuC,EAAG4tC,EAAG9yC,IAAMV,KAAK8sC,IAAI,GAAI,GAAKlnC,GAAK5F,KAAKi0C,KAAKruC,EAAI4tC,GAAKxC,GAAMtwC,GAAK,EAC/EyzC,GAAU,CACdC,OAAQxuC,GAAKA,EACbyuC,WAAYzuC,GAAKA,EAAIA,EACrB0uC,YAAa1uC,IAAMA,GAAKA,EAAI,GAC5B2uC,cAAe3uC,IAAOA,GAAK,IAAO,EAC9B,GAAMA,EAAIA,GACT,MAAUA,GAAMA,EAAI,GAAK,GAC9B4uC,YAAa5uC,GAAKA,EAAIA,EAAIA,EAC1B6uC,aAAc7uC,IAAMA,GAAK,GAAKA,EAAIA,EAAI,EACtC8uC,eAAgB9uC,IAAOA,GAAK,IAAO,EAC/B,GAAMA,EAAIA,EAAIA,EACd,KAAQA,GAAK,GAAKA,EAAIA,EAAI,GAC9B+uC,YAAa/uC,GAAKA,EAAIA,EAAIA,EAAIA,EAC9BgvC,aAAchvC,MAAQA,GAAK,GAAKA,EAAIA,EAAIA,EAAI,GAC5CivC,eAAgBjvC,IAAOA,GAAK,IAAO,EAC/B,GAAMA,EAAIA,EAAIA,EAAIA,GACjB,KAAQA,GAAK,GAAKA,EAAIA,EAAIA,EAAI,GACnCkvC,YAAalvC,GAAKA,EAAIA,EAAIA,EAAIA,EAAIA,EAClCmvC,aAAcnvC,IAAMA,GAAK,GAAKA,EAAIA,EAAIA,EAAIA,EAAI,EAC9CovC,eAAgBpvC,IAAOA,GAAK,IAAO,EAC/B,GAAMA,EAAIA,EAAIA,EAAIA,EAAIA,EACtB,KAAQA,GAAK,GAAKA,EAAIA,EAAIA,EAAIA,EAAI,GACtCqvC,WAAYrvC,GAA8B,EAAxB5F,KAAKuZ,IAAI3T,EAAIyrC,IAC/B6D,YAAatvC,GAAK5F,KAAKi0C,IAAIruC,EAAIyrC,IAC/B8D,cAAevvC,IAAM,IAAO5F,KAAKuZ,IAAIC,GAAK5T,GAAK,GAC/CwvC,WAAYxvC,GAAY,IAANA,EAAW,EAAI5F,KAAK8sC,IAAI,EAAG,IAAMlnC,EAAI,IACvDyvC,YAAazvC,GAAY,IAANA,EAAW,EAA4B,EAAvB5F,KAAK8sC,IAAI,GAAI,GAAKlnC,GACrD0vC,cAAe1vC,GAAKmuC,GAAOnuC,GAAKA,EAAIA,EAAI,GACpC,GAAM5F,KAAK8sC,IAAI,EAAG,IAAU,EAAJlnC,EAAQ,IAChC,IAAyC,EAAjC5F,KAAK8sC,IAAI,GAAI,IAAU,EAAJlnC,EAAQ,KACvC2vC,WAAY3vC,GAAMA,GAAK,EAAKA,IAAM5F,KAAKyhB,KAAK,EAAI7b,EAAIA,GAAK,GACzD4vC,YAAa5vC,GAAK5F,KAAKyhB,KAAK,GAAK7b,GAAK,GAAKA,GAC3C6vC,cAAe7vC,IAAOA,GAAK,IAAO,GAC7B,IAAO5F,KAAKyhB,KAAK,EAAI7b,EAAIA,GAAK,GAC/B,IAAO5F,KAAKyhB,KAAK,GAAK7b,GAAK,GAAKA,GAAK,GACzC8vC,cAAe9vC,GAAKmuC,GAAOnuC,GAAKA,EAAIouC,GAAUpuC,EAAG,KAAO,IACxD+vC,eAAgB/vC,GAAKmuC,GAAOnuC,GAAKA,EAAIsuC,GAAWtuC,EAAG,KAAO,IAC1DP,iBAAiBO,GACf,MAAM4tC,EAAI,MAEV,OAAOO,GAAOnuC,GAAKA,EACjBA,EAAI,GACA,GAAMouC,GAAc,EAAJpuC,EAAO4tC,EAHnB,KAIJ,GAAM,GAAMU,GAAe,EAAJtuC,EAAQ,EAAG4tC,EAJ9B,MAMZnuC,WAAWO,GACT,MAAM4tC,EAAI,QACV,OAAO5tC,EAAIA,IAAM4tC,EAAI,GAAK5tC,EAAI4tC,IAEhCnuC,YAAYO,GACV,MAAM4tC,EAAI,QACV,OAAQ5tC,GAAK,GAAKA,IAAM4tC,EAAI,GAAK5tC,EAAI4tC,GAAK,GAE5CnuC,cAAcO,GACZ,IAAI4tC,EAAI,QACR,OAAK5tC,GAAK,IAAO,EACDA,EAAIA,IAAuB,GAAhB4tC,WAAqB5tC,EAAI4tC,GAA3C,GAEF,KAAQ5tC,GAAK,GAAKA,IAAuB,GAAhB4tC,WAAqB5tC,EAAI4tC,GAAK,IAEhEoC,aAAchwC,GAAK,EAAIuuC,GAAQ0B,cAAc,EAAIjwC,GACjDP,cAAcO,GACZ,MAAMmE,EAAI,OACJ9H,EAAI,KACV,OAAI2D,EAAK,EAAI3D,EACJ8H,EAAInE,EAAIA,EAEbA,EAAK,EAAI3D,EACJ8H,GAAKnE,GAAM,IAAM3D,GAAM2D,EAAI,IAEhCA,EAAK,IAAM3D,EACN8H,GAAKnE,GAAM,KAAO3D,GAAM2D,EAAI,MAE9BmE,GAAKnE,GAAM,MAAQ3D,GAAM2D,EAAI,SAEtCkwC,gBAAiBlwC,GAAMA,EAAI,GACO,GAA9BuuC,GAAQyB,aAAiB,EAAJhwC,GACc,GAAnCuuC,GAAQ0B,cAAkB,EAAJjwC,EAAQ,GAAW,IASzCqE,GAAM,CAAC8rC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,EAAGC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIr4C,EAAG,GAAIC,EAAG,GAAImH,EAAG,GAAI5D,EAAG,GAAIsD,EAAG,GAAIwxC,EAAG,IACnJC,GAAM,mBACNC,GAAMv4C,GAAMs4C,GAAQ,GAAJt4C,GAChBw4C,GAAMx4C,GAAMs4C,IAAS,IAAJt4C,IAAa,GAAKs4C,GAAQ,GAAJt4C,GACvC+V,GAAM/V,IAAa,IAAJA,IAAa,IAAY,GAAJA,GA0B1C,SAASy4C,GAAUrpB,GAClB,IAAIipB,EA1BL,SAAiBjpB,GAChB,OAAOrZ,GAAGqZ,EAAE/kB,IAAM0L,GAAGqZ,EAAEspB,IAAM3iC,GAAGqZ,EAAEpvB,IAAM+V,GAAGqZ,EAAErvB,GAyBrC44C,CAAQvpB,GAAKmpB,GAAKC,GAC1B,OAAOppB,EACJ,IAAMipB,EAAEjpB,EAAE/kB,GAAKguC,EAAEjpB,EAAEspB,GAAKL,EAAEjpB,EAAEpvB,IAAMovB,EAAErvB,EAAI,IAAMs4C,EAAEjpB,EAAErvB,GAAK,IACvDqvB,EAEJ,SAASuU,GAAMvU,GACd,OAAOA,EAAI,GAAM,EAElB,MAAMwpB,GAAM,CAACxpB,EAAGviB,EAAG7F,IAAM1F,KAAKC,IAAID,KAAKqZ,IAAIyU,EAAGpoB,GAAI6F,GAClD,SAASgsC,GAAIzpB,GACZ,OAAOwpB,GAAIjV,GAAU,KAAJvU,GAAW,EAAG,KAEhC,SAAS0pB,GAAI1pB,GACZ,OAAOwpB,GAAIjV,GAAU,IAAJvU,GAAU,EAAG,KAE/B,SAAS2pB,GAAI3pB,GACZ,OAAOwpB,GAAIjV,GAAMvU,EAAI,MAAQ,IAAK,EAAG,GAEtC,SAAS4pB,GAAI5pB,GACZ,OAAOwpB,GAAIjV,GAAU,IAAJvU,GAAU,EAAG,KAE/B,MAAM6pB,GAAS,uGAgCf,MAAMC,GAAS,+GACf,SAASC,GAASnyC,EAAG8tC,EAAGjoC,GACvB,MAAM9M,EAAI+0C,EAAIxzC,KAAKqZ,IAAI9N,EAAG,EAAIA,GACxBwrC,EAAI,CAACvxC,EAAG3H,GAAK2H,EAAIE,EAAI,IAAM,KAAO6F,EAAI9M,EAAIuB,KAAKC,IAAID,KAAKqZ,IAAIxb,EAAI,EAAG,EAAIA,EAAG,IAAK,GACrF,MAAO,CAACk5C,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAEvB,SAASe,GAASpyC,EAAG8tC,EAAG1lB,GACvB,MAAMipB,EAAI,CAACvxC,EAAG3H,GAAK2H,EAAIE,EAAI,IAAM,IAAMooB,EAAIA,EAAI0lB,EAAIxzC,KAAKC,IAAID,KAAKqZ,IAAIxb,EAAG,EAAIA,EAAG,GAAI,GACnF,MAAO,CAACk5C,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAEvB,SAASgB,GAASryC,EAAGsyC,EAAGt5C,GACvB,MAAMu5C,EAAMJ,GAASnyC,EAAG,EAAG,IAC3B,IAAIvF,EAMJ,IALI63C,EAAIt5C,EAAI,IACXyB,EAAI,GAAK63C,EAAIt5C,GACbs5C,GAAK73C,EACLzB,GAAKyB,GAEDA,EAAI,EAAGA,EAAI,EAAGA,IAClB83C,EAAI93C,IAAM,EAAI63C,EAAIt5C,EAClBu5C,EAAI93C,IAAM63C,EAEX,OAAOC,EAER,SAASC,GAAQpqB,GAChB,MACM/kB,EAAI+kB,EAAE/kB,EADE,IAERquC,EAAItpB,EAAEspB,EAFE,IAGR14C,EAAIovB,EAAEpvB,EAHE,IAIRuB,EAAMD,KAAKC,IAAI8I,EAAGquC,EAAG14C,GACrB2a,EAAMrZ,KAAKqZ,IAAItQ,EAAGquC,EAAG14C,GACrB6M,GAAKtL,EAAMoZ,GAAO,EACxB,IAAI3T,EAAG8tC,EAAGvxC,EAWV,OAVIhC,IAAQoZ,IACXpX,EAAIhC,EAAMoZ,EACVm6B,EAAIjoC,EAAI,GAAMtJ,GAAK,EAAIhC,EAAMoZ,GAAOpX,GAAKhC,EAAMoZ,GAC/C3T,EAAIzF,IAAQ8I,GACPquC,EAAI14C,GAAKuD,GAAMm1C,EAAI14C,EAAI,EAAI,GAC7BuB,IAAQm3C,GACN14C,EAAIqK,GAAK9G,EAAI,GACb8G,EAAIquC,GAAKn1C,EAAI,EAClByD,EAAQ,GAAJA,EAAS,IAEP,CAAK,EAAJA,EAAO8tC,GAAK,EAAGjoC,GAExB,SAAS4sC,GAAMpB,EAAGt4C,EAAGC,EAAGmH,GACvB,OACCE,MAAMiJ,QAAQvQ,GACXs4C,EAAEt4C,EAAE,GAAIA,EAAE,GAAIA,EAAE,IAChBs4C,EAAEt4C,EAAGC,EAAGmH,IACVoE,IAAIutC,IAEP,SAASY,GAAQ1yC,EAAG8tC,EAAGjoC,GACtB,OAAO4sC,GAAMN,GAAUnyC,EAAG8tC,EAAGjoC,GAQ9B,SAAS8sC,GAAI3yC,GACZ,OAAQA,EAAI,IAAM,KAAO,IAE1B,SAAS4yC,GAAS5H,GACjB,MAAM3mC,EAAI6tC,GAAOW,KAAK7H,GACtB,IACI5iB,EADArvB,EAAI,IAER,IAAKsL,EACJ,OAEGA,EAAE,KAAO+jB,IACZrvB,EAAIsL,EAAE,GAAKwtC,IAAKxtC,EAAE,IAAMytC,IAAKztC,EAAE,KAEhC,MAAMrE,EAAI2yC,IAAKtuC,EAAE,IACXyuC,GAAMzuC,EAAE,GAAK,IACb0uC,GAAM1uC,EAAE,GAAK,IAQnB,OANC+jB,EADY,QAAT/jB,EAAE,GAtBP,SAAiBrE,EAAGsyC,EAAGt5C,GACtB,OAAOy5C,GAAMJ,GAAUryC,EAAGsyC,EAAGt5C,GAsBxBg6C,CAAQhzC,EAAG8yC,EAAIC,GACA,QAAT1uC,EAAE,GArBd,SAAiBrE,EAAG8tC,EAAG1lB,GACtB,OAAOqqB,GAAML,GAAUpyC,EAAG8tC,EAAG1lB,GAqBxB6qB,CAAQjzC,EAAG8yC,EAAIC,GAEfL,GAAQ1yC,EAAG8yC,EAAIC,GAEb,CACN1vC,EAAG+kB,EAAE,GACLspB,EAAGtpB,EAAE,GACLpvB,EAAGovB,EAAE,GACLrvB,EAAGA,GAuBL,MAAMm6C,GAAQ,CACbzoB,EAAG,OACH0oB,EAAG,QACHC,EAAG,KACHC,EAAG,MACHC,EAAG,KACHC,EAAG,SACHC,EAAG,QACHzC,EAAG,KACH0C,EAAG,KACHC,EAAG,KACH1C,EAAG,KACHC,EAAG,QACHC,EAAG,QACHyC,EAAG,KACHC,EAAG,WACHzC,EAAG,KACH0C,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,KACHC,EAAG,QACH7C,EAAG,KACH8C,EAAG,KACHC,EAAG,OACHC,EAAG,KACHC,EAAG,QACHC,EAAG,MAEEC,GAAQ,CACbC,OAAQ,SACRC,YAAa,SACbC,KAAM,OACNC,UAAW,SACXC,KAAM,SACNC,MAAO,SACPC,OAAQ,SACRC,MAAO,IACPC,aAAc,SACdC,GAAI,KACJC,QAAS,SACTC,KAAM,SACNC,UAAW,SACXC,OAAQ,SACRC,SAAU,SACVC,QAAS,SACTC,IAAK,SACLC,YAAa,SACbC,QAAS,SACTC,QAAS,SACTC,KAAM,OACNC,IAAK,KACLC,MAAO,OACPC,QAAS,SACTC,KAAM,SACNC,KAAM,OACNC,KAAM,SACNC,OAAQ,SACRC,QAAS,SACTC,SAAU,SACVC,OAAQ,SACRC,MAAO,SACPC,IAAK,SACLC,OAAQ,SACRC,OAAQ,SACRC,KAAM,SACNC,MAAO,SACPC,MAAO,SACPC,IAAK,OACLC,OAAQ,SACRC,OAAQ,SACRC,SAAU,OACVC,OAAQ,SACRC,OAAQ,SACRC,SAAU,SACVC,SAAU,SACVC,SAAU,SACVC,SAAU,SACVC,OAAQ,SACRC,QAAS,SACTC,UAAW,SACXC,IAAK,SACLC,OAAQ,SACRC,IAAK,SACLC,IAAK,OACLC,MAAO,SACPC,IAAK,SACLC,QAAS,SACTC,OAAQ,SACRC,QAAS,SACTC,MAAO,SACPC,KAAM,SACNC,MAAO,SACPC,OAAQ,SACRC,UAAW,SACXC,QAAS,SACTC,WAAY,SACZC,IAAK,SACLC,KAAM,SACNC,MAAO,SACPC,UAAW,SACXC,KAAM,SACNC,KAAM,SACNC,KAAM,SACNC,KAAM,SACNC,OAAQ,SACRC,OAAQ,SACRC,OAAQ,SACRC,MAAO,SACPC,MAAO,SACPC,QAAS,SACTC,IAAK,SACLC,KAAM,OACNC,QAAS,SACTC,IAAK,SACLC,OAAQ,SACRC,MAAO,SACPC,WAAY,SACZC,IAAK,KACLC,MAAO,SACPC,OAAQ,SACRC,OAAQ,SACRC,KAAM,SACNC,UAAW,OACXC,IAAK,SACLC,SAAU,SACVC,WAAY,SACZC,QAAS,SACTC,SAAU,SACVC,QAAS,SACTC,WAAY,SACZC,KAAM,KACNC,OAAQ,SACRC,KAAM,SACNC,QAAS,SACTC,MAAO,SACPC,QAAS,SACTC,KAAM,SACNC,UAAW,SACXC,OAAQ,SACRC,MAAO,SACPC,WAAY,SACZC,UAAW,SACXC,QAAS,SACTC,KAAM,SACNC,IAAK,SACLC,KAAM,SACNC,QAAS,SACTC,MAAO,SACPC,YAAa,SACbC,GAAI,SACJC,SAAU,SACVC,MAAO,SACPC,UAAW,SACXC,MAAO,SACPC,UAAW,SACXC,MAAO,SACPC,QAAS,SACTC,MAAO,SACPC,OAAQ,SACRC,MAAO,SACPC,IAAK,SACLC,KAAM,SACNC,KAAM,SACNC,KAAM,SACNC,SAAU,OACVC,OAAQ,SACRC,IAAK,SACLC,IAAK,OACLC,MAAO,SACPC,OAAQ,SACRC,GAAI,SACJC,MAAO,SACPC,IAAK,SACLC,KAAM,SACNC,UAAW,SACXC,GAAI,SACJC,MAAO,UAkBR,IAAIC,GACJ,SAASC,GAAU7S,GACb4S,KACJA,GAnBF,WACC,MAAME,EAAW,GACXxiD,EAAO/C,OAAO+C,KAAKi5C,IACnBwJ,EAAQxlD,OAAO+C,KAAK43C,IAC1B,IAAIz4C,EAAG2R,EAAGjU,EAAG6lD,EAAIC,EACjB,IAAKxjD,EAAI,EAAGA,EAAIa,EAAKd,OAAQC,IAAK,CAEjC,IADAujD,EAAKC,EAAK3iD,EAAKb,GACV2R,EAAI,EAAGA,EAAI2xC,EAAMvjD,OAAQ4R,IAC7BjU,EAAI4lD,EAAM3xC,GACV6xC,EAAKA,EAAGjtC,QAAQ7Y,EAAG+6C,GAAM/6C,IAE1BA,EAAIusB,SAAS6vB,GAAMyJ,GAAK,IACxBF,EAASG,GAAM,CAAC9lD,GAAK,GAAK,IAAMA,GAAK,EAAI,IAAU,IAAJA,GAEhD,OAAO2lD,EAKII,GACVN,GAAQO,YAAc,CAAC,EAAG,EAAG,EAAG,IAEjC,MAAMplD,EAAI6kD,GAAQ5S,EAAI50B,eACtB,OAAOrd,GAAK,CACXsK,EAAGtK,EAAE,GACL24C,EAAG34C,EAAE,GACLC,EAAGD,EAAE,GACLA,EAAgB,IAAbA,EAAEyB,OAAezB,EAAE,GAAK,KAG7B,SAASqlD,GAAOh2B,EAAG3tB,EAAGikB,GACrB,GAAI0J,EAAG,CACN,IAAIi2B,EAAM7L,GAAQpqB,GAClBi2B,EAAI5jD,GAAKH,KAAKC,IAAI,EAAGD,KAAKqZ,IAAI0qC,EAAI5jD,GAAK4jD,EAAI5jD,GAAKikB,EAAa,IAANjkB,EAAU,IAAM,IACvE4jD,EAAM3L,GAAQ2L,GACdj2B,EAAE/kB,EAAIg7C,EAAI,GACVj2B,EAAEspB,EAAI2M,EAAI,GACVj2B,EAAEpvB,EAAIqlD,EAAI,IAGZ,SAASC,GAAMl2B,EAAGtf,GACjB,OAAOsf,EAAI7vB,OAAOP,OAAO8Q,GAAS,GAAIsf,GAAKA,EAE5C,SAASm2B,GAAW//C,GACnB,IAAI4pB,EAAI,CAAC/kB,EAAG,EAAGquC,EAAG,EAAG14C,EAAG,EAAGD,EAAG,KAY9B,OAXIsH,MAAMiJ,QAAQ9K,GACbA,EAAMhE,QAAU,IACnB4tB,EAAI,CAAC/kB,EAAG7E,EAAM,GAAIkzC,EAAGlzC,EAAM,GAAIxF,EAAGwF,EAAM,GAAIzF,EAAG,KAC3CyF,EAAMhE,OAAS,IAClB4tB,EAAErvB,EAAI+4C,GAAItzC,EAAM,OAIlB4pB,EAAIk2B,GAAM9/C,EAAO,CAAC6E,EAAG,EAAGquC,EAAG,EAAG14C,EAAG,EAAGD,EAAG,KACrCA,EAAI+4C,GAAI1pB,EAAErvB,GAENqvB,EAER,SAASo2B,GAAcxT,GACtB,MAAsB,MAAlBA,EAAIC,OAAO,GA5XhB,SAAkBD,GACjB,MAAM3mC,EAAI4tC,GAAOY,KAAK7H,GACtB,IACI3nC,EAAGquC,EAAG14C,EADND,EAAI,IAER,GAAKsL,EAAL,CAGA,GAAIA,EAAE,KAAOhB,EAAG,CACf,MAAM+kB,GAAK/jB,EAAE,GACbtL,EAAI,KAAOsL,EAAE,GAAKwtC,GAAIzpB,GAAS,IAAJA,GAQ5B,OANA/kB,GAAKgB,EAAE,GACPqtC,GAAKrtC,EAAE,GACPrL,GAAKqL,EAAE,GACPhB,EAAI,KAAOgB,EAAE,GAAKwtC,GAAIxuC,GAAKA,GAC3BquC,EAAI,KAAOrtC,EAAE,GAAKwtC,GAAIH,GAAKA,GAC3B14C,EAAI,KAAOqL,EAAE,GAAKwtC,GAAI74C,GAAKA,GACpB,CACNqK,EAAGA,EACHquC,EAAGA,EACH14C,EAAGA,EACHD,EAAGA,IAwWI0lD,CAASzT,GAEV4H,GAAS5H,GAEjB,MAAM0T,GACL/+C,YAAYnB,GACX,GAAIA,aAAiBkgD,GACpB,OAAOlgD,EAER,MAAM6C,SAAc7C,EACpB,IAAI4pB,EApbN,IAAkB4iB,EAEbzlC,EADAlL,EAobU,WAATgH,EACH+mB,EAAIm2B,GAAW//C,GACI,WAAT6C,IAtbRhH,GADa2wC,EAwbFxsC,GAvbDhE,OAEC,MAAXwwC,EAAI,KACK,IAAR3wC,GAAqB,IAARA,EAChBkL,EAAM,CACLlC,EAAG,IAAoB,GAAdkB,GAAIymC,EAAI,IACjB0G,EAAG,IAAoB,GAAdntC,GAAIymC,EAAI,IACjBhyC,EAAG,IAAoB,GAAduL,GAAIymC,EAAI,IACjBjyC,EAAW,IAARsB,EAA0B,GAAdkK,GAAIymC,EAAI,IAAW,KAEjB,IAAR3wC,GAAqB,IAARA,IACvBkL,EAAM,CACLlC,EAAGkB,GAAIymC,EAAI,KAAO,EAAIzmC,GAAIymC,EAAI,IAC9B0G,EAAGntC,GAAIymC,EAAI,KAAO,EAAIzmC,GAAIymC,EAAI,IAC9BhyC,EAAGuL,GAAIymC,EAAI,KAAO,EAAIzmC,GAAIymC,EAAI,IAC9BjyC,EAAW,IAARsB,EAAakK,GAAIymC,EAAI,KAAO,EAAIzmC,GAAIymC,EAAI,IAAO,OAwanD5iB,EApaK7iB,GAoakBs4C,GAAUr/C,IAAUggD,GAAchgD,IAE1DoB,KAAK++C,KAAOv2B,EACZxoB,KAAKg/C,SAAWx2B,EAEjBy2B,YACC,OAAOj/C,KAAKg/C,OAEbrM,UACC,IAAInqB,EAAIk2B,GAAM1+C,KAAK++C,MAInB,OAHIv2B,IACHA,EAAErvB,EAAIg5C,GAAI3pB,EAAErvB,IAENqvB,EAERmqB,QAAQnsC,GACPxG,KAAK++C,KAAOJ,GAAWn4C,GAExBzG,YACC,OAAOC,KAAKg/C,QAtYKx2B,EAsYcxoB,KAAK++C,QApYpCv2B,EAAErvB,EAAI,IACH,QAAQqvB,EAAE/kB,MAAM+kB,EAAEspB,MAAMtpB,EAAEpvB,MAAM+4C,GAAI3pB,EAAErvB,MACtC,OAAOqvB,EAAE/kB,MAAM+kB,EAAEspB,MAAMtpB,EAAEpvB,MAkYgB4G,KAAK++C,KAtYnD,IAAmBv2B,EAwYlBzoB,YACC,OAAOC,KAAKg/C,OAASnN,GAAU7xC,KAAK++C,MAAQ/+C,KAAK++C,KAElDh/C,YACC,OAAOC,KAAKg/C,OAlSd,SAAmBx2B,GAClB,IAAKA,EACJ,OAED,MAAMrvB,EAAIy5C,GAAQpqB,GACZpoB,EAAIjH,EAAE,GACN+0C,EAAIkE,GAAIj5C,EAAE,IACV8M,EAAImsC,GAAIj5C,EAAE,IAChB,OAAOqvB,EAAErvB,EAAI,IACV,QAAQiH,MAAM8tC,OAAOjoC,OAAOksC,GAAI3pB,EAAErvB,MAClC,OAAOiH,MAAM8tC,OAAOjoC,MAwRDi5C,CAAUl/C,KAAK++C,MAAQ/+C,KAAK++C,KAElDh/C,IAAIo/C,EAAOC,GACV,MAAMC,EAAKr/C,KACX,GAAIm/C,EAAO,CACV,MAAMG,EAAKD,EAAG1M,IACR4M,EAAKJ,EAAMxM,IACjB,IAAI6M,EACJ,MAAMpkD,EAAIgkD,IAAWI,EAAK,GAAMJ,EAC1B1M,EAAI,EAAIt3C,EAAI,EACZjC,EAAImmD,EAAGnmD,EAAIomD,EAAGpmD,EACdsmD,IAAO/M,EAAIv5C,IAAO,EAAIu5C,GAAKA,EAAIv5C,IAAM,EAAIu5C,EAAIv5C,IAAM,GAAK,EAC9DqmD,EAAK,EAAIC,EACTH,EAAG77C,EAAI,IAAOg8C,EAAKH,EAAG77C,EAAI+7C,EAAKD,EAAG97C,EAAI,GACtC67C,EAAGxN,EAAI,IAAO2N,EAAKH,EAAGxN,EAAI0N,EAAKD,EAAGzN,EAAI,GACtCwN,EAAGlmD,EAAI,IAAOqmD,EAAKH,EAAGlmD,EAAIomD,EAAKD,EAAGnmD,EAAI,GACtCkmD,EAAGnmD,EAAIiC,EAAIkkD,EAAGnmD,GAAK,EAAIiC,GAAKmkD,EAAGpmD,EAC/BkmD,EAAG1M,IAAM2M,EAEV,OAAOD,EAERt/C,QACC,OAAO,IAAI++C,GAAM9+C,KAAK2yC,KAEvB5yC,MAAM5G,GAEL,OADA6G,KAAK++C,KAAK5lD,EAAI+4C,GAAI/4C,GACX6G,KAERD,QAAQ+e,GAGP,OAFY9e,KAAK++C,KACb5lD,GAAK,EAAI2lB,EACN9e,KAERD,YACC,MAAM4yC,EAAM3yC,KAAK++C,KACXvyB,EAAMuQ,GAAc,GAAR4V,EAAIlvC,EAAkB,IAARkvC,EAAIb,EAAmB,IAARa,EAAIv5C,GAEnD,OADAu5C,EAAIlvC,EAAIkvC,EAAIb,EAAIa,EAAIv5C,EAAIozB,EACjBxsB,KAERD,QAAQ+e,GAGP,OAFY9e,KAAK++C,KACb5lD,GAAK,EAAI2lB,EACN9e,KAERD,SACC,MAAMyoB,EAAIxoB,KAAK++C,KAIf,OAHAv2B,EAAE/kB,EAAI,IAAM+kB,EAAE/kB,EACd+kB,EAAEspB,EAAI,IAAMtpB,EAAEspB,EACdtpB,EAAEpvB,EAAI,IAAMovB,EAAEpvB,EACP4G,KAERD,QAAQ+e,GAEP,OADA0/B,GAAOx+C,KAAK++C,KAAM,EAAGjgC,GACd9e,KAERD,OAAO+e,GAEN,OADA0/B,GAAOx+C,KAAK++C,KAAM,GAAIjgC,GACf9e,KAERD,SAAS+e,GAER,OADA0/B,GAAOx+C,KAAK++C,KAAM,EAAGjgC,GACd9e,KAERD,WAAW+e,GAEV,OADA0/B,GAAOx+C,KAAK++C,KAAM,GAAIjgC,GACf9e,KAERD,OAAO2/C,GAEN,OA/WF,SAAgBl3B,EAAGk3B,GAClB,IAAIt/C,EAAIwyC,GAAQpqB,GAChBpoB,EAAE,GAAK2yC,GAAI3yC,EAAE,GAAKs/C,GAClBt/C,EAAI0yC,GAAQ1yC,GACZooB,EAAE/kB,EAAIrD,EAAE,GACRooB,EAAEspB,EAAI1xC,EAAE,GACRooB,EAAEpvB,EAAIgH,EAAE,GAwWPu/C,CAAO3/C,KAAK++C,KAAMW,GACX1/C,MAGT,SAAS4/C,GAAUhhD,GAClB,OAAO,IAAIkgD,GAAMlgD,GAGlB,MAAMihD,GAAuBliD,GAAUA,aAAiBmiD,gBAAkBniD,aAAiBoiD,cAC3F,SAASZ,GAAMxhD,GACb,OAAOkiD,GAAoBliD,GAASA,EAAQiiD,GAAUjiD,GAExD,SAASqiD,GAAcriD,GACrB,OAAOkiD,GAAoBliD,GACvBA,EACAiiD,GAAUjiD,GAAOsiD,SAAS,IAAKC,OAAO,IAAKrO,YAGjD,MAAMz8B,GAAYzc,OAAOC,OAAO,MAC1BqF,GAActF,OAAOC,OAAO,MAClC,SAASunD,GAAWnkD,EAAMoC,GACxB,IAAKA,EACH,OAAOpC,EAET,MAAMN,EAAO0C,EAAIsM,MAAM,KACvB,IAAK,IAAI7P,EAAI,EAAGqF,EAAIxE,EAAKd,OAAQC,EAAIqF,IAAKrF,EAAG,CAC3C,MAAMtC,EAAImD,EAAKb,GACfmB,EAAOA,EAAKzD,KAAOyD,EAAKzD,GAAKI,OAAOC,OAAO,OAE7C,OAAOoD,EAET,SAASuC,GAAIkH,EAAM26C,EAAOC,GACxB,MAAqB,iBAAVD,EACF3V,GAAM0V,GAAW16C,EAAM26C,GAAQC,GAEjC5V,GAAM0V,GAAW16C,EAAM,IAAK26C,GAoFrC,IAAInuB,GAAW,IAlFf,MACElyB,YAAYugD,GACVtgD,KAAKugD,eAAYhmD,EACjByF,KAAKwgD,gBAAkB,kBACvBxgD,KAAKygD,YAAc,kBACnBzgD,KAAKm/C,MAAQ,OACbn/C,KAAK0gD,SAAW,GAChB1gD,KAAK2gD,iBAAoBr7C,GAAYA,EAAQs7C,MAAMvrC,SAASwrC,sBAC5D7gD,KAAK8gD,SAAW,GAChB9gD,KAAKuM,OAAS,CACZ,YACA,WACA,QACA,aACA,aAEFvM,KAAK+gD,KAAO,CACVC,OAAQ,qDACR/7B,KAAM,GACN5mB,MAAO,SACP4iD,WAAY,IACZ7B,OAAQ,MAEVp/C,KAAKkhD,MAAQ,GACblhD,KAAKmhD,qBAAuB,CAACpnD,EAAKuD,IAAY0iD,GAAc1iD,EAAQkjD,iBACpExgD,KAAKohD,iBAAmB,CAACrnD,EAAKuD,IAAY0iD,GAAc1iD,EAAQmjD,aAChEzgD,KAAKqhD,WAAa,CAACtnD,EAAKuD,IAAY0iD,GAAc1iD,EAAQ6hD,OAC1Dn/C,KAAKshD,UAAY,IACjBthD,KAAKuhD,YAAc,CACjBC,KAAM,UACNC,WAAW,GAEbzhD,KAAK0hD,qBAAsB,EAC3B1hD,KAAK2hD,QAAU,KACf3hD,KAAKsgB,QAAU,KACftgB,KAAK4hD,SAAU,EACf5hD,KAAK6hD,QAAU,GACf7hD,KAAK8hD,YAAa,EAClB9hD,KAAKs4B,WAAQ/9B,EACbyF,KAAK+hD,OAAS,GACd/hD,KAAKgiD,UAAW,EAChBhiD,KAAKiiD,yBAA0B,EAC/BjiD,KAAKkiD,SAAS5B,GAEhBvgD,IAAIqgD,EAAOC,GACT,OAAO9hD,GAAIyB,KAAMogD,EAAOC,GAE1BtgD,IAAIqgD,GACF,OAAOD,GAAWngD,KAAMogD,GAE1BrgD,SAASqgD,EAAOC,GACd,OAAO9hD,GAAIN,GAAamiD,EAAOC,GAEjCtgD,SAASqgD,EAAOC,GACd,OAAO9hD,GAAI6W,GAAWgrC,EAAOC,GAE/BtgD,MAAMqgD,EAAOvjD,EAAMslD,EAAaC,GAC9B,MAAMC,EAAclC,GAAWngD,KAAMogD,GAC/BkC,EAAoBnC,GAAWngD,KAAMmiD,GACrCI,EAAc,IAAM1lD,EAC1BlE,OAAO6pD,iBAAiBH,EAAa,CACnCtiD,CAACwiD,GAAc,CACb5kD,MAAO0kD,EAAYxlD,GACnBga,UAAU,GAEZ9W,CAAClD,GAAO,CACNyV,YAAY,EACZvS,MACE,MAAM8D,EAAQ7D,KAAKuiD,GACbxmD,EAASumD,EAAkBF,GACjC,OAAI17C,GAAS7C,GACJlL,OAAOP,OAAO,GAAI2D,EAAQ8H,GAE5BwlC,GAAexlC,EAAO9H,IAE/BgE,IAAIpC,GACFqC,KAAKuiD,GAAe5kD,QAMF,CAC1B8kD,YAAc5lD,IAAUA,EAAK6lD,WAAW,MACxCC,WAAa9lD,GAAkB,WAATA,EACtBqkD,MAAO,CACL0B,UAAW,eAEbrB,YAAa,CACXkB,aAAa,EACbE,YAAY,KAahB,SAASE,GAAa9oD,EAAKgD,EAAM+lD,EAAIC,EAASC,GAC5C,IAAIC,EAAYlmD,EAAKimD,GAQrB,OAPKC,IACHA,EAAYlmD,EAAKimD,GAAUjpD,EAAImpD,YAAYF,GAAQrtC,MACnDmtC,EAAG3hD,KAAK6hD,IAENC,EAAYF,IACdA,EAAUE,GAELF,EAET,SAASI,GAAappD,EAAKgnD,EAAMqC,EAAezgB,GAE9C,IAAI5lC,GADJ4lC,EAAQA,GAAS,IACA5lC,KAAO4lC,EAAM5lC,MAAQ,GAClC+lD,EAAKngB,EAAM0gB,eAAiB1gB,EAAM0gB,gBAAkB,GACpD1gB,EAAMoe,OAASA,IACjBhkD,EAAO4lC,EAAM5lC,KAAO,GACpB+lD,EAAKngB,EAAM0gB,eAAiB,GAC5B1gB,EAAMoe,KAAOA,GAEfhnD,EAAIupD,OACJvpD,EAAIgnD,KAAOA,EACX,IAAIgC,EAAU,EACd,MAAMjZ,EAAOsZ,EAAcxoD,OAC3B,IAAIC,EAAG2R,EAAG+2C,EAAMtqD,EAAOuqD,EACvB,IAAK3oD,EAAI,EAAGA,EAAIivC,EAAMjvC,IAEpB,GADA5B,EAAQmqD,EAAcvoD,GAClB5B,MAAAA,IAA4D,IAAnByQ,GAAQzQ,GACnD8pD,EAAUF,GAAa9oD,EAAKgD,EAAM+lD,EAAIC,EAAS9pD,QAC1C,GAAIyQ,GAAQzQ,GACjB,IAAKuT,EAAI,EAAG+2C,EAAOtqD,EAAM2B,OAAQ4R,EAAI+2C,EAAM/2C,IACzCg3C,EAAcvqD,EAAMuT,GAChBg3C,MAAAA,GAAsD95C,GAAQ85C,KAChET,EAAUF,GAAa9oD,EAAKgD,EAAM+lD,EAAIC,EAASS,IAKvDzpD,EAAI0pD,UACJ,MAAMC,EAAQZ,EAAGloD,OAAS,EAC1B,GAAI8oD,EAAQN,EAAcxoD,OAAQ,CAChC,IAAKC,EAAI,EAAGA,EAAI6oD,EAAO7oD,WACdkC,EAAK+lD,EAAGjoD,IAEjBioD,EAAGx8C,OAAO,EAAGo9C,GAEf,OAAOX,EAET,SAASY,GAAY/C,EAAOgD,EAAOjuC,GACjC,MAAMgrC,EAAmBC,EAAMiD,wBACzBC,EAAsB,IAAVnuC,EAAcjb,KAAKC,IAAIgb,EAAQ,EAAG,IAAO,EAC3D,OAAOjb,KAAKqiC,OAAO6mB,EAAQE,GAAanD,GAAoBA,EAAmBmD,EAEjF,SAASC,GAAYC,EAAQjqD,IAC3BA,EAAMA,GAAOiqD,EAAOC,WAAW,OAC3BX,OACJvpD,EAAImqD,iBACJnqD,EAAIoqD,UAAU,EAAG,EAAGH,EAAOruC,MAAOquC,EAAOnuC,QACzC9b,EAAI0pD,UAEN,SAASW,GAAUrqD,EAAKuD,EAASutB,EAAGC,GAClC,IAAIrpB,EAAM4iD,EAASC,EAASr/B,EAAMs/B,EAClC,MAAMlmD,EAAQf,EAAQknD,WAChBC,EAAWnnD,EAAQmnD,SACnBC,EAASpnD,EAAQonD,OACvB,IAAIC,GAAOF,GAAY,GAAK3Y,GAC5B,GAAIztC,GAA0B,iBAAVA,IAClBoD,EAAOpD,EAAMqT,WACA,8BAATjQ,GAAiD,+BAATA,GAM1C,OALA1H,EAAIupD,OACJvpD,EAAIiZ,UAAU6X,EAAGC,GACjB/wB,EAAI4lD,OAAOgF,GACX5qD,EAAI6qD,UAAUvmD,GAAQA,EAAMsX,MAAQ,GAAItX,EAAMwX,OAAS,EAAGxX,EAAMsX,MAAOtX,EAAMwX,aAC7E9b,EAAI0pD,UAIR,KAAIz+B,MAAM0/B,IAAWA,GAAU,GAA/B,CAIA,OADA3qD,EAAI8qD,YACIxmD,GACR,QACEtE,EAAI+qD,IAAIj6B,EAAGC,EAAG45B,EAAQ,EAAGhZ,IACzB3xC,EAAIgrD,YACJ,MACF,IAAK,WACHhrD,EAAIirD,OAAOn6B,EAAInwB,KAAKi0C,IAAIgW,GAAOD,EAAQ55B,EAAIpwB,KAAKuZ,IAAI0wC,GAAOD,GAC3DC,GAAO1Y,GACPlyC,EAAIkrD,OAAOp6B,EAAInwB,KAAKi0C,IAAIgW,GAAOD,EAAQ55B,EAAIpwB,KAAKuZ,IAAI0wC,GAAOD,GAC3DC,GAAO1Y,GACPlyC,EAAIkrD,OAAOp6B,EAAInwB,KAAKi0C,IAAIgW,GAAOD,EAAQ55B,EAAIpwB,KAAKuZ,IAAI0wC,GAAOD,GAC3D3qD,EAAIgrD,YACJ,MACF,IAAK,cACHR,EAAwB,KAATG,EACfz/B,EAAOy/B,EAASH,EAChBF,EAAU3pD,KAAKuZ,IAAI0wC,EAAM3Y,IAAc/mB,EACvCq/B,EAAU5pD,KAAKi0C,IAAIgW,EAAM3Y,IAAc/mB,EACvClrB,EAAI+qD,IAAIj6B,EAAIw5B,EAASv5B,EAAIw5B,EAASC,EAAcI,EAAMzwC,GAAIywC,EAAM5Y,IAChEhyC,EAAI+qD,IAAIj6B,EAAIy5B,EAASx5B,EAAIu5B,EAASE,EAAcI,EAAM5Y,GAAS4Y,GAC/D5qD,EAAI+qD,IAAIj6B,EAAIw5B,EAASv5B,EAAIw5B,EAASC,EAAcI,EAAKA,EAAM5Y,IAC3DhyC,EAAI+qD,IAAIj6B,EAAIy5B,EAASx5B,EAAIu5B,EAASE,EAAcI,EAAM5Y,GAAS4Y,EAAMzwC,IACrEna,EAAIgrD,YACJ,MACF,IAAK,OACH,IAAKN,EAAU,CACbx/B,EAAOvqB,KAAKwqD,QAAUR,EACtB3qD,EAAIorD,KAAKt6B,EAAI5F,EAAM6F,EAAI7F,EAAM,EAAIA,EAAM,EAAIA,GAC3C,MAEF0/B,GAAO3Y,GACT,IAAK,UACHqY,EAAU3pD,KAAKuZ,IAAI0wC,GAAOD,EAC1BJ,EAAU5pD,KAAKi0C,IAAIgW,GAAOD,EAC1B3qD,EAAIirD,OAAOn6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5BvqD,EAAIkrD,OAAOp6B,EAAIy5B,EAASx5B,EAAIu5B,GAC5BtqD,EAAIkrD,OAAOp6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5BvqD,EAAIkrD,OAAOp6B,EAAIy5B,EAASx5B,EAAIu5B,GAC5BtqD,EAAIgrD,YACJ,MACF,IAAK,WACHJ,GAAO3Y,GACT,IAAK,QACHqY,EAAU3pD,KAAKuZ,IAAI0wC,GAAOD,EAC1BJ,EAAU5pD,KAAKi0C,IAAIgW,GAAOD,EAC1B3qD,EAAIirD,OAAOn6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5BvqD,EAAIkrD,OAAOp6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5BvqD,EAAIirD,OAAOn6B,EAAIy5B,EAASx5B,EAAIu5B,GAC5BtqD,EAAIkrD,OAAOp6B,EAAIy5B,EAASx5B,EAAIu5B,GAC5B,MACF,IAAK,OACHA,EAAU3pD,KAAKuZ,IAAI0wC,GAAOD,EAC1BJ,EAAU5pD,KAAKi0C,IAAIgW,GAAOD,EAC1B3qD,EAAIirD,OAAOn6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5BvqD,EAAIkrD,OAAOp6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5BvqD,EAAIirD,OAAOn6B,EAAIy5B,EAASx5B,EAAIu5B,GAC5BtqD,EAAIkrD,OAAOp6B,EAAIy5B,EAASx5B,EAAIu5B,GAC5BM,GAAO3Y,GACPqY,EAAU3pD,KAAKuZ,IAAI0wC,GAAOD,EAC1BJ,EAAU5pD,KAAKi0C,IAAIgW,GAAOD,EAC1B3qD,EAAIirD,OAAOn6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5BvqD,EAAIkrD,OAAOp6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5BvqD,EAAIirD,OAAOn6B,EAAIy5B,EAASx5B,EAAIu5B,GAC5BtqD,EAAIkrD,OAAOp6B,EAAIy5B,EAASx5B,EAAIu5B,GAC5B,MACF,IAAK,OACHA,EAAU3pD,KAAKuZ,IAAI0wC,GAAOD,EAC1BJ,EAAU5pD,KAAKi0C,IAAIgW,GAAOD,EAC1B3qD,EAAIirD,OAAOn6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5BvqD,EAAIkrD,OAAOp6B,EAAIw5B,EAASv5B,EAAIw5B,GAC5B,MACF,IAAK,OACHvqD,EAAIirD,OAAOn6B,EAAGC,GACd/wB,EAAIkrD,OAAOp6B,EAAInwB,KAAKuZ,IAAI0wC,GAAOD,EAAQ55B,EAAIpwB,KAAKi0C,IAAIgW,GAAOD,GAG7D3qD,EAAI6L,OACAtI,EAAQ8nD,YAAc,GACxBrrD,EAAIsrD,UAGR,SAASC,GAAen2B,EAAOo2B,EAAMC,GAEnC,OADAA,EAASA,GAAU,IACXD,GAASp2B,GAASA,EAAMtE,EAAI06B,EAAK/2C,KAAOg3C,GAAUr2B,EAAMtE,EAAI06B,EAAKE,MAAQD,GACjFr2B,EAAMrE,EAAIy6B,EAAKh3C,IAAMi3C,GAAUr2B,EAAMrE,EAAIy6B,EAAKG,OAASF,EAEzD,SAASG,GAAS5rD,EAAKwrD,GACrBxrD,EAAIupD,OACJvpD,EAAI8qD,YACJ9qD,EAAIorD,KAAKI,EAAK/2C,KAAM+2C,EAAKh3C,IAAKg3C,EAAKE,MAAQF,EAAK/2C,KAAM+2C,EAAKG,OAASH,EAAKh3C,KACzExU,EAAI6rD,OAEN,SAASC,GAAW9rD,GAClBA,EAAI0pD,UAEN,SAASqC,GAAe/rD,EAAKgsD,EAAUhqD,EAAQiqD,EAAMxE,GACnD,IAAKuE,EACH,OAAOhsD,EAAIkrD,OAAOlpD,EAAO8uB,EAAG9uB,EAAO+uB,GAErC,GAAa,WAAT02B,EAAmB,CACrB,MAAMyE,GAAYF,EAASl7B,EAAI9uB,EAAO8uB,GAAK,EAC3C9wB,EAAIkrD,OAAOgB,EAAUF,EAASj7B,GAC9B/wB,EAAIkrD,OAAOgB,EAAUlqD,EAAO+uB,OACV,UAAT02B,KAAuBwE,EAChCjsD,EAAIkrD,OAAOc,EAASl7B,EAAG9uB,EAAO+uB,GAE9B/wB,EAAIkrD,OAAOlpD,EAAO8uB,EAAGk7B,EAASj7B,GAEhC/wB,EAAIkrD,OAAOlpD,EAAO8uB,EAAG9uB,EAAO+uB,GAE9B,SAASo7B,GAAensD,EAAKgsD,EAAUhqD,EAAQiqD,GAC7C,IAAKD,EACH,OAAOhsD,EAAIkrD,OAAOlpD,EAAO8uB,EAAG9uB,EAAO+uB,GAErC/wB,EAAIosD,cACFH,EAAOD,EAASK,KAAOL,EAASM,KAChCL,EAAOD,EAASO,KAAOP,EAASQ,KAChCP,EAAOjqD,EAAOsqD,KAAOtqD,EAAOqqD,KAC5BJ,EAAOjqD,EAAOwqD,KAAOxqD,EAAOuqD,KAC5BvqD,EAAO8uB,EACP9uB,EAAO+uB,GAEX,SAAS07B,GAAWzsD,EAAK+C,EAAM+tB,EAAGC,EAAGi2B,EAAM/rC,EAAO,IAChD,MAAMyxC,EAAQ/8C,GAAQ5M,GAAQA,EAAO,CAACA,GAChCuoD,EAASrwC,EAAK0xC,YAAc,GAA0B,KAArB1xC,EAAK2xC,YAC5C,IAAI9rD,EAAG+rD,EAIP,IAHA7sD,EAAIupD,OACJvpD,EAAIgnD,KAAOA,EAAKiC,OAmBlB,SAAuBjpD,EAAKib,GACtBA,EAAK6xC,aACP9sD,EAAIiZ,UAAUgC,EAAK6xC,YAAY,GAAI7xC,EAAK6xC,YAAY,IAEjD5d,GAAcj0B,EAAKyvC,WACtB1qD,EAAI4lD,OAAO3qC,EAAKyvC,UAEdzvC,EAAKmqC,QACPplD,EAAI+sD,UAAY9xC,EAAKmqC,OAEnBnqC,EAAK+xC,YACPhtD,EAAIgtD,UAAY/xC,EAAK+xC,WAEnB/xC,EAAKgyC,eACPjtD,EAAIitD,aAAehyC,EAAKgyC,cAhC1BC,CAAcltD,EAAKib,GACdna,EAAI,EAAGA,EAAI4rD,EAAM7rD,SAAUC,EAC9B+rD,EAAOH,EAAM5rD,GACTwqD,IACErwC,EAAK2xC,cACP5sD,EAAImtD,YAAclyC,EAAK2xC,aAEpB1d,GAAcj0B,EAAK0xC,eACtB3sD,EAAIotD,UAAYnyC,EAAK0xC,aAEvB3sD,EAAIqtD,WAAWR,EAAM/7B,EAAGC,EAAG9V,EAAKqyC,WAElCttD,EAAIutD,SAASV,EAAM/7B,EAAGC,EAAG9V,EAAKqyC,UAC9BE,GAAaxtD,EAAK8wB,EAAGC,EAAG87B,EAAM5xC,GAC9B8V,GAAKi2B,EAAKE,WAEZlnD,EAAI0pD,UAmBN,SAAS8D,GAAaxtD,EAAK8wB,EAAGC,EAAG87B,EAAM5xC,GACrC,GAAIA,EAAKwyC,eAAiBxyC,EAAKyyC,UAAW,CACxC,MAAMC,EAAU3tD,EAAImpD,YAAY0D,GAC1Bp4C,EAAOqc,EAAI68B,EAAQC,sBACnBlC,EAAQ56B,EAAI68B,EAAQE,uBACpBr5C,EAAMuc,EAAI48B,EAAQG,wBAClBnC,EAAS56B,EAAI48B,EAAQI,yBACrBC,EAAc/yC,EAAKwyC,eAAiBj5C,EAAMm3C,GAAU,EAAIA,EAC9D3rD,EAAImtD,YAAcntD,EAAI+sD,UACtB/sD,EAAI8qD,YACJ9qD,EAAIotD,UAAYnyC,EAAKgzC,iBAAmB,EACxCjuD,EAAIirD,OAAOx2C,EAAMu5C,GACjBhuD,EAAIkrD,OAAOQ,EAAOsC,GAClBhuD,EAAIsrD,UAGR,SAAS4C,GAAmBluD,EAAKorD,GAC/B,MAAMt6B,EAACA,EAACC,EAAEA,EAAC4nB,EAAEA,EAACtyC,EAAEA,EAACskD,OAAEA,GAAUS,EAC7BprD,EAAI+qD,IAAIj6B,EAAI65B,EAAOwD,QAASp9B,EAAI45B,EAAOwD,QAASxD,EAAOwD,SAAUnc,GAAS73B,IAAI,GAC9Ena,EAAIkrD,OAAOp6B,EAAGC,EAAI1qB,EAAIskD,EAAOyD,YAC7BpuD,EAAI+qD,IAAIj6B,EAAI65B,EAAOyD,WAAYr9B,EAAI1qB,EAAIskD,EAAOyD,WAAYzD,EAAOyD,WAAYj0C,GAAI63B,IAAS,GAC1FhyC,EAAIkrD,OAAOp6B,EAAI6nB,EAAIgS,EAAO0D,YAAat9B,EAAI1qB,GAC3CrG,EAAI+qD,IAAIj6B,EAAI6nB,EAAIgS,EAAO0D,YAAat9B,EAAI1qB,EAAIskD,EAAO0D,YAAa1D,EAAO0D,YAAarc,GAAS,GAAG,GAChGhyC,EAAIkrD,OAAOp6B,EAAI6nB,EAAG5nB,EAAI45B,EAAO2D,UAC7BtuD,EAAI+qD,IAAIj6B,EAAI6nB,EAAIgS,EAAO2D,SAAUv9B,EAAI45B,EAAO2D,SAAU3D,EAAO2D,SAAU,GAAItc,IAAS,GACpFhyC,EAAIkrD,OAAOp6B,EAAI65B,EAAOwD,QAASp9B,GAGjC,MAAMw9B,GAAc,IAAIC,OAAO,wCACzBC,GAAa,IAAID,OAAO,yEAC9B,SAASE,GAAa9qD,EAAOsnB,GAC3B,MAAMnW,GAAW,GAAKnR,GAAOmY,MAAMwyC,IACnC,IAAKx5C,GAA0B,WAAfA,EAAQ,GACtB,OAAc,IAAPmW,EAGT,OADAtnB,GAASmR,EAAQ,GACTA,EAAQ,IAChB,IAAK,KACH,OAAOnR,EACT,IAAK,IACHA,GAAS,IAGX,OAAOsnB,EAAOtnB,EAGhB,SAAS+qD,GAAkB/qD,EAAOpC,GAChC,MAAMoK,EAAM,GACNgjD,EAAWjiD,GAASnL,GACpBG,EAAOitD,EAAWhwD,OAAO+C,KAAKH,GAASA,EACvCqtD,EAAOliD,GAAS/I,GAClBgrD,EACEj6C,GAAQ26B,GAAe1rC,EAAM+Q,GAAO/Q,EAAMpC,EAAMmT,KAChDA,GAAQ/Q,EAAM+Q,GAChB,IAAM/Q,EACV,IAAK,MAAM+Q,KAAQhT,EACjBiK,EAAI+I,IAAqBk6C,EAAKl6C,IAXF,EAa9B,OAAO/I,EAET,SAASkjD,GAAOlrD,GACd,OAAO+qD,GAAkB/qD,EAAO,CAAC4Q,IAAK,IAAKk3C,MAAO,IAAKC,OAAQ,IAAKl3C,KAAM,MAE5E,SAASs6C,GAAcnrD,GACrB,OAAO+qD,GAAkB/qD,EAAO,CAAC,UAAW,WAAY,aAAc,gBAExE,SAASorD,GAAUprD,GACjB,MAAM6I,EAAMqiD,GAAOlrD,GAGnB,OAFA6I,EAAImP,MAAQnP,EAAIgI,KAAOhI,EAAIi/C,MAC3Bj/C,EAAIqP,OAASrP,EAAI+H,IAAM/H,EAAIk/C,OACpBl/C,EAET,SAASwiD,GAAO1rD,EAAS2rD,GACvB3rD,EAAUA,GAAW,GACrB2rD,EAAWA,GAAYh3B,GAAS8uB,KAChC,IAAI97B,EAAOokB,GAAe/rC,EAAQ2nB,KAAMgkC,EAAShkC,MAC7B,iBAATA,IACTA,EAAOH,SAASG,EAAM,KAExB,IAAI5mB,EAAQgrC,GAAe/rC,EAAQe,MAAO4qD,EAAS5qD,OAC/CA,KAAW,GAAKA,GAAOyX,MAAM0yC,MAC/BU,QAAQC,KAAK,kCAAoC9qD,EAAQ,KACzDA,EAAQ,IAEV,MAAM0iD,EAAO,CACXC,OAAQ3X,GAAe/rC,EAAQ0jD,OAAQiI,EAASjI,QAChDC,WAAYwH,GAAapf,GAAe/rC,EAAQ2jD,WAAYgI,EAAShI,YAAah8B,GAClFA,KAAAA,EACA5mB,MAAAA,EACA+gD,OAAQ/V,GAAe/rC,EAAQ8hD,OAAQ6J,EAAS7J,QAChD4D,OAAQ,IAGV,OADAjC,EAAKiC,OAzVP,SAAsBjC,GACpB,OAAKA,GAAQ9X,GAAc8X,EAAK97B,OAASgkB,GAAc8X,EAAKC,QACnD,MAEDD,EAAK1iD,MAAQ0iD,EAAK1iD,MAAQ,IAAM,KACrC0iD,EAAK3B,OAAS2B,EAAK3B,OAAS,IAAM,IACnC2B,EAAK97B,KAAO,MACZ87B,EAAKC,OAkVOoI,CAAarI,GACpBA,EAET,SAASx+C,GAAQ8mD,EAAQ/jD,EAASe,EAAOijD,GACvC,IACIzuD,EAAGivC,EAAMnsC,EADT4rD,GAAY,EAEhB,IAAK1uD,EAAI,EAAGivC,EAAOuf,EAAOzuD,OAAQC,EAAIivC,IAAQjvC,EAE5C,GADA8C,EAAQ0rD,EAAOxuD,QACDN,IAAVoD,SAGYpD,IAAZ+K,GAA0C,mBAAV3H,IAClCA,EAAQA,EAAM2H,GACdikD,GAAY,QAEAhvD,IAAV8L,GAAuBqD,GAAQ/L,KACjCA,EAAQA,EAAM0I,EAAQ1I,EAAM/C,QAC5B2uD,GAAY,QAEAhvD,IAAVoD,GAIF,OAHI2rD,IAASC,IACXD,EAAKC,WAAY,GAEZ5rD,EAab,SAAS6rD,GAAcC,EAAenkD,GACpC,OAAO3M,OAAOP,OAAOO,OAAOC,OAAO6wD,GAAgBnkD,GAGrD,SAASokD,GAAQC,EAAOhsD,EAAOisD,GAC7BA,EAAMA,IAASvjD,GAAUsjD,EAAMtjD,GAAS1I,GACxC,IAEIksD,EAFAC,EAAKH,EAAM/uD,OAAS,EACpBmvD,EAAK,EAET,KAAOD,EAAKC,EAAK,GACfF,EAAOE,EAAKD,GAAO,EACfF,EAAIC,GACNE,EAAKF,EAELC,EAAKD,EAGT,MAAO,CAACE,GAAAA,EAAID,GAAAA,GAEd,MAAME,GAAe,CAACL,EAAOvrD,EAAKT,IAChC+rD,GAAQC,EAAOhsD,EAAO0I,GAASsjD,EAAMtjD,GAAOjI,GAAOT,GAC/CssD,GAAgB,CAACN,EAAOvrD,EAAKT,IACjC+rD,GAAQC,EAAOhsD,EAAO0I,GAASsjD,EAAMtjD,GAAOjI,IAAQT,GActD,MAAMusD,GAAc,CAAC,OAAQ,MAAO,QAAS,SAAU,WA+BvD,SAASC,GAAoBtd,EAAOhhC,GAClC,MAAMu+C,EAAOvd,EAAMwd,SACnB,IAAKD,EACH,OAEF,MAAME,EAAYF,EAAKE,UACjBjkD,EAAQikD,EAAU/qD,QAAQsM,IACjB,IAAXxF,GACFikD,EAAUhkD,OAAOD,EAAO,GAEtBikD,EAAU1vD,OAAS,IAGvBsvD,GAAYnxD,QAASqF,WACZyuC,EAAMzuC,YAERyuC,EAAMwd,UAEf,SAASE,GAAavhD,GACpB,MAAMzK,EAAM,IAAI3C,IAChB,IAAIf,EAAGivC,EACP,IAAKjvC,EAAI,EAAGivC,EAAO9gC,EAAMpO,OAAQC,EAAIivC,IAAQjvC,EAC3C0D,EAAI2E,IAAI8F,EAAMnO,IAEhB,OAAI0D,EAAI0mB,OAAS6kB,EACR9gC,EAEFvI,MAAMC,KAAKnC,GAGpB,SAASisD,GAAgBC,EAAQC,EAAW,CAAC,IAAKC,EAAaF,EAAQxB,EAAU2B,EAAY,KAAMH,EAAO,KACnGlf,GAAQ0d,KACXA,EAAW4B,GAAS,YAAaJ,IAEnC,MAAM9nB,EAAQ,CACZ5iC,CAAC+qD,OAAOC,aAAc,SACtBC,YAAY,EACZC,QAASR,EACTS,YAAaP,EACb/H,UAAWqG,EACXkC,WAAYP,EACZQ,SAAWhL,GAAUoK,GAAgB,CAACpK,KAAUqK,GAASC,EAAUC,EAAY1B,IAEjF,OAAO,IAAIoC,MAAM1oB,EAAO,CACtB2oB,eAAc,CAACvvD,EAAQ2S,YACd3S,EAAO2S,UACP3S,EAAOwvD,aACPd,EAAO,GAAG/7C,IACV,GAETtF,IAAG,CAACrN,EAAQ2S,IACH88C,GAAQzvD,EAAQ2S,EACrB,IAuLR,SAA8BA,EAAMg8C,EAAUD,EAAQgB,GACpD,IAAI9tD,EACJ,IAAK,MAAMkyB,KAAU66B,EAEnB,GADA/sD,EAAQktD,GAASa,GAAQ77B,EAAQnhB,GAAO+7C,GACpClf,GAAQ5tC,GACV,OAAOguD,GAAiBj9C,EAAM/Q,GAC1BiuD,GAAkBnB,EAAQgB,EAAO/8C,EAAM/Q,GACvCA,EA9LIkuD,CAAqBn9C,EAAMg8C,EAAUD,EAAQ1uD,IAEvDsW,yBAAwB,CAACtW,EAAQ2S,IACxBo9C,QAAQz5C,yBAAyBtW,EAAOkvD,QAAQ,GAAIv8C,GAE7Dq9C,eAAc,IACLD,QAAQC,eAAetB,EAAO,IAEvC5uD,IAAG,CAACE,EAAQ2S,IACHs9C,GAAqBjwD,GAAQmlC,SAASxyB,GAE/Cu9C,QAAQlwD,GACCiwD,GAAqBjwD,GAE9BgE,IAAIhE,EAAQ2S,EAAM/Q,GAChB,MAAMuuD,EAAUnwD,EAAOowD,WAAapwD,EAAOowD,SAAWvB,KAGtD,OAFA7uD,EAAO2S,GAAQw9C,EAAQx9C,GAAQ/Q,SACxB5B,EAAOwvD,OACP,KAIb,SAASa,GAAeX,EAAOnmD,EAAS+mD,EAAUC,GAChD,MAAM3pB,EAAQ,CACZqoB,YAAY,EACZuB,OAAQd,EACRe,SAAUlnD,EACVmnD,UAAWJ,EACXK,OAAQ,IAAI9wD,IACZ0kD,aAAcA,GAAamL,EAAOa,GAClCK,WAAa5yD,GAAQqyD,GAAeX,EAAO1xD,EAAKsyD,EAAUC,GAC1DlB,SAAWhL,GAAUgM,GAAeX,EAAML,SAAShL,GAAQ96C,EAAS+mD,EAAUC,IAEhF,OAAO,IAAIjB,MAAM1oB,EAAO,CACtB2oB,eAAc,CAACvvD,EAAQ2S,YACd3S,EAAO2S,UACP+8C,EAAM/8C,IACN,GAETtF,IAAG,CAACrN,EAAQ2S,EAAMk+C,IACTpB,GAAQzvD,EAAQ2S,EACrB,IA4CR,SAA6B3S,EAAQ2S,EAAMk+C,GACzC,MAAML,OAACA,EAAMC,SAAEA,EAAQC,UAAEA,EAAWnM,aAAcriD,GAAelC,EACjE,IAAI4B,EAAQ4uD,EAAO79C,GACf88B,GAAW7tC,IAAUM,EAAY4uD,aAAan+C,KAChD/Q,EAUJ,SAA4B+Q,EAAM/Q,EAAO5B,EAAQ6wD,GAC/C,MAAML,OAACA,EAAMC,SAAEA,EAAQC,UAAEA,EAASC,OAAEA,GAAU3wD,EAC9C,GAAI2wD,EAAO7wD,IAAI6S,GACb,MAAM,IAAI3N,MAAM,uBAAyBN,MAAMC,KAAKgsD,GAAQr7C,KAAK,MAAQ,KAAO3C,GAElFg+C,EAAOxpD,IAAIwL,GACX/Q,EAAQA,EAAM6uD,EAAUC,GAAaG,GACrCF,EAAO5oD,OAAO4K,GACVi9C,GAAiBj9C,EAAM/Q,KACzBA,EAAQiuD,GAAkBW,EAAOtB,QAASsB,EAAQ79C,EAAM/Q,IAE1D,OAAOA,EArBGmvD,CAAmBp+C,EAAM/Q,EAAO5B,EAAQ6wD,IAE9CljD,GAAQ/L,IAAUA,EAAM/C,SAC1B+C,EAoBJ,SAAuB+Q,EAAM/Q,EAAO5B,EAAQgxD,GAC1C,MAAMR,OAACA,EAAMC,SAAEA,EAAQC,UAAEA,EAAWnM,aAAcriD,GAAelC,EACjE,GAAIwvC,GAAQihB,EAASnmD,QAAU0mD,EAAYr+C,GACzC/Q,EAAQA,EAAM6uD,EAASnmD,MAAQ1I,EAAM/C,aAChC,GAAI8L,GAAS/I,EAAM,IAAK,CAC7B,MAAM4L,EAAM5L,EACN8sD,EAAS8B,EAAOtB,QAAQrmD,OAAOspC,GAAKA,IAAM3kC,GAChD5L,EAAQ,GACR,IAAK,MAAMoyB,KAAQxmB,EAAK,CACtB,MAAMyjD,EAAWpB,GAAkBnB,EAAQ8B,EAAQ79C,EAAMqhB,GACzDpyB,EAAMwD,KAAKirD,GAAeY,EAAUR,EAAUC,GAAaA,EAAU/9C,GAAOzQ,KAGhF,OAAON,EAjCGsvD,CAAcv+C,EAAM/Q,EAAO5B,EAAQkC,EAAY8uD,cAErDpB,GAAiBj9C,EAAM/Q,KACzBA,EAAQyuD,GAAezuD,EAAO6uD,EAAUC,GAAaA,EAAU/9C,GAAOzQ,IAExE,OAAON,EAxDKuvD,CAAoBnxD,EAAQ2S,EAAMk+C,IAE5Cv6C,yBAAwB,CAACtW,EAAQ2S,IACxB3S,EAAOukD,aAAa6M,QACvBrB,QAAQjwD,IAAI4vD,EAAO/8C,GAAQ,CAAC4D,YAAY,EAAM86C,cAAc,QAAQ7yD,EACpEuxD,QAAQz5C,yBAAyBo5C,EAAO/8C,GAE9Cq9C,eAAc,IACLD,QAAQC,eAAeN,GAEhC5vD,IAAG,CAACE,EAAQ2S,IACHo9C,QAAQjwD,IAAI4vD,EAAO/8C,GAE5Bu9C,QAAO,IACEH,QAAQG,QAAQR,GAEzBltD,IAAG,CAACxC,EAAQ2S,EAAM/Q,KAChB8tD,EAAM/8C,GAAQ/Q,SACP5B,EAAO2S,IACP,KAIb,SAAS4xC,GAAamL,EAAOx5B,EAAW,CAACo7B,YAAY,EAAMC,WAAW,IACpE,MAAM7K,YAACA,EAAcxwB,EAASo7B,WAAU1K,WAAEA,EAAa1wB,EAASq7B,UAASC,SAAEA,EAAWt7B,EAASk7B,SAAW1B,EAC1G,MAAO,CACL0B,QAASI,EACTF,WAAY5K,EACZ6K,UAAW3K,EACXkK,aAAcrhB,GAAWiX,GAAeA,EAAc,IAAMA,EAC5DsK,YAAavhB,GAAWmX,GAAcA,EAAa,IAAMA,GAG7D,MAAM+I,GAAU,CAAC77B,EAAQhzB,IAASgzB,EAASA,EAASsb,GAAYtuC,GAAQA,EAClE8uD,GAAmB,CAACj9C,EAAM/Q,IAAU+I,GAAS/I,IAAmB,aAAT+Q,IACzB,OAAjC/V,OAAOozD,eAAepuD,IAAmBA,EAAMgJ,cAAgBhO,QAClE,SAAS6yD,GAAQzvD,EAAQ2S,EAAMnM,GAC7B,GAAI5J,OAAOiR,UAAUkhC,eAAe9oC,KAAKjG,EAAQ2S,GAC/C,OAAO3S,EAAO2S,GAEhB,MAAM/Q,EAAQ4E,IAEd,OADAxG,EAAO2S,GAAQ/Q,EACRA,EA4CT,SAAS6vD,GAAgBvE,EAAUv6C,EAAM/Q,GACvC,OAAO6tC,GAAWyd,GAAYA,EAASv6C,EAAM/Q,GAASsrD,EAExD,MAAMwE,GAAW,CAACrvD,EAAK8R,KAAmB,IAAR9R,EAAe8R,EAC9B,iBAAR9R,EAAmB6sC,GAAiB/6B,EAAQ9R,QAAO7D,EAC9D,SAASmzD,GAAUnvD,EAAKovD,EAAcvvD,EAAKwvD,EAAgBjwD,GACzD,IAAK,MAAMuS,KAAUy9C,EAAc,CACjC,MAAMvN,EAAQqN,GAASrvD,EAAK8R,GAC5B,GAAIkwC,EAAO,CACT7hD,EAAI2E,IAAIk9C,GACR,MAAM6I,EAAWuE,GAAgBpN,EAAMwC,UAAWxkD,EAAKT,GACvD,GAAI4tC,GAAQ0d,IAAaA,IAAa7qD,GAAO6qD,IAAa2E,EACxD,OAAO3E,OAEJ,IAAc,IAAV7I,GAAmB7U,GAAQqiB,IAAmBxvD,IAAQwvD,EAC/D,OAAO,KAGX,OAAO,EAET,SAAShC,GAAkB+B,EAAcX,EAAUt+C,EAAM/Q,GACvD,MAAMgtD,EAAaqC,EAAS9B,YACtBjC,EAAWuE,GAAgBR,EAASpK,UAAWl0C,EAAM/Q,GACrDkwD,EAAY,IAAIF,KAAiBhD,GACjCpsD,EAAM,IAAI3C,IAChB2C,EAAI2E,IAAIvF,GACR,IAAIS,EAAM0vD,GAAiBvvD,EAAKsvD,EAAWn/C,EAAMu6C,GAAYv6C,EAAM/Q,GACnE,OAAY,OAARS,MAGAmtC,GAAQ0d,IAAaA,IAAav6C,IACpCtQ,EAAM0vD,GAAiBvvD,EAAKsvD,EAAW5E,EAAU7qD,EAAKT,GAC1C,OAARS,KAICosD,GAAgB/pD,MAAMC,KAAKnC,GAAM,CAAC,IAAKosD,EAAY1B,EACxD,IAQJ,SAAsB+D,EAAUt+C,EAAM/Q,GACpC,MAAMuS,EAAS88C,EAAS7B,aAClBz8C,KAAQwB,IACZA,EAAOxB,GAAQ,IAEjB,MAAM3S,EAASmU,EAAOxB,GACtB,GAAIhF,GAAQ3N,IAAW2K,GAAS/I,GAC9B,OAAOA,EAET,OAAO5B,EAjBCgyD,CAAaf,EAAUt+C,EAAM/Q,KAEvC,SAASmwD,GAAiBvvD,EAAKsvD,EAAWzvD,EAAK6qD,EAAUl5B,GACvD,KAAO3xB,GACLA,EAAMsvD,GAAUnvD,EAAKsvD,EAAWzvD,EAAK6qD,EAAUl5B,GAEjD,OAAO3xB,EAwBT,SAASysD,GAASzsD,EAAKqsD,GACrB,IAAK,MAAMrK,KAASqK,EAAQ,CAC1B,IAAKrK,EACH,SAEF,MAAMziD,EAAQyiD,EAAMhiD,GACpB,GAAImtC,GAAQ5tC,GACV,OAAOA,GAIb,SAASquD,GAAqBjwD,GAC5B,IAAIL,EAAOK,EAAOwvD,MAIlB,OAHK7vD,IACHA,EAAOK,EAAOwvD,MAIlB,SAAkCd,GAChC,MAAMlsD,EAAM,IAAI3C,IAChB,IAAK,MAAMwkD,KAASqK,EAClB,IAAK,MAAMrsD,KAAOzF,OAAO+C,KAAK0kD,GAAOx7C,OAAOrM,IAAMA,EAAEmqD,WAAW,MAC7DnkD,EAAI2E,IAAI9E,GAGZ,OAAOqC,MAAMC,KAAKnC,GAXMyvD,CAAyBjyD,EAAOkvD,UAEjDvvD,EAYT,MAAMuyD,GAAUlpC,OAAOkpC,SAAW,MAC5BC,GAAW,CAACh/B,EAAQr0B,IAAMA,EAAIq0B,EAAOt0B,SAAWs0B,EAAOr0B,GAAG0vB,MAAQ2E,EAAOr0B,GACzEszD,GAAgB7M,GAA4B,MAAdA,EAAoB,IAAM,IAC9D,SAAS8M,GAAYC,EAAYC,EAAaC,EAAYjuD,GACxD,MAAMylD,EAAWsI,EAAW9jC,KAAO+jC,EAAcD,EAC3C16C,EAAU26C,EACV5+C,EAAO6+C,EAAWhkC,KAAO+jC,EAAcC,EACvCC,EAAM7gB,GAAsBh6B,EAASoyC,GACrC0I,EAAM9gB,GAAsBj+B,EAAMiE,GACxC,IAAI+6C,EAAMF,GAAOA,EAAMC,GACnBE,EAAMF,GAAOD,EAAMC,GACvBC,EAAM1pC,MAAM0pC,GAAO,EAAIA,EACvBC,EAAM3pC,MAAM2pC,GAAO,EAAIA,EACvB,MAAMC,EAAKtuD,EAAIouD,EACTG,EAAKvuD,EAAIquD,EACf,MAAO,CACL5I,SAAU,CACRl7B,EAAGlX,EAAQkX,EAAI+jC,GAAMl/C,EAAKmb,EAAIk7B,EAASl7B,GACvCC,EAAGnX,EAAQmX,EAAI8jC,GAAMl/C,EAAKob,EAAIi7B,EAASj7B,IAEzCpb,KAAM,CACJmb,EAAGlX,EAAQkX,EAAIgkC,GAAMn/C,EAAKmb,EAAIk7B,EAASl7B,GACvCC,EAAGnX,EAAQmX,EAAI+jC,GAAMn/C,EAAKob,EAAIi7B,EAASj7B,KAuD7C,SAASgkC,GAAoB5/B,EAAQoyB,EAAY,KAC/C,MAAMyN,EAAYZ,GAAa7M,GACzB0N,EAAY9/B,EAAOt0B,OACnBq0D,EAASxuD,MAAMuuD,GAAWppD,KAAK,GAC/BspD,EAAKzuD,MAAMuuD,GACjB,IAAIn0D,EAAGs0D,EAAaC,EAChBC,EAAanB,GAASh/B,EAAQ,GAClC,IAAKr0B,EAAI,EAAGA,EAAIm0D,IAAan0D,EAI3B,GAHAs0D,EAAcC,EACdA,EAAeC,EACfA,EAAanB,GAASh/B,EAAQr0B,EAAI,GAC7Bu0D,EAAL,CAGA,GAAIC,EAAY,CACd,MAAMC,EAAaD,EAAW/N,GAAa8N,EAAa9N,GACxD2N,EAAOp0D,GAAoB,IAAfy0D,GAAoBD,EAAWN,GAAaK,EAAaL,IAAcO,EAAa,EAElGJ,EAAGr0D,GAAMs0D,EACJE,EACAljB,GAAK8iB,EAAOp0D,EAAI,MAAQsxC,GAAK8iB,EAAOp0D,IAAO,GAC3Co0D,EAAOp0D,EAAI,GAAKo0D,EAAOp0D,IAAM,EAFhBo0D,EAAOp0D,EAAI,GADNo0D,EAAOp0D,IArElC,SAAwBq0B,EAAQ+/B,EAAQC,GACtC,MAAMF,EAAY9/B,EAAOt0B,OACzB,IAAI20D,EAAQC,EAAOC,EAAMC,EAAkBN,EACvCC,EAAanB,GAASh/B,EAAQ,GAClC,IAAK,IAAIr0B,EAAI,EAAGA,EAAIm0D,EAAY,IAAKn0D,EACnCu0D,EAAeC,EACfA,EAAanB,GAASh/B,EAAQr0B,EAAI,GAC7Bu0D,GAAiBC,IAGlB9iB,GAAa0iB,EAAOp0D,GAAI,EAAGozD,IAC7BiB,EAAGr0D,GAAKq0D,EAAGr0D,EAAI,GAAK,GAGtB00D,EAASL,EAAGr0D,GAAKo0D,EAAOp0D,GACxB20D,EAAQN,EAAGr0D,EAAI,GAAKo0D,EAAOp0D,GAC3B60D,EAAmBh1D,KAAK8sC,IAAI+nB,EAAQ,GAAK70D,KAAK8sC,IAAIgoB,EAAO,GACrDE,GAAoB,IAGxBD,EAAO,EAAI/0D,KAAKyhB,KAAKuzC,GACrBR,EAAGr0D,GAAK00D,EAASE,EAAOR,EAAOp0D,GAC/Bq0D,EAAGr0D,EAAI,GAAK20D,EAAQC,EAAOR,EAAOp0D,MAoDpC80D,CAAezgC,EAAQ+/B,EAAQC,GAjDjC,SAAyBhgC,EAAQggC,EAAI5N,EAAY,KAC/C,MAAMyN,EAAYZ,GAAa7M,GACzB0N,EAAY9/B,EAAOt0B,OACzB,IAAIg1D,EAAOT,EAAaC,EACpBC,EAAanB,GAASh/B,EAAQ,GAClC,IAAK,IAAIr0B,EAAI,EAAGA,EAAIm0D,IAAan0D,EAAG,CAIlC,GAHAs0D,EAAcC,EACdA,EAAeC,EACfA,EAAanB,GAASh/B,EAAQr0B,EAAI,IAC7Bu0D,EACH,SAEF,MAAMS,EAAST,EAAa9N,GACtBwO,EAASV,EAAaL,GACxBI,IACFS,GAASC,EAASV,EAAY7N,IAAc,EAC5C8N,EAAa,MAAM9N,GAAeuO,EAASD,EAC3CR,EAAa,MAAML,GAAee,EAASF,EAAQV,EAAGr0D,IAEpDw0D,IACFO,GAASP,EAAW/N,GAAauO,GAAU,EAC3CT,EAAa,MAAM9N,GAAeuO,EAASD,EAC3CR,EAAa,MAAML,GAAee,EAASF,EAAQV,EAAGr0D,KA4B1Dk1D,CAAgB7gC,EAAQggC,EAAI5N,GAE9B,SAAS0O,GAAgBC,EAAIl8C,EAAKpZ,GAChC,OAAOD,KAAKC,IAAID,KAAKqZ,IAAIk8C,EAAIt1D,GAAMoZ,GAuBrC,SAASm8C,GAA2BhhC,EAAQ5xB,EAASioD,EAAMntC,EAAMkpC,GAC/D,IAAIzmD,EAAGivC,EAAM3a,EAAOghC,EAIpB,GAHI7yD,EAAQ8yD,WACVlhC,EAASA,EAAOtqB,OAAQqrD,IAAQA,EAAG1lC,OAEE,aAAnCjtB,EAAQ+yD,uBACVvB,GAAoB5/B,EAAQoyB,OACvB,CACL,IAAIxxC,EAAOsI,EAAO8W,EAAOA,EAAOt0B,OAAS,GAAKs0B,EAAO,GACrD,IAAKr0B,EAAI,EAAGivC,EAAO5a,EAAOt0B,OAAQC,EAAIivC,IAAQjvC,EAC5Cs0B,EAAQD,EAAOr0B,GACfs1D,EAAgB/B,GACdt+C,EACAqf,EACAD,EAAOx0B,KAAKqZ,IAAIlZ,EAAI,EAAGivC,GAAQ1xB,EAAO,EAAI,IAAM0xB,GAChDxsC,EAAQgzD,SAEVnhC,EAAMi3B,KAAO+J,EAAcpK,SAASl7B,EACpCsE,EAAMm3B,KAAO6J,EAAcpK,SAASj7B,EACpCqE,EAAMk3B,KAAO8J,EAAczgD,KAAKmb,EAChCsE,EAAMo3B,KAAO4J,EAAczgD,KAAKob,EAChChb,EAAOqf,EAGP7xB,EAAQizD,iBA7Cd,SAAyBrhC,EAAQq2B,GAC/B,IAAI1qD,EAAGivC,EAAM3a,EAAOqhC,EAAQC,EACxBC,EAAapL,GAAep2B,EAAO,GAAIq2B,GAC3C,IAAK1qD,EAAI,EAAGivC,EAAO5a,EAAOt0B,OAAQC,EAAIivC,IAAQjvC,EAC5C41D,EAAaD,EACbA,EAASE,EACTA,EAAa71D,EAAIivC,EAAO,GAAKwb,GAAep2B,EAAOr0B,EAAI,GAAI0qD,GACtDiL,IAGLrhC,EAAQD,EAAOr0B,GACX41D,IACFthC,EAAMi3B,KAAO4J,GAAgB7gC,EAAMi3B,KAAMb,EAAK/2C,KAAM+2C,EAAKE,OACzDt2B,EAAMm3B,KAAO0J,GAAgB7gC,EAAMm3B,KAAMf,EAAKh3C,IAAKg3C,EAAKG,SAEtDgL,IACFvhC,EAAMk3B,KAAO2J,GAAgB7gC,EAAMk3B,KAAMd,EAAK/2C,KAAM+2C,EAAKE,OACzDt2B,EAAMo3B,KAAOyJ,GAAgB7gC,EAAMo3B,KAAMhB,EAAKh3C,IAAKg3C,EAAKG,UA6B1D6K,CAAgBrhC,EAAQq2B,GAI5B,SAASoL,KACP,MAAyB,oBAAX7nD,QAA8C,oBAAbpP,SAEjD,SAASk3D,GAAeC,GACtB,IAAI3gD,EAAS2gD,EAAQv0D,WAIrB,OAHI4T,GAAgC,wBAAtBA,EAAOwB,aACnBxB,EAASA,EAAO3I,MAEX2I,EAET,SAAS4gD,GAAcC,EAAY/0D,EAAMg1D,GACvC,IAAIC,EASJ,MAR0B,iBAAfF,GACTE,EAAgBnsC,SAASisC,EAAY,KACJ,IAA7BA,EAAWxxD,QAAQ,OACrB0xD,EAAgBA,EAAgB,IAAMj1D,EAAKM,WAAW00D,KAGxDC,EAAgBF,EAEXE,EAET,MAAM7oD,GAAoBxL,GAAYkM,OAAOV,iBAAiBxL,EAAS,MAIvE,MAAM2nC,GAAY,CAAC,MAAO,QAAS,SAAU,QAC7C,SAAS2sB,GAAmBzjD,EAAQpP,EAAOu5B,GACzC,MAAMp8B,EAAS,GACfo8B,EAASA,EAAS,IAAMA,EAAS,GACjC,IAAK,IAAI/8B,EAAI,EAAGA,EAAI,EAAGA,IAAK,CAC1B,MAAMqwC,EAAM3G,GAAU1pC,GACtBW,EAAO0vC,GAAOv9B,WAAWF,EAAOpP,EAAQ,IAAM6sC,EAAMtT,KAAY,EAIlE,OAFAp8B,EAAOma,MAAQna,EAAOgT,KAAOhT,EAAOiqD,MACpCjqD,EAAOqa,OAASra,EAAO+S,IAAM/S,EAAOkqD,OAC7BlqD,EAqBT,SAAS21D,GAAoBnkD,EAAK4zC,GAChC,MAAMoD,OAACA,EAAMH,wBAAEA,GAA2BjD,EACpCviD,EAAQ+J,GAAiB47C,GACzBoN,EAAgC,eAApB/yD,EAAMmpB,UAClB6pC,EAAWH,GAAmB7yD,EAAO,WACrCizD,EAAUJ,GAAmB7yD,EAAO,SAAU,UAC9CwsB,EAACA,EAACC,EAAEA,EAAC/c,IAAEA,GAxBf,SAA2Bf,EAAKg3C,GAC9B,MAAM/jD,EAAI+M,EAAIukD,QAAUvkD,EAClB+K,EAAU9X,EAAE8X,QACZoyB,EAASpyB,GAAWA,EAAQnd,OAASmd,EAAQ,GAAK9X,GAClDuxD,QAACA,EAAOC,QAAEA,GAAWtnB,EAC3B,IACItf,EAAGC,EADH/c,GAAM,EAEV,GARmB,EAAC8c,EAAGC,EAAG/uB,KAAY8uB,EAAI,GAAKC,EAAI,MAAQ/uB,IAAWA,EAAOgd,YAQzE24C,CAAaF,EAASC,EAASxxD,EAAElE,QACnC8uB,EAAI2mC,EACJ1mC,EAAI2mC,MACC,CACL,MAAMtM,EAAOnB,EAAOh2C,wBACpB6c,EAAIsf,EAAOxQ,QAAUwrB,EAAK32C,KAC1Bsc,EAAIqf,EAAOvQ,QAAUurB,EAAK52C,IAC1BR,GAAM,EAER,MAAO,CAAC8c,EAAAA,EAAGC,EAAAA,EAAG/c,IAAAA,GAQM4jD,CAAkB3kD,EAAKg3C,GACrCK,EAAUgN,EAAS7iD,MAAQT,GAAOujD,EAAQ9iD,MAC1C81C,EAAU+M,EAAS9iD,KAAOR,GAAOujD,EAAQ/iD,KAC/C,IAAIoH,MAACA,EAAKE,OAAEA,GAAU+qC,EAKtB,OAJIwQ,IACFz7C,GAAS07C,EAAS17C,MAAQ27C,EAAQ37C,MAClCE,GAAUw7C,EAASx7C,OAASy7C,EAAQz7C,QAE/B,CACLgV,EAAGnwB,KAAKqiC,OAAOlS,EAAIw5B,GAAW1uC,EAAQquC,EAAOruC,MAAQkuC,GACrD/4B,EAAGpwB,KAAKqiC,OAAOjS,EAAIw5B,GAAWzuC,EAASmuC,EAAOnuC,OAASguC,IA4B3D,MAAM+N,GAASppC,GAAK9tB,KAAKqiC,MAAU,GAAJvU,GAAU,GACzC,SAASqpC,GAAe7N,EAAQ8N,EAASC,EAAUC,GACjD,MAAM3zD,EAAQ+J,GAAiB47C,GACzBiO,EAAUf,GAAmB7yD,EAAO,UACpCgpD,EAAWyJ,GAAczyD,EAAMgpD,SAAUrD,EAAQ,gBAAkBpY,GACnEsmB,EAAYpB,GAAczyD,EAAM6zD,UAAWlO,EAAQ,iBAAmBpY,GACtEumB,EA/BR,SAA0BnO,EAAQruC,EAAOE,GACvC,IAAIwxC,EAAU6K,EACd,QAAc33D,IAAVob,QAAkCpb,IAAXsb,EAAsB,CAC/C,MAAMu8C,EAAYxB,GAAe5M,GACjC,GAAKoO,EAGE,CACL,MAAMjN,EAAOiN,EAAUpkD,wBACjBqkD,EAAiBjqD,GAAiBgqD,GAClCE,EAAkBpB,GAAmBmB,EAAgB,SAAU,SAC/DE,EAAmBrB,GAAmBmB,EAAgB,WAC5D18C,EAAQwvC,EAAKxvC,MAAQ48C,EAAiB58C,MAAQ28C,EAAgB38C,MAC9DE,EAASsvC,EAAKtvC,OAAS08C,EAAiB18C,OAASy8C,EAAgBz8C,OACjEwxC,EAAWyJ,GAAcuB,EAAehL,SAAU+K,EAAW,eAC7DF,EAAYpB,GAAcuB,EAAeH,UAAWE,EAAW,qBAV/Dz8C,EAAQquC,EAAOp/B,YACf/O,EAASmuC,EAAOn/B,aAYpB,MAAO,CACLlP,MAAAA,EACAE,OAAAA,EACAwxC,SAAUA,GAAYzb,GACtBsmB,UAAWA,GAAatmB,IASJ4mB,CAAiBxO,EAAQ8N,EAASC,GACxD,IAAIp8C,MAACA,EAAKE,OAAEA,GAAUs8C,EACtB,GAAwB,gBAApB9zD,EAAMmpB,UAA6B,CACrC,MAAM8pC,EAAUJ,GAAmB7yD,EAAO,SAAU,SAC9CgzD,EAAWH,GAAmB7yD,EAAO,WAC3CsX,GAAS07C,EAAS17C,MAAQ27C,EAAQ37C,MAClCE,GAAUw7C,EAASx7C,OAASy7C,EAAQz7C,OAStC,OAPAF,EAAQjb,KAAKC,IAAI,EAAGgb,EAAQs8C,EAAQt8C,OACpCE,EAASnb,KAAKC,IAAI,EAAGq3D,EAAct3D,KAAK+sB,MAAM9R,EAAQq8C,GAAen8C,EAASo8C,EAAQp8C,QACtFF,EAAQi8C,GAAOl3D,KAAKqZ,IAAI4B,EAAO0xC,EAAU8K,EAAc9K,WACvDxxC,EAAS+7C,GAAOl3D,KAAKqZ,IAAI8B,EAAQq8C,EAAWC,EAAcD,YACtDv8C,IAAUE,IACZA,EAAS+7C,GAAOj8C,EAAQ,IAEnB,CACLA,MAAAA,EACAE,OAAAA,GAGJ,SAAS48C,GAAY7R,EAAO8R,EAAYC,GACtC,MAAMC,EAAaF,GAAc,EAC3BG,EAAen4D,KAAK+sB,MAAMm5B,EAAM/qC,OAAS+8C,GACzCE,EAAcp4D,KAAK+sB,MAAMm5B,EAAMjrC,MAAQi9C,GAC7ChS,EAAM/qC,OAASg9C,EAAeD,EAC9BhS,EAAMjrC,MAAQm9C,EAAcF,EAC5B,MAAM5O,EAASpD,EAAMoD,OAKrB,OAJIA,EAAO3lD,QAAUs0D,IAAgB3O,EAAO3lD,MAAMwX,SAAWmuC,EAAO3lD,MAAMsX,SACxEquC,EAAO3lD,MAAMwX,OAAY+qC,EAAM/qC,OAAT,KACtBmuC,EAAO3lD,MAAMsX,MAAWirC,EAAMjrC,MAAT,OAEnBirC,EAAMiD,0BAA4B+O,GAC/B5O,EAAOnuC,SAAWg9C,GAClB7O,EAAOruC,QAAUm9C,KACtBlS,EAAMiD,wBAA0B+O,EAChC5O,EAAOnuC,OAASg9C,EAChB7O,EAAOruC,MAAQm9C,EACflS,EAAM7mD,IAAIg5D,aAAaH,EAAY,EAAG,EAAGA,EAAY,EAAG,IACjD,GAIX,MAAMI,GAAgC,WACpC,IAAIC,GAAmB,EACvB,IACE,MAAM31D,EAAU,CACd+jB,cAEE,OADA4xC,GAAmB,GACZ,IAGXnqD,OAAOvL,iBAAiB,OAAQ,KAAMD,GACtCwL,OAAOtL,oBAAoB,OAAQ,KAAMF,GACzC,MAAO2C,IAET,OAAOgzD,KAET,SAASC,GAAat2D,EAASuoB,GAC7B,MAAMxnB,EA9IR,SAAkB8L,EAAI0b,GACpB,OAAO/c,GAAiBqB,GAAIpB,iBAAiB8c,GA6I/BguC,CAASv2D,EAASuoB,GAC1BrW,EAAUnR,GAASA,EAAMmY,MAAM,qBACrC,OAAOhH,GAAWA,EAAQ,QAAKvU,EAGjC,SAAS64D,GAAalgB,EAAIC,EAAI7yC,EAAGkhD,GAC/B,MAAO,CACL32B,EAAGqoB,EAAGroB,EAAIvqB,GAAK6yC,EAAGtoB,EAAIqoB,EAAGroB,GACzBC,EAAGooB,EAAGpoB,EAAIxqB,GAAK6yC,EAAGroB,EAAIooB,EAAGpoB,IAG7B,SAASuoC,GAAsBngB,EAAIC,EAAI7yC,EAAGkhD,GACxC,MAAO,CACL32B,EAAGqoB,EAAGroB,EAAIvqB,GAAK6yC,EAAGtoB,EAAIqoB,EAAGroB,GACzBC,EAAY,WAAT02B,EAAoBlhD,EAAI,GAAM4yC,EAAGpoB,EAAIqoB,EAAGroB,EAChC,UAAT02B,EAAmBlhD,EAAI,EAAI4yC,EAAGpoB,EAAIqoB,EAAGroB,EACrCxqB,EAAI,EAAI6yC,EAAGroB,EAAIooB,EAAGpoB,GAGxB,SAASwoC,GAAqBpgB,EAAIC,EAAI7yC,EAAGkhD,GACvC,MAAM+R,EAAM,CAAC1oC,EAAGqoB,EAAGmT,KAAMv7B,EAAGooB,EAAGqT,MACzBiN,EAAM,CAAC3oC,EAAGsoB,EAAGiT,KAAMt7B,EAAGqoB,EAAGmT,MACzBntD,EAAIi6D,GAAalgB,EAAIqgB,EAAKjzD,GAC1BlH,EAAIg6D,GAAaG,EAAKC,EAAKlzD,GAC3BC,EAAI6yD,GAAaI,EAAKrgB,EAAI7yC,GAC1B3D,EAAIy2D,GAAaj6D,EAAGC,EAAGkH,GACvBL,EAAImzD,GAAah6D,EAAGmH,EAAGD,GAC7B,OAAO8yD,GAAaz2D,EAAGsD,EAAGK,GAG5B,MAAMmzD,GAAY,IAAIluD,IAWtB,SAASmuD,GAAarrB,EAAKsrB,EAAQr2D,GACjC,OAXF,SAAyBq2D,EAAQr2D,GAC/BA,EAAUA,GAAW,GACrB,MAAMs2D,EAAWD,EAASE,KAAKC,UAAUx2D,GACzC,IAAIy2D,EAAYN,GAAUrqD,IAAIwqD,GAK9B,OAJKG,IACHA,EAAY,IAAIC,KAAKC,aAAaN,EAAQr2D,GAC1Cm2D,GAAUl1D,IAAIq1D,EAAUG,IAEnBA,EAGAG,CAAgBP,EAAQr2D,GAAS62D,OAAO9rB,GA2CjD,SAAS+rB,GAAc34C,EAAK44C,EAAO1+C,GACjC,OAAO8F,EAzCqB,SAAS44C,EAAO1+C,GAC5C,MAAO,CACLkV,EAAEA,GACOwpC,EAAQA,EAAQ1+C,EAAQkV,EAEjC9qB,SAAS2yC,GACP/8B,EAAQ+8B,GAEVqU,UAAUje,GACM,WAAVA,EACKA,EAEQ,UAAVA,EAAoB,OAAS,QAEtCwrB,MAAK,CAACzpC,EAAGltB,IACAktB,EAAIltB,EAEb42D,WAAU,CAAC1pC,EAAG2pC,IACL3pC,EAAI2pC,GAuBFC,CAAsBJ,EAAO1+C,GAlBnC,CACLkV,EAAEA,GACOA,EAET9qB,SAAS2yC,KAETqU,UAAUje,GACDA,EAETwrB,MAAK,CAACzpC,EAAGltB,IACAktB,EAAIltB,EAEb42D,WAAU,CAAC1pC,EAAG6pC,IACL7pC,GAOb,SAAS8pC,GAAsB56D,EAAKyd,GAClC,IAAInZ,EAAOu2D,EACO,QAAdp9C,GAAqC,QAAdA,IACzBnZ,EAAQtE,EAAIiqD,OAAO3lD,MACnBu2D,EAAW,CACTv2D,EAAMgK,iBAAiB,aACvBhK,EAAMw2D,oBAAoB,cAE5Bx2D,EAAMU,YAAY,YAAayY,EAAW,aAC1Czd,EAAI+6D,kBAAoBF,GAG5B,SAASG,GAAqBh7D,EAAK66D,QAChBr6D,IAAbq6D,WACK76D,EAAI+6D,kBACX/6D,EAAIiqD,OAAO3lD,MAAMU,YAAY,YAAa61D,EAAS,GAAIA,EAAS,KAIpE,SAASI,GAAW7vC,GAClB,MAAiB,UAAbA,EACK,CACL8vC,QAASjnB,GACTknB,QAASpnB,GACTvhB,UAAWwhB,IAGR,CACLknB,QAASzmB,GACT0mB,QAAS,CAAC/7D,EAAGC,IAAMD,EAAIC,EACvBmzB,UAAW1B,GAAKA,GAGpB,SAASsqC,IAAiBh0C,MAACA,EAAKI,IAAEA,EAAG6zC,MAAEA,EAAKh9C,KAAEA,EAAI/Z,MAAEA,IAClD,MAAO,CACL8iB,MAAOA,EAAQi0C,EACf7zC,IAAKA,EAAM6zC,EACXh9C,KAAMA,IAASmJ,EAAMJ,EAAQ,GAAKi0C,GAAU,EAC5C/2D,MAAAA,GA2BJ,SAASg3D,GAAcC,EAASpmC,EAAQqmC,GACtC,IAAKA,EACH,MAAO,CAACD,GAEV,MAAMnwC,SAACA,EAAUhE,MAAOq0C,EAAYj0C,IAAKk0C,GAAYF,EAC/CH,EAAQlmC,EAAOt0B,QACfs6D,QAACA,EAAOD,QAAEA,EAAO1oC,UAAEA,GAAayoC,GAAW7vC,IAC3ChE,MAACA,EAAKI,IAAEA,EAAGnJ,KAAEA,EAAI/Z,MAAEA,GA/B3B,SAAoBi3D,EAASpmC,EAAQqmC,GACnC,MAAMpwC,SAACA,EAAUhE,MAAOq0C,EAAYj0C,IAAKk0C,GAAYF,GAC/CN,QAACA,EAAO1oC,UAAEA,GAAayoC,GAAW7vC,GAClCiwC,EAAQlmC,EAAOt0B,OACrB,IACIC,EAAGivC,GADH3oB,MAACA,EAAKI,IAAEA,EAAGnJ,KAAEA,GAAQk9C,EAEzB,GAAIl9C,EAAM,CAGR,IAFA+I,GAASi0C,EACT7zC,GAAO6zC,EACFv6D,EAAI,EAAGivC,EAAOsrB,EAAOv6D,EAAIivC,GACvBmrB,EAAQ1oC,EAAU2C,EAAO/N,EAAQi0C,GAAOjwC,IAAYqwC,EAAYC,KADjC56D,EAIpCsmB,IACAI,IAEFJ,GAASi0C,EACT7zC,GAAO6zC,EAKT,OAHI7zC,EAAMJ,IACRI,GAAO6zC,GAEF,CAACj0C,MAAAA,EAAOI,IAAAA,EAAKnJ,KAAAA,EAAM/Z,MAAOi3D,EAAQj3D,OASPq3D,CAAWJ,EAASpmC,EAAQqmC,GACxD/5D,EAAS,GACf,IAEImC,EAAOwxB,EAAOwmC,EAFdC,GAAS,EACTC,EAAW,KAEf,MAEMC,EAAc,IAAMF,GAFEX,EAAQO,EAAYG,EAAWh4D,IAA6C,IAAnCu3D,EAAQM,EAAYG,GAGnFI,EAAa,KAAOH,GAF6B,IAA7BV,EAAQO,EAAU93D,IAAgBs3D,EAAQQ,EAAUE,EAAWh4D,GAGzF,IAAK,IAAI9C,EAAIsmB,EAAOrR,EAAOqR,EAAOtmB,GAAK0mB,IAAO1mB,EAC5Cs0B,EAAQD,EAAOr0B,EAAIu6D,GACfjmC,EAAM5E,OAGV5sB,EAAQ4uB,EAAU4C,EAAMhK,IACpBxnB,IAAUg4D,IAGdC,EAASX,EAAQt3D,EAAO63D,EAAYC,GACnB,OAAbI,GAAqBC,MACvBD,EAA0C,IAA/BX,EAAQv3D,EAAO63D,GAAoB36D,EAAIiV,GAEnC,OAAb+lD,GAAqBE,MACvBv6D,EAAO2F,KAAKg0D,GAAiB,CAACh0C,MAAO00C,EAAUt0C,IAAK1mB,EAAGud,KAAAA,EAAMg9C,MAAAA,EAAO/2D,MAAAA,KACpEw3D,EAAW,MAEb/lD,EAAOjV,EACP86D,EAAYh4D,IAKd,OAHiB,OAAbk4D,GACFr6D,EAAO2F,KAAKg0D,GAAiB,CAACh0C,MAAO00C,EAAUt0C,IAAAA,EAAKnJ,KAAAA,EAAMg9C,MAAAA,EAAO/2D,MAAAA,KAE5D7C,EAET,SAASw6D,GAAepP,EAAM2O,GAC5B,MAAM/5D,EAAS,GACTy6D,EAAWrP,EAAKqP,SACtB,IAAK,IAAIp7D,EAAI,EAAGA,EAAIo7D,EAASr7D,OAAQC,IAAK,CACxC,MAAMutC,EAAMitB,GAAcY,EAASp7D,GAAI+rD,EAAK13B,OAAQqmC,GAChDntB,EAAIxtC,QACNY,EAAO2F,QAAQinC,GAGnB,OAAO5sC,EAkET,SAAS06D,GAActP,EAAMqP,EAAU/mC,EAAQinC,GAC7C,OAAKA,GAAmBA,EAAexJ,YAAez9B,EAKxD,SAAyB03B,EAAMqP,EAAU/mC,EAAQinC,GAC/C,MAAMC,EAAexP,EAAKyP,OAAOpS,aAC3BqS,EAAYC,GAAU3P,EAAKtpD,UAC1Bk5D,cAAevsB,EAAc3sC,SAAS8yD,SAACA,IAAaxJ,EACrDwO,EAAQlmC,EAAOt0B,OACfY,EAAS,GACf,IAAIi7D,EAAYH,EACZn1C,EAAQ80C,EAAS,GAAG90C,MACpBtmB,EAAIsmB,EACR,SAASu1C,EAASxoB,EAAGjuC,EAAGgG,EAAG0wD,GACzB,MAAMljD,EAAM28C,GAAY,EAAI,EAC5B,GAAIliB,IAAMjuC,EAAV,CAIA,IADAiuC,GAAKknB,EACElmC,EAAOgf,EAAIknB,GAAO7qC,MACvB2jB,GAAKz6B,EAEP,KAAOyb,EAAOjvB,EAAIm1D,GAAO7qC,MACvBtqB,GAAKwT,EAEHy6B,EAAIknB,GAAUn1D,EAAIm1D,IACpB55D,EAAO2F,KAAK,CAACggB,MAAO+sB,EAAIknB,EAAO7zC,IAAKthB,EAAIm1D,EAAOh9C,KAAMnS,EAAG5H,MAAOs4D,IAC/DF,EAAYE,EACZx1C,EAAQlhB,EAAIm1D,IAGhB,IAAK,MAAME,KAAWW,EAAU,CAC9B90C,EAAQivC,EAAWjvC,EAAQm0C,EAAQn0C,MACnC,IACI9iB,EADAyR,EAAOof,EAAO/N,EAAQi0C,GAE1B,IAAKv6D,EAAIsmB,EAAQ,EAAGtmB,GAAKy6D,EAAQ/zC,IAAK1mB,IAAK,CACzC,MAAMo1D,EAAK/gC,EAAOr0B,EAAIu6D,GACtB/2D,EAAQk4D,GAAUJ,EAAexJ,WAAWnD,GAAc4M,EAAc,CACtE30D,KAAM,UACNm1D,GAAI9mD,EACJojC,GAAI+c,EACJ4G,aAAch8D,EAAI,GAAKu6D,EACvB0B,YAAaj8D,EAAIu6D,EACjBnrB,aAAAA,MAEE8sB,GAAa14D,EAAOo4D,IACtBC,EAASv1C,EAAOtmB,EAAI,EAAGy6D,EAAQl9C,KAAMq+C,GAEvC3mD,EAAOmgD,EACPwG,EAAYp4D,EAEV8iB,EAAQtmB,EAAI,GACd67D,EAASv1C,EAAOtmB,EAAI,EAAGy6D,EAAQl9C,KAAMq+C,GAGzC,OAAOj7D,EArDAw7D,CAAgBpQ,EAAMqP,EAAU/mC,EAAQinC,GAFtCF,EAyDX,SAASM,GAAUj5D,GACjB,MAAO,CACLkjD,gBAAiBljD,EAAQkjD,gBACzByW,eAAgB35D,EAAQ25D,eACxBC,WAAY55D,EAAQ45D,WACpBC,iBAAkB75D,EAAQ65D,iBAC1BC,gBAAiB95D,EAAQ85D,gBACzBhS,YAAa9nD,EAAQ8nD,YACrB3E,YAAanjD,EAAQmjD,aAGzB,SAASsW,GAAa14D,EAAOo4D,GAC3B,OAAOA,GAAa5C,KAAKC,UAAUz1D,KAAWw1D,KAAKC,UAAU2C;;;;;;OCnzE/D,IAAIY,GAAW,IAvIf,MACEt3D,cACEC,KAAKs3D,SAAW,KAChBt3D,KAAKu3D,QAAU,IAAIhyD,IACnBvF,KAAKw3D,UAAW,EAChBx3D,KAAKy3D,eAAYl9D,EAEnBwF,QAAQ6gD,EAAO8W,EAAOC,EAAMl2D,GAC1B,MAAME,EAAY+1D,EAAMpN,UAAU7oD,GAC5Bm2D,EAAWF,EAAMnsD,SACvB5J,EAAU5I,QAAQN,GAAMA,EAAG,CACzBmoD,MAAAA,EACAr1B,QAASmsC,EAAMnsC,QACfqsC,SAAAA,EACAC,YAAan9D,KAAKqZ,IAAI4jD,EAAOD,EAAMv2C,MAAOy2C,MAG9C73D,WACMC,KAAKs3D,WAGTt3D,KAAKw3D,UAAW,EAChBx3D,KAAKs3D,SAAW/uB,GAAiBvmC,KAAK8G,OAAQ,KAC5C9I,KAAK83D,UACL93D,KAAKs3D,SAAW,KACZt3D,KAAKw3D,UACPx3D,KAAK+3D,cAIXh4D,QAAQ43D,EAAOjnD,KAAKD,OAClB,IAAIunD,EAAY,EAChBh4D,KAAKu3D,QAAQx+D,QAAQ,CAAC2+D,EAAO9W,KAC3B,IAAK8W,EAAMx3C,UAAYw3C,EAAM1uD,MAAMpO,OACjC,OAEF,MAAMoO,EAAQ0uD,EAAM1uD,MACpB,IAEI+mB,EAFAl1B,EAAImO,EAAMpO,OAAS,EACnBq9D,GAAO,EAEX,KAAOp9D,GAAK,IAAKA,EACfk1B,EAAO/mB,EAAMnO,GACTk1B,EAAKmoC,SACHnoC,EAAKooC,OAAST,EAAMnsD,WACtBmsD,EAAMnsD,SAAWwkB,EAAKooC,QAExBpoC,EAAKqoC,KAAKT,GACVM,GAAO,IAEPjvD,EAAMnO,GAAKmO,EAAMA,EAAMpO,OAAS,GAChCoO,EAAMhG,OAGNi1D,IACFrX,EAAMqX,OACNj4D,KAAKq4D,QAAQzX,EAAO8W,EAAOC,EAAM,aAE9B3uD,EAAMpO,SACT88D,EAAMx3C,SAAU,EAChBlgB,KAAKq4D,QAAQzX,EAAO8W,EAAOC,EAAM,YACjCD,EAAMnsC,SAAU,GAElBysC,GAAahvD,EAAMpO,SAErBoF,KAAKy3D,UAAYE,EACC,IAAdK,IACFh4D,KAAKw3D,UAAW,GAGpBz3D,UAAU6gD,GACR,MAAM0X,EAASt4D,KAAKu3D,QACpB,IAAIG,EAAQY,EAAOlvD,IAAIw3C,GAavB,OAZK8W,IACHA,EAAQ,CACNx3C,SAAS,EACTqL,SAAS,EACTviB,MAAO,GACPshD,UAAW,CACTt5B,SAAU,GACVld,SAAU,KAGdwkD,EAAO/5D,IAAIqiD,EAAO8W,IAEbA,EAET33D,OAAO6gD,EAAOxjD,EAAOm7D,GACnBv4D,KAAKw4D,UAAU5X,GAAO0J,UAAUltD,GAAO+D,KAAKo3D,GAE9Cx4D,IAAI6gD,EAAO53C,GACJA,GAAUA,EAAMpO,QAGrBoF,KAAKw4D,UAAU5X,GAAO53C,MAAM7H,QAAQ6H,GAEtCjJ,IAAI6gD,GACF,OAAO5gD,KAAKw4D,UAAU5X,GAAO53C,MAAMpO,OAAS,EAE9CmF,MAAM6gD,GACJ,MAAM8W,EAAQ13D,KAAKu3D,QAAQnuD,IAAIw3C,GAC1B8W,IAGLA,EAAMx3C,SAAU,EAChBw3C,EAAMv2C,MAAQzQ,KAAKD,MACnBinD,EAAMnsD,SAAWmsD,EAAM1uD,MAAMyvD,OAAO,CAACC,EAAKC,IAAQj+D,KAAKC,IAAI+9D,EAAKC,EAAIC,WAAY,GAChF54D,KAAK+3D,YAEPh4D,QAAQ6gD,GACN,IAAK5gD,KAAKw3D,SACR,OAAO,EAET,MAAME,EAAQ13D,KAAKu3D,QAAQnuD,IAAIw3C,GAC/B,SAAK8W,GAAUA,EAAMx3C,SAAYw3C,EAAM1uD,MAAMpO,QAK/CmF,KAAK6gD,GACH,MAAM8W,EAAQ13D,KAAKu3D,QAAQnuD,IAAIw3C,GAC/B,IAAK8W,IAAUA,EAAM1uD,MAAMpO,OACzB,OAEF,MAAMoO,EAAQ0uD,EAAM1uD,MACpB,IAAInO,EAAImO,EAAMpO,OAAS,EACvB,KAAOC,GAAK,IAAKA,EACfmO,EAAMnO,GAAG2mB,SAEXk2C,EAAM1uD,MAAQ,GACdhJ,KAAKq4D,QAAQzX,EAAO8W,EAAOhnD,KAAKD,MAAO,YAEzC1Q,OAAO6gD,GACL,OAAO5gD,KAAKu3D,QAAQzzD,OAAO88C,KAK/B,MACMiY,GAAgB,CACpBC,QAAO,CAACp4D,EAAMmR,EAAIknD,IACTA,EAAS,GAAMlnD,EAAKnR,EAE7BX,MAAMW,EAAMmR,EAAIknD,GACd,MAAMC,EAAK7Z,GAAMz+C,GAND,eAOV4+C,EAAK0Z,EAAG/Z,OAASE,GAAMttC,GAPb,eAQhB,OAAOytC,GAAMA,EAAGL,MACZK,EAAG2Z,IAAID,EAAID,GAAQlnB,YACnBhgC,GAENwkB,OAAM,CAAC31B,EAAMmR,EAAIknD,IACRr4D,GAAQmR,EAAKnR,GAAQq4D,GAGhC,MAAMG,GACJn5D,YAAYo5D,EAAKp9D,EAAQ2S,EAAMmD,GAC7B,MAAMunD,EAAer9D,EAAO2S,GAC5BmD,EAAKtP,GAAQ,CAAC42D,EAAItnD,GAAIA,EAAIunD,EAAcD,EAAIz4D,OAC5C,MAAMA,EAAO6B,GAAQ,CAAC42D,EAAIz4D,KAAM04D,EAAcvnD,IAC9C7R,KAAKk4D,SAAU,EACfl4D,KAAKq5D,IAAMF,EAAI1gE,IAAMogE,GAAcM,EAAI13D,aAAef,GACtDV,KAAKs5D,QAAUzqB,GAAQsqB,EAAII,SAAW1qB,GAAQC,OAC9C9uC,KAAKw5D,OAAS9+D,KAAK+sB,MAAM/W,KAAKD,OAAS0oD,EAAI3oD,OAAS,IACpDxQ,KAAK44D,UAAY54D,KAAKm4D,OAASz9D,KAAK+sB,MAAM0xC,EAAI5tD,UAC9CvL,KAAKy5D,QAAUN,EAAI/gD,KACnBpY,KAAK05D,QAAU39D,EACfiE,KAAK25D,MAAQjrD,EACb1O,KAAK45D,MAAQl5D,EACbV,KAAK65D,IAAMhoD,EACX7R,KAAK85D,eAAYv/D,EAEnBwF,SACE,OAAOC,KAAKk4D,QAEdn4D,OAAOo5D,EAAKtnD,EAAI8lD,GACd,GAAI33D,KAAKk4D,QAAS,CAChBl4D,KAAKq4D,SAAQ,GACb,MAAMe,EAAep5D,KAAK05D,QAAQ15D,KAAK25D,OACjCI,EAAUpC,EAAO33D,KAAKw5D,OACtBQ,EAASh6D,KAAK44D,UAAYmB,EAChC/5D,KAAKw5D,OAAS7B,EACd33D,KAAK44D,UAAYl+D,KAAK+sB,MAAM/sB,KAAKC,IAAIq/D,EAAQb,EAAI5tD,WACjDvL,KAAKm4D,QAAU4B,EACf/5D,KAAKy5D,QAAUN,EAAI/gD,KACnBpY,KAAK65D,IAAMt3D,GAAQ,CAAC42D,EAAItnD,GAAIA,EAAIunD,EAAcD,EAAIz4D,OAClDV,KAAK45D,MAAQr3D,GAAQ,CAAC42D,EAAIz4D,KAAM04D,EAAcvnD,KAGlD9R,SACMC,KAAKk4D,UACPl4D,KAAKo4D,KAAK1nD,KAAKD,OACfzQ,KAAKk4D,SAAU,EACfl4D,KAAKq4D,SAAQ,IAGjBt4D,KAAK43D,GACH,MAAMoC,EAAUpC,EAAO33D,KAAKw5D,OACtBjuD,EAAWvL,KAAK44D,UAChBlqD,EAAO1O,KAAK25D,MACZj5D,EAAOV,KAAK45D,MACZxhD,EAAOpY,KAAKy5D,MACZ5nD,EAAK7R,KAAK65D,IAChB,IAAId,EAEJ,GADA/4D,KAAKk4D,QAAUx3D,IAASmR,IAAOuG,GAAS2hD,EAAUxuD,IAC7CvL,KAAKk4D,QAGR,OAFAl4D,KAAK05D,QAAQhrD,GAAQmD,OACrB7R,KAAKq4D,SAAQ,GAGX0B,EAAU,EACZ/5D,KAAK05D,QAAQhrD,GAAQhO,GAGvBq4D,EAAUgB,EAAUxuD,EAAY,EAChCwtD,EAAS3gD,GAAQ2gD,EAAS,EAAI,EAAIA,EAASA,EAC3CA,EAAS/4D,KAAKs5D,QAAQ5+D,KAAKqZ,IAAI,EAAGrZ,KAAKC,IAAI,EAAGo+D,KAC9C/4D,KAAK05D,QAAQhrD,GAAQ1O,KAAKq5D,IAAI34D,EAAMmR,EAAIknD,IAE1Ch5D,OACE,MAAMk6D,EAAWj6D,KAAK85D,YAAc95D,KAAK85D,UAAY,IACrD,OAAO,IAAIx3D,QAAQ,CAACkH,EAAK0wD,KACvBD,EAAS94D,KAAK,CAACqI,IAAAA,EAAK0wD,IAAAA,MAGxBn6D,QAAQo6D,GACN,MAAMnjD,EAASmjD,EAAW,MAAQ,MAC5BF,EAAWj6D,KAAK85D,WAAa,GACnC,IAAK,IAAIj/D,EAAI,EAAGA,EAAIo/D,EAASr/D,OAAQC,IACnCo/D,EAASp/D,GAAGmc,SAOTzY,IAAI,YAAa,CACxBiS,WAAOjW,EACPgR,SAAU,IACVguD,OAAQ,eACR9gE,QAAI8B,EACJmG,UAAMnG,EACN6d,UAAM7d,EACNsX,QAAItX,EACJkH,UAAMlH,IAER,MAAM6/D,GAAmBzhE,OAAO+C,KAAKu2B,GAASsuB,cACrC2B,SAAS,YAAa,CAC7BU,WAAW,EACXD,YAAY,EACZF,YAAc5lD,GAAkB,eAATA,GAAkC,eAATA,GAAkC,OAATA,OAElE0B,IAAI,aAAc,CACzB87D,OAAQ,CACN54D,KAAM,QACN64D,WApBW,CAAC,QAAS,cAAe,oBAsBtCC,QAAS,CACP94D,KAAM,SACN64D,WAzBY,CAAC,IAAK,IAAK,cAAe,SAAU,iBA4B3CpY,SAAS,aAAc,CAC9BU,UAAW,iBAEJrkD,IAAI,cAAe,CAC1Bi8D,OAAQ,CACNja,UAAW,CACTh1C,SAAU,MAGdkvD,OAAQ,CACNla,UAAW,CACTh1C,SAAU,IAGdmvD,KAAM,CACJC,WAAY,CACVN,OAAQ,CACN35D,KAAM,eAERk6D,QAAS,CACPn5D,KAAM,UACN8J,SAAU,KAIhBguB,KAAM,CACJohC,WAAY,CACVN,OAAQ,CACNxoD,GAAI,eAEN+oD,QAAS,CACPn5D,KAAM,UACN83D,OAAQ,SACR9gE,GAAI+vB,GAAS,EAAJA,OAKjB,MAAMqyC,GACJ96D,YAAY6gD,EAAOka,GACjB96D,KAAKq2D,OAASzV,EACd5gD,KAAK+6D,YAAc,IAAIx1D,IACvBvF,KAAKg7D,UAAUF,GAEjB/6D,UAAU+6D,GACR,IAAKp0D,GAASo0D,GACZ,OAEF,MAAMG,EAAgBj7D,KAAK+6D,YAC3BpiE,OAAOuiE,oBAAoBJ,GAAQ/hE,QAAQqF,IACzC,MAAM+6D,EAAM2B,EAAO18D,GACnB,IAAKsI,GAASyyD,GACZ,OAEF,MAAMgB,EAAW,GACjB,IAAK,MAAMj7D,KAAUk7D,GACnBD,EAASj7D,GAAUi6D,EAAIj6D,IAExBwK,GAAQyvD,EAAImB,aAAenB,EAAImB,YAAc,CAACl8D,IAAMrF,QAAS2V,IACxDA,IAAStQ,GAAQ68D,EAAcp/D,IAAI6S,IACrCusD,EAAc18D,IAAImQ,EAAMyrD,OAKhCp6D,gBAAgBhE,EAAQskD,GACtB,MAAM8a,EAAa9a,EAAO/iD,QACpBA,EAwEV,SAA8BvB,EAAQo/D,GACpC,IAAKA,EACH,OAEF,IAAI79D,EAAUvB,EAAOuB,QACrB,IAAKA,EAEH,YADAvB,EAAOuB,QAAU69D,GAGf79D,EAAQ89D,UACVr/D,EAAOuB,QAAUA,EAAU3E,OAAOP,OAAO,GAAIkF,EAAS,CAAC89D,SAAS,EAAOC,YAAa,MAEtF,OAAO/9D,EApFWg+D,CAAqBv/D,EAAQo/D,GAC7C,IAAK79D,EACH,MAAO,GAET,MAAMq9D,EAAa36D,KAAKu7D,kBAAkBj+D,EAAS69D,GAOnD,OANIA,EAAWC,SAwDnB,SAAkBT,EAAYL,GAC5B,MAAMp6C,EAAU,GACVxkB,EAAO/C,OAAO+C,KAAK4+D,GACzB,IAAK,IAAIz/D,EAAI,EAAGA,EAAIa,EAAKd,OAAQC,IAAK,CACpC,MAAM2gE,EAAOb,EAAWj/D,EAAKb,IACzB2gE,GAAQA,EAAKhB,UACft6C,EAAQ/e,KAAKq6D,EAAKC,QAGtB,OAAOn5D,QAAQo5D,IAAIx7C,GAhEfy7C,CAAS5/D,EAAOuB,QAAQ+9D,YAAaF,GAAYz4D,KAAK,KACpD3G,EAAOuB,QAAU69D,GAChB,QAGER,EAET56D,kBAAkBhE,EAAQskD,GACxB,MAAM4a,EAAgBj7D,KAAK+6D,YACrBJ,EAAa,GACbz6C,EAAUnkB,EAAOs/D,cAAgBt/D,EAAOs/D,YAAc,IACtD9/D,EAAQ5C,OAAO+C,KAAK2kD,GACpBsX,EAAOjnD,KAAKD,MAClB,IAAI5V,EACJ,IAAKA,EAAIU,EAAMX,OAAS,EAAGC,GAAK,IAAKA,EAAG,CACtC,MAAM6T,EAAOnT,EAAMV,GACnB,GAAuB,MAAnB6T,EAAK28B,OAAO,GACd,SAEF,GAAa,YAAT38B,EAAoB,CACtBisD,EAAWx5D,QAAQnB,KAAK47D,gBAAgB7/D,EAAQskD,IAChD,SAEF,MAAM1iD,EAAQ0iD,EAAO3xC,GACrB,IAAI6xC,EAAYrgC,EAAQxR,GACxB,MAAMyqD,EAAM8B,EAAc7xD,IAAIsF,GAC9B,GAAI6xC,EAAW,CACb,GAAI4Y,GAAO5Y,EAAUia,SAAU,CAC7Bja,EAAUx9C,OAAOo2D,EAAKx7D,EAAOg6D,GAC7B,SAEApX,EAAU/+B,SAGT23C,GAAQA,EAAI5tD,UAIjB2U,EAAQxR,GAAQ6xC,EAAY,IAAI2Y,GAAUC,EAAKp9D,EAAQ2S,EAAM/Q,GAC7Dg9D,EAAWx5D,KAAKo/C,IAJdxkD,EAAO2S,GAAQ/Q,EAMnB,OAAOg9D,EAET56D,OAAOhE,EAAQskD,GACb,GAA8B,IAA1BrgD,KAAK+6D,YAAY91C,KAEnB,YADAtsB,OAAOP,OAAO2D,EAAQskD,GAGxB,MAAMsa,EAAa36D,KAAKu7D,kBAAkBx/D,EAAQskD,GAClD,OAAIsa,EAAW//D,QACby8D,GAASn0D,IAAIlD,KAAKq2D,OAAQsE,IACnB,QAFT,GAgCJ,SAASkB,GAAUvjC,EAAOwjC,GACxB,MAAM9mD,EAAOsjB,GAASA,EAAMh7B,SAAW,GACjCosC,EAAU10B,EAAK00B,QACf31B,OAAmBxZ,IAAbya,EAAKjB,IAAoB+nD,EAAkB,EACjDnhE,OAAmBJ,IAAbya,EAAKra,IAAoBmhE,EAAkB,EACvD,MAAO,CACL36C,MAAOuoB,EAAU/uC,EAAMoZ,EACvBwN,IAAKmoB,EAAU31B,EAAMpZ,GAkCzB,SAASohE,GAAwBnb,EAAOob,GACtC,MAAMtgE,EAAO,GACPugE,EAAWrb,EAAMsb,uBAAuBF,GAC9C,IAAInhE,EAAGivC,EACP,IAAKjvC,EAAI,EAAGivC,EAAOmyB,EAASrhE,OAAQC,EAAIivC,IAAQjvC,EAC9Ca,EAAKyF,KAAK86D,EAASphE,GAAGwL,OAExB,OAAO3K,EAET,SAASygE,GAAWC,EAAOz+D,EAAO0+D,EAAS/+D,EAAU,IACnD,MAAM5B,EAAO0gE,EAAM1gE,KACb4gE,EAA8B,WAAjBh/D,EAAQkkD,KAC3B,IAAI3mD,EAAGivC,EAAMG,EAAcsyB,EAC3B,GAAc,OAAV5+D,EAAJ,CAGA,IAAK9C,EAAI,EAAGivC,EAAOpuC,EAAKd,OAAQC,EAAIivC,IAAQjvC,EAAG,CAE7C,GADAovC,GAAgBvuC,EAAKb,GACjBovC,IAAiBoyB,EAAS,CAC5B,GAAI/+D,EAAQo+D,IACV,SAEF,MAEFa,EAAaH,EAAM/b,OAAOpW,GACtBf,GAAeqzB,KAAgBD,GAAyB,IAAV3+D,GAAewuC,GAAKxuC,KAAWwuC,GAAKowB,MACpF5+D,GAAS4+D,GAGb,OAAO5+D,GAeT,SAAS6+D,GAAUlkC,EAAOmkC,GACxB,MAAMC,EAAUpkC,GAASA,EAAMh7B,QAAQo/D,QACvC,OAAOA,QAAwBniE,IAAZmiE,QAAwCniE,IAAfkiE,EAAKL,MAYnD,SAASO,GAAiBC,EAAQC,EAAUC,GAC1C,MAAMC,EAAWH,EAAOC,KAAcD,EAAOC,GAAY,IACzD,OAAOE,EAASD,KAAgBC,EAASD,GAAc,IAEzD,SAASE,GAAoBZ,EAAOa,EAAQC,EAAUz7D,GACpD,IAAK,MAAMg7D,KAAQQ,EAAOE,wBAAwB17D,GAAMioC,UAAW,CACjE,MAAM/rC,EAAQy+D,EAAMK,EAAKp2D,OACzB,GAAK62D,GAAYv/D,EAAQ,IAAQu/D,GAAYv/D,EAAQ,EACnD,OAAO8+D,EAAKp2D,MAGhB,OAAO,KAET,SAAS+2D,GAAaj8B,EAAYk8B,GAChC,MAAMzc,MAACA,EAAO0c,YAAab,GAAQt7B,EAC7By7B,EAAShc,EAAM2c,UAAY3c,EAAM2c,QAAU,KAC3CC,OAACA,EAAMP,OAAEA,EAAQ52D,MAAO4jC,GAAgBwyB,EACxCgB,EAAQD,EAAO5sD,KACf8sD,EAAQT,EAAOrsD,KACfxS,EA7BR,SAAqBu/D,EAAYC,EAAYnB,GAC3C,MAAO,GAAGkB,EAAWj1D,MAAMk1D,EAAWl1D,MAAM+zD,EAAKL,OAASK,EAAKh7D,OA4BnDo8D,CAAYL,EAAQP,EAAQR,GAClC3yB,EAAOuzB,EAAOziE,OACpB,IAAIwhE,EACJ,IAAK,IAAIvhE,EAAI,EAAGA,EAAIivC,IAAQjvC,EAAG,CAC7B,MAAMk1B,EAAOstC,EAAOxiE,IACbkF,CAAC09D,GAAQp3D,EAAOtG,CAAC29D,GAAQ//D,GAASoyB,EAEzCqsC,GADmBrsC,EAAKwtC,UAAYxtC,EAAKwtC,QAAU,KAChCG,GAASf,GAAiBC,EAAQx+D,EAAKiI,GAC1D+1D,EAAMnyB,GAAgBtsC,EACtBy+D,EAAM0B,KAAOd,GAAoBZ,EAAOa,GAAQ,EAAMR,EAAKh7D,MAC3D26D,EAAM2B,QAAUf,GAAoBZ,EAAOa,GAAQ,EAAOR,EAAKh7D,OAGnE,SAASu8D,GAAgBpd,EAAOhwC,GAC9B,MAAMmxC,EAASnB,EAAMmB,OACrB,OAAOppD,OAAO+C,KAAKqmD,GAAQn9C,OAAOxG,GAAO2jD,EAAO3jD,GAAKwS,OAASA,GAAMqtD,QA0BtE,SAASC,GAAYzB,EAAMzzD,GACzB,MAAMihC,EAAewyB,EAAKt7B,WAAW96B,MAC/BuK,EAAO6rD,EAAKQ,QAAUR,EAAKQ,OAAOrsD,KACxC,GAAKA,EAAL,CAGA5H,EAAQA,GAASyzD,EAAK0B,QACtB,IAAK,MAAMd,KAAUr0D,EAAO,CAC1B,MAAM4zD,EAASS,EAAOE,QACtB,IAAKX,QAA2BriE,IAAjBqiE,EAAOhsD,SAAsDrW,IAA/BqiE,EAAOhsD,GAAMq5B,GACxD,cAEK2yB,EAAOhsD,GAAMq5B,KAGxB,MAAMm0B,GAAsB5c,GAAkB,UAATA,GAA6B,SAATA,EACnD6c,GAAmB,CAACC,EAAQC,IAAWA,EAASD,EAAS3lE,OAAOP,OAAO,GAAIkmE,GAGjF,MAAME,GACJz+D,YAAY6gD,EAAO3W,GACjBjqC,KAAK4gD,MAAQA,EACb5gD,KAAKy+D,KAAO7d,EAAM7mD,IAClBiG,KAAKqG,MAAQ4jC,EACbjqC,KAAK0+D,gBAAkB,GACvB1+D,KAAKs9D,YAAct9D,KAAK2+D,UACxB3+D,KAAK4+D,MAAQ5+D,KAAKs9D,YAAY77D,KAC9BzB,KAAK1C,aAAU/C,EACfyF,KAAK6+D,UAAW,EAChB7+D,KAAK8+D,WAAQvkE,EACbyF,KAAK++D,iBAAcxkE,EACnByF,KAAKg/D,oBAAiBzkE,EACtByF,KAAKi/D,gBAAa1kE,EAClByF,KAAKk/D,gBAAa3kE,EAClByF,KAAKm/D,qBAAsB,EAC3Bn/D,KAAKo/D,cAAW7kE,EAChByF,KAAKq/D,UAAY,GACjBr/D,KAAKs/D,aAEPv/D,aACE,MAAM08D,EAAOz8D,KAAKs9D,YAClBt9D,KAAKg7D,YACLh7D,KAAKu/D,aACL9C,EAAK+C,SAAWhD,GAAUC,EAAKQ,OAAQR,GACvCz8D,KAAKy/D,cAEP1/D,YAAYkqC,GACNjqC,KAAKqG,QAAU4jC,GACjBi0B,GAAYl+D,KAAKs9D,aAEnBt9D,KAAKqG,MAAQ4jC,EAEflqC,aACE,MAAM6gD,EAAQ5gD,KAAK4gD,MACb6b,EAAOz8D,KAAKs9D,YACZoC,EAAU1/D,KAAK2/D,aACfC,EAAW,CAAChvD,EAAMia,EAAGC,EAAGrnB,IAAe,MAATmN,EAAeia,EAAa,MAATja,EAAenN,EAAIqnB,EACpE+0C,EAAMpD,EAAKqD,QAAUz2B,GAAeq2B,EAAQI,QAAS9B,GAAgBpd,EAAO,MAC5Emf,EAAMtD,EAAKuD,QAAU32B,GAAeq2B,EAAQM,QAAShC,GAAgBpd,EAAO,MAC5Eqf,EAAMxD,EAAKyD,QAAU72B,GAAeq2B,EAAQQ,QAASlC,GAAgBpd,EAAO,MAC5EU,EAAYmb,EAAKnb,UACjB6e,EAAM1D,EAAK2D,QAAUR,EAASte,EAAWue,EAAKE,EAAKE,GACnDI,EAAM5D,EAAK6D,QAAUV,EAASte,EAAWye,EAAKF,EAAKI,GACzDxD,EAAK8D,OAASvgE,KAAKwgE,cAAcX,GACjCpD,EAAKgE,OAASzgE,KAAKwgE,cAAcT,GACjCtD,EAAKiE,OAAS1gE,KAAKwgE,cAAcP,GACjCxD,EAAKe,OAASx9D,KAAKwgE,cAAcL,GACjC1D,EAAKQ,OAASj9D,KAAKwgE,cAAcH,GAEnCtgE,aACE,OAAOC,KAAK4gD,MAAM7jD,KAAK2jD,SAAS1gD,KAAKqG,OAEvCtG,UACE,OAAOC,KAAK4gD,MAAM+f,eAAe3gE,KAAKqG,OAExCtG,cAAc6gE,GACZ,OAAO5gE,KAAK4gD,MAAMmB,OAAO6e,GAE3B7gE,eAAeu4B,GACb,MAAMmkC,EAAOz8D,KAAKs9D,YAClB,OAAOhlC,IAAUmkC,EAAKe,OAClBf,EAAKQ,OACLR,EAAKe,OAEXz9D,QACEC,KAAK83D,QAAQ,SAEf/3D,WACE,MAAM08D,EAAOz8D,KAAKs9D,YACdt9D,KAAK8+D,OACP3U,GAAoBnqD,KAAK8+D,MAAO9+D,MAE9By8D,EAAK+C,UACPtB,GAAYzB,GAGhB18D,aACE,MAAM2/D,EAAU1/D,KAAK2/D,aACf5iE,EAAO2iE,EAAQ3iE,OAAS2iE,EAAQ3iE,KAAO,IACvC+hE,EAAQ9+D,KAAK8+D,MACnB,GAAIp4D,GAAS3J,GACXiD,KAAK8+D,MA5LX,SAAkC/hE,GAChC,MAAMrB,EAAO/C,OAAO+C,KAAKqB,GACnB8jE,EAAQ,IAAIpgE,MAAM/E,EAAKd,QAC7B,IAAIC,EAAGivC,EAAM1rC,EACb,IAAKvD,EAAI,EAAGivC,EAAOpuC,EAAKd,OAAQC,EAAIivC,IAAQjvC,EAC1CuD,EAAM1C,EAAKb,GACXgmE,EAAMhmE,GAAK,CACTgwB,EAAGzsB,EACH0sB,EAAG/tB,EAAKqB,IAGZ,OAAOyiE,EAiLUC,CAAyB/jE,QACjC,GAAI+hE,IAAU/hE,EAAM,CACzB,GAAI+hE,EAAO,CACT3U,GAAoB2U,EAAO9+D,MAC3B,MAAMy8D,EAAOz8D,KAAKs9D,YAClBY,GAAYzB,GACZA,EAAK0B,QAAU,GAEbphE,GAAQpE,OAAOooE,aAAahkE,KD20BJ8O,EC10BF7L,MD00BL6sC,EC10BD9vC,GD20BdstD,SACRxd,EAAMwd,SAASC,UAAUnpD,KAAK0K,IAGhClT,OAAOwQ,eAAe0jC,EAAO,WAAY,CACvCugB,cAAc,EACd96C,YAAY,EACZ3U,MAAO,CACL2sD,UAAW,CAACz+C,MAGhBq+C,GAAYnxD,QAASqF,IACnB,MAAM4Y,EAAS,UAAYm0B,GAAY/sC,GACjCgb,EAAOyzB,EAAMzuC,GACnBzF,OAAOwQ,eAAe0jC,EAAOzuC,EAAK,CAChCgvD,cAAc,EACd96C,YAAY,EACZvS,SAAS2L,GACP,MAAMlC,EAAM4P,EAAKhN,MAAMpM,KAAM0L,GAM7B,OALAmhC,EAAMwd,SAASC,UAAUvxD,QAAS+6B,IACF,mBAAnBA,EAAO9c,IAChB8c,EAAO9c,MAAWtL,KAGflC,SCj2BTxJ,KAAKq/D,UAAY,GACjBr/D,KAAK8+D,MAAQ/hE,EDu0BnB,IAA2B8vC,EAAOhhC,ECp0BhC9L,cACE,MAAM08D,EAAOz8D,KAAKs9D,YAClBt9D,KAAKghE,aACDhhE,KAAKihE,qBACPxE,EAAKiD,QAAU,IAAI1/D,KAAKihE,oBAG5BlhE,sBAAsBmhE,GACpB,MAAMzE,EAAOz8D,KAAKs9D,YACZoC,EAAU1/D,KAAK2/D,aACrB,IAAIwB,GAAe,EACnBnhE,KAAKghE,aACL,MAAMI,EAAa3E,EAAK+C,SACxB/C,EAAK+C,SAAWhD,GAAUC,EAAKQ,OAAQR,GACnCA,EAAKL,QAAUsD,EAAQtD,QACzB+E,GAAe,EACfjD,GAAYzB,GACZA,EAAKL,MAAQsD,EAAQtD,OAEvBp8D,KAAKqhE,gBAAgBH,IACjBC,GAAgBC,IAAe3E,EAAK+C,WACtCpC,GAAap9D,KAAMy8D,EAAK0B,SAG5Bp+D,YACE,MAAM+6D,EAAS96D,KAAK4gD,MAAMka,OACpBwG,EAAYxG,EAAOyG,iBAAiBvhE,KAAK4+D,OACzCnU,EAASqQ,EAAO0G,gBAAgBxhE,KAAK2/D,aAAc2B,GAAW,GACpEthE,KAAK1C,QAAUw9D,EAAO2G,eAAehX,EAAQzqD,KAAKikD,cAClDjkD,KAAK6+D,SAAW7+D,KAAK1C,QAAQskD,QAC7B5hD,KAAK0+D,gBAAkB,GAEzB3+D,MAAMohB,EAAOi0C,GACX,MAAOkI,YAAab,EAAMqC,MAAO/hE,GAAQiD,MACnCw9D,OAACA,EAAMgC,SAAEA,GAAY/C,EACrBgB,EAAQD,EAAO5sD,KACrB,IAEI/V,EAAG89D,EAAK0E,EAFRqE,EAAmB,IAAVvgD,GAAei0C,IAAUr4D,EAAKnC,QAAgB6hE,EAAKkF,QAC5D7xD,EAAOqR,EAAQ,GAAKs7C,EAAK0B,QAAQh9C,EAAQ,GAE7C,IAAsB,IAAlBnhB,KAAK6+D,SACPpC,EAAK0B,QAAUphE,EACf0/D,EAAKkF,SAAU,EACftE,EAAStgE,MACJ,CAEHsgE,EADE3zD,GAAQ3M,EAAKokB,IACNnhB,KAAK4hE,eAAenF,EAAM1/D,EAAMokB,EAAOi0C,GACvC1uD,GAAS3J,EAAKokB,IACdnhB,KAAK6hE,gBAAgBpF,EAAM1/D,EAAMokB,EAAOi0C,GAExCp1D,KAAK8hE,mBAAmBrF,EAAM1/D,EAAMokB,EAAOi0C,GAEtD,MAAM2M,EAA6B,IAAqB,OAAfpJ,EAAI8E,IAAoB3tD,GAAQ6oD,EAAI8E,GAAS3tD,EAAK2tD,GAC3F,IAAK5iE,EAAI,EAAGA,EAAIu6D,IAASv6D,EACvB4hE,EAAK0B,QAAQtjE,EAAIsmB,GAASw3C,EAAM0E,EAAOxiE,GACnC6mE,IACEK,MACFL,GAAS,GAEX5xD,EAAO6oD,GAGX8D,EAAKkF,QAAUD,EAEblC,GACFpC,GAAap9D,KAAMq9D,GAGvBt9D,mBAAmB08D,EAAM1/D,EAAMokB,EAAOi0C,GACpC,MAAMoI,OAACA,EAAMP,OAAEA,GAAUR,EACnBgB,EAAQD,EAAO5sD,KACf8sD,EAAQT,EAAOrsD,KACfoxD,EAASxE,EAAOyE,YAChBC,EAAc1E,IAAWP,EACzBI,EAAS,IAAI58D,MAAM20D,GACzB,IAAIv6D,EAAGivC,EAAMzjC,EACb,IAAKxL,EAAI,EAAGivC,EAAOsrB,EAAOv6D,EAAIivC,IAAQjvC,EACpCwL,EAAQxL,EAAIsmB,EACZk8C,EAAOxiE,GAAK,CACVkF,CAAC09D,GAAQyE,GAAe1E,EAAO2E,MAAMH,EAAO37D,GAAQA,GACpDtG,CAAC29D,GAAQT,EAAOkF,MAAMplE,EAAKsJ,GAAQA,IAGvC,OAAOg3D,EAETt9D,eAAe08D,EAAM1/D,EAAMokB,EAAOi0C,GAChC,MAAMmL,OAACA,EAAME,OAAEA,GAAUhE,EACnBY,EAAS,IAAI58D,MAAM20D,GACzB,IAAIv6D,EAAGivC,EAAMzjC,EAAO0pB,EACpB,IAAKl1B,EAAI,EAAGivC,EAAOsrB,EAAOv6D,EAAIivC,IAAQjvC,EACpCwL,EAAQxL,EAAIsmB,EACZ4O,EAAOhzB,EAAKsJ,GACZg3D,EAAOxiE,GAAK,CACVgwB,EAAG01C,EAAO4B,MAAMpyC,EAAK,GAAI1pB,GACzBykB,EAAG21C,EAAO0B,MAAMpyC,EAAK,GAAI1pB,IAG7B,OAAOg3D,EAETt9D,gBAAgB08D,EAAM1/D,EAAMokB,EAAOi0C,GACjC,MAAMmL,OAACA,EAAME,OAAEA,GAAUhE,GACnB2F,SAACA,EAAW,IAAGC,SAAEA,EAAW,KAAOriE,KAAK6+D,SACxCxB,EAAS,IAAI58D,MAAM20D,GACzB,IAAIv6D,EAAGivC,EAAMzjC,EAAO0pB,EACpB,IAAKl1B,EAAI,EAAGivC,EAAOsrB,EAAOv6D,EAAIivC,IAAQjvC,EACpCwL,EAAQxL,EAAIsmB,EACZ4O,EAAOhzB,EAAKsJ,GACZg3D,EAAOxiE,GAAK,CACVgwB,EAAG01C,EAAO4B,MAAMl3B,GAAiBlb,EAAMqyC,GAAW/7D,GAClDykB,EAAG21C,EAAO0B,MAAMl3B,GAAiBlb,EAAMsyC,GAAWh8D,IAGtD,OAAOg3D,EAETt9D,UAAUsG,GACR,OAAOrG,KAAKs9D,YAAYa,QAAQ93D,GAElCtG,eAAesG,GACb,OAAOrG,KAAKs9D,YAAYvgE,KAAKsJ,GAE/BtG,WAAWu4B,EAAO+kC,EAAQ7b,GACxB,MAAMZ,EAAQ5gD,KAAK4gD,MACb6b,EAAOz8D,KAAKs9D,YACZ3/D,EAAQ0/D,EAAO/kC,EAAM1nB,MAK3B,OAAOurD,GAJO,CACZzgE,KAAMqgE,GAAwBnb,GAAO,GACrCP,OAAQgd,EAAOE,QAAQjlC,EAAM1nB,OAENjT,EAAO8+D,EAAKp2D,MAAO,CAACm7C,KAAAA,IAE/CzhD,sBAAsBssC,EAAO/T,EAAO+kC,EAAQjB,GAC1C,MAAMkG,EAAcjF,EAAO/kC,EAAM1nB,MACjC,IAAIjT,EAAwB,OAAhB2kE,EAAuBC,IAAMD,EACzC,MAAMjiB,EAAS+b,GAASiB,EAAOE,QAAQjlC,EAAM1nB,MACzCwrD,GAAS/b,IACX+b,EAAM/b,OAASA,EACf1iD,EAAQw+D,GAAWC,EAAOkG,EAAatiE,KAAKs9D,YAAYj3D,QAE1DgmC,EAAMt4B,IAAMrZ,KAAKqZ,IAAIs4B,EAAMt4B,IAAKpW,GAChC0uC,EAAM1xC,IAAMD,KAAKC,IAAI0xC,EAAM1xC,IAAKgD,GAElCoC,UAAUu4B,EAAOkqC,GACf,MAAM/F,EAAOz8D,KAAKs9D,YACZa,EAAU1B,EAAK0B,QACfuD,EAASjF,EAAKkF,SAAWrpC,IAAUmkC,EAAKe,OACxC1zB,EAAOq0B,EAAQvjE,OACf6nE,EAAaziE,KAAK0iE,eAAepqC,GACjC8jC,EArPU,EAACoG,EAAU/F,EAAM7b,IAAU4hB,IAAa/F,EAAKkG,QAAUlG,EAAK+C,UAC3E,CAAC9jE,KAAMqgE,GAAwBnb,GAAO,GAAOP,OAAQ,MAoPxCuiB,CAAYJ,EAAU/F,EAAMz8D,KAAK4gD,OACzCvU,EAAQ,CAACt4B,IAAKgR,OAAO8mB,kBAAmBlxC,IAAKoqB,OAAO89C,oBACnD9uD,IAAK+uD,EAAUnoE,IAAKooE,GA3U/B,SAAuBzqC,GACrB,MAAMvkB,IAACA,EAAGpZ,IAAEA,EAAGqoE,WAAEA,EAAUC,WAAEA,GAAc3qC,EAAM4qC,gBACjD,MAAO,CACLnvD,IAAKivD,EAAajvD,EAAMgR,OAAO89C,kBAC/BloE,IAAKsoE,EAAatoE,EAAMoqB,OAAO8mB,mBAuUQq3B,CAAcT,GACrD,IAAI5nE,EAAGwiE,EACP,SAAS8F,IACP9F,EAASc,EAAQtjE,GACjB,MAAM0hE,EAAac,EAAOoF,EAAW7xD,MACrC,OAAQs4B,GAAem0B,EAAO/kC,EAAM1nB,QAAUkyD,EAAWvG,GAAcwG,EAAWxG,EAEpF,IAAK1hE,EAAI,EAAGA,EAAIivC,IACVq5B,MAGJnjE,KAAKojE,sBAAsB/2B,EAAO/T,EAAO+kC,EAAQjB,IAC7CsF,MALkB7mE,GASxB,GAAI6mE,EACF,IAAK7mE,EAAIivC,EAAO,EAAGjvC,GAAK,IAAKA,EAC3B,IAAIsoE,IAAJ,CAGAnjE,KAAKojE,sBAAsB/2B,EAAO/T,EAAO+kC,EAAQjB,GACjD,MAGJ,OAAO/vB,EAETtsC,mBAAmBu4B,GACjB,MAAM+kC,EAASr9D,KAAKs9D,YAAYa,QAC1B9d,EAAS,GACf,IAAIxlD,EAAGivC,EAAMnsC,EACb,IAAK9C,EAAI,EAAGivC,EAAOuzB,EAAOziE,OAAQC,EAAIivC,IAAQjvC,EAC5C8C,EAAQ0/D,EAAOxiE,GAAGy9B,EAAM1nB,MACpBs4B,GAAevrC,IACjB0iD,EAAOl/C,KAAKxD,GAGhB,OAAO0iD,EAETtgD,iBACE,OAAO,EAETA,iBAAiBsG,GACf,MAAMo2D,EAAOz8D,KAAKs9D,YACZE,EAASf,EAAKe,OACdP,EAASR,EAAKQ,OACdI,EAASr9D,KAAKqjE,UAAUh9D,GAC9B,MAAO,CACLuf,MAAO43C,EAAS,GAAKA,EAAO8F,iBAAiBjG,EAAOG,EAAO5sD,OAAS,GACpEjT,MAAOs/D,EAAS,GAAKA,EAAOqG,iBAAiBjG,EAAOJ,EAAOrsD,OAAS,IAGxE7Q,QAAQyhD,GACN,MAAMib,EAAOz8D,KAAKs9D,YAClBt9D,KAAK+C,OAAOy+C,GAAQ,WACpBib,EAAK8G,MAvcT,SAAgB5lE,GACd,IAAI2C,EAAGmD,EAAGrK,EAAG6M,EASb,OARIS,GAAS/I,IACX2C,EAAI3C,EAAM4Q,IACV9K,EAAI9F,EAAM8nD,MACVrsD,EAAIuE,EAAM+nD,OACVz/C,EAAItI,EAAM6Q,MAEVlO,EAAImD,EAAIrK,EAAI6M,EAAItI,EAEX,CACL4Q,IAAKjO,EACLmlD,MAAOhiD,EACPiiD,OAAQtsD,EACRoV,KAAMvI,EACNuuB,UAAoB,IAAV72B,GAwbG6lE,CAAOn6B,GAAerpC,KAAK1C,QAAQsoD,KApdpD,SAAqB2a,EAAQE,EAAQ3E,GACnC,IAAwB,IAApBA,EACF,OAAO,EAET,MAAMjxC,EAAIgxC,GAAU0E,EAAQzE,GACtBhxC,EAAI+wC,GAAU4E,EAAQ3E,GAC5B,MAAO,CACLvtD,IAAKuc,EAAEvJ,IACPkkC,MAAO56B,EAAEtJ,IACTmkC,OAAQ56B,EAAE3J,MACV3S,KAAMqc,EAAE1J,OA0c8CsiD,CAAYhH,EAAK8D,OAAQ9D,EAAKgE,OAAQzgE,KAAK0jE,oBAEnG3jE,OAAOyhD,IACPzhD,OACE,MAAMhG,EAAMiG,KAAKy+D,KACX7d,EAAQ5gD,KAAK4gD,MACb6b,EAAOz8D,KAAKs9D,YACZxc,EAAW2b,EAAK1/D,MAAQ,GACxBwoD,EAAO3E,EAAM+iB,UACbnJ,EAAS,GACTr5C,EAAQnhB,KAAKi/D,YAAc,EAC3B7J,EAAQp1D,KAAKk/D,YAAepe,EAASlmD,OAASumB,EAC9C8gC,EAA0BjiD,KAAK1C,QAAQ2kD,wBAC7C,IAAIpnD,EAIJ,IAHI4hE,EAAKiD,SACPjD,EAAKiD,QAAQzH,KAAKl+D,EAAKwrD,EAAMpkC,EAAOi0C,GAEjCv6D,EAAIsmB,EAAOtmB,EAAIsmB,EAAQi0C,IAASv6D,EAAG,CACtC,MAAM+B,EAAUkkD,EAASjmD,GACrB+B,EAAQ+lE,SAGR/lE,EAAQ49D,QAAUvY,EACpBuY,EAAOr5D,KAAKvE,GAEZA,EAAQq7D,KAAKl+D,EAAKwrD,IAGtB,IAAK1qD,EAAI,EAAGA,EAAI2/D,EAAO5/D,SAAUC,EAC/B2/D,EAAO3/D,GAAGo9D,KAAKl+D,EAAKwrD,GAGxBxlD,SAASsG,EAAOm0D,GACd,MAAMhZ,EAAOgZ,EAAS,SAAW,UACjC,YAAiBjgE,IAAV8L,GAAuBrG,KAAKs9D,YAAYoC,QAC3C1/D,KAAK4jE,6BAA6BpiB,GAClCxhD,KAAK6jE,0BAA0Bx9D,GAAS,EAAGm7C,GAEjDzhD,WAAWsG,EAAOm0D,EAAQhZ,GACxB,MAAMke,EAAU1/D,KAAK2/D,aACrB,IAAIr6D,EACJ,GAAIe,GAAS,GAAKA,EAAQrG,KAAKs9D,YAAYvgE,KAAKnC,OAAQ,CACtD,MAAMgC,EAAUoD,KAAKs9D,YAAYvgE,KAAKsJ,GACtCf,EAAU1I,EAAQwiE,WACfxiE,EAAQwiE,SAvXjB,SAA2BlvD,EAAQ7J,EAAOzJ,GACxC,OAAO4sD,GAAct5C,EAAQ,CAC3BsqD,QAAQ,EACRttD,UAAW7G,EACXg3D,YAAQ9iE,EACRupE,SAAKvpE,EACLqC,QAAAA,EACAyJ,MAAAA,EACAm7C,KAAM,UACN//C,KAAM,SA8WkBsiE,CAAkB/jE,KAAKikD,aAAc59C,EAAOzJ,IAClE0I,EAAQ+3D,OAASr9D,KAAKqjE,UAAUh9D,GAChCf,EAAQw+D,IAAMpE,EAAQ3iE,KAAKsJ,GAC3Bf,EAAQe,MAAQf,EAAQ4H,UAAY7G,OAEpCf,EAAUtF,KAAKo/D,WACZp/D,KAAKo/D,SAzYd,SAA8BlvD,EAAQ7J,GACpC,OAAOmjD,GAAct5C,EACnB,CACEsqD,QAAQ,EACRkF,aAASnlE,EACT0vC,aAAc5jC,EACdA,MAAAA,EACAm7C,KAAM,UACN//C,KAAM,YAiYauiE,CAAqBhkE,KAAK4gD,MAAMqD,aAAcjkD,KAAKqG,QACtEf,EAAQo6D,QAAUA,EAClBp6D,EAAQe,MAAQf,EAAQ2kC,aAAejqC,KAAKqG,MAI9C,OAFAf,EAAQk1D,SAAWA,EACnBl1D,EAAQk8C,KAAOA,EACRl8C,EAETvF,6BAA6ByhD,GAC3B,OAAOxhD,KAAKikE,uBAAuBjkE,KAAKihE,mBAAmBv4D,GAAI84C,GAEjEzhD,0BAA0BsG,EAAOm7C,GAC/B,OAAOxhD,KAAKikE,uBAAuBjkE,KAAKkkE,gBAAgBx7D,GAAI84C,EAAMn7C,GAEpEtG,uBAAuBokE,EAAa3iB,EAAO,UAAWn7C,GACpD,MAAMm0D,EAAkB,WAAThZ,EACT7e,EAAQ3iC,KAAK0+D,gBACb9K,EAAWuQ,EAAc,IAAM3iB,EAC/B8c,EAAS37B,EAAMixB,GACfwQ,EAAUpkE,KAAKm/D,qBAAuB5zB,GAAQllC,GACpD,GAAIi4D,EACF,OAAOD,GAAiBC,EAAQ8F,GAElC,MAAMtJ,EAAS96D,KAAK4gD,MAAMka,OACpBwG,EAAYxG,EAAOuJ,wBAAwBrkE,KAAK4+D,MAAOuF,GACvDzZ,EAAW8P,EAAS,CAAI2J,EAAH,QAAuB,QAASA,EAAa,IAAM,CAACA,EAAa,IACtF1Z,EAASqQ,EAAO0G,gBAAgBxhE,KAAK2/D,aAAc2B,GACnD3sB,EAAQh8C,OAAO+C,KAAKu2B,GAAS6uB,SAASqjB,IAEtC9jB,EAASya,EAAOwJ,oBAAoB7Z,EAAQ9V,EADlC,IAAM30C,KAAKikD,WAAW59C,EAAOm0D,GACqB9P,GAKlE,OAJIrK,EAAO+a,UACT/a,EAAO+a,QAAUgJ,EACjBzhC,EAAMixB,GAAYj7D,OAAO4rE,OAAOlG,GAAiBhe,EAAQ+jB,KAEpD/jB,EAETtgD,mBAAmBsG,EAAOiF,EAAYkvD,GACpC,MAAM5Z,EAAQ5gD,KAAK4gD,MACbje,EAAQ3iC,KAAK0+D,gBACb9K,EAAW,aAAatoD,EACxBgzD,EAAS37B,EAAMixB,GACrB,GAAI0K,EACF,OAAOA,EAET,IAAIhhE,EACJ,IAAgC,IAA5BsjD,EAAMtjD,QAAQijD,UAAqB,CACrC,MAAMua,EAAS96D,KAAK4gD,MAAMka,OACpBwG,EAAYxG,EAAO0J,0BAA0BxkE,KAAK4+D,MAAOtzD,GACzDm/C,EAASqQ,EAAO0G,gBAAgBxhE,KAAK2/D,aAAc2B,GACzDhkE,EAAUw9D,EAAO2G,eAAehX,EAAQzqD,KAAKikD,WAAW59C,EAAOm0D,EAAQlvD,IAEzE,MAAMqvD,EAAa,IAAIE,GAAWja,EAAOtjD,GAAWA,EAAQq9D,YAI5D,OAHIr9D,GAAWA,EAAQ0tD,aACrBroB,EAAMixB,GAAYj7D,OAAO4rE,OAAO5J,IAE3BA,EAET56D,iBAAiBzC,GACf,GAAKA,EAAQ89D,QAGb,OAAOp7D,KAAKg/D,iBAAmBh/D,KAAKg/D,eAAiBrmE,OAAOP,OAAO,GAAIkF,IAEzEyC,eAAeyhD,EAAMijB,GACnB,OAAQA,GAAiBrG,GAAmB5c,IAASxhD,KAAK4gD,MAAM8jB,oBAElE3kE,cAAcnD,EAASyJ,EAAOi0D,EAAY9Y,GACpC4c,GAAmB5c,GACrB7oD,OAAOP,OAAOwE,EAAS09D,GAEvBt6D,KAAK2kE,mBAAmBt+D,EAAOm7C,GAAMz+C,OAAOnG,EAAS09D,GAGzDv6D,oBAAoB0kE,EAAejjB,EAAM2Z,GACnCsJ,IAAkBrG,GAAmB5c,IACvCxhD,KAAK2kE,wBAAmBpqE,EAAWinD,GAAMz+C,OAAO0hE,EAAetJ,GAGnEp7D,UAAUnD,EAASyJ,EAAOm7C,EAAMgZ,GAC9B59D,EAAQ49D,OAASA,EACjB,MAAMl9D,EAAU0C,KAAKmzD,SAAS9sD,EAAOm0D,GACrCx6D,KAAK2kE,mBAAmBt+D,EAAOm7C,EAAMgZ,GAAQz3D,OAAOnG,EAAS,CAC3DU,SAAWk9D,GAAUx6D,KAAK4kE,iBAAiBtnE,IAAaA,IAG5DyC,iBAAiBnD,EAASqtC,EAAc5jC,GACtCrG,KAAK6kE,UAAUjoE,EAASyJ,EAAO,UAAU,GAE3CtG,cAAcnD,EAASqtC,EAAc5jC,GACnCrG,KAAK6kE,UAAUjoE,EAASyJ,EAAO,UAAU,GAE3CtG,2BACE,MAAMnD,EAAUoD,KAAKs9D,YAAYoC,QAC7B9iE,GACFoD,KAAK6kE,UAAUjoE,OAASrC,EAAW,UAAU,GAGjDwF,wBACE,MAAMnD,EAAUoD,KAAKs9D,YAAYoC,QAC7B9iE,GACFoD,KAAK6kE,UAAUjoE,OAASrC,EAAW,UAAU,GAGjDwF,gBAAgBmhE,GACd,MAAMnkE,EAAOiD,KAAK8+D,MACZhe,EAAW9gD,KAAKs9D,YAAYvgE,KAClC,IAAK,MAAOia,EAAQ8tD,EAAMC,KAAS/kE,KAAKq/D,UACtCr/D,KAAKgX,GAAQ8tD,EAAMC,GAErB/kE,KAAKq/D,UAAY,GACjB,MAAM2F,EAAUlkB,EAASlmD,OACnBqqE,EAAUloE,EAAKnC,OACfw6D,EAAQ16D,KAAKqZ,IAAIkxD,EAASD,GAC5B5P,GACFp1D,KAAKmiE,MAAM,EAAG/M,GAEZ6P,EAAUD,EACZhlE,KAAKklE,gBAAgBF,EAASC,EAAUD,EAAS9D,GACxC+D,EAAUD,GACnBhlE,KAAKmlE,gBAAgBF,EAASD,EAAUC,GAG5CllE,gBAAgBohB,EAAOi0C,EAAO8L,GAAmB,GAC/C,MAAMzE,EAAOz8D,KAAKs9D,YACZvgE,EAAO0/D,EAAK1/D,KACZwkB,EAAMJ,EAAQi0C,EACpB,IAAIv6D,EACJ,MAAMymB,EAAQ/X,IAEZ,IADAA,EAAI3O,QAAUw6D,EACTv6D,EAAI0O,EAAI3O,OAAS,EAAGC,GAAK0mB,EAAK1mB,IACjC0O,EAAI1O,GAAK0O,EAAI1O,EAAIu6D,IAIrB,IADA9zC,EAAKvkB,GACAlC,EAAIsmB,EAAOtmB,EAAI0mB,IAAO1mB,EACzBkC,EAAKlC,GAAK,IAAImF,KAAKkkE,gBAEjBlkE,KAAK6+D,UACPv9C,EAAKm7C,EAAK0B,SAEZn+D,KAAKmiE,MAAMhhD,EAAOi0C,GACd8L,GACFlhE,KAAKolE,eAAeroE,EAAMokB,EAAOi0C,EAAO,SAG5Cr1D,eAAenD,EAASukB,EAAOi0C,EAAO5T,IACtCzhD,gBAAgBohB,EAAOi0C,GACrB,MAAMqH,EAAOz8D,KAAKs9D,YAClB,GAAIt9D,KAAK6+D,SAAU,CACjB,MAAMwG,EAAU5I,EAAK0B,QAAQ73D,OAAO6a,EAAOi0C,GACvCqH,EAAK+C,UACPtB,GAAYzB,EAAM4I,GAGtB5I,EAAK1/D,KAAKuJ,OAAO6a,EAAOi0C,GAE1Br1D,MAAM2L,GACJ,GAAI1L,KAAK6+D,SACP7+D,KAAKq/D,UAAUl+D,KAAKuK,OACf,CACL,MAAOsL,EAAQ8tD,EAAMC,GAAQr5D,EAC7B1L,KAAKgX,GAAQ8tD,EAAMC,GAErB/kE,KAAK4gD,MAAM0kB,aAAankE,KAAK,CAACnB,KAAKqG,SAAUqF,IAE/C3L,cACE,MAAMq1D,EAAQlqD,UAAUtQ,OACxBoF,KAAKulE,MAAM,CAAC,kBAAmBvlE,KAAK2/D,aAAa5iE,KAAKnC,OAASw6D,EAAOA,IAExEr1D,aACEC,KAAKulE,MAAM,CAAC,kBAAmBvlE,KAAKs9D,YAAYvgE,KAAKnC,OAAS,EAAG,IAEnEmF,eACEC,KAAKulE,MAAM,CAAC,kBAAmB,EAAG,IAEpCxlE,cAAcohB,EAAOi0C,GACfA,GACFp1D,KAAKulE,MAAM,CAAC,kBAAmBpkD,EAAOi0C,IAExC,MAAMoQ,EAAWt6D,UAAUtQ,OAAS,EAChC4qE,GACFxlE,KAAKulE,MAAM,CAAC,kBAAmBpkD,EAAOqkD,IAG1CzlE,iBACEC,KAAKulE,MAAM,CAAC,kBAAmB,EAAGr6D,UAAUtQ,UAkBhD,SAAS6qE,GAAqBhJ,GAC5B,MAAMnkC,EAAQmkC,EAAKe,OACbnd,EAbR,SAA2B/nB,EAAO72B,GAChC,IAAK62B,EAAMotC,OAAOC,KAAM,CACtB,MAAMC,EAAettC,EAAM6kC,wBAAwB17D,GACnD,IAAI4+C,EAAS,GACb,IAAK,IAAIxlD,EAAI,EAAGivC,EAAO87B,EAAahrE,OAAQC,EAAIivC,EAAMjvC,IACpDwlD,EAASA,EAAOwlB,OAAOD,EAAa/qE,GAAGsmC,WAAW2kC,mBAAmBxtC,IAEvEA,EAAMotC,OAAOC,KAAOpb,GAAalK,EAAO/wB,KAAK,CAACn2B,EAAGC,IAAMD,EAAIC,IAE7D,OAAOk/B,EAAMotC,OAAOC,KAILI,CAAkBztC,EAAOmkC,EAAKh7D,MAC7C,IACI5G,EAAGivC,EAAMk8B,EAAMl2D,EADfiE,EAAMukB,EAAM2tC,QAEhB,MAAMC,EAAmB,KACV,QAATF,IAA4B,QAAVA,IAGlBz6B,GAAQz7B,KACViE,EAAMrZ,KAAKqZ,IAAIA,EAAKrZ,KAAK6hB,IAAIypD,EAAOl2D,IAASiE,IAE/CjE,EAAOk2D,IAET,IAAKnrE,EAAI,EAAGivC,EAAOuW,EAAOzlD,OAAQC,EAAIivC,IAAQjvC,EAC5CmrE,EAAO1tC,EAAM6tC,iBAAiB9lB,EAAOxlD,IACrCqrE,IAGF,IADAp2D,OAAOvV,EACFM,EAAI,EAAGivC,EAAOxR,EAAM8tC,MAAMxrE,OAAQC,EAAIivC,IAAQjvC,EACjDmrE,EAAO1tC,EAAM+tC,gBAAgBxrE,GAC7BqrE,IAEF,OAAOnyD,EA2DT,SAASuyD,GAAWC,EAAOx2C,EAAMktC,EAAQpiE,GAMvC,OALI6O,GAAQ68D,GAtBd,SAAuBA,EAAOx2C,EAAMktC,EAAQpiE,GAC1C,MAAM2rE,EAAavJ,EAAOkF,MAAMoE,EAAM,GAAI1rE,GACpC4rE,EAAWxJ,EAAOkF,MAAMoE,EAAM,GAAI1rE,GAClCkZ,EAAMrZ,KAAKqZ,IAAIyyD,EAAYC,GAC3B9rE,EAAMD,KAAKC,IAAI6rE,EAAYC,GACjC,IAAIC,EAAW3yD,EACX4yD,EAAShsE,EACTD,KAAK6hB,IAAIxI,GAAOrZ,KAAK6hB,IAAI5hB,KAC3B+rE,EAAW/rE,EACXgsE,EAAS5yD,GAEXgc,EAAKktC,EAAOrsD,MAAQ+1D,EACpB52C,EAAK62C,QAAU,CACbF,SAAAA,EACAC,OAAAA,EACAxlD,MAAOqlD,EACPjlD,IAAKklD,EACL1yD,IAAAA,EACApZ,IAAAA,GAKAksE,CAAcN,EAAOx2C,EAAMktC,EAAQpiE,GAEnCk1B,EAAKktC,EAAOrsD,MAAQqsD,EAAOkF,MAAMoE,EAAO1rE,GAEnCk1B,EAET,SAAS+2C,GAAsBrK,EAAM1/D,EAAMokB,EAAOi0C,GAChD,MAAMoI,EAASf,EAAKe,OACdP,EAASR,EAAKQ,OACd+E,EAASxE,EAAOyE,YAChBC,EAAc1E,IAAWP,EACzBI,EAAS,GACf,IAAIxiE,EAAGivC,EAAM/Z,EAAMw2C,EACnB,IAAK1rE,EAAIsmB,EAAO2oB,EAAO3oB,EAAQi0C,EAAOv6D,EAAIivC,IAAQjvC,EAChD0rE,EAAQxpE,EAAKlC,GACbk1B,EAAO,GACPA,EAAKytC,EAAO5sD,MAAQsxD,GAAe1E,EAAO2E,MAAMH,EAAOnnE,GAAIA,GAC3DwiE,EAAOl8D,KAAKmlE,GAAWC,EAAOx2C,EAAMktC,EAAQpiE,IAE9C,OAAOwiE,EAET,SAAS0J,GAAWC,GAClB,OAAOA,QAA8BzsE,IAApBysE,EAAON,eAA4CnsE,IAAlBysE,EAAOL,OA4B3D,SAASM,GAAiB3M,EAAYh9D,EAAS8+D,EAAO/1D,GACpD,IAAI6gE,EAAO5pE,EAAQ6pE,cACnB,MAAM39D,EAAM,GACZ,IAAK09D,EAEH,YADA5M,EAAW6M,cAAgB39D,GAG7B,MAAM2X,MAACA,EAAKI,IAAEA,EAAGmoB,QAAEA,EAAOn7B,IAAEA,EAAGm3C,OAAEA,GA3BnC,SAAqB4U,GACnB,IAAI5wB,EAASvoB,EAAOI,EAAKhT,EAAKm3C,EAiB9B,OAhBI4U,EAAW8M,YACb19B,EAAU4wB,EAAWlhD,KAAOkhD,EAAWzvC,EACvC1J,EAAQ,OACRI,EAAM,UAENmoB,EAAU4wB,EAAWlhD,KAAOkhD,EAAWxvC,EACvC3J,EAAQ,SACRI,EAAM,OAEJmoB,GACFn7B,EAAM,MACNm3C,EAAS,UAETn3C,EAAM,QACNm3C,EAAS,OAEJ,CAACvkC,MAAAA,EAAOI,IAAAA,EAAKmoB,QAAAA,EAASn7B,IAAAA,EAAKm3C,OAAAA,GASS2hB,CAAY/M,GAC1C,WAAT4M,GAAqB9K,IACvB9B,EAAWgN,oBAAqB,GAC3BlL,EAAM0B,MAAQ,KAAOz3D,EACxB6gE,EAAO34D,GACG6tD,EAAM2B,SAAW,KAAO13D,EAClC6gE,EAAOxhB,GAEPl8C,EAAI+9D,GAAU7hB,EAAQvkC,EAAOI,EAAKmoB,KAAY,EAC9Cw9B,EAAO34D,IAGX/E,EAAI+9D,GAAUL,EAAM/lD,EAAOI,EAAKmoB,KAAY,EAC5C4wB,EAAW6M,cAAgB39D,EAE7B,SAAS+9D,GAAUL,EAAM/tE,EAAGC,EAAGswC,GAS/B,IAAc89B,EAAMx9B,EAAIy9B,EAFtB,OANI/9B,GAQkB+9B,EAPCruE,EACrB8tE,EAAOQ,GADPR,GAOUM,EAPEN,MAOIl9B,EAPE7wC,GAQCsuE,EAAKD,IAASC,EAAKz9B,EAAKw9B,EAPrBpuE,EAAGD,IAEzB+tE,EAAOQ,GAASR,EAAM/tE,EAAGC,GAEpB8tE,EAKT,SAASQ,GAASl/C,EAAGrH,EAAOI,GAC1B,MAAa,UAANiH,EAAgBrH,EAAc,QAANqH,EAAcjH,EAAMiH,EAErD,SAASm/C,GAAiBrN,GAAYsN,cAACA,GAAgB9oD,GACrDw7C,EAAWsN,cAAkC,SAAlBA,EACb,IAAV9oD,EAAc,IAAO,EACrB8oD,EA7LNpJ,GAAkBvsC,SAAW,GAC7BusC,GAAkB50D,UAAUq3D,mBAAqB,KACjDzC,GAAkB50D,UAAUs6D,gBAAkB,KA6L9C,MAAM2D,WAAsBrJ,GAC1Bz+D,mBAAmB08D,EAAM1/D,EAAMokB,EAAOi0C,GACpC,OAAO0R,GAAsBrK,EAAM1/D,EAAMokB,EAAOi0C,GAElDr1D,eAAe08D,EAAM1/D,EAAMokB,EAAOi0C,GAChC,OAAO0R,GAAsBrK,EAAM1/D,EAAMokB,EAAOi0C,GAElDr1D,gBAAgB08D,EAAM1/D,EAAMokB,EAAOi0C,GACjC,MAAMoI,OAACA,EAAMP,OAAEA,GAAUR,GACnB2F,SAACA,EAAW,IAAGC,SAAEA,EAAW,KAAOriE,KAAK6+D,SACxCiJ,EAA2B,MAAhBtK,EAAO5sD,KAAewxD,EAAWC,EAC5C0F,EAA2B,MAAhB9K,EAAOrsD,KAAewxD,EAAWC,EAC5ChF,EAAS,GACf,IAAIxiE,EAAGivC,EAAM/Z,EAAMvpB,EACnB,IAAK3L,EAAIsmB,EAAO2oB,EAAO3oB,EAAQi0C,EAAOv6D,EAAIivC,IAAQjvC,EAChD2L,EAAMzJ,EAAKlC,GACXk1B,EAAO,GACPA,EAAKytC,EAAO5sD,MAAQ4sD,EAAO2E,MAAMl3B,GAAiBzkC,EAAKshE,GAAWjtE,GAClEwiE,EAAOl8D,KAAKmlE,GAAWr7B,GAAiBzkC,EAAKuhE,GAAWh4C,EAAMktC,EAAQpiE,IAExE,OAAOwiE,EAETt9D,sBAAsBssC,EAAO/T,EAAO+kC,EAAQjB,GAC1CnzD,MAAMm6D,sBAAsB/2B,EAAO/T,EAAO+kC,EAAQjB,GAClD,MAAM4K,EAAS3J,EAAOuJ,QAClBI,GAAU1uC,IAAUt4B,KAAKs9D,YAAYL,SACvC5wB,EAAMt4B,IAAMrZ,KAAKqZ,IAAIs4B,EAAMt4B,IAAKizD,EAAOjzD,KACvCs4B,EAAM1xC,IAAMD,KAAKC,IAAI0xC,EAAM1xC,IAAKqsE,EAAOrsE,MAG3CoF,iBACE,OAAO,EAETA,iBAAiBsG,GACf,MAAMo2D,EAAOz8D,KAAKs9D,aACZE,OAACA,EAAMP,OAAEA,GAAUR,EACnBY,EAASr9D,KAAKqjE,UAAUh9D,GACxB2gE,EAAS3J,EAAOuJ,QAChBjpE,EAAQopE,GAAWC,GACrB,IAAMA,EAAO7lD,MAAQ,KAAO6lD,EAAOzlD,IAAM,IACzC,GAAK07C,EAAOqG,iBAAiBjG,EAAOJ,EAAOrsD,OAC/C,MAAO,CACLgV,MAAO,GAAK43C,EAAO8F,iBAAiBjG,EAAOG,EAAO5sD,OAClDjT,MAAAA,GAGJoC,aACEC,KAAKm/D,qBAAsB,EAC3Bl2D,MAAMq2D,aACOt/D,KAAKs9D,YACblB,MAAQp8D,KAAK2/D,aAAavD,MAEjCr8D,OAAOyhD,GACL,MAAMib,EAAOz8D,KAAKs9D,YAClBt9D,KAAKolE,eAAe3I,EAAK1/D,KAAM,EAAG0/D,EAAK1/D,KAAKnC,OAAQ4mD,GAEtDzhD,eAAeioE,EAAM7mD,EAAOi0C,EAAO5T,GACjC,MAAMymB,EAAiB,UAATzmB,GACRn7C,MAACA,EAAOi3D,aAAaL,OAACA,IAAWj9D,KACjCoZ,EAAO6jD,EAAOiL,eACdd,EAAanK,EAAO5gD,eACpB8rD,EAAQnoE,KAAKooE,YACbC,EAAYroE,KAAK6jE,0BAA0B1iD,EAAOqgC,GAClDijB,EAAgBzkE,KAAK4kE,iBAAiByD,GACtCC,EAAiBtoE,KAAKsoE,eAAe9mB,EAAMijB,GACjDzkE,KAAKuoE,oBAAoB9D,EAAejjB,EAAM6mB,GAC9C,IAAK,IAAIxtE,EAAIsmB,EAAOtmB,EAAIsmB,EAAQi0C,EAAOv6D,IAAK,CAC1C,MAAMwiE,EAASr9D,KAAKqjE,UAAUxoE,GACxB2tE,EAAUP,GAASh/B,GAAco0B,EAAOJ,EAAOrsD,OAAS,CAACwI,KAAAA,EAAMqvD,KAAMrvD,GAAQpZ,KAAK0oE,yBAAyB7tE,GAC3G8tE,EAAU3oE,KAAK4oE,yBAAyB/tE,EAAGstE,GAC3C/L,GAASiB,EAAOE,SAAW,IAAIN,EAAOrsD,MACtC0pD,EAAa,CACjB8M,WAAAA,EACAhuD,KAAMovD,EAAQpvD,KACdkuD,oBAAqBlL,GAAS2K,GAAW1J,EAAOuJ,UAAavgE,IAAU+1D,EAAM0B,MAAQz3D,IAAU+1D,EAAM2B,QACrGlzC,EAAGu8C,EAAaoB,EAAQC,KAAOE,EAAQE,OACvC/9C,EAAGs8C,EAAauB,EAAQE,OAASL,EAAQC,KACzC5yD,OAAQuxD,EAAauB,EAAQ1jD,KAAOvqB,KAAK6hB,IAAIisD,EAAQvjD,MACrDtP,MAAOyxD,EAAa1sE,KAAK6hB,IAAIisD,EAAQvjD,MAAQ0jD,EAAQ1jD,MAEnDqjD,IACFhO,EAAWh9D,QAAUmnE,GAAiBzkE,KAAK6jE,0BAA0BhpE,EAAGmtE,EAAKntE,GAAG2/D,OAAS,SAAWhZ,IAEtG,MAAMlkD,EAAUg9D,EAAWh9D,SAAW0qE,EAAKntE,GAAGyC,QAC9C2pE,GAAiB3M,EAAYh9D,EAAS8+D,EAAO/1D,GAC7CshE,GAAiBrN,EAAYh9D,EAAS6qE,EAAMrpD,OAC5C9e,KAAK8oE,cAAcd,EAAKntE,GAAIA,EAAGy/D,EAAY9Y,IAG/CzhD,WAAWgpE,EAAM77D,GACf,MACMswD,EADOx9D,KAAKs9D,YACEE,OACdvB,EAAWuB,EAAOL,wBAAwBn9D,KAAK4+D,OAC/ClC,EAAUc,EAAOlgE,QAAQo/D,QACzB5yB,EAAOmyB,EAASrhE,OAChBgiE,EAAS,GACf,IAAI/hE,EAAGk1B,EACP,IAAKl1B,EAAI,EAAGA,EAAIivC,IAAQjvC,EAEtB,GADAk1B,EAAOksC,EAASphE,GACXk1B,EAAKoR,WAAW7jC,QAAQ0rE,QAA7B,CAGA,QAAyB,IAAd97D,EAA2B,CACpC,MAAMsf,EAAMuD,EAAKoR,WAAWkiC,UAAUn2D,GACpC6iB,EAAKoR,WAAWm8B,YAAYL,OAAOrsD,MAErC,GAAIq4B,GAAczc,IAAQxH,MAAMwH,GAC9B,SAOJ,KAJgB,IAAZkwC,IAAqD,IAAhCE,EAAOr9D,QAAQwwB,EAAKqsC,aAClC7hE,IAAZmiE,QAAwCniE,IAAfw1B,EAAKqsC,QAC3BQ,EAAOz7D,KAAK4uB,EAAKqsC,OAEfrsC,EAAK1pB,QAAU0iE,EACjB,MAMJ,OAHKnM,EAAOhiE,QACVgiE,EAAOz7D,UAAK5G,GAEPqiE,EAET78D,eAAesG,GACb,OAAOrG,KAAKipE,gBAAW1uE,EAAW8L,GAAOzL,OAE3CmF,eAAekqC,EAAcptC,EAAMqQ,GACjC,MAAM0vD,EAAS58D,KAAKipE,WAAWh/B,EAAc/8B,GACvC7G,OAAkB9L,IAATsC,EACX+/D,EAAOr9D,QAAQ1C,IACd,EACL,OAAmB,IAAXwJ,EACJu2D,EAAOhiE,OAAS,EAChByL,EAENtG,YACE,MAAMiV,EAAOhV,KAAK1C,QACZm/D,EAAOz8D,KAAKs9D,YACZE,EAASf,EAAKe,OACd0L,EAAS,GACf,IAAIruE,EAAGivC,EACP,IAAKjvC,EAAI,EAAGivC,EAAO2yB,EAAK1/D,KAAKnC,OAAQC,EAAIivC,IAAQjvC,EAC/CquE,EAAO/nE,KAAKq8D,EAAO2I,iBAAiBnmE,KAAKqjE,UAAUxoE,GAAG2iE,EAAO5sD,MAAO/V,IAEtE,MAAMsuE,EAAen0D,EAAKm0D,aAE1B,MAAO,CACLp1D,IAFUo1D,GAAgB1D,GAAqBhJ,GAG/CyM,OAAAA,EACA/nD,MAAOq8C,EAAO4L,YACd7nD,IAAKi8C,EAAO6L,UACZC,WAAYtpE,KAAKupE,iBACjBjxC,MAAOklC,EACPwL,QAASh0D,EAAKg0D,QACdlqD,MAAOqqD,EAAe,EAAIn0D,EAAKw0D,mBAAqBx0D,EAAKy0D,eAG7D1pE,yBAAyBsG,GACvB,MAAOi3D,aAAaL,OAACA,EAAMuC,SAAEA,GAAWliE,SAAU8b,KAAMswD,EAASC,aAAEA,IAAiB3pE,KAC9E4pE,EAAaF,GAAa,EAC1BrM,EAASr9D,KAAKqjE,UAAUh9D,GACxB2gE,EAAS3J,EAAOuJ,QAChBiD,EAAW9C,GAAWC,GAC5B,IAGIyB,EAAMxjD,EAHNtnB,EAAQ0/D,EAAOJ,EAAOrsD,MACtBuQ,EAAQ,EACRvmB,EAAS4kE,EAAWx/D,KAAKm8D,WAAWc,EAAQI,EAAQmC,GAAY7hE,EAEhE/C,IAAW+C,IACbwjB,EAAQvmB,EAAS+C,EACjB/C,EAAS+C,GAEPksE,IACFlsE,EAAQqpE,EAAON,SACf9rE,EAASosE,EAAOL,OAASK,EAAON,SAClB,IAAV/oE,GAAewuC,GAAKxuC,KAAWwuC,GAAK66B,EAAOL,UAC7CxlD,EAAQ,GAEVA,GAASxjB,GAEX,MAAM6oE,EAAcv9B,GAAcygC,IAAeG,EAAuB1oD,EAAZuoD,EAC5D,IAAItwD,EAAO6jD,EAAOkJ,iBAAiBK,GAcnC,GAZEiC,EADEzoE,KAAK4gD,MAAMkpB,kBAAkBzjE,GACxB42D,EAAOkJ,iBAAiBhlD,EAAQvmB,GAEhCwe,EAET6L,EAAOwjD,EAAOrvD,EACV1e,KAAK6hB,IAAI0I,GAAQ0kD,IACnB1kD,EAhQN,SAAiBA,EAAMg4C,EAAQ2M,GAC7B,OAAa,IAAT3kD,EACKknB,GAAKlnB,IAENg4C,EAAO5gD,eAAiB,GAAK,IAAM4gD,EAAOlpD,KAAO61D,EAAa,GAAK,GA4PhEG,CAAQ9kD,EAAMg4C,EAAQ2M,GAAcD,EACvChsE,IAAUisE,IACZxwD,GAAQ6L,EAAO,GAEjBwjD,EAAOrvD,EAAO6L,GAEZ7L,IAAS6jD,EAAOkJ,iBAAiByD,GAAa,CAChD,MAAMI,EAAW79B,GAAKlnB,GAAQg4C,EAAOgN,qBAAqBL,GAAc,EACxExwD,GAAQ4wD,EACR/kD,GAAQ+kD,EAEV,MAAO,CACL/kD,KAAAA,EACA7L,KAAAA,EACAqvD,KAAAA,EACAI,OAAQJ,EAAOxjD,EAAO,GAG1BllB,yBAAyBsG,EAAO8hE,GAC9B,MAAM7vC,EAAQ6vC,EAAM7vC,MACdh7B,EAAU0C,KAAK1C,QACf4sE,EAAW5sE,EAAQ4sE,SACnBC,EAAkB9gC,GAAe/rC,EAAQ6sE,gBAAiBC,EAAAA,GAChE,IAAIvB,EAAQ5jD,EACZ,GAAIkjD,EAAMa,QAAS,CACjB,MAAMM,EAAaY,EAAWlqE,KAAKupE,eAAeljE,GAAS8hE,EAAMmB,WAC3Dj9B,EAAiC,SAAzB/uC,EAAQ6rE,aA7V5B,SAAmC9iE,EAAO8hE,EAAO7qE,EAASgsE,GACxD,MAAMJ,EAASf,EAAMe,OACflD,EAAOkD,EAAO7iE,GACpB,IAAIyJ,EAAOzJ,EAAQ,EAAI6iE,EAAO7iE,EAAQ,GAAK,KACvCqJ,EAAOrJ,EAAQ6iE,EAAOtuE,OAAS,EAAIsuE,EAAO7iE,EAAQ,GAAK,KAC3D,MAAMgkE,EAAU/sE,EAAQksE,mBACX,OAAT15D,IACFA,EAAOk2D,GAAiB,OAATt2D,EAAgBy4D,EAAM5mD,IAAM4mD,EAAMhnD,MAAQzR,EAAOs2D,IAErD,OAATt2D,IACFA,EAAOs2D,EAAOA,EAAOl2D,GAEvB,MAAMqR,EAAQ6kD,GAAQA,EAAOtrE,KAAKqZ,IAAIjE,EAAMJ,IAAS,EAAI26D,EAEzD,MAAO,CACLC,MAFW5vE,KAAK6hB,IAAI7M,EAAOI,GAAQ,EAAIu6D,EAEzBf,EACdxqD,MAAOxhB,EAAQmsE,cACftoD,MAAAA,GA6UMopD,CAA0BlkE,EAAO8hE,EAAO7qE,EAASgsE,GA9W3D,SAAkCjjE,EAAO8hE,EAAO7qE,EAASgsE,GACvD,MAAMkB,EAAYltE,EAAQ6rE,aAC1B,IAAIlkD,EAAMnG,EAQV,OAPImqB,GAAcuhC,IAChBvlD,EAAOkjD,EAAMp0D,IAAMzW,EAAQksE,mBAC3B1qD,EAAQxhB,EAAQmsE,gBAEhBxkD,EAAOulD,EAAYlB,EACnBxqD,EAAQ,GAEH,CACLwrD,MAAOrlD,EAAOqkD,EACdxqD,MAAAA,EACAqC,MAAOgnD,EAAMe,OAAO7iE,GAAU4e,EAAO,GAkW/BwlD,CAAyBpkE,EAAO8hE,EAAO7qE,EAASgsE,GAC9CoB,EAAa1qE,KAAK2qE,eAAe3qE,KAAKqG,MAAOrG,KAAKs9D,YAAYlB,MAAO8N,EAAW7jE,OAAQ9L,GAC9FsuE,EAASx8B,EAAMlrB,MAASkrB,EAAMi+B,MAAQI,EAAer+B,EAAMi+B,MAAQ,EACnErlD,EAAOvqB,KAAKqZ,IAAIo2D,EAAiB99B,EAAMi+B,MAAQj+B,EAAMvtB,YAErD+pD,EAASvwC,EAAM6tC,iBAAiBnmE,KAAKqjE,UAAUh9D,GAAOiyB,EAAM1nB,MAAOvK,GACnE4e,EAAOvqB,KAAKqZ,IAAIo2D,EAAiBhC,EAAMp0D,IAAMo0D,EAAMrpD,OAErD,MAAO,CACL1F,KAAMyvD,EAAS5jD,EAAO,EACtBwjD,KAAMI,EAAS5jD,EAAO,EACtB4jD,OAAAA,EACA5jD,KAAAA,GAGJllB,OACE,MAAM08D,EAAOz8D,KAAKs9D,YACZL,EAASR,EAAKQ,OACd2N,EAAQnO,EAAK1/D,KACb+sC,EAAO8gC,EAAMhwE,OACnB,IAAIC,EAAI,EACR,KAAOA,EAAIivC,IAAQjvC,EACsB,OAAnCmF,KAAKqjE,UAAUxoE,GAAGoiE,EAAOrsD,OAC3Bg6D,EAAM/vE,GAAGo9D,KAAKj4D,KAAKy+D,OAK3BoJ,GAAcn/D,GAAK,MACnBm/D,GAAc51C,SAAW,CACvBgvC,oBAAoB,EACpBiD,gBAAiB,MACjBsF,mBAAoB,GACpBC,cAAe,GACfT,SAAS,EACTrO,WAAY,CACVJ,QAAS,CACP94D,KAAM,SACN64D,WAAY,CAAC,IAAK,IAAK,OAAQ,QAAS,aAI9CuN,GAAczyD,UAAY,CACxB2sC,OAAQ,CACN8oB,QAAS,CACPppE,KAAM,WACNqM,QAAQ,EACR6T,KAAM,CACJ7T,QAAQ,IAGZg9D,QAAS,CACPrpE,KAAM,SACNspE,aAAa,KAKnB,MAAMC,WAAyBxM,GAC7Bz+D,aACEC,KAAKm/D,qBAAsB,EAC3Bl2D,MAAMq2D,aAERv/D,mBAAmB08D,EAAM1/D,EAAMokB,EAAOi0C,GACpC,MAAMiI,EAASp0D,MAAM64D,mBAAmBrF,EAAM1/D,EAAMokB,EAAOi0C,GAC3D,IAAK,IAAIv6D,EAAI,EAAGA,EAAIwiE,EAAOziE,OAAQC,IACjCwiE,EAAOxiE,GAAG+rE,QAAU5mE,KAAK6jE,0BAA0BhpE,EAAIsmB,GAAOujC,OAEhE,OAAO2Y,EAETt9D,eAAe08D,EAAM1/D,EAAMokB,EAAOi0C,GAChC,MAAMiI,EAASp0D,MAAM24D,eAAenF,EAAM1/D,EAAMokB,EAAOi0C,GACvD,IAAK,IAAIv6D,EAAI,EAAGA,EAAIwiE,EAAOziE,OAAQC,IAAK,CACtC,MAAMk1B,EAAOhzB,EAAKokB,EAAQtmB,GAC1BwiE,EAAOxiE,GAAG+rE,QAAUv9B,GAAetZ,EAAK,GAAI/vB,KAAK6jE,0BAA0BhpE,EAAIsmB,GAAOujC,QAExF,OAAO2Y,EAETt9D,gBAAgB08D,EAAM1/D,EAAMokB,EAAOi0C,GACjC,MAAMiI,EAASp0D,MAAM44D,gBAAgBpF,EAAM1/D,EAAMokB,EAAOi0C,GACxD,IAAK,IAAIv6D,EAAI,EAAGA,EAAIwiE,EAAOziE,OAAQC,IAAK,CACtC,MAAMk1B,EAAOhzB,EAAKokB,EAAQtmB,GAC1BwiE,EAAOxiE,GAAG+rE,QAAUv9B,GAAetZ,GAAQA,EAAKtsB,IAAMssB,EAAKtsB,EAAGzD,KAAK6jE,0BAA0BhpE,EAAIsmB,GAAOujC,QAE1G,OAAO2Y,EAETt9D,iBACE,MAAMhD,EAAOiD,KAAKs9D,YAAYvgE,KAC9B,IAAIpC,EAAM,EACV,IAAK,IAAIE,EAAIkC,EAAKnC,OAAS,EAAGC,GAAK,IAAKA,EACtCF,EAAMD,KAAKC,IAAIA,EAAKoC,EAAKlC,GAAGoqB,KAAKjlB,KAAK6jE,0BAA0BhpE,IAAM,GAExE,OAAOF,EAAM,GAAKA,EAEpBoF,iBAAiBsG,GACf,MAAMo2D,EAAOz8D,KAAKs9D,aACZiD,OAACA,EAAME,OAAEA,GAAUhE,EACnBY,EAASr9D,KAAKqjE,UAAUh9D,GACxBwkB,EAAI01C,EAAO+C,iBAAiBjG,EAAOxyC,GACnCC,EAAI21C,EAAO6C,iBAAiBjG,EAAOvyC,GACnCrnB,EAAI45D,EAAOuJ,QACjB,MAAO,CACLhhD,MAAO62C,EAAK72C,MACZjoB,MAAO,IAAMktB,EAAI,KAAOC,GAAKrnB,EAAI,KAAOA,EAAI,IAAM,KAGtD1D,OAAOyhD,GACL,MAAMtyB,EAASlvB,KAAKs9D,YAAYvgE,KAChCiD,KAAKolE,eAAel2C,EAAQ,EAAGA,EAAOt0B,OAAQ4mD,GAEhDzhD,eAAemvB,EAAQ/N,EAAOi0C,EAAO5T,GACnC,MAAMymB,EAAiB,UAATzmB,GACRgc,OAACA,EAAMP,OAAEA,GAAUj9D,KAAKs9D,YACxB+K,EAAYroE,KAAK6jE,0BAA0B1iD,EAAOqgC,GAClDijB,EAAgBzkE,KAAK4kE,iBAAiByD,GACtCC,EAAiBtoE,KAAKsoE,eAAe9mB,EAAMijB,GAC3ChH,EAAQD,EAAO5sD,KACf8sD,EAAQT,EAAOrsD,KACrB,IAAK,IAAI/V,EAAIsmB,EAAOtmB,EAAIsmB,EAAQi0C,EAAOv6D,IAAK,CAC1C,MAAMs0B,EAAQD,EAAOr0B,GACfwiE,GAAU4K,GAASjoE,KAAKqjE,UAAUxoE,GAClCy/D,EAAa,GACbzK,EAASyK,EAAWmD,GAASwK,EAAQzK,EAAOyN,mBAAmB,IAAOzN,EAAO2I,iBAAiB9I,EAAOI,IACrG3N,EAASwK,EAAWoD,GAASuK,EAAQhL,EAAOiL,eAAiBjL,EAAOkJ,iBAAiB9I,EAAOK,IAClGpD,EAAW/vC,KAAOvF,MAAM6qC,IAAW7qC,MAAM8qC,GACrCwY,IACFhO,EAAWh9D,QAAU0C,KAAK6jE,0BAA0BhpE,EAAGs0B,EAAMqrC,OAAS,SAAWhZ,GAC7EymB,IACF3N,EAAWh9D,QAAQonD,OAAS,IAGhC1kD,KAAK8oE,cAAc35C,EAAOt0B,EAAGy/D,EAAY9Y,GAE3CxhD,KAAKuoE,oBAAoB9D,EAAejjB,EAAM6mB,GAEhDtoE,0BAA0BsG,EAAOm7C,GAC/B,MAAM6b,EAASr9D,KAAKqjE,UAAUh9D,GAC9B,IAAIg6C,EAASp3C,MAAM46D,0BAA0Bx9D,EAAOm7C,GAChDnB,EAAO+a,UACT/a,EAAS1nD,OAAOP,OAAO,GAAIioD,EAAQ,CAAC+a,SAAS,KAE/C,MAAM1W,EAASrE,EAAOqE,OAKtB,MAJa,WAATlD,IACFnB,EAAOqE,OAAS,GAElBrE,EAAOqE,QAAUrb,GAAeg0B,GAAUA,EAAOuJ,QAASliB,GACnDrE,GAGX2qB,GAAiBtiE,GAAK,SACtBsiE,GAAiB/4C,SAAW,CAC1BgvC,oBAAoB,EACpBiD,gBAAiB,QACjBvJ,WAAY,CACVJ,QAAS,CACP94D,KAAM,SACN64D,WAAY,CAAC,IAAK,IAAK,cAAe,aAI5C0Q,GAAiB51D,UAAY,CAC3B2sC,OAAQ,CACNl3B,EAAG,CACDppB,KAAM,UAERqpB,EAAG,CACDrpB,KAAM,WAGVogD,QAAS,CACPqpB,QAAS,CACPvpE,UAAW,CACTwpE,MAAK,IACI,OAgCjB,MAAMC,WAA2B5M,GAC/Bz+D,YAAY6gD,EAAO3W,GACjBhhC,MAAM23C,EAAO3W,GACbjqC,KAAKm/D,qBAAsB,EAC3Bn/D,KAAKqrE,iBAAc9wE,EACnByF,KAAKsrE,iBAAc/wE,EACnByF,KAAKwxD,aAAUj3D,EACfyF,KAAKyxD,aAAUl3D,EAEjBwF,cACAA,MAAMohB,EAAOi0C,GACX,MAAMr4D,EAAOiD,KAAK2/D,aAAa5iE,KACzB0/D,EAAOz8D,KAAKs9D,YAClB,IAAsB,IAAlBt9D,KAAK6+D,SACPpC,EAAK0B,QAAUphE,MACV,CACL,IAKIlC,EAAGivC,EALHyhC,EAAU1wE,IAAOkC,EAAKlC,GAC1B,GAAI6L,GAAS3J,EAAKokB,IAAS,CACzB,MAAM/iB,IAACA,EAAM,SAAW4B,KAAK6+D,SAC7B0M,EAAU1wE,IAAOowC,GAAiBluC,EAAKlC,GAAIuD,GAG7C,IAAKvD,EAAIsmB,EAAO2oB,EAAO3oB,EAAQi0C,EAAOv6D,EAAIivC,IAAQjvC,EAChD4hE,EAAK0B,QAAQtjE,GAAK0wE,EAAO1wE,IAI/BkF,eACE,OAAO+sC,GAAU9sC,KAAK1C,QAAQmnD,SAAW,IAE3C1kD,oBACE,OAAO+sC,GAAU9sC,KAAK1C,QAAQkuE,eAEhCzrE,sBACE,IAAIgU,EAAM23B,GACN/wC,GAAO+wC,GACX,IAAK,IAAI7wC,EAAI,EAAGA,EAAImF,KAAK4gD,MAAM7jD,KAAK2jD,SAAS9lD,SAAUC,EACrD,GAAImF,KAAK4gD,MAAM6qB,iBAAiB5wE,GAAI,CAClC,MAAMsmC,EAAanhC,KAAK4gD,MAAM+f,eAAe9lE,GAAGsmC,WAC1CsjB,EAAWtjB,EAAWuqC,eACtBF,EAAgBrqC,EAAWwqC,oBACjC53D,EAAMrZ,KAAKqZ,IAAIA,EAAK0wC,GACpB9pD,EAAMD,KAAKC,IAAIA,EAAK8pD,EAAW+mB,GAGnC,MAAO,CACL/mB,SAAU1wC,EACVy3D,cAAe7wE,EAAMoZ,GAGzBhU,OAAOyhD,GACL,MAAMZ,EAAQ5gD,KAAK4gD,OACb+iB,UAACA,GAAa/iB,EACd6b,EAAOz8D,KAAKs9D,YACZsO,EAAOnP,EAAK1/D,KACZ8uE,EAAU7rE,KAAK8rE,oBAAsB9rE,KAAK+rE,aAAaH,GAAQ5rE,KAAK1C,QAAQuuE,QAC5EG,EAAUtxE,KAAKC,KAAKD,KAAKqZ,IAAI4vD,EAAUhuD,MAAOguD,EAAU9tD,QAAUg2D,GAAW,EAAG,GAChFI,EAASvxE,KAAKqZ,KD/rDFpW,EC+rDmBqC,KAAK1C,QAAQ2uE,OD/rDzB1iC,EC+rDiCyiC,ED9rD3C,iBAAVruE,GAAsBA,EAAM6rC,SAAS,KAC1C77B,WAAWhQ,GAAS,IAClBA,EAAQ4rC,GC4rD0D,GD/rDnD,IAAC5rC,EAAO4rC,ECgsDzB,MAAM2iC,EAAclsE,KAAKmsE,eAAensE,KAAKqG,QACvCmlE,cAACA,EAAa/mB,SAAEA,GAAYzkD,KAAKosE,uBACjCC,OAACA,EAAMC,OAAEA,EAAM9a,QAAEA,EAAOC,QAAEA,GArFpC,SAA2BhN,EAAU+mB,EAAeS,GAClD,IAAII,EAAS,EACTC,EAAS,EACT9a,EAAU,EACVC,EAAU,EACd,GAAI+Z,EAAgB9/B,GAAK,CACvB,MAAM6gC,EAAa9nB,EACb+nB,EAAWD,EAAaf,EACxBxxD,EAAStf,KAAKuZ,IAAIs4D,GAClBtyD,EAASvf,KAAKi0C,IAAI49B,GAClBE,EAAO/xE,KAAKuZ,IAAIu4D,GAChBE,EAAOhyE,KAAKi0C,IAAI69B,GAChBG,EAAU,CAACl/B,EAAOt0C,EAAGC,IAAM40C,GAAcP,EAAO8+B,EAAYC,GAAU,GAAQ,EAAI9xE,KAAKC,IAAIxB,EAAGA,EAAI8yE,EAAQ7yE,EAAGA,EAAI6yE,GACjHW,EAAU,CAACn/B,EAAOt0C,EAAGC,IAAM40C,GAAcP,EAAO8+B,EAAYC,GAAU,IAAS,EAAI9xE,KAAKqZ,IAAI5a,EAAGA,EAAI8yE,EAAQ7yE,EAAGA,EAAI6yE,GAClHY,EAAOF,EAAQ,EAAG3yD,EAAQyyD,GAC1BK,EAAOH,EAAQ5gC,GAAS9xB,EAAQyyD,GAChCK,EAAOH,EAAQ14D,GAAI8F,EAAQyyD,GAC3BO,EAAOJ,EAAQ14D,GAAK63B,GAAS9xB,EAAQyyD,GAC3CL,GAAUQ,EAAOE,GAAQ,EACzBT,GAAUQ,EAAOE,GAAQ,EACzBxb,IAAYqb,EAAOE,GAAQ,EAC3Btb,IAAYqb,EAAOE,GAAQ,EAE7B,MAAO,CAACX,OAAAA,EAAQC,OAAAA,EAAQ9a,QAAAA,EAASC,QAAAA,GA8DYwb,CAAkBxoB,EAAU+mB,EAAeS,GAChF5kB,GAAYsc,EAAUhuD,MAAQk2D,GAAWQ,EACzCna,GAAayR,EAAU9tD,OAASg2D,GAAWS,EAC3CY,EAAYxyE,KAAKC,IAAID,KAAKqZ,IAAIszC,EAAU6K,GAAa,EAAG,GACxDoZ,EAAchiC,GAAYtpC,KAAK1C,QAAQonD,OAAQwoB,GAE/CC,GAAgB7B,EADF5wE,KAAKC,IAAI2wE,EAAcW,EAAQ,IACAjsE,KAAKotE,gCACxDptE,KAAKwxD,QAAUA,EAAU8Z,EACzBtrE,KAAKyxD,QAAUA,EAAU6Z,EACzB7O,EAAKllC,MAAQv3B,KAAKqtE,iBAClBrtE,KAAKsrE,YAAcA,EAAc6B,EAAentE,KAAKstE,qBAAqBttE,KAAKqG,OAC/ErG,KAAKqrE,YAAc3wE,KAAKC,IAAIqF,KAAKsrE,YAAc6B,EAAejB,EAAa,GAC3ElsE,KAAKolE,eAAewG,EAAM,EAAGA,EAAKhxE,OAAQ4mD,GAE5CzhD,eAAelF,EAAGotE,GAChB,MAAMjzD,EAAOhV,KAAK1C,QACZm/D,EAAOz8D,KAAKs9D,YACZkO,EAAgBxrE,KAAK2rE,oBAC3B,OAAK1D,GAASjzD,EAAKurC,UAAUgtB,gBAAmBvtE,KAAK4gD,MAAMkpB,kBAAkBjvE,IAA0B,OAApB4hE,EAAK0B,QAAQtjE,IAAe4hE,EAAK1/D,KAAKlC,GAAG8nE,OACnH,EAEF3iE,KAAKwtE,uBAAuB/Q,EAAK0B,QAAQtjE,GAAK2wE,EAAgB9/B,IAEvE3rC,eAAe6rE,EAAMzqD,EAAOi0C,EAAO5T,GACjC,MAAMymB,EAAiB,UAATzmB,EACRZ,EAAQ5gD,KAAK4gD,MACb+iB,EAAY/iB,EAAM+iB,UAElB8J,EADO7sB,EAAMtjD,QACQijD,UACrBmtB,GAAW/J,EAAUn1D,KAAOm1D,EAAUle,OAAS,EAC/CkoB,GAAWhK,EAAUp1D,IAAMo1D,EAAUje,QAAU,EAC/CkoB,EAAe3F,GAASwF,EAAcG,aACtCvC,EAAcuC,EAAe,EAAI5tE,KAAKqrE,YACtCC,EAAcsC,EAAe,EAAI5tE,KAAKsrE,YACtCjD,EAAYroE,KAAK6jE,0BAA0B1iD,EAAOqgC,GAClDijB,EAAgBzkE,KAAK4kE,iBAAiByD,GACtCC,EAAiBtoE,KAAKsoE,eAAe9mB,EAAMijB,GACjD,IACI5pE,EADA0xE,EAAavsE,KAAK0rE,eAEtB,IAAK7wE,EAAI,EAAGA,EAAIsmB,IAAStmB,EACvB0xE,GAAcvsE,KAAK6tE,eAAehzE,EAAGotE,GAEvC,IAAKptE,EAAIsmB,EAAOtmB,EAAIsmB,EAAQi0C,IAASv6D,EAAG,CACtC,MAAM2wE,EAAgBxrE,KAAK6tE,eAAehzE,EAAGotE,GACvCnjB,EAAM8mB,EAAK/wE,GACXy/D,EAAa,CACjBzvC,EAAG6iD,EAAU1tE,KAAKwxD,QAClB1mC,EAAG6iD,EAAU3tE,KAAKyxD,QAClB8a,WAAAA,EACAC,SAAUD,EAAaf,EACvBA,cAAAA,EACAF,YAAAA,EACAD,YAAAA,GAEE/C,IACFhO,EAAWh9D,QAAUmnE,GAAiBzkE,KAAK6jE,0BAA0BhpE,EAAGiqD,EAAI0V,OAAS,SAAWhZ,IAElG+qB,GAAcf,EACdxrE,KAAK8oE,cAAchkB,EAAKjqD,EAAGy/D,EAAY9Y,GAEzCxhD,KAAKuoE,oBAAoB9D,EAAejjB,EAAM6mB,GAEhDtoE,iBACE,MAAM08D,EAAOz8D,KAAKs9D,YACZwQ,EAAWrR,EAAK1/D,KACtB,IACIlC,EADA08B,EAAQ,EAEZ,IAAK18B,EAAI,EAAGA,EAAIizE,EAASlzE,OAAQC,IAAK,CACpC,MAAM8C,EAAQ8+D,EAAK0B,QAAQtjE,GACb,OAAV8C,GAAmBqnB,MAAMrnB,KAAUqC,KAAK4gD,MAAMkpB,kBAAkBjvE,IAAOizE,EAASjzE,GAAG8nE,SACrFprC,GAAS78B,KAAK6hB,IAAI5e,IAGtB,OAAO45B,EAETx3B,uBAAuBpC,GACrB,MAAM45B,EAAQv3B,KAAKs9D,YAAY/lC,MAC/B,OAAIA,EAAQ,IAAMvS,MAAMrnB,GACf+tC,IAAOhxC,KAAK6hB,IAAI5e,GAAS45B,GAE3B,EAETx3B,iBAAiBsG,GACf,MAAMo2D,EAAOz8D,KAAKs9D,YACZ1c,EAAQ5gD,KAAK4gD,MACbohB,EAASphB,EAAM7jD,KAAKilE,QAAU,GAC9BrkE,EAAQ+1D,GAAa+I,EAAK0B,QAAQ93D,GAAQu6C,EAAMtjD,QAAQq2D,QAC9D,MAAO,CACL/tC,MAAOo8C,EAAO37D,IAAU,GACxB1I,MAAAA,GAGJoC,kBAAkB6rE,GAChB,IAAIjxE,EAAM,EACV,MAAMimD,EAAQ5gD,KAAK4gD,MACnB,IAAI/lD,EAAGivC,EAAM2yB,EAAMt7B,EAAY7jC,EAC/B,IAAKsuE,EACH,IAAK/wE,EAAI,EAAGivC,EAAO8W,EAAM7jD,KAAK2jD,SAAS9lD,OAAQC,EAAIivC,IAAQjvC,EACzD,GAAI+lD,EAAM6qB,iBAAiB5wE,GAAI,CAC7B4hE,EAAO7b,EAAM+f,eAAe9lE,GAC5B+wE,EAAOnP,EAAK1/D,KACZokC,EAAas7B,EAAKt7B,WAClB,MAIN,IAAKyqC,EACH,OAAO,EAET,IAAK/wE,EAAI,EAAGivC,EAAO8hC,EAAKhxE,OAAQC,EAAIivC,IAAQjvC,EAC1CyC,EAAU6jC,EAAW0iC,0BAA0BhpE,GACnB,UAAxByC,EAAQywE,cACVpzE,EAAMD,KAAKC,IAAIA,EAAK2C,EAAQ8nD,aAAe,EAAG9nD,EAAQ0wE,kBAAoB,IAG9E,OAAOrzE,EAEToF,aAAa6rE,GACX,IAAIjxE,EAAM,EACV,IAAK,IAAIE,EAAI,EAAGivC,EAAO8hC,EAAKhxE,OAAQC,EAAIivC,IAAQjvC,EAAG,CACjD,MAAMyC,EAAU0C,KAAK6jE,0BAA0BhpE,GAC/CF,EAAMD,KAAKC,IAAIA,EAAK2C,EAAQwQ,QAAU,EAAGxQ,EAAQ2wE,aAAe,GAElE,OAAOtzE,EAEToF,qBAAqBkqC,GACnB,IAAIikC,EAAmB,EACvB,IAAK,IAAIrzE,EAAI,EAAGA,EAAIovC,IAAgBpvC,EAC9BmF,KAAK4gD,MAAM6qB,iBAAiB5wE,KAC9BqzE,GAAoBluE,KAAKmsE,eAAetxE,IAG5C,OAAOqzE,EAETnuE,eAAekqC,GACb,OAAOvvC,KAAKC,IAAI0uC,GAAerpC,KAAK4gD,MAAM7jD,KAAK2jD,SAASzW,GAAcmV,OAAQ,GAAI,GAEpFr/C,gCACE,OAAOC,KAAKstE,qBAAqBttE,KAAK4gD,MAAM7jD,KAAK2jD,SAAS9lD,SAAW,GAGzEwwE,GAAmB1iE,GAAK,WACxB0iE,GAAmBn5C,SAAW,CAC5BgvC,oBAAoB,EACpBiD,gBAAiB,MACjB3jB,UAAW,CACTgtB,eAAe,EACfK,cAAc,GAEhBjT,WAAY,CACVJ,QAAS,CACP94D,KAAM,SACN64D,WAAY,CAAC,gBAAiB,WAAY,cAAe,cAAe,aAAc,IAAK,IAAK,SAAU,cAAe,aAG7H2R,OAAQ,MACRxnB,SAAU,EACV+mB,cAAe,IACf9mB,OAAQ,OACRmnB,QAAS,EACTvqB,UAAW,KAEb8pB,GAAmBntE,YAAc,CAC/BwkD,YAAc5lD,GAAkB,YAATA,EACvB8lD,WAAa9lD,GAAkB,YAATA,GAExBuuE,GAAmBh2D,UAAY,CAC7B48C,YAAa,EACbnQ,QAAS,CACPssB,OAAQ,CACNnM,OAAQ,CACNjiE,eAAe6gD,GACb,MAAM7jD,EAAO6jD,EAAM7jD,KACnB,GAAIA,EAAKilE,OAAOpnE,QAAUmC,EAAK2jD,SAAS9lD,OAAQ,CAC9C,MAAOonE,QAAQxd,WAACA,IAAe5D,EAAMutB,OAAO7wE,QAC5C,OAAOP,EAAKilE,OAAOr9D,IAAI,CAACihB,EAAO/qB,KAC7B,MACMwD,EADOuiD,EAAM+f,eAAe,GACfx/B,WAAWgyB,SAASt4D,GACvC,MAAO,CACLiC,KAAM8oB,EACNkhC,UAAWzoD,EAAMmiD,gBACjB0G,YAAa7oD,EAAMoiD,YACnB0G,UAAW9oD,EAAM+mD,YACjBZ,WAAYA,EACZme,QAAS/hB,EAAMkpB,kBAAkBjvE,GACjCwL,MAAOxL,KAIb,MAAO,KAGXkF,QAAQE,EAAGmuE,EAAYD,GACrBA,EAAOvtB,MAAMytB,qBAAqBD,EAAW/nE,OAC7C8nE,EAAOvtB,MAAM79C,WAGjBmoE,QAAS,CACPvpE,UAAW,CACTwpE,MAAK,IACI,GAETprE,MAAMuuE,GACJ,IAAIC,EAAYD,EAAY1oD,MAC5B,MAAMjoB,EAAQ,KAAO2wE,EAAYE,eAOjC,OANI9kE,GAAQ6kE,IACVA,EAAYA,EAAUp0E,QACtBo0E,EAAU,IAAM5wE,GAEhB4wE,GAAa5wE,EAER4wE,OAOjB,MAAME,WAAuBjQ,GAC3Bz+D,aACEC,KAAKm/D,qBAAsB,EAC3Bl2D,MAAMq2D,aAERv/D,OAAOyhD,GACL,MAAMib,EAAOz8D,KAAKs9D,aACXoC,QAAS9Y,EAAM7pD,KAAMmyB,EAAS,GAAEw/C,SAAEA,GAAYjS,EAC/CkS,EAAqB3uE,KAAK4gD,MAAM8jB,oBACtC,IAAIvjD,MAACA,EAAKi0C,MAAEA,GA4FhB,SAAyCqH,EAAMvtC,EAAQy/C,GACrD,MAAMC,EAAa1/C,EAAOt0B,OAC1B,IAAIumB,EAAQ,EACRi0C,EAAQwZ,EACZ,GAAInS,EAAKkF,QAAS,CAChB,MAAMnE,OAACA,EAAMW,QAAEA,GAAW1B,EACpB7rD,EAAO4sD,EAAO5sD,MACdmD,IAACA,EAAGpZ,IAAEA,EAAGqoE,WAAEA,EAAUC,WAAEA,GAAczF,EAAO0F,gBAC9CF,IACF7hD,EAAQotB,GAAY7zC,KAAKqZ,IACvBi2C,GAAamU,EAASX,EAAO5sD,KAAMmD,GAAKg2C,GACxC4kB,EAAqBC,EAAa5kB,GAAa96B,EAAQte,EAAM4sD,EAAO2I,iBAAiBpyD,IAAMg2C,IAC7F,EAAG6kB,EAAa,IAGhBxZ,EADE6N,EACM10B,GAAY7zC,KAAKC,IACvBqvD,GAAamU,EAASX,EAAO5sD,KAAMjW,GAAKmvD,GAAK,EAC7C6kB,EAAqB,EAAI3kB,GAAa96B,EAAQte,EAAM4sD,EAAO2I,iBAAiBxrE,IAAMmvD,GAAK,GACzF3oC,EAAOytD,GAAcztD,EAEbytD,EAAaztD,EAGzB,MAAO,CAACA,MAAAA,EAAOi0C,MAAAA,GAnHQyZ,CAAgCpS,EAAMvtC,EAAQy/C,GACnE3uE,KAAKi/D,WAAa99C,EAClBnhB,KAAKk/D,WAAa9J,EAmHtB,SAA4BqH,GAC1B,MAAM8D,OAACA,EAAME,OAAEA,EAAMqO,aAAEA,GAAgBrS,EACjCsS,EAAY,CAChBC,KAAMzO,EAAOxsD,IACbk7D,KAAM1O,EAAO5lE,IACbu0E,KAAMzO,EAAO1sD,IACbo7D,KAAM1O,EAAO9lE,KAEf,IAAKm0E,EAEH,OADArS,EAAKqS,aAAeC,GACb,EAET,MAAMK,EAAUN,EAAaE,OAASzO,EAAOxsD,KAC1C+6D,EAAaG,OAAS1O,EAAO5lE,KAC7Bm0E,EAAaI,OAASzO,EAAO1sD,KAC7B+6D,EAAaK,OAAS1O,EAAO9lE,IAEhC,OADAhC,OAAOP,OAAO02E,EAAcC,GACrBK,EAnIDC,CAAmB5S,KACrBt7C,EAAQ,EACRi0C,EAAQlmC,EAAOt0B,QAEjBgsD,EAAKyP,OAASr2D,KAAK4gD,MACnBgG,EAAK4P,cAAgBx2D,KAAKqG,MAC1BugD,EAAK0oB,aAAeZ,EAASY,WAC7B1oB,EAAK13B,OAASA,EACd,MAAM5xB,EAAU0C,KAAK4jE,6BAA6BpiB,GAC7CxhD,KAAK1C,QAAQ0kD,WAChB1kD,EAAQ8nD,YAAc,GAExB9nD,EAAQg4D,QAAUt1D,KAAK1C,QAAQg4D,QAC/Bt1D,KAAK8oE,cAAcliB,OAAMrsD,EAAW,CAClCg1E,UAAWZ,EACXrxE,QAAAA,GACCkkD,GACHxhD,KAAKolE,eAAel2C,EAAQ/N,EAAOi0C,EAAO5T,GAE5CzhD,eAAemvB,EAAQ/N,EAAOi0C,EAAO5T,GACnC,MAAMymB,EAAiB,UAATzmB,GACRgc,OAACA,EAAMP,OAAEA,EAAMuC,SAAEA,EAAQkP,SAAEA,GAAY1uE,KAAKs9D,YAC5C+K,EAAYroE,KAAK6jE,0BAA0B1iD,EAAOqgC,GAClDijB,EAAgBzkE,KAAK4kE,iBAAiByD,GACtCC,EAAiBtoE,KAAKsoE,eAAe9mB,EAAMijB,GAC3ChH,EAAQD,EAAO5sD,KACf8sD,EAAQT,EAAOrsD,MACfw/C,SAACA,EAAQkF,QAAEA,GAAWt1D,KAAK1C,QAC3BkyE,EAAe9iC,GAAS0jB,GAAYA,EAAWrrC,OAAO8mB,kBACtD4jC,EAAezvE,KAAK4gD,MAAM8jB,qBAAuBuD,GAAkB,SAATzmB,EAChE,IAAIkuB,EAAavuD,EAAQ,GAAKnhB,KAAKqjE,UAAUliD,EAAQ,GACrD,IAAK,IAAItmB,EAAIsmB,EAAOtmB,EAAIsmB,EAAQi0C,IAASv6D,EAAG,CAC1C,MAAMs0B,EAAQD,EAAOr0B,GACfwiE,EAASr9D,KAAKqjE,UAAUxoE,GACxBy/D,EAAamV,EAAetgD,EAAQ,GACpCwgD,EAAW1mC,GAAco0B,EAAOK,IAChC7N,EAASyK,EAAWmD,GAASD,EAAO2I,iBAAiB9I,EAAOI,GAAQ5iE,GACpEi1D,EAASwK,EAAWoD,GAASuK,GAAS0H,EAAW1S,EAAOiL,eAAiBjL,EAAOkJ,iBAAiB3G,EAAWx/D,KAAKm8D,WAAWc,EAAQI,EAAQmC,GAAYnC,EAAOK,GAAQ7iE,GAC7Ky/D,EAAW/vC,KAAOvF,MAAM6qC,IAAW7qC,MAAM8qC,IAAW6f,EACpDrV,EAAW18B,KAAO/iC,EAAI,GAAMwiE,EAAOI,GAASiS,EAAWjS,GAAU+R,EAC7Dla,IACFgF,EAAW+C,OAASA,EACpB/C,EAAWwJ,IAAM4K,EAAS3xE,KAAKlC,IAE7BytE,IACFhO,EAAWh9D,QAAUmnE,GAAiBzkE,KAAK6jE,0BAA0BhpE,EAAGs0B,EAAMqrC,OAAS,SAAWhZ,IAE/FiuB,GACHzvE,KAAK8oE,cAAc35C,EAAOt0B,EAAGy/D,EAAY9Y,GAE3CkuB,EAAarS,EAEfr9D,KAAKuoE,oBAAoB9D,EAAejjB,EAAM6mB,GAEhDtoE,iBACE,MAAM08D,EAAOz8D,KAAKs9D,YACZoC,EAAUjD,EAAKiD,QACfkQ,EAASlQ,EAAQpiE,SAAWoiE,EAAQpiE,QAAQ8nD,aAAe,EAC3DroD,EAAO0/D,EAAK1/D,MAAQ,GAC1B,IAAKA,EAAKnC,OACR,OAAOg1E,EAET,MAAMvhB,EAAatxD,EAAK,GAAGkoB,KAAKjlB,KAAK6jE,0BAA0B,IACzDgM,EAAY9yE,EAAKA,EAAKnC,OAAS,GAAGqqB,KAAKjlB,KAAK6jE,0BAA0B9mE,EAAKnC,OAAS,IAC1F,OAAOF,KAAKC,IAAIi1E,EAAQvhB,EAAYwhB,GAAa,EAEnD9vE,OACE,MAAM08D,EAAOz8D,KAAKs9D,YAClBb,EAAKiD,QAAQoQ,oBAAoB9vE,KAAK4gD,MAAM+iB,UAAWlH,EAAKe,OAAO5sD,MACnE3H,MAAMgvD,QAGVwW,GAAe/lE,GAAK,OACpB+lE,GAAex8C,SAAW,CACxBgvC,mBAAoB,OACpBiD,gBAAiB,QACjBliB,UAAU,EACVoO,UAAU,GAEZqe,GAAer5D,UAAY,CACzB2sC,OAAQ,CACN8oB,QAAS,CACPppE,KAAM,YAERqpE,QAAS,CACPrpE,KAAM,YAiDZ,MAAMsuE,WAA4BvR,GAChCz+D,YAAY6gD,EAAO3W,GACjBhhC,MAAM23C,EAAO3W,GACbjqC,KAAKqrE,iBAAc9wE,EACnByF,KAAKsrE,iBAAc/wE,EAErBwF,iBAAiBsG,GACf,MAAMo2D,EAAOz8D,KAAKs9D,YACZ1c,EAAQ5gD,KAAK4gD,MACbohB,EAASphB,EAAM7jD,KAAKilE,QAAU,GAC9BrkE,EAAQ+1D,GAAa+I,EAAK0B,QAAQ93D,GAAO5C,EAAGm9C,EAAMtjD,QAAQq2D,QAChE,MAAO,CACL/tC,MAAOo8C,EAAO37D,IAAU,GACxB1I,MAAAA,GAGJoC,OAAOyhD,GACL,MAAMoqB,EAAO5rE,KAAKs9D,YAAYvgE,KAC9BiD,KAAKgwE,gBACLhwE,KAAKolE,eAAewG,EAAM,EAAGA,EAAKhxE,OAAQ4mD,GAE5CzhD,gBACE,MAAM6gD,EAAQ5gD,KAAK4gD,MACb+iB,EAAY/iB,EAAM+iB,UAClB3uD,EAAO4rC,EAAMtjD,QACb2yE,EAAUv1E,KAAKqZ,IAAI4vD,EAAUle,MAAQke,EAAUn1D,KAAMm1D,EAAUje,OAASie,EAAUp1D,KAClF+8D,EAAc5wE,KAAKC,IAAIs1E,EAAU,EAAG,GAEpC9C,GAAgB7B,EADF5wE,KAAKC,IAAIqa,EAAKk7D,iBAAoB5E,EAAc,IAAQt2D,EAAqB,iBAAI,EAAG,IACrD4rC,EAAMuvB,yBACzDnwE,KAAKsrE,YAAcA,EAAe6B,EAAentE,KAAKqG,MACtDrG,KAAKqrE,YAAcrrE,KAAKsrE,YAAc6B,EAExCptE,eAAe6rE,EAAMzqD,EAAOi0C,EAAO5T,GACjC,MAAMymB,EAAiB,UAATzmB,EACRZ,EAAQ5gD,KAAK4gD,MACb8e,EAAU1/D,KAAK2/D,aAEf8N,EADO7sB,EAAMtjD,QACQijD,UACrBjoB,EAAQt4B,KAAKs9D,YAAYoD,OACzBgN,EAAUp1C,EAAM83C,QAChBzC,EAAUr1C,EAAM+3C,QAChBC,EAAoBh4C,EAAMi4C,cAAc,GAAK,GAAMr8D,GACzD,IACIrZ,EADA4yC,EAAQ6iC,EAEZ,MAAME,EAAe,IAAMxwE,KAAKywE,uBAChC,IAAK51E,EAAI,EAAGA,EAAIsmB,IAAStmB,EACvB4yC,GAASztC,KAAK0wE,cAAc71E,EAAG2mD,EAAMgvB,GAEvC,IAAK31E,EAAIsmB,EAAOtmB,EAAIsmB,EAAQi0C,EAAOv6D,IAAK,CACtC,MAAMiqD,EAAM8mB,EAAK/wE,GACjB,IAAI0xE,EAAa9+B,EACb++B,EAAW/+B,EAAQztC,KAAK0wE,cAAc71E,EAAG2mD,EAAMgvB,GAC/ClF,EAAc1qB,EAAMkpB,kBAAkBjvE,GAAKy9B,EAAMq4C,8BAA8BjR,EAAQ3iE,KAAKlC,IAAM,EACtG4yC,EAAQ++B,EACJvE,IACEwF,EAAcG,eAChBtC,EAAc,GAEZmC,EAAcF,gBAChBhB,EAAaC,EAAW8D,IAG5B,MAAMhW,EAAa,CACjBzvC,EAAG6iD,EACH5iD,EAAG6iD,EACHtC,YAAa,EACbC,YAAAA,EACAiB,WAAAA,EACAC,SAAAA,EACAlvE,QAAS0C,KAAK6jE,0BAA0BhpE,EAAGiqD,EAAI0V,OAAS,SAAWhZ,IAErExhD,KAAK8oE,cAAchkB,EAAKjqD,EAAGy/D,EAAY9Y,IAG3CzhD,uBACE,MAAM2/D,EAAU1/D,KAAK2/D,aACflD,EAAOz8D,KAAKs9D,YAClB,IAAIlI,EAAQ,EAMZ,OALAqH,EAAK1/D,KAAKhE,QAAQ,CAAC6D,EAASyJ,MACrB2e,MAAM06C,EAAQ3iE,KAAKsJ,KAAWrG,KAAK4gD,MAAMkpB,kBAAkBzjE,IAC9D+uD,MAGGA,EAETr1D,cAAcsG,EAAOm7C,EAAMgvB,GACzB,OAAOxwE,KAAK4gD,MAAMkpB,kBAAkBzjE,GAChCymC,GAAU9sC,KAAK6jE,0BAA0Bx9D,EAAOm7C,GAAM/T,OAAS+iC,GAC/D,GAGRT,GAAoBrnE,GAAK,YACzBqnE,GAAoB99C,SAAW,CAC7BiyC,gBAAiB,MACjB3jB,UAAW,CACTgtB,eAAe,EACfK,cAAc,GAEhBjT,WAAY,CACVJ,QAAS,CACP94D,KAAM,SACN64D,WAAY,CAAC,IAAK,IAAK,aAAc,WAAY,cAAe,iBAGpEhZ,UAAW,IACXirB,WAAY,GAEdwD,GAAoB36D,UAAY,CAC9B48C,YAAa,EACbnQ,QAAS,CACPssB,OAAQ,CACNnM,OAAQ,CACNjiE,eAAe6gD,GACb,MAAM7jD,EAAO6jD,EAAM7jD,KACnB,GAAIA,EAAKilE,OAAOpnE,QAAUmC,EAAK2jD,SAAS9lD,OAAQ,CAC9C,MAAOonE,QAAQxd,WAACA,IAAe5D,EAAMutB,OAAO7wE,QAC5C,OAAOP,EAAKilE,OAAOr9D,IAAI,CAACihB,EAAO/qB,KAC7B,MACMwD,EADOuiD,EAAM+f,eAAe,GACfx/B,WAAWgyB,SAASt4D,GACvC,MAAO,CACLiC,KAAM8oB,EACNkhC,UAAWzoD,EAAMmiD,gBACjB0G,YAAa7oD,EAAMoiD,YACnB0G,UAAW9oD,EAAM+mD,YACjBZ,WAAYA,EACZme,QAAS/hB,EAAMkpB,kBAAkBjvE,GACjCwL,MAAOxL,KAIb,MAAO,KAGXkF,QAAQE,EAAGmuE,EAAYD,GACrBA,EAAOvtB,MAAMytB,qBAAqBD,EAAW/nE,OAC7C8nE,EAAOvtB,MAAM79C,WAGjBmoE,QAAS,CACPvpE,UAAW,CACTwpE,MAAK,IACI,GAETvlD,MAAMtgB,GACGA,EAAQs7C,MAAM7jD,KAAKilE,OAAO18D,EAAQ4H,WAAa,KAAO5H,EAAQkpE,kBAK7EzsB,OAAQ,CACNt+C,EAAG,CACDhC,KAAM,eACNmvE,WAAY,CACVn3C,SAAS,GAEXsxC,aAAa,EACbppD,KAAM,CACJkvD,UAAU,GAEZC,YAAa,CACXr3C,SAAS,GAEX8yC,WAAY,KAKlB,MAAMwE,WAAsB3F,IAE5B2F,GAAcroE,GAAK,MACnBqoE,GAAc9+C,SAAW,CACvBg6C,OAAQ,EACRxnB,SAAU,EACV+mB,cAAe,IACf9mB,OAAQ,QAGV,MAAMssB,WAAwBxS,GAC5Bz+D,iBAAiBsG,GACf,MAAM42D,EAASj9D,KAAKs9D,YAAYL,OAC1BI,EAASr9D,KAAKqjE,UAAUh9D,GAC9B,MAAO,CACLuf,MAAOq3C,EAAOgF,YAAY57D,GAC1B1I,MAAO,GAAKs/D,EAAOqG,iBAAiBjG,EAAOJ,EAAOrsD,QAGtD7Q,OAAOyhD,GACL,MAAMib,EAAOz8D,KAAKs9D,YACZ1W,EAAO6V,EAAKiD,QACZxwC,EAASutC,EAAK1/D,MAAQ,GACtBilE,EAASvF,EAAKe,OAAOyE,YAE3B,GADArb,EAAK13B,OAASA,EACD,WAATsyB,EAAmB,CACrB,MAAMlkD,EAAU0C,KAAK4jE,6BAA6BpiB,GAC7CxhD,KAAK1C,QAAQ0kD,WAChB1kD,EAAQ8nD,YAAc,GAExB,MAAMkV,EAAa,CACjBb,OAAO,EACPwX,UAAWjP,EAAOpnE,SAAWs0B,EAAOt0B,OACpC0C,QAAAA,GAEF0C,KAAK8oE,cAAcliB,OAAMrsD,EAAW+/D,EAAY9Y,GAElDxhD,KAAKolE,eAAel2C,EAAQ,EAAGA,EAAOt0B,OAAQ4mD,GAEhDzhD,eAAemvB,EAAQ/N,EAAOi0C,EAAO5T,GACnC,MAAMke,EAAU1/D,KAAK2/D,aACfrnC,EAAQt4B,KAAKs9D,YAAYoD,OACzBuH,EAAiB,UAATzmB,EACd,IAAK,IAAI3mD,EAAIsmB,EAAOtmB,EAAIsmB,EAAQi0C,EAAOv6D,IAAK,CAC1C,MAAMs0B,EAAQD,EAAOr0B,GACfyC,EAAU0C,KAAK6jE,0BAA0BhpE,EAAGs0B,EAAMqrC,OAAS,SAAWhZ,GACtE0vB,EAAgB54C,EAAM64C,yBAAyBt2E,EAAG6kE,EAAQ3iE,KAAKlC,IAC/DgwB,EAAIo9C,EAAQ3vC,EAAM83C,QAAUc,EAAcrmD,EAC1CC,EAAIm9C,EAAQ3vC,EAAM+3C,QAAUa,EAAcpmD,EAC1CwvC,EAAa,CACjBzvC,EAAAA,EACAC,EAAAA,EACA2iB,MAAOyjC,EAAczjC,MACrBljB,KAAMvF,MAAM6F,IAAM7F,MAAM8F,GACxBxtB,QAAAA,GAEF0C,KAAK8oE,cAAc35C,EAAOt0B,EAAGy/D,EAAY9Y,KAI/CwvB,GAAgBtoE,GAAK,QACrBsoE,GAAgB/+C,SAAW,CACzBgvC,mBAAoB,OACpBiD,gBAAiB,QACjB5iB,UAAW,IACXU,UAAU,EACVlB,SAAU,CACR8F,KAAM,CACJhhD,KAAM,WAIZorE,GAAgB57D,UAAY,CAC1B48C,YAAa,EACbjQ,OAAQ,CACNt+C,EAAG,CACDhC,KAAM,kBAKZ,MAAM2vE,WAA0B3C,IAEhC2C,GAAkB1oE,GAAK,UACvB0oE,GAAkBn/C,SAAW,CAC3B+vB,UAAU,EACVp8C,MAAM,GAERwrE,GAAkBh8D,UAAY,CAC5BmsC,YAAa,CACXC,KAAM,SAERK,QAAS,CACPqpB,QAAS,CACPvpE,UAAW,CACTwpE,MAAK,IACI,GAETvlD,MAAMmK,GACG,IAAMA,EAAKnK,MAAQ,KAAOmK,EAAKy+C,eAAiB,OAK/DzsB,OAAQ,CACNl3B,EAAG,CACDppB,KAAM,UAERqpB,EAAG,CACDrpB,KAAM,YAKZ,IAAI4vE,GAA2B14E,OAAO4rE,OAAO,CAC7CpmE,UAAW,KACX0pE,cAAeA,GACfmD,iBAAkBA,GAClBI,mBAAoBA,GACpBqD,eAAgBA,GAChBsB,oBAAqBA,GACrBgB,cAAeA,GACfC,gBAAiBA,GACjBI,kBAAmBA,KAGnB,SAASE,KACP,MAAM,IAAIvwE,MAAM,mFAElB,MAAMwwE,GACJxxE,YAAYzC,GACV0C,KAAK1C,QAAUA,GAAW,GAE5ByC,UACE,OAAOuxE,KAETvxE,MAAMpC,EAAOw2D,GACX,OAAOmd,KAETvxE,OAAOyxE,EAAWrd,GAChB,OAAOmd,KAETvxE,IAAIyxE,EAAWC,EAAQC,GACrB,OAAOJ,KAETvxE,KAAK5G,EAAGC,EAAGs4E,GACT,OAAOJ,KAETvxE,QAAQyxE,EAAWE,EAAMC,GACvB,OAAOL,KAETvxE,MAAMyxE,EAAWE,GACf,OAAOJ,MAGXC,GAAYnmB,SAAW,SAASwmB,GAC9Bj5E,OAAOP,OAAOm5E,GAAY3nE,UAAWgoE,IAEvC,IAAIC,GAAW,CACbC,MAAOP,IAGT,SAASpgB,GAAoBlxD,EAAG2gD,GAC9B,MAAI,WAAY3gD,EACP,CACL4qB,EAAG5qB,EAAE4qB,EACLC,EAAG7qB,EAAE6qB,GAGFinD,GAAsB9xE,EAAG2gD,GAelC,SAASoxB,GAAaC,EAASrhE,EAAMjT,EAAO8jD,GAC1C,MAAMtgB,WAACA,EAAUpkC,KAAEA,EAAI4kE,QAAEA,GAAWsQ,EAC9BzU,EAASr8B,EAAWm8B,YAAYE,OACtC,GAAIA,GAAU5sD,IAAS4sD,EAAO5sD,MAAiB,MAATA,GAAgB+wD,GAAW5kE,EAAKnC,OAAQ,CAC5E,MAAMs3E,EAAe1U,EAAO2U,eAAiBloB,GAAgBD,GAC7D,IAAKvI,EACH,OAAOywB,EAAan1E,EAAM6T,EAAMjT,GAC3B,GAAIwjC,EAAW69B,eAAgB,CACpC,MAAMv1D,EAAK1M,EAAK,GACVsvC,EAA+B,mBAAhB5iC,EAAG2oE,UAA2B3oE,EAAG2oE,SAASxhE,GAC/D,GAAIy7B,EAAO,CACT,MAAMlrB,EAAQ+wD,EAAan1E,EAAM6T,EAAMjT,EAAQ0uC,GACzC9qB,EAAM2wD,EAAan1E,EAAM6T,EAAMjT,EAAQ0uC,GAC7C,MAAO,CAAC0d,GAAI5oC,EAAM4oC,GAAID,GAAIvoC,EAAIuoC,MAIpC,MAAO,CAACC,GAAI,EAAGD,GAAI/sD,EAAKnC,OAAS,GAEnC,SAASy3E,GAAuBzxB,EAAOhwC,EAAM0mB,EAAUj6B,EAASokD,GAC9D,MAAMwa,EAAWrb,EAAM0xB,+BACjB30E,EAAQ25B,EAAS1mB,GACvB,IAAK,IAAI/V,EAAI,EAAGivC,EAAOmyB,EAASrhE,OAAQC,EAAIivC,IAAQjvC,EAAG,CACrD,MAAMwL,MAACA,EAAKtJ,KAAEA,GAAQk/D,EAASphE,IACzBkvD,GAACA,EAAED,GAAEA,GAAMkoB,GAAa/V,EAASphE,GAAI+V,EAAMjT,EAAO8jD,GACxD,IAAK,IAAIj1C,EAAIu9C,EAAIv9C,GAAKs9C,IAAMt9C,EAAG,CAC7B,MAAM5P,EAAUG,EAAKyP,GAChB5P,EAAQ2tB,MACXltB,EAAQT,EAASyJ,EAAOmG,KAchC,SAAS+lE,GAAkB3xB,EAAOtpB,EAAU1mB,EAAM4hE,GAChD,MAAMxpE,EAAQ,GACd,IAAKs8C,GAAehuB,EAAUspB,EAAM+iB,UAAW/iB,EAAM6xB,aACnD,OAAOzpE,EAQT,OADAqpE,GAAuBzxB,EAAOhwC,EAAM0mB,GALb,SAAS16B,EAASqtC,EAAc5jC,GACjDzJ,EAAQ81E,QAAQp7C,EAASzM,EAAGyM,EAASxM,EAAG0nD,IAC1CxpE,EAAM7H,KAAK,CAACvE,QAAAA,EAASqtC,aAAAA,EAAc5jC,MAAAA,OAGuB,GACvD2C,EAcT,SAAS2pE,GAAyB/xB,EAAOtpB,EAAU1mB,EAAM6wC,EAAW+wB,GAClE,IAAIxpE,EAAQ,GACZ,MAAM4pE,EApCR,SAAkChiE,GAChC,MAAMiiE,GAA8B,IAAvBjiE,EAAKrR,QAAQ,KACpBuzE,GAA8B,IAAvBliE,EAAKrR,QAAQ,KAC1B,OAAO,SAASquC,EAAKC,GACnB,MAAMklC,EAASF,EAAOn4E,KAAK6hB,IAAIqxB,EAAI/iB,EAAIgjB,EAAIhjB,GAAK,EAC1CmoD,EAASF,EAAOp4E,KAAK6hB,IAAIqxB,EAAI9iB,EAAI+iB,EAAI/iB,GAAK,EAChD,OAAOpwB,KAAKyhB,KAAKzhB,KAAK8sC,IAAIurC,EAAQ,GAAKr4E,KAAK8sC,IAAIwrC,EAAQ,KA8BnCC,CAAyBriE,GAChD,IAAIsiE,EAAcnuD,OAAO8mB,kBAoBzB,OADAwmC,GAAuBzxB,EAAOhwC,EAAM0mB,GAlBpC,SAAwB16B,EAASqtC,EAAc5jC,GAC7C,MAAMqsE,EAAU91E,EAAQ81E,QAAQp7C,EAASzM,EAAGyM,EAASxM,EAAG0nD,GACxD,GAAI/wB,IAAcixB,EAChB,OAEF,MAAM7J,EAASjsE,EAAQu2E,eAAeX,GAEtC,IADoBltB,GAAeujB,EAAQjoB,EAAM+iB,UAAW/iB,EAAM6xB,eAC7CC,EACnB,OAEF,MAAMhlC,EAAWklC,EAAet7C,EAAUuxC,GACtCn7B,EAAWwlC,GACblqE,EAAQ,CAAC,CAACpM,QAAAA,EAASqtC,aAAAA,EAAc5jC,MAAAA,IACjC6sE,EAAcxlC,GACLA,IAAawlC,GACtBlqE,EAAM7H,KAAK,CAACvE,QAAAA,EAASqtC,aAAAA,EAAc5jC,MAAAA,OAIhC2C,EAET,SAASoqE,GAAgBxyB,EAAOtpB,EAAU1mB,EAAM6wC,EAAW+wB,GACzD,OAAKltB,GAAehuB,EAAUspB,EAAM+iB,UAAW/iB,EAAM6xB,aAGrC,MAAT7hE,GAAiB6wC,EAEpBkxB,GAAyB/xB,EAAOtpB,EAAU1mB,EAAM6wC,EAAW+wB,GA3CjE,SAA+B5xB,EAAOtpB,EAAU1mB,EAAM4hE,GACpD,IAAIxpE,EAAQ,GASZ,OADAqpE,GAAuBzxB,EAAOhwC,EAAM0mB,GAPpC,SAAwB16B,EAASqtC,EAAc5jC,GAC7C,MAAMkmE,WAACA,EAAUC,SAAEA,GAAY5vE,EAAQy2E,SAAS,CAAC,aAAc,YAAab,IACtE/kC,MAACA,GAASN,GAAkBvwC,EAAS,CAACiuB,EAAGyM,EAASzM,EAAGC,EAAGwM,EAASxM,IACnEkjB,GAAcP,EAAO8+B,EAAYC,IACnCxjE,EAAM7H,KAAK,CAACvE,QAAAA,EAASqtC,aAAAA,EAAc5jC,MAAAA,OAIhC2C,EAgCHsqE,CAAsB1yB,EAAOtpB,EAAU1mB,EAAM4hE,GAHxC,GAMX,SAASe,GAAa3yB,EAAO3gD,EAAG3C,EAASk1E,GACvC,MAAMl7C,EAAW65B,GAAoBlxD,EAAG2gD,GAClC53C,EAAQ,GACR4H,EAAOtT,EAAQsT,KACf4iE,EAAuB,MAAT5iE,EAAe,WAAa,WAChD,IAAI6iE,GAAiB,EASrB,OA/HF,SAAiC7yB,EAAOvjD,GACtC,MAAM4+D,EAAWrb,EAAM0xB,+BACvB,IAAIjsE,EAAOtJ,EAAMH,EACjB,IAAK,IAAI/B,EAAI,EAAGivC,EAAOmyB,EAASrhE,OAAQC,EAAIivC,IAAQjvC,EAAG,GACnDwL,MAAAA,EAAOtJ,KAAAA,GAAQk/D,EAASphE,IAC1B,IAAK,IAAI2R,EAAI,EAAG+2C,EAAOxmD,EAAKnC,OAAQ4R,EAAI+2C,IAAQ/2C,EAC9C5P,EAAUG,EAAKyP,GACV5P,EAAQ2tB,MACXltB,EAAQT,EAASyJ,EAAOmG,IA+G9BknE,CAAwB9yB,EAAO,CAAChkD,EAASqtC,EAAc5jC,KACjDzJ,EAAQ42E,GAAal8C,EAAS1mB,GAAO4hE,IACvCxpE,EAAM7H,KAAK,CAACvE,QAAAA,EAASqtC,aAAAA,EAAc5jC,MAAAA,IAEjCzJ,EAAQ81E,QAAQp7C,EAASzM,EAAGyM,EAASxM,EAAG0nD,KAC1CiB,GAAiB,KAGjBn2E,EAAQmkD,YAAcgyB,EACjB,GAEFzqE,EAET,IAAI2qE,GAAc,CAChBC,MAAO,CACL7zE,MAAM6gD,EAAO3gD,EAAG3C,EAASk1E,GACvB,MAAMl7C,EAAW65B,GAAoBlxD,EAAG2gD,GAClChwC,EAAOtT,EAAQsT,MAAQ,IACvB5H,EAAQ1L,EAAQmkD,UAClB8wB,GAAkB3xB,EAAOtpB,EAAU1mB,EAAM4hE,GACzCY,GAAgBxyB,EAAOtpB,EAAU1mB,GAAM,EAAO4hE,GAC5C1xB,EAAW,GACjB,OAAK93C,EAAMpO,QAGXgmD,EAAM0xB,+BAA+Bv5E,QAAS0jE,IAC5C,MAAMp2D,EAAQ2C,EAAM,GAAG3C,MACjBzJ,EAAU6/D,EAAK1/D,KAAKsJ,GACtBzJ,IAAYA,EAAQ2tB,MACtBu2B,EAAS3/C,KAAK,CAACvE,QAAAA,EAASqtC,aAAcwyB,EAAKp2D,MAAOA,MAAAA,MAG/Cy6C,GATE,IAWX/gD,QAAQ6gD,EAAO3gD,EAAG3C,EAASk1E,GACzB,MAAMl7C,EAAW65B,GAAoBlxD,EAAG2gD,GAClChwC,EAAOtT,EAAQsT,MAAQ,KAC7B,IAAI5H,EAAQ1L,EAAQmkD,UAChB8wB,GAAkB3xB,EAAOtpB,EAAU1mB,EAAM4hE,GAC3CY,GAAgBxyB,EAAOtpB,EAAU1mB,GAAM,EAAO4hE,GAChD,GAAIxpE,EAAMpO,OAAS,EAAG,CACpB,MAAMqvC,EAAejhC,EAAM,GAAGihC,aACxBltC,EAAO6jD,EAAM+f,eAAe12B,GAAcltC,KAChDiM,EAAQ,GACR,IAAK,IAAInO,EAAI,EAAGA,EAAIkC,EAAKnC,SAAUC,EACjCmO,EAAM7H,KAAK,CAACvE,QAASG,EAAKlC,GAAIovC,aAAAA,EAAc5jC,MAAOxL,IAGvD,OAAOmO,GAETmmB,MAAK,CAACyxB,EAAO3gD,EAAG3C,EAASk1E,IAGhBD,GAAkB3xB,EAFRuQ,GAAoBlxD,EAAG2gD,GAC3BtjD,EAAQsT,MAAQ,KACmB4hE,GAElDqB,QAAO,CAACjzB,EAAO3gD,EAAG3C,EAASk1E,IAGlBY,GAAgBxyB,EAFNuQ,GAAoBlxD,EAAG2gD,GAC3BtjD,EAAQsT,MAAQ,KACiBtT,EAAQmkD,UAAW+wB,GAEnE3nD,EAAC,CAAC+1B,EAAO3gD,EAAG3C,EAASk1E,IACZe,GAAa3yB,EAAO3gD,EAAG,CAAC2Q,KAAM,IAAK6wC,UAAWnkD,EAAQmkD,WAAY+wB,GAE3E1nD,EAAC,CAAC81B,EAAO3gD,EAAG3C,EAASk1E,IACZe,GAAa3yB,EAAO3gD,EAAG,CAAC2Q,KAAM,IAAK6wC,UAAWnkD,EAAQmkD,WAAY+wB,KAK/E,MAAMsB,GAAmB,CAAC,OAAQ,MAAO,QAAS,UAClD,SAASC,GAAiBlnC,EAAOvV,GAC/B,OAAOuV,EAAMjoC,OAAO4jB,GAAKA,EAAE0iB,MAAQ5T,GAErC,SAAS08C,GAA4BnnC,EAAOj8B,GAC1C,OAAOi8B,EAAMjoC,OAAO4jB,IAA0C,IAArCsrD,GAAiBv0E,QAAQipB,EAAE0iB,MAAe1iB,EAAEza,IAAI6C,OAASA,GAEpF,SAASqjE,GAAapnC,EAAOnD,GAC3B,OAAOmD,EAAMvd,KAAK,CAACn2B,EAAGC,KACpB,MAAM2wC,EAAKL,EAAUtwC,EAAID,EACnB6wC,EAAKN,EAAUvwC,EAAIC,EACzB,OAAO2wC,EAAGqV,SAAWpV,EAAGoV,OACtBrV,EAAG1jC,MAAQ2jC,EAAG3jC,MACd0jC,EAAGqV,OAASpV,EAAGoV,SAkCrB,SAAS80B,GAAcC,EAAShhE,GAC9B,MAAMypD,EAdR,SAAqBuX,GACnB,MAAMvX,EAAS,GACf,IAAK,MAAMwX,KAAQD,EAAS,CAC1B,MAAM/X,MAACA,EAAKlxB,IAAEA,EAAGmpC,YAAEA,GAAeD,EAClC,IAAKhY,IAAU0X,GAAiB5yC,SAASgK,GACvC,SAEF,MAAMwhB,EAASkQ,EAAOR,KAAWQ,EAAOR,GAAS,CAAChH,MAAO,EAAGkf,OAAQ,EAAGl1B,OAAQ,EAAGn6B,KAAM,IACxFynC,EAAO0I,QACP1I,EAAOtN,QAAUi1B,EAEnB,OAAOzX,EAGQ2X,CAAYJ,IACrBK,aAACA,EAAYC,cAAEA,GAAiBthE,EACtC,IAAItY,EAAGivC,EAAM4qC,EACb,IAAK75E,EAAI,EAAGivC,EAAOqqC,EAAQv5E,OAAQC,EAAIivC,IAAQjvC,EAAG,CAChD65E,EAASP,EAAQt5E,GACjB,MAAM85E,SAACA,GAAYD,EAAO3mE,IACpBquD,EAAQQ,EAAO8X,EAAOtY,OACtBrD,EAASqD,GAASsY,EAAOL,YAAcjY,EAAMhd,OAC/Cs1B,EAAOtN,YACTsN,EAAO/+D,MAAQojD,EAASA,EAASyb,EAAeG,GAAYxhE,EAAOyhE,eACnEF,EAAO7+D,OAAS4+D,IAEhBC,EAAO/+D,MAAQ6+D,EACfE,EAAO7+D,OAASkjD,EAASA,EAAS0b,EAAgBE,GAAYxhE,EAAO0hE,iBAGzE,OAAOjY,EAoBT,SAASkY,GAAeC,EAAYpR,EAAWxqE,EAAGC,GAChD,OAAOsB,KAAKC,IAAIo6E,EAAW57E,GAAIwqE,EAAUxqE,IAAMuB,KAAKC,IAAIo6E,EAAW37E,GAAIuqE,EAAUvqE,IAEnF,SAAS47E,GAAiBD,EAAYE,GACpCF,EAAWxmE,IAAM7T,KAAKC,IAAIo6E,EAAWxmE,IAAK0mE,EAAW1mE,KACrDwmE,EAAWvmE,KAAO9T,KAAKC,IAAIo6E,EAAWvmE,KAAMymE,EAAWzmE,MACvDumE,EAAWrvB,OAAShrD,KAAKC,IAAIo6E,EAAWrvB,OAAQuvB,EAAWvvB,QAC3DqvB,EAAWtvB,MAAQ/qD,KAAKC,IAAIo6E,EAAWtvB,MAAOwvB,EAAWxvB,OAE3D,SAASyvB,GAAWvR,EAAWxwD,EAAQuhE,EAAQ9X,GAC7C,MAAM1xB,IAACA,EAAGn9B,IAAEA,GAAO2mE,EACbK,EAAapR,EAAUoR,WAC7B,IAAKruE,GAASwkC,GAAM,CACdwpC,EAAOzvD,OACT0+C,EAAUz4B,IAAQwpC,EAAOzvD,MAE3B,MAAMm3C,EAAQQ,EAAO8X,EAAOtY,QAAU,CAACn3C,KAAM,EAAGmwC,MAAO,GACvDgH,EAAMn3C,KAAOvqB,KAAKC,IAAIyhE,EAAMn3C,KAAMyvD,EAAOtN,WAAar5D,EAAI8H,OAAS9H,EAAI4H,OACvE++D,EAAOzvD,KAAOm3C,EAAMn3C,KAAOm3C,EAAMhH,MACjCuO,EAAUz4B,IAAQwpC,EAAOzvD,KAEvBlX,EAAIonE,YACNH,GAAiBD,EAAYhnE,EAAIonE,cAEnC,MAAMj2C,EAAWxkC,KAAKC,IAAI,EAAGwY,EAAO5F,WAAaunE,GAAeC,EAAYpR,EAAW,OAAQ,UACzF/6C,EAAYluB,KAAKC,IAAI,EAAGwY,EAAOvF,YAAcknE,GAAeC,EAAYpR,EAAW,MAAO,WAC1FyR,EAAel2C,IAAaykC,EAAUjxB,EACtC2iC,EAAgBzsD,IAAc+6C,EAAUvjE,EAG9C,OAFAujE,EAAUjxB,EAAIxT,EACdykC,EAAUvjE,EAAIwoB,EACP8rD,EAAOtN,WACV,CAACkO,KAAMF,EAAcG,MAAOF,GAC5B,CAACC,KAAMD,EAAeE,MAAOH,GAcnC,SAASI,GAAWpO,EAAYzD,GAC9B,MAAMoR,EAAapR,EAAUoR,WAC7B,SAASU,EAAmBlxC,GAC1B,MAAMihB,EAAS,CAACh3C,KAAM,EAAGD,IAAK,EAAGk3C,MAAO,EAAGC,OAAQ,GAInD,OAHAnhB,EAAUxrC,QAASmyC,IACjBsa,EAAOta,GAAOxwC,KAAKC,IAAIgpE,EAAUz4B,GAAM6pC,EAAW7pC,MAE7Csa,EAET,OACIiwB,EADGrO,EACgB,CAAC,OAAQ,SACT,CAAC,MAAO,WAEjC,SAASsO,GAASC,EAAOhS,EAAWxwD,EAAQypD,GAC1C,MAAMgZ,EAAa,GACnB,IAAI/6E,EAAGivC,EAAM4qC,EAAQ3mE,EAAK8nE,EAAOzG,EACjC,IAAKv0E,EAAI,EAAGivC,EAAO6rC,EAAM/6E,OAAQi7E,EAAQ,EAAGh7E,EAAIivC,IAAQjvC,EAAG,CACzD65E,EAASiB,EAAM96E,GACfkT,EAAM2mE,EAAO3mE,IACbA,EAAIhL,OACF2xE,EAAO/+D,OAASguD,EAAUjxB,EAC1BgiC,EAAO7+D,QAAU8tD,EAAUvjE,EAC3Bo1E,GAAWd,EAAOtN,WAAYzD,IAEhC,MAAM2R,KAACA,EAAIC,MAAEA,GAASL,GAAWvR,EAAWxwD,EAAQuhE,EAAQ9X,GAC5DiZ,GAASP,GAAQM,EAAWh7E,OAC5Bw0E,EAAUA,GAAWmG,EAChBxnE,EAAI4mE,UACPiB,EAAWz0E,KAAKuzE,GAGpB,OAAOmB,GAASH,GAASE,EAAYjS,EAAWxwD,EAAQypD,IAAWwS,EAErE,SAAS0G,GAAW/nE,EAAKS,EAAMD,EAAKoH,EAAOE,GACzC9H,EAAIQ,IAAMA,EACVR,EAAIS,KAAOA,EACXT,EAAI03C,MAAQj3C,EAAOmH,EACnB5H,EAAI23C,OAASn3C,EAAMsH,EACnB9H,EAAI4H,MAAQA,EACZ5H,EAAI8H,OAASA,EAEf,SAASkgE,GAAWJ,EAAOhS,EAAWxwD,EAAQypD,GAC5C,MAAMoZ,EAAc7iE,EAAO8iE,QAC3B,IAAIprD,EAACA,EAACC,EAAEA,GAAK64C,EACb,IAAK,MAAM+Q,KAAUiB,EAAO,CAC1B,MAAM5nE,EAAM2mE,EAAO3mE,IACbquD,EAAQQ,EAAO8X,EAAOtY,QAAU,CAAChH,MAAO,EAAGkf,OAAQ,EAAGl1B,OAAQ,GAC9DA,EAAUs1B,EAAOL,YAAcjY,EAAMhd,QAAW,EACtD,GAAIs1B,EAAOtN,WAAY,CACrB,MAAMzxD,EAAQguD,EAAUjxB,EAAI0M,EACtBvpC,EAASumD,EAAMn3C,MAAQlX,EAAI8H,OAC7B01B,GAAQ6wB,EAAMj7C,SAChB2J,EAAIsxC,EAAMj7C,OAERpT,EAAI4mE,SACNmB,GAAW/nE,EAAKioE,EAAYxnE,KAAMsc,EAAG3X,EAAO5F,WAAayoE,EAAYvwB,MAAQuwB,EAAYxnE,KAAMqH,GAE/FigE,GAAW/nE,EAAK41D,EAAUn1D,KAAO4tD,EAAMkY,OAAQxpD,EAAGnV,EAAOE,GAE3DumD,EAAMj7C,MAAQ2J,EACdsxC,EAAMkY,QAAU3+D,EAChBmV,EAAI/c,EAAI23C,WACH,CACL,MAAM7vC,EAAS8tD,EAAUvjE,EAAIg/C,EACvBzpC,EAAQymD,EAAMn3C,MAAQlX,EAAI4H,MAC5B41B,GAAQ6wB,EAAMj7C,SAChB0J,EAAIuxC,EAAMj7C,OAERpT,EAAI4mE,SACNmB,GAAW/nE,EAAK8c,EAAGmrD,EAAYznE,IAAKoH,EAAOxC,EAAOvF,YAAcooE,EAAYtwB,OAASswB,EAAYznE,KAEjGunE,GAAW/nE,EAAK8c,EAAG84C,EAAUp1D,IAAM6tD,EAAMkY,OAAQ3+D,EAAOE,GAE1DumD,EAAMj7C,MAAQ0J,EACduxC,EAAMkY,QAAUz+D,EAChBgV,EAAI9c,EAAI03C,OAGZke,EAAU94C,EAAIA,EACd84C,EAAU74C,EAAIA,KAEPvsB,IAAI,SAAU,CACrB23E,aAAa,EACbD,QAAS,CACP1nE,IAAK,EACLk3C,MAAO,EACPC,OAAQ,EACRl3C,KAAM,KAGV,IAAI2lE,GAAU,CACZp0E,OAAO6gD,EAAO7wB,GACP6wB,EAAM+0B,QACT/0B,EAAM+0B,MAAQ,IAEhB5lD,EAAK4kD,SAAW5kD,EAAK4kD,WAAY,EACjC5kD,EAAKuH,SAAWvH,EAAKuH,UAAY,MACjCvH,EAAKqvB,OAASrvB,EAAKqvB,QAAU,EAC7BrvB,EAAKomD,QAAUpmD,EAAKomD,SAAW,WAC7B,MAAO,CAAC,CACNjvC,EAAG,EACHnnC,KAAK4jE,GACH5zC,EAAKkoC,KAAK0L,OAIhB/iB,EAAM+0B,MAAMx0E,KAAK4uB,IAEnBhwB,UAAU6gD,EAAOw1B,GACf,MAAM/vE,EAAQu6C,EAAM+0B,MAAQ/0B,EAAM+0B,MAAMp2E,QAAQ62E,IAAe,GAChD,IAAX/vE,GACFu6C,EAAM+0B,MAAMrvE,OAAOD,EAAO,IAG9BtG,UAAU6gD,EAAO7wB,EAAMzyB,GACrByyB,EAAK4kD,SAAWr3E,EAAQq3E,SACxB5kD,EAAKuH,SAAWh6B,EAAQg6B,SACxBvH,EAAKqvB,OAAS9hD,EAAQ8hD,QAExBr/C,OAAO6gD,EAAOjrC,EAAOE,EAAQwgE,GAC3B,IAAKz1B,EACH,OAEF,MAAMq1B,EAAUltB,GAAUnI,EAAMtjD,QAAQo3E,OAAOuB,SACzCrB,EAAiBl6E,KAAKC,IAAIgb,EAAQsgE,EAAQtgE,MAAO,GACjDk/D,EAAkBn6E,KAAKC,IAAIkb,EAASogE,EAAQpgE,OAAQ,GACpD8/D,EA9LV,SAA0BA,GACxB,MAAMW,EAnDR,SAAmBX,GACjB,MAAMW,EAAc,GACpB,IAAIz7E,EAAGivC,EAAM/7B,EAAKm9B,EAAKkxB,EAAOiY,EAC9B,IAAKx5E,EAAI,EAAGivC,GAAQ6rC,GAAS,IAAI/6E,OAAQC,EAAIivC,IAAQjvC,EACnDkT,EAAM4nE,EAAM96E,KACVy8B,SAAU4T,EAAK5tC,SAAU8+D,MAAAA,EAAOiY,YAAAA,EAAc,IAAMtmE,GACtDuoE,EAAYn1E,KAAK,CACfkF,MAAOxL,EACPkT,IAAAA,EACAm9B,IAAAA,EACAk8B,WAAYr5D,EAAIsO,eAChB+iC,OAAQrxC,EAAIqxC,OACZgd,MAAOA,GAAUlxB,EAAMkxB,EACvBiY,YAAAA,IAGJ,OAAOiC,EAmCaC,CAAUZ,GACxBhB,EAAWV,GAAaqC,EAAY1xE,OAAOwvE,GAAQA,EAAKrmE,IAAI4mE,WAAW,GACvEnmE,EAAOylE,GAAaF,GAAiBuC,EAAa,SAAS,GAC3D7wB,EAAQwuB,GAAaF,GAAiBuC,EAAa,UACnD/nE,EAAM0lE,GAAaF,GAAiBuC,EAAa,QAAQ,GACzD5wB,EAASuuB,GAAaF,GAAiBuC,EAAa,WACpDE,EAAmBxC,GAA4BsC,EAAa,KAC5DG,EAAiBzC,GAA4BsC,EAAa,KAChE,MAAO,CACL3B,SAAAA,EACA+B,WAAYloE,EAAKq3D,OAAOt3D,GACxBooE,eAAgBlxB,EAAMogB,OAAO4Q,GAAgB5Q,OAAOngB,GAAQmgB,OAAO2Q,GACnE7S,UAAWoQ,GAAiBuC,EAAa,aACzCM,SAAUpoE,EAAKq3D,OAAOpgB,GAAOogB,OAAO4Q,GACpCrP,WAAY74D,EAAIs3D,OAAOngB,GAAQmgB,OAAO2Q,IA+KxBK,CAAiBj2B,EAAM+0B,OAC/BmB,EAAgBnB,EAAMiB,SACtBG,EAAkBpB,EAAMvO,WAC9Bz4D,GAAKiyC,EAAM+0B,MAAO5nE,IACgB,mBAArBA,EAAIipE,cACbjpE,EAAIipE,iBAGR,MAAMC,EAA0BH,EAAcre,OAAO,CAAClhC,EAAO68C,IAC3DA,EAAKrmE,IAAIzQ,UAAwC,IAA7B82E,EAAKrmE,IAAIzQ,QAAQm8B,QAAoBlC,EAAQA,EAAQ,EAAG,IAAM,EAC9EpkB,EAASxa,OAAO4rE,OAAO,CAC3Bh3D,WAAYoI,EACZ/H,YAAaiI,EACbogE,QAAAA,EACArB,eAAAA,EACAC,gBAAAA,EACAL,aAAcI,EAAiB,EAAIqC,EACnCxC,cAAeI,EAAkB,IAE7BE,EAAap8E,OAAOP,OAAO,GAAI69E,GACrCjB,GAAiBD,EAAYhsB,GAAUstB,IACvC,MAAM1S,EAAYhrE,OAAOP,OAAO,CAC9B28E,WAAAA,EACAriC,EAAGkiC,EACHx0E,EAAGy0E,EACHhqD,EAAGorD,EAAQznE,KACXsc,EAAGmrD,EAAQ1nE,KACV0nE,GACGrZ,EAASsX,GAAc4C,EAAcjR,OAAOkR,GAAkB5jE,GACpEuiE,GAASC,EAAMhB,SAAUhR,EAAWxwD,EAAQypD,GAC5C8Y,GAASoB,EAAenT,EAAWxwD,EAAQypD,GACvC8Y,GAASqB,EAAiBpT,EAAWxwD,EAAQypD,IAC/C8Y,GAASoB,EAAenT,EAAWxwD,EAAQypD,GA1KjD,SAA0B+G,GACxB,MAAMoR,EAAapR,EAAUoR,WAC7B,SAASmC,EAAUhsC,GACjB,MAAMisC,EAASz8E,KAAKC,IAAIo6E,EAAW7pC,GAAOy4B,EAAUz4B,GAAM,GAE1D,OADAy4B,EAAUz4B,IAAQisC,EACXA,EAETxT,EAAU74C,GAAKosD,EAAU,OACzBvT,EAAU94C,GAAKqsD,EAAU,QACzBA,EAAU,SACVA,EAAU,UAkKRE,CAAiBzT,GACjBoS,GAAWJ,EAAMe,WAAY/S,EAAWxwD,EAAQypD,GAChD+G,EAAU94C,GAAK84C,EAAUjxB,EACzBixB,EAAU74C,GAAK64C,EAAUvjE,EACzB21E,GAAWJ,EAAMgB,eAAgBhT,EAAWxwD,EAAQypD,GACpDhc,EAAM+iB,UAAY,CAChBn1D,KAAMm1D,EAAUn1D,KAChBD,IAAKo1D,EAAUp1D,IACfk3C,MAAOke,EAAUn1D,KAAOm1D,EAAUjxB,EAClCgT,OAAQie,EAAUp1D,IAAMo1D,EAAUvjE,EAClCyV,OAAQ8tD,EAAUvjE,EAClBuV,MAAOguD,EAAUjxB,GAEnB/jC,GAAKgnE,EAAMhS,UAAY+Q,IACrB,MAAM3mE,EAAM2mE,EAAO3mE,IACnBpV,OAAOP,OAAO2V,EAAK6yC,EAAM+iB,WACzB51D,EAAIhL,OAAO4gE,EAAUjxB,EAAGixB,EAAUvjE,EAAG,CAACoO,KAAM,EAAGD,IAAK,EAAGk3C,MAAO,EAAGC,OAAQ,QAK/E,MAAM2xB,GACJt3E,eAAeikD,EAAQgO,IACvBjyD,eAAeuF,GACb,OAAO,EAETvF,iBAAiB6gD,EAAOn/C,EAAMoK,IAC9B9L,oBAAoB6gD,EAAOn/C,EAAMoK,IACjC9L,sBACE,OAAO,EAETA,eAAenD,EAAS+Y,EAAOE,EAAQm8C,GAGrC,OAFAr8C,EAAQjb,KAAKC,IAAI,EAAGgb,GAAS/Y,EAAQ+Y,OACrCE,EAASA,GAAUjZ,EAAQiZ,OACpB,CACLF,MAAAA,EACAE,OAAQnb,KAAKC,IAAI,EAAGq3D,EAAct3D,KAAK+sB,MAAM9R,EAAQq8C,GAAen8C,IAGxE9V,WAAWikD,GACT,OAAO,EAETjkD,aAAa+6D,KAIf,MAAMwc,WAAsBD,GAC1Bt3E,eAAegwB,GACb,OAAOA,GAAQA,EAAKk0B,YAAcl0B,EAAKk0B,WAAW,OAAS,KAE7DlkD,aAAa+6D,GACXA,EAAOx9D,QAAQijD,WAAY,GAI/B,MACMg3B,GAAc,CAClBC,WAAY,YACZC,UAAW,YACXC,SAAU,UACVC,aAAc,aACdC,YAAa,YACbC,YAAa,YACbC,UAAW,UACXC,aAAc,WACdC,WAAY,YAERC,GAAgBt6E,GAAmB,OAAVA,GAA4B,KAAVA,EAoCjD,MAAMu6E,KAAuBllB,IAA+B,CAAC3xC,SAAS,GAItE,SAAS82D,GAAev3B,EAAOn/C,EAAMoK,GACnC+0C,EAAMoD,OAAOxmD,oBAAoBiE,EAAMoK,EAAUqsE,IAanD,SAASE,GAAiBC,EAAUr0B,GAClC,IAAK,MAAMhoD,KAAQq8E,EACjB,GAAIr8E,IAASgoD,GAAUhoD,EAAK+O,SAASi5C,GACnC,OAAO,EAIb,SAASs0B,GAAqB13B,EAAOn/C,EAAMoK,GACzC,MAAMm4C,EAASpD,EAAMoD,OACfllB,EAAW,IAAIa,iBAAiB/P,IACpC,IAAI7iB,GAAU,EACd,IAAK,MAAMw5D,KAAS32C,EAClB7iB,EAAUA,GAAWqrE,GAAiB7R,EAAMgS,WAAYv0B,GACxDj3C,EAAUA,IAAYqrE,GAAiB7R,EAAMiS,aAAcx0B,GAEzDj3C,GACFlB,MAIJ,OADAizB,EAASS,QAAQ7lC,SAAU,CAACqmC,WAAW,EAAM04C,SAAS,IAC/C35C,EAET,SAAS45C,GAAqB93B,EAAOn/C,EAAMoK,GACzC,MAAMm4C,EAASpD,EAAMoD,OACfllB,EAAW,IAAIa,iBAAiB/P,IACpC,IAAI7iB,GAAU,EACd,IAAK,MAAMw5D,KAAS32C,EAClB7iB,EAAUA,GAAWqrE,GAAiB7R,EAAMiS,aAAcx0B,GAC1Dj3C,EAAUA,IAAYqrE,GAAiB7R,EAAMgS,WAAYv0B,GAEvDj3C,GACFlB,MAIJ,OADAizB,EAASS,QAAQ7lC,SAAU,CAACqmC,WAAW,EAAM04C,SAAS,IAC/C35C,EAET,MAAM65C,GAAqB,IAAIpzE,IAC/B,IAAIqzE,GAAsB,EAC1B,SAASC,KACP,MAAMC,EAAMhwE,OAAO63C,iBACfm4B,IAAQF,KAGZA,GAAsBE,EACtBH,GAAmB5/E,QAAQ,CAAC0hE,EAAQ7Z,KAC9BA,EAAMiD,0BAA4Bi1B,GACpCre,OAgBN,SAASse,GAAqBn4B,EAAOn/C,EAAMoK,GACzC,MAAMm4C,EAASpD,EAAMoD,OACfoO,EAAYpO,GAAU4M,GAAe5M,GAC3C,IAAKoO,EACH,OAEF,MAAMqI,EAASjyB,GAAU,CAAC7yB,EAAOE,KAC/B,MAAM68B,EAAI0f,EAAUxtC,YACpB/Y,EAAS8J,EAAOE,GACZ68B,EAAI0f,EAAUxtC,aAChB/Y,KAED/C,QACGg2B,EAAW,IAAIG,eAAerP,IAClC,MAAM22C,EAAQ32C,EAAQ,GAChBja,EAAQ4wD,EAAMnnC,YAAYzpB,MAC1BE,EAAS0wD,EAAMnnC,YAAYvpB,OACnB,IAAVF,GAA0B,IAAXE,GAGnB4kD,EAAO9kD,EAAOE,KAIhB,OAFAipB,EAASS,QAAQ6yB,GAlCnB,SAAuCxR,EAAO6Z,GACvCke,GAAmB1zD,MACtBnc,OAAOvL,iBAAiB,SAAUs7E,IAEpCF,GAAmBp6E,IAAIqiD,EAAO6Z,GA+B9Bue,CAA8Bp4B,EAAO6Z,GAC9B37B,EAET,SAASm6C,GAAgBr4B,EAAOn/C,EAAMq9B,GAChCA,GACFA,EAASsB,aAEE,WAAT3+B,GApCN,SAAyCm/C,GACvC+3B,GAAmB70E,OAAO88C,GACrB+3B,GAAmB1zD,MACtBnc,OAAOtL,oBAAoB,SAAUq7E,IAkCrCK,CAAgCt4B,GAGpC,SAASu4B,GAAqBv4B,EAAOn/C,EAAMoK,GACzC,MAAMm4C,EAASpD,EAAMoD,OACfyH,EAAQjjB,GAAWprC,IACL,OAAdwjD,EAAM7mD,KACR8R,EAhHN,SAAyBzO,EAAOwjD,GAC9B,MAAMn/C,EAAO81E,GAAYn6E,EAAMqE,OAASrE,EAAMqE,MACxCopB,EAACA,EAACC,EAAEA,GAAKinD,GAAsB30E,EAAOwjD,GAC5C,MAAO,CACLn/C,KAAAA,EACAm/C,MAAAA,EACA2Q,OAAQn0D,EACRytB,OAAStwB,IAANswB,EAAkBA,EAAI,KACzBC,OAASvwB,IAANuwB,EAAkBA,EAAI,MAwGdsuD,CAAgBh8E,EAAOwjD,KAEjCA,EAAQl1C,IACT,MAAMtO,EAAQsO,EAAK,GACnB,MAAO,CAACtO,EAAOA,EAAMo0D,QAASp0D,EAAMq0D,WAGtC,OA7HF,SAAqBz1D,EAAMyF,EAAMoK,GAC/B7P,EAAKuB,iBAAiBkE,EAAMoK,EAAUqsE,IA2HtCmB,CAAYr1B,EAAQviD,EAAMgqD,GACnBA,EAET,MAAM6tB,WAAoBjC,GACxBt3E,eAAeikD,EAAQgO,GACrB,MAAM1sD,EAAU0+C,GAAUA,EAAOC,YAAcD,EAAOC,WAAW,MACjE,OAAI3+C,GAAWA,EAAQ0+C,SAAWA,GAtKtC,SAAoBA,EAAQgO,GAC1B,MAAM3zD,EAAQ2lD,EAAO3lD,MACfk7E,EAAev1B,EAAOnmD,aAAa,UACnC27E,EAAcx1B,EAAOnmD,aAAa,SAcxC,GAbAmmD,EAAkB,SAAI,CACpBz4B,QAAS,CACP1V,OAAQ0jE,EACR5jE,MAAO6jE,EACPn7E,MAAO,CACLo7B,QAASp7B,EAAMo7B,QACf5jB,OAAQxX,EAAMwX,OACdF,MAAOtX,EAAMsX,SAInBtX,EAAMo7B,QAAUp7B,EAAMo7B,SAAW,QACjCp7B,EAAMmpB,UAAYnpB,EAAMmpB,WAAa,aACjCywD,GAAcuB,GAAc,CAC9B,MAAMC,EAAevmB,GAAalP,EAAQ,cACrBzpD,IAAjBk/E,IACFz1B,EAAOruC,MAAQ8jE,GAGnB,GAAIxB,GAAcsB,GAChB,GAA4B,KAAxBv1B,EAAO3lD,MAAMwX,OACfmuC,EAAOnuC,OAASmuC,EAAOruC,OAASq8C,GAAe,OAC1C,CACL,MAAM0nB,EAAgBxmB,GAAalP,EAAQ,eACrBzpD,IAAlBm/E,IACF11B,EAAOnuC,OAAS6jE,IA0IlBC,CAAW31B,EAAQgO,GACZ1sD,GAEF,KAETvF,eAAeuF,GACb,MAAM0+C,EAAS1+C,EAAQ0+C,OACvB,IAAKA,EAAkB,SACrB,OAAO,EAET,MAAMz4B,EAAUy4B,EAAkB,SAAEz4B,QACpC,CAAC,SAAU,SAASxyB,QAAS2V,IAC3B,MAAM/Q,EAAQ4tB,EAAQ7c,GAClBu6B,GAActrC,GAChBqmD,EAAOpmD,gBAAgB8Q,GAEvBs1C,EAAOlmD,aAAa4Q,EAAM/Q,KAG9B,MAAMU,EAAQktB,EAAQltB,OAAS,GAM/B,OALA1F,OAAO+C,KAAK2C,GAAOtF,QAASqF,IAC1B4lD,EAAO3lD,MAAMD,GAAOC,EAAMD,KAE5B4lD,EAAOruC,MAAQquC,EAAOruC,aACfquC,EAAkB,UAClB,EAETjkD,iBAAiB6gD,EAAOn/C,EAAMoK,GAC5B7L,KAAKxC,oBAAoBojD,EAAOn/C,GAChC,MAAMm4E,EAAUh5B,EAAMi5B,WAAaj5B,EAAMi5B,SAAW,IAM9Cx8E,EALW,CACfqiC,OAAQ44C,GACRj8E,OAAQq8E,GACRje,OAAQse,IAEet3E,IAAS03E,GAClCS,EAAQn4E,GAAQpE,EAAQujD,EAAOn/C,EAAMoK,GAEvC9L,oBAAoB6gD,EAAOn/C,GACzB,MAAMm4E,EAAUh5B,EAAMi5B,WAAaj5B,EAAMi5B,SAAW,IAC9CpuB,EAAQmuB,EAAQn4E,GACtB,IAAKgqD,EACH,QAEe,CACf/rB,OAAQu5C,GACR58E,OAAQ48E,GACRxe,OAAQwe,IAEex3E,IAAS02E,IAC1Bv3B,EAAOn/C,EAAMgqD,GACrBmuB,EAAQn4E,QAAQlH,EAElBwF,sBACE,OAAO+I,OAAO63C,iBAEhB5gD,eAAeikD,EAAQruC,EAAOE,EAAQm8C,GACpC,OAAOH,GAAe7N,EAAQruC,EAAOE,EAAQm8C,GAE/CjyD,WAAWikD,GACT,MAAMoO,EAAYxB,GAAe5M,GACjC,SAAUoO,IAAaA,EAAU0nB,cAWrC,MAAMC,GACJh6E,cACEC,KAAK6qB,OAAItwB,EACTyF,KAAK8qB,OAAIvwB,EACTyF,KAAKw6D,QAAS,EACdx6D,KAAK1C,aAAU/C,EACfyF,KAAKq7D,iBAAc9gE,EAErBwF,gBAAgByyE,GACd,MAAM3nD,EAACA,EAACC,EAAEA,GAAK9qB,KAAKqzE,SAAS,CAAC,IAAK,KAAMb,GACzC,MAAO,CAAC3nD,EAAAA,EAAGC,EAAAA,GAEb/qB,WACE,OAAO2sC,GAAS1sC,KAAK6qB,IAAM6hB,GAAS1sC,KAAK8qB,GAE3C/qB,SAASxE,EAAOy+E,GACd,MAAMtiB,EAAQ13D,KAAKq7D,YACnB,IAAK2e,IAAUtiB,EACb,OAAO13D,KAET,MAAM2F,EAAM,GAIZ,OAHApK,EAAMxC,QAAQ2V,IACZ/I,EAAI+I,GAAQgpD,EAAMhpD,IAASgpD,EAAMhpD,GAAM8rD,SAAW9C,EAAMhpD,GAAMmrD,IAAM75D,KAAK0O,KAEpE/I,GAGXo0E,GAAQ9nD,SAAW,GACnB8nD,GAAQE,mBAAgB1/E,EAExB,MAAM2/E,GAAa,CACjB75B,OAAO1iD,GACE+L,GAAQ/L,GAASA,EAAQ,GAAKA,EAEvCoC,QAAQo6E,EAAW9zE,EAAO+/D,GACxB,GAAkB,IAAd+T,EACF,MAAO,IAET,MAAMxmB,EAAS3zD,KAAK4gD,MAAMtjD,QAAQq2D,OAClC,IAAIymB,EACAxqB,EAAQuqB,EACZ,GAAI/T,EAAMxrE,OAAS,EAAG,CACpB,MAAMy/E,EAAU3/E,KAAKC,IAAID,KAAK6hB,IAAI6pD,EAAM,GAAGzoE,OAAQjD,KAAK6hB,IAAI6pD,EAAMA,EAAMxrE,OAAS,GAAG+C,SAChF08E,EAAU,MAAQA,EAAU,QAC9BD,EAAW,cAEbxqB,EAmBN,SAAwBuqB,EAAW/T,GACjC,IAAIxW,EAAQwW,EAAMxrE,OAAS,EAAIwrE,EAAM,GAAGzoE,MAAQyoE,EAAM,GAAGzoE,MAAQyoE,EAAM,GAAGzoE,MAAQyoE,EAAM,GAAGzoE,MACvFjD,KAAK6hB,IAAIqzC,IAAU,GAAKuqB,IAAcz/E,KAAK+sB,MAAM0yD,KACnDvqB,EAAQuqB,EAAYz/E,KAAK+sB,MAAM0yD,IAEjC,OAAOvqB,EAxBK0qB,CAAeH,EAAW/T,GAEpC,MAAMmU,EAAWruC,GAAMxxC,KAAK6hB,IAAIqzC,IAC1B4qB,EAAa9/E,KAAKC,IAAID,KAAKqZ,KAAK,EAAIrZ,KAAK+sB,MAAM8yD,GAAW,IAAK,GAC/Dj9E,EAAU,CAAC88E,SAAAA,EAAUK,sBAAuBD,EAAYE,sBAAuBF,GAErF,OADA7hF,OAAOP,OAAOkF,EAAS0C,KAAK1C,QAAQ8oE,MAAMjS,QACnCT,GAAaymB,EAAWxmB,EAAQr2D,IAEzCyC,YAAYo6E,EAAW9zE,EAAO+/D,GAC5B,GAAkB,IAAd+T,EACF,MAAO,IAET,MAAMngB,EAASmgB,EAAaz/E,KAAK8sC,IAAI,GAAI9sC,KAAK+sB,MAAMykB,GAAMiuC,KAC1D,OAAe,IAAXngB,GAA2B,IAAXA,GAA2B,IAAXA,EAC3BkgB,GAAWS,QAAQ34E,KAAKhC,KAAMm6E,EAAW9zE,EAAO+/D,GAElD,KAUX,IAAIwU,GAAQ,CAACV,WAAAA,IAqEb,SAASW,GAASviD,EAAO8tC,GACvB,MAAM0U,EAAWxiD,EAAMh7B,QAAQ8oE,MACzB2U,EAAaD,EAASE,eAwB9B,SAA2B1iD,GACzB,MAAMxqB,EAASwqB,EAAMh7B,QAAQwQ,OACvBmtE,EAAa3iD,EAAM4iD,YACnBC,EAAW7iD,EAAM2tC,QAAUgV,GAAcntE,EAAS,EAAI,GACtDstE,EAAW9iD,EAAM+iD,WAAaJ,EACpC,OAAOvgF,KAAK+sB,MAAM/sB,KAAKqZ,IAAIonE,EAAUC,IA7BQE,CAAkBhjD,GACzDijD,EAAeT,EAASU,MAAMxjE,QA6CtC,SAAyBouD,GACvB,MAAM5qE,EAAS,GACf,IAAIX,EAAGivC,EACP,IAAKjvC,EAAI,EAAGivC,EAAOs8B,EAAMxrE,OAAQC,EAAIivC,EAAMjvC,IACrCurE,EAAMvrE,GAAG2gF,OACXhgF,EAAO2F,KAAKtG,GAGhB,OAAOW,EArDuCigF,CAAgBrV,GAAS,GACjEsV,EAAkBH,EAAa3gF,OAC/B+gF,EAAQJ,EAAa,GACrBxS,EAAOwS,EAAaG,EAAkB,GACtCE,EAAW,GACjB,GAAIF,EAAkBX,EAEpB,OAgDJ,SAAoB3U,EAAOwV,EAAUL,EAAc1P,GACjD,IAEIhxE,EAFAu6D,EAAQ,EACR1lD,EAAO6rE,EAAa,GAGxB,IADA1P,EAAUnxE,KAAKquB,KAAK8iD,GACfhxE,EAAI,EAAGA,EAAIurE,EAAMxrE,OAAQC,IACxBA,IAAM6U,IACRksE,EAASz6E,KAAKilE,EAAMvrE,IACpBu6D,IACA1lD,EAAO6rE,EAAanmB,EAAQyW,IA1D9BgQ,CAAWzV,EAAOwV,EAAUL,EAAcG,EAAkBX,GACrDa,EAET,MAAM/P,EAqBR,SAA0B0P,EAAcnV,EAAO2U,GAC7C,MAAMe,EA4DR,SAAwBvyE,GACtB,MAAM9O,EAAM8O,EAAI3O,OAChB,IAAIC,EAAGsiB,EACP,GAAI1iB,EAAM,EACR,OAAO,EAET,IAAK0iB,EAAO5T,EAAI,GAAI1O,EAAI,EAAGA,EAAIJ,IAAOI,EACpC,GAAI0O,EAAI1O,GAAK0O,EAAI1O,EAAI,KAAOsiB,EAC1B,OAAO,EAGX,OAAOA,EAvEkB4+D,CAAeR,GAClC1P,EAAUzF,EAAMxrE,OAASmgF,EAC/B,IAAKe,EACH,OAAOphF,KAAKC,IAAIkxE,EAAS,GAE3B,MAAMmQ,EDppGR,SAAoBr+E,GAClB,MAAMnC,EAAS,GACT2gB,EAAOzhB,KAAKyhB,KAAKxe,GACvB,IAAI9C,EACJ,IAAKA,EAAI,EAAGA,EAAIshB,EAAMthB,IAChB8C,EAAQ9C,GAAM,IAChBW,EAAO2F,KAAKtG,GACZW,EAAO2F,KAAKxD,EAAQ9C,IAOxB,OAJIshB,KAAiB,EAAPA,IACZ3gB,EAAO2F,KAAKgb,GAEd3gB,EAAO8zB,KAAK,CAACn2B,EAAGC,IAAMD,EAAIC,GAAG4J,MACtBxH,ECsoGSygF,CAAWH,GAC3B,IAAK,IAAIjhF,EAAI,EAAGivC,EAAOkyC,EAAQphF,OAAS,EAAGC,EAAIivC,EAAMjvC,IAAK,CACxD,MAAMk+D,EAASijB,EAAQnhF,GACvB,GAAIk+D,EAAS8S,EACX,OAAO9S,EAGX,OAAOr+D,KAAKC,IAAIkxE,EAAS,GAlCTqQ,CAAiBX,EAAcnV,EAAO2U,GACtD,GAAIW,EAAkB,EAAG,CACvB,IAAI7gF,EAAGivC,EACP,MAAMqyC,EAAkBT,EAAkB,EAAIhhF,KAAKqiC,OAAOgsC,EAAO4S,IAAUD,EAAkB,IAAM,KAEnG,IADAnxD,GAAK67C,EAAOwV,EAAU/P,EAAS5iC,GAAckzC,GAAmB,EAAIR,EAAQQ,EAAiBR,GACxF9gF,EAAI,EAAGivC,EAAO4xC,EAAkB,EAAG7gF,EAAIivC,EAAMjvC,IAChD0vB,GAAK67C,EAAOwV,EAAU/P,EAAS0P,EAAa1gF,GAAI0gF,EAAa1gF,EAAI,IAGnE,OADA0vB,GAAK67C,EAAOwV,EAAU/P,EAAS9C,EAAM9/B,GAAckzC,GAAmB/V,EAAMxrE,OAASmuE,EAAOoT,GACrFP,EAGT,OADArxD,GAAK67C,EAAOwV,EAAU/P,GACf+P,EA+CT,SAASrxD,GAAK67C,EAAOwV,EAAU/P,EAASuQ,EAAYC,GAClD,MAAMl7D,EAAQkoB,GAAe+yC,EAAY,GACnC76D,EAAM7mB,KAAKqZ,IAAIs1B,GAAegzC,EAAUjW,EAAMxrE,QAASwrE,EAAMxrE,QACnE,IACIA,EAAQC,EAAG6U,EADX0lD,EAAQ,EAQZ,IANAyW,EAAUnxE,KAAKquB,KAAK8iD,GAChBwQ,IACFzhF,EAASyhF,EAAWD,EACpBvQ,EAAUjxE,EAASF,KAAK+sB,MAAM7sB,EAASixE,IAEzCn8D,EAAOyR,EACAzR,EAAO,GACZ0lD,IACA1lD,EAAOhV,KAAKqiC,MAAM5b,EAAQi0C,EAAQyW,GAEpC,IAAKhxE,EAAIH,KAAKC,IAAIwmB,EAAO,GAAItmB,EAAI0mB,EAAK1mB,IAChCA,IAAM6U,IACRksE,EAASz6E,KAAKilE,EAAMvrE,IACpBu6D,IACA1lD,EAAOhV,KAAKqiC,MAAM5b,EAAQi0C,EAAQyW,OA7J/BttE,IAAI,QAAS,CACpBk7B,SAAS,EACT3rB,QAAQ,EACR47B,SAAS,EACTqhC,aAAa,EACbxV,OAAQ,QACR+mB,MAAO,EACP36D,KAAM,CACJ8X,SAAS,EACT0tB,UAAW,EACXo1B,YAAY,EACZC,iBAAiB,EACjBC,WAAW,EACXxB,WAAY,EACZyB,UAAW,CAACje,EAAMnhE,IAAYA,EAAQ6pD,UACtCw1B,UAAW,CAACle,EAAMnhE,IAAYA,EAAQ6hD,MACtCrxC,QAAQ,EACRopD,WAAY,GACZC,iBAAkB,EAClB/R,YAAa,GAEf+lB,MAAO,CACL1xC,SAAS,EACT38B,KAAM,GACNm5E,QAAS,CACP1nE,IAAK,EACLm3C,OAAQ,IAGZ0gB,MAAO,CACLwW,YAAa,EACbC,YAAa,GACbC,QAAQ,EACRC,gBAAiB,EACjBC,gBAAiB,GACjB/G,QAAS,EACTx8C,SAAS,EACTohD,UAAU,EACVoC,gBAAiB,EACjBC,YAAa,EACbj6E,SAAU23E,GAAMV,WAAW75B,OAC3B88B,MAAO,GACP3B,MAAO,GACP1yC,MAAO,SACPs0C,WAAY,OACZC,mBAAmB,EACnBC,cAAe,4BACfC,gBAAiB,QAGZC,MAAM,cAAe,QAAS,GAAI,YAClCA,MAAM,aAAc,QAAS,GAAI,kBACjCA,MAAM,aAAc,cAAe,GAAI,kBACvCA,MAAM,cAAe,QAAS,GAAI,YAClCt7B,SAAS,QAAS,CACzBU,WAAW,EACXH,YAAc5lD,IAAUA,EAAK6lD,WAAW,YAAc7lD,EAAK6lD,WAAW,UAAqB,aAAT7lD,GAAgC,WAATA,EACzG8lD,WAAa9lD,GAAkB,eAATA,GAAkC,mBAATA,OAExCqlD,SAAS,SAAU,CAC1BU,UAAW,aAEJV,SAAS,cAAe,CAC/BO,YAAc5lD,GAAkB,oBAATA,GAAuC,aAATA,EACrD8lD,WAAa9lD,GAAkB,oBAATA,IA+GxB,MACM4gF,GAAiB,CAACnlD,EAAO4uC,EAAMp5D,IAAoB,QAATo5D,GAA2B,SAATA,EAAkB5uC,EAAM4uC,GAAQp5D,EAASwqB,EAAM4uC,GAAQp5D,EACzH,SAAS4vE,GAAOn0E,EAAKo0E,GACnB,MAAMniF,EAAS,GACTqjB,EAAYtV,EAAI3O,OAAS+iF,EACzBljF,EAAM8O,EAAI3O,OAChB,IAAIC,EAAI,EACR,KAAOA,EAAIJ,EAAKI,GAAKgkB,EACnBrjB,EAAO2F,KAAKoI,EAAI7O,KAAK+sB,MAAM5sB,KAE7B,OAAOW,EAET,SAASoiF,GAAoBtlD,EAAOjyB,EAAOw3E,GACzC,MAAMjjF,EAAS09B,EAAM8tC,MAAMxrE,OACrBkjF,EAAapjF,KAAKqZ,IAAI1N,EAAOzL,EAAS,GACtCumB,EAAQmX,EAAM8wC,YACd7nD,EAAM+W,EAAM+wC,UAElB,IACIv7D,EADAiwE,EAAYzlD,EAAM+tC,gBAAgByX,GAEtC,KAAID,IAEA/vE,EADa,IAAXlT,EACOF,KAAKC,IAAIojF,EAAY58D,EAAOI,EAAMw8D,GACxB,IAAV13E,GACCiyB,EAAM+tC,gBAAgB,GAAK0X,GAAa,GAExCA,EAAYzlD,EAAM+tC,gBAAgByX,EAAa,IAAM,EAEjEC,GAAaD,EAAaz3E,EAAQyH,GAAUA,EACxCiwE,EAAY58D,EAZF,MAYqB48D,EAAYx8D,EAZjC,OAgBhB,OAAOw8D,EAeT,SAASC,GAAkB1gF,GACzB,OAAOA,EAAQm/E,UAAYn/E,EAAQ29E,WAAa,EAElD,SAASgD,GAAe3gF,EAAS2rD,GAC/B,IAAK3rD,EAAQm8B,QACX,OAAO,EAET,MAAMsnB,EAAOiI,GAAO1rD,EAAQyjD,KAAMkI,GAC5BgtB,EAAUltB,GAAUzrD,EAAQ24E,SAElC,OADcvsE,GAAQpM,EAAQR,MAAQQ,EAAQR,KAAKlC,OAAS,GAC5CmmD,EAAKE,WAAcg1B,EAAQpgE,OAe7C,SAASqoE,GAAWp1C,EAAOxR,EAAUoS,GACnC,IAAI/jC,EAAMkjC,GAAmBC,GAI7B,OAHKY,GAAwB,UAAbpS,IAA2BoS,GAAwB,UAAbpS,KACpD3xB,EA5EiB,CAACmjC,GAAoB,SAAVA,EAAmB,QAAoB,UAAVA,EAAoB,OAASA,EA4EhFq1C,CAAax4E,IAEdA,EAoCT,MAAMy4E,WAAcrE,GAClBh6E,YAAYo5D,GACVlwD,QACAjJ,KAAK0I,GAAKywD,EAAIzwD,GACd1I,KAAKyB,KAAO03D,EAAI13D,KAChBzB,KAAK1C,aAAU/C,EACfyF,KAAKjG,IAAMo/D,EAAIp/D,IACfiG,KAAK4gD,MAAQuY,EAAIvY,MACjB5gD,KAAKuO,SAAMhU,EACXyF,KAAK0lD,YAASnrD,EACdyF,KAAKwO,UAAOjU,EACZyF,KAAKylD,WAAQlrD,EACbyF,KAAK2V,WAAQpb,EACbyF,KAAK6V,YAAStb,EACdyF,KAAKq+E,SAAW,CACd7vE,KAAM,EACNi3C,MAAO,EACPl3C,IAAK,EACLm3C,OAAQ,GAEV1lD,KAAKqnD,cAAW9sD,EAChByF,KAAKkyD,eAAY33D,EACjByF,KAAKs+E,gBAAa/jF,EAClByF,KAAKu+E,mBAAgBhkF,EACrByF,KAAKsnB,iBAAc/sB,EACnByF,KAAKunB,kBAAehtB,EACpByF,KAAK4Q,UAAOrW,EACZyF,KAAKw+E,mBAAgBjkF,EACrByF,KAAK+T,SAAMxZ,EACXyF,KAAKrF,SAAMJ,EACXyF,KAAKy+E,YAASlkF,EACdyF,KAAKomE,MAAQ,GACbpmE,KAAK0+E,eAAiB,KACtB1+E,KAAK2+E,YAAc,KACnB3+E,KAAK4+E,YAAc,KACnB5+E,KAAKimE,QAAU,EACfjmE,KAAKq7E,WAAa,EAClBr7E,KAAK6+E,kBAAoB,GACzB7+E,KAAKopE,iBAAc7uE,EACnByF,KAAKqpE,eAAY9uE,EACjByF,KAAKmyE,gBAAiB,EACtBnyE,KAAK8+E,cAAWvkF,EAChByF,KAAK++E,cAAWxkF,EAChByF,KAAKg/E,mBAAgBzkF,EACrByF,KAAKi/E,mBAAgB1kF,EACrByF,KAAKk/E,aAAe,EACpBl/E,KAAKm/E,aAAe,EACpBn/E,KAAK0lE,OAAS,GACd1lE,KAAKo/E,mBAAoB,EACzBp/E,KAAKo/D,cAAW7kE,EAElBwF,KAAKzC,GACH0C,KAAK1C,QAAUA,EAAQqvD,WAAW3sD,KAAKikD,cACvCjkD,KAAK4Q,KAAOtT,EAAQsT,KACpB5Q,KAAK++E,SAAW/+E,KAAKmiE,MAAM7kE,EAAQyW,KACnC/T,KAAK8+E,SAAW9+E,KAAKmiE,MAAM7kE,EAAQ3C,KACnCqF,KAAKi/E,cAAgBj/E,KAAKmiE,MAAM7kE,EAAQ+hF,cACxCr/E,KAAKg/E,cAAgBh/E,KAAKmiE,MAAM7kE,EAAQgiF,cAE1Cv/E,MAAM+jE,EAAKz9D,GACT,OAAOy9D,EAET/jE,gBACE,IAAIg/E,SAACA,EAAQD,SAAEA,EAAQG,cAAEA,EAAaD,cAAEA,GAAiBh/E,KAKzD,OAJA++E,EAAW51C,GAAgB41C,EAAUh6D,OAAO8mB,mBAC5CizC,EAAW31C,GAAgB21C,EAAU/5D,OAAO89C,mBAC5Coc,EAAgB91C,GAAgB81C,EAAel6D,OAAO8mB,mBACtDmzC,EAAgB71C,GAAgB61C,EAAej6D,OAAO89C,mBAC/C,CACL9uD,IAAKo1B,GAAgB41C,EAAUE,GAC/BtkF,IAAKwuC,GAAgB21C,EAAUE,GAC/Bhc,WAAY95B,GAAe61C,GAC3B9b,WAAY/5B,GAAe41C,IAG/B/+E,UAAUyiE,GACR,IACIn2B,GADAt4B,IAACA,EAAGpZ,IAAEA,EAAGqoE,WAAEA,EAAUC,WAAEA,GAAcjjE,KAAKkjE,gBAE9C,GAAIF,GAAcC,EAChB,MAAO,CAAClvD,IAAAA,EAAKpZ,IAAAA,GAEf,MAAM4kF,EAAQv/E,KAAKm9D,0BACnB,IAAK,IAAItiE,EAAI,EAAGivC,EAAOy1C,EAAM3kF,OAAQC,EAAIivC,IAAQjvC,EAC/CwxC,EAAQkzC,EAAM1kF,GAAGsmC,WAAWq+C,UAAUx/E,KAAMwiE,GACvCQ,IACHjvD,EAAMrZ,KAAKqZ,IAAIA,EAAKs4B,EAAMt4B,MAEvBkvD,IACHtoE,EAAMD,KAAKC,IAAIA,EAAK0xC,EAAM1xC,MAK9B,OAFAoZ,EAAMkvD,GAAclvD,EAAMpZ,EAAMA,EAAMoZ,EACtCpZ,EAAMqoE,GAAcjvD,EAAMpZ,EAAMoZ,EAAMpZ,EAC/B,CACLoZ,IAAKo1B,GAAgBp1B,EAAKo1B,GAAgBxuC,EAAKoZ,IAC/CpZ,IAAKwuC,GAAgBxuC,EAAKwuC,GAAgBp1B,EAAKpZ,KAGnDoF,aACE,MAAO,CACLyO,KAAMxO,KAAKsnB,aAAe,EAC1B/Y,IAAKvO,KAAKs+E,YAAc,EACxB74B,MAAOzlD,KAAKunB,cAAgB,EAC5Bm+B,OAAQ1lD,KAAKu+E,eAAiB,GAGlCx+E,WACE,OAAOC,KAAKomE,MAEdrmE,YACE,MAAMhD,EAAOiD,KAAK4gD,MAAM7jD,KACxB,OAAOiD,KAAK1C,QAAQ0kE,SAAWhiE,KAAKqc,eAAiBtf,EAAK0iF,QAAU1iF,EAAK2iF,UAAY3iF,EAAKilE,QAAU,GAEtGjiE,eACEC,KAAK0lE,OAAS,GACd1lE,KAAKo/E,mBAAoB,EAE3Br/E,eACEkD,GAASjD,KAAK1C,QAAQqiF,aAAc,CAAC3/E,OAEvCD,OAAOsnD,EAAU6K,EAAWD,GAC1B,MAAM8Y,YAACA,EAAWuR,MAAEA,EAAOlW,MAAO0U,GAAY96E,KAAK1C,QAC7CsiF,EAAa9E,EAAS8E,WAC5B5/E,KAAK2/E,eACL3/E,KAAKqnD,SAAWA,EAChBrnD,KAAKkyD,UAAYA,EACjBlyD,KAAKq+E,SAAWpsB,EAAUt5D,OAAOP,OAAO,CACtCoW,KAAM,EACNi3C,MAAO,EACPl3C,IAAK,EACLm3C,OAAQ,GACPuM,GACHjyD,KAAKomE,MAAQ,KACbpmE,KAAK4+E,YAAc,KACnB5+E,KAAK0+E,eAAiB,KACtB1+E,KAAK2+E,YAAc,KACnB3+E,KAAK6/E,sBACL7/E,KAAK8/E,gBACL9/E,KAAK+/E,qBACL//E,KAAKq7E,WAAar7E,KAAKqc,eACnBrc,KAAK2V,MAAQs8C,EAAQzjD,KAAOyjD,EAAQxM,MACpCzlD,KAAK6V,OAASo8C,EAAQ1jD,IAAM0jD,EAAQvM,OACnC1lD,KAAKo/E,oBACRp/E,KAAKggF,mBACLhgF,KAAKigF,sBACLjgF,KAAKkgF,kBACLlgF,KAAKy+E,OD/wEX,SAAmB0B,EAAQ7D,EAAOvR,GAChC,MAAMh3D,IAACA,EAAGpZ,IAAEA,GAAOwlF,EACbhJ,EAAS7tC,GAAYgzC,GAAQ3hF,EAAMoZ,GAAO,GAC1CqsE,EAAW,CAACziF,EAAOuF,IAAQ6nE,GAAyB,IAAVptE,EAAc,EAAIA,EAAQuF,EAC1E,MAAO,CACL6Q,IAAKqsE,EAASrsE,GAAMrZ,KAAK6hB,IAAI46D,IAC7Bx8E,IAAKylF,EAASzlF,EAAKw8E,ICywEHkJ,CAAUrgF,KAAMs8E,EAAOvR,GACrC/qE,KAAKo/E,mBAAoB,GAE3Bp/E,KAAKsgF,mBACLtgF,KAAKomE,MAAQpmE,KAAKugF,cAAgB,GAClCvgF,KAAKwgF,kBACL,MAAMC,EAAkBb,EAAa5/E,KAAKomE,MAAMxrE,OAChDoF,KAAK0gF,sBAAsBD,EAAkB/C,GAAO19E,KAAKomE,MAAOwZ,GAAc5/E,KAAKomE,OACnFpmE,KAAKg7D,YACLh7D,KAAK2gF,+BACL3gF,KAAK4gF,yBACL5gF,KAAK6gF,8BACD/F,EAASrhD,UAAYqhD,EAASD,UAAgC,SAApBC,EAAS3wC,UACrDnqC,KAAKomE,MAAQyU,GAAS76E,KAAMA,KAAKomE,OACjCpmE,KAAK4+E,YAAc,MAEjB6B,GACFzgF,KAAK0gF,sBAAsB1gF,KAAKomE,OAElCpmE,KAAK8gF,YACL9gF,KAAK+gF,MACL/gF,KAAKghF,WACLhhF,KAAKoB,cAEPrB,YACE,IACIkhF,EAAYC,EADZC,EAAgBnhF,KAAK1C,QAAQosC,QAE7B1pC,KAAKqc,gBACP4kE,EAAajhF,KAAKwO,KAClB0yE,EAAWlhF,KAAKylD,QAEhBw7B,EAAajhF,KAAKuO,IAClB2yE,EAAWlhF,KAAK0lD,OAChBy7B,GAAiBA,GAEnBnhF,KAAKopE,YAAc6X,EACnBjhF,KAAKqpE,UAAY6X,EACjBlhF,KAAKmyE,eAAiBgP,EACtBnhF,KAAKimE,QAAUib,EAAWD,EAC1BjhF,KAAKohF,eAAiBphF,KAAK1C,QAAQ+jF,cAErCthF,cACEkD,GAASjD,KAAK1C,QAAQ8D,YAAa,CAACpB,OAEtCD,sBACEkD,GAASjD,KAAK1C,QAAQuiF,oBAAqB,CAAC7/E,OAE9CD,gBACMC,KAAKqc,gBACPrc,KAAK2V,MAAQ3V,KAAKqnD,SAClBrnD,KAAKwO,KAAO,EACZxO,KAAKylD,MAAQzlD,KAAK2V,QAElB3V,KAAK6V,OAAS7V,KAAKkyD,UACnBlyD,KAAKuO,IAAM,EACXvO,KAAK0lD,OAAS1lD,KAAK6V,QAErB7V,KAAKsnB,YAAc,EACnBtnB,KAAKs+E,WAAa,EAClBt+E,KAAKunB,aAAe,EACpBvnB,KAAKu+E,cAAgB,EAEvBx+E,qBACEkD,GAASjD,KAAK1C,QAAQyiF,mBAAoB,CAAC//E,OAE7CD,WAAWlD,GACTmD,KAAK4gD,MAAM0gC,cAAczkF,EAAMmD,KAAKikD,cACpChhD,GAASjD,KAAK1C,QAAQT,GAAO,CAACmD,OAEhCD,mBACEC,KAAKuhF,WAAW,oBAElBxhF,uBACAA,kBACEC,KAAKuhF,WAAW,mBAElBxhF,mBACEC,KAAKuhF,WAAW,oBAElBxhF,aACE,MAAO,GAETA,kBACEC,KAAKuhF,WAAW,mBAElBxhF,8BACEkD,GAASjD,KAAK1C,QAAQkkF,4BAA6B,CAACxhF,OAEtDD,mBAAmBqmE,GACjB,MAAM0U,EAAW96E,KAAK1C,QAAQ8oE,MAC9B,IAAIvrE,EAAGivC,EAAMsuB,EACb,IAAKv9D,EAAI,EAAGivC,EAAOs8B,EAAMxrE,OAAQC,EAAIivC,EAAMjvC,IACzCu9D,EAAOgO,EAAMvrE,GACbu9D,EAAKxyC,MAAQ3iB,GAAS63E,EAAS73E,SAAU,CAACm1D,EAAKz6D,MAAO9C,EAAGurE,GAAQpmE,MAGrED,6BACEkD,GAASjD,KAAK1C,QAAQmkF,2BAA4B,CAACzhF,OAErDD,+BACEkD,GAASjD,KAAK1C,QAAQqjF,6BAA8B,CAAC3gF,OAEvDD,yBACE,MAAMzC,EAAU0C,KAAK1C,QACfw9E,EAAWx9E,EAAQ8oE,MACnBsb,EAAW1hF,KAAKomE,MAAMxrE,OACtBgiF,EAAc9B,EAAS8B,aAAe,EACtCC,EAAc/B,EAAS+B,YAC7B,IACIH,EAAWxqB,EAAWyvB,EADtBnD,EAAgB5B,EAEpB,IAAK58E,KAAK4hF,eAAiB9G,EAASrhD,SAAWmjD,GAAeC,GAAe6E,GAAY,IAAM1hF,KAAKqc,eAElG,YADArc,KAAKw+E,cAAgB5B,GAGvB,MAAMiF,EAAa7hF,KAAK8hF,iBAClBC,EAAgBF,EAAWG,OAAOrsE,MAClCssE,EAAiBJ,EAAWK,QAAQrsE,OACpCwxC,EAAW9Y,GAAYvuC,KAAK4gD,MAAMjrC,MAAQosE,EAAe,EAAG/hF,KAAKqnD,UACvEq1B,EAAYp/E,EAAQwQ,OAAS9N,KAAKqnD,SAAWq6B,EAAWr6B,GAAYq6B,EAAW,GAC3EK,EAAgB,EAAIrF,IACtBA,EAAYr1B,GAAYq6B,GAAYpkF,EAAQwQ,OAAS,GAAM,IAC3DokD,EAAYlyD,KAAKkyD,UAAY8rB,GAAkB1gF,EAAQqkB,MACvDm5D,EAAS7E,QAAUgI,GAAe3gF,EAAQ6tE,MAAOnrE,KAAK4gD,MAAMtjD,QAAQyjD,MACpE4gC,EAAmBjnF,KAAKyhB,KAAK4lE,EAAgBA,EAAgBE,EAAiBA,GAC9EzD,EAAgBxxC,GAAUtyC,KAAKqZ,IAC7BrZ,KAAKynF,KAAK5zC,IAAaszC,EAAWK,QAAQrsE,OAAS,GAAK6mE,GAAY,EAAG,IACvEhiF,KAAKynF,KAAK5zC,GAAY2jB,EAAYyvB,GAAmB,EAAG,IAAMjnF,KAAKynF,KAAK5zC,GAAY0zC,EAAiBN,GAAmB,EAAG,MAE7HnD,EAAgB9jF,KAAKC,IAAIiiF,EAAaliF,KAAKqZ,IAAI8oE,EAAa2B,KAE9Dx+E,KAAKw+E,cAAgBA,EAEvBz+E,8BACEkD,GAASjD,KAAK1C,QAAQujF,4BAA6B,CAAC7gF,OAEtDD,YACEkD,GAASjD,KAAK1C,QAAQwjF,UAAW,CAAC9gF,OAEpCD,MACE,MAAMkwE,EAAU,CACdt6D,MAAO,EACPE,OAAQ,IAEJ+qC,MAACA,EAAOtjD,SAAU8oE,MAAO0U,EAAU3P,MAAOiX,EAAWzgE,KAAM0gE,IAAariF,KACxEy5B,EAAUz5B,KAAK4hF,aACfvlE,EAAerc,KAAKqc,eAC1B,GAAIod,EAAS,CACX,MAAM6oD,EAAcrE,GAAemE,EAAWxhC,EAAMtjD,QAAQyjD,MAQ5D,GAPI1kC,GACF4zD,EAAQt6D,MAAQ3V,KAAKqnD,SACrB4oB,EAAQp6D,OAASmoE,GAAkBqE,GAAYC,IAE/CrS,EAAQp6D,OAAS7V,KAAKkyD,UACtB+d,EAAQt6D,MAAQqoE,GAAkBqE,GAAYC,GAE5CxH,EAASrhD,SAAWz5B,KAAKomE,MAAMxrE,OAAQ,CACzC,MAAM+gF,MAACA,EAAK5S,KAAEA,EAAIiZ,OAAEA,EAAME,QAAEA,GAAWliF,KAAK8hF,iBACtCS,EAAiC,EAAnBzH,EAAS7E,QACvBuM,EAAe11C,GAAU9sC,KAAKw+E,eAC9BvqE,EAAMvZ,KAAKuZ,IAAIuuE,GACf7zC,EAAMj0C,KAAKi0C,IAAI6zC,GACrB,GAAInmE,EAAc,CAChB,MAAMomE,EAAc3H,EAASgC,OAAS,EAAInuC,EAAMqzC,EAAOrsE,MAAQ1B,EAAMiuE,EAAQrsE,OAC7Eo6D,EAAQp6D,OAASnb,KAAKqZ,IAAI/T,KAAKkyD,UAAW+d,EAAQp6D,OAAS4sE,EAAcF,OACpE,CACL,MAAMG,EAAa5H,EAASgC,OAAS,EAAI7oE,EAAM+tE,EAAOrsE,MAAQg5B,EAAMuzC,EAAQrsE,OAC5Eo6D,EAAQt6D,MAAQjb,KAAKqZ,IAAI/T,KAAKqnD,SAAU4oB,EAAQt6D,MAAQ+sE,EAAaH,GAEvEviF,KAAK2iF,kBAAkBhH,EAAO5S,EAAMp6B,EAAK16B,IAG7CjU,KAAK4iF,iBACDvmE,GACFrc,KAAK2V,MAAQ3V,KAAKimE,QAAUrlB,EAAMjrC,MAAQ3V,KAAKq+E,SAAS7vE,KAAOxO,KAAKq+E,SAAS54B,MAC7EzlD,KAAK6V,OAASo6D,EAAQp6D,SAEtB7V,KAAK2V,MAAQs6D,EAAQt6D,MACrB3V,KAAK6V,OAAS7V,KAAKimE,QAAUrlB,EAAM/qC,OAAS7V,KAAKq+E,SAAS9vE,IAAMvO,KAAKq+E,SAAS34B,QAGlF3lD,kBAAkB47E,EAAO5S,EAAMp6B,EAAK16B,GAClC,MAAOmyD,OAAOt9B,MAACA,EAAKmtC,QAAEA,GAAQ3+C,SAAEA,GAAYt3B,KAAK1C,QAC3CulF,EAAmC,IAAvB7iF,KAAKw+E,cACjBsE,EAAgC,QAAbxrD,GAAoC,MAAdt3B,KAAK4Q,KACpD,GAAI5Q,KAAKqc,eAAgB,CACvB,MAAM4M,EAAajpB,KAAKqmE,gBAAgB,GAAKrmE,KAAKwO,KAC5Cu0E,EAAc/iF,KAAKylD,MAAQzlD,KAAKqmE,gBAAgBrmE,KAAKomE,MAAMxrE,OAAS,GAC1E,IAAI0sB,EAAc,EACdC,EAAe,EACfs7D,EACEC,GACFx7D,EAAcrT,EAAM0nE,EAAMhmE,MAC1B4R,EAAeonB,EAAMo6B,EAAKlzD,SAE1ByR,EAAcqnB,EAAMgtC,EAAM9lE,OAC1B0R,EAAetT,EAAM80D,EAAKpzD,OAET,UAAVmzB,EACTvhB,EAAewhD,EAAKpzD,MACD,QAAVmzB,EACTxhB,EAAcq0D,EAAMhmE,OAEpB2R,EAAcq0D,EAAMhmE,MAAQ,EAC5B4R,EAAewhD,EAAKpzD,MAAQ,GAE9B3V,KAAKsnB,YAAc5sB,KAAKC,KAAK2sB,EAAc2B,EAAagtD,GAAWj2E,KAAK2V,OAAS3V,KAAK2V,MAAQsT,GAAa,GAC3GjpB,KAAKunB,aAAe7sB,KAAKC,KAAK4sB,EAAew7D,EAAc9M,GAAWj2E,KAAK2V,OAAS3V,KAAK2V,MAAQotE,GAAc,OAC1G,CACL,IAAIzE,EAAavV,EAAKlzD,OAAS,EAC3B0oE,EAAgB5C,EAAM9lE,OAAS,EACrB,UAAVizB,GACFw1C,EAAa,EACbC,EAAgB5C,EAAM9lE,QACH,QAAVizB,IACTw1C,EAAavV,EAAKlzD,OAClB0oE,EAAgB,GAElBv+E,KAAKs+E,WAAaA,EAAarI,EAC/Bj2E,KAAKu+E,cAAgBA,EAAgBtI,GAGzCl2E,iBACMC,KAAKq+E,WACPr+E,KAAKq+E,SAAS7vE,KAAO9T,KAAKC,IAAIqF,KAAKsnB,YAAatnB,KAAKq+E,SAAS7vE,MAC9DxO,KAAKq+E,SAAS9vE,IAAM7T,KAAKC,IAAIqF,KAAKs+E,WAAYt+E,KAAKq+E,SAAS9vE,KAC5DvO,KAAKq+E,SAAS54B,MAAQ/qD,KAAKC,IAAIqF,KAAKunB,aAAcvnB,KAAKq+E,SAAS54B,OAChEzlD,KAAKq+E,SAAS34B,OAAShrD,KAAKC,IAAIqF,KAAKu+E,cAAev+E,KAAKq+E,SAAS34B,SAGtE3lD,WACEkD,GAASjD,KAAK1C,QAAQ0jF,SAAU,CAAChhF,OAEnCD,eACE,MAAM6Q,KAACA,EAAI0mB,SAAEA,GAAYt3B,KAAK1C,QAC9B,MAAoB,QAAbg6B,GAAmC,WAAbA,GAAkC,MAAT1mB,EAExD7Q,aACE,OAAOC,KAAK1C,QAAQq3E,SAEtB50E,sBAAsBqmE,GAGpB,IAAIvrE,EAAGivC,EACP,IAHA9pC,KAAKwhF,8BACLxhF,KAAKgjF,mBAAmB5c,GAEnBvrE,EAAI,EAAGivC,EAAOs8B,EAAMxrE,OAAQC,EAAIivC,EAAMjvC,IACrCouC,GAAcm9B,EAAMvrE,GAAG+qB,SACzBwgD,EAAM9/D,OAAOzL,EAAG,GAChBivC,IACAjvC,KAGJmF,KAAKyhF,6BAEP1hF,iBACE,IAAI8hF,EAAa7hF,KAAK4+E,YACtB,IAAKiD,EAAY,CACf,MAAMjC,EAAa5/E,KAAK1C,QAAQ8oE,MAAMwZ,WACtC,IAAIxZ,EAAQpmE,KAAKomE,MACbwZ,EAAaxZ,EAAMxrE,SACrBwrE,EAAQsX,GAAOtX,EAAOwZ,IAExB5/E,KAAK4+E,YAAciD,EAAa7hF,KAAKijF,mBAAmB7c,EAAOA,EAAMxrE,QAEvE,OAAOinF,EAET9hF,mBAAmBqmE,EAAOxrE,GACxB,MAAMb,IAACA,EAAK8kF,kBAAmBqE,GAAUljF,KACnCmjF,EAAS,GACTC,EAAU,GAChB,IAEIvoF,EAAG2R,EAAG+2C,EAAM39B,EAAOy9D,EAAUC,EAAY3gD,EAAOse,EAAYtrC,EAAOE,EAAQ0tE,EAF3EC,EAAkB,EAClBC,EAAmB,EAEvB,IAAK5oF,EAAI,EAAGA,EAAID,IAAUC,EAAG,CAO3B,GANA+qB,EAAQwgD,EAAMvrE,GAAG+qB,MACjBy9D,EAAWrjF,KAAK0jF,wBAAwB7oF,GACxCd,EAAIgnD,KAAOuiC,EAAaD,EAASrgC,OACjCrgB,EAAQugD,EAAOI,GAAcJ,EAAOI,IAAe,CAACvmF,KAAM,GAAI+lD,GAAI,IAClE7B,EAAaoiC,EAASpiC,WACtBtrC,EAAQE,EAAS,EACZozB,GAAcrjB,IAAWlc,GAAQkc,IAG/B,GAAIlc,GAAQkc,GACjB,IAAKpZ,EAAI,EAAG+2C,EAAO39B,EAAMhrB,OAAQ4R,EAAI+2C,IAAQ/2C,EAC3C+2E,EAAc39D,EAAMpZ,GACfy8B,GAAcs6C,IAAiB75E,GAAQ65E,KAC1C5tE,EAAQktC,GAAa9oD,EAAK4oC,EAAM5lC,KAAM4lC,EAAMmgB,GAAIntC,EAAO4tE,GACvD1tE,GAAUorC,QAPdtrC,EAAQktC,GAAa9oD,EAAK4oC,EAAM5lC,KAAM4lC,EAAMmgB,GAAIntC,EAAOiQ,GACvD/P,EAASorC,EAUXkiC,EAAOhiF,KAAKwU,GACZytE,EAAQjiF,KAAK0U,GACb2tE,EAAkB9oF,KAAKC,IAAIgb,EAAO6tE,GAClCC,EAAmB/oF,KAAKC,IAAIkb,EAAQ4tE,IAtgB1C,SAAwBP,EAAQtoF,GAC9B+T,GAAKu0E,EAASvgD,IACZ,MAAMmgB,EAAKngB,EAAMmgB,GACXY,EAAQZ,EAAGloD,OAAS,EAC1B,IAAIC,EACJ,GAAI6oD,EAAQ9oD,EAAQ,CAClB,IAAKC,EAAI,EAAGA,EAAI6oD,IAAS7oD,SAChB8nC,EAAM5lC,KAAK+lD,EAAGjoD,IAEvBioD,EAAGx8C,OAAO,EAAGo9C,MA+ffL,CAAe6/B,EAAQtoF,GACvB,MAAMonF,EAASmB,EAAO5jF,QAAQikF,GACxBtB,EAAUkB,EAAQ7jF,QAAQkkF,GAC1BE,EAAW34C,KAAUr1B,MAAOwtE,EAAOn4C,IAAQ,EAAGn1B,OAAQutE,EAAQp4C,IAAQ,IAC5E,MAAO,CACL2wC,MAAOgI,EAAQ,GACf5a,KAAM4a,EAAQ/oF,EAAS,GACvBonF,OAAQ2B,EAAQ3B,GAChBE,QAASyB,EAAQzB,GACjBiB,OAAAA,EACAC,QAAAA,GAGJrjF,iBAAiBpC,GACf,OAAOA,EAEToC,iBAAiBpC,EAAO0I,GACtB,OAAOk8D,IAETxiE,iBAAiB6jD,IACjB7jD,gBAAgBsG,GACd,MAAM+/D,EAAQpmE,KAAKomE,MACnB,OAAI//D,EAAQ,GAAKA,EAAQ+/D,EAAMxrE,OAAS,EAC/B,KAEFoF,KAAKmmE,iBAAiBC,EAAM//D,GAAO1I,OAE5CoC,mBAAmB6jF,GACb5jF,KAAKmyE,iBACPyR,EAAU,EAAIA,GAEhB,MAAMhgC,EAAQ5jD,KAAKopE,YAAcwa,EAAU5jF,KAAKimE,QAChD,ODzsHK13B,GCysHcvuC,KAAKohF,eAAiBz9B,GAAY3jD,KAAK4gD,MAAOgD,EAAO,GAAKA,GDzsHpD,MAAO,OC2sHlC7jD,mBAAmB6jD,GACjB,MAAMggC,GAAWhgC,EAAQ5jD,KAAKopE,aAAeppE,KAAKimE,QAClD,OAAOjmE,KAAKmyE,eAAiB,EAAIyR,EAAUA,EAE7C7jF,eACE,OAAOC,KAAKmmE,iBAAiBnmE,KAAK6jF,gBAEpC9jF,eACE,MAAMgU,IAACA,EAAGpZ,IAAEA,GAAOqF,KACnB,OAAO+T,EAAM,GAAKpZ,EAAM,EAAIA,EAC1BoZ,EAAM,GAAKpZ,EAAM,EAAIoZ,EACrB,EAEJhU,WAAWsG,GACT,MAAM+/D,EAAQpmE,KAAKomE,OAAS,GAC5B,GAAI//D,GAAS,GAAKA,EAAQ+/D,EAAMxrE,OAAQ,CACtC,MAAMw9D,EAAOgO,EAAM//D,GACnB,OAAO+xD,EAAKgH,WACbhH,EAAKgH,SA7hBV,SAA2BlvD,EAAQ7J,EAAO+xD,GACxC,OAAO5O,GAAct5C,EAAQ,CAC3BkoD,KAAAA,EACA/xD,MAAAA,EACA5E,KAAM,SAyhBWqiF,CAAkB9jF,KAAKikD,aAAc59C,EAAO+xD,IAE7D,OAAOp4D,KAAKo/D,WACZp/D,KAAKo/D,SAtiBT,SAA4BlvD,EAAQooB,GAClC,OAAOkxB,GAAct5C,EAAQ,CAC3BooB,MAAAA,EACA72B,KAAM,UAmiBUsiF,CAAmB/jF,KAAK4gD,MAAMqD,aAAcjkD,OAE9DD,YACE,MAAMikF,EAAchkF,KAAK1C,QAAQ8oE,MAC3B6d,EAAMn3C,GAAU9sC,KAAKw+E,eACrBvqE,EAAMvZ,KAAK6hB,IAAI7hB,KAAKuZ,IAAIgwE,IACxBt1C,EAAMj0C,KAAK6hB,IAAI7hB,KAAKi0C,IAAIs1C,IACxBpC,EAAa7hF,KAAK8hF,iBAClB7L,EAAU+N,EAAY/G,iBAAmB,EACzCvqC,EAAImvC,EAAaA,EAAWG,OAAOrsE,MAAQsgE,EAAU,EACrD71E,EAAIyhF,EAAaA,EAAWK,QAAQrsE,OAASogE,EAAU,EAC7D,OAAOj2E,KAAKqc,eACRjc,EAAI6T,EAAMy+B,EAAI/D,EAAM+D,EAAIz+B,EAAM7T,EAAIuuC,EAClCvuC,EAAIuuC,EAAM+D,EAAIz+B,EAAM7T,EAAI6T,EAAMy+B,EAAI/D,EAExC5uC,aACE,MAAM05B,EAAUz5B,KAAK1C,QAAQm8B,QAC7B,MAAgB,SAAZA,IACOA,EAEJz5B,KAAKm9D,0BAA0BviE,OAAS,EAEjDmF,sBAAsB4jE,GACpB,MAAM/yD,EAAO5Q,KAAK4Q,KACZgwC,EAAQ5gD,KAAK4gD,MACbtjD,EAAU0C,KAAK1C,SACfqkB,KAACA,EAAI2V,SAAEA,GAAYh6B,EACnBwQ,EAAS6T,EAAK7T,OACduO,EAAerc,KAAKqc,eAEpB6nE,EADQlkF,KAAKomE,MACOxrE,QAAUkT,EAAS,EAAI,GAC3Cq2E,EAAKnG,GAAkBr8D,GACvB3Y,EAAQ,GACRo7E,EAAaziE,EAAKgrC,WAAW3sD,KAAKikD,cAClCogC,EAAYD,EAAW7H,WAAa6H,EAAWh/B,YAAc,EAC7Dk/B,EAAgBD,EAAY,EAC5BE,EAAmB,SAAS3gC,GAChC,OAAOD,GAAY/C,EAAOgD,EAAOygC,IAEnC,IAAIG,EAAa3pF,EAAGkjF,EAAW0G,EAC3BC,EAAKC,EAAKC,EAAKC,EAAKC,EAAIC,EAAIC,EAAIC,EACpC,GAAiB,QAAb3tD,EACFktD,EAAcD,EAAiBvkF,KAAK0lD,QACpCi/B,EAAM3kF,KAAK0lD,OAASy+B,EACpBU,EAAML,EAAcF,EACpBS,EAAKR,EAAiB5gB,EAAUp1D,KAAO+1E,EACvCW,EAAKthB,EAAUje,YACV,GAAiB,WAAbpuB,EACTktD,EAAcD,EAAiBvkF,KAAKuO,KACpCw2E,EAAKphB,EAAUp1D,IACf02E,EAAKV,EAAiB5gB,EAAUje,QAAU4+B,EAC1CK,EAAMH,EAAcF,EACpBO,EAAM7kF,KAAKuO,IAAM41E,OACZ,GAAiB,SAAb7sD,EACTktD,EAAcD,EAAiBvkF,KAAKylD,OACpCi/B,EAAM1kF,KAAKylD,MAAQ0+B,EACnBS,EAAMJ,EAAcF,EACpBQ,EAAKP,EAAiB5gB,EAAUn1D,MAAQ81E,EACxCU,EAAKrhB,EAAUle,WACV,GAAiB,UAAbnuB,EACTktD,EAAcD,EAAiBvkF,KAAKwO,MACpCs2E,EAAKnhB,EAAUn1D,KACfw2E,EAAKT,EAAiB5gB,EAAUle,OAAS6+B,EACzCI,EAAMF,EAAcF,EACpBM,EAAM5kF,KAAKwO,KAAO21E,OACb,GAAa,MAATvzE,EAAc,CACvB,GAAiB,WAAb0mB,EACFktD,EAAcD,GAAkB5gB,EAAUp1D,IAAMo1D,EAAUje,QAAU,EAAI,SACnE,GAAIh/C,GAAS4wB,GAAW,CAC7B,MAAM4tD,EAAiBvsF,OAAO+C,KAAK47B,GAAU,GACvC35B,EAAQ25B,EAAS4tD,GACvBV,EAAcD,EAAiBvkF,KAAK4gD,MAAMmB,OAAOmjC,GAAgB/e,iBAAiBxoE,IAEpFonF,EAAKphB,EAAUp1D,IACf02E,EAAKthB,EAAUje,OACfi/B,EAAMH,EAAcF,EACpBO,EAAMF,EAAMR,OACP,GAAa,MAATvzE,EAAc,CACvB,GAAiB,WAAb0mB,EACFktD,EAAcD,GAAkB5gB,EAAUn1D,KAAOm1D,EAAUle,OAAS,QAC/D,GAAI/+C,GAAS4wB,GAAW,CAC7B,MAAM4tD,EAAiBvsF,OAAO+C,KAAK47B,GAAU,GACvC35B,EAAQ25B,EAAS4tD,GACvBV,EAAcD,EAAiBvkF,KAAK4gD,MAAMmB,OAAOmjC,GAAgB/e,iBAAiBxoE,IAEpF+mF,EAAMF,EAAcF,EACpBM,EAAMF,EAAMP,EACZW,EAAKnhB,EAAUn1D,KACfw2E,EAAKrhB,EAAUle,MAEjB,MAAM0/B,EAAQ97C,GAAe/rC,EAAQ8oE,MAAM4U,cAAekJ,GACpDzsE,EAAO/c,KAAKC,IAAI,EAAGD,KAAKquB,KAAKm7D,EAAciB,IACjD,IAAKtqF,EAAI,EAAGA,EAAIqpF,EAAarpF,GAAK4c,EAAM,CACtC,MAAM2tE,EAAczjE,EAAKgrC,WAAW3sD,KAAKikD,WAAWppD,IAC9CssD,EAAYi+B,EAAYj+B,UACxBk+B,EAAYD,EAAYjmC,MACxB+X,EAAav1C,EAAKu1C,YAAc,GAChCC,EAAmBiuB,EAAYjuB,iBAC/BulB,EAAY0I,EAAY1I,UACxBC,EAAYyI,EAAYzI,UACxB2I,EAAiBF,EAAYE,gBAAkB,GAC/CC,EAAuBH,EAAYG,qBACzCxH,EAAYH,GAAoB59E,KAAMnF,EAAGiT,QACvBvT,IAAdwjF,IAGJ0G,EAAmB9gC,GAAY/C,EAAOm9B,EAAW52B,GAC7C9qC,EACFqoE,EAAME,EAAME,EAAKE,EAAKP,EAEtBE,EAAME,EAAME,EAAKE,EAAKR,EAExBz7E,EAAM7H,KAAK,CACTujF,IAAAA,EACAC,IAAAA,EACAC,IAAAA,EACAC,IAAAA,EACAC,GAAAA,EACAC,GAAAA,EACAC,GAAAA,EACAC,GAAAA,EACAtvE,MAAOwxC,EACPhI,MAAOkmC,EACPnuB,WAAAA,EACAC,iBAAAA,EACAulB,UAAAA,EACAC,UAAAA,EACA2I,eAAAA,EACAC,qBAAAA,KAKJ,OAFAvlF,KAAKk/E,aAAegF,EACpBlkF,KAAKm/E,aAAeqF,EACbx7E,EAETjJ,mBAAmB4jE,GACjB,MAAM/yD,EAAO5Q,KAAK4Q,KACZtT,EAAU0C,KAAK1C,SACfg6B,SAACA,EAAU8uC,MAAO4d,GAAe1mF,EACjC+e,EAAerc,KAAKqc,eACpB+pD,EAAQpmE,KAAKomE,OACbt9B,MAACA,EAAKs0C,WAAEA,EAAUnH,QAAEA,EAAO6G,OAAEA,GAAUkH,EACvCG,EAAKnG,GAAkB1gF,EAAQqkB,MAC/B6jE,EAAiBrB,EAAKlO,EACtBwP,EAAkB3I,GAAU7G,EAAUuP,EACtC/gC,GAAY3X,GAAU9sC,KAAKw+E,eAC3Bx1E,EAAQ,GACd,IAAInO,EAAGivC,EAAMsuB,EAAMxyC,EAAOiF,EAAGC,EAAGi8B,EAAWnD,EAAO7C,EAAME,EAAYykC,EAAWC,EAC3E3+B,EAAe,SACnB,GAAiB,QAAb1vB,EACFxM,EAAI9qB,KAAK0lD,OAAS+/B,EAClB1+B,EAAY/mD,KAAK4lF,+BACZ,GAAiB,WAAbtuD,EACTxM,EAAI9qB,KAAKuO,IAAMk3E,EACf1+B,EAAY/mD,KAAK4lF,+BACZ,GAAiB,SAAbtuD,EAAqB,CAC9B,MAAM3xB,EAAM3F,KAAK6lF,wBAAwB1B,GACzCp9B,EAAYphD,EAAIohD,UAChBl8B,EAAIllB,EAAIklB,OACH,GAAiB,UAAbyM,EAAsB,CAC/B,MAAM3xB,EAAM3F,KAAK6lF,wBAAwB1B,GACzCp9B,EAAYphD,EAAIohD,UAChBl8B,EAAIllB,EAAIklB,OACH,GAAa,MAATja,EAAc,CACvB,GAAiB,WAAb0mB,EACFxM,GAAM64C,EAAUp1D,IAAMo1D,EAAUje,QAAU,EAAK8/B,OAC1C,GAAI9+E,GAAS4wB,GAAW,CAC7B,MAAM4tD,EAAiBvsF,OAAO+C,KAAK47B,GAAU,GACvC35B,EAAQ25B,EAAS4tD,GACvBp6D,EAAI9qB,KAAK4gD,MAAMmB,OAAOmjC,GAAgB/e,iBAAiBxoE,GAAS6nF,EAElEz+B,EAAY/mD,KAAK4lF,+BACZ,GAAa,MAATh1E,EAAc,CACvB,GAAiB,WAAb0mB,EACFzM,GAAM84C,EAAUn1D,KAAOm1D,EAAUle,OAAS,EAAK+/B,OAC1C,GAAI9+E,GAAS4wB,GAAW,CAC7B,MAAM4tD,EAAiBvsF,OAAO+C,KAAK47B,GAAU,GACvC35B,EAAQ25B,EAAS4tD,GACvBr6D,EAAI7qB,KAAK4gD,MAAMmB,OAAOmjC,GAAgB/e,iBAAiBxoE,GAEzDopD,EAAY/mD,KAAK6lF,wBAAwB1B,GAAIp9B,UAElC,MAATn2C,IACY,UAAVk4B,EACFke,EAAe,MACI,QAAVle,IACTke,EAAe,WAGnB,MAAM66B,EAAa7hF,KAAK8hF,iBACxB,IAAKjnF,EAAI,EAAGivC,EAAOs8B,EAAMxrE,OAAQC,EAAIivC,IAAQjvC,EAAG,CAC9Cu9D,EAAOgO,EAAMvrE,GACb+qB,EAAQwyC,EAAKxyC,MACb,MAAMw/D,EAAcpB,EAAYr3B,WAAW3sD,KAAKikD,WAAWppD,IAC3D+oD,EAAQ5jD,KAAKqmE,gBAAgBxrE,GAAKmpF,EAAY9G,YAC9Cn8B,EAAO/gD,KAAK0jF,wBAAwB7oF,GACpComD,EAAaF,EAAKE,WAClBykC,EAAYh8E,GAAQkc,GAASA,EAAMhrB,OAAS,EAC5C,MAAMkrF,EAAYJ,EAAY,EACxBvmC,EAAQimC,EAAYjmC,MACpBwH,EAAcy+B,EAAYpI,gBAC1Bt2B,EAAc0+B,EAAYrI,gBA2BhC,IAAIgJ,EACJ,GA3BI1pE,GACFwO,EAAI+4B,EAGA+hC,EAFa,QAAbruD,EACiB,SAAf8lD,GAAsC,IAAb34B,GACbihC,EAAYzkC,EAAaA,EAAa,EAC5B,WAAfm8B,GACKyE,EAAWK,QAAQrsE,OAAS,EAAIiwE,EAAY7kC,EAAaA,GAEzD4gC,EAAWK,QAAQrsE,OAASorC,EAAa,EAGtC,SAAfm8B,GAAsC,IAAb34B,EACdxD,EAAa,EACF,WAAfm8B,EACIyE,EAAWK,QAAQrsE,OAAS,EAAIiwE,EAAY7kC,EAE5C4gC,EAAWK,QAAQrsE,OAAS6vE,EAAYzkC,EAGrD67B,IACF6I,IAAe,KAGjB76D,EAAI84B,EACJ+hC,GAAc,EAAID,GAAazkC,EAAa,GAG1CmkC,EAAY/H,kBAAmB,CACjC,MAAM2I,EAAej9B,GAAUq8B,EAAY7H,iBACrC1nE,EAASgsE,EAAWuB,QAAQvoF,GAC5B8a,EAAQksE,EAAWsB,OAAOtoF,GAChC,IAAI0T,EAAMuc,EAAI66D,EAAaK,EAAaz3E,IACpCC,EAAOqc,EAAIm7D,EAAax3E,KAC5B,OAAQw4C,GACR,IAAK,SACHz4C,GAAOsH,EAAS,EAChB,MACF,IAAK,SACHtH,GAAOsH,EAGT,OAAQkxC,GACR,IAAK,SACHv4C,GAAQmH,EAAQ,EAChB,MACF,IAAK,QACHnH,GAAQmH,EAGVowE,EAAW,CACTv3E,KAAAA,EACAD,IAAAA,EACAoH,MAAOA,EAAQqwE,EAAarwE,MAC5BE,OAAQA,EAASmwE,EAAanwE,OAC9BspC,MAAOimC,EAAY9H,eAGvBt0E,EAAM7H,KAAK,CACTsjD,SAAAA,EACA7+B,MAAAA,EACAm7B,KAAAA,EACA5B,MAAAA,EACAwH,YAAAA,EACAD,YAAAA,EACAi/B,WAAAA,EACA5+B,UAAAA,EACAC,aAAAA,EACAH,YAAa,CAACh8B,EAAGC,GACjBi7D,SAAAA,IAGJ,OAAO/8E,EAETjJ,0BACE,MAAMu3B,SAACA,EAAQ8uC,MAAEA,GAASpmE,KAAK1C,QAE/B,IADkBwvC,GAAU9sC,KAAKw+E,eAE/B,MAAoB,QAAblnD,EAAqB,OAAS,QAEvC,IAAIwR,EAAQ,SAMZ,MALoB,UAAhBs9B,EAAMt9B,MACRA,EAAQ,OACiB,QAAhBs9B,EAAMt9B,QACfA,EAAQ,SAEHA,EAET/oC,wBAAwBokF,GACtB,MAAM7sD,SAACA,EAAU8uC,OAAOgX,WAACA,EAAUN,OAAEA,EAAM7G,QAAEA,IAAYj2E,KAAK1C,QAExDkoF,EAAiBrB,EAAKlO,EACtB+L,EAFahiF,KAAK8hF,iBAEEE,OAAOrsE,MACjC,IAAIoxC,EACAl8B,EAoDJ,MAnDiB,SAAbyM,EACEwlD,GACFjyD,EAAI7qB,KAAKylD,MAAQwwB,EACE,SAAfmH,EACFr2B,EAAY,OACY,WAAfq2B,GACTr2B,EAAY,SACZl8B,GAAMm3D,EAAS,IAEfj7B,EAAY,QACZl8B,GAAKm3D,KAGPn3D,EAAI7qB,KAAKylD,MAAQ+/B,EACE,SAAfpI,EACFr2B,EAAY,QACY,WAAfq2B,GACTr2B,EAAY,SACZl8B,GAAMm3D,EAAS,IAEfj7B,EAAY,OACZl8B,EAAI7qB,KAAKwO,OAGS,UAAb8oB,EACLwlD,GACFjyD,EAAI7qB,KAAKwO,KAAOynE,EACG,SAAfmH,EACFr2B,EAAY,QACY,WAAfq2B,GACTr2B,EAAY,SACZl8B,GAAMm3D,EAAS,IAEfj7B,EAAY,OACZl8B,GAAKm3D,KAGPn3D,EAAI7qB,KAAKwO,KAAOg3E,EACG,SAAfpI,EACFr2B,EAAY,OACY,WAAfq2B,GACTr2B,EAAY,SACZl8B,GAAKm3D,EAAS,IAEdj7B,EAAY,QACZl8B,EAAI7qB,KAAKylD,QAIbsB,EAAY,QAEP,CAACA,UAAAA,EAAWl8B,EAAAA,GAErB9qB,oBACE,GAAIC,KAAK1C,QAAQ8oE,MAAM0W,OACrB,OAEF,MAAMl8B,EAAQ5gD,KAAK4gD,MACbtpB,EAAWt3B,KAAK1C,QAAQg6B,SAC9B,MAAiB,SAAbA,GAAoC,UAAbA,EAClB,CAAC/oB,IAAK,EAAGC,KAAMxO,KAAKwO,KAAMk3C,OAAQ9E,EAAM/qC,OAAQ4vC,MAAOzlD,KAAKylD,OAClD,QAAbnuB,GAAmC,WAAbA,EACnB,CAAC/oB,IAAKvO,KAAKuO,IAAKC,KAAM,EAAGk3C,OAAQ1lD,KAAK0lD,OAAQD,MAAO7E,EAAMjrC,YADlE,EAIJ5V,iBACE,MAAMhG,IAACA,EAAKuD,SAASkjD,gBAACA,GAAgBhyC,KAAEA,EAAID,IAAEA,EAAGoH,MAAEA,EAAKE,OAAEA,GAAU7V,KAChEwgD,IACFzmD,EAAIupD,OACJvpD,EAAI+sD,UAAYtG,EAChBzmD,EAAIksF,SAASz3E,EAAMD,EAAKoH,EAAOE,GAC/B9b,EAAI0pD,WAGR1jD,qBAAqBpC,GACnB,MAAMgkB,EAAO3hB,KAAK1C,QAAQqkB,KAC1B,IAAK3hB,KAAK4hF,eAAiBjgE,EAAK8X,QAC9B,OAAO,EAET,MACMpzB,EADQrG,KAAKomE,MACC8f,UAAU5lF,GAAKA,EAAE3C,QAAUA,GAC/C,GAAI0I,GAAS,EAAG,CAEd,OADasb,EAAKgrC,WAAW3sD,KAAKikD,WAAW59C,IACjC8gD,UAEd,OAAO,EAETpnD,SAAS4jE,GACP,MAAMhiD,EAAO3hB,KAAK1C,QAAQqkB,KACpB5nB,EAAMiG,KAAKjG,IACXiP,EAAQhJ,KAAK0+E,iBAAmB1+E,KAAK0+E,eAAiB1+E,KAAKmmF,sBAAsBxiB,IACvF,IAAI9oE,EAAGivC,EACP,MAAMs8C,EAAW,CAAClzC,EAAIC,EAAI90C,KACnBA,EAAMsX,OAAUtX,EAAM8gD,QAG3BplD,EAAIupD,OACJvpD,EAAIotD,UAAY9oD,EAAMsX,MACtB5b,EAAImtD,YAAc7oD,EAAM8gD,MACxBplD,EAAIssF,YAAYhoF,EAAM64D,YAAc,IACpCn9D,EAAIusF,eAAiBjoF,EAAM84D,iBAC3Bp9D,EAAI8qD,YACJ9qD,EAAIirD,OAAO9R,EAAGroB,EAAGqoB,EAAGpoB,GACpB/wB,EAAIkrD,OAAO9R,EAAGtoB,EAAGsoB,EAAGroB,GACpB/wB,EAAIsrD,SACJtrD,EAAI0pD,YAEN,GAAI9hC,EAAK8X,QACP,IAAK5+B,EAAI,EAAGivC,EAAO9gC,EAAMpO,OAAQC,EAAIivC,IAAQjvC,EAAG,CAC9C,MAAMk1B,EAAO/mB,EAAMnO,GACf8mB,EAAK66D,iBACP4J,EACE,CAACv7D,EAAGkF,EAAK+0D,GAAIh6D,EAAGiF,EAAKg1D,IACrB,CAACl6D,EAAGkF,EAAKi1D,GAAIl6D,EAAGiF,EAAKk1D,IACrBl1D,GAGApO,EAAK86D,WACP2J,EACE,CAACv7D,EAAGkF,EAAK20D,IAAK55D,EAAGiF,EAAK40D,KACtB,CAAC95D,EAAGkF,EAAK60D,IAAK95D,EAAGiF,EAAK80D,KACtB,CACE1lC,MAAOpvB,EAAK4sD,UACZhnE,MAAOoa,EAAK2sD,UACZxlB,WAAYnnC,EAAKu1D,eACjBnuB,iBAAkBpnC,EAAKw1D,wBAOnCxlF,aACE,MAAM6gD,MAACA,EAAK7mD,IAAEA,EAAKuD,SAASqkB,KAACA,IAAS3hB,KAChCokF,EAAaziE,EAAKgrC,WAAW3sD,KAAKikD,cAClCogC,EAAY1iE,EAAK46D,WAAa6H,EAAWh/B,YAAc,EAC7D,IAAKi/B,EACH,OAEF,MAAMkC,EAAgB5kE,EAAKgrC,WAAW3sD,KAAKikD,WAAW,IAAIkD,UACpDq9B,EAAcxkF,KAAKm/E,aACzB,IAAI2F,EAAIE,EAAID,EAAIE,EACZjlF,KAAKqc,gBACPyoE,EAAKnhC,GAAY/C,EAAO5gD,KAAKwO,KAAM61E,GAAaA,EAAY,EAC5DW,EAAKrhC,GAAY/C,EAAO5gD,KAAKylD,MAAO8gC,GAAiBA,EAAgB,EACrExB,EAAKE,EAAKT,IAEVO,EAAKphC,GAAY/C,EAAO5gD,KAAKuO,IAAK81E,GAAaA,EAAY,EAC3DY,EAAKthC,GAAY/C,EAAO5gD,KAAK0lD,OAAQ6gC,GAAiBA,EAAgB,EACtEzB,EAAKE,EAAKR,GAEZzqF,EAAIupD,OACJvpD,EAAIotD,UAAYi9B,EAAWh/B,YAC3BrrD,EAAImtD,YAAck9B,EAAW3jC,YAC7B1mD,EAAI8qD,YACJ9qD,EAAIirD,OAAO8/B,EAAIC,GACfhrF,EAAIkrD,OAAO+/B,EAAIC,GACflrF,EAAIsrD,SACJtrD,EAAI0pD,UAEN1jD,WAAW4jE,GAET,IADoB3jE,KAAK1C,QAAQ8oE,MAChB3sC,QACf,OAEF,MAAM1/B,EAAMiG,KAAKjG,IACXwrD,EAAOvlD,KAAKwmF,oBACdjhC,GACFI,GAAS5rD,EAAKwrD,GAEhB,MAAMv8C,EAAQhJ,KAAK2+E,cAAgB3+E,KAAK2+E,YAAc3+E,KAAKymF,mBAAmB9iB,IAC9E,IAAI9oE,EAAGivC,EACP,IAAKjvC,EAAI,EAAGivC,EAAO9gC,EAAMpO,OAAQC,EAAIivC,IAAQjvC,EAAG,CAC9C,MAAMk1B,EAAO/mB,EAAMnO,GACbwoF,EAAWtzD,EAAKgxB,KAChBn7B,EAAQmK,EAAKnK,MACfmK,EAAKg2D,WACPhsF,EAAI+sD,UAAY/2B,EAAKg2D,SAAS5mC,MAC9BplD,EAAIksF,SAASl2D,EAAKg2D,SAASv3E,KAAMuhB,EAAKg2D,SAASx3E,IAAKwhB,EAAKg2D,SAASpwE,MAAOoa,EAAKg2D,SAASlwE,SAGzF2wC,GAAWzsD,EAAK6rB,EAAO,EADfmK,EAAK41D,WACgBtC,EAAUtzD,GAErCw1B,GACFM,GAAW9rD,GAGfgG,YACE,MAAMhG,IAACA,EAAKuD,SAASg6B,SAACA,EAAQ6zC,MAAEA,EAAKzhC,QAAEA,IAAY1pC,KACnD,IAAKmrE,EAAM1xC,QACT,OAEF,MAAMsnB,EAAOiI,GAAOmiB,EAAMpqB,MACpBk1B,EAAUltB,GAAUoiB,EAAM8K,SAC1BntC,EAAQqiC,EAAMriC,MACpB,IAAIh7B,EAASizC,EAAKE,WAAa,EACd,WAAb3pB,GAAsC,WAAbA,GAAyB5wB,GAAS4wB,IAC7DxpB,GAAUmoE,EAAQvwB,OACdh8C,GAAQyhE,EAAMruE,QAChBgR,GAAUizC,EAAKE,YAAckqB,EAAMruE,KAAKlC,OAAS,KAGnDkT,GAAUmoE,EAAQ1nE,IAEpB,MAAMm4E,OAACA,EAAMC,OAAEA,EAAMt/B,SAAEA,EAAQ5C,SAAEA,GAtgCrC,SAAmBnsB,EAAOxqB,EAAQwpB,EAAUwR,GAC1C,MAAMv6B,IAACA,EAAGC,KAAEA,EAAIk3C,OAAEA,EAAMD,MAAEA,EAAK7E,MAAEA,GAAStoB,GACpCqrC,UAACA,EAAS5hB,OAAEA,GAAUnB,EAC5B,IACIyG,EAAUq/B,EAAQC,EADlBliC,EAAW,EAEf,MAAM5uC,EAAS6vC,EAASn3C,EAClBoH,EAAQ8vC,EAAQj3C,EACtB,GAAI8pB,EAAMjc,eAAgB,CAExB,GADAqqE,EAAS39C,GAAeD,EAAOt6B,EAAMi3C,GACjC/+C,GAAS4wB,GAAW,CACtB,MAAM4tD,EAAiBvsF,OAAO+C,KAAK47B,GAAU,GACvC35B,EAAQ25B,EAAS4tD,GACvByB,EAAS5kC,EAAOmjC,GAAgB/e,iBAAiBxoE,GAASkY,EAAS/H,OAEnE64E,EADsB,WAAbrvD,GACCqsC,EAAUje,OAASie,EAAUp1D,KAAO,EAAIsH,EAAS/H,EAElD2vE,GAAenlD,EAAOhB,EAAUxpB,GAE3Cu5C,EAAW5B,EAAQj3C,MACd,CACL,GAAI9H,GAAS4wB,GAAW,CACtB,MAAM4tD,EAAiBvsF,OAAO+C,KAAK47B,GAAU,GACvC35B,EAAQ25B,EAAS4tD,GACvBwB,EAAS3kC,EAAOmjC,GAAgB/e,iBAAiBxoE,GAASgY,EAAQ7H,OAElE44E,EADsB,WAAbpvD,GACCqsC,EAAUn1D,KAAOm1D,EAAUle,OAAS,EAAI9vC,EAAQ7H,EAEjD2vE,GAAenlD,EAAOhB,EAAUxpB,GAE3C64E,EAAS59C,GAAeD,EAAO4c,EAAQn3C,GACvCk2C,EAAwB,SAAbntB,GAAuByU,GAAUA,GAE9C,MAAO,CAAC26C,OAAAA,EAAQC,OAAAA,EAAQt/B,SAAAA,EAAU5C,SAAAA,GAs+BamiC,CAAU5mF,KAAM8N,EAAQwpB,EAAUwR,GAC/E0d,GAAWzsD,EAAKoxE,EAAMruE,KAAM,EAAG,EAAGikD,EAAM,CACtC5B,MAAOgsB,EAAMhsB,MACbkI,SAAAA,EACA5C,SAAAA,EACAsC,UAAWm3B,GAAWp1C,EAAOxR,EAAUoS,GACvCsd,aAAc,SACdH,YAAa,CAAC6/B,EAAQC,KAG1B5mF,KAAK4jE,GACE3jE,KAAK4hF,eAGV5hF,KAAK6mF,iBACL7mF,KAAK8mF,SAASnjB,GACd3jE,KAAKu8E,aACLv8E,KAAK+mF,YACL/mF,KAAKgnF,WAAWrjB,IAElB5jE,UACE,MAAMiV,EAAOhV,KAAK1C,QACZ2pF,EAAKjyE,EAAKoxD,OAASpxD,EAAKoxD,MAAMl/B,GAAK,EACnCggD,EAAK79C,GAAer0B,EAAK2M,MAAQ3M,EAAK2M,KAAKulB,GAAI,GACrD,OAAKlnC,KAAK4hF,cAAgB5hF,KAAKi4D,OAASmmB,GAAMx0E,UAAUquD,KAQjD,CAAC,CACN/wB,EAAGggD,EACHjvB,KAAO0L,IACL3jE,KAAK6mF,iBACL7mF,KAAK8mF,SAASnjB,GACd3jE,KAAK+mF,cAEN,CACD7/C,EAAGggD,EAAK,EACRjvB,KAAM,KACJj4D,KAAKu8E,eAEN,CACDr1C,EAAG+/C,EACHhvB,KAAO0L,IACL3jE,KAAKgnF,WAAWrjB,MAtBX,CAAC,CACNz8B,EAAG+/C,EACHhvB,KAAO0L,IACL3jE,KAAKi4D,KAAK0L,MAuBlB5jE,wBAAwB0B,GACtB,MAAM89E,EAAQv/E,KAAK4gD,MAAM0xB,+BACnB6U,EAASnnF,KAAK4Q,KAAO,SACrBpV,EAAS,GACf,IAAIX,EAAGivC,EACP,IAAKjvC,EAAI,EAAGivC,EAAOy1C,EAAM3kF,OAAQC,EAAIivC,IAAQjvC,EAAG,CAC9C,MAAM4hE,EAAO8iB,EAAM1kF,GACf4hE,EAAK0qB,KAAYnnF,KAAK0I,IAAQjH,GAAQg7D,EAAKh7D,OAASA,GACtDjG,EAAO2F,KAAKs7D,GAGhB,OAAOjhE,EAETuE,wBAAwBsG,GAEtB,OAAO2iD,GADMhpD,KAAK1C,QAAQ8oE,MAAMzZ,WAAW3sD,KAAKikD,WAAW59C,IACxC06C,MAErBhhD,aACE,MAAMqnF,EAAWpnF,KAAK0jF,wBAAwB,GAAGziC,WACjD,OAAQjhD,KAAKqc,eAAiBrc,KAAK2V,MAAQ3V,KAAK6V,QAAUuxE,GAI9D,MAAMC,GACJtnF,YAAY0B,EAAM2+C,EAAOgL,GACvBprD,KAAKyB,KAAOA,EACZzB,KAAKogD,MAAQA,EACbpgD,KAAKorD,SAAWA,EAChBprD,KAAKgJ,MAAQrQ,OAAOC,OAAO,MAE7BmH,UAAU0B,GACR,OAAO9I,OAAOiR,UAAU09E,cAActlF,KAAKhC,KAAKyB,KAAKmI,UAAWnI,EAAKmI,WAEvE7J,SAASgwB,GACP,MAAM7mB,EAAQvQ,OAAOozD,eAAeh8B,GACpC,IAAIw3D,GA+DR,SAA2Br+E,GACzB,MAAO,OAAQA,GAAS,aAAcA,GA/DhCs+E,CAAkBt+E,KACpBq+E,EAAcvnF,KAAKynF,SAASv+E,IAE9B,MAAMF,EAAQhJ,KAAKgJ,MACbN,EAAKqnB,EAAKrnB,GACV03C,EAAQpgD,KAAKogD,MAAQ,IAAM13C,EACjC,IAAKA,EACH,MAAM,IAAI3H,MAAM,2BAA6BgvB,GAE/C,OAAIrnB,KAAMM,IAGVA,EAAMN,GAAMqnB,EAyBhB,SAA0BA,EAAMqwB,EAAOmnC,GACrC,MAAMG,EAAej9C,GAAM9xC,OAAOC,OAAO,MAAO,CAC9C2uF,EAAct1D,GAAS7oB,IAAIm+E,GAAe,GAC1Ct1D,GAAS7oB,IAAIg3C,GACbrwB,EAAKkC,WAEPA,GAAS1zB,IAAI6hD,EAAOsnC,GAChB33D,EAAKkqD,eAOX,SAAuB75B,EAAOunC,GAC5BhvF,OAAO+C,KAAKisF,GAAQ5uF,QAAQosB,IAC1B,MAAMyiE,EAAgBziE,EAASza,MAAM,KAC/Bm9E,EAAaD,EAAc5kF,MAC3B8kF,EAAc,CAAC1nC,GAAOylB,OAAO+hB,GAAev2E,KAAK,KACjD02E,EAAQJ,EAAOxiE,GAAUza,MAAM,KAC/B03C,EAAa2lC,EAAM/kF,MACnBm/C,EAAc4lC,EAAM12E,KAAK,KAC/B4gB,GAASurD,MAAMsK,EAAaD,EAAY1lC,EAAaC,KAdrD4lC,CAAc5nC,EAAOrwB,EAAKkqD,eAExBlqD,EAAK9xB,aACPg0B,GAASiwB,SAAS9B,EAAOrwB,EAAK9xB,aAnC9BgqF,CAAiBl4D,EAAMqwB,EAAOmnC,GAC1BvnF,KAAKorD,UACPn5B,GAASm5B,SAASr7B,EAAKrnB,GAAIqnB,EAAK3a,YALzBgrC,EASXrgD,IAAI2I,GACF,OAAO1I,KAAKgJ,MAAMN,GAEpB3I,WAAWgwB,GACT,MAAM/mB,EAAQhJ,KAAKgJ,MACbN,EAAKqnB,EAAKrnB,GACV03C,EAAQpgD,KAAKogD,MACf13C,KAAMM,UACDA,EAAMN,GAEX03C,GAAS13C,KAAMupB,GAASmuB,YACnBnuB,GAASmuB,GAAO13C,GACnB1I,KAAKorD,iBACAh2C,GAAU1M,KAwHzB,IAAIw/E,GAAW,IAtFf,MACEnoF,cACEC,KAAKqxE,YAAc,IAAIgW,GAAc7oB,GAAmB,YAAY,GACpEx+D,KAAK8gD,SAAW,IAAIumC,GAActN,GAAS,YAC3C/5E,KAAK6hD,QAAU,IAAIwlC,GAAc1uF,OAAQ,WACzCqH,KAAK+hD,OAAS,IAAIslC,GAAcjJ,GAAO,UACvCp+E,KAAKmoF,iBAAmB,CAACnoF,KAAKqxE,YAAarxE,KAAK+hD,OAAQ/hD,KAAK8gD,UAE/D/gD,OAAO2L,GACL1L,KAAKooF,MAAM,WAAY18E,GAEzB3L,UAAU2L,GACR1L,KAAKooF,MAAM,aAAc18E,GAE3B3L,kBAAkB2L,GAChB1L,KAAKooF,MAAM,WAAY18E,EAAM1L,KAAKqxE,aAEpCtxE,eAAe2L,GACb1L,KAAKooF,MAAM,WAAY18E,EAAM1L,KAAK8gD,UAEpC/gD,cAAc2L,GACZ1L,KAAKooF,MAAM,WAAY18E,EAAM1L,KAAK6hD,SAEpC9hD,aAAa2L,GACX1L,KAAKooF,MAAM,WAAY18E,EAAM1L,KAAK+hD,QAEpChiD,cAAc2I,GACZ,OAAO1I,KAAKqoF,KAAK3/E,EAAI1I,KAAKqxE,YAAa,cAEzCtxE,WAAW2I,GACT,OAAO1I,KAAKqoF,KAAK3/E,EAAI1I,KAAK8gD,SAAU,WAEtC/gD,UAAU2I,GACR,OAAO1I,KAAKqoF,KAAK3/E,EAAI1I,KAAK6hD,QAAS,UAErC9hD,SAAS2I,GACP,OAAO1I,KAAKqoF,KAAK3/E,EAAI1I,KAAK+hD,OAAQ,SAEpChiD,qBAAqB2L,GACnB1L,KAAKooF,MAAM,aAAc18E,EAAM1L,KAAKqxE,aAEtCtxE,kBAAkB2L,GAChB1L,KAAKooF,MAAM,aAAc18E,EAAM1L,KAAK8gD,UAEtC/gD,iBAAiB2L,GACf1L,KAAKooF,MAAM,aAAc18E,EAAM1L,KAAK6hD,SAEtC9hD,gBAAgB2L,GACd1L,KAAKooF,MAAM,aAAc18E,EAAM1L,KAAK+hD,QAEtChiD,MAAMiX,EAAQtL,EAAM48E,GAClB,IAAI58E,GAAM3S,QAAQwvF,IAChB,MAAMC,EAAMF,GAAiBtoF,KAAKyoF,oBAAoBF,GAClDD,GAAiBE,EAAIE,UAAUH,IAASC,IAAQxoF,KAAK6hD,SAAW0mC,EAAI7/E,GACtE1I,KAAK2oF,MAAM3xE,EAAQwxE,EAAKD,GAExB55E,GAAK45E,EAAKx4D,IACR,MAAM64D,EAAUN,GAAiBtoF,KAAKyoF,oBAAoB14D,GAC1D/vB,KAAK2oF,MAAM3xE,EAAQ4xE,EAAS74D,OAKpChwB,MAAMiX,EAAQkxE,EAAUrnF,GACtB,MAAMgoF,EAAc19C,GAAYn0B,GAChC/T,GAASpC,EAAU,SAAWgoF,GAAc,GAAIhoF,GAChDqnF,EAASlxE,GAAQnW,GACjBoC,GAASpC,EAAU,QAAUgoF,GAAc,GAAIhoF,GAEjDd,oBAAoB0B,GAClB,IAAK,IAAI5G,EAAI,EAAGA,EAAImF,KAAKmoF,iBAAiBvtF,OAAQC,IAAK,CACrD,MAAM2tF,EAAMxoF,KAAKmoF,iBAAiBttF,GAClC,GAAI2tF,EAAIE,UAAUjnF,GAChB,OAAO+mF,EAGX,OAAOxoF,KAAK6hD,QAEd9hD,KAAK2I,EAAI4/E,EAAe7mF,GACtB,MAAMsuB,EAAOu4D,EAAcl/E,IAAIV,GAC/B,QAAanO,IAATw1B,EACF,MAAM,IAAIhvB,MAAM,IAAM2H,EAAK,yBAA2BjH,EAAO,KAE/D,OAAOsuB,IAKX,MAAM+4D,GACJ/oF,cACEC,KAAK+oF,MAAQ,GAEfhpF,OAAO6gD,EAAOooC,EAAMt9E,EAAM9G,GACX,eAATokF,IACFhpF,KAAK+oF,MAAQ/oF,KAAKipF,mBAAmBroC,GAAO,GAC5C5gD,KAAKq4D,QAAQr4D,KAAK+oF,MAAOnoC,EAAO,YAElC,MAAM3iD,EAAc2G,EAAS5E,KAAKsgD,aAAaM,GAAOh8C,OAAOA,GAAU5E,KAAKsgD,aAAaM,GACnFplD,EAASwE,KAAKq4D,QAAQp6D,EAAa2iD,EAAOooC,EAAMt9E,GAKtD,MAJa,iBAATs9E,IACFhpF,KAAKq4D,QAAQp6D,EAAa2iD,EAAO,QACjC5gD,KAAKq4D,QAAQr4D,KAAK+oF,MAAOnoC,EAAO,cAE3BplD,EAETuE,QAAQ9B,EAAa2iD,EAAOooC,EAAMt9E,GAChCA,EAAOA,GAAQ,GACf,IAAK,MAAMw9E,KAAcjrF,EAAa,CACpC,MAAMkrF,EAASD,EAAWC,OAG1B,IAAyC,IAArClmF,GAFWkmF,EAAOH,GACP,CAACpoC,EAAOl1C,EAAMw9E,EAAW5rF,SACX6rF,IAAqBz9E,EAAKuB,WACrD,OAAO,EAGX,OAAO,EAETlN,aACOkpC,GAAcjpC,KAAK0lE,UACtB1lE,KAAKopF,UAAYppF,KAAK0lE,OACtB1lE,KAAK0lE,YAASnrE,GAGlBwF,aAAa6gD,GACX,GAAI5gD,KAAK0lE,OACP,OAAO1lE,KAAK0lE,OAEd,MAAMznE,EAAc+B,KAAK0lE,OAAS1lE,KAAKipF,mBAAmBroC,GAE1D,OADA5gD,KAAKqpF,oBAAoBzoC,GAClB3iD,EAET8B,mBAAmB6gD,EAAO8a,GACxB,MAAMZ,EAASla,GAASA,EAAMka,OACxBx9D,EAAU+rC,GAAeyxB,EAAOx9D,SAAWw9D,EAAOx9D,QAAQukD,QAAS,IACnEA,EAWV,SAAoBiZ,GAClB,MAAMjZ,EAAU,GACVnmD,EAAO/C,OAAO+C,KAAKwsF,GAASrmC,QAAQ74C,OAC1C,IAAK,IAAInO,EAAI,EAAGA,EAAIa,EAAKd,OAAQC,IAC/BgnD,EAAQ1gD,KAAK+mF,GAASoB,UAAU5tF,EAAKb,KAEvC,MAAMgJ,EAAQi3D,EAAOjZ,SAAW,GAChC,IAAK,IAAIhnD,EAAI,EAAGA,EAAIgJ,EAAMjJ,OAAQC,IAAK,CACrC,MAAMsuF,EAAStlF,EAAMhJ,IACY,IAA7BgnD,EAAQtiD,QAAQ4pF,IAClBtnC,EAAQ1gD,KAAKgoF,GAGjB,OAAOtnC,EAxBW0nC,CAAWzuB,GAC3B,OAAmB,IAAZx9D,GAAsBo+D,EAkCjC,SAA2B9a,EAAOiB,EAASvkD,EAASo+D,GAClD,MAAMlgE,EAAS,GACT8J,EAAUs7C,EAAMqD,aACtB,IAAK,IAAIppD,EAAI,EAAGA,EAAIgnD,EAAQjnD,OAAQC,IAAK,CACvC,MAAMsuF,EAAStnC,EAAQhnD,GACjB6N,EAAKygF,EAAOzgF,GACZsM,EAAOw0E,GAAQlsF,EAAQoL,GAAKgzD,GACrB,OAAT1mD,GAGJxZ,EAAO2F,KAAK,CACVgoF,OAAAA,EACA7rF,QAASmsF,GAAW7oC,EAAMka,OAAQquB,EAAQn0E,EAAM1P,KAGpD,OAAO9J,EAjDmCkuF,CAAkB9oC,EAAOiB,EAASvkD,EAASo+D,GAAhD,GAErC37D,oBAAoB6gD,GAClB,MAAM+oC,EAAsB3pF,KAAKopF,WAAa,GACxCnrF,EAAc+B,KAAK0lE,OACnBvoD,EAAO,CAAChkB,EAAGC,IAAMD,EAAEyL,OAAOimB,IAAMzxB,EAAEwwF,KAAK9+D,GAAKD,EAAEs+D,OAAOzgF,KAAOoiB,EAAEq+D,OAAOzgF,KAC3E1I,KAAKq4D,QAAQl7C,EAAKwsE,EAAqB1rF,GAAc2iD,EAAO,QAC5D5gD,KAAKq4D,QAAQl7C,EAAKlf,EAAa0rF,GAAsB/oC,EAAO,UAkBhE,SAAS4oC,GAAQlsF,EAASo+D,GACxB,OAAKA,IAAmB,IAAZp+D,GAGI,IAAZA,EACK,GAEFA,EALE,KAwBX,SAASmsF,GAAW3uB,EAAQquB,EAAQn0E,EAAM1P,GACxC,MAAM5J,EAAOo/D,EAAO+uB,gBAAgBV,GAC9B1+B,EAASqQ,EAAO0G,gBAAgBxsD,EAAMtZ,GAC5C,OAAOo/D,EAAO2G,eAAehX,EAAQnlD,EAAS,CAAC,IAAK,CAAC+nD,YAAY,EAAOC,WAAW,EAAOH,SAAS,IAGrG,SAAS28B,GAAaroF,EAAMnE,GAC1B,MAAMysF,EAAkB93D,GAASyuB,SAASj/C,IAAS,GAEnD,QADwBnE,EAAQojD,UAAY,IAAIj/C,IAAS,IACnC6/C,WAAahkD,EAAQgkD,WAAayoC,EAAgBzoC,WAAa,IAsBvF,SAAS0oC,GAActhF,EAAIuhF,GACzB,MAAW,MAAPvhF,GAAqB,MAAPA,EACTA,EAEFuhF,EAAar5E,OAXH,SADO0mB,EAYqB2yD,EAAa3yD,WAXnB,WAAbA,EACjB,IAEQ,SAAbA,GAAoC,UAAbA,EAClB,SADT,IAQuE5uB,EAAG2iC,OAAO,GAAG70B,cAZtF,IAA0B8gB,EAoD1B,SAAS4yD,GAAYpvB,GACnB,MAAMx9D,EAAUw9D,EAAOx9D,UAAYw9D,EAAOx9D,QAAU,IACpDA,EAAQukD,QAAUxY,GAAe/rC,EAAQukD,QAAS,IAClDvkD,EAAQykD,OAzCV,SAA0B+Y,EAAQx9D,GAChC,MAAM6sF,EAAgB/0E,GAAU0lD,EAAOr5D,OAAS,CAACsgD,OAAQ,IACnDqoC,EAAe9sF,EAAQykD,QAAU,GACjCsoC,EAAiBP,GAAahvB,EAAOr5D,KAAMnE,GAC3CgtF,EAAW3xF,OAAOC,OAAO,MACzBmpD,EAASppD,OAAOC,OAAO,MA+B7B,OA9BAD,OAAO+C,KAAK0uF,GAAcrxF,QAAQ2P,IAChC,MAAM6hF,EAAYH,EAAa1hF,GAC/B,IAAKhC,GAAS6jF,GACZ,OAAOrhC,QAAQshC,MAAM,0CAA0C9hF,GAEjE,GAAI6hF,EAAUh+B,OACZ,OAAOrD,QAAQC,KAAK,kDAAkDzgD,GAExE,MAAMkI,EAAOo5E,GAActhF,EAAI6hF,GACzBE,EAhCV,SAAmC75E,EAAM0wC,GACvC,OAAO1wC,IAAS0wC,EAAY,UAAY,UA+BpBopC,CAA0B95E,EAAMy5E,GAC5CM,EAAsBR,EAAcpoC,QAAU,GACpDuoC,EAAS15E,GAAQ05E,EAAS15E,IAASlI,EACnCq5C,EAAOr5C,GAAMkiC,GAAQjyC,OAAOC,OAAO,MAAO,CAAC,CAACgY,KAAAA,GAAO25E,EAAWI,EAAoB/5E,GAAO+5E,EAAoBF,OAE/G3vB,EAAO/9D,KAAK2jD,SAAS3nD,QAAQ2mE,IAC3B,MAAMj+D,EAAOi+D,EAAQj+D,MAAQq5D,EAAOr5D,KAC9B6/C,EAAYoe,EAAQpe,WAAawoC,GAAaroF,EAAMnE,GAEpDqtF,GADkBv1E,GAAU3T,IAAS,IACCsgD,QAAU,GACtDppD,OAAO+C,KAAKivF,GAAqB5xF,QAAQ6xF,IACvC,MAAMh6E,EApDZ,SAAmClI,EAAI44C,GACrC,IAAI1wC,EAAOlI,EAMX,MALW,YAAPA,EACFkI,EAAO0wC,EACS,YAAP54C,IACTkI,EAAqB,MAAd0wC,EAAoB,IAAM,KAE5B1wC,EA6CUi6E,CAA0BD,EAAWtpC,GAC5C54C,EAAKg3D,EAAQ9uD,EAAO,WAAa05E,EAAS15E,IAASA,EACzDmxC,EAAOr5C,GAAMq5C,EAAOr5C,IAAO/P,OAAOC,OAAO,MACzCgyC,GAAQmX,EAAOr5C,GAAK,CAAC,CAACkI,KAAAA,GAAOw5E,EAAa1hF,GAAKiiF,EAAoBC,SAGvEjyF,OAAO+C,KAAKqmD,GAAQhpD,QAAQqF,IAC1B,MAAMk6B,EAAQypB,EAAO3jD,GACrBwsC,GAAQtS,EAAO,CAACrG,GAAS8vB,OAAOzpB,EAAM72B,MAAOwwB,GAASqG,UAEjDypB,EAKU+oC,CAAiBhwB,EAAQx9D,GAE5C,SAASytF,GAAShuF,GAIhB,OAHAA,EAAOA,GAAQ,IACV2jD,SAAW3jD,EAAK2jD,UAAY,GACjC3jD,EAAKilE,OAASjlE,EAAKilE,QAAU,GACtBjlE,EAQT,MAAMiuF,GAAW,IAAIzlF,IACf0lF,GAAa,IAAIrvF,IACvB,SAASsvF,GAAWt3B,EAAUu3B,GAC5B,IAAIzvF,EAAOsvF,GAAS5hF,IAAIwqD,GAMxB,OALKl4D,IACHA,EAAOyvF,IACPH,GAASzsF,IAAIq1D,EAAUl4D,GACvBuvF,GAAW/nF,IAAIxH,IAEVA,EAET,MAAM0vF,GAAa,CAAC7sF,EAAKiI,EAAKpI,KAC5B,MAAM4W,EAAOi2B,GAAiBzkC,EAAKpI,QACtB7D,IAATya,GACFzW,EAAI2E,IAAI8R,IAGZ,MAAMq2E,GACJtrF,YAAY+6D,GACV96D,KAAKsrF,QAzBT,SAAoBxwB,GAIlB,OAHAA,EAASA,GAAU,IACZ/9D,KAAOguF,GAASjwB,EAAO/9D,MAC9BmtF,GAAYpvB,GACLA,EAqBUywB,CAAWzwB,GAC1B96D,KAAKwrF,YAAc,IAAIjmF,IACvBvF,KAAKyrF,eAAiB,IAAIlmF,IAE5B8P,eACE,OAAOrV,KAAKsrF,QAAQj2E,SAEtB5T,WACE,OAAOzB,KAAKsrF,QAAQ7pF,KAEtBA,SAASA,GACPzB,KAAKsrF,QAAQ7pF,KAAOA,EAEtB1E,WACE,OAAOiD,KAAKsrF,QAAQvuF,KAEtBA,SAASA,GACPiD,KAAKsrF,QAAQvuF,KAAOguF,GAAShuF,GAE/BO,cACE,OAAO0C,KAAKsrF,QAAQhuF,QAEtBA,YAAYA,GACV0C,KAAKsrF,QAAQhuF,QAAUA,EAEzBukD,cACE,OAAO7hD,KAAKsrF,QAAQzpC,QAEtB9hD,SACE,MAAM+6D,EAAS96D,KAAKsrF,QACpBtrF,KAAK0rF,aACLxB,GAAYpvB,GAEd/6D,aACEC,KAAKwrF,YAAYroF,QACjBnD,KAAKyrF,eAAetoF,QAEtBpD,iBAAiB4rF,GACf,OAAOT,GAAWS,EAChB,IAAM,CAAC,CACL,YAAYA,EACZ,MAGN5rF,0BAA0B4rF,EAAargF,GACrC,OAAO4/E,GAAW,GAAGS,gBAA0BrgF,IAC7C,IAAM,CACJ,CACE,YAAYqgF,iBAA2BrgF,IACvC,eAAeA,GAEjB,CACE,YAAYqgF,EACZ,MAIR5rF,wBAAwB4rF,EAAaxnB,GACnC,OAAO+mB,GAAW,GAAGS,KAAexnB,IAClC,IAAM,CAAC,CACL,YAAYwnB,cAAwBxnB,IACpC,YAAYwnB,EACZ,YAAYxnB,EACZ,MAGNpkE,gBAAgBopF,GACd,MAAMzgF,EAAKygF,EAAOzgF,GAElB,OAAOwiF,GAAW,GADLlrF,KAAKyB,eACkBiH,IAClC,IAAM,CAAC,CACL,WAAWA,KACRygF,EAAOyC,wBAA0B,MAG1C7rF,cAAc8rF,EAAWC,GACvB,MAAMN,EAAcxrF,KAAKwrF,YACzB,IAAI7oD,EAAQ6oD,EAAYpiF,IAAIyiF,GAK5B,OAJKlpD,IAASmpD,IACZnpD,EAAQ,IAAIp9B,IACZimF,EAAYjtF,IAAIstF,EAAWlpD,IAEtBA,EAET5iC,gBAAgB8rF,EAAWE,EAAUD,GACnC,MAAMxuF,QAACA,EAAOmE,KAAEA,GAAQzB,KAClB2iC,EAAQ3iC,KAAKgsF,cAAcH,EAAWC,GACtCxtB,EAAS37B,EAAMv5B,IAAI2iF,GACzB,GAAIztB,EACF,OAAOA,EAET,MAAM7T,EAAS,IAAI7uD,IACnBmwF,EAAShzF,QAAQ2C,IACXmwF,IACFphC,EAAOvnD,IAAI2oF,GACXnwF,EAAK3C,QAAQqF,GAAOgtF,GAAW3gC,EAAQohC,EAAWztF,KAEpD1C,EAAK3C,QAAQqF,GAAOgtF,GAAW3gC,EAAQntD,EAASc,IAChD1C,EAAK3C,QAAQqF,GAAOgtF,GAAW3gC,EAAQr1C,GAAU3T,IAAS,GAAIrD,IAC9D1C,EAAK3C,QAAQqF,GAAOgtF,GAAW3gC,EAAQx4B,GAAU7zB,IACjD1C,EAAK3C,QAAQqF,GAAOgtF,GAAW3gC,EAAQxsD,GAAaG,MAEtD,MAAMyuC,EAAQpsC,MAAMC,KAAK+pD,GAOzB,OANqB,IAAjB5d,EAAMjyC,QACRiyC,EAAM1rC,KAAKxI,OAAOC,OAAO,OAEvBqyF,GAAWpvF,IAAIkwF,IACjBppD,EAAMpkC,IAAIwtF,EAAUl/C,GAEfA,EAET9sC,oBACE,MAAMzC,QAACA,EAAOmE,KAAEA,GAAQzB,KACxB,MAAO,CACL1C,EACA8X,GAAU3T,IAAS,GACnBwwB,GAASyuB,SAASj/C,IAAS,GAC3B,CAACA,KAAAA,GACDwwB,GACAh0B,IAGJ8B,oBAAoB0qD,EAAQ9V,EAAOrvC,EAASolD,EAAW,CAAC,KACtD,MAAMlvD,EAAS,CAAC4/D,SAAS,IACnBpO,SAACA,EAAQi/B,YAAEA,GAAeC,GAAYlsF,KAAKyrF,eAAgBhhC,EAAQC,GACzE,IAAIptD,EAAU0vD,EACd,GAsCJ,SAAqBvB,EAAO9W,GAC1B,MAAMkY,aAACA,EAAYE,YAAEA,GAAezM,GAAamL,GACjD,IAAK,MAAM/8C,KAAQimC,EAAO,CACxB,MAAM0Y,EAAaR,EAAan+C,GAC1B4+C,EAAYP,EAAYr+C,GACxB/Q,GAAS2vD,GAAaD,IAAe5B,EAAM/8C,GACjD,GAAK2+C,IAAe7hB,GAAW7tC,IAAUwuF,GAAYxuF,KAC/C2vD,GAAa5jD,GAAQ/L,GACzB,OAAO,EAGX,OAAO,EAjDDyuF,CAAYp/B,EAAUrY,GAAQ,CAChCn5C,EAAO4/D,SAAU,EAGjB99D,EAAU8uD,GAAeY,EAFzB1nD,EAAUkmC,GAAWlmC,GAAWA,IAAYA,EACxBtF,KAAKyhE,eAAehX,EAAQnlD,EAAS2mF,IAG3D,IAAK,MAAMv9E,KAAQimC,EACjBn5C,EAAOkT,GAAQpR,EAAQoR,GAEzB,OAAOlT,EAETuE,eAAe0qD,EAAQnlD,EAASolD,EAAW,CAAC,IAAK4B,GAC/C,MAAMU,SAACA,GAAYk/B,GAAYlsF,KAAKyrF,eAAgBhhC,EAAQC,GAC5D,OAAOhkD,GAASpB,GACZ8mD,GAAeY,EAAU1nD,OAAS/K,EAAW+xD,GAC7CU,GAGR,SAASk/B,GAAYG,EAAe5hC,EAAQC,GAC1C,IAAI/nB,EAAQ0pD,EAAcjjF,IAAIqhD,GACzB9nB,IACHA,EAAQ,IAAIp9B,IACZ8mF,EAAc9tF,IAAIksD,EAAQ9nB,IAE5B,MAAMixB,EAAWlJ,EAASr5C,OAC1B,IAAIitD,EAAS37B,EAAMv5B,IAAIwqD,GACvB,IAAK0K,EAAQ,CAEXA,EAAS,CACPtR,SAFexC,GAAgBC,EAAQC,GAGvCuhC,YAAavhC,EAAS9lD,OAAOxJ,IAAMA,EAAEob,cAAc0qB,SAAS,WAE9DyB,EAAMpkC,IAAIq1D,EAAU0K,GAEtB,OAAOA,EAET,MAAM6tB,GAAcxuF,GAAS+I,GAAS/I,IACjChF,OAAOuiE,oBAAoBv9D,GAAO86D,OAAO,CAACC,EAAKt6D,IAAQs6D,GAAOltB,GAAW7tC,EAAMS,KAAO,GAiB3F,MAAMkuF,GAAkB,CAAC,MAAO,SAAU,OAAQ,QAAS,aAC3D,SAASC,GAAqBj1D,EAAU1mB,GACtC,MAAoB,QAAb0mB,GAAmC,WAAbA,IAAiE,IAAvCg1D,GAAgB/sF,QAAQ+3B,IAA6B,MAAT1mB,EAErG,SAAS47E,GAAcC,EAAIC,GACzB,OAAO,SAASvzF,EAAGC,GACjB,OAAOD,EAAEszF,KAAQrzF,EAAEqzF,GACftzF,EAAEuzF,GAAMtzF,EAAEszF,GACVvzF,EAAEszF,GAAMrzF,EAAEqzF,IAGlB,SAASE,GAAqBrnF,GAC5B,MAAMs7C,EAAQt7C,EAAQs7C,MAChBwZ,EAAmBxZ,EAAMtjD,QAAQijD,UACvCK,EAAM0gC,cAAc,eACpBr+E,GAASm3D,GAAoBA,EAAiBwyB,WAAY,CAACtnF,GAAUs7C,GAEvE,SAASisC,GAAoBvnF,GAC3B,MAAMs7C,EAAQt7C,EAAQs7C,MAChBwZ,EAAmBxZ,EAAMtjD,QAAQijD,UACvCt9C,GAASm3D,GAAoBA,EAAiB0yB,WAAY,CAACxnF,GAAUs7C,GAEvE,SAASmsC,GAAUh9D,GASjB,OARI4gC,MAAqC,iBAAT5gC,EAC9BA,EAAOr2B,SAASuN,eAAe8oB,GACtBA,GAAQA,EAAKn1B,SACtBm1B,EAAOA,EAAK,IAEVA,GAAQA,EAAKi0B,SACfj0B,EAAOA,EAAKi0B,QAEPj0B,EAET,MAAMi9D,GAAY,GACZC,GAAY7uF,IAChB,MAAM4lD,EAAS+oC,GAAU3uF,GACzB,OAAOzF,OAAO0nD,OAAO2sC,IAAWpoF,OAAQrE,GAAMA,EAAEyjD,SAAWA,GAAQhhD,OAErE,SAASkqF,GAAgB1mF,EAAK2a,EAAOG,GACnC,MAAM5lB,EAAO/C,OAAO+C,KAAK8K,GACzB,IAAK,MAAMpI,KAAO1C,EAAM,CACtB,MAAMyxF,GAAU/uF,EAChB,GAAI+uF,GAAUhsE,EAAO,CACnB,MAAMxjB,EAAQ6I,EAAIpI,UACXoI,EAAIpI,IACPkjB,EAAO,GAAK6rE,EAAShsE,KACvB3a,EAAI2mF,EAAS7rE,GAAQ3jB,KAc7B,MAAMyvF,GACJrtF,YAAYgwB,EAAMs9D,GAChB,MAAMvyB,EAAS96D,KAAK86D,OAAS,IAAIuwB,GAAOgC,GAClCC,EAAgBP,GAAUh9D,GAC1Bw9D,EAAgBN,GAASK,GAC/B,GAAIC,EACF,MAAM,IAAIxsF,MACR,4CAA+CwsF,EAAc7kF,GAA7D,wDAIJ,MAAMpL,EAAUw9D,EAAO2G,eAAe3G,EAAO0yB,oBAAqBxtF,KAAKikD,cACvEjkD,KAAKqV,SAAW,IAAKylD,EAAOzlD,UAphEhC,SAAyB2uC,GACvB,OAAK2M,MAAiD,oBAApB88B,iBAAmCzpC,aAAkBypC,gBAC9EnW,GAEFgC,GAghEmCoU,CAAgBJ,IACxDttF,KAAKqV,SAASs4E,aAAa7yB,GAC3B,MAAMx1D,EAAUtF,KAAKqV,SAASu4E,eAAeN,EAAehwF,EAAQ00D,aAC9DhO,EAAS1+C,GAAWA,EAAQ0+C,OAC5BnuC,EAASmuC,GAAUA,EAAOnuC,OAC1BF,EAAQquC,GAAUA,EAAOruC,MAC/B3V,KAAK0I,GAAKsgC,KACVhpC,KAAKjG,IAAMuL,EACXtF,KAAKgkD,OAASA,EACdhkD,KAAK2V,MAAQA,EACb3V,KAAK6V,OAASA,EACd7V,KAAK6tF,SAAWvwF,EAChB0C,KAAK8tF,aAAe9tF,KAAKgyD,YACzBhyD,KAAKm2E,QAAU,GACfn2E,KAAK+tF,UAAY,GACjB/tF,KAAKu9D,aAAUhjE,EACfyF,KAAK21E,MAAQ,GACb31E,KAAK6jD,6BAA0BtpD,EAC/ByF,KAAK2jE,eAAYppE,EACjByF,KAAKk4D,QAAU,GACfl4D,KAAKguF,gBAAazzF,EAClByF,KAAKiuF,WAAa,GAClBjuF,KAAKkuF,0BAAuB3zF,EAC5ByF,KAAKmuF,gBAAkB,GACvBnuF,KAAK+hD,OAAS,GACd/hD,KAAKouF,SAAW,IAAItF,GACpB9oF,KAAK65E,SAAW,GAChB75E,KAAKquF,eAAiB,GACtBruF,KAAKsuF,UAAW,EAChBtuF,KAAK0kE,yBAAsBnqE,EAC3ByF,KAAKo/D,cAAW7kE,EAChByF,KAAKuuF,UD9uKT,SAAkB91F,EAAI+X,GACpB,IAAIyoB,EACJ,OAAO,YAAYvtB,GAOjB,OANI8E,GACF7H,aAAaswB,GACbA,EAAUxwB,WAAWhQ,EAAI+X,EAAO9E,IAEhCjT,EAAG2T,MAAMpM,KAAM0L,GAEV8E,GCquKUg+E,CAAShtC,GAAQxhD,KAAK+C,OAAOy+C,GAAOlkD,EAAQmxF,aAAe,GAC5EzuF,KAAKslE,aAAe,GACpB0nB,GAAUhtF,KAAK0I,IAAM1I,KAChBsF,GAAY0+C,GAIjBqT,GAASl6D,OAAO6C,KAAM,WAAY2sF,IAClCt1B,GAASl6D,OAAO6C,KAAM,WAAY6sF,IAClC7sF,KAAK0uF,cACD1uF,KAAKsuF,UACPtuF,KAAK+C,UAPLmmD,QAAQshC,MAAM,qEAUlBx4B,kBACE,MAAO10D,SAAS00D,YAACA,EAAWtQ,oBAAEA,GAAoB/rC,MAAEA,EAAKE,OAAEA,EAAMi4E,aAAEA,GAAgB9tF,KACnF,OAAKipC,GAAc+oB,GAGftQ,GAAuBosC,EAClBA,EAEFj4E,EAASF,EAAQE,EAAS,KALxBm8C,EAOXj1D,WACE,OAAOiD,KAAK86D,OAAO/9D,KAErBA,SAASA,GACPiD,KAAK86D,OAAO/9D,KAAOA,EAErBO,cACE,OAAO0C,KAAK6tF,SAEdvwF,YAAYA,GACV0C,KAAK86D,OAAOx9D,QAAUA,EAExByC,cASE,OARAC,KAAKshF,cAAc,cACfthF,KAAK1C,QAAQwkD,WACf9hD,KAAKy6D,SAELhI,GAAYzyD,KAAMA,KAAK1C,QAAQqjD,kBAEjC3gD,KAAK2uF,aACL3uF,KAAKshF,cAAc,aACZthF,KAETD,QAEE,OADAgkD,GAAY/jD,KAAKgkD,OAAQhkD,KAAKjG,KACvBiG,KAETD,OAEE,OADAs3D,GAASz5B,KAAK59B,MACPA,KAETD,OAAO4V,EAAOE,GACPwhD,GAASn3C,QAAQlgB,MAGpBA,KAAK4uF,kBAAoB,CAACj5E,MAAAA,EAAOE,OAAAA,GAFjC7V,KAAK6uF,QAAQl5E,EAAOE,GAKxB9V,QAAQ4V,EAAOE,GACb,MAAMvY,EAAU0C,KAAK1C,QACf0mD,EAAShkD,KAAKgkD,OACdgO,EAAc10D,EAAQokD,qBAAuB1hD,KAAKgyD,YAClD34B,EAAUr5B,KAAKqV,SAASw8C,eAAe7N,EAAQruC,EAAOE,EAAQm8C,GAC9D88B,EAAWxxF,EAAQqjD,kBAAoB3gD,KAAKqV,SAASwrC,sBACrDW,EAAOxhD,KAAK2V,MAAQ,SAAW,SACrC3V,KAAK2V,MAAQ0jB,EAAQ1jB,MACrB3V,KAAK6V,OAASwjB,EAAQxjB,OACtB7V,KAAK8tF,aAAe9tF,KAAKgyD,YACpBS,GAAYzyD,KAAM8uF,GAAU,KAGjC9uF,KAAKshF,cAAc,SAAU,CAACr8D,KAAMoU,IACpCp2B,GAAS3F,EAAQiiB,SAAU,CAACvf,KAAMq5B,GAAUr5B,MACxCA,KAAKsuF,UACHtuF,KAAKuuF,UAAU/sC,IACjBxhD,KAAKy4B,UAIX14B,sBAGE4O,GAFgB3O,KAAK1C,QACSykD,QAAU,GACpB,CAACgtC,EAAa5H,KAChC4H,EAAYrmF,GAAKy+E,IAGrBpnF,sBACE,MAAMzC,EAAU0C,KAAK1C,QACf0xF,EAAY1xF,EAAQykD,OACpBA,EAAS/hD,KAAK+hD,OACdktC,EAAUt2F,OAAO+C,KAAKqmD,GAAQ0W,OAAO,CAACjyD,EAAKkC,KAC/ClC,EAAIkC,IAAM,EACHlC,GACN,IACH,IAAIwC,EAAQ,GACRgmF,IACFhmF,EAAQA,EAAM68D,OACZltE,OAAO+C,KAAKszF,GAAWrqF,IAAK+D,IAC1B,MAAMuhF,EAAe+E,EAAUtmF,GACzBkI,EAAOo5E,GAActhF,EAAIuhF,GACzBiF,EAAoB,MAATt+E,EACXyL,EAAwB,MAATzL,EACrB,MAAO,CACLtT,QAAS2sF,EACTkF,UAAWD,EAAW,YAAc7yE,EAAe,SAAW,OAC9D+yE,MAAOF,EAAW,eAAiB7yE,EAAe,WAAa,cAKvE1N,GAAK3F,EAAQ+mB,IACX,MAAMk6D,EAAel6D,EAAKzyB,QACpBoL,EAAKuhF,EAAavhF,GAClBkI,EAAOo5E,GAActhF,EAAIuhF,GACzBoF,EAAYhmD,GAAe4gD,EAAaxoF,KAAMsuB,EAAKq/D,YAC3B70F,IAA1B0vF,EAAa3yD,UAA0Bi1D,GAAqBtC,EAAa3yD,SAAU1mB,KAAU27E,GAAqBx8D,EAAKo/D,aACzHlF,EAAa3yD,SAAWvH,EAAKo/D,WAE/BF,EAAQvmF,IAAM,EACd,IAAI4vB,EAAQ,KACZ,GAAI5vB,KAAMq5C,GAAUA,EAAOr5C,GAAIjH,OAAS4tF,EACtC/2D,EAAQypB,EAAOr5C,OACV,CAEL4vB,EAAQ,IADW4vD,GAASoH,SAASD,GAC7B,CAAe,CACrB3mF,GAAAA,EACAjH,KAAM4tF,EACNt1F,IAAKiG,KAAKjG,IACV6mD,MAAO5gD,OAET+hD,EAAOzpB,EAAM5vB,IAAM4vB,EAErBA,EAAMxzB,KAAKmlF,EAAc3sF,KAE3BqR,GAAKsgF,EAAS,CAACM,EAAY7mF,KACpB6mF,UACIxtC,EAAOr5C,KAGlBiG,GAAKozC,EAASzpB,IACZ67C,GAAQnZ,UAAUh7D,KAAMs4B,EAAOA,EAAMh7B,SACrC62E,GAAQqb,OAAOxvF,KAAMs4B,KAGzBv4B,kBACE,MAAMk8D,EAAWj8D,KAAK+tF,UAChB9oB,EAAUjlE,KAAKjD,KAAK2jD,SAAS9lD,OAC7BoqE,EAAU/I,EAASrhE,OAEzB,GADAqhE,EAAS3sC,KAAK,CAACn2B,EAAGC,IAAMD,EAAEkN,MAAQjN,EAAEiN,OAChC2+D,EAAUC,EAAS,CACrB,IAAK,IAAIpqE,EAAIoqE,EAASpqE,EAAImqE,IAAWnqE,EACnCmF,KAAKyvF,oBAAoB50F,GAE3BohE,EAAS31D,OAAO2+D,EAASD,EAAUC,GAErCjlE,KAAKmuF,gBAAkBlyB,EAAS9hE,MAAM,GAAGm1B,KAAKk9D,GAAc,QAAS,UAEvEzsF,8BACE,MAAOguF,UAAW9xB,EAAUl/D,MAAM2jD,SAACA,IAAa1gD,KAC5Ci8D,EAASrhE,OAAS8lD,EAAS9lD,eACtBoF,KAAKu9D,QAEdtB,EAASljE,QAAQ,CAAC0jE,EAAMp2D,KACmC,IAArDq6C,EAAS97C,OAAOimB,GAAKA,IAAM4xC,EAAKiS,UAAU9zE,QAC5CoF,KAAKyvF,oBAAoBppF,KAI/BtG,2BACE,MAAM2vF,EAAiB,GACjBhvC,EAAW1gD,KAAKjD,KAAK2jD,SAC3B,IAAI7lD,EAAGivC,EAEP,IADA9pC,KAAK2vF,8BACA90F,EAAI,EAAGivC,EAAO4W,EAAS9lD,OAAQC,EAAIivC,EAAMjvC,IAAK,CACjD,MAAM6kE,EAAUhf,EAAS7lD,GACzB,IAAI4hE,EAAOz8D,KAAK2gE,eAAe9lE,GAC/B,MAAM4G,EAAOi+D,EAAQj+D,MAAQzB,KAAK86D,OAAOr5D,KAWzC,GAVIg7D,EAAKh7D,MAAQg7D,EAAKh7D,OAASA,IAC7BzB,KAAKyvF,oBAAoB50F,GACzB4hE,EAAOz8D,KAAK2gE,eAAe9lE,IAE7B4hE,EAAKh7D,KAAOA,EACZg7D,EAAKnb,UAAYoe,EAAQpe,WAAawoC,GAAaroF,EAAMzB,KAAK1C,SAC9Dm/D,EAAKmzB,MAAQlwB,EAAQkwB,OAAS,EAC9BnzB,EAAKp2D,MAAQxL,EACb4hE,EAAK72C,MAAQ,GAAK85C,EAAQ95C,MAC1B62C,EAAK7B,QAAU56D,KAAKyrE,iBAAiB5wE,GACjC4hE,EAAKt7B,WACPs7B,EAAKt7B,WAAW0uD,YAAYh1F,GAC5B4hE,EAAKt7B,WAAWo+B,iBACX,CACL,MAAMuwB,EAAkB5H,GAAS6H,cAActuF,IACzCw/D,mBAACA,EAAkBiD,gBAAEA,GAAmBjyC,GAASyuB,SAASj/C,GAChE9I,OAAOP,OAAO03F,EAAgBlmF,UAAW,CACvCs6D,gBAAiBgkB,GAAS8H,WAAW9rB,GACrCjD,mBAAoBA,GAAsBinB,GAAS8H,WAAW/uB,KAEhExE,EAAKt7B,WAAa,IAAI2uD,EAAgB9vF,KAAMnF,GAC5C60F,EAAevuF,KAAKs7D,EAAKt7B,aAI7B,OADAnhC,KAAKiwF,kBACEP,EAET3vF,iBACE4O,GAAK3O,KAAKjD,KAAK2jD,SAAU,CAACgf,EAASz1B,KACjCjqC,KAAK2gE,eAAe12B,GAAc9I,WAAW8mC,SAC5CjoE,MAELD,QACEC,KAAKkwF,iBACLlwF,KAAKshF,cAAc,SAErBvhF,OAAOyhD,GACL,MAAMsZ,EAAS96D,KAAK86D,OACpBA,EAAO/3D,SACP,MAAMzF,EAAU0C,KAAK6tF,SAAW/yB,EAAO2G,eAAe3G,EAAO0yB,oBAAqBxtF,KAAKikD,cACjFksC,EAAgBnwF,KAAK0kE,qBAAuBpnE,EAAQijD,UAK1D,GAJAvgD,KAAKowF,gBACLpwF,KAAKqwF,sBACLrwF,KAAKswF,uBACLtwF,KAAKouF,SAASmC,cACuD,IAAjEvwF,KAAKshF,cAAc,eAAgB,CAAC9/B,KAAAA,EAAMv0C,YAAY,IACxD,OAEF,MAAMyiF,EAAiB1vF,KAAKwwF,2BAC5BxwF,KAAKshF,cAAc,wBACnB,IAAIjL,EAAa,EACjB,IAAK,IAAIx7E,EAAI,EAAGivC,EAAO9pC,KAAKjD,KAAK2jD,SAAS9lD,OAAQC,EAAIivC,EAAMjvC,IAAK,CAC/D,MAAMsmC,WAACA,GAAcnhC,KAAK2gE,eAAe9lE,GACnCotE,GAASkoB,IAAyD,IAAxCT,EAAenwF,QAAQ4hC,GACvDA,EAAWsvD,sBAAsBxoB,GACjCoO,EAAa37E,KAAKC,KAAKwmC,EAAWuiC,iBAAkB2S,GAEtDA,EAAar2E,KAAKyyE,YAAcn1E,EAAQo3E,OAAOwB,YAAcG,EAAa,EAC1Er2E,KAAK0wF,cAAcra,GACd8Z,GACHxhF,GAAK+gF,EAAiBvuD,IACpBA,EAAW8mC,UAGfjoE,KAAK2wF,gBAAgBnvC,GACrBxhD,KAAKshF,cAAc,cAAe,CAAC9/B,KAAAA,IACnCxhD,KAAKm2E,QAAQ7mD,KAAKk9D,GAAc,IAAK,SACrC,MAAMt0B,QAACA,EAAO81B,WAAEA,GAAchuF,KAC1BguF,EACFhuF,KAAK4wF,cAAc5C,GAAY,GACtB91B,EAAQt9D,QACjBoF,KAAK6wF,mBAAmB34B,EAASA,GAAS,GAE5Cl4D,KAAKy4B,SAEP14B,gBACE4O,GAAK3O,KAAK+hD,OAASzpB,IACjB67C,GAAQ2c,UAAU9wF,KAAMs4B,KAE1Bt4B,KAAK+wF,sBACL/wF,KAAKgxF,sBAEPjxF,sBACE,MAAMzC,EAAU0C,KAAK1C,QACf2zF,EAAiB,IAAIr1F,IAAIjD,OAAO+C,KAAKsE,KAAKiuF,aAC1CiD,EAAY,IAAIt1F,IAAI0B,EAAQiP,QAC7Bk/B,GAAUwlD,EAAgBC,MAAgBlxF,KAAKkuF,uBAAyB5wF,EAAQwkD,aACnF9hD,KAAKmxF,eACLnxF,KAAK2uF,cAGT5uF,uBACE,MAAMsuF,eAACA,GAAkBruF,KACnBoxF,EAAUpxF,KAAKqxF,0BAA4B,GACjD,IAAK,MAAMr6E,OAACA,EAAMmK,MAAEA,EAAKi0C,MAAEA,KAAUg8B,EAAS,CAE5ClE,GAAgBmB,EAAgBltE,EADR,oBAAXnK,GAAgCo+C,EAAQA,IAIzDr1D,yBACE,MAAMulE,EAAetlE,KAAKslE,aAC1B,IAAKA,IAAiBA,EAAa1qE,OACjC,OAEFoF,KAAKslE,aAAe,GACpB,MAAMgsB,EAAetxF,KAAKjD,KAAK2jD,SAAS9lD,OAClC22F,EAAWvmD,GAAQ,IAAIpvC,IAC3B0pE,EACG1gE,OAAOrE,GAAKA,EAAE,KAAOyqC,GACrBrmC,IAAI,CAACpE,EAAG1F,IAAMA,EAAI,IAAM0F,EAAE+F,OAAO,GAAG+K,KAAK,OAExCmgF,EAAYD,EAAQ,GAC1B,IAAK,IAAI12F,EAAI,EAAGA,EAAIy2F,EAAcz2F,IAChC,IAAK4wC,GAAU+lD,EAAWD,EAAQ12F,IAChC,OAGJ,OAAO4F,MAAMC,KAAK8wF,GACf7sF,IAAIpE,GAAKA,EAAEmK,MAAM,MACjB/F,IAAIxL,KAAO6d,OAAQ7d,EAAE,GAAIgoB,OAAQhoB,EAAE,GAAIi8D,OAAQj8D,EAAE,MAEtD4G,cAAcs2E,GACZ,IAA+D,IAA3Dr2E,KAAKshF,cAAc,eAAgB,CAACr0E,YAAY,IAClD,OAEFknE,GAAQpxE,OAAO/C,KAAMA,KAAK2V,MAAO3V,KAAK6V,OAAQwgE,GAC9C,MAAM9wB,EAAOvlD,KAAK2jE,UACZ8tB,EAASlsC,EAAK5vC,OAAS,GAAK4vC,EAAK1vC,QAAU,EACjD7V,KAAKm2E,QAAU,GACfxnE,GAAK3O,KAAK21E,MAAQ5nE,IACZ0jF,GAA2B,cAAjB1jF,EAAIupB,WAGdvpB,EAAIitD,WACNjtD,EAAIitD,YAENh7D,KAAKm2E,QAAQh1E,QAAQ4M,EAAIooE,aACxBn2E,MACHA,KAAKm2E,QAAQp9E,QAAQ,CAACg3B,EAAM1pB,KAC1B0pB,EAAK2hE,KAAOrrF,IAEdrG,KAAKshF,cAAc,eAErBvhF,gBAAgByhD,GACd,IAA6E,IAAzExhD,KAAKshF,cAAc,uBAAwB,CAAC9/B,KAAAA,EAAMv0C,YAAY,IAAlE,CAGA,IAAK,IAAIpS,EAAI,EAAGivC,EAAO9pC,KAAKjD,KAAK2jD,SAAS9lD,OAAQC,EAAIivC,IAAQjvC,EAC5DmF,KAAK2gE,eAAe9lE,GAAGsmC,WAAW65B,YAEpC,IAAK,IAAIngE,EAAI,EAAGivC,EAAO9pC,KAAKjD,KAAK2jD,SAAS9lD,OAAQC,EAAIivC,IAAQjvC,EAC5DmF,KAAK2xF,eAAe92F,EAAG2wC,GAAWgW,GAAQA,EAAK,CAACvX,aAAcpvC,IAAM2mD,GAEtExhD,KAAKshF,cAAc,sBAAuB,CAAC9/B,KAAAA,KAE7CzhD,eAAesG,EAAOm7C,GACpB,MAAMib,EAAOz8D,KAAK2gE,eAAet6D,GAC3BqF,EAAO,CAAC+wD,KAAAA,EAAMp2D,MAAAA,EAAOm7C,KAAAA,EAAMv0C,YAAY,IACW,IAApDjN,KAAKshF,cAAc,sBAAuB51E,KAG9C+wD,EAAKt7B,WAAW22B,QAAQtW,GACxB91C,EAAKuB,YAAa,EAClBjN,KAAKshF,cAAc,qBAAsB51E,IAE3C3L,UACiE,IAA3DC,KAAKshF,cAAc,eAAgB,CAACr0E,YAAY,MAGhDoqD,GAASx7D,IAAImE,MACXA,KAAKsuF,WAAaj3B,GAASn3C,QAAQlgB,OACrCq3D,GAASl2C,MAAMnhB,OAGjBA,KAAKi4D,OACL00B,GAAqB,CAAC/rC,MAAO5gD,SAGjCD,OACE,IAAIlF,EACJ,GAAImF,KAAK4uF,kBAAmB,CAC1B,MAAMj5E,MAACA,EAAKE,OAAEA,GAAU7V,KAAK4uF,kBAC7B5uF,KAAK6uF,QAAQl5E,EAAOE,GACpB7V,KAAK4uF,kBAAoB,KAG3B,GADA5uF,KAAKmD,QACDnD,KAAK2V,OAAS,GAAK3V,KAAK6V,QAAU,EACpC,OAEF,IAA6D,IAAzD7V,KAAKshF,cAAc,aAAc,CAACr0E,YAAY,IAChD,OAEF,MAAM2kF,EAAS5xF,KAAKm2E,QACpB,IAAKt7E,EAAI,EAAGA,EAAI+2F,EAAOh3F,QAAUg3F,EAAO/2F,GAAGqsC,GAAK,IAAKrsC,EACnD+2F,EAAO/2F,GAAGo9D,KAAKj4D,KAAK2jE,WAGtB,IADA3jE,KAAK6xF,gBACEh3F,EAAI+2F,EAAOh3F,SAAUC,EAC1B+2F,EAAO/2F,GAAGo9D,KAAKj4D,KAAK2jE,WAEtB3jE,KAAKshF,cAAc,aAErBvhF,uBAAuBi8D,GACrB,MAAMC,EAAWj8D,KAAKmuF,gBAChB3yF,EAAS,GACf,IAAIX,EAAGivC,EACP,IAAKjvC,EAAI,EAAGivC,EAAOmyB,EAASrhE,OAAQC,EAAIivC,IAAQjvC,EAAG,CACjD,MAAM4hE,EAAOR,EAASphE,GACjBmhE,IAAiBS,EAAK7B,SACzBp/D,EAAO2F,KAAKs7D,GAGhB,OAAOjhE,EAETuE,+BACE,OAAOC,KAAKk8D,wBAAuB,GAErCn8D,gBACE,IAAqE,IAAjEC,KAAKshF,cAAc,qBAAsB,CAACr0E,YAAY,IACxD,OAEF,MAAMgvD,EAAWj8D,KAAKsyE,+BACtB,IAAK,IAAIz3E,EAAIohE,EAASrhE,OAAS,EAAGC,GAAK,IAAKA,EAC1CmF,KAAK8xF,aAAa71B,EAASphE,IAE7BmF,KAAKshF,cAAc,qBAErBvhF,aAAa08D,GACX,MAAM1iE,EAAMiG,KAAKjG,IACX6rD,EAAO6W,EAAK8G,MACZwuB,GAAWnsC,EAAKpxB,SAChB+wB,EAAOvlD,KAAK2jE,UACZj4D,EAAO,CACX+wD,KAAAA,EACAp2D,MAAOo2D,EAAKp2D,MACZ4G,YAAY,IAEwC,IAAlDjN,KAAKshF,cAAc,oBAAqB51E,KAGxCqmF,GACFpsC,GAAS5rD,EAAK,CACZyU,MAAoB,IAAdo3C,EAAKp3C,KAAiB,EAAI+2C,EAAK/2C,KAAOo3C,EAAKp3C,KACjDi3C,OAAsB,IAAfG,EAAKH,MAAkBzlD,KAAK2V,MAAQ4vC,EAAKE,MAAQG,EAAKH,MAC7Dl3C,KAAkB,IAAbq3C,EAAKr3C,IAAgB,EAAIg3C,EAAKh3C,IAAMq3C,EAAKr3C,IAC9Cm3C,QAAwB,IAAhBE,EAAKF,OAAmB1lD,KAAK6V,OAAS0vC,EAAKG,OAASE,EAAKF,SAGrE+W,EAAKt7B,WAAW82B,OACZ85B,GACFlsC,GAAW9rD,GAEb2R,EAAKuB,YAAa,EAClBjN,KAAKshF,cAAc,mBAAoB51E,IAEzC3L,0BAA0BE,EAAGuhD,EAAMlkD,EAASk1E,GAC1C,MAAMx7D,EAAS28D,GAAYC,MAAMpyB,GACjC,MAAsB,mBAAXxqC,EACFA,EAAOhX,KAAMC,EAAG3C,EAASk1E,GAE3B,GAETzyE,eAAekqC,GACb,MAAMy1B,EAAU1/D,KAAKjD,KAAK2jD,SAASzW,GAC7BgyB,EAAWj8D,KAAK+tF,UACtB,IAAItxB,EAAOR,EAASr3D,OAAOimB,GAAKA,GAAKA,EAAE6jD,WAAahP,GAAS18D,MAkB7D,OAjBKy5D,IACHA,EAAO,CACLh7D,KAAM,KACN1E,KAAM,GACN2iE,QAAS,KACTv+B,WAAY,KACZwhC,OAAQ,KACR7C,QAAS,KACTE,QAAS,KACT4vB,MAAOlwB,GAAWA,EAAQkwB,OAAS,EACnCvpF,MAAO4jC,EACPykC,SAAUhP,EACVvB,QAAS,GACTwD,SAAS,GAEX1F,EAAS96D,KAAKs7D,IAETA,EAET18D,aACE,OAAOC,KAAKo/D,WAAap/D,KAAKo/D,SAAW5V,GAAc,KAAM,CAAC5I,MAAO5gD,KAAMyB,KAAM,WAEnF1B,yBACE,OAAOC,KAAKsyE,+BAA+B13E,OAE7CmF,iBAAiBkqC,GACf,MAAMy1B,EAAU1/D,KAAKjD,KAAK2jD,SAASzW,GACnC,IAAKy1B,EACH,OAAO,EAET,MAAMjD,EAAOz8D,KAAK2gE,eAAe12B,GACjC,MAA8B,kBAAhBwyB,EAAKkG,QAAwBlG,EAAKkG,QAAUjD,EAAQiD,OAEpE5iE,qBAAqBkqC,EAAc2wB,GACpB56D,KAAK2gE,eAAe12B,GAC5B04B,QAAU/H,EAEjB76D,qBAAqBsG,GACnBrG,KAAKquF,eAAehoF,IAAUrG,KAAKquF,eAAehoF,GAEpDtG,kBAAkBsG,GAChB,OAAQrG,KAAKquF,eAAehoF,GAE9BtG,kBAAkBkqC,EAAc/8B,EAAW0tD,GACzC,MAAMpZ,EAAOoZ,EAAU,OAAS,OAC1B6B,EAAOz8D,KAAK2gE,eAAe12B,GAC3BytB,EAAQ+E,EAAKt7B,WAAWwjC,wBAAmBpqE,EAAWinD,GACxDjW,GAAQr+B,IACVuvD,EAAK1/D,KAAKmQ,GAAWy1D,QAAU/H,EAC/B56D,KAAK+C,WAEL/C,KAAKgyF,qBAAqB/nD,EAAc2wB,GACxClD,EAAM30D,OAAO05D,EAAM,CAAC7B,QAAAA,IACpB56D,KAAK+C,OAAQhJ,GAAQA,EAAIkwC,eAAiBA,EAAeuX,OAAOjnD,IAGpEwF,KAAKkqC,EAAc/8B,GACjBlN,KAAKiyF,kBAAkBhoD,EAAc/8B,GAAW,GAElDnN,KAAKkqC,EAAc/8B,GACjBlN,KAAKiyF,kBAAkBhoD,EAAc/8B,GAAW,GAElDnN,oBAAoBkqC,GAClB,MAAMwyB,EAAOz8D,KAAK+tF,UAAU9jD,GACxBwyB,GAAQA,EAAKt7B,YACfs7B,EAAKt7B,WAAW+wD,kBAEXlyF,KAAK+tF,UAAU9jD,GAExBlqC,QACE,IAAIlF,EAAGivC,EAGP,IAFA9pC,KAAK49B,OACLy5B,GAASzsD,OAAO5K,MACXnF,EAAI,EAAGivC,EAAO9pC,KAAKjD,KAAK2jD,SAAS9lD,OAAQC,EAAIivC,IAAQjvC,EACxDmF,KAAKyvF,oBAAoB50F,GAG7BkF,UACEC,KAAKshF,cAAc,iBACnB,MAAMt9B,OAACA,EAAMjqD,IAAEA,GAAOiG,KACtBA,KAAKmyF,QACLnyF,KAAK86D,OAAO4wB,aACR1nC,IACFhkD,KAAKmxF,eACLptC,GAAYC,EAAQjqD,GACpBiG,KAAKqV,SAAS+8E,eAAer4F,GAC7BiG,KAAKgkD,OAAS,KACdhkD,KAAKjG,IAAM,MAEbiG,KAAKshF,cAAc,kBACZ0L,GAAUhtF,KAAK0I,IACtB1I,KAAKshF,cAAc,gBAErBvhF,iBAAiB2L,GACf,OAAO1L,KAAKgkD,OAAOquC,aAAa3mF,GAElC3L,aACEC,KAAKsyF,iBACDtyF,KAAK1C,QAAQwkD,WACf9hD,KAAKuyF,uBAELvyF,KAAKsuF,UAAW,EAGpBvuF,iBACE,MAAMuqD,EAAYtqD,KAAKiuF,WACjB54E,EAAWrV,KAAKqV,SAChBm9E,EAAO,CAAC/wF,EAAMoK,KAClBwJ,EAAS9X,iBAAiByC,KAAMyB,EAAMoK,GACtCy+C,EAAU7oD,GAAQoK,GAEdA,EAAW,CAAC5L,EAAG4qB,EAAGC,KACtB7qB,EAAEuxD,QAAU3mC,EACZ5qB,EAAEwxD,QAAU3mC,EACZ9qB,KAAK4wF,cAAc3wF,IAErB0O,GAAK3O,KAAK1C,QAAQiP,OAAS9K,GAAS+wF,EAAK/wF,EAAMoK,IAEjD9L,uBACOC,KAAKkuF,uBACRluF,KAAKkuF,qBAAuB,IAE9B,MAAM5jC,EAAYtqD,KAAKkuF,qBACjB74E,EAAWrV,KAAKqV,SAChBm9E,EAAO,CAAC/wF,EAAMoK,KAClBwJ,EAAS9X,iBAAiByC,KAAMyB,EAAMoK,GACtCy+C,EAAU7oD,GAAQoK,GAEd4mF,EAAU,CAAChxF,EAAMoK,KACjBy+C,EAAU7oD,KACZ4T,EAAS7X,oBAAoBwC,KAAMyB,EAAMoK,UAClCy+C,EAAU7oD,KAGfoK,EAAW,CAAC8J,EAAOE,KACnB7V,KAAKgkD,QACPhkD,KAAKy6D,OAAO9kD,EAAOE,IAGvB,IAAI68E,EACJ,MAAMpE,EAAW,KACfmE,EAAQ,SAAUnE,GAClBtuF,KAAKsuF,UAAW,EAChBtuF,KAAKy6D,SACL+3B,EAAK,SAAU3mF,GACf2mF,EAAK,SAAUE,IAEjBA,EAAW,KACT1yF,KAAKsuF,UAAW,EAChBmE,EAAQ,SAAU5mF,GAClB7L,KAAKmyF,QACLnyF,KAAK6uF,QAAQ,EAAG,GAChB2D,EAAK,SAAUlE,IAEbj5E,EAASs9E,WAAW3yF,KAAKgkD,QAC3BsqC,IAEAoE,IAGJ3yF,eACE4O,GAAK3O,KAAKiuF,WAAY,CAACpiF,EAAUpK,KAC/BzB,KAAKqV,SAAS7X,oBAAoBwC,KAAMyB,EAAMoK,KAEhD7L,KAAKiuF,WAAa,GAClBt/E,GAAK3O,KAAKkuF,qBAAsB,CAACriF,EAAUpK,KACzCzB,KAAKqV,SAAS7X,oBAAoBwC,KAAMyB,EAAMoK,KAEhD7L,KAAKkuF,0BAAuB3zF,EAE9BwF,iBAAiBiJ,EAAOw4C,EAAMxpC,GAC5B,MAAM6X,EAAS7X,EAAU,MAAQ,SACjC,IAAIykD,EAAM1sC,EAAMl1B,EAAGivC,EAKnB,IAJa,YAAT0X,IACFib,EAAOz8D,KAAK2gE,eAAe33D,EAAM,GAAGihC,cACpCwyB,EAAKt7B,WAAW,IAAMtR,EAAS,wBAE5Bh1B,EAAI,EAAGivC,EAAO9gC,EAAMpO,OAAQC,EAAIivC,IAAQjvC,EAAG,CAC9Ck1B,EAAO/mB,EAAMnO,GACb,MAAMsmC,EAAapR,GAAQ/vB,KAAK2gE,eAAe5wC,EAAKka,cAAc9I,WAC9DA,GACFA,EAAWtR,EAAS,cAAcE,EAAKnzB,QAASmzB,EAAKka,aAAcla,EAAK1pB,QAI9EtG,oBACE,OAAOC,KAAKk4D,SAAW,GAEzBn4D,kBAAkB6yF,GAChB,MAAMC,EAAa7yF,KAAKk4D,SAAW,GAC7BsC,EAASo4B,EAAejuF,IAAI,EAAEslC,aAAAA,EAAc5jC,MAAAA,MAChD,MAAMo2D,EAAOz8D,KAAK2gE,eAAe12B,GACjC,IAAKwyB,EACH,MAAM,IAAI17D,MAAM,6BAA+BkpC,GAEjD,MAAO,CACLA,aAAAA,EACArtC,QAAS6/D,EAAK1/D,KAAKsJ,GACnBA,MAAAA,MAGasjC,GAAe6wB,EAAQq4B,KAEtC7yF,KAAKk4D,QAAUsC,EACfx6D,KAAKguF,WAAa,KAClBhuF,KAAK6wF,mBAAmBr2B,EAAQq4B,IAGpC9yF,cAAcipF,EAAMt9E,EAAM9G,GACxB,OAAO5E,KAAKouF,SAAS5yD,OAAOx7B,KAAMgpF,EAAMt9E,EAAM9G,GAEhD7E,mBAAmBy6D,EAAQq4B,EAAYC,GACrC,MAAMC,EAAe/yF,KAAK1C,QAAQ4jD,MAC5B/jC,EAAO,CAAChkB,EAAGC,IAAMD,EAAEyL,OAAOimB,IAAMzxB,EAAEwwF,KAAK9+D,GAAKD,EAAEof,eAAiBnf,EAAEmf,cAAgBpf,EAAExkB,QAAUykB,EAAEzkB,QAC/F2sF,EAAc71E,EAAK01E,EAAYr4B,GAC/By4B,EAAYH,EAASt4B,EAASr9C,EAAKq9C,EAAQq4B,GAC7CG,EAAYp4F,QACdoF,KAAKkzF,iBAAiBF,EAAaD,EAAavxC,MAAM,GAEpDyxC,EAAUr4F,QAAUm4F,EAAavxC,MACnCxhD,KAAKkzF,iBAAiBD,EAAWF,EAAavxC,MAAM,GAGxDzhD,cAAcE,EAAG6yF,GACf,MAAMpnF,EAAO,CACXtO,MAAO6C,EACP6yF,OAAAA,EACA7lF,YAAY,EACZkmF,YAAa7tC,GAAerlD,EAAGD,KAAK2jE,UAAW3jE,KAAKyyE,cAEhD2gB,EAAejK,IAAYA,EAAO7rF,QAAQiP,QAAUvM,KAAK1C,QAAQiP,QAAQ20B,SAASjhC,EAAEsxD,OAAO9vD,MACjG,IAA6D,IAAzDzB,KAAKshF,cAAc,cAAe51E,EAAM0nF,GAC1C,OAEF,MAAMhkB,EAAUpvE,KAAKqzF,aAAapzF,EAAG6yF,EAAQpnF,EAAKynF,aAMlD,OALAznF,EAAKuB,YAAa,EAClBjN,KAAKshF,cAAc,aAAc51E,EAAM0nF,IACnChkB,GAAW1jE,EAAK0jE,UAClBpvE,KAAKy4B,SAEAz4B,KAETD,aAAaE,EAAG6yF,EAAQK,GACtB,MAAOj7B,QAAS26B,EAAa,GAAEv1F,QAAEA,GAAW0C,KACtCwyE,EAAmBsgB,EACnBt4B,EAASx6D,KAAKszF,mBAAmBrzF,EAAG4yF,EAAYM,EAAa3gB,GAC7D+gB,EDvtLV,SAAuBtzF,GACrB,MAAkB,YAAXA,EAAEwB,MAAiC,UAAXxB,EAAEwB,MAA+B,gBAAXxB,EAAEwB,KCstLrC+xF,CAAcvzF,GACxBwzF,EA1uBV,SAA4BxzF,EAAGwzF,EAAWN,EAAaI,GACrD,OAAKJ,GAA0B,aAAXlzF,EAAEwB,KAGlB8xF,EACKE,EAEFxzF,EALE,KAwuBWyzF,CAAmBzzF,EAAGD,KAAKguF,WAAYmF,EAAaI,GAClEJ,IACFnzF,KAAKguF,WAAa,KAClB/qF,GAAS3F,EAAQqkD,QAAS,CAAC1hD,EAAGu6D,EAAQx6D,MAAOA,MACzCuzF,GACFtwF,GAAS3F,EAAQgjB,QAAS,CAACrgB,EAAGu6D,EAAQx6D,MAAOA,OAGjD,MAAMovE,GAAWzlC,GAAe6wB,EAAQq4B,GAMxC,OALIzjB,GAAW0jB,KACb9yF,KAAKk4D,QAAUsC,EACfx6D,KAAK6wF,mBAAmBr2B,EAAQq4B,EAAYC,IAE9C9yF,KAAKguF,WAAayF,EACXrkB,EAETrvE,mBAAmBE,EAAG4yF,EAAYM,EAAa3gB,GAC7C,GAAe,aAAXvyE,EAAEwB,KACJ,MAAO,GAET,IAAK0xF,EACH,OAAON,EAET,MAAME,EAAe/yF,KAAK1C,QAAQ4jD,MAClC,OAAOlhD,KAAK2zF,0BAA0B1zF,EAAG8yF,EAAavxC,KAAMuxC,EAAcvgB,IAG9E,MAAMohB,GAAoB,IAAMjlF,GAAKy+E,GAAMJ,UAAYpsC,GAAUA,EAAMwtC,SAASmC,cA2ChF,SAASsD,GAAQ95F,EAAK6C,EAAS4vE,GAC7B,MAAMD,WAACA,EAAUunB,YAAEA,EAAWjpE,EAAEA,EAACC,EAAEA,EAACwgD,YAAEA,EAAWD,YAAEA,GAAezuE,EAClE,IAAIm3F,EAAcD,EAAcxoB,EAChCvxE,EAAI8qD,YACJ9qD,EAAI+qD,IAAIj6B,EAAGC,EAAGwgD,EAAaiB,EAAawnB,EAAavnB,EAAWunB,GAC5D1oB,EAAcyoB,GAChBC,EAAcD,EAAczoB,EAC5BtxE,EAAI+qD,IAAIj6B,EAAGC,EAAGugD,EAAamB,EAAWunB,EAAaxnB,EAAawnB,GAAa,IAE7Eh6F,EAAI+qD,IAAIj6B,EAAGC,EAAGgpE,EAAatnB,EAAWzgC,GAASwgC,EAAaxgC,IAE9DhyC,EAAIgrD,YACJhrD,EAAI6rD,OAKN,SAASouC,GAAoBlvC,EAAKumB,EAAaC,EAAa2oB,GAC1D,MAAMjwF,EAHC0kD,GAGmB5D,EAAIxnD,QAAQ42F,aAHN,CAAC,aAAc,WAAY,aAAc,aAIzE,MAAMC,GAAiB7oB,EAAcD,GAAe,EAC9C+oB,EAAa15F,KAAKqZ,IAAIogF,EAAeF,EAAa5oB,EAAc,GAChEgpB,EAAqB7nE,IACzB,MAAM8nE,GAAiBhpB,EAAc5wE,KAAKqZ,IAAIogF,EAAe3nE,IAAQynE,EAAa,EAClF,OAAO1lD,GAAY/hB,EAAK,EAAG9xB,KAAKqZ,IAAIogF,EAAeG,KAErD,MAAO,CACLC,WAAYF,EAAkBrwF,EAAEuwF,YAChCC,SAAUH,EAAkBrwF,EAAEwwF,UAC9BC,WAAYlmD,GAAYvqC,EAAEywF,WAAY,EAAGL,GACzCM,SAAUnmD,GAAYvqC,EAAE0wF,SAAU,EAAGN,IAGzC,SAASO,GAAWlxF,EAAGmxF,EAAO/pE,EAAGC,GAC/B,MAAO,CACLD,EAAGA,EAAIpnB,EAAI/I,KAAKuZ,IAAI2gF,GACpB9pE,EAAGA,EAAIrnB,EAAI/I,KAAKi0C,IAAIimD,IAGxB,SAASC,GAAQ96F,EAAK6C,EAASkR,EAAQ+9D,EAAStqD,GAC9C,MAAMsJ,EAACA,EAACC,EAAEA,EAAGyhD,WAAYprD,EAAK2yE,YAAEA,EAAazoB,YAAaypB,GAAUl4F,EAC9D0uE,EAAc5wE,KAAKC,IAAIiC,EAAQ0uE,YAAcO,EAAU/9D,EAASgmF,EAAa,GAC7EzoB,EAAcypB,EAAS,EAAIA,EAASjpB,EAAU/9D,EAASgmF,EAAc,EAC3E,IAAIiB,EAAgB,EACpB,MAAMC,EAAQzzE,EAAMJ,EACpB,GAAI0qD,EAAS,CACX,MAEMopB,IAFuBH,EAAS,EAAIA,EAASjpB,EAAU,IAChCP,EAAc,EAAIA,EAAcO,EAAU,IACI,EAE3EkpB,GAAiBC,GAD4B,IAAvBC,EAA4BD,EAAQC,GAAuBA,EAAqBppB,GAAWmpB,IACvE,EAE5C,MACME,GAAeF,EADRt6F,KAAKC,IAAI,KAAOq6F,EAAQ1pB,EAAcx9D,EAASoG,IAAMo3D,GAC7B,EAC/BiB,EAAaprD,EAAQ+zE,EAAcH,EACnCvoB,EAAWjrD,EAAM2zE,EAAcH,GAC/BR,WAACA,EAAUC,SAAEA,EAAQC,WAAEA,EAAUC,SAAEA,GAAYV,GAAoBp3F,EAASyuE,EAAaC,EAAakB,EAAWD,GACjH4oB,EAA2B7pB,EAAcipB,EACzCa,EAAyB9pB,EAAckpB,EACvCa,EAA0B9oB,EAAagoB,EAAaY,EACpDG,EAAwB9oB,EAAWgoB,EAAWY,EAC9CG,EAA2BlqB,EAAcopB,EACzCe,EAAyBnqB,EAAcqpB,EACvCe,EAA0BlpB,EAAakoB,EAAac,EACpDG,EAAwBlpB,EAAWkoB,EAAWc,EAGpD,GAFAz7F,EAAI8qD,YACJ9qD,EAAI+qD,IAAIj6B,EAAGC,EAAGwgD,EAAa+pB,EAAyBC,GAChDd,EAAW,EAAG,CAChB,MAAMmB,EAAUhB,GAAWS,EAAwBE,EAAuBzqE,EAAGC,GAC7E/wB,EAAI+qD,IAAI6wC,EAAQ9qE,EAAG8qE,EAAQ7qE,EAAG0pE,EAAUc,EAAuB9oB,EAAWzgC,IAE5E,MAAM6pD,EAAKjB,GAAWa,EAAwBhpB,EAAU3hD,EAAGC,GAE3D,GADA/wB,EAAIkrD,OAAO2wC,EAAG/qE,EAAG+qE,EAAG9qE,GAChB4pE,EAAW,EAAG,CAChB,MAAMiB,EAAUhB,GAAWa,EAAwBE,EAAuB7qE,EAAGC,GAC7E/wB,EAAI+qD,IAAI6wC,EAAQ9qE,EAAG8qE,EAAQ7qE,EAAG4pE,EAAUloB,EAAWzgC,GAAS2pD,EAAwBh7F,KAAKwZ,IAG3F,GADAna,EAAI+qD,IAAIj6B,EAAGC,EAAGugD,EAAamB,EAAYkoB,EAAWrpB,EAAckB,EAAckoB,EAAappB,GAAc,GACrGopB,EAAa,EAAG,CAClB,MAAMkB,EAAUhB,GAAWY,EAA0BE,EAAyB5qE,EAAGC,GACjF/wB,EAAI+qD,IAAI6wC,EAAQ9qE,EAAG8qE,EAAQ7qE,EAAG2pE,EAAYgB,EAA0B/6F,KAAKwZ,GAAIq4D,EAAaxgC,IAE5F,MAAM8pD,EAAKlB,GAAWQ,EAA0B5oB,EAAY1hD,EAAGC,GAE/D,GADA/wB,EAAIkrD,OAAO4wC,EAAGhrE,EAAGgrE,EAAG/qE,GAChBypE,EAAa,EAAG,CAClB,MAAMoB,EAAUhB,GAAWQ,EAA0BE,EAAyBxqE,EAAGC,GACjF/wB,EAAI+qD,IAAI6wC,EAAQ9qE,EAAG8qE,EAAQ7qE,EAAGypE,EAAYhoB,EAAaxgC,GAASspD,GAElEt7F,EAAIgrD,YAwCN,SAASw3B,GAAWxiF,EAAK6C,EAASkR,EAAQ+9D,EAASW,GACjD,MAAMlvE,QAACA,GAAWV,GACZwoD,YAACA,EAAWgS,gBAAEA,GAAmB95D,EACjCw4F,EAAgC,UAAxBx4F,EAAQywE,YACjB3oB,IAGD0wC,GACF/7F,EAAIotD,UAA0B,EAAd/B,EAChBrrD,EAAIg8F,SAAW3+B,GAAmB,UAElCr9D,EAAIotD,UAAY/B,EAChBrrD,EAAIg8F,SAAW3+B,GAAmB,SAEhCx6D,EAAQo5F,aAjCd,SAA+Bj8F,EAAK6C,EAASk5F,GAC3C,MAAMjrE,EAACA,EAACC,EAAEA,EAACyhD,WAAEA,EAAUunB,YAAEA,EAAWkC,YAAEA,GAAep5F,EAC/C0uE,EAAc5wE,KAAKC,IAAIiC,EAAQ0uE,YAAcwoB,EAAa,GAC1DzoB,EAAczuE,EAAQyuE,YAAcyoB,EAC1C,IAAIj5F,EAMJ,IALIi7F,GACFjC,GAAQ95F,EAAK6C,EAAS2vE,EAAa7gC,IAErC3xC,EAAI8qD,YACJ9qD,EAAI+qD,IAAIj6B,EAAGC,EAAGugD,EAAakB,EAAa7gC,GAAK6gC,GAAY,GACpD1xE,EAAI,EAAGA,EAAIm7F,IAAen7F,EAC7Bd,EAAIsrD,SAIN,IAFAtrD,EAAI8qD,YACJ9qD,EAAI+qD,IAAIj6B,EAAGC,EAAGwgD,EAAaiB,EAAYA,EAAa7gC,IAC/C7wC,EAAI,EAAGA,EAAIm7F,IAAen7F,EAC7Bd,EAAIsrD,SAkBJ4wC,CAAsBl8F,EAAK6C,EAASk5F,GAElCA,GACFjC,GAAQ95F,EAAK6C,EAAS4vE,GAExBqoB,GAAQ96F,EAAK6C,EAASkR,EAAQ+9D,EAASW,GACvCzyE,EAAIsrD,UA7LN1sD,OAAO6pD,iBAAiB4qC,GAAO,CAC7Bn7D,SAAU,CACR3f,YAHe,EAIf3U,MAAOs0B,IAET+6D,UAAW,CACT16E,YAPe,EAQf3U,MAAOqvF,IAET53E,UAAW,CACT9C,YAXe,EAYf3U,MAAOyX,IAET8yE,SAAU,CACR51E,YAfe,EAgBf3U,MAAOuqF,IAETgO,QAAS,CACP5jF,YAnBe,EAoBf3U,MA/0BU,SAi1BZsvF,SAAU,CACR36E,YAvBe,EAwBf3U,MAAOsvF,IAETxF,SAAU,CACRn1E,YA3Be,EA4Bf3U,MAAO,IAAIqL,KACTk/E,GAAShlF,OAAO8F,GAChB4qF,OAGJuC,WAAY,CACV7jF,YAlCe,EAmCf3U,MAAO,IAAIqL,KACTk/E,GAASt9E,UAAU5B,GACnB4qF,SA2JN,MAAMwC,WAAmBrc,GACvBh6E,YAAYo5D,GACVlwD,QACAjJ,KAAK1C,aAAU/C,EACfyF,KAAKwrE,mBAAgBjxE,EACrByF,KAAKusE,gBAAahyE,EAClByF,KAAKwsE,cAAWjyE,EAChByF,KAAKqrE,iBAAc9wE,EACnByF,KAAKsrE,iBAAc/wE,EACnByF,KAAK8zF,YAAc,EACnB9zF,KAAKg2F,YAAc,EACf78B,GACFxgE,OAAOP,OAAO4H,KAAMm5D,GAGxBp5D,QAAQs2F,EAAQC,EAAQ9jB,GACtB,MAAMrjD,EAAQnvB,KAAKqzE,SAAS,CAAC,IAAK,KAAMb,IAClC/kC,MAACA,EAAKC,SAAEA,GAAYP,GAAkBhe,EAAO,CAACtE,EAAGwrE,EAAQvrE,EAAGwrE,KAC5D/pB,WAACA,EAAUC,SAAEA,EAAQnB,YAAEA,EAAWC,YAAEA,EAAWE,cAAEA,GAAiBxrE,KAAKqzE,SAAS,CACpF,aACA,WACA,cACA,cACA,iBACCb,GACG+jB,EAAUv2F,KAAK1C,QAAQuuE,QAAU,EAEjC2qB,EADiBntD,GAAemiC,EAAegB,EAAWD,IACxB7gC,IAAOsC,GAAcP,EAAO8+B,EAAYC,GAC1EiqB,EAAejoD,GAAWd,EAAU29B,EAAckrB,EAASjrB,EAAcirB,GAC/E,OAAQC,GAAiBC,EAE3B12F,eAAeyyE,GACb,MAAM3nD,EAACA,EAACC,EAAEA,EAACyhD,WAAEA,EAAUC,SAAEA,EAAQnB,YAAEA,EAAWC,YAAEA,GAAetrE,KAAKqzE,SAAS,CAC3E,IACA,IACA,aACA,WACA,cACA,cACA,iBACCb,IACG1kE,OAACA,EAAM+9D,QAAEA,GAAW7rE,KAAK1C,QACzBo5F,GAAanqB,EAAaC,GAAY,EACtCmqB,GAActrB,EAAcC,EAAcO,EAAU/9D,GAAU,EACpE,MAAO,CACL+c,EAAGA,EAAInwB,KAAKuZ,IAAIyiF,GAAaC,EAC7B7rE,EAAGA,EAAIpwB,KAAKi0C,IAAI+nD,GAAaC,GAGjC52F,gBAAgByyE,GACd,OAAOxyE,KAAKmzE,eAAeX,GAE7BzyE,KAAKhG,GACH,MAAMuD,QAACA,EAAOkuE,cAAEA,GAAiBxrE,KAC3B8N,GAAUxQ,EAAQwQ,QAAU,GAAK,EACjC+9D,GAAWvuE,EAAQuuE,SAAW,GAAK,EAGzC,GAFA7rE,KAAK8zF,YAAuC,UAAxBx2F,EAAQywE,YAA2B,IAAO,EAC9D/tE,KAAKg2F,YAAcxqB,EAAgB9/B,GAAMhxC,KAAK+sB,MAAM+jD,EAAgB9/B,IAAO,EACrD,IAAlB8/B,GAAuBxrE,KAAKqrE,YAAc,GAAKrrE,KAAKsrE,YAAc,EACpE,OAEFvxE,EAAIupD,OACJ,IAAIszC,EAAe,EACnB,GAAI9oF,EAAQ,CACV8oF,EAAe9oF,EAAS,EACxB,MAAM4oF,GAAa12F,KAAKusE,WAAavsE,KAAKwsE,UAAY,EACtDzyE,EAAIiZ,UAAUtY,KAAKuZ,IAAIyiF,GAAaE,EAAcl8F,KAAKi0C,IAAI+nD,GAAaE,GACpE52F,KAAKwrE,eAAiBt3D,KACxB0iF,EAAe9oF,GAGnB/T,EAAI+sD,UAAYxpD,EAAQkjD,gBACxBzmD,EAAImtD,YAAc5pD,EAAQmjD,YAC1B,MAAM+rB,EAtIV,SAAiBzyE,EAAK6C,EAASkR,EAAQ+9D,GACrC,MAAMmqB,YAACA,EAAWzpB,WAAEA,EAAUf,cAAEA,GAAiB5uE,EACjD,IAAI4vE,EAAW5vE,EAAQ4vE,SACvB,GAAIwpB,EAAa,CACfnB,GAAQ96F,EAAK6C,EAASkR,EAAQ+9D,EAASU,EAAa7gC,IACpD,IAAK,IAAI7wC,EAAI,EAAGA,EAAIm7F,IAAen7F,EACjCd,EAAI6L,OAEDof,MAAMwmD,KACTgB,EAAWD,EAAaf,EAAgB9/B,GACpC8/B,EAAgB9/B,IAAQ,IAC1B8gC,GAAY9gC,KAMlB,OAFAmpD,GAAQ96F,EAAK6C,EAASkR,EAAQ+9D,EAASW,GACvCzyE,EAAI6L,OACG4mE,EAqHYqqB,CAAQ98F,EAAKiG,KAAM42F,EAAc/qB,GAClD0Q,GAAWxiF,EAAKiG,KAAM42F,EAAc/qB,EAASW,GAC7CzyE,EAAI0pD,WAkBR,SAASqzC,GAAS/8F,EAAKuD,EAASe,EAAQf,GACtCvD,EAAIg9F,QAAU1tD,GAAehrC,EAAM44D,eAAgB35D,EAAQ25D,gBAC3Dl9D,EAAIssF,YAAYh9C,GAAehrC,EAAM64D,WAAY55D,EAAQ45D,aACzDn9D,EAAIusF,eAAiBj9C,GAAehrC,EAAM84D,iBAAkB75D,EAAQ65D,kBACpEp9D,EAAIg8F,SAAW1sD,GAAehrC,EAAM+4D,gBAAiB95D,EAAQ85D,iBAC7Dr9D,EAAIotD,UAAY9d,GAAehrC,EAAM+mD,YAAa9nD,EAAQ8nD,aAC1DrrD,EAAImtD,YAAc7d,GAAehrC,EAAMoiD,YAAanjD,EAAQmjD,aAE9D,SAASwE,GAAOlrD,EAAKgsD,EAAUhqD,GAC7BhC,EAAIkrD,OAAOlpD,EAAO8uB,EAAG9uB,EAAO+uB,GAW9B,SAASksE,GAAS9nE,EAAQomC,EAASniD,EAAS,IAC1C,MAAMiiD,EAAQlmC,EAAOt0B,QACdumB,MAAO81E,EAAc,EAAG11E,IAAK21E,EAAY9hC,EAAQ,GAAKjiD,GACtDgO,MAAOg2E,EAAc51E,IAAK61E,GAAc9hC,EACzCn0C,EAAQzmB,KAAKC,IAAIs8F,EAAaE,GAC9B51E,EAAM7mB,KAAKqZ,IAAImjF,EAAWE,GAC1BC,EAAUJ,EAAcE,GAAgBD,EAAYC,GAAgBF,EAAcG,GAAcF,EAAYE,EAClH,MAAO,CACLhiC,MAAAA,EACAj0C,MAAAA,EACA/I,KAAMk9C,EAAQl9C,KACd0xB,KAAMvoB,EAAMJ,IAAUk2E,EAAUjiC,EAAQ7zC,EAAMJ,EAAQI,EAAMJ,GAGhE,SAASm2E,GAAYv9F,EAAK6sD,EAAM0O,EAASniD,GACvC,MAAM+b,OAACA,EAAM5xB,QAAEA,GAAWspD,GACpBwO,MAACA,EAAKj0C,MAAEA,EAAK/I,KAAEA,EAAI0xB,KAAEA,GAAQktD,GAAS9nE,EAAQomC,EAASniD,GACvDokF,EA1BR,SAAuBj6F,GACrB,OAAIA,EAAQk6F,QACH1xC,GAELxoD,EAAQgzD,SAA8C,aAAnChzD,EAAQ+yD,uBACtBnK,GAEFjB,GAmBYwyC,CAAcn6F,GACjC,IACIzC,EAAGs0B,EAAOrf,GADVwR,KAACA,GAAO,EAAIooB,QAAEA,GAAWv2B,GAAU,GAEvC,IAAKtY,EAAI,EAAGA,GAAKivC,IAAQjvC,EACvBs0B,EAAQD,GAAQ/N,GAASuoB,EAAUI,EAAOjvC,EAAIA,IAAMu6D,GAChDjmC,EAAM5E,OAECjJ,GACTvnB,EAAIirD,OAAO71B,EAAMtE,EAAGsE,EAAMrE,GAC1BxJ,GAAO,GAEPi2E,EAAWx9F,EAAK+V,EAAMqf,EAAOua,EAASpsC,EAAQk6F,SAEhD1nF,EAAOqf,GAMT,OAJI/W,IACF+W,EAAQD,GAAQ/N,GAASuoB,EAAUI,EAAO,IAAMsrB,GAChDmiC,EAAWx9F,EAAK+V,EAAMqf,EAAOua,EAASpsC,EAAQk6F,YAEvCp/E,EAEX,SAASs/E,GAAgB39F,EAAK6sD,EAAM0O,EAASniD,GAC3C,MAAM+b,EAAS03B,EAAK13B,QACdkmC,MAACA,EAAKj0C,MAAEA,EAAK2oB,KAAEA,GAAQktD,GAAS9nE,EAAQomC,EAASniD,IACjDmO,KAACA,GAAO,EAAIooB,QAAEA,GAAWv2B,GAAU,GACzC,IAEItY,EAAGs0B,EAAOwoE,EAAO3qB,EAAMF,EAAM8qB,EAF7BC,EAAO,EACPC,EAAS,EAEb,MAAMC,EAAc1xF,IAAW8a,GAASuoB,EAAUI,EAAOzjC,EAAQA,IAAU+uD,EACrE4iC,EAAQ,KACRhrB,IAASF,IACX/yE,EAAIkrD,OAAO4yC,EAAM/qB,GACjB/yE,EAAIkrD,OAAO4yC,EAAM7qB,GACjBjzE,EAAIkrD,OAAO4yC,EAAMD,KAOrB,IAJIt2E,IACF6N,EAAQD,EAAO6oE,EAAW,IAC1Bh+F,EAAIirD,OAAO71B,EAAMtE,EAAGsE,EAAMrE,IAEvBjwB,EAAI,EAAGA,GAAKivC,IAAQjvC,EAAG,CAE1B,GADAs0B,EAAQD,EAAO6oE,EAAWl9F,IACtBs0B,EAAM5E,KACR,SAEF,MAAMM,EAAIsE,EAAMtE,EACVC,EAAIqE,EAAMrE,EACVmtE,EAAa,EAAJptE,EACXotE,IAAWN,GACT7sE,EAAIkiD,EACNA,EAAOliD,EACEA,EAAIgiD,IACbA,EAAOhiD,GAET+sE,GAAQC,EAASD,EAAOhtE,KAAOitE,IAE/BE,IACAj+F,EAAIkrD,OAAOp6B,EAAGC,GACd6sE,EAAQM,EACRH,EAAS,EACT9qB,EAAOF,EAAOhiD,GAEhB8sE,EAAQ9sE,EAEVktE,IAEF,SAASE,GAAkBtxC,GACzB,MAAM5xC,EAAO4xC,EAAKtpD,QACZ45D,EAAaliD,EAAKkiD,YAAcliD,EAAKkiD,WAAWt8D,OAEtD,QADqBgsD,EAAK0oB,YAAe1oB,EAAK6S,OAAUzkD,EAAKs7C,SAA2C,aAAhCt7C,EAAKq7C,wBAA0Cr7C,EAAKwiF,SAAYtgC,GACnHwgC,GAAkBJ,GA1HzClB,GAAW1tF,GAAK,MAChB0tF,GAAWnkE,SAAW,CACpB87C,YAAa,SACbttB,YAAa,OACb2W,qBAAiB78D,EACjB25F,aAAc,EACd9uC,YAAa,EACbt3C,OAAQ,EACR+9D,QAAS,EACTp+B,WAAOlzC,GAET67F,GAAWnc,cAAgB,CACzBz5B,gBAAiB,mBAgJnB,MAAM23C,GAA8B,mBAAXC,OACzB,SAASngC,GAAKl+D,EAAK6sD,EAAMzlC,EAAOi0C,GAC1B+iC,KAAcvxC,EAAKtpD,QAAQg4D,QAzBjC,SAA6Bv7D,EAAK6sD,EAAMzlC,EAAOi0C,GAC7C,IAAIp8C,EAAO4tC,EAAKyxC,MACXr/E,IACHA,EAAO4tC,EAAKyxC,MAAQ,IAAID,OACpBxxC,EAAK5tC,KAAKA,EAAMmI,EAAOi0C,IACzBp8C,EAAK+rC,aAGT+xC,GAAS/8F,EAAK6sD,EAAKtpD,SACnBvD,EAAIsrD,OAAOrsC,GAiBTs/E,CAAoBv+F,EAAK6sD,EAAMzlC,EAAOi0C,GAf1C,SAA0Br7D,EAAK6sD,EAAMzlC,EAAOi0C,GAC1C,MAAMa,SAACA,EAAQ34D,QAAEA,GAAWspD,EACtB2xC,EAAgBL,GAAkBtxC,GACxC,IAAK,MAAM0O,KAAWW,EACpB6gC,GAAS/8F,EAAKuD,EAASg4D,EAAQj3D,OAC/BtE,EAAI8qD,YACA0zC,EAAcx+F,EAAK6sD,EAAM0O,EAAS,CAACn0C,MAAAA,EAAOI,IAAKJ,EAAQi0C,EAAQ,KACjEr7D,EAAIgrD,YAENhrD,EAAIsrD,SAQJmzC,CAAiBz+F,EAAK6sD,EAAMzlC,EAAOi0C,GAGvC,MAAMqjC,WAAoB1e,GACxBh6E,YAAYo5D,GACVlwD,QACAjJ,KAAKuvE,UAAW,EAChBvvE,KAAK1C,aAAU/C,EACfyF,KAAKq2D,YAAS97D,EACdyF,KAAKy5D,WAAQl/D,EACbyF,KAAKixE,eAAY12E,EACjByF,KAAKq4F,WAAQ99F,EACbyF,KAAK04F,aAAUn+F,EACfyF,KAAK24F,eAAYp+F,EACjByF,KAAKsvE,YAAa,EAClBtvE,KAAK44F,gBAAiB,EACtB54F,KAAKw2D,mBAAgBj8D,EACjB4+D,GACFxgE,OAAOP,OAAO4H,KAAMm5D,GAGxBp5D,oBAAoB4jE,EAAWriB,GAC7B,MAAMhkD,EAAU0C,KAAK1C,QACrB,IAAKA,EAAQgzD,SAA8C,aAAnChzD,EAAQ+yD,0BAA2C/yD,EAAQk6F,UAAYx3F,KAAK44F,eAAgB,CAClH,MAAMxgF,EAAO9a,EAAQ8yD,SAAWpwD,KAAKy5D,MAAQz5D,KAAKixE,UAClD/gB,GAA2BlwD,KAAK04F,QAASp7F,EAASqmE,EAAWvrD,EAAMkpC,GACnEthD,KAAK44F,gBAAiB,GAG1B1pE,WAAWA,GACTlvB,KAAK04F,QAAUxpE,SACRlvB,KAAK24F,iBACL34F,KAAKq4F,MACZr4F,KAAK44F,gBAAiB,EAExB1pE,aACE,OAAOlvB,KAAK04F,QAEdziC,eACE,OAAOj2D,KAAK24F,YAAc34F,KAAK24F,UD1kInC,SAA0B/xC,EAAMuP,GAC9B,MAAMjnC,EAAS03B,EAAK13B,OACdkhC,EAAWxJ,EAAKtpD,QAAQ8yD,SACxBgF,EAAQlmC,EAAOt0B,OACrB,IAAKw6D,EACH,MAAO,GAET,MAAMh9C,IAASwuC,EAAK6S,OACdt4C,MAACA,EAAKI,IAAEA,GAxDhB,SAAyB2N,EAAQkmC,EAAOh9C,EAAMg4C,GAC5C,IAAIjvC,EAAQ,EACRI,EAAM6zC,EAAQ,EAClB,GAAIh9C,IAASg4C,EACX,KAAOjvC,EAAQi0C,IAAUlmC,EAAO/N,GAAOoJ,MACrCpJ,IAGJ,KAAOA,EAAQi0C,GAASlmC,EAAO/N,GAAOoJ,MACpCpJ,IAMF,IAJAA,GAASi0C,EACLh9C,IACFmJ,GAAOJ,GAEFI,EAAMJ,GAAS+N,EAAO3N,EAAM6zC,GAAO7qC,MACxChJ,IAGF,OADAA,GAAO6zC,EACA,CAACj0C,MAAAA,EAAOI,IAAAA,GAqCMs3E,CAAgB3pE,EAAQkmC,EAAOh9C,EAAMg4C,GAC1D,OACS8F,GAActP,GADN,IAAbwJ,EACyB,CAAC,CAACjvC,MAAAA,EAAOI,IAAAA,EAAKnJ,KAAAA,IArC7C,SAAuB8W,EAAQ/N,EAAOxmB,EAAKyd,GACzC,MAAMg9C,EAAQlmC,EAAOt0B,OACfY,EAAS,GACf,IAEI+lB,EAFAwnD,EAAO5nD,EACPrR,EAAOof,EAAO/N,GAElB,IAAKI,EAAMJ,EAAQ,EAAGI,GAAO5mB,IAAO4mB,EAAK,CACvC,MAAMo3C,EAAMzpC,EAAO3N,EAAM6zC,GACrBuD,EAAIpuC,MAAQouC,EAAI/6B,KACb9tB,EAAKya,OACRnS,GAAO,EACP5c,EAAO2F,KAAK,CAACggB,MAAOA,EAAQi0C,EAAO7zC,KAAMA,EAAM,GAAK6zC,EAAOh9C,KAAAA,IAC3D+I,EAAQ4nD,EAAOpQ,EAAI/6B,KAAOrc,EAAM,OAGlCwnD,EAAOxnD,EACHzR,EAAKya,OACPpJ,EAAQI,IAGZzR,EAAO6oD,EAKT,OAHa,OAAToQ,GACFvtE,EAAO2F,KAAK,CAACggB,MAAOA,EAAQi0C,EAAO7zC,IAAKwnD,EAAO3T,EAAOh9C,KAAAA,IAEjD5c,EAgBoBs9F,CAAc5pE,EAAQ/N,EAFrCI,EAAMJ,EAAQI,EAAM6zC,EAAQ7zC,IACjBqlC,EAAKqqB,WAAuB,IAAV9vD,GAAeI,IAAQ6zC,EAAQ,GAHrBlmC,EAAQinC,GCgkId4iC,CAAiB/4F,KAAMA,KAAK1C,QAAQg4D,UAEjFv1D,QACE,MAAMk2D,EAAWj2D,KAAKi2D,SAChB/mC,EAASlvB,KAAKkvB,OACpB,OAAO+mC,EAASr7D,QAAUs0B,EAAO+mC,EAAS,GAAG90C,OAE/CphB,OACE,MAAMk2D,EAAWj2D,KAAKi2D,SAChB/mC,EAASlvB,KAAKkvB,OACdkmC,EAAQa,EAASr7D,OACvB,OAAOw6D,GAASlmC,EAAO+mC,EAASb,EAAQ,GAAG7zC,KAE7CxhB,YAAYovB,EAAOhK,GACjB,MAAM7nB,EAAU0C,KAAK1C,QACfK,EAAQwxB,EAAMhK,GACd+J,EAASlvB,KAAKkvB,OACd+mC,EAAWD,GAAeh2D,KAAM,CAACmlB,SAAAA,EAAUhE,MAAOxjB,EAAO4jB,IAAK5jB,IACpE,IAAKs4D,EAASr7D,OACZ,OAEF,MAAMY,EAAS,GACTw9F,EAlGV,SAAiC17F,GAC/B,OAAIA,EAAQk6F,QACHnkC,GAEL/1D,EAAQgzD,SAA8C,aAAnChzD,EAAQ+yD,uBACtBiD,GAEFF,GA2FgB6lC,CAAwB37F,GAC7C,IAAIzC,EAAGivC,EACP,IAAKjvC,EAAI,EAAGivC,EAAOmsB,EAASr7D,OAAQC,EAAIivC,IAAQjvC,EAAG,CACjD,MAAMsmB,MAACA,EAAKI,IAAEA,GAAO00C,EAASp7D,GACxBq4C,EAAKhkB,EAAO/N,GACZgyB,EAAKjkB,EAAO3N,GAClB,GAAI2xB,IAAOC,EAAI,CACb33C,EAAO2F,KAAK+xC,GACZ,SAEF,MACMgmD,EAAeF,EAAa9lD,EAAIC,EAD5Bz4C,KAAK6hB,KAAK5e,EAAQu1C,EAAG/tB,KAAcguB,EAAGhuB,GAAY+tB,EAAG/tB,KAClB7nB,EAAQk6F,SACrD0B,EAAa/zE,GAAYgK,EAAMhK,GAC/B3pB,EAAO2F,KAAK+3F,GAEd,OAAyB,IAAlB19F,EAAOZ,OAAeY,EAAO,GAAKA,EAE3CuE,YAAYhG,EAAKu7D,EAASniD,GAExB,OADsB+kF,GAAkBl4F,KACjCu4F,CAAcx+F,EAAKiG,KAAMs1D,EAASniD,GAE3CpT,KAAKhG,EAAKonB,EAAOi0C,GACf,MAAMa,EAAWj2D,KAAKi2D,SAChBsiC,EAAgBL,GAAkBl4F,MACxC,IAAIoY,EAAOpY,KAAKy5D,MAChBt4C,EAAQA,GAAS,EACjBi0C,EAAQA,GAAUp1D,KAAKkvB,OAAOt0B,OAASumB,EACvC,IAAK,MAAMm0C,KAAWW,EACpB79C,GAAQmgF,EAAcx+F,EAAKiG,KAAMs1D,EAAS,CAACn0C,MAAAA,EAAOI,IAAKJ,EAAQi0C,EAAQ,IAEzE,QAASh9C,EAEXrY,KAAKhG,EAAK4pE,EAAWxiD,EAAOi0C,GAC1B,MAAM93D,EAAU0C,KAAK1C,SAAW,IACjB0C,KAAKkvB,QAAU,IACnBt0B,QAAU0C,EAAQ8nD,cAC3BrrD,EAAIupD,OACJ2U,GAAKl+D,EAAKiG,KAAMmhB,EAAOi0C,GACvBr7D,EAAI0pD,WAEFzjD,KAAKuvE,WACPvvE,KAAK44F,gBAAiB,EACtB54F,KAAKq4F,WAAQ99F,IA2BnB,SAAS4+F,GAAU1vF,EAAIyhC,EAAKt6B,EAAM4hE,GAChC,MAAMl1E,EAAUmM,EAAGnM,SACZyC,CAAC6Q,GAAOjT,GAAS8L,EAAG4pE,SAAS,CAACziE,GAAO4hE,GAC5C,OAAQ93E,KAAK6hB,IAAI2uB,EAAMvtC,GAASL,EAAQonD,OAASpnD,EAAQ87F,UA1B3DX,GAAY/vF,GAAK,OACjB+vF,GAAYxmE,SAAW,CACrBglC,eAAgB,OAChBC,WAAY,GACZC,iBAAkB,EAClBC,gBAAiB,QACjBhS,YAAa,EACbmL,iBAAiB,EACjBF,uBAAwB,UACxBzqD,MAAM,EACNwqD,UAAU,EACVonC,SAAS,EACTlnC,QAAS,GAEXmoC,GAAYxe,cAAgB,CAC1Bz5B,gBAAiB,kBACjBC,YAAa,eAEfg4C,GAAYx6F,YAAc,CACxBwkD,aAAa,EACbE,WAAa9lD,GAAkB,eAATA,GAAkC,SAATA,GAQjD,MAAMw8F,WAAqBtf,GACzBh6E,YAAYo5D,GACVlwD,QACAjJ,KAAK1C,aAAU/C,EACfyF,KAAKq9D,YAAS9iE,EACdyF,KAAKuqB,UAAOhwB,EACZyF,KAAK49B,UAAOrjC,EACR4+D,GACFxgE,OAAOP,OAAO4H,KAAMm5D,GAGxBp5D,QAAQu5F,EAAQC,EAAQ/mB,GACtB,MAAMl1E,EAAU0C,KAAK1C,SACfutB,EAACA,EAACC,EAAEA,GAAK9qB,KAAKqzE,SAAS,CAAC,IAAK,KAAMb,GACzC,OAAS93E,KAAK8sC,IAAI8xD,EAASzuE,EAAG,GAAKnwB,KAAK8sC,IAAI+xD,EAASzuE,EAAG,GAAMpwB,KAAK8sC,IAAIlqC,EAAQ87F,UAAY97F,EAAQonD,OAAQ,GAE7G3kD,SAASu5F,EAAQ9mB,GACf,OAAO2mB,GAAUn5F,KAAMs5F,EAAQ,IAAK9mB,GAEtCzyE,SAASw5F,EAAQ/mB,GACf,OAAO2mB,GAAUn5F,KAAMu5F,EAAQ,IAAK/mB,GAEtCzyE,eAAeyyE,GACb,MAAM3nD,EAACA,EAACC,EAAEA,GAAK9qB,KAAKqzE,SAAS,CAAC,IAAK,KAAMb,GACzC,MAAO,CAAC3nD,EAAAA,EAAGC,EAAAA,GAEb/qB,KAAKzC,GAEH,IAAIonD,GADJpnD,EAAUA,GAAW0C,KAAK1C,SAAW,IAChBonD,QAAU,EAC/BA,EAAShqD,KAAKC,IAAI+pD,EAAQA,GAAUpnD,EAAQk8F,aAAe,GAE3D,OAAgC,GAAxB90C,GADYA,GAAUpnD,EAAQ8nD,aAAe,IAGvDrlD,KAAKhG,EAAKwrD,GACR,MAAMjoD,EAAU0C,KAAK1C,QACjB0C,KAAKuqB,MAAQjtB,EAAQonD,OAAS,KAAQY,GAAetlD,KAAMulD,EAAMvlD,KAAKilB,KAAK3nB,GAAW,KAG1FvD,EAAImtD,YAAc5pD,EAAQmjD,YAC1B1mD,EAAIotD,UAAY7pD,EAAQ8nD,YACxBrrD,EAAI+sD,UAAYxpD,EAAQkjD,gBACxB4D,GAAUrqD,EAAKuD,EAAS0C,KAAK6qB,EAAG7qB,KAAK8qB,IAEvC/qB,WACE,MAAMzC,EAAU0C,KAAK1C,SAAW,GAChC,OAAOA,EAAQonD,OAASpnD,EAAQ87F,WAkBpC,SAASK,GAAaC,EAAKlnB,GACzB,MAAM3nD,EAACA,EAACC,EAAEA,EAAC1R,KAAEA,EAAIzD,MAAEA,EAAKE,OAAEA,GAAU6jF,EAAIrmB,SAAS,CAAC,IAAK,IAAK,OAAQ,QAAS,UAAWb,GACxF,IAAIhkE,EAAMi3C,EAAOl3C,EAAKm3C,EAAQi0C,EAc9B,OAbID,EAAItyB,YACNuyB,EAAO9jF,EAAS,EAChBrH,EAAO9T,KAAKqZ,IAAI8W,EAAGzR,GACnBqsC,EAAQ/qD,KAAKC,IAAIkwB,EAAGzR,GACpB7K,EAAMuc,EAAI6uE,EACVj0C,EAAS56B,EAAI6uE,IAEbA,EAAOhkF,EAAQ,EACfnH,EAAOqc,EAAI8uE,EACXl0C,EAAQ56B,EAAI8uE,EACZprF,EAAM7T,KAAKqZ,IAAI+W,EAAG1R,GAClBssC,EAAShrD,KAAKC,IAAImwB,EAAG1R,IAEhB,CAAC5K,KAAAA,EAAMD,IAAAA,EAAKk3C,MAAAA,EAAOC,OAAAA,GAE5B,SAASk0C,GAAYrvE,EAAM5sB,EAAOoW,EAAKpZ,GACrC,OAAO4vB,EAAO,EAAIgkB,GAAY5wC,EAAOoW,EAAKpZ,GA2B5C,SAASk/F,GAAcH,GACrB,MAAMnkC,EAASkkC,GAAaC,GACtB/jF,EAAQ4/C,EAAO9P,MAAQ8P,EAAO/mD,KAC9BqH,EAAS0/C,EAAO7P,OAAS6P,EAAOhnD,IAChCqhE,EA7BR,SAA0B8pB,EAAKI,EAAMC,GACnC,MAAMp8F,EAAQ+7F,EAAIp8F,QAAQ8nD,YACpB76B,EAAOmvE,EAAIvyB,cACXnjE,EAAI6kD,GAAOlrD,GACjB,MAAO,CACL2C,EAAGs5F,GAAYrvE,EAAKhc,IAAKvK,EAAEuK,IAAK,EAAGwrF,GACnCt2F,EAAGm2F,GAAYrvE,EAAKk7B,MAAOzhD,EAAEyhD,MAAO,EAAGq0C,GACvC1gG,EAAGwgG,GAAYrvE,EAAKm7B,OAAQ1hD,EAAE0hD,OAAQ,EAAGq0C,GACzC9zF,EAAG2zF,GAAYrvE,EAAK/b,KAAMxK,EAAEwK,KAAM,EAAGsrF,IAqBxBE,CAAiBN,EAAK/jF,EAAQ,EAAGE,EAAS,GACnD6uC,EAnBR,SAA2Bg1C,EAAKI,EAAMC,GACpC,MAAMzyB,mBAACA,GAAsBoyB,EAAIrmB,SAAS,CAAC,uBACrC11E,EAAQ+7F,EAAIp8F,QAAQ42F,aACpBlwF,EAAI8kD,GAAcnrD,GAClBs8F,EAAOv/F,KAAKqZ,IAAI+lF,EAAMC,GACtBxvE,EAAOmvE,EAAIvyB,cACX+yB,EAAe5yB,GAAsB5gE,GAAS/I,GACpD,MAAO,CACLuqD,QAAS0xC,IAAaM,GAAgB3vE,EAAKhc,KAAOgc,EAAK/b,KAAMxK,EAAEkkD,QAAS,EAAG+xC,GAC3E5xC,SAAUuxC,IAAaM,GAAgB3vE,EAAKhc,KAAOgc,EAAKk7B,MAAOzhD,EAAEqkD,SAAU,EAAG4xC,GAC9E9xC,WAAYyxC,IAAaM,GAAgB3vE,EAAKm7B,QAAUn7B,EAAK/b,KAAMxK,EAAEmkD,WAAY,EAAG8xC,GACpF7xC,YAAawxC,IAAaM,GAAgB3vE,EAAKm7B,QAAUn7B,EAAKk7B,MAAOzhD,EAAEokD,YAAa,EAAG6xC,IAQ1EE,CAAkBT,EAAK/jF,EAAQ,EAAGE,EAAS,GAC1D,MAAO,CACLukF,MAAO,CACLvvE,EAAG0qC,EAAO/mD,KACVsc,EAAGyqC,EAAOhnD,IACVmkC,EAAG/8B,EACHvV,EAAGyV,EACH6uC,OAAAA,GAEFoxC,MAAO,CACLjrE,EAAG0qC,EAAO/mD,KAAOohE,EAAO3pE,EACxB6kB,EAAGyqC,EAAOhnD,IAAMqhE,EAAOtvE,EACvBoyC,EAAG/8B,EAAQi6D,EAAO3pE,EAAI2pE,EAAOnsE,EAC7BrD,EAAGyV,EAAS+5D,EAAOtvE,EAAIsvE,EAAOx2E,EAC9BsrD,OAAQ,CACNwD,QAASxtD,KAAKC,IAAI,EAAG+pD,EAAOwD,QAAUxtD,KAAKC,IAAIi1E,EAAOtvE,EAAGsvE,EAAO3pE,IAChEoiD,SAAU3tD,KAAKC,IAAI,EAAG+pD,EAAO2D,SAAW3tD,KAAKC,IAAIi1E,EAAOtvE,EAAGsvE,EAAOnsE,IAClE0kD,WAAYztD,KAAKC,IAAI,EAAG+pD,EAAOyD,WAAaztD,KAAKC,IAAIi1E,EAAOx2E,EAAGw2E,EAAO3pE,IACtEmiD,YAAa1tD,KAAKC,IAAI,EAAG+pD,EAAO0D,YAAc1tD,KAAKC,IAAIi1E,EAAOx2E,EAAGw2E,EAAOnsE,OAKhF,SAASivE,GAAQgnB,EAAK7uE,EAAGC,EAAG0nD,GAC1B,MAAM6nB,EAAc,OAANxvE,EACRyvE,EAAc,OAANxvE,EAERyqC,EAASmkC,KADEW,GAASC,IACSb,GAAaC,EAAKlnB,GACrD,OAAOjd,IACH8kC,GAAS7rD,GAAW3jB,EAAG0qC,EAAO/mD,KAAM+mD,EAAO9P,UAC3C60C,GAAS9rD,GAAW1jB,EAAGyqC,EAAOhnD,IAAKgnD,EAAO7P,SAKhD,SAAS60C,GAAkBxgG,EAAKorD,GAC9BprD,EAAIorD,KAAKA,EAAKt6B,EAAGs6B,EAAKr6B,EAAGq6B,EAAKzS,EAAGyS,EAAK/kD,GAExC,SAASo6F,GAAYr1C,EAAMssB,EAAQgpB,EAAU,IAC3C,MAAM5vE,EAAIs6B,EAAKt6B,IAAM4vE,EAAQ5vE,GAAK4mD,EAAS,EACrC3mD,EAAIq6B,EAAKr6B,IAAM2vE,EAAQ3vE,GAAK2mD,EAAS,EACrC/+B,GAAKyS,EAAKt6B,EAAIs6B,EAAKzS,IAAM+nD,EAAQ5vE,EAAI4vE,EAAQ/nD,EAAI++B,EAAS,GAAK5mD,EAC/DzqB,GAAK+kD,EAAKr6B,EAAIq6B,EAAK/kD,IAAMq6F,EAAQ3vE,EAAI2vE,EAAQr6F,EAAIqxE,EAAS,GAAK3mD,EACrE,MAAO,CACLD,EAAGs6B,EAAKt6B,EAAIA,EACZC,EAAGq6B,EAAKr6B,EAAIA,EACZ4nB,EAAGyS,EAAKzS,EAAIA,EACZtyC,EAAG+kD,EAAK/kD,EAAIA,EACZskD,OAAQS,EAAKT,QAlHjB20C,GAAa3wF,GAAK,QAClB2wF,GAAapnE,SAAW,CACtBmzB,YAAa,EACbg0C,UAAW,EACXprB,iBAAkB,EAClBwrB,YAAa,EACbh1C,WAAY,SACZE,OAAQ,EACRD,SAAU,GAEZ40C,GAAapf,cAAgB,CAC3Bz5B,gBAAiB,kBACjBC,YAAa,eAyGf,MAAMi6C,WAAmB3gB,GACvBh6E,YAAYo5D,GACVlwD,QACAjJ,KAAK1C,aAAU/C,EACfyF,KAAKonE,gBAAa7sE,EAClByF,KAAKoZ,UAAO7e,EACZyF,KAAK2V,WAAQpb,EACbyF,KAAK6V,YAAStb,EACdyF,KAAK4nE,mBAAgBrtE,EACjB4+D,GACFxgE,OAAOP,OAAO4H,KAAMm5D,GAGxBp5D,KAAKhG,GACH,MAAM6tE,cAACA,EAAetqE,SAASmjD,YAACA,EAAWD,gBAAEA,IAAoBxgD,MAC3D81F,MAACA,EAAKsE,MAAEA,GAASP,GAAc75F,MAC/B26F,GAnCSj2C,EAmCe01C,EAAM11C,QAlCxBwD,SAAWxD,EAAO2D,UAAY3D,EAAOyD,YAAczD,EAAO0D,YAkCxBH,GAAqBsyC,GAnCvE,IAAmB71C,EAoCf3qD,EAAIupD,OACA82C,EAAM1nD,IAAMojD,EAAMpjD,GAAK0nD,EAAMh6F,IAAM01F,EAAM11F,IAC3CrG,EAAI8qD,YACJ81C,EAAY5gG,EAAKygG,GAAYJ,EAAOxyB,EAAekuB,IACnD/7F,EAAI6rD,OACJ+0C,EAAY5gG,EAAKygG,GAAY1E,GAAQluB,EAAewyB,IACpDrgG,EAAI+sD,UAAYrG,EAChB1mD,EAAI6L,KAAK,YAEX7L,EAAI8qD,YACJ81C,EAAY5gG,EAAKygG,GAAY1E,EAAOluB,IACpC7tE,EAAI+sD,UAAYtG,EAChBzmD,EAAI6L,OACJ7L,EAAI0pD,UAEN1jD,QAAQu5F,EAAQC,EAAQ/mB,GACtB,OAAOE,GAAQ1yE,KAAMs5F,EAAQC,EAAQ/mB,GAEvCzyE,SAASu5F,EAAQ9mB,GACf,OAAOE,GAAQ1yE,KAAMs5F,EAAQ,KAAM9mB,GAErCzyE,SAASw5F,EAAQ/mB,GACf,OAAOE,GAAQ1yE,KAAM,KAAMu5F,EAAQ/mB,GAErCzyE,eAAeyyE,GACb,MAAM3nD,EAACA,EAACC,EAAEA,EAAC1R,KAAEA,EAAIguD,WAAEA,GAAcpnE,KAAKqzE,SAAS,CAAC,IAAK,IAAK,OAAQ,cAAeb,GACjF,MAAO,CACL3nD,EAAGu8C,GAAcv8C,EAAIzR,GAAQ,EAAIyR,EACjCC,EAAGs8C,EAAat8C,GAAKA,EAAI1R,GAAQ,GAGrCrZ,SAAS6Q,GACP,MAAgB,MAATA,EAAe5Q,KAAK2V,MAAQ,EAAI3V,KAAK6V,OAAS,GAGzD6kF,GAAWhyF,GAAK,MAChBgyF,GAAWzoE,SAAW,CACpBk1C,cAAe,QACf/hB,YAAa,EACb8uC,aAAc,EACdtsB,cAAe,OACfpjB,gBAAYjqD,GAEdmgG,GAAWzgB,cAAgB,CACzBz5B,gBAAiB,kBACjBC,YAAa,eAGf,IAAIK,GAAwBnoD,OAAO4rE,OAAO,CAC1CpmE,UAAW,KACXi4F,WAAYA,GACZqC,YAAaA,GACbY,aAAcA,GACdqB,WAAYA,KAsGZ,SAASE,GAAsBl7B,GAC7B,GAAIA,EAAQ4P,WAAY,CACtB,MAAMvyE,EAAO2iE,EAAQZ,aACdY,EAAQ4P,kBACR5P,EAAQZ,MACfnmE,OAAOwQ,eAAeu2D,EAAS,OAAQ,CAAC/hE,MAAOZ,KAGnD,SAAS89F,GAAmBj6C,GAC1BA,EAAM7jD,KAAK2jD,SAAS3nD,QAAS2mE,IAC3Bk7B,GAAsBl7B,KAmB1B,IAAIo7B,GAAoB,CACtBpyF,GAAI,aACJupB,SAAU,CACR8oE,UAAW,UACX/iF,SAAS,GAEXgjF,qBAAsB,CAACp6C,EAAOl1C,EAAMpO,KAClC,IAAKA,EAAQ0a,QAEX,YADA6iF,GAAmBj6C,GAGrB,MAAMg0B,EAAiBh0B,EAAMjrC,MAC7BirC,EAAM7jD,KAAK2jD,SAAS3nD,QAAQ,CAAC2mE,EAASz1B,KACpC,MAAM60B,MAACA,EAAKxd,UAAEA,GAAaoe,EACrBjD,EAAO7b,EAAM+f,eAAe12B,GAC5BltC,EAAO+hE,GAASY,EAAQ3iE,KAC9B,GAAsD,MAAlDwF,GAAQ,CAAC++C,EAAWV,EAAMtjD,QAAQgkD,YACpC,OAEF,GAAkB,SAAdmb,EAAKh7D,KACP,OAEF,MAAMw5F,EAAQr6C,EAAMmB,OAAO0a,EAAKqD,SAChC,GAAmB,WAAfm7B,EAAMx5F,MAAoC,SAAfw5F,EAAMx5F,KACnC,OAEF,GAAIm/C,EAAMtjD,QAAQskD,QAChB,OAEF,IAAIzgC,MAACA,EAAKi0C,MAAEA,GA7ClB,SAAmDqH,EAAMvtC,GACvD,MAAM0/C,EAAa1/C,EAAOt0B,OAC1B,IACIw6D,EADAj0C,EAAQ,EAEZ,MAAMq8C,OAACA,GAAUf,GACX1oD,IAACA,EAAGpZ,IAAEA,EAAGqoE,WAAEA,EAAUC,WAAEA,GAAczF,EAAO0F,gBASlD,OARIF,IACF7hD,EAAQotB,GAAYyb,GAAa96B,EAAQsuC,EAAO5sD,KAAMmD,GAAKg2C,GAAI,EAAG6kB,EAAa,IAG/ExZ,EADE6N,EACM10B,GAAYyb,GAAa96B,EAAQsuC,EAAO5sD,KAAMjW,GAAKmvD,GAAK,EAAG3oC,EAAOytD,GAAcztD,EAEhFytD,EAAaztD,EAEhB,CAACA,MAAAA,EAAOi0C,MAAAA,GA+BU8lC,CAA0Cz+B,EAAM1/D,GAErE,GAAIq4D,IADc93D,EAAQwd,WAAa,EAAI85D,GAGzC,YADAgmB,GAAsBl7B,GAiBxB,IAAIy7B,EACJ,OAfIlyD,GAAc61B,KAChBY,EAAQZ,MAAQ/hE,SACT2iE,EAAQ3iE,KACfpE,OAAOwQ,eAAeu2D,EAAS,OAAQ,CACrCtS,cAAc,EACd96C,YAAY,EACZlJ,IAAK,WACH,OAAOpJ,KAAKsvE,YAEd/wE,IAAK,SAAS5B,GACZqD,KAAK8+D,MAAQniE,MAKXW,EAAQy9F,WAChB,IAAK,OACHI,EApLR,SAAwBp+F,EAAMokB,EAAOi0C,EAAOwf,EAAgBt3E,GAC1D,MAAM89F,EAAU99F,EAAQ89F,SAAWxmB,EACnC,GAAIwmB,GAAWhmC,EACb,OAAOr4D,EAAK5C,MAAMgnB,EAAOA,EAAQi0C,GAEnC,MAAM+lC,EAAY,GACZE,GAAejmC,EAAQ,IAAMgmC,EAAU,GAC7C,IAAIE,EAAe,EACnB,MAAMC,EAAWp6E,EAAQi0C,EAAQ,EACjC,IACIv6D,EAAG2gG,EAAcC,EAASl2C,EAAMm2C,EADhCviG,EAAIgoB,EAGR,IADAg6E,EAAUG,KAAkBv+F,EAAK5D,GAC5B0B,EAAI,EAAGA,EAAIugG,EAAU,EAAGvgG,IAAK,CAChC,IAEI2R,EAFAqrF,EAAO,EACP8D,EAAO,EAEX,MAAMC,EAAgBlhG,KAAK+sB,OAAO5sB,EAAI,GAAKwgG,GAAe,EAAIl6E,EACxD06E,EAAcnhG,KAAKqZ,IAAIrZ,KAAK+sB,OAAO5sB,EAAI,GAAKwgG,GAAe,EAAGjmC,GAASj0C,EACvE26E,EAAiBD,EAAcD,EACrC,IAAKpvF,EAAIovF,EAAepvF,EAAIqvF,EAAarvF,IACvCqrF,GAAQ96F,EAAKyP,GAAGqe,EAChB8wE,GAAQ5+F,EAAKyP,GAAGse,EAElB+sE,GAAQiE,EACRH,GAAQG,EACR,MAAMC,EAAYrhG,KAAK+sB,MAAM5sB,EAAIwgG,GAAe,EAAIl6E,EAC9C66E,EAAUthG,KAAKqZ,IAAIrZ,KAAK+sB,OAAO5sB,EAAI,GAAKwgG,GAAe,EAAGjmC,GAASj0C,GAClE0J,EAAGoxE,EAASnxE,EAAGoxE,GAAWn/F,EAAK5D,GAEtC,IADAsiG,EAAUl2C,GAAQ,EACb/4C,EAAIuvF,EAAWvvF,EAAIwvF,EAASxvF,IAC/B+4C,EAAO,GAAM7qD,KAAK6hB,KACf0/E,EAAUpE,IAAS96F,EAAKyP,GAAGse,EAAIoxE,IAC/BD,EAAUl/F,EAAKyP,GAAGqe,IAAM8wE,EAAOO,IAE9B32C,EAAOk2C,IACTA,EAAUl2C,EACVi2C,EAAez+F,EAAKyP,GACpBkvF,EAAQlvF,GAGZ2uF,EAAUG,KAAkBE,EAC5BriG,EAAIuiG,EAGN,OADAP,EAAUG,KAAkBv+F,EAAKw+F,GAC1BJ,EAwIWgB,CAAep/F,EAAMokB,EAAOi0C,EAAOwf,EAAgBt3E,GAC/D,MACF,IAAK,UACH69F,EAzIR,SAA0Bp+F,EAAMokB,EAAOi0C,EAAOwf,GAC5C,IAEI/5E,EAAGs0B,EAAOtE,EAAGC,EAAG6sE,EAAOyE,EAAUC,EAAUC,EAAYtvB,EAAMF,EAF7D+qB,EAAO,EACPC,EAAS,EAEb,MAAMqD,EAAY,GACZI,EAAWp6E,EAAQi0C,EAAQ,EAC3BmnC,EAAOx/F,EAAKokB,GAAO0J,EAEnB2xE,EADOz/F,EAAKw+F,GAAU1wE,EACV0xE,EAClB,IAAK1hG,EAAIsmB,EAAOtmB,EAAIsmB,EAAQi0C,IAASv6D,EAAG,CACtCs0B,EAAQpyB,EAAKlC,GACbgwB,GAAKsE,EAAMtE,EAAI0xE,GAAQC,EAAK5nB,EAC5B9pD,EAAIqE,EAAMrE,EACV,MAAMmtE,EAAa,EAAJptE,EACf,GAAIotE,IAAWN,EACT7sE,EAAIkiD,GACNA,EAAOliD,EACPsxE,EAAWvhG,GACFiwB,EAAIgiD,IACbA,EAAOhiD,EACPuxE,EAAWxhG,GAEbg9F,GAAQC,EAASD,EAAO1oE,EAAMtE,KAAOitE,MAChC,CACL,MAAMpgE,EAAY78B,EAAI,EACtB,IAAKouC,GAAcmzD,KAAcnzD,GAAcozD,GAAW,CACxD,MAAMI,EAAqB/hG,KAAKqZ,IAAIqoF,EAAUC,GACxCK,EAAqBhiG,KAAKC,IAAIyhG,EAAUC,GAC1CI,IAAuBH,GAAcG,IAAuB/kE,GAC9DyjE,EAAUh6F,KAAK,IACVpE,EAAK0/F,GACR5xE,EAAGgtE,IAGH6E,IAAuBJ,GAAcI,IAAuBhlE,GAC9DyjE,EAAUh6F,KAAK,IACVpE,EAAK2/F,GACR7xE,EAAGgtE,IAILh9F,EAAI,GAAK68B,IAAc4kE,GACzBnB,EAAUh6F,KAAKpE,EAAK26B,IAEtByjE,EAAUh6F,KAAKguB,GACfwoE,EAAQM,EACRH,EAAS,EACT9qB,EAAOF,EAAOhiD,EACdsxE,EAAWC,EAAWC,EAAazhG,GAGvC,OAAOsgG,EAsFWwB,CAAiB5/F,EAAMokB,EAAOi0C,EAAOwf,GACjD,MACF,QACE,MAAM,IAAI7zE,MAAM,qCAAqCzD,EAAQy9F,cAE/Dr7B,EAAQ4P,WAAa6rB,KAGzBp7F,QAAQ6gD,GACNi6C,GAAmBj6C,KAwBvB,SAASg8C,GAAWh2C,EAAMvgD,EAAO+uD,GAC/B,MAAMxvD,EAhBR,SAAyBghD,GACvB,MAAMtpD,EAAUspD,EAAKtpD,QACfu/F,EAAav/F,EAAQsI,KAC3B,IAAIA,EAAOyjC,GAAewzD,GAAcA,EAAW9gG,OAAQ8gG,GAI3D,YAHatiG,IAATqL,IACFA,IAAStI,EAAQkjD,kBAEN,IAAT56C,GAA2B,OAATA,KAGT,IAATA,EACK,SAEFA,GAGMk3F,CAAgBl2C,GAC7B,GAAIlgD,GAASd,GACX,OAAOof,MAAMpf,EAAKjI,QAAiBiI,EAErC,IAAI7J,EAAS4R,WAAW/H,GACxB,OAAIsjC,GAAentC,IAAWrB,KAAK+sB,MAAM1rB,KAAYA,GACnC,MAAZ6J,EAAK,IAA0B,MAAZA,EAAK,KAC1B7J,EAASsK,EAAQtK,KAEfA,IAAWsK,GAAStK,EAAS,GAAKA,GAAUq5D,IAGzCr5D,GAEF,CAAC,SAAU,QAAS,MAAO,QAAS,SAASwD,QAAQqG,IAAS,GAAKA,EAwB5E,MAAMm3F,GACJh9F,YAAYiV,GACVhV,KAAK6qB,EAAI7V,EAAK6V,EACd7qB,KAAK8qB,EAAI9V,EAAK8V,EACd9qB,KAAK0kD,OAAS1vC,EAAK0vC,OAErB3kD,YAAYhG,EAAKw7D,EAAQvgD,GACvB,MAAM6V,EAACA,EAACC,EAAEA,EAAC45B,OAAEA,GAAU1kD,KAGvB,OAFAu1D,EAASA,GAAU,CAACp0C,MAAO,EAAGI,IAAKmqB,IACnC3xC,EAAI+qD,IAAIj6B,EAAGC,EAAG45B,EAAQ6Q,EAAOh0C,IAAKg0C,EAAOp0C,OAAO,IACxCnM,EAAKugD,OAEfx1D,YAAYovB,GACV,MAAMtE,EAACA,EAACC,EAAEA,EAAC45B,OAAEA,GAAU1kD,KACjBytC,EAAQte,EAAMse,MACpB,MAAO,CACL5iB,EAAGA,EAAInwB,KAAKuZ,IAAIw5B,GAASiX,EACzB55B,EAAGA,EAAIpwB,KAAKi0C,IAAIlB,GAASiX,EACzBjX,MAAAA,IAkCN,SAASuvD,GAAgB7yD,GAEvB,OADcA,EAAO7R,OAAS,IACpB64C,yBAhCZ,SAAiChnC,GAC/B,MAAM7R,MAACA,EAAK1yB,KAAEA,GAAQukC,EAChB7sC,EAAUg7B,EAAMh7B,QAChB1C,EAAS09B,EAAM2pC,YAAYrnE,OAC3BmB,EAAS,GACTolB,EAAQ7jB,EAAQosC,QAAUpR,EAAM39B,IAAM29B,EAAMvkB,IAC5CwN,EAAMjkB,EAAQosC,QAAUpR,EAAMvkB,IAAMukB,EAAM39B,IAChD,IAAIE,EAAGguE,EAAQlrE,EAUf,GAREA,EADW,UAATiI,EACMub,EACU,QAATvb,EACD2b,EACC7a,GAASd,GACVA,EAAKjI,MAEL26B,EAAMurD,eAEZvmF,EAAQqkB,KAAKkvD,SAEf,OADAhI,EAASvwC,EAAM64C,yBAAyB,EAAGhwD,GACpC,IAAI47E,GAAU,CACnBlyE,EAAGg+C,EAAOh+C,EACVC,EAAG+9C,EAAO/9C,EACV45B,OAAQpsB,EAAMq4C,8BAA8BhzE,KAGhD,IAAK9C,EAAI,EAAGA,EAAID,IAAUC,EACxBkB,EAAOoF,KAAKm3B,EAAM64C,yBAAyBt2E,EAAG8C,IAEhD,OAAO5B,EAKEkhG,CAAwB9yD,GA7EnC,SAA+BA,GAC7B,MAAM7R,MAACA,EAAQ,GAAE1yB,KAAEA,GAAQukC,EAC3B,IACIi9B,EADArrE,EAAS,KAWb,MATa,UAAT6J,EACF7J,EAASu8B,EAAMotB,OACG,QAAT9/C,EACT7J,EAASu8B,EAAM/pB,IACN7H,GAASd,GAClB7J,EAASu8B,EAAM6tC,iBAAiBvgE,EAAKjI,OAC5B26B,EAAM4vC,eACfnsE,EAASu8B,EAAM4vC,gBAEbh/B,GAAentC,IACjBqrE,EAAa9uC,EAAMjc,eACZ,CACLwO,EAAGu8C,EAAarrE,EAAS,KACzB+uB,EAAGs8C,EAAa,KAAOrrE,IAGpB,KA2DAmhG,CAAsB/yD,GAE/B,SAASgzD,GAAeh8E,EAAOI,EAAK2N,GAClC,KAAM3N,EAAMJ,EAAOI,IAAO,CACxB,MAAM4N,EAAQD,EAAO3N,GACrB,IAAKyD,MAAMmK,EAAMtE,KAAO7F,MAAMmK,EAAMrE,GAClC,MAGJ,OAAOvJ,EAiDT,SAAS67E,GAAeluE,EAAQmuE,EAAaC,GAC3C,MAAMC,EAAY,GAClB,IAAK,IAAI/wF,EAAI,EAAGA,EAAI8wF,EAAW1iG,OAAQ4R,IAAK,CAC1C,MAAMo6C,EAAO02C,EAAW9wF,IAClBmvE,MAACA,EAAK5S,KAAEA,EAAI55C,MAAEA,GAASquE,GAAU52C,EAAMy2C,EAAa,KAC1D,MAAKluE,GAAUwsD,GAAS5S,GAGxB,GAAI4S,EACF4hB,EAAUrxF,QAAQijB,QAGlB,GADAD,EAAO/tB,KAAKguB,IACP45C,EACH,MAIN75C,EAAO/tB,QAAQo8F,GAEjB,SAASC,GAAU52C,EAAMy2C,EAAal4E,GACpC,MAAMgK,EAAQy3B,EAAK62C,YAAYJ,EAAal4E,GAC5C,IAAKgK,EACH,MAAO,GAET,MAAMuuE,EAAavuE,EAAMhK,GACnB8wC,EAAWrP,EAAKqP,SAChB0nC,EAAa/2C,EAAK13B,OACxB,IAAIysD,GAAQ,EACR5S,GAAO,EACX,IAAK,IAAIluE,EAAI,EAAGA,EAAIo7D,EAASr7D,OAAQC,IAAK,CACxC,MAAMy6D,EAAUW,EAASp7D,GACnB+iG,EAAaD,EAAWroC,EAAQn0C,OAAOgE,GACvC04E,EAAYF,EAAWroC,EAAQ/zC,KAAK4D,GAC1C,GAAIqpB,GAAWkvD,EAAYE,EAAYC,GAAY,CACjDliB,EAAQ+hB,IAAeE,EACvB70B,EAAO20B,IAAeG,EACtB,OAGJ,MAAO,CAACliB,MAAAA,EAAO5S,KAAAA,EAAM55C,MAAAA,GAEvB,SAASy7B,GAAUzgB,GACjB,MAAMyW,MAACA,EAAKh7C,KAAEA,EAAIghD,KAAEA,GAAQzc,EAC5B,GAAIjB,GAAetjC,GACjB,OA1NJ,SAAwBg7C,EAAOv6C,GAC7B,MAAMo2D,EAAO7b,EAAM+f,eAAet6D,GAElC,OADgBo2D,GAAQ7b,EAAM6qB,iBAAiBplE,GAC9Bo2D,EAAKiD,QAAU,KAuNvBo+B,CAAel9C,EAAOh7C,GAE/B,GAAa,UAATA,EACF,OA5EJ,SAAwBukC,GACtB,MAAM7R,MAACA,EAAKjyB,MAAEA,EAAKugD,KAAEA,GAAQzc,EACvBjb,EAAS,GACT+mC,EAAWrP,EAAKqP,SAChB8nC,EAAen3C,EAAK13B,OACpBouE,EAUR,SAAuBhlE,EAAOjyB,GAC5B,MAAM23F,EAAQ,GACRze,EAAQjnD,EAAM6kC,wBAAwB,QAC5C,IAAK,IAAItiE,EAAI,EAAGA,EAAI0kF,EAAM3kF,OAAQC,IAAK,CACrC,MAAM4hE,EAAO8iB,EAAM1kF,GACnB,GAAI4hE,EAAKp2D,QAAUA,EACjB,MAEGo2D,EAAKkG,QACRq7B,EAAM9xF,QAAQuwD,EAAKiD,SAGvB,OAAOs+B,EAtBYC,CAAc3lE,EAAOjyB,GACxCi3F,EAAWn8F,KAAK+8F,GAAmB,CAACrzE,EAAG,KAAMC,EAAGwN,EAAMotB,QAASkB,IAC/D,IAAK,IAAI/rD,EAAI,EAAGA,EAAIo7D,EAASr7D,OAAQC,IAAK,CACxC,MAAMy6D,EAAUW,EAASp7D,GACzB,IAAK,IAAI2R,EAAI8oD,EAAQn0C,MAAO3U,GAAK8oD,EAAQ/zC,IAAK/U,IAC5C4wF,GAAeluE,EAAQ6uE,EAAavxF,GAAI8wF,GAG5C,OAAO,IAAI7E,GAAY,CAACvpE,OAAAA,EAAQ5xB,QAAS,KA+DhC6gG,CAAeh0D,GAExB,GAAa,UAATvkC,EACF,OAAO,EAET,MAAMw4F,EAAWpB,GAAgB7yD,GACjC,OAAIi0D,aAAoBrB,GACfqB,EAEFF,GAAmBE,EAAUx3C,GAEtC,SAASs3C,GAAmBE,EAAUx3C,GACpC,IAAI13B,EAAS,GACTuqC,GAAQ,EAOZ,OANI/vD,GAAQ00F,IACV3kC,GAAQ,EACRvqC,EAASkvE,GAETlvE,EAhHJ,SAA4BkvE,EAAUx3C,GACpC,MAAM/7B,EAACA,EAAI,KAAIC,EAAEA,EAAI,MAAQszE,GAAY,GACnCT,EAAa/2C,EAAK13B,OAClBA,EAAS,GAaf,OAZA03B,EAAKqP,SAASl9D,QAAQ,EAAEooB,MAAAA,EAAOI,IAAAA,MAC7BA,EAAM47E,GAAeh8E,EAAOI,EAAKo8E,GACjC,MAAMhiB,EAAQgiB,EAAWx8E,GACnB4nD,EAAO40B,EAAWp8E,GACd,OAANuJ,GACFoE,EAAO/tB,KAAK,CAAC0pB,EAAG8wD,EAAM9wD,EAAGC,EAAAA,IACzBoE,EAAO/tB,KAAK,CAAC0pB,EAAGk+C,EAAKl+C,EAAGC,EAAAA,KACT,OAAND,IACTqE,EAAO/tB,KAAK,CAAC0pB,EAAAA,EAAGC,EAAG6wD,EAAM7wD,IACzBoE,EAAO/tB,KAAK,CAAC0pB,EAAAA,EAAGC,EAAGi+C,EAAKj+C,OAGrBoE,EAgGImvE,CAAmBD,EAAUx3C,GAEjC13B,EAAOt0B,OAAS,IAAI69F,GAAY,CACrCvpE,OAAAA,EACA5xB,QAAS,CAACgzD,QAAS,GACnBmJ,MAAAA,EACAwX,UAAWxX,IACR,KAEP,SAAS6kC,GAAc5zD,EAASrkC,EAAOk4F,GAErC,IAAI34F,EADW8kC,EAAQrkC,GACLT,KAClB,MAAM44F,EAAU,CAACn4F,GACjB,IAAItK,EACJ,IAAKwiG,EACH,OAAO34F,EAET,MAAgB,IAATA,IAA6C,IAA3B44F,EAAQj/F,QAAQqG,IAAc,CACrD,IAAKsjC,GAAetjC,GAClB,OAAOA,EAGT,GADA7J,EAAS2uC,EAAQ9kC,IACZ7J,EACH,OAAO,EAET,GAAIA,EAAO6+D,QACT,OAAOh1D,EAET44F,EAAQr9F,KAAKyE,GACbA,EAAO7J,EAAO6J,KAEhB,OAAO,EAET,SAAS29D,GAAMxpE,EAAKgC,EAAQ0iG,GAC1B,MAAMxoC,SAACA,EAAQ/mC,OAAEA,GAAUnzB,EAC3B,IAAI4/E,GAAQ,EACR+iB,GAAW,EACf3kG,EAAI8qD,YACJ,IAAK,MAAMyQ,KAAWW,EAAU,CAC9B,MAAM90C,MAACA,EAAKI,IAAEA,GAAO+zC,EACfjH,EAAan/B,EAAO/N,GACpB0uD,EAAY3gD,EAAOiuE,GAAeh8E,EAAOI,EAAK2N,IAChDysD,GACF5hF,EAAIirD,OAAOqJ,EAAWxjC,EAAGwjC,EAAWvjC,GACpC6wD,GAAQ,IAER5hF,EAAIkrD,OAAOoJ,EAAWxjC,EAAG4zE,GACzB1kG,EAAIkrD,OAAOoJ,EAAWxjC,EAAGwjC,EAAWvjC,IAEtC4zE,IAAa3iG,EAAOu7F,YAAYv9F,EAAKu7D,EAAS,CAACh0C,KAAMo9E,IACjDA,EACF3kG,EAAIgrD,YAEJhrD,EAAIkrD,OAAO4qB,EAAUhlD,EAAG4zE,GAG5B1kG,EAAIkrD,OAAOlpD,EAAO4/E,QAAQ9wD,EAAG4zE,GAC7B1kG,EAAIgrD,YACJhrD,EAAI6rD,OAEN,SAAS+4C,GAAUx5E,EAAUw2D,EAAO5S,EAAM3wD,GACxC,GAAIA,EACF,OAEF,IAAI+I,EAAQw6D,EAAMx2D,GACd5D,EAAMwnD,EAAK5jD,GAKf,MAJiB,UAAbA,IACFhE,EAAQ4sB,GAAgB5sB,GACxBI,EAAMwsB,GAAgBxsB,IAEjB,CAAC4D,SAAAA,EAAUhE,MAAAA,EAAOI,IAAAA,GAE3B,SAASq9E,GAASzlG,EAAGC,EAAGsV,EAAMjW,GAC5B,OAAIU,GAAKC,EACAX,EAAGU,EAAEuV,GAAOtV,EAAEsV,IAEhBvV,EAAIA,EAAEuV,GAAQtV,EAAIA,EAAEsV,GAAQ,EAwCrC,SAASmwF,GAAW9kG,EAAKu+B,EAAOi9B,GAC9B,MAAMhnD,IAACA,EAAGm3C,OAAEA,GAAUptB,EAAMsoB,MAAM+iB,WAC5Bx+C,SAACA,EAAQhE,MAAEA,EAAKI,IAAEA,GAAOg0C,GAAU,GACxB,MAAbpwC,IACFprB,EAAI8qD,YACJ9qD,EAAIorD,KAAKhkC,EAAO5S,EAAKgT,EAAMJ,EAAOukC,EAASn3C,GAC3CxU,EAAI6rD,QAGR,SAASk5C,GAAmB/kG,EAAKgC,EAAQozB,EAAOhK,GAC9C,MAAM45E,EAAoBhjG,EAAO0hG,YAAYtuE,EAAOhK,GAChD45E,GACFhlG,EAAIkrD,OAAO85C,EAAkBl0E,EAAGk0E,EAAkBj0E,GAGtD,SAASk0E,GAAMjlG,EAAKo/D,GAClB,MAAMvS,KAACA,EAAI7qD,OAAEA,EAAMopB,SAAEA,EAAQg6B,MAAEA,EAAK7mB,MAAEA,GAAS6gC,EACzClD,EAvDR,SAAmBrP,EAAM7qD,EAAQopB,GAC/B,MAAM8wC,EAAWrP,EAAKqP,SAChB/mC,EAAS03B,EAAK13B,OACd+vE,EAAUljG,EAAOmzB,OACjB64D,EAAQ,GACd,IAAK,MAAMzyB,KAAWW,EAAU,CAC9B,IAAI90C,MAACA,EAAKI,IAAEA,GAAO+zC,EACnB/zC,EAAM47E,GAAeh8E,EAAOI,EAAK2N,GACjC,MAAMqmC,EAASopC,GAAUx5E,EAAU+J,EAAO/N,GAAQ+N,EAAO3N,GAAM+zC,EAAQl9C,MACvE,IAAKrc,EAAOk6D,SAAU,CACpB8xB,EAAM5mF,KAAK,CACTgpC,OAAQmrB,EACRv5D,OAAQw5D,EACRp0C,MAAO+N,EAAO/N,GACdI,IAAK2N,EAAO3N,KAEd,SAEF,MAAM29E,EAAiBlpC,GAAej6D,EAAQw5D,GAC9C,IAAK,MAAM4pC,KAAOD,EAAgB,CAChC,MAAME,EAAYT,GAAUx5E,EAAU85E,EAAQE,EAAIh+E,OAAQ89E,EAAQE,EAAI59E,KAAM49E,EAAI/mF,MAC1EinF,EAAchqC,GAAcC,EAASpmC,EAAQkwE,GACnD,IAAK,MAAME,KAAcD,EACvBtX,EAAM5mF,KAAK,CACTgpC,OAAQm1D,EACRvjG,OAAQojG,EACRh+E,MAAO,CACLphB,CAAColB,GAAWy5E,GAASrpC,EAAQ6pC,EAAW,QAAS1kG,KAAKC,MAExD4mB,IAAK,CACHxhB,CAAColB,GAAWy5E,GAASrpC,EAAQ6pC,EAAW,MAAO1kG,KAAKqZ,SAM9D,OAAOg0E,EAmBU4Q,CAAU/xC,EAAM7qD,EAAQopB,GACzC,IAAK,MAAOglB,OAAQ7xC,EAAKyD,OAAQojG,EAAGh+E,MAAEA,EAAKI,IAAEA,KAAQ00C,EAAU,CAC7D,MAAO53D,OAAOmiD,gBAACA,EAAkBrB,GAAS,IAAM7mD,EAC1CinG,GAAsB,IAAXxjG,EACjBhC,EAAIupD,OACJvpD,EAAI+sD,UAAYtG,EAChBq+C,GAAW9kG,EAAKu+B,EAAOinE,GAAYZ,GAAUx5E,EAAUhE,EAAOI,IAC9DxnB,EAAI8qD,YACJ,MAAM65C,IAAa93C,EAAK0wC,YAAYv9F,EAAKzB,GACzC,IAAI8f,EACJ,GAAImnF,EAAU,CACRb,EACF3kG,EAAIgrD,YAEJ+5C,GAAmB/kG,EAAKgC,EAAQwlB,EAAK4D,GAEvC,MAAMq6E,IAAezjG,EAAOu7F,YAAYv9F,EAAKolG,EAAK,CAAC79E,KAAMo9E,EAAUh1D,SAAS,IAC5EtxB,EAAOsmF,GAAYc,EACdpnF,GACH0mF,GAAmB/kG,EAAKgC,EAAQolB,EAAOgE,GAG3CprB,EAAIgrD,YACJhrD,EAAI6L,KAAKwS,EAAO,UAAY,WAC5Bre,EAAI0pD,WAiBR,SAASg8C,GAAS1lG,EAAKowC,EAAQob,GAC7B,MAAMxpD,EAAS6uD,GAAUzgB,IACnByc,KAACA,EAAItuB,MAAEA,EAAK1nB,KAAEA,GAAQu5B,EACtBu1D,EAAW94C,EAAKtpD,QAChBu/F,EAAa6C,EAAS95F,KACtBu5C,EAAQugD,EAASl/C,iBACjBm/C,MAACA,EAAQxgD,EAAK6+C,MAAEA,EAAQ7+C,GAAS09C,GAAc,GACjD9gG,GAAU6qD,EAAK13B,OAAOt0B,SACxB+qD,GAAS5rD,EAAKwrD,GAtBlB,SAAgBxrD,EAAKo/D,GACnB,MAAMvS,KAACA,EAAI7qD,OAAEA,EAAM4jG,MAAEA,EAAK3B,MAAEA,EAAKz4C,KAAEA,EAAIjtB,MAAEA,GAAS6gC,EAC5Ch0C,EAAWyhC,EAAK6S,MAAQ,QAAUN,EAAIvoD,KAC5C7W,EAAIupD,OACa,MAAbn+B,GAAoB64E,IAAU2B,IAChCp8B,GAAMxpE,EAAKgC,EAAQwpD,EAAKh3C,KACxBywF,GAAMjlG,EAAK,CAAC6sD,KAAAA,EAAM7qD,OAAAA,EAAQojD,MAAOwgD,EAAOrnE,MAAAA,EAAOnT,SAAAA,IAC/CprB,EAAI0pD,UACJ1pD,EAAIupD,OACJigB,GAAMxpE,EAAKgC,EAAQwpD,EAAKG,SAE1Bs5C,GAAMjlG,EAAK,CAAC6sD,KAAAA,EAAM7qD,OAAAA,EAAQojD,MAAO6+C,EAAO1lE,MAAAA,EAAOnT,SAAAA,IAC/CprB,EAAI0pD,UAWFm8C,CAAO7lG,EAAK,CAAC6sD,KAAAA,EAAM7qD,OAAAA,EAAQ4jG,MAAAA,EAAO3B,MAAAA,EAAOz4C,KAAAA,EAAMjtB,MAAAA,EAAO1nB,KAAAA,IACtDi1C,GAAW9rD,IAGf,IAAI8lG,GAAgB,CAClBn3F,GAAI,SACJ3I,oBAAoB6gD,EAAOk/C,EAAOxiG,GAChC,MAAM83D,GAASxU,EAAM7jD,KAAK2jD,UAAY,IAAI9lD,OACpC8vC,EAAU,GAChB,IAAI+xB,EAAM5hE,EAAG+rD,EAAMzc,EACnB,IAAKtvC,EAAI,EAAGA,EAAIu6D,IAASv6D,EACvB4hE,EAAO7b,EAAM+f,eAAe9lE,GAC5B+rD,EAAO6V,EAAKiD,QACZv1B,EAAS,KACLyc,GAAQA,EAAKtpD,SAAWspD,aAAgB6xC,KAC1CtuD,EAAS,CACPywB,QAASha,EAAM6qB,iBAAiB5wE,GAChCwL,MAAOxL,EACP+K,KAAMg3F,GAAWh2C,EAAM/rD,EAAGu6D,GAC1BxU,MAAAA,EACAhwC,KAAM6rD,EAAKt7B,WAAW7jC,QAAQgkD,UAC9BhpB,MAAOmkC,EAAKQ,OACZrW,KAAAA,IAGJ6V,EAAKsjC,QAAU51D,EACfO,EAAQvpC,KAAKgpC,GAEf,IAAKtvC,EAAI,EAAGA,EAAIu6D,IAASv6D,EACvBsvC,EAASO,EAAQ7vC,GACZsvC,IAA0B,IAAhBA,EAAOvkC,OAGtBukC,EAAOvkC,KAAO04F,GAAc5zD,EAAS7vC,EAAGyC,EAAQihG,aAGpDx+F,WAAW6gD,EAAOk/C,EAAOxiG,GACvB,MAAM26D,EAA4B,eAArB36D,EAAQ0iG,SACf/jC,EAAWrb,EAAM0xB,+BACjB/sB,EAAO3E,EAAM+iB,UACnB,IAAK,IAAI9oE,EAAIohE,EAASrhE,OAAS,EAAGC,GAAK,IAAKA,EAAG,CAC7C,MAAMsvC,EAAS8xB,EAASphE,GAAGklG,QACtB51D,IAGLA,EAAOyc,KAAKkpB,oBAAoBvqB,EAAMpb,EAAOv5B,MACzCqnD,GACFwnC,GAAS7+C,EAAM7mD,IAAKowC,EAAQob,MAIlCxlD,mBAAmB6gD,EAAOk/C,EAAOxiG,GAC/B,GAAyB,uBAArBA,EAAQ0iG,SACV,OAEF,MAAM/jC,EAAWrb,EAAM0xB,+BACvB,IAAK,IAAIz3E,EAAIohE,EAASrhE,OAAS,EAAGC,GAAK,IAAKA,EAAG,CAC7C,MAAMsvC,EAAS8xB,EAASphE,GAAGklG,QACvB51D,GACFs1D,GAAS7+C,EAAM7mD,IAAKowC,EAAQyW,EAAM+iB,aAIxC5jE,kBAAkB6gD,EAAOl1C,EAAMpO,GAC7B,MAAM6sC,EAASz+B,EAAK+wD,KAAKsjC,QACpB51D,IAA0B,IAAhBA,EAAOvkC,MAAuC,sBAArBtI,EAAQ0iG,UAGhDP,GAAS7+C,EAAM7mD,IAAKowC,EAAQyW,EAAM+iB,YAEpC1xC,SAAU,CACRssE,WAAW,EACXyB,SAAU,sBAId,MAAMC,GAAa,CAACC,EAAW9Y,KAC7B,IAAI+Y,UAACA,EAAY/Y,EAAQgZ,SAAEA,EAAWhZ,GAAY8Y,EAKlD,OAJIA,EAAUG,gBACZF,EAAYzlG,KAAKqZ,IAAIosF,EAAW/Y,GAChCgZ,EAAW1lG,KAAKqZ,IAAIqsF,EAAUhZ,IAEzB,CACLgZ,SAAAA,EACAD,UAAAA,EACAG,WAAY5lG,KAAKC,IAAIysF,EAAU+Y,KAInC,MAAMI,WAAexmB,GACnBh6E,YAAY+6D,GACV7xD,QACAjJ,KAAKwgG,QAAS,EACdxgG,KAAKygG,eAAiB,GACtBzgG,KAAK0gG,aAAe,KACpB1gG,KAAK2gG,cAAe,EACpB3gG,KAAK4gD,MAAQka,EAAOla,MACpB5gD,KAAK1C,QAAUw9D,EAAOx9D,QACtB0C,KAAKjG,IAAM+gE,EAAO/gE,IAClBiG,KAAK4gG,iBAAcrmG,EACnByF,KAAK6gG,iBAActmG,EACnByF,KAAK8gG,gBAAavmG,EAClByF,KAAKkyD,eAAY33D,EACjByF,KAAKqnD,cAAW9sD,EAChByF,KAAKuO,SAAMhU,EACXyF,KAAK0lD,YAASnrD,EACdyF,KAAKwO,UAAOjU,EACZyF,KAAKylD,WAAQlrD,EACbyF,KAAK6V,YAAStb,EACdyF,KAAK2V,WAAQpb,EACbyF,KAAKq+E,cAAW9jF,EAChByF,KAAKs3B,cAAW/8B,EAChByF,KAAKo/C,YAAS7kD,EACdyF,KAAK20E,cAAWp6E,EAElBwF,OAAOsnD,EAAU6K,EAAWD,GAC1BjyD,KAAKqnD,SAAWA,EAChBrnD,KAAKkyD,UAAYA,EACjBlyD,KAAKq+E,SAAWpsB,EAChBjyD,KAAK8/E,gBACL9/E,KAAK+gG,cACL/gG,KAAK+gF,MAEPhhF,gBACMC,KAAKqc,gBACPrc,KAAK2V,MAAQ3V,KAAKqnD,SAClBrnD,KAAKwO,KAAOxO,KAAKq+E,SAAS7vE,KAC1BxO,KAAKylD,MAAQzlD,KAAK2V,QAElB3V,KAAK6V,OAAS7V,KAAKkyD,UACnBlyD,KAAKuO,IAAMvO,KAAKq+E,SAAS9vE,IACzBvO,KAAK0lD,OAAS1lD,KAAK6V,QAGvB9V,cACE,MAAMmgG,EAAYlgG,KAAK1C,QAAQ0kE,QAAU,GACzC,IAAI4+B,EAAc39F,GAASi9F,EAAUc,eAAgB,CAAChhG,KAAK4gD,OAAQ5gD,OAAS,GACxEkgG,EAAUt7F,SACZg8F,EAAcA,EAAYh8F,OAAQmrB,GAASmwE,EAAUt7F,OAAOmrB,EAAM/vB,KAAK4gD,MAAM7jD,QAE3EmjG,EAAU5wE,OACZsxE,EAAcA,EAAYtxE,KAAK,CAACn2B,EAAGC,IAAM8mG,EAAU5wE,KAAKn2B,EAAGC,EAAG4G,KAAK4gD,MAAM7jD,QAEvEiD,KAAK1C,QAAQosC,SACfk3D,EAAYl3D,UAEd1pC,KAAK4gG,YAAcA,EAErB7gG,MACE,MAAMzC,QAACA,EAAOvD,IAAEA,GAAOiG,KACvB,IAAK1C,EAAQm8B,QAEX,YADAz5B,KAAK2V,MAAQ3V,KAAK6V,OAAS,GAG7B,MAAMqqF,EAAY5iG,EAAQ0kE,OACpBi/B,EAAYj4C,GAAOk3C,EAAUn/C,MAC7BqmC,EAAW6Z,EAAUh8E,KACrBq9D,EAActiF,KAAKkhG,uBACnBd,SAACA,EAAQE,WAAEA,GAAcL,GAAWC,EAAW9Y,GACrD,IAAIzxE,EAAOE,EACX9b,EAAIgnD,KAAOkgD,EAAUj+C,OACjBhjD,KAAKqc,gBACP1G,EAAQ3V,KAAKqnD,SACbxxC,EAAS7V,KAAKmhG,SAAS7e,EAAa8E,EAAUgZ,EAAUE,GAAc,KAEtEzqF,EAAS7V,KAAKkyD,UACdv8C,EAAQ3V,KAAKohG,SAAS9e,EAAa8E,EAAUgZ,EAAUE,GAAc,IAEvEtgG,KAAK2V,MAAQjb,KAAKqZ,IAAI4B,EAAOrY,EAAQ+pD,UAAYrnD,KAAKqnD,UACtDrnD,KAAK6V,OAASnb,KAAKqZ,IAAI8B,EAAQvY,EAAQ40D,WAAalyD,KAAKkyD,WAE3DnyD,SAASuiF,EAAa8E,EAAUgZ,EAAUE,GACxC,MAAMvmG,IAACA,EAAGstD,SAAEA,EAAU/pD,SAAU0kE,QAAQiU,QAACA,KAAaj2E,KAChDqhG,EAAWrhG,KAAKygG,eAAiB,GACjCK,EAAa9gG,KAAK8gG,WAAa,CAAC,GAChC7/C,EAAaq/C,EAAarqB,EAChC,IAAIqrB,EAAchf,EAClBvoF,EAAIgtD,UAAY,OAChBhtD,EAAIitD,aAAe,SACnB,IAAIu6C,GAAO,EACPhzF,GAAO0yC,EAYX,OAXAjhD,KAAK4gG,YAAY7nG,QAAQ,CAACq1E,EAAYvzE,KACpC,MAAM25D,EAAY4rC,EAAYhZ,EAAW,EAAKrtF,EAAImpD,YAAYkrB,EAAWtxE,MAAM6Y,OACrE,IAAN9a,GAAWimG,EAAWA,EAAWlmG,OAAS,GAAK45D,EAAY,EAAIyhB,EAAU5uB,KAC3Ei6C,GAAergD,EACf6/C,EAAWA,EAAWlmG,QAAUC,EAAI,EAAI,EAAI,IAAM,EAClD0T,GAAO0yC,EACPsgD,KAEFF,EAASxmG,GAAK,CAAC2T,KAAM,EAAGD,IAAAA,EAAKgzF,IAAAA,EAAK5rF,MAAO6+C,EAAW3+C,OAAQyqF,GAC5DQ,EAAWA,EAAWlmG,OAAS,IAAM45D,EAAYyhB,IAE5CqrB,EAETvhG,SAASuiF,EAAa8E,EAAUgZ,EAAUE,GACxC,MAAMvmG,IAACA,EAAGm4D,UAAEA,EAAW50D,SAAU0kE,QAAQiU,QAACA,KAAaj2E,KACjDqhG,EAAWrhG,KAAKygG,eAAiB,GACjCI,EAAc7gG,KAAK6gG,YAAc,GACjCW,EAActvC,EAAYowB,EAChC,IAAImf,EAAaxrB,EACbyrB,EAAkB,EAClBC,EAAmB,EACnBnzF,EAAO,EACPozF,EAAM,EAgBV,OAfA5hG,KAAK4gG,YAAY7nG,QAAQ,CAACq1E,EAAYvzE,KACpC,MAAM25D,EAAY4rC,EAAYhZ,EAAW,EAAKrtF,EAAImpD,YAAYkrB,EAAWtxE,MAAM6Y,MAC3E9a,EAAI,GAAK8mG,EAAmBrB,EAAa,EAAIrqB,EAAUurB,IACzDC,GAAcC,EAAkBzrB,EAChC4qB,EAAY1/F,KAAK,CAACwU,MAAO+rF,EAAiB7rF,OAAQ8rF,IAClDnzF,GAAQkzF,EAAkBzrB,EAC1B2rB,IACAF,EAAkBC,EAAmB,GAEvCN,EAASxmG,GAAK,CAAC2T,KAAAA,EAAMD,IAAKozF,EAAkBC,IAAAA,EAAKjsF,MAAO6+C,EAAW3+C,OAAQyqF,GAC3EoB,EAAkBhnG,KAAKC,IAAI+mG,EAAiBltC,GAC5CmtC,GAAoBrB,EAAarqB,IAEnCwrB,GAAcC,EACdb,EAAY1/F,KAAK,CAACwU,MAAO+rF,EAAiB7rF,OAAQ8rF,IAC3CF,EAET1hG,iBACE,IAAKC,KAAK1C,QAAQm8B,QAChB,OAEF,MAAM6oD,EAActiF,KAAKkhG,uBAClBT,eAAgBY,EAAU/jG,SAASwrC,MAACA,EAAOk5B,QAAQiU,QAACA,GAAQx6D,IAAEA,IAAQzb,KACvE6hG,EAAYztC,GAAc34C,EAAKzb,KAAKwO,KAAMxO,KAAK2V,OACrD,GAAI3V,KAAKqc,eAAgB,CACvB,IAAIklF,EAAM,EACN/yF,EAAOu6B,GAAeD,EAAO9oC,KAAKwO,KAAOynE,EAASj2E,KAAKylD,MAAQzlD,KAAK8gG,WAAWS,IACnF,IAAK,MAAMO,KAAUT,EACfE,IAAQO,EAAOP,MACjBA,EAAMO,EAAOP,IACb/yF,EAAOu6B,GAAeD,EAAO9oC,KAAKwO,KAAOynE,EAASj2E,KAAKylD,MAAQzlD,KAAK8gG,WAAWS,KAEjFO,EAAOvzF,KAAOvO,KAAKuO,IAAM+zE,EAAcrM,EACvC6rB,EAAOtzF,KAAOqzF,EAAUttC,WAAWstC,EAAUh3E,EAAErc,GAAOszF,EAAOnsF,OAC7DnH,GAAQszF,EAAOnsF,MAAQsgE,MAEpB,CACL,IAAI2rB,EAAM,EACNrzF,EAAMw6B,GAAeD,EAAO9oC,KAAKuO,IAAM+zE,EAAcrM,EAASj2E,KAAK0lD,OAAS1lD,KAAK6gG,YAAYe,GAAK/rF,QACtG,IAAK,MAAMisF,KAAUT,EACfS,EAAOF,MAAQA,IACjBA,EAAME,EAAOF,IACbrzF,EAAMw6B,GAAeD,EAAO9oC,KAAKuO,IAAM+zE,EAAcrM,EAASj2E,KAAK0lD,OAAS1lD,KAAK6gG,YAAYe,GAAK/rF,SAEpGisF,EAAOvzF,IAAMA,EACbuzF,EAAOtzF,MAAQxO,KAAKwO,KAAOynE,EAC3B6rB,EAAOtzF,KAAOqzF,EAAUttC,WAAWstC,EAAUh3E,EAAEi3E,EAAOtzF,MAAOszF,EAAOnsF,OACpEpH,GAAOuzF,EAAOjsF,OAASogE,GAI7Bl2E,eACE,MAAiC,QAA1BC,KAAK1C,QAAQg6B,UAAgD,WAA1Bt3B,KAAK1C,QAAQg6B,SAEzDv3B,OACE,GAAIC,KAAK1C,QAAQm8B,QAAS,CACxB,MAAM1/B,EAAMiG,KAAKjG,IACjB4rD,GAAS5rD,EAAKiG,MACdA,KAAK+hG,QACLl8C,GAAW9rD,IAGfgG,QACE,MAAOzC,QAAS0X,EAAI6rF,YAAEA,EAAWC,WAAEA,EAAU/mG,IAAEA,GAAOiG,MAChD8oC,MAACA,EAAOk5B,OAAQk+B,GAAalrF,EAC7BgtF,EAAe/vE,GAASktB,MACxB0iD,EAAYztC,GAAcp/C,EAAKyG,IAAKzb,KAAKwO,KAAMxO,KAAK2V,OACpDsrF,EAAYj4C,GAAOk3C,EAAUn/C,OAC5B5B,MAAO8iD,EAAShsB,QAAEA,GAAWiqB,EAC9B9Y,EAAW6Z,EAAUh8E,KACrBi9E,EAAe9a,EAAW,EAChC,IAAIz5D,EACJ3tB,KAAK+mF,YACLhtF,EAAIgtD,UAAY86C,EAAU96C,UAAU,QACpChtD,EAAIitD,aAAe,SACnBjtD,EAAIotD,UAAY,GAChBptD,EAAIgnD,KAAOkgD,EAAUj+C,OACrB,MAAMo9C,SAACA,EAAQD,UAAEA,EAASG,WAAEA,GAAcL,GAAWC,EAAW9Y,GAqD1D/qE,EAAerc,KAAKqc,eACpBimE,EAActiF,KAAKkhG,sBAEvBvzE,EADEtR,EACO,CACPwO,EAAGke,GAAeD,EAAO9oC,KAAKwO,KAAOynE,EAASj2E,KAAKylD,MAAQq7C,EAAW,IACtEh2E,EAAG9qB,KAAKuO,IAAM0nE,EAAUqM,EACxB17B,KAAM,GAGC,CACP/7B,EAAG7qB,KAAKwO,KAAOynE,EACfnrD,EAAGie,GAAeD,EAAO9oC,KAAKuO,IAAM+zE,EAAcrM,EAASj2E,KAAK0lD,OAASm7C,EAAY,GAAGhrF,QACxF+wC,KAAM,GAGV+N,GAAsB30D,KAAKjG,IAAKib,EAAKmtF,eACrC,MAAMlhD,EAAaq/C,EAAarqB,EAChCj2E,KAAK4gG,YAAY7nG,QAAQ,CAACq1E,EAAYvzE,KACpCd,EAAImtD,YAAcknB,EAAW6zB,WAAaA,EAC1CloG,EAAI+sD,UAAYsnB,EAAW6zB,WAAaA,EACxC,MAAMh/C,EAAYlpD,EAAImpD,YAAYkrB,EAAWtxE,MAAM6Y,MAC7CoxC,EAAY86C,EAAU96C,UAAUqnB,EAAWrnB,YAAcqnB,EAAWrnB,UAAYm5C,EAAUn5C,YAC1FpxC,EAAQyqF,EAAW8B,EAAej/C,EACxC,IAAIp4B,EAAI8C,EAAO9C,EACXC,EAAI6C,EAAO7C,EACf+2E,EAAUO,SAASpiG,KAAK2V,OACpB0G,EACExhB,EAAI,GAAKgwB,EAAIlV,EAAQsgE,EAAUj2E,KAAKylD,QACtC36B,EAAI6C,EAAO7C,GAAKm2B,EAChBtzB,EAAOi5B,OACP/7B,EAAI8C,EAAO9C,EAAIke,GAAeD,EAAO9oC,KAAKwO,KAAOynE,EAASj2E,KAAKylD,MAAQq7C,EAAWnzE,EAAOi5B,QAElF/rD,EAAI,GAAKiwB,EAAIm2B,EAAajhD,KAAK0lD,SACxC76B,EAAI8C,EAAO9C,EAAIA,EAAIg2E,EAAYlzE,EAAOi5B,MAAMjxC,MAAQsgE,EACpDtoD,EAAOi5B,OACP97B,EAAI6C,EAAO7C,EAAIie,GAAeD,EAAO9oC,KAAKuO,IAAM+zE,EAAcrM,EAASj2E,KAAK0lD,OAASm7C,EAAYlzE,EAAOi5B,MAAM/wC,UAvF5F,SAASgV,EAAGC,EAAGsjD,GACnC,GAAIppD,MAAMo7E,IAAaA,GAAY,GAAKp7E,MAAMm7E,IAAcA,EAAY,EACtE,OAEFpmG,EAAIupD,OACJ,MAAM6D,EAAY9d,GAAe+kC,EAAWjnB,UAAW,GAQvD,GAPAptD,EAAI+sD,UAAYzd,GAAe+kC,EAAWtnB,UAAWk7C,GACrDjoG,EAAIg9F,QAAU1tD,GAAe+kC,EAAW2oB,QAAS,QACjDh9F,EAAIusF,eAAiBj9C,GAAe+kC,EAAWkY,eAAgB,GAC/DvsF,EAAIg8F,SAAW1sD,GAAe+kC,EAAW2nB,SAAU,SACnDh8F,EAAIotD,UAAYA,EAChBptD,EAAImtD,YAAc7d,GAAe+kC,EAAWlnB,YAAa86C,GACzDjoG,EAAIssF,YAAYh9C,GAAe+kC,EAAWi0B,SAAU,KAChDnC,EAAUG,cAAe,CAC3B,MAAMiC,EAAc,CAClB59C,OAAQ07C,EAAW1lG,KAAK6nG,MAAQ,EAChC/9C,WAAY4pB,EAAW5pB,WACvBC,SAAU2pB,EAAW3pB,SACrBW,YAAa+B,GAETumB,EAAUm0B,EAAUvtC,MAAMzpC,EAAGu1E,EAAW,GAE9Ch8C,GAAUrqD,EAAKuoG,EAAa50B,EADZ5iD,EAAIo3E,OAEf,CACL,MAAMM,EAAU13E,EAAIpwB,KAAKC,KAAKysF,EAAW+Y,GAAa,EAAG,GACnDsC,EAAWZ,EAAUttC,WAAW1pC,EAAGu1E,GACnClM,EAAeprC,GAAcslB,EAAW8lB,cAC9Cn6F,EAAI8qD,YACAlsD,OAAO0nD,OAAO6zC,GAActK,KAAKphE,GAAW,IAANA,GACxCy/B,GAAmBluD,EAAK,CACtB8wB,EAAG43E,EACH33E,EAAG03E,EACH9vD,EAAG0tD,EACHhgG,EAAG+/F,EACHz7C,OAAQwvC,IAGVn6F,EAAIorD,KAAKs9C,EAAUD,EAASpC,EAAUD,GAExCpmG,EAAI6L,OACc,IAAduhD,GACFptD,EAAIsrD,SAGRtrD,EAAI0pD,UA8CJi/C,CADcb,EAAUh3E,EAAEA,GACLC,EAAGsjD,GACxBvjD,EDrrPS,EAACie,EAAOt6B,EAAMi3C,EAAOhqC,IAE3BqtB,KADOrtB,EAAM,OAAS,SACJgqC,EAAkB,WAAV3c,GAAsBt6B,EAAOi3C,GAAS,EAAIj3C,ECmrPnEm0F,CAAO57C,EAAWl8B,EAAIu1E,EAAW8B,EAAc7lF,EAAewO,EAAIlV,EAAQ3V,KAAKylD,MAAOzwC,EAAKyG,KA7ChF,SAASoP,EAAGC,EAAGsjD,GAC9B5nB,GAAWzsD,EAAKq0E,EAAWtxE,KAAM+tB,EAAGC,EAAKw1E,EAAa,EAAIW,EAAW,CACnEz5C,cAAe4mB,EAAWzL,OAC1B5b,UAAW86C,EAAU96C,UAAUqnB,EAAWrnB,aA2C5CO,CAASu6C,EAAUh3E,EAAEA,GAAIC,EAAGsjD,GACxB/xD,EACFsR,EAAO9C,GAAKlV,EAAQsgE,EAEpBtoD,EAAO7C,GAAKm2B,IAGhB8T,GAAqB/0D,KAAKjG,IAAKib,EAAKmtF,eAEtCpiG,YACE,MAAMiV,EAAOhV,KAAK1C,QACZ8kF,EAAYptE,EAAKm2D,MACjBy3B,EAAY55C,GAAOo5B,EAAUrhC,MAC7B8hD,EAAe95C,GAAUq5B,EAAUnM,SACzC,IAAKmM,EAAU3oD,QACb,OAEF,MAAMooE,EAAYztC,GAAcp/C,EAAKyG,IAAKzb,KAAKwO,KAAMxO,KAAK2V,OACpD5b,EAAMiG,KAAKjG,IACXu9B,EAAW8qD,EAAU9qD,SACrB4qE,EAAeU,EAAU39E,KAAO,EAChC69E,EAA6BD,EAAat0F,IAAM2zF,EACtD,IAAIp3E,EACAtc,EAAOxO,KAAKwO,KACZ64C,EAAWrnD,KAAK2V,MACpB,GAAI3V,KAAKqc,eACPgrC,EAAW3sD,KAAKC,OAAOqF,KAAK8gG,YAC5Bh2E,EAAI9qB,KAAKuO,IAAMu0F,EACft0F,EAAOu6B,GAAe/zB,EAAK8zB,MAAOt6B,EAAMxO,KAAKylD,MAAQ4B,OAChD,CACL,MAAM6K,EAAYlyD,KAAK6gG,YAAYpoC,OAAO,CAACC,EAAKzzC,IAASvqB,KAAKC,IAAI+9D,EAAKzzC,EAAKpP,QAAS,GACrFiV,EAAIg4E,EAA6B/5D,GAAe/zB,EAAK8zB,MAAO9oC,KAAKuO,IAAKvO,KAAK0lD,OAASwM,EAAYl9C,EAAKgtD,OAAOiU,QAAUj2E,KAAKkhG,uBAE7H,MAAMr2E,EAAIke,GAAezR,EAAU9oB,EAAMA,EAAO64C,GAChDttD,EAAIgtD,UAAY86C,EAAU96C,UAAUle,GAAmBvR,IACvDv9B,EAAIitD,aAAe,SACnBjtD,EAAImtD,YAAck7B,EAAUjjC,MAC5BplD,EAAI+sD,UAAYs7B,EAAUjjC,MAC1BplD,EAAIgnD,KAAO6hD,EAAU5/C,OACrBwD,GAAWzsD,EAAKqoF,EAAUtlF,KAAM+tB,EAAGC,EAAG83E,GAExC7iG,sBACE,MAAMqiF,EAAYpiF,KAAK1C,QAAQ6tE,MACzBy3B,EAAY55C,GAAOo5B,EAAUrhC,MAC7B8hD,EAAe95C,GAAUq5B,EAAUnM,SACzC,OAAOmM,EAAU3oD,QAAUmpE,EAAU3hD,WAAa4hD,EAAahtF,OAAS,EAE1E9V,iBAAiB8qB,EAAGC,GAClB,IAAIjwB,EAAGkoG,EAAQC,EACf,GAAIx0D,GAAW3jB,EAAG7qB,KAAKwO,KAAMxO,KAAKylD,QAC7BjX,GAAW1jB,EAAG9qB,KAAKuO,IAAKvO,KAAK0lD,QAEhC,IADAs9C,EAAKhjG,KAAKygG,eACL5lG,EAAI,EAAGA,EAAImoG,EAAGpoG,SAAUC,EAE3B,GADAkoG,EAASC,EAAGnoG,GACR2zC,GAAW3jB,EAAGk4E,EAAOv0F,KAAMu0F,EAAOv0F,KAAOu0F,EAAOptF,QAC/C64B,GAAW1jB,EAAGi4E,EAAOx0F,IAAKw0F,EAAOx0F,IAAMw0F,EAAOltF,QACjD,OAAO7V,KAAK4gG,YAAY/lG,GAI9B,OAAO,KAETkF,YAAYE,GACV,MAAM+U,EAAOhV,KAAK1C,QAClB,IAmBJ,SAAoBmE,EAAMuT,GACxB,GAAa,cAATvT,IAAyBuT,EAAK2sC,SAAW3sC,EAAKiuF,SAChD,OAAO,EAET,GAAIjuF,EAAKsL,UAAqB,UAAT7e,GAA6B,YAATA,GACvC,OAAO,EAET,OAAO,EA1BAyhG,CAAWjjG,EAAEwB,KAAMuT,GACtB,OAEF,MAAMmuF,EAAcnjG,KAAKojG,iBAAiBnjG,EAAE4qB,EAAG5qB,EAAE6qB,GACjD,GAAe,cAAX7qB,EAAEwB,KAAsB,CAC1B,MAAMskD,EAAW/lD,KAAK0gG,aAChB2C,GApWWjqG,EAoWqB+pG,EApWT,QAAfhqG,EAoWc4sD,IApWe,OAAN3sD,GAAcD,EAAE8wC,eAAiB7wC,EAAE6wC,cAAgB9wC,EAAEkN,QAAUjN,EAAEiN,OAqWlG0/C,IAAas9C,GACfpgG,GAAS+R,EAAKiuF,QAAS,CAAChjG,EAAG8lD,EAAU/lD,MAAOA,MAE9CA,KAAK0gG,aAAeyC,EAChBA,IAAgBE,GAClBpgG,GAAS+R,EAAK2sC,QAAS,CAAC1hD,EAAGkjG,EAAanjG,MAAOA,WAExCmjG,GACTlgG,GAAS+R,EAAKsL,QAAS,CAACrgB,EAAGkjG,EAAanjG,MAAOA,MA7WlC,IAAC7G,EAAGC,GA0XvB,IAAIkqG,GAAgB,CAClB56F,GAAI,SACJ66F,SAAUhD,GACVxgG,MAAM6gD,EAAOk/C,EAAOxiG,GAClB,MAAM6wE,EAASvtB,EAAMutB,OAAS,IAAIoyB,GAAO,CAACxmG,IAAK6mD,EAAM7mD,IAAKuD,QAAAA,EAASsjD,MAAAA,IACnEuzB,GAAQnZ,UAAUpa,EAAOutB,EAAQ7wE,GACjC62E,GAAQqb,OAAO5uC,EAAOutB,IAExBpuE,KAAK6gD,GACHuzB,GAAQ2c,UAAUlwC,EAAOA,EAAMutB,eACxBvtB,EAAMutB,QAEfpuE,aAAa6gD,EAAOk/C,EAAOxiG,GACzB,MAAM6wE,EAASvtB,EAAMutB,OACrBgG,GAAQnZ,UAAUpa,EAAOutB,EAAQ7wE,GACjC6wE,EAAO7wE,QAAUA,GAEnByC,YAAY6gD,GACV,MAAMutB,EAASvtB,EAAMutB,OACrBA,EAAO4yB,cACP5yB,EAAOq1B,kBAETzjG,WAAW6gD,EAAOl1C,GACXA,EAAKonF,QACRlyC,EAAMutB,OAAO7hE,YAAYZ,EAAKtO,QAGlC60B,SAAU,CACRwH,SAAS,EACTnC,SAAU,MACVwR,MAAO,SACP6rC,UAAU,EACVjrC,SAAS,EACT0V,OAAQ,IACRr/C,QAAQE,EAAGmuE,EAAYD,GACrB,MAAM9nE,EAAQ+nE,EAAWnkC,aACnBw5D,EAAKt1B,EAAOvtB,MACd6iD,EAAGh4B,iBAAiBplE,IACtBo9F,EAAGlqE,KAAKlzB,GACR+nE,EAAWzL,QAAS,IAEpB8gC,EAAG/oC,KAAKr0D,GACR+nE,EAAWzL,QAAS,IAGxBhhB,QAAS,KACTshD,QAAS,KACTjhC,OAAQ,CACN7iB,MAAQplD,GAAQA,EAAI6mD,MAAMtjD,QAAQ6hD,MAClCihD,SAAU,GACVnqB,QAAS,GACTl2E,eAAe6gD,GACb,MAAMF,EAAWE,EAAM7jD,KAAK2jD,UACrBshB,QAAQq+B,cAACA,EAAa77C,WAAEA,EAAUuC,UAAEA,EAAS5H,MAAEA,IAAUyB,EAAMutB,OAAO7wE,QAC7E,OAAOsjD,EAAMsb,yBAAyBv3D,IAAK83D,IACzC,MAAMp+D,EAAQo+D,EAAKt7B,WAAWgyB,SAASktC,EAAgB,OAAI9lG,GACrD6qD,EAAc2D,GAAU1qD,EAAM+mD,aACpC,MAAO,CACLtoD,KAAM4jD,EAAS+b,EAAKp2D,OAAOuf,MAC3BkhC,UAAWzoD,EAAMmiD,gBACjByhD,UAAW9iD,EACXwjB,QAASlG,EAAK7B,QACdm8B,QAAS14F,EAAM44D,eACforC,SAAUhkG,EAAM64D,WAChBovB,eAAgBjoF,EAAM84D,iBACtB4+B,SAAU13F,EAAM+4D,gBAChBjQ,WAAY/B,EAAYzvC,MAAQyvC,EAAYvvC,QAAU,EACtDqxC,YAAa7oD,EAAMoiD,YACnB+D,WAAYA,GAAcnmD,EAAMmmD,WAChCC,SAAUpmD,EAAMomD,SAChBsC,UAAWA,GAAa1oD,EAAM0oD,UAC9BmtC,aAAc,EACdjqD,aAAcwyB,EAAKp2D,QAEpBrG,QAGPmrE,MAAO,CACLhsB,MAAQplD,GAAQA,EAAI6mD,MAAMtjD,QAAQ6hD,MAClC1lB,SAAS,EACTnC,SAAU,SACVx6B,KAAM,KAGVmB,YAAa,CACXwkD,YAAc5lD,IAAUA,EAAK6lD,WAAW,MACxCsf,OAAQ,CACNvf,YAAc5lD,IAAU,CAAC,iBAAkB,SAAU,QAAQqkC,SAASrkC,MAK5E,MAAM6mG,WAAc3pB,GAClBh6E,YAAY+6D,GACV7xD,QACAjJ,KAAK4gD,MAAQka,EAAOla,MACpB5gD,KAAK1C,QAAUw9D,EAAOx9D,QACtB0C,KAAKjG,IAAM+gE,EAAO/gE,IAClBiG,KAAK2jG,cAAWppG,EAChByF,KAAKuO,SAAMhU,EACXyF,KAAK0lD,YAASnrD,EACdyF,KAAKwO,UAAOjU,EACZyF,KAAKylD,WAAQlrD,EACbyF,KAAK2V,WAAQpb,EACbyF,KAAK6V,YAAStb,EACdyF,KAAKs3B,cAAW/8B,EAChByF,KAAKo/C,YAAS7kD,EACdyF,KAAK20E,cAAWp6E,EAElBwF,OAAOsnD,EAAU6K,GACf,MAAMl9C,EAAOhV,KAAK1C,QAGlB,GAFA0C,KAAKwO,KAAO,EACZxO,KAAKuO,IAAM,GACNyG,EAAKykB,QAER,YADAz5B,KAAK2V,MAAQ3V,KAAK6V,OAAS7V,KAAKylD,MAAQzlD,KAAK0lD,OAAS,GAGxD1lD,KAAK2V,MAAQ3V,KAAKylD,MAAQ4B,EAC1BrnD,KAAK6V,OAAS7V,KAAK0lD,OAASwM,EAC5B,MAAMwzB,EAAYh8E,GAAQsL,EAAKlY,MAAQkY,EAAKlY,KAAKlC,OAAS,EAC1DoF,KAAK2jG,SAAW56C,GAAU/zC,EAAKihE,SAC/B,MAAM2tB,EAAWle,EAAY18B,GAAOh0C,EAAK+rC,MAAME,WAAajhD,KAAK2jG,SAAS9tF,OACtE7V,KAAKqc,eACPrc,KAAK6V,OAAS+tF,EAEd5jG,KAAK2V,MAAQiuF,EAGjB7jG,eACE,MAAMmrC,EAAMlrC,KAAK1C,QAAQg6B,SACzB,MAAe,QAAR4T,GAAyB,WAARA,EAE1BnrC,UAAU+N,GACR,MAAMS,IAACA,EAAGC,KAAEA,EAAIk3C,OAAEA,EAAMD,MAAEA,EAAKnoD,QAAEA,GAAW0C,KACtC8oC,EAAQxrC,EAAQwrC,MACtB,IACIue,EAAUq/B,EAAQC,EADlBliC,EAAW,EAkBf,OAhBIzkD,KAAKqc,gBACPqqE,EAAS39C,GAAeD,EAAOt6B,EAAMi3C,GACrCkhC,EAASp4E,EAAMT,EACfu5C,EAAW5B,EAAQj3C,IAEM,SAArBlR,EAAQg6B,UACVovD,EAASl4E,EAAOV,EAChB64E,EAAS59C,GAAeD,EAAO4c,EAAQn3C,GACvCk2C,GAAiB,GAANvwC,KAEXwyE,EAASjhC,EAAQ33C,EACjB64E,EAAS59C,GAAeD,EAAOv6B,EAAKm3C,GACpCjB,EAAgB,GAALvwC,IAEbmzC,EAAW3B,EAASn3C,GAEf,CAACm4E,OAAAA,EAAQC,OAAAA,EAAQt/B,SAAAA,EAAU5C,SAAAA,GAEpC1kD,OACE,MAAMhG,EAAMiG,KAAKjG,IACXib,EAAOhV,KAAK1C,QAClB,IAAK0X,EAAKykB,QACR,OAEF,MAAMoqE,EAAW76C,GAAOh0C,EAAK+rC,MAEvBjzC,EADa+1F,EAAS5iD,WACA,EAAIjhD,KAAK2jG,SAASp1F,KACxCm4E,OAACA,EAAMC,OAAEA,EAAMt/B,SAAEA,EAAQ5C,SAAEA,GAAYzkD,KAAK8jG,UAAUh2F,GAC5D04C,GAAWzsD,EAAKib,EAAKlY,KAAM,EAAG,EAAG+mG,EAAU,CACzC1kD,MAAOnqC,EAAKmqC,MACZkI,SAAAA,EACA5C,SAAAA,EACAsC,UAAWle,GAAmB7zB,EAAK8zB,OACnCke,aAAc,SACdH,YAAa,CAAC6/B,EAAQC,MAc5B,IAAIod,GAAe,CACjBr7F,GAAI,QACJ66F,SAAUG,GACV3jG,MAAM6gD,EAAOk/C,EAAOxiG,IAbtB,SAAqBsjD,EAAOwhC,GAC1B,MAAMjX,EAAQ,IAAIu4B,GAAM,CACtB3pG,IAAK6mD,EAAM7mD,IACXuD,QAAS8kF,EACTxhC,MAAAA,IAEFuzB,GAAQnZ,UAAUpa,EAAOuqB,EAAOiX,GAChCjO,GAAQqb,OAAO5uC,EAAOuqB,GACtBvqB,EAAMojD,WAAa74B,EAMjB84B,CAAYrjD,EAAOtjD,IAErByC,KAAK6gD,GACH,MAAMojD,EAAapjD,EAAMojD,WACzB7vB,GAAQ2c,UAAUlwC,EAAOojD,UAClBpjD,EAAMojD,YAEfjkG,aAAa6gD,EAAOk/C,EAAOxiG,GACzB,MAAM6tE,EAAQvqB,EAAMojD,WACpB7vB,GAAQnZ,UAAUpa,EAAOuqB,EAAO7tE,GAChC6tE,EAAM7tE,QAAUA,GAElB20B,SAAU,CACR6W,MAAO,SACPrP,SAAS,EACTsnB,KAAM,CACJ3B,OAAQ,QAEVu1B,UAAU,EACVsB,QAAS,GACT3+C,SAAU,MACVx6B,KAAM,GACNsiD,OAAQ,KAEV66B,cAAe,CACb96B,MAAO,SAETlhD,YAAa,CACXwkD,aAAa,EACbE,YAAY,IAIhB,MAAMh+C,GAAM,IAAIu/F,QAChB,IAAIC,GAAkB,CACpBz7F,GAAI,WACJ3I,MAAM6gD,EAAOk/C,EAAOxiG,GAClB,MAAM6tE,EAAQ,IAAIu4B,GAAM,CACtB3pG,IAAK6mD,EAAM7mD,IACXuD,QAAAA,EACAsjD,MAAAA,IAEFuzB,GAAQnZ,UAAUpa,EAAOuqB,EAAO7tE,GAChC62E,GAAQqb,OAAO5uC,EAAOuqB,GACtBxmE,GAAIpG,IAAIqiD,EAAOuqB,IAEjBprE,KAAK6gD,GACHuzB,GAAQ2c,UAAUlwC,EAAOj8C,GAAIyE,IAAIw3C,IACjCj8C,GAAIb,OAAO88C,IAEb7gD,aAAa6gD,EAAOk/C,EAAOxiG,GACzB,MAAM6tE,EAAQxmE,GAAIyE,IAAIw3C,GACtBuzB,GAAQnZ,UAAUpa,EAAOuqB,EAAO7tE,GAChC6tE,EAAM7tE,QAAUA,GAElB20B,SAAU,CACR6W,MAAO,SACPrP,SAAS,EACTsnB,KAAM,CACJ3B,OAAQ,UAEVu1B,UAAU,EACVsB,QAAS,EACT3+C,SAAU,MACVx6B,KAAM,GACNsiD,OAAQ,MAEV66B,cAAe,CACb96B,MAAO,SAETlhD,YAAa,CACXwkD,aAAa,EACbE,YAAY,IAIhB,MAAMyhD,GAAc,CAClBrkG,QAAQiJ,GACN,IAAKA,EAAMpO,OACT,OAAO,EAET,IAAIC,EAAGJ,EACHowB,EAAI,EACJC,EAAI,EACJsqC,EAAQ,EACZ,IAAKv6D,EAAI,EAAGJ,EAAMuO,EAAMpO,OAAQC,EAAIJ,IAAOI,EAAG,CAC5C,MAAM4O,EAAKT,EAAMnO,GAAG+B,QACpB,GAAI6M,GAAMA,EAAG46F,WAAY,CACvB,MAAMn5D,EAAMzhC,EAAG66F,kBACfz5E,GAAKqgB,EAAIrgB,EACTC,GAAKogB,EAAIpgB,IACPsqC,GAGN,MAAO,CACLvqC,EAAGA,EAAIuqC,EACPtqC,EAAGA,EAAIsqC,IAGXr1D,QAAQiJ,EAAOu7F,GACb,IAAKv7F,EAAMpO,OACT,OAAO,EAET,IAGIC,EAAGJ,EAAK+pG,EAHR35E,EAAI05E,EAAc15E,EAClBC,EAAIy5E,EAAcz5E,EAClBooD,EAAcnuD,OAAO8mB,kBAEzB,IAAKhxC,EAAI,EAAGJ,EAAMuO,EAAMpO,OAAQC,EAAIJ,IAAOI,EAAG,CAC5C,MAAM4O,EAAKT,EAAMnO,GAAG+B,QACpB,GAAI6M,GAAMA,EAAG46F,WAAY,CACvB,MACM1nG,EAAIgxC,GAAsB42D,EADjB96F,EAAG0pE,kBAEdx2E,EAAIu2E,IACNA,EAAcv2E,EACd6nG,EAAiB/6F,IAIvB,GAAI+6F,EAAgB,CAClB,MAAMC,EAAKD,EAAeF,kBAC1Bz5E,EAAI45E,EAAG55E,EACPC,EAAI25E,EAAG35E,EAET,MAAO,CACLD,EAAAA,EACAC,EAAAA,KAIN,SAAS45E,GAAatrF,EAAMurF,GAQ1B,OAPIA,IACEj7F,GAAQi7F,GACVlkG,MAAMmJ,UAAUzI,KAAKiL,MAAMgN,EAAMurF,GAEjCvrF,EAAKjY,KAAKwjG,IAGPvrF,EAET,SAASwrF,GAAcx5D,GACrB,OAAoB,iBAARA,GAAoBA,aAAey5D,SAAWz5D,EAAI7rC,QAAQ,OAAS,EACtE6rC,EAAI1gC,MAAM,MAEZ0gC,EAET,SAAS05D,GAAkBlkD,EAAO7wB,GAChC,MAAMnzB,QAACA,EAAOqtC,aAAEA,EAAY5jC,MAAEA,GAAS0pB,EACjCoR,EAAayf,EAAM+f,eAAe12B,GAAc9I,YAChDvb,MAACA,EAAKjoB,MAAEA,GAASwjC,EAAW4jE,iBAAiB1+F,GACnD,MAAO,CACLu6C,MAAAA,EACAh7B,MAAAA,EACAy3C,OAAQl8B,EAAWkiC,UAAUh9D,GAC7By9D,IAAKljB,EAAM7jD,KAAK2jD,SAASzW,GAAcltC,KAAKsJ,GAC5CmoE,eAAgB7wE,EAChB+hE,QAASv+B,EAAWw+B,aACpBzyD,UAAW7G,EACX4jC,aAAAA,EACArtC,QAAAA,GAGJ,SAASooG,GAAe95B,EAAS5tE,GAC/B,MAAMvD,EAAMmxE,EAAQtqB,MAAM7mD,KACpB+M,KAACA,EAAIm+F,OAAEA,EAAM95B,MAAEA,GAASD,GACxBk1B,SAACA,EAAQD,UAAEA,GAAa7iG,EACxB4nG,EAAWl8C,GAAO1rD,EAAQ4nG,UAC1BtC,EAAY55C,GAAO1rD,EAAQslG,WAC3BuC,EAAan8C,GAAO1rD,EAAQ6nG,YAC5BC,EAAiBj6B,EAAMvwE,OACvByqG,EAAkBJ,EAAOrqG,OACzB0qG,EAAoBx+F,EAAKlM,OACzBq7E,EAAUltB,GAAUzrD,EAAQ24E,SAClC,IAAIpgE,EAASogE,EAAQpgE,OACjBF,EAAQ,EACR4vF,EAAqBz+F,EAAK2xD,OAAO,CAACrD,EAAOowC,IAAapwC,EAAQowC,EAASC,OAAO7qG,OAAS4qG,EAAS/+C,MAAM7rD,OAAS4qG,EAASE,MAAM9qG,OAAQ,GAO1I,GANA2qG,GAAsBr6B,EAAQy6B,WAAW/qG,OAASswE,EAAQ06B,UAAUhrG,OAChEwqG,IACFvvF,GAAUuvF,EAAiBxC,EAAU3hD,YACnCmkD,EAAiB,GAAK9nG,EAAQuoG,aAC/BvoG,EAAQwoG,mBAEPP,EAAoB,CAEtB1vF,GAAUyvF,GADahoG,EAAQyoG,cAAgBrrG,KAAKC,IAAIwlG,EAAW+E,EAASjkD,YAAcikD,EAASjkD,aAEjGskD,EAAqBD,GAAqBJ,EAASjkD,YACnDskD,EAAqB,GAAKjoG,EAAQ0oG,YAElCX,IACFxvF,GAAUvY,EAAQ2oG,gBACjBZ,EAAkBF,EAAWlkD,YAC5BokD,EAAkB,GAAK/nG,EAAQ4oG,eAEnC,IAAIC,EAAe,EACnB,MAAMC,EAAe,SAASx/C,GAC5BjxC,EAAQjb,KAAKC,IAAIgb,EAAO5b,EAAImpD,YAAY0D,GAAMjxC,MAAQwwF,IAkBxD,OAhBApsG,EAAIupD,OACJvpD,EAAIgnD,KAAO6hD,EAAU5/C,OACrBr0C,GAAKu8D,EAAQC,MAAOi7B,GACpBrsG,EAAIgnD,KAAOmkD,EAASliD,OACpBr0C,GAAKu8D,EAAQy6B,WAAW9/B,OAAOqF,EAAQ06B,WAAYQ,GACnDD,EAAe7oG,EAAQyoG,cAAiB3F,EAAW,EAAI9iG,EAAQ23E,WAAc,EAC7EtmE,GAAK7H,EAAO0+F,IACV72F,GAAK62F,EAASC,OAAQW,GACtBz3F,GAAK62F,EAAS/+C,MAAO2/C,GACrBz3F,GAAK62F,EAASE,MAAOU,KAEvBD,EAAe,EACfpsG,EAAIgnD,KAAOokD,EAAWniD,OACtBr0C,GAAKu8D,EAAQ+5B,OAAQmB,GACrBrsG,EAAI0pD,UACJ9tC,GAASsgE,EAAQtgE,MACV,CAACA,MAAAA,EAAOE,OAAAA,GAqBjB,SAASwwF,GAAgBzlD,EAAOtjD,EAAS2nB,EAAMqhF,GAC7C,MAAMz7E,EAACA,EAAClV,MAAEA,GAASsP,GACZtP,MAAO4wF,EAAY5iC,WAAWn1D,KAACA,EAAIi3C,MAAEA,IAAU7E,EACtD,IAAI4lD,EAAS,SAWb,MAVe,WAAXF,EACFE,EAAS37E,IAAMrc,EAAOi3C,GAAS,EAAI,OAAS,QACnC56B,GAAKlV,EAAQ,EACtB6wF,EAAS,OACA37E,GAAK07E,EAAa5wF,EAAQ,IACnC6wF,EAAS,SAnBb,SAA6BA,EAAQ5lD,EAAOtjD,EAAS2nB,GACnD,MAAM4F,EAACA,EAAClV,MAAEA,GAASsP,EACbwhF,EAAQnpG,EAAQopG,UAAYppG,EAAQqpG,aAC1C,MAAe,SAAXH,GAAqB37E,EAAIlV,EAAQ8wF,EAAQ7lD,EAAMjrC,QAGpC,UAAX6wF,GAAsB37E,EAAIlV,EAAQ8wF,EAAQ,QAA9C,GAeIG,CAAoBJ,EAAQ5lD,EAAOtjD,EAAS2nB,KAC9CuhF,EAAS,UAEJA,EAET,SAASK,GAAmBjmD,EAAOtjD,EAAS2nB,GAC1C,MAAMqhF,EAASrhF,EAAKqhF,QAAUhpG,EAAQgpG,QApCxC,SAAyB1lD,EAAO37B,GAC9B,MAAM6F,EAACA,EAACjV,OAAEA,GAAUoP,EACpB,OAAI6F,EAAIjV,EAAS,EACR,MACEiV,EAAK81B,EAAM/qC,OAASA,EAAS,EAC/B,SAEF,SA6ByCixF,CAAgBlmD,EAAO37B,GACvE,MAAO,CACLuhF,OAAQvhF,EAAKuhF,QAAUlpG,EAAQkpG,QAAUH,GAAgBzlD,EAAOtjD,EAAS2nB,EAAMqhF,GAC/EA,OAAAA,GAuBJ,SAASS,GAAmBzpG,EAAS2nB,EAAM+hF,EAAWpmD,GACpD,MAAM8lD,UAACA,EAASC,aAAEA,EAAYpiD,aAAEA,GAAgBjnD,GAC1CkpG,OAACA,EAAMF,OAAEA,GAAUU,EACnBC,EAAiBP,EAAYC,GAC7Bz+C,QAACA,EAAOG,SAAEA,EAAQF,WAAEA,EAAUC,YAAEA,GAAeU,GAAcvE,GACnE,IAAI15B,EAzBN,SAAgB5F,EAAMuhF,GACpB,IAAI37E,EAACA,EAAClV,MAAEA,GAASsP,EAMjB,MALe,UAAXuhF,EACF37E,GAAKlV,EACe,WAAX6wF,IACT37E,GAAMlV,EAAQ,GAETkV,EAkBCq8E,CAAOjiF,EAAMuhF,GACrB,MAAM17E,EAjBR,SAAgB7F,EAAMqhF,EAAQW,GAC5B,IAAIn8E,EAACA,EAACjV,OAAEA,GAAUoP,EAQlB,MAPe,QAAXqhF,EACFx7E,GAAKm8E,EAELn8E,GADoB,WAAXw7E,EACJzwF,EAASoxF,EAERpxF,EAAS,EAEViV,EAQGq8E,CAAOliF,EAAMqhF,EAAQW,GAY/B,MAXe,WAAXX,EACa,SAAXE,EACF37E,GAAKo8E,EACe,UAAXT,IACT37E,GAAKo8E,GAEa,SAAXT,EACT37E,GAAKnwB,KAAKC,IAAIutD,EAASC,GAAcu+C,EACjB,UAAXF,IACT37E,GAAKnwB,KAAKC,IAAI0tD,EAAUD,GAAes+C,GAElC,CACL77E,EAAG0jB,GAAY1jB,EAAG,EAAG+1B,EAAMjrC,MAAQsP,EAAKtP,OACxCmV,EAAGyjB,GAAYzjB,EAAG,EAAG81B,EAAM/qC,OAASoP,EAAKpP,SAG7C,SAASuxF,GAAYl8B,EAASpiC,EAAOxrC,GACnC,MAAM24E,EAAUltB,GAAUzrD,EAAQ24E,SAClC,MAAiB,WAAVntC,EACHoiC,EAAQrgD,EAAIqgD,EAAQv1D,MAAQ,EAClB,UAAVmzB,EACEoiC,EAAQrgD,EAAIqgD,EAAQv1D,MAAQsgE,EAAQxwB,MACpCylB,EAAQrgD,EAAIorD,EAAQznE,KAE5B,SAAS64F,GAAwBpkG,GAC/B,OAAOyhG,GAAa,GAAIE,GAAc3hG,IASxC,SAASqkG,GAAkB3lG,EAAW2D,GACpC,MAAM8lD,EAAW9lD,GAAWA,EAAQo6D,SAAWp6D,EAAQo6D,QAAQwL,SAAW5lE,EAAQo6D,QAAQwL,QAAQvpE,UAClG,OAAOypD,EAAWzpD,EAAUypD,SAASA,GAAYzpD,EAEnD,MAAM4lG,WAAgBxtB,GACpBh6E,YAAY+6D,GACV7xD,QACAjJ,KAAKw5B,QAAU,EACfx5B,KAAKk4D,QAAU,GACfl4D,KAAKwnG,oBAAiBjtG,EACtByF,KAAKynG,WAAQltG,EACbyF,KAAK0nG,uBAAoBntG,EACzByF,KAAK2nG,cAAgB,GACrB3nG,KAAKq7D,iBAAc9gE,EACnByF,KAAKo/D,cAAW7kE,EAChByF,KAAK4gD,MAAQka,EAAOla,OAASka,EAAOzE,OACpCr2D,KAAKq2D,OAASr2D,KAAK4gD,MACnB5gD,KAAK1C,QAAUw9D,EAAOx9D,QACtB0C,KAAK4nG,gBAAartG,EAClByF,KAAKmrE,WAAQ5wE,EACbyF,KAAK2lG,gBAAaprG,EAClByF,KAAK8G,UAAOvM,EACZyF,KAAK4lG,eAAYrrG,EACjByF,KAAKilG,YAAS1qG,EACdyF,KAAKwmG,YAASjsG,EACdyF,KAAKsmG,YAAS/rG,EACdyF,KAAK6qB,OAAItwB,EACTyF,KAAK8qB,OAAIvwB,EACTyF,KAAK6V,YAAStb,EACdyF,KAAK2V,WAAQpb,EACbyF,KAAK6nG,YAASttG,EACdyF,KAAK8nG,YAASvtG,EACdyF,KAAK+nG,iBAAcxtG,EACnByF,KAAKgoG,sBAAmBztG,EACxByF,KAAKioG,qBAAkB1tG,EAEzBwF,WAAWzC,GACT0C,KAAK1C,QAAUA,EACf0C,KAAK0nG,uBAAoBntG,EACzByF,KAAKo/D,cAAW7kE,EAElBwF,qBACE,MAAMu+D,EAASt+D,KAAK0nG,kBACpB,GAAIppC,EACF,OAAOA,EAET,MAAM1d,EAAQ5gD,KAAK4gD,MACbtjD,EAAU0C,KAAK1C,QAAQqvD,WAAW3sD,KAAKikD,cACvCjvC,EAAO1X,EAAQ0a,SAAW4oC,EAAMtjD,QAAQijD,WAAajjD,EAAQq9D,WAC7DA,EAAa,IAAIE,GAAW76D,KAAK4gD,MAAO5rC,GAI9C,OAHIA,EAAKg2C,aACPhrD,KAAK0nG,kBAAoB/uG,OAAO4rE,OAAO5J,IAElCA,EAET56D,aACE,OAAOC,KAAKo/D,WACZp/D,KAAKo/D,SAhET,SAA8BlvD,EAAQg7D,EAASg9B,GAC7C,OAAO1+C,GAAct5C,EAAQ,CAC3Bg7D,QAAAA,EACAg9B,aAAAA,EACAzmG,KAAM,YA4DU0mG,CAAqBnoG,KAAK4gD,MAAMqD,aAAcjkD,KAAMA,KAAK2nG,gBAE3E5nG,SAASuF,EAAShI,GAChB,MAAMqE,UAACA,GAAarE,EACd8qG,EAAczmG,EAAUymG,YAAYh8F,MAAMpM,KAAM,CAACsF,IACjD6lE,EAAQxpE,EAAUwpE,MAAM/+D,MAAMpM,KAAM,CAACsF,IACrC+iG,EAAa1mG,EAAU0mG,WAAWj8F,MAAMpM,KAAM,CAACsF,IACrD,IAAImhD,EAAQ,GAIZ,OAHAA,EAAQi+C,GAAaj+C,EAAOm+C,GAAcwD,IAC1C3hD,EAAQi+C,GAAaj+C,EAAOm+C,GAAcz5B,IAC1C1kB,EAAQi+C,GAAaj+C,EAAOm+C,GAAcyD,IACnC5hD,EAET1mD,cAAcmoG,EAAc5qG,GAC1B,OAAO+pG,GAAwB/pG,EAAQqE,UAAUgkG,WAAWv5F,MAAMpM,KAAM,CAACkoG,KAE3EnoG,QAAQmoG,EAAc5qG,GACpB,MAAMqE,UAACA,GAAarE,EACdgrG,EAAY,GAalB,OAZA35F,GAAKu5F,EAAe5iG,IAClB,MAAMkgG,EAAW,CACfC,OAAQ,GACRh/C,MAAO,GACPi/C,MAAO,IAEH6C,EAASjB,GAAkB3lG,EAAW2D,GAC5Co/F,GAAac,EAASC,OAAQb,GAAc2D,EAAOC,YAAYxmG,KAAKhC,KAAMsF,KAC1Eo/F,GAAac,EAAS/+C,MAAO8hD,EAAO3iF,MAAM5jB,KAAKhC,KAAMsF,IACrDo/F,GAAac,EAASE,MAAOd,GAAc2D,EAAOE,WAAWzmG,KAAKhC,KAAMsF,KACxEgjG,EAAUnnG,KAAKqkG,KAEV8C,EAETvoG,aAAamoG,EAAc5qG,GACzB,OAAO+pG,GAAwB/pG,EAAQqE,UAAUikG,UAAUx5F,MAAMpM,KAAM,CAACkoG,KAE1EnoG,UAAUmoG,EAAc5qG,GACtB,MAAMqE,UAACA,GAAarE,EACdorG,EAAe/mG,EAAU+mG,aAAat8F,MAAMpM,KAAM,CAACkoG,IACnDjD,EAAStjG,EAAUsjG,OAAO74F,MAAMpM,KAAM,CAACkoG,IACvCS,EAAchnG,EAAUgnG,YAAYv8F,MAAMpM,KAAM,CAACkoG,IACvD,IAAIzhD,EAAQ,GAIZ,OAHAA,EAAQi+C,GAAaj+C,EAAOm+C,GAAc8D,IAC1CjiD,EAAQi+C,GAAaj+C,EAAOm+C,GAAcK,IAC1Cx+C,EAAQi+C,GAAaj+C,EAAOm+C,GAAc+D,IACnCliD,EAET1mD,aAAazC,GACX,MAAMk9D,EAASx6D,KAAKk4D,QACdn7D,EAAOiD,KAAK4gD,MAAM7jD,KAClBgrG,EAAc,GACdC,EAAmB,GACnBC,EAAkB,GACxB,IACIptG,EAAGJ,EADHytG,EAAe,GAEnB,IAAKrtG,EAAI,EAAGJ,EAAM+/D,EAAO5/D,OAAQC,EAAIJ,IAAOI,EAC1CqtG,EAAa/mG,KAAK2jG,GAAkB9kG,KAAK4gD,MAAO4Z,EAAO3/D,KAkBzD,OAhBIyC,EAAQsH,SACVsjG,EAAeA,EAAatjG,OAAO,CAAChI,EAASyJ,EAAOwmC,IAAUvvC,EAAQsH,OAAOhI,EAASyJ,EAAOwmC,EAAO9vC,KAElGO,EAAQsrG,WACVV,EAAeA,EAAa54E,KAAK,CAACn2B,EAAGC,IAAMkE,EAAQsrG,SAASzvG,EAAGC,EAAG2D,KAEpE4R,GAAKu5F,EAAe5iG,IAClB,MAAMijG,EAASjB,GAAkBhqG,EAAQqE,UAAW2D,GACpDyiG,EAAY5mG,KAAKonG,EAAOM,WAAW7mG,KAAKhC,KAAMsF,IAC9C0iG,EAAiB7mG,KAAKonG,EAAOO,gBAAgB9mG,KAAKhC,KAAMsF,IACxD2iG,EAAgB9mG,KAAKonG,EAAOQ,eAAe/mG,KAAKhC,KAAMsF,MAExDtF,KAAK+nG,YAAcA,EACnB/nG,KAAKgoG,iBAAmBA,EACxBhoG,KAAKioG,gBAAkBA,EACvBjoG,KAAK4nG,WAAaM,EACXA,EAETnoG,OAAOqvE,EAAS0jB,GACd,MAAMx1F,EAAU0C,KAAK1C,QAAQqvD,WAAW3sD,KAAKikD,cACvCuW,EAASx6D,KAAKk4D,QACpB,IAAIoC,EACA4tC,EAAe,GACnB,GAAK1tC,EAAO5/D,OAML,CACL,MAAM08B,EAAW8sE,GAAY9mG,EAAQg6B,UAAUt1B,KAAKhC,KAAMw6D,EAAQx6D,KAAKwnG,gBACvEU,EAAeloG,KAAKgpG,aAAa1rG,GACjC0C,KAAKmrE,MAAQnrE,KAAKipG,SAASf,EAAc5qG,GACzC0C,KAAK2lG,WAAa3lG,KAAKkpG,cAAchB,EAAc5qG,GACnD0C,KAAK8G,KAAO9G,KAAKmpG,QAAQjB,EAAc5qG,GACvC0C,KAAK4lG,UAAY5lG,KAAKopG,aAAalB,EAAc5qG,GACjD0C,KAAKilG,OAASjlG,KAAKqpG,UAAUnB,EAAc5qG,GAC3C,MAAM2nB,EAAOjlB,KAAKynG,MAAQzC,GAAehlG,KAAM1C,GACzCgsG,EAAkB3wG,OAAOP,OAAO,GAAIk/B,EAAUrS,GAC9C+hF,EAAYH,GAAmB7mG,KAAK4gD,MAAOtjD,EAASgsG,GACpDC,EAAkBxC,GAAmBzpG,EAASgsG,EAAiBtC,EAAWhnG,KAAK4gD,OACrF5gD,KAAKwmG,OAASQ,EAAUR,OACxBxmG,KAAKsmG,OAASU,EAAUV,OACxBhsC,EAAa,CACX9gC,QAAS,EACT3O,EAAG0+E,EAAgB1+E,EACnBC,EAAGy+E,EAAgBz+E,EACnBnV,MAAOsP,EAAKtP,MACZE,OAAQoP,EAAKpP,OACbgyF,OAAQvwE,EAASzM,EACjBi9E,OAAQxwE,EAASxM,QA1BE,IAAjB9qB,KAAKw5B,UACP8gC,EAAa,CACX9gC,QAAS,IA2Bfx5B,KAAK2nG,cAAgBO,EACrBloG,KAAKo/D,cAAW7kE,EACZ+/D,GACFt6D,KAAK2kE,qBAAqB5hE,OAAO/C,KAAMs6D,GAErC8U,GAAW9xE,EAAQksG,UACrBlsG,EAAQksG,SAASxnG,KAAKhC,KAAM,CAAC4gD,MAAO5gD,KAAK4gD,MAAOsqB,QAASlrE,KAAM8yF,OAAAA,IAGnE/yF,UAAU0pG,EAAc1vG,EAAKkrB,EAAM3nB,GACjC,MAAMosG,EAAgB1pG,KAAK2pG,iBAAiBF,EAAcxkF,EAAM3nB,GAChEvD,EAAIkrD,OAAOykD,EAAc5kB,GAAI4kB,EAAc3kB,IAC3ChrF,EAAIkrD,OAAOykD,EAAc1kB,GAAI0kB,EAAczkB,IAC3ClrF,EAAIkrD,OAAOykD,EAAcE,GAAIF,EAAcG,IAE7C9pG,iBAAiB0pG,EAAcxkF,EAAM3nB,GACnC,MAAMkpG,OAACA,EAAMF,OAAEA,GAAUtmG,MACnB0mG,UAACA,EAASniD,aAAEA,GAAgBjnD,GAC5B4qD,QAACA,EAAOG,SAAEA,EAAQF,WAAEA,EAAUC,YAAEA,GAAeU,GAAcvE,IAC5D15B,EAAGi/E,EAAKh/E,EAAGi/E,GAAON,GACnB9zF,MAACA,EAAKE,OAAEA,GAAUoP,EACxB,IAAI6/D,EAAIE,EAAI4kB,EAAI7kB,EAAIE,EAAI4kB,EAoCxB,MAnCe,WAAXvD,GACFrhB,EAAK8kB,EAAOl0F,EAAS,EACN,SAAX2wF,GACF1hB,EAAKglB,EACL9kB,EAAKF,EAAK4hB,EACV3hB,EAAKE,EAAKyhB,EACVmD,EAAK5kB,EAAKyhB,IAEV5hB,EAAKglB,EAAMn0F,EACXqvE,EAAKF,EAAK4hB,EACV3hB,EAAKE,EAAKyhB,EACVmD,EAAK5kB,EAAKyhB,GAEZkD,EAAK9kB,IAGHE,EADa,SAAXwhB,EACGsD,EAAMpvG,KAAKC,IAAIutD,EAASC,KACT,UAAXq+C,EACJsD,EAAMn0F,EAAQjb,KAAKC,IAAI0tD,EAAUD,GAAes+C,EAEhD1mG,KAAK6nG,OAEG,QAAXvB,GACFvhB,EAAKglB,EACL9kB,EAAKF,EAAK2hB,EACV5hB,EAAKE,EAAK0hB,EACVkD,EAAK5kB,EAAK0hB,IAEV3hB,EAAKglB,EAAMl0F,EACXovE,EAAKF,EAAK2hB,EACV5hB,EAAKE,EAAK0hB,EACVkD,EAAK5kB,EAAK0hB,GAEZmD,EAAK9kB,GAEA,CAACD,GAAAA,EAAIE,GAAAA,EAAI4kB,GAAAA,EAAI7kB,GAAAA,EAAIE,GAAAA,EAAI4kB,GAAAA,GAE9B9pG,UAAUkwD,EAAIl2D,EAAKuD,GACjB,MAAM6tE,EAAQnrE,KAAKmrE,MACbvwE,EAASuwE,EAAMvwE,OACrB,IAAIgoG,EAAWiD,EAAchrG,EAC7B,GAAID,EAAQ,CACV,MAAMinG,EAAYztC,GAAc92D,EAAQme,IAAKzb,KAAK6qB,EAAG7qB,KAAK2V,OAQ1D,IAPAs6C,EAAGplC,EAAIu8E,GAAYpnG,KAAM1C,EAAQ4gF,WAAY5gF,GAC7CvD,EAAIgtD,UAAY86C,EAAU96C,UAAUzpD,EAAQ4gF,YAC5CnkF,EAAIitD,aAAe,SACnB47C,EAAY55C,GAAO1rD,EAAQslG,WAC3BiD,EAAevoG,EAAQuoG,aACvB9rG,EAAI+sD,UAAYxpD,EAAQ0sG,WACxBjwG,EAAIgnD,KAAO6hD,EAAU5/C,OAChBnoD,EAAI,EAAGA,EAAID,IAAUC,EACxBd,EAAIutD,SAAS6jB,EAAMtwE,GAAIgnG,EAAUh3E,EAAEolC,EAAGplC,GAAIolC,EAAGnlC,EAAI83E,EAAU3hD,WAAa,GACxEgP,EAAGnlC,GAAK83E,EAAU3hD,WAAa4kD,EAC3BhrG,EAAI,IAAMD,IACZq1D,EAAGnlC,GAAKxtB,EAAQwoG,kBAAoBD,IAK5C9lG,cAAchG,EAAKk2D,EAAIp1D,EAAGgnG,EAAWvkG,GACnC,MAAMyqG,EAAc/nG,KAAK+nG,YAAYltG,GAC/BiuG,EAAkB9oG,KAAKgoG,iBAAiBntG,IACxCslG,UAACA,EAASC,SAAEA,EAAQnrB,WAAEA,GAAc33E,EACpC4nG,EAAWl8C,GAAO1rD,EAAQ4nG,UAC1B+E,EAAS7C,GAAYpnG,KAAM,OAAQ1C,GACnC4sG,EAAYrI,EAAUh3E,EAAEo/E,GACxBE,EAAUhK,EAAY+E,EAASjkD,YAAcikD,EAASjkD,WAAak/C,GAAa,EAAI,EACpFiK,EAASn6C,EAAGnlC,EAAIq/E,EACtB,GAAI7sG,EAAQ+iG,cAAe,CACzB,MAAMiC,EAAc,CAClB59C,OAAQhqD,KAAKqZ,IAAIqsF,EAAUD,GAAa,EACxC37C,WAAYskD,EAAgBtkD,WAC5BC,SAAUqkD,EAAgBrkD,SAC1BW,YAAa,GAETsoB,EAAUm0B,EAAUttC,WAAW21C,EAAW9J,GAAYA,EAAW,EACjEzyB,EAAUy8B,EAASjK,EAAY,EACrCpmG,EAAImtD,YAAc5pD,EAAQ+sG,mBAC1BtwG,EAAI+sD,UAAYxpD,EAAQ+sG,mBACxBjmD,GAAUrqD,EAAKuoG,EAAa50B,EAASC,GACrC5zE,EAAImtD,YAAc6gD,EAAYtnD,YAC9B1mD,EAAI+sD,UAAYihD,EAAYvnD,gBAC5B4D,GAAUrqD,EAAKuoG,EAAa50B,EAASC,OAChC,CACL5zE,EAAIotD,UAAY4gD,EAAY3iD,aAAe,EAC3CrrD,EAAImtD,YAAc6gD,EAAYtnD,YAC9B1mD,EAAIssF,YAAY0hB,EAAY7wC,YAAc,IAC1Cn9D,EAAIusF,eAAiByhB,EAAY5wC,kBAAoB,EACrD,MAAMmzC,EAASzI,EAAUttC,WAAW21C,EAAW9J,EAAWnrB,GACpDs1B,EAAS1I,EAAUttC,WAAWstC,EAAUvtC,MAAM41C,EAAW,GAAI9J,EAAWnrB,EAAa,GACrFif,EAAeprC,GAAci/C,EAAY7T,cAC3Cv7F,OAAO0nD,OAAO6zC,GAActK,KAAKphE,GAAW,IAANA,IACxCzuB,EAAI8qD,YACJ9qD,EAAI+sD,UAAYxpD,EAAQ+sG,mBACxBpiD,GAAmBluD,EAAK,CACtB8wB,EAAGy/E,EACHx/E,EAAGs/E,EACH13D,EAAG0tD,EACHhgG,EAAG+/F,EACHz7C,OAAQwvC,IAEVn6F,EAAI6L,OACJ7L,EAAIsrD,SACJtrD,EAAI+sD,UAAYihD,EAAYvnD,gBAC5BzmD,EAAI8qD,YACJoD,GAAmBluD,EAAK,CACtB8wB,EAAG0/E,EACHz/E,EAAGs/E,EAAS,EACZ13D,EAAG0tD,EAAW,EACdhgG,EAAG+/F,EAAY,EACfz7C,OAAQwvC,IAEVn6F,EAAI6L,SAEJ7L,EAAI+sD,UAAYxpD,EAAQ+sG,mBACxBtwG,EAAIksF,SAASqkB,EAAQF,EAAQhK,EAAUD,GACvCpmG,EAAIywG,WAAWF,EAAQF,EAAQhK,EAAUD,GACzCpmG,EAAI+sD,UAAYihD,EAAYvnD,gBAC5BzmD,EAAIksF,SAASskB,EAAQH,EAAS,EAAGhK,EAAW,EAAGD,EAAY,IAG/DpmG,EAAI+sD,UAAY9mD,KAAKioG,gBAAgBptG,GAEvCkF,SAASkwD,EAAIl2D,EAAKuD,GAChB,MAAMwJ,KAACA,GAAQ9G,MACTgmG,YAACA,EAAWyE,UAAEA,EAAS1E,cAAEA,EAAa5F,UAAEA,EAASC,SAAEA,EAAQnrB,WAAEA,GAAc33E,EAC3E4nG,EAAWl8C,GAAO1rD,EAAQ4nG,UAChC,IAAIwF,EAAiBxF,EAASjkD,WAC1B0pD,EAAe,EACnB,MAAM9I,EAAYztC,GAAc92D,EAAQme,IAAKzb,KAAK6qB,EAAG7qB,KAAK2V,OACpDi1F,EAAiB,SAAShkD,GAC9B7sD,EAAIutD,SAASV,EAAMi7C,EAAUh3E,EAAEolC,EAAGplC,EAAI8/E,GAAe16C,EAAGnlC,EAAI4/E,EAAiB,GAC7Ez6C,EAAGnlC,GAAK4/E,EAAiB1E,GAErB6E,EAA0BhJ,EAAU96C,UAAU0jD,GACpD,IAAIjF,EAAUsF,EAAWrkD,EAAO5rD,EAAG2R,EAAGs9B,EAAMyZ,EAU5C,IATAxpD,EAAIgtD,UAAY0jD,EAChB1wG,EAAIitD,aAAe,SACnBjtD,EAAIgnD,KAAOmkD,EAASliD,OACpBiN,EAAGplC,EAAIu8E,GAAYpnG,KAAM6qG,EAAyBvtG,GAClDvD,EAAI+sD,UAAYxpD,EAAQytG,UACxBp8F,GAAK3O,KAAK2lG,WAAYiF,GACtBD,EAAe5E,GAA6C,UAA5B8E,EACd,WAAdJ,EAA0BrK,EAAW,EAAInrB,EAAemrB,EAAW,EAAInrB,EACvE,EACCp6E,EAAI,EAAGivC,EAAOhjC,EAAKlM,OAAQC,EAAIivC,IAAQjvC,EAAG,CAU7C,IATA2qG,EAAW1+F,EAAKjM,GAChBiwG,EAAY9qG,KAAKioG,gBAAgBptG,GACjCd,EAAI+sD,UAAYgkD,EAChBn8F,GAAK62F,EAASC,OAAQmF,GACtBnkD,EAAQ++C,EAAS/+C,MACbs/C,GAAiBt/C,EAAM7rD,SACzBoF,KAAKgrG,cAAcjxG,EAAKk2D,EAAIp1D,EAAGgnG,EAAWvkG,GAC1CotG,EAAiBhwG,KAAKC,IAAIuqG,EAASjkD,WAAYk/C,IAE5C3zF,EAAI,EAAG+2C,EAAOkD,EAAM7rD,OAAQ4R,EAAI+2C,IAAQ/2C,EAC3Co+F,EAAenkD,EAAMj6C,IACrBk+F,EAAiBxF,EAASjkD,WAE5BtyC,GAAK62F,EAASE,MAAOkF,GAEvBD,EAAe,EACfD,EAAiBxF,EAASjkD,WAC1BtyC,GAAK3O,KAAK4lG,UAAWgF,GACrB36C,EAAGnlC,GAAKk7E,EAEVjmG,WAAWkwD,EAAIl2D,EAAKuD,GAClB,MAAM2nG,EAASjlG,KAAKilG,OACdrqG,EAASqqG,EAAOrqG,OACtB,IAAIuqG,EAAYtqG,EAChB,GAAID,EAAQ,CACV,MAAMinG,EAAYztC,GAAc92D,EAAQme,IAAKzb,KAAK6qB,EAAG7qB,KAAK2V,OAQ1D,IAPAs6C,EAAGplC,EAAIu8E,GAAYpnG,KAAM1C,EAAQ2tG,YAAa3tG,GAC9C2yD,EAAGnlC,GAAKxtB,EAAQ2oG,gBAChBlsG,EAAIgtD,UAAY86C,EAAU96C,UAAUzpD,EAAQ2tG,aAC5ClxG,EAAIitD,aAAe,SACnBm+C,EAAan8C,GAAO1rD,EAAQ6nG,YAC5BprG,EAAI+sD,UAAYxpD,EAAQ4tG,YACxBnxG,EAAIgnD,KAAOokD,EAAWniD,OACjBnoD,EAAI,EAAGA,EAAID,IAAUC,EACxBd,EAAIutD,SAAS29C,EAAOpqG,GAAIgnG,EAAUh3E,EAAEolC,EAAGplC,GAAIolC,EAAGnlC,EAAIq6E,EAAWlkD,WAAa,GAC1EgP,EAAGnlC,GAAKq6E,EAAWlkD,WAAa3jD,EAAQ4oG,eAI9CnmG,eAAekwD,EAAIl2D,EAAKoxG,EAAa7tG,GACnC,MAAMkpG,OAACA,EAAMF,OAAEA,GAAUtmG,MACnB6qB,EAACA,EAACC,EAAEA,GAAKmlC,GACTt6C,MAACA,EAAKE,OAAEA,GAAUs1F,GAClBjjD,QAACA,EAAOG,SAAEA,EAAQF,WAAEA,EAAUC,YAAEA,GAAeU,GAAcxrD,EAAQinD,cAC3ExqD,EAAI+sD,UAAYxpD,EAAQkjD,gBACxBzmD,EAAImtD,YAAc5pD,EAAQmjD,YAC1B1mD,EAAIotD,UAAY7pD,EAAQ8nD,YACxBrrD,EAAI8qD,YACJ9qD,EAAIirD,OAAOn6B,EAAIq9B,EAASp9B,GACT,QAAXw7E,GACFtmG,KAAKorG,UAAUn7C,EAAIl2D,EAAKoxG,EAAa7tG,GAEvCvD,EAAIkrD,OAAOp6B,EAAIlV,EAAQ0yC,EAAUv9B,GACjC/wB,EAAIsxG,iBAAiBxgF,EAAIlV,EAAOmV,EAAGD,EAAIlV,EAAOmV,EAAIu9B,GACnC,WAAXi+C,GAAkC,UAAXE,GACzBxmG,KAAKorG,UAAUn7C,EAAIl2D,EAAKoxG,EAAa7tG,GAEvCvD,EAAIkrD,OAAOp6B,EAAIlV,EAAOmV,EAAIjV,EAASuyC,GACnCruD,EAAIsxG,iBAAiBxgF,EAAIlV,EAAOmV,EAAIjV,EAAQgV,EAAIlV,EAAQyyC,EAAat9B,EAAIjV,GAC1D,WAAXywF,GACFtmG,KAAKorG,UAAUn7C,EAAIl2D,EAAKoxG,EAAa7tG,GAEvCvD,EAAIkrD,OAAOp6B,EAAIs9B,EAAYr9B,EAAIjV,GAC/B9b,EAAIsxG,iBAAiBxgF,EAAGC,EAAIjV,EAAQgV,EAAGC,EAAIjV,EAASsyC,GACrC,WAAXm+C,GAAkC,SAAXE,GACzBxmG,KAAKorG,UAAUn7C,EAAIl2D,EAAKoxG,EAAa7tG,GAEvCvD,EAAIkrD,OAAOp6B,EAAGC,EAAIo9B,GAClBnuD,EAAIsxG,iBAAiBxgF,EAAGC,EAAGD,EAAIq9B,EAASp9B,GACxC/wB,EAAIgrD,YACJhrD,EAAI6L,OACAtI,EAAQ8nD,YAAc,GACxBrrD,EAAIsrD,SAGRtlD,uBAAuBzC,GACrB,MAAMsjD,EAAQ5gD,KAAK4gD,MACb8W,EAAQ13D,KAAKq7D,YACbiwC,EAAQ5zC,GAASA,EAAM7sC,EACvB0gF,EAAQ7zC,GAASA,EAAM5sC,EAC7B,GAAIwgF,GAASC,EAAO,CAClB,MAAMj0E,EAAW8sE,GAAY9mG,EAAQg6B,UAAUt1B,KAAKhC,KAAMA,KAAKk4D,QAASl4D,KAAKwnG,gBAC7E,IAAKlwE,EACH,OAEF,MAAMrS,EAAOjlB,KAAKynG,MAAQzC,GAAehlG,KAAM1C,GACzCgsG,EAAkB3wG,OAAOP,OAAO,GAAIk/B,EAAUt3B,KAAKynG,OACnDT,EAAYH,GAAmBjmD,EAAOtjD,EAASgsG,GAC/Cn6E,EAAQ43E,GAAmBzpG,EAASgsG,EAAiBtC,EAAWpmD,GAClE0qD,EAAMzxC,MAAQ1qC,EAAMtE,GAAK0gF,EAAM1xC,MAAQ1qC,EAAMrE,IAC/C9qB,KAAKwmG,OAASQ,EAAUR,OACxBxmG,KAAKsmG,OAASU,EAAUV,OACxBtmG,KAAK2V,MAAQsP,EAAKtP,MAClB3V,KAAK6V,OAASoP,EAAKpP,OACnB7V,KAAK6nG,OAASvwE,EAASzM,EACvB7qB,KAAK8nG,OAASxwE,EAASxM,EACvB9qB,KAAK2kE,qBAAqB5hE,OAAO/C,KAAMmvB,KAI7CpvB,KAAKhG,GACH,MAAMuD,EAAU0C,KAAK1C,QAAQqvD,WAAW3sD,KAAKikD,cAC7C,IAAIzqB,EAAUx5B,KAAKw5B,QACnB,IAAKA,EACH,OAEFx5B,KAAKwrG,uBAAuBluG,GAC5B,MAAM6tG,EAAc,CAClBx1F,MAAO3V,KAAK2V,MACZE,OAAQ7V,KAAK6V,QAETo6C,EAAK,CACTplC,EAAG7qB,KAAK6qB,EACRC,EAAG9qB,KAAK8qB,GAEV0O,EAAU9+B,KAAK6hB,IAAIid,GAAW,KAAO,EAAIA,EACzC,MAAMy8C,EAAUltB,GAAUzrD,EAAQ24E,SAC5Bw1B,EAAoBzrG,KAAKmrE,MAAMvwE,QAAUoF,KAAK2lG,WAAW/qG,QAAUoF,KAAK8G,KAAKlM,QAAUoF,KAAK4lG,UAAUhrG,QAAUoF,KAAKilG,OAAOrqG,OAC9H0C,EAAQ0a,SAAWyzF,IACrB1xG,EAAIupD,OACJvpD,EAAI2xG,YAAclyE,EAClBx5B,KAAK6mF,eAAe52B,EAAIl2D,EAAKoxG,EAAa7tG,GAC1Cq3D,GAAsB56D,EAAKuD,EAAQ6kG,eACnClyC,EAAGnlC,GAAKmrD,EAAQ1nE,IAChBvO,KAAK+mF,UAAU92B,EAAIl2D,EAAKuD,GACxB0C,KAAK2rG,SAAS17C,EAAIl2D,EAAKuD,GACvB0C,KAAK4rG,WAAW37C,EAAIl2D,EAAKuD,GACzBy3D,GAAqBh7D,EAAKuD,EAAQ6kG,eAClCpoG,EAAI0pD,WAGR1jD,oBACE,OAAOC,KAAKk4D,SAAW,GAEzBn4D,kBAAkB6yF,EAAgB2R,GAChC,MAAM1R,EAAa7yF,KAAKk4D,QAClBsC,EAASo4B,EAAejuF,IAAI,EAAEslC,aAAAA,EAAc5jC,MAAAA,MAChD,MAAMo2D,EAAOz8D,KAAK4gD,MAAM+f,eAAe12B,GACvC,IAAKwyB,EACH,MAAM,IAAI17D,MAAM,kCAAoCkpC,GAEtD,MAAO,CACLA,aAAAA,EACArtC,QAAS6/D,EAAK1/D,KAAKsJ,GACnBA,MAAAA,KAGE+oE,GAAWzlC,GAAekpD,EAAYr4B,GACtCqxC,EAAkB7rG,KAAK8rG,iBAAiBtxC,EAAQ+pC,IAClDn1B,GAAWy8B,KACb7rG,KAAKk4D,QAAUsC,EACfx6D,KAAKwnG,eAAiBjD,EACtBvkG,KAAK+rG,qBAAsB,EAC3B/rG,KAAK+C,QAAO,IAGhBhD,YAAYE,EAAG6yF,EAAQK,GAAc,GACnC,GAAIL,GAAU9yF,KAAK+rG,oBACjB,OAAO,EAET/rG,KAAK+rG,qBAAsB,EAC3B,MAAMzuG,EAAU0C,KAAK1C,QACfu1F,EAAa7yF,KAAKk4D,SAAW,GAC7BsC,EAASx6D,KAAKszF,mBAAmBrzF,EAAG4yF,EAAYC,EAAQK,GACxD0Y,EAAkB7rG,KAAK8rG,iBAAiBtxC,EAAQv6D,GAChDmvE,EAAU0jB,IAAWnpD,GAAe6wB,EAAQq4B,IAAegZ,EAWjE,OAVIz8B,IACFpvE,KAAKk4D,QAAUsC,GACXl9D,EAAQ0a,SAAW1a,EAAQksG,YAC7BxpG,KAAKwnG,eAAiB,CACpB38E,EAAG5qB,EAAE4qB,EACLC,EAAG7qB,EAAE6qB,GAEP9qB,KAAK+C,QAAO,EAAM+vF,KAGf1jB,EAETrvE,mBAAmBE,EAAG4yF,EAAYC,EAAQK,GACxC,MAAM71F,EAAU0C,KAAK1C,QACrB,GAAe,aAAX2C,EAAEwB,KACJ,MAAO,GAET,IAAK0xF,EACH,OAAON,EAET,MAAMr4B,EAASx6D,KAAK4gD,MAAM+yC,0BAA0B1zF,EAAG3C,EAAQkkD,KAAMlkD,EAASw1F,GAI9E,OAHIx1F,EAAQosC,SACV8wB,EAAO9wB,UAEF8wB,EAETz6D,iBAAiBy6D,EAAQv6D,GACvB,MAAM4nG,OAACA,EAAMC,OAAEA,EAAMxqG,QAAEA,GAAW0C,KAC5Bs3B,EAAW8sE,GAAY9mG,EAAQg6B,UAAUt1B,KAAKhC,KAAMw6D,EAAQv6D,GAClE,OAAoB,IAAbq3B,IAAuBuwE,IAAWvwE,EAASzM,GAAKi9E,IAAWxwE,EAASxM,IAG/Ey8E,GAAQnD,YAAcA,GACtB,IAAI4H,GAAiB,CACnBtjG,GAAI,UACJ66F,SAAUgE,GACVnD,YAAAA,GACArkG,UAAU6gD,EAAOk/C,EAAOxiG,GAClBA,IACFsjD,EAAMsqB,QAAU,IAAIq8B,GAAQ,CAAC3mD,MAAAA,EAAOtjD,QAAAA,MAGxCyC,aAAa6gD,EAAOk/C,EAAOxiG,GACrBsjD,EAAMsqB,SACRtqB,EAAMsqB,QAAQ5L,WAAWhiE,IAG7ByC,MAAM6gD,EAAOk/C,EAAOxiG,GACdsjD,EAAMsqB,SACRtqB,EAAMsqB,QAAQ5L,WAAWhiE,IAG7ByC,UAAU6gD,GACR,MAAMsqB,EAAUtqB,EAAMsqB,QAChBx/D,EAAO,CACXw/D,QAAAA,IAEqD,IAAnDtqB,EAAM0gC,cAAc,oBAAqB51E,KAGzCw/D,GACFA,EAAQjT,KAAKrX,EAAM7mD,KAErB6mD,EAAM0gC,cAAc,mBAAoB51E,KAE1C3L,WAAW6gD,EAAOl1C,GAChB,GAAIk1C,EAAMsqB,QAAS,CACjB,MAAMsH,EAAmB9mE,EAAKonF,OAC1BlyC,EAAMsqB,QAAQ5+D,YAAYZ,EAAKtO,MAAOo1E,EAAkB9mE,EAAKynF,eAC/DznF,EAAK0jE,SAAU,KAIrBn9C,SAAU,CACRja,SAAS,EACTwxF,SAAU,KACVlyE,SAAU,UACVkpB,gBAAiB,kBACjBwpD,WAAY,OACZpH,UAAW,CACTxjD,OAAQ,QAEVymD,aAAc,EACdC,kBAAmB,EACnB5nB,WAAY,OACZ6sB,UAAW,OACX/E,YAAa,EACbd,SAAU,GAEVuF,UAAW,OACXS,YAAa,OACbhF,cAAe,EACfD,gBAAiB,EACjBd,WAAY,CACV/lD,OAAQ,QAEV6rD,YAAa,OACbh1B,QAAS,EACT0wB,aAAc,EACdD,UAAW,EACXniD,aAAc,EACd47C,UAAW,CAACpmG,EAAKib,IAASA,EAAKkwF,SAASjgF,KACxCm7E,SAAU,CAACrmG,EAAKib,IAASA,EAAKkwF,SAASjgF,KACvColF,mBAAoB,OACpBtE,eAAe,EACf9wB,WAAY,EACZx0B,YAAa,gBACb2E,YAAa,EACb7E,UAAW,CACTh1C,SAAU,IACVguD,OAAQ,gBAEVoB,WAAY,CACVJ,QAAS,CACP94D,KAAM,SACN64D,WAAY,CAAC,IAAK,IAAK,QAAS,SAAU,SAAU,WAEtD9gC,QAAS,CACP+/B,OAAQ,SACRhuD,SAAU,MAGd5J,UAAW,CACTymG,YAAajwG,GACb4H,MAAMmoG,GACJ,GAAIA,EAAattG,OAAS,EAAG,CAC3B,MAAMm1B,EAAOm4E,EAAa,GACpBlmC,EAASjyC,EAAK6wB,MAAM7jD,KAAKilE,OACzBiqC,EAAajqC,EAASA,EAAOpnE,OAAS,EAC5C,GAAIoF,MAAQA,KAAK1C,SAAiC,YAAtB0C,KAAK1C,QAAQkkD,KACvC,OAAOzxB,EAAK2vC,QAAQ95C,OAAS,GACxB,GAAImK,EAAKnK,MACd,OAAOmK,EAAKnK,MACP,GAAIqmF,EAAa,GAAKl8E,EAAK7iB,UAAY++F,EAC5C,OAAOjqC,EAAOjyC,EAAK7iB,WAGvB,MAAO,IAETm7F,WAAYlwG,GACZwtG,WAAYxtG,GACZqwG,YAAarwG,GACb4H,MAAMuuE,GACJ,GAAItuE,MAAQA,KAAK1C,SAAiC,YAAtB0C,KAAK1C,QAAQkkD,KACvC,OAAO8sB,EAAY1oD,MAAQ,KAAO0oD,EAAYE,gBAAkBF,EAAYE,eAE9E,IAAI5oD,EAAQ0oD,EAAY5O,QAAQ95C,OAAS,GACrCA,IACFA,GAAS,MAEX,MAAMjoB,EAAQ2wE,EAAYE,eAI1B,OAHKvlC,GAActrC,KACjBioB,GAASjoB,GAEJioB,GAET7lB,WAAWuuE,GACT,MACMhxE,EADOgxE,EAAY1tB,MAAM+f,eAAe2N,EAAYrkC,cACrC9I,WAAWgyB,SAASmb,EAAYphE,WACrD,MAAO,CACLuzC,YAAanjD,EAAQmjD,YACrBD,gBAAiBljD,EAAQkjD,gBACzB4E,YAAa9nD,EAAQ8nD,YACrB8R,WAAY55D,EAAQ45D,WACpBC,iBAAkB75D,EAAQ65D,iBAC1B+8B,aAAc,IAGlBn0F,iBACE,OAAOC,KAAK1C,QAAQytG,WAEtBhrG,gBAAgBuuE,GACd,MACMhxE,EADOgxE,EAAY1tB,MAAM+f,eAAe2N,EAAYrkC,cACrC9I,WAAWgyB,SAASmb,EAAYphE,WACrD,MAAO,CACLs3C,WAAYlnD,EAAQknD,WACpBC,SAAUnnD,EAAQmnD,WAGtBgkD,WAAYtwG,GACZytG,UAAWztG,GACXuwG,aAAcvwG,GACd8sG,OAAQ9sG,GACRwwG,YAAaxwG,KAGjB8hF,cAAe,CACbirB,SAAU,OACVC,WAAY,OACZvC,UAAW,QAEb3kG,YAAa,CACXwkD,YAAc5lD,GAAkB,WAATA,GAA8B,aAATA,GAAgC,aAATA,EACnE8lD,YAAY,EACZhhD,UAAW,CACT8gD,aAAa,EACbE,YAAY,GAEdpC,UAAW,CACTqC,WAAW,GAEb+X,WAAY,CACV/X,UAAW,cAGfgpC,uBAAwB,CAAC,gBAGvB/pC,GAAuBlpD,OAAO4rE,OAAO,CACzCpmE,UAAW,KACX+tG,WAAYpR,GACZqR,OAAQtM,GACRU,OAAQ+C,GACR8I,SAAUjI,GACVT,MAAOK,GACPwD,QAASyE,KAYT,SAASK,GAAerqC,EAAQ8B,EAAKz9D,EAAOimG,GAC1C,MAAM3wB,EAAQ3Z,EAAOziE,QAAQukE,GAC7B,IAAe,IAAX6X,EACF,MAZgB,EAAC3Z,EAAQ8B,EAAKz9D,EAAOimG,KACpB,iBAARxoC,GACTz9D,EAAQ27D,EAAO7gE,KAAK2iE,GAAO,EAC3BwoC,EAAYpgG,QAAQ,CAAC7F,MAAAA,EAAOuf,MAAOk+C,KAC1B9+C,MAAM8+C,KACfz9D,EAAQ,MAEHA,GAKEkmG,CAAYvqC,EAAQ8B,EAAKz9D,EAAOimG,GAGzC,OAAO3wB,IADM3Z,EAAOwqC,YAAY1oC,GACRz9D,EAAQs1E,EAGlC,MAAM8wB,WAAsBruB,GAC1Br+E,YAAYo5D,GACVlwD,MAAMkwD,GACNn5D,KAAK0sG,iBAAcnyG,EACnByF,KAAK2sG,YAAc,EACnB3sG,KAAK4sG,aAAe,GAEtB7sG,KAAKkqF,GACH,MAAM4iB,EAAQ7sG,KAAK4sG,aACnB,GAAIC,EAAMjyG,OAAQ,CAChB,MAAMonE,EAAShiE,KAAKiiE,YACpB,IAAK,MAAM57D,MAACA,EAAKuf,MAAEA,KAAUinF,EACvB7qC,EAAO37D,KAAWuf,GACpBo8C,EAAO17D,OAAOD,EAAO,GAGzBrG,KAAK4sG,aAAe,GAEtB3jG,MAAMnE,KAAKmlF,GAEblqF,MAAM+jE,EAAKz9D,GACT,GAAI4iC,GAAc66B,GAChB,OAAO,KAET,MAAM9B,EAAShiE,KAAKiiE,YAGpB,MA5Be,EAAC57D,EAAO1L,IAAkB,OAAV0L,EAAiB,KAAOkoC,GAAY7zC,KAAKqiC,MAAM12B,GAAQ,EAAG1L,GA4BlFmjF,CAFPz3E,EAAQolB,SAASplB,IAAU27D,EAAO37D,KAAWy9D,EAAMz9D,EAC/CgmG,GAAerqC,EAAQ8B,EAAKz6B,GAAehjC,EAAOy9D,GAAM9jE,KAAK4sG,cACxC5qC,EAAOpnE,OAAS,GAE3CmF,sBACE,MAAMijE,WAACA,EAAUC,WAAEA,GAAcjjE,KAAKkjE,gBACtC,IAAInvD,IAACA,EAAGpZ,IAAEA,GAAOqF,KAAKw/E,WAAU,GACJ,UAAxBx/E,KAAK1C,QAAQi4D,SACVyN,IACHjvD,EAAM,GAEHkvD,IACHtoE,EAAMqF,KAAKiiE,YAAYrnE,OAAS,IAGpCoF,KAAK+T,IAAMA,EACX/T,KAAKrF,IAAMA,EAEboF,aACE,MAAMgU,EAAM/T,KAAK+T,IACXpZ,EAAMqF,KAAKrF,IACXmT,EAAS9N,KAAK1C,QAAQwQ,OACtBs4D,EAAQ,GACd,IAAIpE,EAAShiE,KAAKiiE,YAClBD,EAAkB,IAARjuD,GAAapZ,IAAQqnE,EAAOpnE,OAAS,EAAKonE,EAASA,EAAO7nE,MAAM4Z,EAAKpZ,EAAM,GACrFqF,KAAK2sG,YAAcjyG,KAAKC,IAAIqnE,EAAOpnE,QAAUkT,EAAS,EAAI,GAAI,GAC9D9N,KAAK0sG,YAAc1sG,KAAK+T,KAAOjG,EAAS,GAAM,GAC9C,IAAK,IAAInQ,EAAQoW,EAAKpW,GAAShD,EAAKgD,IAClCyoE,EAAMjlE,KAAK,CAACxD,MAAAA,IAEd,OAAOyoE,EAETrmE,iBAAiBpC,GACf,MAAMqkE,EAAShiE,KAAKiiE,YACpB,OAAItkE,GAAS,GAAKA,EAAQqkE,EAAOpnE,OACxBonE,EAAOrkE,GAETA,EAEToC,YACEkJ,MAAM+xD,YACDh7D,KAAKqc,iBACRrc,KAAKmyE,gBAAkBnyE,KAAKmyE,gBAGhCpyE,iBAAiBpC,GAIf,MAHqB,iBAAVA,IACTA,EAAQqC,KAAKmiE,MAAMxkE,IAEJ,OAAVA,EAAiB4kE,IAAMviE,KAAKirE,oBAAoBttE,EAAQqC,KAAK0sG,aAAe1sG,KAAK2sG,aAE1F5sG,gBAAgBsG,GACd,MAAM+/D,EAAQpmE,KAAKomE,MACnB,OAAI//D,EAAQ,GAAKA,EAAQ+/D,EAAMxrE,OAAS,EAC/B,KAEFoF,KAAKmmE,iBAAiBC,EAAM//D,GAAO1I,OAE5CoC,iBAAiB6jD,GACf,OAAOlpD,KAAKqiC,MAAM/8B,KAAK0sG,YAAc1sG,KAAK8sG,mBAAmBlpD,GAAS5jD,KAAK2sG,aAE7E5sG,eACE,OAAOC,KAAK0lD,QAUhB,SAASqnD,GAAgBC,EAAmBC,GAC1C,MAAM7mC,EAAQ,IAER7Q,OAACA,EAAM99C,KAAEA,EAAI1D,IAAEA,EAAGpZ,IAAEA,EAAGotC,UAAEA,EAASqtB,MAAEA,EAAK83C,SAAEA,EAAQC,UAAEA,EAASC,cAAEA,GAAiBJ,EACjFt7B,EAAOj6D,GAAQ,EACf41F,EAAYH,EAAW,GACtBn5F,IAAKu5F,EAAM3yG,IAAK4yG,GAAQN,EACzBjqC,GAAc/5B,GAAcl1B,GAC5BkvD,GAAch6B,GAActuC,GAC5B6yG,GAAgBvkE,GAAcmsB,GAC9Bq4C,GAAcF,EAAOD,IAASH,EAAY,GAChD,IACIp0C,EAAQ20C,EAASC,EAASC,EAD1B/hC,EAAUz/B,IAASmhE,EAAOD,GAAQD,EAAY37B,GAAQA,EAE1D,GAAI7F,EAXgB,QAWU7I,IAAeC,EAC3C,MAAO,CAAC,CAACtlE,MAAO2vG,GAAO,CAAC3vG,MAAO4vG,IAEjCK,EAAYlzG,KAAKquB,KAAKwkF,EAAO1hC,GAAWnxE,KAAK+sB,MAAM6lF,EAAOzhC,GACtD+hC,EAAYP,IACdxhC,EAAUz/B,GAAQwhE,EAAY/hC,EAAUwhC,EAAY37B,GAAQA,GAEzDzoC,GAAclB,KACjBgxB,EAASr+D,KAAK8sC,IAAI,GAAIO,GACtB8jC,EAAUnxE,KAAKquB,KAAK8iD,EAAU9S,GAAUA,GAE3B,UAAXxD,GACFm4C,EAAUhzG,KAAK+sB,MAAM6lF,EAAOzhC,GAAWA,EACvC8hC,EAAUjzG,KAAKquB,KAAKwkF,EAAO1hC,GAAWA,IAEtC6hC,EAAUJ,EACVK,EAAUJ,GAERvqC,GAAcC,GAAcxrD,GDp4RlC,SAAqBoT,EAAG8hB,GACtB,MAAMkhE,EAAUnzG,KAAKqiC,MAAMlS,GAC3B,OAASgjF,EAAUlhE,GAAY9hB,GAAQgjF,EAAUlhE,GAAY9hB,ECk4RrBijF,EAAanzG,EAAMoZ,GAAO0D,EAAMo0D,EAAU,MAChF+hC,EAAYlzG,KAAKqiC,MAAMriC,KAAKqZ,KAAKpZ,EAAMoZ,GAAO83D,EAASqhC,IACvDrhC,GAAWlxE,EAAMoZ,GAAO65F,EACxBF,EAAU35F,EACV45F,EAAUhzG,GACD6yG,GACTE,EAAU1qC,EAAajvD,EAAM25F,EAC7BC,EAAU1qC,EAAatoE,EAAMgzG,EAC7BC,EAAYx4C,EAAQ,EACpByW,GAAW8hC,EAAUD,GAAWE,IAEhCA,GAAaD,EAAUD,GAAW7hC,EAEhC+hC,EADErhE,GAAaqhE,EAAWlzG,KAAKqiC,MAAM6wE,GAAY/hC,EAAU,KAC/CnxE,KAAKqiC,MAAM6wE,GAEXlzG,KAAKquB,KAAK6kF,IAG1B,MAAMG,EAAgBrzG,KAAKC,IACzBuyC,GAAe2+B,GACf3+B,GAAewgE,IAEjB30C,EAASr+D,KAAK8sC,IAAI,GAAIyB,GAAclB,GAAagmE,EAAgBhmE,GACjE2lE,EAAUhzG,KAAKqiC,MAAM2wE,EAAU30C,GAAUA,EACzC40C,EAAUjzG,KAAKqiC,MAAM4wE,EAAU50C,GAAUA,EACzC,IAAIvsD,EAAI,EAcR,IAbIw2D,IACEoqC,GAAiBM,IAAY35F,GAC/BqyD,EAAMjlE,KAAK,CAACxD,MAAOoW,IACf25F,EAAU35F,GACZvH,IAEE+/B,GAAa7xC,KAAKqiC,OAAO2wE,EAAUlhG,EAAIq/D,GAAW9S,GAAUA,EAAQhlD,EAAKi6F,GAAkBj6F,EAAK05F,EAAYT,KAC9GxgG,KAEOkhG,EAAU35F,GACnBvH,KAGGA,EAAIohG,IAAaphG,EACtB45D,EAAMjlE,KAAK,CAACxD,MAAOjD,KAAKqiC,OAAO2wE,EAAUlhG,EAAIq/D,GAAW9S,GAAUA,IAWpE,OATIkK,GAAcmqC,GAAiBO,IAAYhzG,EACzCyrE,EAAMxrE,QAAU2xC,GAAa65B,EAAMA,EAAMxrE,OAAS,GAAG+C,MAAOhD,EAAKqzG,GAAkBrzG,EAAK8yG,EAAYT,IACtG5mC,EAAMA,EAAMxrE,OAAS,GAAG+C,MAAQhD,EAEhCyrE,EAAMjlE,KAAK,CAACxD,MAAOhD,IAEXsoE,GAAc0qC,IAAYhzG,GACpCyrE,EAAMjlE,KAAK,CAACxD,MAAOgwG,IAEdvnC,EAET,SAAS4nC,GAAkBrwG,EAAO8vG,GAAYrmC,WAACA,EAAUwV,YAAEA,IACzD,MAAMj4B,EAAM7X,GAAU8vC,GAChB99D,GAASsoD,EAAa1sE,KAAKi0C,IAAIgW,GAAOjqD,KAAKuZ,IAAI0wC,KAAS,KACxD/pD,EAAS,IAAO6yG,GAAc,GAAK9vG,GAAO/C,OAChD,OAAOF,KAAKqZ,IAAI05F,EAAa3uF,EAAOlkB,GA/FtC6xG,GAAc/jG,GAAK,WACnB+jG,GAAcx6E,SAAW,CACvBm0C,MAAO,CACLnjE,SAAUwpG,GAAc7iG,UAAU05D,mBA8FtC,MAAM2qC,WAAwB7vB,GAC5Br+E,YAAYo5D,GACVlwD,MAAMkwD,GACNn5D,KAAKmhB,WAAQ5mB,EACbyF,KAAKuhB,SAAMhnB,EACXyF,KAAK0sG,iBAAcnyG,EACnByF,KAAKkuG,eAAY3zG,EACjByF,KAAK2sG,YAAc,EAErB5sG,MAAM+jE,EAAKz9D,GACT,OAAI4iC,GAAc66B,KAGE,iBAARA,GAAoBA,aAAe/+C,UAAY0G,UAAUq4C,GAF5D,MAKDA,EAEV/jE,yBACE,MAAMgrE,YAACA,GAAe/qE,KAAK1C,SACrB0lE,WAACA,EAAUC,WAAEA,GAAcjjE,KAAKkjE,gBACtC,IAAInvD,IAACA,EAAGpZ,IAAEA,GAAOqF,KACjB,MAAMmuG,EAAS3lF,GAAMzU,EAAMivD,EAAajvD,EAAMyU,EACxC4lF,EAAS5lF,GAAM7tB,EAAMsoE,EAAatoE,EAAM6tB,EAC9C,GAAIuiD,EAAa,CACf,MAAMsjC,EAAUliE,GAAKp4B,GACfu6F,EAAUniE,GAAKxxC,GACjB0zG,EAAU,GAAKC,EAAU,EAC3BF,EAAO,GACEC,EAAU,GAAKC,EAAU,GAClCH,EAAO,GAGX,GAAIp6F,IAAQpZ,EAAK,CACf,IAAImT,EAAS,GACTnT,GAAOoqB,OAAOwpF,kBAAoBx6F,GAAOgR,OAAOypF,oBAClD1gG,EAASpT,KAAK6hB,IAAU,IAAN5hB,IAEpByzG,EAAOzzG,EAAMmT,GACRi9D,GACHojC,EAAOp6F,EAAMjG,GAGjB9N,KAAK+T,IAAMA,EACX/T,KAAKrF,IAAMA,EAEboF,eACE,MAAM+6E,EAAW96E,KAAK1C,QAAQ8oE,MAC9B,IACI8mC,GADAlyB,cAACA,EAAayzB,SAAEA,GAAY3zB,EAehC,OAbI2zB,GACFvB,EAAWxyG,KAAKquB,KAAK/oB,KAAKrF,IAAM8zG,GAAY/zG,KAAK+sB,MAAMznB,KAAK+T,IAAM06F,GAAY,EAC1EvB,EAAW,MACbhkD,QAAQC,KAAK,UAAUnpD,KAAK0I,sBAAsB+lG,mCAA0CvB,8BAC5FA,EAAW,OAGbA,EAAWltG,KAAK0uG,mBAChB1zB,EAAgBA,GAAiB,IAE/BA,IACFkyB,EAAWxyG,KAAKqZ,IAAIinE,EAAekyB,IAE9BA,EAETntG,mBACE,OAAOglB,OAAO8mB,kBAEhB9rC,aACE,MAAMiV,EAAOhV,KAAK1C,QACZw9E,EAAW9lE,EAAKoxD,MACtB,IAAI8mC,EAAWltG,KAAK2uG,eACpBzB,EAAWxyG,KAAKC,IAAI,EAAGuyG,GACvB,MAcM9mC,EAAQ2mC,GAdkB,CAC9BG,SAAAA,EACA33C,OAAQvgD,EAAKugD,OACbxhD,IAAKiB,EAAKjB,IACVpZ,IAAKqa,EAAKra,IACVotC,UAAW+yC,EAAS/yC,UACpBtwB,KAAMqjE,EAAS2zB,SACfr5C,MAAO0lB,EAAS1lB,MAChB+3C,UAAWntG,KAAK4uG,aAChBxnC,WAAYpnE,KAAKqc,eACjBugE,YAAa9B,EAAS8B,aAAe,EACrCwwB,eAA0C,IAA3BtyB,EAASsyB,eAERptG,KAAKy+E,QAAUz+E,MAajC,MAXoB,UAAhBgV,EAAKugD,QACP3oB,GAAmBw5B,EAAOpmE,KAAM,SAE9BgV,EAAK00B,SACP08B,EAAM18B,UACN1pC,KAAKmhB,MAAQnhB,KAAKrF,IAClBqF,KAAKuhB,IAAMvhB,KAAK+T,MAEhB/T,KAAKmhB,MAAQnhB,KAAK+T,IAClB/T,KAAKuhB,IAAMvhB,KAAKrF,KAEXyrE,EAETrmE,YACE,MAAMqmE,EAAQpmE,KAAKomE,MACnB,IAAIjlD,EAAQnhB,KAAK+T,IACbwN,EAAMvhB,KAAKrF,IAEf,GADAsO,MAAM+xD,YACFh7D,KAAK1C,QAAQwQ,QAAUs4D,EAAMxrE,OAAQ,CACvC,MAAMkT,GAAUyT,EAAMJ,GAASzmB,KAAKC,IAAIyrE,EAAMxrE,OAAS,EAAG,GAAK,EAC/DumB,GAASrT,EACTyT,GAAOzT,EAET9N,KAAK0sG,YAAcvrF,EACnBnhB,KAAKkuG,UAAY3sF,EACjBvhB,KAAK2sG,YAAcprF,EAAMJ,EAE3BphB,iBAAiBpC,GACf,OAAO+1D,GAAa/1D,EAAOqC,KAAK4gD,MAAMtjD,QAAQq2D,OAAQ3zD,KAAK1C,QAAQ8oE,MAAMjS,SAI7E,MAAM06C,WAAoBZ,GACxBluG,sBACE,MAAMgU,IAACA,EAAGpZ,IAAEA,GAAOqF,KAAKw/E,WAAU,GAClCx/E,KAAK+T,IAAMm1B,GAAen1B,GAAOA,EAAM,EACvC/T,KAAKrF,IAAMuuC,GAAevuC,GAAOA,EAAM,EACvCqF,KAAK8uG,yBAEP/uG,mBACE,MAAMqnE,EAAapnE,KAAKqc,eAClBzhB,EAASwsE,EAAapnE,KAAK2V,MAAQ3V,KAAK6V,OACxC+mE,EAAc9vC,GAAU9sC,KAAK1C,QAAQ8oE,MAAMwW,aAC3C99D,GAASsoD,EAAa1sE,KAAKi0C,IAAIiuC,GAAeliF,KAAKuZ,IAAI2oE,KAAiB,KACxEyG,EAAWrjF,KAAK0jF,wBAAwB,GAC9C,OAAOhpF,KAAKquB,KAAKnuB,EAASF,KAAKqZ,IAAI,GAAIsvE,EAASpiC,WAAaniC,IAE/D/e,iBAAiBpC,GACf,OAAiB,OAAVA,EAAiB4kE,IAAMviE,KAAKirE,oBAAoBttE,EAAQqC,KAAK0sG,aAAe1sG,KAAK2sG,aAE1F5sG,iBAAiB6jD,GACf,OAAO5jD,KAAK0sG,YAAc1sG,KAAK8sG,mBAAmBlpD,GAAS5jD,KAAK2sG,aAUpE,SAASoC,GAAQC,GAEf,OAAkB,IADHA,EAAWt0G,KAAK8sC,IAAI,GAAI9sC,KAAK+sB,MAAMykB,GAAM8iE,KAR1DH,GAAYnmG,GAAK,SACjBmmG,GAAY58E,SAAW,CACrBm0C,MAAO,CACLnjE,SAAU23E,GAAMV,WAAWS,UA8B/B,MAAMs0B,WAAyB7wB,GAC7Br+E,YAAYo5D,GACVlwD,MAAMkwD,GACNn5D,KAAKmhB,WAAQ5mB,EACbyF,KAAKuhB,SAAMhnB,EACXyF,KAAK0sG,iBAAcnyG,EACnByF,KAAK2sG,YAAc,EAErB5sG,MAAM+jE,EAAKz9D,GACT,MAAM1I,EAAQswG,GAAgBrkG,UAAUu4D,MAAM/1D,MAAMpM,KAAM,CAAC8jE,EAAKz9D,IAChE,GAAc,IAAV1I,EAIJ,OAAOurC,GAAevrC,IAAUA,EAAQ,EAAIA,EAAQ,KAHlDqC,KAAKkvG,OAAQ,EAKjBnvG,sBACE,MAAMgU,IAACA,EAAGpZ,IAAEA,GAAOqF,KAAKw/E,WAAU,GAClCx/E,KAAK+T,IAAMm1B,GAAen1B,GAAOrZ,KAAKC,IAAI,EAAGoZ,GAAO,KACpD/T,KAAKrF,IAAMuuC,GAAevuC,GAAOD,KAAKC,IAAI,EAAGA,GAAO,KAChDqF,KAAK1C,QAAQytE,cACf/qE,KAAKkvG,OAAQ,GAEflvG,KAAK8uG,yBAEP/uG,yBACE,MAAMijE,WAACA,EAAUC,WAAEA,GAAcjjE,KAAKkjE,gBACtC,IAAInvD,EAAM/T,KAAK+T,IACXpZ,EAAMqF,KAAKrF,IACf,MAAMwzG,EAAS3lF,GAAMzU,EAAMivD,EAAajvD,EAAMyU,EACxC4lF,EAAS5lF,GAAM7tB,EAAMsoE,EAAatoE,EAAM6tB,EACxC2e,EAAM,CAAC3e,EAAG/jB,IAAM/J,KAAK8sC,IAAI,GAAI9sC,KAAK+sB,MAAMykB,GAAM1jB,IAAM/jB,GACtDsP,IAAQpZ,IACNoZ,GAAO,GACTo6F,EAAO,GACPC,EAAO,MAEPD,EAAOhnE,EAAIpzB,GAAM,IACjBq6F,EAAOjnE,EAAIxsC,EAAK,MAGhBoZ,GAAO,GACTo6F,EAAOhnE,EAAIxsC,GAAM,IAEfA,GAAO,GACTyzG,EAAOjnE,EAAIpzB,EAAK,IAEd/T,KAAKkvG,OAASlvG,KAAK+T,MAAQ/T,KAAKi/E,eAAiBlrE,IAAQozB,EAAInnC,KAAK+T,IAAK,IACzEo6F,EAAOhnE,EAAIpzB,GAAM,IAEnB/T,KAAK+T,IAAMA,EACX/T,KAAKrF,IAAMA,EAEboF,aACE,MAAMiV,EAAOhV,KAAK1C,QAKZ8oE,EAjFV,SAAuB4mC,EAAmBC,GACxC,MAAMkC,EAASz0G,KAAK+sB,MAAMykB,GAAM+gE,EAAUtyG,MACpCy0G,EAAiB10G,KAAKquB,KAAKkkF,EAAUtyG,IAAMD,KAAK8sC,IAAI,GAAI2nE,IACxD/oC,EAAQ,GACd,IAAI4oC,EAAU7lE,GAAgB6jE,EAAkBj5F,IAAKrZ,KAAK8sC,IAAI,GAAI9sC,KAAK+sB,MAAMykB,GAAM+gE,EAAUl5F,QACzFozB,EAAMzsC,KAAK+sB,MAAMykB,GAAM8iE,IACvBK,EAAc30G,KAAK+sB,MAAMunF,EAAUt0G,KAAK8sC,IAAI,GAAIL,IAChDY,EAAYZ,EAAM,EAAIzsC,KAAK8sC,IAAI,GAAI9sC,KAAK6hB,IAAI4qB,IAAQ,EACxD,GACEi/B,EAAMjlE,KAAK,CAACxD,MAAOqxG,EAASxzB,MAAOuzB,GAAQC,OACzCK,EACkB,KAAhBA,IACFA,EAAc,IACZloE,EACFY,EAAYZ,GAAO,EAAI,EAAIY,GAE7BinE,EAAUt0G,KAAKqiC,MAAMsyE,EAAc30G,KAAK8sC,IAAI,GAAIL,GAAOY,GAAaA,QAC7DZ,EAAMgoE,GAAWhoE,IAAQgoE,GAAUE,EAAcD,GAC1D,MAAME,EAAWnmE,GAAgB6jE,EAAkBryG,IAAKq0G,GAExD,OADA5oC,EAAMjlE,KAAK,CAACxD,MAAO2xG,EAAU9zB,MAAOuzB,GAAQC,KACrC5oC,EA6DSmpC,CAJY,CACxBx7F,IAAK/T,KAAK++E,SACVpkF,IAAKqF,KAAK8+E,UAEmC9+E,MAY/C,MAXoB,UAAhBgV,EAAKugD,QACP3oB,GAAmBw5B,EAAOpmE,KAAM,SAE9BgV,EAAK00B,SACP08B,EAAM18B,UACN1pC,KAAKmhB,MAAQnhB,KAAKrF,IAClBqF,KAAKuhB,IAAMvhB,KAAK+T,MAEhB/T,KAAKmhB,MAAQnhB,KAAK+T,IAClB/T,KAAKuhB,IAAMvhB,KAAKrF,KAEXyrE,EAETrmE,iBAAiBpC,GACf,YAAiBpD,IAAVoD,EACH,IACA+1D,GAAa/1D,EAAOqC,KAAK4gD,MAAMtjD,QAAQq2D,OAAQ3zD,KAAK1C,QAAQ8oE,MAAMjS,QAExEp0D,YACE,MAAMohB,EAAQnhB,KAAK+T,IACnB9K,MAAM+xD,YACNh7D,KAAK0sG,YAAcxgE,GAAM/qB,GACzBnhB,KAAK2sG,YAAczgE,GAAMlsC,KAAKrF,KAAOuxC,GAAM/qB,GAE7CphB,iBAAiBpC,GAIf,YAHcpD,IAAVoD,GAAiC,IAAVA,IACzBA,EAAQqC,KAAK+T,KAED,OAAVpW,GAAkBqnB,MAAMrnB,GACnB4kE,IAEFviE,KAAKirE,mBAAmBttE,IAAUqC,KAAK+T,IAC1C,GACCm4B,GAAMvuC,GAASqC,KAAK0sG,aAAe1sG,KAAK2sG,aAE/C5sG,iBAAiB6jD,GACf,MAAMggC,EAAU5jF,KAAK8sG,mBAAmBlpD,GACxC,OAAOlpD,KAAK8sC,IAAI,GAAIxnC,KAAK0sG,YAAc9oB,EAAU5jF,KAAK2sG,cAa1D,SAAS6C,GAAsBx6F,GAC7B,MAAM8lE,EAAW9lE,EAAKoxD,MACtB,GAAI0U,EAASrhD,SAAWzkB,EAAKykB,QAAS,CACpC,MAAMw8C,EAAUltB,GAAU+xB,EAASyC,iBACnC,OAAOl0C,GAAeyxC,EAAS/5B,MAAQ+5B,EAAS/5B,KAAK97B,KAAMgN,GAAS8uB,KAAK97B,MAAQgxD,EAAQpgE,OAE3F,OAAO,EAST,SAAS45F,GAAgBhiE,EAAOvC,EAAKjmB,EAAMlR,EAAKpZ,GAC9C,OAAI8yC,IAAU15B,GAAO05B,IAAU9yC,EACtB,CACLwmB,MAAO+pB,EAAOjmB,EAAO,EACrB1D,IAAK2pB,EAAOjmB,EAAO,GAEZwoB,EAAQ15B,GAAO05B,EAAQ9yC,EACzB,CACLwmB,MAAO+pB,EAAMjmB,EACb1D,IAAK2pB,GAGF,CACL/pB,MAAO+pB,EACP3pB,IAAK2pB,EAAMjmB,GAGf,SAASyqF,GAAmBp3E,GAC1B,MAAMkvC,EAAO,CACXvhE,EAAGqyB,EAAM9pB,KAAO8pB,EAAMqrE,SAASn1F,KAC/B/K,EAAG60B,EAAMmtB,MAAQntB,EAAMqrE,SAASl+C,MAChCnlD,EAAGg4B,EAAM/pB,IAAM+pB,EAAMqrE,SAASp1F,IAC9BnV,EAAGk/B,EAAMotB,OAASptB,EAAMqrE,SAASj+C,QAE7BiqD,EAASh3G,OAAOP,OAAO,GAAIovE,GAC3Bqa,EAAa,GACb5L,EAAU,GACV25B,EAAat3E,EAAMu3E,aAAaj1G,OAChCk1G,EAAiBx3E,EAAMh7B,QAAQwzE,YAC/Bi/B,EAAkBD,EAAeE,kBAAoB97F,GAAK07F,EAAa,EAC7E,IAAK,IAAI/0G,EAAI,EAAGA,EAAI+0G,EAAY/0G,IAAK,CACnC,MAAMma,EAAO86F,EAAenjD,WAAWr0B,EAAM23E,qBAAqBp1G,IAClEo7E,EAAQp7E,GAAKma,EAAKihE,QAClB,MAAM/E,EAAgB54C,EAAM43E,iBAAiBr1G,EAAGy9B,EAAM63E,YAAcl6B,EAAQp7E,GAAIk1G,GAC1EK,EAASpnD,GAAOh0C,EAAK+rC,MACrB6iD,GA1CgB7pG,EA0CYu+B,EAAMv+B,IA1CbgnD,EA0CkBqvD,EAzC/CxqF,EAAQlc,GAD2Bkc,EA0CoB0S,EAAMu3E,aAAah1G,IAzCjD+qB,EAAQ,CAACA,GAC3B,CACL8sB,EAAGyQ,GAAappD,EAAKgnD,EAAKiC,OAAQp9B,GAClCxlB,EAAGwlB,EAAMhrB,OAASmmD,EAAKE,aAuCvB4gC,EAAWhnF,GAAK+oG,EAChB,MAAMphB,EAAez0C,GAAgBzV,EAAMi4C,cAAc11E,GAAKk1G,GACxDtiE,EAAQ/yC,KAAKqiC,MAAMiQ,GAAUw1C,IAGnC6tB,GAAaV,EAAQnoC,EAAMgb,EAFXitB,GAAgBhiE,EAAOyjC,EAAcrmD,EAAG+4E,EAASlxD,EAAG,EAAG,KACvD+8D,GAAgBhiE,EAAOyjC,EAAcpmD,EAAG84E,EAASxjG,EAAG,GAAI,MA/C5E,IAA0BrG,EAAKgnD,EAAMn7B,EAkDnC0S,EAAMg4E,eACJ9oC,EAAKvhE,EAAI0pG,EAAO1pG,EAChB0pG,EAAOlsG,EAAI+jE,EAAK/jE,EAChB+jE,EAAKlnE,EAAIqvG,EAAOrvG,EAChBqvG,EAAOv2G,EAAIouE,EAAKpuE,GAElBk/B,EAAMi4E,iBAsBR,SAA8Bj4E,EAAOupD,EAAY5L,GAC/C,MAAMjtE,EAAQ,GACR4mG,EAAat3E,EAAMu3E,aAAaj1G,OAChCoa,EAAOsjB,EAAMh7B,QACbkzG,EAAQhB,GAAsBx6F,GAAQ,EACtCy7F,EAAgBn4E,EAAM63E,YACtBJ,EAAkB/6F,EAAK87D,YAAYk/B,kBAAoB97F,GAAK07F,EAAa,EAC/E,IAAK,IAAI/0G,EAAI,EAAGA,EAAI+0G,EAAY/0G,IAAK,CACnC,MAAM61G,EAAqBp4E,EAAM43E,iBAAiBr1G,EAAG41G,EAAgBD,EAAQv6B,EAAQp7E,GAAIk1G,GACnFtiE,EAAQ/yC,KAAKqiC,MAAMiQ,GAAUe,GAAgB2iE,EAAmBjjE,MAAQ1B,MACxE9mB,EAAO48D,EAAWhnF,GAClBiwB,EAAI6lF,GAAUD,EAAmB5lF,EAAG7F,EAAK7kB,EAAGqtC,GAC5CsZ,EAAY6pD,GAAqBnjE,GACjCj/B,EAAOqiG,GAAiBH,EAAmB7lF,EAAG5F,EAAKytB,EAAGqU,GAC5D/9C,EAAM7H,KAAK,CACT0pB,EAAG6lF,EAAmB7lF,EACtBC,EAAAA,EACAi8B,UAAAA,EACAv4C,KAAAA,EACAD,IAAKuc,EACL26B,MAAOj3C,EAAOyW,EAAKytB,EACnBgT,OAAQ56B,EAAI7F,EAAK7kB,IAGrB,OAAO4I,EA9CkB8nG,CAAqBx4E,EAAOupD,EAAY5L,GAEnE,SAASo6B,GAAaV,EAAQnoC,EAAM/5B,EAAOsjE,EAASC,GAClD,MAAMriE,EAAMj0C,KAAK6hB,IAAI7hB,KAAKi0C,IAAIlB,IACxBx5B,EAAMvZ,KAAK6hB,IAAI7hB,KAAKuZ,IAAIw5B,IAC9B,IAAI5iB,EAAI,EACJC,EAAI,EACJimF,EAAQ5vF,MAAQqmD,EAAKvhE,GACvB4kB,GAAK28C,EAAKvhE,EAAI8qG,EAAQ5vF,OAASwtB,EAC/BghE,EAAO1pG,EAAIvL,KAAKqZ,IAAI47F,EAAO1pG,EAAGuhE,EAAKvhE,EAAI4kB,IAC9BkmF,EAAQxvF,IAAMimD,EAAK/jE,IAC5BonB,GAAKkmF,EAAQxvF,IAAMimD,EAAK/jE,GAAKkrC,EAC7BghE,EAAOlsG,EAAI/I,KAAKC,IAAIg1G,EAAOlsG,EAAG+jE,EAAK/jE,EAAIonB,IAErCmmF,EAAQ7vF,MAAQqmD,EAAKlnE,GACvBwqB,GAAK08C,EAAKlnE,EAAI0wG,EAAQ7vF,OAASlN,EAC/B07F,EAAOrvG,EAAI5F,KAAKqZ,IAAI47F,EAAOrvG,EAAGknE,EAAKlnE,EAAIwqB,IAC9BkmF,EAAQzvF,IAAMimD,EAAKpuE,IAC5B0xB,GAAKkmF,EAAQzvF,IAAMimD,EAAKpuE,GAAK6a,EAC7B07F,EAAOv2G,EAAIsB,KAAKC,IAAIg1G,EAAOv2G,EAAGouE,EAAKpuE,EAAI0xB,IA6B3C,SAAS8lF,GAAqBnjE,GAC5B,OAAc,IAAVA,GAAyB,MAAVA,EACV,SACEA,EAAQ,IACV,OAEF,QAET,SAASojE,GAAiBhmF,EAAG6nB,EAAG5J,GAM9B,MALc,UAAVA,EACFje,GAAK6nB,EACc,WAAV5J,IACTje,GAAM6nB,EAAI,GAEL7nB,EAET,SAAS8lF,GAAU7lF,EAAG1qB,EAAGqtC,GAMvB,OALc,KAAVA,GAA0B,MAAVA,EAClB3iB,GAAM1qB,EAAI,GACDqtC,EAAQ,KAAOA,EAAQ,MAChC3iB,GAAK1qB,GAEA0qB,EA4BT,SAASmmF,GAAe34E,EAAOosB,EAAQmsB,EAAUo7B,GAC/C,MAAMlyG,IAACA,GAAOu+B,EACd,GAAIu4C,EACF92E,EAAI+qD,IAAIxsB,EAAM83C,QAAS93C,EAAM+3C,QAAS3rB,EAAQ,EAAGhZ,QAC5C,CACL,IAAIwlC,EAAgB54C,EAAM43E,iBAAiB,EAAGxrD,GAC9C3qD,EAAIirD,OAAOksB,EAAcrmD,EAAGqmD,EAAcpmD,GAC1C,IAAK,IAAIjwB,EAAI,EAAGA,EAAIoxG,EAAYpxG,IAC9Bq2E,EAAgB54C,EAAM43E,iBAAiBr1G,EAAG6pD,GAC1C3qD,EAAIkrD,OAAOisB,EAAcrmD,EAAGqmD,EAAcpmD,IArLhDmkF,GAAiBvmG,GAAK,cACtBumG,GAAiBh9E,SAAW,CAC1Bm0C,MAAO,CACLnjE,SAAU23E,GAAMV,WAAWg3B,YAC3B11B,MAAO,CACLxjE,SAAS,KA6Mf,MAAMm5F,WAA0BlD,GAC9BluG,YAAYo5D,GACVlwD,MAAMkwD,GACNn5D,KAAKowE,aAAU71E,EACfyF,KAAKqwE,aAAU91E,EACfyF,KAAKmwG,iBAAc51G,EACnByF,KAAK6vG,aAAe,GACpB7vG,KAAKuwG,iBAAmB,GAE1BxwG,gBACE,MAAMk2E,EAAUj2E,KAAK2jG,SAAW56C,GAAUymD,GAAsBxvG,KAAK1C,SAAW,GAC1Eo1C,EAAI1yC,KAAK2V,MAAQ3V,KAAKqnD,SAAW4uB,EAAQtgE,MACzCvV,EAAIJ,KAAK6V,OAAS7V,KAAKkyD,UAAY+jB,EAAQpgE,OACjD7V,KAAKowE,QAAU11E,KAAK+sB,MAAMznB,KAAKwO,KAAOkkC,EAAI,EAAIujC,EAAQznE,MACtDxO,KAAKqwE,QAAU31E,KAAK+sB,MAAMznB,KAAKuO,IAAMnO,EAAI,EAAI61E,EAAQ1nE,KACrDvO,KAAKmwG,YAAcz1G,KAAK+sB,MAAM/sB,KAAKqZ,IAAI2+B,EAAGtyC,GAAK,GAEjDL,sBACE,MAAMgU,IAACA,EAAGpZ,IAAEA,GAAOqF,KAAKw/E,WAAU,GAClCx/E,KAAK+T,IAAMm1B,GAAen1B,KAASiR,MAAMjR,GAAOA,EAAM,EACtD/T,KAAKrF,IAAMuuC,GAAevuC,KAASqqB,MAAMrqB,GAAOA,EAAM,EACtDqF,KAAK8uG,yBAEP/uG,mBACE,OAAOrF,KAAKquB,KAAK/oB,KAAKmwG,YAAcX,GAAsBxvG,KAAK1C,UAEjEyC,mBAAmBqmE,GACjB6nC,GAAgBrkG,UAAUo5E,mBAAmBhhF,KAAKhC,KAAMomE,GACxDpmE,KAAK6vG,aAAe7vG,KAAKiiE,YACtBt9D,IAAI,CAAChH,EAAO0I,KACX,MAAMuf,EAAQ3iB,GAASjD,KAAK1C,QAAQwzE,YAAY7tE,SAAU,CAACtF,EAAO0I,GAAQrG,MAC1E,OAAO4lB,GAAmB,IAAVA,EAAcA,EAAQ,KAEvChhB,OAAO,CAAC4jB,EAAG3tB,IAAMmF,KAAK4gD,MAAMkpB,kBAAkBjvE,IAEnDkF,MACE,MAAMiV,EAAOhV,KAAK1C,QACd0X,EAAKykB,SAAWzkB,EAAK87D,YAAYr3C,QACnCi2E,GAAmB1vG,MAEnBA,KAAKswG,eAAe,EAAG,EAAG,EAAG,GAGjCvwG,eAAeqxG,EAAcC,EAAeC,EAAaC,GACvDvxG,KAAKowE,SAAW11E,KAAK+sB,OAAO2pF,EAAeC,GAAiB,GAC5DrxG,KAAKqwE,SAAW31E,KAAK+sB,OAAO6pF,EAAcC,GAAkB,GAC5DvxG,KAAKmwG,aAAez1G,KAAKqZ,IAAI/T,KAAKmwG,YAAc,EAAGz1G,KAAKC,IAAIy2G,EAAcC,EAAeC,EAAaC,IAExGxxG,cAAcsG,GAGZ,OAAO0nC,GAAgB1nC,GAFCqlC,IAAO1rC,KAAK6vG,aAAaj1G,QAAU,IAEVkyC,GAD9B9sC,KAAK1C,QAAQivE,YAAc,IAGhDxsE,8BAA8BpC,GAC5B,GAAIsrC,GAActrC,GAChB,OAAO4kE,IAET,MAAMivC,EAAgBxxG,KAAKmwG,aAAenwG,KAAKrF,IAAMqF,KAAK+T,KAC1D,OAAI/T,KAAK1C,QAAQosC,SACP1pC,KAAKrF,IAAMgD,GAAS6zG,GAEtB7zG,EAAQqC,KAAK+T,KAAOy9F,EAE9BzxG,8BAA8B2tC,GAC5B,GAAIzE,GAAcyE,GAChB,OAAO60B,IAET,MAAMkvC,EAAiB/jE,GAAY1tC,KAAKmwG,aAAenwG,KAAKrF,IAAMqF,KAAK+T,MACvE,OAAO/T,KAAK1C,QAAQosC,QAAU1pC,KAAKrF,IAAM82G,EAAiBzxG,KAAK+T,IAAM09F,EAEvE1xG,qBAAqBsG,GACnB,MAAMyqE,EAAc9wE,KAAK6vG,cAAgB,GACzC,GAAIxpG,GAAS,GAAKA,EAAQyqE,EAAYl2E,OAAQ,CAC5C,MAAM82G,EAAa5gC,EAAYzqE,GAC/B,OAjFN,SAAiC6J,EAAQ7J,EAAOuf,GAC9C,OAAO4jC,GAAct5C,EAAQ,CAC3B0V,MAAAA,EACAvf,MAAAA,EACA5E,KAAM,eA6EGkwG,CAAwB3xG,KAAKikD,aAAc59C,EAAOqrG,IAG7D3xG,iBAAiBsG,EAAOurG,EAAoB7B,EAAkB,GAC5D,MAAMtiE,EAAQztC,KAAKuwE,cAAclqE,GAAS0lC,GAAUgkE,EACpD,MAAO,CACLllF,EAAGnwB,KAAKuZ,IAAIw5B,GAASmkE,EAAqB5xG,KAAKowE,QAC/CtlD,EAAGpwB,KAAKi0C,IAAIlB,GAASmkE,EAAqB5xG,KAAKqwE,QAC/C5iC,MAAAA,GAGJ1tC,yBAAyBsG,EAAO1I,GAC9B,OAAOqC,KAAKkwG,iBAAiB7pG,EAAOrG,KAAK2wE,8BAA8BhzE,IAEzEoC,gBAAgBsG,GACd,OAAOrG,KAAKmxE,yBAAyB9qE,GAAS,EAAGrG,KAAK6jF,gBAExD9jF,sBAAsBsG,GACpB,MAAMmI,KAACA,EAAID,IAAEA,EAAGk3C,MAAEA,EAAKC,OAAEA,GAAU1lD,KAAKuwG,iBAAiBlqG,GACzD,MAAO,CACLmI,KAAAA,EACAD,IAAAA,EACAk3C,MAAAA,EACAC,OAAAA,GAGJ3lD,iBACE,MAAMygD,gBAACA,EAAiB7+B,MAAMkvD,SAACA,IAAa7wE,KAAK1C,QACjD,GAAIkjD,EAAiB,CACnB,MAAMzmD,EAAMiG,KAAKjG,IACjBA,EAAIupD,OACJvpD,EAAI8qD,YACJosD,GAAejxG,KAAMA,KAAK2wE,8BAA8B3wE,KAAKkuG,WAAYr9B,EAAU7wE,KAAK6vG,aAAaj1G,QACrGb,EAAIgrD,YACJhrD,EAAI+sD,UAAYtG,EAChBzmD,EAAI6L,OACJ7L,EAAI0pD,WAGR1jD,WACE,MAAMhG,EAAMiG,KAAKjG,IACXib,EAAOhV,KAAK1C,SACZszE,WAACA,EAAUjvD,KAAEA,GAAQ3M,EACrBi3F,EAAajsG,KAAK6vG,aAAaj1G,OACrC,IAAIC,EAAGiT,EAAQwpB,EAaf,GAZItiB,EAAK87D,YAAYr3C,SAvLzB,SAAyBnB,EAAO2zE,GAC9B,MAAMlyG,IAACA,EAAKuD,SAASwzE,YAACA,IAAgBx4C,EACtC,IAAK,IAAIz9B,EAAIoxG,EAAa,EAAGpxG,GAAK,EAAGA,IAAK,CACxC,MAAMuqF,EAActU,EAAYnkB,WAAWr0B,EAAM23E,qBAAqBp1G,IAChEu1G,EAASpnD,GAAOo8B,EAAYrkC,OAC5Bl2B,EAACA,EAACC,EAAEA,EAACi8B,UAAEA,EAASv4C,KAAEA,EAAID,IAAEA,EAAGk3C,MAAEA,EAAKC,OAAEA,GAAUptB,EAAMi4E,iBAAiB11G,IACrEyiF,cAACA,GAAiB8H,EACxB,IAAKn8C,GAAcq0C,GAAgB,CACjC,MAAMrH,EAAUltB,GAAUq8B,EAAY7H,iBACtCxjF,EAAI+sD,UAAYw2B,EAChBvjF,EAAIksF,SAASz3E,EAAOynE,EAAQznE,KAAMD,EAAM0nE,EAAQ1nE,IAAKk3C,EAAQj3C,EAAOynE,EAAQtgE,MAAO+vC,EAASn3C,EAAM0nE,EAAQpgE,QAE5G2wC,GACEzsD,EACAu+B,EAAMu3E,aAAah1G,GACnBgwB,EACAC,EAAKslF,EAAOnvD,WAAa,EACzBmvD,EACA,CACEjxD,MAAOimC,EAAYjmC,MACnB4H,UAAWA,EACXC,aAAc,YAmKhB6qD,CAAgB7xG,KAAMisG,GAEpBtqF,EAAK8X,SACPz5B,KAAKomE,MAAMrtE,QAAQ,CAACq/D,EAAM/xD,KACxB,GAAc,IAAVA,EAAa,CACfyH,EAAS9N,KAAK2wE,8BAA8BvY,EAAKz6D,QAtJ3D,SAAwB26B,EAAOw5E,EAAcptD,EAAQunD,GACnD,MAAMlyG,EAAMu+B,EAAMv+B,IACZ82E,EAAWihC,EAAajhC,UACxB1xB,MAACA,EAAKgI,UAAEA,GAAa2qD,GACrBjhC,IAAao7B,IAAgB9sD,IAAUgI,GAAazC,EAAS,IAGnE3qD,EAAIupD,OACJvpD,EAAImtD,YAAc/H,EAClBplD,EAAIotD,UAAYA,EAChBptD,EAAIssF,YAAYyrB,EAAa56C,YAC7Bn9D,EAAIusF,eAAiBwrB,EAAa36C,iBAClCp9D,EAAI8qD,YACJosD,GAAe34E,EAAOosB,EAAQmsB,EAAUo7B,GACxClyG,EAAIgrD,YACJhrD,EAAIsrD,SACJtrD,EAAI0pD,WAwIIsuD,CAAe/xG,KADK2hB,EAAKgrC,WAAW3sD,KAAKikD,WAAW59C,EAAQ,IAC1ByH,EAAQm+F,MAI5Cr7B,EAAWn3C,QAAS,CAEtB,IADA1/B,EAAIupD,OACCzoD,EAAIoxG,EAAa,EAAGpxG,GAAK,EAAGA,IAAK,CACpC,MAAMuqF,EAAcxU,EAAWjkB,WAAW3sD,KAAKiwG,qBAAqBp1G,KAC9DskD,MAACA,EAAKgI,UAAEA,GAAai+B,EACtBj+B,GAAchI,IAGnBplD,EAAIotD,UAAYA,EAChBptD,EAAImtD,YAAc/H,EAClBplD,EAAIssF,YAAYjB,EAAYluB,YAC5Bn9D,EAAIusF,eAAiBlB,EAAYjuB,iBACjCrpD,EAAS9N,KAAK2wE,8BAA8B37D,EAAKoxD,MAAM18B,QAAU1pC,KAAK+T,IAAM/T,KAAKrF,KACjF28B,EAAWt3B,KAAKkwG,iBAAiBr1G,EAAGiT,GACpC/T,EAAI8qD,YACJ9qD,EAAIirD,OAAOhlD,KAAKowE,QAASpwE,KAAKqwE,SAC9Bt2E,EAAIkrD,OAAO3tB,EAASzM,EAAGyM,EAASxM,GAChC/wB,EAAIsrD,UAENtrD,EAAI0pD,WAGR1jD,cACAA,aACE,MAAMhG,EAAMiG,KAAKjG,IACXib,EAAOhV,KAAK1C,QACZw9E,EAAW9lE,EAAKoxD,MACtB,IAAK0U,EAASrhD,QACZ,OAEF,MAAM8yC,EAAavsE,KAAKuwE,cAAc,GACtC,IAAIziE,EAAQ6H,EACZ5b,EAAIupD,OACJvpD,EAAIiZ,UAAUhT,KAAKowE,QAASpwE,KAAKqwE,SACjCt2E,EAAI4lD,OAAO4sB,GACXxyE,EAAIgtD,UAAY,SAChBhtD,EAAIitD,aAAe,SACnBhnD,KAAKomE,MAAMrtE,QAAQ,CAACq/D,EAAM/xD,KACxB,GAAc,IAAVA,IAAgB2O,EAAK00B,QACvB,OAEF,MAAM07C,EAActK,EAASnuB,WAAW3sD,KAAKikD,WAAW59C,IAClDg9E,EAAWr6B,GAAOo8B,EAAYrkC,MAEpC,GADAjzC,EAAS9N,KAAK2wE,8BAA8B3wE,KAAKomE,MAAM//D,GAAO1I,OAC1DynF,EAAY/H,kBAAmB,CACjCtjF,EAAIgnD,KAAOsiC,EAASrgC,OACpBrtC,EAAQ5b,EAAImpD,YAAYkV,EAAKxyC,OAAOjQ,MACpC5b,EAAI+sD,UAAYs+B,EAAY9H,cAC5B,MAAMrH,EAAUltB,GAAUq8B,EAAY7H,iBACtCxjF,EAAIksF,UACDtwE,EAAQ,EAAIsgE,EAAQznE,MACpBV,EAASu1E,EAASp+D,KAAO,EAAIgxD,EAAQ1nE,IACtCoH,EAAQsgE,EAAQtgE,MAChB0tE,EAASp+D,KAAOgxD,EAAQpgE,QAG5B2wC,GAAWzsD,EAAKq+D,EAAKxyC,MAAO,GAAI9X,EAAQu1E,EAAU,CAChDlkC,MAAOimC,EAAYjmC,UAGvBplD,EAAI0pD,UAEN1jD,cAEFoxG,GAAkBzoG,GAAK,eACvByoG,GAAkBl/E,SAAW,CAC3BwH,SAAS,EACT7lB,SAAS,EACT0jB,SAAU,YACVs5C,WAAY,CACVn3C,SAAS,EACT0tB,UAAW,EACX+P,WAAY,GACZC,iBAAkB,GAEpBx1C,KAAM,CACJkvD,UAAU,GAEZtE,WAAY,EACZnG,MAAO,CACLiX,mBAAmB,EACnBp6E,SAAU23E,GAAMV,WAAWS,SAE7B7J,YAAa,CACXwM,mBAAe/iF,EACfgjF,gBAAiB,EACjB9jD,SAAS,EACTsnB,KAAM,CACJ97B,KAAM,IAERhiB,SAAS2iB,GACAA,EAETqwD,QAAS,EACT+5B,mBAAmB,IAGvBmB,GAAkBl3B,cAAgB,CAChC+3B,mBAAoB,cACpBC,oBAAqB,QACrBC,cAAe,SAEjBf,GAAkBlzG,YAAc,CAC9B2yE,WAAY,CACVhuB,UAAW,SAIf,MAAMuvD,GAAY,CAChBC,YAAa,CAACC,QAAQ,EAAMptF,KAAM,EAAGqtF,MAAO,KAC5CC,OAAQ,CAACF,QAAQ,EAAMptF,KAAM,IAAMqtF,MAAO,IAC1CE,OAAQ,CAACH,QAAQ,EAAMptF,KAAM,IAAOqtF,MAAO,IAC3CG,KAAM,CAACJ,QAAQ,EAAMptF,KAAM,KAASqtF,MAAO,IAC3CI,IAAK,CAACL,QAAQ,EAAMptF,KAAM,MAAUqtF,MAAO,IAC3CK,KAAM,CAACN,QAAQ,EAAOptF,KAAM,OAAWqtF,MAAO,GAC9CM,MAAO,CAACP,QAAQ,EAAMptF,KAAM,OAASqtF,MAAO,IAC5CO,QAAS,CAACR,QAAQ,EAAOptF,KAAM,OAASqtF,MAAO,GAC/CQ,KAAM,CAACT,QAAQ,EAAMptF,KAAM,SAEvB8tF,GAASp6G,OAAO+C,KAAKy2G,IAC3B,SAASa,GAAO75G,EAAGC,GACjB,OAAOD,EAAIC,EAEb,SAAS+oE,GAAM7pC,EAAO15B,GACpB,GAAIqqC,GAAcrqC,GAChB,OAAO,KAET,MAAMq0G,EAAU36E,EAAM46E,UAChBC,OAACA,EAAMp2E,MAAEA,EAAKq2E,WAAEA,GAAc96E,EAAM+6E,WAC1C,IAAI11G,EAAQiB,EASZ,MARsB,mBAAXu0G,IACTx1G,EAAQw1G,EAAOx1G,IAEZurC,GAAevrC,KAClBA,EAA0B,iBAAXw1G,EACXF,EAAQ9wC,MAAMxkE,EAAOw1G,GACrBF,EAAQ9wC,MAAMxkE,IAEN,OAAVA,EACK,MAELo/B,IACFp/B,EAAkB,SAAVo/B,IAAqB2P,GAAS0mE,KAA8B,IAAfA,EAEjDH,EAAQK,QAAQ31G,EAAOo/B,GADvBk2E,EAAQK,QAAQ31G,EAAO,UAAWy1G,KAGhCz1G,GAEV,SAAS41G,GAA0BC,EAASz/F,EAAKpZ,EAAK84G,GACpD,MAAM3pE,EAAOipE,GAAMn4G,OACnB,IAAK,IAAIC,EAAIk4G,GAAMxzG,QAAQi0G,GAAU34G,EAAIivC,EAAO,IAAKjvC,EAAG,CACtD,MAAM64G,EAAWvB,GAAUY,GAAMl4G,IAC3Bk+D,EAAS26C,EAASpB,MAAQoB,EAASpB,MAAQvtF,OAAOwpF,iBACxD,GAAImF,EAASrB,QAAU33G,KAAKquB,MAAMpuB,EAAMoZ,IAAQglD,EAAS26C,EAASzuF,QAAUwuF,EAC1E,OAAOV,GAAMl4G,GAGjB,OAAOk4G,GAAMjpE,EAAO,GAkBtB,SAAS6pE,GAAQvtC,EAAOnzD,EAAM2gG,GAC5B,GAAKA,GAEE,GAAIA,EAAWh5G,OAAQ,CAC5B,MAAMmvD,GAACA,EAAED,GAAEA,GAAMJ,GAAQkqD,EAAY3gG,GAErCmzD,EADkBwtC,EAAW7pD,IAAO92C,EAAO2gG,EAAW7pD,GAAM6pD,EAAW9pD,KACpD,QAJnBsc,EAAMnzD,IAAQ,EAoBlB,SAAS4gG,GAAoBv7E,EAAO+nB,EAAQyzD,GAC1C,MAAM1tC,EAAQ,GACRzhE,EAAM,GACNmlC,EAAOuW,EAAOzlD,OACpB,IAAIC,EAAG8C,EACP,IAAK9C,EAAI,EAAGA,EAAIivC,IAAQjvC,EACtB8C,EAAQ0iD,EAAOxlD,GACf8J,EAAIhH,GAAS9C,EACburE,EAAMjlE,KAAK,CACTxD,MAAAA,EACA69E,OAAO,IAGX,OAAiB,IAAT1xC,GAAegqE,EA1BzB,SAAuBx7E,EAAO8tC,EAAOzhE,EAAKmvG,GACxC,MAAMb,EAAU36E,EAAM46E,SAChBv3B,GAASs3B,EAAQK,QAAQltC,EAAM,GAAGzoE,MAAOm2G,GACzC/qC,EAAO3C,EAAMA,EAAMxrE,OAAS,GAAG+C,MACrC,IAAI69E,EAAOn1E,EACX,IAAKm1E,EAAQG,EAAOH,GAASzS,EAAMyS,GAASy3B,EAAQ/vG,IAAIs4E,EAAO,EAAGs4B,GAChEztG,EAAQ1B,EAAI62E,GACRn1E,GAAS,IACX+/D,EAAM//D,GAAOm1E,OAAQ,GAGzB,OAAOpV,EAeqC2tC,CAAcz7E,EAAO8tC,EAAOzhE,EAAKmvG,GAAzC1tC,EAEtC,MAAM4tC,WAAkB51B,GACtBr+E,YAAYxE,GACV0N,MAAM1N,GACNyE,KAAK0lE,OAAS,CACZ3oE,KAAM,GACNilE,OAAQ,GACRtG,IAAK,IAEP17D,KAAKi0G,MAAQ,MACbj0G,KAAKk0G,gBAAa35G,EAClByF,KAAKm0G,SAAW,GAChBn0G,KAAKo0G,aAAc,EACnBp0G,KAAKqzG,gBAAa94G,EAEpBwF,KAAKivF,EAAWh6E,GACd,MAAM/B,EAAO+7E,EAAU/7E,OAAS+7E,EAAU/7E,KAAO,IAC3CggG,EAAUjzG,KAAKkzG,SAAW,IAAIrhC,GAASC,MAAMkd,EAAUnd,SAASla,MACtE/sB,GAAQ33B,EAAKohG,eAAgBpB,EAAQqB,WACrCt0G,KAAKqzG,WAAa,CAChBF,OAAQlgG,EAAKkgG,OACbp2E,MAAO9pB,EAAK8pB,MACZq2E,WAAYngG,EAAKmgG,YAEnBnqG,MAAMnE,KAAKkqF,GACXhvF,KAAKo0G,YAAcp/F,EAAKu/F,WAE1Bx0G,MAAM+jE,EAAKz9D,GACT,YAAY9L,IAARupE,EACK,KAEF3B,GAAMniE,KAAM8jE,GAErB/jE,eACEkJ,MAAM+tE,eACNh3E,KAAK0lE,OAAS,CACZ3oE,KAAM,GACNilE,OAAQ,GACRtG,IAAK,IAGT37D,sBACE,MAAMzC,EAAU0C,KAAK1C,QACf21G,EAAUjzG,KAAKkzG,SACfxhC,EAAOp0E,EAAQ2V,KAAKy+D,MAAQ,MAClC,IAAI39D,IAACA,EAAGpZ,IAAEA,EAAGqoE,WAAEA,EAAUC,WAAEA,GAAcjjE,KAAKkjE,gBAC9C,SAASsxC,EAAaj/C,GACfyN,GAAeh+C,MAAMuwC,EAAOxhD,OAC/BA,EAAMrZ,KAAKqZ,IAAIA,EAAKwhD,EAAOxhD,MAExBkvD,GAAej+C,MAAMuwC,EAAO56D,OAC/BA,EAAMD,KAAKC,IAAIA,EAAK46D,EAAO56D,MAG1BqoE,GAAeC,IAClBuxC,EAAax0G,KAAKy0G,mBACK,UAAnBn3G,EAAQi4D,QAA+C,WAAzBj4D,EAAQ8oE,MAAMj8B,QAC9CqqE,EAAax0G,KAAKw/E,WAAU,KAGhCzrE,EAAMm1B,GAAen1B,KAASiR,MAAMjR,GAAOA,GAAOk/F,EAAQK,QAAQ5iG,KAAKD,MAAOihE,GAC9E/2E,EAAMuuC,GAAevuC,KAASqqB,MAAMrqB,GAAOA,GAAOs4G,EAAQyB,MAAMhkG,KAAKD,MAAOihE,GAAQ,EACpF1xE,KAAK+T,IAAMrZ,KAAKqZ,IAAIA,EAAKpZ,EAAM,GAC/BqF,KAAKrF,IAAMD,KAAKC,IAAIoZ,EAAM,EAAGpZ,GAE/BoF,kBACE,MAAMwJ,EAAMvJ,KAAK20G,qBACjB,IAAI5gG,EAAMgR,OAAO8mB,kBACblxC,EAAMoqB,OAAO89C,kBAKjB,OAJIt5D,EAAI3O,SACNmZ,EAAMxK,EAAI,GACV5O,EAAM4O,EAAIA,EAAI3O,OAAS,IAElB,CAACmZ,IAAAA,EAAKpZ,IAAAA,GAEfoF,aACE,MAAMzC,EAAU0C,KAAK1C,QACfs3G,EAAWt3G,EAAQ2V,KACnB6nE,EAAWx9E,EAAQ8oE,MACnBwtC,EAAiC,WAApB94B,EAAS3wC,OAAsBnqC,KAAK20G,qBAAuB30G,KAAK60G,YAC5D,UAAnBv3G,EAAQi4D,QAAsBq+C,EAAWh5G,SAC3CoF,KAAK+T,IAAM/T,KAAK++E,UAAY60B,EAAW,GACvC5zG,KAAKrF,IAAMqF,KAAK8+E,UAAY80B,EAAWA,EAAWh5G,OAAS,IAE7D,MAAMmZ,EAAM/T,KAAK+T,IAEXqyD,EDxnRV,SAAwB/lB,EAAQtsC,EAAKpZ,GACnC,IAAIwmB,EAAQ,EACRI,EAAM8+B,EAAOzlD,OACjB,KAAOumB,EAAQI,GAAO8+B,EAAOl/B,GAASpN,GACpCoN,IAEF,KAAOI,EAAMJ,GAASk/B,EAAO9+B,EAAM,GAAK5mB,GACtC4mB,IAEF,OAAOJ,EAAQ,GAAKI,EAAM8+B,EAAOzlD,OAC7BylD,EAAOlmD,MAAMgnB,EAAOI,GACpB8+B,EC6mRYy0D,CAAelB,EAAY7/F,EAD7B/T,KAAKrF,KAWjB,OATAqF,KAAKi0G,MAAQW,EAASljC,OAASoJ,EAASD,SACpC04B,GAA0BqB,EAASpB,QAASxzG,KAAK+T,IAAK/T,KAAKrF,IAAKqF,KAAK+0G,kBAAkBhhG,IA5I/F,SAAoCukB,EAAOopD,EAAU8xB,EAASz/F,EAAKpZ,GACjE,IAAK,IAAIE,EAAIk4G,GAAMn4G,OAAS,EAAGC,GAAKk4G,GAAMxzG,QAAQi0G,GAAU34G,IAAK,CAC/D,MAAM62E,EAAOqhC,GAAMl4G,GACnB,GAAIs3G,GAAUzgC,GAAM2gC,QAAU/5E,EAAM46E,SAAS/1F,KAAKxiB,EAAKoZ,EAAK29D,IAASgQ,EAAW,EAC9E,OAAOhQ,EAGX,OAAOqhC,GAAMS,EAAUT,GAAMxzG,QAAQi0G,GAAW,GAsI1CwB,CAA2Bh1G,KAAMomE,EAAMxrE,OAAQg6G,EAASpB,QAASxzG,KAAK+T,IAAK/T,KAAKrF,MACpFqF,KAAKk0G,WAAcp5B,EAASU,MAAMxjE,SAA0B,SAAfhY,KAAKi0G,MArItD,SAA4BviC,GAC1B,IAAK,IAAI72E,EAAIk4G,GAAMxzG,QAAQmyE,GAAQ,EAAG5nC,EAAOipE,GAAMn4G,OAAQC,EAAIivC,IAAQjvC,EACrE,GAAIs3G,GAAUY,GAAMl4G,IAAIw3G,OACtB,OAAOU,GAAMl4G,GAmIXo6G,CAAmBj1G,KAAKi0G,YADyC15G,EAErEyF,KAAKk1G,YAAYtB,GACbt2G,EAAQosC,SACV08B,EAAM18B,UAEDmqE,GAAoB7zG,KAAMomE,EAAOpmE,KAAKk0G,YAE/Cn0G,YAAY6zG,GACV,IAEIj4B,EAAO5S,EAFP5nD,EAAQ,EACRI,EAAM,EAENvhB,KAAK1C,QAAQwQ,QAAU8lG,EAAWh5G,SACpC+gF,EAAQ37E,KAAKm1G,mBAAmBvB,EAAW,IAEzCzyF,EADwB,IAAtByyF,EAAWh5G,OACL,EAAI+gF,GAEH37E,KAAKm1G,mBAAmBvB,EAAW,IAAMj4B,GAAS,EAE7D5S,EAAO/oE,KAAKm1G,mBAAmBvB,EAAWA,EAAWh5G,OAAS,IAE5D2mB,EADwB,IAAtBqyF,EAAWh5G,OACPmuE,GAECA,EAAO/oE,KAAKm1G,mBAAmBvB,EAAWA,EAAWh5G,OAAS,KAAO,GAGhF,MAAMuqF,EAAQyuB,EAAWh5G,OAAS,EAAI,GAAM,IAC5CumB,EAAQotB,GAAYptB,EAAO,EAAGgkE,GAC9B5jE,EAAMgtB,GAAYhtB,EAAK,EAAG4jE,GAC1BnlF,KAAKm0G,SAAW,CAAChzF,MAAAA,EAAOI,IAAAA,EAAKw3C,OAAQ,GAAK53C,EAAQ,EAAII,IAExDxhB,YACE,MAAMkzG,EAAUjzG,KAAKkzG,SACfn/F,EAAM/T,KAAK+T,IACXpZ,EAAMqF,KAAKrF,IACX2C,EAAU0C,KAAK1C,QACfs3G,EAAWt3G,EAAQ2V,KACnBkqE,EAAQy3B,EAASljC,MAAQ6hC,GAA0BqB,EAASpB,QAASz/F,EAAKpZ,EAAKqF,KAAK+0G,kBAAkBhhG,IACtG06F,EAAWplE,GAAeurE,EAASnG,SAAU,GAC7C98B,EAAoB,SAAVwL,GAAmBy3B,EAASxB,WACtCgC,EAAa1oE,GAASilC,KAAwB,IAAZA,EAClCvL,EAAQ,GACd,IACInzD,EAAMmiD,EADNumB,EAAQ5nE,EAMZ,GAJIqhG,IACFz5B,GAASs3B,EAAQK,QAAQ33B,EAAO,UAAWhK,IAE7CgK,GAASs3B,EAAQK,QAAQ33B,EAAOy5B,EAAa,MAAQj4B,GACjD81B,EAAQ91F,KAAKxiB,EAAKoZ,EAAKopE,GAAS,IAASsxB,EAC3C,MAAM,IAAI1tG,MAAMgT,EAAM,QAAUpZ,EAAM,uCAAyC8zG,EAAW,IAAMtxB,GAElG,MAAMy2B,EAAsC,SAAzBt2G,EAAQ8oE,MAAMj8B,QAAqBnqC,KAAKq1G,oBAC3D,IAAKpiG,EAAO0oE,EAAOvmB,EAAQ,EAAGniD,EAAOtY,EAAKsY,GAAQggG,EAAQ/vG,IAAI+P,EAAMw7F,EAAUtxB,GAAQ/nB,IACpFu+C,GAAQvtC,EAAOnzD,EAAM2gG,GAKvB,OAHI3gG,IAAStY,GAA0B,UAAnB2C,EAAQi4D,QAAgC,IAAVH,GAChDu+C,GAAQvtC,EAAOnzD,EAAM2gG,GAEhBj7G,OAAO+C,KAAK0qE,GAAO92C,KAAK,CAACn2B,EAAGC,IAAMD,EAAIC,GAAGuL,IAAIkmB,IAAMA,GAE5D9qB,iBAAiBpC,GACf,MAAMs1G,EAAUjzG,KAAKkzG,SACf0B,EAAW50G,KAAK1C,QAAQ2V,KAC9B,OAAI2hG,EAASU,cACJrC,EAAQ9+C,OAAOx2D,EAAOi3G,EAASU,eAEjCrC,EAAQ9+C,OAAOx2D,EAAOi3G,EAASP,eAAekB,UAEvDx1G,oBAAoBkT,EAAM5M,EAAO+/D,EAAOjS,GACtC,MAAM72D,EAAU0C,KAAK1C,QACfg3G,EAAUh3G,EAAQ2V,KAAKohG,eACvB3iC,EAAO1xE,KAAKi0G,MACZH,EAAY9zG,KAAKk0G,WACjBsB,EAAc9jC,GAAQ4iC,EAAQ5iC,GAC9B+jC,EAAc3B,GAAaQ,EAAQR,GACnC17C,EAAOgO,EAAM//D,GACbm1E,EAAQs4B,GAAa2B,GAAer9C,GAAQA,EAAKojB,MACjD51D,EAAQ5lB,KAAKkzG,SAAS/+C,OAAOlhD,EAAMkhD,IAAWqnB,EAAQi6B,EAAcD,IACpEzhD,EAAYz2D,EAAQ8oE,MAAMnjE,SAChC,OAAO8wD,EAAY9wD,GAAS8wD,EAAW,CAACnuC,EAAOvf,EAAO+/D,GAAQpmE,MAAQ4lB,EAExE7lB,mBAAmBqmE,GACjB,IAAIvrE,EAAGivC,EAAMsuB,EACb,IAAKv9D,EAAI,EAAGivC,EAAOs8B,EAAMxrE,OAAQC,EAAIivC,IAAQjvC,EAC3Cu9D,EAAOgO,EAAMvrE,GACbu9D,EAAKxyC,MAAQ5lB,KAAK01G,oBAAoBt9C,EAAKz6D,MAAO9C,EAAGurE,GAGzDrmE,mBAAmBpC,GACjB,OAAiB,OAAVA,EAAiB4kE,KAAO5kE,EAAQqC,KAAK+T,MAAQ/T,KAAKrF,IAAMqF,KAAK+T,KAEtEhU,iBAAiBpC,GACf,MAAMg4G,EAAU31G,KAAKm0G,SACfjpE,EAAMlrC,KAAKm1G,mBAAmBx3G,GACpC,OAAOqC,KAAKirE,oBAAoB0qC,EAAQx0F,MAAQ+pB,GAAOyqE,EAAQ58C,QAEjEh5D,iBAAiB6jD,GACf,MAAM+xD,EAAU31G,KAAKm0G,SACfjpE,EAAMlrC,KAAK8sG,mBAAmBlpD,GAAS+xD,EAAQ58C,OAAS48C,EAAQp0F,IACtE,OAAOvhB,KAAK+T,IAAMm3B,GAAOlrC,KAAKrF,IAAMqF,KAAK+T,KAE3ChU,cAAc6lB,GACZ,MAAMgwF,EAAY51G,KAAK1C,QAAQ8oE,MACzByvC,EAAiB71G,KAAKjG,IAAImpD,YAAYt9B,GAAOjQ,MAC7C83B,EAAQX,GAAU9sC,KAAKqc,eAAiBu5F,EAAU/4B,YAAc+4B,EAAUh5B,aAC1Ek5B,EAAcp7G,KAAKuZ,IAAIw5B,GACvBsoE,EAAcr7G,KAAKi0C,IAAIlB,GACvBuoE,EAAeh2G,KAAK0jF,wBAAwB,GAAGz+D,KACrD,MAAO,CACLytB,EAAImjE,EAAiBC,EAAgBE,EAAeD,EACpD31G,EAAIy1G,EAAiBE,EAAgBC,EAAeF,GAGxD/1G,kBAAkBk2G,GAChB,MAAMrB,EAAW50G,KAAK1C,QAAQ2V,KACxBohG,EAAiBO,EAASP,eAC1BlgD,EAASkgD,EAAeO,EAASljC,OAAS2iC,EAAejC,YACzD8D,EAAel2G,KAAK01G,oBAAoBO,EAAa,EAAGpC,GAAoB7zG,KAAM,CAACi2G,GAAcj2G,KAAKk0G,YAAa//C,GACnHlvC,EAAOjlB,KAAKm2G,cAAcD,GAC1BzC,EAAW/4G,KAAK+sB,MAAMznB,KAAKqc,eAAiBrc,KAAK2V,MAAQsP,EAAKytB,EAAI1yC,KAAK6V,OAASoP,EAAK7kB,GAAK,EAChG,OAAOqzG,EAAW,EAAIA,EAAW,EAEnC1zG,oBACE,IACIlF,EAAGivC,EADH8pE,EAAa5zG,KAAK0lE,OAAO3oE,MAAQ,GAErC,GAAI62G,EAAWh5G,OACb,OAAOg5G,EAET,MAAMr0B,EAAQv/E,KAAKm9D,0BACnB,GAAIn9D,KAAKo0G,aAAe70B,EAAM3kF,OAC5B,OAAQoF,KAAK0lE,OAAO3oE,KAAOwiF,EAAM,GAAGp+C,WAAW2kC,mBAAmB9lE,MAEpE,IAAKnF,EAAI,EAAGivC,EAAOy1C,EAAM3kF,OAAQC,EAAIivC,IAAQjvC,EAC3C+4G,EAAaA,EAAW/tC,OAAO0Z,EAAM1kF,GAAGsmC,WAAW2kC,mBAAmB9lE,OAExE,OAAQA,KAAK0lE,OAAO3oE,KAAOiD,KAAKusB,UAAUqnF,GAE5C7zG,qBACE,MAAM6zG,EAAa5zG,KAAK0lE,OAAO1D,QAAU,GACzC,IAAInnE,EAAGivC,EACP,GAAI8pE,EAAWh5G,OACb,OAAOg5G,EAET,MAAM5xC,EAAShiE,KAAKiiE,YACpB,IAAKpnE,EAAI,EAAGivC,EAAOk4B,EAAOpnE,OAAQC,EAAIivC,IAAQjvC,EAC5C+4G,EAAWzyG,KAAKghE,GAAMniE,KAAMgiE,EAAOnnE,KAErC,OAAQmF,KAAK0lE,OAAO1D,OAAShiE,KAAKo0G,YAAcR,EAAa5zG,KAAKusB,UAAUqnF,GAE9E7zG,UAAUsgD,GACR,OAAOkK,GAAalK,EAAO/wB,KAAK0jF,MAuBpC,SAASvV,GAAY9zC,EAAOn9B,EAAKkd,GAC/B,IAEI0sE,EAAYrkG,EAAYskG,EAAYC,EAFpCvsD,EAAK,EACLD,EAAKH,EAAM/uD,OAAS,EAEpB8uC,GACEld,GAAOm9B,EAAMI,GAAI7e,KAAO1e,GAAOm9B,EAAMG,GAAI5e,OACzC6e,GAAAA,EAAID,GAAAA,GAAME,GAAaL,EAAO,MAAOn9B,MAEvC0e,IAAKkrE,EAAYnjG,KAAMojG,GAAc1sD,EAAMI,MAC3C7e,IAAKn5B,EAAYkB,KAAMqjG,GAAc3sD,EAAMG,MAEzCt9B,GAAOm9B,EAAMI,GAAI92C,MAAQuZ,GAAOm9B,EAAMG,GAAI72C,QAC1C82C,GAAAA,EAAID,GAAAA,GAAME,GAAaL,EAAO,OAAQn9B,MAExCvZ,KAAMmjG,EAAYlrE,IAAKmrE,GAAc1sD,EAAMI,MAC3C92C,KAAMlB,EAAYm5B,IAAKorE,GAAc3sD,EAAMG,KAE/C,MAAMysD,EAAOxkG,EAAaqkG,EAC1B,OAAOG,EAAOF,GAAcC,EAAaD,IAAe7pF,EAAM4pF,GAAcG,EAAOF,EAtCrFrC,GAAUtrG,GAAK,OACfsrG,GAAU/hF,SAAW,CACnBsjC,OAAQ,OACRsc,SAAU,GACV5+D,KAAM,CACJkgG,QAAQ,EACRzhC,MAAM,EACN30C,OAAO,EACPq2E,YAAY,EACZI,QAAS,cACTa,eAAgB,IAElBjuC,MAAO,CACLj8B,OAAQ,OACRqxC,MAAO,CACLxjE,SAAS,KAyBf,MAAMw+F,WAAwBxC,GAC5Bj0G,YAAYxE,GACV0N,MAAM1N,GACNyE,KAAKy2G,OAAS,GACdz2G,KAAK02G,aAAUn8G,EACfyF,KAAK22G,iBAAcp8G,EAErBwF,cACE,MAAM6zG,EAAa5zG,KAAK42G,yBAClBjtD,EAAQ3pD,KAAKy2G,OAASz2G,KAAK62G,iBAAiBjD,GAClD5zG,KAAK02G,QAAUjZ,GAAY9zC,EAAO3pD,KAAK+T,KACvC/T,KAAK22G,YAAclZ,GAAY9zC,EAAO3pD,KAAKrF,KAAOqF,KAAK02G,QACvDztG,MAAMisG,YAAYtB,GAEpB7zG,iBAAiB6zG,GACf,MAAM7/F,IAACA,EAAGpZ,IAAEA,GAAOqF,KACbgJ,EAAQ,GACR2gD,EAAQ,GACd,IAAI9uD,EAAGivC,EAAMh6B,EAAMk2D,EAAMt2D,EACzB,IAAK7U,EAAI,EAAGivC,EAAO8pE,EAAWh5G,OAAQC,EAAIivC,IAAQjvC,EAChDmrE,EAAO4tC,EAAW/4G,GACdmrE,GAAQjyD,GAAOiyD,GAAQrrE,GACzBqO,EAAM7H,KAAK6kE,GAGf,GAAIh9D,EAAMpO,OAAS,EACjB,MAAO,CACL,CAACqY,KAAMc,EAAKm3B,IAAK,GACjB,CAACj4B,KAAMtY,EAAKuwC,IAAK,IAGrB,IAAKrwC,EAAI,EAAGivC,EAAO9gC,EAAMpO,OAAQC,EAAIivC,IAAQjvC,EAC3C6U,EAAO1G,EAAMnO,EAAI,GACjBiV,EAAO9G,EAAMnO,EAAI,GACjBmrE,EAAOh9D,EAAMnO,GACTH,KAAKqiC,OAAOrtB,EAAOI,GAAQ,KAAOk2D,GACpCrc,EAAMxoD,KAAK,CAAC8R,KAAM+yD,EAAM96B,IAAKrwC,GAAKivC,EAAO,KAG7C,OAAO6f,EAET5pD,yBACE,IAAI6zG,EAAa5zG,KAAK0lE,OAAOhK,KAAO,GACpC,GAAIk4C,EAAWh5G,OACb,OAAOg5G,EAET,MAAM72G,EAAOiD,KAAKq1G,oBACZzvF,EAAQ5lB,KAAK20G,qBAOnB,OALEf,EADE72G,EAAKnC,QAAUgrB,EAAMhrB,OACVoF,KAAKusB,UAAUxvB,EAAK8oE,OAAOjgD,IAE3B7oB,EAAKnC,OAASmC,EAAO6oB,EAEpCguF,EAAa5zG,KAAK0lE,OAAOhK,IAAMk4C,EACxBA,EAET7zG,mBAAmBpC,GACjB,OAAQ8/F,GAAYz9F,KAAKy2G,OAAQ94G,GAASqC,KAAK02G,SAAW12G,KAAK22G,YAEjE52G,iBAAiB6jD,GACf,MAAM+xD,EAAU31G,KAAKm0G,SACfvwB,EAAU5jF,KAAK8sG,mBAAmBlpD,GAAS+xD,EAAQ58C,OAAS48C,EAAQp0F,IAC1E,OAAOk8E,GAAYz9F,KAAKy2G,OAAQ7yB,EAAU5jF,KAAK22G,YAAc32G,KAAK02G,SAAS,IAG/EF,GAAgB9tG,GAAK,aACrB8tG,GAAgBvkF,SAAW+hF,GAAU/hF,SAYrC,MAAM6kF,GAAgB,CACpBzlC,GACAvwB,GACAe,GAbwBlpD,OAAO4rE,OAAO,CACxCpmE,UAAW,KACXsuG,cAAeA,GACfoC,YAAaA,GACbI,iBAAkBA,GAClBkC,kBAAmBA,GACnB6C,UAAWA,GACXwC,gBAAiBA,MC/2UXO,GAAa,CAAC,QAAS,YACvBC,GAAY,CAAC,QAAS,SACtBC,GAAQF,GAAWlxC,OAAOmxC;;;;;;OAyChC,SAAS1qG,GAAY4qG,EAAO95G,EAAOE,GACjC,GAAI45G,EAAMC,SACR,OAAQ/5G,EAAMqE,MACd,IAAK,YACL,IAAK,YAUT,SAA0By1G,EAAO95G,GAC/B,IAAK85G,EAAME,aACT,OAGF,IAAIx6G,EAEe,cAAfQ,EAAMqE,OACR7E,EAAUy6G,GAAeH,EAAMp2D,SAAU1jD,IAG3C,MAAM2oD,EAAWmxD,EAAMI,QACvBJ,EAAMI,QAAU16G,EAKlB,SAA4Bs6G,EAAOp2D,EAAU1jD,GAC3C,MAAM2oD,SAACA,EAAQnpD,QAAEA,GAAWkkD,EACxBiF,GAAYA,IAAanpD,GAC3BuQ,GAAc44C,EAASzoD,QAAQi6G,OAASL,EAAM5sD,UAAUitD,MAAOxxD,EAAU3oD,GAEvER,GAAWA,IAAYmpD,GACzB54C,GAAcvQ,EAAQU,QAAQk6G,OAASN,EAAM5sD,UAAUktD,MAAO56G,EAASQ,GATzEq6G,CAAmBP,EAAO,CAACnxD,SAAAA,EAAUnpD,QAAAA,GAAUQ,GAvB3Cs6G,CAAiBR,EAAO95G,GACxB,MACF,IAAK,SAkCT,SAA2B85G,EAAO95G,EAAOE,GACvC,MAAMgtD,EAAY4sD,EAAM5sD,UAClB1tD,EAAUy6G,GAAeH,EAAMp2D,SAAU1jD,GAC/C,GAAIR,EAAS,CACX,MAAM+6G,EAAS/6G,EAAQU,QACjBs6G,EAAWD,EAAOC,UAAYttD,EAAUstD,SACxCt7E,EAAQq7E,EAAOr7E,OAASguB,EAAUhuB,MACpC1/B,EAAQ61B,cAEV9pB,aAAa/L,EAAQ61B,qBACd71B,EAAQ61B,aACftlB,GAAcyqG,EAAUh7G,EAASQ,IACxBw6G,EAETh7G,EAAQ61B,aAAehqB,WAAW,YACzB7L,EAAQ61B,aACftlB,GAAcmvB,EAAO1/B,EAASQ,IAC7BE,EAAQu6G,eAGX1qG,GAAcmvB,EAAO1/B,EAASQ,IArD9B06G,CAAkBZ,EAAO95G,EAAOE,IA0DtC,SAAS6P,GAAc9P,EAAST,EAASQ,GACvC6F,GAAS5F,EAAS,CAACT,EAAQwiE,SAAUhiE,IAGvC,SAASi6G,GAAev2D,EAAUxpB,GAChC,IAAI47C,EAAcnuD,OAAO8mB,kBAEzB,OAAOiV,EACJl8C,OAAQhI,GAAYA,EAAQU,QAAQm8B,SAAW78B,EAAQ81E,QAAQp7C,EAASzM,EAAGyM,EAASxM,IACpF2tC,OAAO,CAACs/C,EAAcn7G,KACrB,MAAMisE,EAASjsE,EAAQu2E,iBACjBzlC,EAAWC,GAAsBrW,EAAUuxC,GAUjD,OARIn7B,EAAWwlC,GACb6kC,EAAe,CAACn7G,GAChBs2E,EAAcxlC,GACLA,IAAawlC,GAEtB6kC,EAAa52G,KAAKvE,GAGbm7G,GACN,IACFzoF,KAAK,CAACn2B,EAAGC,IAAMD,EAAE6+G,OAAS5+G,EAAE4+G,QAC5B79G,MAAM,EAAG,GAAG,GAGjB,SAAS89G,GAAiBr3D,EAAOtoB,EAAO4/E,GACtC,MAAM7rE,EA+CR,SAAwB/T,EAAO4/E,GAC7B,MAAMtnG,EAAO0nB,EAAM1nB,KACbgwD,EAAUtoC,EAAM5vB,GAChByvG,EAAgBvnG,EAAO,UACvB++F,EAAS,CACb57F,IAAKs1B,GAAe/Q,EAAMvkB,IAAKgR,OAAO89C,mBACtCloE,IAAK0uC,GAAe/Q,EAAM39B,IAAKoqB,OAAO8mB,oBAExC,IAAK,MAAMusE,KAAcF,EACnBE,EAAWx3C,UAAYA,EACzByvC,GAAa+H,EAAY9/E,EAAO,CAAC,QAAS,YAAaq3E,GAC9CyI,EAAWD,KAAmBv3C,GACvCyvC,GAAa+H,EAAY9/E,EAAO,CAAC1nB,EAAO,MAAOA,EAAO,MAAOA,EAAO,SAAU++F,GAGlF,OAAOA,EA9DO0I,CAAe//E,EAAO4/E,GACpC,IAAI9oC,EAAUkpC,GAAiBhgF,EAAO+T,EAAO,MAAO,gBACpD+iC,EAAUkpC,GAAiBhgF,EAAO+T,EAAO,MAAO,iBAAmB+iC,EAC/DA,GAAmD,mBAAjC92C,EAAMw2E,wBAC1Bx2E,EAAMw2E,yBAUV,SAASwJ,GAAiBhgF,EAAO+T,EAAO84C,EAAOozB,GAC7C,GAAI9sF,GAAS4gB,EAAM84C,MAOrB,SAA2B8E,EAAc9E,EAAOozB,GAC9C,OAAOhtE,GAAQ0+C,EAAa9E,KAAW55C,GAAQ0+C,EAAasuB,IAR7BC,CAAkBlgF,EAAMh7B,QAAS6nF,EAAOozB,GAAiB,CACtF,MAAMnpC,EAAU92C,EAAM6sD,KAAW94C,EAAM84C,GAEvC,OADA7sD,EAAM6sD,GAAS94C,EAAM84C,GACd/V,GAQX,SAASqpC,GAAeL,EAAYr2D,GAClC,IAAK,MAAM3jD,IAAO,CAAC,UAAW,WAAY,YACpCg6G,EAAWh6G,KAAS2jD,EAAOq2D,EAAWh6G,KAASs6G,GAAiBN,EAAYh6G,IAC9E8qD,QAAQC,KAAK,2BAA2BivD,EAAWh6G,uBAAyBg6G,EAAW1vG,OAK7F,SAASgwG,GAAiBN,EAAYh6G,GACpC,GAAY,YAARA,EACF,OAAO,EAET,MAAMwS,EAAOxS,EAAIitC,OAAO,GACxB,IAAK,MAAM38B,IAAQ,CAAC,MAAO,MAAO,SAChC,GAAI68B,GAAQ6sE,EAAWxnG,EAAOlC,IAC5B,OAAO,EAGX,OAAO,EAqBT,SAAS2hG,GAAa+H,EAAY9/E,EAAO/8B,EAAOo0G,GAC9C,IAAK,MAAMjhG,KAAQnT,EAAO,CACxB,MAAMuoE,EAAMs0C,EAAW1pG,GACvB,GAAI68B,GAAQu4B,GAAM,CAChB,MAAMnmE,EAAQ26B,EAAM6pC,MAAM2B,GAC1B6rC,EAAO57F,IAAMrZ,KAAKqZ,IAAI47F,EAAO57F,IAAKpW,GAClCgyG,EAAOh1G,IAAMD,KAAKC,IAAIg1G,EAAOh1G,IAAKgD,KAKxC,MAEMg7G,GAAQ,CAAC9tF,EAAGnqB,EAAMmR,IAAOnX,KAAKqZ,IAAIlC,EAAInX,KAAKC,IAAI+F,EAAMmqB,IAE3D,SAAS+tF,GAASpyG,EAAK9F,EAAMmR,GAC3B,IAAK,MAAMzT,KAAOzF,OAAO+C,KAAK8K,GAC5BA,EAAIpI,GAAOu6G,GAAMnyG,EAAIpI,GAAMsC,EAAMmR,GAEnC,OAAOrL,EAWT,SAASqyG,GAAWvf,EAAQC,GAAQ1uE,EAACA,EAACC,EAAEA,EAACnV,MAAEA,EAAKE,OAAEA,GAASuvC,GACzD,MAAM0zD,EAAe1zD,EAAc,EACnC,OAAOk0C,GAAUzuE,EAAIiuF,EArBP,MAsBPxf,GAAUzuE,EAAIlV,EAAQmjG,EAtBf,MAuBPvf,GAAUzuE,EAAIguF,EAvBP,MAwBPvf,GAAUzuE,EAAIjV,EAASijG,EAxBhB,KA2BhB,SAASC,GAAsBn8G,EAAS41E,GACtC,MAAM3nD,EAACA,EAACC,EAAEA,GAAKluB,EAAQy2E,SAAS,CAAC,IAAK,KAAMb,GAC5C,MAAO,CAAC3nD,EAAAA,EAAGC,EAAAA,GAGb,MAAMkuF,GAAc,CAACC,EAAKC,IAAQA,EAAMD,GAAQA,EAAIr+G,OAASs+G,EAAIt+G,QAAUq+G,EAAI5pF,OAAO,EAAG6pF,EAAIt+G,UAAYs+G,EAqBzG,MAAMC,GAAmBjrE,GAAmB,iBAANA,GAAkBA,EAAE1E,SAAS,KAC7D4vE,GAAalrE,GAAMyqE,GAAMhrG,WAAWugC,GAAK,IAAK,EAAG,GAEvD,SAASijB,GAAoBlsC,EAAMo0F,GACjC,MAAuB,UAAnBA,EACK,EAEc,QAAnBA,EACKp0F,EAELk0F,GAAgBE,GACXD,GAAUC,GAAkBp0F,EAE9BA,EAAO,EAGhB,SAASq0F,GAAQr0F,EAAMtnB,GACrB,MAAqB,iBAAVA,EACFA,EACEw7G,GAAgBx7G,GAClBy7G,GAAUz7G,GAASsnB,EAErBA,EAcT,SAASs0F,GAAW57G,GAClB,OAAI+I,GAAS/I,GACJ,CACLktB,EAAGwe,GAAe1rC,EAAMktB,EAAG,UAC3BC,EAAGue,GAAe1rC,EAAMmtB,EAAG,WAIxB,CACLD,EAFFltB,EAAQ0rC,GAAe1rC,EAAO,UAG5BmtB,EAAGntB,GAIP,SAAS67G,GAAel8G,GACtB,OAAOA,IAAYiuC,GAAQjuC,EAAQm8G,SAAWluE,GAAQjuC,EAAQo8G,SAGhE,MAAMC,GAAa,IAAIp0G,IAQvB,SAASq0G,GAAgBC,GACvB,GAAIA,GAA8B,iBAAZA,EAAsB,CAC1C,MAAMp4G,EAAOo4G,EAAQnoG,WACrB,MAAiB,8BAATjQ,GAAiD,+BAATA,GAUpD,SAASuR,GAAUjZ,EAAK6C,EAAS6nD,GAC/B,GAAIA,EAAU,CACZ,MAAMokB,EAASjsE,EAAQu2E,iBACvBp5E,EAAIiZ,UAAU61D,EAAOh+C,EAAGg+C,EAAO/9C,GAC/B/wB,EAAI4lD,OAAO7S,GAAU2X,IACrB1qD,EAAIiZ,WAAW61D,EAAOh+C,GAAIg+C,EAAO/9C,IAUrC,SAASgvF,GAAe//G,EAAKuD,GAC3B,GAAIA,GAAWA,EAAQ8nD,YAOrB,OANArrD,EAAIg9F,QAAUz5F,EAAQ25D,eACtBl9D,EAAIssF,YAAY/oF,EAAQ45D,YACxBn9D,EAAIusF,eAAiBhpF,EAAQ65D,iBAC7Bp9D,EAAIg8F,SAAWz4F,EAAQ85D,gBACvBr9D,EAAIotD,UAAY7pD,EAAQ8nD,YACxBrrD,EAAImtD,YAAc5pD,EAAQmjD,aACnB,EASX,SAASs5D,GAAehgH,EAAKuD,GAC3BvD,EAAIigH,YAAc18G,EAAQ28G,sBAC1BlgH,EAAImgH,WAAa58G,EAAQ48G,WACzBngH,EAAIogH,cAAgB78G,EAAQ68G,cAC5BpgH,EAAIqgH,cAAgB98G,EAAQ88G,cAS9B,SAASC,GAAiBtgH,EAAKuD,GAC7B,MAAMu8G,EAAUv8G,EAAQu8G,QACxB,GAAID,GAAgBC,GAClB,MAAO,CACLlkG,MAAO2jG,GAAQO,EAAQlkG,MAAOrY,EAAQqY,OACtCE,OAAQyjG,GAAQO,EAAQhkG,OAAQvY,EAAQuY,SAG5C,MAAMkrC,EAAOiI,GAAO1rD,EAAQyjD,MACtB2F,EAAcppD,EAAQy/E,gBACtBt2B,EAAQ/8C,GAAQmwG,GAAWA,EAAU,CAACA,GACtCS,EAAS7zD,EAAMp1C,OAAS0vC,EAAKiC,OAAS0D,GAAe3sD,EAAI8oD,aAAe,YAAc,IAC5F,IAAK82D,GAAW99G,IAAIy+G,GAAS,CAC3BvgH,EAAIupD,OACJvpD,EAAIgnD,KAAOA,EAAKiC,OAChB,MAAMoS,EAAQ3O,EAAM7rD,OACpB,IAAI+a,EAAQ,EACZ,IAAK,IAAI9a,EAAI,EAAGA,EAAIu6D,EAAOv6D,IAAK,CAC9B,MAAMiC,EAAO2pD,EAAM5rD,GACnB8a,EAAQjb,KAAKC,IAAIgb,EAAO5b,EAAImpD,YAAYpmD,GAAM6Y,MAAQ+wC,GAExD3sD,EAAI0pD,UACJ,MAAM5tC,EAASu/C,EAAQrU,EAAKE,WAAayF,EACzCizD,GAAWp7G,IAAI+7G,EAAQ,CAAC3kG,MAAAA,EAAOE,OAAAA,IAEjC,OAAO8jG,GAAWvwG,IAAIkxG,GAUxB,SAASC,GAAQxgH,EAAKorD,EAAM7nD,GAC1B,MAAMutB,EAACA,EAACC,EAAEA,EAACnV,MAAEA,EAAKE,OAAEA,GAAUsvC,EAC9BprD,EAAIupD,OACJy2D,GAAehgH,EAAKuD,GACpB,MAAM+nD,EAASy0D,GAAe//G,EAAKuD,GACnCvD,EAAI+sD,UAAYxpD,EAAQkjD,gBACxBzmD,EAAI8qD,YACJoD,GAAmBluD,EAAK,CACtB8wB,EAAAA,EAAGC,EAAAA,EAAG4nB,EAAG/8B,EAAOvV,EAAGyV,EAEnB6uC,OAAQk0D,GAAS9vD,GAAczf,GAAe/rC,EAAQinD,aAAcjnD,EAAQ42F,eAAgB,EAAGx5F,KAAKqZ,IAAI4B,EAAOE,GAAU,KAE3H9b,EAAIgrD,YACJhrD,EAAI6L,OACAy/C,IACFtrD,EAAIigH,YAAc18G,EAAQk9G,kBAC1BzgH,EAAIsrD,UAENtrD,EAAI0pD,UAUN,SAASg3D,GAAU1gH,EAAKorD,EAAM7nD,GAC5B,MAAMu8G,EAAUv8G,EAAQu8G,QACxB,GAAID,GAAgBC,GAElB,YADA9/G,EAAI6qD,UAAUi1D,EAAS10D,EAAKt6B,EAAGs6B,EAAKr6B,EAAGq6B,EAAKxvC,MAAOwvC,EAAKtvC,QAG1D,MAAMmsD,EAASt4D,GAAQmwG,GAAWA,EAAU,CAACA,GACvC94D,EAAOiI,GAAO1rD,EAAQyjD,MACtBiiD,EAAKjiD,EAAKE,WACVp2B,EAvKR,SAAgC5F,EAAM3nB,GACpC,MAAMutB,EAACA,EAAClV,MAAEA,GAASsP,EACb8hC,EAAYzpD,EAAQypD,UAC1B,MAAkB,WAAdA,EACKl8B,EAAIlV,EAAQ,EACI,QAAdoxC,GAAqC,UAAdA,EACzBl8B,EAAIlV,EAENkV,EA+JG6vF,CAAuBv1D,EAAM7nD,GACjCwtB,EAAIq6B,EAAKr6B,EAAKk4E,EAAK,EAAK1lG,EAAQy/E,gBAAkB,EACxDhjF,EAAIupD,OACJvpD,EAAIgnD,KAAOA,EAAKiC,OAChBjpD,EAAIitD,aAAe,SACnBjtD,EAAIgtD,UAAYzpD,EAAQypD,UAS1B,SAA4BhtD,EAAKuD,GAC/B,GAAIA,EAAQy/E,gBAAkB,EAM5B,OAJAhjF,EAAIg8F,SAAW,QACfh8F,EAAI4gH,WAAa,EACjB5gH,EAAIotD,UAAY7pD,EAAQy/E,gBACxBhjF,EAAImtD,YAAc5pD,EAAQ0/E,iBACnB,EAfL49B,CAAmB7gH,EAAKuD,IAC1B0kE,EAAOjpE,QAAQ,CAACkN,EAAGpL,IAAMd,EAAIqtD,WAAWnhD,EAAG4kB,EAAGC,EAAKjwB,EAAImoG,IAEzDjpG,EAAI+sD,UAAYxpD,EAAQ6hD,MACxB6iB,EAAOjpE,QAAQ,CAACkN,EAAGpL,IAAMd,EAAIutD,SAASrhD,EAAG4kB,EAAGC,EAAKjwB,EAAImoG,IACrDjpG,EAAI0pD,UAsBN,SAASo3D,GAAmB11D,GAC1B,MAAMt6B,EAACA,EAACC,EAAEA,EAACnV,MAAEA,EAAKE,OAAEA,GAAUsvC,EAC9B,MAAO,CACLt6B,EAAGA,EAAIlV,EAAQ,EACfmV,EAAGA,EAAIjV,EAAS,GAWpB,SAASilG,GAAQ3rF,EAAO05C,EAAQp7B,GAC9B,MAAMx5B,EAAMvZ,KAAKuZ,IAAIw5B,GACfkB,EAAMj0C,KAAKi0C,IAAIlB,GACfstE,EAAKlyC,EAAOh+C,EACZmwF,EAAKnyC,EAAO/9C,EAElB,MAAO,CACLD,EAAGkwF,EAAK9mG,GAAOkb,EAAMtE,EAAIkwF,GAAMpsE,GAAOxf,EAAMrE,EAAIkwF,GAChDlwF,EAAGkwF,EAAKrsE,GAAOxf,EAAMtE,EAAIkwF,GAAM9mG,GAAOkb,EAAMrE,EAAIkwF,IAkBpD,SAASC,GAAW3iF,EAAO36B,EAAOsrD,GAEhC,OADAtrD,EAAyB,iBAAVA,EAAqBA,EAAQ26B,EAAM6pC,MAAMxkE,GACjD8tB,GAAS9tB,GAAS26B,EAAM6tC,iBAAiBxoE,GAASsrD,EAQ3D,SAASiyD,GAAyB5iF,EAAOh7B,GACvC,GAAIg7B,EAAO,CACT,MAAMvkB,EAAMknG,GAAW3iF,EAAOh7B,EAAQyW,IAAKzW,EAAQ6jB,OAC7CxmB,EAAMsgH,GAAW3iF,EAAOh7B,EAAQ3C,IAAK2C,EAAQikB,KACnD,MAAO,CACLJ,MAAOzmB,KAAKqZ,IAAIA,EAAKpZ,GACrB4mB,IAAK7mB,KAAKC,IAAIoZ,EAAKpZ,IAGvB,MAAO,CACLwmB,MAAO7jB,EAAQ6jB,MACfI,IAAKjkB,EAAQikB,KASjB,SAAS45F,GAAcv6D,EAAOtjD,GAC5B,MAAMqmE,UAACA,EAAS5hB,OAAEA,GAAUnB,EACtB2f,EAASxe,EAAOzkD,EAAQ89G,UACxB36C,EAAS1e,EAAOzkD,EAAQ+9G,UAC9B,IAAIxwF,EAAI84C,EAAUhuD,MAAQ,EACtBmV,EAAI64C,EAAU9tD,OAAS,EAS3B,OAPI0qD,IACF11C,EAAIowF,GAAW16C,EAAQjjE,EAAQm8G,OAAQ5uF,IAGrC41C,IACF31C,EAAImwF,GAAWx6C,EAAQnjE,EAAQo8G,OAAQ5uF,IAElC,CAACD,EAAAA,EAAGC,EAAAA,GAQb,SAASwwF,GAAa16D,EAAOtjD,GAC3B,MAAMijE,EAAS3f,EAAMmB,OAAOzkD,EAAQ89G,UAC9B36C,EAAS7f,EAAMmB,OAAOzkD,EAAQ+9G,UACpC,IAAK9sG,IAAKuc,EAAGtc,KAAMqc,EAAG66B,OAAQu/B,EAAIx/B,MAAOu/B,GAAMpkC,EAAM+iB,UAErD,IAAKpD,IAAWE,EACd,MAAO,GAGT,MAAM86C,EAAOL,GAAyB36C,EAAQ,CAACxsD,IAAKzW,EAAQi/F,KAAM5hG,IAAK2C,EAAQk+G,KAAMr6F,MAAO0J,EAAGtJ,IAAKyjE,IACpGn6D,EAAI0wF,EAAKp6F,MACT6jE,EAAKu2B,EAAKh6F,IACV,MAAMk6F,EAAOP,GAAyBz6C,EAAQ,CAAC1sD,IAAKzW,EAAQo+G,KAAM/gH,IAAK2C,EAAQq+G,KAAMx6F,MAAO2J,EAAGvJ,IAAK0jE,IAIpG,OAHAn6D,EAAI2wF,EAAKt6F,MACT8jE,EAAKw2B,EAAKl6F,IAEH,CACLsJ,EAAAA,EACAC,EAAAA,EACAk6D,GAAAA,EACAC,GAAAA,EACAtvE,MAAOqvE,EAAKn6D,EACZhV,OAAQovE,EAAKn6D,GAuBjB,SAAS8wF,GAAqBh7D,EAAOtjD,GACnC,IAAKk8G,GAAel8G,GAAU,CAC5B,MAAMyQ,EAAMutG,GAAa16D,EAAOtjD,GAC1B6xB,EAAQ0rF,GAAmB9sG,GACjC,IAAI22C,EAASpnD,EAAQonD,OAKrB,OAJKA,IAAU1/B,MAAM0/B,KACnBA,EAAShqD,KAAKqZ,IAAIhG,EAAI4H,MAAO5H,EAAI8H,QAAU,EAC3CvY,EAAQonD,OAASA,GAEZ,CACL75B,EAAGsE,EAAMtE,EAAIvtB,EAAQu+G,QACrB/wF,EAAGqE,EAAMrE,EAAIxtB,EAAQw+G,QACrBnmG,MAAgB,EAAT+uC,EACP7uC,OAAiB,EAAT6uC,GAGZ,OA/BF,SAAwB9D,EAAOtjD,GAC7B,MAAM6xB,EAAQgsF,GAAcv6D,EAAOtjD,GACnC,MAAO,CACLutB,EAAGsE,EAAMtE,EAAIvtB,EAAQu+G,QACrB/wF,EAAGqE,EAAMrE,EAAIxtB,EAAQw+G,QACrBnmG,MAAwB,EAAjBrY,EAAQonD,OACf7uC,OAAyB,EAAjBvY,EAAQonD,QAyBXq3D,CAAen7D,EAAOtjD,GAG/B,MAAM0+G,WAAsBjiC,GAC1Bh6E,QAAQu5F,EAAQC,EAAQ/mB,GACtB,MAAM3nD,EAACA,EAACC,EAAEA,GAAKgwF,GAAQ,CAACjwF,EAAGyuE,EAAQxuE,EAAGyuE,GAASv5F,KAAKmzE,eAAeX,GAAmB1lC,IAAW9sC,KAAK1C,QAAQmnD,WAC9G,OAAOo0D,GAAWhuF,EAAGC,EAAG9qB,KAAKqzE,SAAS,CAAC,IAAK,IAAK,QAAS,UAAWb,GAAmBxyE,KAAK1C,QAAQ8nD,aAGvGrlD,eAAeyyE,GACb,OAAOqoC,GAAmB76G,KAAKqzE,SAAS,CAAC,IAAK,IAAK,QAAS,UAAWb,IAGzEzyE,KAAKhG,GACHA,EAAIupD,OACJtwC,GAAUjZ,EAAKiG,KAAMA,KAAK1C,QAAQmnD,UAClC81D,GAAQxgH,EAAKiG,KAAMA,KAAK1C,SACxBvD,EAAI0pD,UAGN1jD,UAAUhG,GACR,MAAM8wB,EAACA,EAACC,EAAEA,EAACnV,MAAEA,EAAKE,OAAEA,EAAMvY,QAAEA,GAAW0C,MACjC4lB,MAACA,EAAKw/B,YAAEA,GAAe9nD,EACvB2+G,EAAa72D,EAAc,EAC3B9tB,EAAWiiF,GAAW3zF,EAAM0R,UAC5B2+C,EAAUltB,GAAUnjC,EAAMqwD,SAC1BimC,EAAY7B,GAAiBtgH,EAAK6rB,GAClCu2F,EAAY,CAChBtxF,EAAGuxF,GAAWp8G,KAAMk8G,EAAW5kF,EAAU2+C,GACzCnrD,EAAGuxF,GAAWr8G,KAAMk8G,EAAW5kF,EAAU2+C,GACzCtgE,MAAOumG,EAAUvmG,MACjBE,OAAQqmG,EAAUrmG,QAGpB9b,EAAIupD,OACJtwC,GAAUjZ,EAAKiG,KAAM4lB,EAAM6+B,UAC3B1qD,EAAI8qD,YACJ9qD,EAAIorD,KAAKt6B,EAAIoxF,EAAahmC,EAAQznE,KAAMsc,EAAImxF,EAAahmC,EAAQ1nE,IAC/DoH,EAAQyvC,EAAc6wB,EAAQtgE,MAAOE,EAASuvC,EAAc6wB,EAAQpgE,QACtE9b,EAAI6rD,OACJ60D,GAAU1gH,EAAKoiH,EAAWv2F,GAC1B7rB,EAAI0pD,UAGN1jD,yBAAyB6gD,EAAOtjD,GAC9B,OAAOg+G,GAAa16D,EAAOtjD,IAiE/B,SAAS8+G,GAAWruG,EAAKmuG,EAAW5kF,EAAU2+C,GAC5C,MAAOprD,EAAG1J,EAAO6jE,GAAIzjE,EAAK5L,MAAOsP,EAAI3nB,QAAEA,GAAWyQ,GAC3C8tG,QAASS,EAAMl3D,YAAEA,GAAe9nD,EAAQsoB,MAC/C,OAAO22F,GAAoB,CAACp7F,MAAAA,EAAOI,IAAAA,EAAK0D,KAAAA,GAAO,CAC7CqS,SAAUA,EAASzM,EACnBorD,QAAS,CAAC90D,MAAO80D,EAAQznE,KAAM+S,IAAK00D,EAAQxwB,OAC5C62D,OAAAA,EAAQl3D,YAAAA,EACRngC,KAAMi3F,EAAUvmG,QAIpB,SAAS0mG,GAAWtuG,EAAKmuG,EAAW5kF,EAAU2+C,GAC5C,MAAOnrD,EAAG3J,EAAO8jE,GAAI1jE,EAAK1L,OAAQoP,EAAI3nB,QAAEA,GAAWyQ,GAC5C+tG,QAASQ,EAAMl3D,YAAEA,GAAe9nD,EAAQsoB,MAC/C,OAAO22F,GAAoB,CAACp7F,MAAAA,EAAOI,IAAAA,EAAK0D,KAAAA,GAAO,CAC7CqS,SAAUA,EAASxM,EACnBmrD,QAAS,CAAC90D,MAAO80D,EAAQ1nE,IAAKgT,IAAK00D,EAAQvwB,QAC3C42D,OAAAA,EAAQl3D,YAAAA,EACRngC,KAAMi3F,EAAUrmG,SAIpB,SAAS0mG,GAAoBC,EAAStc,GACpC,MAAM/+E,MAACA,EAAKI,IAAEA,GAAOi7F,GACfllF,SAACA,EAAU2+C,SAAU90D,MAAOs7F,EAAUl7F,IAAKm7F,GAAOJ,OAAEA,EAAMl3D,YAAEA,GAAe86C,EAEjF,OAAO/+E,EAAQikC,EAAc,EAAIk3D,EAASG,EAAWtrD,GAD/B5vC,EAAM6jC,EAAcjkC,EAAQs7F,EAAWC,EAASxc,EAAUj7E,KACQqS,GAvF1F0kF,GAActzG,GAAK,gBAEnBszG,GAAc/pF,SAAW,CACvBgmF,kBAAkB,EAClBgC,sBAAuB,cACvBhjD,eAAgB,OAChBC,WAAY,GACZC,iBAAkB,EAClBC,gBAAiB,QACjB88B,aAAc,EACdsmB,kBAAmB,cACnBp1D,YAAa,EACbb,kBAAchqD,EACdk/B,SAAS,EACT7T,MAAO,CACLw/B,iBAAa7qD,EACb4kD,MAAO,QACP06D,QAAS,KACT7Z,cAAUzlG,EACVyd,SAAS,EACT+oC,KAAM,CACJC,YAAQzmD,EACR0mD,gBAAY1mD,EACZ0qB,UAAM1qB,EACN8D,WAAO9D,EACP6kD,OAAQ,QAEVvpC,YAAQtb,EACR07E,QAAS,EACT3+C,SAAU,SACVmtB,cAAUlqD,EACVwsD,UAAW,QACXi2B,qBAAiBziF,EACjBwiF,gBAAiB,EACjB8+B,QAAS,EACTC,QAAS,EACTnmG,WAAOpb,GAETkqD,SAAU,EACVy1D,WAAY,EACZC,cAAe,EACfC,cAAe,EACfoB,UAAMjhH,EACNgiG,UAAMhiG,EACN6gH,SAAU,IACVO,UAAMphH,EACNmhH,UAAMnhH,EACN8gH,SAAU,KAGZW,GAAc/hC,cAAgB,CAC5Bx5B,YAAa,QACbD,gBAAiB,SAGnBw7D,GAAc/9G,YAAc,CAC1B2nB,MAAO,CACLg9B,WAAW,IAiCf,MAAM+5D,GAAc,CAACzpE,EAAIC,EAAI7yC,MAAQuqB,EAAGqoB,EAAGroB,EAAIvqB,GAAK6yC,EAAGtoB,EAAIqoB,EAAGroB,GAAIC,EAAGooB,EAAGpoB,EAAIxqB,GAAK6yC,EAAGroB,EAAIooB,EAAGpoB,KACrF8xF,GAAe,CAAC9xF,EAAGooB,EAAIC,IAAOwpE,GAAYzpE,EAAIC,EAAIz4C,KAAK6hB,KAAKuO,EAAIooB,EAAGpoB,IAAMqoB,EAAGroB,EAAIooB,EAAGpoB,KAAKD,EACxFgyF,GAAe,CAAChyF,EAAGqoB,EAAIC,IAAOwpE,GAAYzpE,EAAIC,EAAIz4C,KAAK6hB,KAAKsO,EAAIqoB,EAAGroB,IAAMsoB,EAAGtoB,EAAIqoB,EAAGroB,KAAKC,EACxFgyF,GAAMt0F,GAAKA,EAAIA,EAGrB,SAASu0F,IAAalyF,EAACA,EAACC,EAAEA,EAACk6D,GAAEA,EAAEC,GAAEA,IAAK12E,IAACA,EAAGk3C,MAAEA,EAAKC,OAAEA,EAAMl3C,KAAEA,IACzD,QACGqc,EAAIrc,GAAQw2E,EAAKx2E,GACjBqc,EAAI46B,GAASu/B,EAAKv/B,GAClB36B,EAAIvc,GAAO02E,EAAK12E,GAChBuc,EAAI46B,GAAUu/B,EAAKv/B,GAIxB,SAASs3D,IAAiBnyF,EAACA,EAACC,EAAEA,GAAIqoB,GAAI5kC,IAACA,EAAGk3C,MAAEA,EAAKC,OAAEA,EAAMl3C,KAAEA,IAiBzD,OAhBIqc,EAAIrc,IACNsc,EAAI+xF,GAAaruG,EAAM,CAACqc,EAAAA,EAAGC,EAAAA,GAAIqoB,GAC/BtoB,EAAIrc,GAEFqc,EAAI46B,IACN36B,EAAI+xF,GAAap3D,EAAO,CAAC56B,EAAAA,EAAGC,EAAAA,GAAIqoB,GAChCtoB,EAAI46B,GAEF36B,EAAIvc,IACNsc,EAAI+xF,GAAaruG,EAAK,CAACsc,EAAAA,EAAGC,EAAAA,GAAIqoB,GAC9BroB,EAAIvc,GAEFuc,EAAI46B,IACN76B,EAAI+xF,GAAal3D,EAAQ,CAAC76B,EAAAA,EAAGC,EAAAA,GAAIqoB,GACjCroB,EAAI46B,GAEC,CAAC76B,EAAAA,EAAGC,EAAAA,GASb,MAAMmyF,WAAuBljC,GAG3Bh6E,WAAW8qB,EAAGC,EAAG6hB,EAxCI,KAwCsB6lC,GAEzC,MAAO3nD,EAAGi6D,EAAIh6D,EAAGi6D,EAAEC,GAAEA,EAAEC,GAAEA,GAAMjlF,KAAKqzE,SAAS,CAAC,IAAK,IAAK,KAAM,MAAOb,GAC/DgqB,EAAKxX,EAAKF,EACVo4B,EAAKj4B,EAAKF,EACVo4B,EAAQL,GAAItgB,GAAMsgB,GAAII,GACtB58G,EAAc,IAAV68G,GAAe,IAAMtyF,EAAIi6D,GAAM0X,GAAM1xE,EAAIi6D,GAAMm4B,GAAMC,EAC/D,IAAIx1E,EAAIy1E,EAWR,OAVI98G,EAAI,GACNqnC,EAAKm9C,EACLs4B,EAAKr4B,GACIzkF,EAAI,GACbqnC,EAAKq9C,EACLo4B,EAAKn4B,IAELt9C,EAAKm9C,EAAKxkF,EAAIk8F,EACd4gB,EAAKr4B,EAAKzkF,EAAI48G,GAERJ,GAAIjyF,EAAI8c,GAAMm1E,GAAIhyF,EAAIsyF,IAAQzwE,EASxC5sC,eAAeyyE,EAAkB7O,GAC/B,MAAMu8B,EAAYlgG,KAAK1C,QAAQsoB,MAC/B,SAAKs6E,IAAcA,EAAUloF,YAGrB2rD,GAAao5C,GAAa/8G,KAAKqzE,SAAS,CAAC,IAAK,IAAK,KAAM,MAAOb,GAAmB7O,IAI7F5jE,UAAUu5F,EAAQC,EAAQ/mB,GACxB,IAAKxyE,KAAKq9G,eAAe7qC,GACvB,OAAO,EAET,MAAM8qC,OAACA,EAAMC,OAAEA,EAAM76B,WAAEA,EAAUD,YAAEA,EAAWjE,cAAEA,GAAiBx+E,KAAKqzE,SAAS,CAAC,SAAU,SAAU,aAAc,cAAe,iBAAkBb,IAC7I3nD,EAACA,EAACC,EAAEA,GAAKgwF,GAAQ,CAACjwF,EAAGyuE,EAAQxuE,EAAGyuE,GAAS,CAAC1uE,EAAGyyF,EAAQxyF,EAAGyyF,IAAU/+B,GAClEs6B,EAAe94G,KAAK1C,QAAQsoB,MAAMw/B,YAAc,GAAK,EACrD5F,EAAKkjC,EAAa,EAAIo2B,EACtBlnE,EAAK6wC,EAAc,EAAIq2B,EAC7B,OAAOjuF,GAAKyyF,EAAS99D,EArFF,MAqFyB30B,GAAKyyF,EAAS99D,EArFvC,MAsFjB10B,GAAKyyF,EAAS3rE,EAtFG,MAsFoB9mB,GAAKyyF,EAAS3rE,EAtFlC,KAyFrB7xC,QAAQu5F,EAAQC,EAAQ/mB,GACtB,MAAM7lC,EAAUmwE,GAAI98G,KAAK1C,QAAQ8nD,YAAc,GAC/C,OAAOplD,KAAKw9G,WAAWlkB,EAAQC,EAAQ5sD,EAAS6lC,IAAqBxyE,KAAKy9G,UAAUnkB,EAAQC,EAAQ/mB,GAGtGzyE,iBACE,MAAO,CACL8qB,GAAI7qB,KAAKglF,GAAKhlF,KAAK6qB,GAAK,EACxBC,GAAI9qB,KAAKilF,GAAKjlF,KAAK8qB,GAAK,GAI5B/qB,KAAKhG,GACH,MAAM8wB,EAACA,EAACC,EAAEA,EAACk6D,GAAEA,EAAEC,GAAEA,EAAE3nF,QAAEA,GAAW0C,KAGhC,GADAjG,EAAIupD,QACCw2D,GAAe//G,EAAKuD,GAEvB,OAAOvD,EAAI0pD,UAEbs2D,GAAehgH,EAAKuD,GACpB,MAAMmwC,EAAQ/yC,KAAK4hB,MAAM2oE,EAAKn6D,EAAGk6D,EAAKn6D,GAChCjwB,EAASF,KAAKyhB,KAAKzhB,KAAK8sC,IAAIw9C,EAAKn6D,EAAG,GAAKnwB,KAAK8sC,IAAIy9C,EAAKn6D,EAAG,KAC1D4yF,UAACA,EAASC,QAAEA,EAAOC,YAAEA,EAAWC,UAAEA,GA+S5C,SAAuBj3D,GACrB,MAAMtpD,EAAUspD,EAAKtpD,QACfwgH,EAAiBxgH,EAAQygH,YAAczgH,EAAQygH,WAAW58F,MAC1D68F,EAAe1gH,EAAQygH,YAAczgH,EAAQygH,WAAWx8F,IAC9D,MAAO,CACLm8F,UAAWI,EACXH,QAASK,EACTJ,YAAaK,GAAcr3D,EAAMk3D,GACjCD,UAAWI,GAAcr3D,EAAMo3D,IAvTsBE,CAAcl+G,MAEnEjG,EAAIiZ,UAAU6X,EAAGC,GACjB/wB,EAAI4lD,OAAOlS,GACX1zC,EAAI8qD,YACJ9qD,EAAIirD,OAAO,EAAI44D,EAAa,GAC5B7jH,EAAIkrD,OAAOrqD,EAASijH,EAAW,GAC/B9jH,EAAIigH,YAAc18G,EAAQk9G,kBAC1BzgH,EAAIsrD,SACJ84D,GAAcpkH,EAAK,EAAG6jH,EAAaF,GACnCS,GAAcpkH,EAAKa,GAASijH,EAAWF,GACvC5jH,EAAI0pD,UAGN1jD,UAAUhG,EAAK4pE,GACb,IAAK3jE,KAAKq9G,gBAAe,EAAO15C,GAC9B,OAEF,MAAM25C,OAACA,EAAMC,OAAEA,EAAM76B,WAAEA,EAAUD,YAAEA,EAAWjE,cAAEA,EAAawH,aAAEA,EAAYo4B,cAAEA,EAAe9gH,SAASsoB,MAACA,IAAU5lB,KAEhHjG,EAAIupD,OACJvpD,EAAIiZ,UAAUsqG,EAAQC,GACtBxjH,EAAI4lD,OAAO6+B,GAQX+7B,GAAQxgH,EANQ,CACd8wB,GAAK63D,EAAa,EAClB53D,GAAK23D,EAAc,EACnB9sE,MAAO+sE,EACP7sE,OAAQ4sE,GAEY78D,GAQtB60F,GAAU1gH,EANY,CACpB8wB,GAAK63D,EAAa,EAAKsD,EAAax3E,KAAOoX,EAAMw/B,YAAc,EAC/Dt6B,GAAK23D,EAAc,EAAKuD,EAAaz3E,IAAMqX,EAAMw/B,YAAc,EAC/DzvC,MAAOyoG,EAAczoG,MACrBE,OAAQuoG,EAAcvoG,QAEM+P,GAC9B7rB,EAAI0pD,UAGN1jD,yBAAyB6gD,EAAOtjD,GAC9B,MAAMg7B,EAAQsoB,EAAMmB,OAAOzkD,EAAQsjE,SACnC,IACI7sD,EAAKpZ,GADJ4T,IAAKuc,EAAGtc,KAAMqc,EAAG66B,OAAQu/B,EAAIx/B,MAAOu/B,GAAMpkC,EAAM+iB,UAGrD,GAAIrrC,EACFvkB,EAAMknG,GAAW3iF,EAAOh7B,EAAQK,MAAO4kE,KACvC5nE,EAAMsgH,GAAW3iF,EAAOh7B,EAAQmpE,SAAU1yD,GACtCukB,EAAMjc,gBACRwO,EAAI9W,EACJixE,EAAKrqF,IAELmwB,EAAI/W,EACJkxE,EAAKtqF,OAEF,CACL,MAAM4lE,EAAS3f,EAAMmB,OAAOzkD,EAAQ89G,UAC9B36C,EAAS7f,EAAMmB,OAAOzkD,EAAQ+9G,UAEhC96C,IACF11C,EAAIowF,GAAW16C,EAAQjjE,EAAQi/F,KAAM1xE,GACrCm6D,EAAKi2B,GAAW16C,EAAQjjE,EAAQk+G,KAAMx2B,IAGpCvkB,IACF31C,EAAImwF,GAAWx6C,EAAQnjE,EAAQo+G,KAAM5wF,GACrCm6D,EAAKg2B,GAAWx6C,EAAQnjE,EAAQq+G,KAAM12B,IAG1C,MACM3qB,EADSyiD,GAAa,CAAClyF,EAAAA,EAAGC,EAAAA,EAAGk6D,GAAAA,EAAIC,GAAAA,GAAKrkC,EAAM+iB,WAxJtD,SAAyBzwB,EAAIC,EAAIoS,GAC/B,MAAM16B,EAACA,EAACC,EAAEA,GAAKkyF,GAAiB9pE,EAAIC,EAAIoS,IACjC16B,EAAGm6D,EAAIl6D,EAAGm6D,GAAM+3B,GAAiB7pE,EAAID,EAAIqS,GAChD,MAAO,CAAC16B,EAAAA,EAAGC,EAAAA,EAAGk6D,GAAAA,EAAIC,GAAAA,EAAItvE,MAAOjb,KAAK6hB,IAAIyoE,EAAKn6D,GAAIhV,OAAQnb,KAAK6hB,IAAI0oE,EAAKn6D,IAuJ/DuzF,CAAgB,CAACxzF,EAAAA,EAAGC,EAAAA,GAAI,CAACD,EAAGm6D,EAAIl6D,EAAGm6D,GAAKrkC,EAAM+iB,WAC9C,CAAC94C,EAAAA,EAAGC,EAAAA,EAAGk6D,GAAAA,EAAIC,GAAAA,EAAItvE,MAAOjb,KAAK6hB,IAAIyoE,EAAKn6D,GAAIhV,OAAQnb,KAAK6hB,IAAI0oE,EAAKn6D,IAE5DlF,EAAQtoB,EAAQsoB,MACtB,OAAIA,GAASA,EAAMi0F,QA8GvB,SAAuBjzD,EAAMhG,EAAOtjD,GAElC,MAAO24E,QAASqoC,EAAUC,SAAEA,EAAQC,SAAEA,EAAQp5D,YAAEA,GAAe9nD,EACzD24E,EAuBR,SAAoBA,EAASsoC,EAAUC,GACrC,IAAIC,EAAcxoC,GACdsoC,GAAYC,KACdC,EAAc,CAAC5zF,EAAG0zF,GAAY,EAAGzzF,EAAG0zF,GAAY,IAElD,OAAOz1D,GAAU01D,GA5BDtpC,CAAWmpC,EAAYC,EAAUC,GAC3C5a,EAAWyW,GAAiBz5D,EAAM7mD,IAAKuD,GACvCqY,EAAQiuF,EAASjuF,MAAQsgE,EAAQtgE,MAAQyvC,EACzCvvC,EAAS+tF,EAAS/tF,OAASogE,EAAQpgE,OAASuvC,EAC5C+2D,EA2BR,SAAgCv1D,EAAMhhC,EAAOgL,EAAO+yC,GAClD,MAAMhuD,MAACA,EAAKE,OAAEA,EAAMogE,QAAEA,GAAWrlD,GAC3BirF,QAACA,EAAOC,QAAEA,GAAWl2F,EACrBstB,EAAK,CAACroB,EAAG+7B,EAAK/7B,EAAGC,EAAG87B,EAAK97B,GACzBqoB,EAAK,CAACtoB,EAAG+7B,EAAKo+B,GAAIl6D,EAAG87B,EAAKq+B,IAC1BxgC,EAA8B,SAAnB7+B,EAAM6+B,SArBzB,SAA+BmC,GAC7B,MAAM/7B,EAACA,EAACC,EAAEA,EAACk6D,GAAEA,EAAEC,GAAEA,GAAMr+B,EACjBnC,EAAW/pD,KAAK4hB,MAAM2oE,EAAKn6D,EAAGk6D,EAAKn6D,GAEzC,OAAO45B,EAAWvwC,GAAK,EAAIuwC,EAAWvwC,GAAKuwC,EAAWvwC,IAAM,EAAIuwC,EAAWvwC,GAAKuwC,EAiBnCi6D,CAAsB93D,GAAQ9Z,GAAUlnB,EAAM6+B,UACrFx/B,EAeR,SAAqBtP,EAAOE,EAAQ4uC,GAClC,MAAMxwC,EAAMvZ,KAAKuZ,IAAIwwC,GACf9V,EAAMj0C,KAAKi0C,IAAI8V,GACrB,MAAO,CACL/R,EAAGh4C,KAAK6hB,IAAI5G,EAAQ1B,GAAOvZ,KAAK6hB,IAAI1G,EAAS84B,GAC7CvuC,EAAG1F,KAAK6hB,IAAI5G,EAAQg5B,GAAOj0C,KAAK6hB,IAAI1G,EAAS5B,IApBlC0qG,CAAYhpG,EAAOE,EAAQ4uC,GAClCnkD,EAuBR,SAAoBsmD,EAAMhhC,EAAOgL,EAAO+yC,GACtC,IAAIrjE,EACJ,MAAMrD,EAoBR,SAAqB2pD,EAAM+c,GACzB,MAAM94C,EAACA,EAACm6D,GAAEA,EAAEl6D,EAAEA,EAACm6D,GAAEA,GAAMr+B,EACjBtmD,EAAI5F,KAAKqZ,IAAI+W,EAAGm6D,GAAMthB,EAAUp1D,IAChCtI,EAAIvL,KAAKqZ,IAAI8W,EAAGm6D,GAAMrhB,EAAUn1D,KAChCpV,EAAIuqE,EAAUje,OAAShrD,KAAKC,IAAImwB,EAAGm6D,GACnCxhF,EAAIkgE,EAAUle,MAAQ/qD,KAAKC,IAAIkwB,EAAGm6D,GACxC,MAAO,CACLn6D,EAAGnwB,KAAKqZ,IAAI9N,EAAGxC,GACfqnB,EAAGpwB,KAAKqZ,IAAIzT,EAAGlH,GACfojG,GAAIv2F,GAAKxC,EAAI,GAAK,EAClBy5G,GAAI58G,GAAKlH,EAAI,GAAK,GA9BNwlH,CAAYh4D,EAAM+c,GAE9BrjE,EADqB,UAAnBslB,EAAM0R,SACJunF,GAAiB,CAACnsE,EAAGkU,EAAKo+B,GAAKp+B,EAAK/7B,EAAGzqB,EAAGwmD,EAAKq+B,GAAKr+B,EAAK97B,GAAI8F,EAAOhL,EAAO3oB,GACnD,QAAnB2oB,EAAM0R,SACX,EAAIunF,GAAiB,CAACnsE,EAAGkU,EAAK/7B,EAAI+7B,EAAKo+B,GAAI5kF,EAAGwmD,EAAK97B,EAAI87B,EAAKq+B,IAAKr0D,EAAOhL,EAAO3oB,GAE/Ek0D,GAAoB,EAAGvrC,EAAM0R,UAEnC,OAAOh3B,EAjCGw+G,CAAWl4D,EAAMhhC,EAAO,CAACs2F,UAAWj3F,EAAMgxD,QAAAA,GAAUtS,GACxD1T,EAAK0sD,GAAYzpE,EAAIC,EAAI7yC,GACzBy+G,EAAmB,CAAC95F,KAAMA,EAAKytB,EAAG3+B,IAAK4vD,EAAUn1D,KAAM7T,IAAKgpE,EAAUle,MAAOwwB,QAASA,EAAQznE,MAC9FwwG,EAAmB,CAAC/5F,KAAMA,EAAK7kB,EAAG2T,IAAK4vD,EAAUp1D,IAAK5T,IAAKgpE,EAAUje,OAAQuwB,QAASA,EAAQ1nE,KAEpG,MAAO,CACLsc,EAAGo0F,GAAsBhvD,EAAGplC,EAAGk0F,GAAoBlD,EACnD/wF,EAAGm0F,GAAsBhvD,EAAGnlC,EAAGk0F,GAAoBlD,EACnDnmG,MAAAA,EACAE,OAAAA,EACA4uC,SAAAA,GA5CgBy6D,CAAuBt4D,EAAMtpD,EAAS,CAACqY,MAAAA,EAAOE,OAAAA,EAAQogE,QAAAA,GAAUr1B,EAAM+iB,WAQxF,OAPA/c,EAAK02D,OAASnB,EAAUtxF,EACxB+7B,EAAK22D,OAASpB,EAAUrxF,EACxB87B,EAAK87B,WAAay5B,EAAUxmG,MAC5BixC,EAAK67B,YAAc05B,EAAUtmG,OAC7B+wC,EAAK43B,cAAgB29B,EAAU13D,SAC/BmC,EAAKo/B,aAAe/P,EACpBrvB,EAAKw3D,cAAgBxa,EACdh9C,EA5HIu4D,CAAc7kD,EAAY1Z,EAAOh7B,GAEnC00C,GAIX2iD,GAAev0G,GAAK,iBAEpB,MAAM02G,GAAqB,CACzB5+D,qBAAiBjmD,EACjB0/G,2BAAuB1/G,EACvBkmD,iBAAalmD,EACb28D,gBAAY38D,EACZ48D,sBAAkB58D,EAClBigH,uBAAmBjgH,EACnB6qD,iBAAa7qD,EACbyd,aAASzd,EACTqL,UAAMrL,EACNK,YAAQL,EACR2/G,gBAAY3/G,EACZ4/G,mBAAe5/G,EACf6/G,mBAAe7/G,EACfob,WAAOpb,GAoKT,SAASskH,GAAiBQ,EAAUzuF,EAAOhL,EAAO3oB,GAChD,MAAMi/G,UAACA,EAASjmC,QAAEA,GAAWrlD,EACvB0uF,EAAQD,EAAS3sE,EAAIz1C,EAAMu/F,GAC3B+iB,EAAQF,EAASj/G,EAAInD,EAAMigH,GAC3BryF,EAAKy0F,EAAQ,IAAQpD,EAAUxpE,EAAI,EAAIujC,EAAQznE,KAAOvR,EAAM4tB,GAAKy0F,EACjEx0F,EAAKy0F,EAAQ,IAAQrD,EAAU97G,EAAI,EAAI61E,EAAQ1nE,IAAMtR,EAAM6tB,GAAKy0F,EACtE,OAAO5G,GAAMj+G,KAAKC,IAAIkwB,EAAGC,GAAI,EAAG,KAiBlC,SAASm0F,GAAsBO,EAAY39B,GACzC,MAAM58D,KAACA,EAAIlR,IAAEA,EAAGpZ,IAAEA,EAAGs7E,QAAEA,GAAW4L,EAC5B49B,EAAWx6F,EAAO,EACxB,OAAIA,EAAOtqB,EAAMoZ,GAEPpZ,EAAMoZ,GAAO,GAEnBA,GAAQyrG,EAAavpC,EAAUwpC,IACjCD,EAAazrG,EAAMkiE,EAAUwpC,GAE3B9kH,GAAQ6kH,EAAavpC,EAAUwpC,IACjCD,EAAa7kH,EAAMs7E,EAAUwpC,GAExBD,GAeT,SAASvB,GAAcr3D,EAAM84D,GAC3B,IAAKA,IAAcA,EAAU1nG,QAC3B,OAAO,EAET,MAAMpd,OAACA,EAAM+a,MAAEA,GAAS+pG,EAClBpD,EAAS11D,EAAKtpD,QAAQ8nD,YAAc,EACpClS,EAAK,CAACroB,EAAGjwB,EAAQkwB,EAAGnV,EAAQ2mG,GAC5BnpE,EAAK,CAACtoB,EAAG,EAAGC,EAAGwxF,GACrB,OAAO5hH,KAAK6hB,IAAIqgG,GAAa,EAAG1pE,EAAIC,IAGtC,SAASgrE,GAAcpkH,EAAK+T,EAAQwuG,EAAQoD,GAC1C,IAAKA,IAAcA,EAAU1nG,QAC3B,OAEF,MAAMpd,OAACA,EAAM+a,MAAEA,EAAK/P,KAAEA,EAAI46C,gBAAEA,EAAeC,YAAEA,GAAei/D,EACtDC,EAAejlH,KAAK6hB,IAAIzO,EAASlT,GAAU0hH,EACjDviH,EAAI8qD,YACJk1D,GAAehgH,EAAK2lH,GACpB5F,GAAe//G,EAAK2lH,GACpB3lH,EAAIirD,OAAO26D,GAAehqG,GAC1B5b,EAAIkrD,OAAOn3C,EAASwuG,EAAQ,GAC5BviH,EAAIkrD,OAAO06D,EAAchqG,IACZ,IAAT/P,GACF7L,EAAI+sD,UAAYtG,GAAmBC,EACnC1mD,EAAIgrD,YACJhrD,EAAI6L,OACJ7L,EAAIigH,YAAc,eAElBjgH,EAAIigH,YAAc0F,EAAUlF,kBAE9BzgH,EAAIsrD,SAnPN43D,GAAehrF,SAAW,CACxBgmF,kBAAkB,EAClB8F,WAAY,CACV/lG,SAAS,EACTuJ,IAAK5oB,OAAOP,OAAO,GAAIgnH,IACvBx5G,MAAM,EACNhL,OAAQ,GACRumB,MAAOxoB,OAAOP,OAAO,GAAIgnH,IACzBzpG,MAAO,GAETuhD,WAAY,GACZC,iBAAkB,EAClBqjD,kBAAmB,cACnBp1D,YAAa,EACb3rB,SAAS,EACTgtC,cAAUlsE,EACVqrB,MAAO,CACL46B,gBAAiB,kBACjBy5D,sBAAuB,cACvBhjD,eAAgB,OAChBxW,YAAa,QACbyW,WAAY,GACZC,iBAAkB,EAClBC,gBAAiB,QACjB88B,aAAc,EACdsmB,kBAAmB,cACnBp1D,YAAa,EACbjG,MAAO,OACP06D,QAAS,KACTt1D,kBAAchqD,EACdylG,cAAUzlG,EACVyd,SAAS,EACT+oC,KAAM,CACJC,YAAQzmD,EACR0mD,gBAAY1mD,EACZ0qB,UAAM1qB,EACN8D,WAAO9D,EACP6kD,OAAQ,QAEVvpC,YAAQtb,EACR07E,QAAS,EACT3+C,SAAU,SACVmtB,SAAU,EACVy1D,WAAY,EACZC,cAAe,EACfC,cAAe,EACfrzD,UAAW,SACXi2B,qBAAiBziF,EACjBwiF,gBAAiB,EACjBpnE,WAAOpb,EACPshH,QAAS,EACT0C,cAAUhkH,EACVuhH,QAAS,EACT0C,cAAUjkH,GAEZqmE,aAASrmE,EACT2/G,WAAY,EACZC,cAAe,EACfC,cAAe,EACfz8G,WAAOpD,EACPihH,UAAMjhH,EACNgiG,UAAMhiG,EACN6gH,SAAU,IACVO,UAAMphH,EACNmhH,UAAMnhH,EACN8gH,SAAU,KAGZ4B,GAAeh/G,YAAc,CAC3B8/G,WAAY,CACV58F,MAAO,CACLyhC,WAAW,GAEbrhC,IAAK,CACHqhC,WAAW,GAEbA,WAAW,IAIfq6D,GAAehjC,cAAgB,CAC7Bx5B,YAAa,SAqKf,MAAMm/D,WAA0B7lC,GAE9Bh6E,QAAQu5F,EAAQC,EAAQ/mB,GACtB,OA2DJ,SAAwBp3E,EAAGykH,EAASp7D,EAAUW,GAC5C,MAAMzvC,MAACA,EAAKE,OAAEA,GAAUgqG,EAClBh3C,EAASg3C,EAAQ1sC,gBAAe,GAChC2sC,EAAUnqG,EAAQ,EAClBoqG,EAAUlqG,EAAS,EAEzB,GAAIiqG,GAAW,GAAKC,GAAW,EAC7B,OAAO,EAGT,MAAMtyE,EAAQX,GAAU2X,GAAY,GAC9Bq0D,EAAe1zD,EAAc,GAAK,EAClC46D,EAAWtlH,KAAKuZ,IAAIw5B,GACpBwyE,EAAWvlH,KAAKi0C,IAAIlB,GACpBt0C,EAAIuB,KAAK8sC,IAAIw4E,GAAY5kH,EAAEyvB,EAAIg+C,EAAOh+C,GAAKo1F,GAAY7kH,EAAE0vB,EAAI+9C,EAAO/9C,GAAI,GACxE1xB,EAAIsB,KAAK8sC,IAAIy4E,GAAY7kH,EAAEyvB,EAAIg+C,EAAOh+C,GAAKm1F,GAAY5kH,EAAE0vB,EAAI+9C,EAAO/9C,GAAI,GAC9E,OAAQ3xB,EAAIuB,KAAK8sC,IAAIs4E,EAAUhH,EAAc,GAAO1/G,EAAIsB,KAAK8sC,IAAIu4E,EAAUjH,EAAc,IAAO,OA3EvFoH,CAAe,CAACr1F,EAAGyuE,EAAQxuE,EAAGyuE,GAASv5F,KAAKqzE,SAAS,CAAC,QAAS,UAAWb,GAAmBxyE,KAAK1C,QAAQmnD,SAAUzkD,KAAK1C,QAAQ8nD,aAG1IrlD,eAAeyyE,GACb,OAAOqoC,GAAmB76G,KAAKqzE,SAAS,CAAC,IAAK,IAAK,QAAS,UAAWb,IAGzEzyE,KAAKhG,GACH,MAAM4b,MAACA,EAAKE,OAAEA,EAAMvY,QAAEA,GAAW0C,KAC3B6oE,EAAS7oE,KAAKmzE,iBAEpBp5E,EAAIupD,OACJtwC,GAAUjZ,EAAKiG,KAAM1C,EAAQmnD,UAC7Bs1D,GAAehgH,EAAKiG,KAAK1C,SACzBvD,EAAI8qD,YACJ9qD,EAAI+sD,UAAYxpD,EAAQkjD,gBACxB,MAAM6E,EAASy0D,GAAe//G,EAAKuD,GACnCvD,EAAI8lH,QAAQh3C,EAAOh+C,EAAGg+C,EAAO/9C,EAAGjV,EAAS,EAAGF,EAAQ,EAAGzB,GAAK,EAAG,EAAG,EAAIA,IACtEna,EAAI6L,OACAy/C,IACFtrD,EAAIigH,YAAc18G,EAAQk9G,kBAC1BzgH,EAAIsrD,UAENtrD,EAAI0pD,UAGN1jD,yBAAyB6gD,EAAOtjD,GAC9B,OAAOg+G,GAAa16D,EAAOtjD,IAK/BsiH,GAAkBl3G,GAAK,oBAEvBk3G,GAAkB3tF,SAAW,CAC3BgmF,kBAAkB,EAClBgC,sBAAuB,cACvB/iD,WAAY,GACZC,iBAAkB,EAClBqjD,kBAAmB,cACnBp1D,YAAa,EACb3rB,SAAS,EACTgrB,SAAU,EACVy1D,WAAY,EACZC,cAAe,EACfC,cAAe,EACfoB,UAAMjhH,EACNgiG,UAAMhiG,EACN6gH,SAAU,IACVO,UAAMphH,EACNmhH,UAAMnhH,EACN8gH,SAAU,KAGZuE,GAAkB3lC,cAAgB,CAChCx5B,YAAa,QACbD,gBAAiB,SAsBnB,MAAM2/D,WAAwBpmC,GAE5Bh6E,QAAQu5F,EAAQC,EAAQ/mB,GACtB,MAAM3nD,EAACA,EAACC,EAAEA,GAAKgwF,GAAQ,CAACjwF,EAAGyuE,EAAQxuE,EAAGyuE,GAASv5F,KAAKmzE,eAAeX,GAAmB1lC,IAAW9sC,KAAK1C,QAAQmnD,WAC9G,OAAOo0D,GAAWhuF,EAAGC,EAAG9qB,KAAKqzE,SAAS,CAAC,IAAK,IAAK,QAAS,UAAWb,GAAmBxyE,KAAK1C,QAAQ8nD,aAGvGrlD,eAAeyyE,GACb,OAAOqoC,GAAmB76G,KAAKqzE,SAAS,CAAC,IAAK,IAAK,QAAS,UAAWb,IAGzEzyE,KAAKhG,GACH,IAAKiG,KAAK1C,QAAQu8G,QAChB,OAEF,MAAMyD,OAACA,EAAMC,OAAEA,EAAM76B,WAAEA,EAAUD,YAAEA,EAAWnlF,QAAEA,GAAW0C,KAC3DjG,EAAIupD,OACJtwC,GAAUjZ,EAAKiG,KAAM1C,EAAQmnD,UA4GjC,SAAqB1qD,EAAK6C,GACxB,MAAMwjH,OAACA,EAAMC,OAAEA,EAAMC,gBAAEA,EAAehjH,QAAEA,GAAWV,EACnD,IAAK0jH,GAAmB1jH,EAAQ81E,QAAQ0tC,EAAQC,GAC9C,OAEF,MAAME,EAAUjjH,EAAQijH,QAExBxmH,EAAIupD,OACJvpD,EAAI8qD,YAEJ,IADei1D,GAAe//G,EAAKwmH,GAEjC,OAAOxmH,EAAI0pD,UAEb,MAAM+8D,eAACA,EAAcC,aAAEA,GAczB,SAAkC7jH,EAAS06B,GACzC,MAAMzM,EAACA,EAACC,EAAEA,EAACnV,MAAEA,EAAKE,OAAEA,GAAUjZ,EACxB0/G,EAaR,SAAmC1/G,EAAS06B,GAC1C,MAAM3hB,MAACA,EAAKE,OAAEA,EAAMvY,QAAEA,GAAWV,EAC3B0/G,EAASh/G,EAAQijH,QAAQ/6D,OAASloD,EAAQ8nD,YAAc,EAC9D,GAAiB,UAAb9tB,EACF,OAAO3hB,EAAQ2mG,EACV,GAAiB,WAAbhlF,EACT,OAAOzhB,EAASymG,EAElB,OAAQA,EArBOoE,CAA0B9jH,EAAS06B,GAClD,IAAIkpF,EAAgBC,EACH,SAAbnpF,GAAoC,UAAbA,GACzBkpF,EAAiB,CAAC31F,EAAGA,EAAIyxF,EAAQxxF,EAAAA,GACjC21F,EAAe,CAAC51F,EAAG21F,EAAe31F,EAAGC,EAAG01F,EAAe11F,EAAIjV,KAG3D2qG,EAAiB,CAAC31F,EAAAA,EAAGC,EAAGA,EAAIwxF,GAC5BmE,EAAe,CAAC51F,EAAG21F,EAAe31F,EAAIlV,EAAOmV,EAAG01F,EAAe11F,IAEjE,MAAO,CAAC01F,eAAAA,EAAgBC,aAAAA,GA1BeE,CAAyB/jH,EAAS0jH,IACnEM,UAACA,EAASC,QAAEA,GAuCpB,SAA6BjkH,EAAS06B,EAAUkpF,GAC9C,MAAM11F,EAACA,EAACnV,MAAEA,EAAKE,OAAEA,EAAMvY,QAAEA,GAAWV,EAC9BukB,EAAQ7jB,EAAQijH,QAAQp/F,MACxBrO,EAaR,SAA8BwkB,EAAUh6B,GACtC,MAAMwV,EAAOxV,EAAQwV,KACrB,GAAiB,SAAbwkB,GAAoC,QAAbA,EACzB,OAAQxkB,EAEV,OAAOA,EAlBMguG,CAAqBxpF,EAAUh6B,EAAQijH,SACpD,IAAIK,EAAWC,EACE,SAAbvpF,GAAoC,UAAbA,GACzBspF,EAAY,CAAC/1F,EAAG21F,EAAe31F,EAAGC,EAAGA,EAAIwuF,GAAQzjG,EAAQsL,IACzD0/F,EAAU,CAACh2F,EAAG+1F,EAAU/1F,EAAI/X,EAAMgY,EAAG81F,EAAU91F,KAG/C81F,EAAY,CAAC/1F,EAAG21F,EAAe31F,EAAIyuF,GAAQ3jG,EAAOwL,GAAQ2J,EAAG01F,EAAe11F,GAC5E+1F,EAAU,CAACh2F,EAAG+1F,EAAU/1F,EAAGC,EAAG81F,EAAU91F,EAAIhY,IAE9C,MAAO,CAAC8tG,UAAAA,EAAWC,QAAAA,GApDUE,CAAoBnkH,EAAS0jH,EAAiBE,IACvED,EAAQ/6D,OAAS,GAA6B,IAAxBloD,EAAQ8nD,eAChCrrD,EAAIirD,OAAOw7D,EAAe31F,EAAG21F,EAAe11F,GAC5C/wB,EAAIkrD,OAAOw7D,EAAa51F,EAAG41F,EAAa31F,IAE1C/wB,EAAIirD,OAAO47D,EAAU/1F,EAAG+1F,EAAU91F,GAClC/wB,EAAIkrD,OAAO47D,EAAQh2F,EAAGg2F,EAAQ/1F,GAC9B,MAAMk2F,EAAelG,GAAQ,CAACjwF,EAAGu1F,EAAQt1F,EAAGu1F,GAASzjH,EAAQu2E,iBAAkBrmC,IAAWxvC,EAAQmnD,WAClG1qD,EAAIkrD,OAAO+7D,EAAan2F,EAAGm2F,EAAal2F,GACxC/wB,EAAIsrD,SACJtrD,EAAI0pD,UAnIFw9D,CAAYlnH,EAAKiG,MACjBu6G,GAAQxgH,EAAKiG,KAAM1C,GACnBm9G,GAAU1gH,EAAK,CAAC8wB,EAAGyyF,EAAQxyF,EAAGyyF,EAAQ5nG,MAAO+sE,EAAY7sE,OAAQ4sE,GAAcnlF,GAC/EvD,EAAI0pD,UAIN1jD,yBAAyB6gD,EAAOtjD,GAC9B,MAAM6xB,EAASqqF,GAAel8G,GAA8D69G,GAAcv6D,EAAOtjD,GAAxEu9G,GAAmBS,GAAa16D,EAAOtjD,IAC1E24E,EAAUltB,GAAUzrD,EAAQ24E,SAC5BimC,EAAY7B,GAAiBz5D,EAAM7mD,IAAKuD,GACxC4jH,EA+EV,SAAqB/xF,EAAOlK,EAAM3nB,EAAS24E,GACzC,MAAMtgE,EAAQsP,EAAKtP,MAAQsgE,EAAQtgE,MAAQrY,EAAQ8nD,YAC7CvvC,EAASoP,EAAKpP,OAASogE,EAAQpgE,OAASvY,EAAQ8nD,YAChD9tB,EAAWiiF,GAAWj8G,EAAQg6B,UAEpC,MAAO,CACLzM,EAAGs2F,GAAkBhyF,EAAMtE,EAAGlV,EAAOrY,EAAQu+G,QAASvkF,EAASzM,GAC/DC,EAAGq2F,GAAkBhyF,EAAMrE,EAAGjV,EAAQvY,EAAQw+G,QAASxkF,EAASxM,GAChEnV,MAAAA,EACAE,OAAAA,GAxFgBurG,CAAYjyF,EAAO+sF,EAAW5+G,EAAS24E,GACjD6iC,EAAex7G,EAAQ8nD,YAAc,EACrCkV,EAAa,CACjB8lD,OAAQjxF,EAAMtE,EACdw1F,OAAQlxF,EAAMrE,KACXo2F,EACH5D,OAAQ4D,EAAQr2F,EAAIorD,EAAQznE,KAAOsqG,EACnCyE,OAAQ2D,EAAQp2F,EAAImrD,EAAQ1nE,IAAMuqG,EAClCp2B,WAAYw5B,EAAUvmG,MACtB8sE,YAAay5B,EAAUrmG,QAGzB,OADAykD,EAAWgmD,gBAAkBhjH,EAAQijH,QAAQvoG,SAkKjD,SAAgCsiD,EAAYh9D,EAASmnD,GACnD,MAAMntB,EAAWh6B,EAAQg6B,SACzB,GAAiB,SAAbA,GAAoC,UAAbA,GAAqC,QAAbA,GAAmC,WAAbA,EACvE,OAAOA,EAET,OAKF,SAAoCgjC,EAAYh9D,EAASmnD,GACvD,MAAM55B,EAACA,EAACC,EAAEA,EAACnV,MAAEA,EAAKE,OAAEA,EAAMuqG,OAAEA,EAAMC,OAAEA,GAAU/lD,EACxCuO,EAAS,CAACh+C,EAAGA,EAAIlV,EAAQ,EAAGmV,EAAGA,EAAIjV,EAAS,GAC5CsL,EAAQ7jB,EAAQ6jB,MAChB06F,EAAUvC,GAAQ3jG,EAAOwL,GACzB26F,EAAUxC,GAAQzjG,EAAQsL,GAC1BkgG,EAAU,CAACx2F,EAAGA,EAAIgxF,EAAShxF,EAAIgxF,EAAShxF,EAAIlV,GAC5C2rG,EAAU,CAACx2F,EAAIgxF,EAAShxF,EAAIjV,EAAQiV,EAAGA,EAAIgxF,GAC3CtgH,EAAS,GACf,IAAK,IAAI6K,EAAQ,EAAGA,EAAQ,EAAGA,IAAS,CACtC,MAAM26G,EAAelG,GAAQ,CAACjwF,EAAGw2F,EAAQh7G,GAAQykB,EAAGw2F,EAAQj7G,IAASwiE,EAAQ/7B,GAAU2X,IACvFjpD,EAAO2F,KAAK,CACVm2B,SAAUiN,GAAUl+B,GACpBqnC,SAAUC,GAAsBqzE,EAAc,CAACn2F,EAAGu1F,EAAQt1F,EAAGu1F,MAGjE,OAAO7kH,EAAO8zB,KAAK,CAACn2B,EAAGC,IAAMD,EAAEu0C,SAAWt0C,EAAEs0C,UAAU,GAAGpW,SArBlDiqF,CAA2BjnD,EAAYh9D,EAASmnD,GAvKG+8D,CAAuBlnD,EAAYh9D,EAAQijH,QAASjjH,EAAQmnD,UAC7G6V,GAgFX,SAAS6mD,GAAkBhgG,EAAO8D,EAAMq3F,EAAS,EAAGhlF,GAClD,OAAOnW,EAAQgwC,GAAoBlsC,EAAMqS,GAAYglF,EA7EvD6D,GAAgBz3G,GAAK,kBAErBy3G,GAAgBluF,SAAW,CACzBgmF,kBAAkB,EAClBz3D,gBAAiB,cACjBy5D,sBAAuB,cACvBhjD,eAAgB,OAChBC,WAAY,GACZC,iBAAkB,EAClBC,gBAAiB,QACjB88B,aAAc,EACdsmB,kBAAmB,cACnBp1D,YAAa,EACbm7D,QAAS,CACPtpD,eAAgB,OAChBxW,iBAAalmD,EACb28D,WAAY,GACZC,iBAAkB,EAClBC,gBAAiB,QACjBhS,YAAa,EACbptC,SAAS,EACTwtC,OAAQ,EACRluB,SAAU,OACVxkB,KAAM,EACNqO,MAAO,OAETg+B,MAAO,QACP06D,QAAS,KACTpgF,SAAS,EACTsnB,KAAM,CACJC,YAAQzmD,EACR0mD,gBAAY1mD,EACZ0qB,UAAM1qB,EACN8D,WAAO9D,EACP6kD,YAAQ7kD,GAEVsb,YAAQtb,EACR07E,QAAS,EACT3+C,SAAU,SACVmtB,SAAU,EACVy1D,WAAY,EACZC,cAAe,EACfC,cAAe,EACfrzD,UAAW,SACXi2B,qBAAiBziF,EACjBwiF,gBAAiB,EACjBpnE,WAAOpb,EACPshH,QAAS,EACTL,UAAMjhH,EACNgiG,UAAMhiG,EACN6gH,SAAU,IACV3B,YAAQl/G,EACRuhH,QAAS,EACTH,UAAMphH,EACNmhH,UAAMnhH,EACN8gH,SAAU,IACV3B,YAAQn/G,GAGV4lH,GAAgBlmC,cAAgB,CAC9Bx5B,YAAa,SAyGf,MAAMlc,GAAY,CAAC,OAAQ,SAAU,MAAO,SAqB5C,MAAMk9E,WAAwB1nC,GAE5Bh6E,QAAQu5F,EAAQC,EAAQ/mB,GACtB,MAAM78D,MAACA,GAAS3V,KAAKqzE,SAAS,CAAC,SAAUb,GACzC,OA7zCJ,SAAsBrjD,EAAO05C,EAAQnkB,EAAQU,GAC3C,IAAKj2B,IAAU05C,GAAUnkB,GAAU,EACjC,OAAO,EAET,MAAMo0D,EAAe1zD,EAAc,GAAK,EACxC,OAAQ1qD,KAAK8sC,IAAIrY,EAAMtE,EAAIg+C,EAAOh+C,EAAG,GAAKnwB,KAAK8sC,IAAIrY,EAAMrE,EAAI+9C,EAAO/9C,EAAG,IAAOpwB,KAAK8sC,IAAIkd,EAASo0D,EAAc,GAwzCrG4I,CAAa,CAAC72F,EAAGyuE,EAAQxuE,EAAGyuE,GAASv5F,KAAKmzE,eAAeX,GAAmB78D,EAAQ,EAAG3V,KAAK1C,QAAQ8nD,aAG7GrlD,eAAeyyE,GACb,OAAOumC,GAAsB/4G,KAAMwyE,GAGrCzyE,KAAKhG,GACH,MAAMuD,EAAU0C,KAAK1C,QACf8nD,EAAc9nD,EAAQ8nD,YAC5B,GAAI9nD,EAAQonD,OAAS,GACnB,OAEF3qD,EAAIupD,OACJvpD,EAAI+sD,UAAYxpD,EAAQkjD,gBACxBu5D,GAAehgH,EAAKuD,GACpB,MAAM+nD,EAASy0D,GAAe//G,EAAKuD,GACnCA,EAAQ8nD,YAAc,EACtBhB,GAAUrqD,EAAKuD,EAAS0C,KAAK6qB,EAAG7qB,KAAK8qB,GACjCu6B,IAAWu0D,GAAgBt8G,EAAQknD,cACrCzqD,EAAIigH,YAAc18G,EAAQk9G,kBAC1BzgH,EAAIsrD,UAENtrD,EAAI0pD,UACJnmD,EAAQ8nD,YAAcA,EAGxBrlD,yBAAyB6gD,EAAOtjD,GAC9B,OAAOs+G,GAAqBh7D,EAAOtjD,IAIvCmkH,GAAgB/4G,GAAK,kBAErB+4G,GAAgBxvF,SAAW,CACzBgmF,kBAAkB,EAClBgC,sBAAuB,cACvB/iD,WAAY,GACZC,iBAAkB,EAClBqjD,kBAAmB,cACnBp1D,YAAa,EACb3rB,SAAS,EACT+qB,WAAY,SACZE,OAAQ,GACRD,SAAU,EACVy1D,WAAY,EACZC,cAAe,EACfC,cAAe,EACfyB,QAAS,EACTL,UAAMjhH,EACNgiG,UAAMhiG,EACN6gH,SAAU,IACV3B,YAAQl/G,EACRuhH,QAAS,EACTH,UAAMphH,EACNmhH,UAAMnhH,EACN8gH,SAAU,IACV3B,YAAQn/G,GAGVknH,GAAgBxnC,cAAgB,CAC9Bx5B,YAAa,QACbD,gBAAiB,SAGnB,MAAMmhE,WAA0B5nC,GAC9Bh6E,QAAQu5F,EAAQC,EAAQ/mB,GACtB,OAAOxyE,KAAK1C,QAAQonD,QAAU,IAAO1kD,KAAK8gD,SAASlmD,OAAS,GAiGhE,SAA0Bs0B,EAAQrE,EAAGC,EAAG0nD,GACtC,IAAIovC,GAAW,EACXzwE,EAAIjiB,EAAOA,EAAOt0B,OAAS,GAAGy4E,SAAS,CAAC,KAAM,MAAOb,GACzD,IAAK,MAAMrjD,KAASD,EAAQ,CAC1B,MAAMkiB,EAAIjiB,EAAMkkD,SAAS,CAAC,KAAM,MAAOb,GAClCphC,EAAEywE,GAAK/2F,GAAQqmB,EAAE0wE,GAAK/2F,GAAMD,GAAKsmB,EAAE2wE,GAAK1wE,EAAE0wE,KAAOh3F,EAAIsmB,EAAEywE,KAAO1wE,EAAE0wE,GAAKzwE,EAAEywE,IAAMzwE,EAAE0wE,KAClFF,GAAYA,GAEdzwE,EAAIC,EAEN,OAAOwwE,EA3G4DG,CAAiB/hH,KAAK8gD,SAAUw4C,EAAQC,EAAQ/mB,GAGnHzyE,eAAeyyE,GACb,OAAOumC,GAAsB/4G,KAAMwyE,GAGrCzyE,KAAKhG,GACH,MAAM+mD,SAACA,EAAQxjD,QAAEA,GAAW0C,KAC5BjG,EAAIupD,OACJvpD,EAAI8qD,YACJ9qD,EAAI+sD,UAAYxpD,EAAQkjD,gBACxBu5D,GAAehgH,EAAKuD,GACpB,MAAM+nD,EAASy0D,GAAe//G,EAAKuD,GACnC,IAAIq+E,GAAQ,EACZ,IAAK,MAAMlyE,KAAMq3C,EACX66B,GACF5hF,EAAIirD,OAAOv7C,EAAGohB,EAAGphB,EAAGqhB,GACpB6wD,GAAQ,GAER5hF,EAAIkrD,OAAOx7C,EAAGohB,EAAGphB,EAAGqhB,GAGxB/wB,EAAIgrD,YACJhrD,EAAI6L,OAEAy/C,IACFtrD,EAAIigH,YAAc18G,EAAQk9G,kBAC1BzgH,EAAIsrD,UAENtrD,EAAI0pD,UAGN1jD,yBAAyB6gD,EAAOtjD,GAC9B,MAAMutB,EAACA,EAACC,EAAEA,EAACnV,MAAEA,EAAKE,OAAEA,GAAU+lG,GAAqBh7D,EAAOtjD,IACpD0kH,MAACA,EAAKt9D,OAAEA,EAAMD,SAAEA,EAAQW,YAAEA,GAAe9nD,EACzC2+G,EAAa72D,EAAc,EAC3BtE,EAAW,GACXrT,EAAS,EAAIv5B,GAAM8tG,EACzB,IAAIr9D,EAAMF,EAAW3Y,GACrB,IAAK,IAAIjxC,EAAI,EAAGA,EAAImnH,EAAOnnH,IAAK8pD,GAAOlX,EAAO,CAC5C,MAAMkB,EAAMj0C,KAAKi0C,IAAIgW,GACf1wC,EAAMvZ,KAAKuZ,IAAI0wC,GACrB7D,EAAS3/C,KAAK,CACZM,KAAM,QACNwgH,YAAa,QACb3nD,WAAY,CACVzvC,EAAGA,EAAI8jB,EAAM+V,EACb55B,EAAGA,EAAI7W,EAAMywC,EACbo9D,GAAIj3F,EAAI8jB,GAAO+V,EAASu3D,GACxB4F,GAAI/2F,EAAI7W,GAAOywC,EAASu3D,MAI9B,MAAO,CAACpxF,EAAAA,EAAGC,EAAAA,EAAGnV,MAAAA,EAAOE,OAAAA,EAAQirC,SAAAA,EAAUohE,eAAgB,CAACr3F,EAAAA,EAAGC,EAAAA,KAI/D62F,GAAkBj5G,GAAK,oBAEvBi5G,GAAkB1vF,SAAW,CAC3BgmF,kBAAkB,EAClBgC,sBAAuB,cACvBhjD,eAAgB,OAChBC,WAAY,GACZC,iBAAkB,EAClBC,gBAAiB,QACjBojD,kBAAmB,cACnBp1D,YAAa,EACb3rB,SAAS,EACTtK,MAAO,CACLu1B,OAAQ,GAEVA,OAAQ,GACRD,SAAU,EACVy1D,WAAY,EACZC,cAAe,EACfC,cAAe,EACf4H,MAAO,EACPnG,QAAS,EACTL,UAAMjhH,EACNgiG,UAAMhiG,EACN6gH,SAAU,IACV3B,YAAQl/G,EACRuhH,QAAS,EACTH,UAAMphH,EACNmhH,UAAMnhH,EACN8gH,SAAU,IACV3B,YAAQn/G,GAGVonH,GAAkB1nC,cAAgB,CAChCx5B,YAAa,QACbD,gBAAiB,SAiBnB,MAAM2hE,GAAkB,CACtBp0G,IAAKiuG,GACL6D,QAASD,GACTh6F,MAAOu6F,GACPv5D,KAAMq2D,GACN9tF,MAAOsyF,GACPW,QAAST,IAWXhpH,OAAO+C,KAAKymH,IAAiBppH,QAAQqF,IACnC6zB,GAASiwB,SAAS,YAAYigE,GAAgB/jH,GAAKsK,GAAM,CACvDk6C,UAAW,yBAIf,MAAMy/D,GAAgB,CACpBt/G,OAAQpK,OAAOP,QAQjB,SAASkqH,GAAY7gH,EAAO,QAC1B,OAAI0gH,GAAgB1gH,GACXA,GAETynD,QAAQC,KAAK,6BAA6B1nD,4BACnC,QAUT,SAAS2jE,GAAexkB,EAAOs2D,EAAO55G,EAASkkD,GAC7C,MAAMmZ,EAsCR,SAA2B/Z,EAAO2hE,EAAU/gE,GAC1C,GAAa,UAATA,GAA6B,SAATA,GAA4B,WAATA,EACzC,OAAO6gE,GAET,OAAO,IAAIxnD,GAAWja,EAAO2hE,GA1CVC,CAAkB5hE,EAAOtjD,EAAQq9D,WAAYnZ,GAE1D02D,EAAchB,EAAMgB,YACpBp3D,EAoGR,SAAwBA,EAAUo3D,GAChC,MAAM9iD,EAAQ8iD,EAAYt9G,OACpBumB,EAAQ2/B,EAASlmD,OAEvB,GAAIumB,EAAQi0C,EAAO,CACjB,MAAMlyD,EAAMkyD,EAAQj0C,EACpB2/B,EAASx6C,OAAO6a,EAAO,KAAM,IAAI1gB,MAAMyC,SAC9Bie,EAAQi0C,GACjBtU,EAASx6C,OAAO8uD,EAAOj0C,EAAQi0C,GAEjC,OAAOtU,EA9GU2hE,CAAevL,EAAMp2D,SAAUo3D,GAEhD,IAAK,IAAIr9G,EAAI,EAAGA,EAAIq9G,EAAYt9G,OAAQC,IAAK,CAC3C,MAAM6nH,EAAoBxK,EAAYr9G,GAChC+B,EAAU+lH,GAAmB7hE,EAAUjmD,EAAG6nH,EAAkBjhH,MAC5DurD,EAAW01D,EAAkB/1D,WAAW1I,GAAWrD,EAAOhkD,EAAS8lH,IACnEpoD,EAAa19D,EAAQgmH,yBAAyBhiE,EAAOoM,GAE3DsN,EAAW/vC,KAAOs4F,GAAOvoD,GAErB,aAAcA,IAChBwoD,GAAkBlmH,EAAS09D,EAAYtN,EAAU2N,UAG1CL,EAAWxZ,UAGfvV,GAAQ3uC,EAAQiuB,IAKnBlyB,OAAOP,OAAOwE,EAAS09D,GAGzBA,EAAWh9D,QAAUylH,GAAyB/1D,GAE9C2N,EAAW53D,OAAOnG,EAAS09D,IAI/B,SAASuoD,GAAOvoD,GACd,OAAOt1C,MAAMs1C,EAAWzvC,IAAM7F,MAAMs1C,EAAWxvC,GAUjD,SAASg4F,GAAkBE,GAAaliE,SAACA,EAAQohE,eAAEA,GAAiBl1D,EAAU2N,GAC5E,MAAMsoD,EAAcD,EAAYliE,WAAakiE,EAAYliE,SAAW,IACpEmiE,EAAYroH,OAASkmD,EAASlmD,OAC9B,IAAK,IAAIC,EAAI,EAAGA,EAAIimD,EAASlmD,OAAQC,IAAK,CACxC,MAAMf,EAAagnD,EAASjmD,GACtBy/D,EAAaxgE,EAAWwgE,WACxB4oD,EAAaP,GAAmBM,EAAapoH,EAAGf,EAAW2H,KAAMygH,GACjEiB,EAAcn2D,EAASlzD,EAAWmoH,aAAa72D,SAAStxD,GAC9DwgE,EAAWh9D,QAAUylH,GAAyBI,GAC9CxoD,EAAW53D,OAAOmgH,EAAY5oD,IAIlC,SAASqoD,GAAmB7hE,EAAUz6C,EAAO5E,EAAMygH,GACjD,MAAMkB,EAAejB,GAAgBG,GAAY7gH,IACjD,IAAI7E,EAAUkkD,EAASz6C,GAOvB,OANKzJ,GAAaA,aAAmBwmH,IACnCxmH,EAAUkkD,EAASz6C,GAAS,IAAI+8G,EAC5B18G,GAASw7G,IACXvpH,OAAOP,OAAOwE,EAASslH,IAGpBtlH,EAGT,SAASmmH,GAAyB/1D,GAChC,MAAMo2D,EAAejB,GAAgBG,GAAYt1D,EAASvrD,OACpDjG,EAAS,GACfA,EAAOkN,GAAKskD,EAAStkD,GACrBlN,EAAOiG,KAAOurD,EAASvrD,KACvBjG,EAAOwkG,SAAWhzC,EAASgzC,SAC3BrnG,OAAOP,OAAOoD,EACZ6nH,GAAWr2D,EAAUo2D,EAAanxF,UAClCoxF,GAAWr2D,EAAUo2D,EAAanpC,gBACpC,IAAK,MAAM+O,KAAQiuB,GACjBz7G,EAAOwtF,GAAQh8B,EAASg8B,GAE1B,OAAOxtF,EAGT,SAAS6nH,GAAWr2D,EAAUs2D,GAC5B,MAAM9nH,EAAS,GACf,IAAK,MAAMkT,KAAQ/V,OAAO+C,KAAK4nH,GAAO,CACpC,MAAMC,EAAUD,EAAK50G,GACf/Q,EAAQqvD,EAASt+C,GACvBlT,EAAOkT,GAAQhI,GAAS68G,GAAWF,GAAW1lH,EAAO4lH,GAAW5lH,EAElE,OAAOnC,EAGT,SAASyoD,GAAWrD,EAAOhkD,EAASw7G,GAClC,OAAOx7G,EAAQwiE,WAAaxiE,EAAQwiE,SAAWzmE,OAAOP,OAAOO,OAAOC,OAAOgoD,EAAMqD,cAAe,CAC9FrnD,QAAAA,EACA8L,GAAI0vG,EAAW1vG,GACfjH,KAAM,gBAoBV,MAAM+hH,GAAc,IAAIj+G,IAExB,IAAI6yG,GAAa,CACf1vG,GAAI,qBALQ,QAeZ3I,gBACEqtF,GAAM3F,SAAS06B,IA5oDnB,SAAwBsB,EAAK1vG,EAAK2vG,EAAKC,GAAS,GAC9C,MAAM57B,EAAQ27B,EAAIh5G,MAAM,KACxB,IAAI7P,EAAI,EACR,IAAK,MAAMq+G,KAAOnlG,EAAIrJ,MAAM,KAAM,CAChC,MAAMuuG,EAAMlxB,EAAMltF,KAClB,GAAIiqB,SAASo0F,EAAK,IAAMp0F,SAASm0F,EAAK,IACpC,MAEF,GAAID,GAAYC,EAAKC,GAAM,CACzB,GAAIyK,EACF,MAAM,IAAI5iH,MAAM,GAAG0iH,MAAQC,wBAA0B3vG,2BAErD,OAAO,GAIb,OAAO,EA+nDA6vG,CAAe,WAAY,MAAOx2B,GAAM8I,SAAS,KACpDhtC,QAAQC,KAAK,8GAGbikC,GAAMn7D,SAAS1zB,IAAI,0BAA2B,CAC5CgiH,QAAS,GACTx/D,KAAM,GACNk1B,QAAS,MAKfl2E,kBACEqtF,GAAM+I,WAAWgsB,KAGnBpiH,WAAW6gD,GACT4iE,GAAYjlH,IAAIqiD,EAAO,CACrBs3D,YAAa,GACbp3D,SAAU,GACV+iE,gBAAiB,GACjBv5D,UAAW,GACX6sD,UAAU,EACVC,cAAc,KAIlBr3G,aAAa6gD,EAAOl1C,EAAMpO,GACxB,MACM46G,EADQsL,GAAYp6G,IAAIw3C,GACJs3D,YAAc,GAExC,IAAIwK,EAAoBplH,EAAQ46G,YAC5BxxG,GAASg8G,GACX/pH,OAAO+C,KAAKgnH,GAAmB3pH,QAAQqF,IACrC,MAAMT,EAAQ+kH,EAAkBtkH,GAC5BsI,GAAS/I,KACXA,EAAM+K,GAAKtK,EACX85G,EAAY/2G,KAAKxD,MAGZ+L,GAAQg5G,IACjBxK,EAAY/2G,QAAQuhH,GA9xD1B,SAA4BxK,EAAan2D,GACvC,IAAK,MAAMq2D,KAAcF,EACvBO,GAAeL,EAAYr2D,GA8xD3B+hE,CAAmB5L,EAAat3D,EAAMmB,SAGxChiD,gBAAgB6gD,EAAOl1C,GACrB,MAAMwrG,EAAQsM,GAAYp6G,IAAIw3C,GAC9Bq3D,GAAiBr3D,EAAOl1C,EAAK4sB,MAAO4+E,EAAMgB,YAAYtzG,OAAOzL,GAAKA,EAAEsgC,SAAWtgC,EAAE8+G,oBAGnFl4G,YAAY6gD,EAAOl1C,EAAMpO,GACvB,MAAM45G,EAAQsM,GAAYp6G,IAAIw3C,IAt7DlC,SAAyBA,EAAOs2D,EAAO55G,GACrC45G,EAAMC,UAAW,EACjBD,EAAME,cAAe,EAErBH,GAAMl+G,QAAQiwF,IACiB,mBAAlB1rF,EAAQ0rF,IACjBkuB,EAAMC,UAAW,EACjBD,EAAM5sD,UAAU0+B,GAAQ1rF,EAAQ0rF,IACvBz9C,GAAQ2rE,EAAM5sD,UAAU0+B,YAC1BkuB,EAAM5sD,UAAU0+B,KAG3BguB,GAAUj+G,QAAQiwF,IACa,mBAAlB1rF,EAAQ0rF,KACjBkuB,EAAME,cAAe,KAIpBF,EAAMC,UAAaD,EAAME,cAC5BF,EAAMgB,YAAYn/G,QAAQqnD,IACnB82D,EAAMC,UACTJ,GAAWh+G,QAAQiwF,IACU,mBAAhB5oC,EAAM4oC,KACfkuB,EAAMC,UAAW,KAIlBD,EAAME,cACTJ,GAAUj+G,QAAQiwF,IACW,mBAAhB5oC,EAAM4oC,KACfkuB,EAAMC,UAAW,EACjBD,EAAME,cAAe,OAw5D7B2M,CAAgBnjE,EAAOs2D,EAAO55G,GAC9B8nE,GAAexkB,EAAOs2D,EAAO55G,EAASoO,EAAK81C,MAC3C01D,EAAM2M,gBAAkB3M,EAAMp2D,SAASl8C,OAAO6E,IAAOA,EAAG8gB,MAAQ9gB,EAAGnM,QAAQm8B,UAG7E15B,mBAAmB6gD,EAAOk/C,EAAOxiG,GAC/B26D,GAAKrX,EAAO,qBAAsBtjD,EAAQsoD,OAG5C7lD,kBAAkB6gD,EAAOk/C,EAAOxiG,GAC9B26D,GAAKrX,EAAO,oBAAqBtjD,EAAQsoD,OAG3C7lD,WAAW6gD,EAAOk/C,EAAOxiG,GACvB26D,GAAKrX,EAAO,aAActjD,EAAQsoD,OAGpC7lD,UAAU6gD,EAAOk/C,EAAOxiG,GACtB26D,GAAKrX,EAAO,YAAatjD,EAAQsoD,OAGnC7lD,YAAY6gD,EAAOl1C,EAAMpO,GAEvBgP,GADck3G,GAAYp6G,IAAIw3C,GACXl1C,EAAKtO,MAAOE,IAGjCyC,QAAQ6gD,GACN4iE,GAAY1/G,OAAO88C,IAGrBojE,UAAUpjE,GACD4iE,GAAYp6G,IAAIw3C,GAGzB3uB,SAAU,CACR0oC,WAAY,CACVJ,QAAS,CACPD,WAAY,CAAC,IAAK,IAAK,KAAM,KAAM,QAAS,SAAU,SAAU,SAAU,SAAU,SAAU,aAAc,cAAe,UAC3H74D,KAAM,WAGVmkD,MAAM,EACNiyD,cAAe,IACf7X,SAAU,oBACVp6E,MAAO,CACLo6E,SAAU,OAId/hG,YAAa,CACX0kD,YAAY,EACZF,YAAc/zC,IAAUuoG,GAAM/1E,SAASxyB,GACvCwpG,YAAa,CACX3qD,UAAU,EACV3K,UAAW,CAACl0C,EAAMsG,IAAS,YAAYmtG,GAAgBG,GAAYttG,EAAKvT,OAAOiH,KAInFkjF,uBAAwB,CAAC,KAG3B,SAAS3zB,GAAKrX,EAAOqjE,EAAQr+D,GAC3B,MAAM7rD,IAACA,EAAG4pE,UAAEA,GAAa/iB,GACnBijE,gBAACA,GAAmBL,GAAYp6G,IAAIw3C,GAEtCgF,GACFD,GAAS5rD,EAAK4pE,GAGhBugD,GAAanqH,EAAK8pH,EAAiBI,GA0BrC,SAAyBlqH,EAAK+mD,EAAUmjE,GACtC,IAAK,MAAMx6G,KAAMq3C,EACXp3C,GAAQD,EAAGq3C,WACbojE,GAAanqH,EAAK0P,EAAGq3C,SAAUmjE,GA5BnCE,CAAgBpqH,EAAK8pH,EAAiBI,GAElCr+D,GACFC,GAAW9rD,GAGb8pH,EAAgB9qH,QAAQ0Q,IACtB,KAAM,cAAeA,GACnB,OAEF,MAAMmc,EAAQnc,EAAGnM,QAAQsoB,MACrBA,GAASA,EAAM5N,SAAW4N,EAAMi0F,UAAYj0F,EAAMo6E,UAAYv2F,EAAGnM,QAAQ0iG,YAAcikB,GACzFx6G,EAAGgxG,UAAU1gH,EAAK4pE,KAKxB,SAASugD,GAAanqH,EAAK+mD,EAAUmjE,GACnC,IAAK,MAAMx6G,KAAMq3C,EACXr3C,EAAGnM,QAAQ0iG,WAAaikB,GAC1Bx6G,EAAGwuD,KAAKl+D,mFCv4DdmC,+EA/IQ8nD,EACApD,EACA7mD,EALJqzF,GAAM3F,YAAYqvB,IAClB1pB,GAAM3F,SAAS28B,mBAKJC,EAAa,kBACbC,oBACAC,aACAC,EAAS,kBAGXC,QACDziD,KACAjlE,QACS,OAAVynH,UAEUE,KAAcJ,EACnBI,EAAW,kBAAoB5/F,SAAS4/F,EAAmB,QAAK5/F,SAAS4/F,EAAqB,UAAK5/F,SAAS4/F,EAAoB,SAChIA,EAAW,iBAAmB5/F,SAAS4/F,EAAmB,QAAK5/F,SAAS4/F,EAAmB,gBAGhF,OAAVF,UACIE,KAAcJ,EAEnBI,EAAW,eAAiB5/F,SAAS4/F,EAAwB,aAC7DA,EAAW,gBAAkB5/F,SAAS4/F,EAAyB,cAC/DA,EAAW,iBAAmB5/F,SAAS4/F,EAA0B,eACjEA,EAAW,mBAAqB/2G,WAAW+2G,EAA4B,iBAEvEA,EAAW,eAAiB5/F,SAAS4/F,EAAWC,SAA0C,EAA/B7/F,SAAS4/F,EAAWE,SAA8C,EAA/B9/F,SAAS4/F,EAAWG,SAAgD,EAAhC//F,SAAS4/F,EAAWI,UACtJJ,EAAW,aAAe5/F,SAAS4/F,EAAWK,MAAQjgG,SAAS4/F,EAAWM,MAC1EN,EAAiB,KAAI5/F,SAAS4/F,EAAWC,SAAW7/F,SAAS4/F,EAAWE,SAAW9/F,SAAS4/F,EAAWG,SAAW//F,SAAS4/F,EAAWI,UACtIJ,EAAW,cAAgB5/F,SAAS4/F,EAAWC,SAAW7/F,SAAS4/F,EAAWE,SAAW9/F,SAAS4/F,EAAWG,SAAY//F,SAAS4/F,EAAWI,UAAYhgG,SAAS4/F,EAAWO,eAGnK,OAAVT,UACIE,KAAcJ,EAClBI,EAAmB,OAAI5/F,SAAS4/F,EAAWQ,OAASpgG,SAAS4/F,EAAWS,SACxET,EAAW,iBAAmB5/F,SAAS4/F,EAAWU,OAClDV,EAAW,iBAAmB5/F,SAAS4/F,EAAWW,eAClDX,EAAW,qBAAuB5/F,SAAS4/F,EAAWY,kBAAoBxgG,SAAS4/F,EAAWa,oBAC9Fb,EAAW,iBAAmB5/F,SAAS4/F,EAAWc,eAClDd,EAAW,iBAAmB5/F,SAAS4/F,EAAWe,uBAGxC,OAAVjB,UACIE,KAAcJ,EAClBI,EAAW,cAAgB5/F,SAAS4/F,EAAWgB,YAC/ChB,EAAW,cAAgB5/F,SAAS4/F,EAAWiB,YAC/CjB,EAAW,aAAe5/F,SAAS4/F,EAAWkB,WAC9ClB,EAAW,YAAc5/F,SAAS4/F,EAAWmB,UAC7CnB,EAAW,YAAc5/F,SAAS4/F,EAAWoB,UAC7CpB,EAAW,WAAa5/F,SAAS4/F,EAAWqB,SAC5CrB,EAAW,eAAiB5/F,SAAS4/F,EAAWgB,YAAc5gG,SAAS4/F,EAAWiB,YAAc7gG,SAAS4/F,EAAWkB,WACpHlB,EAAW,aAAe5/F,SAAS4/F,EAAWmB,UAAY/gG,SAAS4/F,EAAWoB,UAAYhhG,SAAS4/F,EAAWqB,SAC9GrB,EAA0B,cAAI5/F,SAAS4/F,EAAWsB,2BAGjDrhF,KAAQ2/E,EACbtiD,EAAO91D,YAAYwE,KAAKi0B,EAAKshF,YAAYthF,KAAKuhF,WAAW90G,QAAQ,KAAM,MAAM+0G,mBAAmB,WAAWvT,MAAM,QAASF,IAAI,aAC9H31G,EAAKmP,QAAQyB,WAAWg3B,EAAK4/E,YAGrBviD,OAAAA,EACRthB,WAEQF,iBACI,oBACA,oBACA,oBACA,oBACA,oBACA,oBACA,qBAEEzjD,KAAAA,cAKbqpH,QACDlO,YAGAA,EADDmM,GAEKgC,OACI5kH,KAAM,OACNi6G,KAAM2I,EACN1I,KAAM0I,EACNntD,YAAa,GAAI,IACjBzW,YAAa,OACb2E,YAAa,QASrBvD,SACIssB,QACI10C,SAAS,GAEb2+E,YACiBF,YAAAA,cAKpBoO,EAAUC,OACXv+C,EAAOu+C,EAAQxpH,KAAK2jD,SAAS,GAAG3jD,aAC3BlC,EAAI,EAAGA,EAAImtE,EAAKptE,OAAQC,IACzBmtE,EAAKntE,GAAKwpH,EACVkC,EAAQxpH,KAAK2jD,SAAS,GAAGF,gBAAgB3lD,GAAK,oBACvCmtE,EAAKntE,GAAKwpH,EACjBkC,EAAQxpH,KAAK2jD,SAAS,GAAGF,gBAAgB3lD,GAAK,UAE9C0rH,EAAQxpH,KAAK2jD,SAAS,GAAGF,gBAAgB3lD,GAAK,gBAIjD2rH,EAAYD,EAASE,GAAa,GACnCA,IACAF,EAAQxpH,KAAO0nH,KAEnB6B,EAAUC,GACVA,EAAQjpH,QAAU8oH,IAClBG,EAAQxjH,gBAYZ/B,OATIjH,EAAMiqD,EAAOC,WAAW,UACxBrD,MAAYwsC,GAAMrzF,GACd0H,KAAM,MACN1E,KAAM0nH,IACNnnH,QAAS8oH,OAEbE,EAAU1lE,GACVA,EAAM79C,8MAjIJ69C,GAAO4lE,EAAY5lE,GAAO,kBAC1BA,GAAO4lE,EAAY5lE,GAAO,wDAuISoD,wOC9INjqD,+GAHmCA,qOAD1EmC,SACIJ,cAEAA,OACIA,qBACAA,mBAAuB/B,+BAJ2CA,6BAGnCA,wBACRA,gEAThB2sH,EAAa,YACb5pH,EAAO,gBACP6pH,EAAW,iXCwFA5sH,qDAARA,gCAAhBmC,oCAAwBnC,8BAARA,4FAWT,iHADIA,KAAUA,MAAemG,oBADnB,wBACqB,+FAA3BnG,KAAUA,MAAemG,6EAU3BnG,2BAALa,qYAJLsB,SACCJ,OACCA,cACAA,iFACQ/B,cAALa,+HAAAA,4FAEIb,MAAE6sH,UACF7sH,MAAE6sD,UACqBigE,GAAQ9sH,MAAE+sH,WAAUD,GAAQ9sH,MAAEgtH,aACzC,IAAXhtH,MAAEitH,QAAcC,QAAQ,SACqF,IAAZltH,MAAEmtH,SAAeD,QAAQ,8FAFpF,yCACX,gCACkG,4DAA3GltH,MAAEmtH,QAAUntH,MAAEitH,OAAS,uBAAyBjtH,MAAEitH,OAASjtH,MAAEmtH,QAAU,aALhGhrH,SACCJ,qBACAA,qBACAA,mCACAA,4BACAA,mDAJK/B,MAAE6sH,gCACF7sH,MAAE6sD,gCACqBigE,GAAQ9sH,MAAE+sH,iCAAUD,GAAQ9sH,MAAEgtH,mCACzC,IAAXhtH,MAAEitH,QAAcC,QAAQ,+BACqF,IAAZltH,MAAEmtH,SAAeD,QAAQ,0CAAxGltH,MAAEmtH,QAAUntH,MAAEitH,OAAS,+BAAyBjtH,MAAEitH,OAASjtH,MAAEmtH,QAAU,wFAoBhEntH,MAAaktH,QAAQ,QACxBE,GAAuBptH,aAMpB,EAAEA,OAAaktH,QAAQ,QAC1BE,GAAuB,EAAEptH,+FARrC,4CACA,qGAMA,4CACA,oPAXnBmC,SACCJ,OACCA,cACAA,4BACAA,8BAGFI,SACCJ,OACCA,cACAA,4BACAA,4CARgC/B,MAAaktH,QAAQ,8BACxBE,GAAuBptH,mCAMpB,EAAEA,OAAaktH,QAAQ,8BAC1BE,GAAuB,EAAEptH,qHAb/B,uBAAyB,uLAAyL+O,OAAO69G,0NA1C3O5sH,0BAALa,sDAUGb,+BAMDA,MAAsBA,MAAYa,sCAmBdb,mBAAuBA,gBAA2BA,gBAA2BA,oDAM/FA,4MAlCqPA,wOARxOA,oHAQkEA,gBAAkBA,8QA+BvEA,gBAAkBA,wHAzCpDmC,SACCJ,cACAA,sDAAoB/B,aAOpB+B,OACCA,WAAqJ/B,aAA0E+B,qBAEhOA,gDAyBAA,2BAGAA,OACCA,WAA+F/B,aAEhG+B,+MAxCQ/B,aAALa,+HAAAA,iBADiBb,6BAQkEA,8BAAkBA,2BAA8CA,UAAAA,sBAAsGA,sEASvPA,MAAsBA,MAAYa,wFAmBdb,6BAAuBA,2BAA2BA,yBAA2BA,uCAGrEA,8BAAkBA,kBAA6CA,oSA1GvF8sH,GAAQ7iH,UAAaA,EAAI,EAAI,IAAM,IAAMA,WAWzCmjH,GAAuBC,UAC3BA,EAAc,GACV,IAAM1sH,KAAKqiC,MAAOqqF,GAAe,EAAIA,GAAgB,KAGrD,IAAM1sH,KAAKqiC,OAAQ,EAAEqqF,GAAeA,EAAe,cA6CnDC,GAAUh/E,UACL3tC,KAAKqiC,MAAU,EAAJsL,GAAO,2BA3D5Bk8E,EACA+C,EACAC,EACAC,EACAC,EACAL,SA1BOM,iBACAC,eAEApsH,GAAS,SAAU,WAAY,UAAW,iBAAkB,0BAA2B,4BACvFipH,EAAS,6BACToD,GAAqB,gBAErBC,EAAY,sBAEZC,EAAe,QAWtBC,GAAc,WAkBTC,IAEHzsH,EAAM2lC,SAASqjF,QACnBA,EAAgBhpH,EAAM,QAEnB0sH,EAAUP,EAAMt3G,KAAK5J,GAAeA,EAAI3J,OAAS0nH,GACrD0D,EAAQjiF,WAAar4B,WAAWs6G,EAAQjiF,gBACpCkiF,EAAQL,EAAYA,EAAUtD,GAAiB,SACnDwD,KAAiBG,GAASA,EAAMzhE,OAASyhE,EAAMzhE,MAAM7rD,aACjDutH,EAAKJ,EAAcG,EAAMC,GAAKF,EAAQE,OAC1Cb,EAAgBD,GAAUY,EAAQjiF,iBAClCuhF,EAAYF,GAAUY,EAAQjiF,WAAkB,EAALmiF,IACvCZ,EAAY,OACfA,EAAY,QAEbC,EAAYH,GAAUY,EAAQjiF,WAAkB,EAALmiF,QAG3CV,EAAUM,WAGQG,OACdzhE,EAAQyhE,EAAMzhE,MACd2hE,EAASF,EAAME,OACf3wG,EAAOgvC,EAAM7rD,OAAS,EAAI6rD,EAAM,GAAKA,EAAM,GAAK,UAEnD1mD,IAAc8qB,OACTi8F,KACAj8F,EAAI47B,EAAM,GACbqgE,EAAO,GAAK,EAAIsB,EAAO,KAAOv9F,EAAI47B,EAAM,YAC9B57B,GAAK47B,EAAMA,EAAM7rD,OAAS,GACpCksH,EAAOsB,EAAOA,EAAOxtH,OAAS,YAE1BC,EAAIH,KAAK+sB,OAAOoD,EAAI47B,EAAM,IAAMhvC,GAChC4wG,GAAQx9F,EAAI47B,EAAM5rD,IAAM4c,EAC5BqvG,EAAOsB,EAAOvtH,IAAMutH,EAAOvtH,EAAI,GAAKutH,EAAOvtH,IAAMwtH,SAE3C,EAAIvB,IAnBWwB,CAAUJ,OAAa//E,GAAS8/E,EAAQjiF,WAAYiiF,EAAQE,GAAKF,EAAQE,UACjGf,EAAcK,EAAQhgF,IAAI6/E,IA9B3B/C,EAAgBhpH,EAAM,GACtBysH,ySAjBoBt5G,EAAM+3C,EAAO8hE,0BAAb75G,EADQ61G,EACKgE,EADwBd,EAAtDe,GACuB/hE,EADiBqhE,IAE3BrhE,EAAM/3C,IAAU65G,EACxB9hE,EAAM/3C,GAAM9J,OAAOnB,GAAkB,OAAbA,EAAE2kH,QAAiBjuH,MAAM,EAAG,GAAGwK,IAAIlB,KACjEmjH,KAAMnjH,EAAEmjH,KAAMhgE,KAAMnjD,EAAEmjD,KAAMkgE,KAAMrjH,EAAEqjH,KAAMC,MAAOtjH,EAAEsjH,MACnDC,OAAQvjH,EAAE2kH,OAAQlB,QAAS,EAAIqB,EAAK9gF,IAAIhkC,EAAEmjD,gCAIzCohE,iDAkEiBzD,8BAA+ByD,gBAQmGV,kCAA8BF,EAAcK,EAAQhgF,IAAI6/E,gBA+B9GA,kCAA8BF,EAAcK,EAAQhgF,IAAI6/E,sPC/G7GvtH,KAAMksH,YAAYthF,KAAKC,UAAUE,yCAApC,+CAAzB5oC,2CAA4BnC,KAAMksH,YAAYthF,KAAKC,UAAUE,kEAFhC/qC,KAAMksH,YAAYthF,KAAKE,UAAUC,yCAArC,gDAAzB5oC,2CAA6BnC,KAAMksH,YAAYthF,KAAKE,UAAUC,oGAuH3BhgB,SAAS/qB,KAAM6rH,gBACf9gG,SAAS/qB,KAAMgsH,cACfjhG,SAAS/qB,KAAM0uH,iBACf3jG,SAAS/qB,KAAM2uH,cACf5jG,SAAS/qB,KAAM2rH,iBAC1B5gG,SAAS/qB,KAAM8rH,o1BAdvC3pH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+BgpB,SAAS/qB,KAAM6rH,mCACf9gG,SAAS/qB,KAAMgsH,iCACfjhG,SAAS/qB,KAAM0uH,oCACf3jG,SAAS/qB,KAAM2uH,iCACf5jG,SAAS/qB,KAAM2rH,oCAC1B5gG,SAAS/qB,KAAM8rH,mHAtBJ/gG,SAAS/qB,KAAMmrH,YACfpgG,SAAS/qB,KAAMorH,cACfrgG,SAAS/qB,KAAMqrH,YACftgG,SAAS/qB,KAAMsrH,oBACfvgG,SAAS/qB,KAAMurH,kBAAoBxgG,SAAS/qB,KAAMwrH,yBAC7D53G,WAAW5T,KAAM4uH,aAAa1B,QAAQ,4yBAd9D/qH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+BgpB,SAAS/qB,KAAMmrH,+BACfpgG,SAAS/qB,KAAMorH,iCACfrgG,SAAS/qB,KAAMqrH,+BACftgG,SAAS/qB,KAAMsrH,uCACfvgG,SAAS/qB,KAAMurH,kBAAoBxgG,SAAS/qB,KAAMwrH,4CAC7D53G,WAAW5T,KAAM4uH,aAAa1B,QAAQ,4GAtB3BniG,SAAS/qB,KAAM6uH,YACf9jG,SAAS/qB,KAAMyrH,oBACf1gG,SAAS/qB,KAAM0rH,oBACf3gG,SAAS/qB,KAAM8uH,WACf/jG,SAAS/qB,KAAM+uH,eAC1Bn7G,WAAW5T,KAAM4uH,aAAa1B,QAAQ,0yBAd9D/qH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+BgpB,SAAS/qB,KAAM6uH,+BACf9jG,SAAS/qB,KAAMyrH,uCACf1gG,SAAS/qB,KAAM0rH,uCACf3gG,SAAS/qB,KAAM8uH,8BACf/jG,SAAS/qB,KAAM+uH,kCAC1Bn7G,WAAW5T,KAAM4uH,aAAa1B,QAAQ,gHAtB3BniG,SAAS/qB,KAAM4rH,iBACf7gG,SAAS/qB,KAAM+rH,eACfhhG,SAAS/qB,KAAMgvH,kBAAiBjkG,SAAS/qB,KAAMivH,eAC/ClkG,SAAS/qB,KAAMisH,wBACflhG,SAAS/qB,KAAM2rH,iBAC1B5gG,SAAS/qB,KAAM8rH,2iBAHwB,yTAX/D3pH,kBAQAA,SACIJ,qBACAA,qBACAA,mCACAA,qBACAA,qBACAA,kCAL+BgpB,SAAS/qB,KAAM4rH,oCACf7gG,SAAS/qB,KAAM+rH,kCACfhhG,SAAS/qB,KAAMgvH,qCAAiBjkG,SAAS/qB,KAAMivH,kCAC/ClkG,SAAS/qB,KAAMisH,2CACflhG,SAAS/qB,KAAM2rH,oCAC1B5gG,SAAS/qB,KAAM8rH,mHAtBJ/gG,SAAS/qB,KAAM4qH,SAAS7/F,SAAS/qB,KAAM6qH,SAAS9/F,SAAS/qB,KAAM8qH,SAAS//F,SAAS/qB,KAAM+qH,eACvFhgG,SAAS/qB,KAAMgrH,WACfjgG,SAAS/qB,KAAMirH,WACflgG,SAAS/qB,KAAMkvH,mBACfnkG,SAAS/qB,KAAMkrH,YAC1BngG,SAAS/qB,KAAMmvH,8zBAdvChtH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+BgpB,SAAS/qB,KAAM4qH,SAAS7/F,SAAS/qB,KAAM6qH,SAAS9/F,SAAS/qB,KAAM8qH,SAAS//F,SAAS/qB,KAAM+qH,kCACvFhgG,SAAS/qB,KAAMgrH,8BACfjgG,SAAS/qB,KAAMirH,8BACflgG,SAAS/qB,KAAMkvH,sCACfnkG,SAAS/qB,KAAMkrH,+BAC1BngG,SAAS/qB,KAAMmvH,4HAtBJnvH,KAAMovH,gBACNpvH,KAAM8uH,UACN9uH,KAAMqvH,oBACNrvH,KAAMsvH,kBACNtvH,KAAMuvH,mBACjBvvH,KAAMwvH,gzBAd9BrtH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+B/B,KAAMovH,mCACNpvH,KAAM8uH,6BACN9uH,KAAMqvH,uCACNrvH,KAAMsvH,qCACNtvH,KAAMuvH,sCACjBvvH,KAAMwvH,qHAtBKzkG,SAAS/qB,KAAMyvH,cACfzvH,KAAMm1B,YACNpK,SAAS/qB,KAAM0vH,eACf3kG,SAAS/qB,KAAMorH,cACfrgG,SAAS/qB,KAAM2vH,aAC1B5kG,SAAS/qB,KAAM4vH,yyBAdvCztH,kBAQAA,SACIJ,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,kCAL+BgpB,SAAS/qB,KAAMyvH,iCACfzvH,KAAMm1B,+BACNpK,SAAS/qB,KAAM0vH,kCACf3kG,SAAS/qB,KAAMorH,iCACfrgG,SAAS/qB,KAAM2vH,gCAC1B5kG,SAAS/qB,KAAM4vH,iGAxBZ5vH,KAAM,kBAAkBktH,QAAQ,YAMtDv2G,KAAK3W,KAAMksH,YAAYthF,KAAKuhF,WAAW90G,QAAQ,KAAM,MAAM+0G,mBAAmB,WAAWvT,MAAM,QAASF,IAAI,sCALhH34G,KAAMksH,YAAY2D,KAAKlhH,IAAM3O,KAAMksH,YAAYthF,KAAKC,UAAUl8B,iDAQhD,OAAV3O,QAiBe,OAAVA,MAAmBA,QAiBT,OAAVA,QAiBU,OAAVA,MAAmBA,QAiBT,OAAVA,MAAmBA,QAiBT,OAAVA,QAiBU,OAAVA,wGA/G2D,6LAF7EmC,SACIJ,OACAA,OAAMA,6DAQNA,iDAR+B/B,KAAM,kBAAkBktH,QAAQ,4FAMtDv2G,KAAK3W,KAAMksH,YAAYthF,KAAKuhF,WAAW90G,QAAQ,KAAM,MAAM+0G,mBAAmB,WAAWvT,MAAM,QAASF,IAAI,0JATlH34G,0BAALa,0QAHVsB,SACIJ,cACAA,iFACW/B,aAALa,+HAAAA,sEATK+sH,gBACAnD,EAAS,qBACTqF,GAAa,YACbC,GAAQ,gBACRC,GAAY,2VC8BOC,GAAajwH,KAAS,kDAA1B,iBAA6C,yCAAvEmC,kDAA8B8tH,GAAajwH,KAAS,0IAoD1CiwH,GAAajwH,KAAgB,YAI7BiwH,GAAajwH,KAAkB,cAI/BiwH,GAAajwH,KAAiB,aAI9BiwH,GAAajwH,KAAS,uBAItBiwH,GAAajwH,KAAS,uBAItBiwH,GAAajwH,KAAsB,85BAtB7CmC,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,kCApBMkuH,GAAajwH,KAAgB,+BAI7BiwH,GAAajwH,KAAkB,iCAI/BiwH,GAAajwH,KAAiB,gCAI9BiwH,GAAajwH,KAAS,0CAItBiwH,GAAajwH,KAAS,0CAItBiwH,GAAajwH,KAAsB,4LArCnCiwH,GAAajwH,KAAgB,YAI7BiwH,GAAajwH,KAAwB,qBAIrCA,KAAwB,cAAI,GAAKA,KAAgB,MAAIA,KAAwB,eAAGktH,QAAQ,GAAK,SAI7FjiG,MAAMjrB,KAAe,MAAK,GAAKW,KAAKqiC,MAAyB,IAAnBhjC,KAAe,MAAW,mmBAd9EmC,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,kCAZMkuH,GAAajwH,KAAgB,+BAI7BiwH,GAAajwH,KAAwB,wCAIrCA,KAAwB,cAAI,GAAKA,KAAgB,MAAIA,KAAwB,eAAGktH,QAAQ,GAAK,4BAI7FjiG,MAAMjrB,KAAe,MAAK,GAAKW,KAAKqiC,MAAyB,IAAnBhjC,KAAe,MAAW,0KArCpEiwH,GAAajwH,KAAiB,aAI9BiwH,GAAajwH,KAAmB,eAIhCiwH,GAAajwH,KAAkB,cAI/BiwH,GAAajwH,KAAiB,aAI9BiwH,GAAajwH,KAAiB,aAI9BiwH,GAAajwH,KAAoB,8oBAxBlCiwH,GAAallG,SAAS/qB,KAAwB,eAAG+qB,SAAS/qB,KAA0B,wBAAQiwH,GAAallG,SAAS/qB,KAAwB,eAAG+qB,SAAS/qB,KAA0B,0CAC/KiwH,GAAajwH,KAA0B,uBAAOiwH,GAAajwH,KAA0B,wCACtFiwH,GAAajwH,KAAc,WAAOiwH,GAAajwH,KAAc,4ZAHtEmC,SAIIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,uBAEJI,SACIJ,cACAA,kCApBMkuH,GAAajwH,KAAiB,iDAJ/BiwH,GAAallG,SAAS/qB,KAAwB,eAAG+qB,SAAS/qB,KAA0B,wBAAQiwH,GAAallG,SAAS/qB,KAAwB,eAAG+qB,SAAS/qB,KAA0B,0CAC/KiwH,GAAajwH,KAA0B,uBAAOiwH,GAAajwH,KAA0B,wCACtFiwH,GAAajwH,KAAc,WAAOiwH,GAAajwH,KAAc,2CAM5DiwH,GAAajwH,KAAmB,kCAIhCiwH,GAAajwH,KAAkB,iCAI/BiwH,GAAajwH,KAAiB,gCAI9BiwH,GAAajwH,KAAiB,gCAI9BiwH,GAAajwH,KAAoB,oJA/BtCA,kCAKU,OAAVA,QA4Be,OAAVA,MAAmBA,QAiBT,OAAVA,6DAnDE,wIAAhBmC,wCAKAA,kCAJSnC,wMA7BIiwH,GAAa3zF,UAEdrR,MAAMqR,GACC,GAEJA,EAAO4wF,QAAQ,YAejBgD,QAZuB9vH,MAAM6H,KAAKtI,SAASsN,iBAAiB,+BAC5BrC,cAAculH,cACpCC,UAAU5iB,QAAQ2iB,GAAkBE,gBAKvBjwH,MAAM6H,KAAKtI,SAASsN,iBAAiB,+BAC5BrC,cAAculH,cACpCC,UAAU5iB,QAAQ2iB,sCArB1BG,GAAW,aACX7F,EAAS,oBACTuF,GAAY,YA0BvB3oH,OACF6oH,uYCsYwGlwH,KAAO6vH,KAAK9kF,6CAAmC/qC,KAAOuwH,kGAA5IpuH,6BAAsFnC,KAAO6vH,KAAK9kF,0CAAmC/qC,KAAOuwH,qNAF/CvwH,KAAO6vH,KAAK9kF,6CAAmC/qC,KAAOuwH,kGAAnJpuH,6BAA6FnC,KAAO6vH,KAAK9kF,0CAAmC/qC,KAAOuwH,0GA4B3GvwH,YAA4BA,WAAeA,WAAqBA,eAAkBA,kBAAyBA,aAAuBA,KAAaI,MAAM,EAAGO,KAAKqZ,IAAIha,KAAaa,OAAQ,mGAAtLb,qBAA4BA,qBAAeA,qBAAqBA,0BAAkBA,6BAAyBA,sBAAuBA,KAAaI,MAAM,EAAGO,KAAKqZ,IAAIha,KAAaa,OAAQ,yJAOxMb,YAAsBA,gBAAoBA,KAAOwqC,UAAUrD,SAAS,WAAannC,KAAOwqC,UAAUrD,SAAS,gBAAkBnnC,yFAA7HA,qBAAsBA,yBAAoBA,KAAOwqC,UAAUrD,SAAS,oBAAannC,KAAOwqC,UAAUrD,SAAS,2BAAkBnnC,8KAzBrFA,KAAO8C,8BAXtD,OAAV9C,qDAYeA,cAAkBA,eAAkBA,cAgBnDA,cAOAA,0kCA5B+KA,KAAOwwH,2EAAiDxwH,KAAO8C,wgCAZvQX,SACIJ,OACIA,OACIA,OACIA,0BAOAA,OACIA,cAGRA,OACIA,yCAKZA,OACIA,cAQAA,OACIA,OACIA,6BAMJA,OACIA,0HA3BwL/B,KAAOwwH,qCAAiDxwH,KAAO8C,uCAIrL9C,KAAO8C,2CACjD9C,wBAAkBA,0BAAkBA,gBAgBnDA,0GAOAA,2QA1bjBywH,EACAC,EACAC,EAEAnvH,EACAovH,UAXOxmF,cACAymF,aACApG,EAAS,6BACToD,GAAqB,4BACrBiD,KAKPC,EAAY3mF,EAAOz7B,GAGnBqiH,KAGAlD,EAAY,KACZC,EAAe,cAKVkD,QACDC,WA8CgBH,UACbI,UAAU1G,WAAgBsG,MAChCpoH,KAAKyoH,GAAYA,EAASC,QAC1B1oH,KAAK3F,YAGU2qH,SADR8C,MACiBztH,GAEA,OAAVynH,GACCkD,EAAM2D,OAAOn8F,OAASpK,SAAS4iG,EAAM2D,OAAOC,KAA8C,EAAvCxmG,SAAS4iG,EAAM2D,OAAOE,eAA8D,EAAzCzmG,SAAS4iG,EAAM2D,OAAOG,iBACpH9D,EAAM2D,OAAO,kBAAoB3D,EAAM2D,OAAOn8F,OAA2C,IAAlCpK,SAAS4iG,EAAM2D,OAAO5B,UAAmD,IAAjC3kG,SAAS4iG,EAAM2D,OAAOlG,SAAiD,EAAhCrgG,SAAS4iG,EAAM2D,OAAO1B,QAA8C,EAAhC7kG,SAAS4iG,EAAM2D,OAAO3B,QAAc5kG,SAAS4iG,EAAM2D,OAAOI,YAErN,OAAVjH,EACDrgF,EAAOI,UAAUrD,SAAS,KAE1BwmF,EAAM2D,OAAO,mBAA0D,EAAtCvmG,SAAS4iG,EAAM2D,OAAO9B,aAA6D,EAAzCzkG,SAAS4iG,EAAM2D,OAAOK,iBAA+D,EAAxC5mG,SAAS4iG,EAAM2D,OAAOM,gBAA0D,EAApC7mG,SAAS4iG,EAAM2D,OAAOlC,YAAgD,EAA9BrkG,SAAS4iG,EAAM2D,OAAOxC,MAIlOnB,EAAM2D,OAAO,kBAAqD,EAAjCvmG,SAAS4iG,EAAM2D,OAAO1G,SAAgD,EAAjC7/F,SAAS4iG,EAAM2D,OAAOzG,SAAgD,EAAjC9/F,SAAS4iG,EAAM2D,OAAOxG,SAAiD,GAAlC//F,SAAS4iG,EAAM2D,OAAOvG,UAAgD,EAA/BhgG,SAAS4iG,EAAM2D,OAAOpG,OAA2C,IAA9BngG,SAAS4iG,EAAM2D,OAAOtG,MAAoD,EAAtCjgG,SAAS4iG,EAAM2D,OAAOpC,cAAkD,IAA9BnkG,SAAS4iG,EAAM2D,OAAOrG,MAGpT,OAAVR,EAEAkD,EAAM2D,OAAO,kBADbtB,EAC+D,GAA9BjlG,SAAS4iG,EAAM2D,OAAOxC,MAA4C,GAA/B/jG,SAAS4iG,EAAM2D,OAAOzC,OAAsD,EAAvC9jG,SAAS4iG,EAAM2D,OAAO5F,eAAuD,EAAlC3gG,SAAS4iG,EAAM2D,OAAOvC,UAG1G,GAA/BhkG,SAAS4iG,EAAM2D,OAAOnG,OAA+C,EAAjCpgG,SAAS4iG,EAAM2D,OAAOlG,SAAuF,KAAvErgG,SAAS4iG,EAAM2D,OAAOjG,OAAStgG,SAAS4iG,EAAM2D,OAAOhG,gBAAgH,IAAvFvgG,SAAS4iG,EAAM2D,OAAO/F,kBAAoBxgG,SAAS4iG,EAAM2D,OAAO9F,qBAG/O,OAAVf,IACJkD,EAAM2D,OAAO,kBAAwD,IAApCvmG,SAAS4iG,EAAM2D,OAAO1F,YAAuD,EAAlC7gG,SAAS4iG,EAAM2D,OAAOvF,WAA4D,EAA5ChhG,SAAS4iG,EAAM2D,OAAOrF,mBAA8D,GAApClhG,SAAS4iG,EAAM2D,OAAO3F,YAAsD,EAAlC5gG,SAAS4iG,EAAM2D,OAAOxF,UAAmD,GAAnC/gG,SAAS4iG,EAAM2D,OAAOzF,WAAoD,EAAjC9gG,SAAS4iG,EAAM2D,OAAOtF,UAAsD,EAAvCjhG,SAAS4iG,EAAM2D,OAAOO,cAAqB9mG,SAAS4iG,EAAM2D,OAAOQ,UAAY,EAAqC,EAAjC/mG,SAAS4iG,EAAM2D,OAAOS,SAAmD,GAApChnG,SAAS4iG,EAAM2D,OAAO5C,aAEhd+B,EAAarpH,KAAKumH,EAAM2D,wBA0FhCU,YACJhB,MAEIP,EAAa5vH,OAAS,OAElBoxH,EAAOnB,EACPoB,aACKC,KAAQF,KACV7nF,EAAOI,UAAUrD,SAAS,MAAkB,OAAVsjF,GAA2B,2BAAR0H,EACpDD,EAAe,kBAAoBD,EAAKE,WAE1B,OAAV1H,GAA2B,yBAAR0H,EACnBnC,IACAkC,EAAe,kBAAoBD,EAAKE,YAG9B,OAAV1H,GAAmBuF,GAAqB,kBAARmC,YAIhCC,EAAqBD,EAAK96G,QAAQ,UAAW,KACjD+6G,EAAqBA,EAAmB/6G,QAAQ,KAAM,KACtD66G,EAAeE,GAAsBH,EAAKE,GAGlDzB,EAAYwB,eAIJtE,KAAW6C,UACP0B,KAAQvE,OAEQptH,IAAjBwxH,EAAOG,KACNH,EAAOG,GAAQ,GAEnBH,EAAOG,IAASv+G,WAAWg6G,EAAQuE,YAGnCA,KAAQH,MACZhB,EAAMmB,GAAQH,EAAOG,GAAQ1B,EAAa5vH,kBA6FtC+sH,KA3FM,OAAVnD,OACAuG,EAAM,iBAAmBp9G,WAAWo9G,EAAMpB,QAAUh8G,WAAWo9G,EAAMrB,eACrEqB,EAAM,kBAAoBp9G,WAAWo9G,EAAM77F,QAAUvhB,WAAWo9G,EAAMtB,UAAY97G,WAAWo9G,EAAM5F,aAEpF,OAAVX,EACFrgF,EAAOI,UAAUrD,SAAS,WAIzB6pF,EAAM,eAAiBp9G,WAAWo9G,EAAMpG,SAAuC,EAA5Bh3G,WAAWo9G,EAAMnG,SAA2C,EAA5Bj3G,WAAWo9G,EAAMlG,SAA6C,EAA7Bl3G,WAAWo9G,EAAMjG,iBACrIiG,EAAM,aAAep9G,WAAWo9G,EAAMhG,MAAQp3G,WAAWo9G,EAAM/F,aAC/D+F,EAAY,KAAIp9G,WAAWo9G,EAAMpG,SAAWh3G,WAAWo9G,EAAMnG,SAAWj3G,WAAWo9G,EAAMlG,SAAWl3G,WAAWo9G,EAAMjG,iBACrHiG,EAAM,cAAgBp9G,WAAWo9G,EAAMpG,SAAWh3G,WAAWo9G,EAAMnG,SAAWj3G,WAAWo9G,EAAMlG,SAAWl3G,WAAWo9G,EAAMjG,UAAYn3G,WAAWo9G,EAAM9F,WAI7I,OAAVT,OACLuG,EAAc,OAAIp9G,WAAWo9G,EAAM7F,OAASv3G,WAAWo9G,EAAM5F,gBAC7D4F,EAAM,iBAAmBp9G,WAAWo9G,EAAM3F,cAC1C2F,EAAM,iBAAmBp9G,WAAWo9G,EAAM1F,sBAC1C0F,EAAM,qBAAuBp9G,WAAWo9G,EAAMzF,kBAAoB33G,WAAWo9G,EAAMxF,2BACnFwF,EAAM,iBAAmBp9G,WAAWo9G,EAAMvF,sBAC1CuF,EAAM,iBAAmBp9G,WAAWo9G,EAAMtF,mBAE3B,OAAVjB,QACLuG,EAAqB,cAAIp9G,WAAWo9G,EAAyB,0BAC7DA,EAAmB,YAAIp9G,WAAWo9G,EAAMpF,YAAch4G,WAAWo9G,EAAMrF,YAAc/3G,WAAWo9G,EAAMnF,kBACtGmF,EAAiB,UAAIp9G,WAAWo9G,EAAMjF,UAAYn4G,WAAWo9G,EAAMlF,UAAYl4G,WAAWo9G,EAAMhF,aAGpG0E,KACc,OAAVjG,GACAiG,EAAkB,OAAI,EACtBA,EAAoB,SAAI,EACxBA,EAAmB,QAAI,EACvBA,EAAkB,OAAI,EACtBA,EAAkB,OAAI,EACtBA,EAAU,iBAAmB,EAC7BA,EAAU,kBAAoB,EAC9BA,EAAU,kBAAoB,GAEf,OAAVjG,GACLiG,EAAU,kBAAoB,EAC3BtmF,EAAOI,UAAUrD,SAAS,MACzBupF,EAAsB,WAAI,EAC1BA,EAAuB,YAAI,EAC3BA,EAA2B,gBAAI,EAC/BA,EAAyB,cAAI,IAG7BA,EAAgB,KAAI,EACpBA,EAAgB,KAAI,EACpBA,EAAU,aAAe,EACzBA,EAAU,eAAiB,EAC3BA,EAAgB,KAAI,EACpBA,EAAU,cAAgB,IAGf,OAAVjG,GACLiG,EAAU,kBAAoB,EAC1BV,GACAU,EAAiB,MAAI,EACrBA,EAAU,iBAAmB,EAC7BA,EAAU,iBAAmB,IAG7BA,EAAiB,MAAI,EACrBA,EAAmB,QAAI,EACvBA,EAAkB,OAAI,EACtBA,EAAU,iBAAmB,EAC7BA,EAAU,iBAAmB,EAC7BA,EAAU,qBAAuB,IAGtB,OAAVjG,IACLiG,EAAU,kBAAoB,EAC9BA,EAAsB,WAAI,EAC1BA,EAAsB,WAAI,EAC1BA,EAAqB,UAAI,EACzBA,EAAuB,YAAI,EAC3BA,EAAqB,UAAI,EACzBA,EAAsB,WAAI,EAC1BA,EAAoB,SAAI,EACxBA,EAAoB,SAAI,EACxBA,EAAmB,QAAI,EACvBA,EAAyB,cAAI,EAC7BA,EAAoB,SAAI,EACxBA,EAAuB,YAAI,EAC3BA,EAAmB,QAAI,EACvBA,EAAmB,QAAI,GAERD,GACfC,EAAU,mBAAqB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAQ,mBAAqBoD,EAAM,kBAAmB,GAC3F,OAAVvG,GACAiG,EAAkB,QAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAgB,QAAKoD,EAAc,OAAG,GACjFN,EAAoB,UAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAkB,UAAKoD,EAAgB,SAAG,GACvFN,EAAmB,SAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAiB,SAAKoD,EAAe,QAAG,GACpFN,EAAkB,QAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAgB,QAAKoD,EAAc,OAAG,GACjFN,EAAkB,QAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAgB,QAAKoD,EAAc,OAAG,GACjFN,EAAU,mBAAqB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAgB,QAAKh6G,WAAWg6G,EAAkB,UAAKh6G,WAAWg6G,EAAiB,SAAKh6G,WAAWo9G,EAAM,mBAAoB,GAChLN,EAAU,kBAAoB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAgB,QAAKh6G,WAAWg6G,EAAgB,QAAKh6G,WAAWo9G,EAAM,kBAAmB,IAE5H,OAAVvG,EACFrgF,EAAOI,UAAUrD,SAAS,MACzBupF,EAAsB,YAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAoB,YAAKoD,EAAkB,WAAG,GAC7FN,EAAuB,aAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAqB,aAAKoD,EAAmB,YAAG,GAChGN,EAA2B,iBAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAyB,iBAAKoD,EAAuB,gBAAG,GAC5GN,EAAyB,eAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAuB,eAAKoD,EAAqB,cAAG,KAGtGN,EAAgB,MAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAc,MAAKoD,EAAY,KAAG,GAC3EN,EAAgB,MAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAc,MAAKoD,EAAY,KAAG,GAC3EN,EAAU,cAAgB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAc,MAAKh6G,WAAWg6G,EAAc,MAAKh6G,WAAWo9G,EAAM,cAAe,GAC/HN,EAAU,gBAAkB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAQhD,SAAyC,EAA9Bh3G,WAAWg6G,EAAQ/C,SAA6C,EAA9Bj3G,WAAWg6G,EAAQ9C,SAA+C,EAA/Bl3G,WAAWg6G,EAAQ7C,UAAgBn3G,WAAWo9G,EAAM,gBAAiB,GAC7MN,EAAgB,MAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAQhD,SAAWh3G,WAAWg6G,EAAQ/C,SAAWj3G,WAAWg6G,EAAQ9C,SAAWl3G,WAAWg6G,EAAQ7C,UAAYn3G,WAAWo9G,EAAY,MAAI,GAClLN,EAAU,eAAiB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAQhD,SAAWh3G,WAAWg6G,EAAQ/C,SAAWj3G,WAAWg6G,EAAQ9C,SAAWl3G,WAAWg6G,EAAQ7C,UAAYn3G,WAAWg6G,EAAQ1C,OAASt3G,WAAWo9G,EAAM,eAAgB,IAGhN,OAAVvG,EACAuF,GACAU,EAAiB,OAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAe,OAAKoD,EAAa,MAAG,GAC9EN,EAAU,kBAAoB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAuB,eAAKoD,EAAM,iBAAkB,GACtGN,EAAU,kBAAoB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAuB,eAAKoD,EAAM,iBAAkB,KAGtGN,EAAiB,OAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAe,OAAKoD,EAAa,MAAG,GAC9EN,EAAmB,SAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAiB,SAAKoD,EAAe,QAAG,GACpFN,EAAkB,QAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAe,OAAKh6G,WAAWg6G,EAAiB,SAAKoD,EAAc,OAAG,GACjHN,EAAU,kBAAoB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAe,OAAKoD,EAAM,iBAAkB,GAC9FN,EAAU,kBAAoB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAuB,eAAKoD,EAAM,iBAAkB,GACtGN,EAAU,sBAAwB/vH,KAAK8sC,IAAI75B,WAAWg6G,EAA0B,kBAAKh6G,WAAWg6G,EAA4B,oBAAKoD,EAAM,qBAAsB,IAGnJ,OAAVvG,IACJiG,EAAsB,YAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAoB,YAAKoD,EAAkB,WAAG,GAC7FN,EAAsB,YAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAoB,YAAKoD,EAAkB,WAAG,GAC7FN,EAAqB,WAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAmB,WAAKoD,EAAiB,UAAG,GAC1FN,EAAuB,aAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAoB,YAAKh6G,WAAWg6G,EAAoB,YAAKh6G,WAAWg6G,EAAmB,WAAKh6G,WAAWo9G,EAAmB,aAAI,GAClLN,EAAqB,WAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAkB,UAAKh6G,WAAWg6G,EAAkB,UAAKh6G,WAAWg6G,EAAiB,SAAKh6G,WAAWo9G,EAAiB,WAAI,GACxKN,EAAyB,eAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAA2B,mBAAKoD,EAAqB,cAAG,GAC1GN,EAAsB,YAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAoB,YAAKoD,EAAkB,WAAG,GAC7FN,EAAoB,UAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAkB,UAAKoD,EAAgB,SAAG,GACvFN,EAAoB,UAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAkB,UAAKoD,EAAgB,SAAG,GACvFN,EAAmB,SAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAiB,SAAKoD,EAAe,QAAG,GACpFN,EAAoB,UAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAkB,UAAKh6G,WAAWo9G,EAAgB,UAAI,GACnGN,EAAuB,aAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAqB,aAAKoD,EAAmB,YAAG,GAChGN,EAAmB,SAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAiB,SAAKoD,EAAe,QAAG,GACpFN,EAAmB,SAAK/vH,KAAK8sC,IAAI75B,WAAWg6G,EAAiB,SAAKoD,EAAe,QAAG,YAGpFmB,KAAQzB,EACZA,EAAUyB,GAAQzB,EAAUyB,GAAQ1B,EAAa5vH,OAE3B,GAAnB6vH,EAAUyB,KACTzB,EAAUyB,GAAQ,MA3RtBE,KAjFIC,CAAevB,GACvBwB,WAoFe1B,UACZM,UAAU1G,iBAAsBoG,MACtCloH,KAAKyoH,GAAYA,EAASC,QAC1B1oH,KAAK3F,QAEMwvH,KACAC,aA6BKC,IA5BK,OAAVjI,EACAgI,GAAc,SAAU,WAAY,UAAW,SAAU,SAAU,YAAa,kBAEjE,OAAVhI,EAEDgI,EADDroF,EAAOI,UAAUrD,SAAS,MACX,aAAc,iBAAkB,gBAAiB,cAAe,oBAGhE,OAAQ,UAAW,UAAW,UAAW,WAAY,QAAS,OAAQ,kBAGzE,OAAVsjF,EAEDgI,EADAroF,EAAOI,UAAUrD,SAAS,OACX,aAAc,WAAY,aAAc,WAAY,iBAAkB,oBAAqB,WAAY,gBAGxG,aAAc,WAAY,YAAa,UAAW,aAAc,iBAAkB,UAAW,WAIhG,OAAVsjF,IAEDgI,EADAzC,GACc,QAAS,gBAAiB,gBAAiB,mBAG3C,QAAS,UAAW,SAAU,QAAS,gBAAiB,mBAAoB,qBAAsB,mBAGxGhtH,EAAK,GAAGsuH,YAChBqB,EAAoBD,EAAIr7G,QAAQ,KAAM,KAChC,gBAAPq7G,EACCF,EAAK,kBAAoBxvH,EAAK,GAAGsuH,OAAOoB,GAEnCD,EAAWtrF,SAASwrF,KACzBH,EAAKG,GAAqB3vH,EAAK,GAAGsuH,OAAOoB,IAGjD/B,EAAc6B,EAEA,OAAV/H,GACAkG,EAAY,iBAAmB/8G,WAAW+8G,EAAYf,QAAUh8G,WAAW+8G,EAAYhB,QACvFgB,EAAY,kBAAoB/8G,WAAW+8G,EAAYx7F,QAAUvhB,WAAW+8G,EAAYjB,UAAY97G,WAAW+8G,EAAYvF,UAE5G,OAAVX,EACFrgF,EAAOI,UAAUrD,SAAS,OAKzBwpF,EAAY,eAAiB/8G,WAAW+8G,EAAY/F,SAA6C,EAAlCh3G,WAAW+8G,EAAY9F,SAAiD,EAAlCj3G,WAAW+8G,EAAY7F,SAAmD,EAAnCl3G,WAAW+8G,EAAY5F,UACnK4F,EAAY,aAAe/8G,WAAW+8G,EAAY3F,MAAQp3G,WAAW+8G,EAAY1F,MACjF0F,EAAY,cAAgB/8G,WAAW+8G,EAAY/F,SAAWh3G,WAAW+8G,EAAY9F,SAAWj3G,WAAW+8G,EAAY7F,SAAWl3G,WAAW+8G,EAAY5F,UAAYn3G,WAAW+8G,EAAYzF,OAC5LyF,EAAkB,KAAI/8G,WAAW+8G,EAAY/F,SAAWh3G,WAAW+8G,EAAY9F,SAAWj3G,WAAW+8G,EAAY7F,SAAWl3G,WAAW+8G,EAAY5F,WAGxI,OAAVN,GAAoBuF,EAOV,OAAVvF,IACDrgF,EAAOI,UAAUrD,SAAS,OAC1BwpF,EAAY,eAAiB/8G,WAAW+8G,EAAY,eAAiB/8G,WAAW+8G,EAAY,eAC5FA,EAAY,aAAe/8G,WAAW+8G,EAAY,aAAe/8G,WAAW+8G,EAAY,aACxFA,EAA2B,cAAI/8G,WAAW+8G,EAAY,wBAGtDA,EAAY,eAAiB/8G,WAAW+8G,EAAY,eAAiB/8G,WAAW+8G,EAAY,cAC5FA,EAAY,aAAe/8G,WAAW+8G,EAAY,aAAe/8G,WAAW+8G,EAAY,eAd5FA,EAAY,iBAAmB/8G,WAAW+8G,EAAYtF,OACtDsF,EAAY,qBAAuB/8G,WAAW+8G,EAAY,qBAAuB/8G,WAAW+8G,EAAY,uBACnG/8G,WAAW+8G,EAAYx7F,UACxBw7F,EAAoB,OAAI/8G,WAAW+8G,EAAYxF,OAASv3G,WAAW+8G,EAAYvF,aAtJnFwH,CAAc/B,GACtBgC,WAMahC,cACjB/C,EAAY,MACLqD,UAAU1G,eAAoBoG,MAChCloH,KAAKyoH,GAAYA,EAAS/sE,GAAK+sE,EAASC,OAAS,MACjD1oH,KAAK3F,QACF8qH,EAAY9qH,GAAQA,EAAK2qH,MAAQ3qH,EAAK2qH,MAAQ,UAC9CI,EAAe/qH,GAAQA,EAAK8vH,OAAS9vH,EAAK8vH,OAAS,QAEtDC,eAAcjF,EAAY,UAAMC,EAAe,QAdxCiF,CAAYnC,GAExBtoH,QAAQo5D,KAAKuvD,EAAOqB,EAAOM,IAAQlqH,KAAK29C,QACpCsqE,WAacD,EAAaD,OAC3BuC,SACJzxH,cACS2wH,KAAQxB,OACTlkH,SACU,OAAVg+G,KAAoB,UAAW,UAAW,UAAW,WAAY,SAAStjF,SAASgrF,OAGzE,OAAV1H,IAAoB,qBAAqBtjF,SAASgrF,IAGxC,OAAV1H,IAAoB,QAAS,mBAAoB,sBAAsBtjF,SAASgrF,QAGpF3wH,EAAM4F,KAAK+qH,GACX1lH,EAAI3J,KAAOqvH,EACX1lH,EAAIw/B,WAAa0kF,EAAYwB,GAE7B1lH,EAAI6gC,SAAWojF,EAAUyB,IACrB1lH,EAAI6gC,cACA4lF,EAAuBf,EAAK96G,QAAQ,KAAM,KAC9C5K,EAAI6gC,SAAWojF,EAAUwC,GAE7BzmH,EAAI2hH,GAAKztH,KAAKyhB,KAAK3V,EAAI6gC,UACvB2lF,EAAS7rH,KAAKqF,WAEXwmH,EAvCYE,CAAaxC,EAAaD,6QAT9CV,EAAsB,OAAVvF,GAAmBrgF,EAAOI,UAAUrD,SAAS,yBACzD4pF,EAAY3mF,EAAOz7B,qBACnBsiH,kPCX2CjxH,wBAA2CA,YAA4BA,YAAgBA,aAAiBA,wGAAxGA,iCAA2CA,qBAA4BA,qBAAgBA,sBAAiBA,sIADzIA,qjBAJjBmC,SACIJ,OACEA,OACEA,6BAKAA,sBAJS/B,uMAVFoqC,aACAqgF,EAAS,kBACToG,yBACAhD,GAAqB,4BACrBiD,omDCumB6B9wH,MAAkBa,aACZb,MAAgBa,oCAvFhCy5B,GAAYoB,GAAYmD,GAAW8B,iBAC/B,eACD3gC,kBACC0H,KAAM,cAAe6zB,WAAW,gBAE1C63F,KACIvtG,cAAe,EACfyC,aAAc,IAElB+qG,KACIxtG,cAAe,EACfyC,aAAc,IAElBgrG,MACIztG,cAAe,EACfyC,aAAc,IAElBirG,MACI1tG,cAAe,EACfyC,aAAc,IAElBkrG,MACI3tG,cAAe,EACfyC,aAAc,sDAiErBtoB,MAAgBa,OAAS,YAyBfb,6BAALa,y0BA3BN,mDACA,qiDA/GpBsB,SASIJ,OACIA,OACIA,cAWAA,2BAoCAA,OACIA,OACIA,cAMAA,cAMAA,cAKAA,gBAUpBI,SAOIJ,OAGIA,OACIA,cAWAA,OACIA,4BACAA,oDAiBAA,OACIA,cAOAA,2DAsBRA,qHApIqB/B,kGAoFOA,MAAkBa,gDACZb,MAAgBa,oBACzCb,MAAgBa,OAAS,2FAyBfb,eAALa,yIAAAA,6MApF2Bb,yGAAAA,2aAF1BA,2BAALa,8NAAKb,cAALa,kIAAAA,+DAAAA,yKA+DgBb,MAAgB,GAAG,GAAG,GAAG8C,UAAS9C,MAAgB,GAAG,GAAG,GACjE8C,UAAS9C,MAAgB,GAAG,GAAG,GAAG8C,UAGxB9C,MACXA,MAAgBa,OAAS,GAC3B,GAAG,GAAGiC,UAAS9C,MACbA,MAAgBa,OAAS,GAC3B,GAAG,GAAGiC,UAAS9C,MACbA,MAAgBa,OAAS,GAC3B,GAAG,GAAGiC,iCAXR,4BAC4C,kBAClC,kCAEV,6BAGa,kBAEA,sBATjBX,4DAIAA,+EAHkBnC,MAAgB,GAAG,GAAG,GAAG8C,qCAAS9C,MAAgB,GAAG,GAAG,GACjE8C,qCAAS9C,MAAgB,GAAG,GAAG,GAAG8C,qCAGxB9C,MACXA,MAAgBa,OAAS,GAC3B,GAAG,GAAGiC,qCAAS9C,MACbA,MAAgBa,OAAS,GAC3B,GAAG,GAAGiC,qCAAS9C,MACbA,MAAgBa,OAAS,GAC3B,GAAG,GAAGiC,0FAsBO9C,OAAO,GAAG,GAAG8C,WAGZ9C,OAAO,GAAG,GACVA,MAAkBa,QACpBqsH,QAAQ,QACRltH,OAAO,GAAG,qGAXFA,OAAO,GAAG,GAAG8C,yDAGd9C,OAAO,GAAG,GAAG2rC,gQAN9BxpC,SACKJ,OACIA,cAOJA,cAKAA,0CAXa/B,OAAO,GAAG,GAAG8C,4CAGd9C,OAAO,GAAG,GAAG2rC,6CAEnB3rC,OAAO,GAAG,GAAG8C,sCAGZ9C,OAAO,GAAG,GACVA,MAAkBa,QACpBqsH,QAAQ,mCACRltH,OAAO,GAAG,yFA2WhB,uBACN,4LACI+O,OAAO69G,8FAAP79G,OAAO69G,iTA7QJ,cAAZ5sH,gBA2DqB,QAArBA,gBAmBIA,KAAMa,OAAS,gCAiDD,OAAVb,oCAKEA,6BAALa,wDAsCiB,OAAVb,oCAMFA,6BAALa,y1BAlDC,+DAKE,yPAsCF,yFAKM,kXA9NF,uPAaA,8hBAqBA,m0BA8CA,uPAaA,8nBArGfsB,kBACAA,SACIJ,6BAIgB/B,aAIhB+B,gBAIJI,SACIJ,6BAIgB/B,aAIhB+B,cAGAA,gBASJI,SACIJ,6BAIgB/B,aAIhB+B,cAGAA,uCAgCJI,kBACAA,kBACAA,SACIJ,6BAIgB/B,aAIhB+B,gBAIJI,SACIJ,6BAIgB/B,aAIhB+B,cAGAA,yCA0BAI,oBACAA,4CA+CAA,UACIJ,kBACAA,yGA+BAA,SACIA,mBAORI,oBAEAA,UACIJ,kBACAA,yGAoEAA,SACIA,mNAhSQ/B,yCAaAA,yCAqBAA,OAgBH,cAAZA,mHA8BeA,0CAaAA,OAgBM,QAArBA,kFAmBIA,KAAMa,OAAS,wKAsDTb,eAALa,wIAAAA,kGA4CKb,eAALa,wIAAAA,6kBA3K0B,GAAnBb,SAEwB,GAAnBA,SAEmB,GAAnBA,4EALT,iRAFTmC,SACIJ,oCAUAA,WAEgB/B,8IAAAA,8EANmB,6EAFA,+EAFL,kHA0DzB,uBAAgBA,0OAFzBmC,SACIJ,4BAGAA,WAEgB/B,oFAJKA,uBAILA,gGAeD,OAAVA,+BAKEA,2BAALa,qCA0B4B,GAArBb,MAAWa,4FAhCjB,6DAKE,mJAPTsB,SACIJ,cACAA,0FA+BAA,+BAUJI,gGAnCWnC,cAALa,4HAAAA,OA0B4B,GAArBb,MAAWa,2JA7Bb,gFAFc,gFAcN,kFAFc,kFAWd,kFAFc,oKATN,OAAVb,4FASU,OAAVA,mLALA,8FASA,+cAnBTmC,SACIJ,cACAA,OACIA,WAAwD/B,OAAGga,YAE/DjY,iCAMAA,OACIA,WAAwD/B,OAAGyzH,sBAE/D1xH,iCAOAA,yGAlB4D/B,OAAGga,SAAHha,OAAGga,kFASHha,OAAGyzH,mBAAHzzH,OAAGyzH,8PAcnEtxH,yGAeG,gFAFc,gFAcF,kFAFc,6EAUXnC,OAAK0zH,UAAO1zH,OAAK2zH,mEADR3zH,OAAK+qC,qCAApB5oC,kKATW,OAAVnC,+BAQEA,2BAALa,8NAJG,+UAG+Bb,OAAG6vH,8KAb/C1tH,SACIJ,cACAA,OACIA,WAAwD/B,OAAGga,YAE/DjY,iCAOAA,OACAA,sDAAwC/B,OAAG6vH,aAQ3C9tH,+GAlB4D/B,OAAGga,SAAHha,OAAGga,mFAWpDha,cAALa,+HAAAA,2BADkCb,OAAG6vH,iFA0BxC,gFAFc,waAaL1tH,SACAA,SACAA,SACAA,SACAA,ibAGAA,SACAA,SACAA,SACAA,SACAA,6jBAGAA,SACAA,SACAA,SACAA,SACAA,SACAA,SACAA,uXAGAA,SACAA,SACAA,SACAA,oFA3Be,OAAVnC,aAOU,OAAVA,aAOU,OAAVA,aASU,OAAVA,gMAxB+BA,2CAF5CmC,SAEIJ,4FAAwC/B,4CACrB,8DAOA,OAAVA,mDAOU,OAAVA,mDASU,OAAVA,wEAxB+BA,0GAHzCA,OAAGwqC,+BAAR3pC,mfADNsB,2DAqCIJ,OACIA,cAmBJA,4FAxDO/B,OAAGwqC,kBAAR3pC,4HAAAA,kGA8IPb,OAAK6qC,oBACL7qC,OAAK8qC,oBACL9qC,OAAKsrC,mGAFLtrC,OAAK6qC,gCACL7qC,OAAK8qC,gCACL9qC,OAAKsrC,0aALrBtrC,0BAALa,0NAAKb,aAALa,kIAAAA,+DAAAA,iJAoCgCb,OAAM4zH,0DADG5zH,OAAM6zH,mCAArB1xH,wCACMnC,OAAM4zH,uCADG5zH,OAAM6zH,sFAHf7zH,OAAM4zH,0DADG5zH,OAAM6zH,iDAArB1xH,wCACMnC,OAAM4zH,uCADG5zH,OAAM6zH,uGADpB7zH,OAAM6zH,UAAY7zH,oNA0BrBA,OAAK0zH,UAAO1zH,OAAK2zH,mEADR3zH,OAAK+qC,qCAApB5oC,0eAiCgBnC,6FAVxBmC,SAMIJ,cACAA,OACIA,OAQIA,OACAA,WAPY/B,sFAAAA,2mBAvBJA,iEAHpBmC,SACIJ,cACAA,OAMIA,OACAA,OACAA,OACAA,OACAA,WATY/B,iEAAAA,uEA2HuBA,uJANdA,OAAQ,gBACdA,yIAKOA,OAAQ,YAZ1BmC,+BAEgBnC,eAQhBmC,8FAHWnC,2EALKA,wBAUeA,gNA6ENA,OAAO8C,kBACN9C,OAAO2rC,kBACZ3rC,OAAO0rC,kBACL1rC,OAAOwqC,iBACVxqC,OAAOurC,kBACHvrC,OAAOyrC,sDAGT,6DAGIzrC,MACVA,OAAO6vH,2HAZE7vH,OAAO8C,8BACN9C,OAAO2rC,8BACZ3rC,OAAO0rC,8BACL1rC,OAAOwqC,6BACVxqC,OAAOurC,8BACHvrC,OAAOyrC,8BAMLzrC,MACVA,OAAO6vH,gNA/BE7vH,OAAO8C,kBACN9C,OAAO2rC,kBACZ3rC,OAAO0rC,kBACL1rC,OAAOwqC,iBACVxqC,OAAOurC,kBACHvrC,OAAOyrC,sDAGT,mCAEIzrC,MACVA,OAAO6vH,2HAXE7vH,OAAO8C,8BACN9C,OAAO2rC,8BACZ3rC,OAAO0rC,8BACL1rC,OAAOwqC,6BACVxqC,OAAOurC,8BACHvrC,OAAOyrC,8BAKLzrC,MACVA,OAAO6vH,8MAhBd7vH,MAAkBA,SAAWA,OAAO8zH,aAAe9zH,OAAO+zH,UAAYzpF,GAAetqC,OAAQA,QAAemqC,GAAanqC,OAAQA,QAAuBirC,GAAajrC,OAAO6vH,KAAM7vH,8CAmB7KA,OAAO8zH,aAAe9zH,OAAO+zH,UAAYzpF,GAAetqC,OAAQA,QAAemqC,GAAanqC,OAAQA,QAAuBirC,GAAajrC,OAAO6vH,KAAM7vH,ghBA4C3JmC,kNANAA,mNANAA,8LAgCAA,uMANAA,wMANAA,0LA+BAA,mMANAA,oMANAA,6LA+BAA,sMANAA,uMANAA,gKAgJ8BnC,OAAOwqC,eAEyBxqC,OAAO8C,UAGrC9C,MACJA,OAAO6vH,YAkBnB7vH,OAAOurC,OAAOC,uBAoBhB7qC,KAAKqiC,MACFhjC,OAAOyrC,MACHzrC,OAAOurC,OACJ,KACJ,KACJ,kEAzC+B,KAAlBvrC,OAAO0rC,WAKgB,KAAlB1rC,OAAO0rC,SAAoC,KAAlB1rC,OAAO0rC,SAAoC,OAAlB1rC,OAAO0rC,4VAW9E,2OA3Ca1rC,OAAO8C,2EAIR9C,OAAO2rC,s0BAV5BxpC,SACIJ,OACIA,OACIA,cAUAA,OAGIA,OAOKA,qBAIDA,qBAEJA,+CAmBZA,4BAGAA,OACIA,OAIIA,cAIAA,WAIgB/B,OAAOyrC,aAI/B1pC,cAOCA,OAKAA,gHA1EiB/B,OAAO8C,uCAIR9C,OAAO2rC,wCAeF3rC,OAAOwqC,qCAEyBxqC,OAAO8C,gCAGrC9C,MACJA,OAAO6vH,sHAkBnB7vH,OAAOurC,OAAOC,mDAeExrC,OAAOyrC,UAAPzrC,OAAOyrC,uBAKzB9qC,KAAKqiC,MACFhjC,OAAOyrC,MACHzrC,OAAOurC,OACJ,KACJ,KACJ,iJAzIcvrC,OAAOwqC,eAEyBxqC,OAAO8C,UAGrC9C,MACJA,OAAO6vH,YAkBnB7vH,OAAOurC,OAAOC,uBAoBhB7qC,KAAKqiC,MACFhjC,OAAOyrC,MACHzrC,OAAOurC,OACJ,KACJ,KACJ,iEAzC+B,KAAlBvrC,OAAO0rC,WAKgB,KAAlB1rC,OAAO0rC,SAAoC,KAAlB1rC,OAAO0rC,SAAoC,OAAlB1rC,OAAO0rC,wYAW9E,2OA3Ca1rC,OAAO8C,2EAIR9C,OAAO2rC,21BAlB5BxpC,SASIJ,OACIA,OACIA,cAUAA,OAGIA,OAOKA,qBAIDA,qBAEJA,+CAmBZA,4BAGAA,OACIA,OAIIA,cAIAA,WAIgB/B,OAAOyrC,aAI/B1pC,cAOCA,OAKAA,0JA1EiB/B,OAAO8C,uCAIR9C,OAAO2rC,wCAeF3rC,OAAOwqC,qCAEyBxqC,OAAO8C,gCAGrC9C,MACJA,OAAO6vH,sHAkBnB7vH,OAAOurC,OAAOC,mDAeExrC,OAAOyrC,UAAPzrC,OAAOyrC,uBAKzB9qC,KAAKqiC,MACFhjC,OAAOyrC,MACHzrC,OAAOurC,OACJ,KACJ,KACJ,+EAuDkBvrC,OAAO0rC,iFAFbvpC,uCAEMnC,OAAO0rC,2IAPbvpC,sDAjFMnC,OAAO0rC,iFAFbvpC,uCAEMnC,OAAO0rC,2IAPbvpC,4GA3CvBnC,MAAkBA,SAAWA,OAAO8zH,aAAe9zH,OAAO+zH,UAAYzpF,GAAetqC,OAAQA,QAAemqC,GAAanqC,OAAQA,QAAuBirC,GAAajrC,OAAO6vH,KAAM7vH,+CAgG7KA,OAAO8zH,aAAe9zH,OAAO+zH,UAAYzpF,GAAetqC,OAAQA,QAAemqC,GAAanqC,OAAQA,QAAuBirC,GAAajrC,OAAO6vH,KAAM7vH,oVA+H9IA,OAAO8C,kBACN9C,OAAO2rC,kBACZ3rC,OAAO0rC,kBACL1rC,OAAOwqC,iBACVxqC,OAAOurC,kBACHvrC,OAAOyrC,sDAGT,6DAGIzrC,MACVA,OAAO6vH,2HAZE7vH,OAAO8C,8BACN9C,OAAO2rC,8BACZ3rC,OAAO0rC,8BACL1rC,OAAOwqC,6BACVxqC,OAAOurC,8BACHvrC,OAAOyrC,8BAMLzrC,MACVA,OAAO6vH,gNA/BE7vH,OAAO8C,kBACN9C,OAAO2rC,kBACZ3rC,OAAO0rC,kBACL1rC,OAAOwqC,iBACVxqC,OAAOurC,kBACHvrC,OAAOyrC,sDAGT,mCAEIzrC,MACVA,OAAO6vH,2HAXE7vH,OAAO8C,8BACN9C,OAAO2rC,8BACZ3rC,OAAO0rC,8BACL1rC,OAAOwqC,6BACVxqC,OAAOurC,8BACHvrC,OAAOyrC,8BAKLzrC,MACVA,OAAO6vH,8MAhBd7vH,MAAkBA,SAAYA,OAAO8zH,YAAe9zH,OAAO+zH,WAAYzpF,GAAetqC,OAAQA,SAAemqC,GAAanqC,OAAQA,SAAuBirC,GAAajrC,OAAO6vH,KAAM7vH,6CAmB7KA,OAAO8zH,YAAe9zH,OAAO+zH,WAAYzpF,GAAetqC,OAAQA,SAAemqC,GAAanqC,OAAQA,SAAuBirC,GAAajrC,OAAO6vH,KAAM7vH,ghBA2C5JmC,mNANAA,oNANAA,+LAgCAA,wMANAA,yMANAA,2LA+BAA,oMANAA,qMANAA,8LA+BAA,uMANAA,wMANAA,uJAkH8BnC,OAAOwqC,eAEyBxqC,OAAO8C,UAGrC9C,MACJA,OAAO6vH,WAkBnB7vH,OAAOurC,OAAOC,sBAEdxrC,OAAOyrC,UAET9qC,KAAKqiC,MACFhjC,OAAOyrC,MACHzrC,OAAOurC,OACJ,KACJ,KACJ,gEAzB+B,KAAlBvrC,OAAO0rC,WAKgB,KAAlB1rC,OAAO0rC,SAAoC,KAAlB1rC,OAAO0rC,SAAoC,OAAlB1rC,OAAO0rC,sQAW9E,2BAEA,yJA1Ca1rC,OAAO8C,gBACR9C,OAAO2rC,mmBAT5BxpC,SACIJ,OACIA,OACIA,cASAA,OAGIA,OAOKA,qBAIDA,qBAEJA,6CAmBZA,qBAECA,qBAEAA,cAOAA,+EAlDiB/B,OAAO8C,uCACR9C,OAAO2rC,wCAeF3rC,OAAOwqC,qCAEyBxqC,OAAO8C,gCAGrC9C,MACJA,OAAO6vH,uGAkBnB7vH,OAAOurC,OAAOC,4CAEdxrC,OAAOyrC,gCAET9qC,KAAKqiC,MACFhjC,OAAOyrC,MACHzrC,OAAOurC,OACJ,KACJ,KACJ,oIAnGcvrC,OAAOwqC,eAEyBxqC,OAAO8C,UAGrC9C,MACJA,OAAO6vH,WAkBnB7vH,OAAOurC,OAAOC,sBAEdxrC,OAAOyrC,UAET9qC,KAAKqiC,MACFhjC,OAAOyrC,MACHzrC,OAAOurC,OACJ,KACJ,KACJ,gEAzB+B,KAAlBvrC,OAAO0rC,WAKgB,KAAlB1rC,OAAO0rC,SAAoC,KAAlB1rC,OAAO0rC,SAAoC,OAAlB1rC,OAAO0rC,sQAW9E,2BAEA,0HA7Ca1rC,OAAO8C,2EAIR9C,OAAO2rC,yjBAV5BxpC,SACIJ,OACIA,OACIA,cAUAA,OAGIA,OAOKA,qBAIDA,qBAEJA,6CAmBZA,qBAECA,qBAEAA,cAOAA,+EArDiB/B,OAAO8C,uCAIR9C,OAAO2rC,wCAeF3rC,OAAOwqC,qCAEyBxqC,OAAO8C,gCAGrC9C,MACJA,OAAO6vH,uGAkBnB7vH,OAAOurC,OAAOC,4CAEdxrC,OAAOyrC,gCAET9qC,KAAKqiC,MACFhjC,OAAOyrC,MACHzrC,OAAOurC,OACJ,KACJ,KACJ,4EAiDkBvrC,OAAO0rC,iFAFbvpC,uCAEMnC,OAAO0rC,2IAPbvpC,sDA3DMnC,OAAO0rC,iFAFbvpC,uCAEMnC,OAAO0rC,2IAPbvpC,4GAnCvBnC,MAAkBA,SAAYA,OAAO8zH,YAAe9zH,OAAO+zH,WAAYzpF,GAAetqC,OAAQA,SAAemqC,GAAanqC,OAAQA,SAAuBirC,GAAajrC,OAAO6vH,KAAM7vH,8CAmE7KA,OAAO8zH,YAAe9zH,OAAO+zH,WAAYzpF,GAAetqC,OAAQA,SAAemqC,GAAanqC,OAAQA,SAAuBirC,GAAajrC,OAAO6vH,KAAM7vH,+QA6JnKA,OAAKg0H,wXAXwBh0H,OAAKi0H,YAClCC,WAAW,IAAK,KAChBA,WAAW,IAAK,IAChBA,WAAW,IAAK,IAChBA,WAAW,IAAK,IAChBA,WACG,IACA,QACAl0H,qEAjBZmC,SAmBIJ,qBAGAA,8CApBS/B,MAAKA,UAALA,MAAKA,6GAkBTA,OAAKg0H,qEAXwBh0H,OAAKi0H,YAClCC,WAAW,IAAK,KAChBA,WAAW,IAAK,IAChBA,WAAW,IAAK,IAChBA,WAAW,IAAK,IAChBA,WACG,IACA,QACAl0H,8KA9CKA,OAAKoqC,OAAOtnC,UAaL9C,MAAoBA,QAAKwrC,sBAIzBxrC,OAAKoqC,OAAOqB,8BAhBQ,KAAvBzrC,OAAKoqC,OAAOsB,WAIgB,KAAvB1rC,OAAKoqC,OAAOsB,SAAyC,KAAvB1rC,OAAKoqC,OAAOsB,SAAyC,OAAvB1rC,OAAKoqC,OAAOsB,oNAQ7E,iBACJ,iHAGI,oEA7BH1rC,OAAKoqC,OAAOtnC,mCAEb9C,OAAKoqC,OAAOuB,sjBAR7BxpC,SAIIJ,OACIA,cAQJA,OAGIA,OACIA,2CAYAA,OACIA,4BAIAA,4BAKRA,oEAjCU/B,OAAKoqC,OAAOtnC,uCAEb9C,OAAKoqC,OAAOuB,wCAUZ3rC,OAAKoqC,OAAOtnC,sGAaL9C,MAAoBA,QAAKwrC,4CAIzBxrC,OAAKoqC,OAAOqB,4EAVVzrC,OAAKoqC,OAAOsB,iFADlBvpC,uCACMnC,OAAKoqC,OAAOsB,2IALlBvpC,yEArBnBnC,OAAKoqC,8NAsLOpqC,OAAKg0H,4VAXwBh0H,OAAKi0H,YAClCC,WAAW,IAAK,KAChBA,WAAW,IAAK,IAChBA,WAAW,IAAK,IAChBA,WAAW,IAAK,IAChBA,WACG,IACA,QACAl0H,gEAhBZmC,SAkBIJ,qBAGAA,8CApBS/B,MAAKA,UAALA,MAAKA,6GAkBTA,OAAKg0H,qEAXwBh0H,OAAKi0H,YAClCC,WAAW,IAAK,KAChBA,WAAW,IAAK,IAChBA,WAAW,IAAK,IAChBA,WAAW,IAAK,IAChBA,WACG,IACA,QACAl0H,2KAlDKA,OAAKoqC,OAAOtnC,UAkBL9C,MAAoBA,QAAKwrC,sBAIzBxrC,OAAKoqC,OAAOqB,8BApBY,KAAvBzrC,OAAKoqC,OAAOsB,WAKgB,KAAvB1rC,OAAKoqC,OAAOsB,SAAyC,KAAvB1rC,OAAKoqC,OAAOsB,SAAyC,OAAvB1rC,OAAKoqC,OAAOsB,+NAWjF,iBACJ,yHAGI,oEAlCH1rC,OAAKoqC,OAAOtnC,mCAEb9C,OAAKoqC,OAAOuB,qhBAP7BxpC,SAGIJ,OACIA,cAQJA,OAGIA,OACIA,qBAEIA,6BAeJA,OACIA,4BAIAA,4BAKRA,oEAtCU/B,OAAKoqC,OAAOtnC,uCAEb9C,OAAKoqC,OAAOuB,wCAUZ3rC,OAAKoqC,OAAOtnC,sGAkBL9C,MAAoBA,QAAKwrC,4CAIzBxrC,OAAKoqC,OAAOqB,4EAZNzrC,OAAKoqC,OACFsB,iFAHTvpC,uCAEMnC,OAAKoqC,OACFsB,2IARTvpC,yEArBvBnC,OAAKoqC,+mBAz7BjBpqC,WA+HSA,KAAOwrC,uBAksBNxrC,KAAOwrC,uBAsGPxrC,KAAOwrC,gDArgDN,uBACN,6MACIz8B,OAAO69G,mDAiBV5sH,YACfA,cACCA,yBACWA,YACZA,eAEPA,4DAgMgBA,4DA2VHs6B,GAAYoB,GAAYmD,GAAW8B,iBAC/B,eACD3gC,kBACCu7B,WAAW,gBAErB63F,KACIvtG,cAAe,EACfyC,aAAc,IAElB+qG,KACIxtG,cAAe,EACfyC,aAAc,IAElBgrG,MACIztG,cAAe,EACfyC,aAAc,IAElBirG,MACI1tG,cAAe,EACfyC,aAAc,IAElBkrG,MACI3tG,cAAe,EACfyC,aAAc,wFAiCKtoB,0BAALa,iMAVMb,8GAHhBmC,SACIJ,cACAA,kHAWW/B,aAALa,+HAAAA,6BAVMb,6CAmCLA,6BAALa,yDAOLb,oCAkHcA,4BAALa,wCAiESb,4BAALa,oGAmD+B,GAAxBb,MAAmB,SAMW,GAAzBA,MAAmB,yDAcE,GAA1BA,MAAqB,WAMW,GAA3BA,MAAqB,2DAaF,GAAxBA,MAAmB,SAMW,GAAzBA,MAAmB,yDAaD,GAAvBA,MAAkB,QAMW,GAAxBA,MAAkB,mCAgBrBA,4BAALa,wCAuMCb,4BAALa,oGAkD+B,GAAxBb,MAAmB,SAMW,GAAzBA,MAAmB,yDAcE,GAA1BA,MAAqB,WAMW,GAA3BA,MAAqB,2DAaF,GAAxBA,MAAmB,SAMW,GAAzBA,MAAmB,yDAaD,GAAvBA,MAAkB,QAMW,GAAxBA,MAAkB,mCAgBrBA,4BAALa,wCA4JXjC,OAAOi3B,QAAQ71B,6BAApBa,wCA+GSjC,OAAOi3B,QAAQ71B,6BAApBa,0wDA1zBuB,mBACK,gBAAQb,YAAO,iBAASA,YAAiB,yCAChEA,YAAY,wmCAisBd,iGAICA,YAAO,oLAkGR,iGAICA,YAAO,u+BA54BDA,unGAzoBpCmC,SAQIJ,OACIA,OACIA,2BAOAA,0DA+LZI,SAOIJ,OACIA,OACIA,cAWAA,8BA4UAA,gBAUZI,SAIIJ,oCAwCJI,SACIJ,OACIA,OACIA,+BA6BIA,OACIA,cACAA,OAQIA,wDAPY/B,mCAuDxB+B,QACIA,kBAmCAA,SACIA,SAGIA,0FAGCA,kBAUTA,SACIA,SACIA,SAKIA,iCAEgB/B,eAQhB+B,yEAsBRA,SACIA,SACIA,kBAIAA,cAIgB/B,gBAWxB+B,SACIA,SACIA,kBAMAA,kBASZA,SACIA,SAMIA,SACIA,gEA8CJA,SAIIA,SACIA,qGA8EIA,SAAaA,kBAEjBA,gEAgMZA,SAMIA,SACIA,gEA6CJA,SAIIA,SACIA,qGA8EIA,kBAEJA,+DAgJxBA,QACIA,SACIA,SACIA,SACIA,kBACAA,oCAEJA,SACIA,kBACAA,oCAGRA,+DAmFRA,QAQIA,SACIA,SACIA,SACIA,kBACAA,oCAEJA,SACIA,kBACAA,oCAGRA,kBAOJA,SACIA,SACIA,mRAnhDUgN,OAAO69G,kEAiBV5sH,gCACfA,kCACCA,uCACWA,yBACZA,gBAEPA,6TA6hBgBA,8GA+EUA,eAALa,yIAAAA,8BARUb,0GAgGNA,KAAOwrC,sDAAyBxrC,kCAAgBA,2CAqBlCA,+BAYTA,cAALa,0IAAAA,kCA4Bcb,YAAAA,6CAqCLA,cAALa,oIAAAA,oXAmISb,cAALa,0IAAAA,gDAuMCb,cAALa,oIAAAA,mXAkISb,cAALa,0IAAAA,kCAoJPb,KAAOwrC,sDAIRxrC,uCAIHpB,OAAOi3B,QAAQ71B,eAApBa,0IAAAA,kCA8FSb,KAAOwrC,sDAIRxrC,uCAaCpB,OAAOi3B,QAAQ71B,eAApBa,0IAAAA,gHAvtBQA,uCA0UAA,6iBA3rCrBszH,GAAY9wH,GACjBA,EAAMrB,OAAO8D,UAAU+K,OAAO,+BA7Z9B05B,EAAa,MAEb6pF,EAAS,EACTC,EAAW,aACXC,EAAkB,EAClBC,EAAoB,OACpBC,EAA2B,OAC3BC,KACAC,SACAC,EAAqB,GACrBC,GAAiB9xH,KAAM,EAAGyoC,OAAQ,EAAGE,KAAM,EAAGhZ,IAAK,YAC5CoiG,YACAnqF,aACAa,eACAsoF,sBACAiB,aACAC,mBACAC,aACAvK,uBACAwK,GAAoB,KAAM,KAAM,KAAM,KAAM,4BAC5CpH,GAAqB,4BACrBiD,QACPoE,EAAc,IACbrH,IACDqH,EAAc,SAadC,EACAC,EAZAC,KACAC,KACAC,KACApqF,EAAe,MACfR,EAAQF,GAASC,GACjB8qF,EAASzmH,OAAOwR,WAAa,IAC7Bk1G,EAAclqF,EACdmqF,EAAuB,KACvBC,EAAmB,EACnBC,EAAch3H,OAAO+C,KAAKozH,GAAQl0H,OAClCg1H,EAAkBzqF,GAAYV,YASzB8B,EAAgBpC,QACrB+qF,EAAsB/qF,EAAOymF,cAC7BuE,EAAehrF,OACGgmF,UAAU0F,MACxBn2H,SAASuN,eAAe,iBAEpByzD,gBAaHo1D,EAAQ1xH,EAAKwB,EAAS,MAChB,OAAPxB,WAaKsQ,KATgB,GAArBigH,EAAavwH,QACbuwH,EAAavwH,IAAQ,EAAIwB,UAEzB+uH,EAAavwH,GAAO,EAAIwB,KAE5BgvH,EAAQt/F,MAAMn2B,EAAGC,IACbD,EAAEiF,GAAOhF,EAAEgF,IAAQ,EAAIuwH,EAAavwH,GAAO,EAAIuwH,EAAavwH,WAG/CuwH,EACTjgH,GAAQtQ,QACRuwH,EAAajgH,GAAQ,kBAdzBqhH,EAAYnwH,YA4BXmwH,EAAYnwH,EAAS,WAWjB8O,KAVkB,GAAvBigH,EAAkB,SAClBA,EAAkB,KAAK,EAAI/uH,UAE3B+uH,EAAkB,IAAI,EAAI/uH,KAE9BgvH,EAAQt/F,MAAMn2B,EAAGC,IACbD,EAAEqsC,KAAOrsC,EAAEmsC,OAASlsC,EAAEosC,KAAOpsC,EAAEksC,QACxB,EAAIqpF,EAAkB,IACvB,EAAIA,EAAkB,KAEfA,EACD,OAARjgH,QACAigH,EAAajgH,GAAQ,6BAMxBshH,IACLlnH,OAAOmnH,eAAe,yBACtB/E,mBAAmB1G,MACfxtG,OAAQ,OACRk5G,SACIC,eAAgB,mBAChBC,OAAQ,mBACRC,cAAevnH,OAAOwnH,UAAU,cAEpCxpH,KAAM+sD,KAAKC,WACCg7D,OAAAA,EACRyB,kBAAmB3B,EACNK,YAAAA,EACCF,aAAAA,EACJX,SAAAA,EACOC,gBAAAA,EACEC,kBAAAA,EACOC,yBAAAA,EACdc,WAAAA,EACAD,WAAAA,EACIE,eAAAA,EACT7qF,MAAAA,MAGV/hC,KAAMyoH,GAAaA,EAASC,QAC5B1oH,KAAM3F,IACH+L,OAAO0nH,sBACPhC,EAAoBzxH,EAAK0zH,cACzBhC,EAAkB1xH,EAAK2zH,aACLvG,UAAU0F,MACxBn2H,SAASuN,eAAe,iBAEpByzD,SAEXoyD,MAAOtiC,IACJ1hF,OAAO0nH,iBACPtnE,QAAQpiB,IAAI0jD,GACZmmC,MAAM,+EA0BTC,EAAazsF,EAAQ+G,UACnBxwC,KAAKqiC,MAAMoH,EAAOmB,gBAPI4F,SACvBnwC,EAAO+zH,EAAO5jF,cACU,MAA1BnwC,EAAK81H,kBAAkC91H,EAAK81H,kBACzB,MAAnB91H,EAAK6uB,WAA2B7uB,EAAK6uB,WAClC,EAG2BknG,CAAwB5lF,aASrD6lF,EAAmB5sF,SAClB7mC,eACKc,KAAO0wH,SACR/zH,EAAO+zH,EAAO1wH,MACfrD,GAAuB,MAAfA,EAAKopC,iBACP6sF,KAAU7sF,EAAOI,aACpBxpC,EAAKizH,YAAY9sF,SAAS8vF,UACpBC,EAAOL,EAAazsF,EAAQ/lC,MAC9B6yH,GAAQ3rF,GACRhoC,EAAQ6D,MAAO/C,IAAAA,EAAK6yH,KAAAA,mBAM7B3zH,WAkBF8oC,EAAc//B,OACnBuoH,EAAQvoH,GAAOwnH,YAAa,cAEvB1nF,EAAc9/B,OACnBuoH,EAAQvoH,GAAOwnH,YAAa,cAEvB3nF,EAAa7/B,OACd89B,EAASyqF,EAAQvoH,GACjB6kC,WAvBoB/G,SAClB7mC,EAAUyzH,EAAmB5sF,UACZ,IAAnB7mC,EAAQ1C,SACZ0C,EAAQgyB,MAAMn2B,EAAGC,WACP83H,EAAMpC,EAAO31H,EAAEiF,MAAoC,MAA5B0wH,EAAO31H,EAAEiF,KAAKwrB,WAAsBklG,EAAO31H,EAAEiF,KAAKwrB,WAAa,EACtFunG,EAAMrC,EAAO11H,EAAEgF,MAAoC,MAA5B0wH,EAAO11H,EAAEgF,KAAKwrB,WAAsBklG,EAAO11H,EAAEgF,KAAKwrB,WAAa,SACnE,IAArB8lG,GAA0BwB,IAAOC,EAAWA,EAAKD,EAC9C/3H,EAAE83H,KAAO73H,EAAE63H,OAEf3zH,EAAQ,GAAGc,KAcRgzH,CAAmBjtF,OACxB+G,cACDylF,MAAM,wDAGJM,EAAOL,EAAazsF,EAAQ+G,GAClC0jF,EAAQtoH,OAAOD,EAAO,cAEtByoH,EAAO5jF,GAAK/G,OAASA,SACrBmB,GAAU2rF,QACV9C,GAAUhqF,EAAOqB,KAAOspF,EAAO5jF,GAAKthB,iBACpCukG,EAASzzH,KAAKqiC,MAAe,GAAToxF,GAAe,SACnCuB,GAAoB,YAEf2B,YACInmF,KAAO4jF,EACe,OAAvBA,EAAO5jF,GAAK/G,SAGZyqF,EAAQztH,KAAK2tH,EAAO5jF,GAAK/G,YACzB2qF,EAAO5jF,GAAK/G,OAAS,iBAQpBz1B,uBAHT42B,EAASkqF,QACTrB,EAAS,QACTuB,EAAmB,GACFf,EACa,GAAtBA,EAAajgH,IACbohH,EAAQphH,GAAO,YAIlB4iH,EAAepmF,MACO,OAAvB4jF,EAAO5jF,GAAK/G,kBAGZA,EAAS2qF,EAAO5jF,GAAK/G,eAOhBz1B,KANTkgH,EAAQztH,KAAKgjC,cAEbmB,GAAUsrF,EAAazsF,EAAQ+G,SAC/BijF,GAAUhqF,EAAOqB,KAAOspF,EAAO5jF,GAAKthB,iBACpCukG,EAASzzH,KAAKqiC,MAAe,GAAToxF,GAAe,QACnCW,EAAO5jF,GAAK/G,OAAS,QACJwqF,EACa,GAAtBA,EAAajgH,IACbohH,EAAQphH,GAAO,QAGvBghH,GAAoB,YAEf6B,EAAKn0H,EAAOiJ,GACjBopH,EAAuBppH,MACnBmrH,EAAiB5C,EAAQvoH,WAIpB6kC,KAHTziC,uBACIrL,EAAMrB,OAAO8D,UAAUqD,IAAI,WAEfsuH,EAAejtF,WAEhB,MAAP2G,EACAA,EAAM,SAEK,QAAPA,EACJA,EAAM,SAEK,MAAPA,EACJA,EAAM,SAEK,MAAPA,IACJA,EAAM,UAEVxxC,SAASsN,6BAA6BkkC,OAASnyC,QAAS04H,IACpDA,EAAI5xH,UAAUqD,IAAI,qBAGpBwuH,EAASh4H,SAASC,cAAc,OACtC+3H,EAAO7xH,UAAUqD,IAAI,YACrBwuH,EAAO7xH,UAAUqD,IAAI,QACrBwuH,EAAO7xH,UAAUqD,IAAI,QACrBwuH,EAAO7xH,UAAUqD,IAAI,UACrBwuH,EAAO7xH,UAAUqD,IAAI,YACrBwuH,EAAOrzH,MAAM61F,aAAe,aACtBy9B,EAAUj4H,SAASC,cAAc,OACvCg4H,EAAQ7zH,aAAa,MAAO0zH,EAAe9rF,WAC3CisF,EAAQ9xH,UAAUqD,IAAI,aACtByuH,EAAQtzH,MAAMwX,OAAS,cACjB+7G,EAAYl4H,SAASC,cAAc,OACzCi4H,EAAU/xH,UAAUqD,IAAI,UACxB0uH,EAAU/xH,UAAUqD,IAAI,eACxB0uH,EAAU/xH,UAAUqD,IAAI,sBACxB0uH,EAAU/xH,UAAUqD,IAAI,0BACxB0uH,EAAU/xH,UAAUqD,IAAI,qBAClB2uH,EAAUn4H,SAASC,cAAc,OACvCk4H,EAAQhyH,UAAUqD,IAAI,UACtB2uH,EAAQhyH,UAAUqD,IAAI,eACtB2uH,EAAQhyH,UAAUqD,IAAI,sBACtB2uH,EAAQhyH,UAAUqD,IAAI,0BACtB2uH,EAAQhyH,UAAUqD,IAAI,qBAChB4uH,EAASp4H,SAASC,cAAc,OAChCo4H,EAAUr4H,SAASC,cAAc,OACjCq4H,EAAYt4H,SAASC,cAAc,OACzCq4H,EAAUnyH,UAAUqD,IAAI,sBAClB+uH,EAAUv4H,SAASC,cAAc,OACvCq4H,EAAU3zH,MAAM6zH,WAAa,SAC7BD,EAAQ5zH,MAAM6zH,WAAa,SAC3BD,EAAQpyH,UAAUqD,IAAI,sBAChBivH,EAAWz4H,SAASsD,kBAAkBw0H,EAAe30H,MACrDu1H,EAAa14H,SAASsD,oBACnBw0H,EAAelsF,QAElB+sF,EAAW34H,SAASsD,oBAAoBw0H,EAAehsF,MAE7DssF,EAAO71H,YAAY01H,GACnBI,EAAQ91H,YAAYk2H,GACpBH,EAAU/1H,YAAYm2H,GACtBH,EAAQh2H,YAAYo2H,GACpBT,EAAU31H,YAAY61H,GACtBD,EAAQ51H,YAAY81H,GACpBF,EAAQ51H,YAAY+1H,GACpBH,EAAQ51H,YAAYg2H,GACpBP,EAAOz1H,YAAY21H,GACnBF,EAAOz1H,YAAY41H,GACnBH,EAAOrzH,MAAMi5B,SAAW,WACxBo6F,EAAOrzH,MAAMkQ,IAAM,UACnB7U,SAASoN,KAAK7K,YAAYy1H,GAC1Bt0H,EAAMk1H,aAAaC,aAAab,EAAQ,IAAK,aA4BxCc,EAAUp1H,EAAO8tC,OAClBsmF,EAAiB5C,EAAQa,GACzBgD,GAAY,UAEPzB,KAAUQ,EAAejtF,UAC1BuqF,EAAO5jF,GAAK8iF,YAAY9sF,SAAS8vF,KACjCyB,GAAY,GAGfA,IAID7B,EAAaY,EAAgBtmF,GAAO5F,IAG7B,MAAP4F,EACAA,EAAM,SAEK,QAAPA,EACJA,EAAM,SAEK,MAAPA,EACJA,EAAM,SAEK,MAAPA,IACJA,EAAM,UAEV9tC,EAAMrB,OAAO8D,UAAUqD,IAAI,QAC3B9F,EAAMmd,4BAKDm4G,GAAiBC,GAAiB,EAAMC,EAAY,SACrDC,EAAM,MAENF,WACSznF,KAAO4jF,EACZ+D,MAAU/D,EAAO5jF,GAAK4nF,WAAWF,IAErCC,GAAO,aAGFE,KAAevE,WACXrqF,KAAU4uF,EAAYntF,OAC3BitF,MAAU1uF,EAAOypF,WAAWgF,IAEhCC,GAAO,YAEJA,WAEFG,SACDH,EAAMH,SAENO,EAAgBv5H,SAASC,cAAc,KAC3Cs5H,EAAcr5H,KAAO,+BAAiCs5H,UAAUL,GAChEI,EAAcl3H,OAAS,aAEnBy1E,OAAgB9gE,MAAOmD,UAC3Bo/G,EAAcE,6BAA+B3hD,QAC7CyhD,EAAc32F,iBAET82F,SACDP,EAAMH,IAAiB,EAAO,MAClC1qH,UAAUqrH,UAAUC,UAAUT,GAzYlC7xH,OACI8uH,EAAQ,YASZhnH,OAAOyqH,oBANCzqH,OAAOwR,WAAa,SACpBi1G,GAAS,QAETA,GAAS,uiBA2BJ10H,EAAI,EAAGA,EAAIg0H,EAAgBj0H,OAAQC,OACpCg0H,EAAgBh0H,GAAG+yH,UAAYA,SACxB,SAGR,gBAuFkB1iF,SACnBnwC,EAAO+zH,EAAO5jF,UACfnwC,GAASA,EAAKopC,OACZysF,EAAa71H,EAAKopC,OAAQ+G,GADC,YAmCX/G,UAChB4sF,EAAmB5sF,GAAQvpC,OAAS,wBAkJjCswC,GACVxxC,SAASsN,iBAAiB,cAAcjO,QAASy6H,IAC7CA,EAAI3zH,UAAU+K,OAAO,mBAErB4mH,EAAiB5C,EAAQa,SACvBwB,EAAOL,EAAaY,EAAgBtmF,GACtC+lF,EAAO3rF,EACPqrF,MAAM,6CAGV/B,EAAQtoH,OAAOmpH,EAAsB,cAErCX,EAAO5jF,GAAK/G,OAASqtF,SACrBlsF,GAAU2rF,QACV9C,GAAUqD,EAAehsF,KAAOspF,EAAO5jF,GAAKthB,iBAC5CukG,EAASzzH,KAAKqiC,MAAe,GAAToxF,GAAe,SACnCuB,GAAoB,mBAwLgB0D,SAKAJ,gBAsHJ5E,8CAaAA,mCAqBAA,mCA+BIC,oCAeJC,mCAaAA,mCAwBIC,4CAwBuDx6G,8CASAy5G,8CASjB6B,EAAaA,EAAWzqH,iBAAgBmrB,UAAaA,IAAS0jG,iBAQ/FpE,MAAcA,EAAWluH,MAAM4S,IAAK,EAAG4wB,KAAMF,EAAM,GAAGivF,QAASlG,cAAe,gCAmB5Bz5G,sDAUpB61G,uCAQGwF,EAAaA,EAAWxqH,iBAAgBmrB,UAAaA,IAAS4jG,YAO/FvE,EAAWjuH,MAAM4S,IAAK,EAAG61G,KAAMllF,EAAM,GAAGI,oClG9PzF,IAA+B7lC,QAAAA,OACpB,GAAG0F,IAAI3C,KAAK/C,EAAO+H,iBAAiB,YAAa9H,GAAUA,EAAOC,6BkGuTnB,OAAVqlH,IACAoP,EAAGrvF,UAAUpjC,KAAK,gBAAUojC,UAAUqvF,EAAGrvF,cAE/B,OAAVigF,IACAoP,EAAGrvF,UAAUpjC,KAAK,gBAAUojC,UAAUqvF,EAAGrvF,cAE/B,OAAVigF,IACAoP,EAAGrvF,UAAUpjC,KAAK,eAASojC,UAAUqvF,EAAGrvF,cAE9B,OAAVigF,IACAoP,EAAGrvF,UAAUpjC,KAAK,eAASojC,UAAUqvF,EAAGrvF,wBAKN+qF,EAAiBA,EAAe1qH,iBAAgBmrB,UAAaA,IAAS6jG,gBAQhHC,GAAYtvF,cACF,OAAVigF,IACAqP,EAAStvF,UAAUpjC,KAAK,MACxB0yH,EAAStvF,UAAUpjC,KAAK,OAEd,OAAVqjH,IACAqP,EAAStvF,UAAUpjC,KAAK,MACxB0yH,EAAStvF,UAAUpjC,KAAK,OAEd,OAAVqjH,IACAqP,EAAStvF,UAAUpjC,KAAK,KACxB0yH,EAAStvF,UAAUpjC,KAAK,OAEd,OAAVqjH,IACAqP,EAAStvF,UAAUpjC,KAAK,KACxB0yH,EAAStvF,UAAUpjC,KAAK,MAE5BmuH,EAAenuH,KAAK0yH,iBA+ExB/qH,OAAOzB,SACH3N,SAASuN,eACL,gBACFtJ,kBAsBFunC,mDAmBI+pF,8BAuBIA,4BA7kClB9E,UAAU0F,MACxBn2H,SAASuN,eAAe,kBAEpByzD,mBAqpC4Bp2B,8CAeIA,wCAuBZ77B,kBAAgC,iBAExBimH,0BAcI2C,QAMArB,QAuEYF,EAAQ,YAMRA,EAAQ,YAORA,EAAQ,YAORA,EAAQ,cAMRA,EAAQ,cAMRA,EAAQ,cAORA,EAAQ,YAMRA,EAAQ,YAMRA,EAAQ,YAORC,QAMAA,QAMAA,QAoCQxpF,EACIpC,uBA4COqB,8BAcvBU,EAAa7/B,MAKb8/B,EAAc9/B,YAxFAjJ,aAljCjDA,GACbqL,uBACIrL,EAAMrB,OAAO8D,UAAU+K,OAAO,WAElClR,SAASsN,iBAAiB,cAAcjO,QAASy6H,IAC7CA,EAAI3zH,UAAU+K,OAAO,eA8iCmBkpH,CAAQ12H,OAEGA,IACXm0H,EAAKn0H,EAAOiJ,OA4GIkgC,EACIpC,uBA4COqB,8BAcvBU,EAAa7/B,MAKb8/B,EAAc9/B,OAuEVypH,EAAQ,YAMRA,EAAQ,YAORA,EAAQ,YAORA,EAAQ,cAMRA,EAAQ,cAMRA,EAAQ,cAORA,EAAQ,YAMRA,EAAQ,YAMRA,EAAQ,YAORC,QAMAA,QAMAA,QA4BQxpF,EACIpC,OA0ChBiC,EAAc//B,OAuBFkgC,EACIpC,OA0ChBiC,EAAc//B,MAqEdirH,EAAepmF,cAShB9tC,GACnBo1H,EAAUp1H,EAAO8tC,aAEG9tC,GACpB8wH,GAAY9wH,OAsGYk0H,EAAepmF,cAQhB9tC,GACnBo1H,EAAUp1H,EAAO8tC,aAEG9tC,GACpB8wH,GAAY9wH,ijBCr/DwBrD,MAAM,OAAKg6H,GAAYh6H,MAAKonB,YAAW4yG,GAAYh6H,MAAKwnB,uFAA1D,gBAAU,iBAA2B,yCADpFxnB,gEAAmHA,MAAKi6H,8DACvHj6H,4DADpBmC,+BAA4GnC,cAC5GmC,oIADsInC,MAAKi6H,mEAA/Bj6H,kBAC7Bg6H,GAAYh6H,MAAKonB,+BAAW4yG,GAAYh6H,MAAKwnB,yIAQhExnB,MAAIk6H,wFAD9Cl6H,6FAA4FA,MAAI49D,wGAC/D59D,eADvDmC,oBAA6FnC,iCAC7FmC,0FADkHnC,MAAI49D,yDAAzB59D,qCAC7BA,MAAIk6H,iIAOnDl6H,MAAIk6H,kDAAT/3H,oCAAKnC,MAAIk6H,gEAOFl6H,KAAcA,yFAAdA,KAAcA,mEADhBA,KAAoBA,yFAApBA,KAAoBA,+JAvB1BA,0BAALa,qCAQCb,KAAai6H,0BAAlBp5H,qCAQiBb,0BAALa,qCAMKjC,OAAOi3B,QAAQ71B,2BAApBa,8yBA1BlBsB,SACIJ,cACAA,OACIA,yDAOJA,cACAA,yDAMAA,OACIA,OACIA,OAA0BA,OAAIA,gEAM9BA,iFArBG/B,aAALa,+HAAAA,4BAQCb,KAAai6H,aAAlBp5H,+HAAAA,2BAQiBb,aAALa,+HAAAA,6BAMKjC,OAAOi3B,QAAQ71B,cAApBa,+HAAAA,qEAhCLm5H,GAAYG,cACFxjH,KAAKwjH,EAAW9iH,QAAQ,KAAM,MACjC+0G,mBAAmB,SAAUvT,MAAO,QAASF,IAAK,mCApD9DyhB,EACAC,YAHOC,YACAC,KAGPC,eAEOC,EAAW,cACbC,EAAepuH,OACpB8tH,EAAeG,EAAMjuH,QACrB+tH,EAAoBE,EAAMjuH,GAAO2tH,UACjCO,sBAGKG,EAAwBC,OACzBC,MAAgBlkH,KAAKyjH,EAAahzG,OAClC0zG,MAAcnkH,KAAKyjH,EAAaW,gBACtBH,EAAU/vH,OAAO+/B,QAEvBowF,MAAerkH,KAAKi0B,EAAKgzB,aACtBi9D,GAAaG,GAAYA,GAAYF,IAqCpDJ,EAAeD,6JAjCc5K,OACrBoL,SACAC,EAAaP,EAAwBL,EAASzK,YACzCjlF,KAAQswF,EACbD,EAAS7zH,KAAKwjC,EAAKgzB,cAEd+6C,KAAO6hB,MACPS,EAAS9zF,SAASwxE,UACZ,SAGR,YAEYkX,OACfsL,aAAsBtL,SACtBqL,EAAaP,EAAwBL,EAASzK,YACzClX,KAAO0hB,OACRe,EAAY,oBACPxwF,KAAQswF,KACVtwF,EAAKgzB,MAAQ+6C,EAAI/6C,MAEhBw9D,SADexwF,EAAKywF,KAAO,IAAM,KACHzwF,EAAK0wF,iBAI3CH,GAAYC,SAETD,EAAS,cAayDT,EAAepuH,cAAoB+tH,oCAQnBG,EnG6ZjG,SAAiCe,EAAOn2H,EAASo2H,GAC7C,MAAM53H,EAAQ,IAAI/B,IAClB,IAAK,IAAIf,EAAI,EAAGA,EAAIy6H,EAAM16H,OAAQC,GAAK,EAC/By6H,EAAMz6H,GAAG06H,SACT53H,EAAMuF,IAAIoyH,EAAMz6H,GAAGsE,SAK3B,OAHKo2H,GACD53H,EAAMmG,OAAO3E,GAEVsB,MAAMC,KAAK/C,2MoG9dsB5D,8CAAhCmC,iCAAgCnC,6HAFhCmC,0GADuB,KAAlBnC,QAEuB,KAAlBA,MAA2C,KAAlBA,MAA2C,OAAlBA,2FANZA,mDAEgBA,4BAA+DA,8HAH7DA,2EAA0DA,saADxImC,SACIJ,cACAA,qBACAA,OACIA,OAAgCA,qBAA6DA,qBAC7FA,WAAuC/B,uDAJ+BA,sBAA0DA,6BAC5EA,eAEgBA,eAA+DA,gBAC5FA,iJAXhCgsC,uBACAyvF,kBACA1vF,qBACA2vF,EAAiB,sBACjBC,EAAgB,0rBCiBfx5H,kBACAA,4UAJAA,kBACAA,6UAJAA,kBACAA,4UAJAA,kBACAA,wGALgDnC,KAAOuxC,mBAC5BvxC,KAAOuxC,4DAEL,OAAxBvxC,KAAOuxC,2CAGsB,OAAxBvxC,KAAOuxC,2CAGiB,OAAxBvxC,KAAOuxC,2CAGiB,OAAxBvxC,KAAOuxC,kIAZS,oCAA2C,oCACpD,wBAA+B,iNAJcvxC,4YAF9EmC,SACIJ,OACIA,cAEAA,OACIA,mCACAA,mCACAA,gDALkE/B,gCAGdA,KAAOuxC,sCAC5BvxC,KAAOuxC,wJATnCq7E,EAAW,cACXnC,EAAS,udCqPR,eAAiB17G,OAAO69G,kbApHJ5sH,YAA+B,aAAeA,aAAuBA,wBAAyCA,kCAItIs6B,GAAYoB,GAAYmD,GAAW8B,iBAC/B,eACA3gC,iBACAu7B,WAAW,gBAExB63F,KACCvtG,cAAe,EACfyC,aAAc,IAEf+qG,KACCxtG,cAAe,EACfyC,aAAc,IAEfgrG,MACCztG,cAAe,EACfyC,aAAc,IAEfirG,MACC1tG,cAAe,EACfyC,aAAc,IAEfkrG,MACC3tG,cAAe,EACfyC,aAAc,sDAeKtoB,6BAALa,wCASPb,6BAALa,wCAuCiBb,4BAALa,gqCAfyQ,6BACpB,oCACa,qCACQ,mCAC7B,kCACqB,qCACO,mCACtB,oCACa,oCACO,kCAClB,8BACH,gCACM,qVA/C1Ob,+5BAmCyLA,MAAYA,MAAmB,KAAE,gEACzOA,MAAYA,MAA0B,YAAE,6EACzBA,MAAYA,MAAyB,WAAE,6EACvCA,MAAYA,MAAuB,SAAE,wFACpDA,MAAYA,MAAsB,QAAE,4EACrBA,MAAYA,MAAyB,WAAE,4EACvCA,MAAYA,MAAuB,SAAE,wFACpDA,MAAYA,MAAyB,WAAE,6EACxBA,MAAYA,MAAwB,UAAE,6EACtCA,MAAYA,MAAsB,QAAE,wFACnDA,MAAYA,MAA0B,YAAE,6EACzBA,MAAYA,MAAiB,GAAE,6EAC/BA,MAAYA,MAAoB,MAAE,6VAtFlEmC,SACCJ,oCAkCDI,SACCJ,OACOA,OACIA,cACAA,OACIA,wDADgB/B,aAOxB+B,OACIA,OACRA,6BAAgC/B,YAChC+B,kEAOIA,OACIA,OACIA,cACAA,WAAmB/B,aAIlC+B,OACOA,OACIA,OACRA,cAOYA,OACIA,qBACfA,uBACeA,yBACAA,yBACfA,yBACeA,yBACAA,yBACfA,yBACeA,yBACAA,yBACfA,yBACeA,yBACAA,yBAERA,wfAzFwB/B,yBAA8CA,2BAAuBA,oCAAyCA,uDAMlIA,yFAoCOA,eAALa,yIAAAA,yBAFcb,sCASIA,+BAEzBA,eAALa,yIAAAA,8BAS6Bb,UAAAA,gEAesLA,MAAYA,MAAmB,KAAE,4FACzOA,MAAYA,MAA0B,YAAE,yGACzBA,MAAYA,MAAyB,WAAE,0GACvCA,MAAYA,MAAuB,SAAE,qHACpDA,MAAYA,MAAsB,QAAE,yGACrBA,MAAYA,MAAyB,WAAE,yGACvCA,MAAYA,MAAuB,SAAE,qHACpDA,MAAYA,MAAyB,WAAE,0GACxBA,MAAYA,MAAwB,UAAE,0GACtCA,MAAYA,MAAsB,QAAE,qHACnDA,MAAYA,MAA0B,YAAE,0GACzBA,MAAYA,MAAiB,GAAE,0GAC/BA,MAAYA,MAAoB,MAAE,yGAG3CA,cAALa,oIAAAA,2GAAAA,wUA1DkBb,MAAK6qC,oBAAsB7qC,MAAK8qC,oBAAsB9qC,MAAKsrC,mGAA3DtrC,MAAK6qC,gCAAsB7qC,MAAK8qC,gCAAsB9qC,MAAKsrC,yaADtFtrC,0BAALa,0NAAKb,aAALa,kIAAAA,+DAAAA,qJAYmDb,MAAK47H,eAAY57H,MAAK67H,wEAAzC77H,MAAK+qC,qCAArB5oC,uFAUsDnC,uLADmCA,MAAM,mGACpDA,MAAM,YADjEmC,kBACAA,uNA2CoDnC,MAAG2tH,MAAMqB,kBAAgBhvH,MAAG2tH,MAAMsB,eACnBjvH,MAAG2tH,MAAM/B,iBACE5rH,MAAG2tH,MAAM5B,eACnC/rH,MAAG2tH,MAAMmO,cACM97H,MAAG2tH,MAAMhC,iBACE3rH,MAAG2tH,MAAM7B,eACnC9rH,MAAG2tH,MAAMe,iBAAe1uH,MAAG2tH,MAAMgB,cAClB3uH,MAAG2tH,MAAM9B,gBACE7rH,MAAG2tH,MAAM3B,cACnChsH,MAAG2tH,MAAMoO,kBACM/7H,MAAG2tH,MAAMqO,SACTh8H,MAAG2tH,MAAMsO,gFAb/Bj8H,MAAG2rC,2BAA6B3rC,MAAGwqC,sBAAwBxqC,MAAG8C,mBAAqB9C,MAAgBA,MAAG6vH,qBAAuB7vH,MAAGk8H,qFAEpG,mKAMD,ujCAV5D/5H,SACIJ,2BAGfA,mCACeA,qBACAA,qBACfA,qBACeA,qBACAA,qBACfA,mCACeA,qBACAA,qBACfA,qBACeA,qBACAA,yGAb6B/B,MAAG2rC,uCAA6B3rC,MAAGwqC,kCAAwBxqC,MAAG8C,+BAAqB9C,MAAgBA,MAAG6vH,iCAAuB7vH,MAAGk8H,8CAEzHl8H,MAAG2tH,MAAMqB,iDAAgBhvH,MAAG2tH,MAAMsB,8CACnBjvH,MAAG2tH,MAAM/B,gDACE5rH,MAAG2tH,MAAM5B,8CACnC/rH,MAAG2tH,MAAMmO,6CACM97H,MAAG2tH,MAAMhC,gDACE3rH,MAAG2tH,MAAM7B,8CACnC9rH,MAAG2tH,MAAMe,gDAAe1uH,MAAG2tH,MAAMgB,6CAClB3uH,MAAG2tH,MAAM9B,+CACE7rH,MAAG2tH,MAAM3B,6CACnChsH,MAAG2tH,MAAMoO,iDACM/7H,MAAG2tH,MAAMqO,wCACTh8H,MAAG2tH,MAAMsO,mJAhB3D3xF,GAAetqC,MAAIA,OAAemqC,GAAanqC,MAAIA,OAAuBirC,GAAajrC,MAAG6vH,KAAM7vH,kGAAhGsqC,GAAetqC,MAAIA,OAAemqC,GAAanqC,MAAIA,OAAuBirC,GAAajrC,MAAG6vH,KAAM7vH,kQA5FhHA,KAAMa,OAAS,uTAnFPk1H,GAAQ1xH,EAAKuwH,EAAcC,EAAShvH,EAAO,MAC5C,OAAPxB,WAiBWsQ,KAbU,GAArBigH,EAAavwH,GACfuwH,EAAavwH,IAAQ,EAAIwB,EAGzB+uH,EAAavwH,GAAO,EAAIwB,EAGT,QAAPxB,GAAiBwwH,EAAQ,GAAGlH,MAC3BkH,EAAQt/F,MAAMn2B,EAAGC,IAAOD,EAAEuuH,MAAMtpH,GAAOhF,EAAEsuH,MAAMtpH,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAGhGwwH,EAAQt/F,MAAMn2B,EAAGC,IAAOD,EAAEiF,GAAOhF,EAAEgF,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAExEuwH,EAClBjgH,GAAQtQ,IACVuwH,EAAajgH,GAAQ,UAGDkgH,QAAAA,EAAsBD,aAAAA,GArB3CoB,YAAYnwH,0BA5BVuvH,EACGD,gBARI1E,YACG/lF,4BACAmjF,GAAqB,4BACrBiD,QACV3lF,EAAe,MACfZ,EAAa,MAIboqF,EAAqB,GACrBhqF,EAAQF,GAASC,GACjB8qF,EAASzmH,OAAOwR,WAAa,IAC7Bs1G,EAAkBzqF,GAAYV,GAC9BkqF,GAAgB9xH,KAAK,EAAG8oH,WAAW,EAAGG,SAAS,EAAGJ,WAAW,EAAGG,SAAS,EAAGD,UAAU,EAAGG,QAAQ,EAAGgQ,GAAG,EAAGC,MAAM,EAAGF,YAAY,EAAG/M,YAAY,EAAG8M,QAAQ,EAAGpN,WAAW,YAUlKyN,EAAahrF,OACrB5G,EAAa4G,mBAGL3E,EAAgBpC,OAClB+qF,EAAsB/qF,EAAOujF,MAAMkD,aACnCuE,EAAehrF,OACGgmF,UAAU0F,MAAMn2H,SAASuN,eAAe,iBACxDyzD,OATT5xD,OAAOyqH,oBANHzqH,OAAOwR,WAAa,QACtBi1G,GAAS,OAETA,GAAS,wOAba,KAAM,KAAK,KAAK,WAQrB,WAAY,GAAI,4BA+IJrqF,kDASIZ,4CAGE4xF,EAAa5+F,cAQhBo3F,0BAAmCjmH,kBAAqC,eAehE0tH,EAAarG,GAAQ,OAAQnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBACzCwH,EAAarG,GAAQ,cAAenB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBAChHwH,EAAarG,GAAQ,aAAcnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBACnHwH,EAAarG,GAAQ,WAAYnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBACvJwH,EAAarG,GAAQ,UAAWnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBACxGwH,EAAarG,GAAQ,aAAcnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBACpHwH,EAAarG,GAAQ,WAAYnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBACnJwH,EAAarG,GAAQ,aAAcnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBAC/GwH,EAAarG,GAAQ,YAAanB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBACnHwH,EAAarG,GAAQ,UAAWnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBAChJwH,EAAarG,GAAQ,cAAenB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBACxHwH,EAAarG,GAAQ,KAAMnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,wBAClHwH,EAAarG,GAAQ,QAASnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,cAASD,EAAewH,EAAWxH,mBAM/JpoF,EAAgBqtF,ybCO3F,eAAiB9qH,OAAO69G,wYAxGJ5sH,YAA+BA,aAAuBA,yBAAyCA,kCAIvHs6B,GAAYoB,GAAYmD,GAAW8B,iBAC/B,eACA3gC,iBACAu7B,WAAW,gBAExB63F,KACCvtG,cAAe,EACfyC,aAAc,IAEf+qG,KACCxtG,cAAe,EACfyC,aAAc,IAEfgrG,MACCztG,cAAe,EACfyC,aAAc,IAEfirG,MACC1tG,cAAe,EACfyC,aAAc,IAEfkrG,MACC3tG,cAAe,EACfyC,aAAc,sDAeKtoB,6BAALa,wCASCb,6BAALa,wCA8BSb,4BAALa,gnBAZyQ,4BACrB,8BACO,iCACG,mCACF,kCACF,iCACA,iCACM,oCACd,gCACM,qVAtC1Ob,24BA6ByLA,MAAYA,KAAmB,KAAE,+DAC1NA,MAAYA,KAAkB,IAAE,6EAChCA,MAAYA,KAAqB,OAAE,6EACnCA,MAAYA,KAAuB,SAAE,4EACrCA,MAAYA,KAAsB,QAAE,6EACpCA,MAAYA,KAAqB,OAAE,6EACnCA,MAAYA,KAAqB,OAAE,6EACnCA,MAAYA,KAAwB,UAAE,6EACtCA,MAAYA,KAAiB,GAAE,6EAC/BA,MAAYA,KAAoB,MAAE,6VA7ElEmC,SACCJ,oCAkCDI,SACIJ,OACIA,OACIA,cACAA,OACIA,wDADgB/B,aAOxB+B,OACIA,OACAA,6BAAgC/B,YAChC+B,kEAOJA,OACIA,OACIA,cACAA,WAAmB/B,aAK/B+B,OACIA,OACIA,OACIA,OACIA,qBACAA,sBACAA,yBACAA,yBACAA,yBACAA,yBACAA,yBACAA,yBACAA,yBACAA,yBAERA,4bAhFwB/B,0BAA+BA,4BAAuBA,qCAAyCA,sDAMnHA,wFAoCOA,eAALa,yIAAAA,yBAFcb,uCASYA,8BAEzBA,eAALa,yIAAAA,6BASqBb,UAAAA,+DASsLA,MAAYA,KAAmB,KAAE,yFAC1NA,MAAYA,KAAkB,IAAE,uGAChCA,MAAYA,KAAqB,OAAE,yGACnCA,MAAYA,KAAuB,SAAE,wGACrCA,MAAYA,KAAsB,QAAE,yGACpCA,MAAYA,KAAqB,OAAE,yGACnCA,MAAYA,KAAqB,OAAE,yGACnCA,MAAYA,KAAwB,UAAE,yGACtCA,MAAYA,KAAiB,GAAE,yGAC/BA,MAAYA,KAAoB,MAAE,yGAG3CA,cAALa,oIAAAA,2GAAAA,wUAjDkBb,MAAK6qC,oBAAsB7qC,MAAK8qC,oBAAsB9qC,MAAKsrC,mGAA3DtrC,MAAK6qC,gCAAsB7qC,MAAK8qC,gCAAsB9qC,MAAKsrC,waADtFtrC,0BAALa,0NAAKb,aAALa,kIAAAA,+DAAAA,qJAYmDb,MAAK47H,eAAY57H,MAAK67H,wEAAzC77H,MAAK+qC,qCAArB5oC,yFAU8DnC,sJADiEA,MAAM,gBAAYA,wIAC9FA,MAAM,YADjEmC,+BAAgCnC,cAChCmC,8GADgCnC,gLAmC2BA,MAAG2tH,MAAM3zG,SACTha,MAAG2tH,MAAMx4F,YACTn1B,MAAG2tH,MAAM+B,cACT1vH,MAAG2tH,MAAMvC,aACTprH,MAAG2tH,MAAMgC,YACT3vH,MAAG2tH,MAAMiC,YACT5vH,MAAG2tH,MAAM+D,eACT1xH,MAAG2tH,MAAMqO,QACTh8H,MAAG2tH,MAAMsO,+EAV/Bj8H,MAAG2rC,2BAA6B3rC,MAAGwqC,sBAAwBxqC,MAAG8C,mBAAqB9C,MAAgBA,MAAG6vH,qBAAuB7vH,MAAGk8H,88BAFjK/5H,SACIJ,2BAGAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,oGAV6B/B,MAAG2rC,uCAA6B3rC,MAAGwqC,kCAAwBxqC,MAAG8C,+BAAqB9C,MAAgBA,MAAG6vH,iCAAuB7vH,MAAGk8H,2CAE1Gl8H,MAAG2tH,MAAM3zG,qCACTha,MAAG2tH,MAAMx4F,wCACTn1B,MAAG2tH,MAAM+B,0CACT1vH,MAAG2tH,MAAMvC,yCACTprH,MAAG2tH,MAAMgC,wCACT3vH,MAAG2tH,MAAMiC,wCACT5vH,MAAG2tH,MAAM+D,2CACT1xH,MAAG2tH,MAAMqO,oCACTh8H,MAAG2tH,MAAMsO,6IAb3D3xF,GAAetqC,MAAIA,OAAemqC,GAAanqC,MAAIA,OAAuBirC,GAAajrC,MAAG6vH,KAAM7vH,kGAAhGsqC,GAAetqC,MAAIA,OAAemqC,GAAanqC,MAAIA,OAAuBirC,GAAajrC,MAAG6vH,KAAM7vH,kQAnFhHA,KAAMa,OAAS,uTAnFPk1H,GAAQ1xH,EAAKuwH,EAAcC,EAAShvH,EAAO,MAC5C,OAAPxB,WAiBWsQ,KAbU,GAArBigH,EAAavwH,GACfuwH,EAAavwH,IAAQ,EAAIwB,EAGzB+uH,EAAavwH,GAAO,EAAIwB,EAGT,QAAPxB,GAAiBwwH,EAAQ,GAAGlH,MAC3BkH,EAAQt/F,MAAMn2B,EAAGC,IAAOD,EAAEuuH,MAAMtpH,GAAOhF,EAAEsuH,MAAMtpH,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAGhGwwH,EAAQt/F,MAAMn2B,EAAGC,IAAOD,EAAEiF,GAAOhF,EAAEgF,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAExEuwH,EAClBjgH,GAAQtQ,IACVuwH,EAAajgH,GAAQ,UAGDkgH,QAAAA,EAAsBD,aAAAA,GArB3CoB,YAAYnwH,uCA/BH4qH,YACG/lF,4BACAmjF,GAAqB,4BACrBiD,QACP0E,EAASzmH,OAAOwR,WAAa,IAQpCxR,OAAOyqH,oBANHzqH,OAAOwR,WAAa,QACtBi1G,GAAS,OAETA,GAAS,QAYJJ,EACAD,EATAR,EAAqB,GACrBxpF,EAAe,MACfZ,EAAa,MACbI,EAAQF,GAASC,GAEjBmrF,EAAkBzqF,GAAYV,GAC9BkqF,GAAgB9xH,KAAK,EAAGkX,IAAI,EAAGmb,OAAO,EAAGu6F,SAAS,EAAGtE,QAAQ,EAAGuE,OAAO,EAAGC,OAAO,EAAG8B,UAAU,EAAGsK,GAAG,EAAGC,MAAM,YAIxGzvF,EAAgBpC,QACrB+qF,EAAsB/qF,EAAOujF,MAAMkD,aACnCuE,EAAehrF,OACGgmF,UAAU0F,MAAMn2H,SAASuN,eAAe,iBACxDyzD,6OAVkB,KAAM,KAAM,KAAM,KAAM,QAG7B,WAAY,GAAI,0BAqIPx1B,kDASYZ,oDAGAA,+CAQToqF,0BAAmCjmH,kBAAqC,eAShE0tH,EAAarG,GAAQ,OAAQnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,wBAClCwH,EAAarG,GAAQ,MAAOnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,wBAClHwH,EAAarG,GAAQ,SAAUnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,wBACxHwH,EAAarG,GAAQ,WAAYnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,wBAC5HwH,EAAarG,GAAQ,UAAWnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,wBAC3HwH,EAAarG,GAAQ,SAAUnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,wBACzHwH,EAAarG,GAAQ,SAAUnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,wBACtHwH,EAAarG,GAAQ,YAAanB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,wBACnIwH,EAAarG,GAAQ,KAAMnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,wBAClHwH,EAAarG,GAAQ,QAASnB,EAAcnE,OAAeA,EAAe2L,EAAWvH,aAASD,EAAewH,EAAWxH,mBAM/JpoF,EAAgBqtF,ylBCjL/F13H,00BAYAA,ikBA9BI,wBACI,kBACI,8BAGZsU,MAAO,IACP2tB,sBAAsB,SAEpB,0BACkB,cAEpB7I,WAAW,eAEH,WACFiI,GAAU9H,GAAYpB,yGAhBxCn4B,gaCoGuEnC,MAAO2tH,MAAM/C,aACb5qH,MAAO2tH,MAAM9C,aACb7qH,MAAO2tH,MAAM7C,aACb9qH,MAAO2tH,MAAM5C,cACb/qH,MAAO2tH,MAAM3C,UACbhrH,MAAO2tH,MAAM1C,UACbjrH,MAAO2tH,MAAMuB,kBACblvH,MAAO2tH,MAAMqO,QACbh8H,MAAO2tH,MAAMsO,+EAVnCj8H,MAAO2rC,2BAA6B3rC,MAAOwqC,sBAAwBxqC,MAAO8C,mBAAqB9C,KAAaA,MAAO6vH,qBAAuB7vH,MAAOk8H,07BAFlL/5H,SACIJ,2BAGAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,iGAV6B/B,MAAO2rC,oCAA6B3rC,MAAOwqC,+BAAwBxqC,MAAO8C,6BAAqB9C,KAAaA,MAAO6vH,8BAAuB7vH,MAAOk8H,wCAE3Hl8H,MAAO2tH,MAAM/C,sCACb5qH,MAAO2tH,MAAM9C,sCACb7qH,MAAO2tH,MAAM7C,sCACb9qH,MAAO2tH,MAAM5C,uCACb/qH,MAAO2tH,MAAM3C,mCACbhrH,MAAO2tH,MAAM1C,mCACbjrH,MAAO2tH,MAAMuB,2CACblvH,MAAO2tH,MAAMqO,iCACbh8H,MAAO2tH,MAAMsO,6IAb/DI,GAAar8H,MAAQA,KAAeA,KAAeA,8FAAnDq8H,GAAar8H,MAAQA,KAAeA,KAAeA,mTADrDA,4BAALa,oJAZ+P,4BACb,+BACC,+BACD,+BACE,gCACR,4BACA,4BACgB,oCACpB,6BACM,qHATjDb,KAAYA,KAAmB,KAAE,+DAChNA,KAAYA,KAAsB,QAAE,2EACpCA,KAAYA,KAAsB,QAAE,2EACpCA,KAAYA,KAAsB,QAAE,0EACpCA,KAAYA,KAAuB,SAAE,2EACrCA,KAAYA,KAAmB,KAAE,2EACjCA,KAAYA,KAAmB,KAAE,2EACjCA,KAAYA,KAA2B,aAAE,2EACzCA,KAAYA,KAAiB,GAAE,4EAC/BA,KAAYA,KAAoB,MAAE,8QAb9DmC,SACIJ,OACIA,OACIA,OACIA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,sBAERA,2UAXmM/B,KAAYA,KAAmB,KAAE,qFAChNA,KAAYA,KAAsB,QAAE,iGACpCA,KAAYA,KAAsB,QAAE,iGACpCA,KAAYA,KAAsB,QAAE,gGACpCA,KAAYA,KAAuB,SAAE,iGACrCA,KAAYA,KAAmB,KAAE,iGACjCA,KAAYA,KAAmB,KAAE,iGACjCA,KAAYA,KAA2B,aAAE,iGACzCA,KAAYA,KAAiB,GAAE,mGAC/BA,KAAYA,KAAoB,MAAE,kGAG3CA,cAALa,oIAAAA,mEAAAA,mJAlGDk1H,GAAQ1xH,EAAKuwH,EAAcC,EAAShvH,EAAO,WAcxC8O,KAbU,GAArBigH,EAAavwH,GACfuwH,EAAavwH,IAAQ,EAAIwB,EAGzB+uH,EAAavwH,GAAO,EAAIwB,EAGT,QAAPxB,GAAiBwwH,EAAQ,GAAGlH,MAC3BkH,EAAQt/F,MAAMn2B,EAAGC,IAAOD,EAAEuuH,MAAMtpH,GAAOhF,EAAEsuH,MAAMtpH,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAGhGwwH,EAAQt/F,MAAMn2B,EAAGC,IAAOD,EAAEiF,GAAOhF,EAAEgF,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAExEuwH,EAClBjgH,GAAQtQ,IACVuwH,EAAajgH,GAAQ,UAGDkgH,QAAAA,EAAsBD,aAAAA,YAEpCyH,GAAaC,EAAQC,EAAaC,EAAaC,UAChDH,EAAOx5H,KAAK2Z,cAAc0qB,SAASo1F,EAAY9/G,iBAAkC,OAAf+/G,GAAwBF,EAAOzM,MAAQ2M,KAA+B,OAAdC,GAAuBH,EAAO9xF,UAAUrD,SAASs1F,mCA9BxKC,uBACAC,EAAgB,qBAChBC,EAAgB,kBAChBryF,EAAa,uBACViC,mBACAqwF,QACPjI,GAAgB9xH,KAAK,EAAG8nH,QAAQ,EAAGC,QAAQ,EAAGC,QAAQ,EAAGC,SAAS,EAAGC,KAAK,EAAGC,KAAK,EAAGiE,aAAa,EAAG8M,GAAG,EAAGC,MAAM,+RAClG,WAAY,GAAI,sBAuFAG,EAAarG,GAAQ,OAAQnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,wBACpBwH,EAAarG,GAAQ,UAAWnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,wBAC/GwH,EAAarG,GAAQ,UAAWnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,wBACjHwH,EAAarG,GAAQ,UAAWnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,wBAC/GwH,EAAarG,GAAQ,WAAYnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,wBACrHwH,EAAarG,GAAQ,OAAQnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,wBAC7GwH,EAAarG,GAAQ,OAAQnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,wBACrGwH,EAAarG,GAAQ,eAAgBnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,wBAC/HwH,EAAarG,GAAQ,KAAMnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,wBACxGwH,EAAarG,GAAQ,QAASnB,EAAc8H,OAAUA,EAAUN,EAAWvH,aAASD,EAAewH,EAAWxH,mBAMjJpoF,EAAgB8vF,8RCDpCt8H,MAAQ2tH,MAAM6B,iBACdxvH,MAAQ2tH,MAAMgE,qBACd3xH,MAAQ2tH,MAAMyB,gBACdpvH,MAAQ2tH,MAAMmB,UACd9uH,MAAQ2tH,MAAMqO,QACdh8H,MAAQ2tH,MAAMsO,+EAPpCj8H,MAAQ2rC,2BAA6B3rC,MAAQwqC,sBAAwBxqC,MAAQ8C,mBAAqB9C,KAAaA,MAAQ6vH,qBAAuB7vH,MAAQk8H,4qBAFvL/5H,SACIJ,2BAGAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,iGAP6B/B,MAAQ2rC,oCAA6B3rC,MAAQwqC,+BAAwBxqC,MAAQ8C,6BAAqB9C,KAAaA,MAAQ6vH,8BAAuB7vH,MAAQk8H,wCAEhIl8H,MAAQ2tH,MAAM6B,0CACdxvH,MAAQ2tH,MAAMgE,8CACd3xH,MAAQ2tH,MAAMyB,yCACdpvH,MAAQ2tH,MAAMmB,mCACd9uH,MAAQ2tH,MAAMqO,iCACdh8H,MAAQ2tH,MAAMsO,6IAVhEI,GAAar8H,MAASA,KAAeA,6FAArCq8H,GAAar8H,MAASA,KAAeA,mRADvCA,0BAALa,+IATiQ,4BACL,mCACS,uCACX,kCACZ,4BACJ,6BACM,iHANjDb,KAAYA,KAAmB,KAAE,+DAClNA,KAAYA,KAA0B,YAAE,2EACxCA,KAAYA,KAA8B,gBAAE,2EAC5CA,KAAYA,KAAyB,WAAE,0EACvCA,KAAYA,KAAmB,KAAE,2EACjCA,KAAYA,KAAiB,GAAE,2EAC/BA,KAAYA,KAAoB,MAAE,8QAV9DmC,SACIJ,OACIA,OACIA,OACIA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBAERA,wQARqM/B,KAAYA,KAAmB,KAAE,oFAClNA,KAAYA,KAA0B,YAAE,gGACxCA,KAAYA,KAA8B,gBAAE,gGAC5CA,KAAYA,KAAyB,WAAE,+FACvCA,KAAYA,KAAmB,KAAE,gGACjCA,KAAYA,KAAiB,GAAE,gGAC/BA,KAAYA,KAAoB,MAAE,gGAG3CA,aAALa,0HAAAA,+DAAAA,yIA/FDk1H,GAAQ1xH,EAAKuwH,EAAcC,EAAShvH,EAAO,WAcxC8O,KAbU,GAArBigH,EAAavwH,GACfuwH,EAAavwH,IAAQ,EAAIwB,EAGzB+uH,EAAavwH,GAAO,EAAIwB,EAGT,QAAPxB,GAAiBwwH,EAAQ,GAAGlH,MAC3BkH,EAAQt/F,MAAMn2B,EAAGC,IAAOD,EAAEuuH,MAAMtpH,GAAOhF,EAAEsuH,MAAMtpH,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAGhGwwH,EAAQt/F,MAAMn2B,EAAGC,IAAOD,EAAEiF,GAAOhF,EAAEgF,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAExEuwH,EAClBjgH,GAAQtQ,IACVuwH,EAAajgH,GAAQ,UAGDkgH,QAAAA,EAAsBD,aAAAA,YAEpCyH,GAAaS,EAASP,EAAaC,UACpCM,EAAQh6H,KAAK2Z,cAAc0qB,SAASo1F,EAAY9/G,iBAAkC,OAAf+/G,GAAwBM,EAAQjN,MAAQ2M,mCA7BxGO,uBACAJ,EAAgB,qBAChBC,EAAgB,uBACbpwF,mBACAqwF,QACPjI,GAAgB9xH,KAAK,EAAG0sH,YAAY,EAAGmC,gBAAgB,EAAGvC,WAAW,EAAGN,KAAK,EAAGkN,GAAG,EAAGC,MAAM,yPAC7E,WAAY,GAAI,sBAuFAG,EAAarG,GAAQ,OAAQnB,EAAcmI,OAAWA,EAAWX,EAAWvH,aAASD,EAAewH,EAAWxH,wBAClBwH,EAAarG,GAAQ,cAAenB,EAAcmI,OAAWA,EAAWX,EAAWvH,aAASD,EAAewH,EAAWxH,wBACjHwH,EAAarG,GAAQ,kBAAmBnB,EAAcmI,OAAWA,EAAWX,EAAWvH,aAASD,EAAewH,EAAWxH,wBAChIwH,EAAarG,GAAQ,aAAcnB,EAAcmI,OAAWA,EAAWX,EAAWvH,aAASD,EAAewH,EAAWxH,wBAC3HwH,EAAarG,GAAQ,OAAQnB,EAAcmI,OAAWA,EAAWX,EAAWvH,aAASD,EAAewH,EAAWxH,wBACjHwH,EAAarG,GAAQ,KAAMnB,EAAcmI,OAAWA,EAAWX,EAAWvH,aAASD,EAAewH,EAAWxH,wBAC1GwH,EAAarG,GAAQ,QAASnB,EAAcmI,OAAWA,EAAWX,EAAWvH,aAASD,EAAewH,EAAWxH,mBAMnJpoF,EAAgBswF,2XC8C3F,eAAiB/tH,OAAO69G,gTApGJ5sH,YAA+B,aAAeA,cAAuBA,yBAAyCA,kCAItIs6B,GAAYoB,GAAYmD,GAAW8B,iBAC/B,eACD,cACCpF,WAAW,gBAExB63F,KACCvtG,cAAe,EACfyC,aAAc,IAEf+qG,KACCxtG,cAAe,EACfyC,aAAc,IAEfgrG,MACCztG,cAAe,EACfyC,aAAc,IAEfirG,MACC1tG,cAAe,EACfyC,aAAc,IAEfkrG,MACC3tG,cAAe,EACfyC,aAAc,sDA4CKtoB,4BAALa,wCASCb,6BAALa,+EAasB,YAA3Bb,spCAhCkB,waAQKA,0CAFiB,aAA5BA,KAAyC,WAAa,saAS1B,aAA5BA,KAAyC,SAAW,+XAUxB,aAA5BA,KAAyC,WAAa,0GArF3EmC,SACCJ,oCAkCDI,SACIJ,OACIA,OACIA,OAKIA,6BAEgB/B,YAQhB+B,cACAA,6BAEgB/B,YAOhB+B,cAGRA,OACIA,cACAA,OACIA,wDADgB/B,aAOxB+B,OACIA,OACAA,6BAAgC/B,YAChC+B,kEAOJA,OACIA,OACIA,cACAA,WAAmB/B,8MAzFCA,2BAA8CA,6BAAuBA,qCAAyCA,mHA8ClHA,sCAWAA,4BAcTA,cAALa,yIAAAA,wBAFcb,6BAFiB,aAA5BA,KAAyC,WAAa,8EAW/BA,8BAEzBA,eAALa,yIAAAA,8BAJmC,aAA5Bb,KAAyC,SAAW,mEAatCA,WAAAA,gCAHc,aAA5BA,KAAyC,WAAa,klBAtDvCA,MAAK6qC,oBAAsB7qC,MAAK8qC,oBAAsB9qC,MAAKsrC,mGAA3DtrC,MAAK6qC,gCAAsB7qC,MAAK8qC,gCAAsB9qC,MAAKsrC,maADtFtrC,0BAALa,0NAAKb,aAALa,kIAAAA,+DAAAA,qJAyCmDb,MAAK47H,eAAY57H,MAAK67H,wEAAzC77H,MAAK+qC,qCAArB5oC,sDAAmCnC,MAAK47H,sCAAY57H,MAAK67H,wCAAzC77H,MAAK+qC,oGAUyC/qC,uJADsBA,MAAM,gBAAYA,wIACnDA,MAAM,YADjEmC,+BAAgCnC,cAChCmC,wFADgCnC,6IAedA,mBAAwBA,oBAA8BA,gBAA2BA,kBAA0BA,sBAA+BA,+FAA1IA,kCAAwBA,kCAA8BA,6BAA2BA,2JAF/EA,mBAAyBA,oBAA8BA,kBAA6BA,sBAA+BA,gGAAnHA,kCAAyBA,kCAA8BA,0KA/FlFA,KAAMa,OAAS,GAAKb,KAAQa,OAAS,qUAvBlCu0H,EACAD,SAdOzqF,iBACAmqF,4BACAhH,GAAqB,4BACrBiD,QACPnmF,KACAJ,EAAa,MACbyyF,EAA0B,WAE1BJ,EAAgB,MAChBF,KACAK,KACAJ,EAAgB,GAChBE,EAAezxF,GAAYV,GAS/BzjC,eAEamjC,KAAUyqF,EACXzqF,EAAOI,UAAUrD,SAAS,KAC1B41F,EAAS31H,KAAKgjC,GAEdsyF,EAAQt1H,KAAKgjC,OAIrBO,EAAQF,GAASC,kPAxBG,IAAK,KAAM,KAAM,KAAM,KAAM,iBAQ5BN,QACrB+qF,EAAsB/qF,EAAOujF,MAAMkD,cACnCuE,EAAehrF,OACGgmF,UAAU0F,MAAMn2H,SAASuN,eAAe,iBACxDyzD,mBAgEsBq8D,0CAWAA,kCAYAJ,oCASYryF,kCAGAA,kCAQToyF,+fC8HnB,eAAiB5tH,OAAO69G,6SAtIJ5sH,YAA+B,aAAeA,cAAuBA,yBAAyCA,kCAItIs6B,GAAYoB,GAAYmD,GAAW8B,iBAC/B,eACA3gC,iBACAu7B,WAAW,gBAExB63F,KAAOvtG,cAAe,EAAGyC,aAAc,IACvC+qG,KAAOxtG,cAAe,EAAGyC,aAAc,IACvCgrG,MAAQztG,cAAe,EAAGyC,aAAc,IACxCirG,MAAQ1tG,cAAe,EAAGyC,aAAc,IACxCkrG,MAAQ3tG,cAAe,EAAGyC,aAAc,sDAsBpBtoB,6BAALa,wCASKb,6BAALa,+EAae,WAAxBb,6iDAxBuBA,0CAFc,YAAzBA,KAAqC,WAAa,sZASzB,YAAzBA,KAAqC,WAAa,2XAUzB,YAAzBA,KAAqC,WAAa,0GAjDvEmC,SACCJ,oCAmBDI,SACIJ,OACIA,OACIA,OACIA,6BAAgC/B,YAChC+B,cACAA,6BAAgC/B,YAChC+B,cAGRA,OACIA,cACAA,OACIA,wDADgB/B,aAOxB+B,OACIA,OACIA,6BAAgC/B,YAChC+B,kEAORA,OACIA,OACIA,cACAA,WAAmB/B,6MArDCA,2BAA8CA,8BAAuBA,qCAAyCA,sDAMlIA,4FAmBgCA,uCAEAA,+BAQzBA,eAALa,yIAAAA,0BAFcb,8BAFc,YAAzBA,KAAqC,WAAa,+EAWvBA,+BAEzBA,eAALa,yIAAAA,+BAJ4B,YAAzBb,KAAqC,WAAa,+DAapCA,UAAAA,8BAHW,YAAzBA,KAAqC,WAAa,ilBAjCnCA,MAAK6qC,oBAAsB7qC,MAAK8qC,oBAAsB9qC,MAAKsrC,mGAA3DtrC,MAAK6qC,gCAAsB7qC,MAAK8qC,gCAAsB9qC,MAAKsrC,maADtFtrC,0BAALa,0NAAKb,aAALa,kIAAAA,+DAAAA,qJAoBmDb,MAAK47H,eAAY57H,MAAK67H,wEAAzC77H,MAAK+qC,qCAArB5oC,yFAUkEnC,uJADsBA,MAAM,gBAAYA,wIACnDA,MAAM,YADjEmC,+BAAgCnC,cAChCmC,yFADgCnC,2LAmEzBA,2BAALa,gJAXgJ,4BACnB,6BACE,6BACgB,qCACA,qCACC,iCACvB,6BACM,iHAP/Cb,MAAYA,MAAiB,KAAE,+DACjGA,MAAYA,MAAiB,KAAE,2EAC/BA,MAAYA,MAAkB,MAAE,2EAChCA,MAAYA,MAA0B,cAAE,2EACxCA,MAAYA,MAA0B,cAAE,2EACxCA,MAAYA,MAAqB,SAAE,sFACnCA,MAAYA,MAAe,GAAE,2EAC7BA,MAAYA,MAAkB,MAAE,0SAX5DmC,SACIJ,OACIA,OACIA,OACIA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBAGRA,iSAVsF/B,MAAYA,MAAiB,KAAE,yFACjGA,MAAYA,MAAiB,KAAE,qGAC/BA,MAAYA,MAAkB,MAAE,qGAChCA,MAAYA,MAA0B,cAAE,qGACxCA,MAAYA,MAA0B,cAAE,qGACxCA,MAAYA,MAAqB,SAAE,gHACnCA,MAAYA,MAAe,GAAE,qGAC7BA,MAAYA,MAAkB,MAAE,uGAIzCA,cAALa,0HAAAA,gEAAAA,4PArCKb,4BAALa,oJAbgJ,4BACrB,2BACI,6BACI,+BACS,8BACb,2BACgB,8BACmB,8BACzC,6BACM,qHAT/Cb,MAAYA,MAAiB,KAAE,+DACjGA,MAAYA,MAAgB,IAAE,2EAC9BA,MAAYA,MAAkB,MAAE,2EAChCA,MAAYA,MAAoB,QAAE,2EAClCA,MAAYA,MAAmB,OAAE,sFACjCA,MAAYA,MAAkB,MAAE,2EAChCA,MAAYA,MAA0B,cAAE,2EACxCA,MAAYA,MAA8B,kBAAE,sFAC5CA,MAAYA,MAAe,GAAE,4EAC7BA,MAAYA,MAAkB,MAAE,2SAb5DmC,SACIJ,OACIA,OACIA,OACIA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,sBAGRA,gVAZsF/B,MAAYA,MAAiB,KAAE,0FACjGA,MAAYA,MAAgB,IAAE,sGAC9BA,MAAYA,MAAkB,MAAE,sGAChCA,MAAYA,MAAoB,QAAE,sGAClCA,MAAYA,MAAmB,OAAE,iHACjCA,MAAYA,MAAkB,MAAE,sGAChCA,MAAYA,MAA0B,cAAE,sGACxCA,MAAYA,MAA8B,kBAAE,iHAC5CA,MAAYA,MAAe,GAAE,wGAC7BA,MAAYA,MAAkB,MAAE,yGAIzCA,cAALa,oIAAAA,mEAAAA,uNA2CqDo8H,GAAIj9H,MAAG2tH,MAAMmB,WACb9uH,MAAG2tH,MAAMkB,WACT7uH,MAAG2tH,MAAMlC,mBACTzrH,MAAG2tH,MAAMjC,mBACEuR,GAAIj9H,MAAG2tH,MAAMoB,eACxB/uH,MAAG2tH,MAAMqO,QACTh8H,MAAG2tH,MAAMsO,+EAR/Bj8H,MAAG2rC,2BAA6B3rC,MAAGwqC,sBAAwBxqC,MAAG8C,mBAAqB9C,MAAgBA,MAAG6vH,qBAAuB7vH,MAAGk8H,qyBAFjK/5H,SACIJ,2BAGAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,uGAR6B/B,MAAG2rC,0CAA6B3rC,MAAGwqC,qCAAwBxqC,MAAG8C,kCAAqB9C,MAAgBA,MAAG6vH,oCAAuB7vH,MAAGk8H,8CAE1Ge,GAAIj9H,MAAG2tH,MAAMmB,0CACb9uH,MAAG2tH,MAAMkB,0CACT7uH,MAAG2tH,MAAMlC,kDACTzrH,MAAG2tH,MAAMjC,kDACEuR,GAAIj9H,MAAG2tH,MAAMoB,8CACxB/uH,MAAG2tH,MAAMqO,uCACTh8H,MAAG2tH,MAAMsO,6IAX3D9xF,GAAanqC,MAAIA,OAAuBirC,GAAajrC,MAAG6vH,KAAM7vH,mGAA9DmqC,GAAanqC,MAAIA,OAAuBirC,GAAajrC,MAAG6vH,KAAM7vH,qRAhCZA,MAAG2tH,MAAMuP,IAAIhQ,QAAQ,QACrBltH,MAAG2tH,MAAMxC,WACTnrH,MAAG2tH,MAAMvC,aACEprH,MAAG2tH,MAAMx4F,YACpBn1B,MAAG2tH,MAAMtC,WACTrrH,MAAG2tH,MAAMrC,mBACEtrH,MAAG2tH,MAAMwP,uBACpBn9H,MAAG2tH,MAAMqO,QACTh8H,MAAG2tH,MAAMsO,+EAV/Bj8H,MAAG2rC,2BAA6B3rC,MAAGwqC,sBAAwBxqC,MAAG8C,mBAAqB9C,MAAgBA,MAAG6vH,qBAAuB7vH,MAAGk8H,o+BAFjK/5H,SACIJ,2BAGAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,qBACAA,sGAV6B/B,MAAG2rC,yCAA6B3rC,MAAGwqC,oCAAwBxqC,MAAG8C,iCAAqB9C,MAAgBA,MAAG6vH,mCAAuB7vH,MAAGk8H,6CAE1Gl8H,MAAG2tH,MAAMuP,IAAIhQ,QAAQ,sCACrBltH,MAAG2tH,MAAMxC,yCACTnrH,MAAG2tH,MAAMvC,2CACEprH,MAAG2tH,MAAMx4F,0CACpBn1B,MAAG2tH,MAAMtC,yCACTrrH,MAAG2tH,MAAMrC,iDACEtrH,MAAG2tH,MAAMwP,qDACpBn9H,MAAG2tH,MAAMqO,sCACTh8H,MAAG2tH,MAAMsO,6IAb3D3xF,GAAetqC,MAAIA,OAAemqC,GAAanqC,MAAIA,OAAuBirC,GAAajrC,MAAG6vH,KAAM7vH,kGAAhGsqC,GAAetqC,MAAIA,OAAemqC,GAAanqC,MAAIA,OAAuBirC,GAAajrC,MAAG6vH,KAAM7vH,kQA7EhHA,KAAMa,OAAS,GAAKb,KAAQa,OAAS,uTAzF7Bk1H,GAAQ1xH,EAAKuwH,EAAcwI,EAAMv3H,EAAO,WAarC8O,KAZU,GAArBigH,EAAavwH,GACfuwH,EAAavwH,IAAQ,EAAIwB,EAGzB+uH,EAAavwH,GAAO,EAAIwB,EAET,QAAPxB,GAAiB+4H,EAAKv8H,QAAUu8H,EAAK,GAAGzP,MACvCyP,EAAK7nG,MAAMn2B,EAAGC,IAAOD,EAAEuuH,MAAMtpH,GAAOhF,EAAEsuH,MAAMtpH,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAG7F+4H,EAAK7nG,MAAMn2B,EAAGC,IAAOD,EAAEiF,GAAOhF,EAAEgF,IAAS,EAAIuwH,EAAavwH,GAAM,EAAIuwH,EAAavwH,IAErEuwH,EAClBjgH,GAAQtQ,IACVuwH,EAAajgH,GAAQ,UAGTkgH,QAAQuI,EAAmBxI,aAAAA,YAY9BqI,GAAIxuG,UACF9tB,KAAKqiC,MAAU,IAAJvU,GAAW,mCA7DtBomG,eACAnqF,4BACAmjF,GAAqB,4BACrBiD,QACP0E,EAASzmH,OAAOwR,WAAa,IAIpCxR,OAAOyqH,wBAFNhE,EAASzmH,OAAOwR,WAAa,UAgBvB60G,EACAD,EAdAR,EAAqB,GACrBxpF,EAAe,MACfZ,EAAa,MACb8yF,EAAuB,UACvB1yF,EAAQF,GAASC,GAEjBmrF,EAAkBzqF,GAAYV,GAE9B4yF,EAAUzI,EAAQhqH,OAAOxJ,IAAMA,EAAEmpC,UAAUrD,SAAS,MACpDo2F,EAAU1I,EAAQhqH,OAAOxJ,GAAKA,EAAEmpC,UAAUrD,SAAS,MACnDq2F,GAAc16H,KAAK,EAAGo6H,IAAI,EAAG/R,MAAM,EAAGC,QAAQ,EAAGj2F,OAAO,EAAGk2F,MAAM,EAAGC,cAAc,EAAG6R,kBAAkB,EAAGnB,GAAG,EAAGC,MAAM,GACtHwB,GAAc36H,KAAK,EAAGgsH,KAAK,EAAGD,MAAM,EAAGpD,cAAc,EAAGC,cAAc,EAAGqD,SAAS,EAAGiN,GAAG,EAAGC,MAAM,YAI5FzvF,EAAgBpC,QACrB+qF,EAAsB/qF,EAAOujF,MAAMkD,cACnCuE,EAAehrF,OACGgmF,UAAU0F,MAAMn2H,SAASuN,eAAe,iBACxDyzD,gBAsBG+8D,EAAYr5H,OACbqF,EAAIqsH,GAAQ1xH,EAAKm5H,EAAYF,OACjCA,EAAU5zH,EAAEmrH,cACZ2I,EAAa9zH,EAAEkrH,uBAEV+I,EAAYt5H,OACbqF,EAAIqsH,GAAQ1xH,EAAKo5H,EAAYF,QACjCA,EAAU7zH,EAAEmrH,cACZ4I,EAAa/zH,EAAEkrH,kPA5CK,IAAK,IAAK,QAOf,WAAY,GAAI,8BA4HSyI,0CAEAA,kCAMhBlyF,qCASgBZ,kCAGAA,kCAQboqF,yBASG+I,EAAY,YACuEA,EAAY,WACVA,EAAY,aACVA,EAAY,eACFA,EAAY,cACxBA,EAAY,aACJA,EAAY,qBACGA,EAAY,yBACtCA,EAAY,UACTA,EAAY,aAO5ClxF,EAAgBqtF,QAuBrE8D,EAAY,YACwEA,EAAY,YACXA,EAAY,aACJA,EAAY,qBACZA,EAAY,qBACNA,EAAY,gBAC7BA,EAAY,UACTA,EAAY,aAO5CnxF,EAAgBqtF,qJClP3G9qH,OAAO6uH,UAAY,SAAUr6H,GACzB,OAAO,IAAIq6H,GAAUr6H,IAEzBwL,OAAO8uH,YAAc,SAAUt6H,GAC3B,OAAO,IAAIs6H,GAAYt6H,IAE3BwL,OAAO+uH,QAAU,SAAUv6H,GACvB,OAAO,IAAIu6H,GAAQv6H,IAEvBwL,OAAOgvH,QAAU,SAAUx6H,GACvB,OAAO,IAAIw6H,GAAQx6H,IAEvBwL,OAAOivH,YAAc,SAAUz6H,GAC3B,OAAO,IAAIy6H,GAAYz6H,IAE3BwL,OAAOkvH,QAAU,SAAU16H,GACvB,OAAO,IAAI06H,GAAQ16H,IAEvBwL,OAAOmvH,QAAU,SAAU36H,GACvB,OAAO,IAAI26H,GAAQ36H"}