{"version":3,"file":"choices_autocomplete_controller-B1p5zDXs.js","sources":["../../../app/frontend/fuse/javascript/choices_autocomplete_controller.js"],"sourcesContent":["import {\n addListener,\n canonical,\n defer,\n fire,\n remove,\n removeListener,\n toParamsQueryString,\n} from '@slideslive/fuse-kit/utils';\nimport Choices from 'choices.js';\nimport ApplicationController from 'modules/application_controller';\n\nexport default class extends ApplicationController {\n static get targets() {\n return ['linkContainer', 'link'];\n }\n\n initialize() {\n this.listeners = [];\n this.choicesInputElementListenerIds = [];\n\n this.props = {\n choices: null,\n loading: false,\n searchCache: {},\n fetchRequest: null,\n mutationObserver: null,\n };\n }\n\n connect() {\n if (this.isTurboPreview) {\n if (this.element.multiple) {\n this.element.hidden = true;\n }\n\n return;\n }\n\n if (this.listeners.length === 0) {\n this.initListeners();\n }\n\n this.createChoices();\n this.initArgumentsObserver();\n }\n\n disconnect() {\n if (this.isTurboPreview) {\n return;\n }\n\n if (this.fetchRequest) {\n this.fetchRequest.abortController.abort();\n this.fetchRequest = null;\n }\n\n for (const listener of this.listeners) {\n removeListener(listener.target, { id: listener.id });\n }\n\n this.listeners = [];\n this.loading = false;\n this.searchCache = {};\n }\n\n initListeners() {\n this.listeners.push({\n target: document,\n id: addListener(document, 'turbo:before-cache', this.destroyChoices.bind(this)),\n });\n // this.popstateListenerId = addListener(window, 'popstate', this.destroyChoices.bind(this));\n }\n\n initArgumentsObserver() {\n if (this.mutationObserver) {\n return;\n }\n\n this.mutationObserver = new MutationObserver((mutations) => {\n mutations.forEach((record) => {\n if (record.type === 'attributes') {\n switch (record.attributeName) {\n case 'disabled': {\n if (!this.choices) {\n break;\n }\n\n if (record.target.disabled) {\n this.choices.disable();\n } else {\n this.choices.enable();\n }\n\n break;\n }\n default:\n break;\n }\n }\n });\n });\n\n this.mutationObserver.observe(this.element, {\n attributes: true,\n });\n }\n\n disconnectArgumentsObserver() {\n if (!this.mutationObserver) {\n return;\n }\n\n this.mutationObserver.disconnect();\n }\n\n destroyBeforeDisconnectListeners() {\n for (const { target, id } of this.listeners) {\n removeListener(target, { id });\n }\n }\n\n destroyChoices() {\n this.destroyBeforeDisconnectListeners();\n this.disconnectArgumentsObserver();\n\n if (!this.choices) {\n return;\n }\n\n this.removeEventHandlersOnChoicesInputElement();\n this.choices.destroy();\n }\n\n createChoices() {\n if (this.choices) {\n return;\n }\n\n if (this.removeFirstBlank) {\n this.removeFirstBlankOption();\n }\n\n this.choices = new Choices(this.element, this.options);\n this.addPlaceholderOption();\n this.addAdditionalOptionsForQuery();\n }\n\n removeFirstBlankOption() {\n const option = this.element.querySelector(\"option[value='']\");\n\n if (!option) {\n return;\n }\n\n remove(option);\n }\n\n handleChoicesInit() {\n this.setEventHandlersOnChoicesInputElement();\n\n defer(() => {\n this.dispatch('initialized', {\n detail: {\n ...this.choices.getValue(),\n },\n });\n });\n }\n\n setEventHandlersOnChoicesInputElement() {\n if (!this.autocompleteUrl) {\n return;\n }\n\n if (this.choicesMultiple) {\n const setValueOnCommaKeyId = addListener(this.choicesInput, 'keydown', this.setValueOnCommaKey.bind(this));\n this.choicesInputElementListenerIds.push(setValueOnCommaKeyId);\n }\n }\n\n removeEventHandlersOnChoicesInputElement() {\n for (const listenerId of this.choicesInputElementListenerIds) {\n removeListener(this.choicesInput, { id: listenerId });\n }\n\n this.choicesInputElementListenerIds = [];\n }\n\n handleCopy(event) {\n const choicesInput = this.choicesInput;\n\n if (event.target !== choicesInput) {\n return false;\n }\n\n if (choicesInput.selectionStart !== choicesInput.selectionEnd) {\n return false;\n }\n\n const highlightedItems = [this.choices.getValue()].flat().filter((item) => item.highlighted);\n\n if (highlightedItems.length > 0) {\n const highlightedItemValues = highlightedItems.map((item) => item.value);\n\n event.clipboardData.setData('application/x-slideslive-tags', JSON.stringify(highlightedItemValues));\n event.clipboardData.setData('text/plain', highlightedItemValues.join(', '));\n\n event.preventDefault();\n }\n\n return true;\n }\n\n handleCut(event) {\n if (!this.handleCopy(event)) {\n return;\n }\n\n this.choices.removeActiveItems();\n }\n\n handlePaste(event) {\n const choicesInput = this.choicesInput;\n\n if (event.target !== choicesInput) {\n return;\n }\n\n if (choicesInput.selectionStart !== choicesInput.selectionEnd) {\n return;\n }\n\n const highlightedItemsJson = event.clipboardData.getData('application/x-slideslive-tags');\n\n if (highlightedItemsJson) {\n const highlightedItems = JSON.parse(highlightedItemsJson);\n const existingTags = this.choices.getValue(true) || [];\n\n for (const item of highlightedItems) {\n if (!existingTags.includes(item)) {\n this.choices.setValue([item]);\n }\n }\n\n event.preventDefault();\n } else {\n const text = event.clipboardData.getData('text/plain');\n\n if (text && text.includes(',')) {\n const items = text.split(',').map((item) => item.trim());\n const existingTags = this.choices.getValue(true) || [];\n\n for (const item of items) {\n if (!existingTags.includes(item)) {\n this.choices.setValue([item]);\n }\n }\n\n event.preventDefault();\n }\n }\n }\n\n handleOriginalSelectChange(event) {\n const nativeValue = event.target.value;\n const choicesValue = this.choices.getValue(true);\n if (nativeValue === choicesValue) return;\n if (choicesValue.includes && choicesValue.includes(nativeValue)) return;\n\n this.choices.setChoiceByValue(nativeValue);\n }\n\n searchEvent(event) {\n const query = event.detail.value;\n\n this.search(query);\n }\n\n search(query) {\n if (this.fetchRequest) {\n this.fetchRequest.abortController.abort();\n this.fetchRequest = null;\n }\n\n if (this.searchCache[query.toLowerCase()]) {\n this.searchFromCache(query);\n } else {\n this.searchWithFetch(query);\n }\n }\n\n searchFromCache(query) {\n this.loading = false;\n this.clearDropdown();\n this.setDropdownContent(query, this.searchCache[query.toLowerCase()]);\n }\n\n searchWithFetch(query) {\n if (!this.loading) {\n this.loading = true;\n this.placeholderOptionText = this.loadingText;\n this.clearDropdown();\n }\n\n let data;\n\n if (this.autocompleteQueryData) {\n data = JSON.parse(this.autocompleteQueryData);\n } else {\n data = {};\n }\n\n const params = toParamsQueryString({\n ...data,\n term: query,\n });\n const fetchAbortController = new AbortController();\n const url = this.autocompleteUrl.includes('?')\n ? `${this.autocompleteUrl}&${params}`\n : `${this.autocompleteUrl}?${params}`;\n\n this.fetchRequest = fetch(url, {\n credentials: 'include',\n signal: fetchAbortController.signal,\n })\n .then((res) => res.json())\n .then((resData) => {\n this.searchCache[query] = resData;\n this.setDropdownContent(query, resData);\n\n this.loading = false;\n this.placeholderOptionText = this.noResultsText;\n })\n .catch((err) => {\n if (err.code === 20) {\n return;\n }\n\n this.loading = false;\n this.placeholderOptionText = this.noResultsText;\n });\n\n this.fetchRequest.abortController = fetchAbortController;\n }\n\n clearDropdown() {\n this.choices.clearChoices();\n }\n\n addPlaceholderOption() {\n if (!this.element.hasAttribute('placeholder')) {\n return;\n }\n\n this.choices.setChoices(\n [\n {\n disabled: true,\n value: '',\n selected: !this.choices.getValue(),\n label: this.element.getAttribute('placeholder'),\n },\n ],\n 'value',\n 'label',\n false,\n );\n }\n\n addAdditionalOptionsForQuery(query, foundQueryInExistingValues) {\n const additionalOptions = this.additionalOptionsForQuery(query, foundQueryInExistingValues);\n\n if (additionalOptions) {\n this.choices.setChoices(additionalOptions, 'value', 'label', false);\n }\n }\n\n setDropdownContent(query, data) {\n this.loading = false;\n\n const existingValues = this.choices.getValue(true) || [];\n let foundQueryInExistingValues = false;\n const content = {};\n\n const groups = [];\n let groupId = 0;\n const groupField = this.groupField;\n\n for (let i = 0; i < data.length; ++i) {\n const entry = data[i];\n\n let optionLabel = this.labelField.split('.').reduce((nestedEntry, key) => {\n if (nestedEntry && key in nestedEntry) {\n return nestedEntry[key];\n }\n\n return null;\n }, entry);\n let optionValue = this.valueField.split('.').reduce((nestedEntry, key) => {\n if (nestedEntry && key in nestedEntry) {\n return nestedEntry[key];\n }\n\n return null;\n }, entry);\n\n if (!optionLabel || !optionValue) {\n console.warn('Missing label or value field in select entry.', this.labelField, this.valueField, entry);\n continue;\n }\n\n optionLabel = optionLabel.toString();\n optionValue = optionValue.toString();\n\n if (this.showSelectedValuesInDropdown || !existingValues.includes(optionValue)) {\n const option = {\n label: optionLabel,\n value: optionValue,\n };\n const customProperties = this.optionCustomPropertiesFor(entry, optionLabel, optionValue);\n if (customProperties) {\n option.customProperties = customProperties;\n } else {\n option.customProperties = entry;\n }\n\n let group;\n if (groupField) {\n group = entry[groupField];\n } else {\n group = 'group';\n }\n\n if (!content[group]) {\n groups.push(group);\n content[group] = {\n label: group,\n id: groupId++,\n disabled: false,\n choices: [],\n };\n }\n\n content[group].choices.push(option);\n }\n\n if (optionValue.toLowerCase() === query.toLowerCase()) {\n foundQueryInExistingValues = true;\n }\n }\n\n if (!foundQueryInExistingValues) {\n foundQueryInExistingValues = existingValues.includes(query);\n }\n\n this.choices.setChoices([], 'value', 'label', true);\n\n this.addPlaceholderOption();\n this.addAdditionalOptionsForQuery(query, foundQueryInExistingValues);\n\n let sortedGroups;\n let sortedContent;\n if (this.shouldSortSearchResults) {\n sortedGroups = this.sortSearchGroups(query, groups);\n sortedContent = this.sortSearchResults(query, content);\n } else {\n sortedGroups = groups;\n sortedContent = content;\n }\n\n if (groupField) {\n const groupedItems = sortedGroups.map((group) => sortedContent[group]);\n this.choices.setChoices(groupedItems, 'value', 'label', false);\n } else if (sortedContent.group) {\n this.choices.setChoices(sortedContent.group.choices, 'value', 'label', false);\n }\n }\n\n setValueOnCommaKey(event) {\n if (event.keyCode !== 188) {\n return;\n }\n\n const value = event.target.value.trim();\n event.target.value = '';\n\n if (value !== '') {\n this.choices.setValue([value]);\n\n this.loading = false;\n this.placeholderOptionText = this.searchText;\n this.clearDropdown();\n\n if (this.fetchRequest) {\n this.fetchRequest.abortController.abort();\n this.fetchRequest = null;\n }\n\n fire(this.element, 'change');\n }\n\n event.preventDefault();\n }\n\n optionCustomPropertiesFor() {\n return null;\n }\n\n additionalOptionsForQuery() {\n return null;\n }\n\n sortSearchGroups(query, groups) {\n return groups;\n }\n\n sortSearchResults(query, results) {\n const canonicalQuery = canonical(query).toLowerCase();\n\n const sortGroup = (items) => {\n items.sort((a, b) => {\n const aLabel = canonical(a.label).toLowerCase();\n const bLabel = canonical(b.label).toLowerCase();\n\n const aIndex = aLabel.indexOf(canonicalQuery);\n const bIndex = bLabel.indexOf(canonicalQuery);\n\n if (aIndex === 0 && bIndex !== 0) return -1;\n if (aIndex !== 0 && bIndex === 0) return 1;\n\n return aLabel.localeCompare(bLabel);\n });\n };\n\n for (const group of Object.keys(results)) {\n sortGroup(results[group].choices);\n }\n\n return results;\n }\n\n set placeholderOptionText(text) {\n const optionElement = this.element.parentNode.parentNode.querySelector('.choices__item.has-no-results');\n if (optionElement) {\n optionElement.textContent = text;\n }\n }\n\n get options() {\n const options = {\n allowHTML: true,\n shouldSort: false,\n searchFloor: this.searchFloor,\n searchResultLimit: this.searchResultLimit,\n itemSelectText: this.itemSelectText,\n noChoicesText: this.searchText,\n duplicateItemsAllowed: this.duplicateItemsAllowed,\n removeItemButton: this.removeItemButton,\n position: this.position,\n noResultsText: () => {\n if (this.loading) {\n return this.loadingText;\n }\n\n if (this.choicesInput.value === '') {\n return this.searchText;\n }\n\n return this.noResultsText;\n },\n callbackOnInit: () => this.handleChoicesInit(),\n callbackOnCreateTemplates: () => this.createTemplates,\n };\n\n if (this.element.hasAttribute('placeholder')) {\n options.searchPlaceholderValue = this.searchText;\n }\n\n return options;\n }\n\n get showSelectedValuesInDropdown() {\n return true;\n }\n\n get createTemplates() {\n return {};\n }\n\n get searchFloor() {\n return 1;\n }\n\n get searchResultLimit() {\n return 1000;\n }\n\n get itemSelectText() {\n return '';\n }\n\n get removeFirstBlank() {\n return this.element.getAttribute('data-choices-remove-first-blank') === 'true';\n }\n\n get searchText() {\n return this.element.getAttribute('data-choices-search-text') || 'Type the search term.';\n }\n\n get loadingText() {\n return this.element.getAttribute('data-choices-loading-text') || 'Loading…';\n }\n\n get noResultsText() {\n return this.element.getAttribute('data-choices-no-results-text') || 'No results found.';\n }\n\n get duplicateItemsAllowed() {\n return true;\n }\n\n get removeItemButton() {\n return true;\n }\n\n get position() {\n return this.element.getAttribute('data-choices-position') || 'auto';\n }\n\n get autocompleteUrl() {\n return this.element.getAttribute('data-choices-url');\n }\n\n get autocompleteQueryData() {\n return this.element.getAttribute('data-choices-query-data');\n }\n\n get valueField() {\n return this.element.getAttribute('data-choices-value-field') || 'tag';\n }\n\n get labelField() {\n return this.element.getAttribute('data-choices-label-field') || 'tag';\n }\n\n get groupField() {\n return this.element.getAttribute('data-choices-group-field');\n }\n\n get shouldSortSearchResults() {\n return this.element.getAttribute('data-choices-sort-search') === 'true';\n }\n\n get choicesMultiple() {\n return this.element.type === 'text' || this.element.type === 'select-multiple';\n }\n\n get choicesInput() {\n return (\n (this.choices && this.choices.input && this.choices.input.element) ||\n this.element\n .closest('.choices')\n .querySelector('input.choices__input[type=\"search\"], input.choices__input[type=\"text\"]')\n );\n }\n\n get choices() {\n return this.props.choices;\n }\n\n set choices(value) {\n this.props.choices = value;\n }\n\n get loading() {\n return this.props.loading;\n }\n\n set loading(value) {\n this.props.loading = value;\n }\n\n get searchCache() {\n return this.props.searchCache;\n }\n\n set searchCache(value) {\n this.props.searchCache = value;\n }\n\n get fetchRequest() {\n return this.props.fetchRequest;\n }\n\n set fetchRequest(value) {\n this.props.fetchRequest = value;\n }\n\n get mutationObserver() {\n return this.props.mutationObserver;\n }\n\n set mutationObserver(value) {\n this.props.mutationObserver = value;\n }\n}\n"],"names":["ChoicesAutocompleteController","ApplicationController","listener","removeListener","addListener","mutations","record","target","id","Choices","option","remove","defer","setValueOnCommaKeyId","listenerId","event","choicesInput","highlightedItems","item","highlightedItemValues","highlightedItemsJson","existingTags","text","items","nativeValue","choicesValue","query","data","params","toParamsQueryString","fetchAbortController","url","res","resData","err","foundQueryInExistingValues","additionalOptions","existingValues","content","groups","groupId","groupField","i","entry","optionLabel","nestedEntry","key","optionValue","customProperties","group","sortedGroups","sortedContent","groupedItems","value","fire","results","canonicalQuery","canonical","sortGroup","a","b","aLabel","bLabel","aIndex","bIndex","optionElement","options"],"mappings":"6RAYe,MAAKA,UAASC,CAAsB,CACjD,WAAW,SAAU,CACnB,MAAO,CAAC,gBAAiB,MAAM,CACnC,CAEE,YAAa,CACX,KAAK,UAAY,CAAE,EACnB,KAAK,+BAAiC,CAAE,EAExC,KAAK,MAAQ,CACX,QAAS,KACT,QAAS,GACT,YAAa,CAAE,EACf,aAAc,KACd,iBAAkB,IACnB,CACL,CAEE,SAAU,CACR,GAAI,KAAK,eAAgB,CACnB,KAAK,QAAQ,WACf,KAAK,QAAQ,OAAS,IAGxB,MACN,CAEQ,KAAK,UAAU,SAAW,GAC5B,KAAK,cAAe,EAGtB,KAAK,cAAe,EACpB,KAAK,sBAAuB,CAChC,CAEE,YAAa,CACX,GAAI,MAAK,eAIT,CAAI,KAAK,eACP,KAAK,aAAa,gBAAgB,MAAO,EACzC,KAAK,aAAe,MAGtB,UAAWC,KAAY,KAAK,UAC1BC,EAAeD,EAAS,OAAQ,CAAE,GAAIA,EAAS,GAAI,EAGrD,KAAK,UAAY,CAAE,EACnB,KAAK,QAAU,GACf,KAAK,YAAc,CAAE,EACzB,CAEE,eAAgB,CACd,KAAK,UAAU,KAAK,CAClB,OAAQ,SACR,GAAIE,EAAY,SAAU,qBAAsB,KAAK,eAAe,KAAK,IAAI,CAAC,CACpF,CAAK,CAEL,CAEE,uBAAwB,CAClB,KAAK,mBAIT,KAAK,iBAAmB,IAAI,iBAAkBC,GAAc,CAC1DA,EAAU,QAASC,GAAW,CAC5B,GAAIA,EAAO,OAAS,aAClB,OAAQA,EAAO,cAAa,CAC1B,IAAK,WAAY,CACf,GAAI,CAAC,KAAK,QACR,MAGEA,EAAO,OAAO,SAChB,KAAK,QAAQ,QAAS,EAEtB,KAAK,QAAQ,OAAQ,EAGvB,KACd,CAGA,CAEA,CAAO,CACP,CAAK,EAED,KAAK,iBAAiB,QAAQ,KAAK,QAAS,CAC1C,WAAY,EAClB,CAAK,EACL,CAEE,6BAA8B,CACvB,KAAK,kBAIV,KAAK,iBAAiB,WAAY,CACtC,CAEE,kCAAmC,CACjC,SAAW,CAAE,OAAAC,EAAQ,GAAAC,CAAE,IAAM,KAAK,UAChCL,EAAeI,EAAQ,CAAE,GAAAC,EAAI,CAEnC,CAEE,gBAAiB,CACf,KAAK,iCAAkC,EACvC,KAAK,4BAA6B,EAE7B,KAAK,UAIV,KAAK,yCAA0C,EAC/C,KAAK,QAAQ,QAAS,EAC1B,CAEE,eAAgB,CACV,KAAK,UAIL,KAAK,kBACP,KAAK,uBAAwB,EAG/B,KAAK,QAAU,IAAIC,EAAQ,KAAK,QAAS,KAAK,OAAO,EACrD,KAAK,qBAAsB,EAC3B,KAAK,6BAA8B,EACvC,CAEE,wBAAyB,CACvB,MAAMC,EAAS,KAAK,QAAQ,cAAc,kBAAkB,EAEvDA,GAILC,EAAOD,CAAM,CACjB,CAEE,mBAAoB,CAClB,KAAK,sCAAuC,EAE5CE,EAAM,IAAM,CACV,KAAK,SAAS,cAAe,CAC3B,OAAQ,CACN,GAAG,KAAK,QAAQ,SAAU,CAC3B,CACT,CAAO,CACP,CAAK,CACL,CAEE,uCAAwC,CACtC,GAAK,KAAK,iBAIN,KAAK,gBAAiB,CACxB,MAAMC,EAAuBT,EAAY,KAAK,aAAc,UAAW,KAAK,mBAAmB,KAAK,IAAI,CAAC,EACzG,KAAK,+BAA+B,KAAKS,CAAoB,CACnE,CACA,CAEE,0CAA2C,CACzC,UAAWC,KAAc,KAAK,+BAC5BX,EAAe,KAAK,aAAc,CAAE,GAAIW,CAAU,CAAE,EAGtD,KAAK,+BAAiC,CAAE,CAC5C,CAEE,WAAWC,EAAO,CAChB,MAAMC,EAAe,KAAK,aAM1B,GAJID,EAAM,SAAWC,GAIjBA,EAAa,iBAAmBA,EAAa,aAC/C,MAAO,GAGT,MAAMC,EAAmB,CAAC,KAAK,QAAQ,SAAU,CAAA,EAAE,KAAI,EAAG,OAAQC,GAASA,EAAK,WAAW,EAE3F,GAAID,EAAiB,OAAS,EAAG,CAC/B,MAAME,EAAwBF,EAAiB,IAAKC,GAASA,EAAK,KAAK,EAEvEH,EAAM,cAAc,QAAQ,gCAAiC,KAAK,UAAUI,CAAqB,CAAC,EAClGJ,EAAM,cAAc,QAAQ,aAAcI,EAAsB,KAAK,IAAI,CAAC,EAE1EJ,EAAM,eAAgB,CAC5B,CAEI,MAAO,EACX,CAEE,UAAUA,EAAO,CACV,KAAK,WAAWA,CAAK,GAI1B,KAAK,QAAQ,kBAAmB,CACpC,CAEE,YAAYA,EAAO,CACjB,MAAMC,EAAe,KAAK,aAM1B,GAJID,EAAM,SAAWC,GAIjBA,EAAa,iBAAmBA,EAAa,aAC/C,OAGF,MAAMI,EAAuBL,EAAM,cAAc,QAAQ,+BAA+B,EAExF,GAAIK,EAAsB,CACxB,MAAMH,EAAmB,KAAK,MAAMG,CAAoB,EAClDC,EAAe,KAAK,QAAQ,SAAS,EAAI,GAAK,CAAE,EAEtD,UAAWH,KAAQD,EACZI,EAAa,SAASH,CAAI,GAC7B,KAAK,QAAQ,SAAS,CAACA,CAAI,CAAC,EAIhCH,EAAM,eAAgB,CAC5B,KAAW,CACL,MAAMO,EAAOP,EAAM,cAAc,QAAQ,YAAY,EAErD,GAAIO,GAAQA,EAAK,SAAS,GAAG,EAAG,CAC9B,MAAMC,EAAQD,EAAK,MAAM,GAAG,EAAE,IAAKJ,GAASA,EAAK,MAAM,EACjDG,EAAe,KAAK,QAAQ,SAAS,EAAI,GAAK,CAAE,EAEtD,UAAWH,KAAQK,EACZF,EAAa,SAASH,CAAI,GAC7B,KAAK,QAAQ,SAAS,CAACA,CAAI,CAAC,EAIhCH,EAAM,eAAgB,CAC9B,CACA,CACA,CAEE,2BAA2BA,EAAO,CAChC,MAAMS,EAAcT,EAAM,OAAO,MAC3BU,EAAe,KAAK,QAAQ,SAAS,EAAI,EAC3CD,IAAgBC,IAChBA,EAAa,UAAYA,EAAa,SAASD,CAAW,GAE9D,KAAK,QAAQ,iBAAiBA,CAAW,EAC7C,CAEE,YAAYT,EAAO,CACjB,MAAMW,EAAQX,EAAM,OAAO,MAE3B,KAAK,OAAOW,CAAK,CACrB,CAEE,OAAOA,EAAO,CACR,KAAK,eACP,KAAK,aAAa,gBAAgB,MAAO,EACzC,KAAK,aAAe,MAGlB,KAAK,YAAYA,EAAM,YAAa,CAAA,EACtC,KAAK,gBAAgBA,CAAK,EAE1B,KAAK,gBAAgBA,CAAK,CAEhC,CAEE,gBAAgBA,EAAO,CACrB,KAAK,QAAU,GACf,KAAK,cAAe,EACpB,KAAK,mBAAmBA,EAAO,KAAK,YAAYA,EAAM,YAAW,CAAE,CAAC,CACxE,CAEE,gBAAgBA,EAAO,CAChB,KAAK,UACR,KAAK,QAAU,GACf,KAAK,sBAAwB,KAAK,YAClC,KAAK,cAAe,GAGtB,IAAIC,EAEA,KAAK,sBACPA,EAAO,KAAK,MAAM,KAAK,qBAAqB,EAE5CA,EAAO,CAAE,EAGX,MAAMC,EAASC,EAAoB,CACjC,GAAGF,EACH,KAAMD,CACZ,CAAK,EACKI,EAAuB,IAAI,gBAC3BC,EAAM,KAAK,gBAAgB,SAAS,GAAG,EACzC,GAAG,KAAK,eAAe,IAAIH,CAAM,GACjC,GAAG,KAAK,eAAe,IAAIA,CAAM,GAErC,KAAK,aAAe,MAAMG,EAAK,CAC7B,YAAa,UACb,OAAQD,EAAqB,MAC9B,CAAA,EACE,KAAME,GAAQA,EAAI,KAAM,CAAA,EACxB,KAAMC,GAAY,CACjB,KAAK,YAAYP,CAAK,EAAIO,EAC1B,KAAK,mBAAmBP,EAAOO,CAAO,EAEtC,KAAK,QAAU,GACf,KAAK,sBAAwB,KAAK,aACnC,CAAA,EACA,MAAOC,GAAQ,CACVA,EAAI,OAAS,KAIjB,KAAK,QAAU,GACf,KAAK,sBAAwB,KAAK,cAC1C,CAAO,EAEH,KAAK,aAAa,gBAAkBJ,CACxC,CAEE,eAAgB,CACd,KAAK,QAAQ,aAAc,CAC/B,CAEE,sBAAuB,CAChB,KAAK,QAAQ,aAAa,aAAa,GAI5C,KAAK,QAAQ,WACX,CACE,CACE,SAAU,GACV,MAAO,GACP,SAAU,CAAC,KAAK,QAAQ,SAAU,EAClC,MAAO,KAAK,QAAQ,aAAa,aAAa,CAC/C,CACF,EACD,QACA,QACA,EACD,CACL,CAEE,6BAA6BJ,EAAOS,EAA4B,CAC9D,MAAMC,EAAoB,KAAK,0BAA0BV,EAAOS,CAA0B,EAEtFC,GACF,KAAK,QAAQ,WAAWA,EAAmB,QAAS,QAAS,EAAK,CAExE,CAEE,mBAAmBV,EAAOC,EAAM,CAC9B,KAAK,QAAU,GAEf,MAAMU,EAAiB,KAAK,QAAQ,SAAS,EAAI,GAAK,CAAE,EACxD,IAAIF,EAA6B,GACjC,MAAMG,EAAU,CAAE,EAEZC,EAAS,CAAE,EACjB,IAAIC,EAAU,EACd,MAAMC,EAAa,KAAK,WAExB,QAASC,EAAI,EAAGA,EAAIf,EAAK,OAAQ,EAAEe,EAAG,CACpC,MAAMC,EAAQhB,EAAKe,CAAC,EAEpB,IAAIE,EAAc,KAAK,WAAW,MAAM,GAAG,EAAE,OAAO,CAACC,EAAaC,IAC5DD,GAAeC,KAAOD,EACjBA,EAAYC,CAAG,EAGjB,KACNH,CAAK,EACJI,EAAc,KAAK,WAAW,MAAM,GAAG,EAAE,OAAO,CAACF,EAAaC,IAC5DD,GAAeC,KAAOD,EACjBA,EAAYC,CAAG,EAGjB,KACNH,CAAK,EAER,GAAI,CAACC,GAAe,CAACG,EAAa,CAChC,QAAQ,KAAK,gDAAiD,KAAK,WAAY,KAAK,WAAYJ,CAAK,EACrG,QACR,CAKM,GAHAC,EAAcA,EAAY,SAAU,EACpCG,EAAcA,EAAY,SAAU,EAEhC,KAAK,8BAAgC,CAACV,EAAe,SAASU,CAAW,EAAG,CAC9E,MAAMrC,EAAS,CACb,MAAOkC,EACP,MAAOG,CACR,EACKC,EAAmB,KAAK,0BAA0BL,EAAOC,EAAaG,CAAW,EACnFC,EACFtC,EAAO,iBAAmBsC,EAE1BtC,EAAO,iBAAmBiC,EAG5B,IAAIM,EACAR,EACFQ,EAAQN,EAAMF,CAAU,EAExBQ,EAAQ,QAGLX,EAAQW,CAAK,IAChBV,EAAO,KAAKU,CAAK,EACjBX,EAAQW,CAAK,EAAI,CACf,MAAOA,EACP,GAAIT,IACJ,SAAU,GACV,QAAS,CAAE,CACZ,GAGHF,EAAQW,CAAK,EAAE,QAAQ,KAAKvC,CAAM,CAC1C,CAEUqC,EAAY,YAAW,IAAOrB,EAAM,YAAW,IACjDS,EAA6B,GAErC,CAESA,IACHA,EAA6BE,EAAe,SAASX,CAAK,GAG5D,KAAK,QAAQ,WAAW,CAAE,EAAE,QAAS,QAAS,EAAI,EAElD,KAAK,qBAAsB,EAC3B,KAAK,6BAA6BA,EAAOS,CAA0B,EAEnE,IAAIe,EACAC,EASJ,GARI,KAAK,yBACPD,EAAe,KAAK,iBAAiBxB,EAAOa,CAAM,EAClDY,EAAgB,KAAK,kBAAkBzB,EAAOY,CAAO,IAErDY,EAAeX,EACfY,EAAgBb,GAGdG,EAAY,CACd,MAAMW,EAAeF,EAAa,IAAKD,GAAUE,EAAcF,CAAK,CAAC,EACrE,KAAK,QAAQ,WAAWG,EAAc,QAAS,QAAS,EAAK,CACnE,MAAeD,EAAc,OACvB,KAAK,QAAQ,WAAWA,EAAc,MAAM,QAAS,QAAS,QAAS,EAAK,CAElF,CAEE,mBAAmBpC,EAAO,CACxB,GAAIA,EAAM,UAAY,IACpB,OAGF,MAAMsC,EAAQtC,EAAM,OAAO,MAAM,KAAM,EACvCA,EAAM,OAAO,MAAQ,GAEjBsC,IAAU,KACZ,KAAK,QAAQ,SAAS,CAACA,CAAK,CAAC,EAE7B,KAAK,QAAU,GACf,KAAK,sBAAwB,KAAK,WAClC,KAAK,cAAe,EAEhB,KAAK,eACP,KAAK,aAAa,gBAAgB,MAAO,EACzC,KAAK,aAAe,MAGtBC,EAAK,KAAK,QAAS,QAAQ,GAG7BvC,EAAM,eAAgB,CAC1B,CAEE,2BAA4B,CAC1B,OAAO,IACX,CAEE,2BAA4B,CAC1B,OAAO,IACX,CAEE,iBAAiBW,EAAOa,EAAQ,CAC9B,OAAOA,CACX,CAEE,kBAAkBb,EAAO6B,EAAS,CAChC,MAAMC,EAAiBC,EAAU/B,CAAK,EAAE,YAAa,EAE/CgC,EAAanC,GAAU,CAC3BA,EAAM,KAAK,CAACoC,EAAGC,IAAM,CACnB,MAAMC,EAASJ,EAAUE,EAAE,KAAK,EAAE,YAAa,EACzCG,EAASL,EAAUG,EAAE,KAAK,EAAE,YAAa,EAEzCG,EAASF,EAAO,QAAQL,CAAc,EACtCQ,EAASF,EAAO,QAAQN,CAAc,EAE5C,OAAIO,IAAW,GAAKC,IAAW,EAAU,GACrCD,IAAW,GAAKC,IAAW,EAAU,EAElCH,EAAO,cAAcC,CAAM,CAC1C,CAAO,CACF,EAED,UAAWb,KAAS,OAAO,KAAKM,CAAO,EACrCG,EAAUH,EAAQN,CAAK,EAAE,OAAO,EAGlC,OAAOM,CACX,CAEE,IAAI,sBAAsBjC,EAAM,CAC9B,MAAM2C,EAAgB,KAAK,QAAQ,WAAW,WAAW,cAAc,+BAA+B,EAClGA,IACFA,EAAc,YAAc3C,EAElC,CAEE,IAAI,SAAU,CACZ,MAAM4C,EAAU,CACd,UAAW,GACX,WAAY,GACZ,YAAa,KAAK,YAClB,kBAAmB,KAAK,kBACxB,eAAgB,KAAK,eACrB,cAAe,KAAK,WACpB,sBAAuB,KAAK,sBAC5B,iBAAkB,KAAK,iBACvB,SAAU,KAAK,SACf,cAAe,IACT,KAAK,QACA,KAAK,YAGV,KAAK,aAAa,QAAU,GACvB,KAAK,WAGP,KAAK,cAEd,eAAgB,IAAM,KAAK,kBAAmB,EAC9C,0BAA2B,IAAM,KAAK,eACvC,EAED,OAAI,KAAK,QAAQ,aAAa,aAAa,IACzCA,EAAQ,uBAAyB,KAAK,YAGjCA,CACX,CAEE,IAAI,8BAA+B,CACjC,MAAO,EACX,CAEE,IAAI,iBAAkB,CACpB,MAAO,CAAE,CACb,CAEE,IAAI,aAAc,CAChB,MAAO,EACX,CAEE,IAAI,mBAAoB,CACtB,MAAO,IACX,CAEE,IAAI,gBAAiB,CACnB,MAAO,EACX,CAEE,IAAI,kBAAmB,CACrB,OAAO,KAAK,QAAQ,aAAa,iCAAiC,IAAM,MAC5E,CAEE,IAAI,YAAa,CACf,OAAO,KAAK,QAAQ,aAAa,0BAA0B,GAAK,uBACpE,CAEE,IAAI,aAAc,CAChB,OAAO,KAAK,QAAQ,aAAa,2BAA2B,GAAK,UACrE,CAEE,IAAI,eAAgB,CAClB,OAAO,KAAK,QAAQ,aAAa,8BAA8B,GAAK,mBACxE,CAEE,IAAI,uBAAwB,CAC1B,MAAO,EACX,CAEE,IAAI,kBAAmB,CACrB,MAAO,EACX,CAEE,IAAI,UAAW,CACb,OAAO,KAAK,QAAQ,aAAa,uBAAuB,GAAK,MACjE,CAEE,IAAI,iBAAkB,CACpB,OAAO,KAAK,QAAQ,aAAa,kBAAkB,CACvD,CAEE,IAAI,uBAAwB,CAC1B,OAAO,KAAK,QAAQ,aAAa,yBAAyB,CAC9D,CAEE,IAAI,YAAa,CACf,OAAO,KAAK,QAAQ,aAAa,0BAA0B,GAAK,KACpE,CAEE,IAAI,YAAa,CACf,OAAO,KAAK,QAAQ,aAAa,0BAA0B,GAAK,KACpE,CAEE,IAAI,YAAa,CACf,OAAO,KAAK,QAAQ,aAAa,0BAA0B,CAC/D,CAEE,IAAI,yBAA0B,CAC5B,OAAO,KAAK,QAAQ,aAAa,0BAA0B,IAAM,MACrE,CAEE,IAAI,iBAAkB,CACpB,OAAO,KAAK,QAAQ,OAAS,QAAU,KAAK,QAAQ,OAAS,iBACjE,CAEE,IAAI,cAAe,CACjB,OACG,KAAK,SAAW,KAAK,QAAQ,OAAS,KAAK,QAAQ,MAAM,SAC1D,KAAK,QACF,QAAQ,UAAU,EAClB,cAAc,wEAAwE,CAE/F,CAEE,IAAI,SAAU,CACZ,OAAO,KAAK,MAAM,OACtB,CAEE,IAAI,QAAQb,EAAO,CACjB,KAAK,MAAM,QAAUA,CACzB,CAEE,IAAI,SAAU,CACZ,OAAO,KAAK,MAAM,OACtB,CAEE,IAAI,QAAQA,EAAO,CACjB,KAAK,MAAM,QAAUA,CACzB,CAEE,IAAI,aAAc,CAChB,OAAO,KAAK,MAAM,WACtB,CAEE,IAAI,YAAYA,EAAO,CACrB,KAAK,MAAM,YAAcA,CAC7B,CAEE,IAAI,cAAe,CACjB,OAAO,KAAK,MAAM,YACtB,CAEE,IAAI,aAAaA,EAAO,CACtB,KAAK,MAAM,aAAeA,CAC9B,CAEE,IAAI,kBAAmB,CACrB,OAAO,KAAK,MAAM,gBACtB,CAEE,IAAI,iBAAiBA,EAAO,CAC1B,KAAK,MAAM,iBAAmBA,CAClC,CACA"}