{"version":3,"file":"kendo.mobile.min.js","names":["global","factory","exports","module","require","define","amd","globalThis","self","kendomobile","js","this","breakpoints","EVENT","defaultBreakpoints","small","medium","large","mediaQuery","query","Object","assign","kendo","defaults","mediaQueryList","window","matchMedia","onEnterCallbacks","onLeaveCallbacks","onChangeHandlers","kendoMediaQuery","onChangeHandler","ev","forEach","cb","matches","addEventListener","onChange","push","onEnter","media","MediaQueryListEvent","onLeave","destroy","removeEventListener","createMediaQuery","packageMetadata","name","productName","productCodes","publishDate","version","replace","licensingDocsUrl","$","undefined$1","Template","cultures","extend","each","isArray","Array","noop","math","Math","JSON","support","percentRegExp","formatRegExp","boxShadowRegExp","numberRegExp","MONTH","HOUR","ZONE","WEEKDAY","QUARTER","DATE_FIELD_MAP","G","y","q","Q","M","L","d","E","c","e","h","H","k","K","m","s","a","t","x","X","z","Z","NAME_TYPES","month","type","minLength","standAlone","quarter","weekday","dayperiod","era","FUNCTION","STRING","NUMBER","OBJECT","NULL","BOOLEAN","UNDEFINED","ARIA_LABELLEDBY","ARIA_LABEL","getterCache","setterCache","slice","cssPropertiesNames","noDepricateExtend","src","copyIsArray","copy","options","clone","arguments$1","arguments","target","i","length","deep","jQuery","isPlainObject","Class","proto","member","fn","base","that","subclass","init","apply","prototype","constructor","_initOptions","deepExtend","isPresent","value","isBlank","isString","isNumeric","isNaN","parseFloat","isDate","getTime","isFunction","preventDefault","_defaultPrevented","isDefaultPrevented","Observable","_events","bind","eventName","handlers","one","idx","original","handler","eventNames","handlersIsFunction","unbind","first","unshift","trigger","events","sender","call","splice","compilePart","part","stringPart","split","join","charAt","rest","substring","argumentNameRegExp","encodeRegExp","escapedCurlyRegExp","curlyRegExp","escapedSharpRegExp","sharpRegExp","zeros","pad","number","digits","end","wrapResize","element","autosize","outerWidth","_outerWidth","outerHeight","_outerHeight","parent","wrapper","closest","visible","is","wrapperStyle","style","elementHeight","height","css","display","position","test","width","add","show","hide","destination","deepExtendOne","source","property","propValue","propType","propInit","destProp","ObservableArray","data","LazyObservableArray","DataSource","HierarchicalDataSource","RegExp","ArrayBuffer","HTMLElement","Date","testRx","agent","rxs","dflt","rx","hasOwnProperty","toCamelCase","str","strMatch","g1","toUpperCase","getComputedStyles","properties","computedStyle","styles","document","defaultView","getComputedStyle","getPropertyValue","currentStyle","size","paramName","useWithBlock","render","template","html","compile","parts","settings","argumentName","match","functionBody","Function","_slotCount","floor","debugTemplates","Error","format","console","warn","gap","indent","rep","escapable","meta","toString","quote","string","lastIndex","charCodeAt","key","holder","v","partial","mind","toJSON","isFinite","String","valueOf","getUTCFullYear","getUTCMonth","getUTCDate","getUTCHours","getUTCMinutes","getUTCSeconds","Number","Boolean","stringify","replacer","space","dateFormatRegExp","standardFormatRegExp","literalRegExp","commaRegExp","EMPTY","POINT","SHARP","ZERO","EN","objectToString","findCulture","culture","numberFormat","getCulture","current","pattern","decimals","groupSize","percent","symbol","currency","abbr","calendars","standard","days","names","namesAbbr","namesShort","months","AM","PM","patterns","D","F","g","T","u","Y","firstDay","twoDigitYearMax","cultureName","calendar","groupInteger","start","integer","integerLength","newGroupSize","decimalIndex","indexOf","groupSizes","shift","reverse","round","precision","negative","toFixed","min","fmt","date","minutes","result","sign","getDate","getDay","getMonth","getFullYear","getHours","getMinutes","getSeconds","getMilliseconds","getTimezoneOffset","abs","formatDate","isCurrency","isPercent","customPrecision","formatAndPrecision","fraction","ch","hasGroup","hasNegativeFormat","sharpIndex","zeroIndex","hasZero","hasSharp","currencyIndex","decimal","literals","replacement","toLocaleString","exec","toLowerCase","toExponential","quoteChar","literal","lastIndexOf","rounded","max","formatNumber","values","index","placeholderFormat","parseInt","_extractFormat","_activeElement","activeElement","documentElement","_round","includeMargin","nonBreakingSpaceRegExp","spaceRegExp","exponentRegExp","shortTimeZoneRegExp","longTimeZoneRegExp","dateRegExp","offsetRegExp","FORMATS_SEQUENCE","STANDARD_FORMATS","outOfRange","designatorPredicate","designator","mapDesignators","designators","map","lowerArray","array","lowerLocalInfo","localInfo","newLocalInfo","parseExact","strict","count","pmHour","UTC","amDesignators","pmDesignators","hoursOffset","minutesOffset","lookAhead","getNumber","rg","substr","valueIdx","getIndexByName","lower","nameLength","subValue","matchLength","matchIdx","checkLiteral","year","day","hours","seconds","milliseconds","defaultYear","_lowerDays","_lowerMonths","setHours","adjustDST","setFullYear","internalParseDate","formats","tzoffset","offset","timezone","convert","cultureFormats","formatIdx","concat","getDefaultFormats","parseDate","parseExactDate","percentSymbol","_scrollbar","scrollbar","refresh","div","createElement","cssText","innerHTML","body","appendChild","offsetWidth","scrollWidth","removeChild","isRtl","table","tbodyInnerHtml","touch","docStyle","transitions","transforms","elementProto","hasHW3D","WebKitCSSMatrix","cssFlexbox","prefix","hasTransitions","lowPrefix","event","devicePixelRatio","screenWidth","screen","availWidth","innerWidth","screenHeight","availHeight","innerHeight","e$1","detectOS","ua","minorVersion","os","notAndroidPhone","agentRxs","wp","fire","android","iphone","ipad","meego","webos","blackberry","playbook","windows","tizen","sailfish","ffos","osRxs","ios","flat","formFactorRxs","tablet","browserRxs","omini","omobile","firefox","mobilesafari","ie","chrome","webkit","navigator","device","browser","majorVersion","flatVersion","cordova","PhoneGap","appMode","standalone","location","protocol","cssClass","docElement","mobileOS","userAgent","wpDevicePixelRatio","hasNativeScrolling","delayedClick","attr","mouseAndTouchPresent","detectBrowser","edge","safari","opera","msie","mozilla","documentMode","chromiumEdge","detectClipboardAccess","commands","queryCommandSupported","cut","paste","clipboard","zoomLevel","ie11WidthCorrection","docEl","scrollHeight","clientHeight","clientWidth","top","addClass","eventCapture","input","placeholder","propertyChangeEvent","types","setAttribute","cssFloat","stableSort","sorted","field","sort","b","matchesSelector","webkitMatchesSelector","mozMatchesSelector","msMatchesSelector","oMatchesSelector","selector","nodeList","querySelectorAll","parentNode","pushState","history","hashChange","customElements","mobileChrome","crios","msPointers","MSPointerEvent","pointers","PointerEvent","kineticScrollNeeded","effects","prepareAnimationOptions","duration","complete","teardown","completeCallback","animate","instance","queue","promise","enabled","Element","dequeue","disable","promiseShim","enable","animatedPromise","kendoStop","clearQueue","gotoEnd","stop","kendoAnimate","kendoAddClass","classes","toggleClass","kendoRemoveClass","kendoToggleClass","toggle","ampRegExp","ltRegExp","quoteRegExp","aposRegExp","gtRegExp","eventTarget","touches","originalEvent","changedTouches","elementFromPoint","clientX","clientY","callback","on","mousedown","mouseup","mousemove","mousecancel","click","resize","localUrlRe","widgets","_widgetRegisteredCallbacks","ui","fx","mobile","dataviz","drawing","spreadsheet","messages","keys","INSERT","DELETE","BACKSPACE","TAB","ENTER","ESC","LEFT","UP","RIGHT","DOWN","END","HOME","SPACEBAR","PAGEUP","PAGEDOWN","F2","F10","F12","NUMPAD_PLUS","NUMPAD_MINUS","NUMPAD_DOT","ns","getShadows","shadow","radius","blur","left","right","bottom","wrap","percentage","windowOuterWidth","removeClass","hasClass","percentWidth","percentHeight","forceWidth","isScrollable","dataset","className","overflow","scrollLeft","el","mozila","browserVersion","obj","toHyphens","getOffset","positioned","pageYOffset","pageXOffset","parseEffects","directions","down","up","in","out","htmlEncode","unescape","decodeURIComponent","error","_","m1","m2","fromCharCode","isLocalUrl","url","expr","expression","safe","members","wrapExpression","exprToArray","fields","indexAccessor","getter","setter","innerSetter","ref","val","prop","props","pop","accessor","get","set","guid","random","id","chars","roleSelector","role","directiveSelector","directives","selectors","triggeredByInput","tagName","onWidgetRegistered","len","logToConsole","message","suppressLog","log","Widget","KendoLicensing","validatePackage","angular","dataSource","componentTypes","componentType","_hasBindingTarget","kendoBindingTarget","_tabindex","TABINDEX","tabindex","removeAttr","setOptions","_clearCssClasses","_setEvents","_applyCssClasses","force","getSize","currentSize","_size","_resize","dimensions","setSize","removeData","_destroy","_muteAngularRebind","_muteRebind","validFill","widgetName","protoOptions","__proto__","cssProperties","propertyDictionary","_altname","getValidClass","widget","propName","fillMode","fill","_ariaLabel","labelId","inputElm","inputId","labelElm","ariaLabel","ariaLabelledBy","_generateLabelId","newOptions","currentOptions","themeColor","label","DataBoundWidget","dataItems","flatView","_angularItems","cmd","elements","items","dataItem","domElement","offsetHeight","notify","templateRegExp","jsonRegExp","jsonFormatRegExp","dashRegExp","parseOption","option","getAttribute","parse","parseOptions","containmentComparer","contains","resizableWidget","inArray","initWidget","roles","fullPath","widgetKeyRegExp","nodeType","widgetKey","isEmptyObject","rolesFromNamespaces","namespaces","find","addBack","filter","widgetsArray","makeArray","widgetInstance","progress","container","leftRight","webkitCorrection","containerScrollLeft","mask","scrollTop","opacity","loading","prependTo","remove","plugin","register","widgetEntry","args","method","ContainerNullObject","nullObject","MobileWidget","autoApplyNS","kendoDestroy","view","viewElement","viewHasNativeScrolling","useNativeScrolling","eq","focusable","isTabIndexNotNaN","nodeName","disabled","href","pseudos","parents","themes","views","touchScroller","useNative","Scroller","kendoMobileScroller","suites","elementData","onResize","setTimeout","unbindResize","off","attrValue","Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","kendoFocusable","MOUSE_EVENTS","MouseEventNormalizer","setupMouseMute","mouseTrap","bustClick","captureMouse","stopPropagation","muteMouse","clearTimeout","mouseTrapTimeoutID","unMuteMouse","eventMap","move","cancel","MSPointerEnter","MSPointerLeave","orig","fix","special","delegateType","bindType","handle","ret","related","relatedTarget","handleObj","origType","getEventMap","eventRegEx","applyEventMap","keyDownHandler","kendoKeydown","preventKendoKeydown","kendoJQuery","context","rootjQuery","search","touchstart","touchend","keyDownCallBack","Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","Sun","Mon","Tue","Wed","Thu","Fri","Sat","ruleToDate","rule","targetDay","ourDay","time","cache","getUTCDay","setUTCDate","findRule","utcTime","rules","zone","grep","from","to","zoneAndRule","zones","zoneRules","until","findZone","info","fromOffset","toOffset","diff","tempToOffset","fromLocalOffset","toLocalOffset","toLocalDate","MS_PER_MINUTE","MS_PER_DAY","setDayOfWeek","dir","setDate","dayOfWeek","firstDayOfMonth","calcWeekInYear","weekStartDay","firstWeekInYear","newDate","addDays","moveDateToWeekStart","diffInMS","toInvariantTime","setTime","ignoreDST","difference","today","staticDate","addYear","currentDate","addLiteral","lastPart","isHour12","startsWith","text","searchString","isInDateRange","msValue","msMin","msMax","isInTimeRange","isToday","nextDay","previousDay","toUtcTime","MS_PER_HOUR","splitDateFormat","specifier","patternLength","formatLength","nameType","datePattern","hour12","dateFieldName","dateFields","dateFormatNames","lastDayOfMonth","last","timeOffset","weekInYear","prevWeekDate","nextWeekDate","weekNumber","firstDayOfYear","lastDayOfYear","nextYear","previousYear","stripWhitespace","createNodeIterator","iterator","NodeFilter","SHOW_TEXT","node","FILTER_ACCEPT","FILTER_REJECT","nextNode","referenceNode","textContent","trim","childNodes","child","nodeValue","animationFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","oRequestAnimationFrame","msRequestAnimationFrame","animationQueue","queueAnimation","runNextAnimation","parseQueryStringParams","params","paramParts","elementUnderCursor","client","wheelDeltaY","jQueryEvent","delta","deltaY","wheelDelta","detail","axis","VERTICAL_AXIS","throttle","delay","timeout","lastExecTime","throttled","elapsed","caret","rangeElement","isPosition","selectionStart","focus","setSelectionRange","selectionEnd","selection","createTextRange","collapse","moveStart","moveEnd","select","rangeDuplicated","duplicate","moveToBookmark","createRange","getBookmark","setEndPoint","antiForgeryTokens","tokens","csrf_token","csrf_param","cycleForm","form","firstElement","lastElement","keyCode","shiftKey","focusElement","scrollTopPositions","scrollableParents","parentsUntil","setActive","focusNextElement","focussable","getWidgetFocusableElement","nextFocusable","addAttribute","attribute","removeAttribute","toggleAttribute","matchesMedia","_bootstrapToMedia","bootstrapMedia","xs","sm","md","lg","xl","fileGroupMap","audio","video","image","txt","presentation","programming","pdf","config","zip","getFileGroup","extension","withPrefix","fileTypeMap","groups","getFileSizeMessage","pow","selectorFromClasses","themeColorValues","fillValues","shapeValues","sizeValues","roundedValues","positionModeValues","resizeValues","overflowValues","defaultValues","registerCssClass","shorthand","registerCssClasses","arr","fillModeValues","registerValues","j","newValues","currentValue","dict","widgetValues","validValue","widgetProperties","overridePrefix","registerPrefix","propertyToCssClassMap","getValidCssClass","applyStylesFromKendoAttributes","styleProps","styleProp","currentElement","$currentElement","kendoAttr","whenAll","resolveValues","remaining","deferred","Deferred","failed","rejectContexts","rejectValues","resolveContexts","updateFunc","contexts","notifyWith","done","fail","resolveWith","postToProxy","dataURI","fileName","proxyURL","proxyTarget","action","contentType","base64","appendTo","submit","fileSaver","downloadAttribute","saveAsBlob","blob","atob","Uint8Array","Blob","buffer","msSaveBlob","saveAsDataURI","URL","createObjectURL","download","createEvent","initMouseEvent","dispatchEvent","revokeObjectURL","saveAs","save","forceProxy","proxyModelSetters","observable","defineProperty","dirty","getSeriesColors","series","colors","item","isElement","HTMLDocument","setDefaults","path","curr","DEBUG_KENDO_TEMPLATES","class2type","_i","setScriptKey","scaleProperties","scale","scalex","scaley","scale3d","translateProperties","translate","translatex","translatey","translate3d","hasZoom","zoom","matrix3dRegExp","cssParamsRegExp","translateXRegExp","oldEffectsRegExp","singleEffectRegExp","unitRegExp","transformProps","transform2d","transform2units","rotate","skew","cssPrefix","PX","AUTO","WIDTH","HEIGHT","HIDDEN","ORIGIN","ABORT_ID","OVERFLOW","TRANSLATE","POSITION","COMPLETE_CALLBACK","TRANSITION","TRANSFORM","BACKFACE","PERSPECTIVE","DEFAULT_PERSPECTIVE","TRANSFORM_PERSPECTIVE","transition","vertical","modifier","horizontal","stopQueue","animationProperty","transformValue","step","elem","now","curProxy","cur","parseInteger","parseCSS","strip3DTransforms","normalizeCSS","lowerKey","isTransformed","transformation","cssValues","transform","computed","atan2","exclusive","ease","mirror","redirectedEffect","effect","$1","$2","direction","effectBody","timeoutID","oldKeys","stopTransitionCalled","stopTransition","speeds","merge","acc","propertyName","uniqueSort","unique","taskKeys","retainPosition","EffectSet","restore","run","jdx","children","childrenLength","setReverse","addRestoreProperties","prepare","effectName","reset","setup","resolve","restoreCallback","effectClass","effectSet","parsedEffects","capitalize","useTransition","multiple","single","isFixed","originalPosition","dX","dY","marginLeft","marginTop","Effect","_direction","_additionalEffects","_reverse","play","additional","_duration","compositeRun","_complete","shouldHide","word","createEffect","definition","opt1","opt2","opt3","theDirection","FOUR_DIRECTIONS","IN_OUT","createToggleEffect","defaultStart","defaultEnd","startValue","_startValue","endValue","_endValue","_shouldHide","startDataValue","divisor","tmp","previous","previousDivisor","slideIn","margin","origin","setLength","oldLength","realLength","TRANSFER_START_STATE","outerBox","box","innerBox","currentScale","fillScale","transformOrigin","CLIPS","ROTATIONS","clipInHalf","_container","rotation","zIndex","_clipInHalf","clip","append","face","_face","temporary","back","temp","reverseDirection","faceClone","backClone","staticPage","turningPage","transformStyle","RESTORE_OVERFLOW","_before","_after","transitionClass","_previous","_transitionClass","beforeTransition","afterTransition","_both","_element","_containerClass","containerClass","completeProxy","isAbsolute","both","Animation","_tickProxy","_tick","_started","tick","onEnd","onCancel","Transition","timePassed","startDate","moveTo","movable","initial","_easeProxy","moveAxis","easeOutExpo","easeOutBack","inner","outer","fitScale","NEWLINE","DOUBLELINE","odataFilters","neq","gt","gte","lt","lte","doesnotcontain","endswith","startswith","isnull","isnotnull","isnullorempty","isnotnullorempty","isempty","isnotempty","odataFiltersVersionFour","mappers","pageSize","page","useVersionFour","toOdataFilter","$filter","orderby","order","$orderby","skip","$skip","take","$top","defaultDataType","read","dataType","useOdataFour","operator","ignoreCase","logic","filters","stripMetadata","hex16","createBoundary","createDelimeter","boundary","close","createCommand","transport","httpVerb","command","transportUrl","commandPrefix","getOperationHeader","changeset","changeId","header","processCollection","colection","skipContent","requestBody","getBoundary","collection","content","getOperations","schemas","odata","results","total","transports","jsonp","update","create","parameterMap","$inlinecount","$format","batch","$count","colections","batchURL","headers","updated","destroyed","created","createBatchRequest","collections","ajax","success","response","responses","responseText","changeBody","status","code","marker","jsonModel","responseMarkers","markerIndex","models","passed","parseBatchResponse","XmlDataReader","model","errors","serialize","modelBase","Model","idField","xpathToMember","modelInstance","evaluate","record","_parse","xmlParse","xml","parseDOM","parsedNode","attributes","attributeCount","firstChild","nextSibling","intermediateResult","tree","parseXML","raw","readers","or","identity","and","operatorsMap","doesnotendwith","doesnotstartwith","transformFilter","accentFoldingFiltering","itemProp","toLocaleLowerCase","typedGetter","convertValue","op","transformCompositeFilter","combiner","extendAccentFolding","reduce","CREATE","READ","UPDATE","DESTROY","CHANGE","SYNC","GET","ERROR","REQUESTSTART","PROGRESS","REQUESTEND","ITEMSLOADED","ITEMLOAD","crud","o","objectKeys","ObservableObject","wrapAll","_loadPromises","_loadedNodes","at","serializeFunctions","json","object","isGroup","_loading","nodes","omitChangeEvent","howMany","omitCache","thisArg","reduceRight","every","some","empty","Symbol","_parent","eventHandler","_notifyChange","ownKeys","ignoreObjectKeys","filteredObjectKeys","protoKeys","getPrototypeOf","isPrimitiveType","getOwnPropertyNames","f","_handlers","uid","shouldSerialize","_set","composite","paths","isSetPrevented","change","isObservableArray","isDataSource","equal","xtype","parsers","boolean","default","_initializers","dirtyFields","_defaultId","fieldName","getFieldByName","editable","accept","isNew","originalName","functionFields","nullable","defaultValue","Comparer","compare","localeCompare","combine","comparers","StableComparer","asc","valueA","valueB","__position","desc","operators","textOp","impl","ignore","getMatchRegexp","esc","doesnotmatch","Query","normalizeSort","descriptor","descriptors","sortFields","sorts","sortObject","filterExpr","noEval","filterExprNoEval","expressions","fieldFunctions","operatorFunctions","operatorMap","equals","isequalto","equalto","ne","notequals","isnotequalto","notequalto","notequal","islessthan","lessthan","less","le","islessthanorequalto","lessthanequal","isgreaterthan","greaterthan","greater","isgreaterthanorequalto","greaterthanequal","ge","notsubstringof","normalizeOperator","normalizeFilter","compareDescriptor","f1","f2","normalizeDescriptor","fieldComparer","normalizeGroup","skipItemSorting","aggregates","normalizeGroupWithoutCompare","groupValueComparer","calculateAggregate","accumulator","state","aggr","functionName","aggregate","functions","compareFilters","expr1","expr2","filters1","filters2","toArray","range","inPlace","orderBy","orderByDescending","comparer","compiled","group","allData","groupPaging","groupAllData","hasSubgroups","itemCount","subgroupCount","groupBy","_sortForGrouping","groupValue","_sortGroups","sum","isNumber","average","process","groupDescriptorsWithoutSort","customGroupSort","groupDescriptors","anyGroupDescriptorHasCompare","groupDescriptorsWithoutCompare","normalizedSort","filterCallback","flatGroups","groupDescriptor","virtual","LocalTransport","RemoteTransport","Cache","parameters","operation","_store","clear","serializeRecords","getters","originalFieldNames","fieldNames","setters","convertRecords","convertGroup","wrapDataAccess","originalFunction","converter","wrapDataAccessBase","store","inmemory","DataReader","schema","dataFunction","_dataAccessFunction","groupsFunction","serializeFunction","serializeGetters","fromName","_wrapDataAccessBase","fillLastGroup","originalGroup","newGroup","currOriginal","currentNew","mergeGroups","dest","indexFunction","groupsLength","indexFn","groupIndex","itemIndex","flattenGroups","wrapGroupItems","eachGroupItems","func","replaceInRanges","ranges","replaceInRange","replaceWithObservable","serverGrouping","viewIndex","indexOfPristineModel","indexOfModel","fieldNameFromModel","convertFilterDescriptorsField","convertDescriptorsField","_map","_prefetch","_data","_pristineData","_ranges","_view","_pristineTotal","_destroyed","_pageSize","_page","_sort","_sortFields","_filter","_group","_aggregate","_total","_groupPaging","_groupsState","_shouldDetachObservableParents","Transport","pushCreate","_pushCreate","pushUpdate","_pushUpdate","pushDestroy","_pushDestroy","offlineStorage","_storage","getItem","localStorage","setItem","reader","_detachObservableParents","_observe","_online","serverSorting","serverPaging","serverFiltering","serverAggregates","inPlaceSort","online","sync","offlineData","_isGrouped","_isServerGrouped","_isServerGroupPaged","_isGroupPaged","_push","_readData","_flatData","useRanges","getByUid","_getByUid","_storeData","_addRange","_process","_observeView","insert","_createNewModel","_wrapInEmptyGroup","_insertModelInRange","pushInsert","rangeSpan","_getCurrentRangeSpan","pushed","autoSync","pristine","pristineData","_updatePristineForModel","_removeItems","itemsToRemove","removePristine","shouldRemovePristine","found","_eachItem","_removePristineForModel","pushMove","_moveItems","moved","hasGroups","_pushInDestroyed","removeModel","_removeModelFromRanges","notFetched","promises","_sendSubmit","_send","when","then","_accept","_syncEnd","_change","cancelChanges","_cancelModel","_changesCanceled","_markOfflineUpdatesAsDirty","__state__","hasChanges","serverGroup","_handleCustomErrors","_executeOnPristineForModel","_eachPristineItem","_pristineForModel","_modelCanceled","_submit","reject","_promise","converted","_params","_queueRequest","isPrevented","_dequeueRequest","_readAggregates","replaceSubset","_serverGroupsTotal","_aggregateResult","itemIds","_skip","endless","_changeHandler","updatePristine","timestamp","_timeStamp","outerStart","outerEnd","_sortRanges","_groupsFlat","_appendToGroupsFlat","_updateOuterRangesLength","_getGroupByUid","xhr","errorThrown","_requestInProgress","_pending","_shouldWrap","_updateTotalForAction","_calculateAggregates","_take","currentRangeStart","_clearEmptyGroups","_queryProcess","resultData","dataToAggregate","_setView","_setFilterTotal","_mergeState","_currentRangeStart","moreItemsCount","_hasExpandedSubGroups","_findGroupedRange","itemsLength","groupCount","itemsToSkip","taken","_fetchGroupItems","_fetchingGroupItems","skipped","includeParents","excludeHeader","currentItems","_expandedSubGroupItemsCount","includeCurrentItems","subGroup","endSpecified","groupItemsSkip","firstItem","lastItem","expandedSubGroupItemsCount","groupItemCount","getGroupItems","subgroups","_composeItemsFilter","findSubgroups","_timeout","_groupItemsSuccessHandler","totalField","totalCount","_updateRangePristineData","countAdded","_currentRequestTimeStamp","_skipRequestsInProgress","indexOfCurrentGroup","currentGroup","dataLength","indexes","rangesLength","_containsSubGroup","_cloneGroup","subgroup","currentSubGroup","filterTotal","setDefaultValue","fetch","_query","next","totalPages","prev","_pageableQueryOptions","getGroupsFlat","groupsTotal","includeExpanded","_calculateGroupsTotal","itemsField","ignoreState","_groupsTotal","countGroupRange","_emptyAggregates","ceil","inRange","_findRange","lastRange","firstItemUid","enableRequestsInProgress","pageSkip","_processRangeData","_originalPageSkip","_originalSize","_adjustPageSkip","_groupRangeExists","_rangeExists","prefetch","skipIdx","takeIdx","startIndex","endIndex","rangeData","rangeEnd","processed","flatData","prevRangeEnd","remote","groupMapOptions","isGroupPaged","startField","endField","_mergeGroups","_getRangesMismatch","mismatch","prevGroup","eventData","_omitPrefetch","paging","sorting","filtering","_prefetchSuccessHandler","_multiplePrefetch","prevRange","_getPrevRange","_getNextRange","availableItemsCount","_removeModelFromRange","_updateRangesLength","mismatchFound","mismatchLength","lengthDifference","rangeLength","transportOptions","fieldIndex","cells","cell","tbody","tBodies","rows","fieldCount","inferTable","optgroup","firstField","secondField","specified","inferSelect","Node","hasChildren","childrenField","childrenOptions","hasChildrenObject","_childrenOptions","_initChildren","_loaded","_updateChildrenField","loaded","level","_childrenLoaded","load","_matchFilter","dataMethod","_attachBubbleHandlers","_hierarchicalFilter","_childrenLoading","isLoading","_markHierarchicalQuery","_updateHierarchicalFilter","_find","inferList","list","textChild","textField","urlField","spriteCssClassField","imageUrlField","_dataSource","Buffer","viewSize","disablePrefetch","_prefetching","_reset","_syncWithDataSource","setViewSize","_recalculate","itemPresent","dataOffset","prefetchThreshold","midPageThreshold","nextMidRange","nextPageThreshold","nextFullRange","pullBackThreshold","previousMidRange","previousFullRange","_goToRange","nextRange","syncDataSource","prefetchOffset","expanding","_expanding","_syncPending","_firstItemUid","BatchBuffer","batchSize","batchBuffer","endreached","prefetching","prefetched","isJQueryPromise","isNativePromise","catch","signalr","hub","invoke","callbacks","_crud","server","encode","binders","VALUE","SOURCE","EVENTS","CHECKED","deleteExpando","Binding","dependencies","_access","_parents","dependency","currentSource","EventBinding","TemplateBinding","Binder","bindings","binding","TypedBinder","parsedValue","_parseValue","dataSourceBinding","bindingName","_dataBinding","dataBinding","_dataBound","dataBound","_itemChange","itemChange","bindElement","_ns","removedItems","unbindElementTree","all","addedItems","hds","addedDataItems","multiselect","Select","MultiSelect","DropDownTree","treeview","retrievePrimitiveValues","dataValueField","readonly","dataFormat","invisible","valueUpdate","_initChange","autoBind","valueField","valueAttr","innerText","cloneNode","reference","insertBefore","unbindElementChildren","checked","selectedIndex","selected","valueIndex","valuePrimitive","sourceValue","optionIndex","optionValue","check","_range","floatingLabel","_valueIsObservableObject","_valueIsObservableArray","_source","valueLength","sourceItem","dataTextField","isObservableObject","cascadeFrom","listView","bound","_preselect","dropdowntree","oldValues","selectedNode","nonPrimitiveValues","_isMultipleSelection","_getAllChecked","removeIndex","newValue","newLength","old","arraySplice","selectedValue","gantt","_isBound","scheduler","grid","badge","addLength","shifted","shiftedLength","BindingTarget","toDestroy","hasValue","hasSource","hasEvents","hasChecked","hasCss","widgetBinding","WidgetBindingTarget","specificBinders","applyBinding","binder","keyValueRegExp","whiteSpaceRegExp","parseBindings","token","colonIndex","createBindings","childrenCopy","unbindElement","bindingTargetForRole","dom","destroyWidget","bindingTarget","destroyWidgets","namespace","observableHierarchy","recursiveRead","NS","INVALIDMSG","invalidMsgRegExp","INVALIDINPUT","VALIDINPUT","VALIDATIONSUMMARY","INVALIDLABEL","MESSAGEBOX","ARIAINVALID","emailRegExp","urlRegExp","INPUTSELECTOR","CHECKBOXSELECTOR","NUMBERINPUTSELECTOR","BLUR","NAME","FORM","NOVALIDATE","VALIDATE","VALIDATE_INPUT","patternMatcher","matcher","hasAttribute","parseHtml","parseHTML","searchForMessageContainer","containers","isLabelFor","validator","allowSubmit","validateOnInit","SUMMARYTEMPLATE","Validator","resolved","resolvers","ruleResolvers","resolveRules","validateAttributeSelector","_errorTemplate","errorTemplate","_summaryTemplate","validationSummary","_inputSelector","_checkboxSelector","_errors","_attachEvents","_isValidated","_validateOnInit","validate","required","email","dateCompare","captcha","noNameCheckbox","namedCheckbox","checkbox","radio","raise","isValidated","isValid","getCaptchaId","_validating","_checkElement","validateOnBlur","_allowSubmit","stopImmediatePropagation","validateInput","inputs","invalid","showValidationSummary","valid","_checkValidity","lbl","_findMessageContainer","messageText","_extractMessage","messageLabel","wasValid","isInputInner","inputWrapper","lblId","_decorateMessageContainer","replaceWith","parentElement","nextElement","prevElement","insertAfter","_inputWrapper","inputWrap","inputLabel","_inputLabel","errorId","_associateMessageContainer","hideMessages","_disassociateMessageContainers","labels","hideValidationSummary","locators","messageLocators","getElementsByTagName","locate","decorate","ruleKey","nonDefaultMessage","customMessage","_getInputNames","_errorsByName","inputNames","_renderSummary","_summaryClick","link","errorsList","summary","SAME","BROKEN_BACK_NAV","hashStrip","absoluteURL","pathPrefix","host","hashDelimiter","bang","locationHash","stripRoot","root","HistoryAdapter","forward","replaceLocation","PushStateAdapter","navigate","title","replaceState","normalize","pathname","normalizeCurrent","fixedUrl","hash","hashBang","fixHash","fixBang","HashAdapter","_id","_interval","setInterval","clearInterval","History","adapter","createAdapter","historyLength","locations","_checkUrl","silent","_navigate","backCalled","decode","navigatingInExisting","backButtonPressed","INIT","ROUTE_MISSING","BACK","optionalParam","namedParam","splatParam","escapeRegExp","namedParamReplace","optional","stripUrl","Route","route","routeToRegExp","_callback","queryStringParams","_back","worksWith","Router","routes","_urlChangedProxy","_sameProxy","_backProxy","backProxy","urlChangedProxy","_urlChanged","same","_same","initEventObject","TRANSITION_START","TRANSITION_END","SHOW","HIDE","sizzleErrorRegExp","bodyRegExp","SHOW_START","SAME_VIEW_REQUESTED","VIEW_SHOW","VIEW_TYPE_DETERMINED","AFTER","classNames","View","renderOnInit","_createElement","wrapInSections","_renderSections","_wrap","_evalTemplate","evalTemplate","_useWithBlock","_fragments","detachOnHide","detachOnDestroy","notInitialized","_eachFragment","ViewClone","triggerBeforeShow","triggerBeforeHide","showStart","showEnd","hideEnd","detach","purge","fragments","methodName","getElementById","contents","_wrapper","_createContent","_createHeader","_createFooter","contentSelector","contentElement","footer","Layout","_createContainer","showIn","ViewContainer","Fragment","attach","transitionRegExp","running","after","locationID","theTransition","transitionData","parseTransition","ViewEngine","sandbox","_hideViews","rootView","layouts","viewContainer","showView","remoteViewURLPrefix","_findViewElement","reload","_createView","urlPath","wrapInner","_locate","$angular","_findViewElementById","_createSpaView","_createMobileView","defaultTransition","loader","getLayout","getLayoutProxy","modelScope","viewOptions","OS","invalidZeroEvents","DEFAULT_MIN_HOLD","DEFAULT_THRESHOLD","PRESS","HOLD","SELECT","START","MOVE","CANCEL","TAP","DOUBLETAP","RELEASE","GESTURECHANGE","GESTUREEND","GESTURETAP","THRESHOLD","api","mouse","pointer","ENABLE_GLOBAL_SURFACE","touchDelta","touch1","touch2","x1","y1","x2","y2","dx","dy","center","distance","sqrt","getTouches","currentTarget","identifier","pointerId","TouchAxis","_updateLocationData","startLocation","velocity","timeStamp","timeDelta","initialDelta","Touch","userEvents","touchInfo","useClickAsTap","threshold","initialTouch","pressEvent","_clicks","supportDoubleTap","_moved","_finished","press","_holdTimeout","_hold","minHold","_trigger","_tap","_clickTimeout","preventMove","_shouldNotMove","_withinIgnoreThreshold","UserEvents","dispose","_start","endTime","activeTouches","isMoved","startTime","xDelta","yDelta","withEachUpEvent","downEvents","_maxTouches","multiTouch","allowSelection","captureUpIfMoved","fastTap","eventNS","surface","ownerDocument","pressed","defaultAction","touchAction","preventDragEvent","surfaceElement","preventIfMovingProxy","preventIfMoving","_isMoved","_disposeAll","capture","_isMultiTouch","_apiCall","_maxTouchesReached","_select","which","_move","_eachTouch","_end","_click","pageX","pageY","matchingTouch","ClickMoveClick","_downStarted","_down","_downTarget","_up","currentMilestone","_preventCancel","clickMoveClick","defaultThreshold","lastDropTarget","$window","draggables","dropTargets","dropAreas","KEYUP","DRAGSTART","DRAG","DRAGEND","DRAGCANCEL","HINTDESTROYED","DRAGENTER","DRAGLEAVE","DROP","numericCssPropery","within","containerBoundaries","minX","minY","TapCapture","_press","_release","attachEvent","captureNext","cancelCapture","PaneDimension","forcedEnabled","measure","scrollSize","makeVirtual","_virtualMin","_virtualMax","virtualSize","outOfBounds","forceEnabled","getTotal","rescale","scaledTotal","minScale","centerOffset","PaneDimensions","forcedMinScale","maxScale","newScale","centerCoordinates","PaneAxis","dimension","dragMove","resistance","translateAxis","Pane","elastic","gesturestart","gesture","gesturechange","coordinates","previousGesture","previousCenter","scaleDelta","offsetX","offsetY","scaleWith","TRANSFORM_STYLE","Movable","webkitTransformOrigin","_saveCoordinates","by","scaleTo","newCoordinates","destroyDroppable","groupName","droppables","DropTarget","draggable","dropTarget","_over","_out","_drop","dropped","destroyGroup","_cache","DropTargetArea","Draggable","_activated","_startClickMoveClick","_drag","_onCancel","hold","_afterEndHandler","_afterEnd","_captureEscape","cursorOffset","holdToDrag","autoScroll","cancelHold","_updateHint","boundaries","hintOffset","hint","_shouldIgnoreTarget","ignoreSelector","currentTargetOffset","scopeTarget","scopeFrom","cursorElement","_elementUnderCursor","_cursorElement","_scrollableParent","findScrollableParent","_lastEvent","_processMovement","autoScrollVelocity","scrollableViewPort","_scrollCompenstation","_scrollVelocity","_scrollInterval","_autoScroll","_withDropTarget","targetElement","compensation","yIsScrollable","xIsScrollable","isRootNode","scrollableRoot","yInBounds","xInBounds","_cancel","initialTarget","targets","areas","theTarget","theFilter","targetLen","areaLen","checkTarget","mouseX","mouseY","rect","AUTO_SCROLL_AREA","utils","OPEN","CLOSE","DEACTIVATE","ACTIVATE","CENTER","TOP","BOTTOM","ABSOLUTE","BODY","LOCATION","EFFECTS","ACTIVE","ACTIVEBORDER","ACTIVEBORDERREGEXP","ACTIVECHILDREN","DOCUMENT_ELEMENT","WINDOW","SCROLL","Popup","parentPopup","collisions","collision","downEvent","anchor","_hovered","scrollArea","animation","open","_animationClose","_mousedownProxy","_mousedown","_resizeProxy","toggleTarget","toggleEvent","viewport","copyAnchorStyles","modal","adjustSize","omitOriginOffsets","_hideDirClass","_closing","_toggleResize","fixed","listbox","_resizeOnWrap","flipped","_position","_openAnimation","_showDirClass","_location","dirClass","skipEffects","openEffects","closeEffects","popup","_resizeTimeout","_scrollableParents","_fit","viewPortSize","output","_flip","anchorSize","boxSize","siblingContainer","parentZIndex","viewportOffset","viewportWidth","viewportHeight","isWindow","origins","positions","siblings","_align","pos","offsetParent","offsets","flipPos","wrapperHeight","appendToOffset","verticalOrigin","horizontalOrigin","verticalPosition","horizontalPosition","anchorOffset","anchorWidth","anchorHeight","tabKeyTrapNS","TabKeyTrap","trap","_keepInTrap","removeTrap","shouldTrap","_focusableElements","sortedElements","_sortFocusableElements","_nextFocusable","_focus","tabIndex","attrName","_haveSelectionRange","contentWindow","elementType","eventProxy","_triggerTouch","gestureEventProxy","tap","gestureend","enableSwipe","_swipestart","_swipemove","_dragstart","minXDelta","maxYDelta","maxDuration","doubleTapTimeout","lastTap","RELEASECLASS","REFRESHCLASS","ZoomSnapBack","tapCapture","DragInertia","freeze","_moveTo","paneAxis","_snapBack","velocityMultiplier","friction","snapBack","AnimatedScroller","_updateCoordinates","setCoordinates","setCallback","ScrollBar","controlsId","elementSize","scrollMovable","alwaysVisible","paneSize","sizeRatio","_ariaValue","visibility","_native","prepend","scrollElement","fixedContainer","avoidScrolling","velocityX","velocityY","horizontalSwipe","verticalSwipe","pane","zoomSnapBack","animatedScroller","scrollTo","mousewheelScrolling","_wheelScroll","pulled","_initAxis","_wheelEnd","_wheel","_wheelY","pullToRefresh","_initPullToRefresh","ctrlKey","_wheelTimeout","pullOffset","visibleScrollHints","pullTemplate","releaseTemplate","refreshTemplate","contentResized","_scale","zoomOut","animatedScrollTo","pullHandled","refreshHint","hintContainer","yinertia","xinertia","_paneChange","_dragEnd","scrollBar","elementId","injector","$defaultCompile","OPTIONS_NOW","toDataSource","$injector","$parse","$timeout","$log","createDataSource","TreeList","TreeView","Scheduler","PivotGrid","PivotConfigurator","PanelBar","Menu","ContextMenu","scope","$eval","ds","$watch","mew","setDataSource","ignoredAttributes","kDataSource","kOptions","kRebind","kNgModel","kNgDelay","ignoredOwnProperties","formRegExp","kendoRenderedTimeout","RENDERED","origAttr","restrict","controller","$scope","$attrs","setTemplate","_cleanUp","attrs","controllers","$element","roleattr","createWidget","$emit","$setPristine","TAGNAMES","Editor","NumericTextBox","DatePicker","DateTimePicker","TimePicker","AutoComplete","ColorPicker","MaskedTextBox","Upload","Button","ListView","ScrollView","ActionSheet","Switch","SKIP_SHORTCUTS","MANUAL_DIRECTIVES","directive","pendingPatches","entry","defadvice","klass","isMobile","make","directiveName","directiveFactory","shortcut","dashed","tag","scopeField","kScopeField","createDirectives","arg","$angular_scope","$angular_init","withoutTimeout","itemScope","$$kendoScope","$destroy","destroyScope","vars","$new","digest","$angular_makeEventHandler","kendoEvent","elems","columns","colIdx","locals","selectable","_checkBoxSelection","angularDataItem","templateSettings","col","encoded","templateDirectives","WIDGET_TEMPLATE_OPTIONS","TreeMap","Grid","Pager","templates","templateName","terminal","outerHTML","delayValue","ngModel","ngForm","ctor","parsed","unresolved","unwatch","createIt","$root","unregister","$attr","$$phase","$apply","originalElement","kendoWidget","exposeWidget","destroyRegister","deregister","$on","destroyWidgetOnScopeDestroy","rebindAttr","oldValue","templateOptions","templateContents","replaceChild","setupRebind","kNgDisabled","isDisabled","bindToKNgDisabled","kNgReadonly","isReadonly","bindToKNgReadonly","bindToKNgModel","haveChangeOnElement","isForm","formValue","viewRender","$viewValue","$modelValue","$render","formPristine","$pristine","$setViewValue","currentVal","$isEmpty","bindToNgModel","MutationObserver","prevClassList","classList","mo","changes","suspend","chg","w","attributeName","currClassList","cls","ComboBox","resume","disconnect","observe","propagateClassToWidgetWrapper","optionsPath","optionsValue","defaultOptions","addOption","scopeValue","widgetOptions","widgetEvents","dataName","eventKey","optionName","DateRangePicker","rangePickerEndModel","rangePickerModels","rangePickerStartModel","_startDateInput","_endDateInput","updating","valueIsCollection","RangeSlider","currentValueLength","$angular_setLogicValue","watchHandler","$watchCollection","changeHandler","$setDirty","$angular_getLogicValue","isDigesting","$digest","origMethod"],"sources":["kendo.mobile.js"],"mappings":"CAAA,SAAWA,EAAQC,GACI,iBAAZC,SAA0C,oBAAXC,OAAyBA,OAAOD,QAAUD,EAAQG,QAAQ,WAC9E,mBAAXC,QAAyBA,OAAOC,IAAMD,OAAO,CAAC,UAAWJ,KAC/DD,EAA+B,oBAAfO,WAA6BA,WAAaP,GAAUQ,MAAcC,YAAcT,EAAOS,aAAe,GAAIT,EAAOS,YAAYC,GAAKT,KAHvJ,CAIGU,MAAM,WACL,IAAIC,EACAC,EAAQ,SAERC,EAAqB,CACrBC,MAAO,qBACPC,OAAQ,8CACRC,MAAO,wBAqEX,SAASC,EAAWC,GAChB,GAAKA,EAYL,OAJIA,KAJJP,EACIA,GACAQ,OAAOC,OAAO,GAAIP,EAAoBQ,MAAMC,SAASX,gBAGrDO,EAAQP,EAAYO,IA5E5B,SAA0BA,GACtB,IAAIK,EAAiBC,OAAOC,WAAWP,GACnCQ,EAAmB,GACnBC,EAAmB,GACnBC,EAAmB,GACnBC,EAAkB,CAAEN,eAAgBA,GAEpCO,EAAkB,SAAUC,GAC5BH,EAAiBI,SAAQ,SAAUC,GAAM,OAAOA,EAAGF,MAE/CA,EAAGG,QACHR,EAAiBM,SAAQ,SAAUC,GAAM,OAAOA,EAAGF,MAEnDJ,EAAiBK,SAAQ,SAAUC,GAAM,OAAOA,EAAGF,OAkD3D,OA9CAR,EAAeY,iBAAiBvB,EAAOkB,GAyCvCD,EAAgBO,SAvCD,SAAUH,GAErB,OADAL,EAAiBS,KAAKJ,GACfJ,GAsCXA,EAAgBS,QAnCF,SAAUL,GAGpB,GAFAP,EAAiBW,KAAKJ,GAElBV,EAAeW,QAAS,CACxB,IAAIK,EAAQhB,EAAegB,MAQ3BN,EALS,IAAIO,oBAAoB5B,EAAO,CACpC2B,MAAOA,EACPL,SAJU,KAUlB,OAAOL,GAqBXA,EAAgBY,QAlBF,SAAUR,GAEpB,OADAN,EAAiBU,KAAKJ,GACfJ,GAiBXA,EAAgBa,QAdF,WACNnB,GACAA,EAAeoB,oBAAoB/B,EAAOkB,GAE9CJ,EAAmB,KACnBC,EAAmB,KACnBC,EAAmB,KACnBL,EAAiB,KACjBM,EAAkB,MAQfA,EAgBAe,CAAiB1B,GAG5B,IAOI2B,EAAkB,CAClBC,KAAM,qBACNC,YAAa,WACbC,aAAc,CAAC,kBAAmB,UAAW,UAAW,mBACxDC,YAAa,EACbC,QAAS,aAAaC,QAAQ,aAAc,IAC5CC,iBAAkB,4EAItB,SAAUC,EAAG7B,EAAQ8B,GACjB,IAMIC,EANAlC,EAAQG,EAAOH,MAAQG,EAAOH,OAAS,CAAEmC,SAAU,IACnDC,EAASJ,EAAEI,OACXC,EAAOL,EAAEK,KACTC,EAAUC,MAAMD,QAChBE,EAAOR,EAAEQ,KACTC,EAAOC,KAEPC,EAAOxC,EAAOwC,MAAQ,GACtBC,EAAU,GACVC,EAAgB,IAChBC,EAAe,uBACfC,EAAkB,sEAClBC,EAAe,uBACfC,EAAQ,QACRC,EAAO,OACPC,EAAO,OACPC,EAAU,UACVC,EAAU,UACVC,EAAiB,CACbC,EAAK,MACLC,EAAK,OACLC,EAAKJ,EACLK,EAAKL,EACLM,EAAKV,EACLW,EAAKX,EACLY,EAAK,MACLC,EAAKV,EACLW,EAAKX,EACLY,EAAKZ,EACLa,EAAKf,EACLgB,EAAKhB,EACLiB,EAAKjB,EACLkB,EAAKlB,EACLmB,EAAK,SACLC,EAAK,SACLC,EAAK,YACLC,EAAK,YACLC,EAAKtB,EACLuB,EAAKvB,EACLwB,EAAKxB,EACLyB,EAAKzB,GAET0B,EAAa,CACTC,MAAO,CACHC,KAAM,SACNC,UAAW,EACXC,WAAY,KAGhBC,QAAS,CACLH,KAAM,WACNC,UAAW,EACXC,WAAY,KAGhBE,QAAS,CACLJ,KAAM,OACNC,UAAW,CACPlB,EAAG,EACHC,EAAG,EACHC,EAAG,GAEPiB,WAAY,KAGhBG,UAAW,CACPL,KAAM,aACNC,UAAW,GAGfK,IAAK,CACDN,KAAM,OACNC,UAAW,IAGnBM,EAAW,WACXC,EAAS,SACTC,EAAS,SACTC,EAAS,SACTC,EAAO,OACPC,EAAU,UACVC,EAAY,YAEZC,EAAkB,kBAClBC,EAAa,aAEbC,EAAc,GACdC,EAAc,GACdC,EAAQ,GAAGA,MACXC,EAAqB,CAAE,aAAc,WAAY,QAAS,OAAQ,UAAW,gBAE7EC,EAAoB,WAChB,IAEIC,EAAKC,EAAaC,EAAM7E,EAAM8E,EAASC,EAFvCC,EAAcC,UAGdC,EAASD,UAAW,IAAO,GAC3BE,EAAI,EACJC,EAASH,UAAUG,OACnBC,GAAO,EAsBX,IAnBuB,kBAAXH,IACRG,EAAOH,EAGPA,EAASD,UAAWE,IAAO,GAC3BA,KAImB,iBAAXD,GAAyC,mBAAXA,IACtCA,EAAS,IAIRC,IAAMC,IACPF,EAAStH,KACTuH,KAGIA,EAAIC,EAAQD,IAGhB,GAAuC,OAAhCL,EAAUE,EAAaG,IAG1B,IAAMnF,KAAQ8E,EAGE,WAAR9E,GAA6B,UAARA,GAA4B,KAARA,IAG7C2E,EAAMO,EAAQlF,GAITkF,KAHLL,EAAOC,EAAS9E,MAQXqF,GAAQR,IAAUS,OAAOC,cAAeV,KACvCD,EAAc9D,MAAMD,QAASgE,MAE1BD,GACDA,GAAc,EACdG,EAAQJ,GAAO7D,MAAMD,QAAS8D,GAAQA,EAAM,IAG5CI,EAAQJ,GAAOW,OAAOC,cAAeZ,GAAQA,EAAM,GAIvDO,EAAQlF,GAAS0E,EAAmBW,EAAMN,EAAOF,IAGzCA,IAASrE,IACjB0E,EAAQlF,GAAS6E,KAOjC,OAAOK,GAKf,SAASM,KAFTjH,EAAM6B,QAAU,aAAaC,QAAQ,aAAc,IAInDmF,EAAM7E,OAAS,SAAS8E,GACpB,IACIC,EAKAC,EANAC,EAAO,aAEPC,EAAOjI,KACPkI,EAAWL,GAASA,EAAMM,KAAON,EAAMM,KAAO,WAC1CF,EAAKG,MAAMpI,KAAMqH,YAOzB,IAAKS,KAHLE,EAAKK,UAAYJ,EAAKI,UACtBN,EAAKG,EAASH,GAAKG,EAASG,UAAY,IAAIL,EAE7BH,EACU,MAAjBA,EAAMC,IAAmBD,EAAMC,GAAQQ,cAAgB7H,OAEvDsH,EAAGD,GAAU/E,GAAO,EAAM,GAAIiF,EAAKK,UAAUP,GAASD,EAAMC,IAE5DC,EAAGD,GAAUD,EAAMC,GAO3B,OAHAC,EAAGO,YAAcJ,EACjBA,EAASnF,OAASkF,EAAKlF,OAEhBmF,GAGXN,EAAMS,UAAUE,aAAe,SAASrB,GACpClH,KAAKkH,QAAUsB,GAAW,GAAIxI,KAAKkH,QAASA,IAGhCvG,EAAM8H,UAAY,SAAUC,GAAS,OAAiB,OAAVA,GAAkBA,IAAU9F,GAC1EjC,EAAMgI,QAAU,SAAUD,GAAS,OAAiB,OAAVA,GAAkBA,IAAU9F,GACrEjC,EAAMiI,SAAW,SAAUF,GAAS,MAAwB,iBAAVA,GACjD/H,EAAMkI,UAAY,SAAUH,GAAS,OAAQI,MAAMJ,EAAQK,WAAWL,KACzE/H,EAAMqI,OAAS,SAAUN,GAAS,OAAOA,GAASA,EAAMO,SAJrE,IAKIC,EAAavI,EAAMuI,WAAa,SAAUR,GAAS,MAAwB,mBAAVA,GAEjES,EAAiB,WACjBnJ,KAAKoJ,mBAAoB,GAGzBC,EAAqB,WACrB,OAAkC,IAA3BrJ,KAAKoJ,mBAGZE,EAAa1B,EAAM7E,OAAO,CAC1BoF,KAAM,WACFnI,KAAKuJ,QAAU,IAGnBC,KAAM,SAASC,EAAWC,EAAUC,GAChC,IACIC,EAEApC,EACAqC,EACAC,EALA7B,EAAOjI,KAEP+J,SAAoBN,IAAcvD,EAAS,CAACuD,GAAaA,EAIzDO,SAA4BN,IAAazD,EAG7C,GAAIyD,IAAa9G,EAAa,CAC1B,IAAKgH,KAAOH,EACRxB,EAAKuB,KAAKI,EAAKH,EAAUG,IAE7B,OAAO3B,EAGX,IAAK2B,EAAM,EAAGpC,EAASuC,EAAWvC,OAAQoC,EAAMpC,EAAQoC,IACpDH,EAAYM,EAAWH,IAEvBE,EAAUE,EAAqBN,EAAWA,EAASD,MAG3CE,IACAE,EAAWC,EACXA,EAAU,WACN7B,EAAKgC,OAAOR,EAAWK,GACvBD,EAASzB,MAAMH,EAAMZ,YAEzByC,EAAQD,SAAWA,IAEd5B,EAAKsB,QAAQE,GAAaxB,EAAKsB,QAAQE,IAAc,IACvD9H,KAAKmI,IAIpB,OAAO7B,GAGX0B,IAAK,SAASI,EAAYL,GACtB,OAAO1J,KAAKwJ,KAAKO,EAAYL,GAAU,IAG3CQ,MAAO,SAAST,EAAWC,GACvB,IACIE,EAEApC,EACAsC,EAJA7B,EAAOjI,KAEP+J,SAAoBN,IAAcvD,EAAS,CAACuD,GAAaA,EAGzDO,SAA4BN,IAAazD,EAG7C,IAAK2D,EAAM,EAAGpC,EAASuC,EAAWvC,OAAQoC,EAAMpC,EAAQoC,IACpDH,EAAYM,EAAWH,IAEvBE,EAAUE,EAAqBN,EAAWA,EAASD,MAGtCxB,EAAKsB,QAAQE,GAAaxB,EAAKsB,QAAQE,IAAc,IACvDU,QAAQL,GAIvB,OAAO7B,GAGXmC,QAAS,SAASX,EAAW9E,GACzB,IAEIiF,EACApC,EAHAS,EAAOjI,KACPqK,EAASpC,EAAKsB,QAAQE,GAI1B,GAAIY,EAAQ,CAaR,KAZA1F,EAAIA,GAAK,IAEP2F,OAASrC,EAEXtD,EAAEyE,mBAAoB,EAEtBzE,EAAEwE,eAAiBA,EAEnBxE,EAAE0E,mBAAqBA,EAIlBO,EAAM,EAAGpC,GAFd6C,EAASA,EAAOzD,SAEcY,OAAQoC,EAAMpC,EAAQoC,IAChDS,EAAOT,GAAKW,KAAKtC,EAAMtD,GAG3B,OAA+B,IAAxBA,EAAEyE,kBAGb,OAAO,GAGXa,OAAQ,SAASR,EAAWK,GACxB,IAEIF,EAFA3B,EAAOjI,KACPqK,EAASpC,EAAKsB,QAAQE,GAG1B,GAAIA,IAAc7G,EACdqF,EAAKsB,QAAU,QACZ,GAAIc,EACP,GAAIP,EACA,IAAKF,EAAMS,EAAO7C,OAAS,EAAGoC,GAAO,EAAGA,IAChCS,EAAOT,KAASE,GAAWO,EAAOT,GAAKC,WAAaC,GACpDO,EAAOG,OAAOZ,EAAK,QAI3B3B,EAAKsB,QAAQE,GAAa,GAIlC,OAAOxB,KAKd,SAASwC,EAAYC,EAAMC,GACvB,GAAIA,EACA,MAAO,IACHD,EAAKE,MAAM,KAAKC,KAAK,OAChBD,MAAM,OAAOC,KAAK,WAClBpI,QAAQ,MAAO,OACfA,QAAQ,MAAO,OACfA,QAAQ,MAAO,OAAS,IAEjC,IAAIyH,EAAQQ,EAAKI,OAAO,GACpBC,EAAOL,EAAKM,UAAU,GAE1B,MAAc,MAAVd,EACO,KAAOa,EAAO,KACJ,MAAVb,EACA,qBAAuBa,EAAO,KAE9B,IAAML,EAAO,kBAKjC,IAAIO,EAAqB,OACrBC,EAAe,iBACfC,EAAqB,QACrBC,EAAc,aACdC,EAAqB,OACrBC,EAAc,aACdC,EAAQ,CAAC,GAAI,IAAK,KAAM,MAAO,QAkEvC,SAASC,EAAIC,EAAQC,EAAQC,GAKzB,OAFAA,GADAD,EAASA,GAAU,IADnBD,GAAkB,IAEIjE,QAGX+D,EAAMG,GAAQV,UAAU,EAAGW,GAAOF,EAGtCA,EAy4CP,SAASG,GAAWC,EAASC,GACzB,IACIC,EAAapL,EAAMqL,YACnBC,EAActL,EAAMuL,aACpBC,EAASN,EAAQM,SACjBC,EAAUP,EAAQQ,QAAQ,0BAC1BC,EAAUT,EAAQU,GAAG,YACrBC,EAAeL,EAAO,GAAGM,MACzBC,EAAgBb,EAAQ,GAAGY,MAAME,OAEjCP,EAAQG,GAAG,YACXH,EAAQQ,IAAI,CACRC,QAAS,GACTC,SAAU,KAILtJ,EAAcuJ,KAAKP,EAAaQ,QAAUxJ,EAAcuJ,KAAKP,EAAaG,UAG9EL,GACDT,EAAQoB,IAAId,GAAQe,OAExBf,EAAOS,IAAI,QAAS,IACpBT,EAAOS,IAAI,CACPI,MAAOlB,EAAWC,EAAWF,GAAW,EAAIE,EAAWF,KAGrC,SAAlBa,EACAb,EAAQe,IAAI,CAAED,OAAQV,EAAYE,KAElCA,EAAOS,IAAI,CACPD,OAAQV,EAAYJ,KAIvBS,GACDT,EAAQsB,QAKpB,SAAS3E,GAAW4E,GAChB,IAAIhG,EAAcC,UAEdE,EAAI,EACJC,EAASH,UAAUG,OAEvB,IAAKD,EAAI,EAAGA,EAAIC,EAAQD,IACpB8F,GAAcD,EAAahG,EAAYG,IAG3C,OAAO6F,EAGX,SAASC,GAAcD,EAAaE,GAChC,IAIIC,EACAC,EACAC,EACAC,EACAC,EARAC,EAAkBjN,EAAMkN,KAAKD,gBAC7BE,EAAsBnN,EAAMkN,KAAKC,oBACjCC,EAAapN,EAAMkN,KAAKE,WACxBC,EAAyBrN,EAAMkN,KAAKG,uBAOxC,IAAKT,KAAYD,IAKTI,GAHJD,SADAD,EAAYF,EAAOC,OAGFnH,GAAwB,OAAdoH,EACZA,EAAUlF,YAEV,OAIXoF,IAAaxK,OAASwK,IAAaE,GAAmBF,IAAaI,GACnEJ,IAAaK,GAAcL,IAAaM,GAA0BN,IAAaO,QAC7EtN,EAAMuI,WAAWpI,EAAOoN,cAAgBR,IAAaQ,aAAkBV,aAAqBW,YAevFV,IAAalH,IACpB6G,EAAYG,GAAYC,GAdpBA,aAAqBY,KACrBhB,EAAYG,GAAY,IAAIa,KAAKZ,EAAUvE,WACpCC,EAAWsE,EAAUrG,OAC5BiG,EAAYG,GAAYC,EAAUrG,SAElCwG,EAAWP,EAAYG,GAEnBH,EAAYG,UADL,IAAenH,GACEuH,GAEA,GAE5BN,GAAcD,EAAYG,GAAWC,IAOjD,OAAOJ,EAGX,SAASiB,GAAOC,EAAOC,EAAKC,GACxB,IAAK,IAAIC,KAAMF,EACX,GAAIA,EAAIG,eAAeD,IAAOF,EAAIE,GAAI1B,KAAKuB,GACvC,OAAOG,EAGf,OAAOD,IAAS5L,EAAc4L,EAAOF,EASzC,SAASK,GAAYC,GACjB,OAAOA,EAAInM,QAAQ,WAAW,SAASoM,EAAUC,GAC7C,OAAOA,EAAGC,iBAIlB,SAASC,GAAkBnD,EAASoD,GAChC,IAAiBC,EAAbC,EAAS,GAwBb,OAtBIC,SAASC,aAAeD,SAASC,YAAYC,kBAC7CJ,EAAgBE,SAASC,YAAYC,iBAAiBzD,EAAS,IAE3DoD,GACAtM,EAAEK,KAAKiM,GAAY,SAASrF,EAAKlB,GAC7ByG,EAAOzG,GAASwG,EAAcK,iBAAiB7G,QAIvDwG,EAAgBrD,EAAQ2D,aAEpBP,GACAtM,EAAEK,KAAKiM,GAAY,SAASrF,EAAKlB,GAC7ByG,EAAOzG,GAASwG,EAAcP,GAAYjG,QAKjD/H,EAAM8O,KAAKN,KACZA,EAASD,GAGNC,EAtmDXtM,EAAW,CACP6M,UAAW,OACXC,cAAc,EACdC,OAAQ,SAASC,EAAUhC,GACvB,IAAIjE,EACApC,EACAsI,EAAO,GAEX,IAAKlG,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC9CkG,GAAQD,EAAShC,EAAKjE,IAG1B,OAAOkG,GAEXC,QAAS,SAASF,EAAU3I,GACxB,IAKIa,EACAiI,EACApG,EAPAqG,EAAWlN,EAAO,GAAI/C,KAAMkH,GAC5BwI,EAAYO,EAASP,UACrBQ,EAAeR,EAAUS,MAAMlF,GAAoB,GACnD0E,EAAeM,EAASN,aACxBS,EAAe,yDAKnB,GAAIlH,EAAW2G,GACX,OAAOA,EAcX,IAXAO,GAAgBT,EAAe,QAAUD,EAAY,KAAO,GAE5DU,GAAgB,gBAEhBJ,EAAQH,EACHpN,QAAQ0I,EAAoB,aAC5B1I,QAAQyI,EAAc,2BACtBzI,QAAQ2I,EAAa,KACrB3I,QAAQ4I,EAAoB,aAC5BT,MAAM,KAENhB,EAAM,EAAGA,EAAMoG,EAAMxI,OAAQoC,IAC9BwG,GAAgB3F,EAAYuF,EAAMpG,GAAMA,EAAM,GAAM,GAGxDwG,GAAgBT,EAAe,KAAO,IAItCS,GAFAA,GAAgB,wBAEY3N,QAAQ6I,EAAa,KAEjD,IAII,OAFAvD,EAAK,IAAIsI,SAASH,EAAcE,IAC7BE,WAAajN,KAAKkN,MAAMP,EAAMxI,OAAS,GACnCO,EACT,MAAOpD,GACL,IAAIhE,EAAM6P,eAGN,MAAM,IAAIC,MAAM9P,EAAM+P,OAAO,8CAA+Cb,EAAUO,IAFtFtP,EAAO6P,QAAQC,KAAM,qBAAuBf,EAAW,qBAAuBO,EAAe,QAqBjH,WACI,IACIS,EACAC,EAUAC,EAZAC,EAAY,2HAGZC,EAAO,CACH,KAAM,MACN,KAAM,MACN,KAAM,MACN,KAAM,MACN,KAAM,MACN,IAAM,MACN,KAAM,QAGVC,EAAW,GAAGA,SAsBlB,SAASC,EAAMC,GAEX,OADAJ,EAAUK,UAAY,EACfL,EAAUjE,KAAKqE,GAAU,IAAOA,EAAO3O,QAAQuO,GAAW,SAAS9L,GACtE,IAAIR,EAAIuM,EAAK/L,GACb,cAAcR,IAAMwB,EAASxB,EACzB,OAAS,OAASQ,EAAEoM,WAAW,GAAGJ,SAAS,KAAKtK,OAAO,MAC1D,IAAO,IAAOwK,EAAS,IAGhC,SAASxC,EAAI2C,EAAKC,GACd,IAAIjK,EACAzC,EACA2M,EACAjK,EAEAkK,EAEAhM,EAHAiM,EAAOd,EAEPnI,EAAQ8I,EAAOD,GAYnB,GATI7I,UAAgBA,IAAUtC,UAAiBsC,EAAMkJ,SAAW3L,IAC5DyC,EAAQA,EAAMkJ,OAAOL,WAGdR,IAAQ9K,IACfyC,EAAQqI,EAAIxG,KAAKiH,EAAQD,EAAK7I,KAGlChD,SAAcgD,KACDxC,EACT,OAAOiL,EAAMzI,GACV,GAAIhD,IAASS,EAChB,OAAO0L,SAASnJ,GAASoJ,OAAOpJ,GAASrC,EACtC,GAAIX,IAASY,GAAWZ,IAASW,EACpC,OAAOyL,OAAOpJ,GACX,GAAIhD,IAASU,EAAQ,CACxB,IAAKsC,EACD,OAAOrC,EAIX,GAFAwK,GAAOC,EACPY,EAAU,GACoB,mBAA1BR,EAAS9I,MAAMM,GAA6B,CAE5C,IADAlB,EAASkB,EAAMlB,OACVD,EAAI,EAAGA,EAAIC,EAAQD,IACpBmK,EAAQnK,GAAKqH,EAAIrH,EAAGmB,IAAUrC,EAMlC,OAJAoL,EAAuB,IAAnBC,EAAQlK,OAAe,KAAOqJ,EAC9B,MAAQA,EAAMa,EAAQ7G,KAAK,MAAQgG,GAAO,KAAOc,EAAO,IACxD,IAAMD,EAAQ7G,KAAK,KAAO,IAC9BgG,EAAMc,EACCF,EAEX,GAAIV,UAAcA,IAAQ3K,EAEtB,IADAoB,EAASuJ,EAAIvJ,OACRD,EAAI,EAAGA,EAAIC,EAAQD,WACTwJ,EAAIxJ,KAAOrB,IAElBuL,EAAI7C,EADJ9J,EAAIiM,EAAIxJ,GACGmB,KAEPgJ,EAAQ/P,KAAKwP,EAAMrM,IAAM+L,EAAM,KAAO,KAAOY,QAKzD,IAAK3M,KAAK4D,EACFjI,OAAOiO,eAAenE,KAAK7B,EAAO5D,KAClC2M,EAAI7C,EAAI9J,EAAG4D,KAEPgJ,EAAQ/P,KAAKwP,EAAMrM,IAAM+L,EAAM,KAAO,KAAOY,GAU7D,OAJAA,EAAuB,IAAnBC,EAAQlK,OAAe,KAAOqJ,EAC9B,MAAQA,EAAMa,EAAQ7G,KAAK,MAAQgG,GAAO,KAAOc,EAAO,IACxD,IAAMD,EAAQ7G,KAAK,KAAO,IAC9BgG,EAAMc,EACCF,UAhGJrD,KAAK/F,UAAUuJ,SAAW3L,IAEjCmI,KAAK/F,UAAUuJ,OAAS,WACpB,IAAI3J,EAAOjI,KAEX,OAAO6R,SAAS5J,EAAK8J,WACjBvG,EAAIvD,EAAK+J,iBAAkB,GAAK,IAChCxG,EAAIvD,EAAKgK,cAAgB,GAAK,IAC9BzG,EAAIvD,EAAKiK,cAAgB,IACzB1G,EAAIvD,EAAKkK,eAAiB,IAC1B3G,EAAIvD,EAAKmK,iBAAmB,IAC5B5G,EAAIvD,EAAKoK,iBAAmB,IAAM,MAG1CP,OAAOzJ,UAAUuJ,OAASU,OAAOjK,UAAUuJ,OAASW,QAAQlK,UAAUuJ,OAAS,WAC3E,OAAO5R,KAAK+R,mBAqFTzO,EAAKkP,YAAcvM,IAC1B3C,EAAKkP,UAAY,SAAS9J,EAAO+J,EAAUC,GACvC,IAAInL,EAIJ,GAHAsJ,EAAM,GACNC,EAAS,UAEE4B,IAAUvM,EACjB,IAAKoB,EAAI,EAAGA,EAAImL,EAAOnL,GAAK,EACxBuJ,GAAU,gBAGA4B,IAAUxM,IACxB4K,EAAS4B,GAIb,GADA3B,EAAM0B,EACFA,UAAmBA,IAAaxM,WAAoBwM,IAAarM,UAAiBqM,EAASjL,SAAWrB,GACtG,MAAM,IAAIsK,MAAM,kBAGpB,OAAO7B,EAAI,GAAI,CAAE,GAAIlG,MAzIjC,GA+IA,WACI,IAAIiK,EAAmB,qGACnBC,EAAuB,oBACvBC,EAAgB,uCAChBC,EAAc,MACdC,EAAQ,GACRC,EAAQ,IAERC,EAAQ,IACRC,EAAO,IAEPC,EAAK,QACLC,EAAiB,GAAGlC,SAoEvB,SAASmC,EAAYC,GAClB,GAAIA,EAAS,CACT,GAAIA,EAAQC,aACR,OAAOD,EAGX,UAAWA,IAAYpN,EAAQ,CAC3B,IAAIpD,EAAWnC,EAAMmC,SACrB,OAAOA,EAASwQ,IAAYxQ,EAASwQ,EAAQ1I,MAAM,KAAK,KAAO,KAGnE,OAAO,KAGX,OAAO,KAGX,SAAS4I,EAAWF,GAKhB,OAJIA,IACAA,EAAUD,EAAYC,IAGnBA,GAAW3S,EAAMmC,SAAS2Q,QAvFrC9S,EAAMmC,SAAWnC,EAAMmC,UAAY,GACnCnC,EAAMmC,SAAS,SAAW,CACtBV,KAAM+Q,EACNI,aAAc,CACVG,QAAS,CAAC,MACVC,SAAU,EACV,IAAK,IACL,IAAK,IACLC,UAAW,CAAC,GACZC,QAAS,CACLH,QAAS,CAAC,OAAQ,OAClBC,SAAU,EACV,IAAK,IACL,IAAK,IACLC,UAAW,CAAC,GACZE,OAAQ,KAEZC,SAAU,CACN3R,KAAM,YACN4R,KAAM,MACNN,QAAS,CAAC,OAAQ,MAClBC,SAAU,EACV,IAAK,IACL,IAAK,IACLC,UAAW,CAAC,GACZE,OAAQ,MAGhBG,UAAW,CACPC,SAAU,CACNC,KAAM,CACFC,MAAO,CAAC,SAAU,SAAU,UAAW,YAAa,WAAY,SAAU,YAC1EC,UAAW,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,OACtDC,WAAY,CAAE,KAAM,KAAM,KAAM,KAAM,KAAM,KAAM,OAEtDC,OAAQ,CACJH,MAAO,CAAC,UAAW,WAAY,QAAS,QAAS,MAAO,OAAQ,OAAQ,SAAU,YAAa,UAAW,WAAY,YACtHC,UAAW,CAAC,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,MAAO,QAE7FG,GAAI,CAAE,KAAM,KAAM,MAClBC,GAAI,CAAE,KAAM,KAAM,MAClBC,SAAU,CACNlQ,EAAG,WACHmQ,EAAG,sBACHC,EAAG,iCACHC,EAAG,mBACH3Q,EAAG,sBACHc,EAAG,UACHV,EAAG,UACHW,EAAG,8BACHE,EAAG,UACH2P,EAAG,aACHC,EAAG,iCACH5Q,EAAG,aACH6Q,EAAG,cAEP,IAAK,IACL,IAAK,IACLC,SAAU,EACVC,gBAAiB,QA+B7BvU,EAAM2S,QAAU,SAAS6B,GACrB,IAA+B7B,EAA3BxQ,EAAWnC,EAAMmC,SAErB,GAAIqS,IAAgBvS,EAKhB,OAAOE,EAAS2Q,SAJhBH,EAAUD,EAAY8B,IAAgBrS,EAASqQ,IACvCiC,SAAW9B,EAAQW,UAAUC,SACrCpR,EAAS2Q,QAAUH,GAM3B3S,EAAM0S,YAAcA,EACpB1S,EAAM6S,WAAaA,EAGnB7S,EAAM2S,QAAQH,GAuad,IAAIkC,EAAe,SAAS5J,EAAQ6J,EAAO3J,EAAK4H,GAC5C,IAGIgC,EAASC,EACT5L,EAAKoG,EAAOtH,EACZ+M,EALAC,EAAejK,EAAOkK,QAAQpC,EAAaP,MAC3C4C,EAAarC,EAAaK,UAAUhN,QACpCgN,EAAYgC,EAAWC,QAU3B,GALAlK,GAAwB,IAAlB+J,EAAsBA,EAAe/J,EAAM,GAGjD6J,GADAD,EAAU9J,EAAOT,UAAUsK,EAAO3J,IACVnE,SAEHoM,EAAW,CAI5B,IAHAhK,EAAM4L,EACNxF,EAAQ,GAEDpG,GAAO,GASV,IARAlB,EAAQ6M,EAAQvK,UAAUpB,EAAMgK,EAAWhK,KAEvCoG,EAAMrO,KAAK+G,GAEfkB,GAAOgK,EAIW,KAFlBA,GADA6B,EAAeG,EAAWC,WACGjT,EAAc6S,EAAe7B,GAErC,CACbhK,EAAM,GACNoG,EAAMrO,KAAK4T,EAAQvK,UAAU,EAAGpB,IAEpC,MAIR2L,EAAUvF,EAAM8F,UAAUjL,KAAK0I,EA3jB3B,MA4jBJ9H,EAASA,EAAOT,UAAU,EAAGsK,GAASC,EAAU9J,EAAOT,UAAUW,GAGrE,OAAOF,GAGPsK,EAAQ,SAASrN,EAAOsN,EAAWC,GAanC,OAZAD,EAAYA,GAAa,EAEzBtN,EAAQA,EAAMwI,WAAWtG,MAAM,KAC/BlC,EAAQrF,KAAK0S,QAAQrN,EAAM,GAAK,KAAOA,EAAM,IAAOA,EAAM,GAAKsN,EAAaA,KAExEC,IACAvN,GAASA,IAIbA,KADAA,EAAQA,EAAMwI,WAAWtG,MAAM,MACf,GAAK,KAAOlC,EAAM,IAAOA,EAAM,GAAKsN,GAAcA,KAErDE,QAAQ7S,KAAK8S,IAAIH,EAAW,MAGzC9E,EAAW,SAASxI,EAAO0N,EAAK9C,GAChC,GAAI8C,EAAK,CACL,GAAmC,kBAA/BhD,EAAe7I,KAAK7B,GACpB,OAjeZ,SAAoB2N,EAAM3F,EAAQ4C,GAG9B,IAAI8B,GAFJ9B,EAAUE,EAAWF,IAEEW,UAAUC,SAC7BC,EAAOiB,EAASjB,KAChBI,EAASa,EAASb,OAItB,OAFA7D,EAASA,EAAOgD,SAAW0B,EAASV,SAAShE,IAAWA,GAE1CjO,QAAQkQ,GAAkB,SAASxC,GAC7C,IAAImG,EACAC,EACAC,EAmEJ,MAjEc,MAAVrG,EACAoG,EAASF,EAAKI,UACG,OAAVtG,EACPoG,EAAS/K,EAAI6K,EAAKI,WACD,QAAVtG,EACPoG,EAASpC,EAAKE,UAAUgC,EAAKK,UACZ,SAAVvG,GAA8B,SAAVA,EAC3BoG,EAASpC,EAAKC,MAAMiC,EAAKK,UACR,MAAVvG,EACPoG,EAASF,EAAKM,WAAa,EACV,OAAVxG,EACPoG,EAAS/K,EAAI6K,EAAKM,WAAa,GACd,QAAVxG,EACPoG,EAAShC,EAAOF,UAAUgC,EAAKM,YACd,SAAVxG,EACPoG,EAAShC,EAAOH,MAAMiC,EAAKM,YACV,OAAVxG,EACPoG,EAAS/K,EAAI6K,EAAKO,cAAgB,KACjB,SAAVzG,EACPoG,EAAS/K,EAAI6K,EAAKO,cAAe,GAChB,MAAVzG,EACPoG,EAASF,EAAKQ,WAAa,IAAM,GAChB,OAAV1G,EACPoG,EAAS/K,EAAI6K,EAAKQ,WAAa,IAAM,IACpB,MAAV1G,EACPoG,EAASF,EAAKQ,WACG,OAAV1G,EACPoG,EAAS/K,EAAI6K,EAAKQ,YACD,MAAV1G,EACPoG,EAASF,EAAKS,aACG,OAAV3G,EACPoG,EAAS/K,EAAI6K,EAAKS,cACD,MAAV3G,EACPoG,EAASF,EAAKU,aACG,OAAV5G,EACPoG,EAAS/K,EAAI6K,EAAKU,cACD,MAAV5G,EACPoG,EAASnT,EAAKmN,MAAM8F,EAAKW,kBAAoB,KAC5B,OAAV7G,IACPoG,EAASF,EAAKW,mBACD,KACTT,EAASnT,EAAKmN,MAAMgG,EAAS,KAEjCA,EAAS/K,EAAI+K,IACI,QAAVpG,EACPoG,EAAS/K,EAAI6K,EAAKW,kBAAmB,GACpB,OAAV7G,GAA4B,OAAVA,EACzBoG,EAASF,EAAKQ,WAAa,GAAKzB,EAASZ,GAAG,GAAKY,EAASX,GAAG,GAC5C,QAAVtE,GAEPqG,GADAF,EAAUD,EAAKY,qBACE,EAEjBV,EAASnT,EAAK8T,IAAIZ,EAAU,IAAIpF,WAAWtG,MAAM,KAAK,GACtD0L,EAAUlT,EAAK8T,IAAIZ,GAAqB,GAATC,EAE/BA,GAAUC,EAAO,IAAM,KAAOhL,EAAI+K,GAClCA,GAAU,IAAM/K,EAAI8K,IACH,OAAVnG,GAA4B,MAAVA,IAEzBqG,GADAD,EAASF,EAAKY,oBAAsB,IACpB,EAEhBV,EAASnT,EAAK8T,IAAIX,GAAQrF,WAAWtG,MAAM,KAAK,GAChD2L,GAAUC,EAAO,IAAM,MAAkB,OAAVrG,EAAiB3E,EAAI+K,GAAUA,IAG3DA,IAAW3T,EAAc2T,EAASpG,EAAMvJ,MAAM,EAAGuJ,EAAM3I,OAAS,MAkZ5D2P,CAAWzO,EAAO0N,EAAK9C,GAC3B,UAAW5K,IAAUvC,EACxB,OA/YZ,SAAsBsF,EAAQiF,EAAQ4C,GAGlC,IAKIQ,EACAsD,EAAYC,EACZC,EACAC,EAEAhC,EACAiC,EACAhC,EAIA5L,EACApC,EACAiQ,EACAC,EACAC,EACAjC,EACAkC,EACAC,EACAC,EAASC,EAETC,EAGArM,EA7BA4H,GAFJD,EAAUE,EAAWF,IAEMC,aACvB0E,EAAU1E,EAAaP,KACvBgD,EAAYzC,EAAaI,SACzBD,EAAUH,EAAaG,QAAQ,GAC/BwE,EAAW,GAKXjC,EAAWxK,EAAS,EAKpB0M,EAAcpF,EACdrK,EAAQqK,EAaRuC,GAAS,EAIb,GAAI7J,IAAW7I,EACX,OAAOmQ,EAGX,IAAKlB,SAASpG,GACV,OAAOA,EAIX,IAAKiF,EACD,OAAO4C,EAAQlR,KAAKoF,OAASiE,EAAO2M,iBAAmB3M,EAAOyF,WAMlE,GAHAqG,EAAqB3E,EAAqByF,KAAK3H,GAGvB,CAsBpB,GAlBA2G,EAAuB,OAHvB3G,EAAS6G,EAAmB,GAAGe,iBAE/BlB,EAAwB,MAAX1G,IAGK2G,KAGdY,GADA1E,EAAe6D,EAAa7D,EAAaQ,SAAWR,EAAaM,SAC1Cb,KACvBgD,EAAYzC,EAAaI,SACzBG,EAASP,EAAaO,OACtBJ,EAAUH,EAAaG,QAAQuC,EAAW,EAAI,KAGlDqB,EAAkBC,EAAmB,MAGjCvB,GAAasB,GAIF,MAAX5G,EAGA,OAFU4G,EAAkB7L,EAAO8M,cAAcvC,GAAavK,EAAO8M,iBAE1D9V,QAAQuQ,EAAOO,EAAaP,MA0B3C,GAtBIqE,IACA5L,GAAU,KAIdwK,GADAxK,EAASsK,EAAMtK,EAAQuK,IACH,EAGpBT,GAFA9J,EAASA,EAAOb,MAAMoI,IAEL,GACjBwE,EAAW/L,EAAO,GAGdwK,IACAV,EAAUA,EAAQvK,UAAU,IAGhCtC,EAAQ2M,EAAaE,EAAS,EAAGA,EAAQ/N,OAAQ+L,GAE7CiE,IACA9O,GAASuP,EAAUT,GAGR,MAAX9G,IAAmBuF,EACnB,OAAOvN,EAKX,IAFA+C,EAASsH,EAEJnJ,EAAM,EAAGpC,EAASkM,EAAQlM,OAAQoC,EAAMpC,EAAQoC,IAI7C6B,GADO,OAFXgM,EAAK/D,EAAQ5I,OAAOlB,IAGNlB,EACI,MAAP+O,GAAqB,MAAPA,EACX3D,EAEA2D,EAIlB,OAAOhM,EAmBX,IAZIiF,EAAOiF,QAAQ,MAAQ,GAAKjF,EAAOiF,QAAQ,MAAS,GAAKjF,EAAOiF,QAAQ,OAAS,KACjFjF,EAASA,EAAOjO,QAAQoQ,GAAe,SAAS1C,GAC5C,IAAIqI,EAAYrI,EAAMrF,OAAO,GAAGrI,QAAQ,KAAM,IAC1CgW,EAAUtI,EAAMvJ,MAAM,GAAGnE,QAAQ+V,EAAW,IAIhD,OAFAN,EAASvW,KAAK8W,GAzUR,SA+Ud/H,EAASA,EAAO9F,MAAM,KAClBqL,GAAYvF,EAAO,GAEnBA,EAASA,EAAO,GAChBiH,GAAoB,OACjB,GAAe,IAAXlM,GAAgBiF,EAAO,IAG9B,IAA8B,IAD9BA,EAASA,EAAO,IACLiF,QAAQ1C,KAAyC,GAAzBvC,EAAOiF,QAAQzC,GAE9C,OAAOxC,OAGXA,EAASA,EAAO,GAmCpB,IA7BA2G,GAA6B,GAHd3G,EAAOiF,QAAQ,QAQ1BlK,GAAU,MAJd2L,GAA+B,IAH/BY,EAAgBtH,EAAOiF,QAAQ,QAUiB,OAA9BjF,EAAOsH,EAAgB,KACrCtH,EAASA,EAAO9F,MAAM,MAAMC,KAAK,IACjCuM,GAAa,IAGbA,GAAcC,KAGdY,GADA1E,EAAe6D,EAAa7D,EAAaQ,SAAWR,EAAaM,SAC1Cb,KACvBgD,EAAYzC,EAAaI,SACzBG,EAASP,EAAaO,SAG1B4D,EAAWhH,EAAOiF,QA1XV,MA0X4B,KAEhCjF,EAASA,EAAOjO,QAAQqQ,EAAaC,IAGzC2C,EAAehF,EAAOiF,QAAQ3C,GAC9BxL,EAASkJ,EAAOlJ,QAEK,GAAjBkO,EAqBA,GAdA8B,GAJIA,GAFJA,EAAW/L,EAAOyF,WAAWtG,MAAM,MACtB,GACEmL,EAAMtK,EAAQpI,KAAK6T,IAAIM,EAAS,KAEhCA,EAAS,IAEJ5M,MAAMoI,GAAO,IAAMD,EAGvC+E,GAFAD,EAAYnH,EAAOgI,YAAYxF,GAAQwC,IAEhB,EACvBqC,GAFAH,EAAalH,EAAOgI,YAAYzF,GAASyC,IAEhB,EACzB9L,EAAM4N,EAAShQ,OAEVsQ,GAAYC,IAEbvQ,GADAkJ,EAASA,EAAO1F,UAAU,EAAG0K,GAAgBhF,EAAO1F,UAAU0K,EAAe,IAC7DlO,OAChBkO,GAAgB,EAChB9L,EAAM,GAGNkO,GAAWD,EAAYD,EACvBhO,EAAMiO,OACH,GAAID,EAAaC,EACpB,GAAIE,GAAYnO,EAAMgO,EAAY,CAG9B,IAFA,IAAIe,EAAU5C,EAAMtK,EAAQmM,EAAY3B,GAEjC0C,EAAQ7N,OAAO6N,EAAQnR,OAAS,KAAO0L,GAAQ0E,EAAa,GAAKA,EAAaC,GACjFD,IAEAe,EAAU5C,EAAMtK,EAAQmM,EAAY3B,GAGxCrM,EAAMgO,OACCE,GAAWlO,EAAMiO,IACxBjO,EAAMiO,GAmClB,GA9BApM,EAASsK,EAAMtK,EAAQ7B,EAAKqM,GAE5B2B,EAAalH,EAAOiF,QAAQ1C,GACX4E,EAAYnH,EAAOiF,QAAQzC,GAIxCoC,GADe,GAAfsC,IAAkC,GAAdC,EACZA,GACc,GAAfD,IAAkC,GAAdC,EACnBD,EAEAA,EAAaC,EAAYA,EAAYD,EAGjDA,EAAalH,EAAOgI,YAAYzF,GAChC4E,EAAYnH,EAAOgI,YAAYxF,GAI3BvH,GADe,GAAfiM,IAAkC,GAAdC,EACdA,GACgB,GAAfD,IAAkC,GAAdC,GAGrBD,EAAaC,EAFbD,EAEsCC,EAG5CvC,GAAS9N,IACTmE,EAAM2J,IAGI,GAAVA,EAAa,CAkBb,IAhBAC,GADA7M,EAAQ+C,EAAOyF,WAAWtG,MAAMoI,IAChB,GAChBwE,EAAW9O,EAAM,IAAMqK,EAEvByC,EAAgBD,EAAQ/N,OACPgQ,EAAShQ,OAEtByO,IAAuB,EAAVxK,GAAgB,IAC7BwK,GAAW,GAGfxK,EAASiF,EAAO1F,UAAU,EAAGsK,GAEzBW,IAAa0B,IACblM,GAAU,KAGT7B,EAAM0L,EAAO1L,EAAMpC,EAAQoC,IAAO,CAGnC,GAFA6N,EAAK/G,EAAO5F,OAAOlB,IAEE,GAAjB8L,GACA,GAAI/J,EAAM/B,EAAM4L,EAAe,CAC3B/J,GAAU8J,EACV,YAYJ,IATkB,GAAdsC,GAAmBA,EAAYjO,IAC/BuO,EAAcpF,GAGb2C,EAAe9L,GAAQ4L,GAAiBE,EAAe9L,GAAO,IAC/D6B,GAAU8J,EACV3L,EAAM8L,GAGNA,IAAiB9L,EAAK,CACtB6B,IAAW+L,EAAWS,EAAUlF,GAASyE,EACzC5N,GAAO+B,EAAM+J,EAAe,EAC5B,SAIJ+B,IAAOvE,GACPzH,GAAUgM,EACVU,EAAcV,GACPA,IAAOxE,IACdxH,GAAU0M,GAalB,GATIT,IACAjM,EAAS4J,EAAa5J,EAAQ6J,GAASW,IAAa0B,EAAoB,EAAI,GAAItU,KAAKuV,IAAIjN,EAAM6J,EAAgBF,GAAS/B,IAGxH5H,GAAO2J,IACP7J,GAAUiF,EAAO1F,UAAUW,EAAM,IAIjCyL,GAAcC,EAAW,CAEzB,IADA3O,EAAQqK,EACHnJ,EAAM,EAAGpC,EAASiE,EAAOjE,OAAQoC,EAAMpC,EAAQoC,IAEhDlB,GAAiB,OADjB+O,EAAKhM,EAAOX,OAAOlB,KACY,MAAP6N,EAAc3D,EAAS2D,EAEnDhM,EAAS/C,EAKb,GAFAlB,EAAS0Q,EAAS1Q,OAGd,IAAKoC,EAAM,EAAGA,EAAMpC,EAAQoC,IACxB6B,EAASA,EAAOhJ,QA9gBd,KA8gBmCyV,EAAStO,IAK1D,OAAO6B,EAiEQoN,CAAanQ,EAAO0N,EAAK9C,GAIxC,OAAO5K,IAAU9F,EAAc8F,EAAQ,IAG3C/H,EAAM+P,OAAS,SAAS0F,GACpB,IAAI0C,EAASzR,UAEb,OAAO+O,EAAI3T,QAAQgB,GAAc,SAAS0M,EAAO4I,EAAOC,GACpD,IAAItQ,EAAQoQ,EAAOG,SAASF,EAAO,IAAM,GAEzC,OAAO7H,EAASxI,EAAOsQ,EAAoBA,EAAkBhO,UAAU,GAAK,QAIpFrK,EAAMuY,eAAiB,SAASxI,GAK5B,MAJ0B,QAAtBA,EAAO9J,MAAM,EAAE,KACf8J,EAASA,EAAO9J,MAAM,EAAG8J,EAAOlJ,OAAS,IAGtCkJ,GAGX/P,EAAMwY,eAAiB,WACnB,IACI,OAAO/J,SAASgK,cAClB,MAAOzU,GACL,OAAOyK,SAASiK,gBAAgBD,gBAIxCzY,EAAM2Y,OAASvD,EACfpV,EAAMqL,YAAc,SAASH,EAAS0N,GAAiB,OAAO5W,EAAEkJ,GAASE,WAAWwN,IAAiB,IAAU,GAC/G5Y,EAAMuL,aAAe,SAASL,EAAS0N,GAAiB,OAAO5W,EAAEkJ,GAASI,YAAYsN,IAAiB,IAAU,GACjH5Y,EAAMuQ,SAAWA,EAloBrB,GAsoBA,WACI,IAAIsI,EAAyB,UACzBC,EAAc,MACdC,EAAiB,mBACjBC,EAAsB,gBACtBC,EAAqB,uBACrBC,EAAa,sBACbC,EAAe,UACfC,EAAmB,CAAE,GAAI,CAAE,IAAK,IAAK,KAAO,CAAE,IAAK,IAAK,IAAK,IAAK,IAAK,MACvEC,EAAmB,CACf,CACA,iCACA,8BACA,6BACA,0BACA,2BACA,yBACA,sBACA,qBACA,sBACA,sBACA,uBACG,CACH,mBACA,mBACA,oBACG,CACH,aACA,aACA,WACA,UAGJrW,EAAe,CACX,EAAG,WACH,EAAG,WACH,EAAG,UAEPyP,EAAiB,GAAGlC,SAExB,SAAS+I,EAAWvR,EAAO4M,EAAO3J,GAC9B,QAASjD,GAAS4M,GAAS5M,GAASiD,GAGxC,SAASuO,EAAoBC,GACzB,OAAOA,EAAWrP,OAAO,GAG7B,SAASsP,EAAeC,GACpB,OAAO1X,EAAE2X,IAAID,EAAaH,GAU9B,SAASK,EAAW1M,GAKhB,IAJA,IAAIjE,EAAM,EACNpC,EAASqG,EAAKrG,OACdgT,EAAQ,GAEL5Q,EAAMpC,EAAQoC,IACjB4Q,EAAM5Q,IAAQiE,EAAKjE,GAAO,IAAI0O,cAGlC,OAAOkC,EAGX,SAASC,EAAeC,GACpB,IAAuBnN,EAAnBoN,EAAe,GAEnB,IAAKpN,KAAYmN,EACbC,EAAapN,GAAYgN,EAAWG,EAAUnN,IAGlD,OAAOoN,EAGX,SAASC,EAAWlS,EAAOgI,EAAQ4C,EAASuH,GACxC,IAAKnS,EACD,OAAO,KAGX,IA0EI+O,EAAIqD,EAAOtT,EAAQkM,EACnBqH,EAAQC,EAAKxZ,EACbyZ,EAAeC,EACfC,EAAaC,EACJjL,EA9ETkL,EAAY,SAASlL,GAEjB,IADA,IAAI5I,EAAI,EACDmJ,EAAO9G,KAASuG,GACnB5I,IACAqC,IAKJ,OAHIrC,EAAI,IACJqC,GAAO,GAEJrC,GAEX+T,EAAY,SAAS7L,GACjB,IAAI8L,EAAK5X,EAAa8L,IAAS,IAAIxB,OAAO,UAAYwB,EAAO,KACzDU,EAAQzH,EAAM8S,OAAOC,EAAUhM,GAAMU,MAAMoL,GAE/C,OAAIpL,GACAA,EAAQA,EAAM,GACdsL,GAAYtL,EAAM3I,OACXyR,SAAS9I,EAAO,KAEpB,MAEXuL,EAAiB,SAAStH,EAAOuH,GAQ7B,IAPA,IAEIvZ,EAAMwZ,EAGNC,EALAtU,EAAI,EACJC,EAAS4M,EAAM5M,OAEfsU,EAAc,EACdC,EAAW,EAGRxU,EAAIC,EAAQD,IAEfqU,GADAxZ,EAAOgS,EAAM7M,IACKC,OAClBqU,EAAWnT,EAAM8S,OAAOC,EAAUG,GAE9BD,IACAE,EAAWA,EAASvD,eAGpBuD,GAAYzZ,GAAQwZ,EAAaE,IACjCA,EAAcF,EACdG,EAAWxU,GAInB,OAAIuU,GACAL,GAAYK,EACLC,EAAW,GAGf,MAEXC,EAAe,WACX,IAAIzF,GAAS,EAKb,OAJI7N,EAAMoC,OAAO2Q,KAAc/K,EAAO9G,KAClC6R,IACAlF,GAAS,GAENA,GAEXnB,EAAW9B,EAAQW,UAAUC,SAC7B+H,EAAO,KACPxW,EAAQ,KACRyW,EAAM,KACNC,EAAQ,KACR7F,EAAU,KACV8F,EAAU,KACVC,EAAe,KACfzS,EAAM,EACN6R,EAAW,EACXhD,GAAU,EACVpC,EAAO,IAAIjI,KACX8G,EAAkBE,EAASF,iBAAmB,KAC9CoH,EAAcjG,EAAKO,cAoBvB,IAbKlG,IACDA,EAAS,MAIbgD,EAAU0B,EAASV,SAAShE,MAExBA,EAASgD,GAIblM,GADAkJ,EAASA,EAAO9F,MAAM,KACNpD,OAEToC,EAAMpC,EAAQoC,IAGjB,GAFA6N,EAAK/G,EAAO9G,GAER6O,EACW,MAAPhB,EACAgB,GAAU,EAEVuD,SAGJ,GAAW,MAAPvE,EAAY,CAMZ,GALAqD,EAAQO,EAAU,KACbjG,EAASmH,aACVnH,EAASmH,WAAa9B,EAAerF,EAASjB,OAGtC,OAAR+H,GAAgBpB,EAAQ,EACxB,SAKJ,GAAY,QAFZoB,EAAMpB,EAAQ,EAAIQ,EAAU,GAAKI,EAAetG,EAASmH,WAAoB,GAATzB,EAAa,YAAc,UAAU,KAErFb,EAAWiC,EAAK,EAAG,IACnC,OAAO,UAER,GAAW,MAAPzE,EAAY,CAOnB,GANAqD,EAAQO,EAAU,KACbjG,EAASoH,eACVpH,EAASoH,aAAe/B,EAAerF,EAASb,SAItC,QAFd9O,EAAQqV,EAAQ,EAAIQ,EAAU,GAAKI,EAAetG,EAASoH,aAAsB,GAAT1B,EAAa,YAAc,UAAU,KAEvFb,EAAWxU,EAAO,EAAG,IACvC,OAAO,KAEXA,GAAS,OACN,GAAW,MAAPgS,EAAY,CAInB,GAAa,QAFbwE,EAAOX,EADPR,EAAQO,EAAU,OAId,OAAO,KAGE,GAATP,IAC+B,iBAApB5F,IACPA,EAAkBoH,EAAcrD,SAAS/D,EAAiB,MAG9D+G,EAAQK,EAAcA,EAAc,IAAOL,GAChC/G,IACP+G,GAAQ,WAGb,GAAW,MAAPxE,GAMP,GALA4D,EAAU,KAEG,KADbc,EAAQb,EAAU,MAEda,EAAQ,GAEE,OAAVA,GAAkBlC,EAAWkC,EAAO,EAAG,IACvC,OAAO,UAER,GAAW,MAAP1E,GAGP,GAFA4D,EAAU,KAEI,QADdc,EAAQb,EAAU,KACIrB,EAAWkC,EAAO,EAAG,IACvC,OAAO,UAER,GAAW,MAAP1E,GAGP,GAFA4D,EAAU,KAEM,QADhB/E,EAAUgF,EAAU,KACIrB,EAAW3D,EAAS,EAAG,IAC3C,OAAO,UAER,GAAW,MAAPmB,GAGP,GAFA4D,EAAU,KAEM,QADhBe,EAAUd,EAAU,KACIrB,EAAWmC,EAAS,EAAG,IAC3C,OAAO,UAER,GAAW,MAAP3E,GAYP,GAXAqD,EAAQO,EAAU,KAElBlL,EAAQzH,EAAM8S,OAAOC,EAAUX,GAAO3K,MAAMxM,EAAa,IAGpC,QAFrB0Y,EAAef,EAAUR,MAGrBuB,EAAetT,WAAW,KAAOoH,EAAM,GAAI,IAC3CkM,EAAe1b,EAAM2Y,OAAO+C,EAAc,GAC1CA,GAAgB,KAGC,OAAjBA,GAAyBpC,EAAWoC,EAAc,EAAG,KACrD,OAAO,UAGR,GAAW,MAAP5E,GAWP,GAVAqD,EAAQO,EAAU,KAClBJ,EAAgB7F,EAASZ,GACzB0G,EAAgB9F,EAASX,GAEX,IAAVqG,IACAG,EAAgBb,EAAea,GAC/BC,EAAgBd,EAAec,MAGnCH,EAASW,EAAeR,MACRQ,EAAeT,GAC3B,OAAO,UAGV,GAAW,MAAPxD,EAAY,CAIjB,GAHAuD,GAAM,EACNF,EAAQO,EAAU,KAEgB,MAA9B3S,EAAM8S,OAAOC,EAAU,GAAY,CACnCO,IACA,SAMJ,KAHAxa,EAAUkH,EAAM8S,OAAOC,EAAU,GACjBtL,MAAM2K,EAAQ,EAAIlB,EAAqBD,IAGnD,OAAO,KAeX,GAVAwB,GAFA3Z,EAAUA,EAAQ,GAAGoJ,MAAM,MAEL,KACtBwQ,EAAgB5Z,EAAQ,KAEF2Z,EAAY3T,OAAS,IACvCiU,EAAWN,EAAY3T,OAAS,EAChC4T,EAAgBD,EAAYnQ,UAAUyQ,GACtCN,EAAcA,EAAYnQ,UAAU,EAAGyQ,IAIvCxB,EADJkB,EAAclC,SAASkC,EAAa,KACP,GAAI,IAC7B,OAAO,KAGX,GAAIL,EAAQ,IACRM,EAAgB5Z,EAAQ,GAAG,GAAK4Z,EAChCA,EAAgBnC,SAASmC,EAAe,IACpCtS,MAAMsS,IAAkBnB,EAAWmB,GAAgB,GAAI,KACvD,OAAO,UAGZ,GAAW,MAAP3D,EACPgB,GAAU,EACVuD,SACG,IAAKA,IACR,OAAO,KAOnB,OAAInB,IAAW,QAAQ9N,KAAKrE,EAAM8S,OAAOC,IAC9B,MAKE,OAATQ,GAA2B,OAAVxW,GAA0B,OAARyW,IAFnB,OAAVC,GAA8B,OAAZ7F,GAAoB8F,GAAW,OAGvDH,EAAOK,EACP7W,EAAQ4Q,EAAKM,WACbuF,EAAM7F,EAAKI,YAEE,OAATwF,IACAA,EAAOK,GAGC,OAARJ,IACAA,EAAM,IAIVnB,GAAUoB,EAAQ,KAClBA,GAAS,IAGTnB,GACIG,IACAgB,IAAUhB,GAGVC,IACA9E,IAAY8E,GAGhB1S,EAAQ,IAAI0F,KAAKA,KAAK4M,IAAIiB,EAAMxW,EAAOyW,EAAKC,EAAO7F,EAAS8F,EAASC,KAjU7E,SAAmBhG,EAAM8F,GAChBA,GAA6B,KAApB9F,EAAKQ,YACfR,EAAKoG,SAASpG,EAAKQ,WAAa,GAkUhC6F,CADAhU,EAAQ,IAAI0F,KAAK6N,EAAMxW,EAAOyW,EAAKC,EAAO7F,EAAS8F,EAASC,GAC3CF,GAGjBF,EAAO,KACPvT,EAAMiU,YAAYV,GAGlBvT,EAAM+N,YAAcyF,GAAOlB,IAAQpY,EAC5B,KAGJ8F,GA8BX,SAASkU,EAAkBlU,EAAOmU,EAASvJ,EAASuH,GAChD,GAAmC,kBAA/BzH,EAAe7I,KAAK7B,GACpB,OAAOA,EAGX,IAEIlB,EACAsV,EAnC4BC,EAC5BvG,EA+BA5M,EAAM,EACNyM,EAAO,KAIX,GAAI3N,GAAiC,IAAxBA,EAAMiN,QAAQ,QACvBU,EAAOwD,EAAWxB,KAAK3P,IAanB,OAXA2N,EAAOA,EAAK,GACZyG,EAAWhD,EAAazB,KAAKhC,EAAKrL,UAAU,IAE5CqL,EAAO,IAAIjI,KAAK6K,SAAS5C,EAAM,KAE3ByG,IA7CoBC,EA8CkBD,EAAS,GA7CvDtG,EAA+B,MAAxBuG,EAAOvB,OAAO,EAAG,IAAc,EAAI,EAE9CuB,EAASA,EAAO/R,UAAU,GA2Cd8R,EAxCLtG,GAFuC,GAApCyC,SAAS8D,EAAOvB,OAAO,EAAG,GAAI,IAAYvC,SAAS8D,EAAO/R,UAAU,GAAI,KA2CtEqL,EAAO1V,EAAMqc,SAAS5U,MAAMiO,EAAM,GAClCA,EAAO1V,EAAMqc,SAASC,QAAQ5G,EAAM,GAAI,EAAIyG,IAGzCzG,EAaf,IATA/C,EAAU3S,EAAM6S,WAAWF,GAEtBuJ,IACDA,EAjDR,SAA2BvJ,GACvB,IAGI4J,EAAgBC,EAAWvT,EAH3BpC,EAASpE,EAAKwV,IAAImB,EAAiBvS,OAAQwS,EAAiBxS,QAE5DkN,GADWpB,EAAQ8B,UAAY9B,EAAQW,UAAUC,UAC7BQ,SAEpBmI,EAAU,GAEd,IAAKjT,EAAM,EAAGA,EAAMpC,EAAQoC,IAAO,CAE/B,IADAsT,EAAiBnD,EAAiBnQ,GAC7BuT,EAAY,EAAGA,EAAYD,EAAe1V,OAAQ2V,IACnDN,EAAQlb,KAAK+S,EAASwI,EAAeC,KAEzCN,EAAUA,EAAQO,OAAOpD,EAAiBpQ,IAG9C,OAAOiT,EAkCOQ,CAAkB/J,IAIhC9L,GADAqV,EAAU5Z,EAAQ4Z,GAAWA,EAAU,CAACA,IACvBrV,OAEVoC,EAAMpC,EAAQoC,IAEjB,GADAyM,EAAOuE,EAAWlS,EAAOmU,EAAQjT,GAAM0J,EAASuH,GAE5C,OAAOxE,EAIf,OAAOA,EAGX1V,EAAM2c,UAAY,SAAS5U,EAAOmU,EAASvJ,GACvC,OAAOsJ,EAAkBlU,EAAOmU,EAASvJ,GAAS,IAGtD3S,EAAM4c,eAAiB,SAAS7U,EAAOmU,EAASvJ,GAC5C,OAAOsJ,EAAkBlU,EAAOmU,EAASvJ,GAAS,IAGtD3S,EAAMsY,SAAW,SAASvQ,EAAO4K,GAC7B,IAAIiD,EAAS5V,EAAMoI,WAAWL,EAAO4K,GAIrC,OAHIiD,IACAA,GAAkB,GAEfA,GAGX5V,EAAMoI,WAAa,SAASL,EAAO4K,EAAS5C,GACxC,IAAKhI,GAAmB,IAAVA,EACX,OAAO,KAGV,UAAWA,IAAUvC,EAClB,OAAOuC,EAGVA,EAAQA,EAAMwI,WAGd,IAMIlB,EAAOqH,EANP5L,GAFJ6H,EAAU3S,EAAM6S,WAAWF,IAENC,aACjBM,EAAUpI,EAAOoI,QACjBE,EAAWtI,EAAOsI,SAClBD,EAASC,EAASD,OAClB0J,EAAgB3J,EAAQC,OACxBmC,EAAWvN,EAAMiN,QAAQ,KAI7B,OAAI+D,EAAe3M,KAAKrE,IACpBA,EAAQK,WAAWL,EAAMjG,QAAQgJ,EAAO,KAAM,MAC1C3C,MAAMJ,KACNA,EAAQ,MAELA,GAGPuN,EAAW,EACJ,MAEPA,EAAWA,GAAY,EAGvBvN,EAAMiN,QAAQ7B,IAAW,GAAMpD,GAAUA,EAAO4H,cAAc3C,QAAQ,MAAQ,GAE9E3F,GADAvE,EAASsI,GACML,QAAQ,GAAGjR,QAAQ,IAAKqR,GAAQlJ,MAAM,KACjDlC,EAAMiN,QAAQ3F,EAAM,KAAO,GAAKtH,EAAMiN,QAAQ3F,EAAM,KAAO,IAC3DtH,EAAQA,EAAMjG,QAAQuN,EAAM,GAAI,IAAIvN,QAAQuN,EAAM,GAAI,IACtDiG,GAAW,IAERvN,EAAMiN,QAAQ6H,IAAkB,IACvCnG,GAAY,EACZ5L,EAASoI,EACTC,EAAS0J,GAGb9U,EAAQA,EAAMjG,QAAQ,IAAK,IACbA,QAAQqR,EAAQ,IAChBrR,QAAQ+W,EAAwB,KAChC5O,MAAMa,EAAO,KAAKhJ,QAAQ+W,EAAwB,MAAM3O,KAAK,IAC7DpI,QAAQgX,EAAa,IACrBhX,QAAQgJ,EAAO,KAAM,KAEnC/C,EAAQK,WAAWL,GAEfI,MAAMJ,GACNA,EAAQ,KACDuN,IACPvN,IAAU,GAGVA,GAAS2O,IACT3O,GAAS,KAGNA,IApiBf,GA6zBI,WACInF,EAAQka,WAAa7a,EAErBW,EAAQma,UAAY,SAASC,GACzB,GAAK7U,MAAMvF,EAAQka,aAAgBE,EAE5B,CACH,IACIpH,EADAqH,EAAMxO,SAASyO,cAAc,OAWjC,OARAD,EAAInR,MAAMqR,QAAU,oEACpBF,EAAIG,UAAY,SAChB3O,SAAS4O,KAAKC,YAAYL,GAE1Bra,EAAQka,WAAalH,EAASqH,EAAIM,YAAcN,EAAIO,YAEpD/O,SAAS4O,KAAKI,YAAYR,GAEnBrH,EAbP,OAAOhT,EAAQka,YAiBvBla,EAAQ8a,MAAQ,SAASxS,GACrB,OAAOlJ,EAAEkJ,GAASQ,QAAQ,UAAU7E,OAAS,GAGjD,IAAI8W,EAAQlP,SAASyO,cAAc,SAGnC,IACIS,EAAMP,UAAY,qBAElBxa,EAAQgb,gBAAiB,EAC3B,MAAO5Z,GACLpB,EAAQgb,gBAAiB,EAG7Bhb,EAAQib,MAAQ,iBAAkB1d,EAElC,IAAI2d,EAAWrP,SAASiK,gBAAgB5M,MACpCiS,EAAcnb,EAAQmb,aAAc,EACpCC,EAAapb,EAAQob,YAAa,EAClCC,EAAe,gBAAiB9d,EAASqN,YAAY9F,UAAY,GAErE9E,EAAQsb,QAAW,oBAAqB/d,GAAU,QAAS,IAAIA,EAAOge,iBAAsB,mBAAoBL,GAAY,kBAAmBA,EAC/Ilb,EAAQwb,WAAc,aAAcN,GAAc,mBAAoBA,GAAc,eAAgBA,EAEpGzb,EAAK,CAAE,MAAO,SAAU,IAAK,OAAQ,WACjC,IAAIgc,EAAShf,KAAKkR,WACd+N,SAAwBX,EAAM7R,MAAMuS,EAAS,gBAAkB9Y,EAEnE,GAAI+Y,UAAyBX,EAAM7R,MAAMuS,EAAS,eAAiB9Y,EAAQ,CACvE,IAAIgZ,EAAYF,EAAO1G,cAavB,OAXAqG,EAAa,CACT/R,IAAmB,MAAbsS,EAAqB,IAAMA,EAAY,IAAM,GACnDF,OAAQA,EACRG,MAAsB,MAAdD,GAAmC,WAAdA,EAA0BA,EAAY,IAGnED,KACAP,EAAcC,GACFQ,MAAQT,EAAYS,MAAQT,EAAYS,MAAQ,gBAAkB,kBAG3E,MAIfb,EAAQ,KAER/a,EAAQob,WAAaA,EACrBpb,EAAQmb,YAAcA,EAEtBnb,EAAQ6b,iBAAmBte,EAAOse,mBAAqBxc,EAAc,EAAI9B,EAAOse,iBAEhF,IACI7b,EAAQ8b,YAAcve,EAAOiL,YAAcjL,EAAOwe,OAASxe,EAAOwe,OAAOC,WAAaze,EAAO0e,WAC7Fjc,EAAQkc,aAAe3e,EAAOmL,aAAenL,EAAOwe,OAASxe,EAAOwe,OAAOI,YAAc5e,EAAO6e,YAClG,MAAOC,GAELrc,EAAQ8b,YAAcve,EAAOwe,OAAOC,WACpChc,EAAQkc,aAAe3e,EAAOwe,OAAOI,YAGzCnc,EAAQsc,SAAW,SAASC,GACxB,IAAgBC,EAAZC,GAAK,EAAqB7P,EAAQ,GAClC8P,GAAmB,iBAAiBlT,KAAK+S,GACzCI,EAAW,CACPC,GAAI,gDACJC,KAAM,+BACNC,QAAS,qEACTC,OAAQ,2CACRC,KAAM,kCACNC,MAAO,2CACPC,MAAO,gCACPC,WAAY,oDACZC,SAAU,kDACVC,QAAS,gCACTC,MAAO,2CACPC,SAAU,gDACVC,KAAM,8CAEVC,EAAQ,CACJC,IAAK,sBACLZ,QAAS,kBACTK,WAAY,wBACZE,QAAS,UACTT,GAAI,KACJe,KAAM,uBACNV,MAAO,SAEXW,EAAgB,CACZC,OAAQ,uBAEZC,EAAa,CACTC,MAAO,eACPC,QAAS,eACTC,QAAS,kBACTC,aAAc,qBACdC,GAAI,uBACJC,OAAQ,gBACRC,OAAQ,WAGhB,IAAK,IAAItT,KAAS4R,EACd,GAAIA,EAASxR,eAAeJ,KACxB6B,EAAQ2P,EAAG3P,MAAM+P,EAAS5R,KACf,CACP,GAAa,WAATA,GAAsB,YAAauT,UAAa,OAAO,GAE3D7B,EAAK,IACF8B,OAASxT,EACZ0R,EAAGoB,OAAS/S,GAAOC,EAAO6S,GAAe,GACzCnB,EAAG+B,QAAU1T,GAAOyR,EAAIuB,EAAY,WACpCrB,EAAG5d,KAAOiM,GAAOC,EAAO0S,GACxBhB,EAAGA,EAAG5d,OAAQ,EACd4d,EAAGgC,aAAe7R,EAAM,GACxB6P,EAAGD,cAAgB5P,EAAM,IAAM,KAAK1N,QAAQ,IAAK,KACjDsd,EAAeC,EAAGD,aAAatd,QAAQ,IAAK,IAAI+Y,OAAO,EAAG,GAC1DwE,EAAGiC,YAAcjC,EAAGgC,aAAejC,EAAgB,IAAI7c,MAAM,GAAK6c,EAAavY,OAAS,EAAIuY,EAAavY,OAAS,IAAIqD,KAAK,KAC3HmV,EAAGkC,eAAiBphB,EAAOqhB,WAAa5b,UAAoBzF,EAAOohB,UAAY3b,EAC/EyZ,EAAGoC,QAAUthB,EAAO+gB,UAAUQ,YAAc,mBAAqBtV,KAAKjM,EAAOwhB,SAASC,WAAavC,EAAGkC,QAElGlC,EAAGK,UAAY9c,EAAQ6b,iBAAmB,KAAOY,EAAGiC,YAAc,KAAOhC,KAAqB1c,EAAQ8b,YAAc,KAAO9b,EAAQkc,aAAe,OAClJO,EAAGoB,OAAS9S,GAGhB,MAIZ,OAAO0R,GAGX,IAgIU+B,EAEFS,EACAC,EACAT,EApIJU,EAAWnf,EAAQmf,SAAWnf,EAAQsc,SAASgC,UAAUc,WAE7Dpf,EAAQqf,mBAAqBF,EAASvC,GAAKb,OAAOtS,MAAQ,IAAM,EAEhEzJ,EAAQsf,oBAAqB,GAEzBH,EAASzB,KAAQyB,EAASrC,SAAWqC,EAASV,aAAe,GAAMU,EAASvC,MAC5E5c,EAAQsf,mBAAqBH,GAGjCnf,EAAQuf,aAAe,WAGnB,GAAIvf,EAAQib,MAAO,CAGf,GAAIkE,EAASzB,IACT,OAAO,EAGX,GAAIyB,EAASrC,QAET,OAAK9c,EAAQwe,QAAQJ,UAKjBpe,EAAQwe,QAAQvf,QAAU,OAKrBG,EAAE,uBAAuBogB,KAAK,YAAc,IAAI5S,MAAM,qBAIvE,OAAO,GAGX5M,EAAQyf,qBAAuBzf,EAAQib,SAAWjb,EAAQmf,SAASzB,KAAO1d,EAAQmf,SAASrC,SAE3F9c,EAAQ0f,cAAgB,SAASnD,GAC7B,IAAIiC,GAAU,EACV5R,EAAQ,GAERkR,EAAa,CACT6B,KAAM,uBACNtB,OAAQ,+BACRuB,OAAQ,yBACRC,MAAO,sCACPC,KAAM,mCACNC,QAAS,kCAGjB,IAAK,IAAIhV,KAAS+S,EACd,GAAIA,EAAW3S,eAAeJ,KAC1B6B,EAAQ2P,EAAG3P,MAAMkR,EAAW/S,KACjB,EACPyT,EAAU,IACFzT,IAAS,EACjByT,EAAQ5R,EAAM,GAAGmI,cAAc1N,MAAM,KAAK,GAAGA,MAAM,KAAK,KAAM,EAC9DmX,EAAQvf,QAAUyW,SAAS7J,SAASmU,cAAgBpT,EAAM,GAAI,IAE1D4R,EAAQJ,QACY7B,EAAG3P,MAAM,yBAGzB4R,EAAQyB,cAAe,GAI/B,MAKZ,OAAOzB,GAGXxe,EAAQwe,QAAUxe,EAAQ0f,cAAcpB,UAAUc,YAE7CD,GAAYnf,EAAQib,OAASjb,EAAQwe,QAAQoB,SAC9CT,EAAWnf,EAAQmf,SAAW,CAC1BzB,KAAK,EACLG,OAAQ,SACRU,OAAQ,OACRE,aAAc,KAItBze,EAAQkgB,sBAAwB,WAC5B,IAAIC,EAAW,CACXzc,OAAMmI,SAASuU,uBAAwBvU,SAASuU,sBAAsB,QACtEC,MAAKxU,SAASuU,uBAAwBvU,SAASuU,sBAAsB,OACrEE,QAAOzU,SAASuU,uBAAwBvU,SAASuU,sBAAsB,UAY3E,OATIpgB,EAAQwe,QAAQJ,SAEhB+B,EAASG,OAAQ,EACbtgB,EAAQwe,QAAQvf,SAAW,KAC3BkhB,EAASzc,MAAO,EAChByc,EAASE,KAAM,IAIhBF,GAGXngB,EAAQugB,UAAYvgB,EAAQkgB,wBAE5BlgB,EAAQwgB,UAAY,WAChB,IACI,IAAIhC,EAAUxe,EAAQwe,QAClBiC,EAAsB,EACtBC,EAAQ7U,SAASiK,gBAMrB,OAJI0I,EAAQsB,MAA2B,IAAnBtB,EAAQvf,SAAiByhB,EAAMC,aAAeD,EAAME,eAAiB5gB,EAAQib,QAC7FwF,EAAsBzgB,EAAQma,aAG3Bna,EAAQib,MAASyF,EAAMG,YAActjB,EAAO0e,WAC5CuC,EAAQsB,MAAQtB,EAAQvf,SAAW,KAAQ6hB,KAAOvjB,GAAQsO,SAASiK,gBAAgB6E,YAAc8F,IAAwBK,KAAOvjB,GAAQ0e,WAAc,EAC/J,MAAO7a,GACL,OAAO,IAILod,EAgCPxe,EAAQwe,QA9BHS,EAAW,GACXC,EAAa9f,EAAEyM,SAASiK,iBACxB2I,EAAe/I,SAAS8I,EAAQvf,QAAS,IAEzCuf,EAAQsB,KACRb,EAAW,KACJT,EAAQuB,QACfd,EAAW,KACJT,EAAQoB,OACfX,EAAW,SACJT,EAAQH,OACfY,EAAW,SACJT,EAAQqB,MACfZ,EAAW,QACJT,EAAQmB,OACfV,EAAW,QAGXA,IACAA,EAAW,KAAOA,EAAW,MAAQA,EAAWR,GAEhDze,EAAQmf,WACRF,GAAY,aAGXjf,EAAQwb,aACTyD,GAAY,iBAGhBC,EAAW6B,SAAS9B,GAGxBjf,EAAQghB,aAAenV,SAASiK,gBAAgB5X,iBAEhD,IAAI+iB,EAAQpV,SAASyO,cAAc,SAEnCta,EAAQkhB,YAAc,gBAAiBD,EACvCjhB,EAAQmhB,oBAAsB,qBAAsBF,EAEpDjhB,EAAQihB,MAAQ,WAQZ,IAPA,IAKI9e,EALAif,EAAQ,CAAC,SAAU,OAAQ,OAAQ,QAAS,OAAQ,WAAY,kBAChEnd,EAASmd,EAAMnd,OACfkB,EAAQ,OACR6N,EAAS,GACT3M,EAAM,EAGJA,EAAMpC,EAAQoC,IAChBlE,EAAOif,EAAM/a,GACb4a,EAAMI,aAAa,OAAQlf,GAC3B8e,EAAM9b,MAAQA,EAEd6N,EAAO7Q,EAAKjD,QAAQ,IAAK,KAAsB,SAAf+hB,EAAM9e,MAAmB8e,EAAM9b,QAAUA,EAG7E,OAAO6N,EAhBK,GAmBhBiO,EAAM/X,MAAMqR,QAAU,cAEtBva,EAAQshB,WAAaL,EAAM/X,MAAMoY,SAEjCL,EAAQ,KAERjhB,EAAQuhB,WAAa,WAUjB,IAPA,IAEIC,EAAS,CAAC,CACVhM,MAAO,EACPiM,MAAO,MAGFzd,EAAI,EAAGA,EAPA,IAOeA,IAC3Bwd,EAAOpjB,KAAK,CACRoX,MAAOxR,EACPyd,MAAO,MAQf,OAJAD,EAAOE,MAAK,SAAS/f,EAAGggB,GACpB,OAAOhgB,EAAE8f,MAAQE,EAAEF,MAAQ,EAAK9f,EAAE8f,MAAQE,EAAEF,OAAS,EAAI,KAGlC,IAApBD,EAAO,GAAGhM,MArBA,GAwBrBxV,EAAQ4hB,gBAAkBvG,EAAawG,uBAAyBxG,EAAayG,oBACnDzG,EAAa0G,mBAAqB1G,EAAa2G,kBAC/C3G,EAAauG,iBAAmBvG,EAAapd,SACrE,SAAUgkB,GAIN,IAHA,IAAIC,EAAWrW,SAASsW,kBAAqB1lB,KAAK2lB,YAAcvW,UAAWsW,iBAAkBF,IAAc,GAAK7iB,EAAE6iB,GAC9Gje,EAAIke,EAASje,OAEVD,KACH,GAAIke,EAASle,IAAMvH,KACf,OAAO,EAIf,OAAO,GAGbuD,EAAQxC,WAAa,eAAgBD,EAErCyC,EAAQqiB,UAAY9kB,EAAO+kB,SAAW/kB,EAAO+kB,QAAQD,UAErDriB,EAAQuiB,WAAa,iBAAkBhlB,EAEvCyC,EAAQwiB,eAAiB,oBAAqBjlB,EAAOsO,SAErD,IAAIuS,EAASpe,EAAQwe,QAAQJ,OACzBqE,EAAeziB,EAAQwe,QAAQkE,MAC/B3C,EAAU/f,EAAQwe,QAAQuB,QAC1BH,EAAS5f,EAAQwe,QAAQoB,OAC7B5f,EAAQ2iB,YAAcvE,GAAU7gB,EAAOqlB,eACvC5iB,EAAQ6iB,UAAYzE,IAAWqE,IAAiB1C,IAAYH,GAAUriB,EAAOulB,aAC7E9iB,EAAQ+iB,oBAAsB5D,IAAiC,SAApBA,EAASZ,QAAqBY,EAASV,aAAe,MAAQze,EAAQib,OAASjb,EAAQ2iB,YAAc3iB,EAAQ6iB,UAnZ5J,GAodA,IAAIG,GAAU,GAyCd,SAASC,GAAwBtf,EAASuf,EAAU3Q,EAAS4Q,GA6BzD,cA5BWxf,IAAYhB,IAIfgD,EAAWud,KACXC,EAAWD,EACXA,EAAW,IACX3Q,GAAU,GAGV5M,EAAW4M,KACX4Q,EAAW5Q,EACXA,GAAU,UAGH2Q,IAAangB,IACpBwP,EAAU2Q,EACVA,EAAW,KAGfvf,EAAU,CACNqf,QAASrf,EACTuf,SAAUA,EACV3Q,QAASA,EACT4Q,SAAUA,IAIX3jB,EAAO,CAEVwjB,QAAS,GACTE,SAAU,IACV3Q,SAAS,EACT3N,KAAMhF,EACNwjB,SAAUxjB,EACVgK,MAAM,GACPjG,EAAS,CAAE0f,iBAAkB1f,EAAQwf,SAAUA,SAAUvjB,IAIhE,SAAS0jB,GAAQhb,EAAS3E,EAASuf,EAAU3Q,EAAS4Q,GAKlD,IAJA,IAEII,EAFAld,EAAM,EACNpC,EAASqE,EAAQrE,OAGdoC,EAAMpC,EAAQoC,KACjBkd,EAAWnkB,EAAEkJ,EAAQjC,KACZmd,OAAM,WACXR,GAAQS,QAAQF,EAAUN,GAAwBtf,EAASuf,EAAU3Q,EAAS4Q,OAItF,OAAO7a,EA5FXlJ,EAAEI,OAAOwjB,GAAS,CACdU,SAAS,EACTC,QAAS,SAASrb,GACd7L,KAAK6L,QAAUlJ,EAAEkJ,IAGrBmb,QAAS,SAASnb,EAAS3E,GAClB2E,EAAQU,GAAG,aACZV,EAAQe,IAAI,CAAEC,QAAShB,EAAQgC,KAAK,eAAiB,UAAWjB,IAAI,WAGpE1F,EAAQiG,MACRtB,EAAQgC,KAAK,aAAchC,EAAQe,IAAI,YAAYO,OAGnDjG,EAAQiB,MACRjB,EAAQiB,OAGRjB,EAAQ0f,kBACR1f,EAAQ0f,iBAAiB/a,GAG7BA,EAAQsb,WAGZC,QAAS,WACLpnB,KAAKinB,SAAU,EACfjnB,KAAKgnB,QAAUhnB,KAAKqnB,aAGxBC,OAAQ,WACJtnB,KAAKinB,SAAU,EACfjnB,KAAKgnB,QAAUhnB,KAAKunB,mBAI5BhB,GAAQc,YAAcd,GAAQS,QAsExB,iBAAkBrkB,EAAEoF,IACtBhF,EAAOJ,EAAEoF,GAAI,CACTyf,UAAW,SAASC,EAAYC,GAC5B,OAAO1nB,KAAK2nB,KAAKF,EAAYC,IAGjCE,aAAc,SAAS1gB,EAASuf,EAAU3Q,EAAS4Q,GAC/C,OAAOG,GAAQ7mB,KAAMkH,EAASuf,EAAU3Q,EAAS4Q,IAGrDmB,cAAe,SAASC,EAAS5gB,GAC7B,OAAOvG,EAAMonB,YAAY/nB,KAAM8nB,EAAS5gB,GAAS,IAGrD8gB,iBAAkB,SAASF,EAAS5gB,GAChC,OAAOvG,EAAMonB,YAAY/nB,KAAM8nB,EAAS5gB,GAAS,IAErD+gB,iBAAkB,SAASH,EAAS5gB,EAASghB,GACzC,OAAOvnB,EAAMonB,YAAY/nB,KAAM8nB,EAAS5gB,EAASghB,MAK7D,IAAIC,GAAY,KACZC,GAAW,KACXC,GAAc,KACdC,GAAa,KACbC,GAAW,KAsBf,IAAIC,GAAc,SAAS7jB,GACvB,OAAOA,EAAE2C,QAGT/D,EAAQib,QAERgK,GAAc,SAAS7jB,GACnB,IAAI8jB,EAAU,kBAAmB9jB,EAAIA,EAAE+jB,cAAcC,eAAiB,mBAAoBhkB,EAAIA,EAAEgkB,eAAiB,KAEjH,OAAOF,EAAUrZ,SAASwZ,iBAAiBH,EAAQ,GAAGI,QAASJ,EAAQ,GAAGK,SAAWnkB,EAAE2C,QAG3FtE,EAAK,CAAC,QAAS,YAAa,aAAc,UAAW,YAAa,YAAa,QAAQ,SAASgC,EAAG0D,GAC/F/F,EAAEoF,GAAGW,GAAS,SAASqgB,GACnB,OAAO/oB,KAAKgpB,GAAGtgB,EAAOqgB,QAK9BxlB,EAAQib,MACHjb,EAAQmf,UAQTnf,EAAQ0lB,UAAY,aACpB1lB,EAAQ2lB,QAAU,WAClB3lB,EAAQ4lB,UAAY,YACpB5lB,EAAQ6lB,YAAc,cACtB7lB,EAAQ8lB,MAAQ,WAChB9lB,EAAQ+lB,OAAS,sBAZjB/lB,EAAQ0lB,UAAY,uBACpB1lB,EAAQ2lB,QAAU,mBAClB3lB,EAAQ4lB,UAAY,sBACpB5lB,EAAQ6lB,YAAc,yBACtB7lB,EAAQ8lB,MAAQ,QAChB9lB,EAAQ+lB,OAAS,UASd/lB,EAAQ6iB,UACf7iB,EAAQ4lB,UAAY,cACpB5lB,EAAQ0lB,UAAY,cACpB1lB,EAAQ2lB,QAAU,YAClB3lB,EAAQ6lB,YAAc,gBACtB7lB,EAAQ8lB,MAAQ,YAChB9lB,EAAQ+lB,OAAS,4BACV/lB,EAAQ2iB,YACf3iB,EAAQ4lB,UAAY,gBACpB5lB,EAAQ0lB,UAAY,gBACpB1lB,EAAQ2lB,QAAU,cAClB3lB,EAAQ6lB,YAAc,kBACtB7lB,EAAQ8lB,MAAQ,cAChB9lB,EAAQ+lB,OAAS,6BAEjB/lB,EAAQ4lB,UAAY,YACpB5lB,EAAQ0lB,UAAY,YACpB1lB,EAAQ2lB,QAAU,UAClB3lB,EAAQ6lB,YAAc,aACtB7lB,EAAQ8lB,MAAQ,QAChB9lB,EAAQ+lB,OAAS,UAGrB,IA4BAC,GAAa,mBAEbxmB,EAAOpC,EAAO,CACV6oB,QAAS,GACTC,2BAA4B,GAC5BC,GAAI/oB,EAAM+oB,IAAM,GAChBC,GAAIhpB,EAAMgpB,IA9Pd,SAAY9d,GACR,OAAO,IAAIlL,EAAM4lB,QAAQW,QAAQrb,IA8PjC0a,QAAS5lB,EAAM4lB,SAAWA,GAC1BqD,OAAQjpB,EAAMipB,QAAU,GACxB/b,KAAMlN,EAAMkN,MAAQ,GACpBgc,QAASlpB,EAAMkpB,SAAW,GAC1BC,QAASnpB,EAAMmpB,SAAW,GAC1BC,YAAa,CAAEC,SAAU,IACzBC,KAAM,CACFC,OAAQ,GACRC,OAAQ,GACRC,UAAW,EACXC,IAAK,EACLC,MAAO,GACPC,IAAK,GACLC,KAAM,GACNC,GAAI,GACJC,MAAO,GACPC,KAAM,GACNC,IAAK,GACLC,KAAM,GACNC,SAAU,GACVC,OAAQ,GACRC,SAAU,GACVC,GAAI,IACJC,IAAK,IACLC,IAAK,IACLC,YAAa,IACbC,aAAc,IACdC,WAAY,KAEhB/nB,QAAS5C,EAAM4C,SAAWA,EAC1BsjB,QAASlmB,EAAMkmB,SAAWA,GAC1B0E,GAAI,GACJxI,KAAM,SAASra,GACX,MAAO,QAAU/H,EAAM4qB,GAAK7iB,GAEhC8iB,WAvgCJ,SAAoB3f,GAChB,IAAI4f,EAAS5f,EAAQe,IAAIjM,EAAM4C,QAAQmb,YAAY9R,IAAM,eAAiBf,EAAQe,IAAI,cAClF8e,EAASD,GAASA,EAAOtb,MAAMzM,IAAwC,CAAE,EAAG,EAAG,EAAG,EAAG,GACrFioB,EAAOvoB,EAAKwV,KAAM8S,EAAO,KAAOA,EAAO,IAAM,IAEjD,MAAO,CACHE,MAAQF,EAAO,GAAMC,EACrBE,OAASH,EAAO,GAAMC,EACtBG,QAAUJ,EAAO,GAAMC,IAggC3BI,KA5/BJ,SAAclgB,EAASC,EAAUwd,GAC7B,IAAI0C,EACAjgB,EAAapL,EAAMqL,YACnBC,EAActL,EAAMuL,aACpBC,EAASN,EAAQM,SACjB8f,EAAmBlgB,EAAWjL,GAIlC,GAFAqL,EAAOA,SAAS+f,YAAY,4BAEvB/f,EAAOggB,SAAS,+BAkCjBvgB,GAAWC,EAASC,OAlC6B,CACjD,IAAIkB,EAAQnB,EAAQ,GAAGY,MAAMO,MACzBL,EAASd,EAAQ,GAAGY,MAAME,OAC1Byf,EAAe5oB,EAAcuJ,KAAKC,GAClCqf,EAAgB7oB,EAAcuJ,KAAKJ,GACnC2f,EAAazgB,EAAQsgB,SAAS,cAAgBtgB,EAAQU,GAAG,qCAE7Dyf,EAAaI,GAAgBC,GAExBD,KAAkBtgB,GAAaA,GAAYkB,GAAUsf,KAAetf,EAAQlB,EAAWC,EAAWF,GAAW,EAAIE,EAAWF,MAC5HwgB,KAAmBvgB,GAAaA,GAAYa,IAAYd,EAAQU,GAAG,wCAAwCI,EAASV,EAAYJ,IAErIA,EAAQkgB,KACJppB,EAAE,UACD2hB,SAAS,+BACT1X,IAAI,CACDI,MAAOA,EACPL,OAAQA,MAEhBR,EAASN,EAAQM,UAEV4f,KACMppB,EAAE,UACD2hB,SAAS,yBACTvB,KAAK,OAAQ,WAGvBiJ,GACAngB,EAAQe,IAAI,CACRI,MAAO,OACPL,OAAQ,SAkBpB,OATIsf,EAAmBlgB,EAFvBI,EAASA,EAAOA,YAGZA,EAAOmY,SAAS,4BAChBgF,GAAS,GAGTA,GACA1d,GAAWC,EAASC,GAGjBK,GAo8BP3D,WAAYA,GACZwG,kBAAmBA,GACnBud,aA5yBJ,SAAsB1gB,GAClB,GAAiD,UAA7CA,EAAQ2gB,QAAQ7rB,EAAM4qB,GAAK,cAC3B,OAAO,EAGX,GAAI1f,GAAWA,EAAQ4gB,WAA2C,iBAAvB5gB,EAAiB,WAAkBA,EAAQ4gB,UAAU9W,QAAQ,sBAAwB,EAC5H,OAAO,EAGX,IAAI+W,EAAW1d,GAAkBnD,EAAS,CAAC,aAAa6gB,SACxD,OAAOA,EAAS/W,QAAQ,SAAW,GAAK+W,EAAS/W,QAAQ,WAAa,GAmyBtEgX,WAhyBJ,SAASA,EAAW9gB,EAASnD,GACzB,IAGIkkB,EAAIvO,EAHJuD,EAASre,EAAQwe,QAAQH,OACzBiL,EAAStpB,EAAQwe,QAAQuB,QACzBwJ,EAAiBvpB,EAAQwe,QAAQvf,QAGrC,GAAIqJ,aAAmBlJ,GAAK+F,IAAU9F,EAClCiJ,EAAQ7I,MAAK,SAASuE,EAAG5C,GACrBgoB,EAAWhoB,EAAG+D,WAQtB,GAHIkkB,EAAK/gB,aAAmBlJ,EAAIkJ,EAAQ,GAAKA,EAG7C,CAQA,GAJAwS,EAAQ9a,EAAQ8a,MAAMxS,GAIlBnD,IAAU9F,EASV,OAAIyb,GAASuD,IAAWkL,EAAiB,IAAMvpB,EAAQwe,QAAQoB,QACpDyJ,EAAGzO,YAAcyO,EAAGxI,YAAcwI,EAAGD,WAErCtpB,KAAK6T,IAAI0V,EAAGD,YAXnBtO,GAASuD,IAAWkL,EAAiB,IAAMvpB,EAAQwe,QAAQoB,QAC3DyJ,EAAGD,WAAaC,EAAGzO,YAAcyO,EAAGxI,YAAc1b,EAElDkkB,EAAGD,WADItO,IAAUwO,GAAUjL,IAAWlZ,EAAQ,GAC7BA,EAEDA,IAmwBxB+G,KAjWJ,SAAcsd,GACV,IAAgBxb,EAAZgF,EAAS,EACb,IAAKhF,KAAOwb,EACJA,EAAIre,eAAe6C,IAAe,UAAPA,GAC3BgF,IAIR,OAAOA,GA0VP5H,YAAaA,GACbqe,UAx1BJ,SAAmBpe,GACf,OAAOA,EAAInM,QAAQ,iBAAiB,SAASoS,GACzC,OAAOA,EAAE/J,OAAO,GAAK,IAAM+J,EAAE/J,OAAO,GAAGwN,kBAu1B3C2U,UAAWtsB,EAAMssB,WAzVrB,SAAmBphB,EAASnG,EAAMwnB,GACzBxnB,IACDA,EAAO,UAGX,IAAIqX,EAASlR,EAAQnG,KAEjB6Q,EAAS,CACT8N,IAAKtH,EAAOsH,IACZwH,MAAO9O,EAAO8O,MACdC,OAAQ/O,EAAO+O,OACfF,KAAM7O,EAAO6O,MAIjB,GAAIroB,EAAQwe,QAAQsB,OAAS9f,EAAQ6iB,UAAY7iB,EAAQ2iB,cAAgBgH,EAAY,CACjF,IAAI1W,EAAOjT,EAAQ8a,MAAMxS,GAAW,GAAK,EAEzC0K,EAAO8N,KAAQvjB,EAAOqsB,YAAe/d,SAASiK,gBAAyB,UACvE9C,EAAOqV,MAAS9qB,EAAOssB,YAAe5W,EAAOpH,SAASiK,gBAAgBsT,WAG1E,OAAOpW,GAoUP8W,aAAc1sB,EAAM0sB,cAtTxB,SAAsB7I,GAClB,IAAI+B,EAAU,GAMd,OAJAvjB,EAAuB,iBAAVwhB,EAAqBA,EAAM5Z,MAAM,KAAO4Z,GAAQ,SAAS5a,GAClE2c,EAAQ3c,GAAO5J,QAGZumB,GAgTPwB,YAAapnB,EAAMonB,aAxMvB,SAAqBlc,EAASic,EAAS5gB,EAAS+F,GAS5C,OARI6a,IACAA,EAAUA,EAAQld,MAAM,KAExB5H,EAAK8kB,GAAS,SAASle,EAAKlB,GACxBmD,EAAQkc,YAAYrf,EAAOuE,OAI5BpB,GAgMPyhB,WAAY3sB,EAAM2sB,YAnUL,CACb1B,KAAM,CAAE9V,QAAS,SACjB+V,MAAO,CAAE/V,QAAS,QAClByX,KAAM,CAAEzX,QAAS,MACjB0X,GAAI,CAAE1X,QAAS,QACfuO,IAAK,CAAEvO,QAAS,UAChBgW,OAAQ,CAAEhW,QAAS,OACnB2X,GAAM,CAAE3X,QAAS,OACjB4X,IAAK,CAAE5X,QAAS,OA4ThBxM,WAAYA,EACZ1B,MAAOA,EACP/E,SAAUA,EACVgN,SAAUhN,EAASkN,QAAQvG,KAAK3G,GAChC+M,OAAQ/M,EAAS+M,OAAOpG,KAAK3G,GAC7B2P,UAAWlP,EAAKkP,UAAUhJ,KAAKlG,GAC/BklB,YAAaA,GACbmF,WAzKJ,SAAoBjlB,GAChB,OAAQ,GAAKA,GAAOjG,QAAQ0lB,GAAW,SAAS1lB,QAAQ2lB,GAAU,QAAQ3lB,QAAQ8lB,GAAU,QAAQ9lB,QAAQ4lB,GAAa,UAAU5lB,QAAQ6lB,GAAY,UAyKvJsF,SAtKJ,SAAkBllB,GACd,IAAImH,EAEJ,IACIA,EAAW/O,EAAO+sB,mBAAmBnlB,GACvC,MAAOolB,GAILje,EAAWnH,EAAMjG,QAAQ,kCAAkC,SAASsrB,EAAGC,EAAIC,GACvE,OAAOnc,OAAOoc,aAAajV,SAAS,MAAQ+U,GAAMC,GAAK,QAI/D,OAAOpe,GAyJPse,WAAY,SAASC,GACjB,OAAOA,IAAQ7E,GAAWxc,KAAKqhB,IAEnC7tB,WAAYA,EAEZ8tB,KAAM,SAASC,EAAYC,EAAM7e,GAuB7B,cApBW6e,GAAQroB,IACfwJ,EAAY6e,EACZA,GAAO,GAGX7e,EAAYA,GAAa,KAPzB4e,EAAaA,GAAc,KASgB,MAAzBA,EAAWxjB,OAAO,KAChCwjB,EAAa,IAAMA,GAGnBC,GAGAD,EAlHS,SAASE,EAAS9e,GACnC,IACIqJ,EACAnP,EACApC,EACAM,EAJAyO,EAAS7G,GAAa,IAKtBoL,EAAQ,EAEZ,IAAKlR,EAAM,EAAGpC,EAASgnB,EAAQhnB,OAAQoC,EAAMpC,EAAQoC,IAElC,MADf9B,EAAS0mB,EAAQ5kB,MAIC,KAFdmP,EAAQjR,EAAO6N,QAAQ,SAGL,GAAVoD,EACAjR,EAAS,IAAMA,GAEfgT,IACAhT,EAAS,IAAMA,EAAOkD,UAAU,EAAG+N,GAAS,UAAYjR,EAAOkD,UAAU+N,KAIjF+B,IACAvE,GAAUzO,GAAW8B,EAAMpC,EAAS,EAAK,UAAY,MAG7D,OAAO,IAAItE,MAAM4X,GAAOjQ,KAAK,KAAO0L,EAwFfkY,EADbH,GADAA,EAAaA,EAAW7rB,QAAQ,sBAAsB,kBAC9BA,QAAQ,sBAAsB,kBACfmI,MAAM,KAAM8E,GACnD4e,EAAaA,EAAW7rB,QAAQ,aAAc,MAE9C6rB,EAAa5e,EAAY4e,EAGtBA,GAGXI,YAAa,SAAUJ,EAAYC,GAE/B,IACII,EAAS,GAOb,OATAL,EAAaA,GAAc,IAIhB7rB,QAHO,uDAGc,SAAUsrB,EAAGhV,EAAO6V,EAAe5J,GAE/D,OADA2J,EAAOhtB,KAAKhB,EAAM8H,UAAUsQ,GAASA,EAAS6V,GAAiB5J,GACxDpiB,KAGJ+rB,GAGXE,OAAQ,SAASP,EAAYC,GACzB,IAAIhd,EAAM+c,EAAaC,EAEvB,OAAO7nB,EAAY6K,GAAO7K,EAAY6K,IAAQ,SAAWwb,GAIrD,IAHA,IAAI4B,EAAShuB,EAAM+tB,YAAYJ,EAAYC,GAEvChY,EAASwW,EACJnjB,EAAM,EAAGA,EAAM+kB,EAAOnnB,OAAQoC,IAEnC,GADA2M,EAASA,EAAOoY,EAAO/kB,KAClBjJ,EAAM8H,UAAU8N,IAAWgY,EAC5B,OAAOhY,EAIf,OAAOA,IAIfuY,OAAQ,SAASR,GACb,OAAO3nB,EAAY2nB,GAAc3nB,EAAY2nB,IAAe,SAAWvB,EAAKrkB,GACxE,IAAIimB,EAAShuB,EAAM+tB,YAAYJ,GAE3BS,EAAc,SAAUC,GACxB,IAAI7iB,EAAS6iB,EAAI7iB,OACb8iB,EAAMD,EAAIC,IACVC,EAAOF,EAAIE,KACXC,EAAQH,EAAIG,MAEZA,EAAM3nB,QACN2E,EAASA,EAAOgjB,EAAMtZ,SACtBkZ,EAAY,CAAE5iB,OAAQA,EAAQ8iB,IAAKA,EAAKC,KAAMA,EAAMC,MAAOA,KAE3DhjB,EAAO+iB,GAAQD,GAIvBF,EAAY,CACR5iB,OAAQ4gB,EACRkC,IAAKvmB,EACLwmB,KAAMP,EAAOS,MACbD,MAAOR,MAKnBU,SAAU,SAASf,GACf,MAAO,CACHgB,IAAK3uB,EAAMkuB,OAAOP,GAClBiB,IAAK5uB,EAAMmuB,OAAOR,KAI1BkB,KAAM,WACF,IAAajoB,EAAGkoB,EAAZC,EAAK,GAAeC,EAAQ,SAIhC,IAFAD,GAAMC,EAAMtsB,KAAKkN,MAAMlN,KAAKosB,SAAWpsB,KAAKkN,MAAMof,EAAMnoB,UAEnDD,EAAI,EAAGA,EAAI,GAAIA,IAChBkoB,EAAyB,GAAhBrsB,EAAKqsB,SAAgB,EAErB,GAALloB,GAAe,IAALA,GAAgB,IAALA,GAAgB,IAALA,IAChCmoB,GAAM,KAEVA,IAAY,IAALnoB,EAAU,EAAU,IAALA,EAAoB,EAATkoB,EAAa,EAAKA,GAASve,SAAS,IAGzE,OAAOwe,GAGXE,aAAc,SAASC,GACnB,OAAOA,EAAKptB,QAAQ,SAAU,IAAM9B,EAAMoiB,KAAK,QAAU,SAASnc,MAAM,GAAI,IAGhFkpB,kBAAmB,SAASC,GACxB,IAAIC,EAAYD,EAAWnlB,MAAM,KAEjC,GAAIolB,EACA,IAAK,IAAIzoB,EAAI,EAAGA,EAAIyoB,EAAUxoB,OAAQD,IACd,QAAhByoB,EAAUzoB,KACVyoB,EAAUzoB,GAAKyoB,EAAUzoB,GAAG9E,QAAQ,8BAA+B,UAK/E,OAAOutB,EAAUnlB,KAAK,KAAKpI,QAAQ,SAAU,oBAAoBmE,MAAM,GAAI,IAG/EqpB,iBAAkB,SAAStrB,GACvB,MAAO,mCAAqCoI,KAAKpI,EAAE2C,OAAO4oB,UAG9DC,mBAAoB,SAASpH,GACzB,IAAK,IAAIxhB,EAAI,EAAG6oB,EAAMzvB,EAAM6oB,QAAQhiB,OAAQD,EAAI6oB,EAAK7oB,IACjDwhB,EAASpoB,EAAM6oB,QAAQjiB,IAG3B5G,EAAM8oB,2BAA2B9nB,KAAKonB,IAG1CsH,aAAc,SAASC,EAAS5qB,GAC5B,IAAIiL,EAAU7P,EAAO6P,SAEhBhQ,EAAM4vB,kBAAkC,IAAb,GAA4B5f,EAAQ6f,KAChE7f,EAAQjL,GAAQ,OAAO4qB,MAKnC,IAAIG,GAASnnB,EAAWvG,OAAQ,CAC5BoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAIe,EAAOjI,KAi8Ef0wB,eAAeC,gBAAgBxuB,GA77E3B8F,EAAK4D,QAAUlL,EAAM+G,OAAOmE,GAAS/B,QAAQ7B,GAE7CA,EAAK2oB,QAAQ,OAAQ1pB,GAErBoC,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExB,IACIknB,EADA0B,EAAa3pB,EAAUA,EAAQ2pB,WAAa,KAG5C3pB,IACAioB,GAASlnB,EAAK6oB,gBAAkB,KAAK5pB,GAAW,IAAI6pB,gBAGpDF,IAEA3pB,EAAUnE,EAAO,GAAImE,EAAS,CAAE2pB,WAAY,MAGhD3pB,EAAUe,EAAKf,QAAUnE,GAAO,EAAM,GAAIkF,EAAKf,QAASe,EAAKrH,SAAUuuB,GAAS,GAAIjoB,GAEhF2pB,IACA3pB,EAAQ2pB,WAAaA,GAGpB5oB,EAAK4D,QAAQkX,KAAKpiB,EAAMoiB,KAAK,UAC9B9a,EAAK4D,QAAQkX,KAAKpiB,EAAMoiB,KAAK,SAAU7b,EAAQ9E,MAAQ,IAAIkW,eAG/DrQ,EAAK4D,QAAQgC,KAAK,QAAU3G,EAAQ8X,OAAS9X,EAAQ9E,KAAM6F,GAE3DA,EAAKuB,KAAKvB,EAAKoC,OAAQnD,IAG3BmD,OAAQ,GAERnD,QAAS,CACL8X,OAAQ,IAGZgS,kBAAmB,WACf,QAAShxB,KAAK6L,QAAQ,GAAGolB,oBAG7BC,UAAW,SAAS5pB,GAChBA,EAASA,GAAUtH,KAAKoM,QAExB,IAAIP,EAAU7L,KAAK6L,QACfslB,EAAW,WACXC,EAAW9pB,EAAOyb,KAAKoO,IAAatlB,EAAQkX,KAAKoO,GAErDtlB,EAAQwlB,WAAWF,GAEnB7pB,EAAOyb,KAAKoO,EAAWroB,MAAMsoB,GAAuB,EAAXA,IAG7CE,WAAY,SAASpqB,GACjBlH,KAAKuxB,iBAAiBrqB,GACtBlH,KAAKwxB,WAAWtqB,GAChBvE,EAAEI,OAAO/C,KAAKkH,QAASA,GACvBlH,KAAKyxB,oBAGTD,WAAY,SAAStqB,GAMjB,IALA,IAGIvC,EAHAsD,EAAOjI,KACP4J,EAAM,EACNpC,EAASS,EAAKoC,OAAO7C,OAGlBoC,EAAMpC,EAAQoC,IACjBjF,EAAIsD,EAAKoC,OAAOT,GACZ3B,EAAKf,QAAQvC,IAAMuC,EAAQvC,KAC3BsD,EAAKgC,OAAOtF,EAAGsD,EAAKf,QAAQvC,IACxBsD,EAAKsB,SAAWtB,EAAKsB,QAAQ5E,WACtBsD,EAAKsB,QAAQ5E,IAKhCsD,EAAKuB,KAAKvB,EAAKoC,OAAQnD,IAG3BoiB,OAAQ,SAASoI,GACb,IAAIjiB,EAAOzP,KAAK2xB,UACZC,EAAc5xB,KAAK6xB,OAEnBH,IAAUjiB,EAAKzC,MAAQ,GAAKyC,EAAK9C,OAAS,MAAQilB,GAAeniB,EAAKzC,QAAU4kB,EAAY5kB,OAASyC,EAAK9C,SAAWilB,EAAYjlB,WACjI3M,KAAK6xB,MAAQpiB,EACbzP,KAAK8xB,QAAQriB,EAAMiiB,GACnB1xB,KAAKoK,QAAQ,SAAUqF,KAI/BkiB,QAAS,WACL,OAAOhxB,EAAMoxB,WAAW/xB,KAAK6L,UAGjC4D,KAAM,SAASA,GACX,IAAKA,EACD,OAAOzP,KAAK2xB,UAEZ3xB,KAAKgyB,QAAQviB,IAIrBuiB,QAASrvB,EAAEQ,KACX2uB,QAASnvB,EAAEQ,KAEXnB,QAAS,WACL,IAAIiG,EAAOjI,KAEXiI,EAAK4D,QAAQomB,WAAW,QAAUhqB,EAAKf,QAAQ8X,OAAS/W,EAAKf,QAAQ9E,MACrE6F,EAAK4D,QAAQomB,WAAW,WACxBhqB,EAAKgC,UAETioB,SAAU,WACNlyB,KAAKgC,WAET4uB,QAAS,aAETuB,mBAAoB,SAASpJ,GACzB/oB,KAAKoyB,aAAc,EAEnBrJ,EAASxe,KAAKvK,MAEdA,KAAKoyB,aAAc,GAGvBX,iBAAkB,SAAS5lB,GACvB,IAIItE,EAAG2nB,EAAMmD,EAAWC,EAJpBC,EAAevyB,KAAKwyB,UAAUtrB,QAC9BA,EAAUlH,KAAKkH,QACf0lB,EAAK/gB,GAAW7L,KAAKoM,SAAWpM,KAAK6L,QACrCic,EAAU,GAGd,GAAKnnB,EAAM8xB,cAAcC,mBAAmBH,EAAanwB,MAAzD,CAIA,IAAKmF,EAAI,EAAGA,EAAIV,EAAmBW,OAAQD,IACvC2nB,EAAOroB,EAAmBU,GAC1B+qB,EAAatyB,KAAKkH,QAAQyrB,UAAYJ,EAAanwB,KAE/CmwB,EAAa7jB,eAAewgB,KACf,eAATA,GACAmD,EAAY1xB,EAAM8xB,cAAcG,cAAc,CAC1CC,OAAQP,EACRQ,SAAU,WACVpqB,MAAOxB,EAAQ6rB,aAGFV,EAAU7qB,QACvBsgB,EAAQnmB,KAAKhB,EAAM8xB,cAAcG,cAAc,CAC3CC,OAAQP,EACRQ,SAAU5D,EACVxmB,MAAOxB,EAAQgoB,GACf8D,KAAM9rB,EAAQ6rB,YAItBjL,EAAQnmB,KAAKhB,EAAM8xB,cAAcG,cAAc,CAC3CC,OAAQP,EACRQ,SAAU5D,EACVxmB,MAAOxB,EAAQgoB,OAM/BtC,EAAGtI,SAASwD,EAAQjd,KAAK,QAG7BooB,WAAY,SAAS3rB,GACjB,IAMI4rB,EALAC,EADOnzB,KACS6L,QAChBunB,EAAUD,EAASpQ,KAAK,MACxBsQ,EAAW1wB,EAAE,cAAiBywB,EAAU,MACxCE,EAAYH,EAASpQ,KAAKtc,GAC1B8sB,EAAiBJ,EAASpQ,KAAKvc,GAG/Bc,EAAO,KAAO6rB,EAAS,KAIvBG,EACAhsB,EAAOyb,KAAKtc,EAAY6sB,GACjBC,EACPjsB,EAAOyb,KAAKvc,EAAiB+sB,GACtBF,EAAS7rB,SAChB0rB,EAAUG,EAAStQ,KAAK,OAjBjB/iB,KAiB+BwzB,iBAAiBH,EAAUD,GAAWzyB,EAAM6uB,QAClFloB,EAAOyb,KAAKvc,EAAiB0sB,MAIrC3B,iBAAkB,SAASkC,EAAY5nB,GACnC,IAGItE,EAAG2nB,EAAMoD,EAHTC,EAAevyB,KAAKwyB,UAAUtrB,QAC9BwsB,EAAiB1zB,KAAKkH,QACtB0lB,EAAK/gB,GAAW7L,KAAKoM,SAAWpM,KAAK6L,QAGzC,GAAKlL,EAAM8xB,cAAcC,mBAAmBH,EAAanwB,MAIzD,IAAKmF,EAAI,EAAGA,EAAIV,EAAmBW,OAAQD,IACvC2nB,EAAOroB,EAAmBU,GAC1B+qB,EAAatyB,KAAKkH,QAAQyrB,UAAYJ,EAAanwB,KAE/CmwB,EAAa7jB,eAAewgB,IAASuE,EAAW/kB,eAAewgB,KAClD,eAATA,EACAtC,EAAGV,YAAYvrB,EAAM8xB,cAAcG,cAAc,CAC7CC,OAAQP,EACRQ,SAAU5D,EACVxmB,MAAOgrB,EAAexE,GACtB8D,KAAMU,EAAeX,aAGZ,aAAT7D,GACAtC,EAAGV,YAAYvrB,EAAM8xB,cAAcG,cAAc,CAC7CC,OAAQP,EACRQ,SAAU,aACVpqB,MAAOgrB,EAAeC,WACtBX,KAAMU,EAAeX,YAI7BnG,EAAGV,YAAYvrB,EAAM8xB,cAAcG,cAAc,CAC7CC,OAAQP,EACRQ,SAAU5D,EACVxmB,MAAOgrB,EAAexE,SAO1CsE,iBAAkB,SAASI,EAAOR,GAC9B,IAAIF,EAAUE,EAhlGJ,SAolGV,OAFAQ,EAAM7Q,KAAK,KAAMmQ,GAEVA,KAIXW,GAAkBpD,GAAO1tB,OAAO,CAEhC+wB,UAAW,WACP,OAAO9zB,KAAK6wB,WAAWkD,YAG3BC,cAAe,SAASC,GACpB,IAAIhsB,EAAOjI,KACXiI,EAAK2oB,QAAQqD,GAAK,WACd,MAAO,CACHC,SAAUjsB,EAAKksB,QACftmB,KAAMlL,EAAE2X,IAAIrS,EAAK6rB,aAAa,SAASM,GACnC,MAAO,CAAEA,SAAUA,aAOvCzzB,EAAMoxB,WAAa,SAASlmB,EAASkmB,GACjC,IAAIsC,EAAaxoB,EAAQ,GAMzB,OAJIkmB,GACAlmB,EAAQe,IAAImlB,GAGT,CAAE/kB,MAAOqnB,EAAWnW,YAAavR,OAAQ0nB,EAAWC,eAG/D3zB,EAAM4zB,OAASpxB,EAEf,IAAIqxB,GAAiB,aACjBC,GAAa,oDACbC,GAAmB,wCACnBC,GAAa,WAEjB,SAASC,GAAY/oB,EAASgpB,GAC1B,IAAInsB,EAUJ,GAR+B,IAA3BmsB,EAAOlf,QAAQ,UAEfkf,GADAA,EAASA,EAAO7pB,UAAU,IACVF,OAAO,GAAGwN,cAAgBuc,EAAO7pB,UAAU,IAG/D6pB,EAASA,EAAOpyB,QAAQkyB,GAAY,OAGtB,QAFdjsB,EAAQmD,EAAQipB,aAAa,QAAUn0B,EAAM4qB,GAAKsJ,IAG9CnsB,EAAQ9F,OACL,GAAc,SAAV8F,EACPA,EAAQ,UACL,GAAc,SAAVA,EACPA,GAAQ,OACL,GAAc,UAAVA,EACPA,GAAQ,OACL,GAAI/E,EAAaoJ,KAAKrE,IAAoB,QAAVmsB,GAA8B,UAAVA,EACvDnsB,EAAQK,WAAWL,QAChB,GAAI+rB,GAAW1nB,KAAKrE,KAAWgsB,GAAiB3nB,KAAKrE,GACxD,IACIA,EAAQpF,EAAKyxB,MAAMrsB,GACrB,MAAOolB,GAELplB,EAAQ,IAAI2H,SAAS,WAAa3H,EAAQ,IAAlC,GAIhB,OAAOA,EAGX,SAASssB,GAAanpB,EAAS3E,EAASoG,GACpC,IACIunB,EACAnsB,EAFA6N,EAAS,GAGTsZ,EAAOhkB,EAAQipB,aAAa,QAAUn0B,EAAM4qB,GAAK,QAErD,IAAKsJ,KAAU3tB,GACXwB,EAAQksB,GAAY/oB,EAASgpB,MAEfjyB,IAEN4xB,GAAeznB,KAAK8nB,IAAmB,UAARhF,IACV,iBAAVnnB,EACH/F,EAAE,IAAM+F,GAAOlB,OACfkB,EAAQ/H,EAAMkP,SAASlN,EAAE,IAAM+F,GAAOoH,QAC/BxC,IACP5E,EAAQ/H,EAAMkP,SAASvC,EAAO5E,KAGlCA,EAAQmD,EAAQipB,aAAaD,IAIrCte,EAAOse,GAAUnsB,GAIzB,OAAO6N,EAqIX,SAAS0e,GAAoB/vB,EAAGggB,GAC5B,OAAOviB,EAAEuyB,SAAShwB,EAAGggB,IAAM,EAAI,EAGnC,SAASiQ,KACL,IAAItC,EAASlwB,EAAE3C,MACf,OAAQ2C,EAAEyyB,QAAQvC,EAAO9P,KAAK,QAAUpiB,EAAM4qB,GAAK,QAAS,CAAC,SAAU,cAAe,gBAAkB,GAAMsH,EAAOtmB,GAAG,YAxI5H5L,EAAM00B,WAAa,SAASxpB,EAAS3E,EAASouB,GAC1C,IAAI/e,EACAse,EACAhC,EACAjpB,EACApC,EACAqoB,EACAnnB,EACAmoB,EACA0E,EACAC,EAaJ,GAVKF,EAEMA,EAAMA,QACbA,EAAQA,EAAMA,OAFdA,EAAQ30B,EAAM+oB,GAAG4L,MAOrBzF,GAFAhkB,EAAUA,EAAQ4pB,SAAW5pB,EAAUA,EAAQ,IAEhCipB,aAAa,QAAUn0B,EAAM4qB,GAAK,QAEjD,CAWIsH,GAPJ0C,GAAkC,IAAvB1F,EAAKla,QAAQ,MAOX2f,EAAMzF,GAENlvB,EAAMkuB,OAAOgB,EAAblvB,CAAmBG,GAGhC,IAAI+M,EAAOlL,EAAEkJ,GAASgC,OAClB6nB,EAAY7C,EAAS,QAAUA,EAAO9qB,GAAGb,QAAQ8X,OAAS6T,EAAO9qB,GAAGb,QAAQ9E,KAAO,GAQvF,IAAK,IAAImP,KALLikB,EADAD,EACkB,IAAItnB,OAAO,WAAa4hB,EAAO,IAAK,KAEpC,IAAI5hB,OAAO,IAAMynB,EAAY,IAAK,KAGxC7nB,EACZ,GAAI0D,EAAIpB,MAAMqlB,GAAkB,CAE5B,GAAIjkB,IAAQmkB,EAGR,OAAO7nB,EAAK0D,GAFZgF,EAAS1I,EAAK0D,GAO1B,GAAKshB,EAAL,CAgBA,IAZAhC,EAAa+D,GAAY/oB,EAAS,cAElC3E,EAAUvE,EAAEI,OAAO,GAAIiyB,GAAanpB,EAASlJ,EAAEI,OAAO,GAAI8vB,EAAO9qB,GAAGb,QAAS2rB,EAAO9qB,GAAGnH,WAAasG,GAEhG2pB,IAEI3pB,EAAQ2pB,kBADDA,IAAe3qB,EACDvF,EAAMkuB,OAAOgC,EAAblwB,CAAyBG,GAEzB+vB,GAIxBjnB,EAAM,EAAGpC,EAASqrB,EAAO9qB,GAAGsC,OAAO7C,OAAQoC,EAAMpC,EAAQoC,KAG1DlB,EAAQksB,GAAY/oB,EAFpBgpB,EAAShC,EAAO9qB,GAAGsC,OAAOT,OAIZhH,IACVsE,EAAQ2tB,GAAUl0B,EAAMkuB,OAAOnmB,EAAb/H,CAAoBG,IAU9C,OANKyV,EAEO5T,EAAEgzB,cAAczuB,IACxBqP,EAAO+a,WAAWpqB,GAFlBqP,EAAS,IAAIsc,EAAOhnB,EAAS3E,GAK1BqP,KAGX5V,EAAMi1B,oBAAsB,SAASC,GACjC,IACIjsB,EACApC,EAFA8tB,EAAQ,GAQZ,IAJKO,EAAW,KACZA,EAAa,CAACl1B,EAAM+oB,GAAI/oB,EAAMkpB,QAAQH,KAGrC9f,EAAM,EAAGpC,EAASquB,EAAWruB,OAAQoC,EAAMpC,EAAQoC,IACpD0rB,EAAM1rB,GAAOisB,EAAWjsB,GAAK0rB,MAGjC,OAAOvyB,EAAOqF,MAAM,KAAM,CAAC,IAAIgV,OAAOkY,EAAMxf,aAGhDnV,EAAMwH,KAAO,SAAS0D,GAClB,IAAIypB,EAAQ30B,EAAMi1B,oBAAoBhvB,EAAM2D,KAAKlD,UAAW,IAE5D1E,EAAEkJ,GAASiqB,KAAK,SAAWn1B,EAAM4qB,GAAK,SAASwK,UAAU/yB,MAAK,WAC1DrC,EAAM00B,WAAWr1B,KAAM,GAAIs1B,OAInC30B,EAAMqB,QAAU,SAAS6J,GACrBlJ,EAAEkJ,GAASiqB,KAAK,SAAWn1B,EAAM4qB,GAAK,SAASwK,UAAU/yB,MAAK,WAC1D,IAAI6K,EAAOlL,EAAE3C,MAAM6N,OAEnB,IAAK,IAAI0D,KAAO1D,EACiB,IAAzB0D,EAAIoE,QAAQ,iBAAyB9H,EAAK0D,GAAKvP,UAAYiE,GAC3D4H,EAAK0D,GAAKvP,cAe1BrB,EAAM2oB,OAAS,SAASzd,EAAS6lB,GAC7B,IAAIlI,EAAU7mB,EAAEkJ,GAASiqB,KAAK,SAAWn1B,EAAM4qB,GAAK,SAASwK,UAAUC,OAAOb,IAE9E,GAAK3L,EAAQhiB,OAAb,CAKA,IAAIyuB,EAAetzB,EAAEuzB,UAAU1M,GAC/ByM,EAAahR,KAAKgQ,IAGlBtyB,EAAEK,KAAKizB,GAAc,WACjB,IAAIpD,EAASlyB,EAAMw1B,eAAexzB,EAAE3C,OAChC6yB,GACAA,EAAOvJ,OAAOoI,QAK1B/wB,EAAMq0B,aAAeA,GAErBjyB,EAAOpC,EAAM+oB,GAAI,CACb+G,OAAQA,GACRoD,gBAAiBA,GACjByB,MAAO,GACPc,SAAU,SAASC,EAAWnO,EAAQhhB,GAClC,IAGImX,EAAOiY,EAAWC,EAAkBC,EAAqBhU,EAHzDiU,EAAOJ,EAAUP,KAAK,mBACtBvyB,EAAU5C,EAAM4C,QAChBwe,EAAUxe,EAAQwe,QAUlBS,GAPAtb,EAAUvE,EAAEI,OAAO,GAAI,CACnBiK,MAAO,OACPL,OAAQ,OACR0X,IAAKgS,EAAUK,YACfC,SAAS,GACVzvB,IAEgByvB,QAAU,0BAA4B,iBAEzDzO,EACKuO,EAAKjvB,SAEN8uB,GADAjY,EAAQ9a,EAAQ8a,MAAMgY,IACF,QAAU,OAC9BG,EAAsB71B,EAAMgsB,WAAW0J,GACvCE,EAAmBxU,EAAQH,QAAWvD,EAAYgY,EAAU,GAAGlY,YAAckY,EAAUrpB,QAAU,EAAIwpB,EAAuB,EAE5HC,EAAO9zB,EAAEhC,EAAM+P,OAAO,uKAAwK8R,EAAU7hB,EAAM+oB,GAAG0M,SAASpM,SAAS4M,UAC9N5pB,MAAM9F,EAAQ8F,OAAOL,OAAOzF,EAAQyF,QACpCC,IAAI,MAAO1F,EAAQmd,KACnBzX,IAAI0pB,EAAWjzB,KAAK6T,IAAIsf,GAAuBD,GAC/CM,UAAUR,IAEZI,GACPA,EAAKK,UAGbC,OAAQ,SAASlE,EAAQmE,EAAUhY,GAC/B,IACI6P,EADAzsB,EAAOywB,EAAO9qB,GAAGb,QAAQ9E,KAI7B4c,EAASA,GAAU,IADnBgY,EAAWA,GAAYr2B,EAAM+oB,IAGpBtnB,GAAQywB,EAEjBmE,EAAS1B,MAAMlzB,EAAKkW,eAAiBua,EAErChE,EAAS,WAAa7P,EAAS5c,EAG/B,IAAI60B,EAAc,CAAE70B,KAFpBA,EAAO,QAAU4c,EAAS5c,EAEMywB,OAAQA,EAAQ7T,OAAQA,GAAU,IAClEre,EAAM6oB,QAAQ7nB,KAAKs1B,GAEnB,IAAK,IAAI1vB,EAAI,EAAG6oB,EAAMzvB,EAAM8oB,2BAA2BjiB,OAAQD,EAAI6oB,EAAK7oB,IACpE5G,EAAM8oB,2BAA2BliB,GAAG0vB,GAGxCt0B,EAAEoF,GAAG3F,GAAQ,SAAS8E,GAClB,IACIgwB,EADAxuB,EAAQ1I,KAkCZ,cA/BWkH,IAAYhB,GACnBgxB,EAAOtwB,EAAM2D,KAAKlD,UAAW,GAE7BrH,KAAKgD,MAAK,WACN,IACIm0B,EACA5gB,EAFAsc,EAASlwB,EAAEkL,KAAK7N,KAAMoC,GAI1B,IAAKywB,EACD,MAAM,IAAIpiB,MAAM9P,EAAM+P,OAAO,2DAA4DxJ,EAAS9E,IAKtG,UAFA+0B,EAAStE,EAAO3rB,MAEMjB,EAClB,MAAM,IAAIwK,MAAM9P,EAAM+P,OAAO,kCAAmCxJ,EAAS9E,IAK7E,IAFAmU,EAAS4gB,EAAO/uB,MAAMyqB,EAAQqE,MAEft0B,EAEX,OADA8F,EAAQ6N,GACD,MAIfvW,KAAKgD,MAAK,WACN,OAAO,IAAI6vB,EAAO7yB,KAAMkH,MAIzBwB,GAGX/F,EAAEoF,GAAG3F,GAAMywB,OAASA,EAEpBlwB,EAAEoF,GAAG8mB,GAAU,WACX,OAAO7uB,KAAK6N,KAAKzL,OAK7BzB,EAAM+oB,GAAG0M,SAASpM,SAAW,CACzB4M,QAAS,cAGb,IAAIQ,GAAsB,CAAE5tB,KAAM,WAAa,OAAOxJ,MAASq3B,YAAY,EAAMnwB,QAAS,IAEtFowB,GAAe7G,GAAO1tB,OAAO,CAC7BoF,KAAM,SAAS0D,EAAS3E,GACpBupB,GAAO1oB,GAAGI,KAAKoC,KAAKvK,KAAM6L,EAAS3E,GACnClH,KAAK6L,QAAQ0rB,cACbv3B,KAAKoM,QAAUpM,KAAK6L,QACpB7L,KAAK6L,QAAQyY,SAAS,cAG1BtiB,QAAS,WACLyuB,GAAO1oB,GAAG/F,QAAQuI,KAAKvK,MACvBA,KAAK6L,QAAQ2rB,gBAGjBtwB,QAAS,CACL8X,OAAQ,UAGZ3U,OAAQ,GAERotB,KAAM,WACF,IAAIC,EAAc13B,KAAK6L,QAAQQ,QAAQ1L,EAAMivB,aAAa,oCAC1D,OAAOjvB,EAAMw1B,eAAeuB,EAAa/2B,EAAMipB,OAAOF,KAAO0N,IAGjEO,uBAAwB,WACpB,IAAIF,EAAOz3B,KAAKy3B,OAChB,OAAOA,GAAQA,EAAKvwB,QAAQ0wB,oBAGhCvB,UAAW,WACP,IAAIxqB,EAAU7L,KAAK6L,QAAQQ,QAAQ1L,EAAMivB,aAAa,2CACtD,OAAOjvB,EAAMw1B,eAAetqB,EAAQgsB,GAAG,GAAIl3B,EAAMipB,OAAOF,KAAO0N,MAmIvE,SAASU,GAAUjsB,EAASksB,GACxB,IAAIC,EAAWnsB,EAAQmsB,SAAS1f,cAEhC,OAAQ,sCAAsCvL,KAAKirB,IAC1CnsB,EAAQosB,SACI,MAAbD,GACAnsB,EAAQqsB,MACRH,IAKZ,SAAiBlsB,GACb,OAAOlJ,EAAE0rB,KAAK8J,QAAQ7rB,QAAQT,KACzBlJ,EAAEkJ,GAASusB,UAAUrC,UAAUC,QAAO,WACnC,MAAoC,WAA7BrzB,EAAEiK,IAAI5M,KAAK,iBACnBwH,OAPH8E,CAAQT,GAxIhB9I,EAAOpC,EAAMipB,OAAQ,CACjBzhB,KAAM,SAAS0D,GACXlL,EAAMwH,KAAK0D,EAASlL,EAAMipB,OAAOF,GAAI/oB,EAAM+oB,GAAI/oB,EAAMkpB,QAAQH,KAGjE4L,MAAO,GAEP5L,GAAI,CACA+G,OAAQ6G,GACRzD,gBAAiBA,GAAgB9wB,OAAOu0B,GAAajvB,WACrDitB,MAAO,GACPyB,OAAQ,SAASlE,GACblyB,EAAM+oB,GAAGqN,OAAOlE,EAAQlyB,EAAMipB,OAAOF,GAAI,cAKrDlhB,GAAW7H,EAAMkpB,QAAS,CACtB1hB,KAAM,SAAS0D,GACXlL,EAAMwH,KAAK0D,EAASlL,EAAMkpB,QAAQH,KAEtCA,GAAI,CACA4L,MAAO,GACP+C,OAAQ,GACRC,MAAO,GACPvB,OAAQ,SAASlE,GACblyB,EAAM+oB,GAAGqN,OAAOlE,EAAQlyB,EAAMkpB,QAAQH,MAG9C4L,MAAO,KAGX30B,EAAM43B,cAAgB,SAASrE,EAAUhtB,GAMrC,OAJKA,IAAWA,EAAU,IAE1BA,EAAQsxB,WAAY,EAEb71B,EAAEuxB,GAAU5Z,KAAI,SAAS1Q,EAAKiC,GAEjC,OADAA,EAAUlJ,EAAEkJ,MACRtI,EAAQ+iB,sBAAuB3lB,EAAMipB,OAAOF,GAAG+O,UAAa5sB,EAAQgC,KAAK,0BACzEhC,EAAQ6sB,oBAAoBxxB,GACrB2E,EAAQgC,KAAK,2BAIzB,IAGPlN,EAAMwI,eAAiB,SAASxE,GAC5BA,EAAEwE,kBAGNxI,EAAMw1B,eAAiB,SAAStqB,EAAS8sB,GACrC,IACkBpxB,EAAGC,EADjBqoB,EAAOhkB,EAAQgC,KAAKlN,EAAM4qB,GAAK,QAC/B/B,EAAU,GACVoP,EAAc/sB,EAAQgC,KAAK,aAE/B,GAAIgiB,EAAM,CAQN,GANa,YAATA,IACAA,EAAO,YAKE,SAATA,GAAmB+I,EACnB,OAAOA,EAGX,GAAID,EACA,GAAIA,EAAO,GACP,IAAKpxB,EAAI,EAAGC,EAASmxB,EAAOnxB,OAAQD,EAAIC,EAAQD,IAC5CiiB,EAAQ7nB,KAAKg3B,EAAOpxB,GAAG+tB,MAAMzF,SAGjCrG,EAAQ7nB,KAAKg3B,EAAOrD,MAAMzF,SAI9BrG,EAAU,CAAE7oB,EAAM+oB,GAAG4L,MAAMzF,GAAOlvB,EAAMkpB,QAAQH,GAAG4L,MAAMzF,GAAOlvB,EAAMipB,OAAOF,GAAG4L,MAAMzF,IAO1F,IAJIA,EAAKla,QAAQ,MAAQ,IACrB6T,EAAU,CAAE7oB,EAAMkuB,OAAOgB,EAAblvB,CAAmBG,KAG9ByG,EAAI,EAAGC,EAASgiB,EAAQhiB,OAAQD,EAAIC,EAAQD,IAAM,CACnD,IAAIsrB,EAASrJ,EAAQjiB,GACrB,GAAIsrB,EAAQ,CACR,IAAI/L,EAAWjb,EAAQgC,KAAK,QAAUglB,EAAO9qB,GAAGb,QAAQ8X,OAAS6T,EAAO9qB,GAAGb,QAAQ9E,MACnF,GAAI0kB,EACA,OAAOA,MAO3BnmB,EAAMk4B,SAAW,SAAS9P,GACtB,IAAIjf,EAAUif,EAMd,OALIxlB,EAAQmf,SAASrC,UACjBvW,EAAU,WAAagvB,WAAW/P,EAAU,OAGhDpmB,EAAE7B,GAAQkoB,GAAGzlB,EAAQ+lB,OAAQxf,GACtBA,GAGXnJ,EAAMo4B,aAAe,SAAShQ,GAC1BpmB,EAAE7B,GAAQk4B,IAAIz1B,EAAQ+lB,OAAQP,IAGlCpoB,EAAMs4B,UAAY,SAASptB,EAAS0F,GAChC,OAAO1F,EAAQgC,KAAKlN,EAAM4qB,GAAKha,IAGnC5Q,EAAMwT,KAAO,CACT+kB,OAAQ,EACRC,OAAQ,EACRC,QAAS,EACTC,UAAW,EACXC,SAAU,EACVC,OAAQ,EACRC,SAAU,GAsBd72B,EAAEI,OAAOJ,EAAE0rB,KAAK8J,QAAS,CACrBsB,eAAgB,SAAS5tB,GACrB,IAAIjC,EAAMjH,EAAEogB,KAAKlX,EAAS,YAC1B,OAAOisB,GAAUjsB,GAAU/C,MAAMc,IAAQA,GAAO,MAIxD,IAAI8vB,GAAe,CAAC,YAAa,YAAa,aAAc,aAAc,YAAa,WAAY,UAAW,SAG1GC,GAAuB,CACvBC,eAAgB,WACZ,IAAIhwB,EAAM,EACNpC,EAASkyB,GAAalyB,OACtBqE,EAAUuD,SAASiK,gBAEvB,IAAIsgB,GAAqBE,WAAct2B,EAAQghB,aAA/C,CAIAoV,GAAqBE,WAAY,EAEjCF,GAAqBG,WAAY,EACjCH,GAAqBI,cAAe,EAepC,IAbA,IAAIjwB,EAAU,SAASnF,GACfg1B,GAAqBI,eACN,UAAXp1B,EAAEe,KACEi0B,GAAqBG,YAAcn3B,EAAEgC,EAAE2C,QAAQiF,GApBrC,uCAqBV5H,EAAEwE,iBACFxE,EAAEq1B,mBAGNr1B,EAAEq1B,oBAKPpwB,EAAMpC,EAAQoC,IACjBiC,EAAQpK,iBAAiBi4B,GAAa9vB,GAAME,GAAS,KAI7DmwB,UAAW,SAASt1B,GAChBg1B,GAAqBI,cAAe,EAChCp1B,EAAEkJ,KAAKisB,YACPH,GAAqBG,WAAY,GAErCI,aAAaP,GAAqBQ,qBAGtCC,YAAa,WACTF,aAAaP,GAAqBQ,oBAClCR,GAAqBQ,mBAAqBrB,YAAW,WACjDa,GAAqBI,cAAe,EACpCJ,GAAqBG,WAAY,IAClC,OAIPO,GAAW,CACX9M,KAAM,uBACN+M,KAAM,sBACN9M,GAAI,+BACJ+M,OAAQ,0BAGRh3B,EAAQib,QAAUjb,EAAQmf,SAASzB,KAAO1d,EAAQmf,SAASrC,SAC3Dga,GAAW,CACP9M,KAAM,aACN+M,KAAM,YACN9M,GAAI,uBACJ+M,OAAQ,eAELh3B,EAAQ6iB,SACfiU,GAAW,CACP9M,KAAM,cACN+M,KAAM,cACN9M,GAAI,YACJ+M,OAAQ,8BAELh3B,EAAQ2iB,aACfmU,GAAW,CACP9M,KAAM,gBACN+M,KAAM,gBACN9M,GAAI,cACJ+M,OAAQ,mCAIZh3B,EAAQ2iB,cAAgB,qBAAsBplB,IAE9C6B,EAAEK,KAAK,CACHw3B,eAAgB,gBAChBC,eAAgB,iBACjB,SAAUC,EAAMC,GACfh4B,EAAEwc,MAAMyb,QAASF,GAAS,CACtBG,aAAcF,EACdG,SAAUH,EAEVI,OAAQ,SAAU5b,GACd,IAAI6b,EACA1zB,EAAStH,KACTi7B,EAAU9b,EAAM+b,cAChBC,EAAYhc,EAAMgc,UAStB,OALMF,IAAYA,IAAY3zB,GAAW3E,EAAEuyB,SAAU5tB,EAAQ2zB,MACzD9b,EAAMzZ,KAAOy1B,EAAUC,SACvBJ,EAAMG,EAAUrxB,QAAQ1B,MAAOpI,KAAMqH,WACrC8X,EAAMzZ,KAAOi1B,GAEVK,OAOvB,IAAIK,GAAc,SAAS12B,GAAK,OAAQ01B,GAAS11B,IAAMA,GACnD22B,GAAa,WAEjB36B,EAAM46B,cAAgB,SAASlxB,EAAQkhB,GAOnC,OANAlhB,EAASA,EAAO5H,QAAQ64B,GAAYD,IAEhC9P,IACAlhB,EAASA,EAAO5H,QAAQ64B,GAAY,MAAQ/P,IAGzClhB,GAGX1J,EAAM66B,eAAiB,SAAS72B,EAAGkuB,GAC/B,IAAIxoB,EAASwoB,EAAOtpB,QAAQkyB,aAE5B,IAAKpxB,EACD,OAAO,EAGXA,EAASA,EAAOzD,QAChBjC,EAAE2F,OAASuoB,EACXluB,EAAE+2B,qBAAsB,EACxB,IAAK,IAAI9xB,EAAM,EAAGpC,EAAS6C,EAAO7C,OAAQoC,EAAMpC,EAAQoC,IACpDS,EAAOT,GAAKW,KAAKsoB,EAAQluB,GAG7B,OAAQA,EAAE+2B,qBAGd,IAAI1S,GAAKrmB,EAAEoF,GAAGihB,GAEd,SAAS2S,GAAYnW,EAAUoW,GAC3B,OAAO,IAAID,GAAY5zB,GAAGI,KAAKqd,EAAUoW,GAG7C90B,GAAkB,EAAM60B,GAAah5B,GAErCg5B,GAAY5zB,GAAK4zB,GAAYtzB,UAAY,IAAI1F,EAE7Cg5B,GAAY5zB,GAAGO,YAAcqzB,GAE7BA,GAAY5zB,GAAGI,KAAO,SAASqd,EAAUoW,GAKrC,OAJIA,GAAWA,aAAmBj5B,KAAOi5B,aAAmBD,MACxDC,EAAUD,GAAYC,IAGnBj5B,EAAEoF,GAAGI,KAAKoC,KAAKvK,KAAMwlB,EAAUoW,EAASC,KAGnDF,GAAY5zB,GAAGI,KAAKE,UAAYszB,GAAY5zB,GAE5C,IAAI8zB,GAAaF,GAAYvsB,UAE7BrM,EAAO44B,GAAY5zB,GAAI,CACnB+B,QAAS,SAASA,GAEd,OADA9J,KAAK6N,KAAK,UAAW/D,GACd9J,MAGXu3B,YAAa,SAAShM,GAElB,OADAvrB,KAAK6N,KAAK,UAAW0d,GAAM5qB,EAAM6uB,QAC1BxvB,MAGXgpB,GAAI,WACA,IAAI/gB,EAAOjI,KACPurB,EAAKtjB,EAAK4F,KAAK,WAGnB,GAAyB,IAArBxG,UAAUG,OACV,OAAOwhB,GAAGze,KAAKtC,EAAMZ,UAAU,IAGnC,IAAIu0B,EAAU3zB,EACVivB,EAAOtwB,EAAM2D,KAAKlD,kBAEX6vB,EAAKA,EAAK1vB,OAAS,KAAOjB,GACjC2wB,EAAK9H,MAGT,IAAIrG,EAAWmO,EAAKA,EAAK1vB,OAAS,GAC9B6C,EAAS1J,EAAM46B,cAAcrE,EAAK,GAAI3L,GAG1C,GAAIhoB,EAAQyf,sBAAwB3Y,EAAOyxB,OAAO,gBAAkB,GAAK97B,KAAK,KAAOoP,SAASiK,gBAAiB,CAC3GsgB,GAAqBC,iBAErB,IAAIpU,EAA2B,IAAhB0R,EAAK1vB,OAAe,KAAO0vB,EAAK,GAC3C4C,EAAYzvB,EAAOsL,QAAQ,UAAY,GAAKtL,EAAOsL,QAAQ,aAAe,EAE9EqT,GAAGze,KAAKvK,KACJ,CACI+7B,WAAYpC,GAAqBM,UACjC+B,SAAUrC,GAAqBS,aAEnC5U,EACA,CACIsU,UAAWA,IAIvB,IAAyC,IAArCzyB,UAAU,GAAGsO,QAAQ,YAAqBuhB,EAAK,IAAMA,EAAK,GAAGhwB,QAAS,CACtEgwB,EAAK,GAAK7sB,EACV,IAAIwoB,EAASqE,EAAK,GACd+E,EAAkB/E,EAAKA,EAAK1vB,OAAS,GAOzC,OANA0vB,EAAKA,EAAK1vB,OAAS,GAAK,SAAS7C,GAC7B,GAAIhE,EAAM66B,eAAe72B,EAAGkuB,GACzB,OAAOoJ,EAAgB7zB,MAAMpI,KAAM,CAAC2E,KAG3CqkB,GAAG5gB,MAAMH,EAAMivB,GACRjvB,EAgBX,cAbW8gB,IAAa7iB,IACpB01B,EAAU3zB,EAAK4F,KAAK,WACpBkb,EAAW6S,EAAQ7S,GAEnBmO,EAAKA,EAAK1vB,OAAS,GAAK,SAAS7C,GAC7BokB,EAASxe,KAAKqxB,EAASj3B,KAI/BuyB,EAAK,GAAK7sB,EAEV2e,GAAG5gB,MAAMH,EAAMivB,GAERjvB,GAGXuvB,aAAc,SAASjM,GAOnB,OANAA,EAAKA,GAAMvrB,KAAK6N,KAAK,aAGjB7N,KAAKg5B,IAAI,IAAMzN,GAGZvrB,QAIfW,EAAM+G,OAASi0B,GACfh7B,EAAM05B,SAAWA,GAEjB15B,EAAMqc,SAAW,WACb,IAAIzI,EAAS,CAAE2nB,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,GAAIC,IAAK,IACzG1oB,EAAO,CAAE2oB,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,EAAGC,IAAK,GAElE,SAASC,EAAWphB,EAAMqhB,GACtB,IAAIjnB,EACAknB,EACAC,EACA/3B,EAAQ63B,EAAK,GACbtU,EAAKsU,EAAK,GACVG,EAAOH,EAAK,GACZI,EAAQJ,EAAK,GAMjB,OAJKI,IACDJ,EAAK,GAAKI,EAAQ,IAGlBA,EAAMzhB,GACCyhB,EAAMzhB,IAGZnT,MAAMkgB,GAEuB,IAAvBA,EAAGrT,QAAQ,SAClBU,EAAO,IAAIjI,KAAKA,KAAK4M,IAAIiB,EAAM1H,EAAO9O,GAAS,EAAG,EAAGg4B,EAAK,GAAK,GAAIA,EAAK,GAAIA,EAAK,GAAI,IAErFF,EAAYppB,EAAK6U,EAAGxN,OAAO,EAAG,IAC9BgiB,EAASnnB,EAAKsnB,YAEdtnB,EAAKunB,WAAWvnB,EAAKnE,aAAeqrB,EAAYC,GAAUD,EAAYC,EAAS,EAAI,KAC5ExU,EAAGrT,QAAQ,OAAS,GAC3BU,EAAO,IAAIjI,KAAKA,KAAK4M,IAAIiB,EAAM1H,EAAO9O,GAAQujB,EAAGxN,OAAO,GAAIiiB,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAI,IAEvFF,EAAYppB,EAAK6U,EAAGxN,OAAO,EAAG,IAC9BgiB,EAASnnB,EAAKsnB,YAEdtnB,EAAKunB,WAAWvnB,EAAKnE,aAAeqrB,EAAYC,GAAUD,EAAYC,EAAS,EAAI,KAC5ExU,EAAGrT,QAAQ,OAAS,IAC3BU,EAAO,IAAIjI,KAAKA,KAAK4M,IAAIiB,EAAM1H,EAAO9O,GAAQujB,EAAGxN,OAAO,GAAIiiB,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAI,IAEvFF,EAAYppB,EAAK6U,EAAGxN,OAAO,EAAG,IAC9BgiB,EAASnnB,EAAKsnB,YAEdtnB,EAAKunB,WAAWvnB,EAAKnE,aAAeqrB,EAAYC,GAAUD,EAAYC,EAAS,EAAI,KArBnFnnB,EAAO,IAAIjI,KAAKA,KAAK4M,IAAIiB,EAAM1H,EAAO9O,GAAQujB,EAAIyU,EAAK,GAAIA,EAAK,GAAIA,EAAK,GAAI,IAwB1EC,EAAMzhB,GAAQ5F,GAGzB,SAASwnB,EAASC,EAASC,EAAOC,GAG9B,KAFAD,EAAQA,EAAMC,IAEF,CACR,IAAIP,EAAOO,EAAKpzB,MAAM,KAClBmS,EAAS,EAMb,OAJI0gB,EAAKj2B,OAAS,IACduV,EAAmB,GAAV0gB,EAAK,GAAUnrB,OAAOmrB,EAAK,KAGjC,EAAE,IAAS,MAAO,IAAK,MAAO,EAAG,CAAC,EAAG,EAAG,GAAI1gB,EAAQ,KAG/D,IAAId,EAAO,IAAI7N,KAAK0vB,GAAS9rB,iBAE7B+rB,EAAQr2B,OAAOu2B,KAAKF,GAAO,SAAST,GAChC,IAAIY,EAAOZ,EAAK,GACZa,EAAKb,EAAK,GAEd,OAAOY,GAAQjiB,IAASkiB,GAAMliB,GAASiiB,GAAQjiB,GAAc,QAANkiB,GAAuB,OAANA,MAG5EJ,EAAMp8B,KAAKm8B,GAEXC,EAAM9Y,MAAK,SAAS/f,EAAGggB,GASnB,MARgB,iBAALhgB,IACPA,EAAIoN,OAAO+qB,EAAWphB,EAAM/W,KAGhB,iBAALggB,IACPA,EAAI5S,OAAO+qB,EAAWphB,EAAMiJ,KAGzBhgB,EAAIggB,KAGf,IAAIoY,EAAOS,EAAMr2B,OAAO0tB,QAAQ0I,EAASC,GAAS,IAAMA,EAAMA,EAAMv2B,OAAS,GAE7E,OAAOsB,MAAMw0B,GAAQA,EAAO,KA+BhC,SAASc,EAAYN,EAASO,EAAON,EAAO/gB,UAC7B8gB,GAAW33B,IAClB23B,EAAU1vB,KAAK4M,IAAI8iB,EAAQlnB,cAAeknB,EAAQnnB,WAC9CmnB,EAAQrnB,UAAWqnB,EAAQjnB,WAAYinB,EAAQhnB,aAC/CgnB,EAAQ/mB,aAAc+mB,EAAQ9mB,oBAGtC,IAAIgnB,EAnCR,SAAkBF,EAASO,EAAOrhB,GAC9B,IAAIshB,EAAYD,EAAMrhB,GAMtB,GAJyB,iBAAdshB,IACPA,EAAYD,EAAMC,KAGjBA,EACD,MAAM,IAAI7tB,MAAM,aAAeuM,EAAW,qEAG9C,IAAK,IAAIpT,EAAM00B,EAAU92B,OAAS,EAAGoC,GAAO,EAAGA,IAAO,CAClD,IAAI20B,EAAQD,EAAU10B,GAAK,GAE3B,GAAI20B,GAAST,EAAUS,EACnB,MAIR,IAAIP,EAAOM,EAAU10B,EAAM,GAE3B,IAAKo0B,EACD,MAAM,IAAIvtB,MAAM,aAAeuM,EAAW,kBAAoB8gB,EAAU,KAG5E,OAAOE,EAUIQ,CAASV,EAASO,EAAOrhB,GAEpC,MAAO,CACHghB,KAAMA,EACNV,KAAMO,EAASC,EAASC,EAAOC,EAAK,KAuE5C,MAAO,CACJK,MAAO,GACPN,MAAO,GACPhhB,OAtEH,SAAgB+gB,EAAS9gB,GACrB,GAAgB,WAAZA,GAAqC,WAAZA,EACzB,OAAO,EAGX,IAAIyhB,EAAOL,EAAYN,EAAS99B,KAAKq+B,MAAOr+B,KAAK+9B,MAAO/gB,GACpDghB,EAAOS,EAAKT,KACZV,EAAOmB,EAAKnB,KAEhB,OAAO38B,EAAMoI,WAAWu0B,EAAOU,EAAK,GAAKV,EAAK,GAAKU,EAAK,KA8DzD/gB,QA3CH,SAAiB5G,EAAMqoB,EAAYC,GAC/B,IACIC,EADAC,EAAeF,SAGRD,GAAcx4B,IACrBw4B,EAAa1+B,KAAK+c,OAAO1G,EAAMqoB,WAGxBC,GAAYz4B,IACnBy4B,EAAW3+B,KAAK+c,OAAO1G,EAAMsoB,IAGjC,IAAIG,EAAkBzoB,EAAKY,oBAIvB8nB,GAFJ1oB,EAAO,IAAIjI,KAAKiI,EAAKpN,UAAsC,KAAzBy1B,EAAaC,KAEtB1nB,oBAQzB,cANW4nB,GAAgB34B,IACvB24B,EAAe7+B,KAAK+c,OAAO1G,EAAMwoB,IAGrCD,EAAQG,EAAgBD,GAAoBH,EAAWE,GAEhD,IAAIzwB,KAAKiI,EAAKpN,UAAmB,IAAP21B,IAoBlCx2B,MAjBH,SAAeiO,EAAM2G,GAClB,OAAOhd,KAAKid,QAAQ5G,EAAMA,EAAKY,oBAAqB+F,IAiBpD8Z,OAdH,SAAgBzgB,EAAM2G,GACnB,OAAOhd,KAAKid,QAAQ5G,EAAM2G,EAAU3G,EAAKY,sBAczCjD,KA9DH,SAAc8pB,EAAS9gB,GACnB,IAAIyhB,EAAOL,EAAYN,EAAS99B,KAAKq+B,MAAOr+B,KAAK+9B,MAAO/gB,GACpDghB,EAAOS,EAAKT,KACZV,EAAOmB,EAAKnB,KAEZt1B,EAAOg2B,EAAK,GAEhB,OAAIh2B,EAAK2N,QAAQ,MAAQ,EACd3N,EAAK4C,MAAM,KAAK0yB,IAASA,EAAK,GAAK,EAAI,GACvCt1B,EAAK2N,QAAQ,OAAS,EACtB3N,EAAKvF,QAAQ,KAAQ66B,GAAmB,KAAXA,EAAK,GAAkBA,EAAK,GAAV,IAGnDt1B,GAkDRg3B,YAZH,SAAqBvB,GACjB,OAAOz9B,KAAKoI,MAAM,IAAIgG,KAAKqvB,GAAO,aAtMzB,GAqNjB98B,EAAM0V,KAAO,WACT,IAAI4oB,EAAgB,IAChBC,EAAa,MAEjB,SAASxiB,EAAUrG,EAAM8F,GACrB,OAAc,IAAVA,GAAmC,KAApB9F,EAAKQ,aACpBR,EAAKoG,SAASpG,EAAKQ,WAAa,IACzB,GAMf,SAASsoB,EAAa9oB,EAAM6F,EAAKkjB,GAC7B,IAAIjjB,EAAQ9F,EAAKQ,WAEjBuoB,EAAMA,GAAO,EACbljB,GAAQA,EAAM7F,EAAKK,SAAa,EAAI0oB,GAAQ,EAE5C/oB,EAAKgpB,QAAQhpB,EAAKI,UAAYyF,GAC9BQ,EAAUrG,EAAM8F,GAGpB,SAASmjB,EAAUjpB,EAAM6F,EAAKkjB,GAG1B,OADAD,EADA9oB,EAAO,IAAIjI,KAAKiI,GACG6F,EAAKkjB,GACjB/oB,EAGX,SAASkpB,EAAgBlpB,GACrB,OAAO,IAAIjI,KACPiI,EAAKO,cACLP,EAAKM,WACL,GAgCR,SAAS6oB,EAAenpB,EAAMopB,GAC1B,IAAIC,EAAkB,IAAItxB,KAAKiI,EAAKO,cAAe,EAAG,GAAI,GAEtD+oB,EAXR,SAA6BtpB,EAAMopB,GAC/B,OAAqB,IAAjBA,EACOG,EAAQN,EAAUjpB,EAAMopB,GAAe,GAAI,GAG/CG,EAAQvpB,EAAO,GAAKA,EAAKK,UAAY,IAM9BmpB,CAAoBxpB,EAAMopB,GAEpCK,EAAWH,EAAQ12B,UAAYy2B,EAAgBz2B,UAE/CkL,EAAO9Q,KAAKkN,MAAMuvB,EAAWZ,GAEjC,OAAO,EAAI77B,KAAKkN,MAAM4D,EAAO,GAwBjC,SAASsC,EAAQJ,GAGb,OADAqG,EADArG,EAAO,IAAIjI,KAAKiI,EAAKO,cAAeP,EAAKM,WAAYN,EAAKI,UAAW,EAAG,EAAG,GAC3D,GACTJ,EASX,SAASW,EAAgBX,GACrB,OAAO0pB,EAAgB1pB,GAAMpN,UAAYwN,EAAQspB,EAAgB1pB,IA2CrE,SAASupB,EAAQvpB,EAAM0G,GACnB,IAAIZ,EAAQ9F,EAAKQ,WAKjB,OAFAmpB,EAFI3pB,EAAO,IAAIjI,KAAKiI,GAEN0G,EAASmiB,GACvBxiB,EAAUrG,EAAM8F,GACT9F,EAGX,SAAS2pB,EAAQ3pB,EAAMgG,EAAc4jB,GACjC,IACIC,EADAnjB,EAAS1G,EAAKY,oBAGlBZ,EAAK2pB,QAAQ3pB,EAAKpN,UAAYoT,GAEzB4jB,IACDC,EAAa7pB,EAAKY,oBAAsB8F,EACxC1G,EAAK2pB,QAAQ3pB,EAAKpN,UAAYi3B,EAAajB,IAUnD,SAASkB,IACL,OAAO1pB,EAAQ,IAAIrI,MAOvB,SAAS2xB,EAAgB1pB,GACrB,IAAI+pB,EAAa,IAAIhyB,KAAK,KAAM,EAAG,EAAG,EAAG,EAAG,GAM5C,OAJIiI,GACA+pB,EAAW3jB,SAASpG,EAAKQ,WAAYR,EAAKS,aAAcT,EAAKU,aAAcV,EAAKW,mBAG7EopB,EAGX,SAASC,EAAQhqB,EAAM0G,GACnB,IAAIujB,EAAc,IAAIlyB,KAAKiI,GAE3B,OAAO,IAAIjI,KAAKkyB,EAAY3jB,YAAY2jB,EAAY1pB,cAAgBmG,IAGxE,SAASwjB,EAAWvwB,EAAOtH,GACvB,IAAI83B,EAAWxwB,EAAMA,EAAMxI,OAAS,GAChCg5B,GAA8B,YAAlBA,EAAS96B,KACrB86B,EAAS9sB,SAAWhL,EAEpBsH,EAAMrO,KAAK,CACP+D,KAAM,UACNgO,QAAShL,IAKrB,SAAS+3B,EAAS/sB,GACd,MAAmB,MAAZA,GAA+B,MAAZA,EAgB9B,SAASgtB,EAAWC,EAAMC,EAAc9zB,GAEpC,OADAA,EAAWA,GAAY,EAChB6zB,EAAKhrB,QAAQirB,EAAc9zB,KAAcA,EAkHpD,MAAO,CACH4P,UAAWA,EACX4iB,UAAWA,EACXH,aAAcA,EACd1oB,QAASA,EACToqB,cAvNJ,SAAuBn4B,EAAOyN,EAAKyC,GAC/B,IAEIkoB,EAFAC,EAAQ5qB,EAAIlN,UACZ+3B,EAAQpoB,EAAI3P,UAShB,OANI83B,GAASC,IACTA,GAAS9B,IAGb4B,EAAUp4B,EAAMO,YAEE83B,GAASD,GAAWE,GA6MtCC,cAlPJ,SAAuBv4B,EAAOyN,EAAKyC,GAC/B,IAEIkoB,EAFAC,EAAQ/pB,EAAgBb,GACxB6qB,EAAQhqB,EAAgB4B,GAG5B,OAAKlQ,GAASq4B,GAASC,IAInB7qB,GAAOyC,IACPA,GAAOsmB,GAKP6B,GAFJD,EAAU9pB,EAAgBtO,MAGtBo4B,GAAW5B,GAGX8B,EAAQD,IACRC,GAAS9B,GAGN4B,GAAWC,GAASD,GAAWE,IA4NtCE,QA5KJ,SAAiB7qB,GACd,OAAOI,EAAQJ,GAAMpN,WAAak3B,IAAQl3B,WA4KzCk4B,QAAS,SAAS9qB,GACd,OAAOupB,EAAQvpB,EAAM,IAEzB+qB,YAAa,SAAS/qB,GAClB,OAAOupB,EAAQvpB,GAAO,IAE1BgrB,UApQJ,SAAmBhrB,GACf,OAAOjI,KAAK4M,IAAI3E,EAAKO,cAAeP,EAAKM,WAC7BN,EAAKI,UAAWJ,EAAKQ,WAAYR,EAAKS,aACtCT,EAAKU,aAAcV,EAAKW,oBAkQpCkoB,WAAYA,EACZoC,YAAa,KACbrC,cAAeA,EACfe,QAASA,EACTvjB,SAlMJ,SAAkBpG,EAAMonB,GAGpB,OADA/gB,EADArG,EAAO,IAAIjI,KAAKiI,EAAKO,cAAeP,EAAKM,WAAYN,EAAKI,UAAWgnB,EAAK5mB,WAAY4mB,EAAK3mB,aAAc2mB,EAAK1mB,aAAc0mB,EAAKzmB,mBACjHymB,EAAK5mB,YACdR,GAgMPupB,QAASA,EACTO,MAAOA,EACPJ,gBAAiBA,EACjBR,gBAAiBA,EACjBgC,gBArHJ,SAAyB7wB,GAerB,IAdA,IAOI8wB,EACA97B,EACAgF,EACA0J,EACAzO,EACA87B,EAjDcC,EACdC,EAqCAjuB,EApBR,SAAqBhD,EAAQ+tB,GACzB,IACIloB,EADAnB,EAAWqpB,EAAKrpB,SAcpB,MAZsB,iBAAX1E,IAEH6F,EADAnB,EAASV,SAAShE,GACT0E,EAASV,SAAShE,GAElBA,GAIZ6F,IACDA,EAASnB,EAASV,SAASlQ,GAGxB+R,EAKOqrB,CAAYlxB,EADf/P,EAAM2S,WACuB7Q,QAAQ,OAAQ,QAAQA,QAAQ,KAAM,MAC1EuN,EAAQ,GACR2C,EAAmB,yLAEnBtB,EAAYsB,EAAiBtB,UAAY,EACzClB,EAAQwC,EAAiB0F,KAAK3E,GAQ3BvD,GAAO,CACV,IAAIzH,EAAQyH,EAAM,GAEdkB,EAAYlB,EAAM4I,OAClBwnB,EAAWvwB,EAAO0D,EAAQ1I,UAAUqG,EAAWlB,EAAM4I,QAGrD2nB,EAAWh4B,EAAO,MAAQg4B,EAAWh4B,EAAO,KAC5C63B,EAAWvwB,EAAOtH,IAElB84B,EAAY94B,EAAM,GAElBgC,EAAO,CACHhF,KAFJA,EAAOzB,EAAeu9B,GAGlB9tB,QAAShL,GAGA,SAAThD,IACAgF,EAAKm3B,OAASpB,EAAS/3B,KAG3B0L,EAAQ5O,EAAWE,MAGfC,EAAuC,iBAApByO,EAAMzO,UAAyByO,EAAMzO,UAAYyO,EAAMzO,UAAU67B,IACpFC,EAAgB/4B,EAAMlB,SAED7B,GAAuB,OAAV+C,IAC9BgC,EAAK0J,MAAQ,CACT1O,KAAM0O,EAAM1O,KACZi8B,UAjFFD,EAiFyBD,EAhFvCE,SACAD,GAAgB,EAChBC,EAAW,cACa,IAAjBD,EACPC,EAAW,OACa,IAAjBD,IACPC,EAAW,UAGRA,GAwEa/7B,WAAYwO,EAAMxO,aAAe47B,KAK7CxxB,EAAMrO,KAAK+I,IAGf2G,EAAYsB,EAAiBtB,UAC7BlB,EAAQwC,EAAiB0F,KAAK3E,GAOlC,OAJIrC,EAAYqC,EAAQlM,QACpB+4B,EAAWvwB,EAAO0D,EAAQ1I,UAAUqG,IAGjCrB,GAwDP8xB,cAjCJ,SAAuB56B,GAKnB,OAJWvG,EAAM2S,UACK8B,SAAS2sB,WACA76B,EAAQxB,OAAS,IAE3BwB,EAAQy6B,WA6B7BK,gBAtDJ,SAAyB96B,GACrB,IAAIxB,EAAOwB,EAAQxB,KACfi8B,EAAWz6B,EAAQy6B,SACnBlD,EAAO99B,EAAM2S,UACA,SAAbquB,IACAA,EAAW,SAEE,gBAAbA,IACAA,EAAW,aAEE,WAAbA,IACAA,EAAW,cAEf,IAAIprB,EAASkoB,EAAKrpB,SAAS1P,GAAMi8B,GAIjC,OAHKprB,IACDA,EAASkoB,EAAKrpB,SAAS1P,GAAY,MAEhC6Q,GAsCP0rB,eApVJ,SAAwB5rB,GACpB,IAAI6rB,EAAO,IAAI9zB,KAAKiI,EAAKO,cAAeP,EAAKM,WAAa,EAAG,GACzDzM,EAAQq1B,EAAgBlpB,GACxB8rB,EAAa9+B,KAAK6T,IAAIgrB,EAAKjrB,oBAAsB/M,EAAM+M,qBAM3D,OAJIkrB,GACAD,EAAKzlB,SAASvS,EAAM2M,WAAcsrB,EAAa,IAG5CD,GA4UPE,WA7SJ,SAAoB/rB,EAAMopB,GAClBA,IAAiB78B,IACjB68B,EAAe9+B,EAAM2S,UAAU8B,SAASH,UAG5C,IAAIotB,EAAezC,EAAQvpB,GAAO,GAC9BisB,EAAe1C,EAAQvpB,EAAM,GAE7BksB,EAAa/C,EAAenpB,EAAMopB,GAEtC,OAAmB,IAAf8C,EACO/C,EAAe6C,EAAc5C,GAAgB,EAGrC,KAAf8C,GAAqB/C,EAAe8C,EAAc7C,GAAgB,EAC3D,EAGJ8C,GA4RPvrB,gBAAiBA,EACjBwrB,eA3UJ,SAAwBnsB,GACpB,OAAO,IAAIjI,KAAKiI,EAAKO,cAAe,EAAG,IA2UvC6rB,cAxUJ,SAAuBpsB,GACnB,OAAO,IAAIjI,KAAKiI,EAAKO,cAAe,GAAI,KAwUxC8rB,SAAU,SAASrsB,GACf,OAAOgqB,EAAQhqB,EAAM,IAEzBssB,aAAc,SAAStsB,GACnB,OAAOgqB,EAAQhqB,GAAO,KAlYrB,GAwYb1V,EAAMiiC,gBAAkB,SAAS/2B,GAC7B,GAAIuD,SAASyzB,mBAKT,IAJA,IAAIC,EAAW1zB,SAASyzB,mBAAmBh3B,EAASk3B,WAAWC,WAAW,SAASC,GAC3E,OAAOA,EAAKtd,YAAc9Z,EAAUk3B,WAAWG,cAAgBH,WAAWI,iBAC3E,GAEAL,EAASM,YACRN,EAASO,gBAAkBP,EAASO,cAAcC,YAAYC,QAC9DT,EAASO,cAAc1d,WAAWvH,YAAY0kB,EAASO,oBAI/D,IAAK,IAAI97B,EAAI,EAAGA,EAAIsE,EAAQ23B,WAAWh8B,OAAQD,IAAK,CAChD,IAAIk8B,EAAQ53B,EAAQ23B,WAAWj8B,GAET,GAAlBk8B,EAAMhO,UAAkB,KAAK1oB,KAAK02B,EAAMC,aACxC73B,EAAQuS,YAAYqlB,GACpBl8B,KAGkB,GAAlBk8B,EAAMhO,UACN90B,EAAMiiC,gBAAgBa,KAMtC,IAAIE,GAAiB7iC,EAAO8iC,uBACN9iC,EAAO+iC,6BACP/iC,EAAOgjC,0BACPhjC,EAAOijC,wBACPjjC,EAAOkjC,yBACP,SAASjb,GAAY+P,WAAW/P,EAAU,IAAO,KAEvEpoB,EAAMgjC,eAAiB,SAAS5a,GAC5B4a,GAAep5B,KAAKzJ,EAAQioB,IAGhC,IAAIkb,GAAiB,GAErBtjC,EAAMujC,eAAiB,SAASnb,GAC5Bkb,GAAeA,GAAez8B,QAAUuhB,EACV,IAA1Bkb,GAAez8B,QACf7G,EAAMwjC,oBAIdxjC,EAAMwjC,iBAAmB,WACrBxjC,EAAMgjC,gBAAe,WACbM,GAAe,KACfA,GAAepuB,OAAfouB,GACIA,GAAe,IACftjC,EAAMwjC,wBAMtBxjC,EAAMyjC,uBAAyB,SAAShW,GAOpC,IANA,IACIiW,EAAS,GACTC,GAFclW,EAAIxjB,MAAM,KAAK,IAAM,IAEVA,MAAM,OAC/BpD,EAAS88B,EAAW98B,OACpBoC,EAAM,EAEHA,EAAMpC,EAAQoC,GAAO,EACA,KAApB06B,EAAW16B,KACXy6B,EAAOxW,mBAAmByW,EAAW16B,KAASikB,mBAAmByW,EAAW16B,EAAM,KAI1F,OAAOy6B,GAGX1jC,EAAM4jC,mBAAqB,SAAS5/B,GAChC,QAAyB,IAAdA,EAAES,EAAEo/B,OACX,OAAOp1B,SAASwZ,iBAAiBjkB,EAAES,EAAEo/B,OAAQ7/B,EAAER,EAAEqgC,SAIzD7jC,EAAM8jC,YAAc,SAASC,GACzB,IAEIC,EAFAhgC,EAAI+/B,EAAYhc,cAChBkc,EAASjgC,EAAE8/B,YAWf,OARQ9/B,EAAEkgC,YACED,IAAWhiC,GAAegiC,KAC1BD,EAAQhgC,EAAEkgC,YAEPlgC,EAAEmgC,QAAUngC,EAAEogC,OAASpgC,EAAEqgC,gBAChCL,EAAsB,IAAZhgC,EAAEmgC,QAGbH,GAGXhkC,EAAMskC,SAAW,SAASl9B,EAAIm9B,GAC1B,IAAIC,EACAC,EAAe,EAEnB,IAAKF,GAASA,GAAS,EACnB,OAAOn9B,EAGX,IAAIs9B,EAAY,WACZ,IAAIp9B,EAAOjI,KACPslC,GAAW,IAAIl3B,KAASg3B,EACxBlO,EAAO7vB,UAEX,SAASgR,IACLtQ,EAAGK,MAAMH,EAAMivB,GACfkO,GAAgB,IAAIh3B,KAIxB,IAAKg3B,EACD,OAAO/sB,IAGP8sB,GACAjL,aAAaiL,GAGbG,EAAUJ,EACV7sB,IAEA8sB,EAAUrM,WAAWzgB,EAAM6sB,EAAQI,IAQ3C,OAJAD,EAAU9K,OAAS,WACfL,aAAaiL,IAGVE,GAIX1kC,EAAM4kC,MAAQ,SAAS15B,EAASyJ,EAAO3J,GACnC,IAAI65B,EACAC,EAAanwB,IAAU1S,EAU3B,GARI+I,IAAQ/I,IACR+I,EAAM2J,GAGNzJ,EAAQ,KACRA,EAAUA,EAAQ,KAGlB45B,IAAc55B,EAAQosB,SAA1B,CAIA,IACI,GAAIpsB,EAAQ65B,iBAAmB9iC,EAC3B,GAAI6iC,EAAY,CACZ55B,EAAQ85B,QACR,IAAI/b,EAASrmB,EAAQmf,SACjBkH,EAAOzJ,IAAMyJ,EAAOvJ,QACpByY,YAAW,WAAajtB,EAAQ+5B,kBAAkBtwB,EAAO3J,KAAS,GAGlEE,EAAQ+5B,kBAAkBtwB,EAAO3J,QAGrC2J,EAAQ,CAACzJ,EAAQ65B,eAAgB75B,EAAQg6B,mBAE1C,GAAIz2B,SAAS02B,UAOhB,GANInjC,EAAEkJ,GAASU,GAAG,aACdV,EAAQ85B,QAGZH,EAAe35B,EAAQk6B,kBAEnBN,EACAD,EAAaQ,UAAS,GACtBR,EAAaS,UAAU,YAAa3wB,GACpCkwB,EAAaU,QAAQ,YAAav6B,EAAM2J,GACxCkwB,EAAaW,aACV,CACH,IACIT,EAAgBG,EADhBO,EAAkBZ,EAAaa,YAG/Bb,EAAac,eAAel3B,SAAS02B,UAAUS,cAAcC,eAC7DJ,EAAgBK,YAAY,aAAcjB,GAE1CK,GADAH,EAAiBU,EAAgBzF,KAAKn5B,QACNg+B,EAAa7E,KAAKn5B,OAEtD8N,EAAQ,CAACowB,EAAgBG,IAGnC,MAAOlhC,GAEL2Q,EAAQ,GAGZ,OAAOA,IAGX3U,EAAM+lC,kBAAoB,WACtB,IAAIC,EAAS,GACTC,EAAajkC,EAAE,0CAA0CogB,KAAK,WAC9D8jB,EAAalkC,EAAE,iDAAiDogB,KAAK,WAUzE,OARApgB,EAAE,6CAA6CK,MAAK,WAChD2jC,EAAO3mC,KAAKoC,MAAQpC,KAAK0I,SAGzBm+B,IAAejkC,GAAegkC,IAAehkC,IAC/C+jC,EAAOE,GAAcD,GAGhBD,GAGXhmC,EAAMmmC,UAAY,SAASC,GACvB,IAAIC,EAAeD,EAAKjR,KAAK,kDAAkD5rB,QAC3E+8B,EAAcF,EAAKjR,KAAK,qBAAqBoM,OAEjD,SAASyD,EAAM/Y,GACX,IAAIiG,EAASlyB,EAAMw1B,eAAevJ,GAE9BiG,GAAUA,EAAO8S,MACnB9S,EAAO8S,QAEP/Y,EAAGxiB,QAAQ,SAIjB68B,EAAYje,GAAG,WAAW,SAASrkB,GAC7BA,EAAEuiC,SAAWvmC,EAAMspB,KAAKI,KAAQ1lB,EAAEwiC,WACpCxiC,EAAEwE,iBACFw8B,EAAMqB,OAIVA,EAAahe,GAAG,WAAW,SAASrkB,GAC9BA,EAAEuiC,SAAWvmC,EAAMspB,KAAKI,KAAO1lB,EAAEwiC,WACnCxiC,EAAEwE,iBACFw8B,EAAMsB,QAKdtmC,EAAMymC,aAAe,SAASv7B,GAC1B,IAAIw7B,EAAqB,GACrBC,EAAoBz7B,EAAQ07B,aAAa,QACpCvR,QAAO,SAASjd,EAAOlN,GAEpB,MAAkC,YADdlL,EAAMqO,kBAAkBnD,EAAS,CAAC,aACjC6gB,YAExBzf,IAAInM,GAEbwmC,EAAkBtkC,MAAK,SAAS+V,EAAO5M,GACnCk7B,EAAmBtuB,GAASpW,EAAEwJ,GAAQuqB,eAG1C,IAEI7qB,EAAQ,GAAG27B,YACb,MAAO7iC,GACLkH,EAAQ,GAAG85B,QAGf2B,EAAkBtkC,MAAK,SAAS+V,EAAO5M,GACnCxJ,EAAEwJ,GAAQuqB,UAAU2Q,EAAmBtuB,QAI/CpY,EAAM8mC,iBAAmB,WACrB,GAAIr4B,SAASgK,cAAe,CACxB,IAAIsuB,EAAa/kC,EAAE,mBACfoW,EAAQ2uB,EAAW3uB,MAAM3J,SAASgK,eAEtC,GAAIL,GAAS,GACQ2uB,EAAW3uB,EAAQ,IAAM2uB,EAAW,IAC1C/B,UAKvBhlC,EAAM4iC,KAAO,SAAS76B,GAClB,OAAMA,EACKA,EAAMwI,WAAWqyB,OAEjB,IAIf5iC,EAAMgnC,0BAA4B,SAAS97B,GACvC,IAAI+7B,EAAgB/7B,EAAQQ,QAAQ,mBAChC8pB,EAAiBx1B,EAAMw1B,eAAetqB,GAa1C,OAVI+7B,EAAcpgC,OACLogC,EACFzR,EACkC,WAAhCA,EAAejvB,QAAQ9E,KAC5BO,EAAEwzB,EAAenY,MACjBmY,EAAe/pB,QAAQ0pB,KAAK,mBAAmB5rB,QAE1C2B,GAMjBlL,EAAMknC,aAAe,SAASh8B,EAASi8B,EAAWp/B,GAC9C,IAAI+K,EAAU5H,EAAQkX,KAAK+kB,IAAc,GAErCr0B,EAAQkC,QAAQjN,GAAS,GACzBmD,EAAQkX,KAAK+kB,GAAYr0B,EAAU,IAAM/K,GAAO66B,SAIxD5iC,EAAMonC,gBAAkB,SAASl8B,EAASi8B,EAAWp/B,GACjD,IAAI+K,EAAU5H,EAAQkX,KAAK+kB,IAAc,GAEzCj8B,EAAQkX,KAAK+kB,EAAWr0B,EAAQhR,QAAQiG,EAAO,IAAI66B,SAGvD5iC,EAAMqnC,gBAAkB,SAASn8B,EAASi8B,EAAWp/B,IACnCmD,EAAQkX,KAAK+kB,IAAc,IAE7BnyB,QAAQjN,GAAS,EACzB/H,EAAMknC,aAAah8B,EAASi8B,EAAWp/B,GAEvC/H,EAAMonC,gBAAgBl8B,EAASi8B,EAAWp/B,IAIlD/H,EAAMsnC,aAAe,SAAS1nC,GAC1B,IAAIsB,EAAQlB,EAAMunC,kBAAkB3nC,IAAeA,EACnD,OAAOgD,EAAQxC,YAAcD,EAAOC,WAAWc,GAAOL,SAG1Db,EAAMunC,kBAAoB,SAASC,GAC/B,MAAO,CACHC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,qBACNC,GAAM,uBACRL,IAGNxnC,EAAM8nC,aAAe,CACjBC,MAAO,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QACxGC,MAAO,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,MAAO,QAAS,OAAQ,OAAQ,OAAQ,OAAQ,OAChG,MAAO,OAAQ,OAAQ,QAC/BC,MAAO,CAAC,MAAO,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QACxF,OAAQ,OAAQ,MAAO,OAAQ,OAAQ,QAAS,OAAQ,SAChEC,IAAK,CAAC,OAAQ,QAAS,OAAQ,SAAU,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,QAClGC,aAAc,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,SAC/Cj7B,KAAM,CAAC,OAAQ,OAAQ,SACvBk7B,YAAa,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,QACzF,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,QAAS,MAC1F,OAAQ,OAAQ,UAC9BC,IAAK,CAAC,QACNC,OAAQ,CAAC,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,UAAW,OAAQ,QAC5EC,IAAK,CAAC,MAAO,OAAQ,MAAO,QAAS,OAAQ,OAAQ,OAAQ,OAAQ,OAAQ,UAAW,KAAM,OAAQ,SACtG,aAAc,CAAC,OAAQ,OAAQ,SAAU,OAAQ,OAAQ,OAAQ,SAGrEvoC,EAAMwoC,aAAe,SAASC,EAAWC,GACrC,IAAIC,EAAc3oC,EAAM8nC,aACpBc,EAAS9oC,OAAOwpB,KAAKqf,GACrB5jC,EAAO,OAEX,GAAI0jC,IAAcxmC,IAAgBwmC,EAAU5hC,OACxC,OAAO9B,EAGX,IAAK,IAAI6B,EAAI,EAAGA,EAAIgiC,EAAO/hC,OAAQD,GAAK,EAAG,CAGvC,GAFiB+hC,EAAYC,EAAOhiC,IAErBoO,QAAQyzB,EAAU9wB,gBAAkB,EAChD,OAAO+wB,EAAa,QAAUE,EAAOhiC,GAAKgiC,EAAOhiC,GAIxD,OAAO7B,GAGX/E,EAAM6oC,mBAAqB,SAAS/5B,GAGhC,GAAa,IAATA,EACA,MAAO,SAGX,IAAIlI,EAAI0R,SAAS5V,KAAKkN,MAAMlN,KAAKmtB,IAAI/gB,GAAQpM,KAAKmtB,IAAI,OAAQ,IAC9D,OAAOntB,KAAK0S,MAAMtG,EAAOpM,KAAKomC,IAAI,KAAMliC,GAAI,GAAK,IAPrC,CAAC,QAAS,KAAM,KAAM,KAAM,MAOqBA,IAGjE5G,EAAM+oC,oBAAsB,SAAS5hB,GACjC,MAAO,IAAMA,EAAQld,MAAM,KAAKC,KAAK,MAKzC,IAAI8+B,GAAmB,CAAC,OAAQ,UAAW,YAAa,WAAY,UAAW,OAAQ,UAAW,UAAW,QAAS,OAAQ,QAAS,WACnIC,GAAa,CAAC,QAAS,UAAW,QAElCC,GAAc,CAAC,YAAa,UAC5BC,GAAa,CAAE,CAAC,QAAS,MAAO,CAAC,SAAU,MAAO,CAAC,QAAS,OAC5DC,GAAgB,CAAE,CAAC,QAAS,MAAO,CAAC,SAAU,MAAO,CAAC,QAAS,OAE/DC,GAAqB,CAAE,QAAS,SAAU,SAAU,YACpDC,GAAe,CAAE,CAAC,OAAQ,UAAW,CAAC,aAAc,YAAa,CAAC,WAAY,aAC9EC,GAAiB,CAAE,OAAQ,SAAU,UAAW,SAAU,QAE9DvpC,EAAM8xB,cAAiB,WACnB,IAAI0X,EAAgB,GAuCpB,SAASC,EAAiBtX,EAAUpqB,EAAO2hC,GAClCF,EAAcrX,KACfqX,EAAcrX,GAAY,IAG9BqX,EAAcrX,GAAUpqB,GAAS2hC,GAAa3hC,EAGlD,SAAS4hC,EAAmBxX,EAAUyX,GAClC,IAAK,IAAIhjC,EAAI,EAAGA,EAAIgjC,EAAI/iC,OAAQD,IACxBtE,EAAQsnC,EAAIhjC,IACZ6iC,EAAiBtX,EAAUyX,EAAIhjC,GAAG,GAAIgjC,EAAIhjC,GAAG,IAE7C6iC,EAAiBtX,EAAUyX,EAAIhjC,IAuD3C,OATA+iC,EAAmB,aAAcX,IACjCW,EAAmB,WAAYV,IAC/BU,EAAmB,QAAST,IAC5BS,EAAmB,OAAQR,IAC3BQ,EAAmB,eAAgBN,IACnCM,EAAmB,UAAWP,IAC9BO,EAAmB,SAAUL,IAC7BK,EAAmB,WAAYJ,IAExB,CACHF,mBAAoBA,GACpBD,cAAeA,GACfD,WAAYA,GACZD,YAAaA,GACbW,eAAgBZ,GAChBD,iBAAkBA,GAElBQ,cAAeA,EACfzX,mBAnHqB,GAqHrB+X,eAzGJ,SAAwB5X,EAAQqE,GAC5B,IACI3vB,EAAGmjC,EAAGxb,EAAMpW,EAAQ6xB,EAAWC,EAD/BC,EAAOlqC,EAAM8xB,cAAcC,mBAG/B,IAAKnrB,EAAI,EAAGA,EAAI2vB,EAAK1vB,OAAQD,IAUzB,IATA2nB,EAAOgI,EAAK3vB,GAAG2nB,KACfyb,EAAYzT,EAAK3vB,GAAGuR,OAEf+xB,EAAKhY,GAAQ3D,KACd2b,EAAKhY,GAAQ3D,GAAQ,IAGzBpW,EAAS+xB,EAAKhY,GAAQ3D,GAEjBwb,EAAI,EAAGA,EAAIC,EAAUnjC,OAAQkjC,IAC9BE,EAAeD,EAAUD,GAErBznC,EAAQ0nC,EAAUD,IAClB5xB,EAAO8xB,EAAa,IAAMA,EAAa,GAEvC9xB,EAAO8xB,GAAgBA,GAsFnChY,cA9DJ,SAAuBsE,GACnB,IAQI4T,EAAcC,EAAY/rB,EAR1B6T,EAASqE,EAAKrE,OACdC,EAAWoE,EAAKpE,SAChBpqB,EAAQwuB,EAAKxuB,MACbsqB,EAAOkE,EAAKlE,KACZP,EAAgB9xB,EAAM8xB,cACtB0X,EAAgB1X,EAAc0X,cAAcrX,GAC5CkY,EAAmBvY,EAAcC,mBAAmBG,GACpDoY,EAAiB/T,EAAKlY,OAG1B,OAAKgsB,IAKLD,GADAD,EAAeE,EAAiBlY,KACJgY,EAAapiC,IAAiCyhC,EAAczhC,KAIhFsW,EADa,eAAb8T,EACSkY,EAAuB,OAAIhY,EAAO,IACvB,iBAAbF,EACE,SACW,YAAbA,EACE,aACW,WAAbA,EACE,KACW,aAAbA,EACE,cAEAkY,EAAuB,QAGpChsB,EAASisB,GAAkBjsB,GAEX+rB,GAvBT,IAmDXG,eArHJ,SAAwBrY,EAAQ7T,GAC5B,IAAI6rB,EAAOlqC,EAAM8xB,cAAcC,mBAE1BmY,EAAKhY,KACNgY,EAAKhY,GAAU,IAGnBgY,EAAKhY,GAAc,OAAI7T,IAXT,GA8HtBre,EAAMypC,iBAAmB,SAAStX,EAAUpqB,EAAO2hC,GAC1C1pC,EAAMwqC,sBAAsBrY,KAC7BnyB,EAAMwqC,sBAAsBrY,GAAY,IAG5CnyB,EAAMwqC,sBAAsBrY,GAAUpqB,GAAS2hC,GAAa3hC,GAGhE/H,EAAM2pC,mBAAqB,SAASxX,EAAUyX,GAC1C,IAAK,IAAIhjC,EAAI,EAAGA,EAAIgjC,EAAI/iC,OAAQD,IACxBtE,EAAQsnC,EAAIhjC,IACZ5G,EAAMypC,iBAAiBtX,EAAUyX,EAAIhjC,GAAG,GAAIgjC,EAAIhjC,GAAG,IAEnD5G,EAAMypC,iBAAiBtX,EAAUyX,EAAIhjC,KAKjD5G,EAAMyqC,iBAAmB,SAASpsB,EAAQ8T,EAAUpqB,GAChD,IAAIqiC,EAAapqC,EAAMwqC,sBAAsBrY,GAAUpqB,GAEvD,GAAIqiC,EACA,OAAO/rB,EAAS+rB,GAIxBpqC,EAAMwqC,sBAAwB,GAE9BxqC,EAAM2pC,mBAAmB,aAAcX,IACvChpC,EAAM2pC,mBAAmB,OAAQV,IAEjCjpC,EAAM2pC,mBAAmB,QAAST,IAClClpC,EAAM2pC,mBAAmB,OAAQR,IAEjCnpC,EAAM2pC,mBAAmB,eAAgBN,IAEzCrpC,EAAM0qC,+BAAiC,SAASx/B,EAASy/B,GACrD,IAAI9lB,EAAW8lB,EAAWhxB,KAAI,SAAUixB,GAAY,MAAQ,IAAO5qC,EAAMoiB,KAAM,SAAWwoB,GAAe,OAAS1gC,KAAK,KACvHgB,EAAQiqB,KAAKtQ,GAAUuQ,QAAQvQ,GAAUxiB,MAAK,SAAU+qB,EAAGyd,GACvD,IAAIC,EAAkB9oC,EAAE6oC,GACxBF,EAAWhqC,SAAQ,SAASiqC,GACxB,IAAIG,EAAY/qC,EAAMoiB,KAAM,SAAWwoB,GACnCE,EAAgB1oB,KAAK2oB,KACrBD,EAAgB7+B,IAAI2+B,EAAWE,EAAgB1oB,KAAK2oB,IACpDD,EAAgBpa,WAAWqa,WAS3C/qC,EAAMgrC,QAAU,SAASnxB,GACrB,IASI9R,EATAkjC,EAAoC,GAApBvkC,UAAUG,QAAetE,MAAMD,QAAQuX,GAASA,EAAQtX,MAAMmF,UAAUzB,MAAM2D,KAAKlD,WACnGG,EAASokC,EAAcpkC,OACvBqkC,EAAYrkC,EACZskC,EAAWnpC,EAAEopC,WACbxkC,EAAI,EACJykC,EAAS,EACTC,EAAiB/oC,MAAMsE,GACvB0kC,EAAehpC,MAAMsE,GACrB2kC,EAAkBjpC,MAAMsE,GAG5B,SAAS4kC,EAAWrzB,EAAOszB,EAAUvzB,GACjC,OAAO,WACCA,GAAU8yB,GACVI,IAGJF,EAASQ,WACLD,EAAStzB,GAAS/Y,KAClB8Y,EAAOC,GAAS7V,MAAMmF,UAAUzB,MAAM2D,KAAKlD,cAGvCwkC,GACJC,GAAWE,EAAqB,SAAZ,WAAwB,QAAQK,EAAUvzB,IAK1E,KAAOvR,EAAIC,EAAQD,KACVmB,EAAQkjC,EAAcrkC,KAAO5G,EAAMuI,WAAWR,EAAMse,SACrDte,EAAMse,UACDulB,KAAKH,EAAW7kC,EAAG4kC,EAAiBP,IACpCY,KAAKJ,EAAW7kC,EAAG0kC,EAAgBC,KAIxCJ,EAASQ,WAAWtsC,KAAM0I,KACxBmjC,GAQV,OAJKA,GACDC,EAASW,YAAYN,EAAiBP,GAGnCE,EAAS9kB,WAIpB,WACI,SAAS0lB,EAAYC,EAASC,EAAUC,EAAUC,GAC9C,IAAI/F,EAAOpkC,EAAE,UAAUogB,KAAK,CACxBgqB,OAAQF,EACR1V,OAAQ,OACR7vB,OAAQwlC,IAGRj/B,EAAOlN,EAAM+lC,oBACjB74B,EAAK++B,SAAWA,EAEhB,IAAI58B,EAAQ28B,EAAQ/hC,MAAM,YAI1B,IAAK,IAAIxI,KAHTyL,EAAKm/B,YAAch9B,EAAM,GAAGvN,QAAQ,QAAS,IAC7CoL,EAAKo/B,OAASj9B,EAAM,GAEHnC,EACTA,EAAKa,eAAetM,IACpBO,EAAE,WAAWogB,KAAK,CACdra,MAAOmF,EAAKzL,GACZA,KAAMA,EACNsD,KAAM,WACPwnC,SAASnG,GAIpBA,EAAKmG,SAAS,QAAQC,SAASrW,SAGnC,IAAIsW,EAAYh+B,SAASyO,cAAc,KACnCwvB,EAAoB,aAAcD,IAAczsC,EAAM4C,QAAQwe,QAAQmB,KAE1E,SAASoqB,EAAWX,EAASC,GACzB,IAAIW,EAAOZ,EAEX,GAAsB,iBAAXA,EAAqB,CAM5B,IALA,IAAI38B,EAAQ28B,EAAQ/hC,MAAM,YACtBoiC,EAAch9B,EAAM,GACpBi9B,EAASO,KAAKx9B,EAAM,IACpBwK,EAAQ,IAAIizB,WAAWR,EAAOzlC,QAEzBoC,EAAM,EAAGA,EAAMqjC,EAAOzlC,OAAQoC,IACnC4Q,EAAM5Q,GAAOqjC,EAAO37B,WAAW1H,GAEnC2jC,EAAO,IAAIG,KAAK,CAAClzB,EAAMmzB,QAAS,CAAEjoC,KAAMsnC,IAG5CnrB,UAAU+rB,WAAWL,EAAMX,GAG/B,SAASiB,EAAclB,EAASC,GACxB9rC,EAAO4sC,MAAQf,aAAmBe,OAClCf,EAAUmB,IAAIC,gBAAgBpB,IAGlCS,EAAUY,SAAWpB,EACrBQ,EAAUlV,KAAOyU,EAEjB,IAAIhoC,EAAIyK,SAAS6+B,YAAY,eAC7BtpC,EAAEupC,eAAe,SAAS,GAAM,EAAOptC,EACnC,EAAG,EAAG,EAAG,EAAG,GAAG,GAAO,GAAO,GAAO,EAAO,EAAG,MAElDssC,EAAUe,cAAcxpC,GACxBm0B,YAAW,WACPgV,IAAIM,gBAAgBzB,MAI5BhsC,EAAM0tC,OAAS,SAASnnC,GACpB,IAAIonC,EAAO5B,EAENxlC,EAAQqnC,aACLlB,EACAiB,EAAOT,EACAhsB,UAAU+rB,aACjBU,EAAOhB,IAIfgB,EAAKpnC,EAAQylC,QAASzlC,EAAQ0lC,SAAU1lC,EAAQ2lC,SAAU3lC,EAAQ4lC,cA9E1E,GAmFAnsC,EAAM6tC,kBAAoB,SAA2B3gC,GACjD,IAAI4gC,EAAa,GAcjB,OAZAhuC,OAAOwpB,KAAKpc,GAAQ,IAAIvM,SAAQ,SAASiM,GACvC9M,OAAOiuC,eAAeD,EAAYlhC,EAAU,CAC1C+hB,IAAK,WACH,OAAOzhB,EAAKN,IAEdgiB,IAAK,SAAS7mB,GACZmF,EAAKN,GAAY7E,EACjBmF,EAAK8gC,OAAQ,QAKZF,GAGX9tC,EAAMiuC,gBAAkB,WACpB,IAMIC,EAASlsC,EANc,sNAOvBmsC,EAAS,GAUb,OARAD,EAAO3B,SAASvqC,EAAE,SAElBksC,EAAO7rC,MAAK,SAASuE,EAAGwnC,GACpBD,EAAOntC,KAAKgB,EAAEosC,GAAMniC,IAAI,wBAG5BiiC,EAAO/X,SAEAgY,GAGXnuC,EAAMquC,UAAY,SAASnjC,GACvB,OAAOA,aAAmBqb,SAAWrb,aAAmBojC,cAMxDtuC,EAAMC,SAAWD,EAAMC,UAAY,GACnCD,EAAMuuC,YAAc,SAAS39B,EAAK7I,GAC9B,IAAIymC,EAAO59B,EAAI3G,MAAM,KACjBwkC,EAAOzuC,EAAMC,SAEjB2Q,EAAM49B,EAAK/f,MAEX+f,EAAK7tC,SAAQ,SAASoJ,GACd0kC,EAAK1kC,KAAU9H,IACfwsC,EAAK1kC,GAAQ,IAGjB0kC,EAAOA,EAAK1kC,MAGZhC,EAAMJ,cAAgB7H,OACtB2uC,EAAK79B,GAAO/I,GAAW,GAAI4mC,EAAK79B,GAAM7I,GAEtC0mC,EAAK79B,GAAO7I,GAKpB/H,EAAM6P,eAAiB1P,EAAOuuC,sBAG9B1uC,EAAMuuC,YAAY,cAAe/uC,GAKjCQ,EAAM2uC,WAAa,GAEnB5nC,OAAO1E,KAAM,uEAAuE4H,MAAO,MACvF,SAAU2kC,EAAIntC,GACVzB,EAAM2uC,WAAY,WAAaltC,EAAO,KAAQA,EAAKkW,iBAG3D3X,EAAM+E,KAAO,SAASqnB,GAClB,OAAY,MAAPA,EACMA,EAAM,GAIK,iBAARA,GAAmC,mBAARA,EACrCpsB,EAAM2uC,WAAW7uC,OAAO4H,UAAU6I,SAAS3G,KAAKwiB,KAAS,gBAClDA,GAInB,IAAI2D,eAAiB,CAAEC,gBAAiB,aAAc6e,aAAc,cAEpE1uC,EAAO4vB,eAAiB,CACpB8e,aAAc9e,eAAe8e,cAl3KrC,CAy3KG9nC,OAAQ5G,QACGH,OAUd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACfgpB,EAAKhpB,EAAM4lB,QACXvjB,EAAOL,EAAEK,KACTD,EAASJ,EAAEI,OACXQ,EAAU5C,EAAM4C,QAChBwe,EAAUxe,EAAQwe,QAClBpD,EAAapb,EAAQob,WACrBD,EAAcnb,EAAQmb,YACtB+wB,EAAkB,CAAEC,MAAO,EAAGC,OAAQ,EAAGC,OAAQ,EAAGC,QAAS,GAC7DC,EAAsB,CAAEC,UAAW,EAAGC,WAAY,EAAGC,WAAY,EAAGC,YAAa,GACjFC,OAA0D,IAAxC/gC,SAASiK,gBAAgB5M,MAAM2jC,OAA0BzxB,EAC3E0xB,EAAiB,iGACjBC,EAAkB,oDAClBC,EAAmB,gBACnBC,EAAmB,0BACnBC,EAAqB,qBACrBC,EAAa,SACbC,EAAiB,CAAC,cAAe,SAAU,UAAW,UAAW,UAAW,WAAY,QAAS,SAAU,SAAU,SAAU,UAAW,OAAQ,QAAS,QAAS,YAAa,aAAc,aAAc,aAAc,cAAe,SAAU,YACpPC,EAAc,CAAC,SAAU,QAAS,SAAU,SAAU,OAAQ,QAAS,QAAS,YAAa,aAAc,aAAc,UACzHC,EAAkB,CAAEC,OAAU,MAAOpB,MAAO,GAAIqB,KAAM,KAAMhB,UAAW,MACvEiB,EAAYryB,EAAW/R,IACvBmJ,EAAQ1S,KAAK0S,MAEbk7B,EAAK,KAELC,EAAO,OACPC,EAAQ,QACRC,EAAS,SACTC,EAAS,SACTC,EAAS,SACTC,EAAW,UACXC,EAAW,WACXC,EAAY,YACZC,EAAW,WACXC,EAAoB,mBACpBC,EAAaZ,EAAY,aACzBa,EAAYb,EAAY,YACxBc,EAAWd,EAAY,sBACvBe,EAAcf,EAAY,cAC1BgB,EAAsB,SACtBC,EAAwB,sBACxB3kB,EAAa,CACT1B,KAAM,CACF9V,QAAS,QACTvI,SAAU,OACV2kC,WAAY,aACZC,UAAU,EACVC,UAAW,GAEfvmB,MAAO,CACH/V,QAAS,OACTvI,SAAU,OACV2kC,WAAY,aACZC,UAAU,EACVC,SAAU,GAEd7kB,KAAM,CACFzX,QAAS,KACTvI,SAAU,MACV2kC,WAAY,aACZC,UAAU,EACVC,SAAU,GAEd5kB,GAAI,CACA1X,QAAS,OACTvI,SAAU,MACV2kC,WAAY,aACZC,UAAU,EACVC,UAAW,GAEf/tB,IAAK,CACDvO,QAAS,UAEbgW,OAAQ,CACJhW,QAAS,OAEb2X,GAAM,CACF3X,QAAS,MACTs8B,UAAW,GAEf1kB,IAAK,CACD5X,QAAS,KACTs8B,SAAU,GAGdD,SAAU,CACNr8B,QAAS,YAGbu8B,WAAY,CACRv8B,QAAS,eAkBrB,GAdAnV,EAAM2sB,WAAaA,EAEnBvqB,EAAOJ,EAAEoF,GAAI,CACTyf,UAAW,SAASC,EAAYC,GAC5B,OAAIhJ,EACOiL,EAAG2oB,UAAUtyC,KAAMynB,IAAc,EAAOC,IAAW,GAEnD1nB,KAAK2nB,KAAKF,EAAYC,MAOrC/I,IAAeD,EAAa,CAC5B1b,EAAK4tC,GAAa,SAAShnC,EAAKlB,GAC5B/F,EAAEoF,GAAGW,GAAS,SAASumB,GACnB,QAAkB,IAAPA,EACP,OAAOsjB,EAAkBvyC,KAAM0I,GAE/B,IAAIT,EAAOtF,EAAE3C,MAAM,GACfwyC,EAAiB9pC,EAAQ,IAAMumB,EAAM4hB,EAAgBnoC,EAAMjG,QAAQiuC,EAAY,KAAO,IAQ9F,OANkD,GAA1CzoC,EAAKwE,MAAMqR,QAAQnI,QAAQk8B,GAC3BlvC,EAAE3C,MAAM4M,IAAIilC,EAAWW,GAEvBvqC,EAAKwE,MAAMqR,QAAU7V,EAAKwE,MAAMqR,QAAQrb,QAAQ,IAAIwL,OAAOvF,EAAQ,YAAa,KAAM8pC,GAGvFxyC,MAGX2C,EAAEgnB,GAAG8oB,KAAK/pC,GAAS,SAASihB,GACxBhnB,EAAEgnB,EAAG+oB,MAAMhqC,GAAOihB,EAAGgpB,SAI7B,IAAIC,EAAWjwC,EAAEgnB,GAAGthB,UAAUwqC,IAC9BlwC,EAAEgnB,GAAGthB,UAAUwqC,IAAM,WACjB,OAAuC,GAAnCjC,EAAYj7B,QAAQ3V,KAAKkvB,MAClBnmB,WAAWpG,EAAE3C,KAAK0yC,MAAM1yC,KAAKkvB,SAGjC0jB,EAASxqC,MAAMpI,KAAMqH,YA+DpC,SAASyrC,EAAapqC,GAClB,OAAOuQ,SAASvQ,EAAO,IAG3B,SAASqqC,EAASlnC,EAAS0B,GACvB,OAAOulC,EAAajnC,EAAQe,IAAIW,IAWpC,SAASylC,EAAkB/jC,GACvB,IAAK,IAAIsC,KAAOtC,GACwB,GAAhC0hC,EAAeh7B,QAAQpE,KAA2C,GAA7Bq/B,EAAYj7B,QAAQpE,WAClDtC,EAAWsC,GAI1B,OAAOtC,EAGX,SAASgkC,EAAapnC,EAASoD,GAC3B,IAAyCikC,EAAU3hC,EAAK7I,EAAOyqC,EAA3DC,EAAiB,GAAIC,EAAY,GAErC,IAAK9hC,KAAOtC,EACRikC,EAAW3hC,EAAI+G,cACf66B,EAAgBx0B,IAAmD,GAArCgyB,EAAeh7B,QAAQu9B,IAEhD3vC,EAAQsb,SAAWs0B,IAAmD,GAAlCvC,EAAYj7B,QAAQu9B,UAClDjkC,EAAWsC,IAElB7I,EAAQuG,EAAWsC,GAEf4hC,EACAC,EAAezxC,KAAK4P,EAAM,IAAM7I,EAAQ,KAExC2qC,EAAU9hC,GAAO7I,GAS7B,OAJI0qC,EAAe5rC,SACf6rC,EAAUxB,GAAauB,EAAevoC,KAAK,MAGxCwoC,EAuGX,SAASd,EAAkB1mC,EAAS0B,GAChC,GAAIoR,EAAY,CACZ,IAAI20B,EAAYznC,EAAQe,IAAIilC,GAC5B,GA5UG,QA4UCyB,EACA,MAAmB,SAAZ/lC,EAAsB,EAAI,EAGrC,IAAI4C,EAAQmjC,EAAUnjC,MAAM,IAAIlC,OAAOV,EAAW,0BAC9CgmC,EAAW,EAmBf,OAjBIpjC,EACAojC,EAAWT,EAAa3iC,EAAM,KAE9BA,EAAQmjC,EAAUnjC,MAAMkgC,IAAmB,CAAC,EAAG,EAAG,EAAG,EAAG,GACxD9iC,EAAWA,EAAS+K,cAEhBi4B,EAAiBxjC,KAAKQ,GACtBgmC,EAAWxqC,WAAWoH,EAAM,GAAKA,EAAM,IACpB,cAAZ5C,EACPgmC,EAAWxqC,WAAWoH,EAAM,GAAKA,EAAM,IACpB,SAAZ5C,EACPgmC,EAAWxqC,WAAWoH,EAAM,IACT,UAAZ5C,IACPgmC,EAAWxqC,WAAW1F,KAAKmwC,MAAMrjC,EAAM,GAAIA,EAAM,OAIlDojC,EAEP,OAAOxqC,WAAW8C,EAAQe,IAAIW,IAjPtC5M,EAAMonB,YAAc,SAASlc,EAASic,EAAS5gB,EAAS+F,GAsBpD,OArBI6a,IACAA,EAAUA,EAAQld,MAAM,KAEpB8T,IACAxX,EAAUnE,EAAO,CACb0wC,UAAW,MACXhtB,SAAU,IACVitB,KAAM,YACPxsC,GAEH2E,EAAQe,IAAIglC,EAAY1qC,EAAQusC,UAAY,IAAMvsC,EAAQuf,SAAW,MAAQvf,EAAQwsC,MACrF5a,YAAW,WACPjtB,EAAQe,IAAIglC,EAAY,IAAIhlC,IAAIwkC,KACjClqC,EAAQuf,WAGfzjB,EAAK8kB,GAAS,SAASle,EAAKlB,GACxBmD,EAAQkc,YAAYrf,EAAOuE,OAI5BpB,GAGXlL,EAAM0sB,aAAe,SAAS7I,EAAOmvB,GACjC,IAAIptB,EAAU,GA8Bd,MA5BqB,iBAAV/B,EACPxhB,EAAKwhB,EAAM5Z,MAAM,MAAM,SAAShB,EAAKlB,GACjC,IAAIkrC,GAAoBnD,EAAmB1jC,KAAKrE,GAI5CmrC,EAHWnrC,EAAMjG,QAAQ+tC,GAAkB,SAASrgC,EAAO2jC,EAAIC,GAC3D,OAAOD,EAAK,IAAMC,EAAGz7B,iBAEP1N,MAAM,KACxBopC,EAAYH,EAAO,GACnBI,EAAa,GAEbJ,EAAOrsC,OAAS,IAChBysC,EAAWD,UAAaL,GAAUC,EAAmBtmB,EAAW0mB,GAAWl+B,QAAUk+B,GAGzFztB,EAAQstB,EAAO,IAAMI,KAGzBjxC,EAAKwhB,GAAO,SAAS5a,GACjB,IAAIoqC,EAAYh0C,KAAKg0C,UAEjBA,GAAaL,IAAWlD,EAAmB1jC,KAAKnD,KAChD5J,KAAKg0C,UAAY1mB,EAAW0mB,GAAWl+B,SAG3CyQ,EAAQ3c,GAAO5J,QAIhBumB,GAwDP7H,GACA3b,EAAO4mB,EAAI,CACPuoB,WAAY,SAASrmC,EAASoD,EAAY/H,GACtC,IAAI0F,EAGAsnC,EAFAhP,EAAQ,EACRiP,EAAUtoC,EAAQgC,KAAK,SAAW,GAGtC3G,EAAUnE,EAAO,CACT0jB,SAAU,IACVitB,KAAM,WACNhtB,SAAU,KACV+sB,UAAW,OAEfvsC,GAGJ,IAAIktC,GAAuB,EAEvBC,EAAiB,WACZD,IACDA,GAAuB,EAEnBF,IACAha,aAAaga,GACbA,EAAY,MAGhBroC,EACComB,WAAWsf,GACXpqB,UACAva,IAAIglC,EAAY,IAChBhlC,IAAIglC,GAEL1qC,EAAQwf,SAASnc,KAAKsB,KAI9B3E,EAAQuf,SAAW9jB,EAAEgnB,IAAKhnB,EAAEgnB,GAAG2qB,OAAOptC,EAAQuf,WAAgCvf,EAAQuf,SAEtF7Z,EAAMqmC,EAAapnC,EAASoD,GAE5BtM,EAAE4xC,MAAMJ,EAvFpB,SAAcpnB,GACV,IAAIynB,EAAM,GACV,IAAK,IAAIC,KAAgB1nB,EACrBynB,EAAI7yC,KAAK8yC,GAEb,OAAOD,EAkFkBvqB,CAAKrd,IAElBjK,EAAE+L,eAAe,cACjB7C,EACKgC,KAAK,OAAQlL,EAAE+xC,WAAWP,IAC1BxnC,SAELd,EACKgC,KAAK,OAAQlL,EAAEgyC,OAAOR,IACtBxnC,SAGTd,EAAQe,IAAIglC,EAAY1qC,EAAQusC,UAAY,IAAMvsC,EAAQuf,SAAW,MAAQvf,EAAQwsC,MAAM9mC,IAAIglC,GAC/F/lC,EAAQe,IAAIA,GAAKA,IAAIilC,GAQjBnzB,EAAYS,QACZtT,EAAQlC,IAAI+U,EAAYS,MAAOk1B,GACN,IAArBntC,EAAQuf,WACRye,EAAQ,MAIhBgP,EAAYpb,WAAWub,EAAgBntC,EAAQuf,SAAWye,GAC1Dr5B,EAAQgC,KAAK0jC,EAAU2C,GACvBroC,EAAQgC,KAAK8jC,EAAmB0C,IAGpC/B,UAAW,SAASzmC,EAAS4b,EAAYC,GACrC,IAAI2rB,EACAuB,EAAW/oC,EAAQgC,KAAK,QACxBgnC,GAAmBntB,GAAWktB,EAC9BhuB,EAAmB/a,EAAQgC,KAAK8jC,GAcpC,OAZIkD,IACAxB,EAAY1yC,EAAMqO,kBAAkBnD,EAAQ,GAAI+oC,IAGhDhuB,GACAA,IAGAiuB,GACAhpC,EAAQe,IAAIymC,GAGTxnC,EACEomB,WAAW,QACXtK,KAAKF,MAsC1B,IAAIqtB,EAAYn0C,EAAMiH,MAAM7E,OAAO,CAC/BoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAIe,EAAOjI,KAEXiI,EAAK4D,QAAUA,EACf5D,EAAKse,QAAU,GACfte,EAAKf,QAAUA,EACfe,EAAK8sC,QAAU,IAGnBC,IAAK,SAASzuB,GACV,IACIstB,EACAjqC,EAAKqrC,EAOL3tC,EACA4tC,EACAC,EAXAltC,EAAOjI,KAGPwH,EAAS+e,EAAQ/e,OACjBqE,EAAU5D,EAAK4D,QACf3E,EAAUe,EAAKf,QACf4kC,EAAWnpC,EAAEopC,WACbz2B,EAAQ,GACR3J,EAAM,GAWV,IANA1D,EAAKse,QAAUA,EAEfulB,EAASS,KAAKtkC,EAAKye,SAASld,KAAKvB,IAEjC4D,EAAQgC,KAAK,aAAa,GAErBjE,EAAM,EAAGA,EAAMpC,EAAQoC,IAYxB,KAXAiqC,EAASttB,EAAQ3c,IAEVwrC,WAAWluC,EAAQ4O,SAC1B+9B,EAAOviB,WAAWpqB,GAElBe,EAAKotC,qBAAqBxB,EAAOkB,SAEjClB,EAAOyB,QAAQhgC,EAAO3J,GAIjBspC,EAAM,EAAGE,GAFdD,EAAWrB,EAAOqB,YAEsB1tC,OAAQytC,EAAME,EAAgBF,IAClEC,EAASD,GAAKxuB,SAASvf,EAAQuf,UAAUuuB,MAKjD,IAAK,IAAIO,KAAcruC,EAAQqf,QAC3BxjB,EAAO4I,EAAKzE,EAAQqf,QAAQgvB,GAAYtmC,YAyB5C,IArBKpD,EAAQU,GAAG,aACZxJ,EAAOuS,EAAO,CAAEzI,QAAShB,EAAQgC,KAAK,eAAiB,UAGvD8Q,IAAezX,EAAQsuC,QACvBluC,EAASuE,EAAQgC,KAAK,sBAGlByH,EAAQvS,EAAOuE,EAAQgO,IAI/BA,EAAQ29B,EAAapnC,EAASyJ,GAE1BqJ,IAAeD,IACfpJ,EAAQ09B,EAAkB19B,IAG9BzJ,EAAQe,IAAI0I,GACJ1I,IAAIilC,GAEPjoC,EAAM,EAAGA,EAAMpC,EAAQoC,IACxB2c,EAAQ3c,GAAK6rC,QAUjB,OAPIvuC,EAAQiB,MACRjB,EAAQiB,OAGZ0D,EAAQgC,KAAK,kBAAmBlC,GAChCge,EAAG9C,QAAQhb,EAASF,EAAK5I,EAAO,GAAImE,EAAS,CAAEwf,SAAUolB,EAAS4J,WAE3D5J,EAAS9kB,WAGpBW,KAAM,WACFhlB,EAAE3C,KAAK6L,SAAS2b,WAAU,GAAM,IAGpC6tB,qBAAsB,SAASN,GAM3B,IALA,IACIrsC,EADAmD,EAAU7L,KAAK6L,QAEftE,EAAI,EACJC,EAASutC,EAAQvtC,OAEdD,EAAIC,EAAQD,IACfmB,EAAQqsC,EAAQxtC,GAEhBvH,KAAK+0C,QAAQpzC,KAAK+G,GAEbmD,EAAQgC,KAAKnF,IACdmD,EAAQgC,KAAKnF,EAAOmD,EAAQe,IAAIlE,KAK5CitC,gBAAiB,WAGb,IAFA,IAAI9pC,EAAU7L,KAAK6L,QAEVtE,EAAI,EAAGC,EAASxH,KAAK+0C,QAAQvtC,OAAQD,EAAIC,EAAQD,IAAM,CAC5D,IAAImB,EAAQ1I,KAAK+0C,QAAQxtC,GACzBsE,EAAQe,IAAIlE,EAAOmD,EAAQgC,KAAKnF,MAIxCge,SAAU,WACN,IAAIze,EAAOjI,KACP4J,EAAM,EACNiC,EAAU5D,EAAK4D,QACf3E,EAAUe,EAAKf,QACfqf,EAAUte,EAAKse,QACf/e,EAAS+e,EAAQ/e,OAgBrB,IAdAqE,EACKomB,WAAW,aACX9K,UAEDjgB,EAAQiG,MACRtB,EAAQgC,KAAK,aAAchC,EAAQe,IAAI,YAAYO,OAGvDnN,KAAK21C,kBAEDxF,IAAYxxB,GACZma,WAAW94B,KAAK21C,gBAAgBnsC,KAAKxJ,MAAO,GAGzC4J,EAAMpC,EAAQoC,IACjB2c,EAAQ3c,GAAK+c,WAGbzf,EAAQ0f,kBACR1f,EAAQ0f,iBAAiB/a,MAKrC8d,EAAG3C,QAAU,SAASnb,EAAS3E,GAC3B,IACI0uC,EAGA/B,EAJAttB,EAAU,GAEVsvB,EAAY,IAAIf,EAAUjpC,EAAS3E,GACnC4uC,EAAgBn1C,EAAM0sB,aAAanmB,EAAQqf,SAK/C,IAAK,IAAIgvB,KAFTruC,EAAQqf,QAAUuvB,EAEKA,GACnBF,EAAcjsB,EAAGosB,EAAWR,OAGxB1B,EAAS,IAAI+B,EAAY/pC,EAASiqC,EAAcP,GAAYvB,WAC5DztB,EAAQ5kB,KAAKkyC,IAIjBttB,EAAQ,GACRsvB,EAAUb,IAAIzuB,IAET1a,EAAQU,GAAG,aACZV,EAAQe,IAAI,CAAEC,QAAShB,EAAQgC,KAAK,eAAiB,UAAWjB,IAAI,WAGpE1F,EAAQiB,MACRjB,EAAQiB,OAGZ0D,EAAQsb,UACR0uB,EAAUnvB,aAIlB3jB,EAAO4mB,EAAI,CACP9C,QAAS,SAASqN,EAAUjlB,EAAY/H,GACpC,IAAI8uC,GAAuC,IAAvB9uC,EAAQgrC,kBACrBhrC,EAAQgrC,WAEXxzB,GAAe,eAAgBiL,GAAMqsB,EACrCrsB,EAAGuoB,WAAWhe,EAAUjlB,EAAY/H,GAEhCyX,EACAuV,EAASrN,QAAQmsB,EAAkB/jC,GAAa,CAAE8X,OAAO,EAAO7Z,MAAM,EAAOC,MAAM,EAAOsZ,SAAUvf,EAAQuf,SAAUC,SAAUxf,EAAQwf,WAExIwN,EAASlxB,MAAK,WACV,IAAI6I,EAAUlJ,EAAE3C,MACZi2C,EAAW,GAEfjzC,EAAK2tC,GAAgB,SAAS/mC,EAAKlB,GAC/B,IAAI27B,EACAuG,EAAe37B,EAAaA,EAAWvG,GAAS,IAAM,KAE1D,GAAIkiC,EAAc,CACd,IAAIsL,EAASjnC,EAEb,GAAIvG,KAAS+mC,GAAmBxgC,EAAWvG,KAAW9F,EAClDyhC,EAASuG,EAAaz6B,MAAMmgC,GACxB3xB,GACA5b,EAAOmzC,EAAQ,CAAExG,OAAQrL,EAAO,UAGpC,GAAI37B,KAASonC,GAAuB7gC,EAAWvG,KAAW9F,EAAa,CACnE,IAAIkK,EAAWjB,EAAQe,IAAI8kC,GACvByE,EAAuB,YAAZrpC,GAAsC,SAAZA,EAEpCjB,EAAQgC,KAAK4jC,KACV0E,EACAtqC,EAAQgC,KAAK4jC,EAAW,CACpBptB,IAAK0uB,EAASlnC,EAAS,QAAU,EACjC+f,KAAMmnB,EAASlnC,EAAS,SAAW,EACnCigB,OAAQinB,EAASlnC,EAAS,UAC1BggB,MAAOknB,EAASlnC,EAAS,WAG7BA,EAAQgC,KAAK4jC,EAAW,CACpBptB,IAAK0uB,EAASlnC,EAAS,cAAgB,EACvC+f,KAAMmnB,EAASlnC,EAAS,eAAiB,KAKrD,IAAIuqC,EAAmBvqC,EAAQgC,KAAK4jC,GAGpC,GADApN,EAASuG,EAAaz6B,MAAMmgC,GAChB,CAER,IAAI+F,EAAc5E,cAAT/oC,EAA2B,GAAS27B,EAAO,GAChDiS,EAAc7E,cAAT/oC,GAA4B27B,EAAO,IAAMA,EAAO,GAErD8R,GACKrtC,MAAMstC,EAAiBvqB,OAGnB/iB,MAAMutC,IAAOtzC,EAAOmzC,EAAQ,CAAEtqB,KAAMwqB,EAAiBxqB,KAAOyqB,IAF5DvtC,MAAMutC,IAAOtzC,EAAOmzC,EAAQ,CAAErqB,MAAOuqB,EAAiBvqB,MAAQwqB,IAKlEvtC,MAAMstC,EAAiBtqB,QAGnBhjB,MAAMwtC,IAAOvzC,EAAOmzC,EAAQ,CAAE7xB,IAAK+xB,EAAiB/xB,IAAMiyB,IAF1DxtC,MAAMwtC,IAAOvzC,EAAOmzC,EAAQ,CAAEpqB,OAAQsqB,EAAiBtqB,OAASwqB,MAKpExtC,MAAMutC,IAAOtzC,EAAOmzC,EAAQ,CAAEK,WAAYH,EAAiBxqB,KAAOyqB,IAClEvtC,MAAMwtC,IAAOvzC,EAAOmzC,EAAQ,CAAEM,UAAWJ,EAAiB/xB,IAAMiyB,OAMhF33B,GAAuB,SAATjW,GAAoBA,KAASwtC,UACrCA,EAAOxtC,GAGdwtC,GACAnzC,EAAOkzC,EAAUC,OAKzBn0B,EAAQsB,aACD4yB,EAASvG,MAGpB7jC,EAAQgb,QAAQovB,EAAU,CAAElvB,OAAO,EAAO7Z,MAAM,EAAOC,MAAM,EAAOsZ,SAAUvf,EAAQuf,SAAUC,SAAUxf,EAAQwf,iBAOtIiD,EAAGpC,gBAAkBoC,EAAG3C,QAExB,IAAIyvB,EAAS91C,EAAMiH,MAAM7E,OAAO,CAC5BoF,KAAM,SAAS0D,EAASmoC,GACpB,IAAI/rC,EAAOjI,KACXiI,EAAK4D,QAAUA,EACf5D,EAAKyuC,WAAa1C,EAClB/rC,EAAKf,QAAU,GACfe,EAAK0uC,mBAAqB,GAErB1uC,EAAK8sC,UACN9sC,EAAK8sC,QAAU,KAKvBj/B,QAAS,WAEL,OADA9V,KAAK42C,UAAW,EACT52C,KAAKg1C,OAGhB6B,KAAM,WAEF,OADA72C,KAAK42C,UAAW,EACT52C,KAAKg1C,OAGhB/nC,IAAK,SAAS6pC,GAEV,OADA92C,KAAK22C,mBAAmBh1C,KAAKm1C,GACtB92C,MAGXg0C,UAAW,SAAStrC,GAEhB,OADA1I,KAAK02C,WAAahuC,EACX1I,MAGXymB,SAAU,SAASA,GAEf,OADAzmB,KAAK+2C,UAAYtwB,EACVzmB,MAGXg3C,aAAc,WACV,IAAI/uC,EAAOjI,KACP61C,EAAY,IAAIf,EAAU7sC,EAAK4D,QAAS,CAAEiK,QAAS7N,EAAK2uC,SAAUnwB,SAAUxe,EAAK8uC,YACjFxwB,EAAUte,EAAK0uC,mBAAmBv5B,OAAO,CAAEnV,IAE/C,OAAO4tC,EAAUb,IAAIzuB,IAGzByuB,IAAK,WACD,GAAIh1C,KAAK22C,oBAAsB32C,KAAK22C,mBAAmB,GACnD,OAAO32C,KAAKg3C,eAGhB,IAKItuC,EAIApB,EATAW,EAAOjI,KACP6L,EAAU5D,EAAK4D,QACfjC,EAAM,EACNmrC,EAAU9sC,EAAK8sC,QACfvtC,EAASutC,EAAQvtC,OAEjBskC,EAAWnpC,EAAEopC,WACbz2B,EAAQ,GACR3J,EAAM,GAENupC,EAAWjtC,EAAKitC,WAChBC,EAAiBD,EAAS1tC,OAM9B,IAJAskC,EAASS,KAAKtkC,EAAKgvC,UAAUztC,KAAKvB,IAElC4D,EAAQgC,KAAK,aAAa,GAErBjE,EAAM,EAAGA,EAAMpC,EAAQoC,IACxBlB,EAAQqsC,EAAQnrC,GAEXiC,EAAQgC,KAAKnF,IACdmD,EAAQgC,KAAKnF,EAAOmD,EAAQe,IAAIlE,IAIxC,IAAKkB,EAAM,EAAGA,EAAMurC,EAAgBvrC,IAChCsrC,EAAStrC,GAAK6c,SAASxe,EAAK8uC,WAAW/B,MA8B3C,OA3BA/sC,EAAKqtC,QAAQhgC,EAAO3J,GAEfE,EAAQU,GAAG,aACZxJ,EAAOuS,EAAO,CAAEzI,QAAShB,EAAQgC,KAAK,eAAiB,UAGvD8Q,IACArX,EAASuE,EAAQgC,KAAK,sBAGlByH,EAAQvS,EAAOuE,EAAQgO,IAI/BA,EAAQ29B,EAAapnC,EAASyJ,GAE1BqJ,IAAeD,IACfpJ,EAAQ09B,EAAkB19B,IAG9BzJ,EAAQe,IAAI0I,GAAO1I,IAAIilC,GAEvB5pC,EAAKwtC,QAEL5pC,EAAQgC,KAAK,kBAAmBlC,GAChCge,EAAG9C,QAAQhb,EAASF,EAAK,CAAE8a,SAAUxe,EAAK8uC,UAAWrwB,SAAUolB,EAAS4J,UAEjE5J,EAAS9kB,WAGpBW,KAAM,WACF,IAAI/d,EAAM,EACNsrC,EAAWl1C,KAAKk1C,WAChBC,EAAiBD,EAAS1tC,OAE9B,IAAKoC,EAAM,EAAGA,EAAMurC,EAAgBvrC,IAChCsrC,EAAStrC,GAAK+d,OAIlB,OADAhlB,EAAE3C,KAAK6L,SAAS2b,WAAU,GAAM,GACzBxnB,MAGX21C,gBAAiB,WAGb,IAFA,IAAI9pC,EAAU7L,KAAK6L,QAEVtE,EAAI,EAAGC,EAASxH,KAAK+0C,QAAQvtC,OAAQD,EAAIC,EAAQD,IAAM,CAC5D,IAAImB,EAAQ1I,KAAK+0C,QAAQxtC,GACzBsE,EAAQe,IAAIlE,EAAOmD,EAAQgC,KAAKnF,MAIxCuuC,UAAW,WACP,IAAIhvC,EAAOjI,KACP6L,EAAU5D,EAAK4D,QAEnBA,EACKomB,WAAW,aACX9K,UAELlf,EAAK0tC,kBAED1tC,EAAKivC,cACLrrC,EAAQgC,KAAK,aAAchC,EAAQe,IAAI,YAAYO,OAGnDgjC,IAAYxxB,GACZma,WAAW7wB,EAAK0tC,gBAAgBnsC,KAAKvB,GAAO,GAGhDA,EAAK0e,YAIT2K,WAAY,SAASpqB,GACjBnE,GAAO,EAAM/C,KAAKkH,QAASA,IAG/BguC,SAAU,WACN,MAAO,IAGXgC,WAAYv0C,EAAEQ,KAEdsyC,MAAO9yC,EAAEQ,KACTmyC,QAAS3yC,EAAEQ,KACXwjB,SAAUhkB,EAAEQ,KACZmqB,WAAY,GAEZ8nB,WAAY,SAASt/B,GAEjB,OADA9V,KAAK42C,SAAW9gC,EACT9V,QAIf,SAAS+1C,EAAWoB,GAChB,OAAOA,EAAKrsC,OAAO,GAAGiE,cAAgBooC,EAAKnsC,UAAU,GAGzD,SAASosC,EAAah1C,EAAMi1C,GACxB,IAAIzB,EAAca,EAAO1zC,OAAOs0C,GAC5B/pB,EAAasoB,EAAYvtC,UAAUilB,WAEvC3D,EAAGosB,EAAW3zC,IAASwzC,EAEvBjsB,EAAGzC,QAAQ7e,UAAUjG,GAAQ,SAAS4xC,EAAWsD,EAAMC,EAAMC,GACzD,OAAO,IAAI5B,EAAY51C,KAAK6L,QAASmoC,EAAWsD,EAAMC,EAAMC,IAGhEx0C,EAAKsqB,GAAY,SAAS1jB,EAAK6tC,GAC3B9tB,EAAGzC,QAAQ7e,UAAUjG,EAAO2zC,EAAW0B,IAAiB,SAASH,EAAMC,EAAMC,GACzE,OAAO,IAAI5B,EAAY51C,KAAK6L,QAAS4rC,EAAcH,EAAMC,EAAMC,OAK3E,IAAIE,EAAkB,CAAC,OAAQ,QAAS,KAAM,QAC1CC,EAAS,CAAC,KAAM,OAmEpB,SAASC,GAAmBx1C,EAAMmL,EAAUsqC,EAAcC,GACtDV,EAAah1C,EAAM,CACfkrB,WAAYqqB,EAEZI,WAAY,SAASrvC,GAEjB,OADA1I,KAAKg4C,YAActvC,EACZ1I,MAGXi4C,SAAU,SAASvvC,GAEf,OADA1I,KAAKk4C,UAAYxvC,EACV1I,MAGXk3C,WAAY,WACT,OAAOl3C,KAAKm4C,aAGf7C,QAAS,SAAShgC,EAAO3J,GACrB,IACIosC,EACAE,EACAvqB,EAA0B,QAApB1tB,KAAK02C,WACX0B,EAJOp4C,KAIe6L,QAAQgC,KAAKN,GAInCwqC,IAHwBjvC,MAAMsvC,IAAmBA,GAAkBP,GAGtDO,OACsB,IAArBp4C,KAAKg4C,YACNh4C,KAAKg4C,YAELtqB,EAAMmqB,EAAeC,EAIlCG,OAD0B,IAAnBj4C,KAAKk4C,UACDl4C,KAAKk4C,UAELxqB,EAAMoqB,EAAaD,EAG9B73C,KAAK42C,UACLthC,EAAM/H,GAAY0qC,EAClBtsC,EAAI4B,GAAYwqC,IAEhBziC,EAAM/H,GAAYwqC,EAClBpsC,EAAI4B,GAAY0qC,GA1BTj4C,KA6BNm4C,YAAcxsC,EAAI4B,KAAcuqC,KAjHjDV,EAAa,UAAW,CACpB9pB,WAAYoqB,EAEZW,QAAS,SAAS3vC,GAEd,OADA1I,KAAKkH,QAAQmxC,QAAU3vC,EAChB1I,MAGXs1C,QAAS,SAAShgC,EAAO3J,GACrB,IACI2sC,EADArwC,EAAOjI,KAEP6L,EAAU5D,EAAK4D,QACfE,EAAapL,EAAMqL,YACnBC,EAActL,EAAMuL,aACpB8nC,EAAY1mB,EAAWrlB,EAAKyuC,YAE5BqB,GADU/D,EAAU5B,UAAY4B,EAAU7B,SAAWlmC,EAAYJ,GAAWE,EAAWF,KAChE5D,EAAKf,SAAWe,EAAKf,QAAQmxC,SAAW,GAAKpH,EAGpEhpC,EAAK2uC,WACL0B,EAAMhjC,EACNA,EAAQ3J,EACRA,EAAM2sC,GAGN35B,GACArJ,EAAM0+B,EAAU9B,YAAc6F,EAC9BpsC,EAAIqoC,EAAU9B,YAVH,QAYX58B,EAAM0+B,EAAUzmC,UAAYwqC,EAC5BpsC,EAAIqoC,EAAUzmC,UAbH,UAkBvB6pC,EAAa,OAAQ,CACjB9pB,WAAYoqB,EAEZvvC,KAAM,SAAS0D,EAASmoC,EAAWuE,GAC/B9B,EAAOpuC,UAAUF,KAAKoC,KAAKvK,KAAM6L,EAASmoC,GAC1Ch0C,KAAKkH,QAAU,CAAEqxC,SAAUA,IAG/BC,gBAAiB,SAAS9vC,GAEtB,OADA1I,KAAKkH,QAAQsxC,gBAAkB9vC,EACxB1I,MAGXk1C,SAAU,WACN,IAAIjtC,EAAOjI,KACP8V,EAAU7N,EAAK2uC,SACf2B,EAAWtwC,EAAKf,QAAQqxC,SACxBF,EAAUpwC,EAAKf,QAAQsxC,iBAAmB,EAC1CpZ,EAAMn3B,EAAKyuC,WAEXxB,EAAW,CAAEv0C,EAAMgpB,GAAG1hB,EAAK4D,SAAS4sC,QAAQrZ,GAAKgW,WAAWt/B,IAMhE,OAJIyiC,GACArD,EAASvzC,KAAMhB,EAAMgpB,GAAG4uB,GAAUE,QAAQnrB,EAAW8R,GAAKtpB,SAASuiC,QAAQA,GAASjD,YAAYt/B,IAG7Fo/B,KAyDf0C,GAAmB,OAAQ,UAAW,EAAG,GACzCA,GAAmB,OAAQ,QAAS,EAAG,KAEvCR,EAAa,cAAe,CACxB9B,QAAS,SAAShgC,EAAO3J,GACrB,IAKI+sC,EALAzwC,EAAOjI,KACP6L,EAAU5D,EAAK4D,QACf3E,EAAUe,EAAKf,QACfyxC,EAAS9sC,EAAQgC,KAAKyjC,GACtBv0B,EAAS7V,EAAQ6V,OAEjBjH,EAAU7N,EAAK2uC,SAEd9gC,GAAsB,OAAX6iC,GACZ9sC,EAAQgC,KAAKyjC,EAAQvoC,WAAW8C,EAAQe,IAAI,UAAY1F,EAAQ69B,QAGpE2T,EAAU7sC,EAAQgC,KAAKyjC,IAAW,EAClC3lC,EAAI,UAAYzE,EAAQ69B,MAASjvB,EAA4B4iC,EAAlBA,EAAS37B,KAI5Dq6B,EAAa,UAAW,CACpB9B,QAAS,SAAShgC,EAAO3J,GACrB,IAAI1D,EAAOjI,KACP6L,EAAU5D,EAAK4D,QAEfkR,EADU9U,EAAKf,QACE6V,OAAOnS,MAAM,KAC9BkL,EAAU7N,EAAK2uC,SAEfj4B,GACAhT,EAAIqkC,WAAcl6B,EAAsB,EAAZiH,EAAO,GACnCpR,EAAIskC,WAAcn6B,EAAsB,EAAZiH,EAAO,KAEnCpR,EAAIigB,KAAQ9V,EAAsB,EAAZiH,EAAO,GAC7BpR,EAAI0Y,IAAOvO,EAAsB,EAAZiH,EAAO,IAEhClR,EAAQe,IAAI,WAIpBwqC,EAAa,SAAU,CACnB9pB,WAAY,CAAC,aAAc,YAE3BynB,QAAS,CAAEvD,GAEX8D,QAAS,SAAShgC,EAAO3J,GACrB,IAAI1D,EAAOjI,KACP6L,EAAU5D,EAAK4D,QACf3E,EAAUe,EAAKf,QACf4O,EAAU7N,EAAK2uC,SACfrpC,EAA+B,aAApBtF,EAAKyuC,WAA4BtF,EAASD,EACrDyH,EAAY/sC,EAAQ,GAAGY,MAAMc,GAC7BsrC,EAAYhtC,EAAQgC,KAAKN,GACzB/F,EAASuB,WAAW8vC,GAAaD,GACjCE,EAAa/iC,EAAMlK,EAAQe,IAAIW,EAAU2jC,GAAM3jC,MAEnD+H,EAAMoX,SAAW2kB,EAEjB7pC,EAAUN,GAAWA,EAAQsuC,MAASsD,GAActxC,EAASA,GAAUsxC,EAEvEntC,EAAI4B,IAAauI,EAAU,EAAItO,GAAUypC,EACzC37B,EAAM/H,IAAauI,EAAUtO,EAAS,GAAKypC,EAEvC4H,IAAcj2C,GACdiJ,EAAQgC,KAAKN,EAAUqrC,IAI/B1B,WAAY,WACT,OAAOl3C,KAAK42C,UAGfjwB,SAAU,WACN,IACI9a,EADO7L,KACQ6L,QACf0B,EAA+B,aAFxBvN,KAES02C,WAA4BtF,EAASD,EACrD3pC,EAASqE,EAAQgC,KAAKN,GAEtB/F,GAAU0pC,GAphCV,KAohCkB1pC,GAClBsxB,YAAW,WAAajtB,EAAQe,IAAIW,EAAU2jC,GAAMtkC,IAAIW,KAAc,MAKlF,IAAIwrC,GAAuB,CAAEjsC,SAAU,WAAYypC,WAAY,EAAGC,UAAW,EAAG9G,MAAO,GAOvF0H,EAAa,WAAY,CACrBjvC,KAAM,SAAS0D,EAASvE,GACpBtH,KAAK6L,QAAUA,EACf7L,KAAKkH,QAAU,CAAEI,OAAQA,GACzBtH,KAAK+0C,QAAU,IAGnBU,MAAO,WACHz1C,KAAK6L,QAAQqhC,SAAS99B,SAAS4O,OAGnCs3B,QAAS,SAAShgC,EAAO3J,GACrB,IAAI1D,EAAOjI,KACP6L,EAAU5D,EAAK4D,QACfmtC,EAAWrvB,EAAGsvB,IAAIptC,GAClBqtC,EAAWvvB,EAAGsvB,IAAIhxC,EAAKf,QAAQI,QAC/B6xC,EAAe5G,EAAkB1mC,EAAS,SAC1C6jC,EAAQ/lB,EAAGyvB,UAAUF,EAAUF,GAC/BK,EAAkB1vB,EAAG0vB,gBAAgBH,EAAUF,GAEnDj2C,EAAOuS,EAAOyjC,IACdptC,EAAI+jC,MAAQ,EAEZ7jC,EAAQe,IAAIilC,EAAW,YAAYjlC,IAAIilC,GACvChmC,EAAQe,IAAIilC,EAAW,SAAWsH,EAAe,KAEjD7jC,EAAM+O,IAAM20B,EAAS30B,IACrB/O,EAAMsW,KAAOotB,EAASptB,KACtBtW,EAAM+jC,gBAAkBA,EAAgBj0C,EAAI6rC,EAAK,IAAMoI,EAAgBl1C,EAAI8sC,EAEvEhpC,EAAK2uC,SACLthC,EAAMo6B,MAAQA,EAEd/jC,EAAI+jC,MAAQA,KAMxB,IAAI4J,GAAQ,CACRj1B,IAAK,6BACLyH,OAAQ,6BACRF,KAAM,6BACNC,MAAO,8BAGP0tB,GAAY,CACZl1B,IAAK,CAAE/O,MAAO,gBAAiB3J,IAAK,mBACpCmgB,OAAQ,CAAExW,MAAO,mBAAoB3J,IAAK,iBAC1CigB,KAAM,CAAEtW,MAAO,gBAAiB3J,IAAK,oBACrCkgB,MAAO,CAAEvW,MAAO,kBAAmB3J,IAAK,kBAG5C,SAAS6tC,GAAWnjB,EAAW2d,GAC3B,IACIvkC,EAAQ4mB,EADG11B,EAAM2sB,WAAW0mB,GAAW7B,SACVf,EAASD,KAAW,EAAK,KAE1D,OAAOmI,GAAMtF,GAAWvxC,QAAQ,QAASgN,GAG7C2nC,EAAa,cAAe,CACxB9pB,WAAYoqB,EAEZvvC,KAAM,SAAS0D,EAASmoC,EAAW3d,GAC/BogB,EAAOpuC,UAAUF,KAAKoC,KAAKvK,KAAM6L,EAASmoC,GAC1Ch0C,KAAKy5C,WAAapjB,GAGtBif,QAAS,SAAShgC,EAAO3J,GACrB,IAAI1D,EAAOjI,KACP8V,EAAU7N,EAAK2uC,SACf5C,EAAYl+B,EAAUwX,EAAWrlB,EAAKyuC,YAAY5gC,QAAU7N,EAAKyuC,WACjEgD,EAAWH,GAAUvF,GAEzB1+B,EAAMqkC,OAAS,EAEX1xC,EAAK2xC,cACNtkC,EAAMukC,KAAOL,GAAWvxC,EAAKwxC,WAAY94C,EAAM2sB,WAAW0mB,GAAWl+B,UAGxER,EAAMw8B,GAAYT,EAElB1lC,EAAIkmC,GAAaI,GAAyBn8B,EAAU4jC,EAASpkC,MAAQokC,EAAS/tC,KAC9E2J,EAAMu8B,GAAaI,GAAyBn8B,EAAU4jC,EAAS/tC,IAAM+tC,EAASpkC,QAGlFmgC,MAAO,WACHz1C,KAAKy5C,WAAWK,OAAO95C,KAAK6L,UAGhCkuC,KAAM,SAASrxC,GAEX,OADA1I,KAAKg6C,MAAQtxC,EACN1I,MAGXk3C,WAAY,WACR,IACIphC,EADO9V,KACQ42C,SACfmD,EAFO/5C,KAEKg6C,MAEhB,OAAQlkC,IAAYikC,IAAWjkC,GAAWikC,GAG9CP,WAAY,SAAS9wC,GAEjB,OADA1I,KAAK45C,YAAclxC,EACZ1I,MAGXi6C,UAAW,WAEP,OADAj6C,KAAK6L,QAAQyY,SAAS,aACftkB,QAIfo3C,EAAa,aAAc,CACvB9pB,WAAYoqB,EAEZvvC,KAAM,SAAS0D,EAASmoC,EAAW3d,GAC/BogB,EAAOpuC,UAAUF,KAAKoC,KAAKvK,KAAM6L,EAASmoC,GAC1Ch0C,KAAKy5C,WAAapjB,GAGtB0e,QAAS,CAAC,QAEVO,QAAS,SAAShgC,EAAO3J,GACrB,IAAI1D,EAAOjI,KACPg0C,EAAY/rC,EAAK2uC,SAAWtpB,EAAWrlB,EAAKyuC,YAAY5gC,QAAU7N,EAAKyuC,WAE3EphC,EAAMukC,KAAOL,GAAWvxC,EAAKwxC,WAAYzF,GACzC1+B,EAAMqhB,QAAU,KAChBhrB,EAAIgrB,QAAU,GAGlBugB,WAAY,WACR,IACIphC,EADO9V,KACQ42C,SACfmD,EAFO/5C,KAEKg6C,MAEhB,OAAQlkC,IAAYikC,IAAWjkC,GAAWikC,GAG9CA,KAAM,SAASrxC,GAEX,OADA1I,KAAKg6C,MAAQtxC,EACN1I,QAIfo3C,EAAa,WAAY,CACrB9pB,WAAY,CAAC,aAAc,YAE3BnlB,KAAM,SAAS0D,EAASmoC,EAAW+F,EAAMG,GACrCzD,EAAOpuC,UAAUF,KAAKoC,KAAKvK,KAAM6L,EAASmoC,GAC1Ch0C,KAAKkH,QAAU,GACflH,KAAKkH,QAAQ6yC,KAAOA,EACpB/5C,KAAKkH,QAAQgzC,KAAOA,GAGxBhF,SAAU,WACN,IAKIiF,EALAlyC,EAAOjI,KACPkH,EAAUe,EAAKf,QACf8sC,EAAgC,eAApB/rC,EAAKyuC,WAA8B,OAAS,MACxD0D,EAAmBz5C,EAAM2sB,WAAW0mB,GAAWl+B,QAC/CA,EAAU7N,EAAK2uC,SAEfyD,EAAYnzC,EAAQ6yC,KAAK5yC,OAAM,GAAMkqB,WAAW,MAChDipB,EAAYpzC,EAAQgzC,KAAK/yC,OAAM,GAAMkqB,WAAW,MAChDxlB,EAAU5D,EAAK4D,QAQnB,OANIiK,IACAqkC,EAAOnG,EACPA,EAAYoG,EACZA,EAAmBD,GAGhB,CACHx5C,EAAMgpB,GAAGziB,EAAQ6yC,MAAMQ,WAAWvG,EAAWnoC,GAASkuC,MAAK,GAAM3E,WAAWt/B,GAC5EnV,EAAMgpB,GAAGziB,EAAQgzC,MAAMK,WAAWH,EAAkBvuC,GAASupC,WAAWt/B,GACxEnV,EAAMgpB,GAAG0wB,GAAWG,YAAYxG,EAAWnoC,GAASkuC,MAAK,GAAMP,YAAW,GAAMS,YAAY7E,WAAWt/B,GACvGnV,EAAMgpB,GAAG2wB,GAAWE,YAAYJ,EAAkBvuC,GAAS2tC,YAAW,GAAMS,YAAY7E,WAAWt/B,KAI3Gw/B,QAAS,SAAShgC,EAAO3J,GACrB2J,EAAMy8B,GAAeC,EACrB18B,EAAMmlC,eAAiB,cAEvBnlC,EAAMqhB,QAAU,KAChBhrB,EAAIgrB,QAAU,GAGlBhQ,SAAU,WACN3mB,KAAK6L,QAAQiqB,KAAK,cAAcgB,YAIxCsgB,EAAa,OAAQ,CACjB9pB,WAAY,CAAC,aAAc,YAE3BnlB,KAAM,SAAS0D,EAASmoC,EAAW+F,EAAMG,GACrCzD,EAAOpuC,UAAUF,KAAKoC,KAAKvK,KAAM6L,EAASmoC,GAC1Ch0C,KAAKkH,QAAU,GACflH,KAAKkH,QAAQ6yC,KAAOA,EACpB/5C,KAAKkH,QAAQgzC,KAAOA,GAGxBhF,SAAU,WACN,IAKIiF,EALAlyC,EAAOjI,KACPkH,EAAUe,EAAKf,QACf8sC,EAAgC,eAApB/rC,EAAKyuC,WAA8B,OAAS,MACxD0D,EAAmBz5C,EAAM2sB,WAAW0mB,GAAWl+B,QAC/CA,EAAU7N,EAAK2uC,SAEf/qC,EAAU5D,EAAK4D,QAQnB,OANIiK,IACAqkC,EAAOnG,EACPA,EAAYoG,EACZA,EAAmBD,GAGhB,CACHx5C,EAAMgpB,GAAGziB,EAAQ6yC,MAAMS,YAAYxG,EAAWnoC,GAASkuC,MAAK,GAAM3E,WAAWt/B,GAC7EnV,EAAMgpB,GAAGziB,EAAQgzC,MAAMM,YAAYJ,EAAkBvuC,GAASupC,WAAWt/B,KAIjFw/B,QAAS,SAAShgC,GACdA,EAAMy8B,GAAeC,EACrB18B,EAAMmlC,eAAiB,iBAI/B,IAAIC,IAAoBn3C,EAAQmf,SAASrC,QAGzC+2B,EAAa,UAAW,CACpBuD,QAASh4C,EAAEQ,KACXy3C,OAAQj4C,EAAEQ,KACVgF,KAAM,SAAS0D,EAAS0sC,EAAUsC,GAC9BpE,EAAOpuC,UAAUF,KAAKoC,KAAKvK,KAAM6L,GACjC7L,KAAK86C,UAAYn4C,EAAE41C,GACnBv4C,KAAK+6C,iBAAmBF,GAG5Bp0B,SAAU,WACN,MAAM,IAAIhW,MAAM,kIAGpBuqC,iBAAkB,SAASjyB,GAEvB,OADA/oB,KAAK26C,QAAU5xB,EACR/oB,MAGXi7C,gBAAiB,SAASlyB,GAEtB,OADA/oB,KAAK46C,OAAS7xB,EACP/oB,MAGXk7C,MAAO,WACH,OAAOv4C,IAAIsK,IAAIjN,KAAKm7C,UAAUluC,IAAIjN,KAAK86C,YAG3CM,gBAAiB,WACb,IAAIpH,EAAYh0C,KAAK02C,WACjB2E,EAAiB,wBAA0Br7C,KAAK+6C,iBAUpD,OARI/G,IACAqH,GAAkB,SAAWrH,GAG7Bh0C,KAAK42C,WACLyE,GAAkB,iBAGfA,GAGX30B,SAAU,SAAS/hB,GACf,MAAK3E,KAAK8rC,UAAannC,GAAKhC,EAAEgC,EAAE2C,QAAQiF,GA7CT,iDA6C/B,CAIA,IAAI8pB,EAAYr2B,KAAKq2B,UAErBA,EACKnK,YAAY,YACZA,YAAYlsB,KAAKo7C,mBACjBpiB,IAAIta,EAAYS,MAAOnf,KAAKs7C,eAEjCt7C,KAAK86C,UAAU3tC,OAAO+e,YAAY,gBAClClsB,KAAK6L,QAAQqgB,YAAY,aAErBwuB,IACArkB,EAAUzpB,IAAI4kC,EAAU,IAGvBxxC,KAAKu7C,YACNv7C,KAAKk7C,QAAQtuC,IAAI8kC,EAAU,IAG/B1xC,KAAK8rC,SAAS4J,iBACP11C,KAAK8rC,WAGhBkJ,IAAK,WACD,GAAIh1C,KAAK22C,oBAAsB32C,KAAK22C,mBAAmB,GACnD,OAAO32C,KAAKg3C,eAGhB,IAAI/uC,EAAOjI,KACP6L,EAAU5D,EAAK4D,QACf0sC,EAAWtwC,EAAK6yC,UAChBzkB,EAAYxqB,EAAQusB,UAAUpC,OAAOuiB,EAASngB,WAAWluB,QACzDsxC,EAAOvzC,EAAKizC,QACZpP,EAAWnpC,EAAEopC,WACbqK,EAAmBvqC,EAAQe,IAAI8kC,GA0CnC,OAtCKrb,EAAU7uB,SACX6uB,EAAYxqB,EAAQM,UAGxBnM,KAAKq2B,UAAYA,EACjBr2B,KAAK8rC,SAAWA,EAChB9rC,KAAKu7C,WAAiC,YAApBnF,EAEbp2C,KAAKu7C,YACNC,EAAK5uC,IAAI8kC,EAAU,YAGnBgJ,KACmBrkB,EAAUzpB,IAAI4kC,GACjCnb,EAAUzpB,IAAI4kC,EAAU,WAGvB9yB,GAGD7S,EAAQyY,SAAS,eAEjB+R,EAAU/R,SAAStkB,KAAKo7C,mBAExBp7C,KAAKs7C,cAAgBt7C,KAAK0mB,SAASld,KAAKxJ,MACxCq2B,EAAUrN,GAAGtK,EAAYS,MAAOnf,KAAKs7C,eAErC36C,EAAMgjC,gBAAe,WACjB93B,EAAQqgB,YAAY,eAAe5H,SAAS,aAC5Ci0B,EAAS3rC,IAAI,UAAW,IAAI0X,SAAS,gBACrCrc,EAAK0yC,QAAQpC,EAAU1sC,GACvBlL,EAAMgjC,gBAAe,WACjBtN,EAAUnK,YAAY,cAAc5H,SAAS,YAC7Crc,EAAK2yC,OAAOrC,EAAU1sC,UAf9B7L,KAAK0mB,WAoBFolB,EAAS9kB,WAGpBW,KAAM,WACF3nB,KAAK0mB,cAIb,IAAI+0B,GAAY96C,EAAMiH,MAAM7E,OAAO,CAC/BoF,KAAM,WACF,IAAIF,EAAOjI,KACXiI,EAAKyzC,WAAazzC,EAAK0zC,MAAMnyC,KAAKvB,GAClCA,EAAK2zC,UAAW,GAGpBC,KAAMl5C,EAAEQ,KACRopC,KAAM5pC,EAAEQ,KACR24C,MAAOn5C,EAAEQ,KACT44C,SAAUp5C,EAAEQ,KAEZmS,MAAO,WACEtV,KAAKinB,YAILjnB,KAAKusC,OAINvsC,KAAK87C,SAHL97C,KAAK47C,UAAW,EAChBj7C,EAAMgjC,eAAe3jC,KAAK07C,eAMlCz0B,QAAS,WACL,OAAO,GAGXsT,OAAQ,WACJv6B,KAAK47C,UAAW,EAChB57C,KAAK+7C,YAGTJ,MAAO,WACH,IAAI1zC,EAAOjI,KACNiI,EAAK2zC,WAEV3zC,EAAK4zC,OAEA5zC,EAAKskC,QAGNtkC,EAAK2zC,UAAW,EAChB3zC,EAAK6zC,SAHLn7C,EAAMgjC,eAAe17B,EAAKyzC,gBAQlCM,GAAaP,GAAU14C,OAAO,CAC9BoF,KAAM,SAASjB,GAEXnE,EADW/C,KACEkH,GACbu0C,GAAU1zC,GAAGI,KAAKoC,KAFPvK,OAKfusC,KAAM,WACF,OAAOvsC,KAAKi8C,cAAgBj8C,KAAKymB,UAGrCw1B,WAAY,WACR,OAAO54C,KAAK8S,IAAInW,KAAKymB,SAAU,IAAKrY,KAAUpO,KAAKk8C,YAGvDC,OAAQ,SAASj1C,GACb,IAAIe,EAAOjI,KACPo8C,EAAUn0C,EAAKm0C,QAEnBn0C,EAAKo0C,QAAUD,EAAQn0C,EAAK88B,MAC5B98B,EAAK08B,MAAQz9B,EAAQob,SAAWra,EAAKo0C,QAErCp0C,EAAKwe,SAAsC,iBAApBvf,EAAQuf,SAAuBvf,EAAQuf,SAAW,IAEzExe,EAAK4zC,KAAO5zC,EAAKq0C,WAAWp1C,EAAQwsC,MAEpCzrC,EAAKi0C,UAAY,IAAI9tC,KACrBnG,EAAKqN,SAGTgnC,WAAY,SAAS5I,GACjB,IAAIzrC,EAAOjI,KAEX,OAAO,WACHiI,EAAKm0C,QAAQG,SAASt0C,EAAK88B,KAAM2O,EAAKzrC,EAAKg0C,aAAch0C,EAAKo0C,QAASp0C,EAAK08B,MAAO18B,EAAKwe,eAKpG1jB,EAAOi5C,GAAY,CACfQ,YAAa,SAASr3C,EAAG+f,EAAGxgB,EAAGF,GAC3B,OAAQW,GAAKX,EAAK0gB,EAAIxgB,EAAIA,GAAiC,EAA3BrB,KAAKomC,IAAI,GAAI,GAAKtkC,EAAIX,IAAU0gB,GAGpEu3B,YAAa,SAASt3C,EAAG+f,EAAGxgB,EAAGF,EAAGS,GAE9B,OAAOP,IAAMS,EAAIA,EAAIX,EAAI,GAAKW,KAD9BF,EAAI,SACoC,GAAKE,EAAIF,GAAK,GAAKigB,KAInEyE,EAAG8xB,UAAYA,GACf9xB,EAAGqyB,WAAaA,GAChBryB,EAAGytB,aAAeA,EAElBztB,EAAGsvB,IAAM,SAASptC,GAEd,IAAI0K,GADJ1K,EAAUlJ,EAAEkJ,IACSkR,SAGrB,OAFAxG,EAAOvJ,MAAQrM,EAAMqL,YAAYH,GACjC0K,EAAO5J,OAAShM,EAAMuL,aAAaL,GAC5B0K,GAGXoT,EAAG0vB,gBAAkB,SAASqD,EAAOC,GACjC,IAAIv3C,GAAKs3C,EAAM9wB,KAAO+wB,EAAM/wB,MAAQ+wB,EAAM3vC,OAAS2vC,EAAM3vC,MAAQ0vC,EAAM1vC,OACnE7I,GAAKu4C,EAAMr4B,IAAMs4B,EAAMt4B,KAAOs4B,EAAMhwC,QAAUgwC,EAAMhwC,OAAS+vC,EAAM/vC,QAEvE,MAAO,CACHvH,EAAG0D,MAAM1D,GAAK,EAAIA,EAClBjB,EAAG2E,MAAM3E,GAAK,EAAIA,IAI1BwlB,EAAGyvB,UAAY,SAASsD,EAAOC,GAC3B,OAAOt5C,KAAK8S,IAAIumC,EAAM1vC,MAAQ2vC,EAAM3vC,MAAO0vC,EAAM/vC,OAASgwC,EAAMhwC,SAGpEgd,EAAGizB,SAAW,SAASF,EAAOC,GAC1B,OAAOt5C,KAAKuV,IAAI8jC,EAAM1vC,MAAQ2vC,EAAM3vC,MAAO0vC,EAAM/vC,OAASgwC,EAAMhwC,SAniDxE,CAqiDG7L,OAAOH,MAAM+G,QACF/G,OAUd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACfoC,EAASJ,EAAEI,OACX85C,EAAU,OACVC,EAAa,WACb5zC,EAAavI,EAAMuI,WACnB6zC,EAAe,CACXllB,GAAI,KACJmlB,IAAK,KACLC,GAAI,KACJC,IAAK,KACLC,GAAI,KACJC,IAAK,KACLloB,SAAU,cACVmoB,eAAgB,cAChBC,SAAU,WACVC,WAAY,aACZC,OAAQ,KACRC,UAAW,KACXC,cAAe,KACfC,iBAAkB,KAClBC,QAAS,KACTC,WAAY,MAEhBC,EAA0B/6C,EAAO,GAAIg6C,EAAc,CAC/C7nB,SAAU,aAEd6oB,EAAU,CACNC,SAAUr7C,EAAEQ,KACZ86C,KAAMt7C,EAAEQ,KACR6yB,OAAQ,SAASqO,EAAQrO,EAAQkoB,GACzBloB,IACAA,EAASmoB,EAAcnoB,EAAQkoB,MAE3B7Z,EAAO+Z,QAAUpoB,IAI7B/Q,KAAM,SAASof,EAAQga,GACnB,IAAIhwB,EAAO1rB,EAAE2X,IAAI+jC,GAAS,SAAS31C,GAC/B,IAAI41C,EAAQ51C,EAAMsc,MAAMviB,QAAQ,MAAO,KAMvC,MAJkB,SAAdiG,EAAM02B,MACNkf,GAAS,SAGNA,KACRzzC,KAAK,KAEJwjB,IACAgW,EAAOka,SAAWlwB,IAG1BmwB,KAAM,SAASna,EAAQma,GACfA,IACAna,EAAOoa,MAAQD,IAGvBE,KAAM,SAASra,EAAQqa,GACfA,IACAra,EAAOsa,KAAOD,KAI1BE,EAAkB,CACdC,KAAM,CACFC,SAAU,UAItB,SAASX,EAAcnoB,EAAQ+oB,GAC3B,IAEIn1C,EACApC,EACAwd,EACAtf,EACAgL,EACAsuC,EACAt2C,EACAu2C,EATA1oC,EAAS,GACT2oC,EAAQlpB,EAAOkpB,OAAS,MASxBC,EAAUnpB,EAAOmpB,QAErB,IAAKv1C,EAAM,EAAGpC,EAAS23C,EAAQ33C,OAAQoC,EAAMpC,EAAQoC,IAEjDob,GADAgR,EAASmpB,EAAQv1C,IACFob,MACftc,EAAQstB,EAAOttB,MACfs2C,EAAWhpB,EAAOgpB,SAEdhpB,EAAOmpB,QACPnpB,EAASmoB,EAAcnoB,EAAQ+oB,IAE/BE,EAAajpB,EAAOipB,WACpBj6B,EAAQA,EAAMviB,QAAQ,MAAO,KAC7BuzB,EAAS+mB,EAAaiC,GAClBD,IACA/oB,EAAS8nB,EAAwBkB,IAGpB,kBAAbA,EACAhpB,EAASr1B,EAAM+P,OAAO,6BAA8BsU,EAAOgR,GACvC,qBAAbgpB,EACPhpB,EAASr1B,EAAM+P,OAAO,8BAA+BsU,EAAOgR,GACxC,WAAbgpB,GAAsC,cAAbA,EAChChpB,EAASr1B,EAAM+P,OAAO,eAAgBsU,EAAOgR,GACzB,YAAbgpB,GAAuC,eAAbA,EACjChpB,EAASr1B,EAAM+P,OAAO,aAAcsU,EAAOgR,GACpCA,GA3G3B,YA2GqCttB,IAEJ,YADbhD,EAAO/E,EAAM+E,KAAKgD,KAEdgI,EAAS,QACThI,EAAQA,EAAMjG,QAAQ,KAAM,OAET,IAAfw8C,IACAj6B,EAAQ,WAAaA,EAAQ,MAGjB,SAATtf,EACHq5C,GACAruC,EAAS,gCACThI,EAAQ/H,EAAMqc,SAAS5U,MAAMM,EAAO,YAEpCgI,EAAS,oCAGbA,EAAS,MAGTslB,EAAOxuB,OAAS,EACD,gBAAXwuB,EACAtlB,EAAS,WAAaA,EAAS,KAE/BA,EAAS,OAASA,EAAS,QACV,mBAAbsuC,IACID,GACAruC,EAAS,uBACTslB,EAAS,WAETtlB,GAAU,cAKtBA,EAAS,WAAaA,EAG1BslB,EAASr1B,EAAM+P,OAAOA,EAAQslB,EAAQttB,EAAOsc,KAIrDzO,EAAO5U,KAAKq0B,GAShB,OANAA,EAASzf,EAAO1L,KAAK,IAAMq0C,EAAQ,KAE/B3oC,EAAO/O,OAAS,IAChBwuB,EAAS,IAAMA,EAAS,KAGrBA,EAGX,SAASopB,EAAcryB,GACnB,IAAK,IAAI3qB,KAAQ2qB,EACkB,IAA3B3qB,EAAKuT,QAAQ,kBACNoX,EAAI3qB,GAKvB,SAASi9C,IACL,OAAOh8C,KAAKkN,MAA4B,OAArB,EAAIlN,KAAKosB,WAAqBve,SAAS,IAAIsK,OAAO,GAGzE,SAAS8jC,EAAetgC,GACpB,OAAOA,EAASqgC,IAAU,IAAMA,IAAU,IAAMA,IAGpD,SAASE,EAAgBC,EAAUC,GAC/B,IAAIlpC,EAASsmC,SAAiB2C,EAM9B,OAJIC,IACAlpC,GAAU,MAGPA,EAGX,SAASmpC,EAAcC,EAAW5Q,EAAM6Q,EAAUC,GAC7C,IAAIC,EAAeH,EAAUz4C,QAAQ24C,GAASzxB,IAC1C2xB,EAAgBp/C,EAAM+P,OAAO,OAAQkvC,GAEzC,OAAI12C,EAAW42C,GACJC,EAAgBD,EAAa/Q,GAE7BgR,EAAgBD,EAIhC,SAASE,EAAmBC,EAAWC,GACnC,IAAIC,EAAS,GAOb,OALAA,GAAUZ,EAAgBU,GAAW,GACrCE,GAAUtD,qCACVsD,GAAUtD,wCACVsD,GAAUtD,mBAA2BqD,EA+BzC,SAASE,EAAkBC,EAAWb,EAAUS,EAAWC,EAAUP,EAAWE,EAASS,GACrF,IAAIC,EAAc,GAOlB,OALAA,GAQJ,SAAqBf,EAASS,GAC1B,IAAIM,EAAc,GAKlB,OAHAA,GAAe,KAAOf,EAAW3C,EACjC0D,GAAe,2CAA6CN,EAAYpD,EAZzD2D,CAAYhB,EAAUS,GACrCM,GApBJ,SAAuBE,EAAYR,EAAWC,EAAUL,EAASF,EAAWW,GAGxE,IAFA,IAXyBvR,EACrB2R,EAUAH,EAAc,GAETh5C,EAAI,EAAGA,EAAIk5C,EAAWj5C,OAAQD,IACnCg5C,GAAeP,EAAmBC,EAAWC,GAC7CK,GAAezD,EAAa4C,EAAcC,EAAWc,EAAWl5C,GAAIo4C,EAAUz4C,QAAQ24C,GAASn6C,KAAMm6C,GAAW,YAC3GS,IACDC,IAjBiBxR,EAiBkB0R,EAAWl5C,GAhBlDm5C,WAAU,GAEdA,GAAW7D,2DACX6D,GAAW7D,oCACX6D,GAAW5D,EAAan8C,EAAM6R,UAAUu8B,KAcpCwR,GAAe1D,EACfqD,IAGJ,OAAOK,EAOQI,CAAcN,EAAWJ,EAAWC,EAAUL,EAASF,EAAWW,GACjFC,GAAehB,EAAgBU,GAAW,GAC1CM,GAAe1D,EAgGnB95C,GAAO,EAAMpC,EAAMkN,KAAM,CACrB+yC,QAAS,CACLC,MAAO,CACHn7C,KAAM,OACNmI,KAAM,SAASA,GACX,OAAOA,EAAKrJ,EAAEs8C,SAAW,CAACjzC,EAAKrJ,IAEnCu8C,MAAO,cAGfC,WAAY,CACRH,MAAO,CACHhC,KAAM,CACFnhB,OAAO,EACPohB,SAAU,QACVmC,MAAO,aAEXC,OAAQ,CACJxjB,OAAO,EACPohB,SAAU,OACV9R,YAAa,mBACbtnC,KAAM,OAEVy7C,OAAQ,CACJzjB,OAAO,EACPohB,SAAU,OACV9R,YAAa,mBACbtnC,KAAM,QAEV1D,QAAS,CACL07B,OAAO,EACPohB,SAAU,OACVp5C,KAAM,UAEV07C,aAAc,SAASl6C,EAASxB,EAAMw4C,GAClC,IAAI7Z,EACA37B,EACAmsB,EACAiqB,EAOJ,GALA53C,EAAUA,GAAW,GACrBxB,EAAOA,GAAQ,OAEfo5C,GADAA,GAAY9+C,KAAKkH,SAAW03C,GAAiBl5C,IACvBo5C,EAASA,SAAW,OAE7B,SAATp5C,EASA,IAAKmvB,KARLwP,EAAS,CACLgd,aAAc,YAGF,QAAZvC,IACAza,EAAOid,QAAU,QAGNp6C,EACP62C,EAAQlpB,GACRkpB,EAAQlpB,GAAQwP,EAAQn9B,EAAQ2tB,GAASqpB,GAEzC7Z,EAAOxP,GAAU3tB,EAAQ2tB,OAG9B,CACH,GAAiB,SAAbiqB,EACA,MAAM,IAAIruC,MAAM,sCAAwC/K,EAAO,eAGnE,GAAa,YAATA,EAAoB,CACpB,IAAKmvB,KAAU3tB,EAEU,iBADrBwB,EAAQxB,EAAQ2tB,MAEZ3tB,EAAQ2tB,GAAUnsB,EAAQ,IAIlC27B,EAAS1jC,EAAM6R,UAAUtL,IAIjC,OAAOm9B,OAMvBthC,GAAO,EAAMpC,EAAMkN,KAAM,CACrB+yC,QAAS,CACL,WAAY,CACRl7C,KAAM,OACNmI,KAAM,SAASA,GACX,GAAI3K,MAAMD,QAAQ4K,GAAO,CACrB,IAAK,IAAItG,EAAI,EAAGA,EAAIsG,EAAKrG,OAAQD,IAC7B63C,EAAcvxC,EAAKtG,IAEvB,OAAOsG,EAKP,OAFAuxC,EADAvxC,EAAOlL,EAAEI,OAAO,GAAI8K,IAGhBA,EAAKnF,MACEmF,EAAKnF,MAET,CAACmF,IAGhBkzC,MAAO,SAASlzC,GACZ,OAAOA,EAAK,mBAIxBmzC,WAAY,CACR,WAAY,CACRO,MAAO,CACH77C,KAAM,QAEVm5C,KAAM,CACFnhB,OAAO,EACPohB,SAAU,QAEdoC,OAAQ,CACJxjB,OAAO,EACPohB,SAAU,OACV9R,YAAa,0CACbtnC,KAAM,OAEVy7C,OAAQ,CACJzjB,OAAO,EACPohB,SAAU,OACV9R,YAAa,0CACbtnC,KAAM,QAEV1D,QAAS,CACL07B,OAAO,EACPohB,SAAU,OACVp5C,KAAM,UAEV07C,aAAc,SAASl6C,EAASxB,GAC5B,IAAI6Q,EAAS5V,EAAMkN,KAAKmzC,WAAWH,MAAMO,aAAal6C,EAASxB,GAAM,GAarE,MAZY,QAARA,IACA6Q,EAAOirC,QAAS,SACTjrC,EAAO8qC,cAG7B9qC,GAAUA,EAAO6nC,UAEpB7nC,EAAO6nC,QAAU7nC,EAAO6nC,QAAQ37C,QAAQ,sEAAsE,SAAS2C,GACtH,OAAOA,EAAE4F,UAAU,EAAG5F,EAAEoC,OAAS,OAIb+O,GAEX42B,OAAQ,SAASxoC,GACb,IACIuC,EA3OpB,SAA4By4C,EAAW8B,GACzC,IAAIv6C,EAAUnE,EAAO,GAAI48C,EAAUz4C,QAAQq6C,OACjC/B,EAAWF,EAAe,aAC1BiB,EAAc,GACdL,EAAW,EACXwB,EAAW/B,EAAUz4C,QAAQq6C,MAAMnzB,IACnC6xB,EAAYX,EAAe,iBA4B/B,OA1BAp4C,EAAQxB,KAAOi6C,EAAUz4C,QAAQq6C,MAAM77C,KACvCwB,EAAQknB,IAAMllB,EAAWw4C,GAAYA,IAAaA,EACxDx6C,EAAQy6C,QAAU5+C,EAAOmE,EAAQy6C,SAAW,GAAI,CAC/C,eAAgB,6BAA+BnC,IAGtCiC,EAAWG,QAAQp6C,SACnB+4C,GAAeH,EAAkBqB,EAAWG,QAASpC,EAAUS,EAAWC,EAAUP,EAAW,UAAU,GACzGO,GAAYuB,EAAWG,QAAQp6C,OAC/By4C,EAAYX,EAAe,kBAG3BmC,EAAWI,UAAUr6C,SACrB+4C,GAAeH,EAAkBqB,EAAWI,UAAWrC,EAAUS,EAAWC,EAAUP,EAAW,WAAW,GAC5GO,GAAYuB,EAAWI,UAAUr6C,OACjCy4C,EAAYX,EAAe,kBAG3BmC,EAAWK,QAAQt6C,SACnB+4C,GAAeH,EAAkBqB,EAAWK,QAAStC,EAAUS,EAAWC,EAAUP,EAAW,UAAU,IAG7GY,GAAehB,EAAgBC,GAAU,GAEzCt4C,EAAQ2G,KAAO0yC,EAERr5C,EAyMmB66C,CADH/hD,KAC4B2E,EAAEkJ,MACrCm0C,EAAcr9C,EAAEkJ,MAEfm0C,EAAYJ,QAAQp6C,QAAWw6C,EAAYH,UAAUr6C,QAAWw6C,EAAYF,QAAQt6C,SAIzF7E,EAAEs/C,KAAKl/C,GAAO,EAAM,GAAI,CACpBm/C,QAAS,SAASC,GACd,IAEI1uC,EAFA2uC,EA/M5B,SAA4BC,GACxB,IAGIC,EACAC,EACAC,EACAC,EACAC,EAPAC,EAAkBN,EAAalyC,MAAM,qCACrCyyC,EAAc,EACdZ,EAAc,GAOlBA,EAAYrgD,KAAK,CAAEkhD,OAAQ,GAAIC,QAAQ,IAEvC,IAAK,IAAIv7C,EAAI,EAAGA,EAAIo7C,EAAgBn7C,OAAQD,KACxCk7C,EAASE,EAAgBp7C,IACdmR,YAAY,KAAM+pC,EAAOj7C,OAAS,GACrCD,EAAIo7C,EAAgBn7C,OAAS,GAC7Bw6C,EAAYrgD,KAAK,CAAEkhD,OAAQ,GAAIC,QAAQ,KAQ3CF,EAHCA,EAGaP,EAAa1sC,QAAQ8sC,EAAQG,EAAcH,EAAOj7C,QAFlD66C,EAAa1sC,QAAQ8sC,GAMvCF,GADAD,EAAaD,EAAar3C,UAAU43C,EAAaP,EAAa1sC,QAAQ,KAAMitC,EAAc,KACtEzyC,MAAM,gCAAgCif,OAC1DozB,EAAO7hD,EAAMoI,WAAWw5C,EAAOpyC,MAAM,UAAUif,SAEnC,KAAOozB,GAAQ,KACvBE,EAAYJ,EAAWnyC,MAAM,cAEzB6xC,EAAYA,EAAYx6C,OAAS,GAAGq7C,OAAOlhD,KAAK2B,KAAKyxB,MAAM2tB,EAAU,KAGzEV,EAAYA,EAAYx6C,OAAS,GAAGs7C,QAAS,GAKrD,OAAOd,EAqK6Be,CAAmBZ,GAC/BppC,EAAQ,EAGRipC,EAAYJ,QAAQp6C,UACpBiM,EAAU2uC,EAAUrpC,IACR+pC,QAERn+C,EAAEu9C,QAAQzuC,EAAQovC,OAAOr7C,OAASiM,EAAQovC,OAAS,GAAI,UAE3D9pC,KAEAipC,EAAYH,UAAUr6C,UACtBiM,EAAU2uC,EAAUrpC,IACR+pC,QAGRn+C,EAAEu9C,QAAQ,GAAI,WAElBnpC,KAEAipC,EAAYF,QAAQt6C,SACpBiM,EAAU2uC,EAAUrpC,IACR+pC,QACRn+C,EAAEu9C,QAAQzuC,EAAQovC,OAAQ,WAItC/0B,MAAO,SAASq0B,EAAUI,EAAQz0B,GAC9BnpB,EAAEmpB,MAAMq0B,EAAUI,EAAQz0B,KAE/B5mB,SAnhBvB,CAyhBGpG,OAAOH,MAAM+G,QACF/G,OAWd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACfsC,EAAUC,MAAMD,QAChB0E,EAAgBhF,EAAEgF,cAClB2S,EAAM3X,EAAE2X,IACRtX,EAAOL,EAAEK,KACTD,EAASJ,EAAEI,OACX8rB,EAASluB,EAAMkuB,OAGfm0B,EAFQriD,EAAMiH,MAEQ7E,OAAO,CAC7BoF,KAAM,SAASjB,GACX,IAAIe,EAAOjI,KACP+gD,EAAQ75C,EAAQ65C,MAChBkC,EAAQ/7C,EAAQ+7C,MAChBluB,EAAQ7tB,EAAQ6tB,MAChBmuB,EAASh8C,EAAQg8C,OACjBC,EAAYj8C,EAAQi8C,UACpBt1C,EAAO3G,EAAQ2G,KAEnB,GAAIo1C,EAAO,CACP,GAAIt7C,EAAcs7C,GAAQ,CACtB,IAAIj7C,EAAOd,EAAQk8C,WAAaziD,EAAMkN,KAAKw1C,MAEvCJ,EAAMt0B,QACN3rB,EAAKigD,EAAMt0B,QAAQ,SAAS3J,EAAOtc,GAC3Bf,EAAce,IAAUA,EAAMsc,MACzBrkB,EAAMuI,WAAWR,EAAMsc,SACxBtc,EAAQ3F,EAAO2F,EAAO,CAAEsc,MAAO/c,EAAK4mB,OAAOnmB,EAAMsc,UAGrDtc,EAAQ,CAAEsc,MAAO/c,EAAK4mB,OAAOnmB,IAEjCu6C,EAAMt0B,OAAO3J,GAAStc,KAI9B,IAAIgnB,EAAKuzB,EAAMvzB,GACf,GAAIA,EAAI,CACJ,IAAI4zB,EAAU,GAEdA,EAAQr7C,EAAKs7C,cAAc7zB,GAAI,IAAS,CAAE1K,MAAO/c,EAAK4mB,OAAOa,IAC7DuzB,EAAMt0B,OAAS5rB,EAAOugD,EAASL,EAAMt0B,QACrCs0B,EAAMvzB,GAAKznB,EAAKs7C,cAAc7zB,GAElCuzB,EAAQj7C,EAAKtI,OAAOujD,GAGxBh7C,EAAKg7C,MAAQA,EAyDjB,GAtDIlC,IACoB,iBAATA,GACPA,EAAQ94C,EAAK4mB,OAAOkyB,GACpB94C,EAAK84C,MAAQ,SAASlzC,GAClB,OAAOoL,SAAS8nC,EAAMlzC,GAAO,MAEV,mBAATkzC,IACd94C,EAAK84C,MAAQA,IAIjBmC,IACqB,iBAAVA,GACPA,EAASj7C,EAAK4mB,OAAOq0B,GACrBj7C,EAAKi7C,OAAS,SAASr1C,GACnB,OAAOq1C,EAAOr1C,IAAS,OAEH,mBAAVq1C,IACdj7C,EAAKi7C,OAASA,IAIlBr1C,IACmB,iBAARA,GACPA,EAAO5F,EAAKs7C,cAAc11C,GAC1B5F,EAAK4F,KAAO,SAASnF,GACjB,IACI86C,EADAjtC,EAAStO,EAAKw7C,SAAS/6C,EAAOmF,GAKlC,OAFA0I,EAAStT,EAAQsT,GAAUA,EAAS,CAACA,GAEjCtO,EAAKg7C,OAASA,EAAMt0B,QACpB60B,EAAgB,IAAIv7C,EAAKg7C,MAElB3oC,EAAI/D,GAAQ,SAAS7N,GACxB,GAAIA,EAAO,CACP,IAAiBsc,EAAb0+B,EAAS,GAEb,IAAK1+B,KAASi+B,EAAMt0B,OAChB+0B,EAAO1+B,GAASw+B,EAAcG,OAAO3+B,EAAOi+B,EAAMt0B,OAAO3J,GAAOA,MAAMtc,IAG1E,OAAOg7C,OAKZntC,IAEW,mBAAR1I,IACd5F,EAAK4F,KAAOA,IAIA,mBAATknB,EAAqB,CAC5B,IAAI6uB,EAAW37C,EAAK8sB,MAEpB9sB,EAAK8sB,MAAQ,SAASlnB,GAClB,IAAIg2C,EAAM9uB,EAAMxqB,KAAKtC,EAAM4F,GAC3B,OAAO+1C,EAASr5C,KAAKtC,EAAM47C,IAIX,mBAAbV,IACPl7C,EAAKk7C,UAAYA,IAGzBpC,MAAO,SAASxqC,GACZ,OAAOvW,KAAK6N,KAAK0I,GAAQ/O,QAE7B07C,OAAQ,SAASr1C,GACb,OAAOA,EAAOA,EAAKq1C,OAAS,MAEhCC,UAAW,SAASt1C,GAChB,OAAOA,GAEXi2C,SAAU,SAASj4C,GACf,IACIk4C,EACA9gB,EACAxN,EACAuC,EACAlwB,EACAggC,EAGAl+B,EATA2M,EAAS,GAOTytC,EAAan4C,EAAQm4C,WACrBC,EAAiBD,EAAWx8C,OAGhC,IAAKoC,EAAM,EAAGA,EAAMq6C,EAAgBr6C,IAEhC2M,EAAO,KADPuxB,EAAYkc,EAAWp6C,IACAouB,UAAY8P,EAAUpE,UAGjD,IAAKT,EAAOp3B,EAAQq4C,WAAYjhB,EAAMA,EAAOA,EAAKkhB,YAG7B,KAFjB1uB,EAAWwN,EAAKxN,WAEmB,IAAbA,EAElBlf,EAAO,SAAW0sB,EAAKS,UACH,IAAbjO,IAEPsuB,EAAa/jD,KAAK8jD,SAAS7gB,GAI3Bn7B,EAASyO,EAFTyhB,EAAWiL,EAAKjL,UAIZ/0B,EAAQ6E,GAERA,EAAOnG,KAAKoiD,GAEZj8C,EAlKxB,YAiK+BA,EACE,CAACA,EAAQi8C,GAETA,EAGbxtC,EAAOyhB,GAAYlwB,GAG3B,OAAOyO,GAGXktC,SAAU,SAAS/6C,EAAO4lB,GAQtB,IAPA,IACIxmB,EACAyO,EACA/O,EACA48C,EACAx6C,EALA4kB,EAAUF,EAAW1jB,MAAM,KAOxB9C,EAAS0mB,EAAQ3Y,SAGpB,GAFAnN,EAAQA,EAAMZ,GAEV7E,EAAQyF,GAAQ,CAIhB,IAHA6N,EAAS,GACT+X,EAAaE,EAAQ3jB,KAAK,KAErBjB,EAAM,EAAGpC,EAASkB,EAAMlB,OAAQoC,EAAMpC,EAAQoC,IAC/Cw6C,EAAqBpkD,KAAKyjD,SAAS/6C,EAAMkB,GAAM0kB,GAE/C81B,EAAqBnhD,EAAQmhD,GAAsBA,EAAqB,CAACA,GAEzE7tC,EAAO5U,KAAKyG,MAAMmO,EAAQ6tC,GAG9B,OAAO7tC,EAIf,OAAO7N,GAGXqsB,MAAO,SAAS8uB,GACZ,IAAIxqC,EACAgrC,EACA9tC,EAAS,GAQb,OANA8C,EAAkBwqC,EAAIxqC,iBAAmB1W,EAAE2hD,SAAST,GAAKxqC,gBAEzDgrC,EAAOrkD,KAAK8jD,SAASzqC,GAErB9C,EAAO8C,EAAgB2e,UAAYqsB,EAE5B9tC,GAGXgtC,cAAe,SAASz7C,EAAQy8C,GAC5B,OAAKz8C,GAILA,EAASA,EAAOrF,QAAQ,MAAO,IACfA,QAAQ,MAAO,MAEpBkT,QAAQ,MAAQ,EAEhB7N,EAAOrF,QAAQ,WAAY8hD,EAAM,KAAO,UAG/Cz8C,EAAO6N,QAAQ,WAAa,EAErB7N,EAAOrF,QAAQ,gBAAiB8hD,EAAM,QAAU,aAGpDz8C,EAhBI,IAkBf+mB,OAAQ,SAAS/mB,GACb,OAAO+mB,EAAO7uB,KAAKujD,cAAcz7C,IAAS,MAIlDnF,EAAEI,QAAO,EAAMpC,EAAMkN,KAAM,CACvBm1C,cAAeA,EACfwB,QAAS,CACLX,IAAKb,KArPjB,CAwPGliD,OAAOH,MAAM+G,QACF/G,MAAd,IAkBIu+C,EAAQ,CACRuF,GAAM,CACFrnC,OAAQ,SAAUo3B,EAAKzsC,GAAM,OAAO,SAAU7C,GAAK,OAAOsvC,EAAItvC,IAAM6C,EAAG7C,KACvEw/C,SAAU,WAAc,OAAO,IAEnCC,IAAO,CACHvnC,OAAQ,SAAUo3B,EAAKzsC,GAAM,OAAO,SAAU7C,GAAK,OAAOsvC,EAAItvC,IAAM6C,EAAG7C,KACvEw/C,SAAU,WAAc,OAAO,KAInCE,EAAe,CACflH,cAAe,SAAUx4C,GAAK,OAAOvE,MAAMgI,QAAQzD,IAAY,KAANA,GACzDy4C,iBAAkB,SAAUz4C,GAAK,OAAOvE,MAAM8H,UAAUvD,IAAY,KAANA,GAC9DgwB,SAAU,SAAUhwB,EAAGggB,GAAK,OAAQhgB,EAAI,IAAIyQ,QAAQuP,IAAM,GAC1Dm4B,eAAgB,SAAUn4C,EAAGggB,GAAK,OAAgC,KAAxBhgB,EAAI,IAAIyQ,QAAQuP,IAC1D2/B,eAAgB,SAAU3/C,EAAGggB,GAAK,OAAQhgB,EAAI,IAAIyQ,QAAQuP,GAAIhgB,GAAK,IAAIsC,QAAU0d,GAAK,IAAI1d,QAAU,GACpGs9C,iBAAkB,SAAU5/C,EAAGggB,GAAK,OAAuC,KAA/BhgB,EAAI,IAAIwT,YAAYwM,EAAG,IACnEo4B,SAAU,SAAUp4C,EAAGggB,GAAK,OAAQhgB,EAAI,IAAIyQ,QAAQuP,GAAIhgB,GAAK,IAAIsC,QAAU0d,GAAK,IAAI1d,SAAW,GAC/FqwB,GAAI,SAAU3yB,EAAGggB,GAAK,OAAOhgB,IAAMggB,GACnC+3B,GAAI,SAAU/3C,EAAGggB,GAAK,OAAOhgB,EAAIggB,GACjCg4B,IAAK,SAAUh4C,EAAGggB,GAAK,OAAOhgB,GAAKggB,GACnC04B,QAAS,SAAU14C,GAAK,MAAa,KAANA,GAC/B24C,WAAY,SAAU34C,GAAK,MAAa,KAANA,GAClCu4C,UAAW,SAAUv4C,GAAK,OAAOvE,MAAM8H,UAAUvD,IACjDs4C,OAAQ,SAAUt4C,GAAK,OAAOvE,MAAMgI,QAAQzD,IAC5Ci4C,GAAI,SAAUj4C,EAAGggB,GAAK,OAAOhgB,EAAIggB,GACjCk4B,IAAK,SAAUl4C,EAAGggB,GAAK,OAAOhgB,GAAKggB,GACnC83B,IAAK,SAAU93C,EAAGggB,GAAK,OAAOhgB,GAAKggB,GACnCq4B,WAAY,SAAUr4C,EAAGggB,GAAK,OAAsC,KAA9BhgB,EAAI,IAAIwT,YAAYwM,EAAG,KAG7DrL,EAAa,sBAgDbkrC,EAAkB,SAAU/1B,GAC5B,IAAIhK,EAAQgK,EAAIhK,MACZi6B,EAAajwB,EAAIiwB,WACjBv2C,EAAQsmB,EAAItmB,MACZs2C,EAAWhwB,EAAIgwB,cAA4B,IAAbA,IAAsBA,EAAW,MACnE,IAAIgG,EAAyBh2B,EAAIg2B,uBAEjChgC,EAASrkB,MAAM8H,UAAUuc,GAAsCA,EAA7B,SAAU9f,GAAK,OAAOA,GAExD+5C,GAAat+C,MAAM8H,UAAUw2C,IAAcA,EAE3C,IAAIgG,EA3CU,SAAU/1B,EAAMxmB,EAAOu2C,EAAY+F,GACjD,IAAKrkD,MAAM8H,UAAUC,GACjB,OAAOwmB,EAGX,IAAIslB,EAAMtlB,EAEV,GAAIvuB,MAAMiI,SAASF,GAAQ,CACvB,IAAI2N,EAAOwD,EAAWxB,KAAK3P,GACvB2N,EACA3N,EAAQ,IAAI0F,MAAMiI,EAAK,IAEvBm+B,EAAM,SAAUtvC,GACZ,IAAIE,EAAI8pB,EAAKhqB,GACb,MAAiB,iBAANE,GAAkB65C,EAClB+F,EAAyB5/C,EAAE8/C,kBAAkBF,GAA0B5/C,EAAEkT,cAEzE3X,MAAMkI,UAAUzD,GAAKA,EAAI,GAAKA,GAMrD,OAAIzE,MAAMqI,OAAON,GACN,SAAUxD,GACb,IAAIE,EAAIovC,EAAItvC,GACZ,OAAOvE,MAAMqI,OAAO5D,GAAKA,EAAE6D,UAAY7D,GAGxCovC,EAcQ2Q,CACXxkD,MAAMuI,WAAW8b,GAASA,EAAQrkB,MAAMkuB,OAAO7J,GAAO,GACtDtc,EACAu2C,EACA+F,GAGJt8C,EAhEe,SAAUA,EAAOu2C,EAAY+F,GAC5C,GAAa,MAATt8C,GAAiB/H,MAAMiI,SAASF,GAAQ,CACxC,IAAI2N,EAAOwD,EAAWxB,KAAK3P,GAC3B,GAAI2N,EACA,OAAO,IAAIjI,MAAMiI,EAAK,IAAIpN,UACvB,GAAIg2C,EACP,OAAO+F,EAAyBt8C,EAAMw8C,kBAAkBF,GAA0Bt8C,EAAM4P,mBAEzF,GAAa,MAAT5P,GAAiB/H,MAAMqI,OAAON,GACrC,OAAOA,EAAMO,UAEjB,OAAOP,EAqDC08C,CAAa18C,EAAOu2C,EAAY+F,GAExC,IAAIK,EAAK1kD,MAAMuI,WAAW81C,GAAYA,EAAW4F,EAAa5F,GAE9D,OAAO,SAAU95C,GAAK,OAAOmgD,EAAGJ,EAAS//C,GAAIwD,EAAOu2C,KAKpDqG,EAA2B,SAAUtvB,GACrC,IAAIgvB,EAAyBhvB,EAAOgvB,uBAChCO,EAAWrG,EAAMlpB,EAAOkpB,OAAS,OACrC,OAAOlpB,EAAOmpB,QACTnpB,OAAOr1B,MAAM8H,WACb6R,KAAI,SAAUlV,GAAK,OAPgBkI,EAOoBlI,EAPHzE,MAAM8H,UAAU6E,EAAO6xC,SAOfmG,EAAyBE,EAAoBpgD,EAAG4/C,IAA2BD,EAAgBS,EAAoBpgD,EAAG4/C,IAPrJ,IAAU13C,KAQnCm4C,OAAOF,EAASnoC,OAAQmoC,EAASb,WAGtCc,EAAsB,SAAUxvB,EAAQgvB,GAA0B,OAAQrkD,MAAM8H,UAAUu8C,GAA0BvkD,OAAOC,OAAOs1B,EAAQ,CAAEgvB,uBAAwBA,IAA4BhvB,IA+BpM,SAAUrzB,EAAGC,GACT,IAMI0X,EANAvX,EAASJ,EAAEI,OACX4E,EAAgBhF,EAAEgF,cAClBguB,EAAgBhzB,EAAEgzB,cAClB1yB,EAAUC,MAAMD,QAChBg7B,EAAOt7B,EAAEs7B,KACTgkB,EAAOt/C,EAAEs/C,KAETj/C,EAAOL,EAAEK,KACTG,EAAOR,EAAEQ,KACTxC,EAAQG,OAAOH,MACfuI,EAAavI,EAAMuI,WACnBI,EAAa3I,EAAM2I,WACnB1B,EAAQjH,EAAMiH,MACd1B,EAAS,SACTD,EAAW,WAEXy/C,EAAS,SACTC,EAAO,OACPC,EAAS,SACTC,EAAU,UACVC,EAAS,SACTC,EAAO,OACPC,EAAM,MACNC,EAAQ,QACRC,EAAe,eACfC,EAAW,WACXC,EAAa,aACbC,EAAc,cACdC,EAAW,WACXC,EAAO,CAACb,EAAQC,EAAMC,EAAQC,GAC9BnB,EAAW,SAAS8B,GAAK,OAAOA,GAChC33B,EAASluB,EAAMkuB,OACfrc,EAAY7R,EAAM6R,UAClBpP,EAAOC,KACP1B,EAAO,GAAGA,KACVkJ,EAAO,GAAGA,KACVukB,EAAM,GAAGA,IACT5kB,EAAS,GAAGA,OACZqL,EAAQ,GAAGA,MACXjP,EAAQ,GAAGA,MACXuD,EAAU,GAAGA,QACb+G,EAAW,GAAGA,SACd4T,EAAankB,EAAM4C,QAAQuhB,WAC3BjL,EAAa,sBACb4sC,EAAa,GAEb74C,EAAkBtE,EAAWvG,OAAO,CACpCoF,KAAM,SAASqS,EAAO9U,GAClB,IAAIuC,EAAOjI,KAEXiI,EAAKvC,KAAOA,GAAQghD,EAEpBp9C,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExBA,EAAKT,OAASgT,EAAMhT,OAEpBS,EAAK0+C,QAAQnsC,EAAOvS,GACpBA,EAAK2+C,cAAgB,GACrB3+C,EAAK4+C,aAAe,IAGxBC,GAAI,SAAS/tC,GACT,OAAO/Y,KAAK+Y,IAGhBnH,OAAQ,SAASm1C,GACb,IAAIn9C,EAA2BlB,EAAtBlB,EAASxH,KAAKwH,OAAew/C,EAAO,IAAI9jD,MAAMsE,GAEvD,IAAKoC,EAAM,EAAGA,EAAMpC,EAAQoC,KACxBlB,EAAQ1I,KAAK4J,cAEQ88C,IACjBh+C,EAAQA,EAAMkJ,OAAOm1C,IAGzBC,EAAKp9C,GAAOlB,EAGhB,OAAOs+C,GAGX76C,OAAQhJ,EAERwjD,QAAS,SAASr5C,EAAQhG,GACtB,IACIsC,EACApC,EAFAS,EAAOjI,KAGPmM,EAAS,WACL,OAAOlE,GAKf,IAFAX,EAASA,GAAU,GAEdsC,EAAM,EAAGpC,EAAS8F,EAAO9F,OAAQoC,EAAMpC,EAAQoC,IAChDtC,EAAOsC,GAAO3B,EAAK8jB,KAAKze,EAAO1D,GAAMuC,GAGzC,OAAO7E,GAGXykB,KAAM,SAASk7B,EAAQ96C,GACnB,IAAIlE,EAAOjI,KA0CX,OAvCe,OAAXinD,GAA6C,oBAA1B/1C,EAAS3G,KAAK08C,KACpBA,aAAkBh/C,EAAKvC,MAAQuhD,aAAkB5D,KAG1D4D,EAASA,aAAkBP,EAAmBO,EAAOr1C,SAAWq1C,EAChEA,EAAS,IAAIh/C,EAAKvC,KAAKuhD,IAG3BA,EAAO96C,OAASA,EAEhB86C,EAAOz9C,KAAKs8C,GAAQ,SAASnhD,GACzB,IAAIuiD,EAAUD,EAAOv4C,eAAe,gBACpCzG,EAAKmC,QAAQ07C,EAAQ,CACjB9gC,MAAOrgB,EAAEqgB,MACTie,KAAMt+B,EAAEs+B,KACRlqB,MAAOpU,EAAEoU,MACTob,MAAOxvB,EAAEwvB,OAAS,CAACn0B,MACnB+sC,OAAQpoC,EAAEs+B,MAAQikB,EAAWviD,EAAEooC,QAAU,aAAgB,kBAIjEka,EAAOz9C,KAAK88C,GAAU,SAAS3hD,GAC3BsD,EAAK2+C,cAAcjlD,KAAKgD,EAAEqiB,SAC1B/e,EAAKk/C,UAAW,EAEhBxiD,EAAEqiB,QAAQulB,MAAK,WACXtkC,EAAK4+C,aAAallD,KAAKgD,EAAEs+B,MACzB,IAAIlqB,EAAQ9Q,EAAK2+C,cAAcjxC,QAAQhR,EAAEqiB,SACzC/e,EAAK2+C,cAAcp8C,OAAOuO,EAAO,GAE5B9Q,EAAK2+C,cAAcp/C,SACpBS,EAAKk/C,UAAW,EAChBl/C,EAAKmC,QAAQi8C,EAAa,CAAE5F,WAAYx4C,EAAMm/C,MAAOn/C,EAAK4+C,eAC1D5+C,EAAK4+C,aAAe,WAM7BI,GAGXrwB,QAAS,WACL,OAAO52B,KAAKmnD,UAGhBxlD,KAAM,WACF,IAEI4U,EAFAwC,EAAQ/Y,KAAKwH,OACb2sB,EAAQn0B,KAAK2mD,QAAQt/C,WAazB,OAVAkP,EAAS5U,EAAKyG,MAAMpI,KAAMm0B,GAErBn0B,KAAKqnD,iBACNrnD,KAAKoK,QAAQ07C,EAAQ,CACjB/Y,OAAQ,MACRh0B,MAAOA,EACPob,MAAOA,IAIR5d,GAGX3P,MAAOA,EAEPqe,KAAM,GAAGA,KAETpa,KAAMA,EAENukB,IAAK,WACD,IAAI5nB,EAASxH,KAAKwH,OAAQ+O,EAAS6Y,EAAIhnB,MAAMpI,MAU7C,OARIwH,GACAxH,KAAKoK,QAAQ07C,EAAQ,CACjB/Y,OAAQ,SACRh0B,MAAOvR,EAAS,EAChB2sB,MAAO,CAAC5d,KAITA,GAGX/L,OAAQ,SAASuO,EAAOuuC,EAASvY,GAC7B,IACIx4B,EAAQhP,EAAG6oB,EADX+D,EAAQn0B,KAAK2mD,QAAQ//C,EAAM2D,KAAKlD,UAAW,IAK/C,IAFAkP,EAAS/L,EAAOpC,MAAMpI,KAAM,CAAC+Y,EAAOuuC,GAASlqC,OAAO+W,KAEzC3sB,OAUP,IATKxH,KAAKqnD,kBACNrnD,KAAKoK,QAAQ07C,EAAQ,CACjB/Y,OAAQ,SACRh0B,MAAOA,EACPob,MAAOn0B,KAAKunD,WAAavnD,KAAKunD,UAAU//C,OAAS+O,EAAO6G,OAAOpd,KAAKunD,WAAahxC,IAErFvW,KAAKunD,UAAY,IAGhBhgD,EAAI,EAAG6oB,EAAM7Z,EAAO/O,OAAQD,EAAI6oB,EAAK7oB,IAClCgP,EAAOhP,IAAMgP,EAAOhP,GAAG2tC,UACvB3+B,EAAOhP,GAAG0C,OAAO67C,GAc7B,OATI/W,IACK/uC,KAAKqnD,iBACNrnD,KAAKoK,QAAQ07C,EAAQ,CACjB/Y,OAAQ,MACRh0B,MAAOA,EACPob,MAAOA,KAIZ5d,GAGXV,MAAO,WACH,IAAIrO,EAASxH,KAAKwH,OAAQ+O,EAASV,EAAMzN,MAAMpI,MAU/C,OARIwH,GACAxH,KAAKoK,QAAQ07C,EAAQ,CACjB/Y,OAAQ,SACRh0B,MAAO,EACPob,MAAO,CAAC5d,KAITA,GAGXpM,QAAS,WACL,IACIoM,EADA4d,EAAQn0B,KAAK2mD,QAAQt/C,WAWzB,OARAkP,EAASpM,EAAQ/B,MAAMpI,KAAMm0B,GAE7Bn0B,KAAKoK,QAAQ07C,EAAQ,CACjB/Y,OAAQ,MACRh0B,MAAO,EACPob,MAAOA,IAGJ5d,GAGXZ,QAAS,SAASo5B,GACd,IACInlC,EACApC,EAEJ,IAAKoC,EAAM,EAAGpC,EAJHxH,KAIiBwH,OAAQoC,EAAMpC,EAAQoC,IAC9C,GALO5J,KAKE4J,KAASmlC,EACd,OAAOnlC,EAGf,OAAQ,GAGZtI,QAAS,SAASynB,EAAUy+B,GAKxB,IAJA,IAAI59C,EAAM,EACNpC,EAASxH,KAAKwH,OACdo0B,EAAU4rB,GAAW1mD,OAElB8I,EAAMpC,EAAQoC,IACjBmf,EAASxe,KAAKqxB,EAAS57B,KAAK4J,GAAMA,EAAK5J,OAI/Csa,IAAK,SAASyO,EAAUy+B,GAMpB,IALA,IAAI59C,EAAM,EACN2M,EAAS,GACT/O,EAASxH,KAAKwH,OACdo0B,EAAU4rB,GAAW1mD,OAElB8I,EAAMpC,EAAQoC,IACjB2M,EAAO3M,GAAOmf,EAASxe,KAAKqxB,EAAS57B,KAAK4J,GAAMA,EAAK5J,MAGzD,OAAOuW,GAGXkvC,OAAQ,SAAS18B,GACb,IACIxS,EADA3M,EAAM,EAENpC,EAASxH,KAAKwH,OAQlB,IANwB,GAApBH,UAAUG,OACV+O,EAASlP,UAAU,GACZuC,EAAMpC,IACb+O,EAASvW,KAAK4J,MAGXA,EAAMpC,EAAQoC,IACjB2M,EAASwS,EAASxS,EAAQvW,KAAK4J,GAAMA,EAAK5J,MAG9C,OAAOuW,GAGXkxC,YAAa,SAAS1+B,GAClB,IACIxS,EADA3M,EAAM5J,KAAKwH,OAAS,EASxB,IANwB,GAApBH,UAAUG,OACV+O,EAASlP,UAAU,GACZuC,EAAM,IACb2M,EAASvW,KAAK4J,MAGXA,GAAO,EAAGA,IACb2M,EAASwS,EAASxS,EAAQvW,KAAK4J,GAAMA,EAAK5J,MAG9C,OAAOuW,GAGXyf,OAAQ,SAASjN,EAAUy+B,GAOvB,IANA,IAEIzY,EAFAnlC,EAAM,EACN2M,EAAS,GAET/O,EAASxH,KAAKwH,OACdo0B,EAAU4rB,GAAW1mD,OAElB8I,EAAMpC,EAAQoC,IACjBmlC,EAAO/uC,KAAK4J,GACRmf,EAASxe,KAAKqxB,EAASmT,EAAMnlC,EAAK5J,QAClCuW,EAAOA,EAAO/O,QAAUunC,GAIhC,OAAOx4B,GAGXuf,KAAM,SAAS/M,EAAUy+B,GAMrB,IALA,IACIzY,EADAnlC,EAAM,EAENpC,EAASxH,KAAKwH,OACdo0B,EAAU4rB,GAAW1mD,OAElB8I,EAAMpC,EAAQoC,IAEjB,GADAmlC,EAAO/uC,KAAK4J,GACRmf,EAASxe,KAAKqxB,EAASmT,EAAMnlC,EAAK5J,MAClC,OAAO+uC,GAKnB2Y,MAAO,SAAS3+B,EAAUy+B,GAMtB,IALA,IACIzY,EADAnlC,EAAM,EAENpC,EAASxH,KAAKwH,OACdo0B,EAAU4rB,GAAW1mD,OAElB8I,EAAMpC,EAAQoC,IAEjB,GADAmlC,EAAO/uC,KAAK4J,IACPmf,EAASxe,KAAKqxB,EAASmT,EAAMnlC,EAAK5J,MACnC,OAAO,EAIf,OAAO,GAGX2nD,KAAM,SAAS5+B,EAAUy+B,GAMrB,IALA,IACIzY,EADAnlC,EAAM,EAENpC,EAASxH,KAAKwH,OACdo0B,EAAU4rB,GAAW1mD,OAElB8I,EAAMpC,EAAQoC,IAEjB,GADAmlC,EAAO/uC,KAAK4J,GACRmf,EAASxe,KAAKqxB,EAASmT,EAAMnlC,EAAK5J,MAClC,OAAO,EAIf,OAAO,GAIX82B,OAAQ,SAASiY,GACb,IAAInlC,EAAM5J,KAAK2V,QAAQo5B,IAEV,IAATnlC,GACA5J,KAAKwK,OAAOZ,EAAK,IAIzBg+C,MAAO,WACH5nD,KAAKwK,OAAO,EAAGxK,KAAKwH,WAKN,oBAAXqgD,QAA0BA,OAAO/kB,WAAal1B,EAAgBvF,UAAUw/C,OAAO/kB,YACtFl1B,EAAgBvF,UAAUw/C,OAAO/kB,UAAY,GAAG+kB,OAAO/kB,WAG3D,IAAIh1B,EAAsBF,EAAgB7K,OAAO,CAC7CoF,KAAM,SAAS0F,EAAMnI,EAAM2E,GAGvBf,EAAWvB,GAAGI,KAAKoC,KAAKvK,MAExBA,KAAK0F,KAAOA,GAAQghD,EAEhBr8C,IACArK,KAAKuJ,QAAUc,GAGnB,IAAK,IAAIT,EAAM,EAAGA,EAAMiE,EAAKrG,OAAQoC,IACjC5J,KAAK4J,GAAOiE,EAAKjE,GAGrB5J,KAAKwH,OAASoC,EACd5J,KAAK8nD,QAfU,WAAa,OAAO9nD,MAeXwJ,KAAKxJ,OAEjC8mD,GAAI,SAAS/tC,GACT,IAAIg2B,EAAO/uC,KAAK+Y,GAQhB,OANMg2B,aAAgB/uC,KAAK0F,KAGvBqpC,EAAK5iC,OAASnM,KAAK8nD,QAFnB/Y,EAAO/uC,KAAK+Y,GAAS/Y,KAAK+rB,KAAKgjB,EAAM/uC,KAAK8nD,SAKvC/Y,KAIf,SAASgZ,EAAansB,EAASl2B,EAAMsf,EAAOhG,GACxC,OAAO,SAASra,GACZ,IAAgB4M,EAAZ4N,EAAQ,GAEZ,IAAK5N,KAAO5M,EACRwa,EAAM5N,GAAO5M,EAAE4M,GAIf4N,EAAM6F,MADNhG,EACcgG,EAAQ,IAAMrgB,EAAEqgB,MAEhBA,EAGdtf,GAAQogD,GAAUlqB,EAAQosB,eAC1BpsB,EAAQosB,cAAc7oC,GAG1Byc,EAAQxxB,QAAQ1E,EAAMyZ,IAU9B,SAAS8oC,EAAQv/C,EAAOw/C,GACpB,IAEIj+B,EAAMk+B,EAFNh5B,EAAQ,GACRi5B,EAAY,GAehB,IAvBJ,SAAyB1/C,GACrB,MAAyB,iBAAVA,GAAsBjI,OAAO4nD,eAAe3/C,KAAWjI,OAAO4nD,eAAe,KACjF5nD,OAAO4nD,eAAe3/C,KAAWjI,OAAO4nD,eAAe,IAAIj6C,OAC1C,iBAAV1F,EAUb4/C,CAFL5/C,EAAQA,GAAS,MAGb0/C,EAAY3nD,OAAO8nD,oBAAoB9nD,OAAO4nD,eAAe3/C,IAAQstB,QAAO,SAAUwyB,GAAK,OAA2B,IAApBA,EAAE7yC,QAAQ,UAGhHsU,EAAOxpB,OAAO8nD,oBAAoB7/C,GAAO0U,OAAOgrC,GAEhDD,EAAqB1B,EAAWzwB,QAAO,SAASzkB,GAC5C,OAAO0Y,EAAKtU,QAAQpE,GAAO,KAGxB7I,GACHjI,OAAO8nD,oBAAoB7/C,GAAOpH,SAAQ,SAAS4tB,IAClB,IAAzBC,EAAMxZ,QAAQuZ,MAAkBg5B,GAAoBC,EAAmBxyC,QAAQuZ,GAAQ,IACvFC,EAAMxtB,KAAKutB,MAGnBxmB,EAAQjI,OAAO4nD,eAAe3/C,GAGlC,OAAOymB,EAGXs3B,EAAawB,EAAQ,IAAI,GAEzB,IAAIvB,EAAmBp9C,EAAWvG,OAAO,CACrCoF,KAAM,SAASO,GACX,IACIZ,EADAG,EAAOjI,KAEPiqB,EAAOg+B,EAAQv/C,GAAO,GACtByD,EAAS,WACL,OAAOlE,GAGfqB,EAAWvB,GAAGI,KAAKoC,KAAKvK,MAExBA,KAAKyoD,UAAY,GAEjBx+B,EAAK3oB,SAAQ,SAAS0jB,GAGI,iBAFtBld,EAASY,EAAMsc,KAEmBld,IAAWA,EAAOmB,SAA8B,KAAnB+b,EAAMla,OAAO,KACxEhD,EAASG,EAAK8jB,KAAKjkB,EAAQkd,EAAO7Y,IAGtClE,EAAK+c,GAASld,KAGlBG,EAAKygD,IAAM/nD,EAAM6uB,QAGrBm5B,gBAAiB,SAAS3jC,EAAO+hC,GAC7B,OAAO/mD,KAAK0O,eAAesW,IAAoB,cAAVA,GAAmC,YAAVA,IAAyB+hC,GAAsBA,EAAmB/hC,WAAkBhlB,KAAKglB,KAAW/e,IAAuB,QAAV+e,GAGnL1jB,QAAS,SAASknD,GACd,IAAK,IAAIjhD,KAAKvH,KACNA,KAAK2oD,gBAAgBphD,IACrBihD,EAAExoD,KAAKuH,GAAIA,IAKvBqK,OAAQ,SAASm1C,GACb,IAAiBr+C,EAAOsc,EAApBzO,EAAS,GAEb,IAAKyO,KAAShlB,KACNA,KAAK2oD,gBAAgB3jC,EAAO+hC,OAC5Br+C,EAAQ1I,KAAKglB,cAEQ0hC,GAAoBh+C,aAAiBkF,KACtDlF,EAAQA,EAAMkJ,OAAOm1C,IAGzBxwC,EAAOyO,GAAStc,GAIxB,OAAO6N,GAGX+Y,IAAK,SAAStK,GACV,IAAI/c,EAAOjI,KAUX,OARAiI,EAAKmC,QAAQ47C,EAAK,CAAEhhC,MAAOA,IAEb,SAAVA,EACS/c,EAEAtH,EAAMkuB,OAAO7J,GAAO,EAApBrkB,CAA0BsH,IAM3C2gD,KAAM,SAAS5jC,EAAOtc,GAClB,IACImgD,EAAY7jC,EAAMrP,QAAQ,MAAQ,EAEtC,GAAIkzC,EAIA,IAHA,IAAIC,EAAQ9jC,EAAMpa,MAAM,KACpBukC,EAAO,GAEJ2Z,EAAMthD,OAAS,GAAG,CACrB2nC,GAAQ2Z,EAAMjzC,QACd,IAAIkX,EAAMpsB,EAAMkuB,OAAOsgB,GAAM,EAAnBxuC,CATPX,MAUH,GAAI+sB,aAAe25B,EAEf,OADA35B,EAAIwC,IAAIu5B,EAAMj+C,KAAK,KAAMnC,GAClBmgD,EAEX1Z,GAAQ,IAMhB,OAFAxuC,EAAMmuB,OAAO9J,EAAbrkB,CAlBWX,KAkBe0I,GAEnBmgD,GAGXt5B,IAAK,SAASvK,EAAOtc,GACjB,IAAIT,EAAOjI,KACP+oD,GAAiB,EACjBF,EAAY7jC,EAAMrP,QAAQ,MAAQ,EAClClC,EAAU9S,EAAMkuB,OAAO7J,GAAO,EAApBrkB,CAA0BsH,GAsBxC,OApBIwL,IAAY/K,IACR+K,aAAmBnK,GAActJ,KAAKyoD,UAAUzjC,KAC5ChlB,KAAKyoD,UAAUzjC,GAAOsK,KACvB7b,EAAQxJ,OAAO+7C,EAAKhmD,KAAKyoD,UAAUzjC,GAAOsK,KAE7C7b,EAAQxJ,OAAO67C,EAAQ9lD,KAAKyoD,UAAUzjC,GAAOgkC,UAGjDD,EAAiB9gD,EAAKmC,QAAQ,MAAO,CAAE4a,MAAOA,EAAOtc,MAAOA,OAGnDmgD,IACDngD,EAAQT,EAAK8jB,KAAKrjB,EAAOsc,GAAO,WAAa,OAAO/c,QAEnDA,EAAK2gD,KAAK5jC,EAAOtc,IAAUsc,EAAMrP,QAAQ,MAAQ,GAAKqP,EAAMrP,QAAQ,MAAQ,IAC7E1N,EAAKmC,QAAQ07C,EAAQ,CAAE9gC,MAAOA,MAKnC+jC,GAGX58C,OAAQhJ,EAER4oB,KAAM,SAASk7B,EAAQjiC,EAAO7Y,GAC1B,IACImjB,EACA05B,EAFA/gD,EAAOjI,KAGP0F,EAAOwL,EAAS3G,KAAK08C,GAEzB,GAAc,MAAVA,IAA4B,oBAATvhD,GAAuC,mBAATA,GAA4B,CAC7E,IAAIujD,EAAoBhC,aAAkBr5C,EACtCs7C,EAAejC,aAAkBl5C,GAExB,oBAATrI,GAA+BwjD,GAAiBD,GAWhC,mBAATvjD,GAA6BujD,GAAqBC,KACpDD,GAAsBC,IACvBjC,EAAS,IAAIr5C,EAAgBq5C,IAGjC+B,EAASjB,EAAa9/C,EAAM69C,EAAQ9gC,GAAO,GAE3CiiC,EAAOz9C,KAAKs8C,EAAQkD,GAEpB/gD,EAAKwgD,UAAUzjC,GAAS,CAAEgkC,OAAQA,KAnB5B/B,aAAkBP,IACpBO,EAAS,IAAIP,EAAiBO,IAGlC33B,EAAMy4B,EAAa9/C,EAAM+9C,EAAKhhC,GAAO,GACrCiiC,EAAOz9C,KAAKw8C,EAAK12B,GACjB05B,EAASjB,EAAa9/C,EAAM69C,EAAQ9gC,GAAO,GAC3CiiC,EAAOz9C,KAAKs8C,EAAQkD,GAEpB/gD,EAAKwgD,UAAUzjC,GAAS,CAAEsK,IAAKA,EAAK05B,OAAQA,IAahD/B,EAAO96C,OAASA,EAGpB,OAAO86C,KAIf,SAASkC,EAAM/jD,EAAGjB,GACd,GAAIiB,IAAMjB,EACN,OAAO,EAGX,IAAkD6gB,EAA9CokC,EAAQzoD,EAAM+E,KAAKN,GAEvB,GAAIgkD,IAF+BzoD,EAAM+E,KAAKvB,GAG1C,OAAO,EAGX,GAAc,SAAVilD,EACA,OAAOhkD,EAAE6D,YAAc9E,EAAE8E,UAG7B,GAAc,WAAVmgD,GAAgC,UAAVA,EACtB,OAAO,EAGX,IAAKpkC,KAAS5f,EACV,IAAK+jD,EAAM/jD,EAAE4f,GAAQ7gB,EAAE6gB,IACnB,OAAO,EAIf,OAAO,EAGX,IAAIqkC,EAAU,CACV59C,OAAU,SAAS/C,GACf,cAAWA,IAAUxC,GAAkC,SAAxBwC,EAAM4P,cAC1B,KAEJ3X,EAAMoI,WAAWL,IAG5B2N,KAAQ,SAAS3N,GACb,cAAWA,IAAUxC,GAAkC,SAAxBwC,EAAM4P,cAC1B,KAEJ3X,EAAM2c,UAAU5U,IAG3B4gD,QAAW,SAAS5gD,GAChB,cAAWA,IAAUxC,EACW,SAAxBwC,EAAM4P,cACC,KAEwB,SAAxB5P,EAAM4P,cAGL,MAAT5P,IAAkBA,EAAQA,GAGrC0I,OAAU,SAAS1I,GACf,cAAWA,IAAUxC,GAAkC,SAAxBwC,EAAM4P,cAC1B,KAEK,MAAT5P,EAAiBA,EAAQ,GAAMA,GAG1C6gD,QAAW,SAAS7gD,GAChB,OAAOA,IAIXyhC,GAAgB,CAChB/4B,OAAU,GACV3F,OAAU,EACV4K,KAAQ,IAAIjI,KACZk7C,SAAW,EACXC,QAAW,IAkBf,IAAIlG,GAAQqD,EAAiB3jD,OAAO,CAChCoF,KAAM,SAAS0F,GACX,IAAI5F,EAAOjI,KAEX,KAAK6N,GAAQlL,EAAEgzB,cAAc9nB,MACzBA,EAAOlL,EAAEI,OAAO,GAAIkF,EAAKrH,SAAUiN,GAE/B5F,EAAKuhD,eACL,IAAK,IAAI5/C,EAAM,EAAGA,EAAM3B,EAAKuhD,cAAchiD,OAAQoC,IAAO,CACrD,IAAIxH,EAAO6F,EAAKuhD,cAAc5/C,GAC9BiE,EAAKzL,GAAQ6F,EAAKrH,SAASwB,KAKxCskD,EAAiB3+C,GAAGI,KAAKoC,KAAKtC,EAAM4F,GAEpC5F,EAAK0mC,OAAQ,EACb1mC,EAAKwhD,YAAc,GAEfxhD,EAAKq7C,UACLr7C,EAAKynB,GAAKznB,EAAKqnB,IAAIrnB,EAAKq7C,SAEpBr7C,EAAKynB,KAAO9sB,IACZqF,EAAKynB,GAAKznB,EAAKyhD,cAK3Bf,gBAAiB,SAAS3jC,GACtB,OAAO0hC,EAAiB3+C,GAAG4gD,gBAAgBp+C,KAAKvK,KAAMglB,IACxC,QAAVA,KAAsC,OAAjBhlB,KAAKsjD,SAA8B,OAAVt+B,IACpC,UAAVA,GAA+B,gBAAVA,GAAqC,eAAVA,GAGxD2+B,OAAQ,SAAS3+B,EAAOtc,GACpB,IAGIqsB,EAFA40B,EAAY3kC,EACZ2J,EAFO3uB,KAEQ2uB,QAAU,GAc7B,OAXA3J,EAAQ2J,EAAO3J,MAEXA,EA1DZ,SAAwB+H,EAAK3qB,GACzB,IAAI4iB,EACA2kC,EAEJ,IAAKA,KAAa58B,EAAK,CAEnB,GADA/H,EAAQ+H,EAAI48B,GACRhiD,EAAcqd,IAAUA,EAAMA,OAASA,EAAMA,QAAU5iB,EACvD,OAAO4iB,EACJ,GAAIA,IAAU5iB,EACjB,OAAO4iB,EAGf,OAAO,KA8CS4kC,CAAej7B,EAAQg7B,IAE/B3kC,KACA+P,EAAQ/P,EAAM+P,QACA/P,EAAMtf,OAChBqvB,EAAQs0B,EAAQrkC,EAAMtf,KAAK4S,gBAI5Byc,EAAQA,EAAMrsB,GAASA,GAGlCs/C,cAAe,SAASrjD,GACpB,IAAIooC,EAASpoC,EAAEooC,OAED,OAAVA,GAA6B,UAAVA,IACnB/sC,KAAK2uC,OAAQ,EACb3uC,KAAKypD,YAAY9kD,EAAEqgB,QAAS,IAIpC6kC,SAAU,SAAS7kC,GAEf,QADAA,GAAShlB,KAAK2uB,QAAU,IAAI3J,MACM,IAAnBA,EAAM6kC,UAGzBt6B,IAAK,SAASvK,EAAOtc,GACjB,IAAIT,EAAOjI,KACP2uC,EAAQ1mC,EAAK0mC,MAEb1mC,EAAK4hD,SAAS7kC,KAGTmkC,EAFLzgD,EAAQT,EAAK07C,OAAO3+B,EAAOtc,GAETT,EAAKqnB,IAAItK,IAYvB/c,EAAKmC,QAAQ,WAAY,CAAE4a,MAAOA,EAAOtc,MAAOA,KAXhDT,EAAK0mC,OAAQ,EACb1mC,EAAKwhD,YAAYzkC,IAAS,EAEtB0hC,EAAiB3+C,GAAGwnB,IAAIhlB,KAAKtC,EAAM+c,EAAOtc,KAAWimC,IACrD1mC,EAAK0mC,MAAQA,EAER1mC,EAAK0mC,QACN1mC,EAAKwhD,YAAYzkC,IAAS,OAS9C8kC,OAAQ,SAASj8C,GACb,IAEImX,EAFA/c,EAAOjI,KACPmM,EAAS,WAAa,OAAOlE,GAGjC,IAAK+c,KAASnX,EAAM,CAChB,IAAInF,EAAQmF,EAAKmX,GAEM,KAAnBA,EAAMla,OAAO,KACbpC,EAAQT,EAAK8jB,KAAKle,EAAKmX,GAAQA,EAAO7Y,IAG1ClE,EAAK2gD,KAAK5jC,EAAOtc,GAGjBT,EAAKq7C,UACLr7C,EAAKynB,GAAKznB,EAAKqnB,IAAIrnB,EAAKq7C,UAG5Br7C,EAAK0mC,OAAQ,EACb1mC,EAAKwhD,YAAc,IAGvBM,MAAO,WACH,OAAO/pD,KAAK0vB,KAAO1vB,KAAK0pD,cAIhCrG,GAAM3jD,OAAS,SAASsI,EAAMd,GACtBA,IAAYtE,IACZsE,EAAUc,EACVA,EAAOq7C,IAGX,IAAIJ,EAEA7gD,EACA4iB,EACAtf,EACAgD,EACAkB,EACApC,EAEAwiD,EARAniD,EAAQ9E,EAAO,CAAEnC,SAAU,IAAMsG,GAOjCynB,EAAS,GAETe,EAAK7nB,EAAM6nB,GACXu6B,EAAiB,GAcrB,GAZIv6B,IACA7nB,EAAMy7C,QAAU5zB,GAGhB7nB,EAAM6nB,WACC7nB,EAAM6nB,GAGbA,IACA7nB,EAAMjH,SAAS8uB,GAAM7nB,EAAM6hD,WAAa,IAGR,mBAAhCx4C,EAAS3G,KAAK1C,EAAM8mB,QAA8B,CAClD,IAAK/kB,EAAM,EAAGpC,EAASK,EAAM8mB,OAAOnnB,OAAQoC,EAAMpC,EAAQoC,WACtDob,EAAQnd,EAAM8mB,OAAO/kB,MACA1D,EACjByoB,EAAO3J,GAAS,GACTA,EAAMA,QACb2J,EAAO3J,EAAMA,OAASA,GAG9Bnd,EAAM8mB,OAASA,EAGnB,IAAKvsB,KAAQyF,EAAM8mB,OAEfjpB,GADAsf,EAAQnd,EAAM8mB,OAAOvsB,IACRsD,MAAQ,UACrBgD,EAAQ,KACRshD,EAAe5nD,EAEfA,SAAe4iB,EAAW,QAAM9e,EAAS8e,EAAMA,MAAQ5iB,EAElD4iB,EAAMklC,UAGc,mBAFrBxhD,EAAQb,EAAMjH,SAASopD,IAAiB5nD,EAAO4nD,EAAe5nD,GAAQ4iB,EAAMmlC,eAAiBvnD,EAAcoiB,EAAMmlC,aAAehgB,GAAczkC,EAAK4S,iBAG/I2xC,EAAetoD,KAAKS,GAIxB8E,EAAQwoB,KAAOttB,IACfyF,EAAM6hD,WAAahhD,GAGvBb,EAAMjH,SAASopD,IAAiB5nD,EAAO4nD,EAAe5nD,GAAQsG,EAE1D/F,EAAEgF,cAAcqd,GAChBA,EAAM+P,MAAQ/P,EAAM+P,OAASs0B,EAAQ3jD,GAErCsf,EAAQ,CACJ+P,MAAOs0B,EAAQ3jD,IAmB3B,OAdIukD,EAAeziD,OAAS,IACxBK,EAAM2hD,cAAgBS,IAG1BhH,EAAQj7C,EAAKjF,OAAO8E,IACdnI,OAAS,SAASwH,GACpB,OAAOm8C,GAAM3jD,OAAOujD,EAAO/7C,IAG3BW,EAAM8mB,SACNs0B,EAAMt0B,OAAS9mB,EAAM8mB,OACrBs0B,EAAMK,QAAUz7C,EAAMy7C,SAGnBL,GAGX,IAAImH,GAAW,CACX5kC,SAAU,SAASR,GACf,OAAO9b,EAAW8b,GAASA,EAAQ6J,EAAO7J,IAG9CqlC,QAAS,SAASrlC,GACd,IAAIQ,EAAWxlB,KAAKwlB,SAASR,GAC7B,OAAO,SAAS9f,EAAGggB,GAIf,OAHAhgB,EAAIsgB,EAAStgB,GACbggB,EAAIM,EAASN,GAEJ,MAALhgB,GAAkB,MAALggB,EACN,EAGF,MAALhgB,GACQ,EAGH,MAALggB,EACO,EAGPhgB,EAAEolD,cACKplD,EAAEolD,cAAcplC,GAGpBhgB,EAAIggB,EAAI,EAAKhgB,EAAIggB,GAAK,EAAI,IAIzCi8B,OAAQ,SAASl8B,GACb,IAAIolC,EAAUplC,EAAKolC,SAAWrqD,KAAKqqD,QAAQplC,EAAKD,OAEhD,MAAgB,QAAZC,EAAKma,IACE,SAASl6B,EAAGggB,GACf,OAAOmlC,EAAQnlC,EAAGhgB,GAAG,IAItBmlD,GAGXE,QAAS,SAASC,GACd,OAAO,SAAStlD,EAAGggB,GACf,IACItb,EACApC,EAFA+O,EAASi0C,EAAU,GAAGtlD,EAAGggB,GAI7B,IAAKtb,EAAM,EAAGpC,EAASgjD,EAAUhjD,OAAQoC,EAAMpC,EAAQoC,IACnD2M,EAASA,GAAUi0C,EAAU5gD,GAAK1E,EAAGggB,GAGzC,OAAO3O,KAKfk0C,GAAiB1nD,EAAO,GAAIqnD,GAAU,CACtCM,IAAK,SAAS1lC,GACV,IAAIQ,EAAWxlB,KAAKwlB,SAASR,GAC7B,OAAO,SAAS9f,EAAGggB,GACf,IAAIylC,EAASnlC,EAAStgB,GAClB0lD,EAASplC,EAASN,GAOtB,OALIylC,GAAUA,EAAO1hD,SAAW2hD,GAAUA,EAAO3hD,UAC7C0hD,EAASA,EAAO1hD,UAChB2hD,EAASA,EAAO3hD,WAGhB0hD,IAAWC,EACJ1lD,EAAE2lD,WAAa3lC,EAAE2lC,WAGd,MAAVF,GACQ,EAGE,MAAVC,EACO,EAGPD,EAAOL,cACAK,EAAOL,cAAcM,GAGzBD,EAASC,EAAS,GAAK,IAItCE,KAAM,SAAS9lC,GACX,IAAIQ,EAAWxlB,KAAKwlB,SAASR,GAC7B,OAAO,SAAS9f,EAAGggB,GACf,IAAIylC,EAASnlC,EAAStgB,GAClB0lD,EAASplC,EAASN,GAOtB,OALIylC,GAAUA,EAAO1hD,SAAW2hD,GAAUA,EAAO3hD,UAC7C0hD,EAASA,EAAO1hD,UAChB2hD,EAASA,EAAO3hD,WAGhB0hD,IAAWC,EACJ1lD,EAAE2lD,WAAa3lC,EAAE2lC,WAGd,MAAVF,EACO,EAGG,MAAVC,GACQ,EAGRA,EAAON,cACAM,EAAON,cAAcK,GAGzBA,EAASC,EAAS,GAAK,IAGtCzJ,OAAQ,SAASl8B,GACd,OAAOjlB,KAAKilB,EAAKma,KAAKna,EAAKD,UAIlC1K,EAAM,SAASE,EAAOuO,GAClB,IAAInf,EAAKpC,EAASgT,EAAMhT,OAAQ+O,EAAS,IAAIrT,MAAMsE,GAEnD,IAAKoC,EAAM,EAAGA,EAAMpC,EAAQoC,IACxB2M,EAAO3M,GAAOmf,EAASvO,EAAM5Q,GAAMA,EAAK4Q,GAG5C,OAAOjE,GAGX,IAAIw0C,GAAY,WAEZ,SAAS55C,EAAMvC,GAIX,MAHkB,iBAAPA,IACPA,EAAMA,EAAInM,QAAQ,WAAY,KAE3Ba,KAAKkP,UAAU5D,GAG1B,SAASo8C,EAAOC,GACZ,OAAO,SAAS/lD,EAAGggB,EAAGgmC,EAAQlG,GAM1B,OALA9/B,GAAK,GACDgmC,IACAhmD,EAAI,IAAMA,EAAI,qBAAuB,EAA2B,uBAAyB8/C,EAAyB,KAAO,kBACzH9/B,EAAK,EAA2BA,EAAEggC,kBAAkBF,GAA0B9/B,EAAE5M,eAE7E2yC,EAAK/lD,EAAGiM,EAAM+T,GAAIgmC,IAIjC,SAASlM,EAASqG,EAAIngD,EAAGggB,EAAGgmC,EAAQlG,GAChC,GAAS,MAAL9/B,EAAW,CACX,UAAWA,IAAMhf,EAAQ,CACrB,IAAImQ,EAAOwD,EAAWxB,KAAK6M,GACvB7O,EACA6O,EAAI,IAAI9W,MAAMiI,EAAK,IACZ60C,GACPhmC,EAAI/T,EAAO,EAA2B+T,EAAEggC,kBAAkBF,GAA0B9/B,EAAE5M,eACtFpT,EAAI,KAAOA,EAAI,eAAiB,EAA2B,uBAAyB8/C,EAAyB,KAAO,mBAEpH9/B,EAAI/T,EAAM+T,GAIdA,EAAEjc,UAEF/D,EAAI,IAAMA,EAAI,KAAOA,EAAI,YAAcA,EAAI,cAAgBA,EAAI,IAC/DggB,EAAIA,EAAEjc,WAId,OAAO/D,EAAI,IAAMmgD,EAAK,IAAMngC,EAGhC,SAASimC,EAAez3C,GASpB,IAAK,IAAIjF,EAAK,KAAM28C,GAAM,EAAO7jD,EAAI,EAAGA,EAAImM,EAAQlM,SAAUD,EAAG,CAC7D,IAAIkQ,EAAK/D,EAAQ5I,OAAOvD,GACxB,GAAI6jD,EACA38C,GAAM,KAAOgJ,MACV,IAAU,KAANA,EAAW,CAClB2zC,GAAM,EACN,SACa,KAAN3zC,EACPhJ,GAAM,KACO,KAANgJ,EACPhJ,GAAM,IACC,kCAAqCkH,QAAQ8B,IAAO,EAC3DhJ,GAAM,KAAOgJ,EAEbhJ,GAAMgJ,EAEV2zC,GAAM,EAEV,OAAO38C,EAAK,KAGhB,MAAO,CACH0C,MAAO,SAASzI,GACZ,OAAIA,GAASA,EAAMO,QACR,YAAcP,EAAMO,UAAY,IAEpCkI,EAAMzI,IAEjBmvB,GAAI,SAAS3yB,EAAGggB,EAAGgmC,EAAQlG,GACvB,OAAOhG,EAAS,KAAM95C,EAAGggB,EAAGgmC,EAAQlG,IAExChI,IAAK,SAAS93C,EAAGggB,EAAGgmC,EAAQlG,GACxB,OAAOhG,EAAS,KAAM95C,EAAGggB,EAAGgmC,EAAQlG,IAExC/H,GAAI,SAAS/3C,EAAGggB,EAAGgmC,GACf,OAAOlM,EAAS,IAAK95C,EAAGggB,EAAGgmC,IAE/BhO,IAAK,SAASh4C,EAAGggB,EAAGgmC,GAChB,OAAOlM,EAAS,KAAM95C,EAAGggB,EAAGgmC,IAEhC/N,GAAI,SAASj4C,EAAGggB,EAAGgmC,GACf,OAAOlM,EAAS,IAAK95C,EAAGggB,EAAGgmC,IAE/B9N,IAAK,SAASl4C,EAAGggB,EAAGgmC,GAChB,OAAOlM,EAAS,KAAM95C,EAAGggB,EAAGgmC,IAEhC3N,WAAYyN,GAAO,SAAS9lD,EAAGggB,GAC3B,OAAOhgB,EAAI,gBAAkBggB,EAAI,eAErC4/B,iBAAkBkG,GAAO,SAAS9lD,EAAGggB,GACjC,OAAOhgB,EAAI,gBAAkBggB,EAAI,gBAErCo4B,SAAU0N,GAAO,SAAS9lD,EAAGggB,GAEzB,OAAOhgB,EAAI,YAAcggB,EAAI,KAAOhgB,EAAI,cADhCggB,EAAIA,EAAE1d,OAAS,EAAI,GACgC,YAE/Dq9C,eAAgBmG,GAAO,SAAS9lD,EAAGggB,GAE/B,OAAOhgB,EAAI,YAAcggB,EAAI,KAAOhgB,EAAI,cADhCggB,EAAIA,EAAE1d,OAAS,EAAI,GACgC,WAE/D0tB,SAAU81B,GAAO,SAAS9lD,EAAGggB,GACzB,OAAOhgB,EAAI,YAAcggB,EAAI,YAEjCm4B,eAAgB2N,GAAO,SAAS9lD,EAAGggB,GAC/B,OAAOhgB,EAAI,YAAcggB,EAAI,aAEjC1jB,QAASwpD,GAAO,SAAS9lD,EAAGggB,GAExB,OAAOimC,EADPjmC,EAAIA,EAAEla,UAAU,EAAGka,EAAE1d,OAAS,IACH,SAAWtC,EAAI,OAE9CmmD,aAAcL,GAAO,SAAS9lD,EAAGggB,GAE7B,MAAO,IAAMimC,EADbjmC,EAAIA,EAAEla,UAAU,EAAGka,EAAE1d,OAAS,IACG,SAAWtC,EAAI,OAEpD04C,QAAS,SAAS14C,GACd,OAAOA,EAAI,WAEf24C,WAAY,SAAS34C,GACjB,OAAOA,EAAI,WAEfs4C,OAAQ,SAASt4C,GACb,MAAO,IAAMA,EAAI,aAErBu4C,UAAW,SAASv4C,GAChB,MAAO,IAAMA,EAAI,aAErBw4C,cAAe,SAASx4C,GACpB,MAAO,IAAMA,EAAI,kBAAoBA,EAAI,YAE7Cy4C,iBAAkB,SAASz4C,GACvB,MAAO,IAAMA,EAAI,kBAAoBA,EAAI,aA/IrC,GAoJhB,SAASomD,GAAMz9C,GACX7N,KAAK6N,KAAOA,GAAQ,GAkExB,SAAS09C,GAAcvmC,EAAOoa,GAC1B,GAAIpa,EAAO,CACP,IAAIwmC,SAAoBxmC,IAAU9e,EAAS,CAAE8e,MAAOA,EAAOoa,IAAKA,GAAQpa,EACxEymC,EAAcxoD,EAAQuoD,GAAcA,EAAcA,IAAe5oD,EAAc,CAAC4oD,GAAc,GAE9F,OAAOvtB,EAAKwtB,GAAa,SAASjnD,GAAK,QAASA,EAAE46B,QAI1D,SAASssB,GAAWC,EAAOvsB,GACvB,IAAIwsB,EAAa,GAEjB,GAAID,EAIA,IAHA,IAAIH,SAAoBG,IAAUzlD,EAAS,CAAE8e,MAAO2mC,EAAOvsB,IAAKA,GAAQusB,EACxEF,EAAcxoD,EAAQuoD,GAAcA,EAAcA,IAAe5oD,EAAc,CAAC4oD,GAAc,GAErFjkD,EAAI,EAAGA,EAAIkkD,EAAYjkD,OAAQD,IACpCqkD,EAAWH,EAAYlkD,GAAGyd,OAAS,CAAEoa,IAAKqsB,EAAYlkD,GAAG63B,IAAKrmB,MAAOxR,EAAI,GAIjF,OAAOqkD,EAnFXN,GAAMO,WAAa,SAASv9B,EAAYpnB,GAGpC,QAFiB,IAAZA,IAAqBA,EAAU,CAAE4kD,QAAQ,IAE1C5kD,EAAQ4kD,OAER,OArwCW,SAASz9B,GAC5B,OAAOi3B,EAAyBj3B,GAowCjB09B,CAAiBz9B,GAG5B,IAEI1kB,EACApC,EACAwuB,EACA3H,EAGArJ,EACAg6B,EATAgN,EAAc,GAMdC,EAAiB,GACjBC,EAAoB,GAGpB/M,EAAU7wB,EAAW6wB,QAEzB,IAAKv1C,EAAM,EAAGpC,EAAS23C,EAAQ33C,OAAQoC,EAAMpC,EAAQoC,IAEjDob,GADAgR,EAASmpB,EAAQv1C,IACFob,MACfg6B,EAAWhpB,EAAOgpB,SAEdhpB,EAAOmpB,SAGPnpB,GAFA3H,EAAOi9B,GAAMO,WAAW71B,IAEV1H,WACb7rB,QAAQ,iBAAiB,SAAS0N,EAAO4I,GAEtC,OADAA,GAASA,EACF,QAAUmzC,EAAkB1kD,OAASuR,GAAS,OAExDtW,QAAQ,iBAAiB,SAAS0N,EAAO4I,GAEtC,OADAA,GAASA,EACF,QAAUkzC,EAAezkD,OAASuR,GAAS,OAGtDmzC,EAAkBvqD,KAAKyG,MAAM8jD,EAAmB79B,EAAK08B,WACrDkB,EAAetqD,KAAKyG,MAAM6jD,EAAgB59B,EAAKM,iBAEpC3J,IAAU/e,GACjBooB,EAAO,OAAS49B,EAAezkD,OAAS,OACxCykD,EAAetqD,KAAKqjB,IAEpBqJ,EAAO1tB,EAAM0tB,KAAKrJ,UAGXg6B,IAAa/4C,GACpB+vB,EAAS,OAASk2B,EAAkB1kD,OAAS,KAAO6mB,EAAO,KAAO08B,GAAU55C,MAAM6kB,EAAOttB,OAAS,IAClGwjD,EAAkBvqD,KAAKq9C,IAEvBhpB,EAAS+0B,IAAW/L,GAAY,MAAM1mC,eAAe+V,EAAM2H,EAAOttB,MAAOstB,EAAOipB,aAAer8C,GAAcozB,EAAOipB,WAAmB3wB,EAAW02B,yBAI1JgH,EAAYrqD,KAAKq0B,GAGrB,MAAO,CAAE1H,WAAY,IAAM09B,EAAYnhD,KAlD3B,CAAE85C,IAAK,OAAQF,GAAI,QAkDmBn2B,EAAW4wB,QAAU,IAAKvwB,OAAQs9B,EAAgBlB,UAAWmB,IA2BnH,IAAIC,GAAc,CACd,KAAM,KACNC,OAAQ,KACRC,UAAW,KACXC,QAAS,KACTnD,MAAO,KACP,KAAM,MACNoD,GAAI,MACJC,UAAW,MACXC,aAAc,MACdC,WAAY,MACZC,SAAU,MACV,IAAK,KACLC,WAAY,KACZC,SAAU,KACVC,KAAM,KACN,KAAM,MACNC,GAAI,MACJC,oBAAqB,MACrBC,cAAe,MACf,IAAK,KACLC,cAAe,KACfC,YAAa,KACbC,QAAS,KACT,KAAM,MACNC,uBAAwB,MACxBC,iBAAkB,MAClBC,GAAI,MACJC,eAAgB,iBAChBhQ,OAAQ,SACRI,QAAS,UACTC,WAAY,cAGhB,SAAS4P,GAAkBn/B,GACvB,IAAI1kB,EACJpC,EACAwuB,EACAgpB,EACAG,EAAU7wB,EAAW6wB,QAErB,GAAIA,EACA,IAAKv1C,EAAM,EAAGpC,EAAS23C,EAAQ33C,OAAQoC,EAAMpC,EAAQoC,KAEjDo1C,GADAhpB,EAASmpB,EAAQv1C,IACCo1C,kBAEKA,IAAa94C,IAChC8vB,EAAOgpB,SAAWmN,GAAYnN,EAAS1mC,gBAAkB0mC,GAG7DyO,GAAkBz3B,GAK9B,SAAS03B,GAAgBp/B,GACrB,GAAIA,IAAeqH,EAAcrH,GAU7B,OATIrrB,EAAQqrB,IAAgBA,EAAW6wB,UACnC7wB,EAAa,CACT4wB,MAAO,MACPC,QAASl8C,EAAQqrB,GAAcA,EAAa,CAACA,KAIrDm/B,GAAkBn/B,GAEXA,EAMf,SAASq/B,GAAkBC,EAAIC,GAC3B,OAAID,EAAG1O,QAAS2O,EAAG3O,QAIZ0O,EAAG5oC,QAAU6oC,EAAG7oC,OAAS4oC,EAAGllD,QAAUmlD,EAAGnlD,OAASklD,EAAG5O,WAAa6O,EAAG7O,UAGhF,SAAS8O,GAAoB93B,GAGzB,OAAIL,EAFJK,EAASA,GAAU,IAGR,CAAEkpB,MAAO,MAAOC,QAAS,IAG7BuO,GAAgB13B,GAG3B,SAAS+3B,GAAc7oD,EAAGggB,GACtB,OAAIA,EAAEg6B,OAAUh6C,EAAE8f,MAAQE,EAAEF,MACjB,EACA9f,EAAE8f,MAAQE,EAAEF,OACX,EAED,EA6Cf,SAASgpC,GAAehpC,EAAOoa,EAAKirB,EAAS4D,GACzC,IAAIzC,SAAoBxmC,IAAU9e,EAAS,CAAE8e,MAAOA,EAAOoa,IAAKA,EAAKirB,QAASA,EAAS4D,gBAAiBA,GAAoBjpC,EAC5HymC,EAAcxoD,EAAQuoD,GAAcA,EAAcA,IAAe5oD,EAAc,CAAC4oD,GAAc,GAE9F,OAAOlxC,EAAImxC,GAAa,SAASjnD,GAC7B,MAAO,CACHwgB,MAAOxgB,EAAEwgB,MACToa,IAAK56B,EAAE46B,KAAO,MACd8uB,WAAY1pD,EAAE0pD,WACd7D,QAAS7lD,EAAE6lD,QACX4D,gBAAiBzpD,EAAEypD,oBAK/B,SAASE,GAA6BnpC,EAAOoa,EAAKirB,GAG9C,IAFA,IAAIoB,EAAcuC,GAAehpC,EAAOoa,EAAKirB,GAEpC9iD,EAAI,EAAGA,EAAIkkD,EAAYjkD,OAAQD,WAC7BkkD,EAAYlkD,GAAG8iD,QAG1B,OAAOoB,EAyQX,SAAS2C,GAAmBlpD,EAAGggB,GAC3B,OAAIhgB,GAAKA,EAAE+D,SAAWic,GAAKA,EAAEjc,QAClB/D,EAAE+D,YAAcic,EAAEjc,UAEtB/D,IAAMggB,EAGjB,SAASmpC,GAAmBC,EAAaJ,EAAYnf,EAAMh2B,EAAOvR,EAAQ+mD,GAEtE,IAAI3kD,EACA4kD,EACAC,EACAr+B,GAJJ89B,EAAaA,GAAc,IAIN1mD,OAErB,IAAKoC,EAAM,EAAGA,EAAMwmB,EAAKxmB,IAAO,CAE5B6kD,GADAD,EAAON,EAAWtkD,IACE8kD,UACpB,IAAI1pC,EAAQwpC,EAAKxpC,MACjBspC,EAAYtpC,GAASspC,EAAYtpC,IAAU,GAC3CupC,EAAMvpC,GAASupC,EAAMvpC,IAAU,GAC/BupC,EAAMvpC,GAAOypC,GAAgBF,EAAMvpC,GAAOypC,IAAiB,GAC3DH,EAAYtpC,GAAOypC,GAAgBE,GAAUF,EAAan2C,eAAeg2C,EAAYtpC,GAAOypC,GAAe1f,EAAMpuC,EAAM0uB,SAASrK,GAAQjM,EAAOvR,EAAQ+mD,EAAMvpC,GAAOypC,KA3X5KnD,GAAMoC,gBAAkBA,GAiExBpC,GAAMsD,eAnCN,SAASA,EAAeC,EAAOC,GAI3B,GAHAD,EAAQf,GAAoBe,GAC5BC,EAAQhB,GAAoBgB,GAExBD,EAAM3P,QAAU4P,EAAM5P,MACtB,OAAO,EAGX,IAAI0O,EAAIC,EACJkB,GAAYF,EAAM1P,SAAW,IAAIv4C,QACjCooD,GAAYF,EAAM3P,SAAW,IAAIv4C,QAErC,GAAImoD,EAASvnD,SAAWwnD,EAASxnD,OAC7B,OAAO,EAGXunD,EAAWA,EAAS9pC,KAAK8oC,IACzBiB,EAAWA,EAAS/pC,KAAK8oC,IAEzB,IAAK,IAAInkD,EAAM,EAAGA,EAAMmlD,EAASvnD,OAAQoC,IAIrC,GAHAgkD,EAAKmB,EAASnlD,GACdikD,EAAKmB,EAASplD,GAEVgkD,EAAG1O,OAAS2O,EAAG3O,OACf,IAAK0P,EAAehB,EAAIC,GACpB,OAAO,OAER,IAAKF,GAAkBC,EAAIC,GAC9B,OAAO,EAIf,OAAO,GA8CXvC,GAAMjjD,UAAY,CACd4mD,QAAS,WACL,OAAOjvD,KAAK6N,MAEhBqhD,MAAO,SAASn2C,EAAO+B,GACnB,OAAO,IAAIwwC,GAAMtrD,KAAK6N,KAAKjH,MAAMmS,EAAOA,EAAQ+B,KAEpD0jC,KAAM,SAAS1jC,GACX,OAAO,IAAIwwC,GAAMtrD,KAAK6N,KAAKjH,MAAMkU,KAErC4jC,KAAM,SAAS5jC,GACX,OAAO,IAAIwwC,GAAMtrD,KAAK6N,KAAKjH,MAAM,EAAGkU,KAExCqrB,OAAQ,SAAS3gB,GACb,OAAO,IAAI8lC,GAAMhxC,EAAIta,KAAK6N,KAAM2X,KAEpC84B,MAAO,SAAS94B,EAAU4Z,EAAK+vB,GAC3B,IAAIlqC,EAAO,CAAEma,IAAKA,GAUlB,OARI5Z,IACIA,EAAS6kC,QACTplC,EAAKolC,QAAU7kC,EAAS6kC,QAExBplC,EAAKD,MAAQQ,GAKV,IAAI8lC,GADX6D,EACiBnvD,KAAK6N,KAAKoX,KAAKmlC,GAASjJ,OAAOl8B,IAGnCjlB,KAAK6N,KAAKjH,MAAM,GAAGqe,KAAKmlC,GAASjJ,OAAOl8B,MAE7DmqC,QAAS,SAAS5pC,EAAU2pC,GACxB,OAAOnvD,KAAKs+C,MAAM94B,EAAU,MAAO2pC,IAEvCE,kBAAmB,SAAS7pC,EAAU2pC,GAClC,OAAOnvD,KAAKs+C,MAAM94B,EAAU,OAAQ2pC,IAExClqC,KAAM,SAASD,EAAOoa,EAAKkwB,EAAUH,GACjC,IAAIvlD,EACJpC,EACAikD,EAAcF,GAAcvmC,EAAOoa,GACnCorB,EAAY,GAIZ,GAFA8E,EAAWA,GAAYlF,GAEnBqB,EAAYjkD,OAAQ,CACpB,IAAKoC,EAAM,EAAGpC,EAASikD,EAAYjkD,OAAQoC,EAAMpC,EAAQoC,IACrD4gD,EAAU7oD,KAAK2tD,EAASnO,OAAOsK,EAAY7hD,KAG/C,OAAO5J,KAAKovD,QAAQ,CAAE/E,QAASiF,EAAS/E,QAAQC,IAAc2E,GAGlE,OAAOnvD,MAGXg2B,OAAQ,SAASg2B,GACb,IAAIuD,EACJ1hD,EAAO7N,KAAK6N,KAKZ,OAFAm+C,EAAc0B,GAAgB1B,KAEqB,IAA/BA,EAAY7M,QAAQ33C,QAIxC+nD,EAAWjE,GAAMO,WAAWG,EAAa,CAAEF,QAAQ,IAG5C,IAAIR,GADFz9C,EAAKmoB,OAAOu5B,KALVvvD,MASfwvD,MAAO,SAAS/D,EAAagE,EAASvoD,GAClCukD,EAAcuC,GAAevC,GAAe,IAC5CgE,EAAUA,GAAWzvD,KAAK6N,KAE1B,IAEA29C,EADAj1C,EAAS,IAAI+0C,GADFtrD,KACa6N,MAwCxB,OArCI49C,EAAYjkD,OAAS,IACrBgkD,EAAaC,EAAY,GAGrBl1C,EADArP,GAAWA,EAAQwoD,YACV,IAAIpE,GAAMmE,GAASE,aAAanE,EAAYiE,GAAStpB,QAAO,SAASqpB,GAC1E,IAAI3hD,EAAO,IAAIy9C,GAAMmE,GAASz5B,OAAO,CAAC,CAClChR,MAAOwqC,EAAMxqC,MACbg6B,SAAU,KACVt2C,MAAO8mD,EAAM9mD,MACbu2C,YAAY,KAEZ9qB,EAAQs3B,EAAYjkD,OAAS,EAAI,IAAI8jD,GAAMkE,EAAMr7B,OAAOq7B,MAAM/D,EAAY7kD,MAAM,GAAIiH,EAAKohD,UAAW/nD,GAAS+nD,UAAYO,EAAMr7B,MACnI,MAAO,CACHnP,MAAOwqC,EAAMxqC,MACbtc,MAAO8mD,EAAM9mD,MACbknD,aAAcnE,EAAYjkD,OAAS,EACnC2sB,MAAOA,EACP+5B,WAAYrgD,EAAK6gD,UAAUlD,EAAW0C,YACtCxF,IAAK/nD,EAAM6uB,OACXqgC,UAAW17B,EAAM3sB,OACjBsoD,cAAe37B,EAAM3sB,WAKpB+O,EAAOw5C,QAAQvE,GAAYrlB,QAAO,SAASqpB,GAChD,IAAI3hD,EAAO,IAAIy9C,GAAMmE,GAASz5B,OAAO,CAAE,CAAEhR,MAAOwqC,EAAMxqC,MAAOg6B,SAAU,KAAMt2C,MAAO8mD,EAAM9mD,MAAOu2C,YAAY,KAC7G,MAAO,CACHj6B,MAAOwqC,EAAMxqC,MACbtc,MAAO8mD,EAAM9mD,MACbyrB,MAAOs3B,EAAYjkD,OAAS,EAAI,IAAI8jD,GAAMkE,EAAMr7B,OAAOq7B,MAAM/D,EAAY7kD,MAAM,GAAIiH,EAAKohD,WAAWA,UAAYO,EAAMr7B,MACrHy7B,aAAcnE,EAAYjkD,OAAS,EACnC0mD,WAAYrgD,EAAK6gD,UAAUlD,EAAW0C,iBAK/C33C,GAGXw5C,QAAS,SAASvE,GAGd,GAAI71B,EAAc61B,KAAgBxrD,KAAK6N,KAAKrG,OACxC,OAAO,IAAI8jD,GAAM,IAGrB,IAGIvc,EAOAnE,EACAhhC,EACAwmB,EAZApL,EAAQwmC,EAAWxmC,MACnBD,EAASymC,EAAWyC,gBAAkBjuD,KAAK6N,KAAO7N,KAAKgwD,iBAAiBhrC,EAAOwmC,EAAWpsB,KAAO,OACjG/P,EAAW1uB,EAAM0uB,SAASrK,GAE1BirC,EAAa5gC,EAASC,IAAIvK,EAAO,GAAIC,GACrCwqC,EAAQ,CACJxqC,MAAOA,EACPtc,MAAOunD,EACP97B,MAAO,IAKX5d,EAAS,CAACi5C,GAEd,IAAK5lD,EAAM,EAAGwmB,EAAMrL,EAAOvd,OAAQoC,EAAMwmB,EAAKxmB,IAC1CmlC,EAAOhqB,EAAOnb,GAETwkD,GAAmB6B,EADxBrlB,EAAevb,EAASC,IAAIyf,EAAM/pB,MAG9BwqC,EAAQ,CACJxqC,MAAOA,EACPtc,MAHJunD,EAAarlB,EAITzW,MAAO,IAEX5d,EAAO5U,KAAK6tD,IAEhBA,EAAMr7B,MAAMxyB,KAAKotC,GAKrB,OAAO,IAAIuc,GAFX/0C,EApCWvW,KAoCGkwD,YAAY35C,EAAQi1C,KAKtCmE,aAAc,SAASnE,EAAYiE,GAC/B,GAAI95B,EAAc61B,IAAexrD,KAAK6N,OAAS7N,KAAK6N,KAAKrG,OACrD,OAAO,IAAI8jD,GAAM,IAGrB,IAGIvc,EAOAnE,EACAhhC,EACAwmB,EAZApL,EAAQwmC,EAAWxmC,MACnBD,EAASymC,EAAWyC,gBAAkBwB,EAAU,IAAInE,GAAMmE,GAASxqC,KAAKD,EAAOwmC,EAAWpsB,KAAO,MAAOqrB,IAAgBwE,UACxH5/B,EAAW1uB,EAAM0uB,SAASrK,GAE1BirC,EAAa5gC,EAASC,IAAIvK,EAAO,GAAIC,GACrCwqC,EAAQ,CACJxqC,MAAOA,EACPtc,MAAOunD,EACP97B,MAAO,IAKX5d,EAAS,CAACi5C,GAEd,IAAK5lD,EAAM,EAAGwmB,EAAMrL,EAAOvd,OAAQoC,EAAMwmB,EAAKxmB,IAC1CmlC,EAAOhqB,EAAOnb,GAETwkD,GAAmB6B,EADxBrlB,EAAevb,EAASC,IAAIyf,EAAM/pB,MAG9BwqC,EAAQ,CACJxqC,MAAOA,EACPtc,MAHJunD,EAAarlB,EAITzW,MAAO,IAEX5d,EAAO5U,KAAK6tD,IAEhBA,EAAMr7B,MAAMxyB,KAAKotC,GAKrB,OAAO,IAAIuc,GAFX/0C,EAASvW,KAAKkwD,YAAY35C,EAAQi1C,KAKtCwE,iBAAkB,SAAShrC,EAAOoa,GAC9B,IAAIx1B,EAAKpC,EACLqG,EAAO7N,KAAK6N,KAEhB,IAAKiX,EAAY,CACb,IAAKlb,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC9CiE,EAAKjE,GAAKihD,WAAajhD,EAK3B,IAAKA,EAAM,EAAGpC,GAFdqG,EAAO,IAAIy9C,GAAMz9C,GAAMoX,KAAKD,EAAOoa,EAAKqrB,IAAgBwE,WAE5BznD,OAAQoC,EAAMpC,EAAQoC,WACvCiE,EAAKjE,GAAKihD,WAErB,OAAOh9C,EAGX,OAAO7N,KAAKilB,KAAKD,EAAOoa,GAAK6vB,WAGjCiB,YAAa,SAAS3mB,EAAQiiB,GAC1B,IAAIj1C,EAASgzB,EAMb,OAJIiiB,GAActiD,EAAWsiD,EAAWnB,WACpC9zC,EAAS,IAAI+0C,GAAM/0C,GAAQ+nC,MAAM,CAAE+L,QAASmB,EAAWnB,SAAWmB,EAAWpsB,KAhsDzE,OAgsD2F6vB,WAG5F14C,GAGXm4C,UAAW,SAASR,GAChB,IAAItkD,EACAwmB,EACA7Z,EAAS,GACTg4C,EAAQ,GAEZ,GAAIL,GAAcA,EAAW1mD,OACzB,IAAKoC,EAAM,EAAGwmB,EAAMpwB,KAAK6N,KAAKrG,OAAQoC,EAAMwmB,EAAKxmB,IAC7CykD,GAAmB93C,EAAQ23C,EAAYluD,KAAK6N,KAAKjE,GAAMA,EAAKwmB,EAAKm+B,GAGzE,OAAOh4C,IA6Bf,IAAIo4C,GAAY,CACZwB,IAAK,SAAS7B,EAAavf,EAAM1f,GAC7B,IAAI3mB,EAAQ2mB,EAASC,IAAIyf,GAQzB,OANKqhB,GAAS9B,GAEH8B,GAAS1nD,KAChB4lD,GAAe5lD,GAFf4lD,EAAc5lD,EAKX4lD,GAEXxzC,MAAO,SAASwzC,GACZ,OAAQA,GAAe,GAAK,GAEhC+B,QAAS,SAAS/B,EAAavf,EAAM1f,EAAUtW,EAAOvR,EAAQ+mD,GAC1D,IAAI7lD,EAAQ2mB,EAASC,IAAIyf,GAmBzB,OAjBIwf,EAAMzzC,QAAUlY,IAChB2rD,EAAMzzC,MAAQ,GAGbs1C,GAAS9B,GAEH8B,GAAS1nD,KAChB4lD,GAAe5lD,GAFf4lD,EAAc5lD,EAKd0nD,GAAS1nD,IACT6lD,EAAMzzC,QAGN/B,GAASvR,EAAS,GAAK4oD,GAAS9B,KAChCA,GAA4BC,EAAMzzC,OAE/BwzC,GAEX11C,IAAK,SAAS01C,EAAavf,EAAM1f,GAC7B,IAAI3mB,EAAQ2mB,EAASC,IAAIyf,GASzB,OAPKqhB,GAAS9B,IAAiBtlD,GAAOslD,KAClCA,EAAc5lD,GAGd4lD,EAAc5lD,IAAU0nD,GAAS1nD,IAAUM,GAAON,MAClD4lD,EAAc5lD,GAEX4lD,GAEXn4C,IAAK,SAASm4C,EAAavf,EAAM1f,GAC7B,IAAI3mB,EAAQ2mB,EAASC,IAAIyf,GASzB,OAPKqhB,GAAS9B,IAAiBtlD,GAAOslD,KAClCA,EAAc5lD,GAGd4lD,EAAc5lD,IAAU0nD,GAAS1nD,IAAUM,GAAON,MAClD4lD,EAAc5lD,GAEX4lD,IAIf,SAAS8B,GAASnhC,GACd,MAAsB,iBAARA,IAAqBnmB,MAAMmmB,GAG7C,SAASjmB,GAAOimB,GACZ,OAAOA,GAAOA,EAAIhmB,QAGtB,SAAS2I,GAAO4I,GACZ,IAAI5Q,EAAKpC,EAASgT,EAAMhT,OAAQ+O,EAAS,IAAIrT,MAAMsE,GAEnD,IAAKoC,EAAM,EAAGA,EAAMpC,EAAQoC,IACxB2M,EAAO3M,GAAO4Q,EAAM5Q,GAAKgI,SAG7B,OAAO2E,EAGX+0C,GAAM0C,eAAiBA,GACvB1C,GAAMC,cAAgBA,GAEtBD,GAAMgF,QAAU,SAASziD,EAAM3G,EAASioD,GAGpC,IAMIoB,EACAxP,EAPAyO,GAFJtoD,EAAUA,GAAW,IAEDsoD,MAChBgB,EAvXR,SAAsCC,GAGlC,IAFA,IAAIhF,EAAcxoD,EAAQwtD,GAAoBA,EAAmB,CAACA,GAEzDlpD,EAAI,EAAGA,EAAIkkD,EAAYjkD,OAAQD,IACpC,GAAIkkD,EAAYlkD,IAAM2B,EAAWuiD,EAAYlkD,GAAG8iD,SAC5C,OAAO,EAIf,OAAO,EA8WeqG,CAA6B1C,GAAewB,GAAS,KACvEhvD,EAAQ,IAAI8qD,GAAMz9C,GAClB8iD,EAAiCxC,GAA6BqB,GAAS,IACvEoB,EAAiBrF,GAAcrkD,EAAQ+d,MAAQ,IAC/CA,EAAOurC,EAAkBI,EAAiBD,EAA+BvzC,OAAOwzC,GAGhFC,EAAiB3pD,EAAQ2pD,eACzB76B,EAAS9uB,EAAQ8uB,OACjBwoB,EAAOt3C,EAAQs3C,KACfE,EAAOx3C,EAAQw3C,KAwDnB,OAtDIz5B,GAAQkqC,IACR3uD,EAAQA,EAAMykB,KAAKA,EAAMriB,EAAaA,EAAausD,IAGnDn5B,IACAx1B,EAAQA,EAAMw1B,OAAOA,GAEjB66B,IACArwD,EAAQqwD,EAAerwD,IAG3BugD,EAAQvgD,EAAMyuD,UAAUznD,QAGxByd,IACKkqC,IACD3uD,EAAQA,EAAMykB,KAAKA,IAGnBuqC,IACA3hD,EAAOrN,EAAMyuD,YAIjBuB,GACAhwD,EAAQA,EAAMgvD,MAAMA,EAAO3hD,EAAM3G,GAE7Bs3C,IAAS57C,GAAe87C,IAAS97C,GAAgBsE,EAAQwoD,cACzDlvD,EAAQ,IAAI8qD,GAAMwF,GAAWtwD,EAAMyuD,YAAYC,MAAM1Q,EAAME,GAE3D6R,EAA8Bj2C,EAAIq2C,GAAgC,SAASI,GACvE,OAAOhuD,EAAO,GAAIguD,EAAiB,CAC/B9C,iBAAiB,OAIzBztD,EAAQA,EAAMgvD,MAAMe,EAA6B1iD,EAAM3G,MAGvDs3C,IAAS57C,GAAe87C,IAAS97C,IAG7B47C,EAAOE,GAFXqC,EAAQvgD,EAAMqN,KAAKrG,SAEQN,EAAQ8pD,UAE/BxS,GADAA,GAAQA,EAAOE,EAAOqC,GACR,EAAI,EAAIvC,GAE1Bh+C,EAAQA,EAAM0uD,MAAM1Q,EAAME,KAG1B8Q,GAAW75B,EAAc65B,IAA2B,IAAjBA,EAAMhoD,SACzChH,EAAQA,EAAMgvD,MAAMA,EAAO3hD,EAAM3G,KAIlC,CACH65C,MAAOA,EACPlzC,KAAMrN,EAAMyuD,YAIpB,IAAIgC,GAAiBrpD,EAAM7E,OAAO,CAC9BoF,KAAM,SAASjB,GACXlH,KAAK6N,KAAO3G,EAAQ2G,MAGxBgxC,KAAM,SAAS33C,GACXA,EAAQg7C,QAAQliD,KAAK6N,OAEzBqzC,OAAQ,SAASh6C,GACbA,EAAQg7C,QAAQh7C,EAAQ2G,OAE5BszC,OAAQ,SAASj6C,GACbA,EAAQg7C,QAAQh7C,EAAQ2G,OAE5B7L,QAAS,SAASkF,GACdA,EAAQg7C,QAAQh7C,EAAQ2G,SAI5BqjD,GAAkBtpD,EAAM7E,OAAQ,CAChCoF,KAAM,SAASjB,GACX,IAAiBk6C,EAAbn5C,EAAOjI,KAEXkH,EAAUe,EAAKf,QAAUnE,EAAO,GAAIkF,EAAKf,QAASA,GAElDlE,EAAKujD,GAAM,SAASxtC,EAAOrT,UACZwB,EAAQxB,KAAUQ,IACzBgB,EAAQxB,GAAQ,CACZ0oB,IAAKlnB,EAAQxB,QAKzBuC,EAAKy1B,MAAQx2B,EAAQw2B,MAAQyzB,GAAMhQ,OAAOj6C,EAAQw2B,OAAS,CACvD5H,KAAM3yB,EACN8J,IAAK9J,GAGTi+C,EAAel6C,EAAQk6C,aAEnBl6C,EAAQimC,SACRllC,EAAKklC,OAASjmC,EAAQimC,QAGtBjkC,EAAWhC,EAAQvF,QACnBsG,EAAKtG,KAAOuF,EAAQvF,MAGnBsG,EAAKtG,OACNsG,EAAKtG,KAAO+iD,GAGhBz8C,EAAKm5C,aAAel4C,EAAWk4C,GAAgBA,EAAe,SAASl6C,GACnE,IAAIqP,EAAS,GAcb,OAZAvT,EAAKkE,GAAS,SAAS2tB,EAAQnsB,GACvBmsB,KAAUusB,IACVvsB,EAASusB,EAAavsB,GAClBltB,EAAcktB,KACdnsB,EAAQmsB,EAAOnsB,MAAMA,GACrBmsB,EAASA,EAAOtjB,MAIxBgF,EAAOse,GAAUnsB,KAGd6N,IAIfrP,QAAS,CACLk6C,aAAcsD,GAGlBvD,OAAQ,SAASj6C,GACb,OAAO+6C,EAAKjiD,KAAKy1C,MAAMvuC,EAASw+C,KAGpC7G,KAAM,SAAS33C,GACX,IACIg7C,EAEA3rC,EACAmnB,EAJO19B,KAIM09B,MAEjBx2B,EANWlH,KAMIy1C,MAAMvuC,EAASy+C,GAE9BzD,EAAUh7C,EAAQg7C,SAAW/+C,EACrB+D,EAAQ4mB,OAEhBvX,EAASmnB,EAAM5H,KAAK5uB,EAAQ2G,SAEbjL,EACXs/C,EAAQ3rC,IAERrP,EAAQg7C,QAAU,SAAS3rC,GACvBmnB,EAAMzwB,IAAI/F,EAAQ2G,KAAM0I,GAExB2rC,EAAQ3rC,IAGZ5T,EAAEs/C,KAAK/6C,KAIfg6C,OAAQ,SAASh6C,GACb,OAAO+6C,EAAKjiD,KAAKy1C,MAAMvuC,EAAS0+C,KAGpC5jD,QAAS,SAASkF,GACd,OAAO+6C,EAAKjiD,KAAKy1C,MAAMvuC,EAAS2+C,KAGpCpQ,MAAO,SAASvuC,EAASxB,GACrBwB,EAAUA,GAAW,GAErB,IACIkqD,EACAC,EAFOrxD,KAEUkH,QAAQxB,GACzBmI,EAAO3E,EAAWmoD,EAAUxjD,MAAQwjD,EAAUxjD,KAAK3G,EAAQ2G,MAAQwjD,EAAUxjD,KAWjF,OATA3G,EAAUnE,GAAO,EAAM,GAAIsuD,EAAWnqD,GACtCkqD,EAAaruD,GAAO,EAAM,GAAI8K,EAAM3G,EAAQ2G,MAE5C3G,EAAQ2G,KARG7N,KAQSohD,aAAagQ,EAAY1rD,GAEzCwD,EAAWhC,EAAQknB,OACnBlnB,EAAQknB,IAAMlnB,EAAQknB,IAAIgjC,IAGvBlqD,KAIXiqD,GAAQvpD,EAAM7E,OAAO,CACrBoF,KAAM,WACFnI,KAAKsxD,OAAS,IAElBrkD,IAAK,SAASsE,EAAK1D,GACX0D,IAAQ3O,IACR5C,KAAKsxD,OAAO9+C,EAAUjB,IAAQ1D,IAGtCioB,KAAM,SAASvkB,GACX,OAAOvR,KAAKsxD,OAAO9+C,EAAUjB,KAEjCggD,MAAO,WACHvxD,KAAKsxD,OAAS,IAElBx6B,OAAQ,SAASvlB,UACNvR,KAAKsxD,OAAO9+C,EAAUjB,OAoBrC,SAASigD,GAAiB3jD,EAAM4jD,EAASjO,EAAekO,EAAoBC,GACxE,IAAIjO,EACA70B,EACAm7B,EACApgD,EAEApC,EADAoqD,EAAU,GAGd,IAAKhoD,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAE9C,IAAKilB,KADL60B,EAAS71C,EAAKjE,GACC6nD,GACXzH,EAAe2H,EAAW9iC,KAENm7B,IAAiBn7B,IAC5B+iC,EAAQ5H,KACT4H,EAAQ5H,GAAgBrpD,EAAMmuB,OAAOk7B,IAEzC4H,EAAQ5H,GAActG,EAAQ+N,EAAQ5iC,GAAQ60B,WACvCA,EAAO70B,IAM9B,SAASgjC,GAAehkD,EAAM4jD,EAASjO,EAAekO,EAAoBC,GACtE,IAAIjO,EACA70B,EACAm7B,EACApgD,EACApC,EAEJ,IAAKoC,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAE9C,IAAKilB,KADL60B,EAAS71C,EAAKjE,GACC6nD,EACX/N,EAAO70B,GAAU20B,EAAcG,OAAO90B,EAAQ4iC,EAAQ5iC,GAAQ60B,KAE9DsG,EAAe2H,EAAW9iC,KACNm7B,IAAiBn7B,UAC1B60B,EAAOsG,GAM9B,SAAS8H,GAAajkD,EAAM4jD,EAASjO,EAAekO,EAAoBC,GACpE,IAAIjO,EACA95C,EACA+/C,EACAniD,EAEJ,IAAKoC,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,KAG9C+/C,EAAY+H,GAFZhO,EAAS71C,EAAKjE,IAEwBob,SACrB2kC,GAAajG,EAAO1+B,QACjC0+B,EAAO1+B,MAAQ2kC,GAGnBjG,EAAOh7C,MAAQ86C,EAAcG,OAAOD,EAAO1+B,MAAO0+B,EAAOh7C,OAErDg7C,EAAOvvB,QACHuvB,EAAOkM,aACPkC,GAAapO,EAAOvvB,MAAOs9B,EAASjO,EAAekO,EAAoBC,GAEvEE,GAAenO,EAAOvvB,MAAOs9B,EAASjO,EAAekO,EAAoBC,IAMzF,SAASI,GAAeC,EAAkB/O,EAAOgP,EAAWR,EAASC,EAAoBC,GACrF,OAAO,SAAS9jD,GAGZ,OAFAA,EAAOmkD,EAAiBnkD,GAEjBqkD,GAAmBjP,EAAOgP,EAAWR,EAASC,EAAoBC,EAAlEO,CAA8ErkD,IAI7F,SAASqkD,GAAmBjP,EAAOgP,EAAWR,EAASC,EAAoBC,GACvE,OAAO,SAAS9jD,GAUZ,OARIA,IAAS8nB,EAAc87B,KACK,mBAAxBvgD,EAAS3G,KAAKsD,IAAgCA,aAAgBD,IAC9DC,EAAO,CAACA,IAGZokD,EAAUpkD,EAAM4jD,EAAS,IAAIxO,EAASyO,EAAoBC,IAGvD9jD,GAAQ,IAzGvBsjD,GAAMhQ,OAAS,SAASj6C,GACpB,IAAIirD,EAAQ,CACRC,SAAY,WAAa,OAAO,IAAIjB,KAGxC,OAAIxpD,EAAcT,IAAYgC,EAAWhC,EAAQ4uB,MACtC5uB,GAGK,IAAZA,EACO,IAAIiqD,GAGRgB,EAAMjrD,MAgGjB,IAAImrD,GAAazqD,EAAM7E,OAAO,CAC1BoF,KAAM,SAASmqD,GACX,IAAiBxqD,EAAQwnB,EAAK2zB,EAAOj7C,EAAjCC,EAAOjI,KAIX,IAAK8H,KAFLwqD,EAASA,GAAU,GAGfhjC,EAAMgjC,EAAOxqD,GAEbG,EAAKH,UAAiBwnB,IAAQppB,EAAS2oB,EAAOS,GAAOA,EAGzDtnB,EAAOsqD,EAAOlP,WAAaC,GAEvB17C,EAAcM,EAAKg7C,SACnBh7C,EAAKg7C,MAAQA,EAAQj7C,EAAKtI,OAAOuI,EAAKg7C,QAG1C,IAAIsP,EAAetqD,EAAK4F,KAAKrE,KAAKvB,GAIlC,GAFAA,EAAKuqD,oBAAsBD,EAEvBtqD,EAAKg7C,MAAO,CACZ,IAOI0G,EACAvnD,EARAqwD,EAAiBxqD,EAAKshC,OAAO//B,KAAKvB,GAClCyqD,EAAoBzqD,EAAKk7C,UAAU35C,KAAKvB,GACxCypD,EAAqB,GACrBD,EAAU,GACVkB,EAAmB,GACnBhB,EAAa,GACbhJ,GAAkB,GAItB1F,EAAQh7C,EAAKg7C,OAEHt0B,SACN3rB,EAAKigD,EAAMt0B,QAAQ,SAAS3J,EAAOtc,GAC/B,IAAIkqD,EAEJjJ,EAAY3kC,EAERrd,EAAce,IAAUA,EAAMsc,MAC9B2kC,EAAYjhD,EAAMsc,aACJtc,IAAUxC,IACxByjD,EAAYjhD,GAGZf,EAAce,IAAUA,EAAMw1B,OAC9B00B,EAAWlqD,EAAMw1B,MAGrByqB,EAAkBA,GAAoBiK,GAAYA,IAAa5tC,GAAU2kC,IAAc3kC,EACvF5iB,EAAOwwD,GAAYjJ,EACnB8H,EAAQzsC,IAAgC,IAAvB5iB,EAAKuT,QAAQ,KAAckZ,EAAOzsB,GAAM,GAAQysB,EAAOzsB,GACxEuwD,EAAiB3tC,GAAS6J,EAAO7J,GACjC0sC,EAAmBkB,GAAYjJ,GAAa3kC,EAC5C2sC,EAAW3sC,GAAS4tC,GAAYjJ,MAG/B2I,EAAOnP,WAAawF,IACrB1gD,EAAKk7C,UAAY4O,GAAeW,EAAmBzP,EAAOuO,GAAkBmB,EAAkBjB,EAAoBC,KAI1H1pD,EAAKuqD,oBAAsBD,EAC3BtqD,EAAK4qD,oBAAsBX,GAAmBjP,EAAO4O,GAAgBJ,EAASC,EAAoBC,GAClG1pD,EAAK4F,KAAOkkD,GAAeQ,EAActP,EAAO4O,GAAgBJ,EAASC,EAAoBC,GAC7F1pD,EAAKshC,OAASwoB,GAAeU,EAAgBxP,EAAO6O,GAAcL,EAASC,EAAoBC,KAGvGzO,OAAQ,SAASr1C,GACb,OAAOA,EAAOA,EAAKq1C,OAAS,MAEhCnuB,MAAO2vB,EACP72C,KAAM62C,EACN3D,MAAO,SAASlzC,GACZ,OAAOA,EAAKrG,QAEhB+hC,OAAQmb,EACRwJ,WAAY,WACR,MAAO,IAEX/K,UAAW,SAASt1C,GAChB,OAAOA,KAIf,SAASilD,GAAcC,EAAeC,GAClC,IAAIC,EACAC,EAEJ,GAAIF,EAAS7+B,OAAS6+B,EAAS7+B,MAAM3sB,OACjC,IAAK,IAAID,EAAI,EAAGA,EAAIyrD,EAAS7+B,MAAM3sB,OAAQD,IACvC0rD,EAAeF,EAAc5+B,MAAM4+B,EAAc5+B,MAAM3sB,OAAS,GAChE0rD,EAAaF,EAAS7+B,MAAM5sB,GACxB0rD,GAAgBC,EACZD,EAAarD,cAAgBqD,EAAavqD,OAASwqD,EAAWxqD,MAC9DoqD,GAAcG,EAAcC,GACrBD,EAAajuC,OAASiuC,EAAavqD,OAASwqD,EAAWxqD,OAC9DuqD,EAAa9+B,MAAMkzB,iBAAkB,EACrC4L,EAAa9+B,MAAMxyB,KAAKyG,MAAM6qD,EAAa9+B,MAAO++B,EAAW/+B,OAC7D8+B,EAAa9+B,MAAMkzB,iBAAkB,IAErC0L,EAAc5+B,MAAMkzB,iBAAkB,EACtC0L,EAAc5+B,MAAMxyB,KAAKyG,MAAM2qD,EAAc5+B,MAAO,CAAC++B,IACrDH,EAAc5+B,MAAMkzB,iBAAkB,GAEnC6L,IACPH,EAAc5+B,MAAMkzB,iBAAkB,EACtC0L,EAAc5+B,MAAMxyB,KAAKyG,MAAM2qD,EAAc5+B,MAAO,CAAC++B,IACrDH,EAAc5+B,MAAMkzB,iBAAkB,GAKtD,SAAS8L,GAAY7rD,EAAQ8rD,EAAM5U,EAAME,GAKrC,IAJA,IAAI8Q,EAEAr7B,EADAvqB,EAAM,EAGHwpD,EAAK5rD,QAAUk3C,GAAM,CAIxB,IAAIl3C,GAFJ2sB,GADAq7B,EAAQ4D,EAAKxpD,IACCuqB,OAEK3sB,OA+BnB,GA7BIF,GAAUA,EAAO0d,QAAUwqC,EAAMxqC,OAAS1d,EAAOoB,QAAU8mD,EAAM9mD,OAC7DpB,EAAOsoD,cAAgBtoD,EAAO6sB,MAAM3sB,OACpC2rD,GAAY7rD,EAAO6sB,MAAM7sB,EAAO6sB,MAAM3sB,OAAS,GAAIgoD,EAAMr7B,MAAOqqB,EAAME,IAEtEvqB,EAAQA,EAAMvtB,MAAM43C,EAAMA,EAAOE,GACjCp3C,EAAO6sB,MAAQ7sB,EAAO6sB,MAAM/W,OAAO+W,IAEvCi/B,EAAK5oD,OAAOZ,IAAO,IACZ4lD,EAAMI,cAAgBz7B,EAAM3sB,QACnC2rD,GAAY3D,EAAOr7B,EAAOqqB,EAAME,GAC3B8Q,EAAMr7B,MAAM3sB,QACb4rD,EAAK5oD,OAAOZ,IAAO,KAGvBuqB,EAAQA,EAAMvtB,MAAM43C,EAAMA,EAAOE,GACjC8Q,EAAMr7B,MAAQA,EAETq7B,EAAMr7B,MAAM3sB,QACb4rD,EAAK5oD,OAAOZ,IAAO,IAIN,IAAjBuqB,EAAM3sB,OACNg3C,GAAQh3C,GAERg3C,EAAO,EACPE,GAAQvqB,EAAM3sB,UAGZoC,GAAOwpD,EAAK5rD,OACd,MAIJoC,EAAMwpD,EAAK5rD,QACX4rD,EAAK5oD,OAAOZ,EAAKwpD,EAAK5rD,OAASoC,GAIvC,SAASknD,GAAWvnB,EAAQ8pB,GASxB,IARA,IAEI7D,EACAr7B,EAHA5d,EAAS,GACT+8C,GAAgB/pB,GAAU,IAAI/hC,OAG9B+rD,EAAUrqD,EAAWmqD,GAAiBA,EAAgB,SAAS74C,EAAOzB,GACtE,OAAOyB,EAAMzB,IAGRy6C,EAAa,EAAGA,EAAaF,EAAcE,IAGhD,IAFAhE,EAAQ+D,EAAQhqB,EAAQiqB,IAEd5D,aACNr5C,EAASA,EAAO6G,OAAO0zC,GAAWtB,EAAMr7B,YACrC,CACHA,EAAQq7B,EAAMr7B,MAEd,IAAK,IAAIs/B,EAAY,EAAGA,EAAYt/B,EAAM3sB,OAAQisD,IAC9Cl9C,EAAO5U,KAAK4xD,EAAQp/B,EAAOs/B,IAIvC,OAAOl9C,EAGX,SAASm9C,GAAc7lD,GACnB,IAAIjE,EAEApC,EACA2sB,EACAs/B,EAHAl9C,EAAS,GAKb,IAAK3M,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAAO,CACrD,IAAI4lD,EAAQ3hD,EAAKi5C,GAAGl9C,GACpB,GAAI4lD,EAAMr7B,MACN,GAAIq7B,EAAMI,aACNr5C,EAASA,EAAO6G,OAAOs2C,GAAclE,EAAMr7B,aAG3C,IADAA,EAAQq7B,EAAMr7B,MACTs/B,EAAY,EAAGA,EAAYt/B,EAAM3sB,OAAQisD,IAC1Cl9C,EAAO5U,KAAKwyB,EAAM2yB,GAAG2M,IAKrC,OAAOl9C,EAGX,SAASo9C,GAAe9lD,EAAMo1C,GAC1B,IAAIr5C,EAAKpC,EAAQgoD,EACjB,GAAIvM,EACA,IAAKr5C,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,KAC9C4lD,EAAQ3hD,EAAKi5C,GAAGl9C,IACNuqB,QACFq7B,EAAMI,aACN+D,GAAenE,EAAMr7B,MAAO8uB,GAE5BuM,EAAMr7B,MAAQ,IAAIrmB,EAAoB0hD,EAAMr7B,MAAO8uB,EAAOuM,EAAMr7B,MAAM5qB,UAO1F,SAASqqD,GAAe/lD,EAAMgmD,GAC1B,IAAK,IAAIjqD,EAAM,EAAGA,EAAMiE,EAAKrG,OAAQoC,IACjC,GAAIiE,EAAKjE,GAAKgmD,cACV,GAAIgE,GAAe/lD,EAAKjE,GAAKuqB,MAAO0/B,GAChC,OAAO,OAER,GAAIA,EAAKhmD,EAAKjE,GAAKuqB,MAAOtmB,EAAKjE,IAClC,OAAO,EAKnB,SAASkqD,GAAgBC,EAAQlmD,EAAMkhC,EAAMN,GACzC,IAAK,IAAI7kC,EAAM,EAAGA,EAAMmqD,EAAOvsD,QACvBusD,EAAOnqD,GAAKiE,OAASA,IAGrBmmD,GAAeD,EAAOnqD,GAAKiE,KAAMkhC,EAAMN,GAJR7kC,MAU3C,SAASoqD,GAAe7/B,EAAO4a,EAAMN,GACjC,IAAK,IAAI7kC,EAAM,EAAGpC,EAAS2sB,EAAM3sB,OAAQoC,EAAMpC,EAAQoC,IAAO,CAC1D,GAAIuqB,EAAMvqB,IAAQuqB,EAAMvqB,GAAKgmD,aACzB,OAAOoE,GAAe7/B,EAAMvqB,GAAKuqB,MAAO4a,EAAMN,GAC3C,GAAIta,EAAMvqB,KAASmlC,GAAQ5a,EAAMvqB,KAAS6kC,EAE9C,OADAta,EAAMvqB,GAAO6kC,GACN,GAKlB,SAASwlB,GAAsBx8B,EAAM5pB,EAAMkmD,EAAQruD,EAAMwuD,GACrD,IAAK,IAAIC,EAAY,EAAG3sD,EAASiwB,EAAKjwB,OAAQ2sD,EAAY3sD,EAAQ2sD,IAAa,CAC3E,IAAIplB,EAAOtX,EAAK08B,GAEhB,GAAKplB,KAAQA,aAAgBrpC,GAI7B,GAAIqpC,EAAK6gB,eAAiBhtD,GAAgBsxD,GAGtC,IAAK,IAAItqD,EAAM,EAAGA,EAAMiE,EAAKrG,OAAQoC,IACjC,GAAIiE,EAAKjE,KAASmlC,EAAM,CACpBtX,EAAK08B,GAAatmD,EAAKi5C,GAAGl9C,GAC1BkqD,GAAgBC,EAAQlmD,EAAMkhC,EAAMtX,EAAK08B,IACzC,YANRF,GAAsBllB,EAAK5a,MAAOtmB,EAAMkmD,EAAQruD,EAAMwuD,IA+BlE,SAASE,GAAqBvmD,EAAMo1C,GAChC,OAAIA,EACOttC,GAAQ9H,GAAM,SAASkhC,GAC1B,OAAQA,EAAK2Z,KAAO3Z,EAAK2Z,KAAOzF,EAAMyF,KAAS3Z,EAAKkU,EAAMK,WAAaL,EAAMvzB,IAAMuzB,EAAMvzB,KAAOuzB,EAAMyG,eAGtG,EAGZ,SAAS2K,GAAaxmD,EAAMo1C,GACxB,OAAIA,EACOttC,GAAQ9H,GAAM,SAASkhC,GAC1B,OAAOA,EAAK2Z,KAAOzF,EAAMyF,QAGzB,EAGZ,SAAS/yC,GAAQ9H,EAAMyhD,GACnB,IAAI1lD,EAAKpC,EACT,GAAKqG,EAAL,CAIA,IAAKjE,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC9C,GAAI0lD,EAASzhD,EAAKjE,IACd,OAAOA,EAIf,OAAQ,GAGZ,SAAS0qD,GAAmB3lC,EAAQvsB,GAChC,GAAIusB,IAAWgH,EAAchH,GAAS,CAClC,IACIg7B,EADA6B,EAAa78B,EAAOvsB,GAQxB,OALIunD,EADAhiD,EAAc6jD,GACFA,EAAWttB,MAAQstB,EAAWxmC,OAAS5iB,EAEvCusB,EAAOvsB,IAASA,EAG5B8G,EAAWygD,GACJvnD,EAGJunD,EAEX,OAAOvnD,EAGX,SAASmyD,GAA8B/I,EAAYvI,GAC/C,IAAIr5C,EACApC,EACAF,EAAS,GAEb,IAAK,IAAI0d,KAASwmC,EACA,YAAVxmC,IACA1d,EAAO0d,GAASwmC,EAAWxmC,IAInC,GAAIwmC,EAAWrM,QAEX,IADA73C,EAAO63C,QAAU,GACZv1C,EAAM,EAAGpC,EAASgkD,EAAWrM,QAAQ33C,OAAQoC,EAAMpC,EAAQoC,IAC5DtC,EAAO63C,QAAQv1C,GAAO2qD,GAA8B/I,EAAWrM,QAAQv1C,GAAMq5C,QAGjF37C,EAAO0d,MAAQsvC,GAAmBrR,EAAMt0B,OAAQrnB,EAAO0d,OAE3D,OAAO1d,EAGX,SAASktD,GAAwB/I,EAAaxI,GAC1C,IAAIr5C,EACApC,EAEAF,EACAkkD,EAFAj1C,EAAS,GAIb,IAAK3M,EAAM,EAAGpC,EAASikD,EAAYjkD,OAAQoC,EAAMpC,EAAQoC,IAAQ,CAK7D,IAAK,IAAIob,KAJT1d,EAAS,GAETkkD,EAAaC,EAAY7hD,GAGrBtC,EAAO0d,GAASwmC,EAAWxmC,GAG/B1d,EAAO0d,MAAQsvC,GAAmBrR,EAAMt0B,OAAQrnB,EAAO0d,OAEnD1d,EAAO4mD,YAAcjrD,EAAQqE,EAAO4mD,cACpC5mD,EAAO4mD,WAAasG,GAAwBltD,EAAO4mD,WAAYjL,IAEnE1sC,EAAO5U,KAAK2F,GAEhB,OAAOiP,EAGX,IAAIxI,GAAazE,EAAWvG,OAAO,CAC/BoF,KAAM,SAASjB,GACX,IAAwB2G,EAApB5F,EAAOjI,KA2CX,GAzCIkH,IACA2G,EAAO3G,EAAQ2G,MAGnB3G,EAAUe,EAAKf,QAAUnE,EAAO,GAAIkF,EAAKf,QAASA,GAElDe,EAAKwsD,KAAO,GACZxsD,EAAKysD,UAAY,GACjBzsD,EAAK0sD,MAAQ,GACb1sD,EAAK2sD,cAAgB,GACrB3sD,EAAK4sD,QAAU,GACf5sD,EAAK6sD,MAAQ,GACb7sD,EAAK8sD,eAAiB,EACtB9sD,EAAK+sD,WAAa,GAClB/sD,EAAKgtD,UAAY/tD,EAAQ82C,SACzB/1C,EAAKitD,MAAQhuD,EAAQ+2C,OAAS/2C,EAAQ82C,SAAW,EAAIp7C,GACrDqF,EAAKktD,MAAQ5J,GAAcrkD,EAAQ+d,MACnChd,EAAKmtD,YAAc1J,GAAWxkD,EAAQ+d,MACtChd,EAAKotD,QAAU3H,GAAgBxmD,EAAQ8uB,QACvC/tB,EAAKqtD,OAAStH,GAAe9mD,EAAQsoD,OACrCvnD,EAAKstD,WAAaruD,EAAQwnD,UAC1BzmD,EAAKutD,OAAStuD,EAAQ65C,MACtB94C,EAAKwtD,aAAevuD,EAAQwoD,YAExBznD,EAAKwtD,eACLxtD,EAAKytD,aAAe,IAExBztD,EAAK0tD,gCAAiC,EAEtCrsD,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExBA,EAAK03C,UAAYiW,GAAUzU,OAAOj6C,EAAS2G,EAAM5F,GAE7CiB,EAAWjB,EAAK03C,UAAUh+C,OAC1BsG,EAAK03C,UAAUh+C,KAAK,CAChBk0D,WAAY5tD,EAAK6tD,YAAYtsD,KAAKvB,GAClC8tD,WAAY9tD,EAAK+tD,YAAYxsD,KAAKvB,GAClCguD,YAAahuD,EAAKiuD,aAAa1sD,KAAKvB,KAId,MAA1Bf,EAAQivD,eACR,GAAqC,iBAA1BjvD,EAAQivD,eAA4B,CAC3C,IAAI5kD,EAAMrK,EAAQivD,eAElBluD,EAAKmuD,SAAW,CACZC,QAAS,WACL,OAAO/yD,KAAKyxB,MAAMuhC,aAAaD,QAAQ9kD,KAE3CglD,QAAS,SAASxnB,GACdunB,aAAaC,QAAQhlD,EAAKiB,EAAUvK,EAAKuuD,OAAOrT,UAAUpU,YAIlE9mC,EAAKmuD,SAAWlvD,EAAQivD,eAIhCluD,EAAKuuD,OAAS,IAAI71D,EAAMkN,KAAK22C,QAAQt9C,EAAQorD,OAAO5sD,MAAQ,QAASwB,EAAQorD,QAErErqD,EAAKuuD,OAAOvT,MAEpBh7C,EAAKwuD,2BAELxuD,EAAK0sD,MAAQ1sD,EAAKyuD,SAASzuD,EAAK0sD,OAChC1sD,EAAK0uD,SAAU,EAEf1uD,EAAKuB,KAAK,CAAC,OAAQy8C,EAAOH,EAAQI,EAAcH,EAAMK,EAAYD,GAAWj/C,IAGjFA,QAAS,CACL2G,KAAM,KACNykD,OAAQ,CACLlP,UAAWC,IAEd8S,eAAgB,KAChBS,eAAe,EACfC,cAAc,EACdC,iBAAiB,EACjB5C,gBAAgB,EAChB6C,kBAAkB,EAClBxV,OAAO,EACPyV,aAAa,GAGjB7vD,MAAO,WACH,OAAOnH,MAGXi3D,OAAQ,SAASvuD,GACb,OAAIA,IAAU9F,EACN5C,KAAK22D,SAAWjuD,IAChB1I,KAAK22D,QAAUjuD,EAEXA,GACO1I,KAAKk3D,OAIbv0D,EAAEopC,WAAW2J,UAAU1uB,UAEvBhnB,KAAK22D,SAIpBQ,YAAa,SAAS5I,GAClB,OAAmC,MAA/BvuD,KAAKkH,QAAQivD,eACN,KAGP5H,IAAU3rD,EACH5C,KAAKo2D,SAASG,QAAQhI,GAG1BvuD,KAAKo2D,SAASC,WAAa,IAGtCe,WAAY,WAGR,OAFYp3D,KAAKwvD,SAAW,IAEfhoD,QAGjB6vD,iBAAkB,WACd,IAAI7H,EAAQxvD,KAAKwvD,SAAW,GAE5B,OAAOxvD,KAAKkH,QAAQgtD,gBAAkB1E,EAAMhoD,QAGhD8vD,oBAAqB,WACjB,OAAOt3D,KAAKq3D,oBAAsBr3D,KAAKy1D,cAG3C8B,cAAe,WACX,IAAI/H,EAAQxvD,KAAKs1D,QAAU,GAE3B,OAAOt1D,KAAKy1D,cAAgBjG,EAAMhoD,QAGtCsuD,YAAa,SAASv/C,GAClBvW,KAAKw3D,MAAMjhD,EAAQ,eAGvBy/C,YAAa,SAASz/C,GAClBvW,KAAKw3D,MAAMjhD,EAAQ,eAGvB2/C,aAAc,SAAS3/C,GACnBvW,KAAKw3D,MAAMjhD,EAAQ,gBAGvBihD,MAAO,SAASjhD,EAAQ86C,GACpB,IAAIxjD,EAAO7N,KAAKy3D,UAAUlhD,GAErB1I,IACDA,EAAO0I,GAGXvW,KAAKqxD,GAAWxjD,IAGpB6pD,UAAW,SAAS7pD,EAAM2wC,GACtB,GAAI3wC,EAAM,CACN,GAAI7N,KAAKq3D,mBACL,OAAO3D,GAAc7lD,GAGzB,IAAK2wC,EACD,IAAK,IAAI50C,EAAM,EAAGA,EAAMiE,EAAKrG,OAAQoC,IACjCiE,EAAKi5C,GAAGl9C,GAKpB,OAAOiE,GAGX1B,OAAQhJ,EAERmsB,IAAK,SAASI,GACV,IAAI9lB,EAAKpC,EAAQqG,EAAO7N,KAAK03D,UAAU13D,KAAK20D,MAAO30D,KAAKkH,QAAQywD,WAEhE,IAAK/tD,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC9C,GAAIiE,EAAKjE,GAAK8lB,IAAMA,EAChB,OAAO7hB,EAAKjE,IAKxBguD,SAAU,SAASloC,GACf,OAAO1vB,KAAK63D,UAAUnoC,EAAI1vB,KAAK20D,QAGnCkD,UAAW,SAASnoC,EAAIoE,GACpB,IAAIlqB,EAAKpC,EAAQqG,EAAO7N,KAAK03D,UAAU5jC,EAAW9zB,KAAKkH,QAAQywD,WAE/D,GAAK9pD,EAIL,IAAKjE,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC9C,GAAIiE,EAAKjE,GAAK8+C,KAAOh5B,EACjB,OAAO7hB,EAAKjE,IAKxB+L,QAAS,SAASstC,GACd,OAAOoR,GAAar0D,KAAK20D,MAAO1R,IAGpC6D,GAAI,SAAS/tC,GACT,OAAO/Y,KAAK20D,MAAM7N,GAAG/tC,IAGzBlL,KAAM,SAASnF,GACX,IAAIT,EAAOjI,KACX,GAAI0I,IAAU9F,EAgBP,CACH,GAAIqF,EAAK0sD,MACL,IAAK,IAAI/qD,EAAM,EAAGA,EAAM3B,EAAK0sD,MAAMntD,OAAQoC,IACvC3B,EAAK0sD,MAAM7N,GAAGl9C,GAItB,OAAO3B,EAAK0sD,MAtBZ1sD,EAAKwuD,2BACLxuD,EAAK0sD,MAAQ30D,KAAK02D,SAAShuD,GAE3BT,EAAK2sD,cAAgBlsD,EAAM9B,MAAM,GAEjCqB,EAAK6vD,aAEL7vD,EAAK4sD,QAAU,GACf5sD,EAAKmC,QAAQ,SACbnC,EAAK8vD,UAAU9vD,EAAK0sD,OAEpB1sD,EAAKutD,OAASvtD,EAAK0sD,MAAMntD,OACzBS,EAAK8sD,eAAiB9sD,EAAKutD,OAE3BvtD,EAAK+vD,SAAS/vD,EAAK0sD,QAY3Bl9B,KAAM,SAAS/uB,GACX,GAAIA,IAAU9F,EACV,OAAO5C,KAAK80D,MAEZ90D,KAAK80D,MAAQ90D,KAAKi4D,aAAavvD,IAIvCuvD,aAAc,SAASpqD,GACnB,IAAI5F,EAAOjI,KACXi0D,GAAsBpmD,EAAM5F,EAAK0sD,MAAO1sD,EAAK4sD,QAAS5sD,EAAKuuD,OAAOvT,OAASyD,EAAkBz+C,EAAKovD,oBAElG,IAAI5/B,EAAO,IAAI3pB,EAAoBD,EAAM5F,EAAKuuD,OAAOvT,OAErD,OADAxrB,EAAKtrB,OAAS,WAAa,OAAOlE,EAAKkE,UAChCsrB,GAGX1D,SAAU,WAGN,OAFa/zB,KAAKwvD,SAAW,IAElBhoD,OACAksD,GAAc1zD,KAAK80D,OAEnB90D,KAAK80D,OAIpB7nD,IAAK,SAASg2C,GACV,OAAOjjD,KAAKk4D,OAAOl4D,KAAK20D,MAAMntD,OAAQy7C,IAG1CkV,gBAAiB,SAASlV,GACtB,OAAIjjD,KAAKw2D,OAAOvT,MACL,IAAIjjD,KAAKw2D,OAAOvT,MAAMA,GAG7BA,aAAiByD,EACVzD,EAGJ,IAAIyD,EAAiBzD,IAGhCiV,OAAQ,SAASn/C,EAAOkqC,GAkBpB,OAjBKA,IACDA,EAAQlqC,EACRA,EAAQ,GAGNkqC,aAAiBI,KACnBJ,EAAQjjD,KAAKm4D,gBAAgBlV,IAG7BjjD,KAAKq3D,mBACLr3D,KAAK20D,MAAMnqD,OAAOuO,EAAO,EAAG/Y,KAAKo4D,kBAAkBnV,IAEnDjjD,KAAK20D,MAAMnqD,OAAOuO,EAAO,EAAGkqC,GAGhCjjD,KAAKq4D,oBAAoBt/C,EAAOkqC,GAEzBA,GAGXqV,WAAY,SAASv/C,EAAOob,GACxB,IACIokC,EADOv4D,KACUw4D,uBAEhBrkC,IACDA,EAAQpb,EACRA,EAAQ,GAGP9V,EAAQkxB,KACTA,EAAQ,CAACA,IAGb,IAAIskC,EAAS,GACTC,EAAW14D,KAAKkH,QAAQwxD,SAC5B14D,KAAKkH,QAAQwxD,UAAW,EAExB,IACI,IAAK,IAAI9uD,EAAM,EAAGA,EAAMuqB,EAAM3sB,OAAQoC,IAAQ,CAC1C,IAAImlC,EAAO5a,EAAMvqB,GAEb2M,EAASvW,KAAKk4D,OAAOn/C,EAAOg2B,GAEhC0pB,EAAO92D,KAAK4U,GAEZ,IAAIoiD,EAAWpiD,EAAO3E,SAElB5R,KAAKq3D,qBACLsB,EAAW34D,KAAKo4D,kBAAkBO,IAGtC34D,KAAK40D,cAAcjzD,KAAKg3D,GAEpBJ,GAAaA,EAAU/wD,QACvB7E,EAAE41D,GAAWr2B,OAAO,GAAG02B,aAAaj3D,KAAKg3D,GAG7C5/C,KAEN,QACE/Y,KAAKkH,QAAQwxD,SAAWA,EAGxBD,EAAOjxD,QACPxH,KAAKoK,QAAQ,OAAQ,CACjB1E,KAAM,SACNyuB,MAAOskC,KAKnB5C,WAAY,SAAS1hC,GACjBn0B,KAAKs4D,WAAWt4D,KAAK20D,MAAMntD,OAAQ2sB,IAGvC4hC,WAAY,SAAS5hC,GACZlxB,EAAQkxB,KACTA,EAAQ,CAACA,IAKb,IAFA,IAAIskC,EAAS,GAEJ7uD,EAAM,EAAGA,EAAMuqB,EAAM3sB,OAAQoC,IAAQ,CAC1C,IAAImlC,EAAO5a,EAAMvqB,GACbq5C,EAAQjjD,KAAKm4D,gBAAgBppB,GAE7BznC,EAAStH,KAAKsvB,IAAI2zB,EAAMvzB,IAExBpoB,GACAmxD,EAAO92D,KAAK2F,GAEZA,EAAOwiD,OAAO/a,GAEdznC,EAAO8C,QAAQ07C,GAEf9lD,KAAK64D,wBAAwBvxD,EAAQynC,IAErC/uC,KAAK61D,WAAW9mB,GAIpB0pB,EAAOjxD,QACPxH,KAAKoK,QAAQ,OAAQ,CACjB1E,KAAM,SACNyuB,MAAOskC,KAKnBxC,YAAa,SAAS9hC,GAClB,IAAIskC,EAASz4D,KAAK84D,aAAa3kC,GAE3BskC,EAAOjxD,QACPxH,KAAKoK,QAAQ,OAAQ,CACjB1E,KAAM,UACNyuB,MAAOskC,KAKnBK,aAAc,SAASC,EAAeC,GAC7B/1D,EAAQ81D,KACTA,EAAgB,CAACA,IAGrB,IAAIE,OAAiD,IAAnBD,GAAiCA,EAE/DnX,EAAY,GACZ6W,EAAW14D,KAAKkH,QAAQwxD,SAC5B14D,KAAKkH,QAAQwxD,UAAW,EACxB,IACI,IAAK,IAAI9uD,EAAM,EAAGA,EAAMmvD,EAAcvxD,OAAQoC,IAAQ,CAClD,IAAImlC,EAAOgqB,EAAcnvD,GACrBq5C,EAAQjjD,KAAKm4D,gBAAgBppB,GAC7BmqB,GAAQ,EACRngD,EAAQnP,EAEZ5J,KAAKm5D,UAAUn5D,KAAK20D,OAAO,SAASxgC,GAE5Bpb,IAAUggD,EAAcvxD,OAAS,GACjC2sB,EAAMkzB,iBAAkB,EACxBlzB,EAAMozB,UAAY,IAElBpzB,EAAMkzB,iBAAkB,EAG5B,IAAK,IAAIz9C,EAAM,EAAGA,EAAMuqB,EAAM3sB,OAAQoC,IAAO,CACzC,IAAImlC,EAAO5a,EAAM2yB,GAAGl9C,GACpB,GAAImlC,EAAKrf,KAAOuzB,EAAMvzB,GAAI,CAGlByE,EAAMkzB,iBACNlzB,EAAMozB,UAAU5lD,KAAKotC,GAEzB8S,EAAUlgD,KAAKotC,GACf5a,EAAM3pB,OAAOZ,EAAK,GAClBsvD,GAAQ,EACR,WAKRA,GAASD,IACTj5D,KAAKo5D,wBAAwBnW,GAC7BjjD,KAAKg1D,WAAW5lC,QAG1B,QACEpvB,KAAKkH,QAAQwxD,SAAWA,EAG5B,OAAO7W,GAGXwX,SAAU,SAAStgD,EAAOob,GACtB,IAAIskC,EAASz4D,KAAKs5D,WAAWvgD,EAAOob,GAEhCskC,EAAOjxD,QACPxH,KAAKoK,QAAQ,OAAQ,CACjB1E,KAAM,SACNyuB,MAAOskC,KAKnBa,WAAY,SAASvgD,EAAOob,GACnBlxB,EAAQkxB,KACTA,EAAQ,CAACA,IAGb,IAAIolC,EAAQ,GACRb,EAAW14D,KAAKkH,QAAQwxD,SAC5B14D,KAAKkH,QAAQwxD,UAAW,EAExB,IACI,IAAK,IAAInxD,EAAI,EAAGA,EAAI4sB,EAAM3sB,OAAQD,IAAM,CACpC,IAAIwnC,EAAO5a,EAAM5sB,GACb07C,EAAQjjD,KAAKm4D,gBAAgBppB,GAEjC/uC,KAAKm5D,UAAUn5D,KAAK20D,OAAO,SAAS7gC,GAChC,IAAK,IAAIlqB,EAAM,EAAGA,EAAMkqB,EAAUtsB,OAAQoC,IAAO,CAC7C,IAAIwqB,EAAWN,EAAUgzB,GAAGl9C,GAC5B,GAAIwqB,EAAS1E,KAAOuzB,EAAMvzB,GAAI,CAC1B6pC,EAAM53D,KAAKyyB,GACXN,EAAUtpB,OAAOuO,GAASnP,IAAQmP,EAAQA,EAAO,EAAG+a,EAAUtpB,OAAOZ,EAAK,GAAG,IAC7EmP,IACA,YAKlB,QACE/Y,KAAKkH,QAAQwxD,SAAWA,EAG5B,OAAOa,GAGXziC,OAAQ,SAASmsB,GACb,IAAI1sC,EACAtO,EAAOjI,KACPw5D,EAAYvxD,EAAKovD,mBAgBrB,OAdImC,IAAavW,EAAMyF,KAASzF,EAAM8G,OAAU9G,EAAM8G,SAClD9hD,EAAKwxD,iBAAiBxW,GAG1BjjD,KAAKm5D,UAAUlxD,EAAK0sD,OAAO,SAASxgC,GAGhC,GAFA5d,EA9nBZ,SAAqB1I,EAAMo1C,GACvB,GAAKp1C,EAAL,CAGA,IACIumB,EACAxqB,EAFApC,EAASqG,EAAKrG,OAIlB,IAAKoC,EAAM,EAAGA,EAAMpC,EAAQoC,IAGxB,IAFAwqB,EAAWvmB,EAAKjE,IAEH8+C,KAAOt0B,EAASs0B,KAAOzF,EAAMyF,IAEtC,OADA76C,EAAKrD,OAAOZ,EAAK,GACVwqB,GAinBEslC,CAAYvlC,EAAO8uB,GAExB1sC,GAAUijD,EACV,OAAO,KAIfx5D,KAAK25D,uBAAuB1W,GAErBA,GAGXpB,UAAW,WACP,OAAO7hD,KAAKg1D,YAGhBlT,QAAS,WACL,IAAIl4C,EACApC,EACA+O,EAAS,GACT1I,EAAO7N,KAAK03D,UAAU13D,KAAK20D,MAAO30D,KAAKkH,QAAQywD,WAEnD,IAAK/tD,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC1CiE,EAAKjE,GAAKmgD,OAASl8C,EAAKjE,GAAKmgD,UAAYl8C,EAAKjE,GAAKgwD,YACnDrjD,EAAO5U,KAAKkM,EAAKjE,IAGzB,OAAO2M,GAGXqrC,QAAS,WACL,IAAIh4C,EACApC,EACA+O,EAAS,GACT1I,EAAO7N,KAAK03D,UAAU13D,KAAK20D,MAAO30D,KAAKkH,QAAQywD,WAEnD,IAAK/tD,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IACzCiE,EAAKjE,GAAKmgD,QAAUl8C,EAAKjE,GAAKmgD,SAAYl8C,EAAKjE,GAAK+kC,OACrDp4B,EAAO5U,KAAKkM,EAAKjE,IAGzB,OAAO2M,GAGX2gD,KAAM,WACF,IAAIjvD,EAAOjI,KACP8hD,EAAU,GACVF,EAAU,GACVC,EAAY55C,EAAK+sD,WAEjBhuC,EAAUrkB,EAAEopC,WAAW2J,UAAU1uB,UAErC,GAAI/e,EAAKgvD,SAAU,CAEf,IAAKhvD,EAAKuuD,OAAOvT,MACb,OAAOj8B,EAGX86B,EAAU75C,EAAK65C,UACfF,EAAU35C,EAAK25C,UAEf,IAAIiY,EAAW,GAEX5xD,EAAKf,QAAQq6C,OAASt5C,EAAK03C,UAAUxS,OACrC0sB,EAAW5xD,EAAK6xD,YAAYhY,EAASF,EAASC,IAE9CgY,EAASl4D,KAAKyG,MAAMyxD,EAAU5xD,EAAK8xD,MAAM,SAAUjY,IACnD+X,EAASl4D,KAAKyG,MAAMyxD,EAAU5xD,EAAK8xD,MAAM,SAAUnY,IACnDiY,EAASl4D,KAAKyG,MAAMyxD,EAAU5xD,EAAK8xD,MAAM,UAAWlY,KAGxD76B,EAAUrkB,EAAEq3D,KACV5xD,MAAM,KAAMyxD,GACZI,MAAK,WACH,IAEIrwD,EAAKpC,EAFLJ,EAAcC,UAIlB,IAAKuC,EAAM,EAAGpC,EAASH,UAAUG,OAAQoC,EAAMpC,EAAQoC,IAC/CxC,EAAYwC,IACZ3B,EAAKiyD,QAAQ9yD,EAAYwC,IAIjC3B,EAAK6vD,YAAW,GAEhB7vD,EAAKkyD,WAELlyD,EAAKmyD,QAAQ,CAAErtB,OAAQ,SAEvB9kC,EAAKmC,QAAQ27C,GAET99C,EAAKqvD,uBACLrvD,EAAK42C,eAIb52C,EAAK6vD,YAAW,GAEhB7vD,EAAKkyD,WAELlyD,EAAKmyD,QAAQ,CAAErtB,OAAQ,SAG3B,OAAO/lB,GAGXmzC,SAAUh3D,EAEVk3D,cAAe,SAASpX,GACpB,IAAIh7C,EAAOjI,KAEPijD,aAAiBtiD,EAAMkN,KAAKw1C,MAC5Bp7C,EAAKqyD,aAAarX,IAElBh7C,EAAK+sD,WAAa,GAClB/sD,EAAKwuD,2BACLxuD,EAAK0sD,MAAQ1sD,EAAKyuD,SAASzuD,EAAK2sD,eAC5B3sD,EAAKf,QAAQ2vD,eACb5uD,EAAKutD,OAASvtD,EAAK8sD,gBAGvB9sD,EAAK4sD,QAAU,GACf5sD,EAAK8vD,UAAU9vD,EAAK0sD,MAAO,GAE3B1sD,EAAKsyD,mBAELtyD,EAAKmyD,UAELnyD,EAAKuyD,6BAEDvyD,EAAKovD,oBACLpvD,EAAK42C,SAKjB0b,iBAAkBp3D,EAElBq3D,2BAA4B,WACxB,IAAIvyD,EAAOjI,KAEwB,MAA/BiI,EAAKf,QAAQivD,gBACbluD,EAAKkxD,UAAUlxD,EAAK0sD,OAAO,SAASxgC,GAChC,IAAK,IAAIvqB,EAAM,EAAGA,EAAMuqB,EAAM3sB,OAAQoC,IAAO,CACzC,IAAImlC,EAAO5a,EAAM2yB,GAAGl9C,GACE,UAAlBmlC,EAAK0rB,WAA2C,UAAlB1rB,EAAK0rB,YACnC1rB,EAAKJ,OAAQ,QAOjC+rB,WAAY,WACR,IAAI9wD,EACApC,EACAqG,EAAO7N,KAAK03D,UAAU13D,KAAK20D,MAAO30D,KAAKkH,QAAQywD,WAEnD,GAAI33D,KAAKg1D,WAAWxtD,OAChB,OAAO,EAGX,IAAKoC,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC9C,GAAKiE,EAAKjE,GAAKmgD,OAASl8C,EAAKjE,GAAKmgD,SAAYl8C,EAAKjE,GAAK+kC,MACpD,OAAO,EAIf,OAAO,GAGXurB,QAAS,SAAS3jD,GACd,IAOI/O,EAPAS,EAAOjI,KACP6iD,EAAStsC,EAAOssC,OAChBV,EAAW5rC,EAAO4rC,SAClBv4C,EAAM,EACN+wD,EAAc1yD,EAAKovD,mBACnBsB,EAAW1wD,EAAK2sD,cAChBlvD,EAAO6Q,EAAO7Q,KAKlB,GAFAuC,EAAKmC,QAAQg8C,EAAY,CAAEjE,SAAUA,EAAUz8C,KAAMA,IAEjDy8C,IAAaxsB,EAAcwsB,GAAW,CAGtC,GAFAA,EAAWl6C,EAAKuuD,OAAOzhC,MAAMotB,GAEzBl6C,EAAK2yD,oBAAoBzY,GACzB,OAGJA,EAAWl6C,EAAKuuD,OAAO3oD,KAAKs0C,GAEvBl/C,EAAQk/C,KACTA,EAAW,CAACA,SAGhBA,EAAWx/C,EAAE2X,IAAIuoC,GAAQ,SAASI,GAAS,OAAOA,EAAMrxC,YAO5D,IAJa,YAATlM,IACAuC,EAAK+sD,WAAa,IAGjBprD,EAAM,EAAGpC,EAASq7C,EAAOr7C,OAAQoC,EAAMpC,EAAQoC,IACnC,YAATlE,GACAm9C,EAAOj5C,GAAKkgD,OAAO3H,EAASv4C,IAEf,WAATlE,EACAizD,EAASh3D,KAAKg5D,EAAc1yD,EAAKmwD,kBAAkBvV,EAAOj5C,GAAKgI,UAAYuwC,EAASv4C,IACpE,WAATlE,GACPuC,EAAK4wD,wBAAwBhW,EAAOj5C,GAAMu4C,EAASv4C,KAGvD3B,EAAKmxD,wBAAwBvW,EAAOj5C,KAKhDivD,wBAAyB,SAAS5V,EAAOnqC,GACrC9Y,KAAK66D,2BAA2B5X,GAAO,SAASlqC,EAAOob,GACnDxzB,EAAM6H,WAAW2rB,EAAMpb,GAAQD,OAIvC+hD,2BAA4B,SAAS5X,EAAOl6B,GACxC/oB,KAAK86D,mBACD,SAAS3mC,GACL,IAAIpb,EAAQq7C,GAAqBjgC,EAAO8uB,GACxC,GAAIlqC,GAAS,EAET,OADAgQ,EAAShQ,EAAOob,IACT,MAKvBilC,wBAAyB,SAASnW,GAC9BjjD,KAAK66D,2BAA2B5X,GAAO,SAASlqC,EAAOob,GACnDA,EAAM3pB,OAAOuO,EAAO,OAI5B0+C,UAAW,SAAS5pD,GAEhB,OADY7N,KAAKq3D,mBAAwCr3D,KAAKw2D,OAAOjtB,OAA/BvpC,KAAKw2D,OAAO3oD,MACtCtD,KAAKvK,KAAKw2D,OAAQ3oD,IAGlCitD,kBAAmB,SAAS/xC,GACxB,IAAI9gB,EAAOjI,KACPkH,EAAUe,EAAKf,QACfqxD,EAAYtwD,EAAKuwD,uBAErBvwD,EAAKkxD,UAAUlxD,EAAK2sD,cAAe7rC,GAE/B7hB,EAAQ2vD,cAAgB3vD,EAAQywD,WAChC30D,EAAKu1D,GAAW,SAAShxD,EAAG2nD,GACxBjnD,EAAKkxD,UAAUjK,EAAM0J,aAAc7vC,OAKhDowC,UAAW,SAAStrD,EAAMkb,GACjBlb,GAAQA,EAAKrG,SACTxH,KAAKq3D,mBACLzD,GAAe/lD,EAAMkb,GAErBA,EAASlb,KAKrBktD,kBAAmB,SAAS9X,GACxB,IAAI0V,EACA/uD,EAWJ,OAFA5J,KAAK86D,mBARU,SAAS3mC,GAEhB,IADAvqB,EAAMwqD,GAAqBjgC,EAAO8uB,KACvB,EAEP,OADA0V,EAAWxkC,EAAMvqB,IACV,KAMZ+uD,GAGX2B,aAAc,SAASrX,GACnB,IAAIh7C,EAAOjI,KACP24D,EAAW34D,KAAK+6D,kBAAkB9X,GAEtCjjD,KAAKm5D,UAAUn5D,KAAK20D,OAAO,SAASxgC,GAChC,IAAIvqB,EAAMyqD,GAAalgC,EAAO8uB,GAC1Br5C,GAAO,KACH+uD,GAAc1V,EAAM8G,UAAW4O,EAAS8B,WAQxCxyD,EAAK+yD,eAAe/X,GAEpB9uB,EAAM3pB,OAAOZ,EAAK,GAElB3B,EAAK0xD,uBAAuB1W,KAX5B9uB,EAAMvqB,GAAKkgD,OAAO6O,GAEQ,UAAtBA,EAAS8B,YACTtmC,EAAMvqB,GAAK+kC,OAAQ,SAcvCqsB,eAAgB73D,EAEhB83D,QAAS,SAASpB,EAAUhsD,GACxB,IAAI5F,EAAOjI,KAEXiI,EAAKmC,QAAQ87C,EAAc,CAAExgD,KAAM,WAEnCuC,EAAKmC,QAAQ+7C,GAEbl+C,EAAK03C,UAAUxS,OAAOpqC,EAAO,CACzBm/C,QAAS,SAASC,EAAUz8C,GACxB,IAAIshB,EAAUrkB,EAAEs7B,KAAK47B,GAAU,SAASz0D,GACpC,OAAOA,EAAEM,MAAQA,KAClB,GAECshB,GACAA,EAAQ0uB,QAAQ,CACZyM,SAAUA,EACVU,OAAQ77B,EAAQ67B,OAChBn9C,KAAMA,KAIlBooB,MAAO,SAASq0B,EAAUI,EAAQz0B,GAC9B,IAAK,IAAIlkB,EAAM,EAAGA,EAAMiwD,EAASryD,OAAQoC,IACrCiwD,EAASjwD,GAAKsxD,OAAO/Y,GAGzBl6C,EAAK6lB,MAAMq0B,EAAUI,EAAQz0B,KAElCjgB,KAGPisD,YAAa,SAAShY,EAASF,EAASC,GACpC,IAAI55C,EAAOjI,KACP65D,EAAW,GAiCf,OA/BI5xD,EAAKf,QAAQq6C,QACTO,EAAQt6C,QACRqyD,EAASl4D,KAAKgB,EAAEopC,UAAS,SAASD,GAC9BA,EAASpmC,KAAO,SAChBomC,EAAS+W,OAASf,MAItBF,EAAQp6C,QACRqyD,EAASl4D,KAAKgB,EAAEopC,UAAS,SAASD,GAC9BA,EAASpmC,KAAO,SAChBomC,EAAS+W,OAASjB,MAItBC,EAAUr6C,QACVqyD,EAASl4D,KAAKgB,EAAEopC,UAAS,SAASD,GAC9BA,EAASpmC,KAAO,UAChBomC,EAAS+W,OAAShB,MAI1B55C,EAAKgzD,QAAQpB,EAAU,CACnBhsD,KAAM,CACFi0C,QAAS75C,EAAKuuD,OAAOrT,UAAUvxC,GAAOkwC,IACtCF,QAAS35C,EAAKuuD,OAAOrT,UAAUvxC,GAAOgwC,IACtCC,UAAW55C,EAAKuuD,OAAOrT,UAAUvxC,GAAOiwC,QAK7CgY,GAGXsB,SAAU,SAASttD,EAAMg1C,EAAQn9C,GAC7B,IAAIuC,EAAOjI,KAEX,OAAO2C,EAAEopC,UAAS,SAASD,GACvB7jC,EAAKmC,QAAQ87C,EAAc,CAAExgD,KAAMA,IAEnCuC,EAAKmC,QAAQ+7C,GAEbl+C,EAAK03C,UAAUj6C,GAAM6E,KAAKtC,EAAK03C,UAAW58C,EAAO,CAC7Cm/C,QAAS,SAASC,GACdrW,EAAS4J,QAAQ,CACbyM,SAAUA,EACVU,OAAQA,EACRn9C,KAAMA,KAGdooB,MAAO,SAASq0B,EAAUI,EAAQz0B,GAC9Bge,EAASovB,OAAO/Y,GAChBl6C,EAAK6lB,MAAMq0B,EAAUI,EAAQz0B,KAElCjgB,OACJmZ,WAGP+yC,MAAO,SAAS5iC,EAAQtpB,GACpB,IACIjE,EACApC,EAFAS,EAAOjI,KAGP65D,EAAW,GACXuB,EAAYnzD,EAAKuuD,OAAOrT,UAAUvxC,GAAO/D,IAE7C,GAAI5F,EAAKf,QAAQq6C,MACT1zC,EAAKrG,QACLqyD,EAASl4D,KAAKsG,EAAKkzD,SAAU,CAAEttD,KAAM,CAAEg1C,OAAQuY,IAAevtD,EAAOspB,SAGzE,IAAKvtB,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC9CiwD,EAASl4D,KAAKsG,EAAKkzD,SAAU,CAAEttD,KAAMutD,EAAUxxD,IAAQ,CAAEiE,EAAKjE,IAAQutB,IAI9E,OAAO0iC,GAGXhb,KAAM,SAAShxC,GACX,IAAI5F,EAAOjI,KAAMqkC,EAASp8B,EAAKozD,QAAQxtD,GACnCi+B,EAAWnpC,EAAEopC,WAsCjB,OApCA9jC,EAAKqzD,cAAcj3B,GAAQ,WACvB,IAAIk3B,EAActzD,EAAKmC,QAAQ87C,EAAc,CAAExgD,KAAM,SAChD61D,GA4BDtzD,EAAKuzD,kBAEL1vB,EAAS4J,QAAQ6lB,KA7BjBtzD,EAAKmC,QAAQ+7C,GAEbl+C,EAAK4sD,QAAU,GACf5sD,EAAKmC,QAAQ,SACTnC,EAAKgvD,SACLhvD,EAAK03C,UAAUd,KAAK,CAChBhxC,KAAMw2B,EACN6d,QAAS,SAASr0C,GACd5F,EAAK4sD,QAAU,GACf5sD,EAAKi6C,QAAQr0C,EAAMw2B,GAEnByH,EAAS4J,WAEb5nB,MAAO,WACH,IAAIoJ,EAAOtwB,EAAM2D,KAAKlD,WAEtBY,EAAK6lB,MAAM1lB,MAAMH,EAAMivB,GAEvB4U,EAASovB,OAAO9yD,MAAM0jC,EAAU5U,MAGF,MAA/BjvB,EAAKf,QAAQivD,iBACpBluD,EAAKi6C,QAAQj6C,EAAKkvD,cAAe9yB,GAEjCyH,EAAS4J,eASd5J,EAAS9kB,WAGpBy0C,gBAAiB,SAAS5tD,GACtB,OAAO7N,KAAKw2D,OAAOtI,WAAWrgD,IAGlCq0C,QAAS,SAASr0C,GACd,IAEIsmB,EACAunC,EAHAzzD,EAAOjI,KACPkH,EAAUe,EAAKf,QAMnB,GAFAe,EAAKmC,QAAQg8C,EAAY,CAAEjE,SAAUt0C,EAAMnI,KAAM,SAE7CuC,EAAKgvD,SAAU,CAGf,GAFAppD,EAAO5F,EAAKuuD,OAAOzhC,MAAMlnB,GAErB5F,EAAK2yD,oBAAoB/sD,GAEzB,YADA5F,EAAKuzD,kBAITvzD,EAAKutD,OAASvtD,EAAKuuD,OAAOzV,MAAMlzC,GAE5B5F,EAAKqvD,wBACLrvD,EAAK0zD,mBAAqB1zD,EAAKutD,QAG/BvtD,EAAKgtD,UAAYhtD,EAAKutD,SACtBvtD,EAAKgtD,UAAYhtD,EAAKutD,OAClBvtD,EAAKf,QAAQ82C,UAAY/1C,EAAKf,QAAQ82C,SAAW/1C,EAAKgtD,YACtDhtD,EAAKgtD,UAAYhtD,EAAKf,QAAQ82C,WAIlC/1C,EAAKstD,YAAcruD,EAAQ6vD,mBAC3B9uD,EAAK2zD,iBAAmB3zD,EAAKwzD,gBAAgB5tD,IAGjDA,EAAO5F,EAAKwvD,UAAU5pD,GAEtB5F,EAAK+sD,WAAa,OACf,CACHnnD,EAAO5F,EAAKwvD,UAAU5pD,GAEtBsmB,EAAQ,GACR,IAGIvqB,EAHAiyD,EAAU,GACV5Y,EAAQh7C,EAAKuuD,OAAOvT,MACpBK,EAAUL,EAAQA,EAAMK,QAAU,KAGtC,IAAK15C,EAAM,EAAGA,EAAM5J,KAAKg1D,WAAWxtD,OAAQoC,IAAO,CAC/C,IAAI8lB,EAAK1vB,KAAKg1D,WAAWprD,GAAK05C,GAC9BuY,EAAQnsC,GAAMA,EAGlB,IAAK9lB,EAAM,EAAGA,EAAMiE,EAAKrG,OAAQoC,IAAO,CACpC,IAAImlC,EAAOlhC,EAAKjE,GAEH,WADDmlC,EAAK0rB,UAERoB,EAAQ9sB,EAAKuU,KACdtjD,KAAKy5D,iBAAiBz5D,KAAKm4D,gBAAgBppB,IAG/C5a,EAAMxyB,KAAKotC,GAInBlhC,EAAOsmB,EAEPlsB,EAAKutD,OAAS3nD,EAAKrG,OAMvB,GAHAS,EAAK8sD,eAAiB9sD,EAAKutD,OAC3BkG,EAAgBzzD,EAAK6zD,OAAS7zD,EAAK0sD,MAAMntD,QAAUS,EAAK6zD,MAAQ7zD,EAAK0sD,MAAMntD,OAEvES,EAAKf,QAAQ60D,QAAS,CAClBL,GACAzzD,EAAK2sD,cAAcpqD,OAAOvC,EAAK6zD,MAAO7zD,EAAK2sD,cAAcptD,QAE7D2sB,EAAQtmB,EAAKjH,MAAM,GACnB,IAAK,IAAI8jC,EAAI,EAAGA,EAAIvW,EAAM3sB,OAAQkjC,IAC9BziC,EAAK2sD,cAAcjzD,KAAKwyB,EAAMuW,SAGlCziC,EAAK2sD,cAAgB/mD,EAAKjH,MAAM,GAKpC,GAFAqB,EAAKwuD,2BAEDxuD,EAAKf,QAAQ60D,QAAS,CACtB9zD,EAAK0sD,MAAM1qD,OAAO67C,EAAQ79C,EAAK+zD,gBAE3B/zD,EAAKovD,oBAAsBpvD,EAAK0sD,MAAM1sD,EAAK0sD,MAAMntD,OAAS,GAAGkB,QAAUmF,EAAK,GAAGnF,QAC/EoqD,GAAc7qD,EAAK0sD,MAAM1sD,EAAK0sD,MAAMntD,OAAS,GAAIqG,EAAK,IACtDA,EAAKgI,SAGThI,EAAO5F,EAAKyuD,SAAS7oD,GACjB6tD,GACAzzD,EAAK0sD,MAAMnqD,OAAOvC,EAAK6zD,MAAO7zD,EAAK0sD,MAAMntD,QAE7C,IAAK,IAAID,EAAI,EAAGA,EAAIsG,EAAKrG,OAAQD,IAC7BU,EAAK0sD,MAAMhzD,KAAKkM,EAAKtG,IAEzBU,EAAK0sD,MAAMnrD,KAAKs8C,EAAQ79C,EAAK+zD,qBAE7B/zD,EAAK0sD,MAAQ1sD,EAAKyuD,SAAS7oD,GAG/B5F,EAAKuyD,6BAELvyD,EAAK6vD,aAEL7vD,EAAK8vD,UAAU9vD,EAAK0sD,OAEpB1sD,EAAK+vD,SAAS/vD,EAAK0sD,OAEnB1sD,EAAKuzD,mBAGT/E,yBAA0B,WACtB,GAAIz2D,KAAK20D,OAAS30D,KAAK21D,+BACnB,IAAK,IAAI/rD,EAAM,EAAGA,EAAM5J,KAAK20D,MAAMntD,OAAQoC,IACnC5J,KAAK20D,MAAM/qD,GAAKuC,SAChBnM,KAAK20D,MAAM/qD,GAAKuC,OAAShJ,IAMzC20D,WAAY,SAASmE,GACjB,IAAI/H,EAAiBl0D,KAAKq3D,mBACtBpU,EAAQjjD,KAAKw2D,OAAOvT,MA4BxB,GAAmC,MAA/BjjD,KAAKkH,QAAQivD,eAAwB,CAKrC,IAJA,IAAI5H,EA3BR,SAASp6B,EAAMtmB,GAGX,IAFA,IAAI0gD,EAAQ,GAEH3kD,EAAM,EAAGA,EAAMiE,EAAKrG,OAAQoC,IAAO,CACxC,IAAIwqB,EAAWvmB,EAAKi5C,GAAGl9C,GACnBmlC,EAAO3a,EAASxiB,SAEhBsiD,GAAkB9/B,EAASD,MAC3B4a,EAAK5a,MAAQA,EAAMC,EAASD,QAE5B4a,EAAK2Z,IAAMt0B,EAASs0B,IAEhBzF,IACI7uB,EAAS21B,QACThb,EAAK0rB,UAAY,SACVrmC,EAASua,QAChBI,EAAK0rB,UAAY,YAI7BlM,EAAM5sD,KAAKotC,GAGf,OAAOwf,EAIKp6B,CAAMn0B,KAAK20D,OAEnB9S,EAAY,GAEPj4C,EAAM,EAAGA,EAAM5J,KAAKg1D,WAAWxtD,OAAQoC,IAAO,CACnD,IAAImlC,EAAO/uC,KAAKg1D,WAAWprD,GAAKgI,SAChCm9B,EAAK0rB,UAAY,UACjB5Y,EAAUlgD,KAAKotC,GAGnB/uC,KAAKm3D,YAAY5I,EAAMnxC,OAAOykC,IAE1Boa,IACAj8D,KAAK40D,cAAgB50D,KAAKw2D,OAAOA,OAASx2D,KAAKw2D,OAAOA,OAAO3D,oBAAoBtE,GAASvuD,KAAKw2D,OAAO3D,oBAAoBtE,MAKtIwJ,UAAW,SAASlqD,EAAM2wC,GACtB,IAEI7yC,EAFA1D,EAAOjI,KACPsV,OAA0B,IAAX,EAAyBkpC,EAAQv2C,EAAK6zD,OAAS,EAE9D5M,EAAQ,CACJrhD,KAAMA,EACN+qD,aAAc/qD,EAAK+D,SACnBsqD,UAAWj0D,EAAKk0D,cAGpBn8D,KAAKu3D,iBACL5rD,EAAM2J,EAAQzH,EAAKrG,OACnB0nD,EAAMkN,WAAa9mD,EACnB45C,EAAMmN,SAAW1wD,GAEjBA,EAAM2J,EAAQrN,EAAKyvD,UAAU7pD,GAAM,GAAMrG,OAG7C0nD,EAAM55C,MAAQA,EACd45C,EAAMvjD,IAAMA,EACZ1D,EAAK4sD,QAAQlzD,KAAKutD,GAClBjnD,EAAKq0D,cAEDr0D,EAAKsvD,kBACAtvD,EAAKs0D,cACNt0D,EAAKs0D,YAAc,IAEvBt0D,EAAKu0D,oBAAoBtN,EAAMrhD,MAC/B5F,EAAKw0D,6BAIbD,oBAAqB,SAAS3uD,GAG1B,IAFA,IAAIrG,EAASqG,EAAKrG,OAETD,EAAI,EAAGA,EAAIC,EAAQD,IACxBvH,KAAKu8D,YAAY56D,KAAKkM,EAAKtG,KAInCm1D,eAAgB,SAAShU,GAIrB,IAHA,IACI8G,EADAhoD,EAASxH,KAAKu8D,YAAY/0D,OAGrBD,EAAI,EAAGA,EAAIC,EAAQD,IAExB,IADAioD,EAAQxvD,KAAKu8D,YAAYh1D,IACfmhD,MAAQA,EACd,OAAO8G,GAKnB8M,YAAa,WACTt8D,KAAK60D,QAAQ5vC,MAAK,SAAS7f,EAAGjB,GAC1B,OAAOiB,EAAEkQ,MAAQnR,EAAEmR,UAI3BwY,MAAO,SAAS6uC,EAAKpa,EAAQqa,GACzB58D,KAAKw7D,kBACLx7D,KAAKoK,QAAQg8C,EAAY,IACzBpmD,KAAKoK,QAAQ67C,EAAO,CAAE0W,IAAKA,EAAKpa,OAAQA,EAAQqa,YAAaA,KAGjEvB,QAAS,SAASxtD,GACd,IAAI5F,EAAOjI,KACPkH,EAAUnE,EAAO,CACb27C,KAAMz2C,EAAKy2C,OACXF,KAAMv2C,EAAKu2C,OACXP,KAAMh2C,EAAKg2C,OACXD,SAAU/1C,EAAK+1C,WACf/4B,KAAMhd,EAAKktD,MACXn/B,OAAQ/tB,EAAKotD,QACb7F,MAAOvnD,EAAKqtD,OACZ5G,UAAWzmD,EAAKstD,WAChB7F,cAAeznD,EAAKwtD,cACrB5nD,GAqCP,OAnCK5F,EAAKf,QAAQ2vD,sBACP3vD,EAAQw3C,YACRx3C,EAAQs3C,YACRt3C,EAAQ+2C,YACR/2C,EAAQ82C,UAGd/1C,EAAKf,QAAQgtD,eAEPjsD,EAAKuuD,OAAOvT,OAAS/7C,EAAQsoD,QACpCtoD,EAAQsoD,MAAQgF,GAAwBttD,EAAQsoD,MAAOvnD,EAAKuuD,OAAOvT,eAF5D/7C,EAAQsoD,MAKdvnD,EAAKf,QAAQ4vD,gBAEP7uD,EAAKuuD,OAAOvT,OAAS/7C,EAAQ8uB,SACrC9uB,EAAQ8uB,OAASu+B,GAA8BrtD,EAAQ8uB,OAAQ/tB,EAAKuuD,OAAOvT,eAFnE/7C,EAAQ8uB,OAKd/tB,EAAKf,QAAQ0vD,cAEP3uD,EAAKuuD,OAAOvT,OAAS/7C,EAAQ+d,OACpC/d,EAAQ+d,KAAOuvC,GAAwBttD,EAAQ+d,KAAMhd,EAAKuuD,OAAOvT,eAF1D/7C,EAAQ+d,KAKdhd,EAAKf,QAAQ6vD,iBAEP9uD,EAAKuuD,OAAOvT,OAAS/7C,EAAQwnD,YACpCxnD,EAAQwnD,UAAY8F,GAAwBttD,EAAQwnD,UAAWzmD,EAAKuuD,OAAOvT,eAFpE/7C,EAAQwnD,UAKdzmD,EAAKf,QAAQwoD,oBACPxoD,EAAQwoD,YAGZxoD,GAGXo0D,cAAe,SAASp0D,EAAS6hB,GAC7B,IAAI9gB,EAAOjI,KACNiI,EAAK40D,mBAKN50D,EAAK60D,SAAW,CAAE/zC,SAAUA,EAASvf,KAAKvB,GAAOf,QAASA,IAJ1De,EAAK40D,oBAAqB,EAC1B50D,EAAK60D,SAAWl6D,EAChBmmB,MAMRyyC,gBAAiB,WACb,IAAIvzD,EAAOjI,KACXiI,EAAK40D,oBAAqB,EACtB50D,EAAK60D,UACL70D,EAAKqzD,cAAcrzD,EAAK60D,SAAS51D,QAASe,EAAK60D,SAAS/zC,WAIhE6xC,oBAAqB,SAASzY,GAC1B,GAAIniD,KAAKw2D,OAAOtT,OAAQ,CACpB,IAAIA,EAASljD,KAAKw2D,OAAOtT,OAAOf,GAChC,GAAIe,EAEA,OADAljD,KAAKoK,QAAQ67C,EAAO,CAAE0W,IAAK,KAAMpa,OAAQ,cAAeqa,YAAa,eAAgB1Z,OAAQA,KACtF,EAGf,OAAO,GAGX6Z,YAAa,SAASlvD,GAClB,IAAIo1C,EAAQjjD,KAAKw2D,OAAOvT,MAExB,SAAIA,IAASp1C,EAAKrG,WACLqG,EAAK,aAAco1C,IAMpCyT,SAAU,SAAS7oD,GACf,IAAI5F,EAAOjI,KACPijD,EAAQh7C,EAAKuuD,OAAOvT,OAExBh7C,EAAK0tD,gCAAiC,EAElC9nD,aAAgBD,IAChB3F,EAAK0tD,gCAAiC,EAClC1tD,EAAK80D,YAAYlvD,KACjBA,EAAKnI,KAAOuC,EAAKuuD,OAAOvT,MACxBp1C,EAAK84C,QAAQ94C,EAAMA,MAIvBA,EAAO,IADS5F,EAAK+1C,aAAe/1C,EAAKf,QAAQ2vD,aAAe/oD,EAAsBF,GACjEC,EAAM5F,EAAKuuD,OAAOvT,QAClC92C,OAAS,WAAa,OAAOlE,EAAKkE,UAc3C,OAXIlE,EAAKovD,oBACL1D,GAAe9lD,EAAMo1C,KAGrBh7C,EAAK+zD,gBAAkB/zD,EAAK0sD,OAAS1sD,EAAK0sD,iBAAiB/mD,IACzD3F,EAAKf,QAAQywD,WAAa1vD,EAAKf,QAAQ2vD,aAGzC5uD,EAAK+zD,eAAiB/zD,EAAKmyD,QAAQ5wD,KAAKvB,GAFxCA,EAAK0sD,MAAM1qD,OAAO67C,EAAQ79C,EAAK+zD,gBAK5BnuD,EAAKrE,KAAKs8C,EAAQ79C,EAAK+zD,iBAGlCgB,sBAAuB,SAASjwB,EAAQ5Y,GACpC,IAAIlsB,EAAOjI,KAEP+gD,EAAQ9nC,SAAShR,EAAKutD,OAAQ,IAE7BpF,GAASnoD,EAAKutD,UACfzU,EAAQ9nC,SAAShR,EAAK8sD,eAAgB,KAE3B,QAAXhoB,EACAgU,GAAS5sB,EAAM3sB,OACG,WAAXulC,EACPgU,GAAS5sB,EAAM3sB,OACG,eAAXulC,GAAsC,SAAXA,GAAsB9kC,EAAKf,QAAQ2vD,aAEnD,SAAX9pB,IACPgU,EAAQ94C,EAAK8sD,eAAiB97C,SAAShR,EAAKutD,OAAQ,KAFpDzU,EAAQ94C,EAAK8sD,eAKjB9sD,EAAKutD,OAASzU,GAGlB0Y,iBAAkB,SAASxW,GACRjjD,KAAKg1D,WAAWl/B,MAAK,SAASiZ,GACzC,OAAOA,EAAK2Z,MAAQzF,EAAMyF,QAG1B1oD,KAAKg1D,WAAWrzD,KAAKshD,IAI7BmX,QAAS,SAASz1D,GACd,IAAiBiF,EAAKpC,EAAlBS,EAAOjI,KAAmB+sC,EAASpoC,EAAIA,EAAEooC,OAAS,GAEtD,GAAe,WAAXA,EACA,IAAKnjC,EAAM,EAAGpC,EAAS7C,EAAEwvB,MAAM3sB,OAAQoC,EAAMpC,EAAQoC,IAC5CjF,EAAEwvB,MAAMvqB,GAAKmgD,OAAUplD,EAAEwvB,MAAMvqB,GAAKmgD,SACrC9hD,EAAKwxD,iBAAiB90D,EAAEwvB,MAAMvqB,IAK1C,IAAI3B,EAAKf,QAAQwxD,UAAwB,QAAX3rB,GAA+B,WAAXA,GAAkC,eAAXA,EAcrE9kC,EAAK+0D,sBAAsBjwB,EAAQpoC,EAAIA,EAAEwvB,MAAQ,IAEjDlsB,EAAK+vD,SAAS/vD,EAAK0sD,MAAOhwD,OAhBqE,CAE/F,IAAImF,EAAU,SAASotB,GACC,SAAhBA,EAAK6V,SACL9kC,EAAKgC,OAAO,SAAUH,GACtB7B,EAAK+0D,sBAAsBjwB,EAAQpoC,EAAEwvB,SAI7ClsB,EAAKiC,MAAM,SAAUJ,GAErB7B,EAAKivD,SASb+F,qBAAsB,SAASpvD,EAAM3G,GACjCA,EAAUA,GAAW,GAErB,IAAI1G,EAAQ,IAAI8qD,GAAMz9C,GAClBqgD,EAAahnD,EAAQwnD,UACrB14B,EAAS9uB,EAAQ8uB,OAMrB,OAJIA,IACAx1B,EAAQA,EAAMw1B,OAAOA,IAGlBx1B,EAAMkuD,UAAUR,IAG3B8J,SAAU,SAASnqD,EAAMlJ,GACrB,IAEI4R,EAFAtO,EAAOjI,KACPkH,EAAU,GA8Cd,IA3CkC,IAA9Be,EAAKf,QAAQ2vD,eACb3vD,EAAQs3C,KAAOv2C,EAAK6zD,MACpB50D,EAAQw3C,KAAOz2C,EAAKi1D,OAASj1D,EAAKgtD,UAE9B/tD,EAAQs3C,OAAS57C,GAAeqF,EAAKitD,QAAUtyD,GAAeqF,EAAKgtD,YAAcryD,IACjFsE,EAAQs3C,MAAQv2C,EAAKitD,MAAQ,GAAKjtD,EAAKgtD,WAGvChtD,EAAKf,QAAQywD,YACbzwD,EAAQs3C,KAAOv2C,EAAKk1D,uBAIO,IAA/Bl1D,EAAKf,QAAQ0vD,gBACb1vD,EAAQ+d,KAAOhd,EAAKktD,QAGa,IAAjCltD,EAAKf,QAAQ4vD,kBACb5vD,EAAQ8uB,OAAS/tB,EAAKotD,UAGU,IAAhCptD,EAAKf,QAAQgtD,iBACbhtD,EAAQsoD,MAAQvnD,EAAKqtD,SAGa,IAAlCrtD,EAAKf,QAAQ6vD,mBACb7vD,EAAQwnD,UAAYzmD,EAAKstD,YAGzBttD,EAAKf,QAAQgtD,gBACbjsD,EAAKm1D,kBAAkBvvD,GAG3B3G,EAAQwoD,YAAcznD,EAAKwtD,aAGvBl/C,EADAtO,EAAKsvD,iBAAmB5yD,IAAmB,SAAbA,EAAEooC,QAAkC,gBAAbpoC,EAAEooC,QAAyC,kBAAbpoC,EAAEooC,QAC5E9kC,EAAKo1D,cAAcxvD,EAAM,CAC9B6gD,UAAWzmD,EAAKstD,aAGXttD,EAAKo1D,cAAcxvD,EAAM3G,GAGlCe,EAAKotD,SAAW1wD,GAAkB,QAAbA,EAAEooC,OAAkB,CACzC,IAAIkW,EAAQt+C,EAAEwvB,MAAM,GAChBmpC,EAAa/mD,EAAO1I,KAEpB5F,EAAKmvD,eAAiBp3D,KAAKq3D,qBAC3BiG,EAAa5J,GAAc4J,IAGXA,EAAWxnC,MAAK,SAASiZ,GACzC,OAAOA,EAAK2Z,MAAQzF,EAAMyF,SAI1BnyC,EAAO1I,KAAKrD,OAAOy4C,EAAMlqC,MAAO,EAAG9Q,EAAKmvD,aAAenvD,EAAKmwD,kBAAkBnV,GAASA,GACvF1sC,EAAOwqC,UAIuB,IAAlC94C,EAAKf,QAAQ6vD,mBAGb9uD,EAAK2zD,iBAAmB3zD,EAAKg1D,qBAAqB1mD,EAAOgnD,iBAAmB1vD,EAAM3G,IAGtFe,EAAKu1D,SAASjnD,EAAQrP,EAASvC,GAE/BsD,EAAKw1D,gBAAgBlnD,EAAOwqC,OAAO,IAEnCp8C,EAAIA,GAAK,IAEPwvB,MAAQxvB,EAAEwvB,OAASlsB,EAAK6sD,MAE1B7sD,EAAKmC,QAAQ07C,EAAQnhD,IAGzB64D,SAAU,SAASjnD,EAAQrP,EAASvC,GAChC,IAAIsD,EAAOjI,KAEX,GAAIiI,EAAKsvD,kBAAoBtvD,EAAKovD,mBAC9B,IAAI1yD,GAAmB,SAAbA,EAAEooC,QAAkC,gBAAbpoC,EAAEooC,QAAyC,kBAAbpoC,EAAEooC,OAG1D,CACH9kC,EAAK4sD,QAAU,GACf,IAAIr0D,EAAQ,IAAI8qD,GAAM/0C,EAAO1I,MAC7B5F,EAAK8vD,UAAU9vD,EAAKyuD,SAASngD,EAAO1I,OAEhC3G,EAAQs3C,KAAOt3C,EAAQw3C,KAAOnoC,EAAO1I,KAAKrG,SAC1CN,EAAQs3C,KAAOjoC,EAAO1I,KAAKrG,OAASN,EAAQw3C,MAGhDz2C,EAAKwvB,KAAKj3B,EAAM0uD,MAAMhoD,EAAQs3C,KAAMt3C,EAAQw3C,MAAMuQ,gBAXlDhnD,EAAKwvB,KAAKlhB,EAAO1I,MACjB5F,EAAKw0D,gCAcTx0D,EAAKwvB,KAAKlhB,EAAO1I,OAIzBuvD,kBAAmB,SAASvvD,GACxB,IAAK,IAAIjE,EAAMiE,EAAKrG,OAAS,EAAGoC,GAAO,EAAGA,IAAO,CAC7C,IAAI4lD,EAAQ3hD,EAAKjE,GACb4lD,EAAMI,cACN5vD,KAAKo9D,kBAAkB5N,EAAMr7B,QAG7Bq7B,EAAMr7B,OAAUq7B,EAAMr7B,MAAM3sB,QAAWgoD,EAAMK,WAC7CrlD,EAAOpC,MAAMonD,EAAMrjD,SAAU,CAACvC,EAAK,MAK/CyzD,cAAe,SAASxvD,EAAM3G,GAC1B,OAAIlH,KAAKkH,QAAQ8vD,YACN1L,GAAMgF,QAAQziD,EAAM3G,EAASlH,KAAKkH,QAAQ8vD,aAG1C1L,GAAMgF,QAAQziD,EAAM3G,IAInCw2D,YAAa,SAASx2D,GAClB,IAhpFoB8kD,EAgpFhB/jD,EAAOjI,KA0CX,OAxCIkH,IAAYtE,IACZqF,EAAKgtD,UAAY/tD,EAAQ82C,SACzB/1C,EAAKitD,MAAQhuD,EAAQ+2C,KACrBh2C,EAAKktD,MAAQjuD,EAAQ+d,KACrBhd,EAAKotD,QAAUnuD,EAAQ8uB,OACvB/tB,EAAKqtD,OAASpuD,EAAQsoD,MACtBvnD,EAAKstD,WAAaruD,EAAQwnD,UAC1BzmD,EAAK6zD,MAAQ7zD,EAAK01D,mBAAqBz2D,EAAQs3C,KAC/Cv2C,EAAKi1D,MAAQh2D,EAAQw3C,KAEjBz2C,EAAK6zD,QAAUl5D,IACfqF,EAAK6zD,MAAQ7zD,EAAK01D,mBAAqB11D,EAAKu2C,OAC5Ct3C,EAAQs3C,KAAOv2C,EAAKu2C,QAGpBv2C,EAAKi1D,QAAUt6D,GAAeqF,EAAKgtD,YAAcryD,IACjDqF,EAAKi1D,MAAQj1D,EAAKgtD,UAClB/tD,EAAQw3C,KAAOz2C,EAAKi1D,OAGpBj1D,EAAKf,QAAQ8pD,UACb9pD,EAAQ8pD,QAAU/oD,EAAKf,QAAQ8pD,SAG/B9pD,EAAQ+d,OACRhd,EAAKktD,MAAQjuD,EAAQ+d,KAAOsmC,GAAcrkD,EAAQ+d,MAClDhd,EAAKmtD,YAAc1J,GAAWxkD,EAAQ+d,OAGtC/d,EAAQ8uB,SACR/tB,EAAKotD,QAAUnuD,EAAQ8uB,OAAU/tB,EAAKf,QAAQ89C,yBAA2BriD,EAAEgzB,cAAczuB,EAAQ8uB,QAAWrzB,EAAEI,OAAO,GAAI2qD,GAAgBxmD,EAAQ8uB,QAAS,CAAEgvB,uBAAwB/8C,EAAKf,QAAQ89C,yBAA4B0I,GAAgBxmD,EAAQ8uB,SAGrP9uB,EAAQsoD,QACRvnD,EAAKqtD,OAASpuD,EAAQsoD,MAAQxB,GAAe9mD,EAAQsoD,QAErDtoD,EAAQwnD,YACRzmD,EAAKstD,WAAaruD,EAAQwnD,WAvrFd1C,EAurF6C9kD,EAAQwnD,UAtrFtEzrD,EAAQ+oD,GAAeA,EAAc,CAACA,MAyrFlC9kD,GAGX1G,MAAO,SAAS0G,GACZ,IAAIqP,EAGJ,GAFavW,KAAKkH,QAAQ0vD,eAAiB52D,KAAKkH,QAAQ2vD,cAAgB72D,KAAKkH,QAAQ4vD,iBAAmB92D,KAAKkH,QAAQgtD,gBAAkBl0D,KAAKkH,QAAQ6vD,mBAEpI/2D,KAAK20D,QAAU/xD,GAAqC,IAAtB5C,KAAK20D,MAAMntD,UAAkBxH,KAAKg1D,WAAWxtD,OAAS,CAChG,GAAIxH,KAAKkH,QAAQ60D,QAAS,CACtB,IAAI6B,EAAiB12D,EAAQ82C,SAAWh+C,KAAKg+C,WACzC4f,EAAiB,GACjBA,EAAiB59D,KAAKg+C,WACtB92C,EAAQ+2C,KAAO/2C,EAAQ82C,SAAW4f,EAClC12D,EAAQ82C,SAAW4f,IAEnB12D,EAAQ+2C,KAAO,EACfj+C,KAAKkH,QAAQ60D,SAAU,GAG/B,OAAO/7D,KAAK6+C,KAAK7+C,KAAK09D,YAAYx2D,IAGtC,IAAIq0D,EAAcv7D,KAAKoK,QAAQ87C,EAAc,CAAExgD,KAAM,SAgBrD,OAfK61D,IACDv7D,KAAKoK,QAAQ+7C,GACTj/C,IACAA,EAAQwoD,YAAc1vD,KAAKy1D,cAE/Bl/C,EAASvW,KAAKq9D,cAAcr9D,KAAK20D,MAAO30D,KAAK09D,YAAYx2D,IAEzDlH,KAAKy9D,gBAAgBlnD,EAAOwqC,OAAO,GAEnC/gD,KAAK47D,iBAAmB57D,KAAKi9D,qBAAqB1mD,EAAOgnD,iBAAmBv9D,KAAK20D,MAAOztD,GACxFlH,KAAKw9D,SAASjnD,EAAQrP,GACtBlH,KAAKoK,QAAQg8C,EAAY,CAAE1gD,KAAM,SACjC1F,KAAKoK,QAAQ07C,EAAQ,CAAE3xB,MAAO5d,EAAO1I,KAAMk/B,OAAQ7lC,EAAUA,EAAQ6lC,OAAS,MAG3EpqC,EAAEopC,WAAW2J,QAAQ6lB,GAAav0C,WAG7C62C,sBAAuB,SAASrO,GAC5B,IAAIj5C,GAAS,EACT/O,EAASgoD,EAAMr7B,MAAQq7B,EAAMr7B,MAAM3sB,OAAS,EAEhD,IAAKgoD,EAAMI,aACP,OAAO,EAGX,IAAK,IAAIroD,EAAI,EAAGA,EAAIC,EAAQD,IACxB,GAAIvH,KAAK01D,aAAalG,EAAMr7B,MAAM5sB,GAAGmhD,KAAM,CACvCnyC,GAAS,EACT,MAGR,OAAOA,GAGXunD,kBAAmB,SAASjwD,EAAM0I,EAAQrP,EAASkxB,EAASrP,GASxD,IARA,IAEIymC,EACA/7C,EACAsqD,EACAC,EACAC,EANAh2D,EAAOjI,KACPwH,EAASqG,EAAKrG,OAOTD,EAAI,EAAGA,EAAIC,IAChBgoD,EAAQ3hD,EAAKtG,KAETL,EAAQg3D,OAASh3D,EAAQw3C,OAHLn3C,IAWxB,GAJKU,EAAKy0D,eAAelN,EAAM9G,MAC3BzgD,EAAKs0D,YAAY56D,KAAK6tD,GAGtBvnD,EAAKytD,aAAalG,EAAM9G,KAAM,CAC9B,GAAIzgD,EAAKqvD,sBAAuB,CAC7B,GAAIrvD,EAAKk2D,iBAAiB3O,EAAOtoD,EAASkxB,EAASrP,GAE9C,YADA9gB,EAAKm2D,qBAAsB,GAKhC,GAFAJ,GAAcxO,EAAMM,eAAiBN,EAAMK,WAAa,EACxDoO,EAAc/2D,EAAQs3C,KAAOt3C,EAAQm3D,SAChCp2D,EAAK41D,sBAAsBrO,IAAUyO,EAAcD,EAAY,CAChE92D,EAAQm3D,SAAWL,EACnB,UAYP,GARI92D,EAAQo3D,gBAAkBp3D,EAAQm3D,QAAUn3D,EAAQs3C,MACpDt3C,EAAQm3D,UACR7O,EAAM+O,eAAgB,GACfr3D,EAAQo3D,iBACfp3D,EAAQg3D,QACR1O,EAAM+O,eAAgB,GAGtB/O,EAAMI,cAAgBJ,EAAMr7B,OAASq7B,EAAMr7B,MAAM3sB,OACjDgoD,EAAMgP,aAAe,GAEhBpmC,IACDA,EAAU,IAEdA,EAAQz2B,KAAK6tD,GAEbvnD,EAAK61D,kBAAkBtO,EAAMr7B,MAAOq7B,EAAMgP,aAAct3D,EAASkxB,EAASrP,GAC1EqP,EAAQhJ,MAEJogC,EAAMgP,aAAah3D,QAAUN,EAAQg3D,MAAQ,EAC7C3nD,EAAO5U,KAAK6tD,GAEZA,EAAM+O,eAAgB,MAEvB,CACH9qD,EAAU,GACVsqD,EAAcvO,EAAMr7B,MAAM3sB,OAE1B,IAAK,IAAIkjC,EAAI,EAAGA,EAAIqzB,EAAarzB,IAC7B,GAAIxjC,EAAQm3D,QAAUn3D,EAAQs3C,KAC1Bt3C,EAAQm3D,cADZ,CAKA,GAAIn3D,EAAQg3D,OAASh3D,EAAQw3C,KACzB,MAEJjrC,EAAQ9R,KAAK6tD,EAAMr7B,MAAMuW,IACzBxjC,EAAQg3D,QAGRzqD,EAAQjM,QAAUN,EAAQg3D,MAAQ,GAClC1O,EAAMgP,aAAe/qD,EACrB8C,EAAO5U,KAAK6tD,IAEZA,EAAM+O,eAAgB,OAG3B,CACH,GAAIr3D,EAAQm3D,QAAUn3D,EAAQs3C,KAAM,CAChCt3C,EAAQm3D,UACR,SAEJ9nD,EAAO5U,KAAK6tD,GACZtoD,EAAQg3D,UAKpBO,4BAA6B,SAASjP,EAAO7jD,EAAK+yD,GAC9C,IAEIC,EAGAxkB,EALAlyC,EAAOjI,KACPuW,EAAS,EAETqoD,EAA8B,iBAARjzD,EACtBnE,EAASo3D,EAAejzD,EAAM6jD,EAAMM,cAGxC,IAAKN,EAAMI,aACP,OAAOr5C,EAGX,IAAK,IAAIhP,EAAI,EAAGA,EAAIC,IAChBm3D,EAAWnP,EAAMr7B,MAAM5sB,IADCA,IA6BxB,GAtBIo3D,EAAS/O,cAAgB3nD,EAAKytD,aAAalG,EAAM9G,MAEjDnyC,GADA4jC,EAAOlyC,EAAKw2D,4BAA4BE,EAAUn3D,GAAQ,GAGtDo3D,IACAp3D,GAAU2yC,KAENwkB,EAAS/O,cAAgB3nD,EAAKytD,aAAaiJ,EAASjW,OAE5DnyC,GADA4jC,EAAOwkB,EAASxqC,MAAQwqC,EAASxqC,MAAM3sB,OAAS,EAE5Co3D,IACAp3D,GAAU2yC,IAIdukB,IACAnoD,GAAU,EACNqoD,IACAp3D,GAAU,IAIdo3D,GAAgBroD,EAAS/O,EACzB,OAAO+O,EAIf,OAAOA,GAGX4nD,iBAAkB,SAAS3O,EAAOtoD,EAASkxB,EAASrP,GAChD,IACI81C,EACAC,EACAC,EAKAC,EARA/2D,EAAOjI,KAIPi/D,EAAiBzP,EAAMI,aAAeJ,EAAMM,cAAgBN,EAAMK,UAClEnR,EAAOx3C,EAAQw3C,KACf2f,EAAUn3D,EAAQm3D,QAClBrgB,EAAW/1C,EAAKy2C,OAWpB,OARIx3C,EAAQo3D,iBACJD,EAAUn3D,EAAQs3C,KAClB6f,GAAW,EAEX3f,GAAQ,IAIX8Q,EAAMr7B,OAAUq7B,EAAMr7B,QAAUq7B,EAAMr7B,MAAM3sB,QAC7CS,EAAKi3D,cAAc1P,EAAOtoD,EAASkxB,EAASrP,EAAU,IAC/C,IAEPi2C,EAA6Bh/D,KAAKy+D,4BAA4BjP,EAAOtoD,EAAQs3C,KAAO6f,MACpFQ,EAAiBx7D,KAAKuV,IAAI1R,EAAQs3C,MAAQ6f,EAAUW,GAA6B,KAE3DC,KAItBH,EAAYtP,EAAMr7B,MAAM0qC,GACxBE,EAAWvP,EAAMr7B,MAAM9wB,KAAK8S,IAAI0oD,EAAiBngB,EAAMugB,EAAiB,IAEpEH,EAAUlF,YACV3xD,EAAKi3D,cAAc1P,EAAOtoD,EAASkxB,EAASrP,EAAU3lB,EAAKwV,IAAIxV,EAAKmN,MAAMsuD,EAAiB7gB,GAAW,GAAKA,EAAU56C,EAAK2S,OAAO8oD,EAAiB7gB,GAAYA,KACvJ,GAGP+gB,EAASnF,YACT3xD,EAAKi3D,cAAc1P,EAAOtoD,EAASkxB,EAASrP,EAAU3lB,EAAKwV,IAAIxV,EAAKmN,OAAOsuD,EAAiB7gB,GAAYA,GAAW,GAAKA,EAAU56C,EAAK2S,OAAO8oD,EAAiB7gB,GAAYA,KACpK,QAFX,KAORkhB,cAAe,SAAS1P,EAAOtoD,EAASkxB,EAASrP,EAAU81C,EAAgB5gB,GACvE,IACIS,EACA1oB,EACAnoB,EACAsxD,EAJAl3D,EAAOjI,KAMNwvD,EAAMr7B,QACPq7B,EAAMr7B,MAAQ,IAGlBuqB,EAAOz2C,EAAKy2C,OACZ1oB,EAASh2B,KAAKo/D,oBAAoB5P,EAAOp3B,GACzCvqB,EAAO,CACHowC,KAAMA,GAAQ,EACdD,SAAUU,EACVF,KAAMqgB,EACNngB,KAAMA,EACN1oB,OAAQA,EACR04B,UAAWzmD,EAAKstD,WAChBtwC,KAAMhd,EAAKktD,QAEfgK,EAAYl3D,EAAKo3D,cAAc7P,KAEd2P,EAAU33D,SACvBqG,EAAK2hD,MAAQ2P,EACbtxD,EAAK6hD,aAAc,GAGvBx1B,aAAajyB,EAAKq3D,UAClBr3D,EAAKq3D,SAAWxmC,YAAW,WACvB7wB,EAAKqzD,cAAcztD,GAAM,WAChB5F,EAAKmC,QAAQ87C,EAAc,CACxBxgD,KAAM,SAWVuC,EAAKuzD,kBATLvzD,EAAK03C,UAAUd,KAAK,CAChBhxC,KAAMA,EACNq0C,QAASj6C,EAAKs3D,0BAA0B/P,EAAOtoD,EAAQs3C,KAAMv2C,EAAKy2C,OAAQ31B,EAAU81C,GACpF/wC,MAAO,WACH,IAAIoJ,EAAOtwB,EAAM2D,KAAKlD,WACtBY,EAAK6lB,MAAM1lB,MAAMH,EAAMivB,WAOxC,MAGPqoC,0BAA2B,SAAS/P,EAAOhR,EAAME,EAAM31B,EAAU81C,GAC7D,IAAI52D,EAAOjI,KACPk8D,EAAYj0D,EAAKk0D,aACrBpzC,EAAW7f,EAAW6f,GAAYA,EAAW5lB,EAC7C,IAAIq8D,EAAav3D,EAAKf,QAAQorD,QAAUrqD,EAAKf,QAAQorD,OAAOvR,MAAQ94C,EAAKf,QAAQorD,OAAOvR,MAAQ,QAEhG,OAAO,SAASlzC,GACZ,IAAIssC,EAEAslB,EADAxc,EAAQI,GAAM3jD,OAAOuI,EAAKf,QAAQorD,OAAOrP,OAG7Ch7C,EAAKuzD,kBAELvzD,EAAKmC,QAAQg8C,EAAY,CACrBjE,SAAUt0C,EACVnI,KAAM,SAIN+5D,EADAv2D,EAAWs2D,GACEA,EAAW3xD,GAEXA,EAAK2xD,GAGtB3xD,EAAO5F,EAAKuuD,OAAOzhC,MAAMlnB,GAErB2hD,EAAMI,cACNzV,EAAOlyC,EAAKuuD,OAAOjtB,OAAO17B,GAC1B2hD,EAAMM,cAAgB2P,GAGtBtlB,GADAA,EAAOlyC,EAAKuuD,OAAO3oD,KAAKA,IACZyM,KAAI,SAASy0B,GACrB,OAAO,IAAIkU,EAAMlU,MAIzBygB,EAAMr7B,MAAMkzB,iBAAkB,EAC9B,IAAK,IAAI9/C,EAAI,EAAGA,EAAIk4D,EAAYl4D,IACxBA,GAAKs3D,GAAkBt3D,EAAKs3D,EAAiBngB,EAC7C8Q,EAAMr7B,MAAM3pB,OAAOjD,EAAG,EAAG4yC,EAAK5yC,EAAIs3D,IAE7BrP,EAAMr7B,MAAM5sB,IACbioD,EAAMr7B,MAAM3pB,OAAOjD,EAAG,EAAG,CAAEqyD,YAAY,IAInDpK,EAAMr7B,MAAMkzB,iBAAkB,EAE9Bp/C,EAAKy3D,yBAAyBlQ,GAC9BvnD,EAAKm2D,qBAAsB,EAEtB5O,EAAMmQ,aACP13D,EAAK0zD,oBAAsB8D,EAC3BjQ,EAAMmQ,YAAa,GAGvB13D,EAAKinD,MAAM1Q,EAAME,EAAM31B,EAAU,gBAE7BmzC,GAAaj0D,EAAK23D,2BAA6B33D,EAAK43D,0BACpD53D,EAAKmC,QAAQ07C,EAAQ,MAKjCuZ,cAAe,SAAS7P,GACpB,IAAIsQ,EAAsB9/D,KAAKs1D,OAAOh7C,KAAI,SAASzF,GAC/C,OAAOA,EAAEmQ,SACVrP,QAAQ65C,EAAMxqC,OAEjB,OAAOhlB,KAAKs1D,OAAO1uD,MAAMk5D,EAAsB,EAAG9/D,KAAKs1D,OAAO9tD,SAGlE43D,oBAAqB,SAAS5P,EAAOp3B,GACjC,IAAIpC,EAAS,CACTkpB,MAAO,MACPC,QAAS,IAcb,GAXIn/C,KAAKg2B,UACLA,EAAOmpB,QAAQx9C,KAAK3B,KAAKg2B,WAG7BA,EAASjzB,GAAO,EAAM,GAAIizB,IACnBmpB,QAAQx9C,KAAK,CAChBqjB,MAAOwqC,EAAMxqC,MACbg6B,SAAU,KACVt2C,MAAO8mD,EAAM9mD,QAGb0vB,EACA,IAAK,IAAI7wB,EAAI,EAAGA,EAAI6wB,EAAQ5wB,OAAQD,IAChCyuB,EAAOmpB,QAAQx9C,KAAK,CAChBqjB,MAAOoT,EAAQ7wB,GAAGyd,MAClBg6B,SAAU,KACVt2C,MAAO0vB,EAAQ7wB,GAAGmB,QAK9B,OAAOstB,GAGX0pC,yBAA0B,SAASlQ,GAW/B,IAVA,IAGIrV,EACA4lB,EACA7Q,EACA8Q,EACAC,EAPAh4D,EAAOjI,KACP+zD,EAAS9rD,EAAK4sD,QACdqL,EAAenM,EAAOvsD,OAQjBD,EAAI,EAAGA,EAAI24D,EAAc34D,IAAK,CAEnCy4D,GADA9Q,EAAQ6E,EAAOxsD,IACIsG,KAAKrG,OACxBy4D,EAAU,GACV9lB,EAAO,KAEP,IAAK,IAAIzP,EAAI,EAAGA,EAAIs1B,IAChBD,EAAe7Q,EAAMrhD,KAAK68B,GAC1Bu1B,EAAQt+D,KAAK+oC,KAERq1B,EAAarX,MAAQ8G,EAAM9G,KAASqX,EAAanQ,cAAgBmQ,EAAa5rC,MAAM3sB,QAAUS,EAAKk4D,kBAAkBJ,EAAcvQ,EAAOyQ,KAJnHv1B,IAO5Bu1B,EAAQ7wC,MAGZ,GAAI6wC,EAAQz4D,OAAQ,CAGhB,IAFA2yC,EAAO4Z,EAAOxsD,GAAGqxD,aAEVqH,EAAQz4D,OAAS,GAEpB2yC,EAAOA,EADG8lB,EAAQz1D,OAAO,EAAG,GAAG,IACV2pB,MAEzBgmB,EAAK8lB,EAAQ,IAAMh4D,EAAKm4D,YAAY5Q,GACpC,SAKZ2Q,kBAAmB,SAAS3Q,EAAO6Q,EAAUJ,GACzC,IAEIK,EADA94D,EAASgoD,EAAMr7B,MAAM3sB,OAGzB,GAAIgoD,EAAMI,cAAgBpoD,EACtB,IAAK,IAAID,EAAI,EAAGA,EAAIC,EAAQD,IAAK,CAG7B,GAFA+4D,EAAkB9Q,EAAMr7B,MAAM5sB,GAC9B04D,EAAQt+D,KAAK4F,GACT+4D,EAAgB5X,MAAQ2X,EAAS3X,KAC5B4X,EAAgB1Q,cACjB0Q,EAAgBnsC,MAAM3sB,QAV3BxH,KAWUmgE,kBAAkBG,EAAiBD,EAAUJ,GACtD,OAAO,EAEXA,EAAQ7wC,QAMpBgxC,YAAa,SAAS5Q,GAClB,IAAIvnD,EAAOjI,KASX,OARAwvD,EAA+B,mBAAhBA,EAAM59C,OAAuB49C,EAAM59C,SAAW49C,GAEnDr7B,OAASq7B,EAAMr7B,MAAM3sB,SAC3BgoD,EAAMr7B,MAAQq7B,EAAMr7B,MAAM7Z,KAAI,SAASy0B,GACnC,OAAO9mC,EAAKm4D,YAAYrxB,OAIzBygB,GAGXiO,gBAAiB,SAAS8C,EAAaC,GACnC,IAAIv4D,EAAOjI,KAENiI,EAAKf,QAAQ4vD,kBACVyJ,IAAgB39D,EAChBqF,EAAKutD,OAAS+K,EACPC,IACPv4D,EAAKutD,OAASvtD,EAAK0sD,MAAMntD,UAKrCi5D,MAAO,SAAS13C,GACZ,IAAI9gB,EAAOjI,KAOX,OAAOA,KAAK0gE,SAASn0B,MANZ,SAASgvB,IACM,IAAhBA,GAAwBryD,EAAW6f,IACnCA,EAASxe,KAAKtC,OAO1By4D,OAAQ,SAASx5D,GACb,IAAIe,EAAOjI,KAEX,OAAOiI,EAAKzH,MAAMuC,EAAO,GAAI,CACzBk7C,KAAMh2C,EAAKg2C,OACXD,SAAU/1C,EAAK+1C,WACf/4B,KAAMhd,EAAKgd,OACX+Q,OAAQ/tB,EAAK+tB,SACbw5B,MAAOvnD,EAAKunD,QACZd,UAAWzmD,EAAKymD,aACjBxnD,KAGPy5D,KAAM,SAASz5D,GACX,IAAIe,EAAOjI,KACPi+C,EAAOh2C,EAAKg2C,OACZ8C,EAAQ94C,EAAK84C,QAIjB,GAFA75C,EAAUA,GAAW,GAEhB+2C,KAAS8C,GAAS9C,EAAO,EAAIh2C,EAAK24D,cAWvC,OAPA34D,EAAK6zD,MAAQ7zD,EAAK01D,mBAAqB1f,EAAOh2C,EAAKy2C,OAEnDT,GAAQ,EACR/2C,EAAQ+2C,KAAOA,EAEfh2C,EAAKy4D,OAAOx5D,GAEL+2C,GAGX4iB,KAAM,SAAS35D,GACX,IAAIe,EAAOjI,KACPi+C,EAAOh2C,EAAKg2C,OAIhB,GAFA/2C,EAAUA,GAAW,GAEhB+2C,GAAiB,IAATA,EAWb,OAPAh2C,EAAK6zD,MAAQ7zD,EAAK01D,mBAAqB11D,EAAK6zD,MAAQ7zD,EAAKy2C,OAEzDT,GAAQ,EACR/2C,EAAQ+2C,KAAOA,EAEfh2C,EAAKy4D,OAAOx5D,GAEL+2C,GAGXA,KAAM,SAAShvB,GACX,IACAuvB,EADIv2C,EAAOjI,KAGX,GAAIivB,IAAQrsB,EAAa,CACrBqsB,EAAM7rB,EAAKwV,IAAIxV,EAAK+S,IAAI/S,EAAKwV,IAAIqW,EAAK,GAAIhnB,EAAK24D,cAAe,GAC9D,IAAIliB,EAAOz2C,EAAKy2C,OAEhB,OAAIz2C,EAAKsvD,iBACLtoC,GAAO,OACPhnB,EAAKinD,MAAMjgC,EAAMyvB,EAAMA,EAAM,KAAM,cAGvCz2C,EAAKy4D,OAAOz4D,EAAK64D,sBAAsB,CAAE7iB,KAAMhvB,KAKnD,OAFAuvB,EAAOv2C,EAAKu2C,UAEI57C,EAAcQ,EAAK2S,OAAOyoC,GAAQ,IAAMv2C,EAAKy2C,QAAU,IAAM,EAAI97C,GAGrFo7C,SAAU,SAAS/uB,GACf,IAAIhnB,EAAOjI,KAEX,GAAIivB,IAAQrsB,EAKZ,OAAOqF,EAAKy2C,OAJRz2C,EAAKy4D,OAAOz4D,EAAK64D,sBAAsB,CAAE9iB,SAAU/uB,EAAKgvB,KAAM,MAOtEh5B,KAAM,SAASgK,GACX,IAAIhnB,EAAOjI,KAEX,OAAIivB,IAAQrsB,GACRqF,EAAKmC,QAAQ,aACbnC,EAAKy4D,OAAO,CAAEz7C,KAAMgK,KAIjBhnB,EAAKktD,OAGhBn/B,OAAQ,SAAS/G,GACb,IAAIhnB,EAAOjI,KAEX,GAAIivB,IAAQrsB,EACR,OAAOqF,EAAKotD,QAGhBptD,EAAKmC,QAAQ,SACbnC,EAAKy4D,OAAO,CAAE1qC,OAAQ/G,EAAKgvB,KAAM,KAGrCuR,MAAO,SAASvgC,GACZ,IAAIhnB,EAAOjI,KACPkH,EAAU,CAAEsoD,MAAOvgC,GAUvB,GARIhnB,EAAKwtD,eAEDxmC,IAAQrsB,GAAiBqsB,GAAQA,EAAIznB,SACrCS,EAAK4sD,QAAU,IAEnB3tD,EAAQ+2C,KAAO,GAGfhvB,IAAQrsB,EAKZ,OAAOqF,EAAKqtD,OAJRrtD,EAAKy4D,OAAOx5D,IAOpB65D,cAAe,SAASlzD,GACpB,IAAIjE,EAEApC,EADA+O,EAAS,GAGb,IAAK3M,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAAO,CACrD,IAAI4lD,EAAQ3hD,EAAKjE,GACb4lD,EAAMI,eACNr5C,EAASA,EAAO6G,OAAOpd,KAAK+gE,cAAcvR,EAAMr7B,SAGpD5d,EAAO5U,KAAK6tD,GAGhB,OAAOj5C,GAGXwqC,MAAO,WACH,OAAO9nC,SAASjZ,KAAKw1D,QAAU,EAAG,KAGtCwL,YAAa,SAASC,GAClB,IAAIh5D,EAAOjI,KAEX,OAAKiI,EAAKqtD,OAAO9tD,OAIbS,EAAKovD,oBACDpvD,EAAK0zD,qBAGT1zD,EAAK0zD,mBAAqB1zD,EAAK84C,SAFpB94C,EAAK0zD,oBAOb1zD,EAAKi5D,sBAAsBj5D,EAAK4sD,QAAQrtD,OAASS,EAAK4sD,QAAQ,GAAGhnD,KAAO,GAAIozD,GAZxEh5D,EAAK84C,SAepBmgB,sBAAuB,SAAS33B,EAAQ03B,EAAiBE,EAAYC,GACjE,IAEIrgB,EACAv5C,EAHAS,EAAOjI,KAKX,GAJAmhE,EAAaA,GAAc,QAIvBl5D,EAAKqtD,OAAO9tD,QAAU+hC,EAAQ,CAC9BwX,EAAQ,EACRv5C,EAAS+hC,EAAO/hC,OAEhB,IAAK,IAAID,EAAI,EAAGA,EAAIC,EAAQD,IACxBw5C,GAAS94C,EAAK+1D,WAAWz0B,EAAOhiC,GAAI05D,EAAiBE,EAAYC,GAGrE,OADAn5D,EAAKo5D,aAAetgB,EACbA,EAIX,OADA94C,EAAKo5D,aAAep5D,EAAK0sD,MAAMntD,OACxBS,EAAKo5D,cAGhBrD,WAAY,SAASxO,EAAOyR,EAAiBE,EAAYC,GACrD,IAAIn5D,EAAOjI,KACP+gD,EAAQ,EAoBZ,OAlBIyO,EAAMI,cAAgB3nD,EAAKytD,aAAalG,EAAM9G,OAC1CuY,IAAoBzR,EAAM+O,eAAiB6C,KAC3CrgB,GAAS,GAGbyO,EAAM2R,GAAY7/D,SAAQ,SAAS++D,GAC/Btf,GAAS94C,EAAK+1D,WAAWqC,EAAUY,EAAiBE,EAAYC,OAGhEn5D,EAAKytD,aAAalG,EAAM9G,OACpBuY,IAAoBzR,EAAM+O,eAAiB6C,IAC3CrgB,IAEJA,GAASyO,EAAM2R,GAAc3R,EAAM2R,GAAY35D,OAAS,GAExDu5C,IAGDA,GAGXugB,gBAAiB,SAASpS,GAItB,IAHA,IAAInO,EAAQ,EACRv5C,EAAS0nD,EAAM1nD,OAEVD,EAAI,EAAGA,EAAIC,EAAQD,IACxBw5C,GAAS/gD,KAAKg+D,WAAW9O,EAAM3nD,IAAI,GAGvC,OAAOw5C,GAGX2N,UAAW,SAASz/B,GAGhB,GAAIA,IAAQrsB,EAKZ,OAPW5C,KAOCu1D,WAPDv1D,KAGF0gE,OAAO,CAAEhS,UAAWz/B,KAOjCi/B,WAAY,WACR,IAAI33C,EAASvW,KAAK47D,iBAMlB,OAJIjmC,EAAcpf,KACdA,EAASvW,KAAKuhE,iBAAiBvhE,KAAK0uD,cAGjCn4C,GAGXgrD,iBAAkB,SAASrT,GACvB,IAAI33C,EAAS,GAEb,IAAKof,EAAcu4B,GAAa,CAC5B,IAAIQ,EAAY,GAEXzrD,EAAQirD,KACTA,EAAa,CAACA,IAGlB,IAAK,IAAItkD,EAAM,EAAGA,EAAMskD,EAAW1mD,OAAQoC,IACvC8kD,EAAUR,EAAWtkD,GAAK8kD,WAAa,EACvCn4C,EAAO23C,EAAWtkD,GAAKob,OAAS0pC,EAIxC,OAAOn4C,GAGXuqD,sBAAuB,SAAS55D,GAC5B,OAAOA,GAGXkxD,kBAAmB,SAASnV,GACxB,IACI92C,EACAqjD,EACA5lD,EAHA2/B,EAASvpC,KAAKwvD,QAMlB,IAAK5lD,EAAM2/B,EAAO/hC,OAAS,EAAY,EAAGoC,GAAH,EAAkBA,IACrD4lD,EAAQjmB,EAAO3/B,GACfuC,EAAS,CACLzD,MAAOu6C,EAAM3zB,IAAM2zB,EAAM3zB,IAAIkgC,EAAMxqC,OAASi+B,EAAMuM,EAAMxqC,OACxDA,MAAOwqC,EAAMxqC,MACbmP,MAAOhoB,EAAS,CAACA,GAAU,CAAC82C,GAC5B2M,eAAgBzjD,EAChB+hD,WAAYluD,KAAKuhE,iBAAiB/R,EAAMtB,aAIhD,OAAO/hD,GAGXy0D,WAAY,WACR,IAAI34D,EAAOjI,KACPg+C,EAAW/1C,EAAK+1C,YAAc/1C,EAAK84C,QACnCA,EAAQ94C,EAAKsvD,gBAAkBtvD,EAAK+4D,aAAY,GAAQ/4D,EAAK84C,QAEjE,OAAO39C,EAAKo+D,MAAMzgB,GAAS,GAAK/C,IAGpCyjB,QAAS,SAASjjB,EAAME,GACpB,IAAIz2C,EAAOjI,KACP2L,EAAMvI,EAAK+S,IAAIqoC,EAAOE,EAAMz2C,EAAK84C,SAErC,OAAK94C,EAAKf,QAAQ2vD,cAAgB5uD,EAAK0sD,MAAMntD,OAAS,GAI/CS,EAAKy5D,WAAWljB,EAAM7yC,GAAKnE,OAAS,GAG/Cm6D,UAAW,WACP,IAAI5N,EAAS/zD,KAAK60D,QAClB,OAAOd,EAAOA,EAAOvsD,OAAS,IAAM,CAAE8N,MAAO,EAAG3J,IAAK,EAAGkC,KAAM,KAGlE+zD,aAAc,WACV,IAAI7N,EAAS/zD,KAAK60D,QAClB,OAAOd,EAAOvsD,QAAUusD,EAAO,GAAGlmD,KAAKrG,QAAUusD,EAAO,GAAGlmD,KAAK,GAAG66C,KAGvEmZ,yBAA0B,WACtB7hE,KAAK6/D,yBAA0B,GAGnC1D,WAAY,WACR,OAAO,IAAI/tD,MAAOnF,WAGtBimD,MAAO,SAAS1Q,EAAME,EAAM31B,EAAUgkB,GAClC/sC,KAAK4/D,yBAA2B5/D,KAAKm8D,aACrCn8D,KAAK6/D,yBAA0B,EAC/B,IAAI9e,EAAQ/gD,KAAKu3D,gBAAkBv3D,KAAKghE,aAAY,GAAQhhE,KAAK+gD,QAElD,gBAAXhU,GAAuC,kBAAXA,GAC5B/sC,KAAKy8D,2BAGTje,EAAOp7C,EAAK+S,IAAIqoC,GAAQ,EAAGuC,GAC3Bh4B,EAAW7f,EAAW6f,GAAYA,EAAW5lB,EAE7C,IAGI0K,EAHA5F,EAAOjI,KACP8hE,EAAW1+D,EAAKwV,IAAIxV,EAAKmN,MAAMiuC,EAAOE,GAAO,GAAKA,EAClDjvC,EAAOrM,EAAK+S,IAAI2rD,EAAWpjB,EAAMqC,GAKrC,KAFAlzC,EAAO5F,EAAKy5D,WAAWljB,EAAMp7C,EAAK+S,IAAIqoC,EAAOE,EAAMqC,GAAQh4B,IAEjDvhB,QAAoB,IAAVu5C,KAAiB94C,EAAKm2D,oBAOtC,OANAn2D,EAAK85D,kBAAkBl0D,EAAM2wC,EAAME,EAAMz2C,EAAK+5D,mBAAqBF,EAAU75D,EAAKg6D,eAAiBxyD,EAAM,CACrGs9B,OAAQA,IAEZ9kC,EAAK+5D,kBAAoB,KACzB/5D,EAAKg6D,cAAgB,UACrBl5C,IAIA9gB,EAAKsvD,kBACLtvD,EAAK+5D,kBAAoBF,EACzB75D,EAAKg6D,cAAgBxyD,EAErBqyD,EAAW1+D,EAAKwV,IAAIxV,EAAKmN,MAAMtI,EAAKi6D,gBAAgB1jB,EAAME,GAAQA,GAAO,GAAKA,EAC9EjvC,EAAOrM,EAAK+S,IAAI2rD,EAAWpjB,EAAMqC,IAGjCrC,IAAS97C,GAAgBqF,EAAKm2D,sBACzBn2D,EAAKsvD,kBAAoBtvD,EAAKk6D,kBAAkBL,EAAUpjB,KAAWz2C,EAAKm6D,aAAaN,EAAUryD,GAClGxH,EAAKo6D,SAASP,EAAUpjB,GAAM,WACtBF,EAAOsjB,GAAYryD,EAAOxH,EAAK84C,UAAY94C,EAAKm6D,aAAa3yD,EAAMrM,EAAK+S,IAAI1G,EAAOivC,EAAMz2C,EAAK84C,UAC9F94C,EAAKo6D,SAAS5yD,EAAMivC,GAAM,WACtBz2C,EAAKinD,MAAM1Q,EAAME,EAAM31B,MAG3B9gB,EAAKinD,MAAM1Q,EAAME,EAAM31B,MAGxB+4C,EAAWtjB,GAClBv2C,EAAKo6D,SAAS5yD,EAAMivC,GAAM,WACtBz2C,EAAKinD,MAAM1Q,EAAME,EAAM31B,QAMvC24C,WAAY,SAASpsD,EAAO3J,EAAKod,GAC7B,IAEImmC,EAEAoT,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EAGAC,EACA/nD,EACAtT,EAQAs7D,EAvBA76D,EAAOjI,KACP+zD,EAAS9rD,EAAK4sD,QAEdhnD,EAAO,GAQP3G,EAAUe,EAAKf,QACf67D,EAAS77D,EAAQ0vD,eAAiB1vD,EAAQ2vD,cAAgB3vD,EAAQ4vD,iBAAmB5vD,EAAQgtD,gBAAkBhtD,EAAQ6vD,iBAIvHiM,EAAkB,CACVtkB,KAAM/yC,EAAM2J,EACZkpC,KAAMlpC,EACN+oD,QAAS,EACTH,MAAO,EACPI,gBAAgB,GAGxB2E,EAAeh7D,EAAKsvD,gBACpB2L,EAAaD,EAAe,aAAe,QAC3CE,EAAWF,EAAe,WAAa,MAG3C,IAAKX,EAAU,EAAG96D,EAASusD,EAAOvsD,OAAQ86D,EAAU96D,EAAQ86D,IAAW,CAGnE,GAFApT,EAAQ6E,EAAOuO,GAEXW,EAAc,CACd,GAAI/T,EAAMkN,YAAczwD,EACpB,MAAO,GAGX,GAAI2J,EAAQ45C,EAAMmN,SAAU,CACxB2G,EAAgB3E,SAAWnP,EAAMmN,UAAYyG,GAAgB,GAC7DA,EAAe5T,EAAMmN,SACrB,SAOJ,QAJ4B,IAAjByG,GAAgCA,GAAgB5T,EAAMkN,aAC7D4G,EAAgB3E,SAAWnP,EAAMkN,WAAa0G,GAG9CE,EAAgB3E,QAAU2E,EAAgBxkB,KAC1C,MAAO,GAQX,SAL4B,IAAjBskB,GAAgCxtD,EAAQ,GAAK45C,EAAM55C,MAAQ,IAClE0tD,EAAgB3E,QAAUnP,EAAMkN,YAGpCmG,EAAUD,IACG,CAIT,GAHAtiE,KAAK89D,kBAAkB5O,EAAMrhD,KAAMA,EAAMm1D,EAAiB,KAAMj6C,GAC5C9gB,EAAKi5D,sBAAsBrzD,GAAM,EAAM,iBAElCm1D,EAAgBtkB,KACrC,OAAO7wC,EAGX,GAAI5F,EAAKm2D,oBACL,MAAO,GAIX,IAAIrK,IAFJwO,IAEuBxO,EAAOwO,GAASnG,aAAelN,EAAMmN,SAGxD,MAFAnN,EAAQ6E,EAAOwO,SAKpB,GAAIjtD,GAAS45C,EAAMgU,IAAe5tD,GAAS45C,EAAMiU,GAAW,CAG/D,IAFAroD,EAAQ,EAEHynD,EAAUD,EAASC,EAAU/6D,EAAQ+6D,IAItC,GAHArT,EAAQ6E,EAAOwO,IACfM,EAAW56D,EAAKyvD,UAAUxI,EAAMrhD,MAAM,IAEzBrG,QAAU8N,EAAQwF,GAASo0C,EAAM55C,MAAO,CAIjD,GAHAotD,EAAYxT,EAAMrhD,KAClB80D,EAAWzT,EAAMvjD,KAEZo3D,EAAQ,CACT,GAAI77D,EAAQ8vD,YACR4L,EAAY36D,EAAKo1D,cAAcnO,EAAMrhD,KAAM,CAAEmoB,OAAQ/tB,EAAK+tB,eACvD,CACH,IAAI/Q,EAAOkpC,GAA6BlmD,EAAKunD,SAAW,IAAIpyC,OAAOmuC,GAActjD,EAAKgd,QAAU,KAChG29C,EAAY36D,EAAKo1D,cAAcnO,EAAMrhD,KAAM,CAAEoX,KAAMA,EAAM+Q,OAAQ/tB,EAAK+tB,WAE1E6sC,EAAWH,EAAYE,EAAU/0D,KAE7B+0D,EAAU7hB,QAAUn+C,IACpB+/D,EAAWC,EAAU7hB,OAe7B,GAXAyhB,EAAa,EACTltD,EAAQwF,EAAQo0C,EAAM55C,QACtBktD,EAAcltD,EAAQwF,EAASo0C,EAAM55C,OAEzCmtD,EAAWI,EAASr7D,OAChBm7D,EAAWh3D,IACX82D,GAAuBE,EAAWh3D,GAEtCmP,GAAS2nD,EAAWD,EACpB30D,EAAO5F,EAAKm7D,aAAav1D,EAAM60D,EAAWF,EAAYC,GAElD92D,GAAOujD,EAAMvjD,KAAOmP,GAASnP,EAAM2J,EACnC,OAAOzH,EAInB,MAEJi1D,EAAe5T,EAAMmN,SAEzB,MAAO,IAGXgH,mBAAoB,SAASvB,GAMzB,IALA,IACI/N,EADO/zD,KACO60D,QACdyO,EAAW,EACX/7D,EAAI,IAEK,CACT,IAAI2nD,EAAQ6E,EAAOxsD,GACnB,IAAK2nD,GAASA,EAAMkN,WAAa0F,EAC7B,MAGA5S,EAAMmN,UAAYnN,EAAMvjD,MACxB23D,EAAWpU,EAAMmN,SAAWnN,EAAMvjD,KAEtCpE,IAGJ,OAAO+7D,GAGXF,aAAc,SAASv1D,EAAMqhD,EAAO1Q,EAAME,GACtC,GAAI1+C,KAAKq3D,mBAAoB,CACzB,IACIkM,EADAppB,EAAO+U,EAAMt9C,SASjB,OANI/D,EAAKrG,SACL+7D,EAAY11D,EAAKA,EAAKrG,OAAS,IAGnC2rD,GAAYoQ,EAAWppB,EAAMqE,EAAME,GAE5B7wC,EAAKuP,OAAO+8B,GAEvB,OAAOtsC,EAAKuP,OAAO8xC,EAAMtoD,MAAM43C,EAAME,KAGzCqjB,kBAAmB,SAASl0D,EAAM2wC,EAAME,EAAMojB,EAAUryD,EAAM+zD,GAC1D,IAAIv7D,EAAOjI,KAEXiI,EAAK60D,SAAWl6D,EAEhBqF,EAAK6zD,MAAQtd,EAAOv2C,EAAKu2C,SAAWv2C,EAAKw7D,cAAgBrgE,EAAK+S,IAAI1G,GAAOxH,EAAK24D,aAAe,GAAK34D,EAAKy2C,QAAUojB,EAEjH75D,EAAK01D,mBAAqBnf,EAE1Bv2C,EAAKi1D,MAAQxe,EAEb,IAAIglB,EAASz7D,EAAKf,QAAQ2vD,aACtB8M,EAAU17D,EAAKf,QAAQ0vD,cACvBgN,EAAY37D,EAAKf,QAAQ4vD,gBACzB5I,EAAajmD,EAAKf,QAAQ6vD,iBAC9B,IACI9uD,EAAKf,QAAQ2vD,cAAe,EACvB5uD,EAAKovD,oBAAwBpvD,EAAKunD,SAAWvnD,EAAKunD,QAAQhoD,SAC3DS,EAAKf,QAAQ0vD,eAAgB,GAEjC3uD,EAAKf,QAAQ4vD,iBAAkB,EAC/B7uD,EAAKf,QAAQ2vD,cAAe,EAC5B5uD,EAAKf,QAAQ6vD,kBAAmB,EAE5B2M,IACAz7D,EAAKwuD,2BACLxuD,EAAK0sD,MAAQ9mD,EAAO5F,EAAKyuD,SAAS7oD,IAEtC5F,EAAK+vD,SAASnqD,EAAM21D,GACtB,QACEv7D,EAAKf,QAAQ2vD,aAAe6M,EAC5Bz7D,EAAKf,QAAQ0vD,cAAgB+M,EAC7B17D,EAAKf,QAAQ4vD,gBAAkB8M,EAC/B37D,EAAKf,QAAQ6vD,iBAAmB7I,IAIxC1P,KAAM,WACF,IAAIv2C,EAAOjI,KAEX,OAAIiI,EAAK6zD,QAAUl5D,EACPqF,EAAKitD,QAAUtyD,GAAeqF,EAAKitD,MAAQ,IAAMjtD,EAAKy2C,QAAU,GAAK97C,EAE1EqF,EAAK6zD,OAGhBqB,kBAAmB,WACf,OAAOn9D,KAAK29D,oBAAsB,GAGtCjf,KAAM,WACF,OAAO1+C,KAAKk9D,OAASl9D,KAAKi1D,WAG9B4O,wBAAyB,SAASrlB,EAAM/uC,EAAMsZ,EAAU2I,GACpD,IAAIzpB,EAAOjI,KACPk8D,EAAYj0D,EAAKk0D,aAErB,OAAO,SAAStuD,GACZ,IAEIjE,EACApC,EACA2yC,EAJA+e,GAAQ,EACRhK,EAAQ,CAAE55C,MAAOkpC,EAAM7yC,IAAK8D,EAAM5B,KAAM,GAAIquD,UAAWj0D,EAAKk0D,cAahE,GARAl0D,EAAKuzD,kBAELvzD,EAAKmC,QAAQg8C,EAAY,CAAEjE,SAAUt0C,EAAMnI,KAAM,SAEjDmI,EAAO5F,EAAKuuD,OAAOzhC,MAAMlnB,IAEzBssC,EAAOlyC,EAAKwvD,UAAU5pD,IAEbrG,OAAQ,CACb,IAAKoC,EAAM,EAAGpC,EAASS,EAAK4sD,QAAQrtD,OAAQoC,EAAMpC,EAAQoC,IACtD,GAAI3B,EAAK4sD,QAAQjrD,GAAK0L,QAAUkpC,EAAM,CAClC0a,GAAQ,EACRhK,EAAQjnD,EAAK4sD,QAAQjrD,GAEhB3B,EAAKsvD,kBACNrI,EAAM0J,aAAeze,EACrB+U,EAAMrhD,KAAO5F,EAAKyuD,SAASvc,GAC3B+U,EAAMvjD,IAAMujD,EAAM55C,MAAQrN,EAAKyvD,UAAUxI,EAAMrhD,MAAM,GAAMrG,OAC3DS,EAAKq0D,eAGT,MAIHpD,GACDjxD,EAAK8vD,UAAU9vD,EAAKyuD,SAASvc,GAAOqE,GAI5Cv2C,EAAKutD,OAASvtD,EAAKuuD,OAAOzV,MAAMlzC,IAE5B6jB,GAAUwqC,GAAaj0D,EAAK23D,2BAA6B33D,EAAK43D,2BAC1D92C,GAAYoxB,EAAK3yC,OACjBuhB,IAEA9gB,EAAKmC,QAAQ07C,EAAQ,OAMrCuc,SAAU,SAAS7jB,EAAME,EAAM31B,GAC3B,IAAI9gB,EAAOjI,KACPyP,EAAOrM,EAAK+S,IAAIqoC,EAAOE,EAAMz2C,EAAK84C,SAClC75C,EAAU,CACNw3C,KAAMA,EACNF,KAAMA,EACNP,KAAMO,EAAOE,EAAO,EACpBV,SAAUU,EACVz5B,KAAMhd,EAAKktD,MACXn/B,OAAQ/tB,EAAKotD,QACb7F,MAAOvnD,EAAKqtD,OACZ5G,UAAWzmD,EAAKstD,YAInBttD,EAAKsvD,kBAAoBtvD,EAAKovD,oBAAsBpvD,EAAKk6D,kBAAkB3jB,EAAM/uC,GAC9EsZ,GACAA,IAKH9gB,EAAKqvD,wBAA0BrvD,EAAKk6D,kBAAkB3jB,EAAM/uC,KAAWxH,EAAKm6D,aAAa5jB,EAAM/uC,IAChGyqB,aAAajyB,EAAKq3D,UAElBr3D,EAAKq3D,SAAWxmC,YAAW,WACvB7wB,EAAKqzD,cAAcp0D,GAAS,WACnBe,EAAKmC,QAAQ87C,EAAc,CAAExgD,KAAM,SAapCuC,EAAKuzD,mBAZDvzD,EAAKw7D,eACLx7D,EAAKmC,QAAQ+7C,GAEjBl+C,EAAK03C,UAAUd,KAAK,CAChBhxC,KAAM5F,EAAKozD,QAAQn0D,GACnBg7C,QAASj6C,EAAK47D,wBAAwBrlB,EAAM/uC,EAAMsZ,GAClD+E,MAAO,WACH,IAAIoJ,EAAOtwB,EAAM2D,KAAKlD,WACtBY,EAAK6lB,MAAM1lB,MAAMH,EAAMivB,YAOxC,MACInO,GACPA,KAIR+6C,kBAAmB,SAAStlB,EAAME,EAAM31B,GACpC,IAAI9gB,EAAOjI,KACPyP,EAAOrM,EAAK+S,IAAIqoC,EAAOE,EAAMz2C,EAAK84C,SAClC75C,EAAU,CACNw3C,KAAMA,EACNF,KAAMA,EACNP,KAAMO,EAAOE,EAAO,EACpBV,SAAUU,EACVz5B,KAAMhd,EAAKktD,MACXn/B,OAAQ/tB,EAAKotD,QACb7F,MAAOvnD,EAAKqtD,OACZ5G,UAAWzmD,EAAKstD,YAGnBttD,EAAKm6D,aAAa5jB,EAAM/uC,GAOlBsZ,GACPA,IAPK9gB,EAAKmC,QAAQ87C,EAAc,CAAExgD,KAAM,UACpCuC,EAAK03C,UAAUd,KAAK,CAChBhxC,KAAM5F,EAAKozD,QAAQn0D,GACnBg7C,QAASj6C,EAAK47D,wBAAwBrlB,EAAM/uC,EAAMsZ,GAAU,MAQ5Em5C,gBAAiB,SAAS5sD,EAAOopC,GAC7B,IAEInoC,EAEA+sD,EAJAr7D,EAAOjI,KACP+jE,EAAY97D,EAAK+7D,cAAc1uD,GAE/ByrC,EAAQ94C,EAAK84C,QAGjB,GAAIgjB,EAAW,CAGX,KAFAT,EAAWr7D,EAAKo7D,mBAAmB/tD,IAG/B,OAAOA,EAEXA,GAASguD,EAIb,IAFA/sD,EAASnT,EAAKwV,IAAIxV,EAAKmN,MAAM+E,EAAQopC,GAAO,GAAKA,GAEpCqC,EACT,QACIxqC,GAAUmoC,GACGqC,KAKrB,OAAOxqC,GAGX0tD,cAAe,SAASt4D,GACpB,IAEI/B,EACApC,EAFAusD,EADO/zD,KACO60D,QAIlB,IAAKjrD,EAAM,EAAGpC,EAASusD,EAAOvsD,OAAQoC,EAAMpC,EAAQoC,IAChD,GAAImqD,EAAOnqD,GAAK0L,OAAS3J,GAAOooD,EAAOnqD,GAAK+B,KAAOA,EAC/C,OAAOooD,EAAOnqD,IAK1Bo6D,cAAe,SAAS1uD,GACpB,IAEI1L,EACAslD,EAFA6E,EADO/zD,KACO60D,QAKlB,IAAKjrD,EAFQmqD,EAAOvsD,OAEA,EAAGoC,GAAO,EAAGA,IAC7B,GAAImqD,EAAOnqD,GAAKwyD,YAAc9mD,EAAO,CACjC45C,EAAQ6E,EAAOnqD,GACf,MAKR,OAAOslD,GAGXkT,aAAc,SAAS9sD,EAAO3J,GAC1B,IAEI/B,EACApC,EAFAusD,EADO/zD,KACO60D,QAIlB,IAAKjrD,EAAM,EAAGpC,EAASusD,EAAOvsD,OAAQoC,EAAMpC,EAAQoC,IAChD,GAAImqD,EAAOnqD,GAAK0L,OAASA,GAASy+C,EAAOnqD,GAAK+B,KAAOA,EACjD,OAAO,EAIf,OAAO,GAGXw2D,kBAAmB,SAAS7sD,EAAO3J,GAC/B,IAEI/B,EACApC,EAHAS,EAAOjI,KACP+zD,EAAS9rD,EAAK4sD,QAGdqP,EAAsB,EACtBnjB,EAAQ94C,EAAK+4D,aAAY,GAM7B,IAJIr1D,EAAMo1C,IAAU94C,EAAKovD,qBACrB1rD,EAAMo1C,GAGLn3C,EAAM,EAAGpC,EAASusD,EAAOvsD,OAAQoC,EAAMpC,EAAQoC,IAAO,CACvD,IAAIslD,EAAQ6E,EAAOnqD,GACfslD,EAAMkN,YAAc9mD,GAAS45C,EAAMmN,UAAY/mD,EAC/C4uD,GAAuBhV,EAAMmN,SAAW/mD,EACjC45C,EAAMkN,YAAczwD,GAAOujD,EAAMmN,UAAY1wD,IACpDu4D,GAAuBv4D,EAAMujD,EAAMkN,YAI3C,OAAO8H,GAAuBv4D,EAAM2J,GAGxCkjD,qBAAsB,WAClB,IAKItJ,EACAtlD,EANA3B,EAAOjI,KACP+zD,EAAS9rD,EAAK4sD,QACdv/C,EAAQrN,EAAKk1D,oBACbxxD,EAAM2J,GAASrN,EAAKy2C,QAAU,GAC9B6Z,EAAY,GAGZ/wD,EAASusD,EAAOvsD,OAEpB,IAAKoC,EAAM,EAAGA,EAAMpC,EAAQoC,MACxBslD,EAAQ6E,EAAOnqD,IAEJ0L,OAASA,GAAS45C,EAAMvjD,KAAO2J,GAAW45C,EAAM55C,OAASA,GAAS45C,EAAM55C,OAAS3J,IACxF4sD,EAAU52D,KAAKutD,GAIvB,OAAOqJ,GAGXoB,uBAAwB,SAAS1W,GAI7B,IAHA,IACIiM,EAEKtlD,EAAM,EAAGpC,EAASxH,KAAK60D,QAAQrtD,OAAQoC,EAAMpC,EAAQoC,IAC1DslD,EAAQlvD,KAAK60D,QAAQjrD,GAJd5J,KAMFmkE,sBAAsBjV,EAAOjM,GAN3BjjD,KASNokE,uBAGTD,sBAAuB,SAASjV,EAAOjM,GACnCjjD,KAAKm5D,UAAUjK,EAAMrhD,MAAM,SAASA,GAChC,GAAKA,EAGL,IAAK,IAAIjE,EAAM,EAAGA,EAAMiE,EAAKrG,OAAQoC,IAAO,CACxC,IAAIwqB,EAAWvmB,EAAKjE,GAEpB,GAAIwqB,EAASs0B,KAAOt0B,EAASs0B,KAAOzF,EAAMyF,IAAK,CAC3C,GAAGl+C,OAAOD,KAAKsD,EAAMjE,EAAK,GAC1B,YAMhByuD,oBAAqB,SAASt/C,EAAOkqC,GACjC,IAGIiM,EACA3nD,EAJAU,EAAOjI,KACP+zD,EAAS9rD,EAAK4sD,SAAW,GACzBqL,EAAenM,EAAOvsD,OAI1B,IAAKD,EAAI,EAAGA,EAAI24D,EAAc34D,IAG1B,IAFA2nD,EAAQ6E,EAAOxsD,IAEL+N,OAASyD,GAASm2C,EAAMvjD,KAAOoN,EAAO,CACvC9Q,EAAK4vD,UAAU5U,EAAMyF,IAAKwG,EAAMrhD,QAC7B5F,EAAKovD,mBACLnI,EAAMrhD,KAAKrD,OAAOuO,EAAO,EAAG9Q,EAAKmwD,kBAAkBnV,IAEnDiM,EAAMrhD,KAAKrD,OAAOuO,EAAO,EAAGkqC,IAIpC,MAIRh7C,EAAKm8D,uBAGTA,oBAAqB,WACjB,IAOIlV,EACA3nD,EARAU,EAAOjI,KACP+zD,EAAS9rD,EAAK4sD,SAAW,GACzBqL,EAAenM,EAAOvsD,OACtB68D,GAAgB,EAChBC,EAAiB,EACjBC,EAAmB,EAKvB,IAAKh9D,EAAI,EAAGA,EAAI24D,EAAc34D,IAC1B2nD,EAAQ6E,EAAOxsD,GAEfg9D,GADct8D,EAAKsvD,gBAAkBrI,EAAMrhD,KAAKrG,OAASS,EAAKyvD,UAAUxI,EAAMrhD,MAAM,GAAMrG,QACzDpE,EAAK8T,IAAIg4C,EAAMvjD,IAAMujD,EAAM55C,OAEvD+uD,GAAsC,IAArBE,EAOlBF,IACAnV,EAAM55C,OAASgvD,EACfpV,EAAMvjD,KAAO24D,IARbD,GAAgB,EAChBC,EAAiBC,EACjBrV,EAAMvjD,KAAO24D,IAWzB7H,yBAA0B,WACtB,IAIIvN,EACA3nD,EACAw8D,EACAS,EAPAv8D,EAAOjI,KACP+zD,EAAS9rD,EAAK4sD,SAAW,GACzBqL,EAAenM,EAAOvsD,OACtB88D,EAAiB,EAMrB,IAAK/8D,EAAI,EAAGA,EAAI24D,EAAc34D,IAC1B2nD,EAAQ6E,EAAOxsD,GACfi9D,EAAcv8D,EAAKsvD,gBAAkBtvD,EAAKi5D,sBAAsBhS,EAAMrhD,MAAM,EAAM,SAAS,GAAQ5F,EAAKyvD,UAAUxI,EAAMrhD,MAAM,GAAMrG,OAEhIu8D,GACIA,EAAUp4D,KAAOujD,EAAM55C,QACvBgvD,EAAiBpV,EAAM55C,MAAQyuD,EAAUp4D,KAE7CujD,EAAMkN,WAAa2H,EAAU1H,SAAWiI,EACxCA,EAAiB,GAEjBpV,EAAMkN,WAAalN,EAAM55C,MAG7B45C,EAAMmN,SAAWnN,EAAMkN,WAAaoI,EACpCT,EAAY7U,KAKpB0G,GAAY,GAEhBA,GAAUzU,OAAS,SAASj6C,EAAS2G,EAAMgjB,GACvC,IAAI8uB,EACA8kB,EAAmBv9D,EAAQy4C,UAAYh9C,EAAEI,OAAO,GAAImE,EAAQy4C,WAAa,KA8B7E,OA5BI8kB,GACAA,EAAiB5lB,YAAc4lB,EAAiB5lB,OAAS34C,EAAS,CAAEkoB,IAAKq2C,EAAiB5lB,MAAS4lB,EAAiB5lB,KAE/F,SAAjB33C,EAAQxB,OACR++D,EAAiB5zC,WAAaA,GAG9B3pB,EAAQxB,OACR/E,EAAMkN,KAAKmzC,WAAargD,EAAMkN,KAAKmzC,YAAc,GACjDrgD,EAAMkN,KAAK+yC,QAAUjgD,EAAMkN,KAAK+yC,SAAW,GAEtCjgD,EAAMkN,KAAKmzC,WAAW95C,EAAQxB,MAEvBiC,EAAchH,EAAMkN,KAAKmzC,WAAW95C,EAAQxB,OAGpD++D,EAAmB1hE,GAAO,EAAM,GAAIpC,EAAMkN,KAAKmzC,WAAW95C,EAAQxB,MAAO++D,GAFzE9kB,EAAY,IAAIh/C,EAAMkN,KAAKmzC,WAAW95C,EAAQxB,MAAM3C,EAAO0hE,EAAkB,CAAE52D,KAAMA,KAFrFlN,EAAM0vB,aAAa,sCAAwCnpB,EAAQxB,KAAO,8FAA+F,QAO7KwB,EAAQorD,OAASvvD,GAAO,EAAM,GAAIpC,EAAMkN,KAAK+yC,QAAQ15C,EAAQxB,MAAOwB,EAAQorD,SAG3E3S,IACDA,EAAYz2C,EAAWu7D,EAAiB5lB,MAAQ4lB,EAAmB,IAAIvT,GAAgBuT,KAG3F9kB,EAAY,IAAIsR,GAAe,CAAEpjD,KAAM3G,EAAQ2G,MAAQ,KAEpD8xC,GAGX5xC,GAAWozC,OAAS,SAASj6C,IACrBjE,EAAQiE,IAAYA,aAAmB0G,KACxC1G,EAAU,CAAE2G,KAAM3G,IAGrB,IAKI0C,EACApC,EAEAwd,EARA6L,EAAa3pB,GAAW,GACxB2G,EAAOgjB,EAAWhjB,KAClB8gB,EAASkC,EAAWlC,OACpBrQ,EAAQuS,EAAWvS,MACnB6nB,EAAStV,EAAWsV,OAGpB8c,EAAQ,GAeZ,GAZKp1C,IAAQ8gB,GAAWkC,EAAW8uB,YAC3BrhC,EACAzQ,EAiFZ,SAAoByQ,EAAOqQ,GACvB,IAEA/kB,EACApC,EACAk9D,EAGAC,EACAjhB,EACAkhB,EACAhd,EAVIid,EAAQliE,EAAE2b,GAAO,GAAGwmD,QAAQ,GAChCC,EAAOF,EAAQA,EAAME,KAAO,GAI5BC,EAAar2C,EAAOnnB,OACpBqG,EAAO,GAMP,IAAKjE,EAAM,EAAGpC,EAASu9D,EAAKv9D,OAAQoC,EAAMpC,EAAQoC,IAAO,CAKrD,IAJA85C,EAAS,GACTkE,GAAQ,EACR+c,EAAQI,EAAKn7D,GAAK+6D,MAEbD,EAAa,EAAGA,EAAaM,EAAYN,IAEN,QADpCE,EAAOD,EAAMD,IACJ1sC,SAAS1f,gBACdsvC,GAAQ,EACRlE,EAAO/0B,EAAO+1C,GAAY1/C,OAAS4/C,EAAK7mD,WAG3C6pC,GACD/5C,EAAKlM,KAAK+hD,GAIlB,OAAO71C,EA/GQo3D,CAAW3mD,EAAOqQ,GAClBwX,IACPt4B,EA+BZ,SAAqBs4B,EAAQxX,GAEzB,IAKI/kB,EAAKpC,EACL09D,EACArwC,EACA6uB,EACAh7C,EATAxB,GADJi/B,EAASxjC,EAAEwjC,GAAQ,IACEj/B,QACjBi+D,EAAax2C,EAAO,GACpBy2C,EAAcz2C,EAAO,GAErB9gB,EAAO,GAOX,IAAKjE,EAAM,EAAGpC,EAASN,EAAQM,OAAQoC,EAAMpC,EAAQoC,IACjD85C,EAAS,IAETwhB,GADArwC,EAAS3tB,EAAQ0C,IACC+b,cAEDwgB,IACb++B,EAAW,MAGXrwC,EAAOoD,UAAaitC,GAAYA,EAASjtC,WAIzCitC,IACAxhB,EAAOwhB,SAAWA,EAAStxC,OAG/B8vB,EAAOyhB,EAAWngD,OAAS6P,EAAO8L,KAK9Bj4B,GAHJA,EAAQmsB,EAAOmvB,WAAWt7C,QAEbA,EAAM28D,UACPxwC,EAAOnsB,MAEPmsB,EAAO8L,KAGnB+iB,EAAO0hB,EAAYpgD,OAAStc,EAE5BmF,EAAKlM,KAAK+hD,IAGd,OAAO71C,EA5EQy3D,CAAYn/B,EAAQxX,GAEvBkC,EAAW2+B,QAAU5sD,GAAeiL,EAAK,IAAMA,EAAK,GAAGq3D,WAAatiE,IACpEiuB,EAAW2+B,MAAQ,cAK3B7uD,EAAMkN,KAAKw1C,OAAS10B,KAAYkC,EAAWyhC,SAAWzhC,EAAWyhC,OAAOrP,OAAQ,CAChF,IAAKr5C,EAAM,EAAGpC,EAASmnB,EAAOnnB,OAAQoC,EAAMpC,EAAQoC,KAChDob,EAAQ2J,EAAO/kB,IACLlE,OACNu9C,EAAMj+B,EAAMA,OAASA,GAIxB2Q,EAAcstB,KACfpyB,EAAWyhC,OAASvvD,GAAO,EAAM8tB,EAAWyhC,OAAQ,CAAErP,MAAO,CAAEt0B,OAAQs0B,MAW/E,OAPApyB,EAAWhjB,KAAOA,EAElBs4B,EAAS,KACTtV,EAAWsV,OAAS,KACpB7nB,EAAQ,KACRuS,EAAWvS,MAAQ,KAEZuS,aAAsB9iB,GAAa8iB,EAAa,IAAI9iB,GAAW8iB,IAoF1E,IAAI00C,GAAOliB,GAAM3jD,OAAO,CACpB4jD,QAAS,KAETn7C,KAAM,SAASO,GACX,IAAIT,EAAOjI,KACPwlE,EAAcv9D,EAAKu9D,aAAe98D,GAASA,EAAM88D,YACjDC,EAAgB,QAChBC,EAAkB,GAiCtB,GA/BA/kE,EAAMkN,KAAKw1C,MAAMt7C,GAAGI,KAAKoC,KAAKtC,EAAMS,UAEzBT,EAAKitC,WAAahvC,IACzBu/D,EAAgBx9D,EAAKitC,UAGzBwwB,EAAkB,CACdpT,OAAQ,CACJzkD,KAAM43D,EACNxiB,MAAO,CACHuiB,YAAaA,EACb91C,GAAIznB,EAAKq7C,QACT30B,OAAQ1mB,EAAK0mB,iBAKd1mB,EAAKitC,WAAahvC,GACzBnD,EAAO2iE,EAAiBz9D,EAAKitC,UAGjCwwB,EAAgB73D,KAAOnF,EAElB88D,IACDA,EAAcE,EAAgBpT,OAAOzkD,aAG9B23D,IAAgBt/D,IACvBs/D,EAAc7kE,EAAMkuB,OAAO22C,IAG3Bt8D,EAAWs8D,GAAc,CACzB,IAAIG,EAAoBH,EAAYj7D,KAAKtC,EAAMA,GAE3C09D,GAAkD,IAA7BA,EAAkBn+D,OACvCS,EAAKu9D,aAAc,EAEnBv9D,EAAKu9D,cAAgBG,EAI7B19D,EAAK29D,iBAAmBF,EAEpBz9D,EAAKu9D,aACLv9D,EAAK49D,gBAGT59D,EAAK69D,WAAap9D,IAASA,EAAMo9D,UAGrCD,cAAe,WACX,IACI3wB,EAAUyK,EAAWyB,EADrBn5C,EAAOjI,KAGLiI,EAAKitC,oBAAoBlnC,KAG3B2xC,GAFAzK,EAAWjtC,EAAKitC,SAAW,IAAIlnC,GAAuB/F,EAAK29D,mBAEtCjmB,UACrByB,EAAezB,EAAUyB,aAEzBzB,EAAUyB,aAAe,SAASvzC,EAAMnI,GAOpC,OANAmI,EAAK5F,EAAKq7C,SAAW,MAAQr7C,EAAKynB,GAE9B0xB,IACAvzC,EAAOuzC,EAAa72C,KAAKtC,EAAM4F,EAAMnI,IAGlCmI,GAGXqnC,EAAS/oC,OAAS,WACd,OAAOlE,GAGXitC,EAAS1rC,KAAKs8C,GAAQ,SAASnhD,GAC3BA,EAAEs+B,KAAOt+B,EAAEs+B,MAAQh7B,EACnBA,EAAKmC,QAAQ07C,EAAQnhD,MAGzBuwC,EAAS1rC,KAAKy8C,GAAO,SAASthD,GAC1B,IAAI87C,EAAax4C,EAAKkE,SAElBs0C,IACA97C,EAAEs+B,KAAOt+B,EAAEs+B,MAAQh7B,EACnBw4C,EAAWr2C,QAAQ67C,EAAOthD,OAIlCuwC,EAAS1rC,KAAK68C,GAAa,SAAS1hD,GAChC,IAAI87C,EAAax4C,EAAKkE,SAElBs0C,GACAA,EAAWr2C,QAAQi8C,EAAa1hD,MAIxCsD,EAAK89D,yBAIbjsB,OAAQ,SAASmJ,GACbjjD,KAAK6lE,gBACL7lE,KAAKgmE,QAAO,GACZhmE,KAAKk1C,SAASjoC,IAAIg2C,IAGtBuiB,aAAa,EAEbS,MAAO,WAIH,IAHA,IAAItgD,EAAa3lB,KAAK2lB,aAClBsgD,EAAQ,EAELtgD,GAAcA,EAAWA,YAC5BsgD,IACAtgD,EAAaA,EAAWA,WAAaA,EAAWA,aAAe,KAGnE,OAAOsgD,GAGXF,qBAAsB,WAGlB/lE,KAFgBA,KAAK4lE,iBAAiBtT,OAAOzkD,MAE3B,SAAW7N,KAAKk1C,SAASrnC,QAG/Cq4D,gBAAiB,WACblmE,KAAK8lE,SAAU,EAEf9lE,KAAK+lE,wBAGTI,KAAM,WACF,IAEIjxB,EAAUluB,EAFV9f,EAAU,GACViwB,EAAS,SA6Bb,OA1BIn3B,KAAKwlE,aACLxlE,KAAK6lE,gBAEL3wB,EAAWl1C,KAAKk1C,SAEhBhuC,EAAQlH,KAAKsjD,SAAW,MAAQtjD,KAAK0vB,GAEhC1vB,KAAK8lE,UACN5wB,EAASyf,MAAQ/xD,EACjBu0B,EAAS,QAGb+d,EAASvrC,IAAIm8C,EAAQ9lD,KAAKkmE,gBAAgB18D,KAAKxJ,OAE3CA,KAAKomE,eACLl/D,EAAQ8uB,OAAS,CAAEhR,MAAO,eAAgBg6B,SAAU,KAAMt2C,OAAO,IAGrEse,EAAUkuB,EAAS/d,GAAQjwB,GACtBlH,KAAK8lE,SACN9lE,KAAKoK,QAAQk8C,EAAU,CAAEt/B,QAASA,EAASic,KAAMjjC,QAGrDA,KAAKgmE,QAAO,GAGTh/C,GAAWrkB,EAAEopC,WAAW2J,UAAU1uB,WAG7CrB,WAAY,WAGR,OAFY3lB,KAAKmM,SAEJA,UAGjB65D,OAAQ,SAASt9D,GACb,GAAIA,IAAU9F,EAGV,OAAO5C,KAAK8lE,QAFZ9lE,KAAK8lE,QAAUp9D,GAMvBigD,gBAAiB,SAAS3jC,GACtB,OAAOq+B,GAAMt7C,GAAG4gD,gBAAgBp+C,KAAKvK,KAAMglB,IACzB,aAAVA,GACU,YAAVA,GACU,gBAAVA,GACU,qBAAVA,KAIhB,SAASqhD,GAAWjkE,GAChB,OAAO,WACH,IAAIyL,EAAO7N,KAAK20D,MACZp+C,EAASxI,GAAWhG,GAAG3F,GAAMgG,MAAMpI,KAAM4G,EAAM2D,KAAKlD,YAMxD,OAJIrH,KAAK20D,OAAS9mD,GACd7N,KAAKsmE,wBAGF/vD,GAIf,IAAIvI,GAAyBD,GAAWhL,OAAO,CAC3CoF,KAAM,SAASjB,GACX,IAAI+7B,EAAOsiC,GAAK7lE,OAAO,CACnBw1C,SAAUhuC,IAGVA,EAAQ8uB,SAAW9uB,EAAQ4vD,kBAC3B92D,KAAKumE,oBAAsBr/D,EAAQ8uB,OACnC9uB,EAAQ8uB,OAAS,MAGrBjoB,GAAWhG,GAAGI,KAAKoC,KAAKvK,KAAM+C,GAAO,EAAM,GAAI,CAAEuvD,OAAQ,CAAElP,UAAWngB,EAAMggB,MAAOhgB,IAAU/7B,IAE7FlH,KAAKsmE,yBAGTA,sBAAuB,WACnB,IAAIr+D,EAAOjI,KAEXiI,EAAK0sD,MAAMnrD,KAAKy8C,GAAO,SAASthD,GAC5BsD,EAAKmC,QAAQ67C,EAAOthD,MAGxBsD,EAAK0sD,MAAMnrD,KAAK68C,GAAa,SAAS1hD,GAClCsD,EAAKmC,QAAQi8C,EAAa1hD,OAIlCiyB,QAAS,WACL,QAAI52B,KAAK20D,QACE30D,KAAK20D,MAAM/9B,WAAa52B,KAAKwmE,qBAK5CA,iBAAkB,WACd,IAAIC,GAAY,EAMhB,OALAzmE,KAAK20D,MAAMrzD,SAAQ,SAAS2hC,GACpBA,EAAKuiC,aAAeviC,EAAKiS,SAASte,YAClC6vC,GAAY,MAGbA,GAGX5nB,KAAM,SAAShxC,GACX,IAAI0I,EAASxI,GAAWhG,GAAG82C,KAAKt0C,KAAKvK,KAAM6N,GAY3C,OAVI7N,KAAKumE,sBACDvmE,KAAK20D,OAAS30D,KAAK20D,MAAMntD,OAAS,EAClCxH,KAAKg2B,OAAOh2B,KAAKumE,sBAEjBvmE,KAAKkH,QAAQ8uB,OAASh2B,KAAKumE,oBAC3BvmE,KAAKq1D,QAAU3H,GAAgB1tD,KAAKkH,QAAQ8uB,QAC5Ch2B,KAAKumE,oBAAsB,OAI5BhwD,GAGXugB,OAAQ,SAASmM,GACb,IAEI1sB,EAFAoP,EAAasd,EAAKtd,aAClBkL,EAAa7wB,KAajB,OAVI2lB,GAAcA,EAAWkgD,gBACzBh1C,EAAalL,EAAWuvB,UAG5B3+B,EAASxI,GAAWhG,GAAG+uB,OAAOvsB,KAAKsmB,EAAYoS,GAE3Ctd,IAAekL,EAAWhjB,OAAOrG,SACjCme,EAAW6/C,aAAc,GAGtBjvD,GAGX2rC,QAASmkB,GAAW,WAEpBx4D,KAAMw4D,GAAW,QAEjBnO,OAAQ,SAASn/C,EAAOkqC,GACpB,IAAIt9B,EAAa3lB,KAAKmM,SAOtB,OALIwZ,GAAcA,EAAWkgD,gBACzBlgD,EAAW6/C,aAAc,EACzB7/C,EAAWkgD,iBAGR93D,GAAWhG,GAAGmwD,OAAO3tD,KAAKvK,KAAM+Y,EAAOkqC,IAGlDjtB,OAAQ,SAAS/G,GACb,GAAIA,IAAQrsB,EACP,OAAO5C,KAAKq1D,SAGZr1D,KAAKkH,QAAQ4vD,iBAAmB92D,KAAK0mE,uBAAuBz3C,KAC7DA,EAAM,CAAEiwB,MAAO,KAAMC,QAAS,CAAClwB,EAAK,CAAEjK,MAAO,eAAgBg6B,SAAU,SAAUt2C,OAAO,MAG5F1I,KAAKoK,QAAQ,SACbpK,KAAK0gE,OAAO,CAAE1qC,OAAQ/G,EAAKgvB,KAAM,KAGrCyoB,uBAAwB,SAAS1a,GAC7B,IAAIuD,EACAvK,EAAyBhlD,KAAKkH,QAAQ89C,uBAI1C,OAFAgH,EAAchH,EAAyBriD,EAAEI,OAAO,GAAI2qD,GAAgB1B,GAAc,CAAEhH,uBAAwBA,IAA4B0I,GAAgB1B,KAErG,IAA/BA,EAAY7M,QAAQ33C,QAKxC+nD,EAAWjE,GAAMO,WAAWG,EAAa,CAAEF,QAAQ,IAEnD9rD,KAAK2mE,0BAA0BpX,IACxB,IAPHvvD,KAAK2mE,2BAA0B,WAAY,OAAO,MAC3C,IASdA,0BAA2B,SAAS3wC,GAKjC,IAJA,IAAIviB,EACA5F,EAAO7N,KAAK20D,MACZp+C,GAAS,EAEJ3M,EAAM,EAAGA,EAAMiE,EAAKrG,OAAQoC,KAChC6J,EAAU5F,EAAKjE,IAEH47D,aACR/xD,EAAQ2yD,aAAe3yD,EAAQyhC,SAASyxB,0BAA0B3wC,GAC9DviB,EAAQ2yD,eACT3yD,EAAQ2yD,aAAepwC,EAAOviB,KAGlCA,EAAQ2yD,aAAepwC,EAAOviB,GAG9BA,EAAQ2yD,eACR7vD,GAAS,GAGjB,OAAOA,GAGXqwD,MAAO,SAASzvC,EAAQzuB,GACpB,IAAIkB,EAAKpC,EAAQy7B,EAAMiS,EACnBrnC,EAAO7N,KAAK20D,MAEhB,GAAK9mD,EAAL,CAMA,GAFAo1B,EAAOl1B,GAAWhG,GAAGovB,GAAQ5sB,KAAKvK,KAAM0I,GAGpC,OAAOu6B,EAKX,IAAKr5B,EAAM,EAAGpC,GAFdqG,EAAO7N,KAAK03D,UAAU13D,KAAK20D,QAECntD,OAAQoC,EAAMpC,EAAQoC,IAG9C,IAFAsrC,EAAWrnC,EAAKjE,GAAKsrC,oBAEKlnC,KAI1Bi1B,EAAOiS,EAAS/d,GAAQzuB,IAGpB,OAAOu6B,IAKnB3T,IAAK,SAASI,GACV,OAAO1vB,KAAK4mE,MAAM,MAAOl3C,IAG7BkoC,SAAU,SAASlP,GACf,OAAO1oD,KAAK4mE,MAAM,WAAYle,MAItC,SAASme,GAAUC,EAAMn4C,GACrB,IACI/kB,EACApC,EAEAk8C,EAKA3U,EACArf,EACAq3C,EACAt6C,EACAyoB,EAbA/gB,EAAQxxB,EAAEmkE,GAAM5xB,WAGhBrnC,EAAO,GAEPm5D,EAAYr4C,EAAO,GAAG3J,MACtBiiD,EAAWt4C,EAAO,IAAMA,EAAO,GAAG3J,MAClCkiD,EAAsBv4C,EAAO,IAAMA,EAAO,GAAG3J,MAC7CmiD,EAAgBx4C,EAAO,IAAMA,EAAO,GAAG3J,MAO3C,SAASkP,EAASusB,EAAYvwB,GAC1B,OAAOuwB,EAAWzqB,OAAO9F,GAASjjB,IAAIwzC,EAAW3qB,KAAK5F,IAG1D,IAAKtmB,EAAM,EAAGpC,EAAS2sB,EAAM3sB,OAAQoC,EAAMpC,EAAQoC,IAC/C85C,EAAS,CAAEoiB,SAAS,GAGpBiB,GAFAh4B,EAAO5a,EAAM0D,GAAGjuB,IAEC,GAAGs6C,WAEpB4iB,GADA5xB,EAAWnG,EAAKmG,YACAlf,OAAO,MACvBkf,EAAWA,EAASlf,OAAO,aAE3BtG,EAAKqf,EAAKhsB,KAAK,cAGX2gC,EAAOh0B,GAAKA,GAGZq3C,IACArjB,EAAOsjB,GAAmC,GAAtBD,EAAUtxC,SAAgBsxC,EAAUrjC,UAAYwR,EAASvU,QAG7EsmC,IACAvjB,EAAOujB,GAAY/yC,EAASghB,EAAU,KAAKnyB,KAAK,SAGhDokD,IACAzjB,EAAOyjB,GAAiBjzC,EAASghB,EAAU,OAAOnyB,KAAK,QAGvDmkD,IACAz6C,EAAYyH,EAASghB,EAAU,aAAahmB,KAAK,aACjDw0B,EAAOwjB,GAAuBz6C,GAAa9rB,EAAM4iC,KAAK9W,EAAUhqB,QAAQ,WAAY,MAGpFqkE,EAAKt/D,SACLk8C,EAAOvvB,MAAQ0yC,GAAUC,EAAKjvC,GAAG,GAAIlJ,IAGJ,QAAjCogB,EAAKhsB,KAAK,sBACV2gC,EAAO8hB,aAAc,GAGzB33D,EAAKlM,KAAK+hD,GAGd,OAAO71C,EAGXG,GAAuBmzC,OAAS,SAASj6C,GAGrC,IAAI2pB,GAFJ3pB,EAAUA,GAAWA,EAAQvF,KAAO,CAAEkM,KAAM3G,GAAYA,IAE5B,GACxB2G,EAAOgjB,EAAWhjB,KAClB8gB,EAASkC,EAAWlC,OACpBm4C,EAAOj2C,EAAWi2C,KAEtB,OAAIj5D,GAAQA,EAAKu5D,YACNv5D,EAAKu5D,aAGXv5D,IAAQ8gB,GAAWkC,EAAW8uB,WAC3BmnB,IACAj5D,EAAOg5D,GAAUC,EAAMn4C,IAI/BkC,EAAWhjB,KAAOA,EAEXgjB,aAAsB7iB,GAAyB6iB,EAAa,IAAI7iB,GAAuB6iB,KAGlG,IAAIw2C,GAAS1mE,EAAM2I,WAAWvG,OAAO,CACjCoF,KAAM,SAAS0oB,EAAYy2C,EAAUC,GACjC5mE,EAAM2I,WAAWvB,GAAGI,KAAKoC,KAAKvK,MAE9BA,KAAKwnE,cAAe,EACpBxnE,KAAK6wB,WAAaA,EAClB7wB,KAAKqiE,UAAYkF,EAEjB,IAAI55B,EAAS3tC,KAEb6wB,EAAWrnB,KAAK,UAAU,WACtBmkC,EAAOysB,aAGXvpC,EAAWrnB,KAAK,SAAS,WACrBmkC,EAAO85B,YAGXznE,KAAK0nE,sBAEL1nE,KAAK2nE,YAAYL,IAGrBK,YAAa,SAASL,GAClBtnE,KAAKsnE,SAAWA,EAChBtnE,KAAK4nE,gBAGT9gB,GAAI,SAAS/tC,GACT,IAAIilC,EAAWh+C,KAAKg+C,SAChB6pB,GAAc,EAElB,OAAI9uD,GAAS/Y,KAAK+gD,SACd/gD,KAAKoK,QAAQ,aAAc,CAAE2O,MAAOA,IAC7B,MAGN/Y,KAAK23D,UAGN33D,KAAK23D,YAED5+C,EAAQ/Y,KAAK8nE,YAAc/uD,GAAS/Y,KAAKw+C,KAAOR,KAChD6pB,EAAc7nE,KAAKkvD,MAAM7rD,KAAKkN,MAAMwI,EAAQilC,GAAYA,IAIxDjlC,IAAU/Y,KAAK+nE,mBACf/nE,KAAK00D,YAIL37C,IAAU/Y,KAAKgoE,iBACfhoE,KAAKkvD,MAAMlvD,KAAKioE,cAAc,GAGzBlvD,IAAU/Y,KAAKkoE,kBACpBloE,KAAKkvD,MAAMlvD,KAAKmoE,eAGXpvD,IAAU/Y,KAAKooE,oBAChBpoE,KAAK+c,SAAW/c,KAAKw+C,KACrBx+C,KAAKkvD,MAAMlvD,KAAKqoE,kBAEhBroE,KAAKkvD,MAAMlvD,KAAKsoE,oBAIpBT,EACO7nE,KAAK6wB,WAAWi2B,GAAG/tC,EAAQ/Y,KAAK8nE,aAEvC9nE,KAAKoK,QAAQ,aAAc,CAAE2O,MAAOA,IAC7B,YAhCf,EAFU/Y,KAAK6wB,WAAW4G,OAAO1e,IAuCrCpD,QAAS,SAASo5B,GACd,OAAO/uC,KAAK6wB,WAAWhjB,OAAO8H,QAAQo5B,GAAQ/uC,KAAK8nE,YAGvD/mB,MAAO,WACH,OAAO9nC,SAASjZ,KAAK6wB,WAAWkwB,QAAS,KAG7C4f,KAAM,WACF,IAAIhzB,EAAS3tC,KACTg+C,EAAWrQ,EAAOqQ,SAClBjhC,EAAS4wB,EAAO6Q,KAAO7Q,EAAO25B,SAAWtpB,EACzC8jB,EAAW1+D,EAAKwV,IAAIxV,EAAKmN,MAAMwM,EAASihC,GAAW,GAAKA,EAE5Dh+C,KAAK+c,OAASA,EACd/c,KAAK6wB,WAAWwxC,SAASP,EAAU9jB,GAAU,WACzCrQ,EAAO46B,WAAWxrD,GAAQ,OAIlCmyC,MAAO,SAASnyC,EAAQyrD,GACpB,GAAIxoE,KAAK+c,SAAWA,EAChB,OAAO,EAGX,IAAI4wB,EAAS3tC,KACTg+C,EAAWh+C,KAAKg+C,SAChB8jB,EAAW1+D,EAAKwV,IAAIxV,EAAKmN,MAAMwM,EAASihC,GAAW,GAAKA,EACxDntB,EAAa7wB,KAAK6wB,WAMtB,OAJI23C,IACA1G,GAAY9jB,GAGZntB,EAAW4wC,QAAQ1kD,EAAQihC,IAC3Bh+C,KAAK+c,OAASA,EACd/c,KAAK4nE,eACL5nE,KAAKuoE,WAAWxrD,IACT,IACA/c,KAAKqiE,WACZxxC,EAAWwxC,SAASP,EAAU9jB,GAAU,WACpCrQ,EAAO5wB,OAASA,EAChB4wB,EAAOi6B,eACPj6B,EAAO46B,WAAWxrD,GAAQ,OAEvB,IAMf0rD,eAAgB,WACZ,IAAI1rD,EAAS/c,KAAK+c,OAClB/c,KAAK+c,OAAS,KACd/c,KAAKkvD,MAAMnyC,IAGf/a,QAAS,WACLhC,KAAKiK,UAGTyqD,UAAW,WACP,IAAI/mB,EAAS3tC,KACTg+C,EAAWh+C,KAAKg+C,SAChB0qB,EAAiB1oE,KAAKw+C,KAAOR,EAC7BntB,EAAa7wB,KAAK6wB,WAEjBA,EAAW4wC,QAAQiH,EAAgB1qB,IAAch+C,KAAKwnE,eAAgBxnE,KAAKqiE,WAC5EriE,KAAKwnE,cAAe,EACpBxnE,KAAKoK,QAAQ,cAAe,CAAEo0C,KAAMkqB,EAAgBhqB,KAAMV,IAE1DntB,EAAWwxC,SAASqG,EAAgB1qB,GAAU,WAC1CrQ,EAAO65B,cAAe,EACtB75B,EAAOvjC,QAAQ,aAAc,CAAEo0C,KAAMkqB,EAAgBhqB,KAAMV,SAKvEuqB,WAAY,SAASxrD,EAAQ4rD,GACrB3oE,KAAK+c,SAAWA,IAIpB/c,KAAK8nE,WAAa/qD,EAClB/c,KAAK4oE,WAAaD,EAClB3oE,KAAK6wB,WAAWq+B,MAAMnyC,EAAQ/c,KAAKg+C,UACnCh+C,KAAK6wB,WAAWgxC,6BAGpB4F,OAAQ,WACJznE,KAAK6oE,cAAe,GAGxBzO,QAAS,WACL,IAAIvpC,EAAa7wB,KAAK6wB,WAEtB7wB,KAAKwH,OAASxH,KAAK23D,UAAY9mC,EAAW8wC,YAAYh2D,IAAMklB,EAAW4G,OAAOjwB,OAE1ExH,KAAK6oE,eACL7oE,KAAK0nE,sBACL1nE,KAAK4nE,eACL5nE,KAAK6oE,cAAe,EACpB7oE,KAAKoK,QAAQ,QAAS,CAAE2S,OAAQ/c,KAAK+c,UAGzC/c,KAAKoK,QAAQ,UAETpK,KAAK4oE,YACL5oE,KAAKoK,QAAQ,iBAGVpK,KAAK4oE,YAGhBlB,oBAAqB,WACjB,IAAI72C,EAAa7wB,KAAK6wB,WAEtB7wB,KAAK8oE,cAAgBj4C,EAAW+wC,eAChC5hE,KAAK8nE,WAAa9nE,KAAK+c,OAAS8T,EAAW2tB,QAAU,EACrDx+C,KAAKg+C,SAAWntB,EAAWmtB,WAC3Bh+C,KAAK23D,UAAY9mC,EAAW3pB,QAAQ2vD,cAGxC+Q,aAAc,WACV,IAAI5pB,EAAWh+C,KAAKg+C,SAChBjhC,EAAS/c,KAAK+c,OACduqD,EAAWtnE,KAAKsnE,SAChB9oB,EAAOn7C,KAAKm+D,KAAKzkD,EAASihC,GAAYA,EAE1Ch+C,KAAKw+C,KAAOA,EACZx+C,KAAKgoE,iBAAmBxpB,EAAOR,EAAW,EAC1Ch+C,KAAKkoE,kBAAoB1pB,EAAO8oB,EAAW,EAC3CtnE,KAAK+nE,kBAAoBvpB,EAAOn7C,KAAKkN,MAAMytC,EAAW,EAAI,GAC1Dh+C,KAAKooE,kBAAoBpoE,KAAK+c,OAAS,EAEvC/c,KAAKioE,aAAezpB,EAAOR,EAAWspB,EACtCtnE,KAAKmoE,cAAgB3pB,EACrBx+C,KAAKqoE,iBAAmBtrD,EAASuqD,EACjCtnE,KAAKsoE,kBAAoB9pB,EAAOR,KAIpC+qB,GAAcpoE,EAAM2I,WAAWvG,OAAO,CACtCoF,KAAM,SAAS0oB,EAAYm4C,GACvB,IAAIC,EAAcjpE,KAElBW,EAAM2I,WAAWvB,GAAGI,KAAKoC,KAAK0+D,GAE9BjpE,KAAK6wB,WAAaA,EAClB7wB,KAAKgpE,UAAYA,EACjBhpE,KAAKw1D,OAAS,EAEdx1D,KAAK2tC,OAAS,IAAI05B,GAAOx2C,EAAwB,EAAZm4C,GAErChpE,KAAK2tC,OAAOnkC,KAAK,CACb0/D,WAAc,SAASvkE,GACnBskE,EAAY7+D,QAAQ,aAAc,CAAE2O,MAAOpU,EAAEoU,SAEjDowD,YAAe,SAASxkE,GACpBskE,EAAY7+D,QAAQ,cAAe,CAAEo0C,KAAM75C,EAAE65C,KAAME,KAAM/5C,EAAE+5C,QAE/D0qB,WAAc,SAASzkE,GACnBskE,EAAY7+D,QAAQ,aAAc,CAAEo0C,KAAM75C,EAAE65C,KAAME,KAAM/5C,EAAE+5C,QAE9DlJ,MAAS,WACLyzB,EAAYzT,OAAS,EACrByT,EAAY7+D,QAAQ,UAExBkf,OAAU,WACN2/C,EAAYzT,OAASnyD,KAAKm+D,KAAKxhE,KAAKwH,OAASyhE,EAAYD,WACzDC,EAAY7+D,QAAQ,SAAU,CAAE22C,MAAOkoB,EAAYloB,QAAShkC,OAAQ/c,KAAK+c,aAKrF0rD,eAAgB,WACZzoE,KAAK2tC,OAAO86B,kBAGhB3hB,GAAI,SAAS/tC,GACT,IAIIg2B,EAJApB,EAAS3tC,KAAK2tC,OACd6Q,EAAOzlC,EAAQ/Y,KAAKgpE,UACpBtqB,EAAO1+C,KAAKgpE,UACZvxC,EAAO,GAGPkW,EAAO5wB,OAASyhC,GAChB7Q,EAAOmZ,GAAGnZ,EAAO5wB,OAAS,GAG9B,IAAK,IAAIxV,EAAI,EAAGA,EAAIm3C,GAGH,QAFb3P,EAAOpB,EAAOmZ,GAAGtI,EAAOj3C,IADFA,IAOtBkwB,EAAK91B,KAAKotC,GAGd,OAAOtX,GAGXspB,MAAO,WACH,OAAO/gD,KAAKw1D,QAGhBxzD,QAAS,WACLhC,KAAK2tC,OAAO3rC,UACZhC,KAAKiK,YAIblH,GAAO,EAAMpC,EAAMkN,KAAM,CACrB22C,QAAS,CACLwC,KAAMqL,IAEV/G,MAAOA,GACPv9C,WAAYA,GACZC,uBAAwBA,GACxBu3D,KAAMA,GACNnb,SAAUA,GACV1D,iBAAkBA,EAClB94C,gBAAiBA,EACjBE,oBAAqBA,EACrBmjD,eAAgBA,GAChBC,gBAAiBA,GACjBC,MAAOA,GACPkB,WAAYA,GACZhP,MAAOA,GACPgkB,OAAQA,GACR0B,YAAaA,KA/+MrB,CAi/MGjoE,OAAOH,MAAM+G,QACF/G,OAUd,SAAUgC,GACN,IAAIhC,EAAQG,OAAOH,MACfuI,EAAavI,EAAMuI,WAEvB,SAASmgE,EAAgBriD,GACrB,OAAOA,GAAW9d,EAAW8d,EAAQulB,OAASrjC,EAAW8d,EAAQwlB,MAGrE,SAAS88B,EAAgBtiD,GACrB,OAAOA,GAAW9d,EAAW8d,EAAQizC,OAAS/wD,EAAW8d,EAAQuiD,OAGrE,IAAI5pB,EAAYh/C,EAAMkN,KAAKqjD,gBAAgBnuD,OAAO,CAC9CoF,KAAM,SAASjB,GACX,IAAIsiE,EAAUtiE,GAAWA,EAAQsiE,QAAUtiE,EAAQsiE,QAAU,GAEzDxiD,EAAUwiD,EAAQxiD,QAEtB,IAAKA,EACD,MAAM,IAAIvW,MAAM,qCAGpB,IAAK44D,EAAgBriD,KAAasiD,EAAgBtiD,GAC9C,MAAM,IAAIvW,MAAM,2CAGpBzQ,KAAKgnB,QAAUA,EAEf,IAAIyiD,EAAMD,EAAQC,IAElB,IAAKA,EACD,MAAM,IAAIh5D,MAAM,iCAGpB,GAAqB,mBAAVg5D,EAAIzgD,IAAyC,mBAAdygD,EAAIC,OAC1C,MAAM,IAAIj5D,MAAM,sDAGpBzQ,KAAKypE,IAAMA,EAEX9oE,EAAMkN,KAAKqjD,gBAAgBnpD,GAAGI,KAAKoC,KAAKvK,KAAMkH,IAGlDvF,KAAM,SAASgoE,GACX,IAAInlC,EAASxkC,KAAKkH,QAAQsiE,QAAQhlC,QAAU,GAExCA,EAAO2c,QACPnhD,KAAKypE,IAAIzgD,GAAGwb,EAAO2c,OAAQwoB,EAAU9T,YAGrCrxB,EAAO0c,QACPlhD,KAAKypE,IAAIzgD,GAAGwb,EAAO0c,OAAQyoB,EAAU5T,YAGrCvxB,EAAOxiC,SACPhC,KAAKypE,IAAIzgD,GAAGwb,EAAOxiC,QAAS2nE,EAAU1T,cAI9C2T,MAAO,SAAS1iE,EAASxB,GACrB,IAAI+jE,EAAMzpE,KAAKypE,IACXziD,EAAUhnB,KAAKgnB,QACf6iD,EAAS7pE,KAAKkH,QAAQsiE,QAAQK,OAElC,IAAKA,IAAWA,EAAOnkE,GACnB,MAAM,IAAI+K,MAAM9P,EAAM+P,OAAO,uCAAwChL,IAGzE,IAAIwxB,EAAO,CAAC2yC,EAAOnkE,IAEfmI,EAAO7N,KAAKohD,aAAal6C,EAAQ2G,KAAMnI,GAEtC/C,EAAEgzB,cAAc9nB,IACjBqpB,EAAKv1B,KAAKkM,GAGVw7D,EAAgBriD,GAChBA,EAAQulB,MAAK,WACTk9B,EAAIC,OAAOthE,MAAMqhE,EAAKvyC,GACXqV,KAAKrlC,EAAQg7C,SACb1V,KAAKtlC,EAAQ4mB,UAErBw7C,EAAgBtiD,IACvBA,EAAQizC,MAAK,WACTwP,EAAIC,OAAOthE,MAAMqhE,EAAKvyC,GACX+iC,KAAK/yD,EAAQg7C,SACbqnB,MAAMriE,EAAQ4mB,WAKrC+wB,KAAM,SAAS33C,GACXlH,KAAK4pE,MAAM1iE,EAAS,SAGxBi6C,OAAQ,SAASj6C,GACblH,KAAK4pE,MAAM1iE,EAAS,WAGxBg6C,OAAQ,SAASh6C,GACblH,KAAK4pE,MAAM1iE,EAAS,WAGxBlF,QAAS,SAASkF,GACdlH,KAAK4pE,MAAM1iE,EAAS,cAI5BvE,EAAEI,QAAO,EAAMpC,EAAMkN,KAAM,CACvBmzC,WAAY,CACRwoB,QAAS7pB,KA9GrB,CAkHG7+C,OAAOH,MAAM+G,QACF/G,OAWd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACfmpE,EAASnpE,EAAMgtB,WACfrkB,EAAa3I,EAAM2I,WACnBo9C,EAAmB/lD,EAAMkN,KAAK64C,iBAC9B94C,EAAkBjN,EAAMkN,KAAKD,gBAC7BsD,EAAW,GAAGA,SACd64D,EAAU,GACVniE,EAAQjH,EAAMiH,MACdoiE,EAAQ,QACRC,EAAS,SACTC,EAAS,SACTC,EAAU,UAEVC,GAAgB,EAEhBtkB,EAAS,UAEb,WACI,IAAI5gD,EAAIkK,SAASyO,cAAc,KAE/B,WACW3Y,EAAE6H,KACX,MAAOpI,GACLylE,GAAgB,GANxB,GAUA,IAAIC,EAAU/gE,EAAWvG,OAAQ,CAC7BoF,KAAM,SAASiwB,EAAS+W,GACpB,IAAIlnC,EAAOjI,KAEXsJ,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExBA,EAAKqF,OAAS8qB,EAAQ,GACtBnwB,EAAKmwB,QAAUA,EACfnwB,EAAKknC,KAAOA,EACZlnC,EAAKqiE,aAAe,GACpBriE,EAAKqiE,aAAan7B,IAAQ,EAC1BlnC,EAAKwmC,WAAaxmC,EAAKqF,kBAAkBhE,EAEzCrB,EAAKsiE,QAAU,SAAS5lE,GACpBsD,EAAKqiE,aAAa3lE,EAAEqgB,QAAS,GAG7B/c,EAAKwmC,aACLxmC,EAAKmyD,QAAU,SAASz1D,GACpBsD,EAAK+gD,OAAOrkD,IAGhBsD,EAAKqF,OAAO9D,KAAKs8C,EAAQ79C,EAAKmyD,WAItCoQ,SAAU,WACN,IAAIpyC,EAAUp4B,KAAKo4B,QACf1vB,EAAQ1I,KAAKsvB,MAEjB,GAAI5mB,GAAgC,mBAAhBA,EAAMyD,OAAsB,CAC5C,IAAIA,EAASzD,EAAMyD,SAEfxJ,EAAEyyB,QAAQjpB,EAAQisB,GAAW,IAC7BA,EAAU,CAACjsB,GAAQiR,OAAOgb,IAIlC,OAAOA,GAGX4wB,OAAQ,SAASrkD,GACb,IAAI8lE,EACAhzD,EACAuN,EAAQrgB,EAAEqgB,MACV/c,EAAOjI,KAEX,GAAkB,SAAdiI,EAAKknC,KACLlnC,EAAKmC,QAAQ07C,EAAQnhD,QAErB,IAAK8lE,KAAcxiE,EAAKqiE,aACpB,GAAkC,IAA9BG,EAAW90D,QAAQqP,OACpBvN,EAAKgzD,EAAW3/D,OAAOka,EAAMxd,UAEX,MAAPiQ,GAAqB,MAAPA,GAAY,CAChCxP,EAAKmC,QAAQ07C,EAAQnhD,GACrB,QAOpB2Q,MAAO,SAAShI,GACZA,EAAO9D,KAAK,MAAOxJ,KAAKuqE,UAG5B5iD,KAAM,SAASra,GACXA,EAAOrD,OAAO,MAAOjK,KAAKuqE,UAG9Bj7C,IAAK,WAED,IAAIrnB,EAAOjI,KACPsN,EAASrF,EAAKqF,OACdyL,EAAQ,EACRo2B,EAAOlnC,EAAKknC,KACZ54B,EAASjJ,EAEb,IAAKrF,EAAKwmC,WACN,OAAOl4B,EAQX,IALAtO,EAAKqN,MAAMrN,EAAKqF,QAEhBiJ,EAASjJ,EAAOgiB,IAAI6f,GAGb54B,IAAW3T,GAAe0K,IAE7BA,EAASrF,EAAKmwB,UAAUrf,cAEF2tC,IAClBnwC,EAASjJ,EAAOgiB,IAAI6f,IAK5B,GAAI54B,IAAW3T,EAGX,IAFA0K,EAASrF,EAAKqF,OAEPiJ,IAAW3T,GAAe0K,IAC7BA,EAASA,EAAOnB,oBAEMu6C,IAClBnwC,EAASjJ,EAAOgiB,IAAI6f,IAsChC,MAhCsB,mBAAX54B,KACPwC,EAAQo2B,EAAKz2B,YAAY,MAGb,IACRpL,EAASA,EAAOgiB,IAAI6f,EAAKnkC,UAAU,EAAG+N,KAI1C9Q,EAAKqN,MAAMhI,GAGPiJ,EADAjJ,IAAWrF,EAAKqF,OACPiJ,EAAOhM,KAAK+C,EAAQrF,EAAKqF,QAEzBiJ,EAAOhM,KAAK+C,GAGzBrF,EAAK0f,KAAKra,IAIVA,GAAUA,IAAWrF,EAAKqF,SAE1BrF,EAAKyiE,cAAgBp9D,EAGrBA,EAAOrD,OAAO67C,EAAQ79C,EAAKmyD,SACpB5wD,KAAKs8C,EAAQ79C,EAAKmyD,UAG7BnyD,EAAK0f,KAAK1f,EAAKqF,QAERiJ,GAGXgZ,IAAK,SAAS7mB,GACV,IAAI4E,EAAStN,KAAK0qE,eAAiB1qE,KAAKsN,OAEpC0X,EAAQrkB,EAAMkuB,OAAO7uB,KAAKmvC,KAAlBxuC,CAAwB2M,GAEf,mBAAV0X,EACH1X,IAAWtN,KAAKsN,OAChB0X,EAAMza,KAAK+C,EAAQtN,KAAKsN,OAAQ5E,GAEhCsc,EAAMza,KAAK+C,EAAQ5E,GAGvB4E,EAAOiiB,IAAIvvB,KAAKmvC,KAAMzmC,IAI9B1G,QAAS,WACDhC,KAAKyuC,aACLzuC,KAAKsN,OAAOrD,OAAO67C,EAAQ9lD,KAAKo6D,SAC5Bp6D,KAAK0qE,eACL1qE,KAAK0qE,cAAczgE,OAAO67C,EAAQ9lD,KAAKo6D,UAI/Cp6D,KAAKiK,YAIT0gE,EAAeN,EAAQtnE,OAAQ,CAC/BusB,IAAK,WACD,IAGIxlB,EAHAwD,EAAStN,KAAKsN,OACd6hC,EAAOnvC,KAAKmvC,KACZp2B,EAAQ,EAKZ,IAFAjP,EAAUwD,EAAOgiB,IAAI6f,IAEbrlC,GAAWwD,IACfA,EAAStN,KAAKo4B,UAAUrf,cAEF2tC,IAClB58C,EAAUwD,EAAOgiB,IAAI6f,IAI7B,GAAKrlC,EAIL,OAAOA,EAAQN,KAAK8D,MAIxBs9D,EAAkBP,EAAQtnE,OAAQ,CAClCoF,KAAM,SAASmF,EAAQ6hC,EAAMt/B,GAGzBw6D,EAAQtiE,GAAGI,KAAKoC,KAFLvK,KAEgBsN,EAAQ6hC,GAFxBnvC,KAIN6P,SAAWA,GAGpBD,OAAQ,SAASlH,GACb,IAAIoH,EAQJ,OANA9P,KAAKsV,MAAMtV,KAAKsN,QAEhBwC,EAAOnP,EAAMiP,OAAO5P,KAAK6P,SAAUnH,GAEnC1I,KAAK2nB,KAAK3nB,KAAKsN,QAERwC,KAIX+6D,EAASjjE,EAAM7E,OAAO,CACtBoF,KAAM,SAAS0D,EAASi/D,EAAU5jE,GAC9BlH,KAAK6L,QAAUA,EACf7L,KAAK8qE,SAAWA,EAChB9qE,KAAKkH,QAAUA,GAGnBsC,KAAM,SAASuhE,EAASjjC,GACpB,IAAI7/B,EAAOjI,MAEX+qE,EAAUjjC,EAAYijC,EAAQjjC,GAAaijC,GAEnCvhE,KAAKs8C,GAAQ,SAASnhD,GAC1BsD,EAAK0V,QAAQmqB,GAAanjC,MAG9BsD,EAAK0V,QAAQmqB,IAGjB9lC,QAAS,eAITgpE,EAAcH,EAAO9nE,OAAO,CAC5B+7C,SAAU,WAEN,OADe9+C,KAAK6L,QAAQipB,aAAa,QAAUn0B,EAAM4qB,GAAK,SAAWvrB,KAAK6L,QAAQnG,MAAQ,QAC9E4S,eAGpB2yD,YAAa,WACT,OAAOjrE,KAAKkrE,YAAYlrE,KAAK6L,QAAQnD,MAAO1I,KAAK8+C,aAGrDosB,YAAa,SAASxiE,EAAOo2C,GAezB,MAdgB,QAAZA,EACAp2C,EAAQ/H,EAAM2c,UAAU5U,EAAO,cACZ,kBAAZo2C,EACPp2C,EAAQ/H,EAAM2c,UAAU5U,EAAO,CAAC,sBAAuB,qBACpC,UAAZo2C,EACPp2C,EAAQ/H,EAAMoI,WAAWL,GACN,WAAZo2C,IACPp2C,EAAQA,EAAM4P,cAEV5P,EAD4B,OAA5B/H,EAAMoI,WAAWL,GACT6J,QAAQ5R,EAAMoI,WAAWL,IAEA,SAAxBA,EAAM4P,eAGhB5P,KA+kBf,SAASyiE,EAAkBC,EAAazhB,EAAW76B,GAC/C,OAAO+7C,EAAO9nE,OAAO,CACjBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B,IAAIe,EAAOjI,KAEX6qE,EAAO9iE,GAAGI,KAAKoC,KAAKtC,EAAM4qB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDe,EAAK4qB,OAASA,EACd5qB,EAAKojE,aAAepjE,EAAKqjE,YAAY9hE,KAAKvB,GAC1CA,EAAKsjE,WAAatjE,EAAKujE,UAAUhiE,KAAKvB,GACtCA,EAAKwjE,YAAcxjE,EAAKyjE,WAAWliE,KAAKvB,IAG5CyjE,WAAY,SAAS/mE,GACjBgnE,EAAYhnE,EAAEoqC,KAAK,GAAIpqC,EAAEkJ,KAAM7N,KAAK4rE,IAAIjnE,EAAE4mB,IAAK,CAAC5mB,EAAEkJ,MAAMuP,OAAOpd,KAAK8qE,SAASM,GAAaZ,cAG9Fc,YAAa,SAAS3mE,GAClB,IAAIiF,EACApC,EACAqrB,EAAS7yB,KAAK6yB,OACdsB,EAAQxvB,EAAEknE,cAAgBh5C,EAAOsB,QAErC,IAAKvqB,EAAM,EAAGpC,EAAS2sB,EAAM3sB,OAAQoC,EAAMpC,EAAQoC,IAC/CkiE,EAAkB33C,EAAMvqB,IAAM,IAItCgiE,IAAK,SAASrgD,GACVA,EAAKA,GAAM5qB,EAAM+oB,GACjB,IAAIqiD,EAAM,CAAEprE,EAAM+oB,GAAI/oB,EAAMkpB,QAAQH,GAAI/oB,EAAMipB,OAAOF,IAIrD,OAHAqiD,EAAIvhE,OAAO7H,EAAEyyB,QAAQ7J,EAAIwgD,GAAM,GAC/BA,EAAI5hE,QAAQohB,GAEL5qB,EAAMi1B,oBAAoBm2C,IAGrCP,UAAW,SAAS7mE,GAChB,IAAIiF,EACApC,EAIAiwB,EACAW,EAJAvF,EAAS7yB,KAAK6yB,OACdsB,EAAQxvB,EAAEqnE,YAAcn5C,EAAOsB,QAC/BtD,EAAagC,EAAO82B,GAGpBsiB,EAAMtrE,EAAMkN,KAAKG,uBAErB,KAAIi+D,GAAOp7C,aAAsBo7C,IAM7B93C,EAAM3sB,OAIN,IAHAiwB,EAAO9yB,EAAEunE,gBAAkBr7C,EAAWkD,WACtCqE,EAAUp4B,KAAK8qE,SAASM,GAAaZ,WAEhC5gE,EAAM,EAAGpC,EAASiwB,EAAKjwB,OAAQoC,EAAMpC,EAAQoC,IAC1CuqB,EAAMvqB,IACN+hE,EAAYx3C,EAAMvqB,GAAM6tB,EAAK7tB,GAAM5J,KAAK4rE,IAAIjnE,EAAE4mB,IAAK,CAACkM,EAAK7tB,IAAMwT,OAAOgb,KAMtFza,QAAS,SAAShZ,GACd,IACI2I,EAEA64B,EAAQgmC,EAHRlkE,EAAOjI,KAEP6yB,EAAS5qB,EAAK4qB,QAGlBluB,EAAIA,GAAK,IAEFooC,SACH9kC,EAAKjG,UAEL6wB,EAAOrpB,KAAK,cAAevB,EAAKojE,cAChCx4C,EAAOrpB,KAAK,YAAavB,EAAKsjE,YAC9B14C,EAAOrpB,KAAK,aAAcvB,EAAKwjE,aAE/Bn+D,EAASrF,EAAK6iE,SAASM,GAAa97C,MAEhCuD,EAAO82B,aAAsBhpD,EAAMkN,KAAKE,YAAc8kB,EAAO82B,IAAcr8C,IACvEA,aAAkB3M,EAAMkN,KAAKE,WAC7B8kB,EAAO/D,GAAQxhB,GACRA,GAAUA,EAAO85D,YACxBv0C,EAAO/D,GAAQxhB,EAAO85D,cAEtBjhC,EAASxlC,EAAM+oB,GAAG0iD,QAAUv5C,aAAkBlyB,EAAM+oB,GAAG0iD,OACvDD,EAAcxrE,EAAM+oB,GAAG2iD,aAAex5C,aAAkBlyB,EAAM+oB,GAAG2iD,YAClD1rE,EAAM+oB,GAAG4iD,cAAgBz5C,aAAkBlyB,EAAM+oB,GAAG4iD,aAK/Dz5C,EAAO05C,SAAS5iB,GAAW97C,KAAKP,GAFhCulB,EAAO82B,GAAW97C,KAAKP,GAKvBrF,EAAK6iE,SAASpiE,QAAUy9B,GAAUgmC,IAClCt5C,EAAOnqB,MAAM8jE,EAAwBvkE,EAAK6iE,SAASpiE,MAAM4mB,MAAOuD,EAAO3rB,QAAQulE,qBAOnGzqE,QAAS,WACL,IAAI6wB,EAAS7yB,KAAK6yB,OAElBA,EAAO5oB,OAAO,cAAejK,KAAKqrE,cAClCx4C,EAAO5oB,OAAO,YAAajK,KAAKurE,YAChC14C,EAAO5oB,OAAO,aAAcjK,KAAKyrE,gBA1rB7C1B,EAAQhnD,KAAO8nD,EAAO9nE,OAAO,CACzB4a,QAAS,SAASpM,GACdvR,KAAK6L,QAAQ+Y,aAAarT,EAAKvR,KAAK8qE,SAAS/nD,KAAKxR,GAAK+d,UAI/Dy6C,EAAQn9D,IAAMi+D,EAAO9nE,OAAO,CACxBoF,KAAM,SAAS0D,EAASi/D,EAAU5jE,GAC9B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6L,EAASi/D,EAAU5jE,GAC7ClH,KAAK8nB,QAAU,IAEnBnK,QAAS,SAAS8O,GACd,IAAI5gB,EAAUlJ,EAAE3C,KAAK6L,SACjBk/D,EAAU/qE,KAAK8qE,SAASl+D,IAAI6f,IACjBzsB,KAAK8nB,QAAQ2E,GAAas+C,EAAQz7C,OAE7CzjB,EAAQyY,SAASmI,GAEjB5gB,EAAQqgB,YAAYO,MAKhCs9C,EAAQt9D,MAAQo+D,EAAO9nE,OAAO,CAC1B4a,QAAS,SAASpM,GACdvR,KAAK6L,QAAQY,MAAM8E,GAAOvR,KAAK8qE,SAASr+D,MAAM8E,GAAK+d,OAAS,MAIpEy6C,EAAQ9iD,QAAU4jD,EAAO9nE,OAAO,CAC5B4a,QAAS,WACD3d,KAAK8qE,SAAS7jD,QAAQqI,MACtBtvB,KAAK6L,QAAQk8B,gBAAgB,YAE7B/nC,KAAK6L,QAAQ+Y,aAAa,WAAY,eAKlDmlD,EAAQ2C,SAAW7B,EAAO9nE,OAAO,CAC9B4a,QAAS,WACA3d,KAAK8qE,SAAS4B,SAASp9C,MACvBtvB,KAAK6L,QAAQ+Y,aAAa,WAAY,YAEtC5kB,KAAK6L,QAAQk8B,gBAAgB,eAKzCgiC,EAAQ9xC,SAAW4yC,EAAO9nE,OAAO,CAC7B4a,QAAS,WACD3d,KAAK8qE,SAAS7yC,SAAS3I,MACvBtvB,KAAK6L,QAAQ+Y,aAAa,WAAY,YAEtC5kB,KAAK6L,QAAQk8B,gBAAgB,eAKzCgiC,EAAQ1/D,OAASwgE,EAAO9nE,OAAO,CAC3BoF,KAAM,SAAS0D,EAASi/D,EAAU5jE,GAC9B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6L,EAASi/D,EAAU5jE,GAC7ClH,KAAK0J,SAAW,IAGpBiU,QAAS,SAASpM,GACd,IAAI1F,EAAUlJ,EAAE3C,KAAK6L,SACjBk/D,EAAU/qE,KAAK8qE,SAASzgE,OAAOkH,GAC/BzH,EAAU9J,KAAK0J,SAAS6H,GAExBzH,GACA+B,EAAQmtB,IAAIznB,EAAKzH,GAGrBA,EAAU9J,KAAK0J,SAAS6H,GAAOw5D,EAAQz7C,MAEvCzjB,EAAQmd,GAAGzX,EAAKw5D,EAAQz9D,OAAQxD,IAGpC9H,QAAS,WACL,IACI8H,EADA+B,EAAUlJ,EAAE3C,KAAK6L,SAGrB,IAAK/B,KAAW9J,KAAK0J,SACjBmC,EAAQmtB,IAAIlvB,EAAS9J,KAAK0J,SAASI,OAK/CigE,EAAQppC,KAAOkqC,EAAO9nE,OAAO,CACzB4a,QAAS,WACL,IAAIgjB,EAAO3gC,KAAK8qE,SAASnqC,KAAKrR,MAC1Bq9C,EAAa3sE,KAAK6L,QAAQipB,aAAa,QAAUn0B,EAAM4qB,GAAK,WAAa,GACjE,MAARoV,IACAA,EAAO,IAGXh+B,EAAE3C,KAAK6L,SAAS80B,KAAKhgC,EAAMuQ,SAASyvB,EAAMgsC,OAIlD5C,EAAQz9D,QAAUu+D,EAAO9nE,OAAO,CAC5B4a,QAAS,WACD3d,KAAK8qE,SAASx+D,QAAQgjB,MACtBtvB,KAAK6L,QAAQY,MAAMI,QAAU,GAE7B7M,KAAK6L,QAAQY,MAAMI,QAAU,UAKzCk9D,EAAQ6C,UAAY/B,EAAO9nE,OAAO,CAC9B4a,QAAS,WACA3d,KAAK8qE,SAAS8B,UAAUt9C,MAGzBtvB,KAAK6L,QAAQY,MAAMI,QAAU,OAF7B7M,KAAK6L,QAAQY,MAAMI,QAAU,MAOzCk9D,EAAQj6D,KAAO+6D,EAAO9nE,OAAO,CACzB4a,QAAS,WACL3d,KAAK6L,QAAQkS,UAAY/d,KAAK8qE,SAASh7D,KAAKwf,SAIpDy6C,EAAQrhE,MAAQsiE,EAAYjoE,OAAO,CAC/BoF,KAAM,SAAS0D,EAASi/D,EAAU5jE,GAC9B8jE,EAAYjjE,GAAGI,KAAKoC,KAAKvK,KAAM6L,EAASi/D,EAAU5jE,GAElDlH,KAAKo6D,QAAUp6D,KAAKgpD,OAAOx/C,KAAKxJ,MAChCA,KAAKyJ,UAAYvC,EAAQ2lE,aAAe/mB,EAExCnjD,EAAE3C,KAAK6L,SAASmd,GAAGhpB,KAAKyJ,UAAWzJ,KAAKo6D,SAExCp6D,KAAK8sE,aAAc,GAGvB9jB,OAAQ,WACJhpD,KAAK8sE,YAAc9sE,KAAKyJ,WAAaq8C,EAErC9lD,KAAK8qE,SAAc,MAAEv7C,IAAIvvB,KAAKirE,eAE9BjrE,KAAK8sE,aAAc,GAGvBnvD,QAAS,WACL,IAAK3d,KAAK8sE,YAAa,CACnB,IAAIpkE,EAAQ1I,KAAK8qE,SAAc,MAAEx7C,MAEpB,MAAT5mB,IACAA,EAAQ,IAGZ,IAAIhD,EAAO1F,KAAK8+C,WAEJ,QAARp5C,EACAgD,EAAQ/H,EAAMuQ,SAASxI,EAAO,cACf,kBAARhD,IACPgD,EAAQ/H,EAAMuQ,SAASxI,EAAO,wBAGlC1I,KAAK6L,QAAQnD,MAAQA,EAGzB1I,KAAK8sE,aAAc,GAGvB9qE,QAAS,WACLW,EAAE3C,KAAK6L,SAASmtB,IAAIh5B,KAAKyJ,UAAWzJ,KAAKo6D,YAIjD2P,EAAQz8D,OAASu9D,EAAO9nE,OAAO,CAC3BoF,KAAM,SAAS0D,EAASi/D,EAAU5jE,GAC9B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6L,EAASi/D,EAAU5jE,GAE7C,IAAIoG,EAAStN,KAAK8qE,SAASx9D,OAAOgiB,MAE9BhiB,aAAkB3M,EAAMkN,KAAKE,aAAmC,IAArB7G,EAAQ6lE,UACnDz/D,EAAOmzD,SAIf9iD,QAAS,SAAShZ,GACd,IAAIsD,EAAOjI,KACPsN,EAASrF,EAAK6iE,SAASx9D,OAAOgiB,MAE9BhiB,aAAkBM,GAAmBN,aAAkB3M,EAAMkN,KAAKE,WAGlD,QAFhBpJ,EAAIA,GAAK,IAEHooC,OACF9kC,EAAKgF,IAAItI,EAAEoU,MAAOpU,EAAEwvB,OACD,UAAZxvB,EAAEooC,OACT9kC,EAAK6uB,OAAOnyB,EAAEoU,MAAOpU,EAAEwvB,OACJ,cAAZxvB,EAAEooC,QACT9kC,EAAK2H,SAGT3H,EAAK2H,UAIbymB,UAAW,WACP,IAAIxqB,EAAU7L,KAAK6L,QASnB,MAPsC,SAAlCA,EAAQmsB,SAAS1f,gBACZzM,EAAQi5D,QAAQ,IACjBj5D,EAAQoS,YAAY7O,SAASyO,cAAc,UAE/ChS,EAAUA,EAAQi5D,QAAQ,IAGvBj5D,GAGXgE,SAAU,WACN,IAAI3I,EAAUlH,KAAKkH,QACf2I,EAAW3I,EAAQ2I,SACnBmoB,EAAWh4B,KAAKq2B,YAAY2B,SAAS1f,cAuBzC,OArBKzI,IAGOA,EAFQ,UAAZmoB,EACI9wB,EAAQ8lE,YAAc9lE,EAAQ8/D,UACnB,SAAUn5D,GACjB,IAAIo/D,EAAYtsE,EAAMkuB,OAAO3nB,EAAQ8lE,YAAc9lE,EAAQ8/D,UAA3CrmE,CAAsDkN,GAClEq/D,EAAYvsE,EAAMkuB,OAAO3nB,EAAQ8/D,WAAa9/D,EAAQ8lE,WAA1CrsE,CAAsDkN,GACtE,MAAQ,kBAAsBi8D,EAAOmD,GAAc,KAASnD,EAAOoD,GAAc,aAG1E,SAAUr/D,GAAQ,MAAQ,WAAci8D,EAAOj8D,GAAS,aAEpD,SAAZmqB,EACI,SAAUnqB,GAAQ,MAAQ,WAAci8D,EAAOj8D,GAAS,cAChD,MAAZmqB,GAAgC,MAAZA,EAChB,SAAUnqB,GAAQ,MAAQ,OAAUi8D,EAAOj8D,GAAS,SAEpD,SAAUA,GAAQ,MAAQ,GAAMi8D,EAAOj8D,IAEtDgC,EAAWlP,EAAMkP,SAASA,IAGvBA,GAGX5C,IAAK,SAAS8L,EAAOob,GACjB,IACIiE,EACAxuB,EACApC,EACAi8B,EAJA53B,EAAU7L,KAAKq2B,YAKflvB,EAAQ0E,EAAQshE,WAAU,GAC1BC,EAAYvhE,EAAQqpC,SAASn8B,GAIjC,GAFApW,EAAEwE,GAAO2I,KAAKnP,EAAMiP,OAAO5P,KAAK6P,WAAYskB,IAExChtB,EAAM+tC,SAAS1tC,OAGf,IAFA4wB,EAAUp4B,KAAK8qE,SAASx9D,OAAOk9D,WAE1B5gE,EAAM,EAAGpC,EAAS2sB,EAAM3sB,OAAQoC,EAAMpC,EAAQoC,IAC/C65B,EAAQt8B,EAAM+tC,SAAS,GACvBrpC,EAAQwhE,aAAa5pC,EAAO2pC,GAAa,MACzCzB,EAAYloC,EAAOtP,EAAMvqB,GAAM5J,KAAKkH,QAAQouB,MAAO,CAACnB,EAAMvqB,IAAMwT,OAAOgb,KAKnFtB,OAAQ,SAAS/d,EAAOob,GACpB,IAAIvqB,EAAKiC,EAAU7L,KAAKq2B,YAExB,IAAKzsB,EAAM,EAAGA,EAAMuqB,EAAM3sB,OAAQoC,IAAO,CACrC,IAAI65B,EAAQ53B,EAAQqpC,SAASn8B,GAC7B+yD,EAAkBroC,GAAO,GACrBA,EAAM9d,YAAc9Z,GACpBA,EAAQuS,YAAYqlB,KAKhC7zB,OAAQ,WACJ,IACIwoB,EACAxuB,EACApC,EAHA8F,EAAStN,KAAK8qE,SAASx9D,OAAOgiB,MAI9BzjB,EAAU7L,KAAKq2B,YACfxmB,EAAW7P,KAAK6P,WAEpB,GAAc,MAAVvC,EAYJ,GARIA,aAAkB3M,EAAMkN,KAAKE,aAC7BT,EAASA,EAAOmqB,QAGdnqB,aAAkBM,GAA8C,mBAA1BsD,EAAS3G,KAAK+C,KACtDA,EAAS,CAACA,IAGVtN,KAAK8qE,SAASj7D,UAKd,GAJAy9D,EAAsBzhE,GAAS,GAE/BlJ,EAAEkJ,GAASiE,KAAK9P,KAAK8qE,SAASj7D,SAASD,OAAOtC,IAE1CzB,EAAQqpC,SAAS1tC,OAGjB,IAFA4wB,EAAUp4B,KAAK8qE,SAASx9D,OAAOk9D,WAE1B5gE,EAAM,EAAGpC,EAAS8F,EAAO9F,OAAQoC,EAAMpC,EAAQoC,IAChD+hE,EAAY9/D,EAAQqpC,SAAStrC,GAAM0D,EAAO1D,GAAM5J,KAAKkH,QAAQouB,MAAO,CAAChoB,EAAO1D,IAAMwT,OAAOgb,SAIjGz1B,EAAEkJ,GAASiE,KAAKnP,EAAMiP,OAAOC,EAAUvC,OAKnDy8D,EAAQvlD,MAAQ,CACZ+oD,QAASvC,EAAYjoE,OAAO,CACxBoF,KAAM,SAAS0D,EAASi/D,EAAU5jE,GAC9B8jE,EAAYjjE,GAAGI,KAAKoC,KAAKvK,KAAM6L,EAASi/D,EAAU5jE,GAClDlH,KAAKo6D,QAAUp6D,KAAKgpD,OAAOx/C,KAAKxJ,MAEhC2C,EAAE3C,KAAK6L,SAASm9C,OAAOhpD,KAAKo6D,UAGhCpR,OAAQ,WACJ,IAAIn9C,EAAU7L,KAAK6L,QACfnD,EAAQ1I,KAAK0I,QAEjB,GAAoB,SAAhBmD,EAAQnG,KACRgD,EAAQ1I,KAAKirE,cACbjrE,KAAK8qE,SAAgB,QAAEv7C,IAAI7mB,QACxB,GAAoB,YAAhBmD,EAAQnG,KAAoB,CACnC,IACIqT,EADAzL,EAAStN,KAAK8qE,SAAgB,QAAEx7C,MAGpC,GAAIhiB,aAAkBM,EAAiB,CAEnC,IADAlF,EAAQ1I,KAAKirE,yBACQ78D,MACjB,IAAK,IAAI7G,EAAI,EAAGA,EAAI+F,EAAO9F,OAAQD,IAC/B,GAAI+F,EAAO/F,aAAc6G,OAASd,EAAO/F,KAAQmB,EAAO,CACpDqQ,EAAQxR,EACR,YAIRwR,EAAQzL,EAAOqI,QAAQjN,GAEvBqQ,GAAS,EACTzL,EAAO9C,OAAOuO,EAAO,GAErBzL,EAAO3L,KAAK+G,QAGhB1I,KAAK8qE,SAAgB,QAAEv7C,IAAI7mB,KAKvCiV,QAAS,WACL,IAAIjV,EAAQ1I,KAAK8qE,SAAgB,QAAEx7C,MAC/BhiB,EAAS5E,EACThD,EAAO1F,KAAK8+C,WACZjzC,EAAU7L,KAAK6L,QAEnB,GAAoB,YAAhBA,EAAQnG,KACR,GAAI4H,aAAkBM,EAAiB,CACnC,IAAImL,GAAS,EAEb,IADArQ,EAAQ1I,KAAKirE,yBACQ78D,MACjB,IAAK,IAAI7G,EAAI,EAAGA,EAAI+F,EAAO9F,OAAQD,IAC/B,GAAI+F,EAAO/F,aAAc6G,OAASd,EAAO/F,KAAQmB,EAAO,CACpDqQ,EAAQxR,EACR,YAIRwR,EAAQzL,EAAOqI,QAAQjN,GAE3BmD,EAAQ0hE,QAAWx0D,GAAS,OAE5BlN,EAAQ0hE,QAAUjgE,MAEC,SAAhBzB,EAAQnG,OACH,QAARA,EACAgD,EAAQ/H,EAAMuQ,SAASxI,EAAO,cACf,kBAARhD,IACPgD,EAAQ/H,EAAMuQ,SAASxI,EAAO,wBAG9BA,SAAmDmD,EAAQnD,QAAUA,EAAMwI,WAC3ErF,EAAQ0hE,SAAU,EAElB1hE,EAAQ0hE,SAAU,IAK9B7kE,MAAO,WACH,IAAImD,EAAU7L,KAAK6L,QACfnD,EAAQmD,EAAQnD,MAMpB,MAJoB,YAAhBmD,EAAQnG,OACRgD,EAAQmD,EAAQ0hE,SAGb7kE,GAEX1G,QAAS,WACLW,EAAE3C,KAAK6L,SAASmtB,IAAI8sB,EAAQ9lD,KAAKo6D,aAK7C2P,EAAQ5jC,OAAS,CACb74B,OAAQy8D,EAAQz8D,OAAOvK,OAAO,CAC1B4a,QAAS,SAAShZ,GACd,IAAIsD,EAAOjI,KACPsN,EAASrF,EAAK6iE,SAASx9D,OAAOgiB,MAElC,GAAIhiB,aAAkBM,GAAmBN,aAAkB3M,EAAMkN,KAAKE,YAElE,GAAgB,QADhBpJ,EAAIA,GAAK,IACHooC,OACF9kC,EAAKgF,IAAItI,EAAEoU,MAAOpU,EAAEwvB,YACjB,GAAgB,UAAZxvB,EAAEooC,OACT9kC,EAAK6uB,OAAOnyB,EAAEoU,MAAOpU,EAAEwvB,YACpB,IAAgB,cAAZxvB,EAAEooC,QAA0BpoC,EAAEooC,SAAWnqC,KAChDqF,EAAK2H,SACD3H,EAAK6iE,SAASpiE,OACVT,EAAK6iE,SAASpiE,OAAO,CACrB,IAAIumB,EAAMu9C,EAAwBvkE,EAAK6iE,SAASpiE,MAAM4mB,MAAO3sB,EAAEsF,EAAK4D,SAASgC,KAAK,eACtE,OAARohB,EACAhnB,EAAK4D,QAAQ2hE,eAAiB,EAE9BvlE,EAAK4D,QAAQnD,MAAQumB,QAMrChnB,EAAK2H,YAIjBlH,MAAOsiE,EAAYjoE,OAAO,CACtBoF,KAAM,SAASb,EAAQwjE,EAAU5jE,GAC7B8jE,EAAYjjE,GAAGI,KAAKoC,KAAKvK,KAAMsH,EAAQwjE,EAAU5jE,GAEjDlH,KAAKo6D,QAAUp6D,KAAKgpD,OAAOx/C,KAAKxJ,MAChC2C,EAAE3C,KAAK6L,SAASm9C,OAAOhpD,KAAKo6D,UAGhC6Q,YAAa,WACT,IAEIviE,EAAOmsB,EAAQjrB,EAAKpC,EAFpBs3C,EAAW9+C,KAAK8+C,WAChBhmC,EAAS,GAEb,IAAKlP,EAAM,EAAGpC,EAASxH,KAAK6L,QAAQ3E,QAAQM,OAAQoC,EAAMpC,EAAQoC,KAC9DirB,EAAS70B,KAAK6L,QAAQ3E,QAAQ0C,IAEnB6jE,WAIH/kE,GAHJA,EAAQmsB,EAAOmvB,WAAWt7C,QAEbA,EAAM28D,UACPxwC,EAAOnsB,MAEPmsB,EAAO8L,KAGnB7nB,EAAOnX,KAAK3B,KAAKkrE,YAAYxiE,EAAOo2C,KAG5C,OAAOhmC,GAGXkwC,OAAQ,WACJ,IAEI17C,EAGAunB,EACA64C,EACAhlE,EACAkB,EACApC,EATAsR,EAAS,GACTjN,EAAU7L,KAAK6L,QAEfmZ,EAAQhlB,KAAKkH,QAAQ8lE,YAAchtE,KAAKkH,QAAQ8/D,UAChD2G,EAAiB3tE,KAAKkH,QAAQymE,eAOlC,IAAK/jE,EAAM,EAAGpC,EAASqE,EAAQ3E,QAAQM,OAAQoC,EAAMpC,EAAQoC,KACzDirB,EAAShpB,EAAQ3E,QAAQ0C,IAEd6jE,WAIH/kE,GAHJA,EAAQmsB,EAAOmvB,WAAWt7C,QAEbA,EAAM28D,UACPxwC,EAAOnsB,MAEPmsB,EAAO8L,KAGf3b,EACAlM,EAAOnX,KAAK+G,GAEZoQ,EAAOnX,KAAK3B,KAAKkrE,YAAYxiE,EAAO1I,KAAK8+C,cAMrD,GAAI95B,EAMA,KALA1X,EAAStN,KAAK8qE,SAASx9D,OAAOgiB,iBACR3uB,EAAMkN,KAAKE,aAC7BT,EAASA,EAAOmqB,QAGfi2C,EAAa,EAAGA,EAAa50D,EAAOtR,OAAQkmE,IAC7C,IAAK9jE,EAAM,EAAGpC,EAAS8F,EAAO9F,OAAQoC,EAAMpC,EAAQoC,IAAO,CACvD,IAAIgkE,EAActgE,EAAO1D,GAAK0lB,IAAItK,GAElC,GADalT,OAAO87D,KAAiB90D,EAAO40D,GACjC,CACP50D,EAAO40D,GAAcpgE,EAAO1D,GAC5B,QAMhBlB,EAAQ1I,KAAK8qE,SAAc,MAAEx7C,iBACR1hB,EACjBlF,EAAM8B,OAAOpC,MAAMM,EAAO,CAAC,EAAGA,EAAMlB,QAAQ4V,OAAOtE,IAC3C60D,KAAmBjlE,aAAiBg+C,GAA8B,OAAVh+C,GAAkBA,IAAU9F,IAAgBoiB,EAG5GhlB,KAAK8qE,SAAc,MAAEv7C,IAAIzW,EAAO,GAAGwW,IAAItK,IAFvChlB,KAAK8qE,SAAc,MAAEv7C,IAAIzW,EAAO,KAKxC6E,QAAS,WACL,IAAIkwD,EAQAC,EAPAjiE,EAAU7L,KAAK6L,QACf3E,EAAU2E,EAAQ3E,QAClBwB,EAAQ1I,KAAK8qE,SAAc,MAAEx7C,MAC7BxW,EAASpQ,EACTsc,EAAQhlB,KAAKkH,QAAQ8lE,YAAchtE,KAAKkH,QAAQ8/D,UAEhDthE,EAAO1F,KAAK8+C,WAGVhmC,aAAkBlL,IACpBkL,EAAS,IAAIlL,EAAgB,CAAClF,KAGlCmD,EAAQ2hE,eAAiB,EAEzB,IAAK,IAAIE,EAAa,EAAGA,EAAa50D,EAAOtR,OAAQkmE,IAcjD,IAbAhlE,EAAQoQ,EAAO40D,GAGX1oD,GAAStc,aAAiBg+C,IAC1Bh+C,EAAQA,EAAM4mB,IAAItK,IAGV,QAARtf,EACAgD,EAAQ/H,EAAMuQ,SAAS4H,EAAO40D,GAAa,cAC5B,kBAARhoE,IACPgD,EAAQ/H,EAAMuQ,SAAS4H,EAAO40D,GAAa,wBAG1CG,EAAc,EAAGA,EAAc3mE,EAAQM,OAAQqmE,IAG5B,MAFpBC,EAAc5mE,EAAQ2mE,GAAanlE,QAEC,KAAVA,IACtBolE,EAAc5mE,EAAQ2mE,GAAaltC,MAG1B,MAATj4B,GAAiBolE,GAAeplE,EAAMwI,aACtChK,EAAQ2mE,GAAaJ,UAAW,GACxB,IAKxBzrE,QAAS,WACLW,EAAE3C,KAAK6L,SAASmtB,IAAI8sB,EAAQ9lD,KAAKo6D,aAyH7C2P,EAAQl3C,OAAS,CACbxoB,OAAQwgE,EAAO9nE,OAAO,CAClBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GACvDlH,KAAK6yB,OAASA,EACd7yB,KAAK0J,SAAW,IAGpBiU,QAAS,SAASpM,GACd,IAAIw5D,EAAU/qE,KAAK8qE,SAASzgE,OAAOkH,GAC/BzH,EAAU9J,KAAK0J,SAAS6H,GAExBzH,GACA9J,KAAK6yB,OAAO5oB,OAAOsH,EAAKzH,GAG5BA,EAAUihE,EAAQz7C,MAElBtvB,KAAK0J,SAAS6H,GAAO,SAAS5M,GAC1BA,EAAEkJ,KAAOk9D,EAAQz9D,OAEjBxD,EAAQnF,GAEJA,EAAEkJ,OAASk9D,EAAQz9D,eACZ3I,EAAEkJ,MAIjB7N,KAAK6yB,OAAOrpB,KAAK+H,EAAKvR,KAAK0J,SAAS6H,KAGxCvP,QAAS,WACL,IAAI8H,EAEJ,IAAKA,KAAW9J,KAAK0J,SACjB1J,KAAK6yB,OAAO5oB,OAAOH,EAAS9J,KAAK0J,SAASI,OAKtDyjE,QAAS1C,EAAO9nE,OAAO,CACnBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDlH,KAAK6yB,OAASA,EACd7yB,KAAKo6D,QAAUp6D,KAAKgpD,OAAOx/C,KAAKxJ,MAChCA,KAAK6yB,OAAOrpB,KAAKs8C,EAAQ9lD,KAAKo6D,UAElCpR,OAAQ,WACJhpD,KAAK8qE,SAAgB,QAAEv7C,IAAIvvB,KAAK0I,UAGpCiV,QAAS,WACL,IAAIsR,EAAMjvB,KAAK8qE,SAAgB,QAAEx7C,MAEP,UAAtBtvB,KAAK6L,QAAQnG,KACTupB,IAAQrsB,EACR5C,KAAK6yB,OAAOk7C,MAAM9+C,EAAI/d,aAAelR,KAAK0I,SAE1C1I,KAAK6yB,OAAOk7C,OAAM,GAGtB/tE,KAAK6yB,OAAOk7C,OAAc,IAAR9+C,IAI1BvmB,MAAO,WACH,IAAImD,EAAU7L,KAAK6L,QACfnD,EAAQmD,EAAQnD,MAMpB,MAJa,MAATA,GAA0B,OAATA,GAAuC,YAArB1I,KAAK6L,QAAQnG,OAChDgD,EAAQmD,EAAQ0hE,SAGb7kE,GAGX1G,QAAS,WACLhC,KAAK6yB,OAAO5oB,OAAO67C,EAAQ9lD,KAAKo6D,YAIxC9kD,MAAOu1D,EAAO9nE,OAAO,CACjBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GACvDlH,KAAKo6D,QAAUp6D,KAAKgpD,OAAOx/C,KAAKxJ,MAChCA,KAAK6yB,OAASA,EACd7yB,KAAK6yB,OAAOrpB,KAAKs8C,EAAQ9lD,KAAKo6D,UAGlCpR,OAAQ,WACJhpD,KAAK8qE,SAASx1D,MAAMia,IAAIvvB,KAAK6yB,OAAOq8B,QAAQ55C,QAGhDqI,QAAS,WACL,IACIrI,EAAQtV,KAAK8qE,SAASx1D,MAAMga,MAC5B3jB,EAFO3L,KAEI6yB,OAAOm7C,OAFXhuE,KAEyB6yB,OAAOm7C,OAAOriE,IAAM,KACxD3L,KAAK6yB,OAAOq8B,MAAM,CAAE55C,MAAOA,EAAO3J,IAAKA,KAG3C3J,QAAS,WACLhC,KAAK6yB,OAAO5oB,OAAO67C,EAAQ9lD,KAAKo6D,YAIxCzuD,IAAKk/D,EAAO9nE,OAAO,CACfoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GACvDlH,KAAKo6D,QAAUp6D,KAAKgpD,OAAOx/C,KAAKxJ,MAChCA,KAAK6yB,OAASA,EACd7yB,KAAK6yB,OAAOrpB,KAAKs8C,EAAQ9lD,KAAKo6D,UAGlCpR,OAAQ,WACJhpD,KAAK8qE,SAASn/D,IAAI4jB,IAAIvvB,KAAK6yB,OAAOq8B,QAAQvjD,MAG9CgS,QAAS,WACL,IACIhS,EAAM3L,KAAK8qE,SAASn/D,IAAI2jB,MACxBha,EAFOtV,KAEM6yB,OAAOm7C,OAFbhuE,KAE2B6yB,OAAOm7C,OAAO14D,MAAQ,KAC5DtV,KAAK6yB,OAAOq8B,MAAM,CAAE55C,MAAOA,EAAO3J,IAAKA,KAG3C3J,QAAS,WACLhC,KAAK6yB,OAAO5oB,OAAO67C,EAAQ9lD,KAAKo6D,YAIxC9tD,QAASu+D,EAAO9nE,OAAO,CACnBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDlH,KAAK6yB,OAASA,GAGlBlV,QAAS,WACL,IAAIrR,EAAUtM,KAAK8qE,SAASx+D,QAAQgjB,MACpCtvB,KAAK6yB,OAAOzmB,QAAQ,GAAGK,MAAMI,QAAUP,EAAU,GAAK,UAI9DsgE,UAAW/B,EAAO9nE,OAAO,CACrBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDlH,KAAK6yB,OAASA,GAGlBlV,QAAS,WACL,IAAIivD,EAAY5sE,KAAK8qE,SAAS8B,UAAUt9C,MACxCtvB,KAAK6yB,OAAOzmB,QAAQ,GAAGK,MAAMI,QAAU+/D,EAAY,OAAS,MAIpEqB,cAAepD,EAAO9nE,OAAO,CACzBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAElD2rB,EAAOo7C,eAIZp7C,EAAOo7C,cAActwD,aAI7BsJ,QAAS4jD,EAAO9nE,OAAO,CACnBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDlH,KAAK6yB,OAASA,GAGlBlV,QAAS,WACD3d,KAAK6yB,OAAOvL,QACZtnB,KAAK6yB,OAAOvL,OAAOtnB,KAAK8qE,SAAS7jD,QAAQqI,UAKrD2I,SAAU4yC,EAAO9nE,OAAO,CACpBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDlH,KAAK6yB,OAASA,GAGlBlV,QAAS,WACD3d,KAAK6yB,OAAOvL,QACZtnB,KAAK6yB,OAAOvL,QAAQtnB,KAAK8qE,SAAS7yC,SAAS3I,UAKvDhiB,OAAQ69D,EAAkB,SAAU,aAAc,iBAElDziE,MAAOmiE,EAAO9nE,OAAO,CACjBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDlH,KAAK6yB,OAASA,EACd7yB,KAAKo6D,QAAUp6D,KAAKgpD,OAAOx/C,KAAKxJ,MAChCA,KAAK6yB,OAAO3oB,MAAM47C,EAAQ9lD,KAAKo6D,SAE/B,IAAI1xD,EAAQ1I,KAAK8qE,SAASpiE,MAAM4mB,MAEhCtvB,KAAKkuE,0BAA4BhnE,EAAQymE,iBAA4B,MAATjlE,GAAiBA,aAAiBg+C,GAC9F1mD,KAAKmuE,wBAA0BzlE,aAAiBkF,EAChD5N,KAAK8sE,aAAc,GAGvBsB,QAAS,WACL,IAAI9gE,EAEJ,OAAItN,KAAK6yB,OAAOuB,WACZ9mB,EAAStN,KAAK6yB,OAAOuB,aACP9mB,aAAkBo5C,EACrB,CAACp5C,IAIZtN,KAAK8qE,SAASx9D,SACdA,EAAStN,KAAK8qE,SAASx9D,OAAOgiB,SAG7BhiB,GAAUA,aAAkB3M,EAAMkN,KAAKE,cACxCT,EAAStN,KAAK6yB,OAAOhC,WAAWkD,YAG7BzmB,IAGX07C,OAAQ,WACJ,IAII0kB,EAAYW,EACZC,EAAYV,EACZhkE,EAAKpC,EAAQ8F,EANb5E,EAAQ1I,KAAK6yB,OAAOnqB,QACpBsc,EAAQhlB,KAAKkH,QAAQulE,gBAAkBzsE,KAAKkH,QAAQqnE,cACpDtrE,EAAmC,mBAAzBiO,EAAS3G,KAAK7B,GACxB8lE,EAAqBxuE,KAAKkuE,yBACDp1D,EAAS,GAMtC,GAFA9Y,KAAK8sE,aAAc,EAEf9nD,EAEA,GAAc,KAAVtc,IAAiB8lE,GAAsBxuE,KAAKkH,QAAQymE,gBACpDjlE,EAAQ,SACL,CAQH,IAPA4E,EAAStN,KAAKouE,UAEVnrE,IACAorE,EAAc3lE,EAAMlB,OACpBsR,EAASpQ,EAAM9B,MAAM,IAGpBgD,EAAM,EAAGpC,EAAS8F,EAAO9F,OAAQoC,EAAMpC,EAAQoC,IAIhD,GAFAgkE,GADAU,EAAahhE,EAAO1D,IACK0lB,IAAItK,GAEzB/hB,GACA,IAAKyqE,EAAa,EAAGA,EAAaW,EAAaX,IAC3C,GAAIE,GAAe90D,EAAO40D,GAAa,CACnC50D,EAAO40D,GAAcY,EACrB,YAGL,GAAIV,GAAellE,EAAO,CAC7BA,EAAQ8lE,EAAqBF,EAAaV,EAC1C,MAIJ90D,EAAO,KAEHpQ,EADA1I,KAAKmuE,wBACGr1D,EACD01D,IAAuBxpD,EACtBlM,EAAO,GAEPA,EAAO,GAAGwW,IAAItK,IAMtChlB,KAAK8qE,SAASpiE,MAAM6mB,IAAI7mB,GACxB1I,KAAK8sE,aAAc,GAGvBnvD,QAAS,WACL,IAAK3d,KAAK8sE,YAAa,CACnB,IAMatlE,EANTqrB,EAAS7yB,KAAK6yB,OACd3rB,EAAU2rB,EAAO3rB,QACjB8/D,EAAY9/D,EAAQqnE,cACpBvB,EAAa9lE,EAAQulE,gBAAkBzF,EACvCt+D,EAAQ1I,KAAK8qE,SAASpiE,MAAM4mB,MAC5BqR,EAAOz5B,EAAQy5B,MAAQ,GACvB/2B,EAAM,EACNkP,EAAS,GAMb,GAJIpQ,IAAU9F,IACV8F,EAAQ,MAGRskE,EACA,GAAItkE,aAAiBkF,EAAiB,CAClC,IAAKpG,EAASkB,EAAMlB,OAAQoC,EAAMpC,EAAQoC,IACtCkP,EAAOlP,GAAOlB,EAAMkB,GAAK0lB,IAAI09C,GAEjCtkE,EAAQoQ,OACDpQ,aAAiBg+C,IACxB/lB,EAAOj4B,EAAM4mB,IAAI03C,GACjBt+D,EAAQA,EAAM4mB,IAAI09C,KAID,IAArB9lE,EAAQ6lE,UAAuB7lE,EAAQunE,cAAe57C,EAAO67C,UAAa77C,EAAO67C,SAASC,QAW1F97C,EAAOnqB,MAAMA,IAVTs+D,IAAcgG,GAAersC,IAC7BA,EAAOj4B,GAGNi4B,IAASj4B,GAAmB,IAAVA,IAAgBxB,EAAQymE,eAG3C96C,EAAO+7C,WAAWlmE,EAAOi4B,GAFzB9N,EAAOnqB,MAAMA,IASzB1I,KAAK8sE,aAAc,GAGvB9qE,QAAS,WACLhC,KAAK6yB,OAAO5oB,OAAO67C,EAAQ9lD,KAAKo6D,YAGxCyU,aAAc,CACVnmE,MAAOmiE,EAAO9nE,OAAO,CACjBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDlH,KAAK6yB,OAASA,EACd7yB,KAAKo6D,QAAUp6D,KAAKgpD,OAAOx/C,KAAKxJ,MAChCA,KAAK6yB,OAAO3oB,MAAM47C,EAAQ9lD,KAAKo6D,SAC/Bp6D,KAAK8sE,aAAc,GAGvB9jB,OAAQ,WACJ,IAAI/gD,EAAOjI,KACP8uE,EAAY7mE,EAAK6iE,SAAc,MAAEx7C,MACjCq+C,EAAiB1lE,EAAKf,QAAQymE,eAC9BoB,EAAe9mE,EAAK4qB,OAAO05C,SAASpmC,SACpC6oC,EAAqB/mE,EAAK4qB,OAAOo8C,uBAAyBhnE,EAAK4qB,OAAOq8C,iBAAoBjnE,EAAK4qB,OAAO05C,SAASn4C,SAAS26C,IAAiB9mE,EAAK4qB,OAAOnqB,QACrJiiC,EAAagjC,IAAmD,IAAjC1lE,EAAK4qB,OAAO3rB,QAAQ6lE,SAAsB9kE,EAAK4qB,OAAOnqB,QAAUsmE,EAE/FhqD,EAAQhlB,KAAKkH,QAAQulE,gBAAkBzsE,KAAKkH,QAAQqnE,cAMxD,GAJA5jC,EAAYA,EAAU/jC,MAAQ+jC,EAAU/jC,MAAM,GAAK+jC,EAEnD1iC,EAAK6kE,aAAc,EAEfgC,aAAqBlhE,EAAiB,CAUtC,IATA,IAKIuhE,EACAC,EACAlW,EAPApiC,EAAS,GACTu4C,EAAY1kC,EAAUnjC,OACtBD,EAAI,EAAGmjC,EAAI,EACX4kC,EAAMR,EAAUvnE,GAMb+nE,IAAQ1sE,GAAa,CAExB,IADAs2D,GAAQ,EACHxuB,EAAI,EAAGA,EAAI2kC,EAAW3kC,IAUvB,GATIijC,EACOhjC,EAAUD,IAAM4kC,GAIvBF,GAFAA,EAAWzkC,EAAUD,IAEDpb,IAAM8/C,EAAS9/C,IAAItK,GAASoqD,KAC5BE,EAAIhgD,IAAMggD,EAAIhgD,IAAItK,GAASsqD,GAGzC,CACN3kC,EAAUngC,OAAOkgC,EAAG,GACpB2kC,GAAa,EACbnW,GAAQ,EACR,MAIHA,EAKD3xD,GAAK,GAJLuvB,EAAOn1B,KAAK2tE,GACZC,EAAYT,EAAWvnE,EAAG,GAC1B4nE,EAAc5nE,GAKlB+nE,EAAMR,EAAUvnE,GAGpBgoE,EAAYT,EAAWA,EAAUtnE,OAAQ,EAAGmjC,GAExC7T,EAAOtvB,QACPsnE,EAAU1kE,QAAQ,SAAU,CACxB2iC,OAAQ,SACR5Y,MAAO2C,EACP/d,MAAOo2D,IAIXxkC,EAAUnjC,QACVsnE,EAAU1kE,QAAQ,SAAU,CACxB2iC,OAAQ,MACR5Y,MAAOwW,EACP5xB,MAAO+1D,EAAUtnE,OAAS,SAIlCS,EAAK6iE,SAAc,MAAEv7C,IAAIob,GAG7B1iC,EAAK6kE,aAAc,GAGvBnvD,QAAS,WACL,IAAK3d,KAAK8sE,YAAa,CACnB,IAKatlE,EAETgoE,EAPAtoE,EAAUlH,KAAKkH,QACf2rB,EAAS7yB,KAAK6yB,OACd7N,EAAQ9d,EAAQulE,gBAAkBvlE,EAAQqnE,cAC1C7lE,EAAQ1I,KAAK8qE,SAASpiE,MAAM4mB,MAC5BzhB,EAAOnF,EACPkB,EAAM,EACNkP,EAAS,GAGb,GAAIkM,EACA,GAAItc,aAAiBkF,EAAiB,CAClC,IAAKpG,EAASkB,EAAMlB,OAAQoC,EAAMpC,EAAQoC,IACtC4lE,EAAgB9mE,EAAMkB,GACtBkP,EAAOlP,GAAO4lE,EAAclgD,IAAMkgD,EAAclgD,IAAItK,GAASwqD,EAEjE9mE,EAAQoQ,OACDpQ,aAAiBg+C,IACxBh+C,EAAQA,EAAM4mB,IAAItK,KAGD,IAArB9d,EAAQ6lE,WAAiD,IAA3B7lE,EAAQymE,eACtC96C,EAAO+7C,WAAW/gE,EAAMnF,GAExBmqB,EAAOnqB,MAAMA,KAKzB1G,QAAS,WACLhC,KAAK6yB,OAAO5oB,OAAO67C,EAAQ9lD,KAAKo6D,aAI5CqV,MAAO,CACHnF,aAAca,EAAkB,eAAgB,eAAgB,8BAGpEgB,YAAa,CACTzjE,MAAOmiE,EAAO9nE,OAAO,CACjBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDlH,KAAK6yB,OAASA,EACd7yB,KAAKo6D,QAAUp6D,KAAKgpD,OAAOx/C,KAAKxJ,MAChCA,KAAK6yB,OAAO3oB,MAAM47C,EAAQ9lD,KAAKo6D,SAC/Bp6D,KAAK8sE,aAAc,GAGvB9jB,OAAQ,WACJ,IAAI/gD,EAAOjI,KACP8uE,EAAY7mE,EAAK6iE,SAAc,MAAEx7C,MACjCq+C,EAAiB1lE,EAAKf,QAAQymE,eAC9BhjC,EAAYgjC,EAAiB1lE,EAAK4qB,OAAOnqB,QAAUT,EAAK4qB,OAAOiB,YAE/D9O,EAAQhlB,KAAKkH,QAAQulE,gBAAkBzsE,KAAKkH,QAAQqnE,cAMxD,GAJA5jC,EAAYA,EAAU/jC,MAAM,GAE5BqB,EAAK6kE,aAAc,EAEfgC,aAAqBlhE,EAAiB,CAYtC,IAXA,IAOIuhE,EACAC,EACAlW,EATApiC,EAAS,GAETu4C,EAAY1kC,EAAUnjC,OAEtBD,EAAI,EAAGmjC,EAAI,EACX4kC,EAAMR,EAAUvnE,GAMb+nE,IAAQ1sE,GAAa,CAExB,IADAs2D,GAAQ,EACHxuB,EAAI,EAAGA,EAAI2kC,EAAW3kC,IAUvB,GATIijC,EACOhjC,EAAUD,IAAM4kC,GAIvBF,GAFAA,EAAWzkC,EAAUD,IAEDpb,IAAM8/C,EAAS9/C,IAAItK,GAASoqD,KAC5BE,EAAIhgD,IAAMggD,EAAIhgD,IAAItK,GAASsqD,GAGzC,CACN3kC,EAAUngC,OAAOkgC,EAAG,GACpB2kC,GAAa,EACbnW,GAAQ,EACR,MAIHA,EAKD3xD,GAAK,GAJLuvB,EAAOn1B,KAAK2tE,GACZC,EAAYT,EAAWvnE,EAAG,GAC1B4nE,EAAc5nE,GAKlB+nE,EAAMR,EAAUvnE,GAGpBgoE,EAAYT,EAAWA,EAAUtnE,OAAQ,EAAGmjC,GAExC7T,EAAOtvB,QACPsnE,EAAU1kE,QAAQ,SAAU,CACxB2iC,OAAQ,SACR5Y,MAAO2C,EACP/d,MAAOo2D,IAIXxkC,EAAUnjC,QACVsnE,EAAU1kE,QAAQ,SAAU,CACxB2iC,OAAQ,MACR5Y,MAAOwW,EACP5xB,MAAO+1D,EAAUtnE,OAAS,SAIlCS,EAAK6iE,SAAc,MAAEv7C,IAAIob,GAG7B1iC,EAAK6kE,aAAc,GAGvBnvD,QAAS,WACL,IAAK3d,KAAK8sE,YAAa,CACnB,IAKatlE,EAETgoE,EAPAtoE,EAAUlH,KAAKkH,QACf2rB,EAAS7yB,KAAK6yB,OACd7N,EAAQ9d,EAAQulE,gBAAkBvlE,EAAQqnE,cAC1C7lE,EAAQ1I,KAAK8qE,SAASpiE,MAAM4mB,MAC5BzhB,EAAOnF,EACPkB,EAAM,EACNkP,EAAS,GAOb,GAJIpQ,IAAU9F,IACV8F,EAAQ,MAGRsc,EACA,GAAItc,aAAiBkF,EAAiB,CAClC,IAAKpG,EAASkB,EAAMlB,OAAQoC,EAAMpC,EAAQoC,IACtC4lE,EAAgB9mE,EAAMkB,GACtBkP,EAAOlP,GAAO4lE,EAAclgD,IAAMkgD,EAAclgD,IAAItK,GAASwqD,EAEjE9mE,EAAQoQ,OACDpQ,aAAiBg+C,IACxBh+C,EAAQA,EAAM4mB,IAAItK,KAID,IAArB9d,EAAQ6lE,WAAiD,IAA3B7lE,EAAQymE,gBAA4B96C,EAAO68C,WAGzE78C,EAAOnqB,MAAMA,GAFbmqB,EAAO+7C,WAAW/gE,EAAMnF,KAOpC1G,QAAS,WACLhC,KAAK6yB,OAAO5oB,OAAO67C,EAAQ9lD,KAAKo6D,aAK5CuV,UAAW,CACPriE,OAAQ69D,EAAkB,SAAU,aAAc,iBAAiBpoE,OAAO,CACtEyoE,UAAW,SAAS7mE,GAChB,IAAIiF,EACApC,EAGAqG,EAAMuqB,EAFNvF,EAAS7yB,KAAK6yB,OACdqB,EAAWvvB,EAAEqnE,YAAcn5C,EAAOsB,QAGtC,GAAID,EAAS1sB,OAIT,IAHAqG,EAAOlJ,EAAEunE,gBAAkBr5C,EAAOiB,YAClCsE,EAAUp4B,KAAK8qE,SAASx9D,OAAOk9D,WAE1B5gE,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC9C+hE,EAAYz3C,EAAStqB,GAAMiE,EAAKjE,GAAM5J,KAAK4rE,IAAIjnE,EAAE4mB,IAAK,CAAC1d,EAAKjE,IAAMwT,OAAOgb,QAO7Fw3C,KAAM,CACFtiE,OAAQ69D,EAAkB,SAAU,aAAc,iBAAiBpoE,OAAO,CACtEyoE,UAAW,SAAS7mE,GAChB,IAAIiF,EACJpC,EAGA4wB,EACAvqB,EAHAglB,EAAS7yB,KAAK6yB,OACdqB,EAAWvvB,EAAEqnE,YAAcn5C,EAAOsB,QAIlC,GAAID,EAAS1sB,OAIT,IAHAqG,EAAOlJ,EAAEunE,gBAAkBr5C,EAAOiB,YAClCsE,EAAUp4B,KAAK8qE,SAASx9D,OAAOk9D,WAE1B5gE,EAAM,EAAGpC,EAASqG,EAAKrG,OAAQoC,EAAMpC,EAAQoC,IAC9C+hE,EAAYz3C,EAAStqB,GAAMiE,EAAKjE,GAAM5J,KAAK4rE,IAAIjnE,EAAE4mB,IAAK,CAAC1d,EAAKjE,IAAMwT,OAAOgb,QAO7Fy3C,MAAO,CACHlvC,KAAMkqC,EAAO9nE,OAAO,CAChBoF,KAAM,SAAS0qB,EAAQi4C,EAAU5jE,GAC7B2jE,EAAO9iE,GAAGI,KAAKoC,KAAKvK,KAAM6yB,EAAOhnB,QAAQ,GAAIi/D,EAAU5jE,GAEvDlH,KAAK6yB,OAASA,GAElBlV,QAAS,WACL,IAAIgjB,EAAO3gC,KAAK8qE,SAASnqC,KAAKrR,MAElB,MAARqR,IACAA,EAAO,IAEX3gC,KAAK6yB,OAAO8N,KAAKA,QAMjC,IAAI4uC,EAAc,SAAShlC,EAAK3gC,EAAKktB,EAAQ7pB,GAEzC6pB,EAASA,GAAU,EAEnB,IAKI/d,EALA+2D,GAHJ7iE,EAAMA,GAAO,IAGOzF,OAChBqxC,EAAYtO,EAAI/iC,OAEhBuoE,EAAU,GAAGnpE,MAAM2D,KAAKggC,EAAK3gC,EAAMktB,GACnCk5C,EAAgBD,EAAQvoE,OAG5B,GAAIsoE,EAAW,CAIX,IAHAA,EAAYlmE,EAAMkmE,EAClB/2D,EAAQ,EAEDnP,EAAMkmE,EAAWlmE,IACpB2gC,EAAI3gC,GAAOqD,EAAI8L,GACfA,IAGJwxB,EAAI/iC,OAASsoE,OACV,GAAIh5C,EAIP,IAHAyT,EAAI/iC,OAASoC,EAEbktB,GAAUltB,EACHA,EAAMktB,UACFyT,IAAMzT,GAIrB,GAAIk5C,EAAe,CAIf,IAHAA,EAAgBpmE,EAAMomE,EACtBj3D,EAAQ,EAEDnP,EAAMomE,EAAepmE,IACxB2gC,EAAI3gC,GAAOmmE,EAAQh3D,GACnBA,IAGJwxB,EAAI/iC,OAASwoE,EAKjB,IAFApmE,EAAM2gC,EAAI/iC,OAEHoC,EAAMivC,UACFtO,EAAI3gC,GACXA,KAIJqmE,EAAgBroE,EAAM7E,OAAQ,CAC9BoF,KAAM,SAASb,EAAQJ,GACnBlH,KAAKsH,OAASA,EACdtH,KAAKkH,QAAUA,EACflH,KAAKkwE,UAAY,IAGrB1mE,KAAM,SAASshE,GACX,IAAIv5D,EACA4+D,EACAC,EACAC,EACAC,EACAC,EACAC,EAAgBxwE,gBAAgBywE,EAChCC,EAAkB1wE,KAAK+pE,UAE3B,IAAKx4D,KAAOu5D,EACJv5D,GAAOy4D,EACPmG,GAAW,EACJ5+D,GAAO04D,EACdmG,GAAY,EACL7+D,GAAO24D,GAAWsG,EAElBj/D,GAAO44D,EACdmG,GAAa,EA/rDnB,OAgsDa/+D,EACPg/D,GAAS,EAETvwE,KAAK2wE,aAAap/D,EAAKu5D,EAAU4F,GANjCL,GAAY,EAShBD,GACApwE,KAAK2wE,aAAa1G,EAAQa,EAAU4F,GAGpCP,GACAnwE,KAAK2wE,aAAa3G,EAAOc,EAAU4F,GAGnCJ,GACAtwE,KAAK2wE,aAAaxG,EAASW,EAAU4F,GAGrCL,IAAcG,GACdxwE,KAAK2wE,aAAazG,EAAQY,EAAU4F,GAGpCH,IAAWC,GACXxwE,KAAK2wE,aAvtDP,MAutDyB7F,EAAU4F,GAGjCF,GAAiBxwE,KAAKsH,QAAUtH,KAAKsH,OAAO2mE,eAC5CjuE,KAAK2wE,aAAa,gBAAiB7F,EAAU4F,IAIrD3G,QAAS,WACL,OAAOA,EAAQ/pE,KAAKsH,OAAO0wB,SAAS1f,gBAAkB,IAG1Dq4D,aAAc,SAASvuE,EAAM0oE,EAAU4F,GACnC,IAEI5oC,EAFA8oC,EAASF,EAAgBtuE,IAAS2nE,EAAQ3nE,GAC1C8tE,EAAYlwE,KAAKkwE,UAEjBnF,EAAUD,EAAS1oE,GAEvB,GAAIwuE,EAKA,GAJAA,EAAS,IAAIA,EAAO5wE,KAAKsH,OAAQwjE,EAAU9qE,KAAKkH,SAEhDgpE,EAAUvuE,KAAKivE,GAEX7F,aAAmBV,EACnBuG,EAAOpnE,KAAKuhE,GACZmF,EAAUvuE,KAAKopE,QAEf,IAAKjjC,KAAaijC,EACd6F,EAAOpnE,KAAKuhE,EAASjjC,GACrBooC,EAAUvuE,KAAKopE,EAAQjjC,SAG5B,GAAa,aAAT1lC,EACP,MAAM,IAAIqO,MAAM,OAASrO,EAAO,oCAAsCpC,KAAKsH,OAAO0wB,SAAS1f,cAAgB,aAInHtW,QAAS,WACL,IAAI4H,EACApC,EACA0oE,EAAYlwE,KAAKkwE,UAErB,IAAKtmE,EAAM,EAAGpC,EAAS0oE,EAAU1oE,OAAQoC,EAAMpC,EAAQoC,IACnDsmE,EAAUtmE,GAAK5H,aAKvByuE,EAAsBR,EAAcltE,OAAQ,CAC5CgnE,QAAS,WACL,OAAOA,EAAQl3C,OAAO7yB,KAAKsH,OAAOJ,QAAQ9E,KAAKkW,gBAAkB,IAGrEq4D,aAAc,SAASvuE,EAAM0oE,EAAU4F,GACnC,IAEI5oC,EAFA8oC,EAASF,EAAgBtuE,IAAS2nE,EAAQl3C,OAAOzwB,GACjD8tE,EAAYlwE,KAAKkwE,UAEjBnF,EAAUD,EAAS1oE,GAEvB,IAAIwuE,EAgBA,MAAM,IAAIngE,MAAM,OAASrO,EAAO,oCAAsCpC,KAAKsH,OAAOJ,QAAQ9E,KAAO,WAVjG,GALAwuE,EAAS,IAAIA,EAAO5wE,KAAKsH,OAAQwjE,EAAU9qE,KAAKsH,OAAOJ,SAEvDgpE,EAAUvuE,KAAKivE,GAGX7F,aAAmBV,EACnBuG,EAAOpnE,KAAKuhE,GACZmF,EAAUvuE,KAAKopE,QAEf,IAAKjjC,KAAaijC,EACd6F,EAAOpnE,KAAKuhE,EAASjjC,GACrBooC,EAAUvuE,KAAKopE,EAAQjjC,OAiB3C,IAAI+oC,EAAiB,wCACjBC,EAAmB,MAEvB,SAASC,EAAcvnE,GACnB,IACII,EACApC,EACAwpE,EACAC,EACA1/D,EACA7I,EACAi+B,EAPApwB,EAAS,GAWb,IAAK3M,EAAM,EAAGpC,GAFdm/B,EAASn9B,EAAK2G,MAAM0gE,IAEUrpE,OAAQoC,EAAMpC,EAAQoC,IAEhDqnE,GADAD,EAAQrqC,EAAO/8B,IACI+L,QAAQ,KAE3BpE,EAAMy/D,EAAMhmE,UAAU,EAAGimE,GAGF,MAFvBvoE,EAAQsoE,EAAMhmE,UAAUimE,EAAa,IAE3BnmE,OAAO,KACbpC,EAAQqoE,EAAcroE,IAG1B6N,EAAOhF,GAAO7I,EAGlB,OAAO6N,EAGX,SAAS26D,EAAepG,EAAUx9D,EAAQ5H,GACtC,IAAIqlE,EACAx0D,EAAS,GAEb,IAAKw0D,KAAWD,EACZv0D,EAAOw0D,GAAW,IAAIrlE,EAAK4H,EAAQw9D,EAASC,IAGhD,OAAOx0D,EAGX,SAASo1D,EAAY9/D,EAASyB,EAAQgoB,EAAO8C,GAEzC,GAAKvsB,IAAWA,EAAQipB,aAAa,QAAUn0B,EAAM4qB,GAAK,QAA1D,CAIA,IACI3hB,EAIAkhE,EAEAxjE,EAPAuoB,EAAOhkB,EAAQipB,aAAa,QAAUn0B,EAAM4qB,GAAK,QAEjD/hB,EAAOqC,EAAQipB,aAAa,QAAUn0B,EAAM4qB,GAAK,QACjD4lD,EAAe,GACf1pE,GAAO,EAEPP,EAAU,GAGdkxB,EAAUA,GAAW,CAAC9qB,IAElBuiB,GAAQrmB,IACR4nE,EAAcvlE,GAAS,GAGvBgkB,IACAvoB,EAzER,SAA8BuE,EAASypB,GACnC,IAAIzC,EAASlyB,EAAM00B,WAAWxpB,EAAS,GAAIypB,GAE3C,GAAIzC,EACA,OAAO,IAAI49C,EAAoB59C,GAqEtBw+C,CAAqBxlE,EAASypB,IAGvC9rB,IACAA,EAAOunE,EAAcvnE,EAAK/G,QAAQquE,EAAkB,KAE/CxpE,KACDJ,EAAUvG,EAAMq0B,aAAanpB,EAAS,CAAEm7D,UAAW,GAAIgG,WAAY,GAAIn9D,SAAU,GAAIg9D,YAAa/mB,EAAQ6nB,gBAAgB,EAAOZ,UAAU,GAAQz/D,IAC3IgoB,MAAQA,EAChBhuB,EAAS,IAAI2oE,EAAcpkE,EAAS3E,IAGxCI,EAAOgG,OAASA,EAEhBw9D,EAAWoG,EAAe1nE,EAAM4uB,EAASiyC,GAErCnjE,EAAQ2I,WACRi7D,EAASj7D,SAAW,IAAI+6D,EAAgBxyC,EAAS,GAAIlxB,EAAQ2I,WAG7Di7D,EAASzhD,QACT7f,EAAKa,OAASb,EAAKa,QAAU,GAC7Bb,EAAKa,OAAOgf,MAAQ7f,EAAK6f,MACzByhD,EAASzhD,MAAMrnB,iBACR8oE,EAASzhD,OAGhByhD,EAASx9D,SACT7F,GAAO,GAGP+B,EAAKuZ,OACL+nD,EAAS/nD,KAAOmuD,EAAe1nE,EAAKuZ,KAAMqV,EAASiyC,IAGnD7gE,EAAKiD,QACLq+D,EAASr+D,MAAQykE,EAAe1nE,EAAKiD,MAAO2rB,EAASiyC,IAGrD7gE,EAAKa,SACLygE,EAASzgE,OAAS6mE,EAAe1nE,EAAKa,OAAQ+tB,EAASuyC,IAGvDnhE,EAAKoD,MACLk+D,EAASl+D,IAAMskE,EAAe1nE,EAAKoD,IAAKwrB,EAASiyC,IAGrD/iE,EAAOkC,KAAKshE,IAGZxjE,IACAuE,EAAQolB,mBAAqB3pB,GAGjC,IAAI4tC,EAAWrpC,EAAQqpC,SACvB,GAAIztC,GAAQytC,IAAarpC,EAAQipB,aAAa,QAAUn0B,EAAM4qB,GAAK,QAAS,CAExE,IAAK3hB,EAAM,EAAGA,EAAMsrC,EAAS1tC,OAAQoC,IACjCunE,EAAavnE,GAAOsrC,EAAStrC,GAGjC,IAAKA,EAAM,EAAGA,EAAMunE,EAAa3pE,OAAQoC,IACrC+hE,EAAYwF,EAAavnE,GAAM0D,EAAQgoB,EAAO8C,KAK1D,SAAS5uB,EAAK8nE,EAAKrqB,GACf,IAAIr9C,EACApC,EACAy7B,EACA3N,EAAQ30B,EAAMi1B,oBAAoB,GAAGhvB,MAAM2D,KAAKlD,UAAW,IAK/D,IAHA4/C,EAAStmD,EAAM8tC,WAAWwY,GAGrBr9C,EAAM,EAAGpC,GAFd8pE,EAAM3uE,EAAE2uE,IAEmB9pE,OAAQoC,EAAMpC,EAAQoC,IAEvB,KADtBq5B,EAAOquC,EAAI1nE,IACF6rB,UACLk2C,EAAY1oC,EAAMgkB,EAAQ3xB,GAKtC,SAAS87C,EAAcvlE,EAAS0lE,GAC5B,IAAIC,EAAgB3lE,EAAQolB,mBAc5B,GAZIugD,IACAA,EAAcxvE,UAEVooE,SACOv+D,EAAQolB,mBACRplB,EAAQk8B,gBACfl8B,EAAQk8B,gBAAgB,sBAExBl8B,EAAQolB,mBAAqB,MAIjCsgD,EAAe,CACf,IAAI1+C,EAASlyB,EAAMw1B,eAAexzB,EAAEkJ,IAChCgnB,GAn9DG,mBAm9DcA,EAAO7wB,SACxB6wB,EAAO7wB,WAKnB,SAAS8pE,EAAkBjgE,EAAS4lE,GAChCL,EAAcvlE,EAAS4lE,GAEvBnE,EAAsBzhE,EAAS4lE,GAGnC,SAASnE,EAAsBzhE,EAAS4lE,GACpC,IAAIv8B,EAAWrpC,EAAQqpC,SAEvB,GAAIA,EACA,IAAK,IAAItrC,EAAM,EAAGpC,EAAS0tC,EAAS1tC,OAAQoC,EAAMpC,EAAQoC,IACtDkiE,EAAkB52B,EAAStrC,GAAM6nE,GAwB7C,SAASjF,EAAwB9jE,EAAOskE,GACpC,IAEIxlE,EACAunC,EAHAj2B,EAAS,GACTlP,EAAM,EAIV,IAAKojE,EACD,OAAOtkE,EAGX,GAAIA,aAAiBkF,EAAiB,CAClC,IAAKpG,EAASkB,EAAMlB,OAAQoC,EAAMpC,EAAQoC,IACtCmlC,EAAOrmC,EAAMkB,GACbkP,EAAOlP,GAAOmlC,EAAKzf,IAAMyf,EAAKzf,IAAI09C,GAAcj+B,EAAKi+B,GAEzDtkE,EAAQoQ,OACDpQ,aAAiBg+C,IACxBh+C,EAAQA,EAAM4mB,IAAI09C,IAGtB,OAAOtkE,EAGX/H,EAAMsJ,OA1CN,SAAgBqnE,GACZ,IAAI1nE,EAAKpC,EAIT,IAAKoC,EAAM,EAAGpC,GAFd8pE,EAAM3uE,EAAE2uE,IAEmB9pE,OAAQoC,EAAMpC,EAAQoC,IAC7CkiE,EAAkBwF,EAAI1nE,IAAM,IAqCpCjJ,EAAM6I,KAAOA,EACb7I,EAAMkN,KAAKk8D,QAAUA,EACrBppE,EAAMkN,KAAKg9D,OAASA,EACpBlqE,EAAM4zB,OApCN,SAAgB1B,EAAQ6+C,GACpB,IAAI7lE,EAAUgnB,EAAOhnB,QACjB2lE,EAAgB3lE,EAAQ,GAAGolB,mBAE3BugD,GACAhoE,EAAKqC,EAAS2lE,EAAclkE,OAAQokE,IAiC5C/wE,EAAM8tC,WAAa,SAASwY,GAKxB,OAJMA,aAAkBP,IACpBO,EAAS,IAAIP,EAAiBO,IAG3BA,GAGXtmD,EAAMgxE,oBAAsB,SAASn3D,GACjC,IAAIqW,EAAalwB,EAAMkN,KAAKG,uBAAuBmzC,OAAO3mC,GAwB1D,OANAqW,EAAW4vC,QAhBX,SAASmR,EAAc/jE,GACnB,IAAItG,EAAG2tC,EAEP,IAAK3tC,EAAI,EAAGA,EAAIsG,EAAKrG,OAAQD,IACzBsG,EAAKtG,GAAGs+D,iBAER3wB,EAAWrnC,EAAKtG,GAAG2tC,UAEVurB,QAET5yD,EAAKtG,GAAG4sB,MAAQ+gB,EAASrnC,OAEzB+jE,EAAc/jE,EAAKtG,GAAG4sB,OAM9By9C,CAAc/gD,EAAWhjB,QAEzBgjB,EAAW8jC,MAAMyS,YAAcv2C,EAExBA,EAAW8jC,OAzkE1B,CA4kEG7zD,OAAOH,MAAM+G,QACF/G,OAWd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACf8vB,EAAS9vB,EAAM+oB,GAAG+G,OAClBohD,EAAK,kBACLC,EAAa,gBACbC,EAAmB,IAAI9jE,OAAO6jE,EAAW,KACzCE,EAAe,YACfC,EAAa,UACbC,EAAoB,uBACpBC,EAAe,eACfC,EAAa,kCAGbC,EAAc,eAEdC,EAAc,yIACdC,EAAY,sqCACZC,EAAgB,uEAChBC,EAAmB,uCACnBC,EAAsB,6BACtBC,EAAO,OACPC,EAAO,OACPC,EAAO,OACPC,EAAa,aAEbC,EAAW,WACXjtB,EAAS,SACTktB,EAAiB,gBAEjBC,EAAiB,SAASvqE,EAAOgL,GAI7B,MAHuB,iBAAZA,IACPA,EAAU,IAAIzF,OAAO,OAASyF,EAAU,OAErCA,EAAQ3G,KAAKrE,IAExBwqE,EAAU,SAAS1uD,EAAOgB,EAAU9R,GAChC,IAAIhL,EAAQ8b,EAAMyK,MAElB,OAAIzK,EAAMwR,OAAOxQ,GAAUhe,QAAoB,KAAVkB,GAC1BuqE,EAAevqE,EAAOgL,IAIrCy/D,EAAe,SAAS3uD,EAAOpiB,GAC3B,QAAIoiB,EAAMhd,QAC8B,MAA7Bgd,EAAM,GAAGw/B,WAAW5hD,IAoCvC,SAASgxE,EAAUzyC,GACf,OAAIh+B,EAAE0wE,UACK1wE,EAAEA,EAAE0wE,UAAU1yC,IAElBh+B,EAAEg+B,GAGb,SAAS2yC,EAA0Bp/C,EAAUy1B,GAKzC,IAJA,IACI99C,EADA0nE,EAAa5wE,IAIRiH,EAAM,EAAGpC,EAAS0sB,EAAS1sB,OAAQoC,EAAMpC,EAAQoC,IACtDiC,EAAUqoB,EAAStqB,GACfmoE,EAAiBhlE,KAAKlB,EAAQ4gB,YACvB5gB,EAAQipB,aAAan0B,EAAMoiB,KAAK,UAC1B4mC,IACT4pB,EAAaA,EAAWtmE,IAAIpB,IAIxC,OAAO0nE,EAGX,SAASC,EAAW5/C,EAAO/nB,GACvB,QAAK+nB,IAGyB,iBAAnBA,EAAMoE,UAA4C,UAAnBpE,EAAMoE,WAGP,iBAA9BpE,EAAMkB,aAAa,QAA6D,iBAA/BjpB,EAAQipB,aAAa,OAG7ElB,EAAMkB,aAAa,SAAWjpB,EAAQipB,aAAa,QAjEtDn0B,EAAM+oB,GAAG+pD,YACV9yE,EAAM+oB,GAAG+pD,UAAY,CAAE11C,MAAO,GAAI/T,SAAU,GAAI0pD,YAAa/wE,EAAEQ,KAAMwwE,eAAgBhxE,EAAEQ,OAuE3F,IAAIywE,EAAkB,SAAU5kD,GAI5B,IAHA,IAAIk0B,EAASl0B,EAAIk0B,OAEb3sC,EAAS,OACJhP,EAAI,EAAGA,EAAI27C,EAAO17C,OAAQD,GAAK,EACpCgP,GAAU,sBAA0B2sC,EAAO37C,GAAQ,MAAI,cAAoB27C,EAAO37C,GAAU,QAAI,YAIpG,OADAgP,GAAU,SAIVs9D,EAAYpjD,EAAO1tB,OAAO,CAC1BoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAIe,EAAOjI,KACP8zE,EAnFZ,SAAsBjoE,GAClB,IAEIzJ,EAFA2xE,EAAYpzE,EAAM+oB,GAAG+pD,UAAUO,eAAiB,GAChDj2C,EAAQ,GAGZ,IAAK37B,KAAQ2xE,EACTpxE,EAAEI,QAAO,EAAMg7B,EAAOg2C,EAAU3xE,GAAMszC,QAAQ7pC,IAElD,OAAOkyB,EA2EYk2C,CAAapoE,GACxBqoE,EAA4B,IAAMvzE,EAAMoiB,KAAK,YAAc,YAE/D7b,EAAUA,GAAW,IAEb62B,MAAQp7B,EAAEI,OAAO,GAAIpC,EAAM+oB,GAAG+pD,UAAU11C,MAAO+1C,EAAS/1C,MAAO72B,EAAQ62B,OAC/E72B,EAAQ8iB,SAAWrnB,EAAEI,OAAO,GAAIpC,EAAM+oB,GAAG+pD,UAAUzpD,SAAU8pD,EAAS9pD,SAAU9iB,EAAQ8iB,UAExFyG,EAAO1oB,GAAGI,KAAKoC,KAAKtC,EAAM4D,EAAS3E,GAEnCe,EAAKksE,eAAiBxzE,EAAMkP,SAAS5H,EAAKf,QAAQktE,eAClDnsE,EAAKosE,iBAAmB1zE,EAAMkP,SAAS5H,EAAKf,QAAQotE,kBAAkBzkE,UAAY+jE,GAE9E3rE,EAAK4D,QAAQU,GAAGsmE,IAChB5qE,EAAK4D,QAAQkX,KAAK+vD,EAAYA,GAGlC7qE,EAAKssE,eAAiB/B,EAAgB0B,EACtCjsE,EAAKusE,kBAAoB/B,EAAmByB,EAE5CjsE,EAAKwsE,QAAU,GACfxsE,EAAKysE,gBACLzsE,EAAK0sE,cAAe,EAEhB1sE,EAAK2sE,mBACL3sE,EAAK4sE,YAIbxqE,OAAQ,CAAE0oE,EAAUjtB,EAAQktB,GAE5B9rE,QAAS,CACL9E,KAAM,YACNgyE,cAAe,SAAUplD,GAGrB,MAAQ,8BAFMA,EAAIsB,QAEkC,WAExDtG,SAAU,CACN8qD,SAAU,kBACVphE,QAAS,mBACTyC,IAAK,6CACLyC,IAAK,6CACL65B,KAAM,mBACNsiC,MAAO,yBACP3mD,IAAK,uBACL/X,KAAM,wBACN2+D,YAAa,6DACbC,QAAS,iDAEbl3C,MAAO,CACH+2C,SAAU,SAAStwD,GACf,IAAI0wD,GAAkB1wD,EAAMzB,KAAK,UAAYyB,EAAMjY,GAAG,YAClDnK,EAAOoiB,EAAMzB,KAAK,QAClB5R,EAAU/O,GAAQA,EAAKuT,QAAQ,MAAQ,EAAI,IAAO,IAClDw/D,EAAgB3wD,EAAMzB,KAAK,UAAY/iB,KAAK6L,QAAQiqB,KAAK,cAAgB3kB,EAAQqT,EAAMzB,KAAK,QAAU5R,EAAQ,aAAa3J,OAC3H4tE,EAAW5wD,EAAMwR,OAAO,mBAAmBxuB,SAAW0tE,GAAkBC,GACxEE,EAAQ7wD,EAAMwR,OAAO,gBAAgBxuB,SAAWxH,KAAK6L,QAAQiqB,KAAK,cAAgB3kB,EAAQqT,EAAMzB,KAAK,QAAU5R,EAAQ,aAAa3J,OACpIkB,EAAQ8b,EAAMyK,MAElB,QAASkkD,EAAa3uD,EAAO,eAAiB9b,GAAmB,KAAVA,GAAiC,IAAjBA,EAAMlB,QAAgB4tE,GAAYC,KAE7G3hE,QAAS,SAAS8Q,GACd,OAAIA,EAAMwR,OAAO,gFAAgFA,OAAO,aAAaxuB,QAA0B,KAAhBgd,EAAMyK,OAC1HgkD,EAAezuD,EAAMyK,MAAOzK,EAAMzB,KAAK,aAItD5M,IAAK,SAASqO,GACV,OAAIA,EAAMwR,OAAO08C,EAAsB,KAAO/xE,EAAMoiB,KAAK,QAAU,YAAYiT,OAAO,SAASxuB,QAA0B,KAAhBgd,EAAMyK,QACjGlmB,WAAWyb,EAAMzB,KAAK,SAAW,IACjCpiB,EAAMoI,WAAWyb,EAAMyK,QAMzCrW,IAAK,SAAS4L,GACV,OAAIA,EAAMwR,OAAO08C,EAAsB,KAAO/xE,EAAMoiB,KAAK,QAAU,YAAYiT,OAAO,SAASxuB,QAA0B,KAAhBgd,EAAMyK,QACjGlmB,WAAWyb,EAAMzB,KAAK,SAAW,IACjCpiB,EAAMoI,WAAWyb,EAAMyK,QAMzCwjB,KAAM,SAASjuB,GACX,GAAIA,EAAMwR,OAAO08C,EAAsB,KAAO/xE,EAAMoiB,KAAK,QAAU,YAAYiT,OAAO,UAAUxuB,QAA0B,KAAhBgd,EAAMyK,MAAc,CAC1H,IAIIqmD,EAJAn/D,EAAMpN,WAAWyb,EAAMzB,KAAK,SAAW,EACvC0vB,EAAO1pC,WAAWyb,EAAMzB,KAAK,UAAY,EACzCkM,EAAMlmB,WAAWyb,EAAMyK,OACvBtb,GA1JpBjL,IAD2BA,EA2J0B+pC,GA1JpC,IAAI7nC,MAAM,MACjBpD,OAAS,EACRkB,EAAM,GAAGlB,OAEb,EAyJS,OAAImM,GACA2hE,EAAQjyE,KAAKomC,IAAI,GAAI91B,GACZtQ,KAAKkN,OAAO0e,EAAM9Y,GAAOm/D,IAAW7iC,EAAO6iC,GAAUjyE,KAAKomC,IAAI,IAAK91B,IAAc,IAErFsb,EAAM9Y,GAAOs8B,GAAU,EAlKpD,IAA+B/pC,EAoKf,OAAO,GAEXqsE,MAAO,SAASvwD,GACZ,OAAO0uD,EAAQ1uD,EAAO,iBAAmB7jB,EAAMoiB,KAAK,QAAU,UAAWuvD,IAE7ElkD,IAAK,SAAS5J,GACV,OAAO0uD,EAAQ1uD,EAAO,eAAiB7jB,EAAMoiB,KAAK,QAAU,QAASwvD,IAEzEl8D,KAAM,SAASmO,GACX,OAAIA,EAAMwR,OAAO,iBAAmBr1B,EAAMoiB,KAAK,QAAU,UAAUvb,QAA0B,KAAhBgd,EAAMyK,OACL,OAAnEtuB,EAAM2c,UAAUkH,EAAMyK,MAAOzK,EAAMzB,KAAKpiB,EAAMoiB,KAAK,aAIlEkyD,QAAS,SAASzwD,GACd,GAAIA,EAAMwR,OAAO,IAAMr1B,EAAMoiB,KAAK,QAAU,aAAavb,OAAQ,CAC7D,IAAIS,EAAOjI,KACPi1E,EAAUt0E,EAAMw1B,eAAe3R,GAC/B+wD,EAAc,SAASC,GACnB,OAAO,MAAM,GAiBrB,GAdKhxD,EAAM3W,KAAK,uBAA0B0nE,EAAYN,EAAQO,aAAgBP,EAAQQ,iBAClFjxD,EAAM3W,KAAK,sBAAsB,GACjC5F,EAAKytE,aAAc,EACnBT,EAAQJ,WAAWtoC,MAAK,WACpBtkC,EAAKytE,aAAc,EACnBztE,EAAK0tE,cAAcnxD,MACpBgoB,MAAK,SAAS3+B,GACb5F,EAAKytE,aAAc,EACf7nE,EAAKigB,OAAwB,wBAAfjgB,EAAKigB,OACnBhtB,OAAO6P,QAAQC,KAAK,yKAK5B2kE,EAAYN,EAAQO,WAEpB,OADAhxD,EAAMyN,WAAW,sBACVgjD,EAAQO,UAGvB,OAAO,IAGfI,gBAAgB,EAChBtB,mBAAmB,GAGvBuB,aAAc,WACV,OAAOl1E,EAAM+oB,GAAG+pD,UAAUC,YAAY1zE,KAAK6L,QAAS7L,KAAKkjD,WAG7D0xB,gBAAiB,WACb,OAAOj0E,EAAM+oB,GAAG+pD,UAAUE,eAAe3zE,KAAK6L,UAGlD7J,QAAS,WACLyuB,EAAO1oB,GAAG/F,QAAQuI,KAAKvK,MAEvBA,KAAK6L,QAAQmtB,IAAI64C,GAEb7xE,KAAKs0E,oBACLt0E,KAAKs0E,kBAAkBt7C,IAAI64C,GAC3B7xE,KAAKs0E,kBAAoB,OAIjC5rE,MAAO,WACH,QAAK1I,KAAK20E,cAIsB,IAAzB30E,KAAKkjD,SAAS17C,QAGzByzD,QAAS,SAASt2D,GACd,SAAM3E,KAAK60E,aAAe70E,KAAK61E,gBAAmB71E,KAAK01E,eACnD/wE,EAAEq1B,kBACFr1B,EAAEmxE,2BACFnxE,EAAEwE,kBACK,IAKfwsE,cAAe,SAAS9pE,GACpB,IAAI0iD,EAAQvuD,KAAK0I,QAEjB1I,KAAK+1E,cAAclqE,GAEf7L,KAAK0I,UAAY6lD,GACjBvuD,KAAKoK,QAAQ07C,IAIrB4uB,cAAe,WACX,IAAIzsE,EAAOjI,KAEPiI,EAAK4D,QAAQU,GAAGsmE,IAChB5qE,EAAK4D,QAAQmd,GAAG,SAAW6oD,EAAI5pE,EAAKgzD,QAAQzxD,KAAKvB,IAGjDA,EAAKf,QAAQ0uE,iBACR3tE,EAAK4D,QAAQU,GAAGimE,IASjBvqE,EAAK4D,QAAQmd,GAAG2pD,EAAOd,GAAI,WACvB5pE,EAAK0tE,cAAc1tE,EAAK4D,YAGxB5D,EAAK4D,QAAQU,GAAGkmE,IAChBxqE,EAAK4D,QAAQmd,GAAG,QAAU6oD,GAAI,WAC1B5pE,EAAK0tE,cAAc1tE,EAAK4D,cAdhC5D,EAAK4D,QAAQmd,GAAG2pD,EAAOd,EAAI5pE,EAAKssE,gBAAgB,WAC5CtsE,EAAK0tE,cAAchzE,EAAE3C,UAGzBiI,EAAK4D,QAAQmd,GAAG,QAAU6oD,EAAI5pE,EAAKusE,mBAAmB,WAClDvsE,EAAK0tE,cAAchzE,EAAE3C,aAgBrC60E,SAAU,WACN,IAAImB,EACApsE,EAEApC,EADA+O,GAAS,EAGTi/D,EAAUx1E,KAAK0I,QAInB,GAFA1I,KAAKy0E,QAAU,GAEVz0E,KAAK6L,QAAQU,GAAGimE,GAajBj8D,EAASvW,KAAK+1E,cAAc/1E,KAAK6L,aAbA,CACjC,IAAIoqE,GAAU,EAId,IAAKrsE,EAAM,EAAGpC,GAFdwuE,EAASh2E,KAAK6L,QAAQiqB,KAAK91B,KAAKu0E,iBAEF/sE,OAAQoC,EAAMpC,EAAQoC,IAC3C5J,KAAK+1E,cAAcC,EAAOn+C,GAAGjuB,MAC9BqsE,GAAU,GAIlB1/D,GAAU0/D,EAed,OAVIj2E,KAAKkH,QAAQotE,oBAAsBkB,GACnCx1E,KAAKk2E,wBAGTl2E,KAAKoK,QAAQ2oE,EAAU,CAAEoD,MAAO5/D,EAAQ2sC,OAAQljD,KAAKkjD,WAEjDsyB,IAAYj/D,GACZvW,KAAKoK,QAAQ07C,GAGVvvC,GAGXw/D,cAAe,SAASvxD,GACpBA,EAAQ7hB,EAAE6hB,GAGVxkB,KAAK20E,cAAe,EAEpB,IAIIx+C,EA1VIztB,EAsVJT,EAAOjI,KACP6P,EAAW5H,EAAKksE,eAChB59D,EAAStO,EAAKmuE,eAAe5xD,GAC7B2xD,EAAQ5/D,EAAO4/D,MAGfxsB,EAAanlC,EAAMzB,KAAK6vD,IAAS,GACjCyD,EAAMpuE,EAAKquE,sBAAsB3sB,GAAW18C,IAAIuX,EAAMm8C,KAF1C,kBAE0D3qC,QAAO,WACzE,IAAInqB,EAAUlJ,EAAE3C,MAChB,OAAI6L,EAAQmqB,OAAO,IAAMr1B,EAAMoiB,KAAK,OAAS,KAAKvb,QACvCqE,EAAQkX,KAAKpiB,EAAMoiB,KAAK,UAAY4mC,MAK/CrlC,SAAS,YACbiyD,EAAeJ,EAAkD,GAA1CluE,EAAKuuE,gBAAgBhyD,EAAOjO,EAAOhF,KAC1DklE,EAAgBN,EAAkF,GAA1E/C,EAAUvjE,EAAS,CAAEygB,SAvWzC5nB,EAuWyD6tE,EAtW9D7tE,EAAMjG,QAAQ,QAAS,SACzBA,QAAQ,UAAW,KACnBA,QAAQ,SAAU,KAClBA,QAAQ,QAAS,KACjBA,QAAQ,QAAS,MAkW6DuiB,MAAO2kC,KAClF+sB,GAAYlyD,EAAMzB,KAAKsvD,GACvBsE,EAAenyD,EAAMjY,GA/ZhB,kBAgaLqqE,EAAepyD,EAAMrY,OA/Zd,YA+aX,GAdAqY,EAAM6M,WAAWghD,GAEb7tD,EAAM2H,SAAS,cACfgK,EAAiBx1B,EAAMw1B,eAAe3R,EAAMnY,QAAQ,kBAGpDmY,EAAMjY,GAAG,kBACT4pB,EAAiBx1B,EAAMw1B,eAAe3R,EAAMnY,QAAQ,mBAGpDmY,EAAMjY,GAAG,qBACT4pB,EAAiBx1B,EAAMw1B,eAAe3R,EAAMnY,QAAQ,sBAGnD8pE,GAAU3xD,EAAM3W,KAAK,6BAoDf5F,EAAKwsE,QAAQ9qB,OApDyB,CAC7C1hD,EAAKwsE,QAAQ9qB,GAAa4sB,EAC1B,IAAIM,EAAQR,EAAItzD,KAAK,MASrB,GAPA9a,EAAK6uE,0BAA0BL,EAAc9sB,GAGzCktB,GACAJ,EAAa1zD,KAAK,KAAM8zD,GAGT,IAAfR,EAAI7uE,OACJ6uE,EAAIU,YAAYN,OACb,CACHtgD,EAAiBA,GAAkBx1B,EAAMw1B,eAAe3R,GACxD,IAAIwyD,EAAgBxyD,EAAMrY,SAASmjB,IAAI,GACnC2nD,EAAczyD,EAAMm8C,OAAOrxC,IAAI,GAC/B4nD,EAAc1yD,EAAMq8C,OAAOvxC,IAAI,IAG9B6G,GAAkB3R,EAAMjY,GAAG,kBAC5B4pB,EAAiBx1B,EAAMw1B,eAAe3R,EAAMnY,QAAQ,oBAInD8pB,GAAkB3R,EAAMjY,GAAG,qBAC5B4pB,EAAiBx1B,EAAMw1B,eAAe3R,EAAMnY,QAAQ,sBAGpD8pB,GAAkBA,EAAe/pB,UAAY+pB,EAAetqB,UAAYsqB,EAAe/pB,SAAW,CAAC,YAAa,aAAc,iBAAiBuJ,QAAQwgB,EAAejvB,QAAQ9E,OAAS,GACvLq0E,EAAaU,YAAYhhD,EAAe/pB,SACjC4qE,GAA4C,UAA3BA,EAAch/C,SAEtCy+C,EAAaU,YAAYH,GAClBC,GAAezD,EAAWyD,EAAazyD,EAAM,IAEpDiyD,EAAaU,YAAYF,GAClBC,GAAe1D,EAAW0D,EAAa1yD,EAAM,IAEpDiyD,EAAaU,YAAY3yD,GAClBmyD,GAAgBC,EAAapvE,OAEpCivE,EAAaU,YAAYP,GAEzBH,EAAaU,YAAY3yD,GAIjCiyD,EAAavqD,YAAY,YAEzB1H,EAAMzB,KAAKsvD,GAAa,GAe5B,GAVIqE,IAAaP,GACbn2E,KAAKoK,QAAQ4oE,EAAgB,CAAEmD,MAAOA,EAAO3xD,MAAOA,EAAOsJ,MAAOyoD,EAAavxD,MAAO2kC,KAG1FxzB,EAAkBA,GAAiD,aAA/BA,EAAejvB,QAAQ9E,KAAuB+zB,EAAiBx1B,EAAMw1B,eAAe3R,MAC/F2R,EAAeihD,eAAiBjhD,EAAe/pB,WACpEoY,EAAMuD,YAAYiqD,GAAemE,GACjC3xD,EAAMuD,YAAYkqD,EAAYkE,IAG9BhgD,EAAgB,CAChB,IAAIkhD,EAAYlhD,EAAeihD,eAAiBjhD,EAAe/pB,QAC3DkrE,EAAanhD,EAAeohD,YAE5BF,IACAA,EAAUtvD,YAAYiqD,GAAemE,GACrCkB,EAAUtvD,YAAYkqD,EAAYkE,IAElCmB,GACAA,EAAWvvD,YAAYoqD,GAAegE,GAI9C,GAAIO,IAAaP,EAAO,CACpB,IAAIqB,EAAUf,EAAeA,EAAa1zD,KAAK,MAAQszD,EAAItzD,KAAK,MAEhE9a,EAAKwvE,2BAA2BjzD,EAAOgzD,GAEnCx3E,KAAKkH,QAAQotE,mBAAqBt0E,KAAKkH,QAAQ0uE,gBAC/C51E,KAAKk2E,wBAIb,OAAOC,GAGXuB,aAAc,WACV,IACIjrD,EAAY,IAAMqlD,EAClBjmE,EAFO7L,KAEQ6L,QAFR7L,KAIN23E,iCAEA9rE,EAAQU,GAAGimE,GAGZ3mE,EAAQ80D,KAAKl0C,GAAWnI,SAAS,YAFjCzY,EAAQiqB,KAAKrJ,GAAWnI,SAAS,aAMzCkxB,MAAO,WACH,IAAIvtC,EAAOjI,KACPg2E,EAAS/tE,EAAK4D,QAAQiqB,KAAK,cAC3B8hD,EAAS3vE,EAAK4D,QAAQiqB,KAAK,iBAE/B7tB,EAAKwsE,QAAU,GAEfxsE,EAAKyvE,eAELzvE,EAAK4vE,wBAEL7B,EAAO3kD,WAAWghD,GAClB2D,EAAO9pD,YAAY8lD,GACnB4F,EAAO1rD,YAAYimD,IAGvBmE,sBAAuB,SAAS3sB,GAK5B,IAJA,IACIvnD,EADA01E,EAAWn3E,EAAM+oB,GAAG+pD,UAAUsE,gBAE9BxE,EAAa5wE,IAERiH,EAAM,EAAGpC,EAASxH,KAAK6L,QAAQrE,OAAQoC,EAAMpC,EAAQoC,IAC1D2pE,EAAaA,EAAWtmE,IAAIqmE,EAA0BtzE,KAAK6L,QAAQjC,GAAKouE,qBAAqB,KAAMruB,IAGvG,IAAKvnD,KAAQ01E,EACTvE,EAAaA,EAAWtmE,IAAI6qE,EAAS11E,GAAM61E,OAAOj4E,KAAK6L,QAAS89C,IAGpE,OAAO4pB,GAGXuD,0BAA2B,SAASzgD,EAAWszB,GAC3C,IACIvnD,EADA01E,EAAWn3E,EAAM+oB,GAAG+pD,UAAUsE,gBAUlC,IAAK31E,KAPLi0B,EAAU/R,SAASwtD,GACd/uD,KAAKpiB,EAAMoiB,KAAK,OAAQ4mC,GAAa,IAErCtzB,EAAUtT,KAAK,OAChBsT,EAAUtT,KAAK,KAAM4mC,EAAY,UAGxBmuB,EACTA,EAAS11E,GAAM81E,SAAS7hD,EAAWszB,IAI3C6sB,gBAAiB,SAAShyD,EAAO2zD,GAC7B,IAGIC,EAFAC,EADOr4E,KACckH,QAAQ8iB,SAASmuD,GACtCxuB,EAAYnlC,EAAMzB,KAAK6vD,GAS3B,OANKjyE,EAAM+oB,GAAGmqD,UAAUxrE,UAAUnB,QAAQ8iB,SAASmuD,KAC9CC,EAAoBz3E,EAAMuI,WAAWmvE,GAAiBA,EAAc7zD,GAAS6zD,GAGlFA,EAAgB13E,EAAMuI,WAAWmvE,GAAiBA,EAAc7zD,GAAS6zD,EAElE13E,EAAM+P,OAAO8T,EAAMzB,KAAKpiB,EAAMoiB,KAAKo1D,EAAU,UAAY3zD,EAAMzB,KAAK,sBAAwBq1D,GAAqBC,GAAiB7zD,EAAMzB,KAAK,UAAY,GAC5J4mC,EACAnlC,EAAMzB,KAAKo1D,IAAY3zD,EAAMzB,KAAKpiB,EAAMoiB,KAAKo1D,MAGrD/B,eAAgB,SAAS5xD,GACrB,IACI8Y,EADAS,EAAQ/9B,KAAKkH,QAAQ62B,MAGzB,IAAKT,KAAQS,EACT,IAAKA,EAAMT,GAAM/yB,KAAKvK,KAAMwkB,GACxB,MAAO,CAAE2xD,OAAO,EAAO5kE,IAAK+rB,GAIpC,MAAO,CAAE64C,OAAO,IAGpBjzB,OAAQ,WACJ,IAEIp1B,EAFAgzB,EAAU,GACVoC,EAASljD,KAAKy0E,QAGlB,IAAK3mD,KAASo1B,EACVpC,EAAQn/C,KAAKuhD,EAAOp1B,IAExB,OAAOgzB,GAGXxvB,WAAY,SAASpqB,GACbA,EAAQotE,mBACRt0E,KAAK63E,wBAGTl3E,EAAM6H,WAAWxI,KAAKkH,QAASA,GAE/BlH,KAAKgC,UAELhC,KAAKmI,KAAKnI,KAAK6L,QAAS7L,KAAKkH,SAE7BlH,KAAKwxB,WAAWxxB,KAAKkH,UAGzBoxE,eAAgB,WAKZ,IAJA,IACItC,EADOh2E,KACO6L,QAAQiqB,KADf91B,KACyBu0E,gBAChCxvD,EAAS,GAEJnb,EAAM,EAAGpC,EAASwuE,EAAOxuE,OAAQoC,EAAMpC,EAAQoC,IAAO,CAC3D,IAAI4a,EAAQ7hB,EAAEqzE,EAAOpsE,IAEjBupE,EAAa3uD,EAAOouD,MAIsB,IAAtC7tD,EAAOpP,QAAQ6O,EAAMzB,KAAK6vD,KACoB,IAA7CpuD,EAAMnY,QAAQ,oBAAoB7E,QACO,IAA1Cgd,EAAMnY,QAAQ,iBAAiB7E,SAC3Bud,EAAOpjB,KAAK6iB,EAAMzB,KAAK6vD,IAKvC,OAAO7tD,GAGX0yD,2BAA4B,SAASjzD,EAAOgzD,GACxC,IAAI5vC,EAAgBjnC,EAAMgnC,0BAA0BnjB,GAE/CojB,GAAkB4vC,GAIvB72E,EAAMqnC,gBAAgBJ,EA3pBR,mBA2pBwC4vC,IAG1DG,+BAAgC,WAK5B,IAJA,IAEInzD,EAAOgzD,EAFPvvE,EAAOjI,KACPg2E,EAAS/tE,EAAK4D,QAAQiqB,KAAK,cAAoBC,UAG1CxuB,EAAI,EAAGA,EAAIyuE,EAAOxuE,OAAQD,GAAK,GACpCid,EAAQ7hB,EAAEqzE,EAAOzuE,KAEPgF,GAAG,WACTirE,EAAUvvE,EAAKquE,sBAAsB9xD,EAAMzB,KAAK6vD,IAC3C3lE,IAAIuX,EAAMm8C,KAAK,IAAMmR,IACrB/uD,KAAK,MAEV9a,EAAKwvE,2BAA2BjzD,EAAOgzD,KAKnDe,cAAe,WAKX,IAJA,IAAItwE,EAAOjI,KACPw4E,EAAavwE,EAAKqwE,iBAClBvzD,EAAS,GAEJxd,EAAI,EAAGA,EAAIixE,EAAWhxE,OAAQD,GAAK,EAAG,CAC3C,IAAInF,EAAOo2E,EAAWjxE,GAElBU,EAAKwsE,QAAQryE,IACb2iB,EAAOpjB,KAAK,CACRqjB,MAAO5iB,EACPkuB,QAASroB,EAAKwsE,QAAQryE,KAKlC,OAAO2iB,GAGX0zD,eAAgB,WACZ,IAIIpiD,EAJApuB,EAAOjI,KACPkH,EAAUlH,KAAKkH,QAAQotE,kBAEvB4C,EADUl3E,KAAK6L,QACOg1D,OAgB1B,OAZIxqC,EADAnvB,EAAQmvB,UACI1zB,EAAEuE,EAAQmvB,WACf6gD,GAAeA,EAAY/qD,SAAS+lD,GAC/BgF,EAEAv0E,EAAE,WAAW0qE,aAAaplE,EAAK4D,UAGrCyY,SAAS,CAAC4tD,EAAmBE,GAAYvnE,KAAK,MACxDwrB,EAAUtT,KAAK,OAAQ,SAEvBsT,EAAUrN,GAAG,QAAU6oD,EAAI5pE,EAAKywE,cAAclvE,KAAKvB,IAE5CouB,GAGXqiD,cAAe,SAAS/zE,GACpBA,EAAEwE,iBAEF,IAGIy+B,EAFA+wC,EAAOh2E,EAAEgC,EAAE2C,QACXA,EAFOtH,KAEO6L,QAAQiqB,KAAK,UAAY6iD,EAAK9qE,KAAK,SAAW,MAG3DvG,EAAOE,SAIZogC,EAAgBjnC,EAAMgnC,0BAA0BrgC,KAG5CsgC,EAAcx9B,QAAQ,UAI9B8rE,sBAAuB,WACnB,IAGI0C,EAHA3wE,EAAOjI,KACP64E,EAAU5wE,EAAKqsE,kBACfpxB,EAASj7C,EAAKswE,gBAGbM,IACDA,EAAU5wE,EAAKqsE,kBAAoBrsE,EAAKwwE,kBAG5CG,EAAaxF,EAAUnrE,EAAKosE,iBAAiB,CACzCnxB,OAAQA,KAGZ21B,EAAQ/oE,KAAK8oE,GAEbC,EAAQ9wD,YAAY,YAAam7B,EAAO17C,SAG5CqwE,sBAAuB,WACnB,IACIgB,EADO74E,KACQs0E,kBAEduE,GAILA,EAAQv0D,SAAS,eAIzB3jB,EAAM+oB,GAAGqN,OAAO88C,GA1xBpB,CA2xBG/yE,OAAOH,MAAM+G,QACF/G,OAWd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACfmlD,EAAS,SAETgzB,EAAO,OACPv1E,EAAU5C,EAAM4C,QAChB+e,EAAWxhB,OAAOwhB,SAClBuD,EAAU/kB,OAAO+kB,QAEjBkzD,EAAkBp4E,EAAM4C,QAAQwe,QAAQsB,KACxC21D,EAAY,MACZ5pE,EAAWtO,OAAOsO,SAEtB,SAAS6pE,EAAY9pC,EAAM+pC,GACvB,OAAKA,GAID/pC,EAAO,MAAQ+pC,IACf/pC,EAAO+pC,GAGC,IAAIjrE,OAAO,IAAMirE,EAAY,KAE9BnsE,KAAKoiC,KACZA,EAAO+pC,EAAa,IAAM/pC,GAGvB7sB,EAASC,SAAW,MAAQD,EAAS62D,KAAO,IAAMhqC,GAAM1sC,QAAQ,SAAU,MAbtE0sC,EAgBf,SAASiqC,EAAcC,GACnB,OAAOA,EAAO,KAAO,IAGzB,SAASC,EAAaF,GAClB,IAAIlhD,EAAO5V,EAAS4V,KAGpB,MAAsB,OAAlBkhD,GAA0BlhD,EAAKviB,QAAQ,MAAQ,GAAKuiB,EAAKviB,QAAQ,MAAQ,EAClE,KAGJuiB,EAAKttB,MAAMwuE,GAAe,IAAM,GAG3C,SAASG,EAAUC,EAAMprD,GACrB,OAA0B,IAAtBA,EAAIzY,QAAQ6jE,GACJprD,EAAI5S,OAAOg+D,EAAKhyE,QAAS/E,QAAQ,QAAS,KAE3C2rB,EAIf,IAAIqrD,EAAiB94E,EAAMiH,MAAM7E,OAAO,CACpCm3C,KAAM,WACE6+B,EACAjgD,YAAW,WAAajT,EAAQq0B,UAEhCr0B,EAAQq0B,QAIhBw/B,QAAS,WACDX,EACAjgD,YAAW,WAAajT,EAAQ6zD,aAEhC7zD,EAAQ6zD,WAIhBlyE,OAAQ,WACJ,OAAOqe,EAAQre,QAGnBmyE,gBAAiB,SAASvrD,GACtB9L,EAAS7f,QAAQ2rB,MAIrBwrD,EAAmBH,EAAe12E,OAAO,CACzCoF,KAAM,SAASqxE,GACXx5E,KAAKw5E,KAAOA,GAGhBK,SAAU,SAAS17C,GACftY,EAAQD,UAAU,GAAIxW,EAAS0qE,MAAOb,EAAY96C,EAAIn+B,KAAKw5E,QAG/D/2E,QAAS,SAAS07B,GACdtY,EAAQk0D,aAAa,GAAI3qE,EAAS0qE,MAAOb,EAAY96C,EAAIn+B,KAAKw5E,QAGlEQ,UAAW,SAAS5rD,GAChB,OAAOmrD,EAAUv5E,KAAKw5E,KAAMprD,IAGhC3a,QAAS,WACL,IAAIA,EAAU6O,EAAS23D,SAMvB,OAJI33D,EAASwZ,SACTroB,GAAW6O,EAASwZ,QAGjBy9C,EAAUv5E,KAAKw5E,KAAM/lE,IAGhCu1C,OAAQ,SAASjgC,GACbpmB,EAAE7B,QAAQ0I,KAAK,iBAAkBuf,IAGrCpB,KAAM,WACFhlB,EAAE7B,QAAQmJ,OAAO,mBAGrBiwE,iBAAkB,SAAShzE,GACvB,IAAIizE,EACAX,EAAOtyE,EAAQsyE,KACfS,EAAW33D,EAAS23D,SACpBG,EAAOd,EAAaF,EAAclyE,EAAQmzE,WAE1Cb,IAASS,EAAW,MACpBE,EAAWX,GAGXA,IAASS,GAAYG,IACrBD,EAAWlB,EAAYmB,EAAK33E,QAAQu2E,EAAW,IAAKQ,IAGpDW,GACAt0D,EAAQD,UAAU,GAAIxW,EAAS0qE,MAAOK,MAKlD,SAASG,EAAQlsD,GACb,OAAOA,EAAI3rB,QAAQ,QAAS,KAGhC,SAAS83E,EAAQnsD,GACb,OAAOA,EAAI3rB,QAAQ,YAAa,MAGpC,IAAI+3E,EAAcf,EAAe12E,OAAO,CACpCoF,KAAM,SAASkxE,GACXr5E,KAAKy6E,IAAM95E,EAAM6uB,OACjBxvB,KAAKgf,OAASo6D,EAAcC,GAC5Br5E,KAAK26B,IAAM0+C,EAAOkB,EAAUD,GAGhCT,SAAU,SAAS17C,GACf7b,EAAS83D,KAAOp6E,KAAK26B,IAAIwD,IAG7B17B,QAAS,SAAS07B,GACdn+B,KAAK25E,gBAAgB35E,KAAK26B,IAAIwD,KAGlC67C,UAAW,SAAS5rD,GAChB,OAAIA,EAAIzY,QAAQ3V,KAAKgf,QAAU,EACrBoP,EAECA,EAAIxjB,MAAM5K,KAAKgf,QAAQ,IAItCgqC,OAAQ,SAASjgC,GACTxlB,EAAQuiB,WACRnjB,EAAE7B,QAAQkoB,GAAG,cAAgBhpB,KAAKy6E,IAAK1xD,GAEvC/oB,KAAK06E,UAAYC,YAAY5xD,EAlKhB,KAsKrBpB,KAAM,WACFhlB,EAAE7B,QAAQk4B,IAAI,cAAgBh5B,KAAKy6E,KACnCG,cAAc56E,KAAK06E,YAGvBjnE,QAAS,WACL,OAAO6lE,EAAat5E,KAAKgf,SAG7Bk7D,iBAAkB,SAAShzE,GACvB,IAAI+yE,EAAW33D,EAAS23D,SACpBT,EAAOtyE,EAAQsyE,KAEnB,SAAItyE,EAAQ0e,WAAa4zD,IAASS,KAC9Bj6E,KAAK25E,gBAAgBH,EAAOx5E,KAAKgf,OAASu6D,EAAUC,EAAMS,KACnD,MAOfY,EAAUl6E,EAAM2I,WAAWvG,OAAO,CAClCuS,MAAO,SAASpO,GAKZ,GAJAA,EAAUA,GAAW,GAErBlH,KAAKwJ,KAAK,CAACs8C,EArMR,OAqMsBgzB,GAAO5xE,IAE5BlH,KAAK47C,SAAT,CAIA57C,KAAK47C,UAAW,EAEhB10C,EAAQsyE,KAAOtyE,EAAQsyE,MAAQ,IAE/B,IACI/lE,EADAqnE,EAAU96E,KAAK+6E,cAAc7zE,GAI7B4zE,EAAQZ,iBAAiBhzE,KAI7BuM,EAAUqnE,EAAQrnE,UAElB9Q,EAAEI,OAAO/C,KAAM,CACX86E,QAASA,EACTtB,KAAMtyE,EAAQsyE,KACdwB,cAAeF,EAAQtzE,SACvBiM,QAASA,EACTwnE,UAAW,CAACxnE,KAGhBqnE,EAAQ9xB,OAAOhpD,KAAKk7E,UAAU1xE,KAAKxJ,UAGvC+6E,cAAe,SAAS7zE,GACrB,OAAO3D,EAAQqiB,WAAa1e,EAAQ0e,UAAY,IAAIg0D,EAAiB1yE,EAAQsyE,MAAQ,IAAIgB,EAAYtzE,EAAQmzE,WAGhH1yD,KAAM,WACG3nB,KAAK47C,WAGV57C,KAAK86E,QAAQnzD,OACb3nB,KAAKiK,OAAO67C,GACZ9lD,KAAK47C,UAAW,IAGpBoN,OAAQ,SAASjgC,GACb/oB,KAAKwJ,KAAKs8C,EAAQ/8B,IAGtBtmB,QAAS,SAAS07B,EAAIg9C,GAElBn7E,KAAKo7E,UAAUj9C,EAAIg9C,GAAQ,SAASL,GAChCA,EAAQr4E,QAAQ07B,GAChBn+B,KAAKi7E,UAAUj7E,KAAKi7E,UAAUzzE,OAAS,GAAKxH,KAAKyT,YAIzDomE,SAAU,SAAS17C,EAAIg9C,GACnB,GAAW,WAAPh9C,EAGA,OAFAn+B,KAAKq7E,YAAa,OAClBr7E,KAAK86E,QAAQ5gC,OAIjBl6C,KAAKo7E,UAAUj9C,EAAIg9C,GAAQ,SAASL,GAChCA,EAAQjB,SAAS17C,GACjBn+B,KAAKi7E,UAAUt5E,KAAK3B,KAAKyT,aAIjC2nE,UAAW,SAASj9C,EAAIg9C,EAAQpyD,GAC5B,IAAI+xD,EAAU96E,KAAK86E,QAEnB38C,EAAK28C,EAAQd,UAAU77C,GAEnBn+B,KAAKyT,UAAY0qB,GAAMn+B,KAAKyT,UAAYoa,mBAAmBsQ,IAK1Dg9C,GACGn7E,KAAKoK,QAAQ07C,EAAQ,CAAE13B,IAAK+P,EAAIm9C,QAAQ,MAKhDt7E,KAAKyT,QAAU0qB,EAEfpV,EAASxe,KAAKvK,KAAM86E,GAEpB96E,KAAKg7E,cAAgBF,EAAQtzE,UAdzBxH,KAAKoK,QAAQ0uE,IAiBrBoC,UAAW,WACP,IAAIJ,EAAU96E,KAAK86E,QACfrnE,EAAUqnE,EAAQrnE,UAClB47D,EAAYyL,EAAQtzE,SACpB+zE,EAAuBv7E,KAAKg7E,gBAAkB3L,EAC9Cn1B,EAAOzmC,IAAYzT,KAAKi7E,UAAUj7E,KAAKi7E,UAAUzzE,OAAS,IAAM+zE,EAChEF,EAAar7E,KAAKq7E,WAClBxa,EAAO7gE,KAAKyT,QAEhB,OAAgB,OAAZA,GAAoBzT,KAAKyT,UAAYA,GAAWzT,KAAKyT,UAAYoa,mBAAmBpa,KAIxFzT,KAAKg7E,cAAgB3L,EACrBrvE,KAAKq7E,YAAa,EAElBr7E,KAAKyT,QAAUA,EAEXymC,GAAQl6C,KAAKoK,QAAQ,OAAQ,CAAEgkB,IAAKyyC,EAAM1iC,GAAI1qB,KAC9CqnE,EAAQpB,eACR15E,KAAKyT,QAAUotD,IAIf7gE,KAAKoK,QAAQ07C,EAAQ,CAAE13B,IAAK3a,EAAS+nE,mBAAoBH,KACrDnhC,EACA4gC,EAAQpB,WAERoB,EAAQ5gC,OACRl6C,KAAKg7E,sBAETh7E,KAAKyT,QAAUotD,SAIf3mB,EACAl6C,KAAKi7E,UAAU7rD,MAEfpvB,KAAKi7E,UAAUt5E,KAAK8R,QAKhC9S,EAAMk6E,QAAUA,EAChBl6E,EAAMk6E,QAAQpB,eAAiBA,EAC/B94E,EAAMk6E,QAAQL,YAAcA,EAC5B75E,EAAMk6E,QAAQjB,iBAAmBA,EACjCj5E,EAAMs4E,YAAcA,EACpBt4E,EAAMklB,QAAU,IAAIg1D,EApVxB,CAqVG/5E,OAAOH,MAAM+G,QACF/G,OAEd,WACI,IAAIA,EAAQG,OAAOH,MACfklB,EAAUllB,EAAMklB,QAChBvc,EAAa3I,EAAM2I,WACnBmyE,EAAO,OACPC,EAAgB,eAChB51B,EAAS,SACT61B,EAAO,OACP7C,EAAO,OACP8C,EAAgB,aAChBC,EAAa,eACbC,EAAa,SACbC,EAAe,2BAEnB,SAASC,EAAkB7rE,EAAO8rE,GAC9B,OAAOA,EAAW9rE,EAAQ,UAW9B,SAAS+rE,EAAS9tD,GACd,OAAOA,EAAI3rB,QAAQ,gBAAiB,IAGxC,IAAI05E,EAAQx7E,EAAMiH,MAAM7E,OAAO,CAC3BoF,KAAM,SAASi0E,EAAOrzD,EAAUk2B,GACtBm9B,aAAiBnuE,SACnBmuE,EAfZ,SAAuBA,EAAOn9B,GAC1B,OAAO,IAAIhxC,OAAO,IAAMmuE,EACnB35E,QAAQs5E,EAAc,QACtBt5E,QAAQm5E,EAAe,WACvBn5E,QAAQo5E,EAAYG,GACpBv5E,QAAQq5E,EAAY,SAAW,IAAK78B,EAAa,IAAM,IAU5Co9B,CAAcD,EAAOn9B,IAGjCj/C,KAAKo8E,MAAQA,EACbp8E,KAAKs8E,UAAYvzD,GAGrBA,SAAU,SAASqF,EAAK8rB,EAAMohC,GAC1B,IAAIj3C,EAEA78B,EADAoC,EAAM,EAEN2yE,EAAoB57E,EAAMyjC,uBAAuBhW,GAOrD,GANImuD,EAAkBC,MAAQtiC,EAE9B9rB,EAAM8tD,EAAS9tD,GAEf5mB,GADA68B,EAASrkC,KAAKo8E,MAAM/jE,KAAK+V,GAAKxnB,MAAM,IACpBY,OAEZ8zE,EACA,KAAO1xE,EAAMpC,EAAQoC,SACU,IAAhBy6B,EAAOz6B,KACdy6B,EAAOz6B,GAAOikB,mBAAmBwW,EAAOz6B,KAKpDy6B,EAAO1iC,KAAK46E,GAEZv8E,KAAKs8E,UAAUl0E,MAAM,KAAMi8B,IAG/Bo4C,UAAW,SAASruD,EAAK8rB,EAAMohC,GAC3B,QAAIt7E,KAAKo8E,MAAMrvE,KAAKmvE,EAAS9tD,MACzBpuB,KAAK+oB,SAASqF,EAAK8rB,EAAMohC,IAClB,MAOfoB,EAASpzE,EAAWvG,OAAO,CAC3BoF,KAAM,SAASjB,GACNA,IACDA,EAAU,IAGdoC,EAAWvB,GAAGI,KAAKoC,KAAKvK,MAExBA,KAAK28E,OAAS,GACd38E,KAAK4lB,UAAY1e,EAAQ0e,UACzB5lB,KAAKq6E,SAAWnzE,EAAQmzE,SACxBr6E,KAAKw5E,KAAOtyE,EAAQsyE,KACpBx5E,KAAKi/C,YAAoC,IAAvB/3C,EAAQ+3C,WAE1Bj/C,KAAKwJ,KAAK,CAACiyE,EAAMC,EAAe51B,EAAQgzB,EAAM6C,GAAOz0E,IAGzDlF,QAAS,WACL6jB,EAAQ5b,OAAO67C,EAAQ9lD,KAAK48E,kBAC5B/2D,EAAQ5b,OAAO6uE,EAAM94E,KAAK68E,YAC1Bh3D,EAAQ5b,OAAO0xE,EAAM37E,KAAK88E,YAC1B98E,KAAKiK,UAGTqL,MAAO,WACH,IAAIrN,EAAOjI,KAEP+8E,EAAY,SAASp4E,GAAKsD,EAAKu0E,MAAM73E,IACrCq4E,EAAkB,SAASr4E,GAAKsD,EAAKg1E,YAAYt4E,IAErDkhB,EAAQvQ,MAAM,CACV4nE,KALY,WAAaj1E,EAAKk1E,SAM9Bn0B,OAAQg0B,EACR9iC,KAAM6iC,EACNn3D,UAAW3d,EAAK2d,UAChBy0D,SAAUpyE,EAAKoyE,SACfb,KAAMvxE,EAAKuxE,OAIf,IAAI4D,EAAkB,CAAEhvD,IAAKvI,EAAQpS,SAAW,IAAKtK,eAAgBxG,EAAEQ,MAElE8E,EAAKmC,QAAQqxE,EAAM2B,IACpBn1E,EAAKg1E,YAAYG,GAGrBp9E,KAAK48E,iBAAmBI,EACxBh9E,KAAK88E,WAAaC,GAGtBX,MAAO,SAASA,EAAOrzD,GACnB/oB,KAAK28E,OAAOh7E,KAAK,IAAIw6E,EAAMC,EAAOrzD,EAAU/oB,KAAKi/C,cAGrD46B,SAAU,SAASzrD,EAAK+sD,GACpBx6E,EAAMklB,QAAQg0D,SAASzrD,EAAK+sD,IAGhC14E,QAAS,SAAS2rB,EAAK+sD,GACnBx6E,EAAMklB,QAAQpjB,QAAQ2rB,EAAK+sD,IAG/BqB,MAAO,SAAS73E,GACR3E,KAAKoK,QAAQuxE,EAAM,CAAEvtD,IAAKzpB,EAAEypB,IAAK+P,GAAIx5B,EAAEw5B,MACvCx5B,EAAEwE,kBAIVg0E,MAAO,WACHn9E,KAAKoK,QAAQ0uE,IAGjBmE,YAAa,SAASt4E,GAClB,IAAIypB,EAAMzpB,EAAEypB,IACRktD,IAAW32E,EAAE22E,OACbphC,EAAOv1C,EAAE62E,kBAMb,GAJKptD,IACDA,EAAM,KAGNpuB,KAAKoK,QAAQ07C,EAAQ,CAAE13B,IAAKzpB,EAAEypB,IAAKiW,OAAQ1jC,EAAMyjC,uBAAuBz/B,EAAEypB,KAAMotD,kBAAmBthC,IACnGv1C,EAAEwE,qBADN,CAUA,IALA,IAAIS,EAAM,EACN+yE,EAAS38E,KAAK28E,OAEdn1E,EAASm1E,EAAOn1E,OAEboC,EAAMpC,EAAQoC,IAGhB,GAFQ+yE,EAAO/yE,GAEL6yE,UAAUruD,EAAK8rB,EAAMohC,GAC5B,OAIJt7E,KAAKoK,QAAQsxE,EAAe,CAAEttD,IAAKA,EAAKiW,OAAQ1jC,EAAMyjC,uBAAuBhW,GAAMotD,kBAAmBthC,KACtGv1C,EAAEwE,qBAKdxI,EAAM+7E,OAASA,EAnLnB,IA+LA,SAAU/5E,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACfoiB,EAAOpiB,EAAMoiB,KACb2G,EAAK/oB,EAAM+oB,GACXuP,EAAYt4B,EAAMs4B,UAClBnJ,EAAoBnvB,EAAMmvB,kBAC1BxmB,EAAa3I,EAAM2I,WACnBmnB,EAAS9vB,EAAM+oB,GAAG+G,OAClBb,EAAejvB,EAAMivB,aAGrB6rD,EAAO,OACP4B,EAAmB,kBACnBC,EAAiB,gBACjBC,EAAO,OACPC,EAAO,OAGPC,EAAoB,0BAEpBC,EAAa,wDAGbC,EAAa,YACbC,EAAsB,oBACtBC,EAAY,WACZC,EAAuB,qBACvBC,EAAQ,QACRC,EACS,YADTA,EAEM,SAFNA,EAGe,mBAHfA,EAIQ,WAJRA,EAKQ,WALRA,EAMQ,WAGRC,EAAOt9E,EAAM+oB,GAAG+G,OAAO1tB,OAAO,CAC9BoF,KAAM,SAASu4C,EAASx5C,GACpB,IAAIe,EAAOjI,KACXkH,EAAUA,GAAW,GACrBe,EAAKynB,GAAK/uB,EAAM6uB,OAEhBlmB,EAAWvB,GAAGI,KAAKoC,KAAKtC,GACxBjI,KAAKkH,QAAUvE,EAAEI,OAAO,GAAI/C,KAAKkH,QAASA,GAE1Ce,EAAKy4C,QAAUA,EAEXz4C,EAAKf,QAAQg3E,cACbztD,EAAO1oB,GAAGI,KAAKoC,KAAKtC,EAAMA,EAAKk2E,iBAAkBj3E,GAGjDe,EAAKf,QAAQk3E,gBACbn2E,EAAKo2E,kBAGTp2E,EAAKioB,QAAUhpB,EAAQgpB,SAAW,MAClCjoB,EAAKg7C,MAAQ/7C,EAAQ+7C,MACrBh7C,EAAKq2E,OAAyB,IAAjBp3E,EAAQ6kB,KACrB/rB,KAAKu+E,cAAgBr3E,EAAQs3E,eAAgB,EAC7Cx+E,KAAKy+E,cAAgBv3E,EAAQyI,aAC7B1H,EAAKy2E,WAAa,GAElBz2E,EAAKuB,KAAK,CAAEiyE,EAAM8B,EAAMC,EAAMH,EAAkBC,GAAkBp2E,IAGtEA,QAAS,CACL9E,KAAM,OACN87E,cAAc,EACdE,gBAAgB,EAChBO,cAAc,EACdC,iBAAiB,GAGrBhvE,OAAQ,SAASymB,GACb,IAAIpuB,EAAOjI,KACP6+E,GAAkB52E,EAAK4D,QAsB3B,OAlBIgzE,IACA52E,EAAK4D,QAAU5D,EAAKk2E,kBAGpB9nD,GACA1zB,EAAE0zB,GAAWyjB,OAAO7xC,EAAK4D,SAGzBgzE,IACAl+E,EAAM6I,KAAKvB,EAAK4D,QAAS5D,EAAKg7C,OAC9Bh7C,EAAKmC,QAAQqxE,IAGbplD,IACApuB,EAAK62E,cA9EJ,UA+ED72E,EAAKmC,QAAQmzE,IAGVt1E,EAAK4D,SAGhB1E,MAAO,WACH,OAAO,IAAI43E,EAAU/+E,OAGzBg/E,kBAAmB,WACf,OAAO,GAGXC,kBAAmB,WACf,OAAO,GAGXC,UAAW,WACP,IACIrzE,EADO7L,KACQ4P,SAEf/D,GACAA,EAAQe,IAAI,UAAW,IAG3B5M,KAAKoK,QAAQuzE,EAAY,CAAElmD,KAAMz3B,QAGrCm/E,QAAS,aAGTC,QAAS,WACLp/E,KAAKmN,QAGT6tC,iBAAkB,SAASt1C,GACvB1F,KAAKoK,QAAQizE,EAAkB,CAAE33E,KAAMA,KAG3Cu1C,gBAAiB,SAASv1C,GACtB1F,KAAKoK,QAAQkzE,EAAgB,CAAE53E,KAAMA,KAGzCyH,KAAM,WACEnN,KAAKkH,QAAQy3E,eACb3+E,KAAK8+E,cA5HJ,UA6HDn8E,EAAE3C,KAAK6L,SAASwzE,UAGpBr/E,KAAKoK,QAAQozE,IAGjBx7E,QAAS,WACL,IAAIiG,EAAOjI,KACP6L,EAAU5D,EAAK4D,QAEfA,IACA4kB,EAAO1oB,GAAG/F,QAAQuI,KAAKtC,GAEvBtH,EAAMsJ,OAAO4B,GACblL,EAAMqB,QAAQ6J,GAEV5D,EAAKf,QAAQ03E,iBACb/yE,EAAQirB,WAMpBwoD,MAAO,WACH,IAAIr3E,EAAOjI,KAEXiI,EAAKjG,UACLW,EAAEsF,EAAK4D,SAASoB,IAAIhF,EAAKy4C,SAASzzC,IAAIhF,EAAKmE,SAAS4sB,MAAMlC,UAG9DyoD,UAAW,SAASA,GAChB58E,EAAEI,OAAO/C,KAAK0+E,WAAYa,IAG9BT,cAAe,SAASU,GACpB,IAAK,IAAI/6D,KAAezkB,KAAK0+E,WACzB1+E,KAAK0+E,WAAWj6D,GAAa+6D,GAAYx/E,KAAMykB,IAIvD05D,eAAgB,WACZ,IAEItyE,EACA60C,EAHAz4C,EAAOjI,KACPoM,EAAU,IAAMnE,EAAKioB,QAAU,IAInC,IAlLK,YAmLDwwB,EAAU/9C,EAAEyM,SAASqwE,eAAex3E,EAAKy4C,UAAYz4C,EAAKy4C,UAE9C,GAAGxwB,UACXwwB,EAAUA,EAAQ5wC,QAExB,MAAOnL,GACD84E,EAAkB1wE,KAAKpI,EAAE2rB,WACzBowB,EAAUz4C,EAAKy4C,SAIvB,GAAuB,iBAAZA,EACPA,EAAUA,EAAQj+C,QAAQ,aAAc,IACpCwF,EAAKs2E,gBACL79B,EAAU//C,EAAMkP,SAAS6wC,EAAS,CAAE/wC,aAAc1H,EAAKw2E,eAA7C99E,CAA8DsH,EAAKg7C,OAAS,KAG1Fp3C,EAAUlJ,EAAEyJ,GAAS0tC,OAAO4G,GAMvBz4C,EAAKq2E,QACPzyE,EAAUA,EAAQ6zE,gBAElB,CAEH,GADA7zE,EAAU60C,EACNz4C,EAAKs2E,cAAe,CACpB,IAAIhoE,EAAS5T,EAAEhC,EAAMkP,SAASlN,EAAE,WAAWm3C,OAAOjuC,EAAQ1E,OAAM,IAAO2I,OAAQ,CAAEH,aAAc1H,EAAKw2E,eAArF99E,CAAsGsH,EAAKg7C,OAAS,KAG/HtgD,EAAEuyB,SAAS9lB,SAAUvD,EAAQ,KAC7BA,EAAQkrE,YAAYxgE,GAGxB1K,EAAU0K,EAEVtO,EAAKq2E,QACLzyE,EAAUA,EAAQ86C,QAAQv6C,GAASD,UAI3C,OAAON,GAGXwyE,gBAAiB,WACb,IAAIp2E,EAAOjI,KAEPiI,EAAKf,QAAQk3E,iBACbn2E,EAAK03E,WACL13E,EAAK23E,iBACL33E,EAAK43E,gBACL53E,EAAK63E,kBAIbH,SAAU,WACN,IAAI13E,EAAOjI,KACP0gD,EAAUz4C,EAAKy4C,QAEfA,EAAQn0C,GAAGqjB,EAAa,SACxB3nB,EAAKmE,QAAUnE,EAAKy4C,QAEpBz4C,EAAKmE,QAAUs0C,EACV30B,KAAK,aAAeprB,EAAM4qB,GAAK,uBAAyB5qB,EAAM4qB,GAAK,oBAAsB5qB,EAAM4qB,GAAK,+BACpGpf,SAGT,IAAIC,EAAUnE,EAAKmE,QAEnBA,EAAQ2W,KAAK,KAAM9a,EAAKynB,IAExBtjB,EAAQkY,SAAS05D,GACjB5xE,EAAQkY,SAAS05D,GACjB5xE,EAAQ2W,KAAK,OAAQ,SAGzB68D,eAAgB,WACZ,IACIxzE,EAAUzJ,EADH3C,KACUoM,SACjB2zE,EAAkBnwD,EAAa,WAE9BxjB,EAAQ8oC,SAAS6qC,GAAiB,IACZ3zE,EAAQ8oC,WAAWlf,QAAO,WAC7C,IAAIyN,EAAQ9gC,EAAE3C,MACd,IAAKyjC,EAAMl3B,GAAGqjB,EAAa,aAAe6T,EAAMl3B,GAAGqjB,EAAa,WAC5D,OAAO6T,KAIE1X,KAAK,QAAUhJ,EAAK,QAAU,qBAInD/iB,KAAKggF,eAAiB5zE,EAAQ8oC,SAAStlB,EAAa,YAEpD5vB,KAAKggF,eACA17D,SAAS05D,GACT15D,SAAS05D,IAGlB6B,cAAe,WACX,IACIzzE,EADOpM,KACQoM,QAEnBpM,KAAKmgD,OAAS/zC,EAAQ8oC,SAAStlB,EAAa,WAAWtL,SAAS05D,IAGpE8B,cAAe,WACX,IACI1zE,EADOpM,KACQoM,QAEnBpM,KAAKigF,OAAS7zE,EAAQ8oC,SAAStlB,EAAa,WAAWtL,SAAS05D,MAIpEe,EAAYp+E,EAAMiH,MAAM7E,OAAO,CAC/BoF,KAAM,SAASsvB,GACX90B,EAAEI,OAAO/C,KAAM,CACX6L,QAAS4rB,EAAK5rB,QAAQ1E,OAAM,GAC5B+qC,WAAYza,EAAKya,WACjBxiB,GAAI+H,EAAK/H,KAGb+H,EAAK5rB,QAAQM,SAAS2tC,OAAO95C,KAAK6L,UAGtCuzE,QAAS,WACLp/E,KAAK6L,QAAQirB,UAGjBkkB,iBAAkBr4C,EAAEQ,KACpB83C,gBAAiBt4C,EAAEQ,OAGnB+8E,EAASjC,EAAKl7E,OAAO,CACrBoF,KAAM,SAASu4C,EAASx5C,GACpB+2E,EAAKl2E,GAAGI,KAAKoC,KAAKvK,KAAM0gD,EAASx5C,GACjClH,KAAKuzE,WAAa,IAGtBl9C,UAAW,SAAS7Q,GAChB,IAAI6Q,EAAYr2B,KAAKuzE,WAAW/tD,GAOhC,OALK6Q,IACDA,EAAYr2B,KAAKmgF,iBAAiB36D,GAClCxlB,KAAKuzE,WAAW/tD,GAAY6Q,GAGzBA,GAGX+pD,OAAQ,SAAS56D,EAAUiS,EAAMya,GAC7BlyC,KAAKq2B,UAAU7Q,GAAUtY,KAAKuqB,EAAMya,IAGxCiuC,iBAAkB,SAAS36D,GACvB,IAEI6Q,EAFAmjD,EAAOx5E,KAAK4P,SACZ/D,EAAU2tE,EAAK1jD,KAAKtQ,GAGxB,IAAK3Z,EAAQrE,QAAUgyE,EAAKjtE,GAAGiZ,GAAW,CACtC,IAAIg0D,EAAKjtE,GAAGiZ,GAIR,MAAM,IAAI/U,MAAM,6CAA+C+U,EAAW,aAH1E3Z,EAAU2tE,EAalB,OANAnjD,EAAY,IAAIgqD,EAAcx0E,IAEpBrC,KAAK,YAAY,SAAS7E,GAChCA,EAAE8yB,KAAK7nB,OAAO/D,MAGXwqB,KAIXiqD,EAAWrC,EAAKl7E,OAAO,CACvBw9E,OAAQ,SAAS9oD,EAAMhT,GACnBgT,EAAK5rB,QAAQiqB,KAAKrR,GAAasyD,YAAY/2E,KAAK4P,WAGpDyvE,OAAQ,eAIRmB,EAAmB,4BAgBvB,IAAIH,EAAgB/2E,EAAWvG,OAAO,CAClCoF,KAAM,SAASkuB,GACX/sB,EAAWvB,GAAGI,KAAKoC,KAAKvK,MACxBA,KAAKq2B,UAAYA,EACjBr2B,KAAK6lB,QAAU,GACf7lB,KAAKy3B,KAAO,KACZz3B,KAAKygF,SAAU,GAGnBC,MAAO,WACH1gF,KAAKygF,SAAU,EACfzgF,KAAKoK,QAAQ,WAAY,CAAEqtB,KAAMz3B,KAAKy3B,OACtCz3B,KAAKoK,QAAQ,UAGjBuB,IAAK,WACD3L,KAAKy3B,KAAK0nD,UACVn/E,KAAKu4C,SAAS6mC,UACdp/E,KAAK0gF,SAGTxzE,KAAM,SAASuqB,EAAMya,EAAYyuC,GAC7B,IAAKlpD,EAAKunD,qBAAwBh/E,KAAKy3B,OAASz3B,KAAKy3B,KAAKwnD,oBAEtD,OADAj/E,KAAKoK,QAAQ,UACN,EAGXu2E,EAAaA,GAAclpD,EAAK/H,GAEhC,IAAIznB,EAAOjI,KACPyT,EAAWgkB,IAASxvB,EAAKwvB,KAAQA,EAAKtwB,QAAUc,EAAKwvB,KACrD5R,EAAU5d,EAAK4d,QAEfq0B,GADgBr0B,EAAQA,EAAQre,OAAS,IAAM,IAC1BkoB,KAAOixD,EAG5BC,EAAgB1uC,IAAgBgI,EAAOr0B,EAAQA,EAAQre,OAAS,GAAG0qC,WAAaza,EAAKya,YACrF2uC,EAnDZ,SAAyB3uC,GACrB,IAAKA,EACD,MAAO,GAGX,IAAI1wC,EAAU0wC,EAAW/hC,MAAMqwE,IAAqB,GAEpD,MAAO,CACH96E,KAAMlE,EAAQ,GACdwyC,UAAWxyC,EAAQ,GACnBsU,QAAwB,YAAftU,EAAQ,IAyCIs/E,CAAgBF,GAqBrC,OAnBI34E,EAAKw4E,SACLx4E,EAAK4rC,OAAOlsB,OAGM,SAAlBi5D,IACAA,EAAgB,MAGpB34E,EAAKmC,QAAQ,WAAY,CAAEqtB,KAAMA,IACjCxvB,EAAKwvB,KAAOA,EACZxvB,EAAKswC,SAAW9kC,EAChBxL,EAAKw4E,SAAU,EAEVvmC,EAGDr0B,EAAQuJ,MAFRvJ,EAAQlkB,KAAK,CAAE+tB,GAAIixD,EAAYzuC,WAAY0uC,IAK1CntE,GAOAmtE,GAAkBjgF,EAAM4lB,QAAQU,SAMjCwQ,EAAK5rB,QAAQyY,SAAS,eACtBmT,EAAKynD,YAEDhlC,IAAShI,IACT2uC,EAAe/qE,SAAW+qE,EAAe/qE,SAG7C7N,EAAK4rC,OAASlzC,EAAMgpB,GAAG8N,EAAK5rB,SAASpJ,QAAQgR,EAAQ5H,QAASg1E,EAAen7E,MACxEs1C,kBAAiB,WACdvjB,EAAKujB,iBAAiB,QACtBvnC,EAAQunC,iBAAiB,WAE5BC,iBAAgB,WACbxjB,EAAKwjB,gBAAgB,QACrBxnC,EAAQwnC,gBAAgB,WAE3BjH,UAAU6sC,EAAe7sC,WACzBoB,WAAWyrC,EAAe/qE,SAE/B7N,EAAK4rC,OAAOmB,MAAMilB,MAAK,WAAahyD,EAAK0D,WAxBzC8rB,EAAKynD,YACLj3E,EAAK0D,QA0BF,IAlCH8rB,EAAKynD,YACLznD,EAAK0nD,UACLl3E,EAAKy4E,SACE,IAkCf1+E,QAAS,WACL,IACIy1B,EADOz3B,KACKy3B,KAEZA,GAAQA,EAAKz1B,SACby1B,EAAKz1B,aAKb++E,EAAaz3E,EAAWvG,OAAO,CAC/BoF,KAAM,SAASjB,GACX,IACIoxB,EACAjC,EAFApuB,EAAOjI,KAIXsJ,EAAWvB,GAAGI,KAAKoC,KAAKtC,GACxBA,EAAKf,QAAUA,EAEfvE,EAAEI,OAAOkF,EAAMf,GACfe,EAAK+4E,QAAUr+E,EAAE,WACjB0zB,EAAYpuB,EAAKouB,UAEjBiC,EAAQrwB,EAAKg5E,WAAW5qD,GACxBpuB,EAAKi5E,SAAW5oD,EAAMpuB,QACtBjC,EAAKk5E,QAAU,GAEfl5E,EAAKm5E,cAAgB,IAAIzgF,EAAM0/E,cAAcp4E,EAAKouB,WAElDpuB,EAAKm5E,cAAc53E,KAAK,YAAY,SAAS7E,GACzCA,EAAE8yB,KAAK4M,OAASp8B,EAAKo8B,UAGzBp8B,EAAKm5E,cAAc53E,KAAK,YAAY,SAAS7E,GACzCsD,EAAKmC,QAAQyzE,EAAW,CAAEpmD,KAAM9yB,EAAE8yB,UAGtCxvB,EAAKm5E,cAAc53E,KAAKu0E,GAAO,WAC3B91E,EAAKmC,QAAQ2zE,MAGjB/9E,KAAKwJ,KAAKxJ,KAAKqK,OAAQnD,IAG3BmD,OAAQ,CACJszE,EACAI,EACAF,EArgBS,YACG,eAugBZD,EACAE,GAGJ97E,QAAS,WACL,IAAIiG,EAAOjI,KACPohF,EAAgBn5E,EAAKm5E,cAIzB,IAAK,IAAI1xD,KAFT/uB,EAAMqB,QAAQiG,EAAKouB,WAEJpuB,EAAKk5E,QAChBnhF,KAAKmhF,QAAQzxD,GAAI1tB,UAGjBo/E,GACAA,EAAcp/E,WAItBy1B,KAAM,WACF,OAAOz3B,KAAKohF,cAAc3pD,MAG9B4pD,SAAU,SAASjzD,EAAK8jB,EAAY7N,GAMhC,GAJY,MADZjW,EAAMA,EAAI3rB,QAAQ,IAAIwL,OAAO,IAAMjO,KAAKshF,qBAAsB,MAC5CthF,KAAKshF,sBACnBlzD,EAAM,KAGNA,EAAI3rB,QAAQ,KAAM,MAAQzC,KAAKouB,IAE/B,OADApuB,KAAKoK,QAAQwzE,IACN,EAGX59E,KAAKoK,QAAQuzE,GAEb,IAAI11E,EAAOjI,KACP6L,EAAU5D,EAAKs5E,iBAAiBnzD,GAChCqJ,EAAO92B,EAAMw1B,eAAetqB,GAahC,OAXA5D,EAAKmmB,IAAMA,EAAI3rB,QAAQ,KAAM,IAE7BwF,EAAKo8B,OAASA,EAEV5M,GAAQA,EAAK+pD,SACb/pD,EAAK6nD,QACLzzE,EAAU,IAGd7L,KAAKoK,QAAQ0zE,EAAsB,CAAE/a,OAA2B,IAAnBl3D,EAAQrE,OAAc4mB,IAAKA,KAEpEviB,EAAQ,KACH4rB,IACDA,EAAOxvB,EAAKw5E,YAAY51E,IAGrB5D,EAAKm5E,cAAcl0E,KAAKuqB,EAAMya,EAAY9jB,KAMzD0rB,OAAQ,SAAShqC,EAAMse,GACnB,IAGIkK,EACAb,EAJAupD,EAAUhhF,KAAKghF,QACfU,GAAWtzD,GAAO,IAAIxjB,MAAM,KAAK,GACjCyrB,EAAYr2B,KAAKq2B,UA0BrB,OAtBIqnD,EAAW3wE,KAAK+C,KAChBA,EAAO7B,OAAO6lC,IAGlBktC,EAAQ,GAAGjjE,UAAYjO,EAEvBumB,EAAUyjB,OAAOknC,EAAQ9rC,SAAS,mBAGlCzd,GADAa,EAAQt4B,KAAKihF,WAAWD,IACX92E,SAGH1C,SACN8wB,EAAQb,EAAOupD,EAAQW,UAAU,0BAA0BzsC,YAG3DwsC,GACAjqD,EAAKtqB,OAAO4V,KAAKA,EAAK,OAAQ2+D,GAGlCrrD,EAAUyjB,OAAOxhB,GAEVt4B,KAAKyhF,YAAYhqD,IAG5BmqD,QAAS,SAAS5xD,GACd,OAAOhwB,KAAK6hF,SAAW/xD,EAAkBE,GAAaJ,EAAaI,IAGvEuxD,iBAAkB,SAASnzD,GACvB,IAAIviB,EACA61E,EAAUtzD,EAAIxjB,MAAM,KAAK,GAE7B,OAAK82E,IAIL71E,EAAU7L,KAAKq2B,UAAU6e,SAAS,IAAMnyB,EAAK,OAAS,KAAO2+D,EAAU,OAG1D,KAAgC,IAA1BA,EAAQ/rE,QAAQ,OAC/B9J,EAAU7L,KAAKq2B,UAAU6e,SAA+B,MAAtBwsC,EAAQ52E,OAAO,GAAa42E,EAAU,IAAMA,IAG7E71E,EAAQ,KACTA,EAAU7L,KAAK8hF,qBAAqB1zD,IAGjCviB,GAdI7L,KAAKkhF,UAiBpBY,qBAAsB,SAASpyD,GAE3B,OADc1vB,KAAKq2B,UAAU6e,SAAS,QAAUxlB,EAAK,OAIzD+xD,YAAa,SAAS51E,GAElB,OAAO7L,KAAK+hF,eAAel2E,IAG/Bm2E,kBAAmB,SAASn2E,GACxB,OAAOlL,EAAM00B,WAAWxpB,EAAS,CAC7Bo2E,kBAAmBjiF,KAAKkyC,WACxBgwC,OAAQliF,KAAKkiF,OACb7rD,UAAWr2B,KAAKq2B,UAChB8rD,UAAWniF,KAAKoiF,eAChBC,WAAYriF,KAAKqiF,WACjBb,OAAQvoD,EAAUptB,EAAS,WAC5B6d,EAAG4L,QAGVysD,eAAgB,SAASl2E,GACrB,IAAIy2E,GAAetiF,KAAKkH,SAAW,IAAIo7E,aAAe,GACtD,OAAO,IAAI3hF,EAAMs9E,KAAKpyE,EAAS,CAC3BqyE,aAAcoE,EAAYpE,aAC1BnyD,KAAMu2D,EAAYv2D,OAAQ,EAC1BqyD,eAAgBkE,EAAYlE,eAC5BO,aAAc2D,EAAY3D,aAC1BC,gBAAiB0D,EAAY1D,mBAIrCqC,WAAY,SAAS5qD,GACjB,OAAOA,EAAU6e,SAASl1C,KAAK4hF,QAAQ,SAASz0E,UAIxDxM,EAAMogF,WAAaA,EAEnBpgF,EAAM0/E,cAAgBA,EACtB1/E,EAAM2/E,SAAWA,EACjB3/E,EAAMu/E,OAASA,EACfv/E,EAAMs9E,KAAOA,EACbt9E,EAAMo+E,UAAYA,EAhsBtB,CAksBGj+E,OAAOH,MAAM+G,QACF/G,OAUd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACf4C,EAAU5C,EAAM4C,QAChBqE,EAAQjH,EAAMiH,MACd0B,EAAa3I,EAAM2I,WACnBqpC,EAAMvkC,KAAKukC,IACX5vC,EAASJ,EAAEI,OACXw/E,EAAKh/E,EAAQmf,SACb8/D,EAAoBD,GAAMA,EAAGliE,QAC7BoiE,EAAmB,IAEnBC,EAAoBn/E,EAAQwe,QAAQsB,KAAO,EAAI,EAG/Cs/D,EAAQ,QACRC,EAAO,OACPC,EAAS,SACTC,EAAQ,QACRC,EAAO,OACPn4D,EAAM,MACNo4D,EAAS,SACTC,EAAM,MACNC,EAAY,YACZC,EAAU,UAEVC,EAAgB,gBAChBC,EAAa,aACbC,EAAa,aAEbC,EAAY,CACZC,IAAO,EACPhlE,MAAS,EACTilE,MAAS,EACTC,QAAW,GAGXC,GAA0BpgF,EAAQib,OAASjb,EAAQyf,qBAEvD,SAAS4gE,EAAWC,EAAQC,GACxB,IAAIC,EAAKF,EAAOz+E,EAAEkd,SACd0hE,EAAKH,EAAO1/E,EAAEme,SACd2hE,EAAKH,EAAO1+E,EAAEkd,SACd4hE,EAAKJ,EAAO3/E,EAAEme,SACd6hE,EAAKJ,EAAKE,EACVG,EAAKJ,EAAKE,EAEd,MAAO,CACHG,OAAQ,CACLj/E,GAAI2+E,EAAKE,GAAM,EACf9/E,GAAI6/E,EAAKE,GAAM,GAGlBI,SAAUjhF,KAAKkhF,KAAKJ,EAAKA,EAAKC,EAAKA,IAI3C,SAASI,EAAW7/E,GAChB,IAGa6C,EACTmhB,EACAnK,EALAiK,EAAU,GACVC,EAAgB/jB,EAAE+jB,cAClB+7D,EAAgB9/E,EAAE8/E,cAClB76E,EAAM,EAIV,GAAIjF,EAAE6+E,IACF/6D,EAAQ9mB,KAAK,CACT+tB,GAAI,EACJvQ,MAAOxa,EACP2C,OAAQ3C,EAAE2C,OACVm9E,cAAe9/E,EAAE2C,OACjBgb,SAAU3d,EACVe,KAAM,aAGT,GAAIf,EAAEe,KAAKyK,MAAM,SAElB,IAAK3I,GADLmhB,EAAiBD,EAAgBA,EAAcC,eAAiB,IACnCnhB,OAAQoC,EAAMpC,EAAQoC,IAC/C4U,EAAQmK,EAAe/e,GACvB6e,EAAQ9mB,KAAK,CACT2gB,SAAU9D,EACVW,MAAOxa,EACP2C,OAAQkX,EAAMlX,OACdm9E,cAAeA,EACf/0D,GAAIlR,EAAMkmE,WACVh/E,KAAM,eAITnC,EAAQ6iB,UAAY7iB,EAAQ2iB,WACjCuC,EAAQ9mB,KAAK,CACT2gB,SAAUoG,EACVvJ,MAAOxa,EACP2C,OAAQ3C,EAAE2C,OACVm9E,cAAeA,EACf/0D,GAAIhH,EAAci8D,UAClBj/E,KAAM,YAGV+iB,EAAQ9mB,KAAK,CACT+tB,GAAI,EACJvQ,MAAOxa,EACP2C,OAAQ3C,EAAE2C,OACVm9E,cAAeA,EACfniE,SAAU3d,EACVe,KAAM,UAId,OAAO+iB,EAGX,IAAIm8D,EAAYh9E,EAAM7E,OAAO,CACzBoF,KAAM,SAAS48B,EAAMziB,GACjB,IAAIra,EAAOjI,KAEXiI,EAAK88B,KAAOA,EAEZ98B,EAAK48E,oBAAoBviE,GAEzBra,EAAK68E,cAAgB78E,EAAKqa,SAC1Bra,EAAK88E,SAAW98E,EAAK08B,MAAQ,EAC7B18B,EAAK+8E,UAAYryC,KAGrBrY,KAAM,SAAShY,GACX,IAAIra,EAAOjI,KACP+c,EAASuF,EAAS,OAASra,EAAK88B,MAChCigD,EAAYryC,IACZsyC,EAAaD,EAAY/8E,EAAK+8E,WAAc,GAE3CjoE,GAAUylE,IAIfv6E,EAAK08B,MAAQ5nB,EAAS9U,EAAKqa,SAE3Bra,EAAK48E,oBAAoBviE,GAEzBra,EAAKi9E,aAAenoE,EAAS9U,EAAK68E,cAClC78E,EAAK88E,SAAW98E,EAAK08B,MAAQsgD,EAC7Bh9E,EAAK+8E,UAAYA,IAGrBH,oBAAqB,SAASviE,GAC1B,IAAIra,EAAOjI,KAAM+kC,EAAO98B,EAAK88B,KAE7B98B,EAAKqa,SAAWA,EAAS,OAASyiB,GAClC98B,EAAKu8B,OAASliB,EAAS,SAAWyiB,GAClC98B,EAAKqX,OAASgD,EAAS,SAAWyiB,MAItCogD,EAAQv9E,EAAM7E,OAAO,CACrBoF,KAAM,SAASi9E,EAAY99E,EAAQ+9E,GAC/BtiF,EAAO/C,KAAM,CACToF,EAAG,IAAIw/E,EAAU,IAAKS,EAAU/iE,UAChCne,EAAG,IAAIygF,EAAU,IAAKS,EAAU/iE,UAChC5c,KAAM2/E,EAAU3/E,KAChB4/E,cAAeF,EAAWE,cAC1BC,UAAWH,EAAWG,WAAahC,EAAU8B,EAAU3/E,MACvD0/E,WAAYA,EACZ99E,OAAQA,EACRm9E,cAAeY,EAAUZ,cACzBe,aAAcH,EAAU/9E,OACxBooB,GAAI21D,EAAU31D,GACd+1D,WAAYJ,EACZK,QAASN,EAAWM,QACpBC,iBAAkBP,EAAWO,iBAC7BC,QAAQ,EACRC,WAAW,KAInBC,MAAO,WACH9lF,KAAK+lF,aAAejtD,WAAW94B,KAAKgmF,MAAMx8E,KAAKxJ,MAAOA,KAAKolF,WAAWa,SACtEjmF,KAAKkmF,SAASvD,EAAO3iF,KAAKylF,aAG9BU,KAAM,SAASd,GACX,IAAIp9E,EAAOjI,KACXiI,EAAKm9E,WAAWM,UACe,GAA3Bz9E,EAAKm9E,WAAWM,UAChBz9E,EAAKm+E,cAAgBttD,YAAW,WACG,GAA3B7wB,EAAKm9E,WAAWM,QAChBz9E,EAAKi+E,SAASjD,EAAKoC,GAGnBp9E,EAAKi+E,SAAShD,EAAWmC,GAE7Bp9E,EAAKm9E,WAAWM,QAAU,IAnLxB,OAwLdM,MAAO,WACHhmF,KAAKkmF,SAAStD,EAAM5iF,KAAKylF,aAG7BnrD,KAAM,SAAS+qD,GACX,IAAIp9E,EAAOjI,KACPqmF,EAAiC,QAAnBhB,EAAU3/E,MAAkBuC,EAAKm9E,WAAWkB,eAE9D,IAAIr+E,EAAK49E,YAAaQ,EAAtB,CAKA,GAHAp+E,EAAK7C,EAAEk1B,KAAK+qD,EAAU/iE,UACtBra,EAAK9D,EAAEm2B,KAAK+qD,EAAU/iE,WAEjBra,EAAK29E,OAAQ,CACd,GAAI39E,EAAKs+E,yBACL,OAGJ,GAAKC,EAAW/yE,SAAW+yE,EAAW/yE,UAAYxL,EAAKm9E,WAGnD,OAAOn9E,EAAKw+E,UAFZx+E,EAAKy+E,OAAOrB,GAOfp9E,EAAK49E,WACN59E,EAAKi+E,SAASnD,EAAMsC,KAI5B15E,IAAK,SAAS05E,GACVrlF,KAAK2mF,QAAUh0C,IAEX3yC,KAAK6lF,YAGT7lF,KAAK6lF,WAAY,EAEjB7lF,KAAKkmF,SAAS/C,EAASkC,GAEnBrlF,KAAK4lF,OACL5lF,KAAKkmF,SAASt7D,EAAKy6D,GAEdrlF,KAAKslF,gBACFtlF,KAAK2lF,iBACL3lF,KAAKmmF,KAAKd,GAGVrlF,KAAKkmF,SAASjD,EAAKoC,IAK/BnrD,aAAal6B,KAAK+lF,cAElB/lF,KAAKymF,YAGTA,QAAS,WACL,IACIG,EADa5mF,KAAKolF,WACS38D,QAE/BzoB,KAAK6lF,WAAY,EACjB7lF,KAAKylF,WAAa,KAClBvrD,aAAal6B,KAAK+lF,cAElBa,EAAcp8E,OAAO7H,EAAEyyB,QAAQp1B,KAAM4mF,GAAgB,IAGzDpoC,KAAM,WACFx+C,KAAKymF,WAGTlsD,OAAQ,WACJv6B,KAAKymF,WAGTI,QAAS,WACL,OAAO7mF,KAAK4lF,QAGhBc,OAAQ,SAASrB,GACbnrD,aAAal6B,KAAK+lF,cAElB/lF,KAAK8mF,UAAYn0C,IACjB3yC,KAAK4lF,QAAS,EACd5lF,KAAKkmF,SAASpD,EAAOuC,IAGzBa,SAAU,SAAS9jF,EAAMijF,GACrB,IAAIp9E,EAAOjI,KACP0kC,EAAc2gD,EAAUlmE,MACxBtR,EAAO,CACH2Q,MAAOvW,EACP7C,EAAG6C,EAAK7C,EACRjB,EAAG8D,EAAK9D,EACRmD,OAAQW,EAAKX,OACb6X,MAAOulB,GAGXz8B,EAAKm9E,WAAW7wD,OAAOnyB,EAAMyL,IAC7B62B,EAAYv7B,kBAIpBo9E,uBAAwB,WACpB,IAAIQ,EAAS/mF,KAAKoF,EAAE8/E,aAChB8B,EAAShnF,KAAKmE,EAAE+gF,aAEpB,OAAO7hF,KAAKkhF,KAAKwC,EAASA,EAASC,EAASA,IAAWhnF,KAAKulF,aAIpE,SAAS0B,EAAgBl+D,GAKrB,IAJA,IAAIm+D,EAAavmF,EAAM05B,SAAS7M,GAAG5iB,MAAM,KACrChB,EAAM,EACNpC,EAAS0/E,EAAW1/E,OAEjBoC,EAAMpC,EAAQoC,IACjBmf,EAASm+D,EAAWt9E,IAI5B,IAAI48E,EAAal9E,EAAWvG,OAAO,CAC/BoF,KAAM,SAAS0D,EAAS3E,GACpB,IACI8uB,EADA/tB,EAAOjI,KAEPurB,EAAK5qB,EAAM6uB,OAoCf,GAlCAtoB,EAAUA,GAAW,GACrB8uB,EAAS/tB,EAAK+tB,OAAS9uB,EAAQ8uB,OAC/B/tB,EAAKs9E,UAAYr+E,EAAQq+E,WAAa7C,EACtCz6E,EAAKg+E,QAAU/+E,EAAQ++E,SAAWxD,EAClCx6E,EAAKwgB,QAAU,GACfxgB,EAAKk/E,YAAcjgF,EAAQkgF,WAAa,EAAI,EAC5Cn/E,EAAKo/E,eAAiBngF,EAAQmgF,eAC9Bp/E,EAAKq/E,iBAAmBpgF,EAAQogF,iBAChCr/E,EAAKq9E,eAAiBp+E,EAAQqgF,UAAYhkF,EAAQuf,eAClD7a,EAAKu/E,QAAUj8D,EACftjB,EAAKy9E,QAAU,EACfz9E,EAAK09E,iBAAmBz+E,EAAQy+E,iBAEhC95E,EAAUlJ,EAAEkJ,GAAS/B,QAAQ7B,GAC7BqB,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExBlF,EAAOkF,EAAM,CACT4D,QAASA,EAET47E,QAASvgF,EAAQ7H,QAAUskF,EAAwBhhF,EAAEkJ,EAAQ,GAAG67E,cAAcruE,iBAAmB1W,EAAEuE,EAAQugF,SAAW57E,GACtHmuB,gBAAiB9yB,EAAQ8yB,gBACzB2tD,SAAS,IAGb1/E,EAAKw/E,QAAQ39E,QAAQ7B,GAChB+gB,GAAGroB,EAAM46B,cAAc,OAAQhQ,GAAK,SACpCvC,GAAGroB,EAAM46B,cAAc,YAAahQ,GAAK,QAE9C1f,EAAQmd,GAAGroB,EAAM46B,cAAc,OAAQhQ,GAAKyK,EAAQ,UAEhD/tB,EAAKq9E,eACLz5E,EAAQmd,GAAGroB,EAAM46B,cAAc,QAAShQ,GAAKyK,EAAQ,UAGrDzyB,EAAQ6iB,UAAY7iB,EAAQ2iB,WAE5B,GAAI3iB,EAAQwe,QAAQvf,QAAU,GAAI,CAC9B,IAAIolF,EAAgB,6BACpB/7E,EAAQe,IAAI,mBAAoB1F,EAAQ2gF,aAAsC,QAAvB3gF,EAAQ2gF,YAAwBD,EAAgB,IAAM1gF,EAAQ2gF,YAAcD,QAEnI/7E,EAAQe,IAAI,eAAgB1F,EAAQ2gF,aAAe,QAU3D,GANI3gF,EAAQ4gF,kBACRj8E,EAAQmd,GAAGroB,EAAM46B,cAAc,YAAahQ,GAAK5qB,EAAMwI,gBAG3D0C,EAAQmd,GAAGroB,EAAM46B,cAAc,YAAahQ,GAAKyK,EAAQ,CAAEwjD,KAAM3tE,GAAW,WAExE5D,EAAKq/E,kBAAoB/jF,EAAQghB,aAAc,CAC/C,IAAIwjE,EAAiB9/E,EAAKw/E,QAAQ,GAC9BO,EAAuB//E,EAAKggF,gBAAgBz+E,KAAKvB,GAErDg/E,GAAgB,SAASx9E,GACrBs+E,EAAetmF,iBAAiBgI,EAAWu+E,GAAsB,MAIzE//E,EAAKuB,KAAK,CACVm5E,EACAC,EACAK,EACAC,EACAJ,EACAC,EACAn4D,EACAu4D,EACAH,EAhXW,eAkXXI,EACAC,EACAC,EACAT,GACG37E,IAGP+gF,gBAAiB,SAAStjF,GAClB3E,KAAKkoF,YACLvjF,EAAEwE,kBAIVnH,QAAS,WACL,IAAIiG,EAAOjI,KAEX,IAAIiI,EAAK+sD,WAAT,CAMA,GAFA/sD,EAAK+sD,YAAa,EAEd/sD,EAAKq/E,kBAAoB/jF,EAAQghB,aAAc,CAC/C,IAAIwjE,EAAiB9/E,EAAKw/E,QAAQ,GAClCR,GAAgB,SAASx9E,GACrBs+E,EAAe9lF,oBAAoBwH,EAAWxB,EAAKggF,oBAI3DhgF,EAAK4D,QAAQ2rB,aAAavvB,EAAKu/E,SAC/Bv/E,EAAKw/E,QAAQjwD,aAAavvB,EAAKu/E,SAC/Bv/E,EAAK4D,QAAQomB,WAAW,WACxBhqB,EAAKw/E,QAAQx1D,WAAW,WACxBhqB,EAAKkgF,cAELlgF,EAAKgC,gBACEhC,EAAKw/E,eACLx/E,EAAK4D,eACL5D,EAAKw8E,gBAGhB2D,QAAS,WACL5B,EAAW/yE,QAAUzT,MAGzBu6B,OAAQ,WACJv6B,KAAKmoF,cACLnoF,KAAKoK,QAAQ44E,IAGjBzuD,OAAQ,SAAS9qB,EAAWoE,GACxB,IACI4a,EADOzoB,KACQyoB,QAEnB,GAAIzoB,KAAKqoF,gBAAiB,CACtB,OAAQ5+E,GACJ,KAAKs5E,EACDt5E,EAAY25E,EACZ,MACJ,KAAKx4D,EACDnhB,EAAY45E,EACZ,MACJ,KAAKJ,EACDx5E,EAAY65E,EAIpBvgF,EAAO8K,EAAM,CAAE4a,QAASA,GAAWm7D,EAAWn7D,EAAQ,GAAIA,EAAQ,KAGtE,OAAOzoB,KAAKoK,QAAQX,EAAW1G,EAAO8K,EAAM,CAAEnI,KAAM+D,MAIxDq8E,MAAO,SAAS1gF,EAAGjB,EAAGmD,GAClBtH,KAAKsoF,SAAS,SAAUljF,EAAGjB,EAAGmD,IAGlCgzB,KAAM,SAASl1B,EAAGjB,GACdnE,KAAKsoF,SAAS,QAASljF,EAAGjB,IAG9BwH,IAAK,SAASvG,EAAGjB,GACbnE,KAAKsoF,SAAS,OAAQljF,EAAGjB,IAG7BkkF,cAAe,WACX,OAAOroF,KAAKyoB,QAAQjhB,OAAS,GAGjC+gF,mBAAoB,WAChB,OAAOvoF,KAAKyoB,QAAQjhB,QAAUxH,KAAKmnF,aAGvCgB,YAAa,WAET,IADA,IAAI1/D,EAAUzoB,KAAKyoB,QACZA,EAAQjhB,OAAS,GACpBihB,EAAQ2G,MAAMq3D,WAItByB,SAAU,WACN,OAAOvlF,EAAEs7B,KAAKj+B,KAAKyoB,SAAS,SAASjK,GACjC,OAAOA,EAAMqoE,aACdr/E,QAGPghF,QAAS,SAAS7jF,GACV3E,KAAKqnF,iBAAkBrnF,KAAKoK,QAAQy4E,EAAQ,CAAE1jE,MAAOxa,KACtDA,EAAEwE,kBAITu9E,OAAQ,SAAS/hF,GACb,IAGI2C,EAGAkX,EANAvW,EAAOjI,KACP4J,EAAM,EACNosB,EAAS/tB,EAAK+tB,OAEdvN,EAAU+7D,EAAW7/E,GACrB6C,EAASihB,EAAQjhB,OAEjBihF,EAAQ9jF,EAAE8jF,MAEd,KAAKA,GAASA,EAAQ,GAAOxgF,EAAKsgF,sBAYlC,IARA/B,EAAW/yE,QAAU,KAErBxL,EAAKw8E,cAAgB9/E,EAAE8/E,cAEnBx8E,EAAK+xB,iBACLr1B,EAAEq1B,kBAGCpwB,EAAMpC,IACLS,EAAKsgF,qBADQ3+E,IAKjB4U,EAAQiK,EAAQ7e,IAGZtC,EADA0uB,EACSrzB,EAAE6b,EAAMimE,eAERx8E,EAAK4D,SAGNrE,SAIZgX,EAAQ,IAAI2mE,EAAMl9E,EAAMX,EAAQkX,GAChCvW,EAAKwgB,QAAQ9mB,KAAK6c,GAClBA,EAAMsnE,QAEF79E,EAAKogF,iBACLpgF,EAAKssB,OAAO,eAAgB,MAKxCm0D,MAAO,SAAS/jF,GACZ3E,KAAK2oF,WAAW,OAAQhkF,IAG5BikF,KAAM,SAASjkF,GACX3E,KAAK2oF,WAAW,MAAOhkF,IAG3BkkF,OAAQ,SAASlkF,GACb,IAAIkJ,EAAO,CACP2Q,MAAO,CACHgnE,aAAc7gF,EAAE2C,OAChBA,OAAQ3E,EAAEgC,EAAE8/E,eACZkC,QAASh0C,IACTvtC,EAAG,CACCkd,SAAU3d,EAAEmkF,MACZtkD,OAAQ7/B,EAAEkkB,SAEd1kB,EAAG,CACCme,SAAU3d,EAAEokF,MACZvkD,OAAQ7/B,EAAEmkB,UAGlB1jB,EAAGT,EAAEmkF,MACL3kF,EAAGQ,EAAEokF,MACLzhF,OAAQ3E,EAAEgC,EAAE8/E,eACZtlE,MAAOxa,EACPe,KAAM,OAGN1F,KAAKoK,QAAQ,MAAOyD,IACpBlJ,EAAEwE,kBAIVw/E,WAAY,SAASnJ,EAAY76E,GAC7B,IAIIiF,EACA4U,EACA6mE,EACA2D,EANAn+C,EAAO,GACPpiB,EAAU+7D,EAAW7/E,GACrBiiF,EAHO5mF,KAGcyoB,QAMzB,IAAK7e,EAAM,EAAGA,EAAMg9E,EAAcp/E,OAAQoC,IAEtCihC,GADArsB,EAAQooE,EAAch9E,IACX8lB,IAAMlR,EAGrB,IAAK5U,EAAM,EAAGA,EAAM6e,EAAQjhB,OAAQoC,KAEhCo/E,EAAgBn+C,GADhBw6C,EAAY58D,EAAQ7e,IACW8lB,MAG3Bs5D,EAAcxJ,GAAY6F,IAKtCiD,SAAU,SAAS5iF,EAAMN,EAAGjB,EAAGmD,GAC3BtH,KAAK0F,GAAM,CACP89E,KAAK,EACLsF,MAAO1jF,EACP2jF,MAAO5kF,EACP0kB,QAASzjB,EACT0jB,QAAS3kB,EACTmD,OAAQ3E,EAAE2E,GAAUtH,KAAK6L,SAAS,GAClCmuB,gBAAiBr3B,EAAEQ,KACnBgG,eAAgBxG,EAAEQ,UAK1B8lF,EAAiB3/E,EAAWvG,OAAO,CACnCoF,KAAM,SAAS0D,EAAS3E,GACpB,IACI8uB,EADA/tB,EAAOjI,KAEPurB,EAAK5qB,EAAM6uB,OAEftoB,EAAUA,GAAW,GACrB8uB,EAAS/tB,EAAK+tB,OAAS9uB,EAAQ8uB,OAC/B/tB,EAAKwgB,QAAU,GACfxgB,EAAKk/E,YAAc,EACnBl/E,EAAKu/E,QAAUj8D,EACftjB,EAAKihF,aAAe,EAEpBr9E,EAAUlJ,EAAEkJ,GAAS/B,QAAQ7B,GAC7BqB,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExBlF,EAAOkF,EAAM,CACT4D,QAASA,EAET47E,QAASvgF,EAAQ7H,QAAUskF,EAAwBhhF,EAAEkJ,EAAQ,GAAG67E,cAAcruE,iBAAmB1W,EAAEuE,EAAQugF,SAAW57E,GACtHmuB,gBAAiB9yB,EAAQ8yB,gBACzB2tD,SAAS,IAGb1/E,EAAKw/E,QAAQ39E,QAAQ7B,GAChB+gB,GAAGroB,EAAM46B,cAAc,OAAQhQ,GAAK,SACpCvC,GAAGroB,EAAM46B,cAAc,YAAahQ,GAAK,UAE9C1f,EAAQmd,GAAGroB,EAAM46B,cAAc,OAAQhQ,GAAKyK,EAAQ,SAC/ChN,GAAGroB,EAAM46B,cAAc,KAAMhQ,GAAKyK,EAAQ,OAE/C/tB,EAAKuB,KAAK,CACNs5E,EACAC,EACAn4D,EACAg4D,EACAI,EACAH,GACD37E,IAGPiiF,MAAO,SAASxkF,GACRA,EAAE8jF,OAAS9jF,EAAE8jF,MAAQ,EACrBzoF,KAAKu6B,UAELv6B,KAAKkpF,cAAe,IAAI96E,MAAOnF,UAC/BjJ,KAAKopF,YAAczkF,EAAE2C,SAI7B+hF,IAAK,SAAS1kF,GACV,IAAI2kF,GAAmB,IAAIl7E,MAAOnF,UAC9Bw7E,EAAgB9/E,EAAE2C,SAEhB3C,EAAE8jF,OAAqB,IAAZ9jF,EAAE8jF,QACfa,EAAmBtpF,KAAKkpF,aAnqBlB,KAoqBNzE,IAAkBzkF,KAAKopF,aACfppF,KAAKyoB,SAAWzoB,KAAKyoB,QAAQjhB,OAAS,EACtCxH,KAAK4oF,KAAKjkF,GAEV3E,KAAK0mF,OAAO/hF,GAGhB3E,KAAKupF,gBAAiB,GAE1BvpF,KAAKu6B,SAGTv6B,KAAKkpF,aAAe,EACpBlpF,KAAKopF,YAAc,MAGvBpnF,QAAS,WACL,IAAIiG,EAAOjI,KAEPiI,EAAK+sD,aAIT/sD,EAAK+sD,YAAa,EAElB/sD,EAAK4D,QAAQ2rB,aAAavvB,EAAKu/E,SAC/Bv/E,EAAKw/E,QAAQjwD,aAAavvB,EAAKu/E,SAC/Bv/E,EAAK4D,QAAQomB,WAAW,WACxBhqB,EAAKw/E,QAAQx1D,WAAW,WACxBhqB,EAAKkgF,cAELlgF,EAAKgC,gBACEhC,EAAKw/E,eACLx/E,EAAK4D,eACL5D,EAAKw8E,gBAGhB2D,QAAS,WACLa,EAAex1E,QAAUzT,MAG7Bu6B,OAAQ,WACAv6B,KAAKupF,eACLvpF,KAAKupF,gBAAiB,EAEfvpF,KAAKyoB,SAAWzoB,KAAKyoB,QAAQjhB,OAAS,IAC7CxH,KAAKmoF,cACLnoF,KAAKoK,QAAQ44E,KAIrBzuD,OAAQ,SAAS9qB,EAAWoE,GAExB,OADAA,EAAK27E,gBAAiB,EACfxpF,KAAKoK,QAAQX,EAAW1G,EAAO8K,EAAM,CAAEnI,KAAM+D,MAGxD8+E,mBAAoB,WAChB,OAAOvoF,KAAKyoB,QAAQjhB,QAAUxH,KAAKmnF,aAGvCgB,YAAa,WAGT,IAFA,IAAI1/D,EAAUzoB,KAAKyoB,QAEZA,EAAQjhB,OAAS,GACpBihB,EAAQ2G,MAAMq3D,WAItBC,OAAQ,SAAS/hF,GACb,IAGI2C,EAGAkX,EANAvW,EAAOjI,KACP4J,EAAM,EACNosB,EAAS/tB,EAAK+tB,OAEdvN,EAAU+7D,EAAW7/E,GACrB6C,EAASihB,EAAQjhB,OAEjBihF,EAAQ9jF,EAAE8jF,MAEd,KAAKA,GAASA,EAAQ,GAAOxgF,EAAKsgF,sBAYlC,IARAU,EAAex1E,QAAU,KAEzBxL,EAAKw8E,cAAgB9/E,EAAE8/E,cAEnBx8E,EAAK+xB,iBACLr1B,EAAEq1B,kBAGCpwB,EAAMpC,IACLS,EAAKsgF,qBADQ3+E,IAKjB4U,EAAQiK,EAAQ7e,IAGZtC,EADA0uB,EACSrzB,EAAE6b,EAAMimE,eAERx8E,EAAK4D,SAGNrE,SAIZgX,EAAQ,IAAI2mE,EAAMl9E,EAAMX,EAAQkX,GAChCvW,EAAKwgB,QAAQ9mB,KAAK6c,GAClBA,EAAMsnE,QACNtnE,EAAMkoE,OAAOloE,KAIrBkqE,MAAO,SAAS/jF,GACZ3E,KAAK2oF,WAAW,OAAQhkF,IAG5BikF,KAAM,SAASjkF,GACX3E,KAAK2oF,WAAW,OAAQhkF,GACxB3E,KAAK2oF,WAAW,MAAOhkF,IAG3BgkF,WAAY,SAASnJ,EAAY76E,GAC7B,IAIIiF,EACA4U,EACA6mE,EACA2D,EANAn+C,EAAO,GACPpiB,EAAU+7D,EAAW7/E,GACrBiiF,EAHO5mF,KAGcyoB,QAMzB,IAAK7e,EAAM,EAAGA,EAAMg9E,EAAcp/E,OAAQoC,IAEtCihC,GADArsB,EAAQooE,EAAch9E,IACX8lB,IAAMlR,EAGrB,IAAK5U,EAAM,EAAGA,EAAM6e,EAAQjhB,OAAQoC,KAEhCo/E,EAAgBn+C,GADhBw6C,EAAY58D,EAAQ7e,IACW8lB,OAG3Bs5D,EAAc5jF,EAAEk1B,KAAK+qD,EAAU/iE,UAC/B0mE,EAAc7kF,EAAEm2B,KAAK+qD,EAAU/iE,UAC/B0mE,EAAcxJ,GAAY6F,OAM1CmB,EAAWiD,iBAAmB,SAAS/gF,GACnCg6E,EAAoBh6E,GAGxB89E,EAAWP,QAAU,SAASv9E,GAC1B+5E,EAAmB/5E,GAGvB/H,EAAM6jF,WAAaA,EACnB7jF,EAAMijF,WAAaA,EACnBjjF,EAAM6lF,WAAaA,EACnB7lF,EAAMsoF,eAAiBA,EAh1B3B,CAi1BInoF,OAAOH,MAAM+G,QACH/G,OAUd,SAAUgC,EAAGC,GACT,IAcI8mF,EAdA/oF,EAAQG,OAAOH,MACf4C,EAAU5C,EAAM4C,QAChB6L,EAAWtO,OAAOsO,SAClBu6E,EAAUhnF,EAAE7B,QACZ8G,EAAQjH,EAAMiH,MACd6oB,EAAS9vB,EAAM+oB,GAAG+G,OAClBnnB,EAAa3I,EAAM2I,WACnBk9E,EAAa7lF,EAAM6lF,WACnByC,EAAiBtoF,EAAMsoF,eACvBlmF,EAASJ,EAAEI,OACXkqB,EAAYtsB,EAAMssB,UAClB28D,EAAa,GACbC,EAAc,GACdC,EAAY,GAEZvlD,EAAqB5jC,EAAM4jC,mBAC3BwlD,EAAQ,QACRjkC,EAAS,SAGTkkC,EAAY,YACZpH,EAAO,OACPqH,EAAO,OACPC,EAAU,UACVC,EAAa,aACbC,EAAgB,gBAGhBC,EAAY,YACZC,EAAY,YACZC,EAAO,OAUX,SAASC,EAAkB3+E,EAAS0B,GAChC,OAAO0L,SAASpN,EAAQe,IAAIW,GAAW,KAAO,EAGlD,SAASk9E,EAAO/hF,EAAOwmD,GACnB,OAAO7rD,KAAK8S,IAAI9S,KAAKuV,IAAIlQ,EAAOwmD,EAAM/4C,KAAM+4C,EAAMt2C,KAGtD,SAAS8xE,EAAoBr0D,EAAWxqB,GACpC,IAAIkR,EAASkQ,EAAUoJ,GACnBtqB,EAAapL,EAAMqL,YACnBC,EAActL,EAAMuL,aACpBy+E,EAAO5tE,EAAO6O,KAAO4+D,EAAkBn0D,EAAW,mBAAqBm0D,EAAkBn0D,EAAW,eACpGu0D,EAAO7tE,EAAOsH,IAAMmmE,EAAkBn0D,EAAW,kBAAoBm0D,EAAkBn0D,EAAW,cAItG,MAAO,CACHjxB,EAAG,CAAE+Q,IAAKw0E,EAAM/xE,IAJT+xE,EAAOt0D,EAAUrpB,QAAUjB,EAAWF,GAAS,IAKtD1H,EAAG,CAAEgS,IAAKy0E,EAAMhyE,IAJTgyE,EAAOv0D,EAAU1pB,SAAWV,EAAYJ,GAAS,KAkChE,IAmTIkkC,EAnTA86C,EAAavhF,EAAWvG,OAAO,CAC/BoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAIe,EAAOjI,KACPq0B,EAAaxoB,EAAQ,GAEzB5D,EAAKmgF,SAAU,EAEX/zD,EAAW5yB,kBACXkB,EAAEK,KAAKrC,EAAM05B,SAAS9M,KAAK3iB,MAAM,MAAM,WACnCypB,EAAW5yB,iBAAiBzB,KAAMiI,EAAK6iF,OAAOthF,KAAKvB,IAAO,MAE9DtF,EAAEK,KAAKrC,EAAM05B,SAAS7M,GAAG5iB,MAAM,MAAM,WACjCypB,EAAW5yB,iBAAiBzB,KAAMiI,EAAK8iF,SAASvhF,KAAKvB,IAAO,QAGhEtF,EAAEK,KAAKrC,EAAM05B,SAAS9M,KAAK3iB,MAAM,MAAM,WACnCypB,EAAW22D,YAAYhrF,KAAMiI,EAAK6iF,OAAOthF,KAAKvB,OAElDtF,EAAEK,KAAKrC,EAAM05B,SAAS7M,GAAG5iB,MAAM,MAAM,WACjCypB,EAAW22D,YAAYhrF,KAAMiI,EAAK8iF,SAASvhF,KAAKvB,QAIxDqB,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExBA,EAAKuB,KAAK,CAAC,QAAS,WAAYtC,GAAW,KAG/C+jF,YAAa,WACTjrF,KAAKooF,SAAU,GAGnB8C,cAAe,WACXlrF,KAAKooF,SAAU,GAGnB0C,OAAQ,SAASnmF,GACF3E,KACNoK,QAAQ,SADFpK,KAEFooF,SACLzjF,EAAEwE,kBAIV4hF,SAAU,SAASpmF,GACf,IAAIsD,EAAOjI,KACXiI,EAAKmC,QAAQ,WAETnC,EAAKmgF,UACLzjF,EAAEwE,iBACFlB,EAAKijF,oBAKbC,EAAgB7hF,EAAWvG,OAAO,CAClCoF,KAAM,SAASjB,GACX,IAAIe,EAAOjI,KACXsJ,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExBA,EAAKmjF,eAAgB,EAErBzoF,EAAEI,OAAOkF,EAAMf,GAEfe,EAAKynC,MAAQ,EAETznC,EAAKoqC,YACLpqC,EAAKojF,QAAU,cACfpjF,EAAKqjF,WAAa,cAClBrjF,EAAK88B,KAAO,MAEZ98B,EAAKojF,QAAU,eACfpjF,EAAKqjF,WAAa,eAClBrjF,EAAK88B,KAAO,MAIpBwmD,YAAa,WACT5oF,EAAEI,OAAO/C,KAAM,CACXgxD,SAAS,EACTo6B,eAAe,EACfI,YAAa,EACbC,YAAa,KAIrBC,YAAa,SAASv1E,EAAKyC,GACnB5Y,KAAKwrF,cAAgBr1E,GAAOnW,KAAKyrF,cAAgB7yE,IACjD5Y,KAAKwrF,YAAcr1E,EACnBnW,KAAKyrF,YAAc7yE,EACnB5Y,KAAKkhD,WAIbyqC,YAAa,SAAS5uE,GAClB,OAAOA,EAAS/c,KAAK4Y,KAAOmE,EAAS/c,KAAKmW,KAG9Cy1E,aAAc,WACV5rF,KAAKorF,eAAgB,GAGzBz5D,QAAS,WACL,OAAO3xB,KAAKq2B,UAAU,GAAGr2B,KAAKqrF,UAGlCQ,SAAU,WACN,OAAO7rF,KAAK6L,QAAQ,GAAG7L,KAAKsrF,aAGhCQ,QAAS,SAASp8C,GACd1vC,KAAK0vC,MAAQA,GAGjBwR,OAAQ,SAASi6B,GACb,IAAIlzE,EAAOjI,KACP+gD,EAAQ94C,EAAK+oD,QAAU/oD,EAAKwjF,YAAcxjF,EAAK4jF,WAC/CE,EAAchrC,EAAQ94C,EAAKynC,MAC3BjgC,EAAOxH,EAAK0pB,WAEF,IAAVovB,GAAgB94C,EAAKmjF,iBAIzBnjF,EAAK2Q,IAAM3Q,EAAK+oD,SAAW/oD,EAAKujF,YAAc,EAC9CvjF,EAAKwH,KAAOA,EACZxH,EAAK84C,MAAQgrC,EACb9jF,EAAKkO,IAAM9S,KAAK8S,IAAIlO,EAAK2Q,IAAKnJ,EAAOs8E,GACrC9jF,EAAK+jF,SAAWv8E,EAAOsxC,EACvB94C,EAAKgkF,cAAgBF,EAAct8E,GAAQ,EAE3CxH,EAAKgf,QAAUhf,EAAKmjF,eAAkBW,EAAct8E,EAE/C0rE,GACDlzE,EAAKmC,QAAQ07C,EAAQ79C,OAK7BikF,EAAiB5iF,EAAWvG,OAAO,CACnCoF,KAAM,SAASjB,GACX,IAAIe,EAAOjI,KAEXsJ,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExBA,EAAK7C,EAAI,IAAI+lF,EAAcpoF,EAAO,CAAEsvC,YAAY,GAAQnrC,IACxDe,EAAK9D,EAAI,IAAIgnF,EAAcpoF,EAAO,CAAEsvC,YAAY,GAASnrC,IACzDe,EAAKouB,UAAYnvB,EAAQmvB,UACzBpuB,EAAKkkF,eAAiBjlF,EAAQ8kF,SAC9B/jF,EAAKmkF,SAAWllF,EAAQklF,UAAY,IAEpCnkF,EAAKuB,KAAKs8C,EAAQ5+C,IAGtB4kF,QAAS,SAASO,GACdrsF,KAAKoF,EAAE0mF,QAAQO,GACfrsF,KAAKmE,EAAE2nF,QAAQO,GACfrsF,KAAK2d,WAGT2uE,kBAAmB,WACf,MAAO,CAAElnF,EAAG/B,KAAK8S,IAAI,GAAInW,KAAKoF,EAAE6mF,cAAe9nF,EAAGd,KAAK8S,IAAI,GAAInW,KAAKmE,EAAE8nF,gBAG1EtuE,QAAS,WACL,IAAI1V,EAAOjI,KACXiI,EAAK7C,EAAE87C,SACPj5C,EAAK9D,EAAE+8C,SACPj5C,EAAKgf,QAAUhf,EAAK7C,EAAE6hB,SAAWhf,EAAK9D,EAAE8iB,QACxChf,EAAK+jF,SAAW/jF,EAAKkkF,gBAAkB9oF,KAAK8S,IAAIlO,EAAK7C,EAAE4mF,SAAU/jF,EAAK9D,EAAE6nF,UACxE/jF,EAAK20C,SAAWv5C,KAAKuV,IAAI3Q,EAAK7C,EAAE4mF,SAAU/jF,EAAK9D,EAAE6nF,UACjD/jF,EAAKmC,QAAQ07C,MAIjBymC,EAAWjjF,EAAWvG,OAAO,CAC7BoF,KAAM,SAASjB,GAEXnE,EADW/C,KACEkH,GACboC,EAAWvB,GAAGI,KAAKoC,KAFRvK,OAKf2rF,YAAa,WACT,OAAO3rF,KAAKwsF,UAAUb,YAAY3rF,KAAKo8C,QAAQp8C,KAAK+kC,QAGxD0nD,SAAU,SAAS9nD,GACf,IAAI18B,EAAOjI,KACPwsF,EAAYvkF,EAAKukF,UACjBznD,EAAO98B,EAAK88B,KACZqX,EAAUn0C,EAAKm0C,QACftvC,EAAWsvC,EAAQrX,GAAQJ,EAE1B6nD,EAAUvlE,WAIVna,EAAW0/E,EAAUr2E,KAAOwuB,EAAQ,GAAO73B,EAAW0/E,EAAU5zE,KAAO+rB,EAAQ,KAChFA,GAAS18B,EAAKykF,YAGlBtwC,EAAQuwC,cAAc5nD,EAAMJ,GAC5B18B,EAAKmC,QAAQ07C,EAAQ79C,OAIzB2kF,EAAOhlF,EAAM7E,OAAO,CAEpBoF,KAAM,SAASjB,GACX,IACI9B,EACAjB,EACAuoF,EACAtwC,EAJAn0C,EAAOjI,KAMX+C,EAAOkF,EAAM,CAAE4kF,SAAS,GAAQ3lF,GAEhCwlF,EAAazkF,EAAK4kF,QAAU,GAAM,EAClCzwC,EAAUn0C,EAAKm0C,QAEfn0C,EAAK7C,EAAIA,EAAI,IAAImnF,EAAS,CACtBxnD,KAAM,IACNynD,UAAWvkF,EAAK8pB,WAAW3sB,EAC3BsnF,WAAYA,EACZtwC,QAASA,IAGbn0C,EAAK9D,EAAIA,EAAI,IAAIooF,EAAS,CACtBxnD,KAAM,IACNynD,UAAWvkF,EAAK8pB,WAAW5tB,EAC3BuoF,WAAYA,EACZtwC,QAASA,IAGbn0C,EAAKm9E,WAAW57E,KAAK,CAAC,QAAS,OAAQ,MAAO,eAAgB,iBAAkB,CAC5EsjF,aAAc,SAASnoF,GACnBsD,EAAK8kF,QAAUpoF,EACfsD,EAAK8U,OAAS9U,EAAK8pB,WAAWsE,UAAUtZ,UAG5C+oE,MAAO,SAASnhF,GACRhC,EAAEgC,EAAEwa,MAAM7X,QAAQ+E,QAAQ,KAAKE,GAAG,kCAClC5H,EAAE2F,OAAOiwB,UAIjByyD,cAAe,SAASroF,GACpB,IASIsoF,EATAC,EAAkBjlF,EAAK8kF,QACvBI,EAAiBD,EAAgB7I,OAEjCA,EAAS1/E,EAAE0/E,OAEX+I,EAAazoF,EAAE2/E,SAAW4I,EAAgB5I,SAE1C0H,EAAW/jF,EAAK8pB,WAAWi6D,SAC3BI,EAAWnkF,EAAK8pB,WAAWq6D,SAG3BhwC,EAAQ1M,OAASs8C,GAAYoB,EAAa,IAE1CA,GAAiC,IAAlB,EAAIA,IAGnBhxC,EAAQ1M,MAAQ09C,GAAchB,IAC9BgB,EAAahB,EAAWhwC,EAAQ1M,OAGpC,IAAI29C,EAAUjxC,EAAQh3C,EAAI6C,EAAK8U,OAAO6O,KAClC0hE,EAAUlxC,EAAQj4C,EAAI8D,EAAK8U,OAAOsH,IAEtC4oE,EAAc,CACV7nF,GAAIioF,EAAUF,EAAe/nF,GAAKgoF,EAAa/I,EAAOj/E,EAAIioF,EAC1DlpF,GAAImpF,EAAUH,EAAehpF,GAAKipF,EAAa/I,EAAOlgF,EAAImpF,GAG9DlxC,EAAQmxC,UAAUH,GAElBhoF,EAAEqnF,SAASQ,EAAY7nF,GACvBjB,EAAEsoF,SAASQ,EAAY9oF,GAEvB8D,EAAK8pB,WAAW+5D,QAAQ1vC,EAAQ1M,OAChCznC,EAAK8kF,QAAUpoF,EACfA,EAAEwE,kBAGNmxB,KAAM,SAAS31B,GACPA,EAAEwa,MAAM7X,OAAO4oB,QAAQ/f,MAAM,qBAI7B/K,EAAEonF,UAAUvlE,SAAW9iB,EAAEqoF,UAAUvlE,SACnC7hB,EAAEqnF,SAAS9nF,EAAES,EAAEu/B,OACfxgC,EAAEsoF,SAAS9nF,EAAER,EAAEwgC,OACfhgC,EAAEwE,kBAEFxE,EAAE6Z,MAAMggC,SAIhB7yC,IAAK,SAAShH,GACVA,EAAEwE,uBAMdqkF,EAAkBjqF,EAAQmb,YAAYM,OAAS,YAK/C+wB,EADAxsC,EAAQsb,QACI,SAASzZ,EAAGjB,EAAGurC,GACvB,MAAO,eAAiBtqC,EAAI,MAAQjB,EAAI,eAAiBurC,EAAQ,KAGzD,SAAStqC,EAAGjB,EAAGurC,GACvB,MAAO,aAAetqC,EAAI,MAAQjB,EAAI,aAAeurC,EAAQ,KAIrE,IAAI+9C,EAAUnkF,EAAWvG,OAAO,CAC5BoF,KAAM,SAAS0D,GACX,IAAI5D,EAAOjI,KAEXsJ,EAAWvB,GAAGI,KAAKoC,KAAKtC,GAExBA,EAAK4D,QAAUlJ,EAAEkJ,GACjB5D,EAAK4D,QAAQ,GAAGY,MAAMihF,sBAAwB,WAC9CzlF,EAAK7C,EAAI,EACT6C,EAAK9D,EAAI,EACT8D,EAAKynC,MAAQ,EACbznC,EAAK0lF,iBAAiB59C,EAAU9nC,EAAK7C,EAAG6C,EAAK9D,EAAG8D,EAAKynC,SAGzDi9C,cAAe,SAAS5nD,EAAM6oD,GAC1B5tF,KAAK+kC,IAAS6oD,EACd5tF,KAAK2d,WAGTkwE,QAAS,SAASn+C,GACd1vC,KAAK0vC,MAAQA,EACb1vC,KAAK2d,WAGT4vE,UAAW,SAASH,GAChBptF,KAAK0vC,OAAS09C,EACdptF,KAAK2d,WAGToyB,UAAW,SAASk9C,GAChBjtF,KAAKoF,GAAK6nF,EAAY7nF,EACtBpF,KAAKmE,GAAK8oF,EAAY9oF,EACtBnE,KAAK2d,WAGT4+B,SAAU,SAASxX,EAAMr8B,GACrB1I,KAAK+kC,GAAQr8B,EACb1I,KAAK2d,WAGTw+B,OAAQ,SAAS8wC,GACblqF,EAAO/C,KAAMitF,GACbjtF,KAAK2d,WAGTA,QAAS,WACL,IAGImwE,EAHA7lF,EAAOjI,KACPoF,EAAI6C,EAAK7C,EACTjB,EAAI8D,EAAK9D,EAGT8D,EAAK8N,QACL3Q,EAAI/B,KAAK0S,MAAM3Q,GACfjB,EAAId,KAAK0S,MAAM5R,KAGnB2pF,EAAiB/9C,EAAU3qC,EAAGjB,EAAG8D,EAAKynC,SAEhBznC,EAAKglF,cACnBtsF,EAAM4C,QAAQwe,QAAQsB,MAAQ1iB,EAAM4C,QAAQwe,QAAQvf,QAAU,IAC9DyF,EAAK4D,QAAQ,GAAGY,MAAMK,SAAW,WACjC7E,EAAK4D,QAAQ,GAAGY,MAAMmf,KAAO3jB,EAAK7C,EAAI,KACtC6C,EAAK4D,QAAQ,GAAGY,MAAM4X,IAAMpc,EAAK9D,EAAI,MAGrC8D,EAAK4D,QAAQ,GAAGY,MAAM+gF,GAAmBM,EAE7C7lF,EAAK0lF,iBAAiBG,GACtB7lF,EAAKmC,QAAQ07C,KAIrB6nC,iBAAkB,SAASV,GACvBjtF,KAAKitF,YAAcA,KAI3B,SAASc,EAAiBttC,EAAY5tB,GAClC,IAEAtrB,EAFIymF,EAAYn7D,EAAO3rB,QAAQsoD,MAC/By+B,EAAaxtC,EAAWutC,GAKxB,GAFAv9D,EAAO1oB,GAAG/F,QAAQuI,KAAKsoB,GAEnBo7D,EAAWzmF,OAAS,GACpB,IAAKD,EAAI,EAAGA,EAAI0mF,EAAWzmF,OAAQD,IAC/B,GAAI0mF,EAAW1mF,IAAMsrB,EAAQ,CACzBo7D,EAAWzjF,OAAOjD,EAAG,GACrB,YAIR0mF,EAAWzmF,OAAS,SACbi5C,EAAWutC,GAI1B,IAAIE,EAAaz9D,EAAO1tB,OAAO,CAC3BoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAIe,EAAOjI,KAEXywB,EAAO1oB,GAAGI,KAAKoC,KAAKtC,EAAM4D,EAAS3E,GAEnC,IAAIsoD,EAAQvnD,EAAKf,QAAQsoD,MAEnBA,KAASq6B,EAGXA,EAAYr6B,GAAO7tD,KAAMsG,GAFzB4hF,EAAYr6B,GAAS,CAAEvnD,IAM/BoC,OAAQ,CACJggF,EACAC,EACAC,GAGJrjF,QAAS,CACL9E,KAAM,aACNotD,MAAO,WAGXxtD,QAAS,WACL+rF,EAAiBlE,EAAa7pF,OAGlCkmF,SAAU,SAASz8E,EAAW9E,GAC1B,IACIwpF,EAAYvE,EADL5pF,KACqBkH,QAAQsoD,OAExC,GAAI2+B,EACA,OAJOnuF,KAIKoK,QAAQX,EAAW1G,EAAO,GAAI4B,EAAEwa,MAAO,CACxCgvE,UAAWA,EACXC,WAAYzpF,EAAEypF,eAKjCC,MAAO,SAAS1pF,GACZ3E,KAAKkmF,SAASmE,EAAW1lF,IAG7B2pF,KAAM,SAAS3pF,GACX3E,KAAKkmF,SAASoE,EAAW3lF,IAG7B4pF,MAAO,SAAS5pF,GACZ,IACIwpF,EAAYvE,EADL5pF,KACqBkH,QAAQsoD,OAEpC2+B,IACAA,EAAUK,SAJHxuF,KAImBkmF,SAASqE,EAAM5lF,OAKrDupF,EAAWO,aAAe,SAAST,GAC/B,IACIzmF,EADAioD,EAAQq6B,EAAYmE,IAAclE,EAAUkE,GAGhD,GAAIx+B,EAAO,CACP,IAAKjoD,EAAI,EAAGA,EAAIioD,EAAMhoD,OAAQD,IAC1BkpB,EAAO1oB,GAAG/F,QAAQuI,KAAKilD,EAAMjoD,IAGjCioD,EAAMhoD,OAAS,SACRqiF,EAAYmE,UACZlE,EAAUkE,KAIzBE,EAAWQ,OAAS7E,EAEpB,IAAI8E,EAAiBT,EAAWnrF,OAAO,CACnCoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAIe,EAAOjI,KAEXywB,EAAO1oB,GAAGI,KAAKoC,KAAKtC,EAAM4D,EAAS3E,GAEnC,IAAIsoD,EAAQvnD,EAAKf,QAAQsoD,MAEnBA,KAASs6B,EAGXA,EAAUt6B,GAAO7tD,KAAMsG,GAFvB6hF,EAAUt6B,GAAS,CAAEvnD,IAM7BjG,QAAS,WACL+rF,EAAiBjE,EAAW9pF,OAGhCkH,QAAS,CACL9E,KAAM,iBACNotD,MAAO,UACPx5B,OAAQ,QAIZ44D,EAAYn+D,EAAO1tB,OAAO,CAC1BoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAIe,EAAOjI,KAEXywB,EAAO1oB,GAAGI,KAAKoC,KAAKtC,EAAM4D,EAAS3E,GAEnCe,EAAK4mF,YAAa,EAEd7uF,KAAKkH,QAAQsiF,iBACbvhF,EAAKuhF,eAAiB,IAAIP,EAAehhF,EAAK4D,QAAS,CACnDxM,QAAQ,EACR22B,OAAQ/tB,EAAKf,QAAQ8uB,OACrB1gB,MAAOrN,EAAK6mF,qBAAqBtlF,KAAKvB,GACtCqyB,KAAMryB,EAAK8mF,MAAMvlF,KAAKvB,GACtB0D,IAAK1D,EAAK2gF,KAAKp/E,KAAKvB,GACpBsyB,OAAQtyB,EAAK+mF,UAAUxlF,KAAKvB,MAIpCA,EAAKm9E,WAAa,IAAIoB,EAAWv+E,EAAK4D,QAAS,CAC3CxM,QAAQ,EACRgoF,gBAAgB,EAChBrxD,OAAQ/tB,EAAKf,QAAQ8uB,OACrBuvD,UAAWt9E,EAAKf,QAAQo9E,SACxBhvE,MAAOrN,EAAKy+E,OAAOl9E,KAAKvB,GACxBgnF,KAAMhnF,EAAK+9E,MAAMx8E,KAAKvB,GACtBqyB,KAAMryB,EAAK8mF,MAAMvlF,KAAKvB,GACtB0D,IAAK1D,EAAK2gF,KAAKp/E,KAAKvB,GACpBsyB,OAAQtyB,EAAK+mF,UAAUxlF,KAAKvB,GAC5Bk+B,OAAQl+B,EAAKugF,QAAQh/E,KAAKvB,KAG1BtH,EAAM4C,QAAQib,OACdvW,EAAK4D,QAAQiqB,KAAK7tB,EAAKf,QAAQ8uB,QAAQppB,IAAI,eAAgB,QAG/D3E,EAAKinF,iBAAmBjnF,EAAKknF,UAAU3lF,KAAKvB,GAC5CA,EAAKmnF,eAAiBnnF,EAAKmnF,eAAe5lF,KAAKvB,IAGnDoC,OAAQ,CACJu4E,EACAoH,EACAC,EACAC,EACAC,EACAC,GAGJljF,QAAS,CACL9E,KAAM,YACNkiF,SAAY3jF,EAAM4C,QAAQib,MAAQ,EAAI,EACtCgxC,MAAO,UACP6/B,aAAc,KACdtqD,KAAM,KACN1O,UAAW,KACXL,OAAQ,KACRk1B,OAAQ,KACRokC,YAAY,EACZC,YAAY,EACZf,SAAS,EACThF,gBAAgB,GAGpBgG,WAAY,WACRxvF,KAAK6uF,YAAa,GAGtBO,eAAgB,SAASzqF,GACrB,IAAIsD,EAAOjI,KAEP2E,EAAEuiC,UAAYvmC,EAAMspB,KAAKM,MACzBtiB,EAAKm9E,WAAW7qD,SAEZtyB,EAAKuhF,gBACLvhF,EAAKuhF,eAAejvD,SAGxBv6B,KAAKkmF,SAASiE,EAAY,CAAEhrE,MAAOxa,MAI3C8qF,YAAa,SAAS9qF,GAClB,IACIsoF,EADAhlF,EAAOjI,KAEPkH,EAAUe,EAAKf,QACfwoF,EAAaznF,EAAKynF,WAClB3qD,EAAO79B,EAAQ69B,KACfsqD,EAAepnF,EAAKf,QAAQmoF,aAE5BA,EACDpC,EAAc,CAAErhE,KAAMjnB,EAAES,EAAEkd,SAAW+sE,EAAazjE,KAAMvH,IAAK1f,EAAER,EAAEme,SAAW+sE,EAAahrE,KAEtE,IAAd1f,EAAES,EAAEu/B,OAA6B,IAAdhgC,EAAER,EAAEwgC,OACvB18B,EAAK0nF,WAAW/jE,MAAQjnB,EAAES,EAAEu/B,MAC5B18B,EAAK0nF,WAAWtrE,KAAO1f,EAAER,EAAEwgC,MAC3BsoD,EAActqF,EAAEI,OAAO,GAAIkF,EAAK0nF,cAEhC1nF,EAAK0nF,WAAW/jE,KAAOjnB,EAAES,EAAE0/E,cAAgBngF,EAAES,EAAE8/E,aAC/Cj9E,EAAK0nF,WAAWtrE,IAAM1f,EAAER,EAAE2gF,cAAgBngF,EAAER,EAAE+gF,aAC9C+H,EAActqF,EAAEI,OAAO,GAAIkF,EAAK0nF,aAIpCD,IACAzC,EAAY5oE,IAAMomE,EAAOwC,EAAY5oE,IAAKqrE,EAAWvrF,GACrD8oF,EAAYrhE,KAAO6+D,EAAOwC,EAAYrhE,KAAM8jE,EAAWtqF,IAG9C,MAAT2/B,SACOkoD,EAAY5oE,IACH,MAAT0gB,UACAkoD,EAAYrhE,KAGvB3jB,EAAK2nF,KAAKhjF,IAAIqgF,IAGlB4C,oBAAqB,SAASvoF,GAC1B,IAAIwoF,EAAiB9vF,KAAKkH,QAAQgkD,OAClC,OAAO4kC,GAAkBntF,EAAE2E,GAAQiF,GAAGujF,IAG1CtH,QAAS,SAAS7jF,GACT3E,KAAK6vF,oBAAoBlrF,EAAEwa,MAAM7X,SAClC3C,EAAEwE,kBAIV2lF,qBAAsB,SAASnqF,GAC3B3E,KAAK6uF,YAAa,EAElB7uF,KAAK0mF,OAAO/hF,IAGhB+hF,OAAQ,SAAS/hF,GACb,IAAIsD,EAAOjI,KACPkH,EAAUe,EAAKf,QACfmvB,EAAYnvB,EAAQmvB,UAAY1zB,EAAEuE,EAAQmvB,WAAa,KACvDu5D,EAAO1oF,EAAQ0oF,KAEnB,GAAI5vF,KAAK6vF,oBAAoBlrF,EAAE6Z,MAAMgnE,eAAkBt+E,EAAQooF,aAAernF,EAAK4mF,WAC/E5mF,EAAKm9E,WAAW7qD,aADpB,CAQA,GAHAtyB,EAAKw8E,cAAgB9/E,EAAE2C,OACvBW,EAAK8nF,oBAAsB9iE,EAAUhlB,EAAKw8E,eAEtCmL,EAAM,CACF3nF,EAAK2nF,MACL3nF,EAAK2nF,KAAKjoE,MAAK,GAAM,GAAMmP,SAG/B7uB,EAAK2nF,KAAOjvF,EAAMuI,WAAW0mF,GAAQjtF,EAAEitF,EAAKrlF,KAAKtC,EAAMA,EAAKw8E,gBAAkBmL,EAE9E,IAAI7yE,EAASkQ,EAAUhlB,EAAKw8E,eAC5Bx8E,EAAK0nF,WAAa5yE,EAElB9U,EAAK2nF,KAAKhjF,IAAK,CACXE,SAAU,WACV6sC,OAAQ,IACR/tB,KAAM7O,EAAO6O,KACbvH,IAAKtH,EAAOsH,MAEf6oB,SAAS99B,EAAS4O,MAEnB/V,EAAK2oB,QAAQ,WAAW,WACpB3oB,EAAK2nF,KAAKv+D,WAAW,aAGrB,IAFA,IAAI2+D,EAAcrtF,EAAEgC,EAAE2C,SAEd0oF,EAAYniF,KAAK,iBAAmBmiF,EAAYxoF,QACpDwoF,EAAcA,EAAY7jF,SAG9B,MAAO,CACH+nB,SAAUjsB,EAAK2nF,KAAKtgE,MACpB2gE,UAAWD,EAAYniF,KAAK,oBAKxC+7E,EAAW1iF,EAAQsoD,OAASvnD,EAE5BA,EAAKumF,SAAU,EAEXn4D,IACApuB,EAAKynF,WAAahF,EAAoBr0D,EAAWpuB,EAAK2nF,OAG1DjtF,EAAEyM,GAAU4Z,GAAG+gE,EAAO9hF,EAAKmnF,gBAEvBnnF,EAAKi+E,SAAS8D,EAAWrlF,KACzBsD,EAAKm9E,WAAW7qD,SAEZtyB,EAAKuhF,gBACLvhF,EAAKuhF,eAAejvD,SAGxBtyB,EAAKknF,aAGTlnF,EAAKm9E,WAAWgD,YAGpBpC,MAAO,SAASrhF,GACZ3E,KAAKykF,cAAgB9/E,EAAE2C,OAEnBtH,KAAKkmF,SAAStD,EAAMj+E,GACpB3E,KAAKolF,WAAW7qD,SAEhBv6B,KAAK6uF,YAAa,GAI1BE,MAAO,SAASpqF,GACZA,EAAEwE,iBAEF,IAAI+mF,EAAgBlwF,KAAKmwF,oBAAoBxrF,GAU7C,GARI3E,KAAKkH,QAAQqoF,YAAcvvF,KAAKowF,iBAAmBF,IACnDlwF,KAAKqwF,kBAAoBC,EAAqBJ,GAC9ClwF,KAAKowF,eAAiBF,GAG1BlwF,KAAKuwF,WAAa5rF,EAClB3E,KAAKwwF,iBAAiB7rF,EAAGurF,GAErBlwF,KAAKkH,QAAQqoF,YAETvvF,KAAKqwF,kBAAkB,GAAI,CAC3B,IAAItL,EAAW0L,EAAmB9rF,EAAES,EAAEkd,SAAU3d,EAAER,EAAEme,SAAUouE,EAAmB1wF,KAAKqwF,oBAGtFrwF,KAAK2wF,qBAAuBhuF,EAAEI,OAAO,GAAI/C,KAAK2vF,YAC9C3vF,KAAK4wF,gBAAkB7L,EAEJ,IAAfA,EAAS5gF,GAA0B,IAAf4gF,EAAS3/E,GAC7Bw1E,cAAc56E,KAAK6wF,iBACnB7wF,KAAK6wF,gBAAkB,MACf7wF,KAAK6wF,kBACb7wF,KAAK6wF,gBAAkBlW,YAAY36E,KAAK8wF,YAAYtnF,KAAKxJ,MAAO,KAKxEA,KAAK4vF,MACL5vF,KAAKyvF,YAAY9qF,IAIzB6rF,iBAAkB,SAAS7rF,EAAGurF,GAC1BlwF,KAAK+wF,gBAAgBb,GAAe,SAAS5oF,EAAQ0pF,GACjD,GAAK1pF,EAAL,CAQA,GAAIoiF,EAAgB,CAChB,GAAIsH,IAAkBtH,EAAesH,cACjC,OAGJtH,EAAexD,SAASoE,EAAWvnF,EAAO4B,EAAG,CAAEypF,WAAYzrF,EAAE+mF,EAAesH,kBAGhF1pF,EAAO4+E,SAASmE,EAAWtnF,EAAO4B,EAAG,CAAEypF,WAAYzrF,EAAEquF,MACrDtH,EAAiB3mF,EAAOuE,EAAQ,CAAE0pF,cAAeA,SAhBzCtH,IACAA,EAAexD,SAASoE,EAAWvnF,EAAO4B,EAAG,CAAEypF,WAAYzrF,EAAE+mF,EAAesH,kBAC5EtH,EAAiB,SAiB7B1pF,KAAKkmF,SAAS+D,EAAMlnF,EAAO4B,EAAG,CAAEypF,WAAY1E,EAAgBnlD,mBAAoB2rD,MAGpFY,YAAa,WACT,IAAI3kF,EAASnM,KAAKqwF,kBAAkB,GAChCtL,EAAW/kF,KAAK4wF,gBAChBK,EAAejxF,KAAK2wF,qBAExB,GAAKxkF,EAAL,CAIA,IAGI+kF,EAAeC,EAHfjB,EAAgBlwF,KAAKmwF,oBAAoBnwF,KAAKuwF,YAClDvwF,KAAKwwF,iBAAiBxwF,KAAKuwF,WAAYL,GAIvC,IAAIkB,EAAajlF,IAAWklF,IAAiB,GAEzCD,GACAF,EAAgB9hF,EAAS4O,KAAKkG,aAAeylE,EAAQh9E,SACrDwkF,EAAgB/hF,EAAS4O,KAAKG,YAAcwrE,EAAQ38E,UAEpDkkF,EAAgB/kF,EAAOmoB,cAAgBnoB,EAAO+X,aAC9CitE,EAAgBhlF,EAAO+R,aAAe/R,EAAOgS,aAGjD,IAAI6oE,EAAS76E,EAAOuqB,UAAYquD,EAAS5gF,EACrCmtF,EAAYJ,GAAiBlK,EAAS,GAAKA,EAAS76E,EAAO+X,aAE3D6iE,EAAS56E,EAAOwgB,WAAao4D,EAAS3/E,EACtCmsF,EAAYJ,GAAiBpK,EAAS,GAAKA,EAAS56E,EAAOgS,YAE3DmzE,EACAnlF,EAAOuqB,WAAaquD,EAAS5gF,EACtB+sF,GAAiBlK,EAAS,IACjC76E,EAAOuqB,UAAY,GAGnB66D,EACAplF,EAAOwgB,YAAco4D,EAAS3/E,EACvB+rF,GAAiBpK,EAAS,IACjC56E,EAAOwgB,WAAa,GAGpB3sB,KAAK4vF,MAAQwB,IAAeG,GAAaD,KACrCA,IACAL,EAAa5sE,KAAO0gE,EAAS5gF,GAG7BotF,IACAN,EAAarlE,MAAQm5D,EAAS3/E,GAGlCpF,KAAK4vF,KAAKhjF,IAAIqkF,MAItBrI,KAAM,SAASjkF,GACX3E,KAAK+wF,gBAAgB/wF,KAAKmwF,oBAAoBxrF,IAAI,SAAS2C,EAAQ0pF,GAC3D1pF,IACAA,EAAOinF,MAAMxrF,EAAO,GAAI4B,EAAG,CAAEypF,WAAYzrF,EAAEquF,MAC3CtH,EAAiB,SAIzB9O,cAAc56E,KAAK6wF,iBACnB7wF,KAAK6wF,gBAAkB,KACvB7wF,KAAKwxF,QAAQxxF,KAAKkmF,SAASgE,EAASvlF,KAGxCqqF,UAAW,SAASrqF,GAChB3E,KAAKwxF,UACLxxF,KAAKkmF,SAASiE,EAAY,CAAEhrE,MAAOxa,KAGvC6sF,QAAS,SAASnoF,GACd,IAAIpB,EAAOjI,KAEXiI,EAAKooF,kBAAoB,KACzBrwF,KAAKowF,eAAiB,KACtBxV,cAAc56E,KAAK6wF,iBACnB5oF,EAAK4mF,YAAa,EAEd5mF,EAAK2nF,OAAS3nF,EAAKumF,QACnB11D,YAAW,WACP7wB,EAAK2nF,KAAKjoE,MAAK,GAAM,GAEjBte,EACApB,EAAKinF,mBAELjnF,EAAK2nF,KAAK/oE,QAAQ5e,EAAK8nF,oBAAqB,OAAQ9nF,EAAKinF,oBAE9D,GAEHjnF,EAAKknF,aAIbjJ,SAAU,SAASz8E,EAAW9E,GAG1B,OAFW3E,KAECoK,QACRX,EAAW1G,EACX,GACA4B,EAAEwa,MACF,CACI/Z,EAAGT,EAAES,EACLjB,EAAGQ,EAAER,EACLsgF,cATGzkF,KASiBykF,cACpBgN,cAAe9sF,EAAE6Z,MAAQ7Z,EAAE6Z,MAAMgnE,aAAe,KAChD4I,WAAYzpF,EAAEypF,WACd7pD,mBAAoB5/B,EAAE4/B,mBACtBilD,eAAgB7kF,EAAE6kF,mBAK9B2G,oBAAqB,SAASxrF,GAC1B,IAAI2C,EAASi9B,EAAmB5/B,GAC5BirF,EAAO5vF,KAAK4vF,KAYhB,OAVIA,GA58BZ,SAAkBzjF,EAAQs3B,GACtB,IACI,OAAO9gC,EAAEuyB,SAAS/oB,EAAQs3B,IAAUt3B,GAAUs3B,EAChD,MAAO9+B,GACL,OAAO,GAw8BKuwB,CAAS06D,EAAK,GAAItoF,KAC1BsoF,EAAKziF,QACL7F,EAASi9B,EAAmB5/B,MAGxB2C,EAASi9B,EAAmB5/B,IAEhCirF,EAAK1iF,QAGF5F,GAGXypF,gBAAiB,SAASllF,EAASkd,GAC/B,IAAIxS,EACAi5C,EAAQxvD,KAAKkH,QAAQsoD,MACrBkiC,EAAU7H,EAAYr6B,GACtBmiC,EAAQ7H,EAAUt6B,IAElBkiC,GAAWA,EAAQlqF,QAAUmqF,GAASA,EAAMnqF,UAC5C+O,EAj8BZ,SAAqBjP,EAAQoqF,EAASC,GAKlC,IAJA,IAAIC,EAAWC,EAAWtqF,EAAI,EAC1BuqF,EAAYJ,GAAWA,EAAQlqF,OAC/BuqF,EAAUJ,GAASA,EAAMnqF,OAEtBF,GAAUA,EAAOqe,YAAY,CAChC,IAAKpe,EAAI,EAAGA,EAAIuqF,EAAWvqF,IAEvB,IADAqqF,EAAYF,EAAQnqF,IACNsE,QAAQ,KAAOvE,EACzB,MAAO,CAAEA,OAAQsqF,EAAWZ,cAAe1pF,GAInD,IAAKC,EAAI,EAAGA,EAAIwqF,EAASxqF,IAErB,GADAsqF,EAAYF,EAAMpqF,GACd5E,EAAEuyB,SAAS28D,EAAUhmF,QAAQ,GAAIvE,IAAW/D,EAAQ4hB,gBAAgB5a,KAAKjD,EAAQuqF,EAAU3qF,QAAQ8uB,QACnG,MAAO,CAAE1uB,OAAQuqF,EAAWb,cAAe1pF,GAInDA,EAASA,EAAOqe,YA66BHqsE,CAAYnmF,EAAS6lF,EAASC,GAEnCp7E,EACAwS,EAASxS,EAAOjP,OAAQiP,EAAOy6E,eAE/BjoE,MAKZ/mB,QAAS,WACL,IAAIiG,EAAOjI,KAEXywB,EAAO1oB,GAAG/F,QAAQuI,KAAKtC,GAEvBA,EAAKknF,YAELlnF,EAAKm9E,WAAWpjF,UAEZiG,EAAKuhF,gBACLvhF,EAAKuhF,eAAexnF,UAGxBhC,KAAKqwF,kBAAoB,KACzBrwF,KAAKowF,eAAiB,KACtBxV,cAAc56E,KAAK6wF,iBAEnB5oF,EAAKw8E,cAAgB,MAGzB0K,UAAW,WACP,IAAIlnF,EAAOjI,KAEPiI,EAAK2nF,MACL3nF,EAAK2nF,KAAK94D,gBAGP8yD,EAAW3hF,EAAKf,QAAQsoD,OAE/BvnD,EAAKmC,QAAQ,WACbnC,EAAKmC,QAAQggF,GACbznF,EAAEyM,GAAU4pB,IAAI+wD,EAAO9hF,EAAKmnF,mBAgBpC,SAASsB,EAAmB7kF,GACxB,IACIkR,EACAsH,EACAuH,EAHA4tD,EAAO6X,IAAiB,GAK5B,OAAIxlF,EAAQ,KAAO2tE,EAIR,CACHn1D,IAJJA,EAAMm1D,EAAK9iD,UAKP9K,KAJJA,EAAO4tD,EAAK7sD,WAKRb,OAAQzH,EAAMslE,EAAQh9E,SACtBkf,MAAOD,EAAO+9D,EAAQ38E,WAG1B+P,EAASlR,EAAQkR,UACV+O,OAAS/O,EAAOsH,IAAMxY,EAAQc,SACrCoQ,EAAO8O,MAAQ9O,EAAO6O,KAAO/f,EAAQmB,QAC9B+P,GAIf,SAASs0E,IACL,OAAO1uF,EAAEhC,EAAM4C,QAAQwe,QAAQmB,MAAQviB,EAAM4C,QAAQwe,QAAQoB,OAAS/T,EAAS4O,KAAO5O,EAASiK,iBAGnG,SAASi3E,EAAqBzkF,GAC1B,IAAI2tE,EAAO6X,IAEX,IAAKxlF,GAAWA,IAAYuD,EAAS4O,MAAQnS,IAAYuD,EAASiK,gBAC9D,OAAOmgE,EAKX,IAFA,IAAIrtE,EAASxJ,EAAEkJ,GAAS,GAEjBM,IAAWxL,EAAM4rB,aAAapgB,IAAWA,IAAWiD,EAAS4O,MAChE7R,EAASA,EAAOwZ,WAGpB,OAAIxZ,IAAWiD,EAAS4O,KACbw7D,EAGJ72E,EAAEwJ,GAGb,SAASskF,EAAmBwB,EAAQC,EAAQC,GACxC,IAAIpN,EAAW,CAAE3/E,EAAG,EAAGjB,EAAG,GAEtBiuF,EAAmB,GAcvB,OAZIH,EAASE,EAAKvmE,KAAOwmE,EACrBrN,EAAS3/E,IAAMgtF,GAAoBH,EAASE,EAAKvmE,OAC1CumE,EAAKtmE,MAAQomE,EAASG,IAC7BrN,EAAS3/E,EAAIgtF,GAAoBD,EAAKtmE,MAAQomE,IAG9CC,EAASC,EAAK9tE,IAAM+tE,EACpBrN,EAAS5gF,IAAMiuF,GAAoBF,EAASC,EAAK9tE,MAC1C8tE,EAAKrmE,OAASomE,EAASE,IAC9BrN,EAAS5gF,EAAIiuF,GAAoBD,EAAKrmE,OAASomE,IAG5CnN,EA7EXpkF,EAAM+oB,GAAGqN,OAAOm3D,GAChBvtF,EAAM+oB,GAAGqN,OAAO43D,GAChBhuF,EAAM+oB,GAAGqN,OAAO63D,GAChBjuF,EAAMkqF,WAAaA,EACnBlqF,EAAM+pF,oBAAsBA,EAE5B3nF,EAAOpC,EAAM+oB,GAAI,CACbkjE,KAAMA,EACNV,eAAgBA,EAChBuB,QAASA,IAwEb9sF,EAAM+oB,GAAGklE,UAAUyD,MAAQ,CACvB5B,mBAAoBA,EACpBC,mBAAoBA,EACpBJ,qBAAsBA,GAloC9B,CAqoCIxvF,OAAOH,MAAM+G,QACH/G,OAUd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACf+oB,EAAK/oB,EAAM+oB,GACX+G,EAAS/G,EAAG+G,OACZ7oB,EAAQjH,EAAMiH,MACdrE,EAAU5C,EAAM4C,QAChB0pB,EAAYtsB,EAAMssB,UAClBlhB,EAAapL,EAAMqL,YACnBC,EAActL,EAAMuL,aACpBomF,EAAO,OACPC,EAAQ,QACRC,EAAa,aACbC,EAAW,WACXC,EAAS,SAEThoE,EAAQ,QACRioE,EAAM,MACNC,EAAS,SACTC,EAAW,WACXxhD,EAAS,SACTyhD,EAAO,OACPC,EAAW,WACXrhD,EAAW,WAEXshD,EAAU,UACVC,EAAS,WACTC,EAAe,iBACfC,EAAqB,uBACrBC,EAAiB,4CAEjBC,EAAmB1wF,EAAEyM,SAASiK,iBAC9Bi6E,EAAS3wF,EAAE7B,QACXyyF,EAAS,SAET1hD,EADYtuC,EAAQmb,YAAY9R,IACR,YACxB7J,EAASJ,EAAEI,OACX8uE,EAAK,cACL1iE,EAAS,CAAC,YACA,cACA,eACA,aACA,cACA,eAEd,SAAS+lB,EAASmB,EAAW/uB,GACzB,SAAK+uB,IAAc/uB,KAGZ+uB,IAAc/uB,GAAU3E,EAAEuyB,SAASmB,EAAW/uB,IAGzD,IAAIksF,EAAQ/iE,EAAO1tB,OAAO,CACtBoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAiBusF,EAAbxrF,EAAOjI,MAEXkH,EAAUA,GAAW,IAETmX,QACRnX,EAAQyxC,OAASzxC,EAAQyxC,QAAUi6C,eACnC1rF,EAAQ4F,SAAW5F,EAAQ4F,UAAY6lF,aAG3CliE,EAAO1oB,GAAGI,KAAKoC,KAAKtC,EAAM4D,EAAS3E,GAEnC2E,EAAU5D,EAAK4D,QACf3E,EAAUe,EAAKf,QAEfe,EAAKyrF,WAAaxsF,EAAQysF,UAAYzsF,EAAQysF,UAAU/oF,MAAM,KAAO,GACrE3C,EAAK2rF,UAAYjzF,EAAM46B,cAvCf,OAuCwC56B,EAAM6uB,QAEvB,IAA3BvnB,EAAKyrF,WAAWlsF,QAChBS,EAAKyrF,WAAW/xF,KAAKsG,EAAKyrF,WAAW,IAGzCD,EAAc9wF,EAAEsF,EAAKf,QAAQ2sF,QAAQxnF,QAAQ,qBAAqB2pB,OAAO,sBAEzE9uB,EAAQgmC,SAAWvqC,EAAEA,EAAEuE,EAAQgmC,UAAU,IAAMumD,EAAY,IAAMrkF,SAAS4O,MAE1E/V,EAAK4D,QAAQsB,OACRmX,SAAS,WACTyD,YAAY,UAAW7gB,EAAQmX,OAC/B6uB,SAAShmC,EAAQgmC,UACjBnqB,KAAK,eAAe,GACpBiG,GAAG,aAAe6oD,GAAI,WACnB5pE,EAAK6rF,UAAW,KAEnB9qE,GAAG,QAAU6oD,GAAI,SAASltE,GACvB,IAAImiE,EAAOnkE,EAAEgC,EAAE2C,QAAQwuB,KAAK,WACxBi+D,EAAajtB,EAAK36D,SAClB26D,EAAKt/D,QAAUs/D,EAAKv6D,GAAG,cAA4C,IAA3BwnF,EAAWr9D,aAAqB/xB,EAAE+jB,cAAckc,OAAS,GAChGmvD,EAAWr9D,cAAgBq9D,EAAW7kE,KAAK,gBAAkB6kE,EAAW7kE,KAAK,iBAAmBvqB,EAAE+jB,cAAckc,OAAS,IACvHjgC,EAAEwE,oBAGZ6f,GAAG,aAAe6oD,GAAI,WACnB5pE,EAAK6rF,UAAW,KAGxB7rF,EAAKmE,QAAUzJ,KAEW,IAAtBuE,EAAQ8sF,YACR9sF,EAAQ8sF,UAAY,CAAEC,KAAM,CAAE1tE,QAAS,IAAMk5B,MAAO,CAAEtyC,MAAM,EAAMoZ,QAAS,MAG/ExjB,EAAOmE,EAAQ8sF,UAAUC,KAAM,CAC3BvtE,SAAU,WACNze,EAAKmE,QAAQkY,SAAS,+BACtBrc,EAAKmE,QAAQQ,IAAI,WAAW,IAC5B3E,EAAK4mF,YAAa,EAClB5mF,EAAKi+E,SAASuM,MAItB1vF,EAAOmE,EAAQ8sF,UAAUv0C,MAAO,CAC5B/4B,SAAU,WACNze,EAAKisF,qBAIbjsF,EAAKksF,gBAAkB,SAASxvF,GAC5BsD,EAAKmsF,WAAWzvF,IAGhBpB,EAAQmf,SAASrC,QACjBpY,EAAKosF,aAAe,SAAS1vF,GACzBm0B,YAAW,WACP7wB,EAAK6pB,QAAQntB,KACd,MAGPsD,EAAKosF,aAAe,SAAS1vF,GACzBsD,EAAK6pB,QAAQntB,IAIjBuC,EAAQotF,cACR3xF,EAAEuE,EAAQotF,cAActrE,GAAG9hB,EAAQqtF,YAAc1iB,EAAI5pE,EAAKigB,OAAO1e,KAAKvB,KAI9EoC,OAAQ,CACJioF,EACAG,EACAF,EACAC,GAGJtrF,QAAS,CACL9E,KAAM,QACNmyF,YAAa,QACb57C,OAAQi6C,cACR9lF,SAAU6lF,WACVkB,OAAQf,EACR5lD,SAAU,KACVymD,UAAW,WACXa,SAAU1zF,OACV2zF,kBAAkB,EAClB3oF,UAAU,EACV4oF,OAAO,EACPC,WAAY,CACR3nF,MAAO,EACPL,OAAQ,GAEZqnF,UAAW,CACPC,KAAM,CACF1tE,QAAS,eACT2rB,YAAY,EACZzrB,SAAU,KAEdg5B,MAAO,CACHh5B,SAAU,IACVtZ,MAAM,IAGdynF,mBAAmB,GAGvBV,gBAAiB,WACb,IAAIjsF,EAAOjI,KACPsiB,EAAWra,EAAKmE,QAAQyB,KAAKklF,GAEjC9qF,EAAKmE,QAAQe,OAETmV,GACAra,EAAKmE,QAAQQ,IAAI0V,GAGjBra,EAAKf,QAAQ2sF,QAAUf,GACvB7qF,EAAK4sF,gBAGT5sF,EAAK6sF,UAAW,EAChB7sF,EAAKi+E,SAASsM,IAGlBxwF,QAAS,WACL,IAGImK,EAHAlE,EAAOjI,KACPkH,EAAUe,EAAKf,QACf2E,EAAU5D,EAAK4D,QAAQmtB,IAAI64C,GAG/BphD,EAAO1oB,GAAG/F,QAAQuI,KAAKtC,GAEnBf,EAAQotF,cACR3xF,EAAEuE,EAAQotF,cAAct7D,IAAI64C,GAG3B3qE,EAAQwtF,QACTrB,EAAiBr6D,IAAI/wB,EAAK2rF,UAAW3rF,EAAKksF,iBAC1ClsF,EAAK8sF,eAAc,IAGvBp0F,EAAMqB,QAAQiG,EAAK4D,QAAQqpC,YAC3BrpC,EAAQomB,aAEJ/qB,EAAQgmC,SAAS,KAAO99B,SAAS4O,QACjC7R,EAASN,EAAQQ,QAAQ,2BAEd,GACPF,EAAO2qB,SAEPjrB,EAAQirB,WAKpBm9D,KAAM,SAAS7uF,EAAGjB,GACd,IAII6vF,EAAW5nF,EAIXD,EARAlE,EAAOjI,KACPg1F,EAAQ,CAAE7+C,SAAUrtC,MAAMmQ,SAAS9U,EAAE,KAAMiB,EAAGA,EAAGjB,EAAGA,GACpD0H,EAAU5D,EAAK4D,QACf3E,EAAUe,EAAKf,QAEf2sF,EAASlxF,EAAEuE,EAAQ2sF,QACnBjqE,EAAS/d,EAAQ,IAAMA,EAAQsgB,SAAS,aACxC8oE,EAAUppF,EAAQiqB,KAAK,oBAG3B,IAAK7tB,EAAKqE,UAAW,CAQjB,GAPIpF,EAAQutF,mBACJ7qE,GAAuB,aAAbza,EAAO,IACjBA,EAAO0G,QAEXhK,EAAQe,IAAIjM,EAAMqO,kBAAkB6kF,EAAO,GAAI1kF,KAG/ClH,EAAK4D,QAAQM,SAAS0B,KAAK,cAAgB5F,EAAKi+E,SAASoM,GACzD,OAGJrqF,EAAK4mF,YAAa,EAEb3nF,EAAQwtF,QACTrB,EAAiBr6D,IAAI/wB,EAAK2rF,UAAW3rF,EAAKksF,iBAC7BnrE,GAAG/gB,EAAK2rF,UAAW3rF,EAAKksF,iBAIrClsF,EAAK8sF,eAAc,GACnB9sF,EAAK8sF,eAAc,IAGvB9sF,EAAKmE,QAAUA,EAAUzL,EAAMorB,KAAKlgB,EAAS3E,EAAQ4E,SAAU5E,EAAQguF,eAClEtoF,IAAI,CACD8f,SAAU2kB,EACVxkC,QAAS,QACTC,SAAU+lF,IAEb9vE,KAAK,eAAe,GAEzB5W,EAASN,EAAQM,SAEb8oF,EAAQlyE,KAAK,cACb3W,EAAQ2W,KAAK,aAAckyE,EAAQlyE,KAAK,eACjCkyE,EAAQlyE,KAAK,oBACpB3W,EAAQ2W,KAAK,kBAAmBkyE,EAAQlyE,KAAK,oBAG7Cxf,EAAQmf,SAASrC,SACjBlU,EAAOS,IAAIilC,EAAW,iBAG1BzlC,EAAQQ,IAAI8kC,GAER/uC,EAAEuE,EAAQgmC,UAAU,IAAM99B,SAAS4O,MACnC5R,EAAQQ,IAAI+lF,EAAK,YAGrB1qF,EAAKktF,QAAUltF,EAAKmtF,UAAUJ,GAC9BhB,EAAY/rF,EAAKotF,iBAEbnuF,EAAQ2sF,QAAUf,GAAS7qF,EAAK4D,QAAQsgB,SAAS,cACjDlkB,EAAKqtF,cAActB,GAGvB7nF,EAAOgB,OACPtB,EAAQqB,OACRjF,EAAKmE,QAAQc,OAEbf,EAAO0B,KAAKmlF,EAASgB,EAAUztE,SACvBiB,WAAU,GACVI,aAAaosE,GAGrBnoF,EAAQkX,KAAK,eAAe,KAIpCwyE,UAAW,SAASp/C,GAChB,IAGI/pC,EAHAnE,EAAOjI,KACP6L,EAAU5D,EAAK4D,QACf3E,EAAUe,EAAKf,QAEf2sF,EAASlxF,EAAEuE,EAAQ2sF,QACnBjqE,EAAS/d,EAAQ,IAAMA,EAAQsgB,SAAS,aAExCjlB,EAAQutF,mBACJ7qE,GAAuB,aAAbza,EAAO,IACjBA,EAAO0G,QAEXhK,EAAQe,IAAIjM,EAAMqO,kBAAkB6kF,EAAO,GAAI1kF,KAGnDlH,EAAKmE,QAAUA,EAAUzL,EAAMorB,KAAKlgB,EAAS3E,EAAQ4E,UAC5Bc,IAAI,CACD8f,SAAU2kB,EACVxkC,QAAS,QACTC,SAAU+lF,IAGlCtvF,EAAQmf,SAASrC,SACjBjU,EAAQQ,IAAIilC,EAAW,iBAG3BzlC,EAAQQ,IAAI8kC,GAER/uC,EAAEuE,EAAQgmC,UAAU,IAAM99B,SAAS4O,MACnC5R,EAAQQ,IAAI+lF,EAAK,YAGrB1qF,EAAKmtF,UAAUj/C,GAAW,IAE1B,IAAIp5B,EAAS3Q,EAAQ2Q,SACrB,MAAO,CACH/P,MAAOrM,EAAMqL,YAAYI,GACzBO,OAAQhM,EAAMuL,aAAaE,GAC3Bwf,KAAM7O,EAAO6O,KACbvH,IAAKtH,EAAOsH,MAIpBgxE,eAAgB,WACZ,IAAIrB,EAAYjxF,GAAO,EAAM,GAAI/C,KAAKkH,QAAQ8sF,UAAUC,MAGxD,OAFAD,EAAUztE,QAAU5lB,EAAM0sB,aAAa2mE,EAAUztE,QAASvmB,KAAKm1F,SAExDnB,GAGXa,cAAe,WACX,IAAIhB,EAASlxF,EAAE3C,KAAKkH,QAAQ2sF,QACxB7/C,IAAc6/C,EAAO9wE,KAAK,UAAY,IAAI5S,MAAMgjF,IAAuB,CAAC,GAAI,SAAS,GACrFqC,EAAWtC,EAAe,IAAMl/C,EAEpC6/C,EACK3nE,YAAYspE,GACZtgD,SAASk+C,GACTlnE,YAAY+mE,GACZ/mE,YAAYspE,GAEjBx1F,KAAK6L,QAAQqgB,YAAYgnE,EAAe,IAAMvyF,EAAM2sB,WAAW0mB,GAAWl+B,UAG9Ew/E,cAAe,SAAStB,GACpB,IAAIhgD,EAAYggD,EAAUztE,QAAQkyB,QAAUu7C,EAAUztE,QAAQkyB,QAAQzE,UAAY,OAC9EwhD,EAAWtC,EAAe,IAAMl/C,EAEpCrxC,EAAE3C,KAAKkH,QAAQ2sF,QACVvvE,SAASkxE,GACTtgD,SAASk+C,GACT9uE,SAAS2uE,GACT3uE,SAASkxE,IAGlB1oF,SAAU,WACF9M,KAAKsM,YACLtM,KAAKm1F,QAAUn1F,KAAKo1F,cAM5BltE,OAAQ,WACOloB,UAEDsM,UAAYimF,EAAQD,MAGlChmF,QAAS,WACL,OAAOtM,KAAKoM,QAAQG,GAAG,aAAkBvM,KAAK6L,QAAQU,GAAG,aAG7DkzC,MAAO,SAASg2C,GACZ,IAE4B1pE,EACxBioE,EAAW0B,EAAaC,EAHxB1tF,EAAOjI,KACPmM,EAASlE,EAAK4D,QAAQM,SACtBjF,EAAUe,EAAKf,QAGnB,GAAIe,EAAKqE,UAAW,CAMhB,GALAyf,EAAQ9jB,EAAKmE,QAAQ,GAAKnE,EAAKmE,QAAUzL,EAAMorB,KAAK9jB,EAAK4D,SAASsB,OAElElF,EAAKmE,QAAQ8f,YAAY,+BACzBjkB,EAAK8sF,eAAc,GAEf9sF,EAAK6sF,UAAY7sF,EAAKi+E,SAASqM,GAE/B,YADAtqF,EAAK8sF,eAAc,GAKvB9sF,EAAK4D,QAAQiqB,KAAK,YAAY9yB,MAAK,WAC/B,IACI4yF,EADOjzF,EAAE3C,MACI6N,KAAK,cAElB+nF,GACAA,EAAMn2C,MAAMg2C,MAIpBpC,EAAiBr6D,IAAI/wB,EAAK2rF,UAAW3rF,EAAKksF,iBAEtCsB,EACAzB,EAAY,CAAE7mF,MAAM,EAAMoZ,QAAS,KAEnCytE,EAAYjxF,GAAO,EAAM,GAAImE,EAAQ8sF,UAAUv0C,OAC/Ci2C,EAAcvpF,EAAO0B,KAAKmlF,KAC1B2C,EAAe3B,EAAUztE,WAEH5lB,EAAM8O,KAAKkmF,IAAiBD,GAAe/0F,EAAM8O,KAAKimF,KACxE1B,EAAUztE,QAAUmvE,EACpB1B,EAAUl+E,SAAU,GAGxB7N,EAAK6sF,UAAW,GAGpB3oF,EAAOqb,WAAU,GACjBvf,EAAK4D,QAAQkX,KAAK,eAAe,GACjCgJ,EACKnf,IAAI,CAAE8f,SAAU2kB,IAChBtuB,KAAK,eAAe,GACzB5W,EAAOyb,aAAaosE,GAEhByB,GACAxtF,EAAKisF,oBAKjBhO,SAAU,SAAS7kF,GACf,OAAOrB,KAAKoK,QAAQ/I,EAAI,CAAEqE,KAAMrE,KAGpCywB,QAAS,SAASntB,GACd,IAAIsD,EAAOjI,MAE6B,IAApCuD,EAAQ+lB,OAAO3T,QAAQhR,EAAEe,OACzBw0B,aAAajyB,EAAK4tF,gBAClB5tF,EAAK4tF,eAAiB/8D,YAAW,WAC7B7wB,EAAKmtF,YACLntF,EAAK4tF,eAAiB,OACvB,OAEE5tF,EAAK6rF,UAAa7rF,EAAK4mF,YAAc5mF,EAAK4D,QAAQiqB,KAAK,WAAWtuB,OAAS,IAC5ES,EAAKw3C,SAKjBs1C,cAAe,SAAS7sE,GACpB,IAAIiP,EAASjP,EAAS,KAAO,MACzBne,EAAaxG,EAAQ+lB,OAEnB/lB,EAAQmf,SAASzB,KAAO1d,EAAQmf,SAASrC,SAAW9c,EAAQwe,QAAQoB,SACtEpZ,GAAc,WAGdme,IAAWloB,KAAKsnC,oBAChBtnC,KAAKsnC,kBAAoBtnC,KAAK81F,sBAG9B91F,KAAKsnC,mBAAqBtnC,KAAKsnC,kBAAkB9/B,QACjDxH,KAAKsnC,kBAAkBnQ,GAAQo8D,EAAQvzF,KAAKq0F,cAGhDf,EAAOn8D,GAAQptB,EAAY/J,KAAKq0F,eAGpCD,WAAY,SAASzvF,GACjB,IAAIsD,EAAOjI,KACPq2B,EAAYpuB,EAAK4D,QAAQ,GACzB3E,EAAUe,EAAKf,QACf2sF,EAASlxF,EAAEuE,EAAQ2sF,QAAQ,GAC3BS,EAAeptF,EAAQotF,aACvBhtF,EAAS3G,EAAM6nB,YAAY7jB,GAC3BixF,EAAQjzF,EAAE2E,GAAQ+E,QAAQ,YAC1Bud,EAASgsE,EAAMzpF,SAASA,OAAO,YAAY3E,OAE/CouF,EAAQA,EAAM,IACThsE,GAAUgsE,GAASA,IAAU3tF,EAAK4D,QAAQ,IAKF,YAAzClJ,EAAEgC,EAAE2C,QAAQ+E,QAAQ,KAAKwB,KAAK,SAI7BqnB,EAASmB,EAAW/uB,IAAY4tB,EAAS2+D,EAAQvsF,IAAagtF,GAAgBp/D,EAASvyB,EAAE2xF,GAAc,GAAIhtF,IAC5GW,EAAKw3C,UAIbs2C,KAAM,SAASjpF,EAAU2C,EAAMumF,GAC3B,IAAIC,EAAS,EAUb,OARInpF,EAAW2C,EAAOumF,IAClBC,EAASD,GAAgBlpF,EAAW2C,IAGpC3C,EAAW,IACXmpF,GAAUnpF,GAGPmpF,GAGXC,MAAO,SAASn5E,EAAQtN,EAAM0mF,EAAYH,EAAcr9C,EAAQ7rC,EAAUspF,GACtE,IAAIH,EAAS,EAYb,OAXIG,EAAUA,GAAW3mF,EAErB3C,IAAa6rC,GAAU7rC,IAAa4lF,GAAU/5C,IAAW+5C,IACrD31E,EAASq5E,EAAUJ,IACnBC,KAAYE,EAAa1mF,IAGzBsN,EAASk5E,EAAS,IAClBA,GAAUE,EAAa1mF,IAGxBwmF,GAGXH,mBAAoB,WAChB,OAAOnzF,EAAE3C,KAAKkH,QAAQ2sF,QACVtsD,aAAa,QACbvR,QAAO,SAASjd,EAAOlN,GACpB,OAAOlL,EAAM4rB,aAAa1gB,OAI7CupF,UAAW,SAASJ,GAChB,IAYIqB,EAAkBj+D,EAClBk+D,EAGA9uF,EAAQ+uF,EAAgBC,EAAeC,EAhBvCxuF,EAAOjI,KAEP6L,EAAU5D,EAAK4D,QACfO,EAAUnE,EAAKmE,QACflF,EAAUe,EAAKf,QACfstF,EAAW7xF,EAAEuE,EAAQstF,UACrBzwE,EAAYxgB,EAAQwgB,YACpB2yE,KAAelC,EAAS,IAAM1zF,QAAWA,OAAO0e,YAAeuE,GAAa,MAC5E8vE,EAASlxF,EAAEuE,EAAQ2sF,QACnB8C,EAAUzvF,EAAQyxC,OAAOrgC,cAAc1N,MAAM,KAC7CgsF,EAAY1vF,EAAQ4F,SAASwL,cAAc1N,MAAM,KACjD8oF,EAAazrF,EAAKyrF,WAEJ/5C,EAAS,MACvB/vC,EAAM,EACNqa,EAAQ7U,SAASiK,iBAIjBk9E,EADArvF,EAAQstF,WAAa1zF,OACJ,CACbujB,IAAMvjB,OAAOqsB,aAAe/d,SAASiK,gBAAgBqd,WAAa,EAClE9K,KAAO9qB,OAAOssB,aAAehe,SAASiK,gBAAgBsT,YAAc,GAGvD6nE,EAASz3E,SAG1B25E,GACAF,EAAgB11F,OAAO0e,WACvBi3E,EAAiB31F,OAAO6e,cAExB62E,EAAgBhC,EAASxnF,QACzBypF,EAAiBjC,EAAS7nF,UAG1B+pF,GAAYzyE,EAAMC,aAAeD,EAAME,aAAe,KAGrDqyE,IAFWtvF,EAAQmX,OAAS,EAAI,GAER1d,EAAM4C,QAAQma,aAK3C,IAFA24E,EAAmBxC,EAAOz7D,UAAUpC,OAAO5pB,EAAQyqF,aAE9B,GAKjB,GAJAP,EAAejzF,KAAKuV,IAAItG,OAAO+jF,EAAiBzpF,IAAI,WAAY,GAK5D+sC,EAAS28C,EAAe,QAGxB,IAAK9uF,GADL4wB,EAAUy7D,EAAOtsD,aAAa8uD,IACR7uF,OAAQoC,EAAMpC,EAAQoC,KACxC0sF,EAAehkF,OAAO3P,EAAEy1B,EAAQxuB,IAAMgD,IAAI,aACtB+sC,EAAS28C,IACzB38C,EAAS28C,EAAe,IAMxClqF,EAAQQ,IAAI,SAAU+sC,GAElBq7C,GAASA,EAAM7+C,QACf/pC,EAAQQ,IAAI,CAAEgf,KAAMopE,EAAM5vF,EAAGif,IAAK2wE,EAAM7wF,IAExCiI,EAAQQ,IAAI3E,EAAK6uF,OAAOH,EAASC,IAGrC,IAAIG,EAAM9pE,EAAU7gB,EAASslC,EAAUmiD,EAAO,KAAOznF,EAAQ4qF,eAAe,IACxEj6E,EAASkQ,EAAU7gB,GACJynF,EAAOmD,eAAe7qF,OAAO,4CAE/B3E,SACbuvF,EAAM9pE,EAAU7gB,EAASslC,GAAU,GACnC30B,EAASkQ,EAAU7gB,IAGvB2Q,EAAOsH,KAAOkyE,EAAelyE,IAC7BtH,EAAO6O,MAAQ2qE,EAAe3qE,KAEzB3jB,EAAKmE,QAAQyB,KAAKklF,IACnB3mF,EAAQyB,KAAKklF,EAAUhwF,EAAO,GAAIg0F,IAGtC,IAAIE,EAAUl0F,EAAO,GAAIga,GACrBuF,EAAWvf,EAAO,GAAIg0F,GACtBpC,EAAaztF,EAAQytF,WAEH,QAAlBjB,EAAW,KACXpxE,EAAS+B,KAAOpc,EAAK8tF,KAAKkB,EAAQ5yE,IAAKpY,EAAYG,GAAWuoF,EAAWhoF,OAAQ8pF,EAAiB1yE,IAGhF,QAAlB2vE,EAAW,KACXpxE,EAASsJ,MAAQ3jB,EAAK8tF,KAAKkB,EAAQrrE,KAAM7f,EAAWK,GAAWuoF,EAAW3nF,MAAOwpF,EAAgBzyE,IAGrG,IAAImzE,EAAUn0F,EAAO,GAAIuf,GACrB5V,EAAgBT,EAAYJ,GAC5BsrF,EAAgBlrF,EAAYG,GAgBhC,OAdKA,EAAQO,UAAYD,IACrByqF,GAAgCzqF,GAGd,SAAlBgnF,EAAW,KACXpxE,EAAS+B,KAAOpc,EAAKiuF,MAAMe,EAAQ5yE,IAAK3X,EAAeT,EAAY4nF,GAAS4C,EAAiB1yE,EAAW4yE,EAAQ,GAAIC,EAAU,GAAIO,IAGhH,SAAlBzD,EAAW,KACXpxE,EAASsJ,MAAQ3jB,EAAKiuF,MAAMe,EAAQrrE,KAAM7f,EAAWF,GAAUE,EAAW8nF,GAAS2C,EAAgBzyE,EAAW4yE,EAAQ,GAAIC,EAAU,GAAI7qF,EAAWK,KAGvJA,EAAQQ,IAAI0V,GAEJA,EAASsJ,MAAQsrE,EAAQtrE,MAAQtJ,EAAS+B,KAAO6yE,EAAQ7yE,KAGrEyyE,OAAQ,SAASn+C,EAAQ7rC,GACrB,IASIsqF,EATAnvF,EAAOjI,KACP6L,EAAU5D,EAAKmE,QACfynF,EAASlxF,EAAEsF,EAAKf,QAAQ2sF,QACxBwD,EAAiB1+C,EAAO,GACxB2+C,EAAmB3+C,EAAO,GAC1B4+C,EAAmBzqF,EAAS,GAC5B0qF,EAAqB1qF,EAAS,GAC9B2qF,EAAexqE,EAAU4mE,GACzB3mD,EAAWvqC,EAAEsF,EAAKf,QAAQgmC,UAE1BlgC,EAAQjB,EAAWF,GACnBc,EAASV,EAAYJ,IAAYI,EAAYJ,EAAQiqB,KAAK,gCAAgCof,WAAWhrC,SACrGwtF,EAAc3rF,EAAW8nF,GACzB8D,EAAe1rF,EAAY4nF,GAC3BxvE,EAAMpc,EAAKf,QAAQ0tF,kBAAoB,EAAI6C,EAAapzE,IACxDuH,EAAO3jB,EAAKf,QAAQ0tF,kBAAoB,EAAI6C,EAAa7rE,KACzD7V,EAAQ1S,KAAK0S,MAyCjB,OAvCIm3B,EAAS,IAAM99B,SAAS4O,OAExBqG,IADA+yE,EAAiBnqE,EAAUigB,IACL7oB,IACtBuH,GAAQwrE,EAAexrE,MAIvByrE,IAAmBzE,IACnBvuE,GAAOszE,GAGPN,IAAmB3E,IACnBruE,GAAOtO,EAAM4hF,EAAe,IAG5BJ,IAAqB3E,IACrBvuE,GAAO1X,GAGP4qF,IAAqB7E,IACrBruE,GAAOtO,EAAMpJ,EAAS,IAGtB2qF,IAAqB5sE,IACrBkB,GAAQ8rE,GAGRJ,IAAqB5E,IACrB9mE,GAAQ7V,EAAM2hF,EAAc,IAG5BF,IAAuB9sE,IACvBkB,GAAQ5e,GAGRwqF,IAAuB9E,IACvB9mE,GAAQ7V,EAAM/I,EAAQ,IAGnB,CACHqX,IAAKA,EACLuH,KAAMA,MAKlBlC,EAAGqN,OAAOy8D,GAEV,IAAI1uE,EAAankB,EAAM4C,QAAQuhB,WAC3B8yE,EAAe,kBAEfC,EAAajwF,EAAM7E,OAAO,CAC1BoF,KAAM,SAAS0D,EAAS3E,GACpBlH,KAAK6L,QAAUlJ,EAAEkJ,GACjB7L,KAAK6L,QAAQ0rB,YAAYqgE,IAG7BE,KAAM,WACF93F,KAAK6L,QAAQmd,GAAG,UAAWhpB,KAAK+3F,YAAYvuF,KAAKxJ,QAGrDg4F,WAAY,WACRh4F,KAAK6L,QAAQ2rB,aAAaogE,IAG9B51F,QAAS,WACLhC,KAAK6L,QAAQ2rB,aAAaogE,GAC1B53F,KAAK6L,QA5vBjB,WA+vBQosF,WAAY,WACR,OAAO,GAGXF,YAAa,SAASpzF,GAClB,GAAgB,IAAZA,EAAE8jF,OAAgBzoF,KAAKi4F,eAAgBtzF,EAAE0E,qBAA7C,CAIA,IAAI6qB,EAAWl0B,KAAKk4F,qBAChBC,EAAiBn4F,KAAKo4F,uBAAuBlkE,GAC7CysC,EAAO3gE,KAAKq4F,eAAe1zF,EAAGwzF,GAE9Bx3B,GACA3gE,KAAKs4F,OAAO33B,GAGhBh8D,EAAEwE,mBAEN+uF,mBAAoB,WAChB,IAAIhkE,EAAWl0B,KAAK6L,QAAQiqB,KAxCP,+KAwCoCE,QAAO,SAASzuB,EAAGwnC,GACxE,OAAOA,EAAKwpD,UAAY,GAAK51F,EAAEosC,GAAMxiC,GAAG,cAAgB5J,EAAEosC,GAAMxiC,GAAG,iBAOvE,OAJIvM,KAAK6L,QAAQU,GAAG,eAChB2nB,EAASvyB,KAAK3B,KAAK6L,QAAQ,IAGxBqoB,GAEXkkE,uBAAwB,SAASlkE,GAC7B,IAAIikE,EAEJ,GAAIrzE,EACAqzE,EAAiBjkE,EAASjP,MAAK,SAAS47C,EAAMF,GAC1C,OAAOE,EAAK03B,SAAW53B,EAAK43B,gBAE7B,CACH,IAAIC,EAAW,YACftkE,EAASlxB,MAAK,SAASuE,EAAGwnC,GACtBA,EAAKnqB,aAAa4zE,EAAUjxF,MAGhC4wF,EAAiBjkE,EAASjP,MAAK,SAAS47C,EAAMF,GAC1C,OAAOE,EAAK03B,WAAa53B,EAAK43B,SAC1Bt/E,SAAS4nD,EAAK/rC,aAAa0jE,GAAW,IAAMv/E,SAAS0nD,EAAK7rC,aAAa0jE,GAAW,IAClF33B,EAAK03B,SAAW53B,EAAK43B,YAG7BrkE,EAAS7C,WAAWmnE,GAGxB,OAAOL,GAEXE,eAAgB,SAAS1zF,EAAGuvB,GACxB,IAAIpZ,EAAQoZ,EAAS1sB,OACjBiM,EAAUygB,EAASnb,MAAMpU,EAAE2C,QAE/B,OAAO4sB,EAAS5E,KAAK7b,GAAW9O,EAAEwiC,UAAY,EAAI,IAAMrsB,IAE5Dw9E,OAAQ,SAASzsF,GACW,UAApBA,EAAQmsB,UAKZnsB,EAAQ85B,QAEgB,SAApB95B,EAAQmsB,UAAuBnsB,EAAQ+5B,mBAAqB5lC,KAAKy4F,oBAAoB5sF,IACrFA,EAAQ+5B,kBAAkB,EAAG/5B,EAAQnD,MAAMlB,SAP3CqE,EAAQ6sF,cAActpF,SAAS4O,KAAK2nB,SAU5C8yD,oBAAqB,SAAS5sF,GAC1B,IAAI8sF,EAAc9sF,EAAQnG,KAAK4S,cAE/B,MAAuB,SAAhBqgF,GAA0C,WAAhBA,GACjB,QAAhBA,GAAyC,QAAhBA,GACT,aAAhBA,KAGRjvE,EAAG8pE,MAAMqE,WAAaA,EA/0B1B,CAg1BG/2F,OAAOH,MAAM+G,QACF/G,OAUd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACf8vB,EAAS9vB,EAAM+oB,GAAG+G,OAClBvZ,EAAM7T,KAAK6T,IAGXiuE,EAAQ10D,EAAO1tB,OAAO,CACtBoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAIe,EAAOjI,KAQX,SAAS44F,EAAWx2F,GAChB,OAAO,SAASuC,GACZsD,EAAK4wF,cAAcz2F,EAAMuC,IAIjC,SAASm0F,EAAkB12F,GACvB,OAAO,SAASuC,GACZsD,EAAKmC,QAAQhI,EAAM,CAAEqmB,QAAS9jB,EAAE8jB,QAAS67D,SAAU3/E,EAAE2/E,SAAUD,OAAQ1/E,EAAE0/E,OAAQllE,MAAOxa,EAAEwa,SAdlGsR,EAAO1oB,GAAGI,KAAKoC,KAAKtC,EAAM4D,EAAS3E,GACnCA,EAAUe,EAAKf,QAEf2E,EAAU5D,EAAK4D,QACf5D,EAAKmE,QAAUP,EAcf5D,EAAKoC,OAAS,IAAI1J,EAAM6lF,WAAW36E,EAAS,CACxCmqB,OAAQ9uB,EAAQ8uB,OAChByxD,QAASvgF,EAAQugF,QACjBxB,QAAS/+E,EAAQ++E,QACjBmB,WAAYlgF,EAAQkgF,WACpBC,gBAAgB,EAChBE,QAASrgF,EAAQqgF,QACjBzB,MAAO8S,EAAW,cAClB3J,KAAM2J,EAAW,QACjBG,IAAK9wF,EAAKk+E,KAAK38E,KAAKvB,GACpB6kF,aAAcgM,EAAkB,gBAChC9L,cAAe8L,EAAkB,iBACjCE,WAAYF,EAAkB,gBAG9B5xF,EAAQ+xF,aACRhxF,EAAKoC,OAAOb,KAAK,QAASvB,EAAKixF,YAAY1vF,KAAKvB,IAChDA,EAAKoC,OAAOb,KAAK,OAAQvB,EAAKkxF,WAAW3vF,KAAKvB,MAE9CA,EAAKoC,OAAOb,KAAK,QAASvB,EAAKmxF,WAAW5vF,KAAKvB,IAC/CA,EAAKoC,OAAOb,KAAK,OAAQovF,EAAW,SACpC3wF,EAAKoC,OAAOb,KAAK,MAAOovF,EAAW,aAGvCj4F,EAAM4zB,OAAOtsB,IAGjBoC,OAAQ,CACJ,aACA,YACA,OACA,UACA,MACA,YACA,OACA,QACA,eACA,gBACA,cAGJnD,QAAS,CACL9E,KAAM,QACNqlF,QAAS,KACTpoF,QAAQ,EACRkoF,SAAS,EACTvxD,OAAQ,KACRoxD,YAAY,EACZ6R,aAAa,EACbI,UAAW,GACXC,UAAW,GACXC,YAAa,IACbtT,QAAS,IACTuT,iBAAkB,KAGtBj/D,OAAQ,WACJv6B,KAAKqK,OAAOkwB,UAGhBv4B,QAAS,WACLyuB,EAAO1oB,GAAG/F,QAAQuI,KAAKvK,MAEvBA,KAAKqK,OAAOrI,WAGhB62F,cAAe,SAASnzF,EAAMf,GACtB3E,KAAKoK,QAAQ1E,EAAM,CAAE8Y,MAAO7Z,EAAE6Z,MAAOW,MAAOxa,EAAEwa,SAC9Cxa,EAAEwE,kBAIVg9E,KAAM,SAASxhF,GACX,IAAIsD,EAAOjI,KACPy5F,EAAUxxF,EAAKwxF,QACfj7E,EAAQ7Z,EAAE6Z,MAEVi7E,GACCj7E,EAAMmoE,QAAU8S,EAAQ9S,QAAU1+E,EAAKf,QAAQsyF,kBAChD74F,EAAMijF,WAAWplE,EAAOi7E,GAASnV,SAvGf,IA0GnBr8E,EAAK4wF,cAAc,YAAal0F,GAChCsD,EAAKwxF,QAAU,OAEdxxF,EAAK4wF,cAAc,MAAOl0F,GAC1BsD,EAAKwxF,QAAUj7E,IAIvB46E,WAAY,SAASz0F,GACjB3E,KAAK64F,cAAc,YAAal0F,IAGpCu0F,YAAa,SAASv0F,GACM,EAApBuS,EAAIvS,EAAES,EAAE2/E,WAAiB7tE,EAAIvS,EAAER,EAAE4gF,WACjCpgF,EAAE2F,OAAO89E,WAIjB+Q,WAAY,SAASx0F,GACjB,IACIuC,EADOlH,KACQkH,QACfsX,EAAQ7Z,EAAE6Z,MACViI,EAAW9hB,EAAEwa,MAAM6lE,UAAYxmE,EAAMsoE,UACrC9yC,EAAYx1B,EAAMpZ,EAAE8/E,aAAe,EAAI,QAAU,OAGjDhuE,EAAIsH,EAAMpZ,EAAE8/E,eAAiBh+E,EAAQmyF,WACrCniF,EAAIsH,EAAMra,EAAE+gF,cAAgBh+E,EAAQoyF,WACpC7yE,EAAWvf,EAAQqyF,cATZv5F,KAYFoK,QAAQ,QAAS,CAClB4pC,UAAWA,EACXx1B,MAAO7Z,EAAE6Z,QAGbA,EAAM+b,aAKlB55B,EAAM+oB,GAAGqN,OAAOouD,GAvJpB,CAwJGrkF,OAAOH,MAAM+G,QACF/G,OAUd,SAAUgC,EAAGC,GACT,IAAIjC,EAAQG,OAAOH,MACfipB,EAASjpB,EAAMipB,OACfD,EAAKhpB,EAAM4lB,QACXmD,EAAKE,EAAOF,GACZ3mB,EAASJ,EAAEI,OACX0tB,EAAS/G,EAAG+G,OACZ7oB,EAAQjH,EAAMiH,MACd6lF,EAAU9sF,EAAM+oB,GAAG+jE,QACnBb,EAAOjsF,EAAM+oB,GAAGkjE,KAChBV,EAAiBvrF,EAAM+oB,GAAGwiE,eAC1BlwC,EAAaryB,EAAGqyB,WAChBP,EAAY9xB,EAAG8xB,UACfvkC,EAAM7T,KAAK6T,IAQXwiF,EAAe,sBACfC,EAAe,sBAEf7zC,EAAS,SAETytC,EAAS,SAGTqG,EAAen+C,EAAU14C,OAAO,CAChCoF,KAAM,SAASjB,GACX,IAAIe,EAAOjI,KACXy7C,EAAU1zC,GAAGI,KAAKoC,KAAKtC,GACvBlF,EAAOkF,EAAMf,GAEbe,EAAKm9E,WAAW57E,KAAK,aAAcvB,EAAKqN,MAAM9L,KAAKvB,IACnDA,EAAK4xF,WAAWrwF,KAAK,QAASvB,EAAKsyB,OAAO/wB,KAAKvB,KAGnDgf,QAAS,WACP,OAAOjnB,KAAKo8C,QAAQ1M,MAAQ1vC,KAAK+xB,WAAWi6D,UAG9Cz/C,KAAM,WACF,OAAOvsC,KAAK+xB,WAAWi6D,SAAWhsF,KAAKo8C,QAAQ1M,MAAQ,KAG3DmM,KAAM,WACF,IAAIO,EAAUp8C,KAAKo8C,QACnBA,EAAQmxC,UAAU,KAClBvtF,KAAK+xB,WAAW+5D,QAAQ1vC,EAAQ1M,QAGpCoM,MAAO,WACH,IAAIM,EAAUp8C,KAAKo8C,QACnBA,EAAQyxC,QAAQ7tF,KAAK+xB,WAAWi6D,UAChChsF,KAAK+xB,WAAW+5D,QAAQ1vC,EAAQ1M,UAIpCoqD,EAAcr+C,EAAU14C,OAAO,CAC/BoF,KAAM,SAASjB,GACX,IAAIe,EAAOjI,KAEXy7C,EAAU1zC,GAAGI,KAAKoC,KAAKtC,GAEvBlF,EAAOkF,EAAMf,EAAS,CAClBgrC,WAAY,IAAI8J,EAAW,CACvBjX,KAAM79B,EAAQ69B,KACdqX,QAASl1C,EAAQk1C,QACjBN,MAAO,WAAa7zC,EAAK2gF,YAIjC3gF,EAAK4xF,WAAWrwF,KAAK,SAAS,WAAavB,EAAKsyB,YAChDtyB,EAAKm9E,WAAW57E,KAAK,MAAOvB,EAAKqN,MAAM9L,KAAKvB,IAC5CA,EAAKm9E,WAAW57E,KAAK,aAAcvB,EAAKqN,MAAM9L,KAAKvB,IACnDA,EAAKm9E,WAAW57E,KAAK,MAAOvB,EAAK6zC,MAAMtyC,KAAKvB,KAGhD8zC,SAAU,WACN/7C,KAAKkyC,WAAW3X,UAGpBw/D,OAAQ,SAASz3E,GACFtiB,KACNu6B,SADMv6B,KAENg6F,QAAQ13E,IAGjBw5B,MAAO,WACH,IAAI7zC,EAAOjI,KACPiI,EAAKgyF,SAAStO,cACd1jF,EAAKiyF,YAELjyF,EAAK2gF,QAIbr8C,KAAM,WACF,OAAOr1B,EAAIlX,KAAK+kF,UAAY,GAGhCzvE,MAAO,SAAS3Q,GACZ,IACIogF,EADA98E,EAAOjI,KAGNiI,EAAKukF,UAAUvlE,UAEhBhf,EAAKgyF,SAAStO,cACV1jF,EAAKiqC,WAAW0J,UAChB3zC,EAAKiqC,WAAW3X,SAChBtyB,EAAK88E,SAAW1hF,KAAK8S,IAAIxR,EAAE6Z,MAAMvW,EAAK88B,MAAMggD,SAAW98E,EAAKkyF,mBA9FzD,IAgGH1+C,EAAU1zC,GAAGuN,MAAM/K,KAAKtC,IAExBA,EAAKiyF,aAGTnV,EA5FS,IA4FEpgF,EAAE6Z,MAAMkR,GAAwB,EAAI/qB,EAAE6Z,MAAMvW,EAAK88B,MAAMggD,SAClE98E,EAAK88E,SAAW1hF,KAAKuV,IAAIvV,KAAK8S,IAAI4uE,EAAW98E,EAAKkyF,mBAtG3C,SAwGPlyF,EAAK4xF,WAAW5O,cAChBxvC,EAAU1zC,GAAGuN,MAAM/K,KAAKtC,MAIhC4zC,KAAM,WACF,IAAI5zC,EAAOjI,KACPwsF,EAAYvkF,EAAKukF,UACjB4N,EAAWnyF,EAAKgyF,SAAStO,cA/GR,GA+GiD1jF,EAAKmyF,SACvEz1D,EAAS18B,EAAK88E,UAAYqV,EAC1B93E,EAAWra,EAAKm0C,QAAQn0C,EAAK88B,MAAQJ,GAEhC18B,EAAK4kF,SAAWL,EAAUb,YAAYrpE,KACvCA,EAAWjf,KAAKuV,IAAIvV,KAAK8S,IAAImM,EAAUkqE,EAAU5zE,KAAM4zE,EAAUr2E,KACjElO,EAAK88E,SAAW,GAGxB98E,EAAKm0C,QAAQG,SAASt0C,EAAK88B,KAAMziB,IAGrCsmE,KAAM,WACF5oF,KAAK65F,WAAW3O,gBAChBlrF,KAAK2L,OAGTuuF,UAAW,WACP,IAAIjyF,EAAOjI,KACPwsF,EAAYvkF,EAAKukF,UACjB6N,EAAWpyF,EAAKm0C,QAAQn0C,EAAK88B,MAAQynD,EAAU5zE,IAAM4zE,EAAU5zE,IAAM4zE,EAAUr2E,IACnFlO,EAAK+xF,QAAQK,IAGjBL,QAAS,SAAS13E,GACdtiB,KAAKkyC,WAAWiK,OAAO,CAAE75B,SAAUA,EAAUmE,SA7I7B,IA6I0DitB,KAAMsI,EAAWQ,iBAI/F89C,EAAmB7+C,EAAU14C,OAAO,CACpCoF,KAAM,SAASjB,GAGXvG,EAAM4lB,QAAQk1B,UAAU1zC,GAAGI,KAAKoC,KAAKvK,MAErC+C,EAJW/C,KAIEkH,EAAS,CAClByxC,OAAQ,GACRvrC,YAAa,GACb2P,OAAQ,MAIhB8+B,KAAM,WACF77C,KAAKu6F,qBACLv6F,KAAKm8C,OAAOn8C,KAAK24C,SAGrBpM,KAAM,WACF,OAAOr1B,EAAIlX,KAAK+c,OAAO5Y,GA9JG,GA8JiC+S,EAAIlX,KAAK+c,OAAO3X,GA9JjD,GAiK9B02C,MAAO,WACH97C,KAAKm8C,OAAOn8C,KAAKoN,aACbpN,KAAK+oB,UACL/oB,KAAK+oB,SAASxe,QAItBiwF,eAAgB,SAASt8D,EAAMC,GAC3Bn+B,KAAK+c,OAAS,GACd/c,KAAK24C,OAASza,EACdl+B,KAAKoN,YAAc+wB,GAGvBs8D,YAAa,SAAS1xE,GACdA,GAAYpoB,EAAMuI,WAAW6f,GAC7B/oB,KAAK+oB,SAAWA,EAEhBA,EAtMhB,WA0MQwxE,mBAAoB,WAChBv6F,KAAK+c,OAAS,CACV3X,GAAIpF,KAAKoN,YAAYhI,EAAIpF,KAAK24C,OAAOvzC,GAAK,EAC1CjB,GAAInE,KAAKoN,YAAYjJ,EAAInE,KAAK24C,OAAOx0C,GAAK,GAG9CnE,KAAK24C,OAAS,CACVx0C,EAAGnE,KAAK24C,OAAOx0C,EAAInE,KAAK+c,OAAO5Y,EAC/BiB,EAAGpF,KAAK24C,OAAOvzC,EAAIpF,KAAK+c,OAAO3X,MAKvCs1F,EAAY9yF,EAAM7E,OAAO,CACzBoF,KAAM,SAASjB,GACX,IAAIe,EAAOjI,KACPqyC,EAA8B,MAAjBnrC,EAAQ69B,KACrBl5B,EAAUlJ,EAAE,wCAA0CuE,EAAQyzF,WAAa,mCAAqCtoD,EAAa,aAAe,YAAc,kBAE1JA,GACAxmC,EAAQkX,KAAK,mBAAoB,cAGrChgB,EAAOkF,EAAMf,EAAS,CAClB2E,QAASA,EACT+uF,YAAa,EACbx+C,QAAS,IAAIqxC,EAAQ5hF,GACrBgvF,cAAe3zF,EAAQk1C,QACvB0+C,cAAe5zF,EAAQ4zF,cACvBrrF,KAAM4iC,EAAa,QAAU,WAGjCpqC,EAAK4yF,cAAcrxF,KAAKs8C,EAAQ79C,EAAK0V,QAAQnU,KAAKvB,IAClDA,EAAKouB,UAAUyjB,OAAOjuC,GAClB3E,EAAQ4zF,eACR7yF,EAAKiF,QAIbyQ,QAAS,WACL,IAAI1V,EAAOjI,KACP+kC,EAAO98B,EAAK88B,KACZynD,EAAYvkF,EAAKukF,UACjBuO,EAAWvO,EAAU/8E,KACrBorF,EAAgB5yF,EAAK4yF,cACrBG,EAAYD,EAAWvO,EAAUzrC,MACjCj0C,EAAWzJ,KAAK0S,OAAO8kF,EAAc91D,GAAQi2D,GAC7CvrF,EAAOpM,KAAK0S,MAAMglF,EAAWC,GAEzBA,GAAa,EACbh7F,KAAK6L,QAAQe,IAAI,UAAW,QAE5B5M,KAAK6L,QAAQe,IAAI,UAAW,IAG5BE,EAAW2C,EAAOsrF,EAClBtrF,EAAOsrF,EAAWjuF,EACXA,EAAW,IAClB2C,GAAQ3C,EACRA,EAAW,GAGf7E,EAAK2yF,aAAenrF,IACpBxH,EAAK4D,QAAQe,IAAI3E,EAAKwH,KAAMA,EAAO,MACnCxH,EAAK2yF,YAAcnrF,GAGvBxH,EAAKgzF,WAAWnuF,EAAU0/E,EAAU/8E,KAAOxH,EAAK2yF,aAEhD3yF,EAAKm0C,QAAQG,SAASxX,EAAMj4B,IAGhCI,KAAM,WACFlN,KAAK6L,QAAQe,IAAI,CAAE+pB,QApQH,GAoQ+BukE,WAAY,aAG/D/tF,KAAM,WACGnN,KAAK86F,eACN96F,KAAK6L,QAAQe,IAAI,CAAE+pB,QAAS,KAIpCskE,WAAY,SAASxnF,EAASstC,GAC1B,IAAIl1C,EAAU7L,KAAK6L,QAEf4H,EAAUstC,IACVttC,EAAUstC,GAGdl1C,EAAQkX,KAAK,gBAAiBg+B,GAC9Bl1C,EAAQkX,KAAK,gBAAiBtP,MAIlCglB,EAAWhI,EAAO1tB,OAAO,CACzBoF,KAAM,SAAS0D,EAAS3E,GACpB,IAAIe,EAAOjI,KAMX,GALAywB,EAAO1oB,GAAGI,KAAKoC,KAAKtC,EAAM4D,EAAS3E,GAEnC2E,EAAU5D,EAAK4D,QAEf5D,EAAKkzF,QAAUlzF,EAAKf,QAAQsxB,WAAa73B,EAAM4C,QAAQsf,mBACnD5a,EAAKkzF,QASL,OARAtvF,EAAQyY,SAAS,sBACZ82E,QAAQ,wCAEbr4F,EAAOkF,EAAM,CACTozF,cAAexvF,EACfyvF,eAAgBzvF,EAAQqpC,WAAWhrC,UAM3C2B,EACKe,IAAI,WAAY,UAChB0X,SAAS,qBACTq9D,UAAU,sCACVyZ,QAAQ,mCAEb,IAAI1+C,EAAQ7wC,EAAQqpC,WAAWrd,GAAG,GAE9BgiE,EAAa,IAAIl5F,EAAMkqF,WAAWh/E,GAElCuwC,EAAU,IAAIqxC,EAAQ/wC,GAEtB3qB,EAAa,IAAIm6D,EAAe,CAC5BrgF,QAAS6wC,EACTrmB,UAAWxqB,EACXu/E,cAAenjF,EAAKf,QAAQkpC,OAGhCmrD,EAAiBv7F,KAAKkH,QAAQq0F,eAE9BnW,EAAa,IAAIzkF,EAAM6lF,WAAW36E,EAAS,CACvCg8E,YAAa,QACbN,SAAS,EACTF,gBAAgB,EAChBS,kBAAkB,EAClBR,kBAAkB,EAClBF,WAAYn/E,EAAKf,QAAQkpC,KACzBu1C,iBAAkB19E,EAAKf,QAAQy+E,iBAC/BrwE,MAAO,SAAS3Q,GACZotB,EAAWpU,UAEX,IAAI69E,EAAYtkF,EAAIvS,EAAES,EAAE2/E,UACpB0W,EAAYvkF,EAAIvS,EAAER,EAAE4gF,UACpB2W,EAA8B,EAAZF,GAAiBC,EAEnCE,EAA4B,EAAZF,GAAiBD,GADF74F,EAAEuyB,SAASjtB,EAAKqzF,eAAe,GAAI32F,EAAEwa,MAAM7X,UAIxCi0F,EAAe52F,IAAMsD,EAAKgf,UAAY8K,EAAW3sB,EAAE6hB,SAAWy0E,GAAmB3pE,EAAW5tB,EAAE8iB,SAAW00E,GAC3IvW,EAAWgD,UAEXhD,EAAW7qD,YAKvBqhE,EAAO,IAAIhP,EAAK,CACZxwC,QAASA,EACTrqB,WAAYA,EACZqzD,WAAYA,EACZyH,QAAS5kF,EAAKf,QAAQ2lF,UAG1BgP,EAAe,IAAIjC,EAAa,CAC5Bx9C,QAASA,EACTrqB,WAAYA,EACZqzD,WAAYA,EACZyU,WAAYA,IAGhBiC,EAAmB,IAAIxB,EAAiB,CACpCn+C,OAAQ,SAAS8wC,GACbhlF,EAAK8zF,SAAS9O,EAAY7nF,EAAG6nF,EAAY9oF,MAIrDi4C,EAAQ5yC,KAAKs8C,GAAQ,WACjB79C,EAAKyuB,WAAc0lB,EAAQj4C,EAC3B8D,EAAK0kB,YAAeyvB,EAAQh3C,EAE5B6C,EAAKmC,QAAQmpF,EAAQ,CACjB78D,UAAWzuB,EAAKyuB,UAChB/J,WAAY1kB,EAAK0kB,gBAIrB1kB,EAAKf,QAAQ80F,qBACbnwF,EAAQmd,GAAG,4BAA6BhpB,KAAKi8F,aAAazyF,KAAKxJ,OAGnE+C,EAAOkF,EAAM,CACTm0C,QAASA,EACTrqB,WAAYA,EACZ8pE,aAAcA,EACdC,iBAAkBA,EAClB1W,WAAYA,EACZwW,KAAMA,EACN/B,WAAYA,EACZqC,QAAQ,EACRj1E,SAAS,EACTo0E,cAAe3+C,EACfhmB,UAAW,EACX/J,WAAY,EACZ2uE,eAAgBzvF,EAAQqpC,WAAWhrC,UAGvCjC,EAAKk0F,UAAU,KACfl0F,EAAKk0F,UAAU,KAGfl0F,EAAKm0F,UAAY,WACbn0F,EAAKo0F,QAAS,EACdp0F,EAAKm9E,WAAWz5E,IAAI,EAAG1D,EAAKq0F,UAGhCvqE,EAAWpU,UAEP1V,EAAKf,QAAQq1F,eACbt0F,EAAKu0F,sBAIbP,aAAc,SAASt3F,GACnB,IAAIA,EAAE83F,QAAN,CAIKz8F,KAAKq8F,SACNr8F,KAAKq8F,QAAS,EACdr8F,KAAKs8F,QAAU,EACft8F,KAAKolF,WAAWU,MAAM,EAAG9lF,KAAKs8F,UAGlCpiE,aAAal6B,KAAK08F,eAClB18F,KAAK08F,cAAgB5jE,WAAW94B,KAAKo8F,UAAW,IAEhD,IAAIz3D,EAAQhkC,EAAM8jC,YAAY9/B,GAE1BggC,IACA3kC,KAAKs8F,SAAW33D,EAChB3kC,KAAKolF,WAAW9qD,KAAK,EAAGt6B,KAAKs8F,UAGjC33F,EAAEwE,mBAGNoiF,YAAa,WACTvrF,KAAK+xB,WAAW5tB,EAAEonF,eAGtBG,YAAa,SAASv1E,EAAKyC,GACvB5Y,KAAK+xB,WAAW5tB,EAAEunF,YAAYv1E,EAAKyC,IAGvCjM,OAAQ,WACJ,OAAO3M,KAAK+xB,WAAW5tB,EAAEsL,MAG7ByU,aAAc,WACV,OAAOlkB,KAAKq7F,cAAc,GAAGn3E,cAGjC/F,YAAa,WACT,OAAOne,KAAKq7F,cAAc,GAAGl9E,aAGjCjX,QAAS,CACL9E,KAAM,WACNguC,MAAM,EACNusD,WAAY,IACZC,oBAAoB,EACpB/P,SAAS,EACTr0D,WAAW,EACXwjE,qBAAqB,EACrBT,eAAgB,WAAa,OAAO,GACpCgB,eAAe,EACfvyE,SAAU,CACN6yE,aAAc,kBACdC,gBAAiB,qBACjBC,gBAAiB,eAIzB1yF,OAAQ,CAldD,OAodHkpF,EAldK,UAsdTzhE,QAAS,WACA9xB,KAAKm7F,SACNn7F,KAAKg9F,kBAIb1rE,WAAY,SAASpqB,GAEjBupB,EAAO1oB,GAAGupB,WAAW/mB,KADVvK,KACqBkH,GAC5BA,EAAQq1F,eAFDv8F,KAGFw8F,sBAIbhnD,MAAO,WACCx1C,KAAKm7F,QACLn7F,KAAKq7F,cAAc3kE,UAAU,IAE7B12B,KAAKo8C,QAAQD,OAAO,CAAE/2C,EAAG,EAAGjB,EAAG,IAC/BnE,KAAKi9F,OAAO,KAIpBD,eAAgB,WACZh9F,KAAK+xB,WAAWpU,UACZ3d,KAAK47F,KAAKx2F,EAAEumF,eACZ3rF,KAAKo8C,QAAQG,SAAS,IAAKv8C,KAAK+xB,WAAW3sB,EAAE+Q,KAG7CnW,KAAK47F,KAAKz3F,EAAEwnF,eACZ3rF,KAAKo8C,QAAQG,SAAS,IAAKv8C,KAAK+xB,WAAW5tB,EAAEgS,MAIrD+mF,QAAS,WACL,IAAInrE,EAAa/xB,KAAK+xB,WACtBA,EAAWpU,UACX3d,KAAKi9F,OAAOlrE,EAAW6qB,UACvB58C,KAAKo8C,QAAQD,OAAOpqB,EAAWu6D,sBAGnChlE,OAAQ,WACJtnB,KAAKinB,SAAU,GAGnBG,QAAS,WACLpnB,KAAKinB,SAAU,GAGnB80E,SAAU,SAAS32F,EAAGjB,GACdnE,KAAKm7F,SACLx6F,EAAMgsB,WAAW3sB,KAAKq7F,cAAenkF,EAAI9R,IACzCpF,KAAKq7F,cAAc3kE,UAAUxf,EAAI/S,MAEjCnE,KAAK+xB,WAAWpU,UAChB3d,KAAKo8C,QAAQD,OAAO,CAAE/2C,EAAGA,EAAGjB,EAAGA,MAIvCg5F,iBAAkB,SAAS/3F,EAAGjB,EAAG4kB,GAC7B,IAAImV,EACAC,EAEAn+B,KAAKm7F,QACLn7F,KAAK+7F,SAAS32F,EAAGjB,IAEjB+5B,EAAO,CAAE94B,EAAGpF,KAAKo8C,QAAQh3C,EAAGjB,EAAGnE,KAAKo8C,QAAQj4C,GAC5Cg6B,EAAK,CAAE/4B,EAAGA,EAAGjB,EAAGA,GAEhBnE,KAAK87F,iBAAiBtB,eAAet8D,EAAMC,GAC3Cn+B,KAAK87F,iBAAiBrB,YAAY1xE,GAClC/oB,KAAK87F,iBAAiBxmF,UAI9B8nF,YAAa,WACT,IAAIn1F,EAAOjI,KACXiI,EAAKo1F,YAAYnxE,YAAYytE,GAC7B1xF,EAAKq1F,cAAcxtF,KAAK7H,EAAK40F,aAAa,KAC1C50F,EAAKs1F,SAASzhD,QACd7zC,EAAKu1F,SAAS1hD,QACd7zC,EAAKm9E,WAAW7qD,UAGpBv4B,QAAS,WACLyuB,EAAO1oB,GAAG/F,QAAQuI,KAAKvK,MACnBA,KAAKolF,YACLplF,KAAKolF,WAAWpjF,WAIxBi7F,OAAQ,SAASvtD,GACb1vC,KAAK+xB,WAAW+5D,QAAQp8C,GACxB1vC,KAAKo8C,QAAQyxC,QAAQn+C,IAGzB8sD,mBAAoB,WAChB,IAAIv0F,EAAOjI,KAEXiI,EAAK8pB,WAAW5tB,EAAEynF,eAClB3jF,EAAK40F,aAAel8F,EAAMkP,SAAS5H,EAAKf,QAAQ8iB,SAAS6yE,cACzD50F,EAAK60F,gBAAkBn8F,EAAMkP,SAAS5H,EAAKf,QAAQ8iB,SAAS8yE,iBAC5D70F,EAAK80F,gBAAkBp8F,EAAMkP,SAAS5H,EAAKf,QAAQ8iB,SAAS+yE,iBAE5D90F,EAAKozF,cAAcD,QAAQ,oKAAsKnzF,EAAK40F,aAAa,IAAM,kBACzN50F,EAAKo1F,YAAcp1F,EAAKozF,cAAcnmD,WAAWhrC,QACjDjC,EAAKq1F,cAAgBr1F,EAAKo1F,YAAYnoD,SAAS,gBAE/CjtC,EAAK2zF,KAAKz3F,EAAEqF,KAAK,SAAUvB,EAAKw1F,YAAYj0F,KAAKvB,IACjDA,EAAKm9E,WAAW57E,KAAK,MAAOvB,EAAKy1F,SAASl0F,KAAKvB,KAGnDy1F,SAAU,WACN,IAAIz1F,EAAOjI,KAENiI,EAAKi0F,SAIVj0F,EAAKi0F,QAAS,EACdj0F,EAAKo1F,YAAYnxE,YAAYwtE,GAAcp1E,SAASq1E,GACpD1xF,EAAKq1F,cAAcxtF,KAAK7H,EAAK80F,gBAAgB,KAC7C90F,EAAKs1F,SAASxD,OAAO9xF,EAAKf,QAAQy1F,WAAa,GAC/C10F,EAAKmC,QAAQ,UAGjBqzF,YAAa,WACT,IAAIx1F,EAAOjI,KAEPiI,EAAKm0C,QAAQj4C,EA7lBI,GA6lByB8D,EAAKf,QAAQy1F,WAClD10F,EAAKi0F,SACNj0F,EAAKi0F,QAAS,EACdj0F,EAAKo1F,YAAYnxE,YAAYytE,GAAcr1E,SAASo1E,GACpDzxF,EAAKq1F,cAAcxtF,KAAK7H,EAAK60F,gBAAgB,MAE1C70F,EAAKi0F,SACZj0F,EAAKi0F,QAAS,EACdj0F,EAAKo1F,YAAYnxE,YAAYwtE,GAC7BzxF,EAAKq1F,cAAcxtF,KAAK7H,EAAK40F,aAAa,OAIlDV,UAAW,SAASp3D,GAChB,IAMI44D,EANA11F,EAAOjI,KACP49F,EAAY31F,EAAK4D,QAAQkX,KAAK,MAC9Bq5B,EAAUn0C,EAAKm0C,QACfowC,EAAYvkF,EAAK8pB,WAAWgT,GAC5B80D,EAAa5xF,EAAK4xF,WAClBI,EAAWhyF,EAAK2zF,KAAK72D,GAGpB64D,IACDA,EAAYj9F,EAAM6uB,OAClBvnB,EAAK4D,QAAQkX,KAAK,KAAM66E,IAG5BD,EAAY,IAAIjD,EAAU,CACtB31D,KAAMA,EACNqX,QAASA,EACTowC,UAAWA,EACXn2D,UAAWpuB,EAAK4D,QAChBivF,cAAe7yF,EAAKf,QAAQ01F,mBAC5BjC,WAAYiD,IAGhBpR,EAAUhjF,KAAKs8C,GAAQ,WACnB63C,EAAUhgF,aAGds8E,EAASzwF,KAAKs8C,GAAQ,WAClB63C,EAAUzwF,UAGdjF,EAAK88B,EAAO,WAAa,IAAI+0D,EAAY,CACrC/0D,KAAMA,EACNk1D,SAAUA,EACV79C,QAASA,EACTy9C,WAAYA,EACZzU,WAAYn9E,EAAKm9E,WACjBoH,UAAWA,EACXK,QAAS5kF,EAAKf,QAAQ2lF,QACtBuN,SAAUnyF,EAAKf,QAAQkzF,UAppBpB,IAqpBHD,mBAAoBlyF,EAAKf,QAAQizF,oBAppBnB,GAqpBdxuF,IAAK,WACDgyF,EAAUxwF,OACVlF,EAAKmC,QAAQ,YAAa,CACtB26B,KAAMA,EACNrO,UAAWzuB,EAAKyuB,UAChB/J,WAAY1kB,EAAK0kB,mBAOrCjD,EAAGqN,OAAO0B,GAlrBd,CAmrBG33B,OAAOH,MAAM+G,QACF/G,MAqwCd,OA1vCA,SAAUgC,EAAGiuB,EAAShuB,GAClB,aAGA,GAAKguB,GAAYA,EAAQitE,SAAzB,CAKA,IAIIC,EAaAC,EAGIp5E,EAUAq5E,EA9BJx+F,EAASoxB,EAAQpxB,OAAO,mBAAoB,IAC5Cy+F,EAAYrtE,EAAQitE,SAAS,CAAC,OAC9BK,EAASD,EAAU3uE,IAAI,UACvB6uE,EAAWF,EAAU3uE,IAAI,YAEzB8uE,EAAOH,EAAU3uE,IAAI,QAcrB+uE,GACI15E,EAAQ,CACR25E,SAAU,qBACVC,SAAU,yBACVC,UAAW,sBACXC,UAAW,kBACXC,kBAAmB,kBACnBC,SAAU,yBACVC,KAAM,SACNC,YAAa,UAEbb,EAAe,SAASntE,EAAYnrB,GACpC,MAAY,UAARA,EACOmrB,EAEJlwB,MAAMkN,KAAKnI,GAAMy7C,OAAOtwB,IAE5B,SAASiuE,EAAOjzF,EAASgkB,EAAMviB,GAClC,IAAI5H,EAAOif,EAAMkL,IAAS,aACtBpc,EAAUqrF,EAAMC,MAAMzxF,GACtB0xF,EAAKhB,EAAavqF,EAAS/N,GAa/B,OAXAo5F,EAAMG,OAAO3xF,GAAQ,SAAS4xF,GAC1B,IA2yBiBtyE,EA3yBbiG,GA4yBZjG,EAAKjqB,EADoBiqB,EA3yBgB/gB,GA6yBlClL,MAAMw1B,eAAevJ,EAAIjsB,MAAM+oB,KAClC/oB,MAAMw1B,eAAevJ,EAAIjsB,MAAMipB,OAAOF,KACtC/oB,MAAMw1B,eAAevJ,EAAIjsB,MAAMkpB,QAAQH,KA7yBnC,GAAImJ,GAAyC,mBAAxBA,EAAOssE,eACpBD,IAAQzrF,GAAWyrF,IAAQrsE,EAAOhC,WAAY,CAC9C,IAAImuE,EAAKhB,EAAakB,EAAKx5F,GAC3BmtB,EAAOssE,cAAcH,GACrBvrF,EAAUyrF,MAIfF,IAIXI,EAAoB,CACpBC,aAAa,EACbC,UAAU,EACVC,SAAS,EACTC,UAAU,EACVC,UAAU,GAGVC,EAAuB,CAEvBt9F,MAAM,EACN03E,OAAO,EACPrtE,OAAO,GAsRPkzF,EAAa,6BA2VjBngG,EAAOF,QAAQ,mBAAoB,CAAE,WAAY,SAASyQ,GACtD,IAAI6vF,EACAC,GAAW,EAGf/B,EAAkB/tF,EA2DlB,MAAO,CACHoxC,OA1DS,SAAStxB,EAAMiwE,GACxB,MAAO,CAEHC,SAAU,KACVtgG,QAAS,CAAE,WAAY,UACvBq/F,OAAO,EAEPkB,WAAY,CAAE,SAAU,SAAU,WAAY,SAASC,EAAQC,GAC3DlgG,KAAK6P,SAAWrG,EAAK22F,EAAaD,GAClCA,EAAOE,SAAW52F,GAAK,WACnBxJ,KAAK6P,SAAW,KAChBqwF,EAAOE,SAAW,OACnBpgG,QAGP24E,KAAM,SAASmmB,EAAOjzF,EAASw0F,EAAOC,GAClC,IAAIC,EAAW59F,EAAEkJ,GAUb20F,EAAW3wE,EAAKptB,QAAQ,WAAY,OAExC89F,EAASx9E,KAAKy9E,EAAUD,EAASx9E,KAAK,QAAUy9E,IAChDD,EAAS,GAAGx4D,gBAAgB,QAAUy4D,GAEzBC,EAAa3B,EAAOjzF,EAASw0F,EAAOxwE,EAAMiwE,EAAUQ,KAM7DV,GACA1lE,aAAa0lE,GAGjBA,EAAuB9mE,YAAW,WAC9BgmE,EAAM4B,MAAM,iBACPb,IACDA,GAAW,EACXl9F,EAAE,QAAQK,MAAK,WACX,IAAI+jC,EAAOpkC,EAAE3C,MAAMggG,WAAW,QAC1Bj5D,GACAA,EAAK45D,8BAcrC,IAAIC,EAAW,CACXC,OAAQ,WACRC,eAAgB,QAChBC,WAAY,QACZC,eAAgB,QAChBC,WAAY,QACZC,aAAc,QACdC,YAAa,QACbC,cAAe,QACf/0B,YAAa,QACbg1B,OAAQ,QACRxtB,UAAW,OACXytB,OAAQ,SACRC,SAAU,KACVC,WAAY,MACZ7C,SAAU,KACVJ,SAAU,KACVK,KAAM,KACNC,YAAa,KACb4C,YAAa,KACbC,OAAQ,SAGRC,EAAiB,GAEjBC,EAAoB,GAExBhxE,EAAQtvB,QAAQ,CAAC,mBAAmB,SAASuxB,GACzC+uE,EAAkBjgG,KAAKkxB,GACvBA,EAAS,QAAUA,EACnBrzB,EAAOqiG,UAAUhvE,GAAQ,WACrB,MAAO,CACHktE,SAAU,IACVpnB,KAAM,SAASmmB,EAAOjzF,EAASw0F,GAC3BI,EAAa3B,EAAOjzF,EAASw0F,EAAOxtE,EAAQA,WA2F5D,IAAIi3C,EAASnpE,MAAMgtB,WACfsmE,EAAO,MACPx0C,EAAQ,MAIZ9+C,MAAMgtB,WAAa,SAAS/e,GACxB,OAAOk7D,EAAOl7D,GACTnM,QAAQwxF,EALH,aAMLxxF,QAAQg9C,EALF,cAQf,IAAIqiD,EAAiB,GAqCrBnhG,MAAMwvB,oBAAmB,SAAS4xE,GAC9BD,EAAiBn/F,EAAEs7B,KAAK6jE,GAAgB,SAAS5qE,GAC7C,OAAQ8qE,EAAU55F,MAAM,KAAM8uB,MAxItC,SAA0B+qE,EAAOC,GAC7B,SAASC,EAAKC,EAAe9vE,GACzB9yB,EAAOqiG,UAAUO,EAAe,CAC5B,mBACA,SAASC,GACL,OAAOA,EAAiBlhD,OAAO7uB,EAAY8vE,MAKvD,IAAIhgG,EAAO8/F,EAAW,SAAW,GAG7Bz1E,EAFJrqB,GAAQ6/F,EAAMl6F,GAAGb,QAAQ9E,KAGrBkgG,EAAW,QAAUlgG,EAAK0I,OAAO,GAAK1I,EAAKoZ,OAAO,GAAGlD,cAIrDiqF,GAHJngG,EAAO,QAAUA,GAGCK,QAAQ,WAAY,OAEtC,IAA0D,GAAtDk/F,EAAehsF,QAAQvT,EAAKK,QAAQ,QAAS,KAAY,CACzD,IAAI2R,EAAQhS,IAASkgG,EAAW,CAAElgG,GAAS,CAAEA,EAAMkgG,GACnD1xE,EAAQtvB,QAAQ8S,GAAO,SAASguF,GAC5B5iG,EAAOqiG,UAAUO,GAAe,WAC5B,MAAO,CACHrC,SAAU,IACVt9F,SAAS,EACToN,SAAU,SAAShE,EAASm4C,GACxB,IAAIw+C,EAAM5B,EAASn0E,IAAc,MAC7Bg2E,EAAaz+C,EAAW0+C,aAAe1+C,EAAWy+C,WAEtD,MAAO,IAAMD,EAAM,IAAMD,GAAUE,EAAc,KAAOA,EAAa,IAAO,IAAM,IAAM52F,EAAQiE,OAAS,KAAO0yF,EAAM,YAOtIZ,EAAkBjsF,QAAQvT,EAAKK,QAAQ,QAAS,MAAQ,IAI5D0/F,EAAK//F,EAAMA,GACPkgG,GAAYlgG,GACZ+/F,EAAKG,EAAUlgG,IA8FnBugG,CAAiBZ,EAAMlvE,OAAwB,UAAhBkvE,EAAM/iF,WAKzCgjF,EAAU,CAAE,YAAa,oBAAsB,WAAW,SAAS/tE,EAAK2uE,GACpE,IAAI/iG,EAAOG,KAAKH,KAChB,GAAW,QAAPo0B,EAYA,OARK2uE,GAAO7E,IACR6E,EAAM7E,GAEVA,EAAc,UACV6E,GAAOA,EAAI/gB,WACXhiF,EAAKgjG,eAAiBD,EAAI/gB,SAAS,GACnChiF,EAAKijG,cAAcjjG,EAAKgM,QAAS+2F,KAKzC,IAAI9D,EAAQj/F,EAAKgjG,eAEb/D,GA77BR,SAAwBt2C,GACpB,IAAIla,EAAO6vD,EACX,IACIA,EAAW,SAAS31C,GAAK,OAAOA,KACzBA,IACT,QACE21C,EAAW7vD,GAw7BXy0D,EAAe,WACX,IAAI39F,EAAIw9F,IAAO1uE,EAAW9uB,EAAE8uB,SAAUrmB,EAAOzI,EAAEyI,KAC/C,GAAIqmB,EAAS1sB,OAAS,EAClB,OAAQysB,GAEN,IAAK,UACHrD,EAAQtvB,QAAQ4yB,GAAU,SAAStH,GAC/B,IAAIo2E,EAAYrgG,EAAEiqB,GAAI/e,KAAK,gBAEvBm1F,GAAaA,IAAclE,GAASkE,EAAUC,cApG1E,SAAsBnE,EAAOlyE,GACzBkyE,EAAMoE,WACFt2E,GAEAjqB,EAAEiqB,GACGqF,WAAW,UACXA,WAAW,gBACXA,WAAW,iBACXA,WAAW,2BACX/F,YAAY,YA4FGi3E,CAAaH,EAAWp2E,MAGhC,MAEF,IAAK,UACH,IAAIixE,EAAWh+F,EAAKgM,QAAQgyF,WACxB9tF,EAAU8tF,EAAWA,EAASvuE,IAAI,YAAcwuE,EAEpDltE,EAAQtvB,QAAQ4yB,GAAU,SAAStH,EAAIrlB,GACnC,IAAIy7F,EACJ,GAAI59F,EAAE6qF,UACF+S,EAAY59F,EAAE6qF,cACX,CACH,IAAImT,EAAOv1F,GAAQA,EAAKtG,GACpB67F,IAASxgG,GACTogG,EAAYrgG,EAAEI,OAAO+7F,EAAMuE,OAAQD,IACzBH,cAAe,EAEzBD,EAAYlE,EAIpBn8F,EAAEiqB,GAAI/e,KAAK,eAAgBm1F,GAC3BjzF,EAAQ6c,EAAR7c,CAAYizF,MAEhBM,EAAOxE,UAQ3BkD,EAAU,YAAa,0BAA0B,WAC7C,OAAOhiG,KAAKH,KAAK6I,WAGrBs5F,EAAU,YAAa,0BAA0B,SAAS/yE,GACtDjvB,KAAKH,KAAK6I,MAAMumB,MAGpB+yE,EAAU,YAAa,0BAA0B,WAC7C,IAAIjzD,EAAO/uC,KAAKH,KAAKu0B,WACjB44C,EAAahtE,KAAKH,KAAKqH,QAAQulE,eAEnC,OAAI19B,EACI/uC,KAAKH,KAAKqH,QAAQymE,eACZX,EACKj+B,EAAKi+B,GAELj+B,EAGJA,EAAKn9B,SAGT,QAIfowF,EAAU,YAAa,0BAA0B,SAAS/yE,GACtD,IAAIpvB,EAAOG,KAAKH,KACZqH,EAAUrH,EAAKqH,QACf8lE,EAAa9lE,EAAQulE,eACrB9rC,EAAOz5B,EAAQy5B,MAAQ,GAEvB1R,IAAQrsB,IACRqsB,EAAM,IAGN+9C,IAAe9lE,EAAQymE,gBAAkB1+C,IACzC0R,EAAO1R,EAAI/nB,EAAQqnE,gBAAkB,GACrCt/C,EAAMA,EAAI+9C,GAAc9lE,EAAQqnE,iBAGN,IAA1B1uE,EAAKqH,QAAQ6lE,UAAuBltE,EAAK6uE,SAASC,UAC7ChuC,GAAQ1R,GAAO/nB,EAAQymE,eAM5B9tE,EAAK6I,MAAMumB,GAHPpvB,EAAK+uE,WAAW3/C,EAAK0R,MAOjCqhE,EAAU,iBAAkB,0BAA0B,WAClD,IAAIt5F,EAAQ1I,KAAKH,KAAKi0B,YAAYltB,MAAM,GACpComE,EAAahtE,KAAKH,KAAKqH,QAAQulE,eAQnC,OANIO,GAAchtE,KAAKH,KAAKqH,QAAQymE,iBAChCjlE,EAAQ/F,EAAE2X,IAAI5R,GAAO,SAASqmC,GAC1B,OAAOA,EAAKi+B,OAIbtkE,KAGXs5F,EAAU,iBAAkB,0BAA0B,SAAS/yE,GAChD,MAAPA,IACAA,EAAM,IAGV,IAAIpvB,EAAOG,KAAKH,KACZqH,EAAUrH,EAAKqH,QACf8lE,EAAa9lE,EAAQulE,eACrB5+D,EAAOohB,EAEP+9C,IAAe9lE,EAAQymE,iBACvB1+C,EAAMtsB,EAAE2X,IAAI2U,GAAK,SAAS8f,GACtB,OAAOA,EAAKi+B,QAIK,IAArB9lE,EAAQ6lE,UAAuB7lE,EAAQymE,gBAAmB9tE,EAAK6uE,SAASC,QAGxE9uE,EAAK6I,MAAMumB,GAFXpvB,EAAK+uE,WAAW/gE,EAAMohB,MAc9B+yE,EAAU,YAAa,iBAAiB,SAASn2F,EAAS3E,GACtD,IAAIrH,EAAOG,KAAKH,KAChB,GAAIqH,IAAYhE,MAAMD,QAAQiE,GAE1B,IADA,IAAI43F,EAAQj/F,EAAKgjG,eACRt7F,EAAI1H,EAAKwK,OAAO7C,SAAUD,GAAK,GAAI,CACxC,IAAI4X,EAAQtf,EAAKwK,OAAO9C,GACpBuC,EAAU5C,EAAQiY,GAClBrV,GAA6B,iBAAXA,IAClB5C,EAAQiY,GAAStf,EAAK0jG,0BAA0BpkF,EAAO2/E,EAAOh1F,QAO9Ek4F,EAAU,YAAa,6BAA6B,SAAS7iF,EAAO2/E,EAAOh1F,GAEvE,OADAA,EAAUo0F,EAAOp0F,GACV,SAASnF,GACZ2+F,EAAOxE,GAAO,WACVh1F,EAAQg1F,EAAO,CAAE0E,WAAY7+F,WAMzCq9F,EAAU,CAAE,UAAW,cAAe,cAAe,eAAiB,6BAA6B,SAAS7iF,EAAO2/E,EAAOh1F,GACtH,MAAa,UAATqV,EACOnf,KAAK2gE,QAEhB72D,EAAUo0F,EAAOp0F,GACV,SAASzI,GACZ,IAEIujE,EAAM3uB,EAAuCwtD,EAAOtvE,EAAOuvE,EAASC,EAFpE9wE,EAASxxB,EAAGiJ,OACZpD,EAAU2rB,EAAO3rB,QACD08F,EAAS,CAAEJ,WAAYniG,GAEvCuvB,EAAQhoB,SAAS1B,EAAQ28F,cACzBj/B,GAA+C,IAAxC19D,EAAQ28F,WAAWluF,QAAQ,QAClCsgC,GAAuD,IAA5C/uC,EAAQ28F,WAAWluF,QAAQ,aAEtCkd,EAAOixE,qBACP7tD,GAAW,GAGfwtD,EAAQG,EAAOn2B,SAAWztE,KAAKmmC,SAC/BhS,EAAQyvE,EAAO/1F,KAAO,GACtB61F,EAAUE,EAAOF,QAAU,GAC3B,IAAK,IAAIn8F,EAAI,EAAGA,EAAIk8F,EAAMj8F,OAAQD,IAAK,CACnC,IAAIwnC,EAAO61B,EAAO6+B,EAAMl8F,GAAGoe,WAAa89E,EAAMl8F,GAC1C6sB,EAAWvB,EAAOuB,SAAS2a,GAC3B61B,GACIh0C,EAAQ/kB,QAAQupB,QAAQhB,EAAUD,GAAS,GAC3CA,EAAMxyB,KAAKyyB,GAEfuvE,EAAS/yE,EAAQ/kB,QAAQ43F,EAAMl8F,IAAIwR,QAC/B6X,EAAQ/kB,QAAQupB,QAAQuuE,EAAQD,GAAW,GAC3CA,EAAQ/hG,KAAKgiG,IAGjBxvE,EAAMxyB,KAAKyyB,GAId6hB,IACD2tD,EAAOxvE,SAAWwvE,EAAO/1F,KAAOsmB,EAAM,GACtCyvE,EAAOG,gBAAkBpjG,MAAM6tC,kBAAkBo1D,EAAOxvE,UACxDwvE,EAAOn2B,SAAWg2B,EAAM,IAG5BH,EAAOxE,GAAO,WACVh1F,EAAQg1F,EAAO8E,WAQ3B5B,EAAU,UAAW,iBAAiB,SAASn2F,EAAS3E,GAEpD,GADAlH,KAAK2gE,OACDz5D,EAAQw8F,QAAS,CACjB,IAAIzzF,EAAWtN,EAAEI,OAAO,GAAIpC,MAAMkC,SAAUqE,EAAQ88F,kBACpDpzE,EAAQtvB,QAAQ4F,EAAQw8F,SAAS,SAASO,IAClCA,EAAIj/E,OAAUi/E,EAAIp0F,UAAao0F,EAAIvzF,QAAWuzF,EAAInrF,QAAWmrF,EAAIC,UAAYthG,IAAeqhG,EAAIC,UAChGD,EAAIp0F,SAAW,kBACXlP,MAAM0tB,KAAK41E,EAAIj/E,MAAO,YAAc,QACpCrkB,MAAM0tB,KAAK41E,EAAIj/E,MAAO/U,EAASP,WAAa,mBAMhE,IAcQy0F,EAdJC,EAA0B,CAC1BC,QAAW,CAAE,YACbC,KAAQ,CAAE,iBAAkB,iBAAkB,eAC9C/C,SAAY,CAAE,eAAgB,WAAY,eAC1CgD,MAAS,CAAE,iBAAkB,gBAC7B9F,UAAa,CAAE,uBAAwB,mBAAoB,qBAC3DD,UAAa,CAAC,sBAAuB,qBAAsB,gBAAiB,0BAA2B,2BACvGgD,WAAc,CAAE,YAChB7C,SAAY,CAAE,YACdJ,SAAY,CAAE,YACd1qB,UAAa,CAAE,kBAIXswB,EAAqB,GACzBvzE,EAAQtvB,QAAQ8iG,GAAyB,SAASI,EAAW3xE,GACzDjC,EAAQtvB,QAAQkjG,GAAW,SAAS30F,GAC3Bs0F,EAAmBt0F,KACpBs0F,EAAmBt0F,GAAY,IAEnCs0F,EAAmBt0F,GAAUlO,KAAK,WAAakxB,SAIvDjC,EAAQtvB,QAAQ6iG,GAAoB,SAAS/rE,EAASypE,GAClD,IAAI4C,EAAe,IAAM5C,EACrBrJ,EAAW73F,MAAMqsB,UAAUy3E,GAE/BjlG,EAAOqiG,UAAU4C,GAAc,WAC3B,MAAO,CACH1E,SAAU,IACVtgG,QAAS24B,EACTssE,UAAU,EACV30F,QAAS,SAASwwF,EAAUL,GACxB,GAA6B,KAAzBA,EAAOuE,GAAX,CAIAlE,EAASlvE,WAAWmnE,GACpB,IAAI3oF,EAAW0wF,EAAS,GAAGoE,UAE3B,OAAO,SAAS7F,EAAOjzF,EAASw0F,EAAOC,GAGnC,IAFA,IAAIN,GAEIA,GAAcM,EAAY94F,QAC9Bw4F,EAAaM,EAAYzqF,QAGxBmqF,GAGDA,EAAWnwF,SAAS40F,EAAc50F,GAClChE,EAAQirB,UAHRsnE,EAAKxtF,KAAK4nF,EAAW,4EAA8EpgE,EAAQvtB,KAAK,iBAvpC5I,SAAS41F,EAAa3B,EAAOjzF,EAASw0F,EAAOxtE,EAAQitE,EAAUQ,GAE3D,KAAMz0F,aAAmBnE,QACrB,MAAM,IAAI+I,MAAM,kIAGpB,IAAIgvF,EAAWY,EAAMZ,SACjBmF,EAAa9F,EAAMC,MAAMU,GAIzBoF,GAFJvE,EAAcA,GAAe,IAEH,GACtBwE,EAASxE,EAAY,GAErByE,EAAOpiG,EAAEkJ,GAASgnB,GAEtB,IAAKkyE,EAED,OADAjkG,OAAO6P,QAAQmd,MAAM,mBAAqB+E,GACnC,KAGX,IAAImyE,EAAShwE,EAAa8pE,EAAOjzF,EAASw0F,EAAOxtE,EAAQkyE,GAErD79F,EAAU89F,EAAO99F,QAErB,GAAI89F,EAAOC,WAAWz9F,OAAtB,CAGI,IAFA,IAAIqyD,EAAW,GAENtyD,EAAI,EAAG6oB,EAAM40E,EAAOC,WAAWz9F,OAAQD,EAAI6oB,EAAK7oB,IAAK,CAE1D,IAAI09F,EAAaD,EAAOC,WAAW19F,GAE/Byf,EAAUrkB,EAAEopC,UAAS,SAASvnC,GAC9B,IAAI0gG,EAAUpG,EAAMG,OAAOgG,EAAW91D,MAAM,SAASigC,GAC7CA,IAAaxsE,IACbsiG,IACA1gG,EAAEkxC,iBAGX1uB,UAEH6yC,EAASl4D,KAAKqlB,GAGlBrkB,EAAEq3D,KAAK5xD,MAAM,KAAMyxD,GAAUI,KAAKkrC,OAnBtC,CAwBA,IAAI1F,GAAamF,EAyBb,OAAOO,IAxBP,IAAI3rB,EAAOslB,EAAMsG,OAAStG,EAEtB9nE,EAAW,WACX,IAAIquE,EAAavG,EAAMG,OAAOQ,GAAU,SAASrwB,GACrCA,IAAaxsE,IACjByiG,IAEAx5F,EAAQwlB,WAAWgvE,EAAMiF,MAAM7F,UAC/BA,EAAW,KACXtB,EAASgH,QAOjB,qBAAqBp4F,KAAKysE,EAAK+rB,SAC/BvuE,IAEA8nE,EAAM0G,OAAOxuE,GAQrB,SAASmuE,IACL,IAAIM,EAEApF,EAAMd,UACNkG,EAAkB9iG,EAAEA,EAAEkJ,GAAS,GAAGshE,WAAU,KAIhDjmE,EAAU8tB,EAAa8pE,EAAOjzF,EAASw0F,EAAOxtE,EAAQkyE,GAAM79F,QAExD2E,EAAQU,GAAG,WACV,SAASrF,GACN,GAAIA,EAAQM,OAAS,EAAG,CACpB,IAAI0C,EAAQvH,EAAEuE,EAAQ,KACjB,KAAK6F,KAAK7C,EAAMy2B,SAAW,MAAM5zB,KAAK7C,EAAM+kB,QAC7C/kB,EAAM4sB,SAGV,IAAK,IAAIvvB,EAAI,EAAGA,EAAIL,EAAQM,OAAQD,IAChC5E,EAAEuE,EAAQK,IAAIyxB,IAAI,aAR9B,CAWEntB,EAAQ,GAAG3E,SAGjB,IAAI+/C,EAAS89C,EAAKx6F,KAAKsB,EAASkyF,EAAc72F,GAAS2G,KAAKglB,IA0JpE,SAAsBA,EAAQisE,EAAOuB,EAAOqF,EAAa5F,GACrD,GAAIO,EAAMP,GAAW,CACjB,IAAIvwE,EAAM2uE,EAAOmC,EAAMP,IAAWp/F,OAClC,IAAI6uB,EAIA,MAAM,IAAI9e,MAAMqvF,EAAW,2DAA6DO,EAAMqF,IAF9Fn2E,EAAIuvE,EAAOjsE,IA7Jf8yE,CAAa1+C,EAAQ63C,EAAOuB,EAAOxtE,EAAQitE,GAE3ChB,EAAM4B,MAAM,qBAAsBz5C,GAElC,IAAI2+C,EAkXZ,SAAqC9G,EAAOjsE,GACxC,IAAIgzE,EAAa/G,EAAMgH,IAAI,YAAY,WACnCD,IACIhzE,IACAlyB,MAAMqB,QAAQ6wB,EAAOhnB,SACrBgnB,EAAS,SAIjB,OAAOgzE,EA3XmBE,CAA4BjH,EAAO73C,GAMzD,GAJIo5C,EAAMd,SAkclB,SAAqB1sE,EAAQisE,EAAOjzF,EAAS45F,EAAiBO,EAAYJ,EAAiBvF,GAEvF,IAAIgF,EAAavG,EAAMG,OAAO+G,GAAY,SAAS52B,EAAU62B,GACzD,IAAKpzE,EAAOT,aAAeg9C,IAAa62B,EAAU,CAC9CZ,IAEIhF,EAAMD,UACNC,EAAMD,WAGV,IAAI8F,EAAkB9B,EAAwBvxE,EAAO3rB,QAAQ9E,MAEzD8jG,GACAA,EAAgB5kG,SAAQ,SAASc,GAC7B,IAAI+jG,EAAmBrH,EAAMC,MAAMsB,EAAM,IAAMj+F,IAE3C+jG,GACAV,EAAgB3rD,OAAOn3C,EAAEwjG,GAAkBpjF,KAAKpiB,MAAMqsB,UAAU,IAAM5qB,GAAO,QAKzF,IAAIu9E,EAAWh9E,EAAEkwB,EAAOzmB,SAAS,GAC7B+uC,EAAWx4C,EAAEkwB,EAAOhnB,SAAS,GACM,WAAxBgnB,EAAO3rB,QAAQ9E,OAG1ByJ,EAAUlJ,EAAEw4C,IAGhB,IAAIprC,EAAUlE,EAAQgyF,WAAWvuE,IAAI,YACrCuD,EAAOX,WAEH0zE,GACAA,IAGJ/yE,EAAS,KAELsoB,IACIwkC,GACAA,EAASh6D,WAAWygF,aAAajrD,EAAUwkC,GAE/Ch9E,EAAEkJ,GAASkrE,YAAY0uB,IAG3B11F,EAAQ01F,EAAR11F,CAAyB+uF,OAE9B,GACHwE,EAAOxE,GAlfCuH,CAAYp/C,EAAQ63C,EAAOjzF,EAAS45F,EAAiBpF,EAAMd,QAASqG,EAAiBvF,GAGrFA,EAAMiG,YAAa,CACnB,IAAIA,EAAcjG,EAAMiG,YACpBC,EAAazH,EAAMC,MAAMuH,GACzBC,GACAt/C,EAAO3/B,QAAQi/E,GAkH/B,SAA2B1zE,EAAQisE,EAAOjzF,EAASy6F,GAC/C,GAAK3lG,MAAM+oB,GAAGi1E,UAAY9rE,aAAkBlyB,MAAM+oB,GAAGi1E,UAAch+F,MAAM+oB,GAAGk1E,MAAQ/rE,aAAkBlyB,MAAM+oB,GAAGk1E,KAE3G,YADAR,EAAKxtF,KAAK,+EAAkFiiB,EAAO3rB,QAAY,MAGnH43F,EAAMG,OAAOqH,GAAa,SAASl3B,EAAU62B,GACrC72B,GAAY62B,GACZpzE,EAAOvL,QAAQ8nD,MAvHfo3B,CAAkBv/C,EAAQ63C,EAAOjzF,EAASy6F,GAG9C,GAAIjG,EAAMoG,YAAa,CACnB,IAAIA,EAAcpG,EAAMoG,YACpBC,EAAa5H,EAAMC,MAAM0H,GACzBC,GACAz/C,EAAOylB,SAASg6B,GAqHhC,SAA2B7zE,EAAQisE,EAAOjzF,EAAS46F,GAC/C,GAA8B,mBAAnB5zE,EAAO65C,SAEd,YADA0xB,EAAKxtF,KAAK,iFAAoFiiB,EAAO3rB,QAAY,MAGrH43F,EAAMG,OAAOwH,GAAa,SAASr3B,EAAU62B,GACrC72B,GAAY62B,GACZpzE,EAAO65C,SAAS0C,MA1HhBu3B,CAAkB1/C,EAAQ63C,EAAOjzF,EAAS46F,GAiB9C,OAbIpG,EAAMb,UACNoH,EAAe3/C,EAAQ63C,EAAOuB,EAAMb,UAIpCqF,GA+IZ,SAAuBhyE,EAAQisE,EAAOjzF,EAASg5F,EAASC,GACpD,IAAKjyE,EAAOnqB,MACR,OAGJ,IAAIA,EAGAm+F,GAAsB,EAGtBn+F,EADAo+F,EAAOj7F,GACC,WACJ,OAzBZ,SAAmBA,GACf,GAAI,kBAAkBkB,KAAKlB,EAAQkX,KAAK,SACpC,OAAOlX,EAAQqjB,KAAK,WAExB,OAAOrjB,EAAQojB,MAqBA83E,CAAUl7F,IAGb,WACJ,OAAOgnB,EAAOnqB,SAKtB,IAAIs+F,EAAa,WAKb,IAAI/3E,EAAM41E,EAAQoC,WACdh4E,IAAQrsB,IACRqsB,EAAM41E,EAAQqC,aAGdj4E,IAAQrsB,IACRqsB,EAAM,MAGV43E,GAAsB,EACtB/tE,YAAW,WAEP,GADA+tE,GAAsB,EAClBh0E,EAAQ,CACR,IAAI2sE,EAAWV,EAAMjsE,EAAOhnB,QAAQkX,KAAK,eAErCy8E,IACAvwE,EAAMuwE,KAGsB,IAA5B3sE,EAAO3rB,QAAQ6lE,UAAuBl6C,EAAO67C,SAASC,SAClD1/C,IAIJ4D,EAAOnqB,MAAMumB,MAGtB,IAGP41E,EAAQsC,QAAUH,EAClBluE,YAAW,WACH+rE,EAAQsC,UAAYH,IACpBnC,EAAQsC,QAAUH,EAClBnC,EAAQsC,cAIZL,EAAOj7F,IACPA,EAAQmd,GAAG,UAAU,WACjB69E,GAAsB,KAI9B,IAAInlG,EAAW,SAASi3D,GACpB,OAAO,WACH,IAAIyuC,EACAP,IAAwBh7F,EAAQU,GAAG,YAGnCosD,GAAYmsC,IACZsC,EAAetC,EAAOuC,WAE1BxC,EAAQyC,cAAc5+F,KAClBiwD,IACAksC,EAAQlE,eACJyG,GACAtC,EAAOnE,gBAGf2C,EAAOxE,MAIfjsE,EAAO3oB,MAAM,SAAUxI,GAAS,IAChCmxB,EAAO3oB,MAAM,OAAQxI,GAAS,IAExBf,MAAM+oB,GAAGw3E,cAAgBruE,aAAkBlyB,MAAM+oB,GAAGw3E,cACtDruE,EAAO3oB,MAAM,YAAaxI,GAAS,IAGvC,IAAI6lG,EAAa7+F,IAKZI,MAAM+7F,EAAQoC,aAAeM,GAAc1C,EAAQoC,aAC/CpC,EAAQ2C,SAAS3C,EAAQoC,YAEL,MAAdM,GAAqC,KAAfA,GAAqBA,GAAc1C,EAAQoC,YACxEpC,EAAQyC,cAAcC,GAFtB10E,EAAOnqB,MAAMm8F,EAAQoC,aAM7BpC,EAAQlE,eA5PA8G,CAAcxgD,EAAQ63C,EAAOjzF,EAASg5F,EAASC,GAG/C79C,GA8VZ,SAAuCp0B,EAAQhnB,GAC3C,IAAM/K,OAAO4mG,mBAAoB70E,EAAOzmB,QACpC,OAGJ,IAAIu7F,EAAgB,GAAG/gG,MAAM2D,KAAK5H,EAAEkJ,GAAS,GAAG+7F,WAE5CC,EAAK,IAAIH,kBAAiB,SAASI,GACnCC,IACKl1E,IAILi1E,EAAQxmG,SAAQ,SAAS0mG,GACrB,IAAIC,EAAItlG,EAAEkwB,EAAOzmB,SAAS,GAC1B,OAAQ47F,EAAIE,eAER,IAAK,QAED,IAAIC,EAAgB,GAAGvhG,MAAM2D,KAAKy9F,EAAI1gG,OAAOsgG,WAC7CO,EAAc7mG,SAAQ,SAAS8mG,GACvBT,EAAchyF,QAAQyyF,GAAO,IAC7BH,EAAEL,UAAU36F,IAAIm7F,GACZznG,MAAM+oB,GAAG2+E,UAAYx1E,aAAkBlyB,MAAM+oB,GAAG2+E,UAChDx1E,EAAOrO,MAAM,GAAGojF,UAAU36F,IAAIm7F,OAI1CT,EAAcrmG,SAAQ,SAAS8mG,GACvBD,EAAcxyF,QAAQyyF,GAAO,IAC7BH,EAAEL,UAAU9wE,OAAOsxE,GACfznG,MAAM+oB,GAAG2+E,UAAYx1E,aAAkBlyB,MAAM+oB,GAAG2+E,UAChDx1E,EAAOrO,MAAM,GAAGojF,UAAU9wE,OAAOsxE,OAI7CT,EAAgBQ,EAChB,MAEJ,IAAK,WAC2B,mBAAjBt1E,EAAOvL,QAAyBuL,EAAOhnB,QAAQkX,KAAK,aAC3D8P,EAAOvL,QAAQ3kB,EAAEqlG,EAAI1gG,QAAQyb,KAAK,aAEtC,MAEJ,IAAK,WAC6B,mBAAnB8P,EAAO65C,UAA2B75C,EAAOhnB,QAAQkX,KAAK,aAC7D8P,EAAO65C,WAAW/pE,EAAEqlG,EAAI1gG,QAAQyb,KAAK,iBAMrDulF,QAGJ,SAASP,IACLF,EAAGU,aAGP,SAASD,IACLT,EAAGW,QAAQ7lG,EAAEkJ,GAAS,GAAI,CAAEm4C,YAAY,IAG5CskD,IACAz1E,EAAO3oB,MAAM,UAAW69F,GA9ZhBU,CAA8BxhD,EAAQp7C,GAGnCo7C,GAKf,SAASjyB,EAAa8pE,EAAOjzF,EAASw0F,EAAOxtE,EAAQkyE,GACjD,IAAIl1E,EAAOgD,EAAOpwB,QAAQ,SAAU,IAChCwiG,EAAa,GACbyD,EAAcrI,EAAMf,UAAYe,EAAMn5F,QACtCyhG,EAAe7J,EAAMC,MAAM2J,GAE3BA,GAAeC,IAAiB/lG,GAChCqiG,EAAWtjG,KAAK,CAAEkzB,OAAQ,UAAWsa,KAAMu5D,IAG/C,IAAIxhG,EAAU0pB,EAAQ7tB,OAAO,GAAIs9F,EAAMuI,eAAgBD,GAEvD,SAASE,EAAUzmG,EAAMsG,GACrB,IAAIogG,EAAal4E,EAAQ3pB,KAAK63F,EAAMC,MAAMr2F,IACtCogG,IAAelmG,EACfqiG,EAAWtjG,KAAK,CAAEkzB,OAAQzyB,EAAM+sC,KAAMzmC,IAEtCxB,EAAQ9E,GAAQ0mG,EAKxB,IAAIC,EAAgBhE,EAAKlyE,OAAOxqB,UAAUnB,QACtC8hG,EAAejE,EAAKlyE,OAAOxqB,UAAUgC,OAGzC1H,EAAEK,KAAKq9F,GAAO,SAASj+F,EAAMsG,GACzB,GAAa,WAATtG,GAA8B,gBAATA,GAAmC,gBAATA,GAAmC,eAATA,EAA7E,CAIA,IAAI6mG,EAAW,OAAS7mG,EAAK0I,OAAO,GAAGiE,cAAgB3M,EAAKwE,MAAM,GAElE,GAA2B,IAAvBxE,EAAKuT,QAAQ,MAAa,CAC1B,IAAIuzF,EAAW9mG,EAAKK,QAAQ,QAAQ,SAASuc,GACzC,OAAOA,EAAOlU,OAAO,GAAGwN,iBAGxB0wF,EAAarzF,QAAQuzF,IAAa,IAClChiG,EAAQgiG,GAAYxgG,GAI5B,GAAIqgG,EAAcr6F,eAAeu6F,GAC7BJ,EAAUI,EAAUvgG,QACjB,GAAIqgG,EAAcr6F,eAAetM,KAAUs9F,EAAqBt9F,GACnEymG,EAAUzmG,EAAMsG,QACb,IAAK02F,EAAkBh9F,GAAO,CACjC,IAAI+N,EAAQ/N,EAAK+N,MAAM,oBACvB,GAAIA,EAAO,CACP,IAAIg5F,EAAah5F,EAAM,GAAGrF,OAAO,GAAGwN,cAAgBnI,EAAM,GAAGvJ,MAAM,GAC/DuJ,EAAM,IAAc,YAAR/N,EAEZ8E,EAAQiiG,GAAczgG,GAEV,YAARtG,IACA+mG,EAAa,WAEjBN,EAAUM,EAAYzgG,UAOtC,IAAImoB,EAAawvE,EAAMhB,aAAegB,EAAM/yF,OAU5C,OARIujB,IACA3pB,EAAQ2pB,WAAawtE,EAAiBS,EAAOjzF,EAASgkB,EAAMgB,IAKhE3pB,EAAQ26E,SAAW,CAAEid,GAEd,CACH53F,QAASA,EACT+9F,WAAYA,GAiDpB,SAAS6B,EAAOj7F,GACZ,OAAO8zF,EAAW5yF,KAAKlB,EAAQ,GAAGqkB,SAoHtC,SAAS02E,EAAe/zE,EAAQisE,EAAOU,GACnC,GAAI7+F,MAAM+oB,GAAG0/E,iBAAmBv2E,aAAkBlyB,MAAM+oB,GAAG0/E,gBAAiB,CACxE,IAEIC,EAFAC,EAAoB9J,EAAS50F,MAAM,KACnC2+F,EAAwBD,EAAkB,GAAG/lE,OAYjD,OATAqjE,EAAe/zE,EAAO22E,gBAAiB1K,EAAOyK,QAC1CD,EAAkB,IAClBD,EAAsBC,EAAkB,GAAG/lE,OAC3CqjE,EAAe/zE,EAAO42E,cAAe3K,EAAOuK,GAC5Cx2E,EAAOq8B,MAAM,CAAE55C,MAAOwpF,EAAMyK,GAAwB59F,IAAKmzF,EAAMuK,MAE/Dx2E,EAAOq8B,MAAM,CAAE55C,MAAOwpF,EAAMyK,GAAwB59F,IAAK,QAMjE,GAA2B,mBAAhBknB,EAAOnqB,MAAlB,CAKA,IAAIq+B,EAAOpkC,EAAEkwB,EAAOhnB,SAASusB,QAAQ,iBAAiBluB,QAClD46F,EAASnkG,MAAMkuB,OAAOkY,EAAKhkB,KAAK,SAAS,EAAhCpiB,CAAsCm+F,GAC/CjwE,EAASqvE,EAAOsB,GAChB1wE,EAASD,EAAOnuB,OAChBgpG,GAAW,EAEXC,EAAoBhpG,MAAM+oB,GAAG2iD,aAAex5C,aAAkBlyB,MAAM+oB,GAAG2iD,aACnD1rE,MAAM+oB,GAAGkgF,aAAe/2E,aAAkBlyB,MAAM+oB,GAAGkgF,YAEvEpiG,EAAS,SAASkB,GAElB,OAAOA,GAASihG,EAAoBjhG,EAAMlB,OAAS,GAGnDqiG,EAAqBriG,EAAOqnB,EAAOiwE,IAEvCjsE,EAAOi3E,uBAAuBj7E,EAAOiwE,IAGrC,IAAIiL,EAAe,SAAS36B,EAAU62B,GAC9B72B,IAAaxsE,IAIbwsE,EAAW,MAIXs6B,GAAat6B,GAAY62B,GAAYz+F,EAAO4nE,IAAay6B,IAI7DA,EAAqBriG,EAAO4nE,GAC5Bv8C,EAAOi3E,uBAAuB16B,KAG9Bu6B,EACA7K,EAAMkL,iBAAiBxK,EAAUuK,GAEjCjL,EAAMG,OAAOO,EAAUuK,GAG3B,IAAIE,EAAgB,WAChBP,GAAW,EAEP5E,GAAUA,EAAOuC,WACjBvC,EAAOoF,YAGX5G,EAAOxE,GAAO,WACVhwE,EAAOgwE,EAAOjsE,EAAOs3E,0BACrBN,EAAqBriG,EAAOqnB,EAAOiwE,OAGvC4K,GAAW,GAGf72E,EAAO3oB,MAAM,SAAU+/F,GACvBp3E,EAAO3oB,MAAM,OAAQ+/F,QA9DjB7L,EAAKxtF,KAAK,2EAA8EiiB,EAAO3rB,QAAY,MAuMnH,SAASsC,EAAKg/C,EAAGz7B,GACb,OAAO,SAAS7nB,EAAGggB,GACf,OAAOsjC,EAAEj+C,KAAKwiB,EAAK7nB,EAAGggB,IAI9B,SAASi7E,EAAY5uF,EAAK7I,GACtB1I,KAAKuR,GAAO5Q,MAAM6R,UAAU9J,GA0KhC,SAAS46F,EAAOxE,EAAOjrC,GACnB,IAAI2lB,EAAOslB,EAAMsG,OAAStG,EACtBsL,EAAc,qBAAqBr9F,KAAKysE,EAAK+rB,SAC7C1xC,EACIu2C,EACAv2C,IAEA2lB,EAAKgsB,OAAO3xC,GAERu2C,GACR5wB,EAAK6wB,UAmCb,SAASrI,EAAUC,EAAOziB,EAAY3rB,GAClC,GAAI3wD,MAAMD,QAAQg/F,GACd,OAAOrxE,EAAQtvB,QAAQ2gG,GAAO,SAASA,GACnCD,EAAUC,EAAOziB,EAAY3rB,MAGrC,GAAoB,iBAATouC,EAAmB,CAG1B,IAFA,IAAI/8F,EAAI+8F,EAAMr3F,MAAM,KAChBxF,EAAIzE,MACDyE,GAAKF,EAAEsC,OAAS,GACnBpC,EAAIA,EAAEF,EAAE2Q,SAEZ,IAAKzQ,EAED,OADA08F,EAAengG,KAAK,CAAEsgG,EAAOziB,EAAY3rB,KAClC,EAEXouC,EAAQ78F,EAAEiD,UAEd,IAAIiiG,EAAarI,EAAMziB,GAUvB,OATAyiB,EAAMziB,GAAc,WAChB,IAAI3/E,EAAOG,KAAMk3B,EAAO7vB,UACxB,OAAOwsD,EAAKzrD,MAAM,CACdvI,KAAMA,EACN8gE,KAAM,WACF,OAAO2pC,EAAWliG,MAAMvI,EAAMwH,UAAUG,OAAS,EAAIH,UAAY6vB,KAEtEA,KAEA,GA96Bf,CAqvCGp2B,OAAOH,MAAM+G,OAAQ5G,OAAO8vB,SAGjBjwB","sourcesContent":["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('jquery')) :\n typeof define === 'function' && define.amd ? define(['jquery'], factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (global.kendomobile = global.kendomobile || {}, global.kendomobile.js = factory()));\n})(this, (function () {\n var breakpoints;\n var EVENT = \"change\";\n\n var defaultBreakpoints = {\n small: \"(max-width: 500px)\",\n medium: \"(min-width: 500.1px) and (max-width: 768px)\",\n large: \"(min-width: 768.1px)\",\n };\n\n function createMediaQuery(query) {\n var mediaQueryList = window.matchMedia(query);\n var onEnterCallbacks = [];\n var onLeaveCallbacks = [];\n var onChangeHandlers = [];\n var kendoMediaQuery = { mediaQueryList: mediaQueryList };\n\n var onChangeHandler = function (ev) {\n onChangeHandlers.forEach(function (cb) { return cb(ev); });\n\n if (ev.matches) {\n onEnterCallbacks.forEach(function (cb) { return cb(ev); });\n } else {\n onLeaveCallbacks.forEach(function (cb) { return cb(ev); });\n }\n };\n\n mediaQueryList.addEventListener(EVENT, onChangeHandler);\n\n var onChange = function (cb) {\n onChangeHandlers.push(cb);\n return kendoMediaQuery;\n };\n\n var onEnter = function (cb) {\n onEnterCallbacks.push(cb);\n\n if (mediaQueryList.matches) {\n var media = mediaQueryList.media;\n var matches = true;\n\n var ev = new MediaQueryListEvent(EVENT, {\n media: media,\n matches: matches,\n });\n\n cb(ev);\n }\n\n return kendoMediaQuery;\n };\n\n var onLeave = function (cb) {\n onLeaveCallbacks.push(cb);\n return kendoMediaQuery;\n };\n\n var destroy = function () {\n if (mediaQueryList) {\n mediaQueryList.removeEventListener(EVENT, onChangeHandler);\n }\n onEnterCallbacks = null;\n onLeaveCallbacks = null;\n onChangeHandlers = null;\n mediaQueryList = null;\n kendoMediaQuery = null;\n };\n\n kendoMediaQuery.onChange = onChange;\n kendoMediaQuery.onEnter = onEnter;\n kendoMediaQuery.onLeave = onLeave;\n kendoMediaQuery.destroy = destroy;\n\n return kendoMediaQuery;\n }\n\n function mediaQuery(query) {\n if (!query) {\n return;\n }\n\n breakpoints =\n breakpoints ||\n Object.assign({}, defaultBreakpoints, kendo.defaults.breakpoints);\n\n if (query in breakpoints) {\n query = breakpoints[query];\n }\n\n return createMediaQuery(query);\n }\n\n var __meta__$f = {\n id: \"core\",\n name: \"Core\",\n category: \"framework\",\n description: \"The core of the Kendo framework.\"\n };\n\n var packageMetadata = {\n name: '@progress/kendo-ui',\n productName: 'Kendo UI',\n productCodes: ['KENDOUICOMPLETE', 'KENDOUI', 'KENDOUI', 'KENDOUICOMPLETE'],\n publishDate: 0,\n version: '2023.2.829'.replace(/^\\s+|\\s+$/g, ''),\n licensingDocsUrl: 'https://docs.telerik.com/kendo-ui/intro/installation/using-license-code'\n };\n\n\n (function($, window, undefined$1) {\n var kendo = window.kendo = window.kendo || { cultures: {} },\n extend = $.extend,\n each = $.each,\n isArray = Array.isArray,\n noop = $.noop,\n math = Math,\n Template,\n JSON = window.JSON || {},\n support = {},\n percentRegExp = /%/,\n formatRegExp = /\\{(\\d+)(:[^\\}]+)?\\}/g,\n boxShadowRegExp = /(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+(?:\\.?)\\d*)px\\s*(\\d+)?/i,\n numberRegExp = /^(\\+|-?)\\d+(\\.?)\\d*$/,\n MONTH = \"month\",\n HOUR = \"hour\",\n ZONE = \"zone\",\n WEEKDAY = \"weekday\",\n QUARTER = \"quarter\",\n DATE_FIELD_MAP = {\n \"G\": \"era\",\n \"y\": \"year\",\n \"q\": QUARTER,\n \"Q\": QUARTER,\n \"M\": MONTH,\n \"L\": MONTH,\n \"d\": \"day\",\n \"E\": WEEKDAY,\n \"c\": WEEKDAY,\n \"e\": WEEKDAY,\n \"h\": HOUR,\n \"H\": HOUR,\n \"k\": HOUR,\n \"K\": HOUR,\n \"m\": \"minute\",\n \"s\": \"second\",\n \"a\": \"dayperiod\",\n \"t\": \"dayperiod\",\n \"x\": ZONE,\n \"X\": ZONE,\n \"z\": ZONE,\n \"Z\": ZONE\n },\n NAME_TYPES = {\n month: {\n type: \"months\",\n minLength: 3,\n standAlone: \"L\"\n },\n\n quarter: {\n type: \"quarters\",\n minLength: 3,\n standAlone: \"q\"\n },\n\n weekday: {\n type: \"days\",\n minLength: {\n E: 0,\n c: 3,\n e: 3\n },\n standAlone: \"c\"\n },\n\n dayperiod: {\n type: \"dayPeriods\",\n minLength: 0\n },\n\n era: {\n type: \"eras\",\n minLength: 0\n }\n },\n FUNCTION = \"function\",\n STRING = \"string\",\n NUMBER = \"number\",\n OBJECT = \"object\",\n NULL = \"null\",\n BOOLEAN = \"boolean\",\n UNDEFINED = \"undefined\",\n PREFIX = \"prefix\",\n ARIA_LABELLEDBY = \"aria-labelledby\",\n ARIA_LABEL = \"aria-label\",\n LABELIDPART = \"_label\",\n getterCache = {},\n setterCache = {},\n slice = [].slice,\n cssPropertiesNames = [ \"themeColor\", \"fillMode\", \"shape\", \"size\", \"rounded\", \"positionMode\" ],\n // avoid extending the depricated properties in latest verions of jQuery\n noDepricateExtend = function() {\n var arguments$1 = arguments;\n\n var src, copyIsArray, copy, name, options, clone,\n target = arguments[ 0 ] || {},\n i = 1,\n length = arguments.length,\n deep = false;\n\n // Handle a deep copy situation\n if ( typeof target === \"boolean\" ) {\n deep = target;\n\n // skip the boolean and the target\n target = arguments[ i ] || {};\n i++;\n }\n\n // Handle case when target is a string or something (possible in deep copy)\n if ( typeof target !== \"object\" && typeof target !== \"function\") {\n target = {};\n }\n\n // extend jQuery itself if only one argument is passed\n if ( i === length ) {\n target = this;\n i--;\n }\n\n for ( ; i < length; i++ ) {\n\n // Only deal with non-null/undefined values\n if ( ( options = arguments$1[ i ] ) != null ) {\n\n // Extend the base object\n for ( name in options ) {\n // filters, concat and : properties are depricated in the jQuery 3.3.0\n // accessing these properties throw a warning when jQuery migrate is included\n if (name == \"filters\" || name == \"concat\" || name == \":\") {\n continue;\n }\n src = target[ name ];\n copy = options[ name ];\n\n // Prevent never-ending loop\n if ( target === copy ) {\n continue;\n }\n\n // Recurse if we're merging plain objects or arrays\n if ( deep && copy && ( jQuery.isPlainObject( copy ) ||\n ( copyIsArray = Array.isArray( copy ) ) ) ) {\n\n if ( copyIsArray ) {\n copyIsArray = false;\n clone = src && Array.isArray( src ) ? src : [];\n\n } else {\n clone = src && jQuery.isPlainObject( src ) ? src : {};\n }\n\n // Never move original objects, clone them\n target[ name ] = noDepricateExtend( deep, clone, copy );\n\n // Don't bring in undefined values\n } else if ( copy !== undefined$1 ) {\n target[ name ] = copy;\n }\n }\n }\n }\n\n // Return the modified object\n return target;\n };\n\n kendo.version = \"2023.2.829\".replace(/^\\s+|\\s+$/g, '');\n\n function Class() {}\n\n Class.extend = function(proto) {\n var base = function() {},\n member,\n that = this,\n subclass = proto && proto.init ? proto.init : function() {\n that.apply(this, arguments);\n },\n fn;\n\n base.prototype = that.prototype;\n fn = subclass.fn = subclass.prototype = new base();\n\n for (member in proto) {\n if (proto[member] != null && proto[member].constructor === Object) {\n // Merge object members\n fn[member] = extend(true, {}, base.prototype[member], proto[member]);\n } else {\n fn[member] = proto[member];\n }\n }\n\n fn.constructor = subclass;\n subclass.extend = that.extend;\n\n return subclass;\n };\n\n Class.prototype._initOptions = function(options) {\n this.options = deepExtend({}, this.options, options);\n };\n\n var isPresent = kendo.isPresent = function (value) { return value !== null && value !== undefined$1; };\n var isBlank = kendo.isBlank = function (value) { return value === null || value === undefined$1; };\n var isString = kendo.isString = function (value) { return typeof value === 'string'; };\n var isNumeric = kendo.isNumeric = function (value) { return !isNaN(value - parseFloat(value)); };\n var isDate = kendo.isDate = function (value) { return value && value.getTime; };\n var isFunction = kendo.isFunction = function (value) { return typeof value === 'function'; };\n\n var preventDefault = function() {\n this._defaultPrevented = true;\n };\n\n var isDefaultPrevented = function() {\n return this._defaultPrevented === true;\n };\n\n var Observable = Class.extend({\n init: function() {\n this._events = {};\n },\n\n bind: function(eventName, handlers, one) {\n var that = this,\n idx,\n eventNames = typeof eventName === STRING ? [eventName] : eventName,\n length,\n original,\n handler,\n handlersIsFunction = typeof handlers === FUNCTION,\n events;\n\n if (handlers === undefined$1) {\n for (idx in eventName) {\n that.bind(idx, eventName[idx]);\n }\n return that;\n }\n\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\n eventName = eventNames[idx];\n\n handler = handlersIsFunction ? handlers : handlers[eventName];\n\n if (handler) {\n if (one) {\n original = handler;\n handler = function() {\n that.unbind(eventName, handler);\n original.apply(that, arguments);\n };\n handler.original = original;\n }\n events = that._events[eventName] = that._events[eventName] || [];\n events.push(handler);\n }\n }\n\n return that;\n },\n\n one: function(eventNames, handlers) {\n return this.bind(eventNames, handlers, true);\n },\n\n first: function(eventName, handlers) {\n var that = this,\n idx,\n eventNames = typeof eventName === STRING ? [eventName] : eventName,\n length,\n handler,\n handlersIsFunction = typeof handlers === FUNCTION,\n events;\n\n for (idx = 0, length = eventNames.length; idx < length; idx++) {\n eventName = eventNames[idx];\n\n handler = handlersIsFunction ? handlers : handlers[eventName];\n\n if (handler) {\n events = that._events[eventName] = that._events[eventName] || [];\n events.unshift(handler);\n }\n }\n\n return that;\n },\n\n trigger: function(eventName, e) {\n var that = this,\n events = that._events[eventName],\n idx,\n length;\n\n if (events) {\n e = e || {};\n\n e.sender = that;\n\n e._defaultPrevented = false;\n\n e.preventDefault = preventDefault;\n\n e.isDefaultPrevented = isDefaultPrevented;\n\n events = events.slice();\n\n for (idx = 0, length = events.length; idx < length; idx++) {\n events[idx].call(that, e);\n }\n\n return e._defaultPrevented === true;\n }\n\n return false;\n },\n\n unbind: function(eventName, handler) {\n var that = this,\n events = that._events[eventName],\n idx;\n\n if (eventName === undefined$1) {\n that._events = {};\n } else if (events) {\n if (handler) {\n for (idx = events.length - 1; idx >= 0; idx--) {\n if (events[idx] === handler || events[idx].original === handler) {\n events.splice(idx, 1);\n }\n }\n } else {\n that._events[eventName] = [];\n }\n }\n\n return that;\n }\n });\n\n\n function compilePart(part, stringPart) {\n if (stringPart) {\n return \"'\" +\n part.split(\"'\").join(\"\\\\'\")\n .split('\\\\\"').join('\\\\\\\\\\\\\"')\n .replace(/\\n/g, \"\\\\n\")\n .replace(/\\r/g, \"\\\\r\")\n .replace(/\\t/g, \"\\\\t\") + \"'\";\n } else {\n var first = part.charAt(0),\n rest = part.substring(1);\n\n if (first === \"=\") {\n return \"+(\" + rest + \")+\";\n } else if (first === \":\") {\n return \"+$kendoHtmlEncode(\" + rest + \")+\";\n } else {\n return \";\" + part + \";$kendoOutput+=\";\n }\n }\n }\n\n var argumentNameRegExp = /^\\w+/,\n encodeRegExp = /\\$\\{([^}]*)\\}/g,\n escapedCurlyRegExp = /\\\\\\}/g,\n curlyRegExp = /__CURLY__/g,\n escapedSharpRegExp = /\\\\#/g,\n sharpRegExp = /__SHARP__/g,\n zeros = [\"\", \"0\", \"00\", \"000\", \"0000\"];\n\n Template = {\n paramName: \"data\", // name of the parameter of the generated template\n useWithBlock: true, // whether to wrap the template in a with() block\n render: function(template, data) {\n var idx,\n length,\n html = \"\";\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n html += template(data[idx]);\n }\n\n return html;\n },\n compile: function(template, options) {\n var settings = extend({}, this, options),\n paramName = settings.paramName,\n argumentName = paramName.match(argumentNameRegExp)[0],\n useWithBlock = settings.useWithBlock,\n functionBody = \"var $kendoOutput, $kendoHtmlEncode = kendo.htmlEncode;\",\n fn,\n parts,\n idx;\n\n if (isFunction(template)) {\n return template;\n }\n\n functionBody += useWithBlock ? \"with(\" + paramName + \"){\" : \"\";\n\n functionBody += \"$kendoOutput=\";\n\n parts = template\n .replace(escapedCurlyRegExp, \"__CURLY__\")\n .replace(encodeRegExp, \"#=$kendoHtmlEncode($1)#\")\n .replace(curlyRegExp, \"}\")\n .replace(escapedSharpRegExp, \"__SHARP__\")\n .split(\"#\");\n\n for (idx = 0; idx < parts.length; idx ++) {\n functionBody += compilePart(parts[idx], idx % 2 === 0);\n }\n\n functionBody += useWithBlock ? \";}\" : \";\";\n\n functionBody += \"return $kendoOutput;\";\n\n functionBody = functionBody.replace(sharpRegExp, \"#\");\n\n try {\n // This function evaluation is required for legacy support of the Kendo Template syntax - non CSP compliant.\n fn = new Function(argumentName, functionBody);\n fn._slotCount = Math.floor(parts.length / 2);\n return fn;\n } catch (e) {\n if (kendo.debugTemplates) {\n window.console.warn((\"Invalid template:'\" + template + \"' Generated code:'\" + functionBody + \"'\"));\n } else {\n throw new Error(kendo.format(\"Invalid template:'{0}' Generated code:'{1}'\", template, functionBody));\n }\n }\n }\n };\n\n function pad(number, digits, end) {\n number = number + \"\";\n digits = digits || 2;\n end = digits - number.length;\n\n if (end) {\n return zeros[digits].substring(0, end) + number;\n }\n\n return number;\n }\n\n //JSON stringify\n (function() {\n var escapable = /[\\\\\\\"\\x00-\\x1f\\x7f-\\x9f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]/g,\n gap,\n indent,\n meta = {\n \"\\b\": \"\\\\b\",\n \"\\t\": \"\\\\t\",\n \"\\n\": \"\\\\n\",\n \"\\f\": \"\\\\f\",\n \"\\r\": \"\\\\r\",\n \"\\\"\": '\\\\\"',\n \"\\\\\": \"\\\\\\\\\"\n },\n rep,\n toString = {}.toString;\n\n\n if (typeof Date.prototype.toJSON !== FUNCTION) {\n\n Date.prototype.toJSON = function() {\n var that = this;\n\n return isFinite(that.valueOf()) ?\n pad(that.getUTCFullYear(), 4) + \"-\" +\n pad(that.getUTCMonth() + 1) + \"-\" +\n pad(that.getUTCDate()) + \"T\" +\n pad(that.getUTCHours()) + \":\" +\n pad(that.getUTCMinutes()) + \":\" +\n pad(that.getUTCSeconds()) + \"Z\" : null;\n };\n\n String.prototype.toJSON = Number.prototype.toJSON = Boolean.prototype.toJSON = function() {\n return this.valueOf();\n };\n }\n\n function quote(string) {\n escapable.lastIndex = 0;\n return escapable.test(string) ? \"\\\"\" + string.replace(escapable, function(a) {\n var c = meta[a];\n return typeof c === STRING ? c :\n \"\\\\u\" + (\"0000\" + a.charCodeAt(0).toString(16)).slice(-4);\n }) + \"\\\"\" : \"\\\"\" + string + \"\\\"\";\n }\n\n function str(key, holder) {\n var i,\n k,\n v,\n length,\n mind = gap,\n partial,\n value = holder[key],\n type;\n\n if (value && typeof value === OBJECT && typeof value.toJSON === FUNCTION) {\n value = value.toJSON(key);\n }\n\n if (typeof rep === FUNCTION) {\n value = rep.call(holder, key, value);\n }\n\n type = typeof value;\n if (type === STRING) {\n return quote(value);\n } else if (type === NUMBER) {\n return isFinite(value) ? String(value) : NULL;\n } else if (type === BOOLEAN || type === NULL) {\n return String(value);\n } else if (type === OBJECT) {\n if (!value) {\n return NULL;\n }\n gap += indent;\n partial = [];\n if (toString.apply(value) === \"[object Array]\") {\n length = value.length;\n for (i = 0; i < length; i++) {\n partial[i] = str(i, value) || NULL;\n }\n v = partial.length === 0 ? \"[]\" : gap ?\n \"[\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"]\" :\n \"[\" + partial.join(\",\") + \"]\";\n gap = mind;\n return v;\n }\n if (rep && typeof rep === OBJECT) {\n length = rep.length;\n for (i = 0; i < length; i++) {\n if (typeof rep[i] === STRING) {\n k = rep[i];\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\n }\n }\n }\n } else {\n for (k in value) {\n if (Object.hasOwnProperty.call(value, k)) {\n v = str(k, value);\n if (v) {\n partial.push(quote(k) + (gap ? \": \" : \":\") + v);\n }\n }\n }\n }\n\n v = partial.length === 0 ? \"{}\" : gap ?\n \"{\\n\" + gap + partial.join(\",\\n\" + gap) + \"\\n\" + mind + \"}\" :\n \"{\" + partial.join(\",\") + \"}\";\n gap = mind;\n return v;\n }\n }\n\n if (typeof JSON.stringify !== FUNCTION) {\n JSON.stringify = function(value, replacer, space) {\n var i;\n gap = \"\";\n indent = \"\";\n\n if (typeof space === NUMBER) {\n for (i = 0; i < space; i += 1) {\n indent += \" \";\n }\n\n } else if (typeof space === STRING) {\n indent = space;\n }\n\n rep = replacer;\n if (replacer && typeof replacer !== FUNCTION && (typeof replacer !== OBJECT || typeof replacer.length !== NUMBER)) {\n throw new Error(\"JSON.stringify\");\n }\n\n return str(\"\", { \"\": value });\n };\n }\n })();\n\n // Date and Number formatting\n (function() {\n var dateFormatRegExp = /EEEE|dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|HH|H|hh|h|mm|m|fff|ff|f|tt|ss|s|zzz|zz|z|\"[^\"]*\"|'[^']*'/g,\n standardFormatRegExp = /^(n|c|p|e)(\\d*)$/i,\n literalRegExp = /(\\\\.)|(['][^']*[']?)|([\"][^\"]*[\"]?)/g,\n commaRegExp = /\\,/g,\n EMPTY = \"\",\n POINT = \".\",\n COMMA = \",\",\n SHARP = \"#\",\n ZERO = \"0\",\n PLACEHOLDER = \"??\",\n EN = \"en-US\",\n objectToString = {}.toString;\n\n //cultures\n kendo.cultures = kendo.cultures || {}; // Ensure cultures object exists\n kendo.cultures[\"en-US\"] = {\n name: EN,\n numberFormat: {\n pattern: [\"-n\"],\n decimals: 2,\n \",\": \",\",\n \".\": \".\",\n groupSize: [3],\n percent: {\n pattern: [\"-n %\", \"n %\"],\n decimals: 2,\n \",\": \",\",\n \".\": \".\",\n groupSize: [3],\n symbol: \"%\"\n },\n currency: {\n name: \"US Dollar\",\n abbr: \"USD\",\n pattern: [\"($n)\", \"$n\"],\n decimals: 2,\n \",\": \",\",\n \".\": \".\",\n groupSize: [3],\n symbol: \"$\"\n }\n },\n calendars: {\n standard: {\n days: {\n names: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n namesAbbr: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n namesShort: [ \"Su\", \"Mo\", \"Tu\", \"We\", \"Th\", \"Fr\", \"Sa\" ]\n },\n months: {\n names: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\", \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n namesAbbr: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"]\n },\n AM: [ \"AM\", \"am\", \"AM\" ],\n PM: [ \"PM\", \"pm\", \"PM\" ],\n patterns: {\n d: \"M/d/yyyy\",\n D: \"dddd, MMMM dd, yyyy\",\n F: \"dddd, MMMM dd, yyyy h:mm:ss tt\",\n g: \"M/d/yyyy h:mm tt\",\n G: \"M/d/yyyy h:mm:ss tt\",\n m: \"MMMM dd\",\n M: \"MMMM dd\",\n s: \"yyyy'-'MM'-'ddTHH':'mm':'ss\",\n t: \"h:mm tt\",\n T: \"h:mm:ss tt\",\n u: \"yyyy'-'MM'-'dd HH':'mm':'ss'Z'\",\n y: \"MMMM, yyyy\",\n Y: \"MMMM, yyyy\"\n },\n \"/\": \"/\",\n \":\": \":\",\n firstDay: 0,\n twoDigitYearMax: 2029\n }\n }\n };\n\n\n function findCulture(culture) {\n if (culture) {\n if (culture.numberFormat) {\n return culture;\n }\n\n if (typeof culture === STRING) {\n var cultures = kendo.cultures;\n return cultures[culture] || cultures[culture.split(\"-\")[0]] || null;\n }\n\n return null;\n }\n\n return null;\n }\n\n function getCulture(culture) {\n if (culture) {\n culture = findCulture(culture);\n }\n\n return culture || kendo.cultures.current;\n }\n\n kendo.culture = function(cultureName) {\n var cultures = kendo.cultures, culture;\n\n if (cultureName !== undefined$1) {\n culture = findCulture(cultureName) || cultures[EN];\n culture.calendar = culture.calendars.standard;\n cultures.current = culture;\n } else {\n return cultures.current;\n }\n };\n\n kendo.findCulture = findCulture;\n kendo.getCulture = getCulture;\n\n //set current culture to en-US.\n kendo.culture(EN);\n\n function formatDate(date, format, culture) {\n culture = getCulture(culture);\n\n var calendar = culture.calendars.standard,\n days = calendar.days,\n months = calendar.months;\n\n format = format.pattern || calendar.patterns[format] || format;\n\n return format.replace(dateFormatRegExp, function(match) {\n var minutes;\n var result;\n var sign;\n\n if (match === \"d\") {\n result = date.getDate();\n } else if (match === \"dd\") {\n result = pad(date.getDate());\n } else if (match === \"ddd\") {\n result = days.namesAbbr[date.getDay()];\n } else if (match === \"dddd\" || match === \"EEEE\") {\n result = days.names[date.getDay()];\n } else if (match === \"M\") {\n result = date.getMonth() + 1;\n } else if (match === \"MM\") {\n result = pad(date.getMonth() + 1);\n } else if (match === \"MMM\") {\n result = months.namesAbbr[date.getMonth()];\n } else if (match === \"MMMM\") {\n result = months.names[date.getMonth()];\n } else if (match === \"yy\") {\n result = pad(date.getFullYear() % 100);\n } else if (match === \"yyyy\") {\n result = pad(date.getFullYear(), 4);\n } else if (match === \"h\" ) {\n result = date.getHours() % 12 || 12;\n } else if (match === \"hh\") {\n result = pad(date.getHours() % 12 || 12);\n } else if (match === \"H\") {\n result = date.getHours();\n } else if (match === \"HH\") {\n result = pad(date.getHours());\n } else if (match === \"m\") {\n result = date.getMinutes();\n } else if (match === \"mm\") {\n result = pad(date.getMinutes());\n } else if (match === \"s\") {\n result = date.getSeconds();\n } else if (match === \"ss\") {\n result = pad(date.getSeconds());\n } else if (match === \"f\") {\n result = math.floor(date.getMilliseconds() / 100);\n } else if (match === \"ff\") {\n result = date.getMilliseconds();\n if (result > 99) {\n result = math.floor(result / 10);\n }\n result = pad(result);\n } else if (match === \"fff\") {\n result = pad(date.getMilliseconds(), 3);\n } else if (match === \"tt\" || match === \"aa\") {\n result = date.getHours() < 12 ? calendar.AM[0] : calendar.PM[0];\n } else if (match === \"zzz\") {\n minutes = date.getTimezoneOffset();\n sign = minutes < 0;\n\n result = math.abs(minutes / 60).toString().split(\".\")[0];\n minutes = math.abs(minutes) - (result * 60);\n\n result = (sign ? \"+\" : \"-\") + pad(result);\n result += \":\" + pad(minutes);\n } else if (match === \"zz\" || match === \"z\") {\n result = date.getTimezoneOffset() / 60;\n sign = result < 0;\n\n result = math.abs(result).toString().split(\".\")[0];\n result = (sign ? \"+\" : \"-\") + (match === \"zz\" ? pad(result) : result);\n }\n\n return result !== undefined$1 ? result : match.slice(1, match.length - 1);\n });\n }\n\n //number formatting\n function formatNumber(number, format, culture) {\n culture = getCulture(culture);\n\n var numberFormat = culture.numberFormat,\n decimal = numberFormat[POINT],\n precision = numberFormat.decimals,\n pattern = numberFormat.pattern[0],\n literals = [],\n symbol,\n isCurrency, isPercent,\n customPrecision,\n formatAndPrecision,\n negative = number < 0,\n integer,\n fraction,\n integerLength,\n fractionLength,\n replacement = EMPTY,\n value = EMPTY,\n idx,\n length,\n ch,\n hasGroup,\n hasNegativeFormat,\n decimalIndex,\n sharpIndex,\n zeroIndex,\n hasZero, hasSharp,\n percentIndex,\n currencyIndex,\n startZeroIndex,\n start = -1,\n end;\n\n //return empty string if no number\n if (number === undefined$1) {\n return EMPTY;\n }\n\n if (!isFinite(number)) {\n return number;\n }\n\n //if no format then return number.toString() or number.toLocaleString() if culture.name is not defined\n if (!format) {\n return culture.name.length ? number.toLocaleString() : number.toString();\n }\n\n formatAndPrecision = standardFormatRegExp.exec(format);\n\n // standard formatting\n if (formatAndPrecision) {\n format = formatAndPrecision[1].toLowerCase();\n\n isCurrency = format === \"c\";\n isPercent = format === \"p\";\n\n if (isCurrency || isPercent) {\n //get specific number format information if format is currency or percent\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n decimal = numberFormat[POINT];\n precision = numberFormat.decimals;\n symbol = numberFormat.symbol;\n pattern = numberFormat.pattern[negative ? 0 : 1];\n }\n\n customPrecision = formatAndPrecision[2];\n\n if (customPrecision) {\n precision = +customPrecision;\n }\n\n //return number in exponential format\n if (format === \"e\") {\n var exp = customPrecision ? number.toExponential(precision) : number.toExponential(); // toExponential() and toExponential(undefined) differ in FF #653438.\n\n return exp.replace(POINT, numberFormat[POINT]);\n }\n\n // multiply if format is percent\n if (isPercent) {\n number *= 100;\n }\n\n number = round(number, precision);\n negative = number < 0;\n number = number.split(POINT);\n\n integer = number[0];\n fraction = number[1];\n\n //exclude \"-\" if number is negative.\n if (negative) {\n integer = integer.substring(1);\n }\n\n value = groupInteger(integer, 0, integer.length, numberFormat);\n\n if (fraction) {\n value += decimal + fraction;\n }\n\n if (format === \"n\" && !negative) {\n return value;\n }\n\n number = EMPTY;\n\n for (idx = 0, length = pattern.length; idx < length; idx++) {\n ch = pattern.charAt(idx);\n\n if (ch === \"n\") {\n number += value;\n } else if (ch === \"$\" || ch === \"%\") {\n number += symbol;\n } else {\n number += ch;\n }\n }\n\n return number;\n }\n\n //custom formatting\n //\n //separate format by sections.\n\n if (format.indexOf(\"'\") > -1 || format.indexOf(\"\\\"\") > -1 || format.indexOf(\"\\\\\") > -1) {\n format = format.replace(literalRegExp, function(match) {\n var quoteChar = match.charAt(0).replace(\"\\\\\", \"\"),\n literal = match.slice(1).replace(quoteChar, \"\");\n\n literals.push(literal);\n\n return PLACEHOLDER;\n });\n }\n\n format = format.split(\";\");\n if (negative && format[1]) {\n //get negative format\n format = format[1];\n hasNegativeFormat = true;\n } else if (number === 0 && format[2]) {\n //format for zeros\n format = format[2];\n if (format.indexOf(SHARP) == -1 && format.indexOf(ZERO) == -1) {\n //return format if it is string constant.\n return format;\n }\n } else {\n format = format[0];\n }\n\n percentIndex = format.indexOf(\"%\");\n currencyIndex = format.indexOf(\"$\");\n\n isPercent = percentIndex != -1;\n isCurrency = currencyIndex != -1;\n\n //multiply number if the format has percent\n if (isPercent) {\n number *= 100;\n }\n\n if (isCurrency && format[currencyIndex - 1] === \"\\\\\") {\n format = format.split(\"\\\\\").join(\"\");\n isCurrency = false;\n }\n\n if (isCurrency || isPercent) {\n //get specific number format information if format is currency or percent\n numberFormat = isCurrency ? numberFormat.currency : numberFormat.percent;\n decimal = numberFormat[POINT];\n precision = numberFormat.decimals;\n symbol = numberFormat.symbol;\n }\n\n hasGroup = format.indexOf(COMMA) > -1;\n if (hasGroup) {\n format = format.replace(commaRegExp, EMPTY);\n }\n\n decimalIndex = format.indexOf(POINT);\n length = format.length;\n\n if (decimalIndex != -1) {\n fraction = number.toString().split(\"e\");\n if (fraction[1]) {\n fraction = round(number, Math.abs(fraction[1]));\n } else {\n fraction = fraction[0];\n }\n fraction = fraction.split(POINT)[1] || EMPTY;\n zeroIndex = format.lastIndexOf(ZERO) - decimalIndex;\n sharpIndex = format.lastIndexOf(SHARP) - decimalIndex;\n hasZero = zeroIndex > -1;\n hasSharp = sharpIndex > -1;\n idx = fraction.length;\n\n if (!hasZero && !hasSharp) {\n format = format.substring(0, decimalIndex) + format.substring(decimalIndex + 1);\n length = format.length;\n decimalIndex = -1;\n idx = 0;\n }\n\n if (hasZero && zeroIndex > sharpIndex) {\n idx = zeroIndex;\n } else if (sharpIndex > zeroIndex) {\n if (hasSharp && idx > sharpIndex) {\n var rounded = round(number, sharpIndex, negative);\n\n while (rounded.charAt(rounded.length - 1) === ZERO && sharpIndex > 0 && sharpIndex > zeroIndex) {\n sharpIndex--;\n\n rounded = round(number, sharpIndex, negative);\n }\n\n idx = sharpIndex;\n } else if (hasZero && idx < zeroIndex) {\n idx = zeroIndex;\n }\n }\n }\n\n number = round(number, idx, negative);\n\n sharpIndex = format.indexOf(SHARP);\n startZeroIndex = zeroIndex = format.indexOf(ZERO);\n\n //define the index of the first digit placeholder\n if (sharpIndex == -1 && zeroIndex != -1) {\n start = zeroIndex;\n } else if (sharpIndex != -1 && zeroIndex == -1) {\n start = sharpIndex;\n } else {\n start = sharpIndex > zeroIndex ? zeroIndex : sharpIndex;\n }\n\n sharpIndex = format.lastIndexOf(SHARP);\n zeroIndex = format.lastIndexOf(ZERO);\n\n //define the index of the last digit placeholder\n if (sharpIndex == -1 && zeroIndex != -1) {\n end = zeroIndex;\n } else if (sharpIndex != -1 && zeroIndex == -1) {\n end = sharpIndex;\n } else {\n end = sharpIndex > zeroIndex ? sharpIndex : zeroIndex;\n }\n\n if (start == length) {\n end = start;\n }\n\n if (start != -1) {\n value = number.toString().split(POINT);\n integer = value[0];\n fraction = value[1] || EMPTY;\n\n integerLength = integer.length;\n fractionLength = fraction.length;\n\n if (negative && (number * -1) >= 0) {\n negative = false;\n }\n\n number = format.substring(0, start);\n\n if (negative && !hasNegativeFormat) {\n number += \"-\";\n }\n\n for (idx = start; idx < length; idx++) {\n ch = format.charAt(idx);\n\n if (decimalIndex == -1) {\n if (end - idx < integerLength) {\n number += integer;\n break;\n }\n } else {\n if (zeroIndex != -1 && zeroIndex < idx) {\n replacement = EMPTY;\n }\n\n if ((decimalIndex - idx) <= integerLength && decimalIndex - idx > -1) {\n number += integer;\n idx = decimalIndex;\n }\n\n if (decimalIndex === idx) {\n number += (fraction ? decimal : EMPTY) + fraction;\n idx += end - decimalIndex + 1;\n continue;\n }\n }\n\n if (ch === ZERO) {\n number += ch;\n replacement = ch;\n } else if (ch === SHARP) {\n number += replacement;\n }\n }\n\n if (hasGroup) {\n number = groupInteger(number, start + (negative && !hasNegativeFormat ? 1 : 0), Math.max(end, (integerLength + start)), numberFormat);\n }\n\n if (end >= start) {\n number += format.substring(end + 1);\n }\n\n //replace symbol placeholders\n if (isCurrency || isPercent) {\n value = EMPTY;\n for (idx = 0, length = number.length; idx < length; idx++) {\n ch = number.charAt(idx);\n value += (ch === \"$\" || ch === \"%\") ? symbol : ch;\n }\n number = value;\n }\n\n length = literals.length;\n\n if (length) {\n for (idx = 0; idx < length; idx++) {\n number = number.replace(PLACEHOLDER, literals[idx]);\n }\n }\n }\n\n return number;\n }\n\n var groupInteger = function(number, start, end, numberFormat) {\n var decimalIndex = number.indexOf(numberFormat[POINT]);\n var groupSizes = numberFormat.groupSize.slice();\n var groupSize = groupSizes.shift();\n var integer, integerLength;\n var idx, parts, value;\n var newGroupSize;\n\n end = decimalIndex !== -1 ? decimalIndex : end + 1;\n\n integer = number.substring(start, end);\n integerLength = integer.length;\n\n if (integerLength >= groupSize) {\n idx = integerLength;\n parts = [];\n\n while (idx > -1) {\n value = integer.substring(idx - groupSize, idx);\n if (value) {\n parts.push(value);\n }\n idx -= groupSize;\n newGroupSize = groupSizes.shift();\n groupSize = newGroupSize !== undefined$1 ? newGroupSize : groupSize;\n\n if (groupSize === 0) {\n if (idx > 0) {\n parts.push(integer.substring(0, idx));\n }\n break;\n }\n }\n\n integer = parts.reverse().join(numberFormat[COMMA]);\n number = number.substring(0, start) + integer + number.substring(end);\n }\n\n return number;\n };\n\n var round = function(value, precision, negative) {\n precision = precision || 0;\n\n value = value.toString().split('e');\n value = Math.round(+(value[0] + 'e' + (value[1] ? (+value[1] + precision) : precision)));\n\n if (negative) {\n value = -value;\n }\n\n value = value.toString().split('e');\n value = +(value[0] + 'e' + (value[1] ? (+value[1] - precision) : -precision));\n\n return value.toFixed(Math.min(precision, 20));\n };\n\n var toString = function(value, fmt, culture) {\n if (fmt) {\n if (objectToString.call(value) === \"[object Date]\") {\n return formatDate(value, fmt, culture);\n } else if (typeof value === NUMBER) {\n return formatNumber(value, fmt, culture);\n }\n }\n\n return value !== undefined$1 ? value : \"\";\n };\n\n kendo.format = function(fmt) {\n var values = arguments;\n\n return fmt.replace(formatRegExp, function(match, index, placeholderFormat) {\n var value = values[parseInt(index, 10) + 1];\n\n return toString(value, placeholderFormat ? placeholderFormat.substring(1) : \"\");\n });\n };\n\n kendo._extractFormat = function(format) {\n if (format.slice(0,3) === \"{0:\") {\n format = format.slice(3, format.length - 1);\n }\n\n return format;\n };\n\n kendo._activeElement = function() {\n try {\n return document.activeElement;\n } catch (e) {\n return document.documentElement.activeElement;\n }\n };\n\n kendo._round = round;\n kendo._outerWidth = function(element, includeMargin) { return $(element).outerWidth(includeMargin || false) || 0; };\n kendo._outerHeight = function(element, includeMargin) { return $(element).outerHeight(includeMargin || false) || 0; };\n kendo.toString = toString;\n })();\n\n\n (function() {\n var nonBreakingSpaceRegExp = /\\u00A0/g,\n spaceRegExp = /\\s/g,\n exponentRegExp = /[eE][\\-+]?[0-9]+/,\n shortTimeZoneRegExp = /[+|\\-]\\d{1,2}/,\n longTimeZoneRegExp = /[+|\\-]\\d{1,2}:?\\d{2}/,\n dateRegExp = /^\\/Date\\((.*?)\\)\\/$/,\n offsetRegExp = /[+-]\\d*/,\n FORMATS_SEQUENCE = [ [], [ \"G\", \"g\", \"F\" ], [ \"D\", \"d\", \"y\", \"m\", \"T\", \"t\" ] ],\n STANDARD_FORMATS = [\n [\n \"yyyy-MM-ddTHH:mm:ss.fffffffzzz\",\n \"yyyy-MM-ddTHH:mm:ss.fffffff\",\n \"yyyy-MM-ddTHH:mm:ss.fffzzz\",\n \"yyyy-MM-ddTHH:mm:ss.fff\",\n \"ddd MMM dd yyyy HH:mm:ss\",\n \"yyyy-MM-ddTHH:mm:sszzz\",\n \"yyyy-MM-ddTHH:mmzzz\",\n \"yyyy-MM-ddTHH:mmzz\",\n \"yyyy-MM-ddTHH:mm:ss\",\n \"yyyy-MM-dd HH:mm:ss\",\n \"yyyy/MM/dd HH:mm:ss\"\n ], [\n \"yyyy-MM-ddTHH:mm\",\n \"yyyy-MM-dd HH:mm\",\n \"yyyy/MM/dd HH:mm\"\n ], [\n \"yyyy/MM/dd\",\n \"yyyy-MM-dd\",\n \"HH:mm:ss\",\n \"HH:mm\"\n ]\n ],\n numberRegExp = {\n 2: /^\\d{1,2}/,\n 3: /^\\d{1,3}/,\n 4: /^\\d{4}/\n },\n objectToString = {}.toString;\n\n function outOfRange(value, start, end) {\n return !(value >= start && value <= end);\n }\n\n function designatorPredicate(designator) {\n return designator.charAt(0);\n }\n\n function mapDesignators(designators) {\n return $.map(designators, designatorPredicate);\n }\n\n //if date's day is different than the typed one - adjust\n function adjustDST(date, hours) {\n if (!hours && date.getHours() === 23) {\n date.setHours(date.getHours() + 2);\n }\n }\n\n function lowerArray(data) {\n var idx = 0,\n length = data.length,\n array = [];\n\n for (; idx < length; idx++) {\n array[idx] = (data[idx] + \"\").toLowerCase();\n }\n\n return array;\n }\n\n function lowerLocalInfo(localInfo) {\n var newLocalInfo = {}, property;\n\n for (property in localInfo) {\n newLocalInfo[property] = lowerArray(localInfo[property]);\n }\n\n return newLocalInfo;\n }\n\n function parseExact(value, format, culture, strict) {\n if (!value) {\n return null;\n }\n\n var lookAhead = function(match) {\n var i = 0;\n while (format[idx] === match) {\n i++;\n idx++;\n }\n if (i > 0) {\n idx -= 1;\n }\n return i;\n },\n getNumber = function(size) {\n var rg = numberRegExp[size] || new RegExp('^\\\\d{1,' + size + '}'),\n match = value.substr(valueIdx, size).match(rg);\n\n if (match) {\n match = match[0];\n valueIdx += match.length;\n return parseInt(match, 10);\n }\n return null;\n },\n getIndexByName = function(names, lower) {\n var i = 0,\n length = names.length,\n name, nameLength,\n matchLength = 0,\n matchIdx = 0,\n subValue;\n\n for (; i < length; i++) {\n name = names[i];\n nameLength = name.length;\n subValue = value.substr(valueIdx, nameLength);\n\n if (lower) {\n subValue = subValue.toLowerCase();\n }\n\n if (subValue == name && nameLength > matchLength) {\n matchLength = nameLength;\n matchIdx = i;\n }\n }\n\n if (matchLength) {\n valueIdx += matchLength;\n return matchIdx + 1;\n }\n\n return null;\n },\n checkLiteral = function() {\n var result = false;\n if (value.charAt(valueIdx) === format[idx]) {\n valueIdx++;\n result = true;\n }\n return result;\n },\n calendar = culture.calendars.standard,\n year = null,\n month = null,\n day = null,\n hours = null,\n minutes = null,\n seconds = null,\n milliseconds = null,\n idx = 0,\n valueIdx = 0,\n literal = false,\n date = new Date(),\n twoDigitYearMax = calendar.twoDigitYearMax || 2029,\n defaultYear = date.getFullYear(),\n ch, count, length, pattern,\n pmHour, UTC, matches,\n amDesignators, pmDesignators,\n hoursOffset, minutesOffset,\n hasTime, match;\n\n if (!format) {\n format = \"d\"; //shord date format\n }\n\n //if format is part of the patterns get real format\n pattern = calendar.patterns[format];\n if (pattern) {\n format = pattern;\n }\n\n format = format.split(\"\");\n length = format.length;\n\n for (; idx < length; idx++) {\n ch = format[idx];\n\n if (literal) {\n if (ch === \"'\") {\n literal = false;\n } else {\n checkLiteral();\n }\n } else {\n if (ch === \"d\") {\n count = lookAhead(\"d\");\n if (!calendar._lowerDays) {\n calendar._lowerDays = lowerLocalInfo(calendar.days);\n }\n\n if (day !== null && count > 2) {\n continue;\n }\n\n day = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerDays[count == 3 ? \"namesAbbr\" : \"names\"], true);\n\n if (day === null || outOfRange(day, 1, 31)) {\n return null;\n }\n } else if (ch === \"M\") {\n count = lookAhead(\"M\");\n if (!calendar._lowerMonths) {\n calendar._lowerMonths = lowerLocalInfo(calendar.months);\n }\n month = count < 3 ? getNumber(2) : getIndexByName(calendar._lowerMonths[count == 3 ? 'namesAbbr' : 'names'], true);\n\n if (month === null || outOfRange(month, 1, 12)) {\n return null;\n }\n month -= 1; //because month is zero based\n } else if (ch === \"y\") {\n count = lookAhead(\"y\");\n year = getNumber(count);\n\n if (year === null) {\n return null;\n }\n\n if (count == 2) {\n if (typeof twoDigitYearMax === \"string\") {\n twoDigitYearMax = defaultYear + parseInt(twoDigitYearMax, 10);\n }\n\n year = (defaultYear - defaultYear % 100) + year;\n if (year > twoDigitYearMax) {\n year -= 100;\n }\n }\n } else if (ch === \"h\" ) {\n lookAhead(\"h\");\n hours = getNumber(2);\n if (hours == 12) {\n hours = 0;\n }\n if (hours === null || outOfRange(hours, 0, 11)) {\n return null;\n }\n } else if (ch === \"H\") {\n lookAhead(\"H\");\n hours = getNumber(2);\n if (hours === null || outOfRange(hours, 0, 23)) {\n return null;\n }\n } else if (ch === \"m\") {\n lookAhead(\"m\");\n minutes = getNumber(2);\n if (minutes === null || outOfRange(minutes, 0, 59)) {\n return null;\n }\n } else if (ch === \"s\") {\n lookAhead(\"s\");\n seconds = getNumber(2);\n if (seconds === null || outOfRange(seconds, 0, 59)) {\n return null;\n }\n } else if (ch === \"f\") {\n count = lookAhead(\"f\");\n\n match = value.substr(valueIdx, count).match(numberRegExp[3]);\n milliseconds = getNumber(count); //move value index position\n\n if (milliseconds !== null) {\n milliseconds = parseFloat(\"0.\" + match[0], 10);\n milliseconds = kendo._round(milliseconds, 3);\n milliseconds *= 1000;\n }\n\n if (milliseconds === null || outOfRange(milliseconds, 0, 999)) {\n return null;\n }\n\n } else if (ch === \"t\") {\n count = lookAhead(\"t\");\n amDesignators = calendar.AM;\n pmDesignators = calendar.PM;\n\n if (count === 1) {\n amDesignators = mapDesignators(amDesignators);\n pmDesignators = mapDesignators(pmDesignators);\n }\n\n pmHour = getIndexByName(pmDesignators);\n if (!pmHour && !getIndexByName(amDesignators)) {\n return null;\n }\n }\n else if (ch === \"z\") {\n UTC = true;\n count = lookAhead(\"z\");\n\n if (value.substr(valueIdx, 1) === \"Z\") {\n checkLiteral();\n continue;\n }\n\n matches = value.substr(valueIdx, 6)\n .match(count > 2 ? longTimeZoneRegExp : shortTimeZoneRegExp);\n\n if (!matches) {\n return null;\n }\n\n matches = matches[0].split(\":\");\n\n hoursOffset = matches[0];\n minutesOffset = matches[1];\n\n if (!minutesOffset && hoursOffset.length > 3) { //(+|-)[hh][mm] format is used\n valueIdx = hoursOffset.length - 2;\n minutesOffset = hoursOffset.substring(valueIdx);\n hoursOffset = hoursOffset.substring(0, valueIdx);\n }\n\n hoursOffset = parseInt(hoursOffset, 10);\n if (outOfRange(hoursOffset, -12, 13)) {\n return null;\n }\n\n if (count > 2) {\n minutesOffset = matches[0][0] + minutesOffset;\n minutesOffset = parseInt(minutesOffset, 10);\n if (isNaN(minutesOffset) || outOfRange(minutesOffset, -59, 59)) {\n return null;\n }\n }\n } else if (ch === \"'\") {\n literal = true;\n checkLiteral();\n } else if (!checkLiteral()) {\n return null;\n }\n }\n }\n\n // if more characters follow, assume wrong format\n // https://github.com/telerik/kendo-ui-core/issues/3476\n if (strict && !/^\\s*$/.test(value.substr(valueIdx))) {\n return null;\n }\n\n hasTime = hours !== null || minutes !== null || seconds || null;\n\n if (year === null && month === null && day === null && hasTime) {\n year = defaultYear;\n month = date.getMonth();\n day = date.getDate();\n } else {\n if (year === null) {\n year = defaultYear;\n }\n\n if (day === null) {\n day = 1;\n }\n }\n\n if (pmHour && hours < 12) {\n hours += 12;\n }\n\n if (UTC) {\n if (hoursOffset) {\n hours += -hoursOffset;\n }\n\n if (minutesOffset) {\n minutes += -minutesOffset;\n }\n\n value = new Date(Date.UTC(year, month, day, hours, minutes, seconds, milliseconds));\n } else {\n value = new Date(year, month, day, hours, minutes, seconds, milliseconds);\n adjustDST(value, hours);\n }\n\n if (year < 100) {\n value.setFullYear(year);\n }\n\n if (value.getDate() !== day && UTC === undefined$1) {\n return null;\n }\n\n return value;\n }\n\n function parseMicrosoftFormatOffset(offset) {\n var sign = offset.substr(0, 1) === \"-\" ? -1 : 1;\n\n offset = offset.substring(1);\n offset = (parseInt(offset.substr(0, 2), 10) * 60) + parseInt(offset.substring(2), 10);\n\n return sign * offset;\n }\n\n function getDefaultFormats(culture) {\n var length = math.max(FORMATS_SEQUENCE.length, STANDARD_FORMATS.length);\n var calendar = culture.calendar || culture.calendars.standard;\n var patterns = calendar.patterns;\n var cultureFormats, formatIdx, idx;\n var formats = [];\n\n for (idx = 0; idx < length; idx++) {\n cultureFormats = FORMATS_SEQUENCE[idx];\n for (formatIdx = 0; formatIdx < cultureFormats.length; formatIdx++) {\n formats.push(patterns[cultureFormats[formatIdx]]);\n }\n formats = formats.concat(STANDARD_FORMATS[idx]);\n }\n\n return formats;\n }\n\n function internalParseDate(value, formats, culture, strict) {\n if (objectToString.call(value) === \"[object Date]\") {\n return value;\n }\n\n var idx = 0;\n var date = null;\n var length;\n var tzoffset;\n\n if (value && value.indexOf(\"/D\") === 0) {\n date = dateRegExp.exec(value);\n if (date) {\n date = date[1];\n tzoffset = offsetRegExp.exec(date.substring(1));\n\n date = new Date(parseInt(date, 10));\n\n if (tzoffset) {\n tzoffset = parseMicrosoftFormatOffset(tzoffset[0]);\n date = kendo.timezone.apply(date, 0);\n date = kendo.timezone.convert(date, 0, -1 * tzoffset);\n }\n\n return date;\n }\n }\n\n culture = kendo.getCulture(culture);\n\n if (!formats) {\n formats = getDefaultFormats(culture);\n }\n\n formats = isArray(formats) ? formats : [formats];\n length = formats.length;\n\n for (; idx < length; idx++) {\n date = parseExact(value, formats[idx], culture, strict);\n if (date) {\n return date;\n }\n }\n\n return date;\n }\n\n kendo.parseDate = function(value, formats, culture) {\n return internalParseDate(value, formats, culture, false);\n };\n\n kendo.parseExactDate = function(value, formats, culture) {\n return internalParseDate(value, formats, culture, true);\n };\n\n kendo.parseInt = function(value, culture) {\n var result = kendo.parseFloat(value, culture);\n if (result) {\n result = result | 0;\n }\n return result;\n };\n\n kendo.parseFloat = function(value, culture, format) {\n if (!value && value !== 0) {\n return null;\n }\n\n if (typeof value === NUMBER) {\n return value;\n }\n\n value = value.toString();\n culture = kendo.getCulture(culture);\n\n var number = culture.numberFormat,\n percent = number.percent,\n currency = number.currency,\n symbol = currency.symbol,\n percentSymbol = percent.symbol,\n negative = value.indexOf(\"-\"),\n parts, isPercent;\n\n //handle exponential number\n if (exponentRegExp.test(value)) {\n value = parseFloat(value.replace(number[\".\"], \".\"));\n if (isNaN(value)) {\n value = null;\n }\n return value;\n }\n\n if (negative > 0) {\n return null;\n } else {\n negative = negative > -1;\n }\n\n if (value.indexOf(symbol) > -1 || (format && format.toLowerCase().indexOf(\"c\") > -1)) {\n number = currency;\n parts = number.pattern[0].replace(\"$\", symbol).split(\"n\");\n if (value.indexOf(parts[0]) > -1 && value.indexOf(parts[1]) > -1) {\n value = value.replace(parts[0], \"\").replace(parts[1], \"\");\n negative = true;\n }\n } else if (value.indexOf(percentSymbol) > -1) {\n isPercent = true;\n number = percent;\n symbol = percentSymbol;\n }\n\n value = value.replace(\"-\", \"\")\n .replace(symbol, \"\")\n .replace(nonBreakingSpaceRegExp, \" \")\n .split(number[\",\"].replace(nonBreakingSpaceRegExp, \" \")).join(\"\")\n .replace(spaceRegExp, \"\")\n .replace(number[\".\"], \".\");\n\n value = parseFloat(value);\n\n if (isNaN(value)) {\n value = null;\n } else if (negative) {\n value *= -1;\n }\n\n if (value && isPercent) {\n value /= 100;\n }\n\n return value;\n };\n })();\n\n function getShadows(element) {\n var shadow = element.css(kendo.support.transitions.css + \"box-shadow\") || element.css(\"box-shadow\"),\n radius = shadow ? shadow.match(boxShadowRegExp) || [ 0, 0, 0, 0, 0 ] : [ 0, 0, 0, 0, 0 ],\n blur = math.max((+radius[3]), +(radius[4] || 0));\n\n return {\n left: (-radius[1]) + blur,\n right: (+radius[1]) + blur,\n bottom: (+radius[2]) + blur\n };\n }\n\n function wrap(element, autosize, resize) {\n var percentage,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n parent = element.parent(),\n windowOuterWidth = outerWidth(window);\n\n parent.parent().removeClass(\"k-animation-container-sm\");\n\n if (!parent.hasClass(\"k-child-animation-container\")) {\n var width = element[0].style.width,\n height = element[0].style.height,\n percentWidth = percentRegExp.test(width),\n percentHeight = percentRegExp.test(height),\n forceWidth = element.hasClass(\"k-tooltip\") || element.is(\".k-menu-horizontal.k-context-menu\");\n\n percentage = percentWidth || percentHeight;\n\n if (!percentWidth && (!autosize || (autosize && width) || forceWidth)) { width = autosize ? outerWidth(element) + 1 : outerWidth(element); }\n if (!percentHeight && (!autosize || (autosize && height)) || element.is(\".k-menu-horizontal.k-context-menu\")) { height = outerHeight(element); }\n\n element.wrap(\n $(\"
\")\n .addClass(\"k-child-animation-container\")\n .css({\n width: width,\n height: height\n }));\n parent = element.parent();\n\n parent.wrap(\n $(\"
\")\n .addClass(\"k-animation-container\")\n .attr(\"role\", \"region\")\n );\n\n if (percentage) {\n element.css({\n width: \"100%\",\n height: \"100%\"\n });\n }\n } else {\n wrapResize(element, autosize);\n }\n\n parent = parent.parent();\n\n if (windowOuterWidth < outerWidth(parent)) {\n parent.addClass(\"k-animation-container-sm\");\n resize = true;\n }\n\n if (resize) {\n wrapResize(element, autosize);\n }\n\n return parent;\n }\n\n function wrapResize(element, autosize) {\n var percentage,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n parent = element.parent(),\n wrapper = element.closest(\".k-animation-container\"),\n visible = element.is(\":visible\"),\n wrapperStyle = parent[0].style,\n elementHeight = element[0].style.height;\n\n if (wrapper.is(\":hidden\")) {\n wrapper.css({\n display: \"\",\n position: \"\"\n });\n }\n\n percentage = percentRegExp.test(wrapperStyle.width) || percentRegExp.test(wrapperStyle.height);\n\n if (!percentage) {\n if (!visible) {\n element.add(parent).show();\n }\n parent.css(\"width\", \"\"); // Needed to get correct width dimensions\n parent.css({\n width: autosize ? outerWidth(element) + 1 : outerWidth(element),\n });\n\n if (elementHeight === \"auto\") {\n element.css({ height: outerHeight(parent) });\n } else {\n parent.css({\n height: outerHeight(element)\n });\n }\n\n if (!visible) {\n element.hide();\n }\n }\n }\n\n function deepExtend(destination) {\n var arguments$1 = arguments;\n\n var i = 1,\n length = arguments.length;\n\n for (i = 1; i < length; i++) {\n deepExtendOne(destination, arguments$1[i]);\n }\n\n return destination;\n }\n\n function deepExtendOne(destination, source) {\n var ObservableArray = kendo.data.ObservableArray,\n LazyObservableArray = kendo.data.LazyObservableArray,\n DataSource = kendo.data.DataSource,\n HierarchicalDataSource = kendo.data.HierarchicalDataSource,\n property,\n propValue,\n propType,\n propInit,\n destProp;\n\n for (property in source) {\n propValue = source[property];\n propType = typeof propValue;\n\n if (propType === OBJECT && propValue !== null) {\n propInit = propValue.constructor;\n } else {\n propInit = null;\n }\n\n if (propInit &&\n propInit !== Array && propInit !== ObservableArray && propInit !== LazyObservableArray &&\n propInit !== DataSource && propInit !== HierarchicalDataSource && propInit !== RegExp &&\n (!kendo.isFunction(window.ArrayBuffer) || propInit !== ArrayBuffer) && !(propValue instanceof HTMLElement)) {\n\n if (propValue instanceof Date) {\n destination[property] = new Date(propValue.getTime());\n } else if (isFunction(propValue.clone)) {\n destination[property] = propValue.clone();\n } else {\n destProp = destination[property];\n if (typeof (destProp) === OBJECT) {\n destination[property] = destProp || {};\n } else {\n destination[property] = {};\n }\n deepExtendOne(destination[property], propValue);\n }\n } else if (propType !== UNDEFINED) {\n destination[property] = propValue;\n }\n }\n\n return destination;\n }\n\n function testRx(agent, rxs, dflt) {\n for (var rx in rxs) {\n if (rxs.hasOwnProperty(rx) && rxs[rx].test(agent)) {\n return rx;\n }\n }\n return dflt !== undefined$1 ? dflt : agent;\n }\n\n function toHyphens(str) {\n return str.replace(/([a-z][A-Z])/g, function(g) {\n return g.charAt(0) + '-' + g.charAt(1).toLowerCase();\n });\n }\n\n function toCamelCase(str) {\n return str.replace(/\\-(\\w)/g, function(strMatch, g1) {\n return g1.toUpperCase();\n });\n }\n\n function getComputedStyles(element, properties) {\n var styles = {}, computedStyle;\n\n if (document.defaultView && document.defaultView.getComputedStyle) {\n computedStyle = document.defaultView.getComputedStyle(element, \"\");\n\n if (properties) {\n $.each(properties, function(idx, value) {\n styles[value] = computedStyle.getPropertyValue(value);\n });\n }\n } else {\n computedStyle = element.currentStyle;\n\n if (properties) {\n $.each(properties, function(idx, value) {\n styles[value] = computedStyle[toCamelCase(value)];\n });\n }\n }\n\n if (!kendo.size(styles)) {\n styles = computedStyle;\n }\n\n return styles;\n }\n\n function isScrollable(element) {\n if (element.dataset[kendo.ns + \"scrollable\"] === \"false\") {\n return false;\n }\n\n if (element && element.className && typeof(element.className) === \"string\" && element.className.indexOf(\"k-auto-scrollable\") > -1) {\n return true;\n }\n\n var overflow = getComputedStyles(element, [\"overflow\"]).overflow;\n return overflow.indexOf(\"auto\") > -1 || overflow.indexOf(\"scroll\") > -1;\n }\n\n function scrollLeft(element, value) {\n var webkit = support.browser.webkit;\n var mozila = support.browser.mozilla;\n var browserVersion = support.browser.version;\n var el, isRtl;\n\n if (element instanceof $ && value !== undefined$1) {\n element.each(function(i, e) {\n scrollLeft(e, value);\n });\n\n return;\n } else {\n el = element instanceof $ ? element[0] : element;\n }\n\n if (!el) {\n return;\n }\n\n isRtl = support.isRtl(element);\n\n // After updating browser detection,\n // Test in which if should the Safari browsers go\n if (value !== undefined$1) {\n if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\n el.scrollLeft = el.scrollWidth - el.clientWidth - value;\n } else if (isRtl && (mozila || webkit) && value > 0) {\n el.scrollLeft = -value;\n } else {\n el.scrollLeft = value;\n }\n } else {\n if (isRtl && webkit && (browserVersion < 85 || support.browser.safari)) {\n return el.scrollWidth - el.clientWidth - el.scrollLeft;\n } else {\n return Math.abs(el.scrollLeft);\n }\n }\n }\n\n (function() {\n support._scrollbar = undefined$1;\n\n support.scrollbar = function(refresh) {\n if (!isNaN(support._scrollbar) && !refresh) {\n return support._scrollbar;\n } else {\n var div = document.createElement(\"div\"),\n result;\n\n div.style.cssText = \"overflow:scroll;overflow-x:hidden;zoom:1;clear:both;display:block\";\n div.innerHTML = \" \";\n document.body.appendChild(div);\n\n support._scrollbar = result = div.offsetWidth - div.scrollWidth;\n\n document.body.removeChild(div);\n\n return result;\n }\n };\n\n support.isRtl = function(element) {\n return $(element).closest(\".k-rtl\").length > 0;\n };\n\n var table = document.createElement(\"table\");\n\n // Internet Explorer does not support setting the innerHTML of TBODY and TABLE elements\n try {\n table.innerHTML = \"\";\n\n support.tbodyInnerHtml = true;\n } catch (e) {\n support.tbodyInnerHtml = false;\n }\n\n support.touch = \"ontouchstart\" in window;\n\n var docStyle = document.documentElement.style;\n var transitions = support.transitions = false,\n transforms = support.transforms = false,\n elementProto = \"HTMLElement\" in window ? HTMLElement.prototype : [];\n\n support.hasHW3D = (\"WebKitCSSMatrix\" in window && \"m11\" in new window.WebKitCSSMatrix()) || \"MozPerspective\" in docStyle || \"msPerspective\" in docStyle;\n support.cssFlexbox = (\"flexWrap\" in docStyle) || (\"WebkitFlexWrap\" in docStyle) || (\"msFlexWrap\" in docStyle);\n\n each([ \"Moz\", \"webkit\", \"O\", \"ms\" ], function() {\n var prefix = this.toString(),\n hasTransitions = typeof table.style[prefix + \"Transition\"] === STRING;\n\n if (hasTransitions || typeof table.style[prefix + \"Transform\"] === STRING) {\n var lowPrefix = prefix.toLowerCase();\n\n transforms = {\n css: (lowPrefix != \"ms\") ? \"-\" + lowPrefix + \"-\" : \"\",\n prefix: prefix,\n event: (lowPrefix === \"o\" || lowPrefix === \"webkit\") ? lowPrefix : \"\"\n };\n\n if (hasTransitions) {\n transitions = transforms;\n transitions.event = transitions.event ? transitions.event + \"TransitionEnd\" : \"transitionend\";\n }\n\n return false;\n }\n });\n\n table = null;\n\n support.transforms = transforms;\n support.transitions = transitions;\n\n support.devicePixelRatio = window.devicePixelRatio === undefined$1 ? 1 : window.devicePixelRatio;\n\n try {\n support.screenWidth = window.outerWidth || window.screen ? window.screen.availWidth : window.innerWidth;\n support.screenHeight = window.outerHeight || window.screen ? window.screen.availHeight : window.innerHeight;\n } catch (e$1) {\n //window.outerWidth throws error when in IE showModalDialog.\n support.screenWidth = window.screen.availWidth;\n support.screenHeight = window.screen.availHeight;\n }\n\n support.detectOS = function(ua) {\n var os = false, minorVersion, match = [],\n notAndroidPhone = !/mobile safari/i.test(ua),\n agentRxs = {\n wp: /(Windows Phone(?: OS)?)\\s(\\d+)\\.(\\d+(\\.\\d+)?)/,\n fire: /(Silk)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n android: /(Android|Android.*(?:Opera|Firefox).*?\\/)\\s*(\\d+)\\.?(\\d+(\\.\\d+)?)?/,\n iphone: /(iPhone|iPod).*OS\\s+(\\d+)[\\._]([\\d\\._]+)/,\n ipad: /(iPad).*OS\\s+(\\d+)[\\._]([\\d_]+)/,\n meego: /(MeeGo).+NokiaBrowser\\/(\\d+)\\.([\\d\\._]+)/,\n webos: /(webOS)\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n blackberry: /(BlackBerry|BB10).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/,\n playbook: /(PlayBook).*?Tablet\\s*OS\\s*(\\d+)\\.(\\d+(\\.\\d+)?)/,\n windows: /(MSIE)\\s+(\\d+)\\.(\\d+(\\.\\d+)?)/,\n tizen: /(tizen).*?Version\\/(\\d+)\\.(\\d+(\\.\\d+)?)/i,\n sailfish: /(sailfish).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*firefox/i,\n ffos: /(Mobile).*rv:(\\d+)\\.(\\d+(\\.\\d+)?).*Firefox/\n },\n osRxs = {\n ios: /^i(phone|pad|pod)$/i,\n android: /^android|fire$/i,\n blackberry: /^blackberry|playbook/i,\n windows: /windows/,\n wp: /wp/,\n flat: /sailfish|ffos|tizen/i,\n meego: /meego/\n },\n formFactorRxs = {\n tablet: /playbook|ipad|fire/i\n },\n browserRxs = {\n omini: /Opera\\sMini/i,\n omobile: /Opera\\sMobi/i,\n firefox: /Firefox|Fennec/i,\n mobilesafari: /version\\/.*safari/i,\n ie: /MSIE|Windows\\sPhone/i,\n chrome: /chrome|crios/i,\n webkit: /webkit/i\n };\n\n for (var agent in agentRxs) {\n if (agentRxs.hasOwnProperty(agent)) {\n match = ua.match(agentRxs[agent]);\n if (match) {\n if (agent == \"windows\" && \"plugins\" in navigator) { return false; } // Break if not Metro/Mobile Windows\n\n os = {};\n os.device = agent;\n os.tablet = testRx(agent, formFactorRxs, false);\n os.browser = testRx(ua, browserRxs, \"default\");\n os.name = testRx(agent, osRxs);\n os[os.name] = true;\n os.majorVersion = match[2];\n os.minorVersion = (match[3] || \"0\").replace(\"_\", \".\");\n minorVersion = os.minorVersion.replace(\".\", \"\").substr(0, 2);\n os.flatVersion = os.majorVersion + minorVersion + (new Array(3 - (minorVersion.length < 3 ? minorVersion.length : 2)).join(\"0\"));\n os.cordova = typeof window.PhoneGap !== UNDEFINED || typeof window.cordova !== UNDEFINED; // Use file protocol to detect appModes.\n os.appMode = window.navigator.standalone || (/file|local|wmapp/).test(window.location.protocol) || os.cordova; // Use file protocol to detect appModes.\n\n if (os.android && (support.devicePixelRatio < 1.5 && os.flatVersion < 400 || notAndroidPhone) && (support.screenWidth > 800 || support.screenHeight > 800)) {\n os.tablet = agent;\n }\n\n break;\n }\n }\n }\n return os;\n };\n\n var mobileOS = support.mobileOS = support.detectOS(navigator.userAgent);\n\n support.wpDevicePixelRatio = mobileOS.wp ? screen.width / 320 : 0;\n\n support.hasNativeScrolling = false;\n\n if (mobileOS.ios || (mobileOS.android && mobileOS.majorVersion > 2) || mobileOS.wp) {\n support.hasNativeScrolling = mobileOS;\n }\n\n support.delayedClick = function() {\n\n // only the mobile devices with touch events do this.\n if (support.touch) {\n // All iOS devices so far (by the time I am writing this, iOS 9.0.2 is the latest),\n // delay their click events.\n if (mobileOS.ios) {\n return true;\n }\n\n if (mobileOS.android) {\n\n if (!support.browser.chrome) { // older webkits and webviews delay the click\n return true;\n }\n\n // from here on, we deal with Chrome on Android.\n if (support.browser.version < 32) {\n return false;\n }\n\n // Chrome 32+ does conditional fast clicks if the view port is not user scalable.\n return !($(\"meta[name=viewport]\").attr(\"content\") || \"\").match(/user-scalable=no/i);\n }\n }\n\n return false;\n };\n\n support.mouseAndTouchPresent = support.touch && !(support.mobileOS.ios || support.mobileOS.android);\n\n support.detectBrowser = function(ua) {\n var browser = false,\n match = [],\n chromiumEdgeMatch = [],\n browserRxs = {\n edge: /(edge)[ \\/]([\\w.]+)/i,\n webkit: /(chrome|crios)[ \\/]([\\w.]+)/i,\n safari: /(webkit)[ \\/]([\\w.]+)/i,\n opera: /(opera)(?:.*version|)[ \\/]([\\w.]+)/i,\n msie: /(msie\\s|trident.*? rv:)([\\w.]+)/i,\n mozilla: /(mozilla)(?:.*? rv:([\\w.]+)|)/i\n };\n\n for (var agent in browserRxs) {\n if (browserRxs.hasOwnProperty(agent)) {\n match = ua.match(browserRxs[agent]);\n if (match) {\n browser = {};\n browser[agent] = true;\n browser[match[1].toLowerCase().split(\" \")[0].split(\"/\")[0]] = true;\n browser.version = parseInt(document.documentMode || match[2], 10);\n\n if (browser.chrome) {\n chromiumEdgeMatch = ua.match(/(edg)[ \\/]([\\w.]+)/i);\n\n if (chromiumEdgeMatch) {\n browser.chromiumEdge = true;\n }\n }\n\n break;\n }\n }\n }\n\n return browser;\n };\n\n support.browser = support.detectBrowser(navigator.userAgent);\n\n if (!mobileOS && support.touch && support.browser.safari) {\n mobileOS = support.mobileOS = {\n ios: true,\n tablet: \"tablet\",\n device: \"ipad\",\n majorVersion: 13\n };\n }\n\n support.detectClipboardAccess = function() {\n var commands = {\n copy: document.queryCommandSupported ? document.queryCommandSupported(\"copy\") : false,\n cut: document.queryCommandSupported ? document.queryCommandSupported(\"cut\") : false,\n paste: document.queryCommandSupported ? document.queryCommandSupported(\"paste\") : false\n };\n\n if (support.browser.chrome) {\n //not using queryCommandSupported due to chromium issues 476508 and 542948\n commands.paste = false;\n if (support.browser.version >= 43) {\n commands.copy = true;\n commands.cut = true;\n }\n }\n\n return commands;\n };\n\n support.clipboard = support.detectClipboardAccess();\n\n support.zoomLevel = function() {\n try {\n var browser = support.browser;\n var ie11WidthCorrection = 0;\n var docEl = document.documentElement;\n\n if (browser.msie && browser.version == 11 && docEl.scrollHeight > docEl.clientHeight && !support.touch) {\n ie11WidthCorrection = support.scrollbar();\n }\n\n return support.touch ? (docEl.clientWidth / window.innerWidth) :\n browser.msie && browser.version >= 10 ? (((top || window).document.documentElement.offsetWidth + ie11WidthCorrection) / (top || window).innerWidth) : 1;\n } catch (e) {\n return 1;\n }\n };\n\n (function(browser) {\n // add browser-specific CSS class\n var cssClass = \"\",\n docElement = $(document.documentElement),\n majorVersion = parseInt(browser.version, 10);\n\n if (browser.msie) {\n cssClass = \"ie\";\n } else if (browser.mozilla) {\n cssClass = \"ff\";\n } else if (browser.safari) {\n cssClass = \"safari\";\n } else if (browser.webkit) {\n cssClass = \"webkit\";\n } else if (browser.opera) {\n cssClass = \"opera\";\n } else if (browser.edge) {\n cssClass = \"edge\";\n }\n\n if (cssClass) {\n cssClass = \"k-\" + cssClass + \" k-\" + cssClass + majorVersion;\n }\n if (support.mobileOS) {\n cssClass += \" k-mobile\";\n }\n\n if (!support.cssFlexbox) {\n cssClass += \" k-no-flexbox\";\n }\n\n docElement.addClass(cssClass);\n })(support.browser);\n\n support.eventCapture = document.documentElement.addEventListener;\n\n var input = document.createElement(\"input\");\n\n support.placeholder = \"placeholder\" in input;\n support.propertyChangeEvent = \"onpropertychange\" in input;\n\n support.input = (function() {\n var types = [\"number\", \"date\", \"time\", \"month\", \"week\", \"datetime\", \"datetime-local\"];\n var length = types.length;\n var value = \"test\";\n var result = {};\n var idx = 0;\n var type;\n\n for (;idx < length; idx++) {\n type = types[idx];\n input.setAttribute(\"type\", type);\n input.value = value;\n\n result[type.replace(\"-\", \"\")] = input.type !== \"text\" && input.value !== value;\n }\n\n return result;\n })();\n\n input.style.cssText = \"float:left;\";\n\n support.cssFloat = !!input.style.cssFloat;\n\n input = null;\n\n support.stableSort = (function() {\n // Chrome sort is not stable for more than *10* items\n // IE9+ sort is not stable for than *512* items\n var threshold = 513;\n\n var sorted = [{\n index: 0,\n field: \"b\"\n }];\n\n for (var i = 1; i < threshold; i++) {\n sorted.push({\n index: i,\n field: \"a\"\n });\n }\n\n sorted.sort(function(a, b) {\n return a.field > b.field ? 1 : (a.field < b.field ? -1 : 0);\n });\n\n return sorted[0].index === 1;\n })();\n\n support.matchesSelector = elementProto.webkitMatchesSelector || elementProto.mozMatchesSelector ||\n elementProto.msMatchesSelector || elementProto.oMatchesSelector ||\n elementProto.matchesSelector || elementProto.matches ||\n function( selector ) {\n var nodeList = document.querySelectorAll ? ( this.parentNode || document ).querySelectorAll( selector ) || [] : $(selector),\n i = nodeList.length;\n\n while (i--) {\n if (nodeList[i] == this) {\n return true;\n }\n }\n\n return false;\n };\n\n support.matchMedia = \"matchMedia\" in window;\n\n support.pushState = window.history && window.history.pushState;\n\n support.hashChange = \"onhashchange\" in window;\n\n support.customElements = \"registerElement\" in window.document;\n\n var chrome = support.browser.chrome,\n mobileChrome = support.browser.crios,\n mozilla = support.browser.mozilla,\n safari = support.browser.safari;\n support.msPointers = !chrome && window.MSPointerEvent;\n support.pointers = !chrome && !mobileChrome && !mozilla && !safari && window.PointerEvent;\n support.kineticScrollNeeded = mobileOS && (mobileOS.device !== \"ipad\" || mobileOS.majorVersion < 13) && (support.touch || support.msPointers || support.pointers);\n })();\n\n\n function size(obj) {\n var result = 0, key;\n for (key in obj) {\n if (obj.hasOwnProperty(key) && key != \"toJSON\") { // Ignore fake IE7 toJSON.\n result++;\n }\n }\n\n return result;\n }\n\n function getOffset(element, type, positioned) {\n if (!type) {\n type = \"offset\";\n }\n\n var offset = element[type]();\n // clone ClientRect object to JS object (jQuery3)\n var result = {\n top: offset.top,\n right: offset.right,\n bottom: offset.bottom,\n left: offset.left\n };\n\n // IE10 touch zoom is living in a separate viewport\n if (support.browser.msie && (support.pointers || support.msPointers) && !positioned) {\n var sign = support.isRtl(element) ? 1 : -1;\n\n result.top -= (window.pageYOffset - (document.documentElement.scrollTop));\n result.left -= (window.pageXOffset + (sign * document.documentElement.scrollLeft));\n }\n\n return result;\n }\n\n var directions = {\n left: { reverse: \"right\" },\n right: { reverse: \"left\" },\n down: { reverse: \"up\" },\n up: { reverse: \"down\" },\n top: { reverse: \"bottom\" },\n bottom: { reverse: \"top\" },\n \"in\": { reverse: \"out\" },\n out: { reverse: \"in\" }\n };\n\n function parseEffects(input) {\n var effects = {};\n\n each((typeof input === \"string\" ? input.split(\" \") : input), function(idx) {\n effects[idx] = this;\n });\n\n return effects;\n }\n\n function fx(element) {\n return new kendo.effects.Element(element);\n }\n\n var effects = {};\n\n $.extend(effects, {\n enabled: true,\n Element: function(element) {\n this.element = $(element);\n },\n\n promise: function(element, options) {\n if (!element.is(\":visible\")) {\n element.css({ display: element.data(\"olddisplay\") || \"block\" }).css(\"display\");\n }\n\n if (options.hide) {\n element.data(\"olddisplay\", element.css(\"display\")).hide();\n }\n\n if (options.init) {\n options.init();\n }\n\n if (options.completeCallback) {\n options.completeCallback(element); // call the external complete callback with the element\n }\n\n element.dequeue();\n },\n\n disable: function() {\n this.enabled = false;\n this.promise = this.promiseShim;\n },\n\n enable: function() {\n this.enabled = true;\n this.promise = this.animatedPromise;\n }\n });\n\n effects.promiseShim = effects.promise;\n\n function prepareAnimationOptions(options, duration, reverse, complete) {\n if (typeof options === STRING) {\n // options is the list of effect names separated by space e.g. animate(element, \"fadeIn slideDown\")\n\n // only callback is provided e.g. animate(element, options, function() {});\n if (isFunction(duration)) {\n complete = duration;\n duration = 400;\n reverse = false;\n }\n\n if (isFunction(reverse)) {\n complete = reverse;\n reverse = false;\n }\n\n if (typeof duration === BOOLEAN) {\n reverse = duration;\n duration = 400;\n }\n\n options = {\n effects: options,\n duration: duration,\n reverse: reverse,\n complete: complete\n };\n }\n\n return extend({\n //default options\n effects: {},\n duration: 400, //jQuery default duration\n reverse: false,\n init: noop,\n teardown: noop,\n hide: false\n }, options, { completeCallback: options.complete, complete: noop }); // Move external complete callback, so deferred.resolve can be always executed.\n\n }\n\n function animate(element, options, duration, reverse, complete) {\n var idx = 0,\n length = element.length,\n instance;\n\n for (; idx < length; idx ++) {\n instance = $(element[idx]);\n instance.queue(function() {\n effects.promise(instance, prepareAnimationOptions(options, duration, reverse, complete));\n });\n }\n\n return element;\n }\n\n function toggleClass(element, classes, options, add) {\n if (classes) {\n classes = classes.split(\" \");\n\n each(classes, function(idx, value) {\n element.toggleClass(value, add);\n });\n }\n\n return element;\n }\n\n if (!(\"kendoAnimate\" in $.fn)) {\n extend($.fn, {\n kendoStop: function(clearQueue, gotoEnd) {\n return this.stop(clearQueue, gotoEnd);\n },\n\n kendoAnimate: function(options, duration, reverse, complete) {\n return animate(this, options, duration, reverse, complete);\n },\n\n kendoAddClass: function(classes, options) {\n return kendo.toggleClass(this, classes, options, true);\n },\n\n kendoRemoveClass: function(classes, options) {\n return kendo.toggleClass(this, classes, options, false);\n },\n kendoToggleClass: function(classes, options, toggle) {\n return kendo.toggleClass(this, classes, options, toggle);\n }\n });\n }\n\n var ampRegExp = /&/g,\n ltRegExp = //g;\n function htmlEncode(value) {\n return (\"\" + value).replace(ampRegExp, \"&\").replace(ltRegExp, \"<\").replace(gtRegExp, \">\").replace(quoteRegExp, \""\").replace(aposRegExp, \"'\");\n }\n\n function unescape(value) {\n var template;\n\n try {\n template = window.decodeURIComponent(value);\n } catch (error) {\n // If the string contains Unicode characters\n // the decodeURIComponent() will throw an error.\n // Therefore: convert to UTF-8 character\n template = value.replace(/%u([\\dA-F]{4})|%([\\dA-F]{2})/gi, function(_, m1, m2) {\n return String.fromCharCode(parseInt(\"0x\" + (m1 || m2), 16));\n });\n }\n\n return template;\n }\n\n var eventTarget = function(e) {\n return e.target;\n };\n\n if (support.touch) {\n\n eventTarget = function(e) {\n var touches = \"originalEvent\" in e ? e.originalEvent.changedTouches : \"changedTouches\" in e ? e.changedTouches : null;\n\n return touches ? document.elementFromPoint(touches[0].clientX, touches[0].clientY) : e.target;\n };\n\n each([\"swipe\", \"swipeLeft\", \"swipeRight\", \"swipeUp\", \"swipeDown\", \"doubleTap\", \"tap\"], function(m, value) {\n $.fn[value] = function(callback) {\n return this.on(value, callback);\n };\n });\n }\n\n if (support.touch) {\n if (!support.mobileOS) {\n support.mousedown = \"mousedown touchstart\";\n support.mouseup = \"mouseup touchend\";\n support.mousemove = \"mousemove touchmove\";\n support.mousecancel = \"mouseleave touchcancel\";\n support.click = \"click\";\n support.resize = \"resize\";\n } else {\n support.mousedown = \"touchstart\";\n support.mouseup = \"touchend\";\n support.mousemove = \"touchmove\";\n support.mousecancel = \"touchcancel\";\n support.click = \"touchend\";\n support.resize = \"orientationchange\";\n }\n } else if (support.pointers) {\n support.mousemove = \"pointermove\";\n support.mousedown = \"pointerdown\";\n support.mouseup = \"pointerup\";\n support.mousecancel = \"pointercancel\";\n support.click = \"pointerup\";\n support.resize = \"orientationchange resize\";\n } else if (support.msPointers) {\n support.mousemove = \"MSPointerMove\";\n support.mousedown = \"MSPointerDown\";\n support.mouseup = \"MSPointerUp\";\n support.mousecancel = \"MSPointerCancel\";\n support.click = \"MSPointerUp\";\n support.resize = \"orientationchange resize\";\n } else {\n support.mousemove = \"mousemove\";\n support.mousedown = \"mousedown\";\n support.mouseup = \"mouseup\";\n support.mousecancel = \"mouseleave\";\n support.click = \"click\";\n support.resize = \"resize\";\n }\n\n var wrapExpression = function(members, paramName) {\n var result = paramName || \"d\",\n index,\n idx,\n length,\n member,\n count = 1;\n\n for (idx = 0, length = members.length; idx < length; idx++) {\n member = members[idx];\n if (member !== \"\") {\n index = member.indexOf(\"[\");\n\n if (index !== 0) {\n if (index == -1) {\n member = \".\" + member;\n } else {\n count++;\n member = \".\" + member.substring(0, index) + \" || {})\" + member.substring(index);\n }\n }\n\n count++;\n result += member + ((idx < length - 1) ? \" || {})\" : \")\");\n }\n }\n return new Array(count).join(\"(\") + result;\n },\n localUrlRe = /^([a-z]+:)?\\/\\//i;\n\n extend(kendo, {\n widgets: [],\n _widgetRegisteredCallbacks: [],\n ui: kendo.ui || {},\n fx: kendo.fx || fx,\n effects: kendo.effects || effects,\n mobile: kendo.mobile || { },\n data: kendo.data || {},\n dataviz: kendo.dataviz || {},\n drawing: kendo.drawing || {},\n spreadsheet: { messages: {} },\n keys: {\n INSERT: 45,\n DELETE: 46,\n BACKSPACE: 8,\n TAB: 9,\n ENTER: 13,\n ESC: 27,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n END: 35,\n HOME: 36,\n SPACEBAR: 32,\n PAGEUP: 33,\n PAGEDOWN: 34,\n F2: 113,\n F10: 121,\n F12: 123,\n NUMPAD_PLUS: 107,\n NUMPAD_MINUS: 109,\n NUMPAD_DOT: 110\n },\n support: kendo.support || support,\n animate: kendo.animate || animate,\n ns: \"\",\n attr: function(value) {\n return \"data-\" + kendo.ns + value;\n },\n getShadows: getShadows,\n wrap: wrap,\n deepExtend: deepExtend,\n getComputedStyles: getComputedStyles,\n isScrollable: isScrollable,\n scrollLeft: scrollLeft,\n size: size,\n toCamelCase: toCamelCase,\n toHyphens: toHyphens,\n getOffset: kendo.getOffset || getOffset,\n parseEffects: kendo.parseEffects || parseEffects,\n toggleClass: kendo.toggleClass || toggleClass,\n directions: kendo.directions || directions,\n Observable: Observable,\n Class: Class,\n Template: Template,\n template: Template.compile.bind(Template),\n render: Template.render.bind(Template),\n stringify: JSON.stringify.bind(JSON),\n eventTarget: eventTarget,\n htmlEncode: htmlEncode,\n unescape: unescape,\n isLocalUrl: function(url) {\n return url && !localUrlRe.test(url);\n },\n mediaQuery: mediaQuery,\n\n expr: function(expression, safe, paramName) {\n expression = expression || \"\";\n\n if (typeof safe == STRING) {\n paramName = safe;\n safe = false;\n }\n\n paramName = paramName || \"d\";\n\n if (expression && expression.charAt(0) !== \"[\") {\n expression = \".\" + expression;\n }\n\n if (safe) {\n expression = expression.replace(/\"([^.]*)\\.([^\"]*)\"/g,'\"$1_$DOT$_$2\"');\n expression = expression.replace(/'([^.]*)\\.([^']*)'/g,\"'$1_$DOT$_$2'\");\n expression = wrapExpression(expression.split(\".\"), paramName);\n expression = expression.replace(/_\\$DOT\\$_/g, \".\");\n } else {\n expression = paramName + expression;\n }\n\n return expression;\n },\n\n exprToArray: function (expression, safe) {\n expression = expression || \"\";\n var FIELD_REGEX = /\\[(?:(\\d+)|['\"](.*?)['\"])\\]|((?:(?!\\[.*?\\]|\\.).)+)/g;\n var fields = [];\n\n expression.replace(FIELD_REGEX, function (_, index, indexAccessor, field) {\n fields.push(kendo.isPresent(index) ? index : (indexAccessor || field));\n return undefined$1;\n });\n\n return fields;\n },\n\n getter: function(expression, safe) {\n var key = expression + safe;\n\n return getterCache[key] = getterCache[key] || (function (obj) {\n var fields = kendo.exprToArray(expression, safe);\n\n var result = obj;\n for (var idx = 0; idx < fields.length; idx++) {\n result = result[fields[idx]];\n if (!kendo.isPresent(result) && safe) {\n return result;\n }\n }\n\n return result;\n });\n },\n\n setter: function(expression) {\n return setterCache[expression] = setterCache[expression] || (function (obj, value) {\n var fields = kendo.exprToArray(expression);\n\n var innerSetter = function (ref) {\n var parent = ref.parent;\n var val = ref.val;\n var prop = ref.prop;\n var props = ref.props;\n\n if (props.length) {\n parent = parent[props.shift()];\n innerSetter({ parent: parent, val: val, prop: prop, props: props });\n } else {\n parent[prop] = val;\n }\n };\n\n innerSetter({\n parent: obj,\n val: value,\n prop: fields.pop(),\n props: fields\n });\n });\n },\n\n accessor: function(expression) {\n return {\n get: kendo.getter(expression),\n set: kendo.setter(expression)\n };\n },\n\n guid: function() {\n var id = \"\", i, random, chars = \"abcdef\";\n\n id += chars[Math.floor(Math.random() * Math.floor(chars.length))];\n\n for (i = 1; i < 32; i++) {\n random = math.random() * 16 | 0;\n\n if (i == 8 || i == 12 || i == 16 || i == 20) {\n id += \"-\";\n }\n id += (i == 12 ? 4 : (i == 16 ? (random & 3 | 8) : random)).toString(16);\n }\n\n return id;\n },\n\n roleSelector: function(role) {\n return role.replace(/(\\S+)/g, \"[\" + kendo.attr(\"role\") + \"=$1],\").slice(0, -1);\n },\n\n directiveSelector: function(directives) {\n var selectors = directives.split(\" \");\n\n if (selectors) {\n for (var i = 0; i < selectors.length; i++) {\n if (selectors[i] != \"view\") {\n selectors[i] = selectors[i].replace(/(\\w*)(view|bar|strip|over)$/, \"$1-$2\");\n }\n }\n }\n\n return selectors.join(\" \").replace(/(\\S+)/g, \"kendo-mobile-$1,\").slice(0, -1);\n },\n\n triggeredByInput: function(e) {\n return (/^(label|input|textarea|select)$/i).test(e.target.tagName);\n },\n\n onWidgetRegistered: function(callback) {\n for (var i = 0, len = kendo.widgets.length; i < len; i++) {\n callback(kendo.widgets[i]);\n }\n\n kendo._widgetRegisteredCallbacks.push(callback);\n },\n\n logToConsole: function(message, type) {\n var console = window.console;\n\n if (!kendo.suppressLog && typeof(console) != \"undefined\" && console.log) {\n console[type || \"log\"](message);\n }\n }\n });\n\n var Widget = Observable.extend( {\n init: function(element, options) {\n var that = this;\n\n validatePackage();\n\n that.element = kendo.jQuery(element).handler(that);\n\n that.angular(\"init\", options);\n\n Observable.fn.init.call(that);\n\n var dataSource = options ? options.dataSource : null;\n var props;\n\n if (options) {\n props = (that.componentTypes || {})[(options || {}).componentType];\n }\n\n if (dataSource) {\n // avoid deep cloning the data source\n options = extend({}, options, { dataSource: {} });\n }\n\n options = that.options = extend(true, {}, that.options, that.defaults, props || {}, options);\n\n if (dataSource) {\n options.dataSource = dataSource;\n }\n\n if (!that.element.attr(kendo.attr(\"role\"))) {\n that.element.attr(kendo.attr(\"role\"), (options.name || \"\").toLowerCase());\n }\n\n that.element.data(\"kendo\" + options.prefix + options.name, that);\n\n that.bind(that.events, options);\n },\n\n events: [],\n\n options: {\n prefix: \"\"\n },\n\n _hasBindingTarget: function() {\n return !!this.element[0].kendoBindingTarget;\n },\n\n _tabindex: function(target) {\n target = target || this.wrapper;\n\n var element = this.element,\n TABINDEX = \"tabindex\",\n tabindex = target.attr(TABINDEX) || element.attr(TABINDEX);\n\n element.removeAttr(TABINDEX);\n\n target.attr(TABINDEX, !isNaN(tabindex) ? tabindex : 0);\n },\n\n setOptions: function(options) {\n this._clearCssClasses(options);\n this._setEvents(options);\n $.extend(this.options, options);\n this._applyCssClasses();\n },\n\n _setEvents: function(options) {\n var that = this,\n idx = 0,\n length = that.events.length,\n e;\n\n for (; idx < length; idx ++) {\n e = that.events[idx];\n if (that.options[e] && options[e]) {\n that.unbind(e, that.options[e]);\n if (that._events && that._events[e]) {\n delete that._events[e];\n }\n }\n }\n\n that.bind(that.events, options);\n },\n\n resize: function(force) {\n var size = this.getSize(),\n currentSize = this._size;\n\n if (force || (size.width > 0 || size.height > 0) && (!currentSize || size.width !== currentSize.width || size.height !== currentSize.height)) {\n this._size = size;\n this._resize(size, force);\n this.trigger(\"resize\", size);\n }\n },\n\n getSize: function() {\n return kendo.dimensions(this.element);\n },\n\n size: function(size) {\n if (!size) {\n return this.getSize();\n } else {\n this.setSize(size);\n }\n },\n\n setSize: $.noop,\n _resize: $.noop,\n\n destroy: function() {\n var that = this;\n\n that.element.removeData(\"kendo\" + that.options.prefix + that.options.name);\n that.element.removeData(\"handler\");\n that.unbind();\n },\n _destroy: function() {\n this.destroy();\n },\n angular: function() {},\n\n _muteAngularRebind: function(callback) {\n this._muteRebind = true;\n\n callback.call(this);\n\n this._muteRebind = false;\n },\n\n _applyCssClasses: function(element) {\n var protoOptions = this.__proto__.options,\n options = this.options,\n el = element || this.wrapper || this.element,\n classes = [],\n i, prop, validFill, widgetName;\n\n if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\n return;\n }\n\n for (i = 0; i < cssPropertiesNames.length; i++) {\n prop = cssPropertiesNames[i];\n widgetName = this.options._altname || protoOptions.name;\n\n if (protoOptions.hasOwnProperty(prop)) {\n if (prop === \"themeColor\") {\n validFill = kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: \"fillMode\",\n value: options.fillMode\n });\n\n if (validFill && validFill.length) {\n classes.push(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: options[prop],\n fill: options.fillMode\n }));\n }\n } else {\n classes.push(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: options[prop]\n }));\n }\n }\n }\n\n el.addClass(classes.join(\" \"));\n },\n\n _ariaLabel: function(target) {\n var that = this,\n inputElm = that.element,\n inputId = inputElm.attr(\"id\"),\n labelElm = $(\"label[for=\\\"\" + inputId + \"\\\"]\"),\n ariaLabel = inputElm.attr(ARIA_LABEL),\n ariaLabelledBy = inputElm.attr(ARIA_LABELLEDBY),\n labelId;\n\n if (target[0] === inputElm[0]) {\n return;\n }\n\n if (ariaLabel) {\n target.attr(ARIA_LABEL, ariaLabel);\n } else if (ariaLabelledBy) {\n target.attr(ARIA_LABELLEDBY, ariaLabelledBy);\n } else if (labelElm.length) {\n labelId = labelElm.attr(\"id\") || that._generateLabelId(labelElm, inputId || kendo.guid());\n target.attr(ARIA_LABELLEDBY, labelId);\n }\n },\n\n _clearCssClasses: function(newOptions, element) {\n var protoOptions = this.__proto__.options,\n currentOptions = this.options,\n el = element || this.wrapper || this.element,\n i, prop, widgetName;\n\n if (!kendo.cssProperties.propertyDictionary[protoOptions.name]) {\n return;\n }\n\n for (i = 0; i < cssPropertiesNames.length; i++) {\n prop = cssPropertiesNames[i];\n widgetName = this.options._altname || protoOptions.name;\n\n if (protoOptions.hasOwnProperty(prop) && newOptions.hasOwnProperty(prop)) {\n if (prop === \"themeColor\") {\n el.removeClass(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: currentOptions[prop],\n fill: currentOptions.fillMode\n }));\n } else {\n if (prop === \"fillMode\") {\n el.removeClass(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: \"themeColor\",\n value: currentOptions.themeColor,\n fill: currentOptions.fillMode\n }));\n }\n\n el.removeClass(kendo.cssProperties.getValidClass({\n widget: widgetName,\n propName: prop,\n value: currentOptions[prop]\n }));\n }\n }\n }\n },\n\n _generateLabelId: function(label, inputId) {\n var labelId = inputId + LABELIDPART;\n\n label.attr(\"id\", labelId);\n\n return labelId;\n },\n });\n\n var DataBoundWidget = Widget.extend({\n // Angular consumes these.\n dataItems: function() {\n return this.dataSource.flatView();\n },\n\n _angularItems: function(cmd) {\n var that = this;\n that.angular(cmd, function() {\n return {\n elements: that.items(),\n data: $.map(that.dataItems(), function(dataItem) {\n return { dataItem: dataItem };\n })\n };\n });\n }\n });\n\n kendo.dimensions = function(element, dimensions) {\n var domElement = element[0];\n\n if (dimensions) {\n element.css(dimensions);\n }\n\n return { width: domElement.offsetWidth, height: domElement.offsetHeight };\n };\n\n kendo.notify = noop;\n\n var templateRegExp = /template$/i,\n jsonRegExp = /^\\s*(?:\\{(?:.|\\r\\n|\\n)*\\}|\\[(?:.|\\r\\n|\\n)*\\])\\s*$/,\n jsonFormatRegExp = /^\\{(\\d+)(:[^\\}]+)?\\}|^\\[[A-Za-z_]+\\]$/,\n dashRegExp = /([A-Z])/g;\n\n function parseOption(element, option) {\n var value;\n\n if (option.indexOf(\"data\") === 0) {\n option = option.substring(4);\n option = option.charAt(0).toLowerCase() + option.substring(1);\n }\n\n option = option.replace(dashRegExp, \"-$1\");\n value = element.getAttribute(\"data-\" + kendo.ns + option);\n\n if (value === null) {\n value = undefined$1;\n } else if (value === \"null\") {\n value = null;\n } else if (value === \"true\") {\n value = true;\n } else if (value === \"false\") {\n value = false;\n } else if (numberRegExp.test(value) && option != \"mask\" && option != \"format\") {\n value = parseFloat(value);\n } else if (jsonRegExp.test(value) && !jsonFormatRegExp.test(value)) {\n try {\n value = JSON.parse(value);\n } catch (error) {\n // Fallback to function eval for legacy reason - non CSP compliant\n value = new Function(\"return (\" + value + \")\")();\n }\n }\n\n return value;\n }\n\n function parseOptions(element, options, source) {\n var result = {},\n option,\n value,\n role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\n\n for (option in options) {\n value = parseOption(element, option);\n\n if (value !== undefined$1) {\n\n if (templateRegExp.test(option) && role != \"drawer\") {\n if (typeof value === \"string\") {\n if ($(\"#\" + value).length) {\n value = kendo.template($(\"#\" + value).html());\n } else if (source) {\n value = kendo.template(source[value]);\n }\n } else {\n value = element.getAttribute(option);\n }\n }\n\n result[option] = value;\n }\n }\n\n return result;\n }\n\n kendo.initWidget = function(element, options, roles) {\n var result,\n option,\n widget,\n idx,\n length,\n role,\n value,\n dataSource,\n fullPath,\n widgetKeyRegExp;\n\n // Preserve backwards compatibility with (element, options, namespace) signature, where namespace was kendo.ui\n if (!roles) {\n roles = kendo.ui.roles;\n } else if (roles.roles) {\n roles = roles.roles;\n }\n\n element = element.nodeType ? element : element[0];\n\n role = element.getAttribute(\"data-\" + kendo.ns + \"role\");\n\n if (!role) {\n return;\n }\n\n fullPath = role.indexOf(\".\") === -1;\n\n // look for any widget that may be already instantiated based on this role.\n // The prefix used is unknown, hence the regexp\n //\n\n if (fullPath) {\n widget = roles[role];\n } else { // full namespace path - like kendo.ui.Widget\n widget = kendo.getter(role)(window);\n }\n\n var data = $(element).data(),\n widgetKey = widget ? \"kendo\" + widget.fn.options.prefix + widget.fn.options.name : \"\";\n\n if (fullPath) {\n widgetKeyRegExp = new RegExp(\"^kendo.*\" + role + \"$\", \"i\");\n } else { // full namespace path - like kendo.ui.Widget\n widgetKeyRegExp = new RegExp(\"^\" + widgetKey + \"$\", \"i\");\n }\n\n for (var key in data) {\n if (key.match(widgetKeyRegExp)) {\n // we have detected a widget of the same kind - save its reference, we will set its options\n if (key === widgetKey) {\n result = data[key];\n } else {\n return data[key];\n }\n }\n }\n\n if (!widget) {\n return;\n }\n\n dataSource = parseOption(element, \"dataSource\");\n\n options = $.extend({}, parseOptions(element, $.extend({}, widget.fn.options, widget.fn.defaults) ), options);\n\n if (dataSource) {\n if (typeof dataSource === STRING) {\n options.dataSource = kendo.getter(dataSource)(window);\n } else {\n options.dataSource = dataSource;\n }\n }\n\n for (idx = 0, length = widget.fn.events.length; idx < length; idx++) {\n option = widget.fn.events[idx];\n\n value = parseOption(element, option);\n\n if (value !== undefined$1) {\n options[option] = kendo.getter(value)(window);\n }\n }\n\n if (!result) {\n result = new widget(element, options);\n } else if (!$.isEmptyObject(options)) {\n result.setOptions(options);\n }\n\n return result;\n };\n\n kendo.rolesFromNamespaces = function(namespaces) {\n var roles = [],\n idx,\n length;\n\n if (!namespaces[0]) {\n namespaces = [kendo.ui, kendo.dataviz.ui];\n }\n\n for (idx = 0, length = namespaces.length; idx < length; idx ++) {\n roles[idx] = namespaces[idx].roles;\n }\n\n return extend.apply(null, [{}].concat(roles.reverse()));\n };\n\n kendo.init = function(element) {\n var roles = kendo.rolesFromNamespaces(slice.call(arguments, 1));\n\n $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\n kendo.initWidget(this, {}, roles);\n });\n };\n\n kendo.destroy = function(element) {\n $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().each(function() {\n var data = $(this).data();\n\n for (var key in data) {\n if (key.indexOf(\"kendo\") === 0 && typeof data[key].destroy === FUNCTION) {\n data[key].destroy();\n }\n }\n });\n };\n\n function containmentComparer(a, b) {\n return $.contains(a, b) ? -1 : 1;\n }\n\n function resizableWidget() {\n var widget = $(this);\n return ($.inArray(widget.attr(\"data-\" + kendo.ns + \"role\"), [\"slider\", \"rangeslider\", \"breadcrumb\"]) > -1) || widget.is(\":visible\");\n }\n\n kendo.resize = function(element, force) {\n var widgets = $(element).find(\"[data-\" + kendo.ns + \"role]\").addBack().filter(resizableWidget);\n\n if (!widgets.length) {\n return;\n }\n\n // sort widgets based on their parent-child relation\n var widgetsArray = $.makeArray(widgets);\n widgetsArray.sort(containmentComparer);\n\n // resize widgets\n $.each(widgetsArray, function() {\n var widget = kendo.widgetInstance($(this));\n if (widget) {\n widget.resize(force);\n }\n });\n };\n\n kendo.parseOptions = parseOptions;\n\n extend(kendo.ui, {\n Widget: Widget,\n DataBoundWidget: DataBoundWidget,\n roles: {},\n progress: function(container, toggle, options) {\n var mask = container.find(\".k-loading-mask\"),\n support = kendo.support,\n browser = support.browser,\n isRtl, leftRight, webkitCorrection, containerScrollLeft, cssClass;\n\n options = $.extend({}, {\n width: \"100%\",\n height: \"100%\",\n top: container.scrollTop(),\n opacity: false\n }, options);\n\n cssClass = options.opacity ? 'k-loading-mask k-opaque' : 'k-loading-mask';\n\n if (toggle) {\n if (!mask.length) {\n isRtl = support.isRtl(container);\n leftRight = isRtl ? \"right\" : \"left\";\n containerScrollLeft = kendo.scrollLeft(container);\n webkitCorrection = browser.webkit ? (!isRtl ? 0 : container[0].scrollWidth - container.width() - 2 * containerScrollLeft) : 0;\n\n mask = $(kendo.format(\"
{1}
\", cssClass, kendo.ui.progress.messages.loading))\n .width(options.width).height(options.height)\n .css(\"top\", options.top)\n .css(leftRight, Math.abs(containerScrollLeft) + webkitCorrection)\n .prependTo(container);\n }\n } else if (mask) {\n mask.remove();\n }\n },\n plugin: function(widget, register, prefix) {\n var name = widget.fn.options.name,\n getter;\n\n register = register || kendo.ui;\n prefix = prefix || \"\";\n\n register[name] = widget;\n\n register.roles[name.toLowerCase()] = widget;\n\n getter = \"getKendo\" + prefix + name;\n name = \"kendo\" + prefix + name;\n\n var widgetEntry = { name: name, widget: widget, prefix: prefix || \"\" };\n kendo.widgets.push(widgetEntry);\n\n for (var i = 0, len = kendo._widgetRegisteredCallbacks.length; i < len; i++) {\n kendo._widgetRegisteredCallbacks[i](widgetEntry);\n }\n\n $.fn[name] = function(options) {\n var value = this,\n args;\n\n if (typeof options === STRING) {\n args = slice.call(arguments, 1);\n\n this.each(function() {\n var widget = $.data(this, name),\n method,\n result;\n\n if (!widget) {\n throw new Error(kendo.format(\"Cannot call method '{0}' of {1} before it is initialized\", options, name));\n }\n\n method = widget[options];\n\n if (typeof method !== FUNCTION) {\n throw new Error(kendo.format(\"Cannot find method '{0}' of {1}\", options, name));\n }\n\n result = method.apply(widget, args);\n\n if (result !== undefined$1) {\n value = result;\n return false;\n }\n });\n } else {\n this.each(function() {\n return new widget(this, options);\n });\n }\n\n return value;\n };\n\n $.fn[name].widget = widget;\n\n $.fn[getter] = function() {\n return this.data(name);\n };\n }\n });\n\n kendo.ui.progress.messages = {\n loading: \"Loading...\"\n };\n\n var ContainerNullObject = { bind: function() { return this; }, nullObject: true, options: {} };\n\n var MobileWidget = Widget.extend({\n init: function(element, options) {\n Widget.fn.init.call(this, element, options);\n this.element.autoApplyNS();\n this.wrapper = this.element;\n this.element.addClass(\"km-widget\");\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n this.element.kendoDestroy();\n },\n\n options: {\n prefix: \"Mobile\"\n },\n\n events: [],\n\n view: function() {\n var viewElement = this.element.closest(kendo.roleSelector(\"view splitview modalview drawer\"));\n return kendo.widgetInstance(viewElement, kendo.mobile.ui) || ContainerNullObject;\n },\n\n viewHasNativeScrolling: function() {\n var view = this.view();\n return view && view.options.useNativeScrolling;\n },\n\n container: function() {\n var element = this.element.closest(kendo.roleSelector(\"view layout modalview drawer splitview\"));\n return kendo.widgetInstance(element.eq(0), kendo.mobile.ui) || ContainerNullObject;\n }\n });\n\n extend(kendo.mobile, {\n init: function(element) {\n kendo.init(element, kendo.mobile.ui, kendo.ui, kendo.dataviz.ui);\n },\n\n roles: {},\n\n ui: {\n Widget: MobileWidget,\n DataBoundWidget: DataBoundWidget.extend(MobileWidget.prototype),\n roles: {},\n plugin: function(widget) {\n kendo.ui.plugin(widget, kendo.mobile.ui, \"Mobile\");\n }\n }\n });\n\n deepExtend(kendo.dataviz, {\n init: function(element) {\n kendo.init(element, kendo.dataviz.ui);\n },\n ui: {\n roles: {},\n themes: {},\n views: [],\n plugin: function(widget) {\n kendo.ui.plugin(widget, kendo.dataviz.ui);\n }\n },\n roles: {}\n });\n\n kendo.touchScroller = function(elements, options) {\n // return the first touch scroller\n if (!options) { options = {}; }\n\n options.useNative = true;\n\n return $(elements).map(function(idx, element) {\n element = $(element);\n if (support.kineticScrollNeeded && kendo.mobile.ui.Scroller && !element.data(\"kendoMobileScroller\")) {\n element.kendoMobileScroller(options);\n return element.data(\"kendoMobileScroller\");\n } else {\n return false;\n }\n })[0];\n };\n\n kendo.preventDefault = function(e) {\n e.preventDefault();\n };\n\n kendo.widgetInstance = function(element, suites) {\n var role = element.data(kendo.ns + \"role\"),\n widgets = [], i, length,\n elementData = element.data(\"kendoView\");\n\n if (role) {\n // HACK!!! mobile view scroller widgets are instantiated on data-role=\"content\" elements. We need to discover them when resizing.\n if (role === \"content\") {\n role = \"scroller\";\n }\n\n // kendo.View is not a ui plugin\n\n if (role === \"view\" && elementData) {\n return elementData;\n }\n\n if (suites) {\n if (suites[0]) {\n for (i = 0, length = suites.length; i < length; i ++) {\n widgets.push(suites[i].roles[role]);\n }\n } else {\n widgets.push(suites.roles[role]);\n }\n }\n else {\n widgets = [ kendo.ui.roles[role], kendo.dataviz.ui.roles[role], kendo.mobile.ui.roles[role] ];\n }\n\n if (role.indexOf(\".\") >= 0) {\n widgets = [ kendo.getter(role)(window) ];\n }\n\n for (i = 0, length = widgets.length; i < length; i ++) {\n var widget = widgets[i];\n if (widget) {\n var instance = element.data(\"kendo\" + widget.fn.options.prefix + widget.fn.options.name);\n if (instance) {\n return instance;\n }\n }\n }\n }\n };\n\n kendo.onResize = function(callback) {\n var handler = callback;\n if (support.mobileOS.android) {\n handler = function() { setTimeout(callback, 600); };\n }\n\n $(window).on(support.resize, handler);\n return handler;\n };\n\n kendo.unbindResize = function(callback) {\n $(window).off(support.resize, callback);\n };\n\n kendo.attrValue = function(element, key) {\n return element.data(kendo.ns + key);\n };\n\n kendo.days = {\n Sunday: 0,\n Monday: 1,\n Tuesday: 2,\n Wednesday: 3,\n Thursday: 4,\n Friday: 5,\n Saturday: 6\n };\n\n function focusable(element, isTabIndexNotNaN) {\n var nodeName = element.nodeName.toLowerCase();\n\n return (/input|select|textarea|button|object/.test(nodeName) ?\n !element.disabled :\n nodeName === \"a\" ?\n element.href || isTabIndexNotNaN :\n isTabIndexNotNaN\n ) &&\n visible(element);\n }\n\n function visible(element) {\n return $.expr.pseudos.visible(element) &&\n !$(element).parents().addBack().filter(function() {\n return $.css(this,\"visibility\") === \"hidden\";\n }).length;\n }\n\n $.extend($.expr.pseudos, {\n kendoFocusable: function(element) {\n var idx = $.attr(element, \"tabindex\");\n return focusable(element, !isNaN(idx) && idx > -1);\n }\n });\n\n var MOUSE_EVENTS = [\"mousedown\", \"mousemove\", \"mouseenter\", \"mouseleave\", \"mouseover\", \"mouseout\", \"mouseup\", \"click\"];\n var EXCLUDE_BUST_CLICK_SELECTOR = \"label, input, [data-rel=external]\";\n\n var MouseEventNormalizer = {\n setupMouseMute: function() {\n var idx = 0,\n length = MOUSE_EVENTS.length,\n element = document.documentElement;\n\n if (MouseEventNormalizer.mouseTrap || !support.eventCapture) {\n return;\n }\n\n MouseEventNormalizer.mouseTrap = true;\n\n MouseEventNormalizer.bustClick = false;\n MouseEventNormalizer.captureMouse = false;\n\n var handler = function(e) {\n if (MouseEventNormalizer.captureMouse) {\n if (e.type === \"click\") {\n if (MouseEventNormalizer.bustClick && !$(e.target).is(EXCLUDE_BUST_CLICK_SELECTOR)) {\n e.preventDefault();\n e.stopPropagation();\n }\n } else {\n e.stopPropagation();\n }\n }\n };\n\n for (; idx < length; idx++) {\n element.addEventListener(MOUSE_EVENTS[idx], handler, true);\n }\n },\n\n muteMouse: function(e) {\n MouseEventNormalizer.captureMouse = true;\n if (e.data.bustClick) {\n MouseEventNormalizer.bustClick = true;\n }\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n },\n\n unMuteMouse: function() {\n clearTimeout(MouseEventNormalizer.mouseTrapTimeoutID);\n MouseEventNormalizer.mouseTrapTimeoutID = setTimeout(function() {\n MouseEventNormalizer.captureMouse = false;\n MouseEventNormalizer.bustClick = false;\n }, 400);\n }\n };\n\n var eventMap = {\n down: \"touchstart mousedown\",\n move: \"mousemove touchmove\",\n up: \"mouseup touchend touchcancel\",\n cancel: \"mouseleave touchcancel\"\n };\n\n if (support.touch && (support.mobileOS.ios || support.mobileOS.android)) {\n eventMap = {\n down: \"touchstart\",\n move: \"touchmove\",\n up: \"touchend touchcancel\",\n cancel: \"touchcancel\"\n };\n } else if (support.pointers) {\n eventMap = {\n down: \"pointerdown\",\n move: \"pointermove\",\n up: \"pointerup\",\n cancel: \"pointercancel pointerleave\"\n };\n } else if (support.msPointers) {\n eventMap = {\n down: \"MSPointerDown\",\n move: \"MSPointerMove\",\n up: \"MSPointerUp\",\n cancel: \"MSPointerCancel MSPointerLeave\"\n };\n }\n\n if (support.msPointers && !(\"onmspointerenter\" in window)) { // IE10\n // Create MSPointerEnter/MSPointerLeave events using mouseover/out and event-time checks\n $.each({\n MSPointerEnter: \"MSPointerOver\",\n MSPointerLeave: \"MSPointerOut\"\n }, function( orig, fix ) {\n $.event.special[ orig ] = {\n delegateType: fix,\n bindType: fix,\n\n handle: function( event ) {\n var ret,\n target = this,\n related = event.relatedTarget,\n handleObj = event.handleObj;\n\n // For mousenter/leave call the handler if related is outside the target.\n // NB: No relatedTarget if the mouse left/entered the browser window\n if ( !related || (related !== target && !$.contains( target, related )) ) {\n event.type = handleObj.origType;\n ret = handleObj.handler.apply( this, arguments );\n event.type = fix;\n }\n return ret;\n }\n };\n });\n }\n\n\n var getEventMap = function(e) { return (eventMap[e] || e); },\n eventRegEx = /([^ ]+)/g;\n\n kendo.applyEventMap = function(events, ns) {\n events = events.replace(eventRegEx, getEventMap);\n\n if (ns) {\n events = events.replace(eventRegEx, \"$1.\" + ns);\n }\n\n return events;\n };\n\n kendo.keyDownHandler = function(e, widget) {\n var events = widget._events.kendoKeydown;\n\n if (!events) {\n return true;\n }\n\n events = events.slice();\n e.sender = widget;\n e.preventKendoKeydown = false;\n for (var idx = 0, length = events.length; idx < length; idx++) {\n events[idx].call(widget, e);\n }\n\n return !e.preventKendoKeydown;\n };\n\n var on = $.fn.on;\n\n function kendoJQuery(selector, context) {\n return new kendoJQuery.fn.init(selector, context);\n }\n\n noDepricateExtend(true, kendoJQuery, $);\n\n kendoJQuery.fn = kendoJQuery.prototype = new $();\n\n kendoJQuery.fn.constructor = kendoJQuery;\n\n kendoJQuery.fn.init = function(selector, context) {\n if (context && context instanceof $ && !(context instanceof kendoJQuery)) {\n context = kendoJQuery(context);\n }\n\n return $.fn.init.call(this, selector, context, rootjQuery);\n };\n\n kendoJQuery.fn.init.prototype = kendoJQuery.fn;\n\n var rootjQuery = kendoJQuery(document);\n\n extend(kendoJQuery.fn, {\n handler: function(handler) {\n this.data(\"handler\", handler);\n return this;\n },\n\n autoApplyNS: function(ns) {\n this.data(\"kendoNS\", ns || kendo.guid());\n return this;\n },\n\n on: function() {\n var that = this,\n ns = that.data(\"kendoNS\");\n\n // support for event map signature\n if (arguments.length === 1) {\n return on.call(that, arguments[0]);\n }\n\n var context = that,\n args = slice.call(arguments);\n\n if (typeof args[args.length - 1] === UNDEFINED) {\n args.pop();\n }\n\n var callback = args[args.length - 1],\n events = kendo.applyEventMap(args[0], ns);\n\n // setup mouse trap\n if (support.mouseAndTouchPresent && events.search(/mouse|click/) > -1 && this[0] !== document.documentElement) {\n MouseEventNormalizer.setupMouseMute();\n\n var selector = args.length === 2 ? null : args[1],\n bustClick = events.indexOf(\"click\") > -1 && events.indexOf(\"touchend\") > -1;\n\n on.call(this,\n {\n touchstart: MouseEventNormalizer.muteMouse,\n touchend: MouseEventNormalizer.unMuteMouse\n },\n selector,\n {\n bustClick: bustClick\n });\n }\n\n if (arguments[0].indexOf(\"keydown\") !== -1 && args[1] && args[1].options) {\n args[0] = events;\n var widget = args[1];\n var keyDownCallBack = args[args.length - 1];\n args[args.length - 1] = function(e) {\n if (kendo.keyDownHandler(e, widget)) {\n return keyDownCallBack.apply(this, [e]);\n }\n };\n on.apply(that, args);\n return that;\n }\n\n if (typeof callback === STRING) {\n context = that.data(\"handler\");\n callback = context[callback];\n\n args[args.length - 1] = function(e) {\n callback.call(context, e);\n };\n }\n\n args[0] = events;\n\n on.apply(that, args);\n\n return that;\n },\n\n kendoDestroy: function(ns) {\n ns = ns || this.data(\"kendoNS\");\n\n if (ns) {\n this.off(\".\" + ns);\n }\n\n return this;\n }\n });\n\n kendo.jQuery = kendoJQuery;\n kendo.eventMap = eventMap;\n\n kendo.timezone = (function() {\n var months = { Jan: 0, Feb: 1, Mar: 2, Apr: 3, May: 4, Jun: 5, Jul: 6, Aug: 7, Sep: 8, Oct: 9, Nov: 10, Dec: 11 };\n var days = { Sun: 0, Mon: 1, Tue: 2, Wed: 3, Thu: 4, Fri: 5, Sat: 6 };\n\n function ruleToDate(year, rule) {\n var date;\n var targetDay;\n var ourDay;\n var month = rule[3];\n var on = rule[4];\n var time = rule[5];\n var cache = rule[8];\n\n if (!cache) {\n rule[8] = cache = {};\n }\n\n if (cache[year]) {\n return cache[year];\n }\n\n if (!isNaN(on)) {\n date = new Date(Date.UTC(year, months[month], on, time[0], time[1], time[2], 0));\n } else if (on.indexOf(\"last\") === 0) {\n date = new Date(Date.UTC(year, months[month] + 1, 1, time[0] - 24, time[1], time[2], 0));\n\n targetDay = days[on.substr(4, 3)];\n ourDay = date.getUTCDay();\n\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n } else if (on.indexOf(\">=\") >= 0) {\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n\n targetDay = days[on.substr(0, 3)];\n ourDay = date.getUTCDay();\n\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay + (targetDay < ourDay ? 7 : 0));\n } else if (on.indexOf(\"<=\") >= 0) {\n date = new Date(Date.UTC(year, months[month], on.substr(5), time[0], time[1], time[2], 0));\n\n targetDay = days[on.substr(0, 3)];\n ourDay = date.getUTCDay();\n\n date.setUTCDate(date.getUTCDate() + targetDay - ourDay - (targetDay > ourDay ? 7 : 0));\n }\n\n return cache[year] = date;\n }\n\n function findRule(utcTime, rules, zone) {\n rules = rules[zone];\n\n if (!rules) {\n var time = zone.split(\":\");\n var offset = 0;\n\n if (time.length > 1) {\n offset = time[0] * 60 + Number(time[1]);\n }\n\n return [-1000000, 'max', '-', 'Jan', 1, [0, 0, 0], offset, '-'];\n }\n\n var year = new Date(utcTime).getUTCFullYear();\n\n rules = jQuery.grep(rules, function(rule) {\n var from = rule[0];\n var to = rule[1];\n\n return from <= year && (to >= year || (from == year && to == \"only\") || to == \"max\");\n });\n\n rules.push(utcTime);\n\n rules.sort(function(a, b) {\n if (typeof a != \"number\") {\n a = Number(ruleToDate(year, a));\n }\n\n if (typeof b != \"number\") {\n b = Number(ruleToDate(year, b));\n }\n\n return a - b;\n });\n\n var rule = rules[jQuery.inArray(utcTime, rules) - 1] || rules[rules.length - 1];\n\n return isNaN(rule) ? rule : null;\n }\n\n function findZone(utcTime, zones, timezone) {\n var zoneRules = zones[timezone];\n\n if (typeof zoneRules === \"string\") {\n zoneRules = zones[zoneRules];\n }\n\n if (!zoneRules) {\n throw new Error('Timezone \"' + timezone + '\" is either incorrect, or kendo.timezones.min.js is not included.');\n }\n\n for (var idx = zoneRules.length - 1; idx >= 0; idx--) {\n var until = zoneRules[idx][3];\n\n if (until && utcTime > until) {\n break;\n }\n }\n\n var zone = zoneRules[idx + 1];\n\n if (!zone) {\n throw new Error('Timezone \"' + timezone + '\" not found on ' + utcTime + \".\");\n }\n\n return zone;\n }\n\n function zoneAndRule(utcTime, zones, rules, timezone) {\n if (typeof utcTime != NUMBER) {\n utcTime = Date.UTC(utcTime.getFullYear(), utcTime.getMonth(),\n utcTime.getDate(), utcTime.getHours(), utcTime.getMinutes(),\n utcTime.getSeconds(), utcTime.getMilliseconds());\n }\n\n var zone = findZone(utcTime, zones, timezone);\n\n return {\n zone: zone,\n rule: findRule(utcTime, rules, zone[1])\n };\n }\n\n function offset(utcTime, timezone) {\n if (timezone == \"Etc/UTC\" || timezone == \"Etc/GMT\") {\n return 0;\n }\n\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n var zone = info.zone;\n var rule = info.rule;\n\n return kendo.parseFloat(rule ? zone[0] - rule[6] : zone[0]);\n }\n\n function abbr(utcTime, timezone) {\n var info = zoneAndRule(utcTime, this.zones, this.rules, timezone);\n var zone = info.zone;\n var rule = info.rule;\n\n var base = zone[2];\n\n if (base.indexOf(\"/\") >= 0) {\n return base.split(\"/\")[rule && +rule[6] ? 1 : 0];\n } else if (base.indexOf(\"%s\") >= 0) {\n return base.replace(\"%s\", (!rule || rule[7] == \"-\") ? '' : rule[7]);\n }\n\n return base;\n }\n\n function convert(date, fromOffset, toOffset) {\n var tempToOffset = toOffset;\n var diff;\n\n if (typeof fromOffset == STRING) {\n fromOffset = this.offset(date, fromOffset);\n }\n\n if (typeof toOffset == STRING) {\n toOffset = this.offset(date, toOffset);\n }\n\n var fromLocalOffset = date.getTimezoneOffset();\n\n date = new Date(date.getTime() + (fromOffset - toOffset) * 60000);\n\n var toLocalOffset = date.getTimezoneOffset();\n\n if (typeof tempToOffset == STRING) {\n tempToOffset = this.offset(date, tempToOffset);\n }\n\n diff = (toLocalOffset - fromLocalOffset) + (toOffset - tempToOffset);\n\n return new Date(date.getTime() + diff * 60000);\n }\n\n function apply(date, timezone) {\n return this.convert(date, date.getTimezoneOffset(), timezone);\n }\n\n function remove(date, timezone) {\n return this.convert(date, timezone, date.getTimezoneOffset());\n }\n\n function toLocalDate(time) {\n return this.apply(new Date(time), \"Etc/UTC\");\n }\n\n return {\n zones: {},\n rules: {},\n offset: offset,\n convert: convert,\n apply: apply,\n remove: remove,\n abbr: abbr,\n toLocalDate: toLocalDate\n };\n })();\n\n kendo.date = (function() {\n var MS_PER_MINUTE = 60000,\n MS_PER_DAY = 86400000;\n\n function adjustDST(date, hours) {\n if (hours === 0 && date.getHours() === 23) {\n date.setHours(date.getHours() + 2);\n return true;\n }\n\n return false;\n }\n\n function setDayOfWeek(date, day, dir) {\n var hours = date.getHours();\n\n dir = dir || 1;\n day = ((day - date.getDay()) + (7 * dir)) % 7;\n\n date.setDate(date.getDate() + day);\n adjustDST(date, hours);\n }\n\n function dayOfWeek(date, day, dir) {\n date = new Date(date);\n setDayOfWeek(date, day, dir);\n return date;\n }\n\n function firstDayOfMonth(date) {\n return new Date(\n date.getFullYear(),\n date.getMonth(),\n 1\n );\n }\n\n function lastDayOfMonth(date) {\n var last = new Date(date.getFullYear(), date.getMonth() + 1, 0),\n first = firstDayOfMonth(date),\n timeOffset = Math.abs(last.getTimezoneOffset() - first.getTimezoneOffset());\n\n if (timeOffset) {\n last.setHours(first.getHours() + (timeOffset / 60));\n }\n\n return last;\n }\n\n function firstDayOfYear(date) {\n return new Date(date.getFullYear(), 0, 1);\n }\n\n function lastDayOfYear(date) {\n return new Date(date.getFullYear(), 11, 31);\n }\n\n function moveDateToWeekStart(date, weekStartDay) {\n if (weekStartDay !== 1) {\n return addDays(dayOfWeek(date, weekStartDay, -1), 4);\n }\n\n return addDays(date, (4 - (date.getDay() || 7)));\n }\n\n function calcWeekInYear(date, weekStartDay) {\n var firstWeekInYear = new Date(date.getFullYear(), 0, 1, -6);\n\n var newDate = moveDateToWeekStart(date, weekStartDay);\n\n var diffInMS = newDate.getTime() - firstWeekInYear.getTime();\n\n var days = Math.floor(diffInMS / MS_PER_DAY);\n\n return 1 + Math.floor(days / 7);\n }\n\n function weekInYear(date, weekStartDay) {\n if (weekStartDay === undefined$1) {\n weekStartDay = kendo.culture().calendar.firstDay;\n }\n\n var prevWeekDate = addDays(date, -7);\n var nextWeekDate = addDays(date, 7);\n\n var weekNumber = calcWeekInYear(date, weekStartDay);\n\n if (weekNumber === 0) {\n return calcWeekInYear(prevWeekDate, weekStartDay) + 1;\n }\n\n if (weekNumber === 53 && calcWeekInYear(nextWeekDate, weekStartDay) > 1) {\n return 1;\n }\n\n return weekNumber;\n }\n\n function getDate(date) {\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), 0, 0, 0);\n adjustDST(date, 0);\n return date;\n }\n\n function toUtcTime(date) {\n return Date.UTC(date.getFullYear(), date.getMonth(),\n date.getDate(), date.getHours(), date.getMinutes(),\n date.getSeconds(), date.getMilliseconds());\n }\n\n function getMilliseconds(date) {\n return toInvariantTime(date).getTime() - getDate(toInvariantTime(date));\n }\n\n function isInTimeRange(value, min, max) {\n var msMin = getMilliseconds(min),\n msMax = getMilliseconds(max),\n msValue;\n\n if (!value || msMin == msMax) {\n return true;\n }\n\n if (min >= max) {\n max += MS_PER_DAY;\n }\n\n msValue = getMilliseconds(value);\n\n if (msMin > msValue) {\n msValue += MS_PER_DAY;\n }\n\n if (msMax < msMin) {\n msMax += MS_PER_DAY;\n }\n\n return msValue >= msMin && msValue <= msMax;\n }\n\n function isInDateRange(value, min, max) {\n var msMin = min.getTime(),\n msMax = max.getTime(),\n msValue;\n\n if (msMin >= msMax) {\n msMax += MS_PER_DAY;\n }\n\n msValue = value.getTime();\n\n return msValue >= msMin && msValue <= msMax;\n }\n\n function addDays(date, offset) {\n var hours = date.getHours();\n date = new Date(date);\n\n setTime(date, offset * MS_PER_DAY);\n adjustDST(date, hours);\n return date;\n }\n\n function setTime(date, milliseconds, ignoreDST) {\n var offset = date.getTimezoneOffset();\n var difference;\n\n date.setTime(date.getTime() + milliseconds);\n\n if (!ignoreDST) {\n difference = date.getTimezoneOffset() - offset;\n date.setTime(date.getTime() + difference * MS_PER_MINUTE);\n }\n }\n\n function setHours(date, time) {\n date = new Date(date.getFullYear(), date.getMonth(), date.getDate(), time.getHours(), time.getMinutes(), time.getSeconds(), time.getMilliseconds());\n adjustDST(date, time.getHours());\n return date;\n }\n\n function today() {\n return getDate(new Date());\n }\n\n function isToday(date) {\n return getDate(date).getTime() == today().getTime();\n }\n\n function toInvariantTime(date) {\n var staticDate = new Date(1980, 1, 1, 0, 0, 0);\n\n if (date) {\n staticDate.setHours(date.getHours(), date.getMinutes(), date.getSeconds(), date.getMilliseconds());\n }\n\n return staticDate;\n }\n\n function addYear(date, offset) {\n var currentDate = new Date(date);\n\n return new Date(currentDate.setFullYear(currentDate.getFullYear() + offset));\n }\n\n function addLiteral(parts, value) {\n var lastPart = parts[parts.length - 1];\n if (lastPart && lastPart.type === \"LITERAL\") {\n lastPart.pattern += value;\n } else {\n parts.push({\n type: \"literal\",\n pattern: value\n });\n }\n }\n\n function isHour12(pattern) {\n return pattern === \"h\" || pattern === \"K\";\n }\n\n function dateNameType(formatLength) {\n var nameType;\n if (formatLength <= 3) {\n nameType = \"abbreviated\";\n } else if (formatLength === 4) {\n nameType = \"wide\";\n } else if (formatLength === 5) {\n nameType = \"narrow\";\n }\n\n return nameType;\n }\n\n function startsWith(text, searchString, position) {\n position = position || 0;\n return text.indexOf(searchString, position) === position;\n }\n\n function datePattern(format, info) {\n var calendar = info.calendar;\n var result;\n if (typeof format === \"string\") {\n if (calendar.patterns[format]) {\n result = calendar.patterns[format];\n } else {\n result = format;\n }\n }\n\n if (!result) {\n result = calendar.patterns.d;\n }\n\n return result;\n }\n\n function splitDateFormat(format) {\n var info = kendo.culture();\n var pattern = datePattern(format, info).replace(\"dddd\", \"EEEE\").replace(\"tt\", \"aa\");\n var parts = [];\n var dateFormatRegExp = /d{1,2}|E{1,6}|e{1,6}|c{3,6}|c{1}|M{1,5}|L{1,5}|y{1,4}|H{1,2}|h{1,2}|k{1,2}|K{1,2}|m{1,2}|a{1,5}|s{1,2}|S{1,3}|t{1,2}|z{1,4}|Z{1,5}|x{1,5}|X{1,5}|G{1,5}|q{1,5}|Q{1,5}|\"[^\"]*\"|'[^']*'/g;\n\n var lastIndex = dateFormatRegExp.lastIndex = 0;\n var match = dateFormatRegExp.exec(pattern);\n var specifier;\n var type;\n var part;\n var names;\n var minLength;\n var patternLength;\n\n while (match) {\n var value = match[0];\n\n if (lastIndex < match.index) {\n addLiteral(parts, pattern.substring(lastIndex, match.index));\n }\n\n if (startsWith(value, '\"') || startsWith(value, \"'\")) {\n addLiteral(parts, value);\n } else {\n specifier = value[0];\n type = DATE_FIELD_MAP[specifier];\n part = {\n type: type,\n pattern: value\n };\n\n if (type === \"hour\") {\n part.hour12 = isHour12(value);\n }\n\n names = NAME_TYPES[type];\n\n if (names) {\n minLength = typeof names.minLength === \"number\" ? names.minLength : names.minLength[specifier];\n patternLength = value.length;\n\n if (patternLength >= minLength && value !== \"aa\") {\n part.names = {\n type: names.type,\n nameType: dateNameType(patternLength),\n standAlone: names.standAlone === specifier\n };\n }\n }\n\n parts.push(part);\n }\n\n lastIndex = dateFormatRegExp.lastIndex;\n match = dateFormatRegExp.exec(pattern);\n }\n\n if (lastIndex < pattern.length) {\n addLiteral(parts, pattern.substring(lastIndex));\n }\n\n return parts;\n }\n\n function dateFormatNames(options) {\n var type = options.type;\n var nameType = options.nameType;\n var info = kendo.culture();\n if (nameType === \"wide\") {\n nameType = \"names\";\n }\n if (nameType === \"abbreviated\") {\n nameType = \"namesAbbr\";\n }\n if (nameType === \"narrow\") {\n nameType = \"namesShort\";\n }\n var result = info.calendar[type][nameType];\n if (!result) {\n result = info.calendar[type][\"name\"];\n }\n return result;\n }\n\n function dateFieldName(options) {\n var info = kendo.culture();\n var dateFields = info.calendar.dateFields;\n var fieldNameInfo = dateFields[options.type] || {};\n\n return fieldNameInfo[options.nameType];\n }\n\n return {\n adjustDST: adjustDST,\n dayOfWeek: dayOfWeek,\n setDayOfWeek: setDayOfWeek,\n getDate: getDate,\n isInDateRange: isInDateRange,\n isInTimeRange: isInTimeRange,\n isToday: isToday,\n nextDay: function(date) {\n return addDays(date, 1);\n },\n previousDay: function(date) {\n return addDays(date, -1);\n },\n toUtcTime: toUtcTime,\n MS_PER_DAY: MS_PER_DAY,\n MS_PER_HOUR: 60 * MS_PER_MINUTE,\n MS_PER_MINUTE: MS_PER_MINUTE,\n setTime: setTime,\n setHours: setHours,\n addDays: addDays,\n today: today,\n toInvariantTime: toInvariantTime,\n firstDayOfMonth: firstDayOfMonth,\n splitDateFormat: splitDateFormat,\n dateFieldName: dateFieldName,\n dateFormatNames: dateFormatNames,\n lastDayOfMonth: lastDayOfMonth,\n weekInYear: weekInYear,\n getMilliseconds: getMilliseconds,\n firstDayOfYear: firstDayOfYear,\n lastDayOfYear: lastDayOfYear,\n nextYear: function(date) {\n return addYear(date, 1);\n },\n previousYear: function(date) {\n return addYear(date, -1);\n }\n };\n })();\n\n\n kendo.stripWhitespace = function(element) {\n if (document.createNodeIterator) {\n var iterator = document.createNodeIterator(element, NodeFilter.SHOW_TEXT, function(node) {\n return node.parentNode == element ? NodeFilter.FILTER_ACCEPT : NodeFilter.FILTER_REJECT;\n }, false);\n\n while (iterator.nextNode()) {\n if (iterator.referenceNode && !iterator.referenceNode.textContent.trim()) {\n iterator.referenceNode.parentNode.removeChild(iterator.referenceNode);\n }\n }\n } else { // IE7/8 support\n for (var i = 0; i < element.childNodes.length; i++) {\n var child = element.childNodes[i];\n\n if (child.nodeType == 3 && !/\\S/.test(child.nodeValue)) {\n element.removeChild(child);\n i--;\n }\n\n if (child.nodeType == 1) {\n kendo.stripWhitespace(child);\n }\n }\n }\n };\n\n var animationFrame = window.requestAnimationFrame ||\n window.webkitRequestAnimationFrame ||\n window.mozRequestAnimationFrame ||\n window.oRequestAnimationFrame ||\n window.msRequestAnimationFrame ||\n function(callback) { setTimeout(callback, 1000 / 60); };\n\n kendo.animationFrame = function(callback) {\n animationFrame.call(window, callback);\n };\n\n var animationQueue = [];\n\n kendo.queueAnimation = function(callback) {\n animationQueue[animationQueue.length] = callback;\n if (animationQueue.length === 1) {\n kendo.runNextAnimation();\n }\n };\n\n kendo.runNextAnimation = function() {\n kendo.animationFrame(function() {\n if (animationQueue[0]) {\n animationQueue.shift()();\n if (animationQueue[0]) {\n kendo.runNextAnimation();\n }\n }\n });\n };\n\n kendo.parseQueryStringParams = function(url) {\n var queryString = url.split('?')[1] || \"\",\n params = {},\n paramParts = queryString.split(/&|=/),\n length = paramParts.length,\n idx = 0;\n\n for (; idx < length; idx += 2) {\n if (paramParts[idx] !== \"\") {\n params[decodeURIComponent(paramParts[idx])] = decodeURIComponent(paramParts[idx + 1]);\n }\n }\n\n return params;\n };\n\n kendo.elementUnderCursor = function(e) {\n if (typeof e.x.client != \"undefined\") {\n return document.elementFromPoint(e.x.client, e.y.client);\n }\n };\n\n kendo.wheelDeltaY = function(jQueryEvent) {\n var e = jQueryEvent.originalEvent,\n deltaY = e.wheelDeltaY,\n delta;\n\n if (e.wheelDelta) { // Webkit and IE\n if (deltaY === undefined$1 || deltaY) { // IE does not have deltaY, thus always scroll (horizontal scrolling is treated as vertical)\n delta = e.wheelDelta;\n }\n } else if (e.detail && e.axis === e.VERTICAL_AXIS) { // Firefox and Opera\n delta = (-e.detail) * 10;\n }\n\n return delta;\n };\n\n kendo.throttle = function(fn, delay) {\n var timeout;\n var lastExecTime = 0;\n\n if (!delay || delay <= 0) {\n return fn;\n }\n\n var throttled = function() {\n var that = this;\n var elapsed = +new Date() - lastExecTime;\n var args = arguments;\n\n function exec() {\n fn.apply(that, args);\n lastExecTime = +new Date();\n }\n\n // first execution\n if (!lastExecTime) {\n return exec();\n }\n\n if (timeout) {\n clearTimeout(timeout);\n }\n\n if (elapsed > delay) {\n exec();\n } else {\n timeout = setTimeout(exec, delay - elapsed);\n }\n };\n\n throttled.cancel = function() {\n clearTimeout(timeout);\n };\n\n return throttled;\n };\n\n\n kendo.caret = function(element, start, end) {\n var rangeElement;\n var isPosition = start !== undefined$1;\n\n if (end === undefined$1) {\n end = start;\n }\n\n if (element[0]) {\n element = element[0];\n }\n\n if (isPosition && element.disabled) {\n return;\n }\n\n try {\n if (element.selectionStart !== undefined$1) {\n if (isPosition) {\n element.focus();\n var mobile = support.mobileOS;\n if (mobile.wp || mobile.android) {// without the timeout the caret is at the end of the input\n setTimeout(function() { element.setSelectionRange(start, end); }, 0);\n }\n else {\n element.setSelectionRange(start, end);\n }\n } else {\n start = [element.selectionStart, element.selectionEnd];\n }\n } else if (document.selection) {\n if ($(element).is(\":visible\")) {\n element.focus();\n }\n\n rangeElement = element.createTextRange();\n\n if (isPosition) {\n rangeElement.collapse(true);\n rangeElement.moveStart(\"character\", start);\n rangeElement.moveEnd(\"character\", end - start);\n rangeElement.select();\n } else {\n var rangeDuplicated = rangeElement.duplicate(),\n selectionStart, selectionEnd;\n\n rangeElement.moveToBookmark(document.selection.createRange().getBookmark());\n rangeDuplicated.setEndPoint('EndToStart', rangeElement);\n selectionStart = rangeDuplicated.text.length;\n selectionEnd = selectionStart + rangeElement.text.length;\n\n start = [selectionStart, selectionEnd];\n }\n }\n } catch (e) {\n /* element is not focused or it is not in the DOM */\n start = [];\n }\n\n return start;\n };\n\n kendo.antiForgeryTokens = function() {\n var tokens = { },\n csrf_token = $(\"meta[name=csrf-token],meta[name=_csrf]\").attr(\"content\"),\n csrf_param = $(\"meta[name=csrf-param],meta[name=_csrf_header]\").attr(\"content\");\n\n $(\"input[name^='__RequestVerificationToken']\").each(function() {\n tokens[this.name] = this.value;\n });\n\n if (csrf_param !== undefined$1 && csrf_token !== undefined$1) {\n tokens[csrf_param] = csrf_token;\n }\n\n return tokens;\n };\n\n kendo.cycleForm = function(form) {\n var firstElement = form.find(\"input, .k-widget, .k-dropdownlist, .k-combobox\").first();\n var lastElement = form.find(\"button, .k-button\").last();\n\n function focus(el) {\n var widget = kendo.widgetInstance(el);\n\n if (widget && widget.focus) {\n widget.focus();\n } else {\n el.trigger(\"focus\");\n }\n }\n\n lastElement.on(\"keydown\", function(e) {\n if (e.keyCode == kendo.keys.TAB && !e.shiftKey) {\n e.preventDefault();\n focus(firstElement);\n }\n });\n\n firstElement.on(\"keydown\", function(e) {\n if (e.keyCode == kendo.keys.TAB && e.shiftKey) {\n e.preventDefault();\n focus(lastElement);\n }\n });\n };\n\n kendo.focusElement = function(element) {\n var scrollTopPositions = [];\n var scrollableParents = element.parentsUntil(\"body\")\n .filter(function(index, element) {\n var computedStyle = kendo.getComputedStyles(element, [\"overflow\"]);\n return computedStyle.overflow !== \"visible\";\n })\n .add(window);\n\n scrollableParents.each(function(index, parent) {\n scrollTopPositions[index] = $(parent).scrollTop();\n });\n\n try {\n //The setActive method does not cause the document to scroll to the active object in the current page\n element[0].setActive();\n } catch (e) {\n element[0].focus();\n }\n\n scrollableParents.each(function(index, parent) {\n $(parent).scrollTop(scrollTopPositions[index]);\n });\n };\n\n kendo.focusNextElement = function() {\n if (document.activeElement) {\n var focussable = $(\":kendoFocusable\");\n var index = focussable.index(document.activeElement);\n\n if (index > -1) {\n var nextElement = focussable[index + 1] || focussable[0];\n nextElement.focus();\n }\n }\n };\n\n kendo.trim = function(value) {\n if (!!value) {\n return value.toString().trim();\n } else {\n return \"\";\n }\n };\n\n kendo.getWidgetFocusableElement = function(element) {\n var nextFocusable = element.closest(\":kendoFocusable\"),\n widgetInstance = kendo.widgetInstance(element),\n target;\n\n if (nextFocusable.length) {\n target = nextFocusable;\n } else if (widgetInstance) {\n target = widgetInstance.options.name === 'Editor' ?\n $(widgetInstance.body) :\n widgetInstance.wrapper.find(\":kendoFocusable\").first();\n } else {\n target = element;\n }\n\n return target;\n };\n\n kendo.addAttribute = function(element, attribute, value) {\n var current = element.attr(attribute) || \"\";\n\n if (current.indexOf(value) < 0) {\n element.attr(attribute, (current + \" \" + value).trim());\n }\n };\n\n kendo.removeAttribute = function(element, attribute, value) {\n var current = element.attr(attribute) || \"\";\n\n element.attr(attribute, current.replace(value, \"\").trim());\n };\n\n kendo.toggleAttribute = function(element, attribute, value) {\n var current = element.attr(attribute) || \"\";\n\n if (current.indexOf(value) < 0) {\n kendo.addAttribute(element, attribute, value);\n } else {\n kendo.removeAttribute(element, attribute, value);\n }\n };\n\n kendo.matchesMedia = function(mediaQuery) {\n var media = kendo._bootstrapToMedia(mediaQuery) || mediaQuery;\n return support.matchMedia && window.matchMedia(media).matches;\n };\n\n kendo._bootstrapToMedia = function(bootstrapMedia) {\n return {\n \"xs\": \"(max-width: 576px)\",\n \"sm\": \"(min-width: 576px)\",\n \"md\": \"(min-width: 768px)\",\n \"lg\": \"(min-width: 992px)\",\n \"xl\": \"(min-width: 1200px)\"\n }[bootstrapMedia];\n };\n\n kendo.fileGroupMap = {\n audio: [\".aif\", \".iff\", \".m3u\", \".m4a\", \".mid\", \".mp3\", \".mpa\", \".wav\", \".wma\", \".ogg\", \".wav\", \".wma\", \".wpl\"],\n video: [\".3g2\", \".3gp\", \".avi\", \".asf\", \".flv\", \".m4u\", \".rm\", \".h264\", \".m4v\", \".mkv\", \".mov\", \".mp4\", \".mpg\",\n \".rm\", \".swf\", \".vob\", \".wmv\"],\n image: [\".ai\", \".dds\", \".heic\", \".jpe\", \"jfif\", \".jif\", \".jp2\", \".jps\", \".eps\", \".bmp\", \".gif\", \".jpeg\",\n \".jpg\", \".png\", \".ps\", \".psd\", \".svg\", \".svgz\", \".tif\", \".tiff\"],\n txt: [\".doc\", \".docx\", \".log\", \".pages\", \".tex\", \".wpd\", \".wps\", \".odt\", \".rtf\", \".text\", \".txt\", \".wks\"],\n presentation: [\".key\", \".odp\", \".pps\", \".ppt\", \".pptx\"],\n data: [\".xlr\", \".xls\", \".xlsx\"],\n programming: [\".tmp\", \".bak\", \".msi\", \".cab\", \".cpl\", \".cur\", \".dll\", \".dmp\", \".drv\", \".icns\", \".ico\", \".link\",\n \".sys\", \".cfg\", \".ini\", \".asp\", \".aspx\", \".cer\", \".csr\", \".css\", \".dcr\", \".htm\", \".html\", \".js\",\n \".php\", \".rss\", \".xhtml\"],\n pdf: [\".pdf\"],\n config: [\".apk\", \".app\", \".bat\", \".cgi\", \".com\", \".exe\", \".gadget\", \".jar\", \".wsf\"],\n zip: [\".7z\", \".cbr\", \".gz\", \".sitx\", \".arj\", \".deb\", \".pkg\", \".rar\", \".rpm\", \".tar.gz\", \".z\", \".zip\", \".zipx\"],\n \"disc-image\": [\".dmg\", \".iso\", \".toast\", \".vcd\", \".bin\", \".cue\", \".mdf\"]\n };\n\n kendo.getFileGroup = function(extension, withPrefix) {\n var fileTypeMap = kendo.fileGroupMap;\n var groups = Object.keys(fileTypeMap);\n var type = \"file\";\n\n if (extension === undefined$1 || !extension.length) {\n return type;\n }\n\n for (var i = 0; i < groups.length; i += 1) {\n var extensions = fileTypeMap[groups[i]];\n\n if (extensions.indexOf(extension.toLowerCase()) > -1) {\n return withPrefix ? \"file-\" + groups[i] : groups[i];\n }\n }\n\n return type;\n };\n\n kendo.getFileSizeMessage = function(size) {\n var sizes = ['Bytes', 'KB', 'MB', 'GB', 'TB'];\n\n if (size === 0) {\n return '0 Byte';\n }\n\n var i = parseInt(Math.floor(Math.log(size) / Math.log(1024)), 10);\n return Math.round(size / Math.pow(1024, i), 2) + ' ' + sizes[i];\n };\n\n kendo.selectorFromClasses = function(classes) {\n return \".\" + classes.split(\" \").join(\".\");\n };\n\n // Standardized Properties and CSS classes\n\n var themeColorValues = ['base', 'primary', 'secondary', 'tertiary', 'inherit', 'info', 'success', 'warning', 'error', 'dark', 'light', 'inverse'];\n var fillValues = ['solid', 'outline', 'flat'];\n //var postitionValues = ['edge', 'outside', 'inside'];\n var shapeValues = ['rectangle', 'square'];\n var sizeValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\n var roundedValues = [ ['small', 'sm'], ['medium', 'md'], ['large', 'lg'] ];\n //var alignValues = [ ['top start', 'top-start'], ['top end', 'top-end'], ['bottom start', 'bottom-start'], ['bottom end', 'bottom-end'] ];\n var positionModeValues = [ 'fixed', 'static', 'sticky', 'absolute' ];\n var resizeValues = [ ['both', 'resize'], ['horizontal', 'resize-x'], ['vertical', 'resize-y'] ];\n var overflowValues = [ 'auto', 'hidden', 'visible', 'scroll', 'clip' ];\n\n kendo.cssProperties = (function() {\n var defaultValues = {},\n propertyDictionary = {};\n\n function registerPrefix(widget, prefix) {\n var dict = kendo.cssProperties.propertyDictionary;\n\n if (!dict[widget]) {\n dict[widget] = {};\n }\n\n dict[widget][PREFIX] = prefix;\n }\n\n function registerValues(widget, args) {\n var dict = kendo.cssProperties.propertyDictionary,\n i, j, prop, values, newValues, currentValue;\n\n for (i = 0; i < args.length; i++) {\n prop = args[i].prop;\n newValues = args[i].values;\n\n if (!dict[widget][prop]) {\n dict[widget][prop] = {};\n }\n\n values = dict[widget][prop];\n\n for (j = 0; j < newValues.length; j++) {\n currentValue = newValues[j];\n\n if (isArray(newValues[j])) {\n values[currentValue[0]] = currentValue[1];\n } else {\n values[currentValue] = currentValue;\n }\n }\n }\n }\n\n function registerCssClass(propName, value, shorthand) {\n if (!defaultValues[propName]) {\n defaultValues[propName] = {};\n }\n\n defaultValues[propName][value] = shorthand || value;\n }\n\n function registerCssClasses(propName, arr) {\n for (var i = 0; i < arr.length; i++) {\n if (isArray(arr[i])) {\n registerCssClass(propName, arr[i][0], arr[i][1]);\n } else {\n registerCssClass(propName, arr[i]);\n }\n }\n }\n\n function getValidClass(args) {\n var widget = args.widget,\n propName = args.propName,\n value = args.value,\n fill = args.fill,\n cssProperties = kendo.cssProperties,\n defaultValues = cssProperties.defaultValues[propName],\n widgetProperties = cssProperties.propertyDictionary[widget],\n overridePrefix = args.prefix,\n widgetValues, validValue, prefix;\n\n if (!widgetProperties) {\n return \"\";\n }\n\n widgetValues = widgetProperties[propName];\n validValue = widgetValues ? widgetValues[value] || defaultValues[value] : defaultValues[value];\n\n if (validValue) {\n if (propName === \"themeColor\") {\n prefix = widgetProperties[PREFIX] + fill + \"-\";\n } else if (propName === \"positionMode\") {\n prefix = \"k-pos-\";\n } else if (propName === \"rounded\") {\n prefix = \"k-rounded-\";\n } else if (propName === \"resize\") {\n prefix = \"k-\";\n } else if (propName === \"overflow\") {\n prefix = \"k-overflow-\";\n } else {\n prefix = widgetProperties[PREFIX];\n }\n\n prefix = overridePrefix || prefix;\n\n return prefix + validValue;\n } else {\n return \"\";\n }\n }\n\n registerCssClasses(\"themeColor\", themeColorValues);\n registerCssClasses(\"fillMode\", fillValues);\n registerCssClasses(\"shape\", shapeValues);\n registerCssClasses(\"size\", sizeValues);\n registerCssClasses(\"positionMode\", positionModeValues);\n registerCssClasses(\"rounded\", roundedValues);\n registerCssClasses(\"resize\", resizeValues);\n registerCssClasses(\"overflow\", overflowValues);\n\n return {\n positionModeValues: positionModeValues,\n roundedValues: roundedValues,\n sizeValues: sizeValues,\n shapeValues: shapeValues,\n fillModeValues: fillValues,\n themeColorValues: themeColorValues,\n\n defaultValues: defaultValues,\n propertyDictionary: propertyDictionary,\n\n registerValues: registerValues,\n getValidClass: getValidClass,\n registerPrefix: registerPrefix\n };\n }());\n\n //To do: delete below after implementing new styles and classes for BottomNavigation\n kendo.registerCssClass = function(propName, value, shorthand) {\n if (!kendo.propertyToCssClassMap[propName]) {\n kendo.propertyToCssClassMap[propName] = {};\n }\n\n kendo.propertyToCssClassMap[propName][value] = shorthand || value;\n };\n\n kendo.registerCssClasses = function(propName, arr) {\n for (var i = 0; i < arr.length; i++) {\n if (isArray(arr[i])) {\n kendo.registerCssClass(propName, arr[i][0], arr[i][1]);\n } else {\n kendo.registerCssClass(propName, arr[i]);\n }\n }\n };\n\n kendo.getValidCssClass = function(prefix, propName, value) {\n var validValue = kendo.propertyToCssClassMap[propName][value];\n\n if (validValue) {\n return prefix + validValue;\n }\n };\n\n kendo.propertyToCssClassMap = {};\n\n kendo.registerCssClasses(\"themeColor\", themeColorValues);\n kendo.registerCssClasses(\"fill\", fillValues);\n //kendo.registerCssClasses(\"postition\", postitionValues);\n kendo.registerCssClasses(\"shape\", shapeValues);\n kendo.registerCssClasses(\"size\", sizeValues);\n //kendo.registerCssClasses(\"align\", alignValues);\n kendo.registerCssClasses(\"positionMode\", positionModeValues);\n\n kendo.applyStylesFromKendoAttributes = function(element, styleProps) {\n var selector = styleProps.map(function (styleProp){ return (\"[\" + (kendo.attr((\"style-\" + styleProp))) + \"]\"); }).join(',');\n element.find(selector).addBack(selector).each(function (_, currentElement) {\n var $currentElement = $(currentElement);\n styleProps.forEach(function(styleProp) {\n var kendoAttr = kendo.attr((\"style-\" + styleProp));\n if ($currentElement.attr(kendoAttr)) {\n $currentElement.css(styleProp, $currentElement.attr(kendoAttr));\n $currentElement.removeAttr(kendoAttr);\n }\n });\n });\n };\n\n // jQuery deferred helpers\n\n // influenced from: https://gist.github.com/fearphage/4341799\n kendo.whenAll = function(array) {\n var resolveValues = arguments.length == 1 && Array.isArray(array) ? array : Array.prototype.slice.call(arguments),\n length = resolveValues.length,\n remaining = length,\n deferred = $.Deferred(),\n i = 0,\n failed = 0,\n rejectContexts = Array(length),\n rejectValues = Array(length),\n resolveContexts = Array(length),\n value;\n\n function updateFunc(index, contexts, values) {\n return function() {\n if (values != resolveValues) {\n failed++;\n }\n\n deferred.notifyWith(\n contexts[index] = this,\n values[index] = Array.prototype.slice.call(arguments)\n );\n\n if (!(--remaining)) {\n deferred[(!failed ? 'resolve' : 'reject') + 'With'](contexts, values);\n }\n };\n }\n\n for (; i < length; i++) {\n if ((value = resolveValues[i]) && kendo.isFunction(value.promise)) {\n value.promise()\n .done(updateFunc(i, resolveContexts, resolveValues))\n .fail(updateFunc(i, rejectContexts, rejectValues));\n }\n\n else {\n deferred.notifyWith(this, value);\n --remaining;\n }\n }\n\n if (!remaining) {\n deferred.resolveWith(resolveContexts, resolveValues);\n }\n\n return deferred.promise();\n };\n\n // kendo.saveAs -----------------------------------------------\n (function() {\n function postToProxy(dataURI, fileName, proxyURL, proxyTarget) {\n var form = $(\"
\").attr({\n action: proxyURL,\n method: \"POST\",\n target: proxyTarget\n });\n\n var data = kendo.antiForgeryTokens();\n data.fileName = fileName;\n\n var parts = dataURI.split(\";base64,\");\n data.contentType = parts[0].replace(\"data:\", \"\");\n data.base64 = parts[1];\n\n for (var name in data) {\n if (data.hasOwnProperty(name)) {\n $('').attr({\n value: data[name],\n name: name,\n type: \"hidden\"\n }).appendTo(form);\n }\n }\n\n form.appendTo(\"body\").submit().remove();\n }\n\n var fileSaver = document.createElement(\"a\");\n var downloadAttribute = \"download\" in fileSaver && !kendo.support.browser.edge;\n\n function saveAsBlob(dataURI, fileName) {\n var blob = dataURI; // could be a Blob object\n\n if (typeof dataURI == \"string\") {\n var parts = dataURI.split(\";base64,\");\n var contentType = parts[0];\n var base64 = atob(parts[1]);\n var array = new Uint8Array(base64.length);\n\n for (var idx = 0; idx < base64.length; idx++) {\n array[idx] = base64.charCodeAt(idx);\n }\n blob = new Blob([array.buffer], { type: contentType });\n }\n\n navigator.msSaveBlob(blob, fileName);\n }\n\n function saveAsDataURI(dataURI, fileName) {\n if (window.Blob && dataURI instanceof Blob) {\n dataURI = URL.createObjectURL(dataURI);\n }\n\n fileSaver.download = fileName;\n fileSaver.href = dataURI;\n\n var e = document.createEvent(\"MouseEvents\");\n e.initMouseEvent(\"click\", true, false, window,\n 0, 0, 0, 0, 0, false, false, false, false, 0, null);\n\n fileSaver.dispatchEvent(e);\n setTimeout(function() {\n URL.revokeObjectURL(dataURI);\n });\n }\n\n kendo.saveAs = function(options) {\n var save = postToProxy;\n\n if (!options.forceProxy) {\n if (downloadAttribute) {\n save = saveAsDataURI;\n } else if (navigator.msSaveBlob) {\n save = saveAsBlob;\n }\n }\n\n save(options.dataURI, options.fileName, options.proxyURL, options.proxyTarget);\n };\n })();\n\n // kendo proxySetters\n kendo.proxyModelSetters = function proxyModelSetters(data) {\n var observable = {};\n\n Object.keys(data || {}).forEach(function(property) {\n Object.defineProperty(observable, property, {\n get: function() {\n return data[property];\n },\n set: function(value) {\n data[property] = value;\n data.dirty = true;\n }\n });\n });\n\n return observable;\n };\n\n kendo.getSeriesColors = function() {\n var seriesColorsTemplate = '
' +\n '
' +\n '
' +\n '
' +\n '
' +\n '
',\n series = $(seriesColorsTemplate),\n colors = [];\n\n series.appendTo($('body'));\n\n series.each(function(i, item) {\n colors.push($(item).css(\"background-color\"));\n });\n\n series.remove();\n\n return colors;\n };\n\n kendo.isElement = function(element) {\n return element instanceof Element || element instanceof HTMLDocument;\n };\n\n // Kendo defaults\n (function() {\n\n kendo.defaults = kendo.defaults || {};\n kendo.setDefaults = function(key, value) {\n var path = key.split(\".\");\n var curr = kendo.defaults;\n\n key = path.pop();\n\n path.forEach(function(part) {\n if (curr[part] === undefined$1) {\n curr[part] = {};\n }\n\n curr = curr[part];\n });\n\n if (value.constructor === Object) {\n curr[key] = deepExtend({}, curr[key], value);\n } else {\n curr[key] = value;\n }\n };\n\n // Use external global flags for templates.\n kendo.debugTemplates = window.DEBUG_KENDO_TEMPLATES;\n\n // Setup default mediaQuery breakpoints\n kendo.setDefaults('breakpoints', defaultBreakpoints);\n })();\n\n // Implement type() as it has been depricated in jQuery\n (function() {\n kendo.class2type = {};\n\n jQuery.each( \"Boolean Number String Function Array Date RegExp Object Error Symbol\".split( \" \" ),\n function( _i, name ) {\n kendo.class2type[ \"[object \" + name + \"]\" ] = name.toLowerCase();\n } );\n\n kendo.type = function(obj) {\n if ( obj == null ) {\n return obj + \"\";\n }\n\n // Support: Android <=2.3 only (functionish RegExp)\n return typeof obj === \"object\" || typeof obj === \"function\" ?\n kendo.class2type[Object.prototype.toString.call(obj)] || \"object\" :\n typeof obj;\n };\n }());\n\n var KendoLicensing = { validatePackage: function() {},setScriptKey: function() {} };\n\n window.KendoLicensing = {\n setScriptKey: KendoLicensing.setScriptKey\n };\n\n function validatePackage() {\n KendoLicensing.validatePackage(packageMetadata);\n }\n\n })(jQuery, window);\n var kendo$g = kendo;\n\n var __meta__$e = {\n id: \"fx\",\n name: \"Effects\",\n category: \"framework\",\n description: \"Required for animation effects in all Kendo UI widgets.\",\n depends: [ \"core\" ]\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n fx = kendo.effects,\n each = $.each,\n extend = $.extend,\n support = kendo.support,\n browser = support.browser,\n transforms = support.transforms,\n transitions = support.transitions,\n scaleProperties = { scale: 0, scalex: 0, scaley: 0, scale3d: 0 },\n translateProperties = { translate: 0, translatex: 0, translatey: 0, translate3d: 0 },\n hasZoom = (typeof document.documentElement.style.zoom !== \"undefined\") && !transforms,\n matrix3dRegExp = /matrix3?d?\\s*\\(.*,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?,\\s*([\\d\\.\\-]+)\\w*?/i,\n cssParamsRegExp = /^(-?[\\d\\.\\-]+)?[\\w\\s]*,?\\s*(-?[\\d\\.\\-]+)?[\\w\\s]*/i,\n translateXRegExp = /translatex?$/i,\n oldEffectsRegExp = /(zoom|fade|expand)(\\w+)/,\n singleEffectRegExp = /(zoom|fade|expand)/,\n unitRegExp = /[xy]$/i,\n transformProps = [\"perspective\", \"rotate\", \"rotatex\", \"rotatey\", \"rotatez\", \"rotate3d\", \"scale\", \"scalex\", \"scaley\", \"scalez\", \"scale3d\", \"skew\", \"skewx\", \"skewy\", \"translate\", \"translatex\", \"translatey\", \"translatez\", \"translate3d\", \"matrix\", \"matrix3d\"],\n transform2d = [\"rotate\", \"scale\", \"scalex\", \"scaley\", \"skew\", \"skewx\", \"skewy\", \"translate\", \"translatex\", \"translatey\", \"matrix\"],\n transform2units = { \"rotate\": \"deg\", scale: \"\", skew: \"px\", translate: \"px\" },\n cssPrefix = transforms.css,\n round = Math.round,\n BLANK = \"\",\n PX = \"px\",\n NONE = \"none\",\n AUTO = \"auto\",\n WIDTH = \"width\",\n HEIGHT = \"height\",\n HIDDEN = \"hidden\",\n ORIGIN = \"origin\",\n ABORT_ID = \"abortId\",\n OVERFLOW = \"overflow\",\n TRANSLATE = \"translate\",\n POSITION = \"position\",\n COMPLETE_CALLBACK = \"completeCallback\",\n TRANSITION = cssPrefix + \"transition\",\n TRANSFORM = cssPrefix + \"transform\",\n BACKFACE = cssPrefix + \"backface-visibility\",\n PERSPECTIVE = cssPrefix + \"perspective\",\n DEFAULT_PERSPECTIVE = \"1500px\",\n TRANSFORM_PERSPECTIVE = \"perspective(\" + DEFAULT_PERSPECTIVE + \")\",\n directions = {\n left: {\n reverse: \"right\",\n property: \"left\",\n transition: \"translatex\",\n vertical: false,\n modifier: -1\n },\n right: {\n reverse: \"left\",\n property: \"left\",\n transition: \"translatex\",\n vertical: false,\n modifier: 1\n },\n down: {\n reverse: \"up\",\n property: \"top\",\n transition: \"translatey\",\n vertical: true,\n modifier: 1\n },\n up: {\n reverse: \"down\",\n property: \"top\",\n transition: \"translatey\",\n vertical: true,\n modifier: -1\n },\n top: {\n reverse: \"bottom\"\n },\n bottom: {\n reverse: \"top\"\n },\n \"in\": {\n reverse: \"out\",\n modifier: -1\n },\n out: {\n reverse: \"in\",\n modifier: 1\n },\n\n vertical: {\n reverse: \"vertical\"\n },\n\n horizontal: {\n reverse: \"horizontal\"\n }\n };\n\n kendo.directions = directions;\n\n extend($.fn, {\n kendoStop: function(clearQueue, gotoEnd) {\n if (transitions) {\n return fx.stopQueue(this, clearQueue || false, gotoEnd || false);\n } else {\n return this.stop(clearQueue, gotoEnd);\n }\n }\n });\n\n /* jQuery support for all transform animations (FF 3.5/3.6, Opera 10.x, IE9 */\n\n if (transforms && !transitions) {\n each(transform2d, function(idx, value) {\n $.fn[value] = function(val) {\n if (typeof val == \"undefined\") {\n return animationProperty(this, value);\n } else {\n var that = $(this)[0],\n transformValue = value + \"(\" + val + transform2units[value.replace(unitRegExp, \"\")] + \")\";\n\n if (that.style.cssText.indexOf(TRANSFORM) == -1) {\n $(this).css(TRANSFORM, transformValue);\n } else {\n that.style.cssText = that.style.cssText.replace(new RegExp(value + \"\\\\(.*?\\\\)\", \"i\"), transformValue);\n }\n }\n return this;\n };\n\n $.fx.step[value] = function(fx) {\n $(fx.elem)[value](fx.now);\n };\n });\n\n var curProxy = $.fx.prototype.cur;\n $.fx.prototype.cur = function() {\n if (transform2d.indexOf(this.prop) != -1) {\n return parseFloat($(this.elem)[this.prop]());\n }\n\n return curProxy.apply(this, arguments);\n };\n }\n\n kendo.toggleClass = function(element, classes, options, add) {\n if (classes) {\n classes = classes.split(\" \");\n\n if (transitions) {\n options = extend({\n exclusive: \"all\",\n duration: 400,\n ease: \"ease-out\"\n }, options);\n\n element.css(TRANSITION, options.exclusive + \" \" + options.duration + \"ms \" + options.ease);\n setTimeout(function() {\n element.css(TRANSITION, \"\").css(HEIGHT);\n }, options.duration); // TODO: this should fire a kendoAnimate session instead.\n }\n\n each(classes, function(idx, value) {\n element.toggleClass(value, add);\n });\n }\n\n return element;\n };\n\n kendo.parseEffects = function(input, mirror) {\n var effects = {};\n\n if (typeof input === \"string\") {\n each(input.split(\" \"), function(idx, value) {\n var redirectedEffect = !singleEffectRegExp.test(value),\n resolved = value.replace(oldEffectsRegExp, function(match, $1, $2) {\n return $1 + \":\" + $2.toLowerCase();\n }), // Support for old zoomIn/fadeOut style, now deprecated.\n effect = resolved.split(\":\"),\n direction = effect[1],\n effectBody = {};\n\n if (effect.length > 1) {\n effectBody.direction = (mirror && redirectedEffect ? directions[direction].reverse : direction);\n }\n\n effects[effect[0]] = effectBody;\n });\n } else {\n each(input, function(idx) {\n var direction = this.direction;\n\n if (direction && mirror && !singleEffectRegExp.test(idx)) {\n this.direction = directions[direction].reverse;\n }\n\n effects[idx] = this;\n });\n }\n\n return effects;\n };\n\n function parseInteger(value) {\n return parseInt(value, 10);\n }\n\n function parseCSS(element, property) {\n return parseInteger(element.css(property));\n }\n\n function keys(obj) {\n var acc = [];\n for (var propertyName in obj) {\n acc.push(propertyName);\n }\n return acc;\n }\n\n function strip3DTransforms(properties) {\n for (var key in properties) {\n if (transformProps.indexOf(key) != -1 && transform2d.indexOf(key) == -1) {\n delete properties[key];\n }\n }\n\n return properties;\n }\n\n function normalizeCSS(element, properties) {\n var transformation = [], cssValues = {}, lowerKey, key, value, isTransformed;\n\n for (key in properties) {\n lowerKey = key.toLowerCase();\n isTransformed = transforms && transformProps.indexOf(lowerKey) != -1;\n\n if (!support.hasHW3D && isTransformed && transform2d.indexOf(lowerKey) == -1) {\n delete properties[key];\n } else {\n value = properties[key];\n\n if (isTransformed) {\n transformation.push(key + \"(\" + value + \")\");\n } else {\n cssValues[key] = value;\n }\n }\n }\n\n if (transformation.length) {\n cssValues[TRANSFORM] = transformation.join(\" \");\n }\n\n return cssValues;\n }\n\n if (transitions) {\n extend(fx, {\n transition: function(element, properties, options) {\n var css,\n delay = 0,\n oldKeys = element.data(\"keys\") || [],\n timeoutID;\n\n options = extend({\n duration: 200,\n ease: \"ease-out\",\n complete: null,\n exclusive: \"all\"\n },\n options\n );\n\n var stopTransitionCalled = false;\n\n var stopTransition = function() {\n if (!stopTransitionCalled) {\n stopTransitionCalled = true;\n\n if (timeoutID) {\n clearTimeout(timeoutID);\n timeoutID = null;\n }\n\n element\n .removeData(ABORT_ID)\n .dequeue()\n .css(TRANSITION, \"\")\n .css(TRANSITION);\n\n options.complete.call(element);\n }\n };\n\n options.duration = $.fx ? $.fx.speeds[options.duration] || options.duration : options.duration;\n\n css = normalizeCSS(element, properties);\n\n $.merge(oldKeys, keys(css));\n\n if ($.hasOwnProperty(\"uniqueSort\")) {\n element\n .data(\"keys\", $.uniqueSort(oldKeys))\n .height();\n } else {\n element\n .data(\"keys\", $.unique(oldKeys))\n .height();\n }\n\n element.css(TRANSITION, options.exclusive + \" \" + options.duration + \"ms \" + options.ease).css(TRANSITION);\n element.css(css).css(TRANSFORM);\n\n /**\n * Use transitionEnd event for browsers who support it - but duplicate it with setTimeout, as the transitionEnd event will not be triggered if no CSS properties change.\n * This should be cleaned up at some point (widget by widget), and refactored to widgets not relying on the complete callback if no transition occurs.\n *\n * For IE9 and below, resort to setTimeout.\n */\n if (transitions.event) {\n element.one(transitions.event, stopTransition);\n if (options.duration !== 0) {\n delay = 500;\n }\n }\n\n timeoutID = setTimeout(stopTransition, options.duration + delay);\n element.data(ABORT_ID, timeoutID);\n element.data(COMPLETE_CALLBACK, stopTransition);\n },\n\n stopQueue: function(element, clearQueue, gotoEnd) {\n var cssValues,\n taskKeys = element.data(\"keys\"),\n retainPosition = (!gotoEnd && taskKeys),\n completeCallback = element.data(COMPLETE_CALLBACK);\n\n if (retainPosition) {\n cssValues = kendo.getComputedStyles(element[0], taskKeys);\n }\n\n if (completeCallback) {\n completeCallback();\n }\n\n if (retainPosition) {\n element.css(cssValues);\n }\n\n return element\n .removeData(\"keys\")\n .stop(clearQueue);\n }\n });\n }\n\n function animationProperty(element, property) {\n if (transforms) {\n var transform = element.css(TRANSFORM);\n if (transform == NONE) {\n return property == \"scale\" ? 1 : 0;\n }\n\n var match = transform.match(new RegExp(property + \"\\\\s*\\\\(([\\\\d\\\\w\\\\.]+)\")),\n computed = 0;\n\n if (match) {\n computed = parseInteger(match[1]);\n } else {\n match = transform.match(matrix3dRegExp) || [0, 0, 0, 0, 0];\n property = property.toLowerCase();\n\n if (translateXRegExp.test(property)) {\n computed = parseFloat(match[3] / match[2]);\n } else if (property == \"translatey\") {\n computed = parseFloat(match[4] / match[2]);\n } else if (property == \"scale\") {\n computed = parseFloat(match[2]);\n } else if (property == \"rotate\") {\n computed = parseFloat(Math.atan2(match[2], match[1]));\n }\n }\n\n return computed;\n } else {\n return parseFloat(element.css(property));\n }\n }\n\n var EffectSet = kendo.Class.extend({\n init: function(element, options) {\n var that = this;\n\n that.element = element;\n that.effects = [];\n that.options = options;\n that.restore = [];\n },\n\n run: function(effects) {\n var that = this,\n effect,\n idx, jdx,\n length = effects.length,\n element = that.element,\n options = that.options,\n deferred = $.Deferred(),\n start = {},\n end = {},\n target,\n children,\n childrenLength;\n\n that.effects = effects;\n\n deferred.done(that.complete.bind(that));\n\n element.data(\"animating\", true);\n\n for (idx = 0; idx < length; idx ++) {\n effect = effects[idx];\n\n effect.setReverse(options.reverse);\n effect.setOptions(options);\n\n that.addRestoreProperties(effect.restore);\n\n effect.prepare(start, end);\n\n children = effect.children();\n\n for (jdx = 0, childrenLength = children.length; jdx < childrenLength; jdx ++) {\n children[jdx].duration(options.duration).run();\n }\n }\n\n // legacy support for options.properties\n for (var effectName in options.effects) {\n extend(end, options.effects[effectName].properties);\n }\n\n // Show the element initially\n if (!element.is(\":visible\")) {\n extend(start, { display: element.data(\"olddisplay\") || \"block\" });\n }\n\n if (transforms && !options.reset) {\n target = element.data(\"targetTransform\");\n\n if (target) {\n start = extend(target, start);\n }\n }\n\n start = normalizeCSS(element, start);\n\n if (transforms && !transitions) {\n start = strip3DTransforms(start);\n }\n\n element.css(start)\n .css(TRANSFORM); // Nudge\n\n for (idx = 0; idx < length; idx ++) {\n effects[idx].setup();\n }\n\n if (options.init) {\n options.init();\n }\n\n element.data(\"targetTransform\", end);\n fx.animate(element, end, extend({}, options, { complete: deferred.resolve }));\n\n return deferred.promise();\n },\n\n stop: function() {\n $(this.element).kendoStop(true, true);\n },\n\n addRestoreProperties: function(restore) {\n var element = this.element,\n value,\n i = 0,\n length = restore.length;\n\n for (; i < length; i ++) {\n value = restore[i];\n\n this.restore.push(value);\n\n if (!element.data(value)) {\n element.data(value, element.css(value));\n }\n }\n },\n\n restoreCallback: function() {\n var element = this.element;\n\n for (var i = 0, length = this.restore.length; i < length; i ++) {\n var value = this.restore[i];\n element.css(value, element.data(value));\n }\n },\n\n complete: function() {\n var that = this,\n idx = 0,\n element = that.element,\n options = that.options,\n effects = that.effects,\n length = effects.length;\n\n element\n .removeData(\"animating\")\n .dequeue(); // call next animation from the queue\n\n if (options.hide) {\n element.data(\"olddisplay\", element.css(\"display\")).hide();\n }\n\n this.restoreCallback();\n\n if (hasZoom && !transforms) {\n setTimeout(this.restoreCallback.bind(this), 0); // Again jQuery callback in IE8-\n }\n\n for (; idx < length; idx ++) {\n effects[idx].teardown();\n }\n\n if (options.completeCallback) {\n options.completeCallback(element);\n }\n }\n });\n\n fx.promise = function(element, options) {\n var effects = [],\n effectClass,\n effectSet = new EffectSet(element, options),\n parsedEffects = kendo.parseEffects(options.effects),\n effect;\n\n options.effects = parsedEffects;\n\n for (var effectName in parsedEffects) {\n effectClass = fx[capitalize(effectName)];\n\n if (effectClass) {\n effect = new effectClass(element, parsedEffects[effectName].direction);\n effects.push(effect);\n }\n }\n\n if (effects[0]) {\n effectSet.run(effects);\n } else { // Not sure how would an fx promise reach this state - means that you call kendoAnimate with no valid effects? Why?\n if (!element.is(\":visible\")) {\n element.css({ display: element.data(\"olddisplay\") || \"block\" }).css(\"display\");\n }\n\n if (options.init) {\n options.init();\n }\n\n element.dequeue();\n effectSet.complete();\n }\n };\n\n extend(fx, {\n animate: function(elements, properties, options) {\n var useTransition = options.transition !== false;\n delete options.transition;\n\n if (transitions && \"transition\" in fx && useTransition) {\n fx.transition(elements, properties, options);\n } else {\n if (transforms) {\n elements.animate(strip3DTransforms(properties), { queue: false, show: false, hide: false, duration: options.duration, complete: options.complete }); // Stop animate from showing/hiding the element to be able to hide it later on.\n } else {\n elements.each(function() {\n var element = $(this),\n multiple = {};\n\n each(transformProps, function(idx, value) { // remove transforms to avoid IE and older browsers confusion\n var params,\n currentValue = properties ? properties[value] + \" \" : null; // We need to match\n\n if (currentValue) {\n var single = properties;\n\n if (value in scaleProperties && properties[value] !== undefined$1) {\n params = currentValue.match(cssParamsRegExp);\n if (transforms) {\n extend(single, { scale: +params[0] });\n }\n } else {\n if (value in translateProperties && properties[value] !== undefined$1) {\n var position = element.css(POSITION),\n isFixed = (position == \"absolute\" || position == \"fixed\");\n\n if (!element.data(TRANSLATE)) {\n if (isFixed) {\n element.data(TRANSLATE, {\n top: parseCSS(element, \"top\") || 0,\n left: parseCSS(element, \"left\") || 0,\n bottom: parseCSS(element, \"bottom\"),\n right: parseCSS(element, \"right\")\n });\n } else {\n element.data(TRANSLATE, {\n top: parseCSS(element, \"marginTop\") || 0,\n left: parseCSS(element, \"marginLeft\") || 0\n });\n }\n }\n\n var originalPosition = element.data(TRANSLATE);\n\n params = currentValue.match(cssParamsRegExp);\n if (params) {\n\n var dX = value == TRANSLATE + \"y\" ? +null : +params[1],\n dY = value == TRANSLATE + \"y\" ? +params[1] : +params[2];\n\n if (isFixed) {\n if (!isNaN(originalPosition.right)) {\n if (!isNaN(dX)) { extend(single, { right: originalPosition.right - dX }); }\n } else {\n if (!isNaN(dX)) { extend(single, { left: originalPosition.left + dX }); }\n }\n\n if (!isNaN(originalPosition.bottom)) {\n if (!isNaN(dY)) { extend(single, { bottom: originalPosition.bottom - dY }); }\n } else {\n if (!isNaN(dY)) { extend(single, { top: originalPosition.top + dY }); }\n }\n } else {\n if (!isNaN(dX)) { extend(single, { marginLeft: originalPosition.left + dX }); }\n if (!isNaN(dY)) { extend(single, { marginTop: originalPosition.top + dY }); }\n }\n }\n }\n }\n\n if (!transforms && value != \"scale\" && value in single) {\n delete single[value];\n }\n\n if (single) {\n extend(multiple, single);\n }\n }\n });\n\n if (browser.msie) {\n delete multiple.scale;\n }\n\n element.animate(multiple, { queue: false, show: false, hide: false, duration: options.duration, complete: options.complete }); // Stop animate from showing/hiding the element to be able to hide it later on.\n });\n }\n }\n }\n });\n\n fx.animatedPromise = fx.promise;\n\n var Effect = kendo.Class.extend({\n init: function(element, direction) {\n var that = this;\n that.element = element;\n that._direction = direction;\n that.options = {};\n that._additionalEffects = [];\n\n if (!that.restore) {\n that.restore = [];\n }\n },\n\n // Public API\n reverse: function() {\n this._reverse = true;\n return this.run();\n },\n\n play: function() {\n this._reverse = false;\n return this.run();\n },\n\n add: function(additional) {\n this._additionalEffects.push(additional);\n return this;\n },\n\n direction: function(value) {\n this._direction = value;\n return this;\n },\n\n duration: function(duration) {\n this._duration = duration;\n return this;\n },\n\n compositeRun: function() {\n var that = this,\n effectSet = new EffectSet(that.element, { reverse: that._reverse, duration: that._duration }),\n effects = that._additionalEffects.concat([ that ]);\n\n return effectSet.run(effects);\n },\n\n run: function() {\n if (this._additionalEffects && this._additionalEffects[0]) {\n return this.compositeRun();\n }\n\n var that = this,\n element = that.element,\n idx = 0,\n restore = that.restore,\n length = restore.length,\n value,\n deferred = $.Deferred(),\n start = {},\n end = {},\n target,\n children = that.children(),\n childrenLength = children.length;\n\n deferred.done(that._complete.bind(that));\n\n element.data(\"animating\", true);\n\n for (idx = 0; idx < length; idx ++) {\n value = restore[idx];\n\n if (!element.data(value)) {\n element.data(value, element.css(value));\n }\n }\n\n for (idx = 0; idx < childrenLength; idx ++) {\n children[idx].duration(that._duration).run();\n }\n\n that.prepare(start, end);\n\n if (!element.is(\":visible\")) {\n extend(start, { display: element.data(\"olddisplay\") || \"block\" });\n }\n\n if (transforms) {\n target = element.data(\"targetTransform\");\n\n if (target) {\n start = extend(target, start);\n }\n }\n\n start = normalizeCSS(element, start);\n\n if (transforms && !transitions) {\n start = strip3DTransforms(start);\n }\n\n element.css(start).css(TRANSFORM); // Trick webkit into re-rendering\n\n that.setup();\n\n element.data(\"targetTransform\", end);\n fx.animate(element, end, { duration: that._duration, complete: deferred.resolve });\n\n return deferred.promise();\n },\n\n stop: function() {\n var idx = 0,\n children = this.children(),\n childrenLength = children.length;\n\n for (idx = 0; idx < childrenLength; idx ++) {\n children[idx].stop();\n }\n\n $(this.element).kendoStop(true, true);\n return this;\n },\n\n restoreCallback: function() {\n var element = this.element;\n\n for (var i = 0, length = this.restore.length; i < length; i ++) {\n var value = this.restore[i];\n element.css(value, element.data(value));\n }\n },\n\n _complete: function() {\n var that = this,\n element = that.element;\n\n element\n .removeData(\"animating\")\n .dequeue(); // call next animation from the queue\n\n that.restoreCallback();\n\n if (that.shouldHide()) {\n element.data(\"olddisplay\", element.css(\"display\")).hide();\n }\n\n if (hasZoom && !transforms) {\n setTimeout(that.restoreCallback.bind(that), 0); // Again jQuery callback in IE8-\n }\n\n that.teardown();\n },\n\n /////////////////////////// Support for kendo.animate;\n setOptions: function(options) {\n extend(true, this.options, options);\n },\n\n children: function() {\n return [];\n },\n\n shouldHide: $.noop,\n\n setup: $.noop,\n prepare: $.noop,\n teardown: $.noop,\n directions: [],\n\n setReverse: function(reverse) {\n this._reverse = reverse;\n return this;\n }\n });\n\n function capitalize(word) {\n return word.charAt(0).toUpperCase() + word.substring(1);\n }\n\n function createEffect(name, definition) {\n var effectClass = Effect.extend(definition),\n directions = effectClass.prototype.directions;\n\n fx[capitalize(name)] = effectClass;\n\n fx.Element.prototype[name] = function(direction, opt1, opt2, opt3) {\n return new effectClass(this.element, direction, opt1, opt2, opt3);\n };\n\n each(directions, function(idx, theDirection) {\n fx.Element.prototype[name + capitalize(theDirection)] = function(opt1, opt2, opt3) {\n return new effectClass(this.element, theDirection, opt1, opt2, opt3);\n };\n });\n }\n\n var FOUR_DIRECTIONS = [\"left\", \"right\", \"up\", \"down\"],\n IN_OUT = [\"in\", \"out\"];\n\n createEffect(\"slideIn\", {\n directions: FOUR_DIRECTIONS,\n\n divisor: function(value) {\n this.options.divisor = value;\n return this;\n },\n\n prepare: function(start, end) {\n var that = this,\n tmp,\n element = that.element,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n direction = directions[that._direction],\n offset = -direction.modifier * (direction.vertical ? outerHeight(element) : outerWidth(element)),\n startValue = offset / (that.options && that.options.divisor || 1) + PX,\n endValue = \"0px\";\n\n if (that._reverse) {\n tmp = start;\n start = end;\n end = tmp;\n }\n\n if (transforms) {\n start[direction.transition] = startValue;\n end[direction.transition] = endValue;\n } else {\n start[direction.property] = startValue;\n end[direction.property] = endValue;\n }\n }\n });\n\n createEffect(\"tile\", {\n directions: FOUR_DIRECTIONS,\n\n init: function(element, direction, previous) {\n Effect.prototype.init.call(this, element, direction);\n this.options = { previous: previous };\n },\n\n previousDivisor: function(value) {\n this.options.previousDivisor = value;\n return this;\n },\n\n children: function() {\n var that = this,\n reverse = that._reverse,\n previous = that.options.previous,\n divisor = that.options.previousDivisor || 1,\n dir = that._direction;\n\n var children = [ kendo.fx(that.element).slideIn(dir).setReverse(reverse) ];\n\n if (previous) {\n children.push( kendo.fx(previous).slideIn(directions[dir].reverse).divisor(divisor).setReverse(!reverse) );\n }\n\n return children;\n }\n });\n\n function createToggleEffect(name, property, defaultStart, defaultEnd) {\n createEffect(name, {\n directions: IN_OUT,\n\n startValue: function(value) {\n this._startValue = value;\n return this;\n },\n\n endValue: function(value) {\n this._endValue = value;\n return this;\n },\n\n shouldHide: function() {\n return this._shouldHide;\n },\n\n prepare: function(start, end) {\n var that = this,\n startValue,\n endValue,\n out = this._direction === \"out\",\n startDataValue = that.element.data(property),\n startDataValueIsSet = !(isNaN(startDataValue) || startDataValue == defaultStart);\n\n if (startDataValueIsSet) {\n startValue = startDataValue;\n } else if (typeof this._startValue !== \"undefined\") {\n startValue = this._startValue;\n } else {\n startValue = out ? defaultStart : defaultEnd;\n }\n\n if (typeof this._endValue !== \"undefined\") {\n endValue = this._endValue;\n } else {\n endValue = out ? defaultEnd : defaultStart;\n }\n\n if (this._reverse) {\n start[property] = endValue;\n end[property] = startValue;\n } else {\n start[property] = startValue;\n end[property] = endValue;\n }\n\n that._shouldHide = end[property] === defaultEnd;\n }\n });\n }\n\n createToggleEffect(\"fade\", \"opacity\", 1, 0);\n createToggleEffect(\"zoom\", \"scale\", 1, 0.01);\n\n createEffect(\"slideMargin\", {\n prepare: function(start, end) {\n var that = this,\n element = that.element,\n options = that.options,\n origin = element.data(ORIGIN),\n offset = options.offset,\n margin,\n reverse = that._reverse;\n\n if (!reverse && origin === null) {\n element.data(ORIGIN, parseFloat(element.css(\"margin-\" + options.axis)));\n }\n\n margin = (element.data(ORIGIN) || 0);\n end[\"margin-\" + options.axis] = !reverse ? margin + offset : margin;\n }\n });\n\n createEffect(\"slideTo\", {\n prepare: function(start, end) {\n var that = this,\n element = that.element,\n options = that.options,\n offset = options.offset.split(\",\"),\n reverse = that._reverse;\n\n if (transforms) {\n end.translatex = !reverse ? offset[0] : 0;\n end.translatey = !reverse ? offset[1] : 0;\n } else {\n end.left = !reverse ? offset[0] : 0;\n end.top = !reverse ? offset[1] : 0;\n }\n element.css(\"left\");\n }\n });\n\n createEffect(\"expand\", {\n directions: [\"horizontal\", \"vertical\"],\n\n restore: [ OVERFLOW ],\n\n prepare: function(start, end) {\n var that = this,\n element = that.element,\n options = that.options,\n reverse = that._reverse,\n property = that._direction === \"vertical\" ? HEIGHT : WIDTH,\n setLength = element[0].style[property],\n oldLength = element.data(property),\n length = parseFloat(oldLength || setLength),\n realLength = round(element.css(property, AUTO)[property]());\n\n start.overflow = HIDDEN;\n\n length = (options && options.reset) ? realLength || length : length || realLength;\n\n end[property] = (reverse ? 0 : length) + PX;\n start[property] = (reverse ? length : 0) + PX;\n\n if (oldLength === undefined$1) {\n element.data(property, setLength);\n }\n },\n\n shouldHide: function() {\n return this._reverse;\n },\n\n teardown: function() {\n var that = this,\n element = that.element,\n property = that._direction === \"vertical\" ? HEIGHT : WIDTH,\n length = element.data(property);\n\n if (length == AUTO || length === BLANK) {\n setTimeout(function() { element.css(property, AUTO).css(property); }, 0); // jQuery animate complete callback in IE is called before the last animation step!\n }\n }\n });\n\n var TRANSFER_START_STATE = { position: \"absolute\", marginLeft: 0, marginTop: 0, scale: 1 };\n /**\n * Intersection point formulas are taken from here - http://zonalandeducation.com/mmts/intersections/intersectionOfTwoLines1/intersectionOfTwoLines1.html\n * Formula for a linear function from two points from here - http://demo.activemath.org/ActiveMath2/search/show.cmd?id=mbase://AC_UK_calculus/functions/ex_linear_equation_two_points\n * The transform origin point is the intersection point of the two lines from the top left corners/top right corners of the element and target.\n * The math and variables below MAY BE SIMPLIFIED (zeroes removed), but this would make the formula too cryptic.\n */\n createEffect(\"transfer\", {\n init: function(element, target) {\n this.element = element;\n this.options = { target: target };\n this.restore = [];\n },\n\n setup: function() {\n this.element.appendTo(document.body);\n },\n\n prepare: function(start, end) {\n var that = this,\n element = that.element,\n outerBox = fx.box(element),\n innerBox = fx.box(that.options.target),\n currentScale = animationProperty(element, \"scale\"),\n scale = fx.fillScale(innerBox, outerBox),\n transformOrigin = fx.transformOrigin(innerBox, outerBox);\n\n extend(start, TRANSFER_START_STATE);\n end.scale = 1;\n\n element.css(TRANSFORM, \"scale(1)\").css(TRANSFORM);\n element.css(TRANSFORM, \"scale(\" + currentScale + \")\");\n\n start.top = outerBox.top;\n start.left = outerBox.left;\n start.transformOrigin = transformOrigin.x + PX + \" \" + transformOrigin.y + PX;\n\n if (that._reverse) {\n start.scale = scale;\n } else {\n end.scale = scale;\n }\n }\n });\n\n\n var CLIPS = {\n top: \"rect(auto auto $size auto)\",\n bottom: \"rect($size auto auto auto)\",\n left: \"rect(auto $size auto auto)\",\n right: \"rect(auto auto auto $size)\"\n };\n\n var ROTATIONS = {\n top: { start: \"rotatex(0deg)\", end: \"rotatex(180deg)\" },\n bottom: { start: \"rotatex(-180deg)\", end: \"rotatex(0deg)\" },\n left: { start: \"rotatey(0deg)\", end: \"rotatey(-180deg)\" },\n right: { start: \"rotatey(180deg)\", end: \"rotatey(0deg)\" }\n };\n\n function clipInHalf(container, direction) {\n var vertical = kendo.directions[direction].vertical,\n size = (container[vertical ? HEIGHT : WIDTH]() / 2) + \"px\";\n\n return CLIPS[direction].replace(\"$size\", size);\n }\n\n createEffect(\"turningPage\", {\n directions: FOUR_DIRECTIONS,\n\n init: function(element, direction, container) {\n Effect.prototype.init.call(this, element, direction);\n this._container = container;\n },\n\n prepare: function(start, end) {\n var that = this,\n reverse = that._reverse,\n direction = reverse ? directions[that._direction].reverse : that._direction,\n rotation = ROTATIONS[direction];\n\n start.zIndex = 1;\n\n if (that._clipInHalf) {\n start.clip = clipInHalf(that._container, kendo.directions[direction].reverse);\n }\n\n start[BACKFACE] = HIDDEN;\n\n end[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.start : rotation.end);\n start[TRANSFORM] = TRANSFORM_PERSPECTIVE + (reverse ? rotation.end : rotation.start);\n },\n\n setup: function() {\n this._container.append(this.element);\n },\n\n face: function(value) {\n this._face = value;\n return this;\n },\n\n shouldHide: function() {\n var that = this,\n reverse = that._reverse,\n face = that._face;\n\n return (reverse && !face) || (!reverse && face);\n },\n\n clipInHalf: function(value) {\n this._clipInHalf = value;\n return this;\n },\n\n temporary: function() {\n this.element.addClass('temp-page');\n return this;\n }\n });\n\n createEffect(\"staticPage\", {\n directions: FOUR_DIRECTIONS,\n\n init: function(element, direction, container) {\n Effect.prototype.init.call(this, element, direction);\n this._container = container;\n },\n\n restore: [\"clip\"],\n\n prepare: function(start, end) {\n var that = this,\n direction = that._reverse ? directions[that._direction].reverse : that._direction;\n\n start.clip = clipInHalf(that._container, direction);\n start.opacity = 0.999;\n end.opacity = 1;\n },\n\n shouldHide: function() {\n var that = this,\n reverse = that._reverse,\n face = that._face;\n\n return (reverse && !face) || (!reverse && face);\n },\n\n face: function(value) {\n this._face = value;\n return this;\n }\n });\n\n createEffect(\"pageturn\", {\n directions: [\"horizontal\", \"vertical\"],\n\n init: function(element, direction, face, back) {\n Effect.prototype.init.call(this, element, direction);\n this.options = {};\n this.options.face = face;\n this.options.back = back;\n },\n\n children: function() {\n var that = this,\n options = that.options,\n direction = that._direction === \"horizontal\" ? \"left\" : \"top\",\n reverseDirection = kendo.directions[direction].reverse,\n reverse = that._reverse,\n temp,\n faceClone = options.face.clone(true).removeAttr(\"id\"),\n backClone = options.back.clone(true).removeAttr(\"id\"),\n element = that.element;\n\n if (reverse) {\n temp = direction;\n direction = reverseDirection;\n reverseDirection = temp;\n }\n\n return [\n kendo.fx(options.face).staticPage(direction, element).face(true).setReverse(reverse),\n kendo.fx(options.back).staticPage(reverseDirection, element).setReverse(reverse),\n kendo.fx(faceClone).turningPage(direction, element).face(true).clipInHalf(true).temporary().setReverse(reverse),\n kendo.fx(backClone).turningPage(reverseDirection, element).clipInHalf(true).temporary().setReverse(reverse)\n ];\n },\n\n prepare: function(start, end) {\n start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n start.transformStyle = \"preserve-3d\";\n // hack to trigger transition end.\n start.opacity = 0.999;\n end.opacity = 1;\n },\n\n teardown: function() {\n this.element.find(\".temp-page\").remove();\n }\n });\n\n createEffect(\"flip\", {\n directions: [\"horizontal\", \"vertical\"],\n\n init: function(element, direction, face, back) {\n Effect.prototype.init.call(this, element, direction);\n this.options = {};\n this.options.face = face;\n this.options.back = back;\n },\n\n children: function() {\n var that = this,\n options = that.options,\n direction = that._direction === \"horizontal\" ? \"left\" : \"top\",\n reverseDirection = kendo.directions[direction].reverse,\n reverse = that._reverse,\n temp,\n element = that.element;\n\n if (reverse) {\n temp = direction;\n direction = reverseDirection;\n reverseDirection = temp;\n }\n\n return [\n kendo.fx(options.face).turningPage(direction, element).face(true).setReverse(reverse),\n kendo.fx(options.back).turningPage(reverseDirection, element).setReverse(reverse)\n ];\n },\n\n prepare: function(start) {\n start[PERSPECTIVE] = DEFAULT_PERSPECTIVE;\n start.transformStyle = \"preserve-3d\";\n }\n });\n\n var RESTORE_OVERFLOW = !support.mobileOS.android;\n var IGNORE_TRANSITION_EVENT_SELECTOR = \".km-touch-scrollbar, .km-actionsheet-wrapper\";\n\n createEffect(\"replace\", {\n _before: $.noop,\n _after: $.noop,\n init: function(element, previous, transitionClass) {\n Effect.prototype.init.call(this, element);\n this._previous = $(previous);\n this._transitionClass = transitionClass;\n },\n\n duration: function() {\n throw new Error(\"The replace effect does not support duration setting; the effect duration may be customized through the transition class rule\");\n },\n\n beforeTransition: function(callback) {\n this._before = callback;\n return this;\n },\n\n afterTransition: function(callback) {\n this._after = callback;\n return this;\n },\n\n _both: function() {\n return $().add(this._element).add(this._previous);\n },\n\n _containerClass: function() {\n var direction = this._direction,\n containerClass = \"k-fx k-fx-start k-fx-\" + this._transitionClass;\n\n if (direction) {\n containerClass += \" k-fx-\" + direction;\n }\n\n if (this._reverse) {\n containerClass += \" k-fx-reverse\";\n }\n\n return containerClass;\n },\n\n complete: function(e) {\n if (!this.deferred || (e && $(e.target).is(IGNORE_TRANSITION_EVENT_SELECTOR))) {\n return;\n }\n\n var container = this.container;\n\n container\n .removeClass(\"k-fx-end\")\n .removeClass(this._containerClass())\n .off(transitions.event, this.completeProxy);\n\n this._previous.hide().removeClass(\"k-fx-current\");\n this.element.removeClass(\"k-fx-next\");\n\n if (RESTORE_OVERFLOW) {\n container.css(OVERFLOW, \"\");\n }\n\n if (!this.isAbsolute) {\n this._both().css(POSITION, \"\");\n }\n\n this.deferred.resolve();\n delete this.deferred;\n },\n\n run: function() {\n if (this._additionalEffects && this._additionalEffects[0]) {\n return this.compositeRun();\n }\n\n var that = this,\n element = that.element,\n previous = that._previous,\n container = element.parents().filter(previous.parents()).first(),\n both = that._both(),\n deferred = $.Deferred(),\n originalPosition = element.css(POSITION),\n originalOverflow;\n\n // edge case for grid/scheduler, where the previous is already destroyed.\n if (!container.length) {\n container = element.parent();\n }\n\n this.container = container;\n this.deferred = deferred;\n this.isAbsolute = originalPosition == \"absolute\";\n\n if (!this.isAbsolute) {\n both.css(POSITION, \"absolute\");\n }\n\n if (RESTORE_OVERFLOW) {\n originalOverflow = container.css(OVERFLOW);\n container.css(OVERFLOW, \"hidden\");\n }\n\n if (!transitions) {\n this.complete();\n } else {\n element.addClass(\"k-fx-hidden\");\n\n container.addClass(this._containerClass());\n\n this.completeProxy = this.complete.bind(this);\n container.on(transitions.event, this.completeProxy);\n\n kendo.animationFrame(function() {\n element.removeClass(\"k-fx-hidden\").addClass(\"k-fx-next\");\n previous.css(\"display\", \"\").addClass(\"k-fx-current\");\n that._before(previous, element);\n kendo.animationFrame(function() {\n container.removeClass(\"k-fx-start\").addClass(\"k-fx-end\");\n that._after(previous, element);\n });\n });\n }\n\n return deferred.promise();\n },\n\n stop: function() {\n this.complete();\n }\n });\n\n var Animation = kendo.Class.extend({\n init: function() {\n var that = this;\n that._tickProxy = that._tick.bind(that);\n that._started = false;\n },\n\n tick: $.noop,\n done: $.noop,\n onEnd: $.noop,\n onCancel: $.noop,\n\n start: function() {\n if (!this.enabled()) {\n return;\n }\n\n if (!this.done()) {\n this._started = true;\n kendo.animationFrame(this._tickProxy);\n } else {\n this.onEnd();\n }\n },\n\n enabled: function() {\n return true;\n },\n\n cancel: function() {\n this._started = false;\n this.onCancel();\n },\n\n _tick: function() {\n var that = this;\n if (!that._started) { return; }\n\n that.tick();\n\n if (!that.done()) {\n kendo.animationFrame(that._tickProxy);\n } else {\n that._started = false;\n that.onEnd();\n }\n }\n });\n\n var Transition = Animation.extend({\n init: function(options) {\n var that = this;\n extend(that, options);\n Animation.fn.init.call(that);\n },\n\n done: function() {\n return this.timePassed() >= this.duration;\n },\n\n timePassed: function() {\n return Math.min(this.duration, (new Date()) - this.startDate);\n },\n\n moveTo: function(options) {\n var that = this,\n movable = that.movable;\n\n that.initial = movable[that.axis];\n that.delta = options.location - that.initial;\n\n that.duration = typeof options.duration == \"number\" ? options.duration : 300;\n\n that.tick = that._easeProxy(options.ease);\n\n that.startDate = new Date();\n that.start();\n },\n\n _easeProxy: function(ease) {\n var that = this;\n\n return function() {\n that.movable.moveAxis(that.axis, ease(that.timePassed(), that.initial, that.delta, that.duration));\n };\n }\n });\n\n extend(Transition, {\n easeOutExpo: function(t, b, c, d) {\n return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b;\n },\n\n easeOutBack: function(t, b, c, d, s) {\n s = 1.70158;\n return c * ((t = t / d - 1) * t * ((s + 1) * t + s) + 1) + b;\n }\n });\n\n fx.Animation = Animation;\n fx.Transition = Transition;\n fx.createEffect = createEffect;\n\n fx.box = function(element) {\n element = $(element);\n var result = element.offset();\n result.width = kendo._outerWidth(element);\n result.height = kendo._outerHeight(element);\n return result;\n };\n\n fx.transformOrigin = function(inner, outer) {\n var x = (inner.left - outer.left) * outer.width / (outer.width - inner.width),\n y = (inner.top - outer.top) * outer.height / (outer.height - inner.height);\n\n return {\n x: isNaN(x) ? 0 : x,\n y: isNaN(y) ? 0 : y\n };\n };\n\n fx.fillScale = function(inner, outer) {\n return Math.min(inner.width / outer.width, inner.height / outer.height);\n };\n\n fx.fitScale = function(inner, outer) {\n return Math.max(inner.width / outer.width, inner.height / outer.height);\n };\n })(window.kendo.jQuery);\n var kendo$f = kendo;\n\n var __meta__$d = {\n id: \"data.odata\",\n name: \"OData\",\n category: \"framework\",\n depends: [ \"core\" ],\n hidden: true\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n extend = $.extend,\n NEWLINE = \"\\r\\n\",\n DOUBLELINE = \"\\r\\n\\r\\n\",\n isFunction = kendo.isFunction,\n odataFilters = {\n eq: \"eq\",\n neq: \"ne\",\n gt: \"gt\",\n gte: \"ge\",\n lt: \"lt\",\n lte: \"le\",\n contains: \"substringof\",\n doesnotcontain: \"substringof\",\n endswith: \"endswith\",\n startswith: \"startswith\",\n isnull: \"eq\",\n isnotnull: \"ne\",\n isnullorempty: \"eq\",\n isnotnullorempty: \"ne\",\n isempty: \"eq\",\n isnotempty: \"ne\"\n },\n odataFiltersVersionFour = extend({}, odataFilters, {\n contains: \"contains\"\n }),\n mappers = {\n pageSize: $.noop,\n page: $.noop,\n filter: function(params, filter, useVersionFour) {\n if (filter) {\n filter = toOdataFilter(filter, useVersionFour);\n if (filter) {\n params.$filter = filter;\n }\n }\n },\n sort: function(params, orderby) {\n var expr = $.map(orderby, function(value) {\n var order = value.field.replace(/\\./g, \"/\");\n\n if (value.dir === \"desc\") {\n order += \" desc\";\n }\n\n return order;\n }).join(\",\");\n\n if (expr) {\n params.$orderby = expr;\n }\n },\n skip: function(params, skip) {\n if (skip) {\n params.$skip = skip;\n }\n },\n take: function(params, take) {\n if (take) {\n params.$top = take;\n }\n }\n },\n defaultDataType = {\n read: {\n dataType: \"jsonp\"\n }\n };\n\n function toOdataFilter(filter, useOdataFour) {\n var result = [],\n logic = filter.logic || \"and\",\n idx,\n length,\n field,\n type,\n format,\n operator,\n value,\n ignoreCase,\n filters = filter.filters;\n\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n field = filter.field;\n value = filter.value;\n operator = filter.operator;\n\n if (filter.filters) {\n filter = toOdataFilter(filter, useOdataFour);\n } else {\n ignoreCase = filter.ignoreCase;\n field = field.replace(/\\./g, \"/\");\n filter = odataFilters[operator];\n if (useOdataFour) {\n filter = odataFiltersVersionFour[operator];\n }\n\n if (operator === \"isnullorempty\") {\n filter = kendo.format(\"{0} {1} null or {0} {1} ''\", field, filter);\n } else if (operator === \"isnotnullorempty\") {\n filter = kendo.format(\"{0} {1} null and {0} {1} ''\", field, filter);\n } else if (operator === \"isnull\" || operator === \"isnotnull\") {\n filter = kendo.format(\"{0} {1} null\", field, filter);\n } else if (operator === \"isempty\" || operator === \"isnotempty\") {\n filter = kendo.format(\"{0} {1} ''\", field, filter);\n } else if (filter && value !== undefined$1) {\n type = kendo.type(value);\n if (type === \"string\") {\n format = \"'{1}'\";\n value = value.replace(/'/g, \"''\");\n\n if (ignoreCase === true) {\n field = \"tolower(\" + field + \")\";\n }\n\n } else if (type === \"date\") {\n if (useOdataFour) {\n format = \"{1:yyyy-MM-ddTHH:mm:ss+00:00}\";\n value = kendo.timezone.apply(value, 'Etc/UTC');\n } else {\n format = \"datetime'{1:yyyy-MM-ddTHH:mm:ss}'\";\n }\n } else {\n format = \"{1}\";\n }\n\n if (filter.length > 3) {\n if (filter !== \"substringof\") {\n format = \"{0}({2},\" + format + \")\";\n } else {\n format = \"{0}(\" + format + \",{2})\";\n if (operator === \"doesnotcontain\") {\n if (useOdataFour) {\n format = \"{0}({2},'{1}') eq -1\";\n filter = \"indexof\";\n } else {\n format += \" eq false\";\n }\n }\n }\n } else {\n format = \"{2} {0} \" + format;\n }\n\n filter = kendo.format(format, filter, value, field);\n }\n }\n\n result.push(filter);\n }\n\n filter = result.join(\" \" + logic + \" \");\n\n if (result.length > 1) {\n filter = \"(\" + filter + \")\";\n }\n\n return filter;\n }\n\n function stripMetadata(obj) {\n for (var name in obj) {\n if (name.indexOf(\"@odata\") === 0) {\n delete obj[name];\n }\n }\n }\n\n function hex16() {\n return Math.floor((1 + Math.random()) * 0x10000).toString(16).substr(1);\n }\n\n function createBoundary(prefix) {\n return prefix + hex16() + '-' + hex16() + '-' + hex16();\n }\n\n function createDelimeter(boundary, close) {\n var result = NEWLINE + \"--\" + boundary;\n\n if (close) {\n result += \"--\";\n }\n\n return result;\n }\n\n function createCommand(transport, item, httpVerb, command) {\n var transportUrl = transport.options[command].url;\n var commandPrefix = kendo.format(\"{0} \", httpVerb);\n\n if (isFunction(transportUrl)) {\n return commandPrefix + transportUrl(item);\n } else {\n return commandPrefix + transportUrl;\n }\n }\n\n function getOperationHeader(changeset, changeId) {\n var header = \"\";\n\n header += createDelimeter(changeset, false);\n header += NEWLINE + 'Content-Type: application/http';\n header += NEWLINE + 'Content-Transfer-Encoding: binary';\n header += NEWLINE + 'Content-ID: ' + changeId;\n\n return header;\n }\n\n function getOperationContent(item) {\n var content = \"\";\n\n content += NEWLINE + \"Content-Type: application/json;odata=minimalmetadata\";\n content += NEWLINE + \"Prefer: return=representation\";\n content += DOUBLELINE + kendo.stringify(item);\n\n return content;\n }\n\n function getOperations(collection, changeset, changeId, command, transport, skipContent) {\n var requestBody = \"\";\n\n for (var i = 0; i < collection.length; i++) {\n requestBody += getOperationHeader(changeset, changeId);\n requestBody += DOUBLELINE + createCommand(transport, collection[i], transport.options[command].type, command) + ' HTTP/1.1';\n if (!skipContent) {\n requestBody += getOperationContent(collection[i]);\n }\n requestBody += NEWLINE;\n changeId++;\n }\n\n return requestBody;\n }\n\n function processCollection(colection, boundary, changeset, changeId, transport, command, skipContent) {\n var requestBody = \"\";\n\n requestBody += getBoundary(boundary, changeset);\n requestBody += getOperations(colection, changeset, changeId, command, transport, skipContent);\n requestBody += createDelimeter(changeset, true);\n requestBody += NEWLINE;\n\n return requestBody;\n }\n\n function getBoundary(boundary,changeset) {\n var requestBody = \"\";\n\n requestBody += \"--\" + boundary + NEWLINE;\n requestBody += \"Content-Type: multipart/mixed; boundary=\" + changeset + NEWLINE;\n\n return requestBody;\n }\n\n function createBatchRequest(transport, colections) {\n \t\tvar options = extend({}, transport.options.batch);\n var boundary = createBoundary(\"sf_batch_\");\n var requestBody = \"\";\n var changeId = 0;\n var batchURL = transport.options.batch.url;\n var changeset = createBoundary(\"sf_changeset_\");\n\n options.type = transport.options.batch.type;\n options.url = isFunction(batchURL) ? batchURL() : batchURL;\n \t\toptions.headers = extend(options.headers || {}, {\n \t\t\t\"Content-Type\": \"multipart/mixed; boundary=\" + boundary\n \t\t});\n\n if (colections.updated.length) {\n requestBody += processCollection(colections.updated, boundary, changeset, changeId, transport, \"update\", false);\n changeId += colections.updated.length;\n changeset = createBoundary(\"sf_changeset_\");\n }\n\n if (colections.destroyed.length) {\n requestBody += processCollection(colections.destroyed, boundary, changeset, changeId, transport, \"destroy\", true);\n changeId += colections.destroyed.length;\n changeset = createBoundary(\"sf_changeset_\");\n }\n\n if (colections.created.length) {\n requestBody += processCollection(colections.created, boundary, changeset, changeId, transport, \"create\", false);\n }\n\n requestBody += createDelimeter(boundary, true);\n\n options.data = requestBody;\n\n return options;\n }\n\n function parseBatchResponse(responseText) {\n var responseMarkers = responseText.match(/--changesetresponse_[a-z0-9-]+$/gm);\n var markerIndex = 0;\n var collections = [];\n var changeBody;\n var status;\n var code;\n var marker;\n var jsonModel;\n\n collections.push({ models: [], passed: true });\n\n for (var i = 0; i < responseMarkers.length; i++) {\n marker = responseMarkers[i];\n if (marker.lastIndexOf('--', marker.length - 1)) {\n if (i < responseMarkers.length - 1) {\n collections.push({ models: [], passed: true });\n }\n continue;\n }\n\n if (!markerIndex) {\n markerIndex = responseText.indexOf(marker);\n } else {\n markerIndex = responseText.indexOf(marker, markerIndex + marker.length);\n }\n\n changeBody = responseText.substring(markerIndex, responseText.indexOf(\"--\", markerIndex + 1));\n status = changeBody.match(/^HTTP\\/1\\.\\d (\\d{3}) (.*)$/gm).pop();\n code = kendo.parseFloat(status.match(/\\d{3}/g).pop());\n\n if (code >= 200 && code <= 299) {\n jsonModel = changeBody.match(/\\{.*\\}/gm);\n if (jsonModel) {\n collections[collections.length - 1].models.push(JSON.parse(jsonModel[0]));\n }\n } else {\n collections[collections.length - 1].passed = false;\n }\n\n }\n\n return collections;\n }\n\n extend(true, kendo.data, {\n schemas: {\n odata: {\n type: \"json\",\n data: function(data) {\n return data.d.results || [data.d];\n },\n total: \"d.__count\"\n }\n },\n transports: {\n odata: {\n read: {\n cache: true, // to prevent jQuery from adding cache buster\n dataType: \"jsonp\",\n jsonp: \"$callback\"\n },\n update: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json\", // to inform the server the the request body is JSON encoded\n type: \"PUT\" // can be PUT or MERGE\n },\n create: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json\",\n type: \"POST\" // must be POST to create new entity\n },\n destroy: {\n cache: true,\n dataType: \"json\",\n type: \"DELETE\"\n },\n parameterMap: function(options, type, useVersionFour) {\n var params,\n value,\n option,\n dataType;\n\n options = options || {};\n type = type || \"read\";\n dataType = (this.options || defaultDataType)[type];\n dataType = dataType ? dataType.dataType : \"json\";\n\n if (type === \"read\") {\n params = {\n $inlinecount: \"allpages\"\n };\n\n if (dataType != \"json\") {\n params.$format = \"json\";\n }\n\n for (option in options) {\n if (mappers[option]) {\n mappers[option](params, options[option], useVersionFour);\n } else {\n params[option] = options[option];\n }\n }\n } else {\n if (dataType !== \"json\") {\n throw new Error(\"Only json dataType can be used for \" + type + \" operation.\");\n }\n\n if (type !== \"destroy\") {\n for (option in options) {\n value = options[option];\n if (typeof value === \"number\") {\n options[option] = value + \"\";\n }\n }\n\n params = kendo.stringify(options);\n }\n }\n\n return params;\n }\n }\n }\n });\n\n extend(true, kendo.data, {\n schemas: {\n \"odata-v4\": {\n type: \"json\",\n data: function(data) {\n if (Array.isArray(data)) {\n for (var i = 0; i < data.length; i++) {\n stripMetadata(data[i]);\n }\n return data;\n } else {\n data = $.extend({}, data);\n stripMetadata(data);\n\n if (data.value) {\n return data.value;\n }\n return [data];\n }\n },\n total: function(data) {\n return data[\"@odata.count\"];\n }\n }\n },\n transports: {\n \"odata-v4\": {\n batch: {\n type: \"POST\"\n },\n read: {\n cache: true, // to prevent jQuery from adding cache buster\n dataType: \"json\"\n },\n update: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json;IEEE754Compatible=true\", // to inform the server the the request body is JSON encoded\n type: \"PUT\" // can be PUT or MERGE\n },\n create: {\n cache: true,\n dataType: \"json\",\n contentType: \"application/json;IEEE754Compatible=true\",\n type: \"POST\" // must be POST to create new entity\n },\n destroy: {\n cache: true,\n dataType: \"json\",\n type: \"DELETE\"\n },\n parameterMap: function(options, type) {\n var result = kendo.data.transports.odata.parameterMap(options, type, true);\n if (type == \"read\") {\n result.$count = true;\n delete result.$inlinecount;\n }\n\n \t\t\t\t\tif (result && result.$filter) {\n \t\t\t\t\t\t// Remove the single quotation marks around the GUID (OData v4).\n \t\t\t\t\t\tresult.$filter = result.$filter.replace(/('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}')/ig, function(x) {\n \t\t\t\t\t\t\treturn x.substring(1, x.length - 1);\n \t\t\t\t\t\t});\n \t\t\t\t\t}\n\n return result;\n },\n submit: function(e) {\n var that = this;\n var options = createBatchRequest(that, e.data);\n var collections = e.data;\n\n if (!collections.updated.length && !collections.destroyed.length && !collections.created.length) {\n return;\n }\n\n $.ajax(extend(true, {}, {\n success: function(response) {\n var responses = parseBatchResponse(response);\n var index = 0;\n var current;\n\n if (collections.updated.length) {\n current = responses[index];\n if (current.passed) {\n // Pass either the obtained models or an empty array if only status codes are returned.\n e.success(current.models.length ? current.models : [], \"update\");\n }\n index++;\n }\n if (collections.destroyed.length) {\n current = responses[index];\n if (current.passed) {\n // For delete operations OData returns only status codes.\n // Passing empty array to datasource will force it to correctly remove the deleted items from the pristine collection.\n e.success([], \"destroy\");\n }\n index++;\n }\n if (collections.created.length) {\n current = responses[index];\n if (current.passed) {\n e.success(current.models, \"create\");\n }\n }\n },\n error: function(response, status, error) {\n e.error(response, status, error);\n }\n }, options));\n }\n }\n }\n });\n\n })(window.kendo.jQuery);\n var kendo$e = kendo;\n\n var __meta__$c = {\n id: \"data.xml\",\n name: \"XML\",\n category: \"framework\",\n depends: [ \"core\" ],\n hidden: true\n };\n\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n isArray = Array.isArray,\n isPlainObject = $.isPlainObject,\n map = $.map,\n each = $.each,\n extend = $.extend,\n getter = kendo.getter,\n Class = kendo.Class;\n\n var XmlDataReader = Class.extend({\n init: function(options) {\n var that = this,\n total = options.total,\n model = options.model,\n parse = options.parse,\n errors = options.errors,\n serialize = options.serialize,\n data = options.data;\n\n if (model) {\n if (isPlainObject(model)) {\n var base = options.modelBase || kendo.data.Model;\n\n if (model.fields) {\n each(model.fields, function(field, value) {\n if (isPlainObject(value) && value.field) {\n if (!kendo.isFunction(value.field)) {\n value = extend(value, { field: that.getter(value.field) });\n }\n } else {\n value = { field: that.getter(value) };\n }\n model.fields[field] = value;\n });\n }\n\n var id = model.id;\n if (id) {\n var idField = {};\n\n idField[that.xpathToMember(id, true)] = { field: that.getter(id) };\n model.fields = extend(idField, model.fields);\n model.id = that.xpathToMember(id);\n }\n model = base.define(model);\n }\n\n that.model = model;\n }\n\n if (total) {\n if (typeof total == \"string\") {\n total = that.getter(total);\n that.total = function(data) {\n return parseInt(total(data), 10);\n };\n } else if (typeof total == \"function\") {\n that.total = total;\n }\n }\n\n if (errors) {\n if (typeof errors == \"string\") {\n errors = that.getter(errors);\n that.errors = function(data) {\n return errors(data) || null;\n };\n } else if (typeof errors == \"function\") {\n that.errors = errors;\n }\n }\n\n if (data) {\n if (typeof data == \"string\") {\n data = that.xpathToMember(data);\n that.data = function(value) {\n var result = that.evaluate(value, data),\n modelInstance;\n\n result = isArray(result) ? result : [result];\n\n if (that.model && model.fields) {\n modelInstance = new that.model();\n\n return map(result, function(value) {\n if (value) {\n var record = {}, field;\n\n for (field in model.fields) {\n record[field] = modelInstance._parse(field, model.fields[field].field(value));\n }\n\n return record;\n }\n });\n }\n\n return result;\n };\n } else if (typeof data == \"function\") {\n that.data = data;\n }\n }\n\n if (typeof parse == \"function\") {\n var xmlParse = that.parse;\n\n that.parse = function(data) {\n var xml = parse.call(that, data);\n return xmlParse.call(that, xml);\n };\n }\n\n if (typeof serialize == \"function\") {\n that.serialize = serialize;\n }\n },\n total: function(result) {\n return this.data(result).length;\n },\n errors: function(data) {\n return data ? data.errors : null;\n },\n serialize: function(data) {\n return data;\n },\n parseDOM: function(element) {\n var result = {},\n parsedNode,\n node,\n nodeType,\n nodeName,\n member,\n attribute,\n attributes = element.attributes,\n attributeCount = attributes.length,\n idx;\n\n for (idx = 0; idx < attributeCount; idx++) {\n attribute = attributes[idx];\n result[\"@\" + attribute.nodeName] = attribute.nodeValue;\n }\n\n for (node = element.firstChild; node; node = node.nextSibling) {\n nodeType = node.nodeType;\n\n if (nodeType === 3 || nodeType === 4) {\n // text nodes or CDATA are stored as #text field\n result[\"#text\"] = node.nodeValue;\n } else if (nodeType === 1) {\n // elements are stored as fields\n parsedNode = this.parseDOM(node);\n\n nodeName = node.nodeName;\n\n member = result[nodeName];\n\n if (isArray(member)) {\n // elements of same nodeName are stored as array\n member.push(parsedNode);\n } else if (member !== undefined$1) {\n member = [member, parsedNode];\n } else {\n member = parsedNode;\n }\n\n result[nodeName] = member;\n }\n }\n return result;\n },\n\n evaluate: function(value, expression) {\n var members = expression.split(\".\"),\n member,\n result,\n length,\n intermediateResult,\n idx;\n\n while (member = members.shift()) {\n value = value[member];\n\n if (isArray(value)) {\n result = [];\n expression = members.join(\".\");\n\n for (idx = 0, length = value.length; idx < length; idx++) {\n intermediateResult = this.evaluate(value[idx], expression);\n\n intermediateResult = isArray(intermediateResult) ? intermediateResult : [intermediateResult];\n\n result.push.apply(result, intermediateResult);\n }\n\n return result;\n }\n }\n\n return value;\n },\n\n parse: function(xml) {\n var documentElement,\n tree,\n result = {};\n\n documentElement = xml.documentElement || $.parseXML(xml).documentElement;\n\n tree = this.parseDOM(documentElement);\n\n result[documentElement.nodeName] = tree;\n\n return result;\n },\n\n xpathToMember: function(member, raw) {\n if (!member) {\n return \"\";\n }\n\n member = member.replace(/^\\//, \"\") // remove the first \"/\"\n .replace(/\\//g, \".\"); // replace all \"/\" with \".\"\n\n if (member.indexOf(\"@\") >= 0) {\n // replace @attribute with '[\"@attribute\"]'\n return member.replace(/\\.?(@.*)/, raw ? '$1' : '[\"$1\"]');\n }\n\n if (member.indexOf(\"text()\") >= 0) {\n // replace \".text()\" with '[\"#text\"]'\n return member.replace(/(\\.?text\\(\\))/, raw ? '#text' : '[\"#text\"]');\n }\n\n return member;\n },\n getter: function(member) {\n return getter(this.xpathToMember(member), true);\n }\n });\n\n $.extend(true, kendo.data, {\n XmlDataReader: XmlDataReader,\n readers: {\n xml: XmlDataReader\n }\n });\n })(window.kendo.jQuery);\n var kendo$d = kendo;\n\n /*\n This code is copied/inspired by the internal @progress/kendo-data-query repo:\n https://github.com/telerik/kendo-data-query/tree/develop/src/filtering\n\n !!!\n 1. If updates are to be synced consider the accentFoldingFiltering,\n which at the moment is not present as a feature in the data-query-package.\n\n 2. Double-check available operators as well.\n\n 3. Make sure objs are strings -> i.e., replace (a || \"\") to (a + '')\n !!!\n\n In future, if we consider reusing the code directly we should revise the above omissions.\n */\n\n var logic = {\n \"or\": {\n concat: function (acc, fn) { return function (a) { return acc(a) || fn(a); }; },\n identity: function () { return false; }\n },\n \"and\": {\n concat: function (acc, fn) { return function (a) { return acc(a) && fn(a); }; },\n identity: function () { return true; }\n }\n };\n\n var operatorsMap = {\n isnullorempty: function (a) { return kendo.isBlank(a) || a === ''; },\n isnotnullorempty: function (a) { return kendo.isPresent(a) && a !== ''; },\n contains: function (a, b) { return (a + '').indexOf(b) >= 0; },\n doesnotcontain: function (a, b) { return (a + '').indexOf(b) === -1; },\n doesnotendwith: function (a, b) { return (a + '').indexOf(b, (a || \"\").length - (b || \"\").length) < 0; },\n doesnotstartwith: function (a, b) { return (a + '').lastIndexOf(b, 0) === -1; },\n endswith: function (a, b) { return (a + '').indexOf(b, (a || \"\").length - (b || \"\").length) >= 0; },\n eq: function (a, b) { return a === b; },\n gt: function (a, b) { return a > b; },\n gte: function (a, b) { return a >= b; },\n isempty: function (a) { return a === ''; },\n isnotempty: function (a) { return a !== ''; },\n isnotnull: function (a) { return kendo.isPresent(a); },\n isnull: function (a) { return kendo.isBlank(a); },\n lt: function (a, b) { return a < b; },\n lte: function (a, b) { return a <= b; },\n neq: function (a, b) { return a != b; },\n startswith: function (a, b) { return (a + '').lastIndexOf(b, 0) === 0; }\n };\n\n var dateRegExp = /^\\/Date\\((.*?)\\)\\/$/;\n\n var convertValue = function (value, ignoreCase, accentFoldingFiltering) {\n if (value != null && kendo.isString(value)) {\n var date = dateRegExp.exec(value);\n if (date) {\n return new Date(+date[1]).getTime();\n } else if (ignoreCase) {\n return accentFoldingFiltering ? value.toLocaleLowerCase(accentFoldingFiltering) : value.toLowerCase();\n }\n } else if (value != null && kendo.isDate(value)) {\n return value.getTime();\n }\n return value;\n };\n\n var typedGetter = function (prop, value, ignoreCase, accentFoldingFiltering) {\n if (!kendo.isPresent(value)) {\n return prop;\n }\n\n var acc = prop;\n\n if (kendo.isString(value)) {\n var date = dateRegExp.exec(value);\n if (date) {\n value = new Date(+date[1]);\n } else {\n acc = function (a) {\n var x = prop(a);\n if (typeof x === 'string' && ignoreCase) {\n return accentFoldingFiltering ? x.toLocaleLowerCase(accentFoldingFiltering) : x.toLowerCase();\n } else {\n return kendo.isNumeric(x) ? x + \"\" : x;\n }\n };\n }\n }\n\n if (kendo.isDate(value)) {\n return function (a) {\n var x = acc(a);\n return kendo.isDate(x) ? x.getTime() : x;\n };\n }\n return acc;\n };\n\n var transformFilter = function (ref) {\n var field = ref.field;\n var ignoreCase = ref.ignoreCase;\n var value = ref.value;\n var operator = ref.operator; if ( operator === void 0 ) operator = 'eq';\n var accentFoldingFiltering = ref.accentFoldingFiltering;\n\n field = !kendo.isPresent(field) ? function (a) { return a; } : field;\n\n ignoreCase = kendo.isPresent(ignoreCase) ? ignoreCase : true;\n\n var itemProp = typedGetter(\n kendo.isFunction(field) ? field : kendo.getter(field, true),\n value,\n ignoreCase,\n accentFoldingFiltering\n );\n\n value = convertValue(value, ignoreCase, accentFoldingFiltering);\n\n var op = kendo.isFunction(operator) ? operator : operatorsMap[operator];\n\n return function (a) { return op(itemProp(a), value, ignoreCase); };\n };\n\n var isCompositeFilterDescriptor = function (source) { return kendo.isPresent(source.filters); };\n\n var transformCompositeFilter = function (filter) {\n var accentFoldingFiltering = filter.accentFoldingFiltering;\n var combiner = logic[filter.logic || 'and'];\n return filter.filters\n .filter(kendo.isPresent)\n .map(function (x) { return (isCompositeFilterDescriptor(x) ? transformCompositeFilter(extendAccentFolding(x, accentFoldingFiltering)) : transformFilter(extendAccentFolding(x, accentFoldingFiltering))); })\n .reduce(combiner.concat, combiner.identity);\n };\n\n var extendAccentFolding = function (filter, accentFoldingFiltering) { return (kendo.isPresent(accentFoldingFiltering) ? Object.assign(filter, { accentFoldingFiltering: accentFoldingFiltering }) : filter); };\n\n var filterExprNoEval = function(expr) {\n return transformCompositeFilter(expr);\n };\n\n var __meta__$b = {\n id: \"data\",\n name: \"Data source\",\n category: \"framework\",\n description: \"Powerful component for using local and remote data.Fully supports CRUD, Sorting, Paging, Filtering, Grouping, and Aggregates.\",\n depends: [ \"core\" ],\n features: [ {\n id: \"data-odata\",\n name: \"OData\",\n description: \"Support for accessing Open Data Protocol (OData) services.\",\n depends: [ \"data.odata\" ]\n }, {\n id: \"data-signalr\",\n name: \"SignalR\",\n description: \"Support for binding to SignalR hubs.\",\n depends: [ \"data.signalr\" ]\n }, {\n id: \"data-XML\",\n name: \"XML\",\n description: \"Support for binding to XML.\",\n depends: [ \"data.xml\" ]\n }]\n };\n\n\n (function($, undefined$1) {\n var extend = $.extend,\n isPlainObject = $.isPlainObject,\n isEmptyObject = $.isEmptyObject,\n isArray = Array.isArray,\n grep = $.grep,\n ajax = $.ajax,\n map,\n each = $.each,\n noop = $.noop,\n kendo = window.kendo,\n isFunction = kendo.isFunction,\n Observable = kendo.Observable,\n Class = kendo.Class,\n STRING = \"string\",\n FUNCTION = \"function\",\n ASCENDING = \"asc\",\n CREATE = \"create\",\n READ = \"read\",\n UPDATE = \"update\",\n DESTROY = \"destroy\",\n CHANGE = \"change\",\n SYNC = \"sync\",\n GET = \"get\",\n ERROR = \"error\",\n REQUESTSTART = \"requestStart\",\n PROGRESS = \"progress\",\n REQUESTEND = \"requestEnd\",\n ITEMSLOADED = \"itemsLoaded\",\n ITEMLOAD = \"itemLoad\",\n crud = [CREATE, READ, UPDATE, DESTROY],\n identity = function(o) { return o; },\n getter = kendo.getter,\n stringify = kendo.stringify,\n math = Math,\n push = [].push,\n join = [].join,\n pop = [].pop,\n splice = [].splice,\n shift = [].shift,\n slice = [].slice,\n unshift = [].unshift,\n toString = {}.toString,\n stableSort = kendo.support.stableSort,\n dateRegExp = /^\\/Date\\((.*?)\\)\\/$/,\n objectKeys = [];\n\n var ObservableArray = Observable.extend({\n init: function(array, type) {\n var that = this;\n\n that.type = type || ObservableObject;\n\n Observable.fn.init.call(that);\n\n that.length = array.length;\n\n that.wrapAll(array, that);\n that._loadPromises = [];\n that._loadedNodes = [];\n },\n\n at: function(index) {\n return this[index];\n },\n\n toJSON: function(serializeFunctions) {\n var idx, length = this.length, value, json = new Array(length);\n\n for (idx = 0; idx < length; idx++) {\n value = this[idx];\n\n if (value instanceof ObservableObject) {\n value = value.toJSON(serializeFunctions);\n }\n\n json[idx] = value;\n }\n\n return json;\n },\n\n parent: noop,\n\n wrapAll: function(source, target) {\n var that = this,\n idx,\n length,\n parent = function() {\n return that;\n };\n\n target = target || [];\n\n for (idx = 0, length = source.length; idx < length; idx++) {\n target[idx] = that.wrap(source[idx], parent);\n }\n\n return target;\n },\n\n wrap: function(object, parent) {\n var that = this,\n observable;\n\n if (object !== null && toString.call(object) === \"[object Object]\") {\n observable = object instanceof that.type || object instanceof Model;\n\n if (!observable) {\n object = object instanceof ObservableObject ? object.toJSON() : object;\n object = new that.type(object);\n }\n\n object.parent = parent;\n\n object.bind(CHANGE, function(e) {\n var isGroup = object.hasOwnProperty(\"hasSubgroups\");\n that.trigger(CHANGE, {\n field: e.field,\n node: e.node,\n index: e.index,\n items: e.items || [this],\n action: e.node || isGroup ? (e.action || \"itemloaded\") : \"itemchange\"\n });\n });\n\n object.bind(ITEMLOAD, function(e) {\n that._loadPromises.push(e.promise);\n that._loading = true;\n\n e.promise.done(function() {\n that._loadedNodes.push(e.node);\n var index = that._loadPromises.indexOf(e.promise);\n that._loadPromises.splice(index, 1);\n\n if (!that._loadPromises.length) {\n that._loading = false;\n that.trigger(ITEMSLOADED, { collection: that, nodes: that._loadedNodes });\n that._loadedNodes = [];\n }\n });\n });\n }\n\n return object;\n },\n\n loading: function() {\n return this._loading;\n },\n\n push: function() {\n var index = this.length,\n items = this.wrapAll(arguments),\n result;\n\n result = push.apply(this, items);\n\n if (!this.omitChangeEvent) {\n this.trigger(CHANGE, {\n action: \"add\",\n index: index,\n items: items\n });\n }\n\n return result;\n },\n\n slice: slice,\n\n sort: [].sort,\n\n join: join,\n\n pop: function() {\n var length = this.length, result = pop.apply(this);\n\n if (length) {\n this.trigger(CHANGE, {\n action: \"remove\",\n index: length - 1,\n items: [result]\n });\n }\n\n return result;\n },\n\n splice: function(index, howMany, item) {\n var items = this.wrapAll(slice.call(arguments, 2)),\n result, i, len;\n\n result = splice.apply(this, [index, howMany].concat(items));\n\n if (result.length) {\n if (!this.omitChangeEvent) {\n this.trigger(CHANGE, {\n action: \"remove\",\n index: index,\n items: this.omitCache && this.omitCache.length ? result.concat(this.omitCache) : result\n });\n this.omitCache = [];\n }\n\n for (i = 0, len = result.length; i < len; i++) {\n if (result[i] && result[i].children) {\n result[i].unbind(CHANGE);\n }\n }\n }\n\n if (item) {\n if (!this.omitChangeEvent) {\n this.trigger(CHANGE, {\n action: \"add\",\n index: index,\n items: items\n });\n }\n }\n return result;\n },\n\n shift: function() {\n var length = this.length, result = shift.apply(this);\n\n if (length) {\n this.trigger(CHANGE, {\n action: \"remove\",\n index: 0,\n items: [result]\n });\n }\n\n return result;\n },\n\n unshift: function() {\n var items = this.wrapAll(arguments),\n result;\n\n result = unshift.apply(this, items);\n\n this.trigger(CHANGE, {\n action: \"add\",\n index: 0,\n items: items\n });\n\n return result;\n },\n\n indexOf: function(item) {\n var that = this,\n idx,\n length;\n\n for (idx = 0, length = that.length; idx < length; idx++) {\n if (that[idx] === item) {\n return idx;\n }\n }\n return -1;\n },\n\n forEach: function(callback, thisArg) {\n var idx = 0;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n callback.call(context, this[idx], idx, this);\n }\n },\n\n map: function(callback, thisArg) {\n var idx = 0;\n var result = [];\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n result[idx] = callback.call(context, this[idx], idx, this);\n }\n\n return result;\n },\n\n reduce: function(callback) {\n var idx = 0,\n result,\n length = this.length;\n\n if (arguments.length == 2) {\n result = arguments[1];\n } else if (idx < length) {\n result = this[idx++];\n }\n\n for (; idx < length; idx++) {\n result = callback(result, this[idx], idx, this);\n }\n\n return result;\n },\n\n reduceRight: function(callback) {\n var idx = this.length - 1,\n result;\n\n if (arguments.length == 2) {\n result = arguments[1];\n } else if (idx > 0) {\n result = this[idx--];\n }\n\n for (; idx >= 0; idx--) {\n result = callback(result, this[idx], idx, this);\n }\n\n return result;\n },\n\n filter: function(callback, thisArg) {\n var idx = 0;\n var result = [];\n var item;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback.call(context, item, idx, this)) {\n result[result.length] = item;\n }\n }\n\n return result;\n },\n\n find: function(callback, thisArg) {\n var idx = 0;\n var item;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback.call(context, item, idx, this)) {\n return item;\n }\n }\n },\n\n every: function(callback, thisArg) {\n var idx = 0;\n var item;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n item = this[idx];\n if (!callback.call(context, item, idx, this)) {\n return false;\n }\n }\n\n return true;\n },\n\n some: function(callback, thisArg) {\n var idx = 0;\n var item;\n var length = this.length;\n var context = thisArg || window;\n\n for (; idx < length; idx++) {\n item = this[idx];\n if (callback.call(context, item, idx, this)) {\n return true;\n }\n }\n\n return false;\n },\n\n // non-standard collection methods\n remove: function(item) {\n var idx = this.indexOf(item);\n\n if (idx !== -1) {\n this.splice(idx, 1);\n }\n },\n\n empty: function() {\n this.splice(0, this.length);\n }\n });\n\n // Polyfill for Symbol.iterator\n if (typeof Symbol !== \"undefined\" && Symbol.iterator && !ObservableArray.prototype[Symbol.iterator]) {\n ObservableArray.prototype[Symbol.iterator] = [][Symbol.iterator];\n }\n\n var LazyObservableArray = ObservableArray.extend({\n init: function(data, type, events) {\n var parentFn = function() { return this; };\n\n Observable.fn.init.call(this);\n\n this.type = type || ObservableObject;\n\n if (events) {\n this._events = events;\n }\n\n for (var idx = 0; idx < data.length; idx++) {\n this[idx] = data[idx];\n }\n\n this.length = idx;\n this._parent = parentFn.bind(this);\n },\n at: function(index) {\n var item = this[index];\n\n if (!(item instanceof this.type)) {\n item = this[index] = this.wrap(item, this._parent);\n } else {\n item.parent = this._parent;\n }\n\n return item;\n }\n });\n\n function eventHandler(context, type, field, prefix) {\n return function(e) {\n var event = {}, key;\n\n for (key in e) {\n event[key] = e[key];\n }\n\n if (prefix) {\n event.field = field + \".\" + e.field;\n } else {\n event.field = field;\n }\n\n if (type == CHANGE && context._notifyChange) {\n context._notifyChange(event);\n }\n\n context.trigger(type, event);\n };\n }\n\n function isPrimitiveType(value) {\n return (typeof value === \"object\" && Object.getPrototypeOf(value) === Object.getPrototypeOf({}))\n || Object.getPrototypeOf(value) === Object.getPrototypeOf(new Date())\n || typeof value !== \"object\";\n }\n\n function ownKeys(value, ignoreObjectKeys) {\n var props = [];\n var protoKeys = [];\n var keys, filteredObjectKeys;\n\n value = value || {};\n\n if (!isPrimitiveType(value)) {\n protoKeys = Object.getOwnPropertyNames(Object.getPrototypeOf(value)).filter(function (f) { return f.indexOf(\"__\") !== 0; });\n }\n\n keys = Object.getOwnPropertyNames(value).concat(protoKeys);\n\n filteredObjectKeys = objectKeys.filter(function(key) {\n return keys.indexOf(key) < 0;\n });\n\n while (value) {\n Object.getOwnPropertyNames(value).forEach(function(prop) {\n if (props.indexOf(prop) === -1 && (!ignoreObjectKeys || filteredObjectKeys.indexOf(prop) < 0)) {\n props.push(prop);\n }\n });\n value = Object.getPrototypeOf(value);\n }\n\n return props;\n }\n\n objectKeys = ownKeys({}, false);\n\n var ObservableObject = Observable.extend({\n init: function(value) {\n var that = this,\n member,\n keys = ownKeys(value, true),\n parent = function() {\n return that;\n };\n\n Observable.fn.init.call(this);\n\n this._handlers = {};\n\n keys.forEach(function(field) {\n member = value[field];\n\n if (typeof member === \"object\" && member && !member.getTime && field.charAt(0) != \"_\") {\n member = that.wrap(member, field, parent);\n }\n\n that[field] = member;\n });\n\n that.uid = kendo.guid();\n },\n\n shouldSerialize: function(field, serializeFunctions) {\n return this.hasOwnProperty(field) && field !== \"_handlers\" && field !== \"_events\" && ((serializeFunctions && serializeFunctions[field]) || typeof this[field] !== FUNCTION) && field !== \"uid\";\n },\n\n forEach: function(f) {\n for (var i in this) {\n if (this.shouldSerialize(i)) {\n f(this[i], i);\n }\n }\n },\n\n toJSON: function(serializeFunctions) {\n var result = {}, value, field;\n\n for (field in this) {\n if (this.shouldSerialize(field, serializeFunctions)) {\n value = this[field];\n\n if (value instanceof ObservableObject || value instanceof ObservableArray) {\n value = value.toJSON(serializeFunctions);\n }\n\n result[field] = value;\n }\n }\n\n return result;\n },\n\n get: function(field) {\n var that = this, result;\n\n that.trigger(GET, { field: field });\n\n if (field === \"this\") {\n result = that;\n } else {\n result = kendo.getter(field, true)(that);\n }\n\n return result;\n },\n\n _set: function(field, value) {\n var that = this;\n var composite = field.indexOf(\".\") >= 0;\n\n if (composite) {\n var paths = field.split(\".\"),\n path = \"\";\n\n while (paths.length > 1) {\n path += paths.shift();\n var obj = kendo.getter(path, true)(that);\n if (obj instanceof ObservableObject) {\n obj.set(paths.join(\".\"), value);\n return composite;\n }\n path += \".\";\n }\n }\n\n kendo.setter(field)(that, value);\n\n return composite;\n },\n\n set: function(field, value) {\n var that = this,\n isSetPrevented = false,\n composite = field.indexOf(\".\") >= 0,\n current = kendo.getter(field, true)(that);\n\n if (current !== value) {\n if (current instanceof Observable && this._handlers[field]) {\n if (this._handlers[field].get) {\n current.unbind(GET, this._handlers[field].get);\n }\n current.unbind(CHANGE, this._handlers[field].change);\n }\n\n isSetPrevented = that.trigger(\"set\", { field: field, value: value });\n\n if (!isSetPrevented) {\n if (!composite) {\n value = that.wrap(value, field, function() { return that; });\n }\n if (!that._set(field, value) || field.indexOf(\"(\") >= 0 || field.indexOf(\"[\") >= 0) {\n that.trigger(CHANGE, { field: field });\n }\n }\n }\n\n return isSetPrevented;\n },\n\n parent: noop,\n\n wrap: function(object, field, parent) {\n var that = this;\n var get;\n var change;\n var type = toString.call(object);\n\n if (object != null && (type === \"[object Object]\" || type === \"[object Array]\")) {\n var isObservableArray = object instanceof ObservableArray;\n var isDataSource = object instanceof DataSource;\n\n if (type === \"[object Object]\" && !isDataSource && !isObservableArray) {\n if (!(object instanceof ObservableObject)) {\n object = new ObservableObject(object);\n }\n\n get = eventHandler(that, GET, field, true);\n object.bind(GET, get);\n change = eventHandler(that, CHANGE, field, true);\n object.bind(CHANGE, change);\n\n that._handlers[field] = { get: get, change: change };\n } else if (type === \"[object Array]\" || isObservableArray || isDataSource) {\n if (!isObservableArray && !isDataSource) {\n object = new ObservableArray(object);\n }\n\n change = eventHandler(that, CHANGE, field, false);\n\n object.bind(CHANGE, change);\n\n that._handlers[field] = { change: change };\n }\n\n object.parent = parent;\n }\n\n return object;\n }\n });\n\n function equal(x, y) {\n if (x === y) {\n return true;\n }\n\n var xtype = kendo.type(x), ytype = kendo.type(y), field;\n\n if (xtype !== ytype) {\n return false;\n }\n\n if (xtype === \"date\") {\n return x.getTime() === y.getTime();\n }\n\n if (xtype !== \"object\" && xtype !== \"array\") {\n return false;\n }\n\n for (field in x) {\n if (!equal(x[field], y[field])) {\n return false;\n }\n }\n\n return true;\n }\n\n var parsers = {\n \"number\": function(value) {\n if (typeof value === STRING && value.toLowerCase() === \"null\") {\n return null;\n }\n return kendo.parseFloat(value);\n },\n\n \"date\": function(value) {\n if (typeof value === STRING && value.toLowerCase() === \"null\") {\n return null;\n }\n return kendo.parseDate(value);\n },\n\n \"boolean\": function(value) {\n if (typeof value === STRING) {\n if (value.toLowerCase() === \"null\") {\n return null;\n } else {\n return value.toLowerCase() === \"true\";\n }\n }\n return value != null ? !!value : value;\n },\n\n \"string\": function(value) {\n if (typeof value === STRING && value.toLowerCase() === \"null\") {\n return null;\n }\n return value != null ? (value + \"\") : value;\n },\n\n \"default\": function(value) {\n return value;\n }\n };\n\n var defaultValues = {\n \"string\": \"\",\n \"number\": 0,\n \"date\": new Date(),\n \"boolean\": false,\n \"default\": \"\"\n };\n\n function getFieldByName(obj, name) {\n var field,\n fieldName;\n\n for (fieldName in obj) {\n field = obj[fieldName];\n if (isPlainObject(field) && field.field && field.field === name) {\n return field;\n } else if (field === name) {\n return field;\n }\n }\n return null;\n }\n\n var Model = ObservableObject.extend({\n init: function(data) {\n var that = this;\n\n if (!data || $.isEmptyObject(data)) {\n data = $.extend({}, that.defaults, data);\n\n if (that._initializers) {\n for (var idx = 0; idx < that._initializers.length; idx++) {\n var name = that._initializers[idx];\n data[name] = that.defaults[name]();\n }\n }\n }\n\n ObservableObject.fn.init.call(that, data);\n\n that.dirty = false;\n that.dirtyFields = {};\n\n if (that.idField) {\n that.id = that.get(that.idField);\n\n if (that.id === undefined$1) {\n that.id = that._defaultId;\n }\n }\n },\n\n shouldSerialize: function(field) {\n return ObservableObject.fn.shouldSerialize.call(this, field) &&\n field !== \"uid\" && !(this.idField !== \"id\" && field === \"id\") &&\n field !== \"dirty\" && field !== \"dirtyFields\" && field !== \"_accessors\";\n },\n\n _parse: function(field, value) {\n var that = this,\n fieldName = field,\n fields = (that.fields || {}),\n parse;\n\n field = fields[field];\n if (!field) {\n field = getFieldByName(fields, fieldName);\n }\n if (field) {\n parse = field.parse;\n if (!parse && field.type) {\n parse = parsers[field.type.toLowerCase()];\n }\n }\n\n return parse ? parse(value) : value;\n },\n\n _notifyChange: function(e) {\n var action = e.action;\n\n if (action == \"add\" || action == \"remove\") {\n this.dirty = true;\n this.dirtyFields[e.field] = true;\n }\n },\n\n editable: function(field) {\n field = (this.fields || {})[field];\n return field ? field.editable !== false : true;\n },\n\n set: function(field, value) {\n var that = this;\n var dirty = that.dirty;\n\n if (that.editable(field)) {\n value = that._parse(field, value);\n\n if (!equal(value, that.get(field))) {\n that.dirty = true;\n that.dirtyFields[field] = true;\n\n if (ObservableObject.fn.set.call(that, field, value) && !dirty) {\n that.dirty = dirty;\n\n if (!that.dirty) {\n that.dirtyFields[field] = false;\n }\n }\n } else {\n that.trigger(\"equalSet\", { field: field, value: value });\n }\n }\n },\n\n accept: function(data) {\n var that = this,\n parent = function() { return that; },\n field;\n\n for (field in data) {\n var value = data[field];\n\n if (field.charAt(0) != \"_\") {\n value = that.wrap(data[field], field, parent);\n }\n\n that._set(field, value);\n }\n\n if (that.idField) {\n that.id = that.get(that.idField);\n }\n\n that.dirty = false;\n that.dirtyFields = {};\n },\n\n isNew: function() {\n return this.id === this._defaultId;\n }\n });\n\n Model.define = function(base, options) {\n if (options === undefined$1) {\n options = base;\n base = Model;\n }\n\n var model,\n proto = extend({ defaults: {} }, options),\n name,\n field,\n type,\n value,\n idx,\n length,\n fields = {},\n originalName,\n id = proto.id,\n functionFields = [];\n\n if (id) {\n proto.idField = id;\n }\n\n if (proto.id) {\n delete proto.id;\n }\n\n if (id) {\n proto.defaults[id] = proto._defaultId = \"\";\n }\n\n if (toString.call(proto.fields) === \"[object Array]\") {\n for (idx = 0, length = proto.fields.length; idx < length; idx++) {\n field = proto.fields[idx];\n if (typeof field === STRING) {\n fields[field] = {};\n } else if (field.field) {\n fields[field.field] = field;\n }\n }\n proto.fields = fields;\n }\n\n for (name in proto.fields) {\n field = proto.fields[name];\n type = field.type || \"default\";\n value = null;\n originalName = name;\n\n name = typeof (field.field) === STRING ? field.field : name;\n\n if (!field.nullable) {\n value = proto.defaults[originalName !== name ? originalName : name] = field.defaultValue !== undefined$1 ? field.defaultValue : defaultValues[type.toLowerCase()];\n\n if (typeof value === \"function\") {\n functionFields.push(name);\n }\n }\n\n if (options.id === name) {\n proto._defaultId = value;\n }\n\n proto.defaults[originalName !== name ? originalName : name] = value;\n\n if ($.isPlainObject(field)) {\n field.parse = field.parse || parsers[type];\n } else {\n field = {\n parse: parsers[type]\n };\n }\n }\n\n if (functionFields.length > 0) {\n proto._initializers = functionFields;\n }\n\n model = base.extend(proto);\n model.define = function(options) {\n return Model.define(model, options);\n };\n\n if (proto.fields) {\n model.fields = proto.fields;\n model.idField = proto.idField;\n }\n\n return model;\n };\n\n var Comparer = {\n selector: function(field) {\n return isFunction(field) ? field : getter(field);\n },\n\n compare: function(field) {\n var selector = this.selector(field);\n return function(a, b) {\n a = selector(a);\n b = selector(b);\n\n if (a == null && b == null) {\n return 0;\n }\n\n if (a == null) {\n return -1;\n }\n\n if (b == null) {\n return 1;\n }\n\n if (a.localeCompare) {\n return a.localeCompare(b);\n }\n\n return a > b ? 1 : (a < b ? -1 : 0);\n };\n },\n\n create: function(sort) {\n var compare = sort.compare || this.compare(sort.field);\n\n if (sort.dir == \"desc\") {\n return function(a, b) {\n return compare(b, a, true);\n };\n }\n\n return compare;\n },\n\n combine: function(comparers) {\n return function(a, b) {\n var result = comparers[0](a, b),\n idx,\n length;\n\n for (idx = 1, length = comparers.length; idx < length; idx ++) {\n result = result || comparers[idx](a, b);\n }\n\n return result;\n };\n }\n };\n\n var StableComparer = extend({}, Comparer, {\n asc: function(field) {\n var selector = this.selector(field);\n return function(a, b) {\n var valueA = selector(a);\n var valueB = selector(b);\n\n if (valueA && valueA.getTime && valueB && valueB.getTime) {\n valueA = valueA.getTime();\n valueB = valueB.getTime();\n }\n\n if (valueA === valueB) {\n return a.__position - b.__position;\n }\n\n if (valueA == null) {\n return -1;\n }\n\n if (valueB == null) {\n return 1;\n }\n\n if (valueA.localeCompare) {\n return valueA.localeCompare(valueB);\n }\n\n return valueA > valueB ? 1 : -1;\n };\n },\n\n desc: function(field) {\n var selector = this.selector(field);\n return function(a, b) {\n var valueA = selector(a);\n var valueB = selector(b);\n\n if (valueA && valueA.getTime && valueB && valueB.getTime) {\n valueA = valueA.getTime();\n valueB = valueB.getTime();\n }\n\n if (valueA === valueB) {\n return a.__position - b.__position;\n }\n\n if (valueA == null) {\n return 1;\n }\n\n if (valueB == null) {\n return -1;\n }\n\n if (valueB.localeCompare) {\n return valueB.localeCompare(valueA);\n }\n\n return valueA < valueB ? 1 : -1;\n };\n },\n create: function(sort) {\n return this[sort.dir](sort.field);\n }\n });\n\n map = function(array, callback) {\n var idx, length = array.length, result = new Array(length);\n\n for (idx = 0; idx < length; idx++) {\n result[idx] = callback(array[idx], idx, array);\n }\n\n return result;\n };\n\n var operators = (function() {\n\n function quote(str) {\n if (typeof str == \"string\") {\n str = str.replace(/[\\r\\n]+/g, \"\");\n }\n return JSON.stringify(str);\n }\n\n function textOp(impl) {\n return function(a, b, ignore, accentFoldingFiltering) {\n b += \"\";\n if (ignore) {\n a = \"(\" + a + \" + '').toString()\" + ((accentFoldingFiltering) ? \".toLocaleLowerCase('\" + accentFoldingFiltering + \"')\" : \".toLowerCase()\");\n b = ((accentFoldingFiltering) ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase());\n }\n return impl(a, quote(b), ignore);\n };\n }\n\n function operator(op, a, b, ignore, accentFoldingFiltering) {\n if (b != null) {\n if (typeof b === STRING) {\n var date = dateRegExp.exec(b);\n if (date) {\n b = new Date(+date[1]);\n } else if (ignore) {\n b = quote(((accentFoldingFiltering) ? b.toLocaleLowerCase(accentFoldingFiltering) : b.toLowerCase()));\n a = \"((\" + a + \" || '')+'')\" + ((accentFoldingFiltering) ? \".toLocaleLowerCase('\" + accentFoldingFiltering + \"')\" : \".toLowerCase()\");\n } else {\n b = quote(b);\n }\n }\n\n if (b.getTime) {\n //b looks like a Date\n a = \"(\" + a + \"&&\" + a + \".getTime?\" + a + \".getTime():\" + a + \")\";\n b = b.getTime();\n }\n }\n\n return a + \" \" + op + \" \" + b;\n }\n\n function getMatchRegexp(pattern) {\n // take a pattern, as supported by Excel match filter, and\n // convert it to the equivalent JS regular expression.\n // Excel patterns support:\n //\n // * - match any sequence of characters\n // ? - match a single character\n //\n // to match a literal * or ?, they must be prefixed by a tilde (~)\n for (var rx = \"/^\", esc = false, i = 0; i < pattern.length; ++i) {\n var ch = pattern.charAt(i);\n if (esc) {\n rx += \"\\\\\" + ch;\n } else if (ch == \"~\") {\n esc = true;\n continue;\n } else if (ch == \"*\") {\n rx += \".*\";\n } else if (ch == \"?\") {\n rx += \".\";\n } else if (\".+^$()[]{}|\\\\/\\n\\r\\u2028\\u2029\\xA0\".indexOf(ch) >= 0) {\n rx += \"\\\\\" + ch;\n } else {\n rx += ch;\n }\n esc = false;\n }\n return rx + \"$/\";\n }\n\n return {\n quote: function(value) {\n if (value && value.getTime) {\n return \"new Date(\" + value.getTime() + \")\";\n }\n return quote(value);\n },\n eq: function(a, b, ignore, accentFoldingFiltering) {\n return operator(\"==\", a, b, ignore, accentFoldingFiltering);\n },\n neq: function(a, b, ignore, accentFoldingFiltering) {\n return operator(\"!=\", a, b, ignore, accentFoldingFiltering);\n },\n gt: function(a, b, ignore) {\n return operator(\">\", a, b, ignore);\n },\n gte: function(a, b, ignore) {\n return operator(\">=\", a, b, ignore);\n },\n lt: function(a, b, ignore) {\n return operator(\"<\", a, b, ignore);\n },\n lte: function(a, b, ignore) {\n return operator(\"<=\", a, b, ignore);\n },\n startswith: textOp(function(a, b) {\n return a + \".lastIndexOf(\" + b + \", 0) == 0\";\n }),\n doesnotstartwith: textOp(function(a, b) {\n return a + \".lastIndexOf(\" + b + \", 0) == -1\";\n }),\n endswith: textOp(function(a, b) {\n var n = b ? b.length - 2 : 0;\n return a + \".indexOf(\" + b + \", \" + a + \".length - \" + n + \") >= 0\";\n }),\n doesnotendwith: textOp(function(a, b) {\n var n = b ? b.length - 2 : 0;\n return a + \".indexOf(\" + b + \", \" + a + \".length - \" + n + \") < 0\";\n }),\n contains: textOp(function(a, b) {\n return a + \".indexOf(\" + b + \") >= 0\";\n }),\n doesnotcontain: textOp(function(a, b) {\n return a + \".indexOf(\" + b + \") == -1\";\n }),\n matches: textOp(function(a, b) {\n b = b.substring(1, b.length - 1);\n return getMatchRegexp(b) + \".test(\" + a + \")\";\n }),\n doesnotmatch: textOp(function(a, b) {\n b = b.substring(1, b.length - 1);\n return \"!\" + getMatchRegexp(b) + \".test(\" + a + \")\";\n }),\n isempty: function(a) {\n return a + \" === ''\";\n },\n isnotempty: function(a) {\n return a + \" !== ''\";\n },\n isnull: function(a) {\n return \"(\" + a + \" == null)\";\n },\n isnotnull: function(a) {\n return \"(\" + a + \" != null)\";\n },\n isnullorempty: function(a) {\n return \"(\" + a + \" === null) || (\" + a + \" === '')\";\n },\n isnotnullorempty: function(a) {\n return \"(\" + a + \" !== null) && (\" + a + \" !== '')\";\n }\n };\n })();\n\n function Query(data) {\n this.data = data || [];\n }\n\n // Continue to support legacy unsafe-eval for the spreadsheet\n Query.filterExpr = function(expression, options) {\n if ( options === void 0 ) options = { noEval: false };\n\n if (options.noEval) {\n // using no-eval for most cases\n return filterExprNoEval(expression);\n }\n\n var expressions = [],\n logic = { and: \" && \", or: \" || \" },\n idx,\n length,\n filter,\n expr,\n fieldFunctions = [],\n operatorFunctions = [],\n field,\n operator,\n filters = expression.filters;\n\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n field = filter.field;\n operator = filter.operator;\n\n if (filter.filters) {\n expr = Query.filterExpr(filter);\n //Nested function fields or operators - update their index e.g. __o[0] -> __o[1]\n filter = expr.expression\n .replace(/__o\\[(\\d+)\\]/g, function(match, index) {\n index = +index;\n return \"__o[\" + (operatorFunctions.length + index) + \"]\";\n })\n .replace(/__f\\[(\\d+)\\]/g, function(match, index) {\n index = +index;\n return \"__f[\" + (fieldFunctions.length + index) + \"]\";\n });\n\n operatorFunctions.push.apply(operatorFunctions, expr.operators);\n fieldFunctions.push.apply(fieldFunctions, expr.fields);\n } else {\n if (typeof field === FUNCTION) {\n expr = \"__f[\" + fieldFunctions.length + \"](d)\";\n fieldFunctions.push(field);\n } else {\n expr = kendo.expr(field);\n }\n\n if (typeof operator === FUNCTION) {\n filter = \"__o[\" + operatorFunctions.length + \"](\" + expr + \", \" + operators.quote(filter.value) + \")\";\n operatorFunctions.push(operator);\n } else {\n filter = operators[(operator || \"eq\").toLowerCase()](expr, filter.value, filter.ignoreCase !== undefined$1 ? filter.ignoreCase : true, expression.accentFoldingFiltering);\n }\n }\n\n expressions.push(filter);\n }\n\n return { expression: \"(\" + expressions.join(logic[expression.logic]) + \")\", fields: fieldFunctions, operators: operatorFunctions };\n };\n\n function normalizeSort(field, dir) {\n if (field) {\n var descriptor = typeof field === STRING ? { field: field, dir: dir } : field,\n descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\n\n return grep(descriptors, function(d) { return !!d.dir; });\n }\n }\n\n function sortFields(sorts, dir) {\n var sortObject = {};\n\n if (sorts) {\n var descriptor = typeof sorts === STRING ? { field: sorts, dir: dir } : sorts,\n descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\n\n for (var i = 0; i < descriptors.length; i++) {\n sortObject[descriptors[i].field] = { dir: descriptors[i].dir, index: i + 1 };\n }\n }\n\n return sortObject;\n }\n\n var operatorMap = {\n \"==\": \"eq\",\n equals: \"eq\",\n isequalto: \"eq\",\n equalto: \"eq\",\n equal: \"eq\",\n \"!=\": \"neq\",\n ne: \"neq\",\n notequals: \"neq\",\n isnotequalto: \"neq\",\n notequalto: \"neq\",\n notequal: \"neq\",\n \"<\": \"lt\",\n islessthan: \"lt\",\n lessthan: \"lt\",\n less: \"lt\",\n \"<=\": \"lte\",\n le: \"lte\",\n islessthanorequalto: \"lte\",\n lessthanequal: \"lte\",\n \">\": \"gt\",\n isgreaterthan: \"gt\",\n greaterthan: \"gt\",\n greater: \"gt\",\n \">=\": \"gte\",\n isgreaterthanorequalto: \"gte\",\n greaterthanequal: \"gte\",\n ge: \"gte\",\n notsubstringof: \"doesnotcontain\",\n isnull: \"isnull\",\n isempty: \"isempty\",\n isnotempty: \"isnotempty\"\n };\n\n function normalizeOperator(expression) {\n var idx,\n length,\n filter,\n operator,\n filters = expression.filters;\n\n if (filters) {\n for (idx = 0, length = filters.length; idx < length; idx++) {\n filter = filters[idx];\n operator = filter.operator;\n\n if (operator && typeof operator === STRING) {\n filter.operator = operatorMap[operator.toLowerCase()] || operator;\n }\n\n normalizeOperator(filter);\n }\n }\n }\n\n function normalizeFilter(expression) {\n if (expression && !isEmptyObject(expression)) {\n if (isArray(expression) || !expression.filters) {\n expression = {\n logic: \"and\",\n filters: isArray(expression) ? expression : [expression]\n };\n }\n\n normalizeOperator(expression);\n\n return expression;\n }\n }\n\n Query.normalizeFilter = normalizeFilter;\n\n function compareDescriptor(f1, f2) {\n if (f1.logic || f2.logic) {\n return false;\n }\n\n return f1.field === f2.field && f1.value === f2.value && f1.operator === f2.operator;\n }\n\n function normalizeDescriptor(filter) {\n filter = filter || {};\n\n if (isEmptyObject(filter)) {\n return { logic: \"and\", filters: [] };\n }\n\n return normalizeFilter(filter);\n }\n\n function fieldComparer(a, b) {\n if (b.logic || (a.field > b.field)) {\n return 1;\n } else if (a.field < b.field) {\n return -1;\n } else {\n return 0;\n }\n }\n\n function compareFilters(expr1, expr2) {\n expr1 = normalizeDescriptor(expr1);\n expr2 = normalizeDescriptor(expr2);\n\n if (expr1.logic !== expr2.logic) {\n return false;\n }\n\n var f1, f2;\n var filters1 = (expr1.filters || []).slice();\n var filters2 = (expr2.filters || []).slice();\n\n if (filters1.length !== filters2.length) {\n return false;\n }\n\n filters1 = filters1.sort(fieldComparer);\n filters2 = filters2.sort(fieldComparer);\n\n for (var idx = 0; idx < filters1.length; idx++) {\n f1 = filters1[idx];\n f2 = filters2[idx];\n\n if (f1.logic && f2.logic) {\n if (!compareFilters(f1, f2)) {\n return false;\n }\n } else if (!compareDescriptor(f1, f2)) {\n return false;\n }\n }\n\n return true;\n }\n\n Query.compareFilters = compareFilters;\n\n function normalizeAggregate(expressions) {\n return isArray(expressions) ? expressions : [expressions];\n }\n\n function normalizeGroup(field, dir, compare, skipItemSorting) {\n var descriptor = typeof field === STRING ? { field: field, dir: dir, compare: compare, skipItemSorting: skipItemSorting } : field,\n descriptors = isArray(descriptor) ? descriptor : (descriptor !== undefined$1 ? [descriptor] : []);\n\n return map(descriptors, function(d) {\n return {\n field: d.field,\n dir: d.dir || \"asc\",\n aggregates: d.aggregates,\n compare: d.compare,\n skipItemSorting: d.skipItemSorting\n };\n });\n }\n\n function normalizeGroupWithoutCompare(field, dir, compare) {\n var descriptors = normalizeGroup(field, dir, compare);\n\n for (var i = 0; i < descriptors.length; i++) {\n delete descriptors[i].compare;\n }\n\n return descriptors;\n }\n\n function anyGroupDescriptorHasCompare(groupDescriptors) {\n var descriptors = isArray(groupDescriptors) ? groupDescriptors : [groupDescriptors];\n\n for (var i = 0; i < descriptors.length; i++) {\n if (descriptors[i] && isFunction(descriptors[i].compare)) {\n return true;\n }\n }\n\n return false;\n }\n\n Query.prototype = {\n toArray: function() {\n return this.data;\n },\n range: function(index, count) {\n return new Query(this.data.slice(index, index + count));\n },\n skip: function(count) {\n return new Query(this.data.slice(count));\n },\n take: function(count) {\n return new Query(this.data.slice(0, count));\n },\n select: function(selector) {\n return new Query(map(this.data, selector));\n },\n order: function(selector, dir, inPlace) {\n var sort = { dir: dir };\n\n if (selector) {\n if (selector.compare) {\n sort.compare = selector.compare;\n } else {\n sort.field = selector;\n }\n }\n\n if (inPlace) {\n return new Query(this.data.sort(Comparer.create(sort)));\n }\n\n return new Query(this.data.slice(0).sort(Comparer.create(sort)));\n },\n orderBy: function(selector, inPlace) {\n return this.order(selector, \"asc\", inPlace);\n },\n orderByDescending: function(selector, inPlace) {\n return this.order(selector, \"desc\", inPlace);\n },\n sort: function(field, dir, comparer, inPlace) {\n var idx,\n length,\n descriptors = normalizeSort(field, dir),\n comparers = [];\n\n comparer = comparer || Comparer;\n\n if (descriptors.length) {\n for (idx = 0, length = descriptors.length; idx < length; idx++) {\n comparers.push(comparer.create(descriptors[idx]));\n }\n\n return this.orderBy({ compare: comparer.combine(comparers) }, inPlace);\n }\n\n return this;\n },\n\n filter: function(expressions) {\n var compiled,\n data = this.data,\n result = [];\n\n expressions = normalizeFilter(expressions);\n\n if (!expressions || expressions.filters.length === 0) {\n return this;\n }\n\n compiled = Query.filterExpr(expressions, { noEval: true });\n\n result = data.filter(compiled);\n return new Query(result);\n },\n\n group: function(descriptors, allData, options) {\n descriptors = normalizeGroup(descriptors || []);\n allData = allData || this.data;\n\n var that = this,\n result = new Query(that.data),\n descriptor;\n\n if (descriptors.length > 0) {\n descriptor = descriptors[0];\n\n if (options && options.groupPaging) {\n result = new Query(allData).groupAllData(descriptor, allData).select(function(group) {\n var data = new Query(allData).filter([{\n field: group.field,\n operator: \"eq\",\n value: group.value,\n ignoreCase: false\n }]);\n var items = descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray(), options).toArray() : group.items;\n return {\n field: group.field,\n value: group.value,\n hasSubgroups: descriptors.length > 1,\n items: items,\n aggregates: data.aggregate(descriptor.aggregates),\n uid: kendo.guid(),\n itemCount: items.length,\n subgroupCount: items.length\n };\n });\n\n } else {\n result = result.groupBy(descriptor).select(function(group) {\n var data = new Query(allData).filter([ { field: group.field, operator: \"eq\", value: group.value, ignoreCase: false } ]);\n return {\n field: group.field,\n value: group.value,\n items: descriptors.length > 1 ? new Query(group.items).group(descriptors.slice(1), data.toArray()).toArray() : group.items,\n hasSubgroups: descriptors.length > 1,\n aggregates: data.aggregate(descriptor.aggregates)\n };\n });\n }\n }\n return result;\n },\n\n groupBy: function(descriptor) {\n var that = this;\n\n if (isEmptyObject(descriptor) || !this.data.length) {\n return new Query([]);\n }\n\n var field = descriptor.field,\n sorted = descriptor.skipItemSorting ? this.data : this._sortForGrouping(field, descriptor.dir || \"asc\"),\n accessor = kendo.accessor(field),\n item,\n groupValue = accessor.get(sorted[0], field),\n group = {\n field: field,\n value: groupValue,\n items: []\n },\n currentValue,\n idx,\n len,\n result = [group];\n\n for (idx = 0, len = sorted.length; idx < len; idx++) {\n item = sorted[idx];\n currentValue = accessor.get(item, field);\n if (!groupValueComparer(groupValue, currentValue)) {\n groupValue = currentValue;\n group = {\n field: field,\n value: groupValue,\n items: []\n };\n result.push(group);\n }\n group.items.push(item);\n }\n\n result = that._sortGroups(result, descriptor);\n\n return new Query(result);\n },\n\n groupAllData: function(descriptor, allData) {\n if (isEmptyObject(descriptor) || this.data && !this.data.length) {\n return new Query([]);\n }\n\n var field = descriptor.field,\n sorted = descriptor.skipItemSorting ? allData : new Query(allData).sort(field, descriptor.dir || \"asc\", StableComparer).toArray(),\n accessor = kendo.accessor(field),\n item,\n groupValue = accessor.get(sorted[0], field),\n group = {\n field: field,\n value: groupValue,\n items: []\n },\n currentValue,\n idx,\n len,\n result = [group];\n\n for (idx = 0, len = sorted.length; idx < len; idx++) {\n item = sorted[idx];\n currentValue = accessor.get(item, field);\n if (!groupValueComparer(groupValue, currentValue)) {\n groupValue = currentValue;\n group = {\n field: field,\n value: groupValue,\n items: []\n };\n result.push(group);\n }\n group.items.push(item);\n }\n\n result = this._sortGroups(result, descriptor);\n\n return new Query(result);\n },\n\n _sortForGrouping: function(field, dir) {\n var idx, length,\n data = this.data;\n\n if (!stableSort) {\n for (idx = 0, length = data.length; idx < length; idx++) {\n data[idx].__position = idx;\n }\n\n data = new Query(data).sort(field, dir, StableComparer).toArray();\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n delete data[idx].__position;\n }\n return data;\n }\n\n return this.sort(field, dir).toArray();\n },\n\n _sortGroups: function(groups, descriptor) {\n var result = groups;\n\n if (descriptor && isFunction(descriptor.compare)) {\n result = new Query(result).order({ compare: descriptor.compare }, descriptor.dir || ASCENDING).toArray();\n }\n\n return result;\n },\n\n aggregate: function(aggregates) {\n var idx,\n len,\n result = {},\n state = {};\n\n if (aggregates && aggregates.length) {\n for (idx = 0, len = this.data.length; idx < len; idx++) {\n calculateAggregate(result, aggregates, this.data[idx], idx, len, state);\n }\n }\n return result;\n }\n };\n\n function groupValueComparer(a, b) {\n if (a && a.getTime && b && b.getTime) {\n return a.getTime() === b.getTime();\n }\n return a === b;\n }\n\n function calculateAggregate(accumulator, aggregates, item, index, length, state) {\n aggregates = aggregates || [];\n var idx,\n aggr,\n functionName,\n len = aggregates.length;\n\n for (idx = 0; idx < len; idx++) {\n aggr = aggregates[idx];\n functionName = aggr.aggregate;\n var field = aggr.field;\n accumulator[field] = accumulator[field] || {};\n state[field] = state[field] || {};\n state[field][functionName] = state[field][functionName] || {};\n accumulator[field][functionName] = functions[functionName.toLowerCase()](accumulator[field][functionName], item, kendo.accessor(field), index, length, state[field][functionName]);\n }\n }\n\n var functions = {\n sum: function(accumulator, item, accessor) {\n var value = accessor.get(item);\n\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n\n return accumulator;\n },\n count: function(accumulator) {\n return (accumulator || 0) + 1;\n },\n average: function(accumulator, item, accessor, index, length, state) {\n var value = accessor.get(item);\n\n if (state.count === undefined$1) {\n state.count = 0;\n }\n\n if (!isNumber(accumulator)) {\n accumulator = value;\n } else if (isNumber(value)) {\n accumulator += value;\n }\n\n if (isNumber(value)) {\n state.count++;\n }\n\n if (index == length - 1 && isNumber(accumulator)) {\n accumulator = accumulator / state.count;\n }\n return accumulator;\n },\n max: function(accumulator, item, accessor) {\n var value = accessor.get(item);\n\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n\n if (accumulator < value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n },\n min: function(accumulator, item, accessor) {\n var value = accessor.get(item);\n\n if (!isNumber(accumulator) && !isDate(accumulator)) {\n accumulator = value;\n }\n\n if (accumulator > value && (isNumber(value) || isDate(value))) {\n accumulator = value;\n }\n return accumulator;\n }\n };\n\n function isNumber(val) {\n return typeof val === \"number\" && !isNaN(val);\n }\n\n function isDate(val) {\n return val && val.getTime;\n }\n\n function toJSON(array) {\n var idx, length = array.length, result = new Array(length);\n\n for (idx = 0; idx < length; idx++) {\n result[idx] = array[idx].toJSON();\n }\n\n return result;\n }\n\n Query.normalizeGroup = normalizeGroup;\n Query.normalizeSort = normalizeSort;\n\n Query.process = function(data, options, inPlace) {\n options = options || {};\n\n var group = options.group;\n var customGroupSort = anyGroupDescriptorHasCompare(normalizeGroup(group || []));\n var query = new Query(data),\n groupDescriptorsWithoutCompare = normalizeGroupWithoutCompare(group || []),\n normalizedSort = normalizeSort(options.sort || []),\n sort = customGroupSort ? normalizedSort : groupDescriptorsWithoutCompare.concat(normalizedSort),\n groupDescriptorsWithoutSort,\n total,\n filterCallback = options.filterCallback,\n filter = options.filter,\n skip = options.skip,\n take = options.take;\n\n if (sort && inPlace) {\n query = query.sort(sort, undefined$1, undefined$1, inPlace);\n }\n\n if (filter) {\n query = query.filter(filter);\n\n if (filterCallback) {\n query = filterCallback(query);\n }\n\n total = query.toArray().length;\n }\n\n if (sort) {\n if (!inPlace) {\n query = query.sort(sort);\n }\n\n if (group) {\n data = query.toArray();\n }\n }\n\n if (customGroupSort) {\n query = query.group(group, data, options);\n\n if (skip !== undefined$1 && take !== undefined$1 && !options.groupPaging) {\n query = new Query(flatGroups(query.toArray())).range(skip, take);\n\n groupDescriptorsWithoutSort = map(groupDescriptorsWithoutCompare, function(groupDescriptor) {\n return extend({}, groupDescriptor, {\n skipItemSorting: true\n });\n });\n\n query = query.group(groupDescriptorsWithoutSort, data, options);\n }\n } else {\n if (skip !== undefined$1 && take !== undefined$1) {\n total = query.data.length;\n\n if (skip + take > total && options.virtual) {\n skip -= skip + take - total;\n skip = skip < 0 ? 0 : skip;\n }\n query = query.range(skip, take);\n }\n\n if (group && (!isEmptyObject(group) || group.length !== 0)) {\n query = query.group(group, data, options);\n }\n }\n\n return {\n total: total,\n data: query.toArray()\n };\n };\n\n var LocalTransport = Class.extend({\n init: function(options) {\n this.data = options.data;\n },\n\n read: function(options) {\n options.success(this.data);\n },\n update: function(options) {\n options.success(options.data);\n },\n create: function(options) {\n options.success(options.data);\n },\n destroy: function(options) {\n options.success(options.data);\n }\n });\n\n var RemoteTransport = Class.extend( {\n init: function(options) {\n var that = this, parameterMap;\n\n options = that.options = extend({}, that.options, options);\n\n each(crud, function(index, type) {\n if (typeof options[type] === STRING) {\n options[type] = {\n url: options[type]\n };\n }\n });\n\n that.cache = options.cache ? Cache.create(options.cache) : {\n find: noop,\n add: noop\n };\n\n parameterMap = options.parameterMap;\n\n if (options.submit) {\n that.submit = options.submit;\n }\n\n if (isFunction(options.push)) {\n that.push = options.push;\n }\n\n if (!that.push) {\n that.push = identity;\n }\n\n that.parameterMap = isFunction(parameterMap) ? parameterMap : function(options) {\n var result = {};\n\n each(options, function(option, value) {\n if (option in parameterMap) {\n option = parameterMap[option];\n if (isPlainObject(option)) {\n value = option.value(value);\n option = option.key;\n }\n }\n\n result[option] = value;\n });\n\n return result;\n };\n },\n\n options: {\n parameterMap: identity\n },\n\n create: function(options) {\n return ajax(this.setup(options, CREATE));\n },\n\n read: function(options) {\n var that = this,\n success,\n error,\n result,\n cache = that.cache;\n\n options = that.setup(options, READ);\n\n success = options.success || noop;\n error = options.error || noop;\n\n result = cache.find(options.data);\n\n if (result !== undefined$1) {\n success(result);\n } else {\n options.success = function(result) {\n cache.add(options.data, result);\n\n success(result);\n };\n\n $.ajax(options);\n }\n },\n\n update: function(options) {\n return ajax(this.setup(options, UPDATE));\n },\n\n destroy: function(options) {\n return ajax(this.setup(options, DESTROY));\n },\n\n setup: function(options, type) {\n options = options || {};\n\n var that = this,\n parameters,\n operation = that.options[type],\n data = isFunction(operation.data) ? operation.data(options.data) : operation.data;\n\n options = extend(true, {}, operation, options);\n parameters = extend(true, {}, data, options.data);\n\n options.data = that.parameterMap(parameters, type);\n\n if (isFunction(options.url)) {\n options.url = options.url(parameters);\n }\n\n return options;\n }\n });\n\n var Cache = Class.extend({\n init: function() {\n this._store = {};\n },\n add: function(key, data) {\n if (key !== undefined$1) {\n this._store[stringify(key)] = data;\n }\n },\n find: function(key) {\n return this._store[stringify(key)];\n },\n clear: function() {\n this._store = {};\n },\n remove: function(key) {\n delete this._store[stringify(key)];\n }\n });\n\n Cache.create = function(options) {\n var store = {\n \"inmemory\": function() { return new Cache(); }\n };\n\n if (isPlainObject(options) && isFunction(options.find)) {\n return options;\n }\n\n if (options === true) {\n return new Cache();\n }\n\n return store[options]();\n };\n\n function serializeRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record,\n getter,\n originalName,\n idx,\n setters = {},\n length;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n for (getter in getters) {\n originalName = fieldNames[getter];\n\n if (originalName && originalName !== getter) {\n if (!setters[originalName]) {\n setters[originalName] = kendo.setter(originalName);\n }\n setters[originalName](record, getters[getter](record));\n delete record[getter];\n }\n }\n }\n }\n\n function convertRecords(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record,\n getter,\n originalName,\n idx,\n length;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n for (getter in getters) {\n record[getter] = modelInstance._parse(getter, getters[getter](record));\n\n originalName = fieldNames[getter];\n if (originalName && originalName !== getter) {\n delete record[originalName];\n }\n }\n }\n }\n\n function convertGroup(data, getters, modelInstance, originalFieldNames, fieldNames) {\n var record,\n idx,\n fieldName,\n length;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n record = data[idx];\n\n fieldName = originalFieldNames[record.field];\n if (fieldName && fieldName != record.field) {\n record.field = fieldName;\n }\n\n record.value = modelInstance._parse(record.field, record.value);\n\n if (record.items) {\n if (record.hasSubgroups) {\n convertGroup(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n } else {\n convertRecords(record.items, getters, modelInstance, originalFieldNames, fieldNames);\n }\n }\n }\n }\n\n function wrapDataAccess(originalFunction, model, converter, getters, originalFieldNames, fieldNames) {\n return function(data) {\n data = originalFunction(data);\n\n return wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames)(data);\n };\n }\n\n function wrapDataAccessBase(model, converter, getters, originalFieldNames, fieldNames) {\n return function(data) {\n\n if (data && !isEmptyObject(getters)) {\n if (toString.call(data) !== \"[object Array]\" && !(data instanceof ObservableArray)) {\n data = [data];\n }\n\n converter(data, getters, new model(), originalFieldNames, fieldNames);\n }\n\n return data || [];\n };\n }\n\n var DataReader = Class.extend({\n init: function(schema) {\n var that = this, member, get, model, base;\n\n schema = schema || {};\n\n for (member in schema) {\n get = schema[member];\n\n that[member] = typeof get === STRING ? getter(get) : get;\n }\n\n base = schema.modelBase || Model;\n\n if (isPlainObject(that.model)) {\n that.model = model = base.define(that.model);\n }\n\n var dataFunction = that.data.bind(that);\n\n that._dataAccessFunction = dataFunction;\n\n if (that.model) {\n var groupsFunction = that.groups.bind(that),\n serializeFunction = that.serialize.bind(that),\n originalFieldNames = {},\n getters = {},\n serializeGetters = {},\n fieldNames = {},\n shouldSerialize = false,\n fieldName,\n name;\n\n model = that.model;\n\n if (model.fields) {\n each(model.fields, function(field, value) {\n var fromName;\n\n fieldName = field;\n\n if (isPlainObject(value) && value.field) {\n fieldName = value.field;\n } else if (typeof value === STRING) {\n fieldName = value;\n }\n\n if (isPlainObject(value) && value.from) {\n fromName = value.from;\n }\n\n shouldSerialize = shouldSerialize || (fromName && fromName !== field) || fieldName !== field;\n name = fromName || fieldName;\n getters[field] = name.indexOf(\".\") !== -1 ? getter(name, true) : getter(name);\n serializeGetters[field] = getter(field);\n originalFieldNames[fromName || fieldName] = field;\n fieldNames[field] = fromName || fieldName;\n });\n\n if (!schema.serialize && shouldSerialize) {\n that.serialize = wrapDataAccess(serializeFunction, model, serializeRecords, serializeGetters, originalFieldNames, fieldNames);\n }\n }\n\n that._dataAccessFunction = dataFunction;\n that._wrapDataAccessBase = wrapDataAccessBase(model, convertRecords, getters, originalFieldNames, fieldNames);\n that.data = wrapDataAccess(dataFunction, model, convertRecords, getters, originalFieldNames, fieldNames);\n that.groups = wrapDataAccess(groupsFunction, model, convertGroup, getters, originalFieldNames, fieldNames);\n }\n },\n errors: function(data) {\n return data ? data.errors : null;\n },\n parse: identity,\n data: identity,\n total: function(data) {\n return data.length;\n },\n groups: identity,\n aggregates: function() {\n return {};\n },\n serialize: function(data) {\n return data;\n }\n });\n\n function fillLastGroup(originalGroup, newGroup) {\n var currOriginal;\n var currentNew;\n\n if (newGroup.items && newGroup.items.length) {\n for (var i = 0; i < newGroup.items.length; i++) {\n currOriginal = originalGroup.items[originalGroup.items.length - 1];\n currentNew = newGroup.items[i];\n if (currOriginal && currentNew) {\n if (currOriginal.hasSubgroups && currOriginal.value == currentNew.value) {\n fillLastGroup(currOriginal, currentNew);\n } else if (currOriginal.field && currOriginal.value == currentNew.value) {\n currOriginal.items.omitChangeEvent = true;\n currOriginal.items.push.apply(currOriginal.items, currentNew.items);\n currOriginal.items.omitChangeEvent = false;\n } else {\n originalGroup.items.omitChangeEvent = true;\n originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n originalGroup.items.omitChangeEvent = false;\n }\n } else if (currentNew) {\n originalGroup.items.omitChangeEvent = true;\n originalGroup.items.push.apply(originalGroup.items, [currentNew]);\n originalGroup.items.omitChangeEvent = false;\n }\n }\n }\n }\n function mergeGroups(target, dest, skip, take) {\n var group,\n idx = 0,\n items;\n\n while (dest.length && take) {\n group = dest[idx];\n items = group.items;\n\n var length = items.length;\n\n if (target && target.field === group.field && target.value === group.value) {\n if (target.hasSubgroups && target.items.length) {\n mergeGroups(target.items[target.items.length - 1], group.items, skip, take);\n } else {\n items = items.slice(skip, skip + take);\n target.items = target.items.concat(items);\n }\n dest.splice(idx--, 1);\n } else if (group.hasSubgroups && items.length) {\n mergeGroups(group, items, skip, take);\n if (!group.items.length) {\n dest.splice(idx--, 1);\n }\n } else {\n items = items.slice(skip, skip + take);\n group.items = items;\n\n if (!group.items.length) {\n dest.splice(idx--, 1);\n }\n }\n\n if (items.length === 0) {\n skip -= length;\n } else {\n skip = 0;\n take -= items.length;\n }\n\n if (++idx >= dest.length) {\n break;\n }\n }\n\n if (idx < dest.length) {\n dest.splice(idx, dest.length - idx);\n }\n }\n\n function flatGroups(groups, indexFunction) {\n var result = [];\n var groupsLength = (groups || []).length;\n var group;\n var items;\n var indexFn = isFunction(indexFunction) ? indexFunction : function(array, index) {\n return array[index];\n };\n\n for (var groupIndex = 0; groupIndex < groupsLength; groupIndex++) {\n group = indexFn(groups, groupIndex);\n\n if (group.hasSubgroups) {\n result = result.concat(flatGroups(group.items));\n } else {\n items = group.items;\n\n for (var itemIndex = 0; itemIndex < items.length; itemIndex++) {\n result.push(indexFn(items, itemIndex));\n }\n }\n }\n return result;\n }\n\n function flattenGroups(data) {\n var idx,\n result = [],\n length,\n items,\n itemIndex;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n var group = data.at(idx);\n if (group.items) {\n if (group.hasSubgroups) {\n result = result.concat(flattenGroups(group.items));\n } else {\n items = group.items;\n for (itemIndex = 0; itemIndex < items.length; itemIndex++) {\n result.push(items.at(itemIndex));\n }\n }\n }\n }\n return result;\n }\n\n function wrapGroupItems(data, model) {\n var idx, length, group;\n if (model) {\n for (idx = 0, length = data.length; idx < length; idx++) {\n group = data.at(idx);\n if (group.items) {\n if (group.hasSubgroups) {\n wrapGroupItems(group.items, model);\n } else {\n group.items = new LazyObservableArray(group.items, model, group.items._events);\n }\n }\n }\n }\n }\n\n function eachGroupItems(data, func) {\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx].hasSubgroups) {\n if (eachGroupItems(data[idx].items, func)) {\n return true;\n }\n } else if (func(data[idx].items, data[idx])) {\n return true;\n }\n }\n }\n\n function replaceInRanges(ranges, data, item, observable) {\n for (var idx = 0; idx < ranges.length; idx++) {\n if (ranges[idx].data === data) {\n break;\n }\n if (replaceInRange(ranges[idx].data, item, observable)) {\n break;\n }\n }\n }\n\n function replaceInRange(items, item, observable) {\n for (var idx = 0, length = items.length; idx < length; idx++) {\n if (items[idx] && items[idx].hasSubgroups) {\n return replaceInRange(items[idx].items, item, observable);\n } else if (items[idx] === item || items[idx] === observable) {\n items[idx] = observable;\n return true;\n }\n }\n }\n\n function replaceWithObservable(view, data, ranges, type, serverGrouping) {\n for (var viewIndex = 0, length = view.length; viewIndex < length; viewIndex++) {\n var item = view[viewIndex];\n\n if (!item || item instanceof type) {\n continue;\n }\n\n if (item.hasSubgroups !== undefined$1 && !serverGrouping) {\n replaceWithObservable(item.items, data, ranges, type, serverGrouping);\n } else {\n for (var idx = 0; idx < data.length; idx++) {\n if (data[idx] === item) {\n view[viewIndex] = data.at(idx);\n replaceInRanges(ranges, data, item, view[viewIndex]);\n break;\n }\n }\n }\n }\n }\n\n function removeModel(data, model) {\n if (!data) {\n return;\n }\n var length = data.length;\n var dataItem;\n var idx;\n\n for (idx = 0; idx < length; idx++) {\n dataItem = data[idx];\n\n if (dataItem.uid && dataItem.uid == model.uid) {\n data.splice(idx, 1);\n return dataItem;\n }\n }\n }\n\n function indexOfPristineModel(data, model) {\n if (model) {\n return indexOf(data, function(item) {\n return (item.uid && item.uid == model.uid) || (item[model.idField] === model.id && model.id !== model._defaultId);\n });\n }\n return -1;\n }\n\n function indexOfModel(data, model) {\n if (model) {\n return indexOf(data, function(item) {\n return item.uid == model.uid;\n });\n }\n return -1;\n }\n\n function indexOf(data, comparer) {\n var idx, length;\n if (!data) {\n return;\n }\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (comparer(data[idx])) {\n return idx;\n }\n }\n\n return -1;\n }\n\n function fieldNameFromModel(fields, name) {\n if (fields && !isEmptyObject(fields)) {\n var descriptor = fields[name];\n var fieldName;\n if (isPlainObject(descriptor)) {\n fieldName = descriptor.from || descriptor.field || name;\n } else {\n fieldName = fields[name] || name;\n }\n\n if (isFunction(fieldName)) {\n return name;\n }\n\n return fieldName;\n }\n return name;\n }\n\n function convertFilterDescriptorsField(descriptor, model) {\n var idx,\n length,\n target = {};\n\n for (var field in descriptor) {\n if (field !== \"filters\") {\n target[field] = descriptor[field];\n }\n }\n\n if (descriptor.filters) {\n target.filters = [];\n for (idx = 0, length = descriptor.filters.length; idx < length; idx++) {\n target.filters[idx] = convertFilterDescriptorsField(descriptor.filters[idx], model);\n }\n } else {\n target.field = fieldNameFromModel(model.fields, target.field);\n }\n return target;\n }\n\n function convertDescriptorsField(descriptors, model) {\n var idx,\n length,\n result = [],\n target,\n descriptor;\n\n for (idx = 0, length = descriptors.length; idx < length; idx ++) {\n target = {};\n\n descriptor = descriptors[idx];\n\n for (var field in descriptor) {\n target[field] = descriptor[field];\n }\n\n target.field = fieldNameFromModel(model.fields, target.field);\n\n if (target.aggregates && isArray(target.aggregates)) {\n target.aggregates = convertDescriptorsField(target.aggregates, model);\n }\n result.push(target);\n }\n return result;\n }\n\n var DataSource = Observable.extend({\n init: function(options) {\n var that = this, model, data;\n\n if (options) {\n data = options.data;\n }\n\n options = that.options = extend({}, that.options, options);\n\n that._map = {};\n that._prefetch = {};\n that._data = [];\n that._pristineData = [];\n that._ranges = [];\n that._view = [];\n that._pristineTotal = 0;\n that._destroyed = [];\n that._pageSize = options.pageSize;\n that._page = options.page || (options.pageSize ? 1 : undefined$1);\n that._sort = normalizeSort(options.sort);\n that._sortFields = sortFields(options.sort);\n that._filter = normalizeFilter(options.filter);\n that._group = normalizeGroup(options.group);\n that._aggregate = options.aggregate;\n that._total = options.total;\n that._groupPaging = options.groupPaging;\n\n if (that._groupPaging) {\n that._groupsState = {};\n }\n that._shouldDetachObservableParents = true;\n\n Observable.fn.init.call(that);\n\n that.transport = Transport.create(options, data, that);\n\n if (isFunction(that.transport.push)) {\n that.transport.push({\n pushCreate: that._pushCreate.bind(that),\n pushUpdate: that._pushUpdate.bind(that),\n pushDestroy: that._pushDestroy.bind(that)\n });\n }\n\n if (options.offlineStorage != null) {\n if (typeof options.offlineStorage == \"string\") {\n var key = options.offlineStorage;\n\n that._storage = {\n getItem: function() {\n return JSON.parse(localStorage.getItem(key));\n },\n setItem: function(item) {\n localStorage.setItem(key, stringify(that.reader.serialize(item)));\n }\n };\n } else {\n that._storage = options.offlineStorage;\n }\n }\n\n that.reader = new kendo.data.readers[options.schema.type || \"json\" ](options.schema);\n\n model = that.reader.model || {};\n\n that._detachObservableParents();\n\n that._data = that._observe(that._data);\n that._online = true;\n\n that.bind([\"push\", ERROR, CHANGE, REQUESTSTART, SYNC, REQUESTEND, PROGRESS], options);\n },\n\n options: {\n data: null,\n schema: {\n modelBase: Model\n },\n offlineStorage: null,\n serverSorting: false,\n serverPaging: false,\n serverFiltering: false,\n serverGrouping: false,\n serverAggregates: false,\n batch: false,\n inPlaceSort: false\n },\n\n clone: function() {\n return this;\n },\n\n online: function(value) {\n if (value !== undefined$1) {\n if (this._online != value) {\n this._online = value;\n\n if (value) {\n return this.sync();\n }\n }\n\n return $.Deferred().resolve().promise();\n } else {\n return this._online;\n }\n },\n\n offlineData: function(state) {\n if (this.options.offlineStorage == null) {\n return null;\n }\n\n if (state !== undefined$1) {\n return this._storage.setItem(state);\n }\n\n return this._storage.getItem() || [];\n },\n\n _isGrouped: function() {\n var group = this.group() || [];\n\n return group.length;\n },\n\n _isServerGrouped: function() {\n var group = this.group() || [];\n\n return this.options.serverGrouping && group.length;\n },\n\n _isServerGroupPaged: function() {\n return this._isServerGrouped() && this._groupPaging;\n },\n\n _isGroupPaged: function() {\n var group = this._group || [];\n\n return this._groupPaging && group.length;\n },\n\n _pushCreate: function(result) {\n this._push(result, \"pushCreate\");\n },\n\n _pushUpdate: function(result) {\n this._push(result, \"pushUpdate\");\n },\n\n _pushDestroy: function(result) {\n this._push(result, \"pushDestroy\");\n },\n\n _push: function(result, operation) {\n var data = this._readData(result);\n\n if (!data) {\n data = result;\n }\n\n this[operation](data);\n },\n\n _flatData: function(data, skip) {\n if (data) {\n if (this._isServerGrouped()) {\n return flattenGroups(data);\n }\n\n if (!skip) {\n for (var idx = 0; idx < data.length; idx++) {\n data.at(idx);\n }\n }\n }\n\n return data;\n },\n\n parent: noop,\n\n get: function(id) {\n var idx, length, data = this._flatData(this._data, this.options.useRanges);\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].id == id) {\n return data[idx];\n }\n }\n },\n\n getByUid: function(id) {\n return this._getByUid(id, this._data);\n },\n\n _getByUid: function(id, dataItems) {\n var idx, length, data = this._flatData(dataItems, this.options.useRanges);\n\n if (!data) {\n return;\n }\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].uid == id) {\n return data[idx];\n }\n }\n },\n\n indexOf: function(model) {\n return indexOfModel(this._data, model);\n },\n\n at: function(index) {\n return this._data.at(index);\n },\n\n data: function(value) {\n var that = this;\n if (value !== undefined$1) {\n that._detachObservableParents();\n that._data = this._observe(value);\n\n that._pristineData = value.slice(0);\n\n that._storeData();\n\n that._ranges = [];\n that.trigger(\"reset\");\n that._addRange(that._data);\n\n that._total = that._data.length;\n that._pristineTotal = that._total;\n\n that._process(that._data);\n } else {\n if (that._data) {\n for (var idx = 0; idx < that._data.length; idx++) {\n that._data.at(idx);\n }\n }\n\n return that._data;\n }\n },\n\n view: function(value) {\n if (value === undefined$1) {\n return this._view;\n } else {\n this._view = this._observeView(value);\n }\n },\n\n _observeView: function(data) {\n var that = this;\n replaceWithObservable(data, that._data, that._ranges, that.reader.model || ObservableObject, that._isServerGrouped());\n\n var view = new LazyObservableArray(data, that.reader.model);\n view.parent = function() { return that.parent(); };\n return view;\n },\n\n flatView: function() {\n var groups = this.group() || [];\n\n if (groups.length) {\n return flattenGroups(this._view);\n } else {\n return this._view;\n }\n },\n\n add: function(model) {\n return this.insert(this._data.length, model);\n },\n\n _createNewModel: function(model) {\n if (this.reader.model) {\n return new this.reader.model(model);\n }\n\n if (model instanceof ObservableObject) {\n return model;\n }\n\n return new ObservableObject(model);\n },\n\n insert: function(index, model) {\n if (!model) {\n model = index;\n index = 0;\n }\n\n if (!(model instanceof Model)) {\n model = this._createNewModel(model);\n }\n\n if (this._isServerGrouped()) {\n this._data.splice(index, 0, this._wrapInEmptyGroup(model));\n } else {\n this._data.splice(index, 0, model);\n }\n\n this._insertModelInRange(index, model);\n\n return model;\n },\n\n pushInsert: function(index, items) {\n var that = this;\n var rangeSpan = that._getCurrentRangeSpan();\n\n if (!items) {\n items = index;\n index = 0;\n }\n\n if (!isArray(items)) {\n items = [items];\n }\n\n var pushed = [];\n var autoSync = this.options.autoSync;\n this.options.autoSync = false;\n\n try {\n for (var idx = 0; idx < items.length; idx ++) {\n var item = items[idx];\n\n var result = this.insert(index, item);\n\n pushed.push(result);\n\n var pristine = result.toJSON();\n\n if (this._isServerGrouped()) {\n pristine = this._wrapInEmptyGroup(pristine);\n }\n\n this._pristineData.push(pristine);\n\n if (rangeSpan && rangeSpan.length) {\n $(rangeSpan).last()[0].pristineData.push(pristine);\n }\n\n index++;\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n\n if (pushed.length) {\n this.trigger(\"push\", {\n type: \"create\",\n items: pushed\n });\n }\n },\n\n pushCreate: function(items) {\n this.pushInsert(this._data.length, items);\n },\n\n pushUpdate: function(items) {\n if (!isArray(items)) {\n items = [items];\n }\n\n var pushed = [];\n\n for (var idx = 0; idx < items.length; idx ++) {\n var item = items[idx];\n var model = this._createNewModel(item);\n\n var target = this.get(model.id);\n\n if (target) {\n pushed.push(target);\n\n target.accept(item);\n\n target.trigger(CHANGE);\n\n this._updatePristineForModel(target, item);\n } else {\n this.pushCreate(item);\n }\n }\n\n if (pushed.length) {\n this.trigger(\"push\", {\n type: \"update\",\n items: pushed\n });\n }\n },\n\n pushDestroy: function(items) {\n var pushed = this._removeItems(items);\n\n if (pushed.length) {\n this.trigger(\"push\", {\n type: \"destroy\",\n items: pushed\n });\n }\n },\n\n _removeItems: function(itemsToRemove, removePristine) {\n if (!isArray(itemsToRemove)) {\n itemsToRemove = [itemsToRemove];\n }\n\n var shouldRemovePristine = typeof removePristine !== \"undefined\" ? removePristine : true;\n\n var destroyed = [];\n var autoSync = this.options.autoSync;\n this.options.autoSync = false;\n try {\n for (var idx = 0; idx < itemsToRemove.length; idx ++) {\n var item = itemsToRemove[idx];\n var model = this._createNewModel(item);\n var found = false;\n var index = idx;\n\n this._eachItem(this._data, function(items) {\n // Ensure all children of a parent are removed before the change event is triggered.\n if (index !== itemsToRemove.length - 1) {\n items.omitChangeEvent = true;\n items.omitCache = [];\n } else {\n items.omitChangeEvent = false;\n }\n\n for (var idx = 0; idx < items.length; idx++) {\n var item = items.at(idx);\n if (item.id === model.id) {\n /* When the change event is omitted, certain calculations such as 'total' are broken because only the last item reaches the change handler.\n Keep track of all child items that had their change event omitted and when the change is finally triggered, concat them to the result.*/\n if (items.omitChangeEvent) {\n items.omitCache.push(item);\n }\n destroyed.push(item);\n items.splice(idx, 1);\n found = true;\n break;\n }\n }\n });\n\n if (found && shouldRemovePristine) {\n this._removePristineForModel(model);\n this._destroyed.pop();\n }\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n\n return destroyed;\n },\n\n pushMove: function(index, items) {\n var pushed = this._moveItems(index, items);\n\n if (pushed.length) {\n this.trigger(\"push\", {\n type: \"update\",\n items: pushed\n });\n }\n },\n\n _moveItems: function(index, items) {\n if (!isArray(items)) {\n items = [items];\n }\n\n var moved = [];\n var autoSync = this.options.autoSync;\n this.options.autoSync = false;\n\n try {\n for (var i = 0; i < items.length; i ++) {\n var item = items[i];\n var model = this._createNewModel(item);\n\n this._eachItem(this._data, function(dataItems) {\n for (var idx = 0; idx < dataItems.length; idx++) {\n var dataItem = dataItems.at(idx);\n if (dataItem.id === model.id) {\n moved.push(dataItem);\n dataItems.splice(index >= idx ? --index : index, 0, dataItems.splice(idx, 1)[0]);\n index++;\n break;\n }\n }\n });\n }\n } finally {\n this.options.autoSync = autoSync;\n }\n\n return moved;\n },\n\n remove: function(model) {\n var result,\n that = this,\n hasGroups = that._isServerGrouped();\n\n if (hasGroups && model.uid && (!model.isNew || !model.isNew())) {\n that._pushInDestroyed(model);\n }\n\n this._eachItem(that._data, function(items) {\n result = removeModel(items, model);\n\n if (result && hasGroups) {\n return true;\n }\n });\n\n this._removeModelFromRanges(model);\n\n return model;\n },\n\n destroyed: function() {\n return this._destroyed;\n },\n\n created: function() {\n var idx,\n length,\n result = [],\n data = this._flatData(this._data, this.options.useRanges);\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if (data[idx].isNew && data[idx].isNew() && !data[idx].notFetched) {\n result.push(data[idx]);\n }\n }\n return result;\n },\n\n updated: function() {\n var idx,\n length,\n result = [],\n data = this._flatData(this._data, this.options.useRanges);\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if ((data[idx].isNew && !data[idx].isNew()) && data[idx].dirty) {\n result.push(data[idx]);\n }\n }\n return result;\n },\n\n sync: function() {\n var that = this,\n created = [],\n updated = [],\n destroyed = that._destroyed;\n\n var promise = $.Deferred().resolve().promise();\n\n if (that.online()) {\n\n if (!that.reader.model) {\n return promise;\n }\n\n created = that.created();\n updated = that.updated();\n\n var promises = [];\n\n if (that.options.batch && that.transport.submit) {\n promises = that._sendSubmit(created, updated, destroyed);\n } else {\n promises.push.apply(promises, that._send(\"create\", created));\n promises.push.apply(promises, that._send(\"update\", updated));\n promises.push.apply(promises, that._send(\"destroy\", destroyed));\n }\n\n promise = $.when\n .apply(null, promises)\n .then(function() {\n var arguments$1 = arguments;\n\n var idx, length;\n\n for (idx = 0, length = arguments.length; idx < length; idx++) {\n if (arguments$1[idx]) {\n that._accept(arguments$1[idx]);\n }\n }\n\n that._storeData(true);\n\n that._syncEnd();\n\n that._change({ action: \"sync\" });\n\n that.trigger(SYNC);\n\n if (that._isServerGroupPaged()) {\n that.read();\n }\n });\n } else {\n that._storeData(true);\n\n that._syncEnd();\n\n that._change({ action: \"sync\" });\n }\n\n return promise;\n },\n\n _syncEnd: noop,\n\n cancelChanges: function(model) {\n var that = this;\n\n if (model instanceof kendo.data.Model) {\n that._cancelModel(model);\n } else {\n that._destroyed = [];\n that._detachObservableParents();\n that._data = that._observe(that._pristineData);\n if (that.options.serverPaging) {\n that._total = that._pristineTotal;\n }\n\n that._ranges = [];\n that._addRange(that._data, 0);\n\n that._changesCanceled();\n\n that._change();\n\n that._markOfflineUpdatesAsDirty();\n\n if (that._isServerGrouped()) {\n that.read();\n }\n }\n },\n\n _changesCanceled: noop,\n\n _markOfflineUpdatesAsDirty: function() {\n var that = this;\n\n if (that.options.offlineStorage != null) {\n that._eachItem(that._data, function(items) {\n for (var idx = 0; idx < items.length; idx++) {\n var item = items.at(idx);\n if (item.__state__ == \"update\" || item.__state__ == \"create\") {\n item.dirty = true;\n }\n }\n });\n }\n },\n\n hasChanges: function() {\n var idx,\n length,\n data = this._flatData(this._data, this.options.useRanges);\n\n if (this._destroyed.length) {\n return true;\n }\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n if ((data[idx].isNew && data[idx].isNew()) || data[idx].dirty) {\n return true;\n }\n }\n\n return false;\n },\n\n _accept: function(result) {\n var that = this,\n models = result.models,\n response = result.response,\n idx = 0,\n serverGroup = that._isServerGrouped(),\n pristine = that._pristineData,\n type = result.type,\n length;\n\n that.trigger(REQUESTEND, { response: response, type: type });\n\n if (response && !isEmptyObject(response)) {\n response = that.reader.parse(response);\n\n if (that._handleCustomErrors(response)) {\n return;\n }\n\n response = that.reader.data(response);\n\n if (!isArray(response)) {\n response = [response];\n }\n } else {\n response = $.map(models, function(model) { return model.toJSON(); } );\n }\n\n if (type === \"destroy\") {\n that._destroyed = [];\n }\n\n for (idx = 0, length = models.length; idx < length; idx++) {\n if (type !== \"destroy\") {\n models[idx].accept(response[idx]);\n\n if (type === \"create\") {\n pristine.push(serverGroup ? that._wrapInEmptyGroup(models[idx].toJSON()) : response[idx]);\n } else if (type === \"update\") {\n that._updatePristineForModel(models[idx], response[idx]);\n }\n } else {\n that._removePristineForModel(models[idx]);\n }\n }\n },\n\n _updatePristineForModel: function(model, values) {\n this._executeOnPristineForModel(model, function(index, items) {\n kendo.deepExtend(items[index], values);\n });\n },\n\n _executeOnPristineForModel: function(model, callback) {\n this._eachPristineItem(\n function(items) {\n var index = indexOfPristineModel(items, model);\n if (index > -1) {\n callback(index, items);\n return true;\n }\n });\n },\n\n _removePristineForModel: function(model) {\n this._executeOnPristineForModel(model, function(index, items) {\n items.splice(index, 1);\n });\n },\n\n _readData: function(data) {\n var read = !this._isServerGrouped() ? this.reader.data : this.reader.groups;\n return read.call(this.reader, data);\n },\n\n _eachPristineItem: function(callback) {\n var that = this;\n var options = that.options;\n var rangeSpan = that._getCurrentRangeSpan();\n\n that._eachItem(that._pristineData, callback);\n\n if (options.serverPaging && options.useRanges) {\n each(rangeSpan, function(i, range) {\n that._eachItem(range.pristineData, callback);\n });\n }\n },\n\n _eachItem: function(data, callback) {\n if (data && data.length) {\n if (this._isServerGrouped()) {\n eachGroupItems(data, callback);\n } else {\n callback(data);\n }\n }\n },\n\n _pristineForModel: function(model) {\n var pristine,\n idx,\n callback = function(items) {\n idx = indexOfPristineModel(items, model);\n if (idx > -1) {\n pristine = items[idx];\n return true;\n }\n };\n\n this._eachPristineItem(callback);\n\n return pristine;\n },\n\n _cancelModel: function(model) {\n var that = this;\n var pristine = this._pristineForModel(model);\n\n this._eachItem(this._data, function(items) {\n var idx = indexOfModel(items, model);\n if (idx >= 0) {\n if (pristine && (!model.isNew() || pristine.__state__)) {\n items[idx].accept(pristine);\n\n if (pristine.__state__ == \"update\") {\n items[idx].dirty = true;\n }\n\n } else {\n that._modelCanceled(model);\n\n items.splice(idx, 1);\n\n that._removeModelFromRanges(model);\n }\n }\n });\n },\n\n _modelCanceled: noop,\n\n _submit: function(promises, data) {\n var that = this;\n\n that.trigger(REQUESTSTART, { type: \"submit\" });\n\n that.trigger(PROGRESS);\n\n that.transport.submit(extend({\n success: function(response, type) {\n var promise = $.grep(promises, function(x) {\n return x.type == type;\n })[0];\n\n if (promise) {\n promise.resolve({\n response: response,\n models: promise.models,\n type: type\n });\n }\n },\n error: function(response, status, error) {\n for (var idx = 0; idx < promises.length; idx++) {\n promises[idx].reject(response);\n }\n\n that.error(response, status, error);\n }\n }, data));\n },\n\n _sendSubmit: function(created, updated, destroyed) {\n var that = this,\n promises = [];\n\n if (that.options.batch) {\n if (created.length) {\n promises.push($.Deferred(function(deferred) {\n deferred.type = \"create\";\n deferred.models = created;\n }));\n }\n\n if (updated.length) {\n promises.push($.Deferred(function(deferred) {\n deferred.type = \"update\";\n deferred.models = updated;\n }));\n }\n\n if (destroyed.length) {\n promises.push($.Deferred(function(deferred) {\n deferred.type = \"destroy\";\n deferred.models = destroyed;\n }));\n }\n\n that._submit(promises, {\n data: {\n created: that.reader.serialize(toJSON(created)),\n updated: that.reader.serialize(toJSON(updated)),\n destroyed: that.reader.serialize(toJSON(destroyed))\n }\n });\n }\n\n return promises;\n },\n\n _promise: function(data, models, type) {\n var that = this;\n\n return $.Deferred(function(deferred) {\n that.trigger(REQUESTSTART, { type: type });\n\n that.trigger(PROGRESS);\n\n that.transport[type].call(that.transport, extend({\n success: function(response) {\n deferred.resolve({\n response: response,\n models: models,\n type: type\n });\n },\n error: function(response, status, error) {\n deferred.reject(response);\n that.error(response, status, error);\n }\n }, data));\n }).promise();\n },\n\n _send: function(method, data) {\n var that = this,\n idx,\n length,\n promises = [],\n converted = that.reader.serialize(toJSON(data));\n\n if (that.options.batch) {\n if (data.length) {\n promises.push(that._promise( { data: { models: converted } }, data , method));\n }\n } else {\n for (idx = 0, length = data.length; idx < length; idx++) {\n promises.push(that._promise( { data: converted[idx] }, [ data[idx] ], method));\n }\n }\n\n return promises;\n },\n\n read: function(data) {\n var that = this, params = that._params(data);\n var deferred = $.Deferred();\n\n that._queueRequest(params, function() {\n var isPrevented = that.trigger(REQUESTSTART, { type: \"read\" });\n if (!isPrevented) {\n that.trigger(PROGRESS);\n\n that._ranges = [];\n that.trigger(\"reset\");\n if (that.online()) {\n that.transport.read({\n data: params,\n success: function(data) {\n that._ranges = [];\n that.success(data, params);\n\n deferred.resolve();\n },\n error: function() {\n var args = slice.call(arguments);\n\n that.error.apply(that, args);\n\n deferred.reject.apply(deferred, args);\n }\n });\n } else if (that.options.offlineStorage != null) {\n that.success(that.offlineData(), params);\n\n deferred.resolve();\n }\n } else {\n that._dequeueRequest();\n\n deferred.resolve(isPrevented);\n }\n });\n\n return deferred.promise();\n },\n\n _readAggregates: function(data) {\n return this.reader.aggregates(data);\n },\n\n success: function(data) {\n var that = this,\n options = that.options,\n items,\n replaceSubset;\n\n that.trigger(REQUESTEND, { response: data, type: \"read\" });\n\n if (that.online()) {\n data = that.reader.parse(data);\n\n if (that._handleCustomErrors(data)) {\n that._dequeueRequest();\n return;\n }\n\n that._total = that.reader.total(data);\n\n if (that._isServerGroupPaged()) {\n that._serverGroupsTotal = that._total;\n }\n\n if (that._pageSize > that._total) {\n that._pageSize = that._total;\n if (that.options.pageSize && that.options.pageSize > that._pageSize) {\n that._pageSize = that.options.pageSize;\n }\n }\n\n if (that._aggregate && options.serverAggregates) {\n that._aggregateResult = that._readAggregates(data);\n }\n\n data = that._readData(data);\n\n that._destroyed = [];\n } else {\n data = that._readData(data);\n\n items = [];\n var itemIds = {};\n var model = that.reader.model;\n var idField = model ? model.idField : \"id\";\n var idx;\n\n for (idx = 0; idx < this._destroyed.length; idx++) {\n var id = this._destroyed[idx][idField];\n itemIds[id] = id;\n }\n\n for (idx = 0; idx < data.length; idx++) {\n var item = data[idx];\n var state = item.__state__;\n if (state == \"destroy\") {\n if (!itemIds[item[idField]]) {\n this._pushInDestroyed(this._createNewModel(item));\n }\n } else {\n items.push(item);\n }\n }\n\n data = items;\n\n that._total = data.length;\n }\n\n that._pristineTotal = that._total;\n replaceSubset = that._skip && that._data.length && that._skip < that._data.length;\n\n if (that.options.endless) {\n if (replaceSubset) {\n that._pristineData.splice(that._skip, that._pristineData.length);\n }\n items = data.slice(0);\n for (var j = 0; j < items.length; j++) {\n that._pristineData.push(items[j]);\n }\n } else {\n that._pristineData = data.slice(0);\n }\n\n that._detachObservableParents();\n\n if (that.options.endless) {\n that._data.unbind(CHANGE, that._changeHandler);\n\n if (that._isServerGrouped() && that._data[that._data.length - 1].value === data[0].value) {\n fillLastGroup(that._data[that._data.length - 1], data[0]);\n data.shift();\n }\n\n data = that._observe(data);\n if (replaceSubset) {\n that._data.splice(that._skip, that._data.length);\n }\n for (var i = 0; i < data.length; i++) {\n that._data.push(data[i]);\n }\n that._data.bind(CHANGE, that._changeHandler);\n } else {\n that._data = that._observe(data);\n }\n\n that._markOfflineUpdatesAsDirty();\n\n that._storeData();\n\n that._addRange(that._data);\n\n that._process(that._data);\n\n that._dequeueRequest();\n },\n\n _detachObservableParents: function() {\n if (this._data && this._shouldDetachObservableParents) {\n for (var idx = 0; idx < this._data.length; idx++) {\n if (this._data[idx].parent) {\n this._data[idx].parent = noop;\n }\n }\n }\n },\n\n _storeData: function(updatePristine) {\n var serverGrouping = this._isServerGrouped();\n var model = this.reader.model;\n\n function items(data) {\n var state = [];\n\n for (var idx = 0; idx < data.length; idx++) {\n var dataItem = data.at(idx);\n var item = dataItem.toJSON();\n\n if (serverGrouping && dataItem.items) {\n item.items = items(dataItem.items);\n } else {\n item.uid = dataItem.uid;\n\n if (model) {\n if (dataItem.isNew()) {\n item.__state__ = \"create\";\n } else if (dataItem.dirty) {\n item.__state__ = \"update\";\n }\n }\n }\n state.push(item);\n }\n\n return state;\n }\n\n if (this.options.offlineStorage != null) {\n var state = items(this._data);\n\n var destroyed = [];\n\n for (var idx = 0; idx < this._destroyed.length; idx++) {\n var item = this._destroyed[idx].toJSON();\n item.__state__ = \"destroy\";\n destroyed.push(item);\n }\n\n this.offlineData(state.concat(destroyed));\n\n if (updatePristine) {\n this._pristineData = this.reader.reader ? this.reader.reader._wrapDataAccessBase(state) : this.reader._wrapDataAccessBase(state);\n }\n }\n },\n\n _addRange: function(data, skip) {\n var that = this,\n start = typeof (skip) !== \"undefined\" ? skip : (that._skip || 0),\n end,\n range = {\n data: data,\n pristineData: data.toJSON(),\n timestamp: that._timeStamp()\n };\n\n if (this._isGroupPaged()) {\n end = start + data.length;\n range.outerStart = start;\n range.outerEnd = end;\n } else {\n end = start + that._flatData(data, true).length;\n }\n\n range.start = start;\n range.end = end;\n that._ranges.push(range);\n that._sortRanges();\n\n if (that._isGroupPaged()) {\n if (!that._groupsFlat) {\n that._groupsFlat = [];\n }\n that._appendToGroupsFlat(range.data);\n that._updateOuterRangesLength();\n }\n },\n\n _appendToGroupsFlat: function(data) {\n var length = data.length;\n\n for (var i = 0; i < length; i++) {\n this._groupsFlat.push(data[i]);\n }\n },\n\n _getGroupByUid: function(uid) {\n var length = this._groupsFlat.length;\n var group;\n\n for (var i = 0; i < length; i++) {\n group = this._groupsFlat[i];\n if (group.uid === uid) {\n return group;\n }\n }\n },\n\n _sortRanges: function() {\n this._ranges.sort(function(x, y) {\n return x.start - y.start;\n });\n },\n\n error: function(xhr, status, errorThrown) {\n this._dequeueRequest();\n this.trigger(REQUESTEND, { });\n this.trigger(ERROR, { xhr: xhr, status: status, errorThrown: errorThrown });\n },\n\n _params: function(data) {\n var that = this,\n options = extend({\n take: that.take(),\n skip: that.skip(),\n page: that.page(),\n pageSize: that.pageSize(),\n sort: that._sort,\n filter: that._filter,\n group: that._group,\n aggregate: that._aggregate,\n groupPaging: !!that._groupPaging\n }, data);\n\n if (!that.options.serverPaging) {\n delete options.take;\n delete options.skip;\n delete options.page;\n delete options.pageSize;\n }\n\n if (!that.options.serverGrouping) {\n delete options.group;\n } else if (that.reader.model && options.group) {\n options.group = convertDescriptorsField(options.group, that.reader.model);\n }\n\n if (!that.options.serverFiltering) {\n delete options.filter;\n } else if (that.reader.model && options.filter) {\n options.filter = convertFilterDescriptorsField(options.filter, that.reader.model);\n }\n\n if (!that.options.serverSorting) {\n delete options.sort;\n } else if (that.reader.model && options.sort) {\n options.sort = convertDescriptorsField(options.sort, that.reader.model);\n }\n\n if (!that.options.serverAggregates) {\n delete options.aggregate;\n } else if (that.reader.model && options.aggregate) {\n options.aggregate = convertDescriptorsField(options.aggregate, that.reader.model);\n }\n\n if (!that.options.groupPaging) {\n delete options.groupPaging;\n }\n\n return options;\n },\n\n _queueRequest: function(options, callback) {\n var that = this;\n if (!that._requestInProgress) {\n that._requestInProgress = true;\n that._pending = undefined$1;\n callback();\n } else {\n that._pending = { callback: callback.bind(that), options: options };\n }\n },\n\n _dequeueRequest: function() {\n var that = this;\n that._requestInProgress = false;\n if (that._pending) {\n that._queueRequest(that._pending.options, that._pending.callback);\n }\n },\n\n _handleCustomErrors: function(response) {\n if (this.reader.errors) {\n var errors = this.reader.errors(response);\n if (errors) {\n this.trigger(ERROR, { xhr: null, status: \"customerror\", errorThrown: \"custom error\", errors: errors });\n return true;\n }\n }\n return false;\n },\n\n _shouldWrap: function(data) {\n var model = this.reader.model;\n\n if (model && data.length) {\n return !(data[0] instanceof model);\n }\n\n return false;\n },\n\n _observe: function(data) {\n var that = this,\n model = that.reader.model;\n\n that._shouldDetachObservableParents = true;\n\n if (data instanceof ObservableArray) {\n that._shouldDetachObservableParents = false;\n if (that._shouldWrap(data)) {\n data.type = that.reader.model;\n data.wrapAll(data, data);\n }\n } else {\n var arrayType = that.pageSize() && !that.options.serverPaging ? LazyObservableArray : ObservableArray;\n data = new arrayType(data, that.reader.model);\n data.parent = function() { return that.parent(); };\n }\n\n if (that._isServerGrouped()) {\n wrapGroupItems(data, model);\n }\n\n if (that._changeHandler && that._data && that._data instanceof ObservableArray &&\n !(that.options.useRanges && that.options.serverPaging)) {\n that._data.unbind(CHANGE, that._changeHandler);\n } else {\n that._changeHandler = that._change.bind(that);\n }\n\n return data.bind(CHANGE, that._changeHandler);\n },\n\n _updateTotalForAction: function(action, items) {\n var that = this;\n\n var total = parseInt(that._total, 10);\n\n if (!isNumber(that._total)) {\n total = parseInt(that._pristineTotal, 10);\n }\n if (action === \"add\") {\n total += items.length;\n } else if (action === \"remove\") {\n total -= items.length;\n } else if (action !== \"itemchange\" && action !== \"sync\" && !that.options.serverPaging) {\n total = that._pristineTotal;\n } else if (action === \"sync\") {\n total = that._pristineTotal = parseInt(that._total, 10);\n }\n\n that._total = total;\n },\n\n _pushInDestroyed: function(model) {\n var isPushed = this._destroyed.find(function(item) {\n return item.uid === model.uid;\n });\n if (!isPushed) {\n this._destroyed.push(model);\n }\n },\n\n _change: function(e) {\n var that = this, idx, length, action = e ? e.action : \"\";\n\n if (action === \"remove\") {\n for (idx = 0, length = e.items.length; idx < length; idx++) {\n if (!e.items[idx].isNew || !e.items[idx].isNew()) {\n that._pushInDestroyed(e.items[idx]);\n }\n }\n }\n\n if (that.options.autoSync && (action === \"add\" || action === \"remove\" || action === \"itemchange\")) {\n\n var handler = function(args) {\n if (args.action === \"sync\") {\n that.unbind(\"change\", handler);\n that._updateTotalForAction(action, e.items);\n }\n };\n\n that.first(\"change\", handler);\n\n that.sync();\n\n } else {\n that._updateTotalForAction(action, e ? e.items : []);\n\n that._process(that._data, e);\n }\n },\n\n _calculateAggregates: function(data, options) {\n options = options || {};\n\n var query = new Query(data),\n aggregates = options.aggregate,\n filter = options.filter;\n\n if (filter) {\n query = query.filter(filter);\n }\n\n return query.aggregate(aggregates);\n },\n\n _process: function(data, e) {\n var that = this,\n options = {},\n result;\n\n if (that.options.serverPaging !== true) {\n options.skip = that._skip;\n options.take = that._take || that._pageSize;\n\n if (options.skip === undefined$1 && that._page !== undefined$1 && that._pageSize !== undefined$1) {\n options.skip = (that._page - 1) * that._pageSize;\n }\n\n if (that.options.useRanges) {\n options.skip = that.currentRangeStart();\n }\n }\n\n if (that.options.serverSorting !== true) {\n options.sort = that._sort;\n }\n\n if (that.options.serverFiltering !== true) {\n options.filter = that._filter;\n }\n\n if (that.options.serverGrouping !== true) {\n options.group = that._group;\n }\n\n if (that.options.serverAggregates !== true) {\n options.aggregate = that._aggregate;\n }\n\n if (that.options.serverGrouping) {\n that._clearEmptyGroups(data);\n }\n\n options.groupPaging = that._groupPaging;\n\n if (that._isGroupPaged() && e && (e.action === \"page\" || e.action === \"expandGroup\" || e.action === \"collapseGroup\")) {\n result = that._queryProcess(data, {\n aggregate: that._aggregate\n });\n } else {\n result = that._queryProcess(data, options);\n }\n\n if (that._filter && e && e.action === \"add\") {\n var model = e.items[0],\n resultData = result.data;\n\n if (that._isGrouped() && !this._isServerGrouped()) {\n resultData = flattenGroups(resultData);\n }\n\n var modelIsInView = resultData.find(function(item) {\n return item.uid === model.uid;\n });\n\n if (!modelIsInView) {\n result.data.splice(model.index, 0, that._isGrouped() ? that._wrapInEmptyGroup(model) : model);\n result.total++;\n }\n }\n\n if (that.options.serverAggregates !== true) {\n // for performance reasons, calculate aggregates for part of the data only after query process\n // this is necessary in the TreeList when paging\n that._aggregateResult = that._calculateAggregates(result.dataToAggregate || data, options);\n }\n\n that._setView(result, options, e);\n\n that._setFilterTotal(result.total, false);\n\n e = e || {};\n\n e.items = e.items || that._view;\n\n that.trigger(CHANGE, e);\n },\n\n _setView: function(result, options, e) {\n var that = this;\n\n if (that._isGroupPaged() && !that._isServerGrouped()) {\n if (e && (e.action === \"page\" || e.action === \"expandGroup\" || e.action === \"collapseGroup\")) {\n that.view(result.data);\n that._updateOuterRangesLength();\n } else {\n that._ranges = [];\n var query = new Query(result.data);\n that._addRange(that._observe(result.data));\n\n if (options.skip + options.take > result.data.length) {\n options.skip = result.data.length - options.take;\n }\n\n that.view(query.range(options.skip, options.take).toArray());\n }\n\n } else {\n that.view(result.data);\n }\n },\n\n _clearEmptyGroups: function(data) {\n for (var idx = data.length - 1; idx >= 0; idx--) {\n var group = data[idx];\n if (group.hasSubgroups) {\n this._clearEmptyGroups(group.items);\n }\n\n if (group.items && !group.items.length && !group.itemCount) {\n splice.apply(group.parent(), [idx, 1]);\n }\n }\n },\n\n _queryProcess: function(data, options) {\n if (this.options.inPlaceSort) {\n return Query.process(data, options, this.options.inPlaceSort);\n }\n else {\n return Query.process(data, options);\n }\n },\n\n _mergeState: function(options) {\n var that = this;\n\n if (options !== undefined$1) {\n that._pageSize = options.pageSize;\n that._page = options.page;\n that._sort = options.sort;\n that._filter = options.filter;\n that._group = options.group;\n that._aggregate = options.aggregate;\n that._skip = that._currentRangeStart = options.skip;\n that._take = options.take;\n\n if (that._skip === undefined$1) {\n that._skip = that._currentRangeStart = that.skip();\n options.skip = that.skip();\n }\n\n if (that._take === undefined$1 && that._pageSize !== undefined$1) {\n that._take = that._pageSize;\n options.take = that._take;\n }\n\n if (that.options.virtual) {\n options.virtual = that.options.virtual;\n }\n\n if (options.sort) {\n that._sort = options.sort = normalizeSort(options.sort);\n that._sortFields = sortFields(options.sort);\n }\n\n if (options.filter) {\n that._filter = options.filter = (that.options.accentFoldingFiltering && !$.isEmptyObject(options.filter)) ? $.extend({}, normalizeFilter(options.filter), { accentFoldingFiltering: that.options.accentFoldingFiltering }) : normalizeFilter(options.filter);\n }\n\n if (options.group) {\n that._group = options.group = normalizeGroup(options.group);\n }\n if (options.aggregate) {\n that._aggregate = options.aggregate = normalizeAggregate(options.aggregate);\n }\n }\n return options;\n },\n\n query: function(options) {\n var result;\n var remote = this.options.serverSorting || this.options.serverPaging || this.options.serverFiltering || this.options.serverGrouping || this.options.serverAggregates;\n\n if (remote || ((this._data === undefined$1 || this._data.length === 0) && !this._destroyed.length)) {\n if (this.options.endless) {\n var moreItemsCount = options.pageSize - this.pageSize();\n if (moreItemsCount > 0) {\n moreItemsCount = this.pageSize();\n options.page = options.pageSize / moreItemsCount;\n options.pageSize = moreItemsCount;\n } else {\n options.page = 1;\n this.options.endless = false;\n }\n }\n return this.read(this._mergeState(options));\n }\n\n var isPrevented = this.trigger(REQUESTSTART, { type: \"read\" });\n if (!isPrevented) {\n this.trigger(PROGRESS);\n if (options) {\n options.groupPaging = this._groupPaging;\n }\n result = this._queryProcess(this._data, this._mergeState(options));\n\n this._setFilterTotal(result.total, true);\n\n this._aggregateResult = this._calculateAggregates(result.dataToAggregate || this._data, options);\n this._setView(result, options);\n this.trigger(REQUESTEND, { type: \"read\" });\n this.trigger(CHANGE, { items: result.data, action: options ? options.action : \"\" });\n }\n\n return $.Deferred().resolve(isPrevented).promise();\n },\n\n _hasExpandedSubGroups: function(group) {\n var result = false;\n var length = group.items ? group.items.length : 0;\n\n if (!group.hasSubgroups) {\n return false;\n }\n\n for (var i = 0; i < length; i++) {\n if (this._groupsState[group.items[i].uid]) {\n result = true;\n break;\n }\n }\n return result;\n },\n\n _findGroupedRange: function(data, result, options, parents, callback) {\n var that = this;\n var length = data.length;\n var group;\n var current;\n var itemsLength;\n var groupCount;\n var itemsToSkip;\n\n for (var i = 0; i < length; i++) {\n group = data[i];\n\n if (options.taken >= options.take) {\n break;\n }\n\n if (!that._getGroupByUid(group.uid)) {\n that._groupsFlat.push(group);\n }\n\n if (that._groupsState[group.uid]) {\n if (that._isServerGroupPaged()) {\n if (that._fetchGroupItems(group, options, parents, callback)) {\n that._fetchingGroupItems = true;\n return;\n }\n groupCount = (group.subgroupCount || group.itemCount) + 1;\n itemsToSkip = options.skip - options.skipped;\n if (!that._hasExpandedSubGroups(group) && itemsToSkip > groupCount) {\n options.skipped += groupCount;\n continue;\n }\n }\n\n if (options.includeParents && options.skipped < options.skip) {\n options.skipped++;\n group.excludeHeader = true;\n } else if (options.includeParents) {\n options.taken++;\n group.excludeHeader = false;\n }\n\n if (group.hasSubgroups && group.items && group.items.length) {\n group.currentItems = [];\n\n if (!parents) {\n parents = [];\n }\n parents.push(group);\n\n that._findGroupedRange(group.items, group.currentItems, options, parents, callback);\n parents.pop();\n\n if (group.currentItems.length || options.taken > 0) {\n result.push(group);\n } else {\n group.excludeHeader = false;\n }\n } else {\n current = [];\n itemsLength = group.items.length;\n\n for (var j = 0; j < itemsLength; j++) {\n if (options.skipped < options.skip) {\n options.skipped++;\n continue;\n }\n\n if (options.taken >= options.take) {\n break;\n }\n current.push(group.items[j]);\n options.taken++;\n }\n\n if (current.length || options.taken > 0) {\n group.currentItems = current;\n result.push(group);\n } else {\n group.excludeHeader = false;\n }\n }\n } else {\n if (options.skipped < options.skip) {\n options.skipped++;\n continue;\n }\n result.push(group);\n options.taken++;\n }\n }\n },\n\n _expandedSubGroupItemsCount: function(group, end, includeCurrentItems) {\n var that = this;\n var result = 0;\n var subGroup;\n var endSpecified = typeof end === \"number\";\n var length = endSpecified ? end : group.subgroupCount;\n var temp;\n\n if (!group.hasSubgroups) {\n return result;\n }\n\n for (var i = 0; i < length; i++) {\n subGroup = group.items[i];\n\n if (!subGroup) {\n break;\n }\n\n if (subGroup.hasSubgroups && that._groupsState[group.uid]) {\n temp = that._expandedSubGroupItemsCount(subGroup, length, true);\n result += temp;\n\n if (endSpecified) {\n length -= temp;\n }\n } else if (!subGroup.hasSubgroups && that._groupsState[subGroup.uid]) {\n temp = subGroup.items ? subGroup.items.length : 0;\n result += temp;\n if (endSpecified) {\n length -= temp;\n }\n }\n\n if (includeCurrentItems) {\n result += 1;\n if (endSpecified) {\n length -= 1;\n }\n }\n\n if (endSpecified && result > length) {\n return result;\n }\n }\n\n return result;\n },\n\n _fetchGroupItems: function(group, options, parents, callback) {\n var that = this;\n var groupItemsSkip;\n var firstItem;\n var lastItem;\n var groupItemCount = group.hasSubgroups ? group.subgroupCount : group.itemCount;\n var take = options.take;\n var skipped = options.skipped;\n var pageSize = that.take();\n var expandedSubGroupItemsCount;\n\n if (options.includeParents) {\n if (skipped < options.skip) {\n skipped += 1;\n } else {\n take -= 1;\n }\n }\n\n if (!group.items || (group.items && !group.items.length)) {\n that.getGroupItems(group, options, parents, callback, 0);\n return true;\n } else {\n expandedSubGroupItemsCount = this._expandedSubGroupItemsCount(group, options.skip - skipped);\n groupItemsSkip = Math.max(options.skip - (skipped + expandedSubGroupItemsCount), 0);\n\n if (groupItemsSkip >= groupItemCount) {\n return false;\n }\n\n firstItem = group.items[groupItemsSkip];\n lastItem = group.items[Math.min(groupItemsSkip + take, groupItemCount - 1)];\n\n if (firstItem.notFetched) {\n that.getGroupItems(group, options, parents, callback, math.max(math.floor(groupItemsSkip / pageSize), 0) * pageSize, math.round((groupItemsSkip + pageSize) / pageSize));\n return true;\n }\n\n if (lastItem.notFetched) {\n that.getGroupItems(group, options, parents, callback, math.max(math.floor((groupItemsSkip + pageSize) / pageSize), 0) * pageSize, math.round((groupItemsSkip + pageSize) / pageSize));\n return true;\n }\n }\n },\n\n getGroupItems: function(group, options, parents, callback, groupItemsSkip, page) {\n var that = this;\n var take;\n var filter;\n var data;\n var subgroups;\n\n if (!group.items) {\n group.items = [];\n }\n\n take = that.take();\n filter = this._composeItemsFilter(group, parents);\n data = {\n page: page || 1,\n pageSize: take,\n skip: groupItemsSkip,\n take: take,\n filter: filter,\n aggregate: that._aggregate,\n sort: that._sort\n };\n subgroups = that.findSubgroups(group);\n\n if (subgroups && subgroups.length) {\n data.group = subgroups;\n data.groupPaging = true;\n }\n\n clearTimeout(that._timeout);\n that._timeout = setTimeout(function() {\n that._queueRequest(data, function() {\n if (!that.trigger(REQUESTSTART, {\n type: \"read\"\n })) {\n that.transport.read({\n data: data,\n success: that._groupItemsSuccessHandler(group, options.skip, that.take(), callback, groupItemsSkip),\n error: function() {\n var args = slice.call(arguments);\n that.error.apply(that, args);\n }\n });\n } else {\n that._dequeueRequest();\n }\n });\n }, 100);\n },\n\n _groupItemsSuccessHandler: function(group, skip, take, callback, groupItemsSkip) {\n var that = this;\n var timestamp = that._timeStamp();\n callback = isFunction(callback) ? callback : noop;\n var totalField = that.options.schema && that.options.schema.total ? that.options.schema.total : \"Total\";\n\n return function(data) {\n var temp;\n var model = Model.define(that.options.schema.model);\n var totalCount;\n\n that._dequeueRequest();\n\n that.trigger(REQUESTEND, {\n response: data,\n type: \"read\"\n });\n\n if (isFunction(totalField)) {\n totalCount = totalField(data);\n } else {\n totalCount = data[totalField];\n }\n\n data = that.reader.parse(data);\n\n if (group.hasSubgroups) {\n temp = that.reader.groups(data);\n group.subgroupCount = totalCount;\n } else {\n temp = that.reader.data(data);\n temp = temp.map(function(item) {\n return new model(item);\n });\n }\n\n group.items.omitChangeEvent = true;\n for (var i = 0; i < totalCount; i++) {\n if (i >= groupItemsSkip && i < (groupItemsSkip + take) ) {\n group.items.splice(i, 1, temp[i - groupItemsSkip]);\n } else {\n if (!group.items[i]) {\n group.items.splice(i, 0, { notFetched: true });\n }\n }\n }\n group.items.omitChangeEvent = false;\n\n that._updateRangePristineData(group);\n that._fetchingGroupItems = false;\n\n if (!group.countAdded) {\n that._serverGroupsTotal += totalCount;\n group.countAdded = true;\n }\n\n that.range(skip, take, callback, \"expandGroup\");\n\n if (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress) {\n that.trigger(CHANGE, {});\n }\n };\n },\n\n findSubgroups: function(group) {\n var indexOfCurrentGroup = this._group.map(function(g) {\n return g.field;\n }).indexOf(group.field);\n\n return this._group.slice(indexOfCurrentGroup + 1, this._group.length);\n },\n\n _composeItemsFilter: function(group, parents) {\n var filter = {\n logic: \"and\",\n filters: []\n };\n\n if (this.filter()) {\n filter.filters.push(this.filter());\n }\n\n filter = extend(true, {}, filter);\n filter.filters.push({\n field: group.field,\n operator: \"eq\",\n value: group.value\n });\n\n if (parents) {\n for (var i = 0; i < parents.length; i++) {\n filter.filters.push({\n field: parents[i].field,\n operator: \"eq\",\n value: parents[i].value\n });\n }\n }\n\n return filter;\n },\n\n _updateRangePristineData: function(group) {\n var that = this;\n var ranges = that._ranges;\n var rangesLength = ranges.length;\n var temp;\n var currentGroup;\n var range;\n var dataLength;\n var indexes;\n var currIdx;\n\n for (var i = 0; i < rangesLength; i++) {\n range = ranges[i];\n dataLength = range.data.length;\n indexes = [];\n temp = null;\n\n for (var j = 0; j < dataLength; j++) {\n currentGroup = range.data[j];\n indexes.push(j);\n\n if ((currentGroup.uid === group.uid) || (currentGroup.hasSubgroups && currentGroup.items.length && that._containsSubGroup(currentGroup, group, indexes))) {\n break;\n }\n indexes.pop();\n }\n\n if (indexes.length) {\n temp = ranges[i].pristineData;\n\n while (indexes.length > 1) {\n currIdx = indexes.splice(0, 1)[0];\n temp = temp[currIdx].items;\n }\n temp[indexes[0]] = that._cloneGroup(group);\n break;\n }\n }\n },\n\n _containsSubGroup: function(group, subgroup, indexes) {\n var that = this;\n var length = group.items.length;\n var currentSubGroup;\n\n if (group.hasSubgroups && length) {\n for (var i = 0; i < length; i++) {\n currentSubGroup = group.items[i];\n indexes.push(i);\n if (currentSubGroup.uid === subgroup.uid ||\n (currentSubGroup.hasSubgroups &&\n currentSubGroup.items.length &&\n that._containsSubGroup(currentSubGroup, subgroup, indexes))) {\n return true;\n }\n indexes.pop();\n }\n }\n\n },\n\n _cloneGroup: function(group) {\n var that = this;\n group = typeof group.toJSON == \"function\" ? group.toJSON() : group;\n\n if (group.items && group.items.length) {\n group.items = group.items.map(function(item) {\n return that._cloneGroup(item);\n });\n }\n\n return group;\n },\n\n _setFilterTotal: function(filterTotal, setDefaultValue) {\n var that = this;\n\n if (!that.options.serverFiltering) {\n if (filterTotal !== undefined$1) {\n that._total = filterTotal;\n } else if (setDefaultValue) {\n that._total = that._data.length;\n }\n }\n },\n\n fetch: function(callback) {\n var that = this;\n var fn = function(isPrevented) {\n if (isPrevented !== true && isFunction(callback)) {\n callback.call(that);\n }\n };\n\n return this._query().done(fn);\n },\n\n _query: function(options) {\n var that = this;\n\n return that.query(extend({}, {\n page: that.page(),\n pageSize: that.pageSize(),\n sort: that.sort(),\n filter: that.filter(),\n group: that.group(),\n aggregate: that.aggregate()\n }, options));\n },\n\n next: function(options) {\n var that = this,\n page = that.page(),\n total = that.total();\n\n options = options || {};\n\n if (!page || (total && page + 1 > that.totalPages())) {\n return;\n }\n\n that._skip = that._currentRangeStart = page * that.take();\n\n page += 1;\n options.page = page;\n\n that._query(options);\n\n return page;\n },\n\n prev: function(options) {\n var that = this,\n page = that.page();\n\n options = options || {};\n\n if (!page || page === 1) {\n return;\n }\n\n that._skip = that._currentRangeStart = that._skip - that.take();\n\n page -= 1;\n options.page = page;\n\n that._query(options);\n\n return page;\n },\n\n page: function(val) {\n var that = this,\n skip;\n\n if (val !== undefined$1) {\n val = math.max(math.min(math.max(val, 1), that.totalPages()), 1);\n var take = that.take();\n\n if (that._isGroupPaged()) {\n val -= 1;\n that.range(val * take, take, null, \"page\");\n return;\n }\n that._query(that._pageableQueryOptions({ page: val }));\n return;\n }\n skip = that.skip();\n\n return skip !== undefined$1 ? math.round((skip || 0) / (that.take() || 1)) + 1 : undefined$1;\n },\n\n pageSize: function(val) {\n var that = this;\n\n if (val !== undefined$1) {\n that._query(that._pageableQueryOptions({ pageSize: val, page: 1 }));\n return;\n }\n\n return that.take();\n },\n\n sort: function(val) {\n var that = this;\n\n if (val !== undefined$1) {\n that.trigger(\"sort\");\n that._query({ sort: val });\n return;\n }\n\n return that._sort;\n },\n\n filter: function(val) {\n var that = this;\n\n if (val === undefined$1) {\n return that._filter;\n }\n\n that.trigger(\"reset\");\n that._query({ filter: val, page: 1 });\n },\n\n group: function(val) {\n var that = this;\n var options = { group: val };\n\n if (that._groupPaging) {\n // clear ranges if ungrouping is performed\n if (val !== undefined$1 && (!val || !val.length) ) {\n that._ranges = [];\n }\n options.page = 1;\n }\n\n if (val !== undefined$1) {\n that._query(options);\n return;\n }\n\n return that._group;\n },\n\n getGroupsFlat: function(data) {\n var idx,\n result = [],\n length;\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n var group = data[idx];\n if (group.hasSubgroups) {\n result = result.concat(this.getGroupsFlat(group.items));\n }\n\n result.push(group);\n }\n\n return result;\n },\n\n total: function() {\n return parseInt(this._total || 0, 10);\n },\n\n groupsTotal: function(includeExpanded) {\n var that = this;\n\n if (!that._group.length) {\n return that.total();\n }\n\n if (that._isServerGrouped()) {\n if (that._serverGroupsTotal) {\n return that._serverGroupsTotal;\n }\n that._serverGroupsTotal = that.total();\n\n return that._serverGroupsTotal;\n }\n\n return that._calculateGroupsTotal(that._ranges.length ? that._ranges[0].data : [], includeExpanded);\n },\n\n _calculateGroupsTotal: function(groups, includeExpanded, itemsField, ignoreState) {\n var that = this;\n itemsField = itemsField || \"items\";\n var total;\n var length;\n\n if (that._group.length && groups) {\n total = 0;\n length = groups.length;\n\n for (var i = 0; i < length; i++) {\n total += that.groupCount(groups[i], includeExpanded, itemsField, ignoreState);\n }\n that._groupsTotal = total;\n return total;\n }\n\n that._groupsTotal = that._data.length;\n return that._groupsTotal;\n },\n\n groupCount: function(group, includeExpanded, itemsField, ignoreState) {\n var that = this;\n var total = 0;\n\n if (group.hasSubgroups && that._groupsState[group.uid]) {\n if (includeExpanded && !group.excludeHeader || ignoreState) {\n total += 1;\n }\n\n group[itemsField].forEach(function(subgroup) {\n total += that.groupCount(subgroup, includeExpanded, itemsField, ignoreState);\n });\n } else {\n if (that._groupsState[group.uid]) {\n if (includeExpanded && !group.excludeHeader || ignoreState) {\n total++;\n }\n total += group[itemsField] ? group[itemsField].length : 0;\n } else {\n total++;\n }\n }\n return total;\n },\n\n countGroupRange: function(range) {\n var total = 0;\n var length = range.length;\n\n for (var i = 0; i < length; i++) {\n total += this.groupCount(range[i], true);\n }\n\n return total;\n },\n\n aggregate: function(val) {\n var that = this;\n\n if (val !== undefined$1) {\n that._query({ aggregate: val });\n return;\n }\n\n return that._aggregate;\n },\n\n aggregates: function() {\n var result = this._aggregateResult;\n\n if (isEmptyObject(result)) {\n result = this._emptyAggregates(this.aggregate());\n }\n\n return result;\n },\n\n _emptyAggregates: function(aggregates) {\n var result = {};\n\n if (!isEmptyObject(aggregates)) {\n var aggregate = {};\n\n if (!isArray(aggregates)) {\n aggregates = [aggregates];\n }\n\n for (var idx = 0; idx < aggregates.length; idx++) {\n aggregate[aggregates[idx].aggregate] = 0;\n result[aggregates[idx].field] = aggregate;\n }\n }\n\n return result;\n },\n\n _pageableQueryOptions: function(options) {\n return options;\n },\n\n _wrapInEmptyGroup: function(model) {\n var groups = this.group(),\n parent,\n group,\n idx,\n length;\n\n for (idx = groups.length - 1, length = 0; idx >= length; idx--) {\n group = groups[idx];\n parent = {\n value: model.get ? model.get(group.field) : model[group.field],\n field: group.field,\n items: parent ? [parent] : [model],\n hasSubgroups: !!parent,\n aggregates: this._emptyAggregates(group.aggregates)\n };\n }\n\n return parent;\n },\n\n totalPages: function() {\n var that = this,\n pageSize = that.pageSize() || that.total(),\n total = that._isGroupPaged() ? that.groupsTotal(true) : that.total();\n\n return math.ceil((total || 0) / pageSize);\n },\n\n inRange: function(skip, take) {\n var that = this,\n end = math.min(skip + take, that.total());\n\n if (!that.options.serverPaging && that._data.length > 0) {\n return true;\n }\n\n return that._findRange(skip, end).length > 0;\n },\n\n lastRange: function() {\n var ranges = this._ranges;\n return ranges[ranges.length - 1] || { start: 0, end: 0, data: [] };\n },\n\n firstItemUid: function() {\n var ranges = this._ranges;\n return ranges.length && ranges[0].data.length && ranges[0].data[0].uid;\n },\n\n enableRequestsInProgress: function() {\n this._skipRequestsInProgress = false;\n },\n\n _timeStamp: function() {\n return new Date().getTime();\n },\n\n range: function(skip, take, callback, action) {\n this._currentRequestTimeStamp = this._timeStamp();\n this._skipRequestsInProgress = true;\n var total = this._isGroupPaged() ? this.groupsTotal(true) : this.total();\n\n if (action === \"expandGroup\" || action === \"collapseGroup\") {\n this._updateOuterRangesLength();\n }\n\n skip = math.min(skip || 0, total);\n callback = isFunction(callback) ? callback : noop;\n\n var that = this,\n pageSkip = math.max(math.floor(skip / take), 0) * take,\n size = math.min(pageSkip + take, total),\n data;\n\n data = that._findRange(skip, math.min(skip + take, total), callback);\n\n if ((data.length || total === 0) && !that._fetchingGroupItems) {\n that._processRangeData(data, skip, take, that._originalPageSkip || pageSkip, that._originalSize || size, {\n action: action\n });\n that._originalPageSkip = null;\n that._originalSize = null;\n callback();\n return;\n }\n\n if (that._isGroupPaged()) {\n that._originalPageSkip = pageSkip;\n that._originalSize = size;\n\n pageSkip = math.max(math.floor(that._adjustPageSkip(skip, take) / take), 0) * take;\n size = math.min(pageSkip + take, total);\n }\n\n if (take !== undefined$1 && !that._fetchingGroupItems) {\n if ((that._isGroupPaged() && !that._groupRangeExists(pageSkip, take)) || !that._rangeExists(pageSkip, size)) {\n that.prefetch(pageSkip, take, function() {\n if (skip > pageSkip && size < that.total() && !that._rangeExists(size, math.min(size + take, that.total()))) {\n that.prefetch(size, take, function() {\n that.range(skip, take, callback );\n });\n } else {\n that.range(skip, take, callback);\n }\n });\n } else if (pageSkip < skip) {\n that.prefetch(size, take, function() {\n that.range(skip, take, callback );\n });\n }\n }\n },\n\n _findRange: function(start, end, callback) {\n var that = this,\n ranges = that._ranges,\n range,\n data = [],\n skipIdx,\n takeIdx,\n startIndex,\n endIndex,\n rangeData,\n rangeEnd,\n processed,\n options = that.options,\n remote = options.serverSorting || options.serverPaging || options.serverFiltering || options.serverGrouping || options.serverAggregates,\n flatData,\n count,\n length,\n groupMapOptions = {\n take: end - start,\n skip: start,\n skipped: 0,\n taken: 0,\n includeParents: true\n },\n prevRangeEnd,\n isGroupPaged = that._isGroupPaged(),\n startField = isGroupPaged ? \"outerStart\" : \"start\",\n endField = isGroupPaged ? \"outerEnd\" : \"end\",\n currentDataLength;\n\n for (skipIdx = 0, length = ranges.length; skipIdx < length; skipIdx++) {\n range = ranges[skipIdx];\n\n if (isGroupPaged) {\n if (range.outerStart >= end) {\n return [];\n }\n\n if (start > range.outerEnd) {\n groupMapOptions.skipped += range.outerEnd - (prevRangeEnd || 0);\n prevRangeEnd = range.outerEnd;\n continue;\n }\n\n if (typeof prevRangeEnd !== \"undefined\" && prevRangeEnd != range.outerStart) {\n groupMapOptions.skipped += range.outerStart - prevRangeEnd;\n }\n\n if (groupMapOptions.skipped > groupMapOptions.skip) {\n return [];\n }\n\n if (typeof prevRangeEnd === \"undefined\" && start > 0 && range.start > 0) {\n groupMapOptions.skipped = range.outerStart;\n }\n\n takeIdx = skipIdx;\n while (true) {\n this._findGroupedRange(range.data, data, groupMapOptions, null, callback);\n currentDataLength = that._calculateGroupsTotal(data, true, \"currentItems\");\n\n if (currentDataLength >= groupMapOptions.take) {\n return data;\n }\n\n if (that._fetchingGroupItems) {\n return [];\n }\n takeIdx++;\n\n if (ranges[takeIdx] && ranges[takeIdx].outerStart === range.outerEnd) {\n range = ranges[takeIdx];\n } else {\n break;\n }\n }\n } else if (start >= range[startField] && start <= range[endField]) {\n count = 0;\n\n for (takeIdx = skipIdx; takeIdx < length; takeIdx++) {\n range = ranges[takeIdx];\n flatData = that._flatData(range.data, true);\n\n if (flatData.length && start + count >= range.start) {\n rangeData = range.data;\n rangeEnd = range.end;\n\n if (!remote) {\n if (options.inPlaceSort) {\n processed = that._queryProcess(range.data, { filter: that.filter() });\n } else {\n var sort = normalizeGroupWithoutCompare(that.group() || []).concat(normalizeSort(that.sort() || []));\n processed = that._queryProcess(range.data, { sort: sort, filter: that.filter() });\n }\n flatData = rangeData = processed.data;\n\n if (processed.total !== undefined$1) {\n rangeEnd = processed.total;\n }\n }\n\n startIndex = 0;\n if (start + count > range.start) {\n startIndex = (start + count) - range.start;\n }\n endIndex = flatData.length;\n if (rangeEnd > end) {\n endIndex = endIndex - (rangeEnd - end);\n }\n count += endIndex - startIndex;\n data = that._mergeGroups(data, rangeData, startIndex, endIndex);\n\n if (end <= range.end && count == end - start) {\n return data;\n }\n }\n }\n break;\n }\n prevRangeEnd = range.outerEnd;\n }\n return [];\n },\n\n _getRangesMismatch: function(pageSkip) {\n var that = this;\n var ranges = that._ranges;\n var mismatch = 0;\n var i = 0;\n\n while (true) {\n var range = ranges[i];\n if (!range || range.outerStart > pageSkip) {\n break;\n }\n\n if (range.outerEnd != range.end) {\n mismatch = range.outerEnd - range.end;\n }\n i++;\n }\n\n return mismatch;\n },\n\n _mergeGroups: function(data, range, skip, take) {\n if (this._isServerGrouped()) {\n var temp = range.toJSON(),\n prevGroup;\n\n if (data.length) {\n prevGroup = data[data.length - 1];\n }\n\n mergeGroups(prevGroup, temp, skip, take);\n\n return data.concat(temp);\n }\n return data.concat(range.slice(skip, take));\n },\n\n _processRangeData: function(data, skip, take, pageSkip, size, eventData) {\n var that = this;\n\n that._pending = undefined$1;\n\n that._skip = skip > that.skip() && !that._omitPrefetch ? math.min(size, (that.totalPages() - 1) * that.take()) : pageSkip;\n\n that._currentRangeStart = skip;\n\n that._take = take;\n\n var paging = that.options.serverPaging;\n var sorting = that.options.serverSorting;\n var filtering = that.options.serverFiltering;\n var aggregates = that.options.serverAggregates;\n try {\n that.options.serverPaging = true;\n if (!that._isServerGrouped() && !(that.group() && that.group().length)) {\n that.options.serverSorting = true;\n }\n that.options.serverFiltering = true;\n that.options.serverPaging = true;\n that.options.serverAggregates = true;\n\n if (paging) {\n that._detachObservableParents();\n that._data = data = that._observe(data);\n }\n that._process(data, eventData);\n } finally {\n that.options.serverPaging = paging;\n that.options.serverSorting = sorting;\n that.options.serverFiltering = filtering;\n that.options.serverAggregates = aggregates;\n }\n },\n\n skip: function() {\n var that = this;\n\n if (that._skip === undefined$1) {\n return (that._page !== undefined$1 ? (that._page - 1) * (that.take() || 1) : undefined$1);\n }\n return that._skip;\n },\n\n currentRangeStart: function() {\n return this._currentRangeStart || 0;\n },\n\n take: function() {\n return this._take || this._pageSize;\n },\n\n _prefetchSuccessHandler: function(skip, size, callback, force) {\n var that = this;\n var timestamp = that._timeStamp();\n\n return function(data) {\n var found = false,\n range = { start: skip, end: size, data: [], timestamp: that._timeStamp() },\n idx,\n length,\n temp;\n\n that._dequeueRequest();\n\n that.trigger(REQUESTEND, { response: data, type: \"read\" });\n\n data = that.reader.parse(data);\n\n temp = that._readData(data);\n\n if (temp.length) {\n for (idx = 0, length = that._ranges.length; idx < length; idx++) {\n if (that._ranges[idx].start === skip) {\n found = true;\n range = that._ranges[idx];\n\n if (!that._isGroupPaged()) {\n range.pristineData = temp;\n range.data = that._observe(temp);\n range.end = range.start + that._flatData(range.data, true).length;\n that._sortRanges();\n }\n\n break;\n }\n }\n\n if (!found) {\n that._addRange(that._observe(temp), skip);\n }\n }\n\n that._total = that.reader.total(data);\n\n if (force || (timestamp >= that._currentRequestTimeStamp || !that._skipRequestsInProgress)) {\n if (callback && temp.length) {\n callback();\n } else {\n that.trigger(CHANGE, {});\n }\n }\n };\n },\n\n prefetch: function(skip, take, callback) {\n var that = this,\n size = math.min(skip + take, that.total()),\n options = {\n take: take,\n skip: skip,\n page: skip / take + 1,\n pageSize: take,\n sort: that._sort,\n filter: that._filter,\n group: that._group,\n aggregate: that._aggregate\n };\n\n\n if ((that._isGroupPaged() && !that._isServerGrouped() && that._groupRangeExists(skip, size))) {\n if (callback) {\n callback();\n }\n return;\n }\n\n if ((that._isServerGroupPaged() && !that._groupRangeExists(skip, size)) || !that._rangeExists(skip, size)) {\n clearTimeout(that._timeout);\n\n that._timeout = setTimeout(function() {\n that._queueRequest(options, function() {\n if (!that.trigger(REQUESTSTART, { type: \"read\" })) {\n if (that._omitPrefetch) {\n that.trigger(PROGRESS);\n }\n that.transport.read({\n data: that._params(options),\n success: that._prefetchSuccessHandler(skip, size, callback),\n error: function() {\n var args = slice.call(arguments);\n that.error.apply(that, args);\n }\n });\n } else {\n that._dequeueRequest();\n }\n });\n }, 100);\n } else if (callback) {\n callback();\n }\n },\n\n _multiplePrefetch: function(skip, take, callback) {\n var that = this,\n size = math.min(skip + take, that.total()),\n options = {\n take: take,\n skip: skip,\n page: skip / take + 1,\n pageSize: take,\n sort: that._sort,\n filter: that._filter,\n group: that._group,\n aggregate: that._aggregate\n };\n\n if (!that._rangeExists(skip, size)) {\n if (!that.trigger(REQUESTSTART, { type: \"read\" })) {\n that.transport.read({\n data: that._params(options),\n success: that._prefetchSuccessHandler(skip, size, callback, true)\n });\n }\n } else if (callback) {\n callback();\n }\n },\n\n _adjustPageSkip: function(start, take) {\n var that = this;\n var prevRange = that._getPrevRange(start);\n var result;\n var total = that.total();\n var mismatch;\n\n if (prevRange) {\n mismatch = that._getRangesMismatch(start);\n\n if (!mismatch) {\n return start;\n }\n start -= mismatch;\n }\n result = math.max(math.floor(start / take), 0) * take;\n\n if (result > total) {\n while (true) {\n result -= take;\n if (result < total) {\n break;\n }\n }\n }\n return result;\n },\n\n _getNextRange: function(end) {\n var that = this,\n ranges = that._ranges,\n idx,\n length;\n\n for (idx = 0, length = ranges.length; idx < length; idx++) {\n if (ranges[idx].start <= end && ranges[idx].end >= end) {\n return ranges[idx];\n }\n }\n },\n\n _getPrevRange: function(start) {\n var that = this,\n ranges = that._ranges,\n idx,\n range,\n length = ranges.length;\n\n for (idx = length - 1; idx >= 0; idx--) {\n if (ranges[idx].outerStart <= start) {\n range = ranges[idx];\n break;\n }\n\n }\n\n return range;\n },\n\n _rangeExists: function(start, end) {\n var that = this,\n ranges = that._ranges,\n idx,\n length;\n\n for (idx = 0, length = ranges.length; idx < length; idx++) {\n if (ranges[idx].start <= start && ranges[idx].end >= end) {\n return true;\n }\n }\n\n return false;\n },\n\n _groupRangeExists: function(start, end) {\n var that = this,\n ranges = that._ranges,\n idx,\n length,\n availableItemsCount = 0,\n total = that.groupsTotal(true);\n\n if (end > total && !that._isServerGrouped()) {\n end = total;\n }\n\n for (idx = 0, length = ranges.length; idx < length; idx++) {\n var range = ranges[idx];\n if (range.outerStart <= start && range.outerEnd >= start) {\n availableItemsCount += range.outerEnd - start;\n } else if (range.outerStart <= end && range.outerEnd >= end) {\n availableItemsCount += end - range.outerStart;\n }\n }\n\n return availableItemsCount >= end - start;\n },\n\n _getCurrentRangeSpan: function() {\n var that = this;\n var ranges = that._ranges;\n var start = that.currentRangeStart();\n var end = start + (that.take() || 0);\n var rangeSpan = [];\n var range;\n var idx;\n var length = ranges.length;\n\n for (idx = 0; idx < length; idx++) {\n range = ranges[idx];\n\n if ((range.start <= start && range.end >= start) || (range.start >= start && range.start <= end)) {\n rangeSpan.push(range);\n }\n }\n\n return rangeSpan;\n },\n\n _removeModelFromRanges: function(model) {\n var that = this;\n var range;\n\n for (var idx = 0, length = this._ranges.length; idx < length; idx++) {\n range = this._ranges[idx];\n\n that._removeModelFromRange(range, model);\n }\n\n that._updateRangesLength();\n },\n\n _removeModelFromRange: function(range, model) {\n this._eachItem(range.data, function(data) {\n if (!data) {\n return;\n }\n for (var idx = 0; idx < data.length; idx++) {\n var dataItem = data[idx];\n\n if (dataItem.uid && dataItem.uid == model.uid) {\n [].splice.call(data, idx, 1);\n break;\n }\n }\n });\n },\n\n _insertModelInRange: function(index, model) {\n var that = this;\n var ranges = that._ranges || [];\n var rangesLength = ranges.length;\n var range;\n var i;\n\n for (i = 0; i < rangesLength; i++) {\n range = ranges[i];\n\n if (range.start <= index && range.end >= index) {\n if (!that._getByUid(model.uid, range.data)) {\n if (that._isServerGrouped()) {\n range.data.splice(index, 0, that._wrapInEmptyGroup(model));\n } else {\n range.data.splice(index, 0, model);\n }\n }\n\n break;\n }\n }\n\n that._updateRangesLength();\n },\n\n _updateRangesLength: function() {\n var that = this;\n var ranges = that._ranges || [];\n var rangesLength = ranges.length;\n var mismatchFound = false;\n var mismatchLength = 0;\n var lengthDifference = 0;\n var rangeLength;\n var range;\n var i;\n\n for (i = 0; i < rangesLength; i++) {\n range = ranges[i];\n rangeLength = that._isGroupPaged() ? range.data.length : that._flatData(range.data, true).length;\n lengthDifference = rangeLength - math.abs(range.end - range.start);\n\n if (!mismatchFound && lengthDifference !== 0) {\n mismatchFound = true;\n mismatchLength = lengthDifference;\n range.end += mismatchLength;\n continue;\n }\n\n if (mismatchFound) {\n range.start += mismatchLength;\n range.end += mismatchLength;\n }\n }\n },\n\n _updateOuterRangesLength: function() {\n var that = this;\n var ranges = that._ranges || [];\n var rangesLength = ranges.length;\n var mismatchLength = 0;\n var range;\n var i;\n var prevRange;\n var rangeLength;\n\n for (i = 0; i < rangesLength; i++) {\n range = ranges[i];\n rangeLength = that._isGroupPaged() ? that._calculateGroupsTotal(range.data, true, \"items\", true) : that._flatData(range.data, true).length;\n\n if (prevRange) {\n if (prevRange.end != range.start) {\n mismatchLength = range.start - prevRange.end;\n }\n range.outerStart = prevRange.outerEnd + mismatchLength;\n mismatchLength = 0;\n } else {\n range.outerStart = range.start;\n }\n\n range.outerEnd = range.outerStart + rangeLength;\n prevRange = range;\n }\n }\n });\n\n var Transport = {};\n\n Transport.create = function(options, data, dataSource) {\n var transport,\n transportOptions = options.transport ? $.extend({}, options.transport) : null;\n\n if (transportOptions) {\n transportOptions.read = typeof transportOptions.read === STRING ? { url: transportOptions.read } : transportOptions.read;\n\n if (options.type === \"jsdo\") {\n transportOptions.dataSource = dataSource;\n }\n\n if (options.type) {\n kendo.data.transports = kendo.data.transports || {};\n kendo.data.schemas = kendo.data.schemas || {};\n\n if (!kendo.data.transports[options.type]) {\n kendo.logToConsole(\"Unknown DataSource transport type '\" + options.type + \"'.\\nVerify that registration scripts for this type are included after Kendo UI on the page.\", \"warn\");\n } else if (!isPlainObject(kendo.data.transports[options.type])) {\n transport = new kendo.data.transports[options.type](extend(transportOptions, { data: data }));\n } else {\n transportOptions = extend(true, {}, kendo.data.transports[options.type], transportOptions);\n }\n\n options.schema = extend(true, {}, kendo.data.schemas[options.type], options.schema);\n }\n\n if (!transport) {\n transport = isFunction(transportOptions.read) ? transportOptions : new RemoteTransport(transportOptions);\n }\n } else {\n transport = new LocalTransport({ data: options.data || [] });\n }\n return transport;\n };\n\n DataSource.create = function(options) {\n if (isArray(options) || options instanceof ObservableArray) {\n options = { data: options };\n }\n\n var dataSource = options || {},\n data = dataSource.data,\n fields = dataSource.fields,\n table = dataSource.table,\n select = dataSource.select,\n idx,\n length,\n model = {},\n field;\n\n if (!data && fields && !dataSource.transport) {\n if (table) {\n data = inferTable(table, fields);\n } else if (select) {\n data = inferSelect(select, fields);\n\n if (dataSource.group === undefined$1 && data[0] && data[0].optgroup !== undefined$1) {\n dataSource.group = \"optgroup\";\n }\n }\n }\n\n if (kendo.data.Model && fields && (!dataSource.schema || !dataSource.schema.model)) {\n for (idx = 0, length = fields.length; idx < length; idx++) {\n field = fields[idx];\n if (field.type) {\n model[field.field] = field;\n }\n }\n\n if (!isEmptyObject(model)) {\n dataSource.schema = extend(true, dataSource.schema, { model: { fields: model } });\n }\n }\n\n dataSource.data = data;\n\n select = null;\n dataSource.select = null;\n table = null;\n dataSource.table = null;\n\n return dataSource instanceof DataSource ? dataSource : new DataSource(dataSource);\n };\n\n function inferSelect(select, fields) {\n select = $(select)[0];\n var options = select.options;\n var firstField = fields[0];\n var secondField = fields[1];\n\n var data = [];\n var idx, length;\n var optgroup;\n var option;\n var record;\n var value;\n\n for (idx = 0, length = options.length; idx < length; idx++) {\n record = {};\n option = options[idx];\n optgroup = option.parentNode;\n\n if (optgroup === select) {\n optgroup = null;\n }\n\n if (option.disabled || (optgroup && optgroup.disabled)) {\n continue;\n }\n\n if (optgroup) {\n record.optgroup = optgroup.label;\n }\n\n record[firstField.field] = option.text;\n\n value = option.attributes.value;\n\n if (value && value.specified) {\n value = option.value;\n } else {\n value = option.text;\n }\n\n record[secondField.field] = value;\n\n data.push(record);\n }\n\n return data;\n }\n\n function inferTable(table, fields) {\n var tbody = $(table)[0].tBodies[0],\n rows = tbody ? tbody.rows : [],\n idx,\n length,\n fieldIndex,\n fieldCount = fields.length,\n data = [],\n cells,\n record,\n cell,\n empty;\n\n for (idx = 0, length = rows.length; idx < length; idx++) {\n record = {};\n empty = true;\n cells = rows[idx].cells;\n\n for (fieldIndex = 0; fieldIndex < fieldCount; fieldIndex++) {\n cell = cells[fieldIndex];\n if (cell.nodeName.toLowerCase() !== \"th\") {\n empty = false;\n record[fields[fieldIndex].field] = cell.innerHTML;\n }\n }\n if (!empty) {\n data.push(record);\n }\n }\n\n return data;\n }\n\n var Node = Model.define({\n idField: \"id\",\n\n init: function(value) {\n var that = this,\n hasChildren = that.hasChildren || value && value.hasChildren,\n childrenField = \"items\",\n childrenOptions = {};\n\n kendo.data.Model.fn.init.call(that, value);\n\n if (typeof that.children === STRING) {\n childrenField = that.children;\n }\n\n childrenOptions = {\n schema: {\n data: childrenField,\n model: {\n hasChildren: hasChildren,\n id: that.idField,\n fields: that.fields\n }\n }\n };\n\n if (typeof that.children !== STRING) {\n extend(childrenOptions, that.children);\n }\n\n childrenOptions.data = value;\n\n if (!hasChildren) {\n hasChildren = childrenOptions.schema.data;\n }\n\n if (typeof hasChildren === STRING) {\n hasChildren = kendo.getter(hasChildren);\n }\n\n if (isFunction(hasChildren)) {\n var hasChildrenObject = hasChildren.call(that, that);\n\n if (hasChildrenObject && hasChildrenObject.length === 0) {\n that.hasChildren = false;\n } else {\n that.hasChildren = !!hasChildrenObject;\n }\n }\n\n that._childrenOptions = childrenOptions;\n\n if (that.hasChildren) {\n that._initChildren();\n }\n\n that._loaded = !!(value && value._loaded);\n },\n\n _initChildren: function() {\n var that = this;\n var children, transport, parameterMap;\n\n if (!(that.children instanceof HierarchicalDataSource)) {\n children = that.children = new HierarchicalDataSource(that._childrenOptions);\n\n transport = children.transport;\n parameterMap = transport.parameterMap;\n\n transport.parameterMap = function(data, type) {\n data[that.idField || \"id\"] = that.id;\n\n if (parameterMap) {\n data = parameterMap.call(that, data, type);\n }\n\n return data;\n };\n\n children.parent = function() {\n return that;\n };\n\n children.bind(CHANGE, function(e) {\n e.node = e.node || that;\n that.trigger(CHANGE, e);\n });\n\n children.bind(ERROR, function(e) {\n var collection = that.parent();\n\n if (collection) {\n e.node = e.node || that;\n collection.trigger(ERROR, e);\n }\n });\n\n children.bind(ITEMSLOADED, function(e) {\n var collection = that.parent();\n\n if (collection) {\n collection.trigger(ITEMSLOADED, e);\n }\n });\n\n that._updateChildrenField();\n }\n },\n\n append: function(model) {\n this._initChildren();\n this.loaded(true);\n this.children.add(model);\n },\n\n hasChildren: false,\n\n level: function() {\n var parentNode = this.parentNode(),\n level = 0;\n\n while (parentNode && parentNode.parentNode) {\n level++;\n parentNode = parentNode.parentNode ? parentNode.parentNode() : null;\n }\n\n return level;\n },\n\n _updateChildrenField: function() {\n var fieldName = this._childrenOptions.schema.data;\n\n this[fieldName || \"items\"] = this.children.data();\n },\n\n _childrenLoaded: function() {\n this._loaded = true;\n\n this._updateChildrenField();\n },\n\n load: function() {\n var options = {};\n var method = \"_query\";\n var children, promise;\n\n if (this.hasChildren) {\n this._initChildren();\n\n children = this.children;\n\n options[this.idField || \"id\"] = this.id;\n\n if (!this._loaded) {\n children._data = undefined$1;\n method = \"read\";\n }\n\n children.one(CHANGE, this._childrenLoaded.bind(this));\n\n if (this._matchFilter) {\n options.filter = { field: '_matchFilter', operator: 'eq', value: true };\n }\n\n promise = children[method](options);\n if (!this._loaded) {\n this.trigger(ITEMLOAD, { promise: promise, node: this });\n }\n } else {\n this.loaded(true);\n }\n\n return promise || $.Deferred().resolve().promise();\n },\n\n parentNode: function() {\n var array = this.parent();\n\n return array.parent();\n },\n\n loaded: function(value) {\n if (value !== undefined$1) {\n this._loaded = value;\n } else {\n return this._loaded;\n }\n },\n\n shouldSerialize: function(field) {\n return Model.fn.shouldSerialize.call(this, field) &&\n field !== \"children\" &&\n field !== \"_loaded\" &&\n field !== \"hasChildren\" &&\n field !== \"_childrenOptions\";\n }\n });\n\n function dataMethod(name) {\n return function() {\n var data = this._data,\n result = DataSource.fn[name].apply(this, slice.call(arguments));\n\n if (this._data != data) {\n this._attachBubbleHandlers();\n }\n\n return result;\n };\n }\n\n var HierarchicalDataSource = DataSource.extend({\n init: function(options) {\n var node = Node.define({\n children: options\n });\n\n if (options.filter && !options.serverFiltering) {\n this._hierarchicalFilter = options.filter;\n options.filter = null;\n }\n\n DataSource.fn.init.call(this, extend(true, {}, { schema: { modelBase: node, model: node } }, options));\n\n this._attachBubbleHandlers();\n },\n\n _attachBubbleHandlers: function() {\n var that = this;\n\n that._data.bind(ERROR, function(e) {\n that.trigger(ERROR, e);\n });\n\n that._data.bind(ITEMSLOADED, function(e) {\n that.trigger(ITEMSLOADED, e);\n });\n },\n\n loading: function() {\n if (this._data) {\n return this._data.loading() || this._childrenLoading();\n }\n return false;\n },\n\n _childrenLoading: function() {\n var isLoading = false;\n this._data.forEach(function(node) {\n if (node.hasChildren && node.children.loading()) {\n isLoading = true;\n }\n });\n return isLoading;\n },\n\n read: function(data) {\n var result = DataSource.fn.read.call(this, data);\n\n if (this._hierarchicalFilter) {\n if (this._data && this._data.length > 0) {\n this.filter(this._hierarchicalFilter);\n } else {\n this.options.filter = this._hierarchicalFilter;\n this._filter = normalizeFilter(this.options.filter);\n this._hierarchicalFilter = null;\n }\n }\n\n return result;\n },\n\n remove: function(node) {\n var parentNode = node.parentNode(),\n dataSource = this,\n result;\n\n if (parentNode && parentNode._initChildren) {\n dataSource = parentNode.children;\n }\n\n result = DataSource.fn.remove.call(dataSource, node);\n\n if (parentNode && !dataSource.data().length) {\n parentNode.hasChildren = false;\n }\n\n return result;\n },\n\n success: dataMethod(\"success\"),\n\n data: dataMethod(\"data\"),\n\n insert: function(index, model) {\n var parentNode = this.parent();\n\n if (parentNode && parentNode._initChildren) {\n parentNode.hasChildren = true;\n parentNode._initChildren();\n }\n\n return DataSource.fn.insert.call(this, index, model);\n },\n\n filter: function(val) {\n if (val === undefined$1) {\n return this._filter;\n }\n\n if (!this.options.serverFiltering && this._markHierarchicalQuery(val)) {\n val = { logic: \"or\", filters: [val, { field: '_matchFilter', operator: 'equals', value: true }] };\n }\n\n this.trigger(\"reset\");\n this._query({ filter: val, page: 1 });\n },\n\n _markHierarchicalQuery: function(expressions) {\n var compiled;\n var accentFoldingFiltering = this.options.accentFoldingFiltering;\n\n expressions = accentFoldingFiltering ? $.extend({}, normalizeFilter(expressions), { accentFoldingFiltering: accentFoldingFiltering }) : normalizeFilter(expressions);\n\n if (!expressions || expressions.filters.length === 0) {\n this._updateHierarchicalFilter(function() {return true;});\n return false;\n }\n\n compiled = Query.filterExpr(expressions, { noEval: true });\n\n this._updateHierarchicalFilter(compiled);\n return true;\n },\n\n _updateHierarchicalFilter: function(filter) {\n var current;\n var data = this._data;\n var result = false;\n\n for (var idx = 0; idx < data.length; idx++) {\n current = data[idx];\n\n if (current.hasChildren) {\n current._matchFilter = current.children._updateHierarchicalFilter(filter);\n if (!current._matchFilter) {\n current._matchFilter = filter(current);\n }\n } else {\n current._matchFilter = filter(current);\n }\n\n if (current._matchFilter) {\n result = true;\n }\n }\n return result;\n },\n\n _find: function(method, value) {\n var idx, length, node, children;\n var data = this._data;\n\n if (!data) {\n return;\n }\n\n node = DataSource.fn[method].call(this, value);\n\n if (node) {\n return node;\n }\n\n data = this._flatData(this._data);\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n children = data[idx].children;\n\n if (!(children instanceof HierarchicalDataSource)) {\n continue;\n }\n\n node = children[method](value);\n\n if (node) {\n return node;\n }\n }\n },\n\n get: function(id) {\n return this._find(\"get\", id);\n },\n\n getByUid: function(uid) {\n return this._find(\"getByUid\", uid);\n }\n });\n\n function inferList(list, fields) {\n var items = $(list).children(),\n idx,\n length,\n data = [],\n record,\n textField = fields[0].field,\n urlField = fields[1] && fields[1].field,\n spriteCssClassField = fields[2] && fields[2].field,\n imageUrlField = fields[3] && fields[3].field,\n item,\n id,\n textChild,\n className,\n children;\n\n function elements(collection, tagName) {\n return collection.filter(tagName).add(collection.find(tagName));\n }\n\n for (idx = 0, length = items.length; idx < length; idx++) {\n record = { _loaded: true };\n item = items.eq(idx);\n\n textChild = item[0].firstChild;\n children = item.children();\n list = children.filter(\"ul\");\n children = children.filter(\":not(ul)\");\n\n id = item.attr(\"data-id\");\n\n if (id) {\n record.id = id;\n }\n\n if (textChild) {\n record[textField] = textChild.nodeType == 3 ? textChild.nodeValue : children.text();\n }\n\n if (urlField) {\n record[urlField] = elements(children, \"a\").attr(\"href\");\n }\n\n if (imageUrlField) {\n record[imageUrlField] = elements(children, \"img\").attr(\"src\");\n }\n\n if (spriteCssClassField) {\n className = elements(children, \".k-sprite\").prop(\"className\");\n record[spriteCssClassField] = className && kendo.trim(className.replace(\"k-sprite\", \"\"));\n }\n\n if (list.length) {\n record.items = inferList(list.eq(0), fields);\n }\n\n if (item.attr(\"data-hasChildren\") == \"true\") {\n record.hasChildren = true;\n }\n\n data.push(record);\n }\n\n return data;\n }\n\n HierarchicalDataSource.create = function(options) {\n options = options && options.push ? { data: options } : options;\n\n var dataSource = options || {},\n data = dataSource.data,\n fields = dataSource.fields,\n list = dataSource.list;\n\n if (data && data._dataSource) {\n return data._dataSource;\n }\n\n if (!data && fields && !dataSource.transport) {\n if (list) {\n data = inferList(list, fields);\n }\n }\n\n dataSource.data = data;\n\n return dataSource instanceof HierarchicalDataSource ? dataSource : new HierarchicalDataSource(dataSource);\n };\n\n var Buffer = kendo.Observable.extend({\n init: function(dataSource, viewSize, disablePrefetch) {\n kendo.Observable.fn.init.call(this);\n\n this._prefetching = false;\n this.dataSource = dataSource;\n this.prefetch = !disablePrefetch;\n\n var buffer = this;\n\n dataSource.bind(\"change\", function() {\n buffer._change();\n });\n\n dataSource.bind(\"reset\", function() {\n buffer._reset();\n });\n\n this._syncWithDataSource();\n\n this.setViewSize(viewSize);\n },\n\n setViewSize: function(viewSize) {\n this.viewSize = viewSize;\n this._recalculate();\n },\n\n at: function(index) {\n var pageSize = this.pageSize,\n itemPresent = true;\n\n if (index >= this.total()) {\n this.trigger(\"endreached\", { index: index });\n return null;\n }\n\n if (!this.useRanges) {\n return this.dataSource.view()[index];\n }\n if (this.useRanges) {\n // out of range request\n if (index < this.dataOffset || index >= this.skip + pageSize) {\n itemPresent = this.range(Math.floor(index / pageSize) * pageSize);\n }\n\n // prefetch\n if (index === this.prefetchThreshold) {\n this._prefetch();\n }\n\n // mid-range jump - prefetchThreshold and nextPageThreshold may be equal, do not change to else if\n if (index === this.midPageThreshold) {\n this.range(this.nextMidRange, true);\n }\n // next range jump\n else if (index === this.nextPageThreshold) {\n this.range(this.nextFullRange);\n }\n // pull-back\n else if (index === this.pullBackThreshold) {\n if (this.offset === this.skip) { // from full range to mid range\n this.range(this.previousMidRange);\n } else { // from mid range to full range\n this.range(this.previousFullRange);\n }\n }\n\n if (itemPresent) {\n return this.dataSource.at(index - this.dataOffset);\n } else {\n this.trigger(\"endreached\", { index: index });\n return null;\n }\n }\n },\n\n indexOf: function(item) {\n return this.dataSource.data().indexOf(item) + this.dataOffset;\n },\n\n total: function() {\n return parseInt(this.dataSource.total(), 10);\n },\n\n next: function() {\n var buffer = this,\n pageSize = buffer.pageSize,\n offset = buffer.skip - buffer.viewSize + pageSize,\n pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize;\n\n this.offset = offset;\n this.dataSource.prefetch(pageSkip, pageSize, function() {\n buffer._goToRange(offset, true);\n });\n },\n\n range: function(offset, nextRange) {\n if (this.offset === offset) {\n return true;\n }\n\n var buffer = this,\n pageSize = this.pageSize,\n pageSkip = math.max(math.floor(offset / pageSize), 0) * pageSize,\n dataSource = this.dataSource;\n\n if (nextRange) {\n pageSkip += pageSize;\n }\n\n if (dataSource.inRange(offset, pageSize)) {\n this.offset = offset;\n this._recalculate();\n this._goToRange(offset);\n return true;\n } else if (this.prefetch) {\n dataSource.prefetch(pageSkip, pageSize, function() {\n buffer.offset = offset;\n buffer._recalculate();\n buffer._goToRange(offset, true);\n });\n return false;\n }\n\n return true;\n },\n\n syncDataSource: function() {\n var offset = this.offset;\n this.offset = null;\n this.range(offset);\n },\n\n destroy: function() {\n this.unbind();\n },\n\n _prefetch: function() {\n var buffer = this,\n pageSize = this.pageSize,\n prefetchOffset = this.skip + pageSize,\n dataSource = this.dataSource;\n\n if (!dataSource.inRange(prefetchOffset, pageSize) && !this._prefetching && this.prefetch) {\n this._prefetching = true;\n this.trigger(\"prefetching\", { skip: prefetchOffset, take: pageSize });\n\n dataSource.prefetch(prefetchOffset, pageSize, function() {\n buffer._prefetching = false;\n buffer.trigger(\"prefetched\", { skip: prefetchOffset, take: pageSize });\n });\n }\n },\n\n _goToRange: function(offset, expanding) {\n if (this.offset !== offset) {\n return;\n }\n\n this.dataOffset = offset;\n this._expanding = expanding;\n this.dataSource.range(offset, this.pageSize);\n this.dataSource.enableRequestsInProgress();\n },\n\n _reset: function() {\n this._syncPending = true;\n },\n\n _change: function() {\n var dataSource = this.dataSource;\n\n this.length = this.useRanges ? dataSource.lastRange().end : dataSource.view().length;\n\n if (this._syncPending) {\n this._syncWithDataSource();\n this._recalculate();\n this._syncPending = false;\n this.trigger(\"reset\", { offset: this.offset });\n }\n\n this.trigger(\"resize\");\n\n if (this._expanding) {\n this.trigger(\"expand\");\n }\n\n delete this._expanding;\n },\n\n _syncWithDataSource: function() {\n var dataSource = this.dataSource;\n\n this._firstItemUid = dataSource.firstItemUid();\n this.dataOffset = this.offset = dataSource.skip() || 0;\n this.pageSize = dataSource.pageSize();\n this.useRanges = dataSource.options.serverPaging;\n },\n\n _recalculate: function() {\n var pageSize = this.pageSize,\n offset = this.offset,\n viewSize = this.viewSize,\n skip = Math.ceil(offset / pageSize) * pageSize;\n\n this.skip = skip;\n this.midPageThreshold = skip + pageSize - 1;\n this.nextPageThreshold = skip + viewSize - 1;\n this.prefetchThreshold = skip + Math.floor(pageSize / 3 * 2);\n this.pullBackThreshold = this.offset - 1;\n\n this.nextMidRange = skip + pageSize - viewSize;\n this.nextFullRange = skip;\n this.previousMidRange = offset - viewSize;\n this.previousFullRange = skip - pageSize;\n }\n });\n\n var BatchBuffer = kendo.Observable.extend({\n init: function(dataSource, batchSize) {\n var batchBuffer = this;\n\n kendo.Observable.fn.init.call(batchBuffer);\n\n this.dataSource = dataSource;\n this.batchSize = batchSize;\n this._total = 0;\n\n this.buffer = new Buffer(dataSource, batchSize * 3);\n\n this.buffer.bind({\n \"endreached\": function(e) {\n batchBuffer.trigger(\"endreached\", { index: e.index });\n },\n \"prefetching\": function(e) {\n batchBuffer.trigger(\"prefetching\", { skip: e.skip, take: e.take });\n },\n \"prefetched\": function(e) {\n batchBuffer.trigger(\"prefetched\", { skip: e.skip, take: e.take });\n },\n \"reset\": function() {\n batchBuffer._total = 0;\n batchBuffer.trigger(\"reset\");\n },\n \"resize\": function() {\n batchBuffer._total = Math.ceil(this.length / batchBuffer.batchSize);\n batchBuffer.trigger(\"resize\", { total: batchBuffer.total(), offset: this.offset });\n }\n });\n },\n\n syncDataSource: function() {\n this.buffer.syncDataSource();\n },\n\n at: function(index) {\n var buffer = this.buffer,\n skip = index * this.batchSize,\n take = this.batchSize,\n view = [],\n item;\n\n if (buffer.offset > skip) {\n buffer.at(buffer.offset - 1);\n }\n\n for (var i = 0; i < take; i++) {\n item = buffer.at(skip + i);\n\n if (item === null) {\n break;\n }\n\n view.push(item);\n }\n\n return view;\n },\n\n total: function() {\n return this._total;\n },\n\n destroy: function() {\n this.buffer.destroy();\n this.unbind();\n }\n });\n\n extend(true, kendo.data, {\n readers: {\n json: DataReader\n },\n Query: Query,\n DataSource: DataSource,\n HierarchicalDataSource: HierarchicalDataSource,\n Node: Node,\n Comparer: Comparer,\n ObservableObject: ObservableObject,\n ObservableArray: ObservableArray,\n LazyObservableArray: LazyObservableArray,\n LocalTransport: LocalTransport,\n RemoteTransport: RemoteTransport,\n Cache: Cache,\n DataReader: DataReader,\n Model: Model,\n Buffer: Buffer,\n BatchBuffer: BatchBuffer\n });\n })(window.kendo.jQuery);\n var kendo$c = kendo;\n\n var __meta__$a = {\n id: \"data.signalr\",\n name: \"SignalR\",\n category: \"framework\",\n depends: [ \"data\" ],\n hidden: true\n };\n\n (function($) {\n var kendo = window.kendo;\n var isFunction = kendo.isFunction;\n\n function isJQueryPromise(promise) {\n return promise && isFunction(promise.done) && isFunction(promise.fail);\n }\n\n function isNativePromise(promise) {\n return promise && isFunction(promise.then) && isFunction(promise.catch);\n }\n\n var transport = kendo.data.RemoteTransport.extend({\n init: function(options) {\n var signalr = options && options.signalr ? options.signalr : {};\n\n var promise = signalr.promise;\n\n if (!promise) {\n throw new Error('The \"promise\" option must be set.');\n }\n\n if (!isJQueryPromise(promise) && !isNativePromise(promise)) {\n throw new Error('The \"promise\" option must be a Promise.');\n }\n\n this.promise = promise;\n\n var hub = signalr.hub;\n\n if (!hub) {\n throw new Error('The \"hub\" option must be set.');\n }\n\n if (typeof hub.on != \"function\" || typeof hub.invoke != \"function\") {\n throw new Error('The \"hub\" option is not a valid SignalR hub proxy.');\n }\n\n this.hub = hub;\n\n kendo.data.RemoteTransport.fn.init.call(this, options);\n },\n\n push: function(callbacks) {\n var client = this.options.signalr.client || {};\n\n if (client.create) {\n this.hub.on(client.create, callbacks.pushCreate);\n }\n\n if (client.update) {\n this.hub.on(client.update, callbacks.pushUpdate);\n }\n\n if (client.destroy) {\n this.hub.on(client.destroy, callbacks.pushDestroy);\n }\n },\n\n _crud: function(options, type) {\n var hub = this.hub;\n var promise = this.promise;\n var server = this.options.signalr.server;\n\n if (!server || !server[type]) {\n throw new Error(kendo.format('The \"server.{0}\" option must be set.', type));\n }\n\n var args = [server[type]];\n\n var data = this.parameterMap(options.data, type);\n\n if (!$.isEmptyObject(data)) {\n args.push(data);\n }\n\n if (isJQueryPromise(promise)) {\n promise.done(function() {\n hub.invoke.apply(hub, args)\n .done(options.success)\n .fail(options.error);\n });\n } else if (isNativePromise(promise)) {\n promise.then(function() {\n hub.invoke.apply(hub, args)\n .then(options.success)\n .catch(options.error);\n });\n }\n },\n\n read: function(options) {\n this._crud(options, \"read\");\n },\n\n create: function(options) {\n this._crud(options, \"create\");\n },\n\n update: function(options) {\n this._crud(options, \"update\");\n },\n\n destroy: function(options) {\n this._crud(options, \"destroy\");\n }\n });\n\n $.extend(true, kendo.data, {\n transports: {\n signalr: transport\n }\n });\n\n })(window.kendo.jQuery);\n var kendo$b = kendo;\n\n var __meta__$9 = {\n id: \"binder\",\n name: \"MVVM\",\n category: \"framework\",\n description: \"Model View ViewModel (MVVM) is a design pattern which helps developers separate the Model (the data) from the View (the UI).\",\n depends: [ \"core\", \"data\" ]\n };\n\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n encode = kendo.htmlEncode,\n Observable = kendo.Observable,\n ObservableObject = kendo.data.ObservableObject,\n ObservableArray = kendo.data.ObservableArray,\n toString = {}.toString,\n binders = {},\n Class = kendo.Class,\n VALUE = \"value\",\n SOURCE = \"source\",\n EVENTS = \"events\",\n CHECKED = \"checked\",\n CSS = \"css\",\n deleteExpando = true,\n FUNCTION = \"function\",\n CHANGE = \"change\";\n\n (function() {\n var a = document.createElement(\"a\");\n\n try {\n delete a.test;\n } catch (e) {\n deleteExpando = false;\n }\n })();\n\n var Binding = Observable.extend( {\n init: function(parents, path) {\n var that = this;\n\n Observable.fn.init.call(that);\n\n that.source = parents[0];\n that.parents = parents;\n that.path = path;\n that.dependencies = {};\n that.dependencies[path] = true;\n that.observable = that.source instanceof Observable;\n\n that._access = function(e) {\n that.dependencies[e.field] = true;\n };\n\n if (that.observable) {\n that._change = function(e) {\n that.change(e);\n };\n\n that.source.bind(CHANGE, that._change);\n }\n },\n\n _parents: function() {\n var parents = this.parents;\n var value = this.get();\n\n if (value && typeof value.parent == \"function\") {\n var parent = value.parent();\n\n if ($.inArray(parent, parents) < 0) {\n parents = [parent].concat(parents);\n }\n }\n\n return parents;\n },\n\n change: function(e) {\n var dependency,\n ch,\n field = e.field,\n that = this;\n\n if (that.path === \"this\") {\n that.trigger(CHANGE, e);\n } else {\n for (dependency in that.dependencies) {\n if (dependency.indexOf(field) === 0) {\n ch = dependency.charAt(field.length);\n\n if (!ch || ch === \".\" || ch === \"[\") {\n that.trigger(CHANGE, e);\n break;\n }\n }\n }\n }\n },\n\n start: function(source) {\n source.bind(\"get\", this._access);\n },\n\n stop: function(source) {\n source.unbind(\"get\", this._access);\n },\n\n get: function() {\n\n var that = this,\n source = that.source,\n index = 0,\n path = that.path,\n result = source;\n\n if (!that.observable) {\n return result;\n }\n\n that.start(that.source);\n\n result = source.get(path);\n\n // Traverse the observable hierarchy if the binding is not resolved at the current level.\n while (result === undefined$1 && source) {\n\n source = that.parents[++index];\n\n if (source instanceof ObservableObject) {\n result = source.get(path);\n }\n }\n\n // second pass try to get the parent from the object hierarchy\n if (result === undefined$1) {\n source = that.source; //get the initial source\n\n while (result === undefined$1 && source) {\n source = source.parent();\n\n if (source instanceof ObservableObject) {\n result = source.get(path);\n }\n }\n }\n\n // If the result is a function - invoke it\n if (typeof result === \"function\") {\n index = path.lastIndexOf(\".\");\n\n // If the function is a member of a nested observable object make that nested observable the context (this) of the function\n if (index > 0) {\n source = source.get(path.substring(0, index));\n }\n\n // Invoke the function\n that.start(source);\n\n if (source !== that.source) {\n result = result.call(source, that.source);\n } else {\n result = result.call(source);\n }\n\n that.stop(source);\n }\n\n // If the binding is resolved by a parent object\n if (source && source !== that.source) {\n\n that.currentSource = source; // save parent object\n\n // Listen for changes in the parent object\n source.unbind(CHANGE, that._change)\n .bind(CHANGE, that._change);\n }\n\n that.stop(that.source);\n\n return result;\n },\n\n set: function(value) {\n var source = this.currentSource || this.source;\n\n var field = kendo.getter(this.path)(source);\n\n if (typeof field === \"function\") {\n if (source !== this.source) {\n field.call(source, this.source, value);\n } else {\n field.call(source, value);\n }\n } else {\n source.set(this.path, value);\n }\n },\n\n destroy: function() {\n if (this.observable) {\n this.source.unbind(CHANGE, this._change);\n if (this.currentSource) {\n this.currentSource.unbind(CHANGE, this._change);\n }\n }\n\n this.unbind();\n }\n });\n\n var EventBinding = Binding.extend( {\n get: function() {\n var source = this.source,\n path = this.path,\n index = 0,\n handler;\n\n handler = source.get(path);\n\n while (!handler && source) {\n source = this.parents[++index];\n\n if (source instanceof ObservableObject) {\n handler = source.get(path);\n }\n }\n\n if (!handler) {\n return;\n }\n\n return handler.bind(source);\n }\n });\n\n var TemplateBinding = Binding.extend( {\n init: function(source, path, template) {\n var that = this;\n\n Binding.fn.init.call(that, source, path);\n\n that.template = template;\n },\n\n render: function(value) {\n var html;\n\n this.start(this.source);\n\n html = kendo.render(this.template, value);\n\n this.stop(this.source);\n\n return html;\n }\n });\n\n var Binder = Class.extend({\n init: function(element, bindings, options) {\n this.element = element;\n this.bindings = bindings;\n this.options = options;\n },\n\n bind: function(binding, attribute) {\n var that = this;\n\n binding = attribute ? binding[attribute] : binding;\n\n binding.bind(CHANGE, function(e) {\n that.refresh(attribute || e);\n });\n\n that.refresh(attribute);\n },\n\n destroy: function() {\n }\n });\n\n var TypedBinder = Binder.extend({\n dataType: function() {\n var dataType = this.element.getAttribute(\"data-\" + kendo.ns + \"type\") || this.element.type || \"text\";\n return dataType.toLowerCase();\n },\n\n parsedValue: function() {\n return this._parseValue(this.element.value, this.dataType());\n },\n\n _parseValue: function(value, dataType) {\n if (dataType == \"date\") {\n value = kendo.parseDate(value, \"yyyy-MM-dd\");\n } else if (dataType == \"datetime-local\") {\n value = kendo.parseDate(value, [\"yyyy-MM-ddTHH:mm:ss\", \"yyyy-MM-ddTHH:mm\"] );\n } else if (dataType == \"number\") {\n value = kendo.parseFloat(value);\n } else if (dataType == \"boolean\") {\n value = value.toLowerCase();\n if (kendo.parseFloat(value) !== null) {\n value = Boolean(kendo.parseFloat(value));\n } else {\n value = (value.toLowerCase() === \"true\");\n }\n }\n return value;\n }\n });\n\n binders.attr = Binder.extend({\n refresh: function(key) {\n this.element.setAttribute(key, this.bindings.attr[key].get());\n }\n });\n\n binders.css = Binder.extend({\n init: function(element, bindings, options) {\n Binder.fn.init.call(this, element, bindings, options);\n this.classes = {};\n },\n refresh: function(className) {\n var element = $(this.element),\n binding = this.bindings.css[className],\n hasClass = this.classes[className] = binding.get();\n if (hasClass) {\n element.addClass(className);\n } else {\n element.removeClass(className);\n }\n }\n });\n\n binders.style = Binder.extend({\n refresh: function(key) {\n this.element.style[key] = this.bindings.style[key].get() || \"\";\n }\n });\n\n binders.enabled = Binder.extend({\n refresh: function() {\n if (this.bindings.enabled.get()) {\n this.element.removeAttribute(\"disabled\");\n } else {\n this.element.setAttribute(\"disabled\", \"disabled\");\n }\n }\n });\n\n binders.readonly = Binder.extend({\n refresh: function() {\n if (this.bindings.readonly.get()) {\n this.element.setAttribute(\"readonly\", \"readonly\");\n } else {\n this.element.removeAttribute(\"readonly\");\n }\n }\n });\n\n binders.disabled = Binder.extend({\n refresh: function() {\n if (this.bindings.disabled.get()) {\n this.element.setAttribute(\"disabled\", \"disabled\");\n } else {\n this.element.removeAttribute(\"disabled\");\n }\n }\n });\n\n binders.events = Binder.extend({\n init: function(element, bindings, options) {\n Binder.fn.init.call(this, element, bindings, options);\n this.handlers = {};\n },\n\n refresh: function(key) {\n var element = $(this.element),\n binding = this.bindings.events[key],\n handler = this.handlers[key];\n\n if (handler) {\n element.off(key, handler);\n }\n\n handler = this.handlers[key] = binding.get();\n\n element.on(key, binding.source, handler);\n },\n\n destroy: function() {\n var element = $(this.element),\n handler;\n\n for (handler in this.handlers) {\n element.off(handler, this.handlers[handler]);\n }\n }\n });\n\n binders.text = Binder.extend({\n refresh: function() {\n var text = this.bindings.text.get();\n var dataFormat = this.element.getAttribute(\"data-\" + kendo.ns + \"format\") || \"\";\n if (text == null) {\n text = \"\";\n }\n\n $(this.element).text(kendo.toString(text, dataFormat));\n }\n });\n\n binders.visible = Binder.extend({\n refresh: function() {\n if (this.bindings.visible.get()) {\n this.element.style.display = \"\";\n } else {\n this.element.style.display = \"none\";\n }\n }\n });\n\n binders.invisible = Binder.extend({\n refresh: function() {\n if (!this.bindings.invisible.get()) {\n this.element.style.display = \"\";\n } else {\n this.element.style.display = \"none\";\n }\n }\n });\n\n binders.html = Binder.extend({\n refresh: function() {\n this.element.innerHTML = this.bindings.html.get();\n }\n });\n\n binders.value = TypedBinder.extend({\n init: function(element, bindings, options) {\n TypedBinder.fn.init.call(this, element, bindings, options);\n\n this._change = this.change.bind(this);\n this.eventName = options.valueUpdate || CHANGE;\n\n $(this.element).on(this.eventName, this._change);\n\n this._initChange = false;\n },\n\n change: function() {\n this._initChange = this.eventName != CHANGE;\n\n this.bindings[VALUE].set(this.parsedValue());\n\n this._initChange = false;\n },\n\n refresh: function() {\n if (!this._initChange) {\n var value = this.bindings[VALUE].get();\n\n if (value == null) {\n value = \"\";\n }\n\n var type = this.dataType();\n\n if (type == \"date\") {\n value = kendo.toString(value, \"yyyy-MM-dd\");\n } else if (type == \"datetime-local\") {\n value = kendo.toString(value, \"yyyy-MM-ddTHH:mm:ss\");\n }\n\n this.element.value = value;\n }\n\n this._initChange = false;\n },\n\n destroy: function() {\n $(this.element).off(this.eventName, this._change);\n }\n });\n\n binders.source = Binder.extend({\n init: function(element, bindings, options) {\n Binder.fn.init.call(this, element, bindings, options);\n\n var source = this.bindings.source.get();\n\n if (source instanceof kendo.data.DataSource && options.autoBind !== false) {\n source.fetch();\n }\n },\n\n refresh: function(e) {\n var that = this,\n source = that.bindings.source.get();\n\n if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n e = e || {};\n\n if (e.action == \"add\") {\n that.add(e.index, e.items);\n } else if (e.action == \"remove\") {\n that.remove(e.index, e.items);\n } else if (e.action != \"itemchange\") {\n that.render();\n }\n } else {\n that.render();\n }\n },\n\n container: function() {\n var element = this.element;\n\n if (element.nodeName.toLowerCase() == \"table\") {\n if (!element.tBodies[0]) {\n element.appendChild(document.createElement(\"tbody\"));\n }\n element = element.tBodies[0];\n }\n\n return element;\n },\n\n template: function() {\n var options = this.options,\n template = options.template,\n nodeName = this.container().nodeName.toLowerCase();\n\n if (!template) {\n if (nodeName == \"select\") {\n if (options.valueField || options.textField) {\n template = function (data) {\n var valueAttr = kendo.getter(options.valueField || options.textField)(data);\n var innerText = kendo.getter(options.textField || options.valueField)(data);\n return (\"\");\n };\n } else {\n template = function (data) { return (\"\"); };\n }\n } else if (nodeName == \"tbody\") {\n template = function (data) { return (\"\" + (encode(data)) + \"\"); };\n } else if (nodeName == \"ul\" || nodeName == \"ol\") {\n template = function (data) { return (\"
  • \" + (encode(data)) + \"
  • \"); };\n } else {\n template = function (data) { return (\"\" + (encode(data))); };\n }\n template = kendo.template(template);\n }\n\n return template;\n },\n\n add: function(index, items) {\n var element = this.container(),\n parents,\n idx,\n length,\n child,\n clone = element.cloneNode(false),\n reference = element.children[index];\n\n $(clone).html(kendo.render(this.template(), items));\n\n if (clone.children.length) {\n parents = this.bindings.source._parents();\n\n for (idx = 0, length = items.length; idx < length; idx++) {\n child = clone.children[0];\n element.insertBefore(child, reference || null);\n bindElement(child, items[idx], this.options.roles, [items[idx]].concat(parents));\n }\n }\n },\n\n remove: function(index, items) {\n var idx, element = this.container();\n\n for (idx = 0; idx < items.length; idx++) {\n var child = element.children[index];\n unbindElementTree(child, true);\n if (child.parentNode == element) {\n element.removeChild(child);\n }\n }\n },\n\n render: function() {\n var source = this.bindings.source.get(),\n parents,\n idx,\n length,\n element = this.container(),\n template = this.template();\n\n if (source == null) {\n return;\n }\n\n if (source instanceof kendo.data.DataSource) {\n source = source.view();\n }\n\n if (!(source instanceof ObservableArray) && toString.call(source) !== \"[object Array]\") {\n source = [source];\n }\n\n if (this.bindings.template) {\n unbindElementChildren(element, true);\n\n $(element).html(this.bindings.template.render(source));\n\n if (element.children.length) {\n parents = this.bindings.source._parents();\n\n for (idx = 0, length = source.length; idx < length; idx++) {\n bindElement(element.children[idx], source[idx], this.options.roles, [source[idx]].concat(parents));\n }\n }\n } else {\n $(element).html(kendo.render(template, source));\n }\n }\n });\n\n binders.input = {\n checked: TypedBinder.extend({\n init: function(element, bindings, options) {\n TypedBinder.fn.init.call(this, element, bindings, options);\n this._change = this.change.bind(this);\n\n $(this.element).change(this._change);\n },\n\n change: function() {\n var element = this.element;\n var value = this.value();\n\n if (element.type == \"radio\") {\n value = this.parsedValue();\n this.bindings[CHECKED].set(value);\n } else if (element.type == \"checkbox\") {\n var source = this.bindings[CHECKED].get();\n var index;\n\n if (source instanceof ObservableArray) {\n value = this.parsedValue();\n if (value instanceof Date) {\n for (var i = 0; i < source.length; i++) {\n if (source[i] instanceof Date && +source[i] === +value) {\n index = i;\n break;\n }\n }\n } else {\n index = source.indexOf(value);\n }\n if (index > -1) {\n source.splice(index, 1);\n } else {\n source.push(value);\n }\n } else {\n this.bindings[CHECKED].set(value);\n }\n }\n },\n\n refresh: function() {\n var value = this.bindings[CHECKED].get(),\n source = value,\n type = this.dataType(),\n element = this.element;\n\n if (element.type == \"checkbox\") {\n if (source instanceof ObservableArray) {\n var index = -1;\n value = this.parsedValue();\n if (value instanceof Date) {\n for (var i = 0; i < source.length; i++) {\n if (source[i] instanceof Date && +source[i] === +value) {\n index = i;\n break;\n }\n }\n } else {\n index = source.indexOf(value);\n }\n element.checked = (index >= 0);\n } else {\n element.checked = source;\n }\n } else if (element.type == \"radio\") {\n if (type == \"date\") {\n value = kendo.toString(value, \"yyyy-MM-dd\");\n } else if (type == \"datetime-local\") {\n value = kendo.toString(value, \"yyyy-MM-ddTHH:mm:ss\");\n }\n\n if (value !== null && typeof(value) !== \"undefined\" && element.value === value.toString()) {\n element.checked = true;\n } else {\n element.checked = false;\n }\n }\n },\n\n value: function() {\n var element = this.element,\n value = element.value;\n\n if (element.type == \"checkbox\") {\n value = element.checked;\n }\n\n return value;\n },\n destroy: function() {\n $(this.element).off(CHANGE, this._change);\n }\n })\n };\n\n binders.select = {\n source: binders.source.extend({\n refresh: function(e) {\n var that = this,\n source = that.bindings.source.get();\n\n if (source instanceof ObservableArray || source instanceof kendo.data.DataSource) {\n e = e || {};\n if (e.action == \"add\") {\n that.add(e.index, e.items);\n } else if (e.action == \"remove\") {\n that.remove(e.index, e.items);\n } else if (e.action == \"itemchange\" || e.action === undefined$1) {\n that.render();\n if (that.bindings.value) {\n if (that.bindings.value) {\n var val = retrievePrimitiveValues(that.bindings.value.get(), $(that.element).data(\"valueField\"));\n if (val === null) {\n that.element.selectedIndex = -1;\n } else {\n that.element.value = val;\n }\n }\n }\n }\n } else {\n that.render();\n }\n }\n }),\n value: TypedBinder.extend({\n init: function(target, bindings, options) {\n TypedBinder.fn.init.call(this, target, bindings, options);\n\n this._change = this.change.bind(this);\n $(this.element).change(this._change);\n },\n\n parsedValue: function() {\n var dataType = this.dataType();\n var values = [];\n var value, option, idx, length;\n for (idx = 0, length = this.element.options.length; idx < length; idx++) {\n option = this.element.options[idx];\n\n if (option.selected) {\n value = option.attributes.value;\n\n if (value && value.specified) {\n value = option.value;\n } else {\n value = option.text;\n }\n\n values.push(this._parseValue(value, dataType));\n }\n }\n return values;\n },\n\n change: function() {\n var values = [],\n element = this.element,\n source,\n field = this.options.valueField || this.options.textField,\n valuePrimitive = this.options.valuePrimitive,\n option,\n valueIndex,\n value,\n idx,\n length;\n\n for (idx = 0, length = element.options.length; idx < length; idx++) {\n option = element.options[idx];\n\n if (option.selected) {\n value = option.attributes.value;\n\n if (value && value.specified) {\n value = option.value;\n } else {\n value = option.text;\n }\n\n if (field) {\n values.push(value);\n } else {\n values.push(this._parseValue(value, this.dataType()));\n }\n\n }\n }\n\n if (field) {\n source = this.bindings.source.get();\n if (source instanceof kendo.data.DataSource) {\n source = source.view();\n }\n\n for (valueIndex = 0; valueIndex < values.length; valueIndex++) {\n for (idx = 0, length = source.length; idx < length; idx++) {\n var sourceValue = source[idx].get(field);\n var match = (String(sourceValue) === values[valueIndex]);\n if (match) {\n values[valueIndex] = source[idx];\n break;\n }\n }\n }\n }\n\n value = this.bindings[VALUE].get();\n if (value instanceof ObservableArray) {\n value.splice.apply(value, [0, value.length].concat(values));\n } else if (!valuePrimitive && (value instanceof ObservableObject || value === null || value === undefined$1 || !field)) {\n this.bindings[VALUE].set(values[0]);\n } else {\n this.bindings[VALUE].set(values[0].get(field));\n }\n },\n refresh: function() {\n var optionIndex,\n element = this.element,\n options = element.options,\n value = this.bindings[VALUE].get(),\n values = value,\n field = this.options.valueField || this.options.textField,\n found = false,\n type = this.dataType(),\n optionValue;\n\n if (!(values instanceof ObservableArray)) {\n values = new ObservableArray([value]);\n }\n\n element.selectedIndex = -1;\n\n for (var valueIndex = 0; valueIndex < values.length; valueIndex++) {\n value = values[valueIndex];\n\n\n if (field && value instanceof ObservableObject) {\n value = value.get(field);\n }\n\n if (type == \"date\") {\n value = kendo.toString(values[valueIndex], \"yyyy-MM-dd\");\n } else if (type == \"datetime-local\") {\n value = kendo.toString(values[valueIndex], \"yyyy-MM-ddTHH:mm:ss\");\n }\n\n for (optionIndex = 0; optionIndex < options.length; optionIndex++) {\n optionValue = options[optionIndex].value;\n\n if (optionValue === \"\" && value !== \"\") {\n optionValue = options[optionIndex].text;\n }\n\n if (value != null && optionValue == value.toString()) {\n options[optionIndex].selected = true;\n found = true;\n }\n }\n }\n },\n destroy: function() {\n $(this.element).off(CHANGE, this._change);\n }\n })\n };\n\n function dataSourceBinding(bindingName, fieldName, setter) {\n return Binder.extend({\n init: function(widget, bindings, options) {\n var that = this;\n\n Binder.fn.init.call(that, widget.element[0], bindings, options);\n\n that.widget = widget;\n that._dataBinding = that.dataBinding.bind(that);\n that._dataBound = that.dataBound.bind(that);\n that._itemChange = that.itemChange.bind(that);\n },\n\n itemChange: function(e) {\n bindElement(e.item[0], e.data, this._ns(e.ns), [e.data].concat(this.bindings[bindingName]._parents()));\n },\n\n dataBinding: function(e) {\n var idx,\n length,\n widget = this.widget,\n items = e.removedItems || widget.items();\n\n for (idx = 0, length = items.length; idx < length; idx++) {\n unbindElementTree(items[idx], false);\n }\n },\n\n _ns: function(ns) {\n ns = ns || kendo.ui;\n var all = [ kendo.ui, kendo.dataviz.ui, kendo.mobile.ui ];\n all.splice($.inArray(ns, all), 1);\n all.unshift(ns);\n\n return kendo.rolesFromNamespaces(all);\n },\n\n dataBound: function(e) {\n var idx,\n length,\n widget = this.widget,\n items = e.addedItems || widget.items(),\n dataSource = widget[fieldName],\n view,\n parents,\n hds = kendo.data.HierarchicalDataSource;\n\n if (hds && dataSource instanceof hds) {\n // suppress binding of HDS items, because calling view() on root\n // will return only root items, and widget.items() returns all items\n return;\n }\n\n if (items.length) {\n view = e.addedDataItems || dataSource.flatView();\n parents = this.bindings[bindingName]._parents();\n\n for (idx = 0, length = view.length; idx < length; idx++) {\n if (items[idx]) {\n bindElement(items[idx], view[idx], this._ns(e.ns), [view[idx]].concat(parents));\n }\n }\n }\n },\n\n refresh: function(e) {\n var that = this,\n source,\n widget = that.widget,\n select, multiselect, dropdowntree;\n\n e = e || {};\n\n if (!e.action) {\n that.destroy();\n\n widget.bind(\"dataBinding\", that._dataBinding);\n widget.bind(\"dataBound\", that._dataBound);\n widget.bind(\"itemChange\", that._itemChange);\n\n source = that.bindings[bindingName].get();\n\n if (widget[fieldName] instanceof kendo.data.DataSource && widget[fieldName] != source) {\n if (source instanceof kendo.data.DataSource) {\n widget[setter](source);\n } else if (source && source._dataSource) {\n widget[setter](source._dataSource);\n } else {\n select = kendo.ui.Select && widget instanceof kendo.ui.Select;\n multiselect = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect;\n dropdowntree = kendo.ui.DropDownTree && widget instanceof kendo.ui.DropDownTree;\n\n if (!dropdowntree) {\n widget[fieldName].data(source);\n } else {\n widget.treeview[fieldName].data(source);\n }\n\n if (that.bindings.value && (select || multiselect)) {\n widget.value(retrievePrimitiveValues(that.bindings.value.get(), widget.options.dataValueField));\n }\n }\n }\n }\n },\n\n destroy: function() {\n var widget = this.widget;\n\n widget.unbind(\"dataBinding\", this._dataBinding);\n widget.unbind(\"dataBound\", this._dataBound);\n widget.unbind(\"itemChange\", this._itemChange);\n }\n });\n }\n\n binders.widget = {\n events: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n this.widget = widget;\n this.handlers = {};\n },\n\n refresh: function(key) {\n var binding = this.bindings.events[key],\n handler = this.handlers[key];\n\n if (handler) {\n this.widget.unbind(key, handler);\n }\n\n handler = binding.get();\n\n this.handlers[key] = function(e) {\n e.data = binding.source;\n\n handler(e);\n\n if (e.data === binding.source) {\n delete e.data;\n }\n };\n\n this.widget.bind(key, this.handlers[key]);\n },\n\n destroy: function() {\n var handler;\n\n for (handler in this.handlers) {\n this.widget.unbind(handler, this.handlers[handler]);\n }\n }\n }),\n\n checked: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n this._change = this.change.bind(this);\n this.widget.bind(CHANGE, this._change);\n },\n change: function() {\n this.bindings[CHECKED].set(this.value());\n },\n\n refresh: function() {\n var val = this.bindings[CHECKED].get();\n\n if (this.element.type === \"radio\") {\n if (val !== undefined$1) {\n this.widget.check(val.toString() === this.value());\n } else {\n this.widget.check(false);\n }\n } else {\n this.widget.check(val === true);\n }\n },\n\n value: function() {\n var element = this.element,\n value = element.value;\n\n if (value == \"on\" || value == \"off\" || this.element.type == \"checkbox\") {\n value = element.checked;\n }\n\n return value;\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n }),\n\n start: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n this._change = this.change.bind(this);\n this.widget = widget;\n this.widget.bind(CHANGE, this._change);\n },\n\n change: function() {\n this.bindings.start.set(this.widget.range().start);\n },\n\n refresh: function() {\n var that = this;\n var start = this.bindings.start.get();\n var end = that.widget._range ? that.widget._range.end : null;\n this.widget.range({ start: start, end: end });\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n }),\n\n end: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n this._change = this.change.bind(this);\n this.widget = widget;\n this.widget.bind(CHANGE, this._change);\n },\n\n change: function() {\n this.bindings.end.set(this.widget.range().end);\n },\n\n refresh: function() {\n var that = this;\n var end = this.bindings.end.get();\n var start = that.widget._range ? that.widget._range.start : null;\n this.widget.range({ start: start, end: end });\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n }),\n\n visible: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n\n refresh: function() {\n var visible = this.bindings.visible.get();\n this.widget.wrapper[0].style.display = visible ? \"\" : \"none\";\n }\n }),\n\n invisible: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n\n refresh: function() {\n var invisible = this.bindings.invisible.get();\n this.widget.wrapper[0].style.display = invisible ? \"none\" : \"\";\n }\n }),\n\n floatingLabel: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n if (!widget.floatingLabel) {\n return;\n }\n\n widget.floatingLabel.refresh();\n }\n }),\n\n enabled: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n\n refresh: function() {\n if (this.widget.enable) {\n this.widget.enable(this.bindings.enabled.get());\n }\n }\n }),\n\n disabled: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n\n refresh: function() {\n if (this.widget.enable) {\n this.widget.enable(!this.bindings.disabled.get());\n }\n }\n }),\n\n source: dataSourceBinding(\"source\", \"dataSource\", \"setDataSource\"),\n\n value: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n this._change = this.change.bind(this);\n this.widget.first(CHANGE, this._change);\n\n var value = this.bindings.value.get();\n\n this._valueIsObservableObject = !options.valuePrimitive && (value == null || value instanceof ObservableObject);\n this._valueIsObservableArray = value instanceof ObservableArray;\n this._initChange = false;\n },\n\n _source: function() {\n var source;\n\n if (this.widget.dataItem) {\n source = this.widget.dataItem();\n if (source && source instanceof ObservableObject) {\n return [source];\n }\n }\n\n if (this.bindings.source) {\n source = this.bindings.source.get();\n }\n\n if (!source || source instanceof kendo.data.DataSource) {\n source = this.widget.dataSource.flatView();\n }\n\n return source;\n },\n\n change: function() {\n var value = this.widget.value(),\n field = this.options.dataValueField || this.options.dataTextField,\n isArray = toString.call(value) === \"[object Array]\",\n isObservableObject = this._valueIsObservableObject,\n valueIndex, valueLength, values = [],\n sourceItem, sourceValue,\n idx, length, source;\n\n this._initChange = true;\n\n if (field) {\n\n if (value === \"\" && (isObservableObject || this.options.valuePrimitive)) {\n value = null;\n } else {\n source = this._source();\n\n if (isArray) {\n valueLength = value.length;\n values = value.slice(0);\n }\n\n for (idx = 0, length = source.length; idx < length; idx++) {\n sourceItem = source[idx];\n sourceValue = sourceItem.get(field);\n\n if (isArray) {\n for (valueIndex = 0; valueIndex < valueLength; valueIndex++) {\n if (sourceValue == values[valueIndex]) {\n values[valueIndex] = sourceItem;\n break;\n }\n }\n } else if (sourceValue == value) {\n value = isObservableObject ? sourceItem : sourceValue;\n break;\n }\n }\n\n if (values[0]) {\n if (this._valueIsObservableArray) {\n value = values;\n } else if (isObservableObject || !field) {\n value = values[0];\n } else {\n value = values[0].get(field);\n }\n }\n }\n }\n\n this.bindings.value.set(value);\n this._initChange = false;\n },\n\n refresh: function() {\n if (!this._initChange) {\n var widget = this.widget;\n var options = widget.options;\n var textField = options.dataTextField;\n var valueField = options.dataValueField || textField;\n var value = this.bindings.value.get();\n var text = options.text || \"\";\n var idx = 0, length;\n var values = [];\n\n if (value === undefined$1) {\n value = null;\n }\n\n if (valueField) {\n if (value instanceof ObservableArray) {\n for (length = value.length; idx < length; idx++) {\n values[idx] = value[idx].get(valueField);\n }\n value = values;\n } else if (value instanceof ObservableObject) {\n text = value.get(textField);\n value = value.get(valueField);\n }\n }\n\n if (options.autoBind === false && !options.cascadeFrom && widget.listView && !widget.listView.bound()) {\n if (textField === valueField && !text) {\n text = value;\n }\n\n if (!text && (value || value === 0) && options.valuePrimitive) {\n widget.value(value);\n } else {\n widget._preselect(value, text);\n }\n } else {\n widget.value(value);\n }\n }\n\n this._initChange = false;\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n }),\n dropdowntree: {\n value: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n this._change = this.change.bind(this);\n this.widget.first(CHANGE, this._change);\n this._initChange = false;\n },\n\n change: function() {\n var that = this,\n oldValues = that.bindings[VALUE].get(),\n valuePrimitive = that.options.valuePrimitive,\n selectedNode = that.widget.treeview.select(),\n nonPrimitiveValues = that.widget._isMultipleSelection() ? that.widget._getAllChecked() : (that.widget.treeview.dataItem(selectedNode) || that.widget.value()),\n newValues = (valuePrimitive || that.widget.options.autoBind === false) ? that.widget.value() : nonPrimitiveValues;\n\n var field = this.options.dataValueField || this.options.dataTextField;\n\n newValues = newValues.slice ? newValues.slice(0) : newValues;\n\n that._initChange = true;\n\n if (oldValues instanceof ObservableArray) {\n var remove = [];\n var newLength = newValues.length;\n var i = 0, j = 0;\n var old = oldValues[i];\n var same = false;\n var removeIndex;\n var newValue;\n var found;\n\n while (old !== undefined$1) {\n found = false;\n for (j = 0; j < newLength; j++) {\n if (valuePrimitive) {\n same = newValues[j] == old;\n } else {\n newValue = newValues[j];\n\n newValue = newValue.get ? newValue.get(field) : newValue;\n same = newValue == (old.get ? old.get(field) : old);\n }\n\n if (same) {\n newValues.splice(j, 1);\n newLength -= 1;\n found = true;\n break;\n }\n }\n\n if (!found) {\n remove.push(old);\n arraySplice(oldValues, i, 1);\n removeIndex = i;\n } else {\n i += 1;\n }\n\n old = oldValues[i];\n }\n\n arraySplice(oldValues, oldValues.length, 0, newValues);\n\n if (remove.length) {\n oldValues.trigger(\"change\", {\n action: \"remove\",\n items: remove,\n index: removeIndex\n });\n }\n\n if (newValues.length) {\n oldValues.trigger(\"change\", {\n action: \"add\",\n items: newValues,\n index: oldValues.length - 1\n });\n }\n } else {\n that.bindings[VALUE].set(newValues);\n }\n\n that._initChange = false;\n },\n\n refresh: function() {\n if (!this._initChange) {\n var options = this.options,\n widget = this.widget,\n field = options.dataValueField || options.dataTextField,\n value = this.bindings.value.get(),\n data = value,\n idx = 0, length,\n values = [],\n selectedValue;\n\n if (field) {\n if (value instanceof ObservableArray) {\n for (length = value.length; idx < length; idx++) {\n selectedValue = value[idx];\n values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n }\n value = values;\n } else if (value instanceof ObservableObject) {\n value = value.get(field);\n }\n }\n if (options.autoBind === false && options.valuePrimitive !== true) {\n widget._preselect(data, value);\n } else {\n widget.value(value);\n }\n }\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n })\n },\n gantt: {\n dependencies: dataSourceBinding(\"dependencies\", \"dependencies\", \"setDependenciesDataSource\")\n },\n\n multiselect: {\n value: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n this._change = this.change.bind(this);\n this.widget.first(CHANGE, this._change);\n this._initChange = false;\n },\n\n change: function() {\n var that = this,\n oldValues = that.bindings[VALUE].get(),\n valuePrimitive = that.options.valuePrimitive,\n newValues = valuePrimitive ? that.widget.value() : that.widget.dataItems();\n\n var field = this.options.dataValueField || this.options.dataTextField;\n\n newValues = newValues.slice(0);\n\n that._initChange = true;\n\n if (oldValues instanceof ObservableArray) {\n var remove = [];\n\n var newLength = newValues.length;\n\n var i = 0, j = 0;\n var old = oldValues[i];\n var same = false;\n var removeIndex;\n var newValue;\n var found;\n\n while (old !== undefined$1) {\n found = false;\n for (j = 0; j < newLength; j++) {\n if (valuePrimitive) {\n same = newValues[j] == old;\n } else {\n newValue = newValues[j];\n\n newValue = newValue.get ? newValue.get(field) : newValue;\n same = newValue == (old.get ? old.get(field) : old);\n }\n\n if (same) {\n newValues.splice(j, 1);\n newLength -= 1;\n found = true;\n break;\n }\n }\n\n if (!found) {\n remove.push(old);\n arraySplice(oldValues, i, 1);\n removeIndex = i;\n } else {\n i += 1;\n }\n\n old = oldValues[i];\n }\n\n arraySplice(oldValues, oldValues.length, 0, newValues);\n\n if (remove.length) {\n oldValues.trigger(\"change\", {\n action: \"remove\",\n items: remove,\n index: removeIndex\n });\n }\n\n if (newValues.length) {\n oldValues.trigger(\"change\", {\n action: \"add\",\n items: newValues,\n index: oldValues.length - 1\n });\n }\n } else {\n that.bindings[VALUE].set(newValues);\n }\n\n that._initChange = false;\n },\n\n refresh: function() {\n if (!this._initChange) {\n var options = this.options,\n widget = this.widget,\n field = options.dataValueField || options.dataTextField,\n value = this.bindings.value.get(),\n data = value,\n idx = 0, length,\n values = [],\n selectedValue;\n\n if (value === undefined$1) {\n value = null;\n }\n\n if (field) {\n if (value instanceof ObservableArray) {\n for (length = value.length; idx < length; idx++) {\n selectedValue = value[idx];\n values[idx] = selectedValue.get ? selectedValue.get(field) : selectedValue;\n }\n value = values;\n } else if (value instanceof ObservableObject) {\n value = value.get(field);\n }\n }\n\n if (options.autoBind === false && options.valuePrimitive !== true && !widget._isBound()) {\n widget._preselect(data, value);\n } else {\n widget.value(value);\n }\n }\n },\n\n destroy: function() {\n this.widget.unbind(CHANGE, this._change);\n }\n\n })\n },\n scheduler: {\n source: dataSourceBinding(\"source\", \"dataSource\", \"setDataSource\").extend({\n dataBound: function(e) {\n var idx;\n var length;\n var widget = this.widget;\n var elements = e.addedItems || widget.items();\n var data, parents;\n\n if (elements.length) {\n data = e.addedDataItems || widget.dataItems();\n parents = this.bindings.source._parents();\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n }\n }\n }\n })\n },\n\n grid: {\n source: dataSourceBinding(\"source\", \"dataSource\", \"setDataSource\").extend({\n dataBound: function(e) {\n var idx,\n length,\n widget = this.widget,\n elements = e.addedItems || widget.items(),\n parents,\n data;\n\n if (elements.length) {\n data = e.addedDataItems || widget.dataItems();\n parents = this.bindings.source._parents();\n\n for (idx = 0, length = data.length; idx < length; idx++) {\n bindElement(elements[idx], data[idx], this._ns(e.ns), [data[idx]].concat(parents));\n }\n }\n }\n })\n },\n\n badge: {\n text: Binder.extend({\n init: function(widget, bindings, options) {\n Binder.fn.init.call(this, widget.element[0], bindings, options);\n\n this.widget = widget;\n },\n refresh: function() {\n var text = this.bindings.text.get();\n\n if (text == null) {\n text = \"\";\n }\n this.widget.text(text);\n }\n })\n }\n };\n\n var arraySplice = function(arr, idx, remove, add) {\n add = add || [];\n remove = remove || 0;\n\n var addLength = add.length;\n var oldLength = arr.length;\n\n var shifted = [].slice.call(arr, idx + remove);\n var shiftedLength = shifted.length;\n var index;\n\n if (addLength) {\n addLength = idx + addLength;\n index = 0;\n\n for (; idx < addLength; idx++) {\n arr[idx] = add[index];\n index++;\n }\n\n arr.length = addLength;\n } else if (remove) {\n arr.length = idx;\n\n remove += idx;\n while (idx < remove) {\n delete arr[--remove];\n }\n }\n\n if (shiftedLength) {\n shiftedLength = idx + shiftedLength;\n index = 0;\n\n for (; idx < shiftedLength; idx++) {\n arr[idx] = shifted[index];\n index++;\n }\n\n arr.length = shiftedLength;\n }\n\n idx = arr.length;\n\n while (idx < oldLength) {\n delete arr[idx];\n idx++;\n }\n };\n\n var BindingTarget = Class.extend( {\n init: function(target, options) {\n this.target = target;\n this.options = options;\n this.toDestroy = [];\n },\n\n bind: function(bindings) {\n var key,\n hasValue,\n hasSource,\n hasEvents,\n hasChecked,\n hasCss,\n widgetBinding = this instanceof WidgetBindingTarget,\n specificBinders = this.binders();\n\n for (key in bindings) {\n if (key == VALUE) {\n hasValue = true;\n } else if (key == SOURCE) {\n hasSource = true;\n } else if (key == EVENTS && !widgetBinding) {\n hasEvents = true;\n } else if (key == CHECKED) {\n hasChecked = true;\n } else if (key == CSS) {\n hasCss = true;\n } else {\n this.applyBinding(key, bindings, specificBinders);\n }\n }\n if (hasSource) {\n this.applyBinding(SOURCE, bindings, specificBinders);\n }\n\n if (hasValue) {\n this.applyBinding(VALUE, bindings, specificBinders);\n }\n\n if (hasChecked) {\n this.applyBinding(CHECKED, bindings, specificBinders);\n }\n\n if (hasEvents && !widgetBinding) {\n this.applyBinding(EVENTS, bindings, specificBinders);\n }\n\n if (hasCss && !widgetBinding) {\n this.applyBinding(CSS, bindings, specificBinders);\n }\n\n if (widgetBinding && this.target && this.target.floatingLabel) {\n this.applyBinding(\"floatingLabel\", bindings, specificBinders);\n }\n },\n\n binders: function() {\n return binders[this.target.nodeName.toLowerCase()] || {};\n },\n\n applyBinding: function(name, bindings, specificBinders) {\n var binder = specificBinders[name] || binders[name],\n toDestroy = this.toDestroy,\n attribute,\n binding = bindings[name];\n\n if (binder) {\n binder = new binder(this.target, bindings, this.options);\n\n toDestroy.push(binder);\n\n if (binding instanceof Binding) {\n binder.bind(binding);\n toDestroy.push(binding);\n } else {\n for (attribute in binding) {\n binder.bind(binding, attribute);\n toDestroy.push(binding[attribute]);\n }\n }\n } else if (name !== \"template\") {\n throw new Error(\"The \" + name + \" binding is not supported by the \" + this.target.nodeName.toLowerCase() + \" element\");\n }\n },\n\n destroy: function() {\n var idx,\n length,\n toDestroy = this.toDestroy;\n\n for (idx = 0, length = toDestroy.length; idx < length; idx++) {\n toDestroy[idx].destroy();\n }\n }\n });\n\n var WidgetBindingTarget = BindingTarget.extend( {\n binders: function() {\n return binders.widget[this.target.options.name.toLowerCase()] || {};\n },\n\n applyBinding: function(name, bindings, specificBinders) {\n var binder = specificBinders[name] || binders.widget[name],\n toDestroy = this.toDestroy,\n attribute,\n binding = bindings[name];\n\n if (binder) {\n binder = new binder(this.target, bindings, this.target.options);\n\n toDestroy.push(binder);\n\n\n if (binding instanceof Binding) {\n binder.bind(binding);\n toDestroy.push(binding);\n } else {\n for (attribute in binding) {\n binder.bind(binding, attribute);\n toDestroy.push(binding[attribute]);\n }\n }\n } else {\n throw new Error(\"The \" + name + \" binding is not supported by the \" + this.target.options.name + \" widget\");\n }\n }\n });\n\n function bindingTargetForRole(element, roles) {\n var widget = kendo.initWidget(element, {}, roles);\n\n if (widget) {\n return new WidgetBindingTarget(widget);\n }\n }\n\n var keyValueRegExp = /[A-Za-z0-9_\\-]+:(\\{([^}]*)\\}|[^,}]+)/g,\n whiteSpaceRegExp = /\\s/g;\n\n function parseBindings(bind) {\n var result = {},\n idx,\n length,\n token,\n colonIndex,\n key,\n value,\n tokens;\n\n tokens = bind.match(keyValueRegExp);\n\n for (idx = 0, length = tokens.length; idx < length; idx++) {\n token = tokens[idx];\n colonIndex = token.indexOf(\":\");\n\n key = token.substring(0, colonIndex);\n value = token.substring(colonIndex + 1);\n\n if (value.charAt(0) == \"{\") {\n value = parseBindings(value);\n }\n\n result[key] = value;\n }\n\n return result;\n }\n\n function createBindings(bindings, source, type) {\n var binding,\n result = {};\n\n for (binding in bindings) {\n result[binding] = new type(source, bindings[binding]);\n }\n\n return result;\n }\n\n function bindElement(element, source, roles, parents) {\n\n if (!element || element.getAttribute(\"data-\" + kendo.ns + \"stop\")) {\n return;\n }\n\n var role = element.getAttribute(\"data-\" + kendo.ns + \"role\"),\n idx,\n bind = element.getAttribute(\"data-\" + kendo.ns + \"bind\"),\n childrenCopy = [],\n deep = true,\n bindings,\n options = {},\n target;\n\n parents = parents || [source];\n\n if (role || bind) {\n unbindElement(element, false);\n }\n\n if (role) {\n target = bindingTargetForRole(element, roles);\n }\n\n if (bind) {\n bind = parseBindings(bind.replace(whiteSpaceRegExp, \"\"));\n\n if (!target) {\n options = kendo.parseOptions(element, { textField: \"\", valueField: \"\", template: \"\", valueUpdate: CHANGE, valuePrimitive: false, autoBind: true }, source);\n options.roles = roles;\n target = new BindingTarget(element, options);\n }\n\n target.source = source;\n\n bindings = createBindings(bind, parents, Binding);\n\n if (options.template) {\n bindings.template = new TemplateBinding(parents, \"\", options.template);\n }\n\n if (bindings.click) {\n bind.events = bind.events || {};\n bind.events.click = bind.click;\n bindings.click.destroy();\n delete bindings.click;\n }\n\n if (bindings.source) {\n deep = false;\n }\n\n if (bind.attr) {\n bindings.attr = createBindings(bind.attr, parents, Binding);\n }\n\n if (bind.style) {\n bindings.style = createBindings(bind.style, parents, Binding);\n }\n\n if (bind.events) {\n bindings.events = createBindings(bind.events, parents, EventBinding);\n }\n\n if (bind.css) {\n bindings.css = createBindings(bind.css, parents, Binding);\n }\n\n target.bind(bindings);\n }\n\n if (target) {\n element.kendoBindingTarget = target;\n }\n\n var children = element.children;\n if (deep && children && !element.getAttribute(\"data-\" + kendo.ns + \"stop\")) {\n // https://github.com/telerik/kendo/issues/1240 for the weirdness.\n for (idx = 0; idx < children.length; idx++) {\n childrenCopy[idx] = children[idx];\n }\n\n for (idx = 0; idx < childrenCopy.length; idx++) {\n bindElement(childrenCopy[idx], source, roles, parents);\n }\n }\n }\n\n function bind(dom, object) {\n var idx,\n length,\n node,\n roles = kendo.rolesFromNamespaces([].slice.call(arguments, 2));\n\n object = kendo.observable(object);\n dom = $(dom);\n\n for (idx = 0, length = dom.length; idx < length; idx++) {\n node = dom[idx];\n if (node.nodeType === 1) {\n bindElement(node, object, roles);\n }\n }\n }\n\n function unbindElement(element, destroyWidget) {\n var bindingTarget = element.kendoBindingTarget;\n\n if (bindingTarget) {\n bindingTarget.destroy();\n\n if (deleteExpando) {\n delete element.kendoBindingTarget;\n } else if (element.removeAttribute) {\n element.removeAttribute(\"kendoBindingTarget\");\n } else {\n element.kendoBindingTarget = null;\n }\n }\n\n if (destroyWidget) {\n var widget = kendo.widgetInstance($(element));\n if (widget && typeof widget.destroy === FUNCTION) {\n widget.destroy();\n }\n }\n }\n\n function unbindElementTree(element, destroyWidgets) {\n unbindElement(element, destroyWidgets);\n\n unbindElementChildren(element, destroyWidgets);\n }\n\n function unbindElementChildren(element, destroyWidgets) {\n var children = element.children;\n\n if (children) {\n for (var idx = 0, length = children.length; idx < length; idx++) {\n unbindElementTree(children[idx], destroyWidgets);\n }\n }\n }\n\n function unbind(dom) {\n var idx, length;\n\n dom = $(dom);\n\n for (idx = 0, length = dom.length; idx < length; idx++ ) {\n unbindElementTree(dom[idx], false);\n }\n }\n\n function notify(widget, namespace) {\n var element = widget.element,\n bindingTarget = element[0].kendoBindingTarget;\n\n if (bindingTarget) {\n bind(element, bindingTarget.source, namespace);\n }\n }\n\n function retrievePrimitiveValues(value, valueField) {\n var values = [];\n var idx = 0;\n var length;\n var item;\n\n if (!valueField) {\n return value;\n }\n\n if (value instanceof ObservableArray) {\n for (length = value.length; idx < length; idx++) {\n item = value[idx];\n values[idx] = item.get ? item.get(valueField) : item[valueField];\n }\n value = values;\n } else if (value instanceof ObservableObject) {\n value = value.get(valueField);\n }\n\n return value;\n }\n\n kendo.unbind = unbind;\n kendo.bind = bind;\n kendo.data.binders = binders;\n kendo.data.Binder = Binder;\n kendo.notify = notify;\n\n kendo.observable = function(object) {\n if (!(object instanceof ObservableObject)) {\n object = new ObservableObject(object);\n }\n\n return object;\n };\n\n kendo.observableHierarchy = function(array) {\n var dataSource = kendo.data.HierarchicalDataSource.create(array);\n\n function recursiveRead(data) {\n var i, children;\n\n for (i = 0; i < data.length; i++) {\n data[i]._initChildren();\n\n children = data[i].children;\n\n children.fetch();\n\n data[i].items = children.data();\n\n recursiveRead(data[i].items);\n }\n }\n\n dataSource.fetch();\n\n recursiveRead(dataSource.data());\n\n dataSource._data._dataSource = dataSource;\n\n return dataSource._data;\n };\n\n })(window.kendo.jQuery);\n var kendo$a = kendo;\n\n var __meta__$8 = {\n id: \"validator\",\n name: \"Validator\",\n category: \"web\",\n description: \"The Validator offers an easy way to do a client-side form validation.\",\n depends: [ \"core\" ]\n };\n\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n NS = \".kendoValidator\",\n INVALIDMSG = \"k-invalid-msg\",\n invalidMsgRegExp = new RegExp(INVALIDMSG,'i'),\n INVALIDINPUT = \"k-invalid\",\n VALIDINPUT = \"k-valid\",\n VALIDATIONSUMMARY = \"k-validation-summary\",\n INVALIDLABEL = \"k-text-error\",\n MESSAGEBOX = \"k-messagebox k-messagebox-error\",\n INPUTINNER = \".k-input-inner\",\n INPUTWRAPPER = \".k-input\",\n ARIAINVALID = \"aria-invalid\",\n ARIADESCRIBEDBY = \"aria-describedby\",\n emailRegExp = /^[a-zA-Z0-9.!#$%&'*+\\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/i,\n urlRegExp = /^(https?|ftp):\\/\\/(((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:)*@)?(((\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[1-9]\\d|1\\d\\d|2[0-4]\\d|25[0-5]))|((([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|\\d|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.)+(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])*([a-z]|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])))\\.?)(:\\d*)?)(\\/((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)+(\\/(([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)*)*)?)?(\\?((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|[\\uE000-\\uF8FF]|\\/|\\?)*)?(\\#((([a-z]|\\d|-|\\.|_|~|[\\u00A0-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFFEF])|(%[\\da-f]{2})|[!\\$&'\\(\\)\\*\\+,;=]|:|@)|\\/|\\?)*)?$/i,\n INPUTSELECTOR = \":input:not(:button,[type=submit],[type=reset],[disabled],[readonly])\",\n CHECKBOXSELECTOR = \":checkbox:not([disabled],[readonly])\",\n NUMBERINPUTSELECTOR = \"[type=number],[type=range]\",\n BLUR = \"blur\",\n NAME = \"name\",\n FORM = \"form\",\n NOVALIDATE = \"novalidate\",\n //events\n VALIDATE = \"validate\",\n CHANGE = \"change\",\n VALIDATE_INPUT = \"validateInput\",\n\n patternMatcher = function(value, pattern) {\n if (typeof pattern === \"string\") {\n pattern = new RegExp('^(?:' + pattern + ')$');\n }\n return pattern.test(value);\n },\n matcher = function(input, selector, pattern) {\n var value = input.val();\n\n if (input.filter(selector).length && value !== \"\") {\n return patternMatcher(value, pattern);\n }\n return true;\n },\n hasAttribute = function(input, name) {\n if (input.length) {\n return input[0].attributes[name] != null;\n }\n return false;\n };\n\n if (!kendo.ui.validator) {\n kendo.ui.validator = { rules: {}, messages: {}, allowSubmit: $.noop, validateOnInit: $.noop };\n }\n\n function resolveRules(element) {\n var resolvers = kendo.ui.validator.ruleResolvers || {},\n rules = {},\n name;\n\n for (name in resolvers) {\n $.extend(true, rules, resolvers[name].resolve(element));\n }\n return rules;\n }\n\n function decode(value) {\n return value.replace(/&/g, '&')\n .replace(/"/g, '\"')\n .replace(/'/g, \"'\")\n .replace(/</g, '<')\n .replace(/>/g, '>');\n }\n\n function numberOfDecimalDigits(value) {\n value = (value + \"\").split('.');\n if (value.length > 1) {\n return value[1].length;\n }\n return 0;\n }\n\n function parseHtml(text) {\n if ($.parseHTML) {\n return $($.parseHTML(text));\n }\n return $(text);\n }\n\n function searchForMessageContainer(elements, fieldName) {\n var containers = $(),\n element,\n attr;\n\n for (var idx = 0, length = elements.length; idx < length; idx++) {\n element = elements[idx];\n if (invalidMsgRegExp.test(element.className)) {\n attr = element.getAttribute(kendo.attr(\"for\"));\n if (attr === fieldName) {\n containers = containers.add(element);\n }\n }\n }\n return containers;\n }\n\n function isLabelFor(label, element) {\n if (!label) {\n return false;\n }\n if (typeof label.nodeName !== 'string' || label.nodeName !== 'LABEL') {\n return false;\n }\n if (typeof label.getAttribute('for') !== 'string' || typeof element.getAttribute('id') !== 'string') {\n return false;\n }\n if (label.getAttribute('for') !== element.getAttribute('id')) {\n return false;\n }\n\n return true;\n }\n\n var SUMMARYTEMPLATE = function (ref) {\n var errors = ref.errors;\n\n var result = '';\n return result;\n };\n\n var Validator = Widget.extend({\n init: function(element, options) {\n var that = this,\n resolved = resolveRules(element),\n validateAttributeSelector = \"[\" + kendo.attr(\"validate\") + \"!=false]\";\n\n options = options || {};\n\n options.rules = $.extend({}, kendo.ui.validator.rules, resolved.rules, options.rules);\n options.messages = $.extend({}, kendo.ui.validator.messages, resolved.messages, options.messages);\n\n Widget.fn.init.call(that, element, options);\n\n that._errorTemplate = kendo.template(that.options.errorTemplate);\n that._summaryTemplate = kendo.template(that.options.validationSummary.template || SUMMARYTEMPLATE);\n\n if (that.element.is(FORM)) {\n that.element.attr(NOVALIDATE, NOVALIDATE);\n }\n\n that._inputSelector = INPUTSELECTOR + validateAttributeSelector;\n that._checkboxSelector = CHECKBOXSELECTOR + validateAttributeSelector;\n\n that._errors = {};\n that._attachEvents();\n that._isValidated = false;\n\n if (that._validateOnInit()) {\n that.validate();\n }\n },\n\n events: [ VALIDATE, CHANGE, VALIDATE_INPUT ],\n\n options: {\n name: \"Validator\",\n errorTemplate: function (ref) {\n var message = ref.message;\n\n return (\"\" + message + \"\");\n },\n messages: {\n required: \"{0} is required\",\n pattern: \"{0} is not valid\",\n min: \"{0} should be greater than or equal to {1}\",\n max: \"{0} should be smaller than or equal to {1}\",\n step: \"{0} is not valid\",\n email: \"{0} is not valid email\",\n url: \"{0} is not valid URL\",\n date: \"{0} is not valid date\",\n dateCompare: \"End date should be greater than or equal to the start date\",\n captcha: \"The text you entered doesn't match the image.\"\n },\n rules: {\n required: function(input) {\n var noNameCheckbox = !input.attr(\"name\") && !input.is(\":checked\"),\n name = input.attr(\"name\"),\n quote = !!name && name.indexOf(\"'\") > -1 ? '\\\"' : \"'\",\n namedCheckbox = input.attr(\"name\") && !this.element.find(\"input[name=\" + quote + input.attr(\"name\") + quote + \"]:checked\").length,\n checkbox = input.filter(\"[type=checkbox]\").length && (noNameCheckbox || namedCheckbox),\n radio = input.filter(\"[type=radio]\").length && !this.element.find(\"input[name=\" + quote + input.attr(\"name\") + quote + \"]:checked\").length,\n value = input.val();\n\n return !(hasAttribute(input, \"required\") && (!value || value === \"\" || value.length === 0 || checkbox || radio));\n },\n pattern: function(input) {\n if (input.filter(\"[type=text],[type=email],[type=url],[type=tel],[type=search],[type=password]\").filter(\"[pattern]\").length && input.val() !== \"\") {\n return patternMatcher(input.val(), input.attr(\"pattern\"));\n }\n return true;\n },\n min: function(input) {\n if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[min]\").length && input.val() !== \"\") {\n var min = parseFloat(input.attr(\"min\")) || 0,\n val = kendo.parseFloat(input.val());\n\n return min <= val;\n }\n return true;\n },\n max: function(input) {\n if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[max]\").length && input.val() !== \"\") {\n var max = parseFloat(input.attr(\"max\")) || 0,\n val = kendo.parseFloat(input.val());\n\n return max >= val;\n }\n return true;\n },\n step: function(input) {\n if (input.filter(NUMBERINPUTSELECTOR + \",[\" + kendo.attr(\"type\") + \"=number]\").filter(\"[step]\").length && input.val() !== \"\") {\n var min = parseFloat(input.attr(\"min\")) || 0,\n step = parseFloat(input.attr(\"step\")) || 1,\n val = parseFloat(input.val()),\n decimals = numberOfDecimalDigits(step),\n raise;\n\n if (decimals) {\n raise = Math.pow(10, decimals);\n return ((Math.floor((val - min) * raise)) % (step * raise)) / Math.pow(100, decimals) === 0;\n }\n return ((val - min) % step) === 0;\n }\n return true;\n },\n email: function(input) {\n return matcher(input, \"[type=email],[\" + kendo.attr(\"type\") + \"=email]\", emailRegExp);\n },\n url: function(input) {\n return matcher(input, \"[type=url],[\" + kendo.attr(\"type\") + \"=url]\", urlRegExp);\n },\n date: function(input) {\n if (input.filter(\"[type^=date],[\" + kendo.attr(\"type\") + \"=date]\").length && input.val() !== \"\") {\n return kendo.parseDate(input.val(), input.attr(kendo.attr(\"format\"))) !== null;\n }\n return true;\n },\n captcha: function(input) {\n if (input.filter(\"[\" + kendo.attr(\"role\") + \"=captcha]\").length) {\n var that = this,\n captcha = kendo.widgetInstance(input),\n isValidated = function(isValid) {\n return typeof(isValid) !== 'undefined' && isValid !== null;\n };\n\n if (!input.data(\"captcha_validating\") && !isValidated(captcha.isValid()) && !!captcha.getCaptchaId()) {\n input.data(\"captcha_validating\", true);\n that._validating = true;\n captcha.validate().done(function() {\n that._validating = false;\n that._checkElement(input);\n }).fail(function(data) {\n that._validating = false;\n if (data.error && data.error === \"handler_not_defined\") {\n window.console.warn(\"Captcha's validationHandler is not defined! You should either define a proper validation endpoint or declare a callback function to ensure the required behavior.\");\n }\n });\n }\n\n if (isValidated(captcha.isValid())) {\n input.removeData(\"captcha_validating\");\n return captcha.isValid();\n }\n }\n return true;\n }\n },\n validateOnBlur: true,\n validationSummary: false\n },\n\n _allowSubmit: function() {\n return kendo.ui.validator.allowSubmit(this.element, this.errors());\n },\n\n _validateOnInit: function() {\n return kendo.ui.validator.validateOnInit(this.element);\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n this.element.off(NS);\n\n if (this.validationSummary) {\n this.validationSummary.off(NS);\n this.validationSummary = null;\n }\n },\n\n value: function() {\n if (!this._isValidated) {\n return false;\n }\n\n return this.errors().length === 0;\n },\n\n _submit: function(e) {\n if ((!this.validate() && !this._allowSubmit()) || this._validating) {\n e.stopPropagation();\n e.stopImmediatePropagation();\n e.preventDefault();\n return false;\n }\n return true;\n },\n\n _checkElement: function(element) {\n var state = this.value();\n\n this.validateInput(element);\n\n if (this.value() !== state) {\n this.trigger(CHANGE);\n }\n },\n\n _attachEvents: function() {\n var that = this;\n\n if (that.element.is(FORM)) {\n that.element.on(\"submit\" + NS, that._submit.bind(that));\n }\n\n if (that.options.validateOnBlur) {\n if (!that.element.is(INPUTSELECTOR)) {\n that.element.on(BLUR + NS, that._inputSelector, function() {\n that._checkElement($(this));\n });\n\n that.element.on(\"click\" + NS, that._checkboxSelector, function() {\n that._checkElement($(this));\n });\n } else {\n that.element.on(BLUR + NS, function() {\n that._checkElement(that.element);\n });\n\n if (that.element.is(CHECKBOXSELECTOR)) {\n that.element.on(\"click\" + NS, function() {\n that._checkElement(that.element);\n });\n }\n }\n }\n },\n\n validate: function() {\n var inputs;\n var idx;\n var result = false;\n var length;\n\n var isValid = this.value();\n\n this._errors = {};\n\n if (!this.element.is(INPUTSELECTOR)) {\n var invalid = false;\n\n inputs = this.element.find(this._inputSelector);\n\n for (idx = 0, length = inputs.length; idx < length; idx++) {\n if (!this.validateInput(inputs.eq(idx))) {\n invalid = true;\n }\n }\n\n result = !invalid;\n } else {\n result = this.validateInput(this.element);\n }\n\n if (this.options.validationSummary && !isValid) {\n this.showValidationSummary();\n }\n\n this.trigger(VALIDATE, { valid: result, errors: this.errors() });\n\n if (isValid !== result) {\n this.trigger(CHANGE);\n }\n\n return result;\n },\n\n validateInput: function(input) {\n input = $(input);\n\n\n this._isValidated = true;\n\n var that = this,\n template = that._errorTemplate,\n result = that._checkValidity(input),\n valid = result.valid,\n widgetInstance,\n className = \".\" + INVALIDMSG,\n fieldName = (input.attr(NAME) || \"\"),\n lbl = that._findMessageContainer(fieldName).add(input.next(className).filter(function() {\n var element = $(this);\n if (element.filter(\"[\" + kendo.attr(\"for\") + \"]\").length) {\n return element.attr(kendo.attr(\"for\")) === fieldName;\n }\n\n return true;\n\n })).addClass(\"k-hidden\"),\n messageText = !valid ? that._extractMessage(input, result.key) : \"\",\n messageLabel = !valid ? parseHtml(template({ message: decode(messageText), field: fieldName })) : \"\",\n wasValid = !input.attr(ARIAINVALID),\n isInputInner = input.is(INPUTINNER),\n inputWrapper = input.parent(INPUTWRAPPER);\n\n input.removeAttr(ARIAINVALID);\n\n if (input.hasClass(\"k-hidden\")) {\n widgetInstance = kendo.widgetInstance(input.closest(\".k-signature\"));\n }\n\n if (input.is(\"[type=radio]\")) {\n widgetInstance = kendo.widgetInstance(input.closest(\".k-radio-list\"));\n }\n\n if (input.is(\"[type=checkbox]\")) {\n widgetInstance = kendo.widgetInstance(input.closest(\".k-checkbox-list\"));\n }\n\n if (!valid && !input.data(\"captcha_validating\")) {\n that._errors[fieldName] = messageText;\n var lblId = lbl.attr('id');\n\n that._decorateMessageContainer(messageLabel, fieldName);\n\n\n if (lblId) {\n messageLabel.attr('id', lblId);\n }\n\n if (lbl.length !== 0) {\n lbl.replaceWith(messageLabel);\n } else {\n widgetInstance = widgetInstance || kendo.widgetInstance(input);\n var parentElement = input.parent().get(0);\n var nextElement = input.next().get(0);\n var prevElement = input.prev().get(0);\n\n // Get the instance of the RadioGroup which is not initialized on the input element\n if (!widgetInstance && input.is(\"[type=radio]\")) {\n widgetInstance = kendo.widgetInstance(input.closest(\".k-radio-list\"));\n }\n\n // Get the instance of the CheckBoxGroup which is not initialized on the input element\n if (!widgetInstance && input.is(\"[type=checkbox]\")) {\n widgetInstance = kendo.widgetInstance(input.closest(\".k-checkbox-list\"));\n }\n\n if (widgetInstance && widgetInstance.wrapper && (widgetInstance.element !== widgetInstance.wrapper || [\"Signature\", \"RadioGroup\", \"CheckBoxGroup\"].indexOf(widgetInstance.options.name) > -1)) {\n messageLabel.insertAfter(widgetInstance.wrapper);\n } else if (parentElement && parentElement.nodeName === \"LABEL\") {\n // Input inside label\n messageLabel.insertAfter(parentElement);\n } else if (nextElement && isLabelFor(nextElement, input[0])) {\n // Input before label\n messageLabel.insertAfter(nextElement);\n } else if (prevElement && isLabelFor(prevElement, input[0])) {\n // Input after label\n messageLabel.insertAfter(input);\n } else if (isInputInner && inputWrapper.length) {\n // Input after input wrapper\n messageLabel.insertAfter(inputWrapper);\n } else {\n messageLabel.insertAfter(input);\n }\n }\n\n messageLabel.removeClass(\"k-hidden\");\n\n input.attr(ARIAINVALID, true);\n } else {\n delete that._errors[fieldName];\n }\n\n if (wasValid !== valid) {\n this.trigger(VALIDATE_INPUT, { valid: valid, input: input, error: messageText, field: fieldName });\n }\n\n widgetInstance = (widgetInstance && widgetInstance.options.name == \"Signature\") ? widgetInstance : kendo.widgetInstance(input);\n if (!widgetInstance || !(widgetInstance._inputWrapper || widgetInstance.wrapper)) {\n input.toggleClass(INVALIDINPUT, !valid);\n input.toggleClass(VALIDINPUT, valid);\n }\n\n if (widgetInstance) {\n var inputWrap = widgetInstance._inputWrapper || widgetInstance.wrapper;\n var inputLabel = widgetInstance._inputLabel;\n\n if (inputWrap) {\n inputWrap.toggleClass(INVALIDINPUT, !valid);\n inputWrap.toggleClass(VALIDINPUT, valid);\n }\n if (inputLabel) {\n inputLabel.toggleClass(INVALIDLABEL, !valid);\n }\n }\n\n if (wasValid !== valid) {\n var errorId = messageLabel ? messageLabel.attr(\"id\") : lbl.attr(\"id\");\n\n that._associateMessageContainer(input, errorId);\n\n if (this.options.validationSummary && this.options.validateOnBlur) {\n this.showValidationSummary();\n }\n }\n\n return valid;\n },\n\n hideMessages: function() {\n var that = this,\n className = \".\" + INVALIDMSG,\n element = that.element;\n\n that._disassociateMessageContainers();\n\n if (!element.is(INPUTSELECTOR)) {\n element.find(className).addClass(\"k-hidden\");\n } else {\n element.next(className).addClass(\"k-hidden\");\n }\n },\n\n reset: function() {\n var that = this,\n inputs = that.element.find(\".\" + INVALIDINPUT),\n labels = that.element.find(\".\" + INVALIDLABEL);\n\n that._errors = [];\n\n that.hideMessages();\n\n that.hideValidationSummary();\n\n inputs.removeAttr(ARIAINVALID);\n inputs.removeClass(INVALIDINPUT);\n labels.removeClass(INVALIDLABEL);\n },\n\n _findMessageContainer: function(fieldName) {\n var locators = kendo.ui.validator.messageLocators,\n name,\n containers = $();\n\n for (var idx = 0, length = this.element.length; idx < length; idx++) {\n containers = containers.add(searchForMessageContainer(this.element[idx].getElementsByTagName(\"*\"), fieldName));\n }\n\n for (name in locators) {\n containers = containers.add(locators[name].locate(this.element, fieldName));\n }\n\n return containers;\n },\n\n _decorateMessageContainer: function(container, fieldName) {\n var locators = kendo.ui.validator.messageLocators,\n name;\n\n container.addClass(INVALIDMSG)\n .attr(kendo.attr(\"for\"), fieldName || \"\");\n\n if (!container.attr(\"id\")) {\n container.attr(\"id\", fieldName + \"-error\");\n }\n\n for (name in locators) {\n locators[name].decorate(container, fieldName);\n }\n },\n\n _extractMessage: function(input, ruleKey) {\n var that = this,\n customMessage = that.options.messages[ruleKey],\n fieldName = input.attr(NAME),\n nonDefaultMessage;\n\n if (!kendo.ui.Validator.prototype.options.messages[ruleKey]) {\n nonDefaultMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n }\n\n customMessage = kendo.isFunction(customMessage) ? customMessage(input) : customMessage;\n\n return kendo.format(input.attr(kendo.attr(ruleKey + \"-msg\")) || input.attr(\"validationMessage\") || nonDefaultMessage || customMessage || input.attr(\"title\") || \"\",\n fieldName,\n input.attr(ruleKey) || input.attr(kendo.attr(ruleKey)));\n },\n\n _checkValidity: function(input) {\n var rules = this.options.rules,\n rule;\n\n for (rule in rules) {\n if (!rules[rule].call(this, input)) {\n return { valid: false, key: rule };\n }\n }\n\n return { valid: true };\n },\n\n errors: function() {\n var results = [],\n errors = this._errors,\n error;\n\n for (error in errors) {\n results.push(errors[error]);\n }\n return results;\n },\n\n setOptions: function(options) {\n if (options.validationSummary) {\n this.hideValidationSummary();\n }\n\n kendo.deepExtend(this.options, options);\n\n this.destroy();\n\n this.init(this.element, this.options);\n\n this._setEvents(this.options);\n },\n\n _getInputNames: function() {\n var that = this,\n inputs = that.element.find(that._inputSelector),\n sorted = [];\n\n for (var idx = 0, length = inputs.length; idx < length; idx++) {\n var input = $(inputs[idx]);\n\n if (hasAttribute(input, NAME)) {\n // Add current name if:\n // - not present so far;\n // - present but not part of CheckBoxGroup or RadioGroup.\n if (sorted.indexOf(input.attr(NAME)) === -1 ||\n (input.closest(\".k-checkbox-list\").length === 0 &&\n input.closest(\".k-radio-list\").length === 0)) {\n sorted.push(input.attr(NAME));\n }\n }\n }\n\n return sorted;\n },\n\n _associateMessageContainer: function(input, errorId) {\n var nextFocusable = kendo.getWidgetFocusableElement(input);\n\n if (!nextFocusable || !errorId) {\n return;\n }\n\n kendo.toggleAttribute(nextFocusable, ARIADESCRIBEDBY, errorId);\n },\n\n _disassociateMessageContainers: function() {\n var that = this,\n inputs = that.element.find(\".\" + INVALIDINPUT).addBack(),\n input, errorId;\n\n for (var i = 0; i < inputs.length; i += 1) {\n input = $(inputs[i]);\n\n if (input.is(\"input\")) {\n errorId = that._findMessageContainer(input.attr(NAME))\n .add(input.next(\".\" + INVALIDMSG))\n .attr(\"id\");\n\n that._associateMessageContainer(input, errorId);\n }\n }\n },\n\n _errorsByName: function() {\n var that = this,\n inputNames = that._getInputNames(),\n sorted = [];\n\n for (var i = 0; i < inputNames.length; i += 1) {\n var name = inputNames[i];\n\n if (that._errors[name]) {\n sorted.push({\n field: name,\n message: that._errors[name]\n });\n }\n }\n\n return sorted;\n },\n\n _renderSummary: function() {\n var that = this,\n options = this.options.validationSummary,\n element = this.element,\n prevElement = element.prev(),\n container;\n\n if (options.container) {\n container = $(options.container);\n } else if (prevElement && prevElement.hasClass(VALIDATIONSUMMARY)) {\n container = prevElement;\n } else {\n container = $(\"
    \").insertBefore(that.element);\n }\n\n container.addClass([VALIDATIONSUMMARY, MESSAGEBOX].join(\" \"));\n container.attr(\"role\", \"alert\");\n\n container.on(\"click\" + NS, that._summaryClick.bind(that));\n\n return container;\n },\n\n _summaryClick: function(e) {\n e.preventDefault();\n\n var that = this,\n link = $(e.target),\n target = that.element.find(\"[name='\" + link.data(\"field\") + \"']\"),\n nextFocusable;\n\n if (!target.length) {\n return;\n }\n\n nextFocusable = kendo.getWidgetFocusableElement(target);\n\n if (nextFocusable) {\n nextFocusable.trigger(\"focus\");\n }\n },\n\n showValidationSummary: function() {\n var that = this,\n summary = that.validationSummary,\n errors = that._errorsByName(),\n errorsList;\n\n if (!summary) {\n summary = that.validationSummary = that._renderSummary();\n }\n\n errorsList = parseHtml(that._summaryTemplate({\n errors: errors\n }));\n\n summary.html(errorsList);\n\n summary.toggleClass(\"k-hidden\", !errors.length);\n },\n\n hideValidationSummary: function() {\n var that = this,\n summary = that.validationSummary;\n\n if (!summary) {\n return;\n }\n\n summary.addClass(\"k-hidden\");\n }\n });\n\n kendo.ui.plugin(Validator);\n })(window.kendo.jQuery);\n var kendo$9 = kendo;\n\n var __meta__$7 = {\n id: \"router\",\n name: \"Router\",\n category: \"framework\",\n description: \"The Router class is responsible for tracking the application state and navigating between the application states.\",\n depends: [ \"core\" ],\n hidden: false\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n CHANGE = \"change\",\n BACK = \"back\",\n SAME = \"same\",\n support = kendo.support,\n location = window.location,\n history = window.history,\n CHECK_URL_INTERVAL = 50,\n BROKEN_BACK_NAV = kendo.support.browser.msie,\n hashStrip = /^#*/,\n document = window.document;\n\n function absoluteURL(path, pathPrefix) {\n if (!pathPrefix) {\n return path;\n }\n\n if (path + \"/\" === pathPrefix) {\n path = pathPrefix;\n }\n\n var regEx = new RegExp(\"^\" + pathPrefix, \"i\");\n\n if (!regEx.test(path)) {\n path = pathPrefix + \"/\" + path;\n }\n\n return location.protocol + '//' + (location.host + \"/\" + path).replace(/\\/\\/+/g, '/');\n }\n\n function hashDelimiter(bang) {\n return bang ? \"#!\" : \"#\";\n }\n\n function locationHash(hashDelimiter) {\n var href = location.href;\n\n // ignore normal anchors if in hashbang mode - however, still return \"\" if no hash present\n if (hashDelimiter === \"#!\" && href.indexOf(\"#\") > -1 && href.indexOf(\"#!\") < 0) {\n return null;\n }\n\n return href.split(hashDelimiter)[1] || \"\";\n }\n\n function stripRoot(root, url) {\n if (url.indexOf(root) === 0) {\n return (url.substr(root.length)).replace(/\\/\\//g, '/');\n } else {\n return url;\n }\n }\n\n var HistoryAdapter = kendo.Class.extend({\n back: function() {\n if (BROKEN_BACK_NAV) {\n setTimeout(function() { history.back(); });\n } else {\n history.back();\n }\n },\n\n forward: function() {\n if (BROKEN_BACK_NAV) {\n setTimeout(function() { history.forward(); });\n } else {\n history.forward();\n }\n },\n\n length: function() {\n return history.length;\n },\n\n replaceLocation: function(url) {\n location.replace(url);\n }\n });\n\n var PushStateAdapter = HistoryAdapter.extend({\n init: function(root) {\n this.root = root;\n },\n\n navigate: function(to) {\n history.pushState({}, document.title, absoluteURL(to, this.root));\n },\n\n replace: function(to) {\n history.replaceState({}, document.title, absoluteURL(to, this.root));\n },\n\n normalize: function(url) {\n return stripRoot(this.root, url);\n },\n\n current: function() {\n var current = location.pathname;\n\n if (location.search) {\n current += location.search;\n }\n\n return stripRoot(this.root, current);\n },\n\n change: function(callback) {\n $(window).bind(\"popstate.kendo\", callback);\n },\n\n stop: function() {\n $(window).unbind(\"popstate.kendo\");\n },\n\n normalizeCurrent: function(options) {\n var fixedUrl,\n root = options.root,\n pathname = location.pathname,\n hash = locationHash(hashDelimiter(options.hashBang));\n\n if (root === pathname + \"/\") {\n fixedUrl = root;\n }\n\n if (root === pathname && hash) {\n fixedUrl = absoluteURL(hash.replace(hashStrip, ''), root);\n }\n\n if (fixedUrl) {\n history.pushState({}, document.title, fixedUrl);\n }\n }\n });\n\n function fixHash(url) {\n return url.replace(/^(#)?/, \"#\");\n }\n\n function fixBang(url) {\n return url.replace(/^(#(!)?)?/, \"#!\");\n }\n\n var HashAdapter = HistoryAdapter.extend({\n init: function(bang) {\n this._id = kendo.guid();\n this.prefix = hashDelimiter(bang);\n this.fix = bang ? fixBang : fixHash;\n },\n\n navigate: function(to) {\n location.hash = this.fix(to);\n },\n\n replace: function(to) {\n this.replaceLocation(this.fix(to));\n },\n\n normalize: function(url) {\n if (url.indexOf(this.prefix) < 0) {\n return url;\n } else {\n return url.split(this.prefix)[1];\n }\n },\n\n change: function(callback) {\n if (support.hashChange) {\n $(window).on(\"hashchange.\" + this._id, callback);\n } else {\n this._interval = setInterval(callback, CHECK_URL_INTERVAL);\n }\n },\n\n stop: function() {\n $(window).off(\"hashchange.\" + this._id);\n clearInterval(this._interval);\n },\n\n current: function() {\n return locationHash(this.prefix);\n },\n\n normalizeCurrent: function(options) {\n var pathname = location.pathname,\n root = options.root;\n\n if (options.pushState && root !== pathname) {\n this.replaceLocation(root + this.prefix + stripRoot(root, pathname));\n return true; // browser will reload at this point.\n }\n\n return false;\n }\n });\n\n var History = kendo.Observable.extend({\n start: function(options) {\n options = options || {};\n\n this.bind([CHANGE, BACK, SAME], options);\n\n if (this._started) {\n return;\n }\n\n this._started = true;\n\n options.root = options.root || \"/\";\n\n var adapter = this.createAdapter(options),\n current;\n\n // adapter may reload the document\n if (adapter.normalizeCurrent(options)) {\n return;\n }\n\n current = adapter.current();\n\n $.extend(this, {\n adapter: adapter,\n root: options.root,\n historyLength: adapter.length(),\n current: current,\n locations: [current]\n });\n\n adapter.change(this._checkUrl.bind(this));\n },\n\n createAdapter: function(options) {\n return support.pushState && options.pushState ? new PushStateAdapter(options.root) : new HashAdapter(options.hashBang);\n },\n\n stop: function() {\n if (!this._started) {\n return;\n }\n this.adapter.stop();\n this.unbind(CHANGE);\n this._started = false;\n },\n\n change: function(callback) {\n this.bind(CHANGE, callback);\n },\n\n replace: function(to, silent) {\n\n this._navigate(to, silent, function(adapter) {\n adapter.replace(to);\n this.locations[this.locations.length - 1] = this.current;\n });\n },\n\n navigate: function(to, silent) {\n if (to === \"#:back\") {\n this.backCalled = true;\n this.adapter.back();\n return;\n }\n\n this._navigate(to, silent, function(adapter) {\n adapter.navigate(to);\n this.locations.push(this.current);\n });\n },\n\n _navigate: function(to, silent, callback) {\n var adapter = this.adapter;\n\n to = adapter.normalize(to);\n\n if (this.current === to || this.current === decodeURIComponent(to)) {\n this.trigger(SAME);\n return;\n }\n\n if (!silent) {\n if (this.trigger(CHANGE, { url: to, decode: false })) {\n return;\n }\n }\n\n this.current = to;\n\n callback.call(this, adapter);\n\n this.historyLength = adapter.length();\n },\n\n _checkUrl: function() {\n var adapter = this.adapter,\n current = adapter.current(),\n newLength = adapter.length(),\n navigatingInExisting = this.historyLength === newLength,\n back = current === this.locations[this.locations.length - 2] && navigatingInExisting,\n backCalled = this.backCalled,\n prev = this.current;\n\n if (current === null || this.current === current || this.current === decodeURIComponent(current)) {\n return true;\n }\n\n this.historyLength = newLength;\n this.backCalled = false;\n\n this.current = current;\n\n if (back && this.trigger(\"back\", { url: prev, to: current })) {\n adapter.forward();\n this.current = prev;\n return;\n }\n\n if (this.trigger(CHANGE, { url: current, backButtonPressed: !backCalled })) {\n if (back) {\n adapter.forward();\n } else {\n adapter.back();\n this.historyLength --;\n }\n this.current = prev;\n return;\n }\n\n if (back) {\n this.locations.pop();\n } else {\n this.locations.push(current);\n }\n }\n });\n\n kendo.History = History;\n kendo.History.HistoryAdapter = HistoryAdapter;\n kendo.History.HashAdapter = HashAdapter;\n kendo.History.PushStateAdapter = PushStateAdapter;\n kendo.absoluteURL = absoluteURL;\n kendo.history = new History();\n })(window.kendo.jQuery);\n var kendo$8 = kendo;\n\n (function() {\n var kendo = window.kendo,\n history = kendo.history,\n Observable = kendo.Observable,\n INIT = \"init\",\n ROUTE_MISSING = \"routeMissing\",\n CHANGE = \"change\",\n BACK = \"back\",\n SAME = \"same\",\n optionalParam = /\\((.*?)\\)/g,\n namedParam = /(\\(\\?)?:\\w+/g,\n splatParam = /\\*\\w+/g,\n escapeRegExp = /[\\-{}\\[\\]+?.,\\\\\\^$|#\\s]/g;\n\n function namedParamReplace(match, optional) {\n return optional ? match : '([^\\/]+)';\n }\n\n function routeToRegExp(route, ignoreCase) {\n return new RegExp('^' + route\n .replace(escapeRegExp, '\\\\$&')\n .replace(optionalParam, '(?:$1)?')\n .replace(namedParam, namedParamReplace)\n .replace(splatParam, '(.*?)') + '$', ignoreCase ? \"i\" : \"\");\n }\n\n function stripUrl(url) {\n return url.replace(/(\\?.*)|(#.*)/g, \"\");\n }\n\n var Route = kendo.Class.extend({\n init: function(route, callback, ignoreCase) {\n if (!(route instanceof RegExp)) {\n route = routeToRegExp(route, ignoreCase);\n }\n\n this.route = route;\n this._callback = callback;\n },\n\n callback: function(url, back, decode) {\n var params,\n idx = 0,\n length,\n queryStringParams = kendo.parseQueryStringParams(url);\n queryStringParams._back = back;\n\n url = stripUrl(url);\n params = this.route.exec(url).slice(1);\n length = params.length;\n\n if (decode) {\n for (; idx < length; idx ++) {\n if (typeof params[idx] !== 'undefined') {\n params[idx] = decodeURIComponent(params[idx]);\n }\n }\n }\n\n params.push(queryStringParams);\n\n this._callback.apply(null, params);\n },\n\n worksWith: function(url, back, decode) {\n if (this.route.test(stripUrl(url))) {\n this.callback(url, back, decode);\n return true;\n } else {\n return false;\n }\n }\n });\n\n var Router = Observable.extend({\n init: function(options) {\n if (!options) {\n options = {};\n }\n\n Observable.fn.init.call(this);\n\n this.routes = [];\n this.pushState = options.pushState;\n this.hashBang = options.hashBang;\n this.root = options.root;\n this.ignoreCase = options.ignoreCase !== false;\n\n this.bind([INIT, ROUTE_MISSING, CHANGE, SAME, BACK], options);\n },\n\n destroy: function() {\n history.unbind(CHANGE, this._urlChangedProxy);\n history.unbind(SAME, this._sameProxy);\n history.unbind(BACK, this._backProxy);\n this.unbind();\n },\n\n start: function() {\n var that = this,\n sameProxy = function() { that._same(); },\n backProxy = function(e) { that._back(e); },\n urlChangedProxy = function(e) { that._urlChanged(e); };\n\n history.start({\n same: sameProxy,\n change: urlChangedProxy,\n back: backProxy,\n pushState: that.pushState,\n hashBang: that.hashBang,\n root: that.root\n });\n\n // eslint-disable-next-line no-undef\n var initEventObject = { url: history.current || \"/\", preventDefault: $.noop };\n\n if (!that.trigger(INIT, initEventObject)) {\n that._urlChanged(initEventObject);\n }\n\n this._urlChangedProxy = urlChangedProxy;\n this._backProxy = backProxy;\n },\n\n route: function(route, callback) {\n this.routes.push(new Route(route, callback, this.ignoreCase));\n },\n\n navigate: function(url, silent) {\n kendo.history.navigate(url, silent);\n },\n\n replace: function(url, silent) {\n kendo.history.replace(url, silent);\n },\n\n _back: function(e) {\n if (this.trigger(BACK, { url: e.url, to: e.to })) {\n e.preventDefault();\n }\n },\n\n _same: function() {\n this.trigger(SAME);\n },\n\n _urlChanged: function(e) {\n var url = e.url;\n var decode = !!e.decode;\n var back = e.backButtonPressed;\n\n if (!url) {\n url = \"/\";\n }\n\n if (this.trigger(CHANGE, { url: e.url, params: kendo.parseQueryStringParams(e.url), backButtonPressed: back })) {\n e.preventDefault();\n return;\n }\n\n var idx = 0,\n routes = this.routes,\n route,\n length = routes.length;\n\n for (; idx < length; idx ++) {\n route = routes[idx];\n\n if (route.worksWith(url, back, decode)) {\n return;\n }\n }\n\n if (this.trigger(ROUTE_MISSING, { url: url, params: kendo.parseQueryStringParams(url), backButtonPressed: back })) {\n e.preventDefault();\n }\n }\n });\n\n kendo.Router = Router;\n })();\n\n var __meta__$6 = {\n id: \"view\",\n name: \"View\",\n category: \"framework\",\n description: \"The View class instantiates and handles the events of a certain screen from the application.\",\n depends: [ \"core\", \"binder\", \"fx\" ],\n hidden: false\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n attr = kendo.attr,\n ui = kendo.ui,\n attrValue = kendo.attrValue,\n directiveSelector = kendo.directiveSelector,\n Observable = kendo.Observable,\n Widget = kendo.ui.Widget,\n roleSelector = kendo.roleSelector,\n\n SCRIPT = \"SCRIPT\",\n INIT = \"init\",\n TRANSITION_START = \"transitionStart\",\n TRANSITION_END = \"transitionEnd\",\n SHOW = \"show\",\n HIDE = \"hide\",\n ATTACH = \"attach\",\n DETACH = \"detach\",\n sizzleErrorRegExp = /unrecognized expression/;\n\n var bodyRegExp = /]*>(([\\u000a\\u000d\\u2028\\u2029]|.)*)<\\/body>/i;\n var LOAD_START = \"loadStart\";\n var LOAD_COMPLETE = \"loadComplete\";\n var SHOW_START = \"showStart\";\n var SAME_VIEW_REQUESTED = \"sameViewRequested\";\n var VIEW_SHOW = \"viewShow\";\n var VIEW_TYPE_DETERMINED = \"viewTypeDetermined\";\n var AFTER = \"after\";\n var classNames = {\n content: \"k-content\",\n view: \"k-view\",\n stretchedView: \"k-stretched-view\",\n widget: \"k-widget\",\n header: \"k-header\",\n footer: \"k-footer\"\n };\n\n var View = kendo.ui.Widget.extend({\n init: function(content, options) {\n var that = this;\n options = options || {};\n that.id = kendo.guid();\n\n Observable.fn.init.call(that);\n this.options = $.extend({}, this.options, options);\n\n that.content = content;\n\n if (that.options.renderOnInit) {\n Widget.fn.init.call(that, that._createElement(), options);\n }\n\n if (that.options.wrapInSections) {\n that._renderSections();\n }\n\n that.tagName = options.tagName || \"div\";\n that.model = options.model;\n that._wrap = options.wrap !== false;\n this._evalTemplate = options.evalTemplate || false;\n this._useWithBlock = options.useWithBlock;\n that._fragments = {};\n\n that.bind([ INIT, SHOW, HIDE, TRANSITION_START, TRANSITION_END ], options);\n },\n\n options: {\n name: \"View\",\n renderOnInit: false,\n wrapInSections: false,\n detachOnHide: true,\n detachOnDestroy: true\n },\n\n render: function(container) {\n var that = this,\n notInitialized = !that.element;\n\n // The order below matters - kendo.bind should happen when the element is in the DOM, and show should be triggered after init.\n\n if (notInitialized) {\n that.element = that._createElement();\n }\n\n if (container) {\n $(container).append(that.element);\n }\n\n if (notInitialized) {\n kendo.bind(that.element, that.model);\n that.trigger(INIT);\n }\n\n if (container) {\n that._eachFragment(ATTACH);\n that.trigger(SHOW);\n }\n\n return that.element;\n },\n\n clone: function() {\n return new ViewClone(this);\n },\n\n triggerBeforeShow: function() {\n return true;\n },\n\n triggerBeforeHide: function() {\n return true;\n },\n\n showStart: function() {\n var that = this;\n var element = that.render();\n\n if (element) {\n element.css(\"display\", \"\");\n }\n\n this.trigger(SHOW_START, { view: this });\n },\n\n showEnd: function() {\n },\n\n hideEnd: function() {\n this.hide();\n },\n\n beforeTransition: function(type) {\n this.trigger(TRANSITION_START, { type: type });\n },\n\n afterTransition: function(type) {\n this.trigger(TRANSITION_END, { type: type });\n },\n\n hide: function() {\n if (this.options.detachOnHide) {\n this._eachFragment(DETACH);\n $(this.element).detach();\n }\n\n this.trigger(HIDE);\n },\n\n destroy: function() {\n var that = this;\n var element = that.element;\n\n if (element) {\n Widget.fn.destroy.call(that);\n\n kendo.unbind(element);\n kendo.destroy(element);\n\n if (that.options.detachOnDestroy) {\n element.remove();\n }\n }\n },\n\n // ported from mobile view\n purge: function() {\n var that = this;\n\n that.destroy();\n $(that.element).add(that.content).add(that.wrapper).off().remove();\n },\n\n fragments: function(fragments) {\n $.extend(this._fragments, fragments);\n },\n\n _eachFragment: function(methodName) {\n for (var placeholder in this._fragments) {\n this._fragments[placeholder][methodName](this, placeholder);\n }\n },\n\n _createElement: function() {\n var that = this,\n wrapper = \"<\" + that.tagName + \">\",\n element,\n content;\n\n try {\n content = $(document.getElementById(that.content) || that.content); // support passing id without #\n\n if (content[0].tagName === SCRIPT) {\n content = content.html();\n }\n } catch (e) {\n if (sizzleErrorRegExp.test(e.message)) {\n content = that.content;\n }\n }\n\n if (typeof content === \"string\") {\n content = content.replace(/^\\s+|\\s+$/g, '');\n if (that._evalTemplate) {\n content = kendo.template(content, { useWithBlock: that._useWithBlock })(that.model || {});\n }\n\n element = $(wrapper).append(content);\n // drop the wrapper if asked - this seems like the easiest (although not very intuitive) way to avoid messing up templates with questionable content, like this one for instance:\n // \n if (!that._wrap) {\n element = element.contents();\n }\n } else {\n element = content;\n if (that._evalTemplate) {\n var result = $(kendo.template($(\"
    \").append(element.clone(true)).html(), { useWithBlock: that._useWithBlock })(that.model || {}));\n\n // template uses DOM\n if ($.contains(document, element[0])) {\n element.replaceWith(result);\n }\n\n element = result;\n }\n if (that._wrap) {\n element = element.wrapAll(wrapper).parent();\n }\n }\n\n return element;\n },\n\n _renderSections: function() {\n var that = this;\n\n if (that.options.wrapInSections) {\n that._wrapper();\n that._createContent();\n that._createHeader();\n that._createFooter();\n }\n },\n\n _wrapper: function() {\n var that = this;\n var content = that.content;\n\n if (content.is(roleSelector(\"view\"))) {\n that.wrapper = that.content;\n } else {\n that.wrapper = content\n .wrap('
    ')\n .parent();\n }\n\n var wrapper = that.wrapper;\n\n wrapper.attr(\"id\", that.id);\n\n wrapper.addClass(classNames.view);\n wrapper.addClass(classNames.widget);\n wrapper.attr(\"role\", \"view\");\n },\n\n _createContent: function() {\n var that = this;\n var wrapper = $(that.wrapper);\n var contentSelector = roleSelector(\"content\");\n\n if (!wrapper.children(contentSelector)[0]) {\n var ccontentElements = wrapper.children().filter(function() {\n var child = $(this);\n if (!child.is(roleSelector(\"header\")) && !child.is(roleSelector(\"footer\"))) {\n return child;\n }\n });\n\n ccontentElements.wrap(\"
    ');\n }\n\n // use contentElement instead of content as view.content can be a string\n this.contentElement = wrapper.children(roleSelector(\"content\"));\n\n this.contentElement\n .addClass(classNames.stretchedView)\n .addClass(classNames.content);\n },\n\n _createHeader: function() {\n var that = this;\n var wrapper = that.wrapper;\n\n this.header = wrapper.children(roleSelector(\"header\")).addClass(classNames.header);\n },\n\n _createFooter: function() {\n var that = this;\n var wrapper = that.wrapper;\n\n this.footer = wrapper.children(roleSelector(\"footer\")).addClass(classNames.footer);\n }\n });\n\n var ViewClone = kendo.Class.extend({\n init: function(view) {\n $.extend(this, {\n element: view.element.clone(true),\n transition: view.transition,\n id: view.id\n });\n\n view.element.parent().append(this.element);\n },\n\n hideEnd: function() {\n this.element.remove();\n },\n\n beforeTransition: $.noop,\n afterTransition: $.noop\n });\n\n var Layout = View.extend({\n init: function(content, options) {\n View.fn.init.call(this, content, options);\n this.containers = {};\n },\n\n container: function(selector) {\n var container = this.containers[selector];\n\n if (!container) {\n container = this._createContainer(selector);\n this.containers[selector] = container;\n }\n\n return container;\n },\n\n showIn: function(selector, view, transition) {\n this.container(selector).show(view, transition);\n },\n\n _createContainer: function(selector) {\n var root = this.render(),\n element = root.find(selector),\n container;\n\n if (!element.length && root.is(selector)) {\n if (root.is(selector)) {\n element = root;\n } else {\n\n throw new Error(\"can't find a container with the specified \" + selector + \" selector\");\n }\n }\n\n container = new ViewContainer(element);\n\n container.bind(\"accepted\", function(e) {\n e.view.render(element);\n });\n\n return container;\n }\n });\n\n var Fragment = View.extend({\n attach: function(view, placeholder) {\n view.element.find(placeholder).replaceWith(this.render());\n },\n\n detach: function() {\n }\n });\n\n var transitionRegExp = /^(\\w+)(:(\\w+))?( (\\w+))?$/;\n\n function parseTransition(transition) {\n if (!transition) {\n return {};\n }\n\n var matches = transition.match(transitionRegExp) || [];\n\n return {\n type: matches[1],\n direction: matches[3],\n reverse: matches[5] === \"reverse\"\n };\n }\n\n var ViewContainer = Observable.extend({\n init: function(container) {\n Observable.fn.init.call(this);\n this.container = container;\n this.history = [];\n this.view = null;\n this.running = false;\n },\n\n after: function() {\n this.running = false;\n this.trigger(\"complete\", { view: this.view });\n this.trigger(\"after\");\n },\n\n end: function() {\n this.view.showEnd();\n this.previous.hideEnd();\n this.after();\n },\n\n show: function(view, transition, locationID) {\n if (!view.triggerBeforeShow() || (this.view && !this.view.triggerBeforeHide())) {\n this.trigger(\"after\");\n return false;\n }\n\n locationID = locationID || view.id;\n\n var that = this,\n current = (view === that.view) ? view.clone() : that.view,\n history = that.history,\n previousEntry = history[history.length - 2] || {},\n back = previousEntry.id === locationID,\n // If explicit transition is set, it will be with highest priority\n // Next we will try using the history record transition or the view transition configuration\n theTransition = transition || ( back ? history[history.length - 1].transition : view.transition ),\n transitionData = parseTransition(theTransition);\n\n if (that.running) {\n that.effect.stop();\n }\n\n if (theTransition === \"none\") {\n theTransition = null;\n }\n\n that.trigger(\"accepted\", { view: view });\n that.view = view;\n that.previous = current;\n that.running = true;\n\n if (!back) {\n history.push({ id: locationID, transition: theTransition });\n } else {\n history.pop();\n }\n\n if (!current) {\n view.showStart();\n view.showEnd();\n that.after();\n return true;\n }\n\n if (!theTransition || !kendo.effects.enabled) {\n view.showStart();\n that.end();\n } else {\n // hide the view element before init/show - prevents blinks on iPad\n // the replace effect will remove this class\n view.element.addClass(\"k-fx-hidden\");\n view.showStart();\n // do not reverse the explicit transition\n if (back && !transition) {\n transitionData.reverse = !transitionData.reverse;\n }\n\n that.effect = kendo.fx(view.element).replace(current.element, transitionData.type)\n .beforeTransition(function() {\n view.beforeTransition(\"show\");\n current.beforeTransition(\"hide\");\n })\n .afterTransition(function() {\n view.afterTransition(\"show\");\n current.afterTransition(\"hide\");\n })\n .direction(transitionData.direction)\n .setReverse(transitionData.reverse);\n\n that.effect.run().then(function() { that.end(); });\n }\n\n return true;\n },\n\n destroy: function() {\n var that = this;\n var view = that.view;\n\n if (view && view.destroy) {\n view.destroy();\n }\n }\n });\n\n var ViewEngine = Observable.extend({\n init: function(options) {\n var that = this,\n views,\n container;\n\n Observable.fn.init.call(that);\n that.options = options;\n\n $.extend(that, options);\n that.sandbox = $(\"
    \");\n container = that.container;\n\n views = that._hideViews(container);\n that.rootView = views.first();\n that.layouts = {};\n\n that.viewContainer = new kendo.ViewContainer(that.container);\n\n that.viewContainer.bind(\"accepted\", function(e) {\n e.view.params = that.params;\n });\n\n that.viewContainer.bind(\"complete\", function(e) {\n that.trigger(VIEW_SHOW, { view: e.view });\n });\n\n that.viewContainer.bind(AFTER, function() {\n that.trigger(AFTER);\n });\n\n this.bind(this.events, options);\n },\n\n events: [\n SHOW_START,\n AFTER,\n VIEW_SHOW,\n LOAD_START,\n LOAD_COMPLETE,\n SAME_VIEW_REQUESTED,\n VIEW_TYPE_DETERMINED\n ],\n\n destroy: function() {\n var that = this;\n var viewContainer = that.viewContainer;\n\n kendo.destroy(that.container);\n\n for (var id in that.layouts) {\n this.layouts[id].destroy();\n }\n\n if (viewContainer) {\n viewContainer.destroy();\n }\n },\n\n view: function() {\n return this.viewContainer.view;\n },\n\n showView: function(url, transition, params) {\n url = url.replace(new RegExp(\"^\" + this.remoteViewURLPrefix), \"\");\n if (url === \"\" && this.remoteViewURLPrefix) {\n url = \"/\";\n }\n\n if (url.replace(/^#/, \"\") === this.url) {\n this.trigger(SAME_VIEW_REQUESTED);\n return false;\n }\n\n this.trigger(SHOW_START);\n\n var that = this,\n element = that._findViewElement(url),\n view = kendo.widgetInstance(element);\n\n that.url = url.replace(/^#/, \"\");\n\n that.params = params;\n\n if (view && view.reload) {\n view.purge();\n element = [];\n }\n\n this.trigger(VIEW_TYPE_DETERMINED, { remote: element.length === 0, url: url });\n\n if (element[0]) {\n if (!view) {\n view = that._createView(element);\n }\n\n return that.viewContainer.show(view, transition, url);\n } else {\n return true;\n }\n },\n\n append: function(html, url) {\n var sandbox = this.sandbox,\n urlPath = (url || \"\").split(\"?\")[0],\n container = this.container,\n views,\n view;\n\n if (bodyRegExp.test(html)) {\n html = RegExp.$1;\n }\n\n sandbox[0].innerHTML = html;\n\n container.append(sandbox.children(\"script, style\"));\n\n views = this._hideViews(sandbox);\n view = views.first();\n\n // Generic HTML content found as remote view - no remote view markers\n if (!view.length) {\n views = view = sandbox.wrapInner(\"
    \").children(); // one element\n }\n\n if (urlPath) {\n view.hide().attr(attr(\"url\"), urlPath);\n }\n\n container.append(views);\n\n return this._createView(view);\n },\n\n _locate: function(selectors) {\n return this.$angular ? directiveSelector(selectors) : roleSelector(selectors);\n },\n\n _findViewElement: function(url) {\n var element,\n urlPath = url.split(\"?\")[0];\n\n if (!urlPath) {\n return this.rootView;\n }\n\n element = this.container.children(\"[\" + attr(\"url\") + \"='\" + urlPath + \"']\");\n\n // do not try to search for \"#/foo/bar\" id, jQuery throws error\n if (!element[0] && urlPath.indexOf(\"/\") === -1) {\n element = this.container.children(urlPath.charAt(0) === \"#\" ? urlPath : \"#\" + urlPath);\n }\n\n if (!element[0]) {\n element = this._findViewElementById(url);\n }\n\n return element;\n },\n\n _findViewElementById: function(id) {\n var element = this.container.children(\"[id='\" + id + \"']\");\n return element;\n },\n\n _createView: function(element) {\n //return this._createMobileView(element);\n return this._createSpaView(element);\n },\n\n _createMobileView: function(element) {\n return kendo.initWidget(element, {\n defaultTransition: this.transition,\n loader: this.loader,\n container: this.container,\n getLayout: this.getLayoutProxy,\n modelScope: this.modelScope,\n reload: attrValue(element, \"reload\")\n }, ui.roles);\n },\n\n _createSpaView: function(element) {\n var viewOptions = (this.options || {}).viewOptions || {};\n return new kendo.View(element, {\n renderOnInit: viewOptions.renderOnInit,\n wrap: viewOptions.wrap || false,\n wrapInSections: viewOptions.wrapInSections,\n detachOnHide: viewOptions.detachOnHide,\n detachOnDestroy: viewOptions.detachOnDestroy\n });\n },\n\n _hideViews: function(container) {\n return container.children(this._locate(\"view\")).hide();\n }\n });\n\n kendo.ViewEngine = ViewEngine;\n\n kendo.ViewContainer = ViewContainer;\n kendo.Fragment = Fragment;\n kendo.Layout = Layout;\n kendo.View = View;\n kendo.ViewClone = ViewClone;\n\n })(window.kendo.jQuery);\n var kendo$7 = kendo;\n\n var __meta__$5 = {\n id: \"userevents\",\n name: \"User Events\",\n category: \"framework\",\n depends: [ \"core\" ],\n hidden: true\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n support = kendo.support,\n Class = kendo.Class,\n Observable = kendo.Observable,\n now = Date.now,\n extend = $.extend,\n OS = support.mobileOS,\n invalidZeroEvents = OS && OS.android,\n DEFAULT_MIN_HOLD = 800,\n CLICK_DELAY = 300,\n DEFAULT_THRESHOLD = support.browser.msie ? 5 : 0, // WP8 and W8 are very sensitive and always report move.\n\n // UserEvents events\n PRESS = \"press\",\n HOLD = \"hold\",\n SELECT = \"select\",\n START = \"start\",\n MOVE = \"move\",\n END = \"end\",\n CANCEL = \"cancel\",\n TAP = \"tap\",\n DOUBLETAP = \"doubleTap\",\n RELEASE = \"release\",\n GESTURESTART = \"gesturestart\",\n GESTURECHANGE = \"gesturechange\",\n GESTUREEND = \"gestureend\",\n GESTURETAP = \"gesturetap\";\n\n var THRESHOLD = {\n \"api\": 0,\n \"touch\": 0,\n \"mouse\": 9,\n \"pointer\": 9\n };\n\n var ENABLE_GLOBAL_SURFACE = (!support.touch || support.mouseAndTouchPresent);\n\n function touchDelta(touch1, touch2) {\n var x1 = touch1.x.location,\n y1 = touch1.y.location,\n x2 = touch2.x.location,\n y2 = touch2.y.location,\n dx = x1 - x2,\n dy = y1 - y2;\n\n return {\n center: {\n x: (x1 + x2) / 2,\n y: (y1 + y2) / 2\n },\n\n distance: Math.sqrt(dx * dx + dy * dy)\n };\n }\n\n function getTouches(e) {\n var touches = [],\n originalEvent = e.originalEvent,\n currentTarget = e.currentTarget,\n idx = 0, length,\n changedTouches,\n touch;\n\n if (e.api) {\n touches.push({\n id: 2, // hardcoded ID for API call;\n event: e,\n target: e.target,\n currentTarget: e.target,\n location: e,\n type: \"api\"\n });\n }\n else if (e.type.match(/touch/)) {\n changedTouches = originalEvent ? originalEvent.changedTouches : [];\n for (length = changedTouches.length; idx < length; idx ++) {\n touch = changedTouches[idx];\n touches.push({\n location: touch,\n event: e,\n target: touch.target,\n currentTarget: currentTarget,\n id: touch.identifier,\n type: \"touch\"\n });\n }\n }\n else if (support.pointers || support.msPointers) {\n touches.push({\n location: originalEvent,\n event: e,\n target: e.target,\n currentTarget: currentTarget,\n id: originalEvent.pointerId,\n type: \"pointer\"\n });\n } else {\n touches.push({\n id: 1, // hardcoded ID for mouse event;\n event: e,\n target: e.target,\n currentTarget: currentTarget,\n location: e,\n type: \"mouse\"\n });\n }\n\n return touches;\n }\n\n var TouchAxis = Class.extend({\n init: function(axis, location) {\n var that = this;\n\n that.axis = axis;\n\n that._updateLocationData(location);\n\n that.startLocation = that.location;\n that.velocity = that.delta = 0;\n that.timeStamp = now();\n },\n\n move: function(location) {\n var that = this,\n offset = location[\"page\" + that.axis],\n timeStamp = now(),\n timeDelta = (timeStamp - that.timeStamp) || 1; // Firing manually events in tests can make this 0;\n\n if (!offset && invalidZeroEvents) {\n return;\n }\n\n that.delta = offset - that.location;\n\n that._updateLocationData(location);\n\n that.initialDelta = offset - that.startLocation;\n that.velocity = that.delta / timeDelta;\n that.timeStamp = timeStamp;\n },\n\n _updateLocationData: function(location) {\n var that = this, axis = that.axis;\n\n that.location = location[\"page\" + axis];\n that.client = location[\"client\" + axis];\n that.screen = location[\"screen\" + axis];\n }\n });\n\n var Touch = Class.extend({\n init: function(userEvents, target, touchInfo) {\n extend(this, {\n x: new TouchAxis(\"X\", touchInfo.location),\n y: new TouchAxis(\"Y\", touchInfo.location),\n type: touchInfo.type,\n useClickAsTap: userEvents.useClickAsTap,\n threshold: userEvents.threshold || THRESHOLD[touchInfo.type],\n userEvents: userEvents,\n target: target,\n currentTarget: touchInfo.currentTarget,\n initialTouch: touchInfo.target,\n id: touchInfo.id,\n pressEvent: touchInfo,\n _clicks: userEvents._clicks,\n supportDoubleTap: userEvents.supportDoubleTap,\n _moved: false,\n _finished: false\n });\n },\n\n press: function() {\n this._holdTimeout = setTimeout(this._hold.bind(this), this.userEvents.minHold);\n this._trigger(PRESS, this.pressEvent);\n },\n\n _tap: function(touchInfo) {\n var that = this;\n that.userEvents._clicks++;\n if (that.userEvents._clicks == 1) {\n that._clickTimeout = setTimeout(function() {\n if (that.userEvents._clicks == 1) {\n that._trigger(TAP, touchInfo);\n }\n else {\n that._trigger(DOUBLETAP, touchInfo);\n }\n that.userEvents._clicks = 0;\n }, CLICK_DELAY);\n }\n },\n\n _hold: function() {\n this._trigger(HOLD, this.pressEvent);\n },\n\n move: function(touchInfo) {\n var that = this;\n var preventMove = touchInfo.type !== \"api\" && that.userEvents._shouldNotMove;\n\n if (that._finished || preventMove) { return; }\n\n that.x.move(touchInfo.location);\n that.y.move(touchInfo.location);\n\n if (!that._moved) {\n if (that._withinIgnoreThreshold()) {\n return;\n }\n\n if (!UserEvents.current || UserEvents.current === that.userEvents) {\n that._start(touchInfo);\n } else {\n return that.dispose();\n }\n }\n\n // Event handlers may cancel the drag in the START event handler, hence the double check for pressed.\n if (!that._finished) {\n that._trigger(MOVE, touchInfo);\n }\n },\n\n end: function(touchInfo) {\n this.endTime = now();\n\n if (this._finished) { return; }\n\n // Mark the object as finished if there are blocking operations in the event handlers (alert/confirm)\n this._finished = true;\n\n this._trigger(RELEASE, touchInfo); // Release should be fired before TAP (as click is after mouseup/touchend)\n\n if (this._moved) {\n this._trigger(END, touchInfo);\n } else {\n if (!this.useClickAsTap) {\n if (this.supportDoubleTap) {\n this._tap(touchInfo);\n }\n else {\n this._trigger(TAP, touchInfo);\n }\n }\n }\n\n clearTimeout(this._holdTimeout);\n\n this.dispose();\n },\n\n dispose: function() {\n var userEvents = this.userEvents,\n activeTouches = userEvents.touches;\n\n this._finished = true;\n this.pressEvent = null;\n clearTimeout(this._holdTimeout);\n\n activeTouches.splice($.inArray(this, activeTouches), 1);\n },\n\n skip: function() {\n this.dispose();\n },\n\n cancel: function() {\n this.dispose();\n },\n\n isMoved: function() {\n return this._moved;\n },\n\n _start: function(touchInfo) {\n clearTimeout(this._holdTimeout);\n\n this.startTime = now();\n this._moved = true;\n this._trigger(START, touchInfo);\n },\n\n _trigger: function(name, touchInfo) {\n var that = this,\n jQueryEvent = touchInfo.event,\n data = {\n touch: that,\n x: that.x,\n y: that.y,\n target: that.target,\n event: jQueryEvent\n };\n\n if (that.userEvents.notify(name, data)) {\n jQueryEvent.preventDefault();\n }\n },\n\n _withinIgnoreThreshold: function() {\n var xDelta = this.x.initialDelta,\n yDelta = this.y.initialDelta;\n\n return Math.sqrt(xDelta * xDelta + yDelta * yDelta) <= this.threshold;\n }\n });\n\n function withEachUpEvent(callback) {\n var downEvents = kendo.eventMap.up.split(\" \"),\n idx = 0,\n length = downEvents.length;\n\n for (; idx < length; idx ++) {\n callback(downEvents[idx]);\n }\n }\n\n var UserEvents = Observable.extend({\n init: function(element, options) {\n var that = this,\n filter,\n ns = kendo.guid();\n\n options = options || {};\n filter = that.filter = options.filter;\n that.threshold = options.threshold || DEFAULT_THRESHOLD;\n that.minHold = options.minHold || DEFAULT_MIN_HOLD;\n that.touches = [];\n that._maxTouches = options.multiTouch ? 2 : 1;\n that.allowSelection = options.allowSelection;\n that.captureUpIfMoved = options.captureUpIfMoved;\n that.useClickAsTap = !options.fastTap && !support.delayedClick();\n that.eventNS = ns;\n that._clicks = 0;\n that.supportDoubleTap = options.supportDoubleTap;\n\n element = $(element).handler(that);\n Observable.fn.init.call(that);\n\n extend(that, {\n element: element,\n // the touch events lock to the element anyway, so no need for the global setting\n surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\n stopPropagation: options.stopPropagation,\n pressed: false\n });\n\n that.surface.handler(that)\n .on(kendo.applyEventMap(\"move\", ns), \"_move\")\n .on(kendo.applyEventMap(\"up cancel\", ns), \"_end\");\n\n element.on(kendo.applyEventMap(\"down\", ns), filter, \"_start\");\n\n if (that.useClickAsTap) {\n element.on(kendo.applyEventMap(\"click\", ns), filter, \"_click\");\n }\n\n if (support.pointers || support.msPointers) {\n //touch-action:none will not work for IE10\n if (support.browser.version < 11) {\n var defaultAction = \"pinch-zoom double-tap-zoom\";\n element.css(\"-ms-touch-action\", options.touchAction && options.touchAction != \"none\" ? defaultAction + \" \" + options.touchAction : defaultAction);\n } else {\n element.css(\"touch-action\", options.touchAction || \"none\");\n }\n }\n\n if (options.preventDragEvent) {\n element.on(kendo.applyEventMap(\"dragstart\", ns), kendo.preventDefault);\n }\n\n element.on(kendo.applyEventMap(\"mousedown\", ns), filter, { root: element }, \"_select\");\n\n if (that.captureUpIfMoved && support.eventCapture) {\n var surfaceElement = that.surface[0],\n preventIfMovingProxy = that.preventIfMoving.bind(that);\n\n withEachUpEvent(function(eventName) {\n surfaceElement.addEventListener(eventName, preventIfMovingProxy, true);\n });\n }\n\n that.bind([\n PRESS,\n HOLD,\n TAP,\n DOUBLETAP,\n START,\n MOVE,\n END,\n RELEASE,\n CANCEL,\n GESTURESTART,\n GESTURECHANGE,\n GESTUREEND,\n GESTURETAP,\n SELECT\n ], options);\n },\n\n preventIfMoving: function(e) {\n if (this._isMoved()) {\n e.preventDefault();\n }\n },\n\n destroy: function() {\n var that = this;\n\n if (that._destroyed) {\n return;\n }\n\n that._destroyed = true;\n\n if (that.captureUpIfMoved && support.eventCapture) {\n var surfaceElement = that.surface[0];\n withEachUpEvent(function(eventName) {\n surfaceElement.removeEventListener(eventName, that.preventIfMoving);\n });\n }\n\n that.element.kendoDestroy(that.eventNS);\n that.surface.kendoDestroy(that.eventNS);\n that.element.removeData(\"handler\");\n that.surface.removeData(\"handler\");\n that._disposeAll();\n\n that.unbind();\n delete that.surface;\n delete that.element;\n delete that.currentTarget;\n },\n\n capture: function() {\n UserEvents.current = this;\n },\n\n cancel: function() {\n this._disposeAll();\n this.trigger(CANCEL);\n },\n\n notify: function(eventName, data) {\n var that = this,\n touches = that.touches;\n\n if (this._isMultiTouch()) {\n switch (eventName) {\n case MOVE:\n eventName = GESTURECHANGE;\n break;\n case END:\n eventName = GESTUREEND;\n break;\n case TAP:\n eventName = GESTURETAP;\n break;\n }\n\n extend(data, { touches: touches }, touchDelta(touches[0], touches[1]));\n }\n\n return this.trigger(eventName, extend(data, { type: eventName }));\n },\n\n // API\n press: function(x, y, target) {\n this._apiCall(\"_start\", x, y, target);\n },\n\n move: function(x, y) {\n this._apiCall(\"_move\", x, y);\n },\n\n end: function(x, y) {\n this._apiCall(\"_end\", x, y);\n },\n\n _isMultiTouch: function() {\n return this.touches.length > 1;\n },\n\n _maxTouchesReached: function() {\n return this.touches.length >= this._maxTouches;\n },\n\n _disposeAll: function() {\n var touches = this.touches;\n while (touches.length > 0) {\n touches.pop().dispose();\n }\n },\n\n _isMoved: function() {\n return $.grep(this.touches, function(touch) {\n return touch.isMoved();\n }).length;\n },\n\n _select: function(e) {\n if (!this.allowSelection || this.trigger(SELECT, { event: e })) {\n e.preventDefault();\n }\n },\n\n _start: function(e) {\n var that = this,\n idx = 0,\n filter = that.filter,\n target,\n touches = getTouches(e),\n length = touches.length,\n touch,\n which = e.which;\n\n if ((which && which > 1) || (that._maxTouchesReached())) {\n return;\n }\n\n UserEvents.current = null;\n\n that.currentTarget = e.currentTarget;\n\n if (that.stopPropagation) {\n e.stopPropagation();\n }\n\n for (; idx < length; idx ++) {\n if (that._maxTouchesReached()) {\n break;\n }\n\n touch = touches[idx];\n\n if (filter) {\n target = $(touch.currentTarget); // target.is(filter) ? target : target.closest(filter, that.element);\n } else {\n target = that.element;\n }\n\n if (!target.length) {\n continue;\n }\n\n touch = new Touch(that, target, touch);\n that.touches.push(touch);\n touch.press();\n\n if (that._isMultiTouch()) {\n that.notify(\"gesturestart\", {});\n }\n }\n },\n\n _move: function(e) {\n this._eachTouch(\"move\", e);\n },\n\n _end: function(e) {\n this._eachTouch(\"end\", e);\n },\n\n _click: function(e) {\n var data = {\n touch: {\n initialTouch: e.target,\n target: $(e.currentTarget),\n endTime: now(),\n x: {\n location: e.pageX,\n client: e.clientX\n },\n y: {\n location: e.pageY,\n client: e.clientY\n }\n },\n x: e.pageX,\n y: e.pageY,\n target: $(e.currentTarget),\n event: e,\n type: \"tap\"\n };\n\n if (this.trigger(\"tap\", data)) {\n e.preventDefault();\n }\n },\n\n _eachTouch: function(methodName, e) {\n var that = this,\n dict = {},\n touches = getTouches(e),\n activeTouches = that.touches,\n idx,\n touch,\n touchInfo,\n matchingTouch;\n\n for (idx = 0; idx < activeTouches.length; idx ++) {\n touch = activeTouches[idx];\n dict[touch.id] = touch;\n }\n\n for (idx = 0; idx < touches.length; idx ++) {\n touchInfo = touches[idx];\n matchingTouch = dict[touchInfo.id];\n\n if (matchingTouch) {\n matchingTouch[methodName](touchInfo);\n }\n }\n },\n\n _apiCall: function(type, x, y, target) {\n this[type]({\n api: true,\n pageX: x,\n pageY: y,\n clientX: x,\n clientY: y,\n target: $(target || this.element)[0],\n stopPropagation: $.noop,\n preventDefault: $.noop\n });\n }\n });\n\n var ClickMoveClick = Observable.extend({\n init: function(element, options) {\n var that = this,\n filter,\n ns = kendo.guid();\n\n options = options || {};\n filter = that.filter = options.filter;\n that.touches = [];\n that._maxTouches = 1;\n that.eventNS = ns;\n that._downStarted = 0;\n\n element = $(element).handler(that);\n Observable.fn.init.call(that);\n\n extend(that, {\n element: element,\n // the touch events lock to the element anyway, so no need for the global setting\n surface: options.global && ENABLE_GLOBAL_SURFACE ? $(element[0].ownerDocument.documentElement) : $(options.surface || element),\n stopPropagation: options.stopPropagation,\n pressed: false\n });\n\n that.surface.handler(that)\n .on(kendo.applyEventMap(\"move\", ns), \"_move\")\n .on(kendo.applyEventMap(\"cancel up\", ns), \"cancel\");\n\n element.on(kendo.applyEventMap(\"down\", ns), filter, \"_down\")\n .on(kendo.applyEventMap(\"up\", ns), filter, \"_up\");\n\n that.bind([\n START,\n MOVE,\n END,\n HOLD,\n CANCEL,\n SELECT\n ], options);\n },\n\n _down: function(e) {\n if (e.which && e.which > 1) {\n this.cancel();\n } else {\n this._downStarted = new Date().getTime();\n this._downTarget = e.target;\n }\n },\n\n _up: function(e) {\n var currentMilestone = new Date().getTime(),\n currentTarget = e.target;\n\n if ((!e.which || e.which === 1) &&\n currentMilestone < this._downStarted + CLICK_DELAY &&\n currentTarget === this._downTarget) {\n if (this.touches && this.touches.length > 0) {\n this._end(e);\n } else {\n this._start(e);\n }\n\n this._preventCancel = true;\n } else {\n this.cancel();\n }\n\n this._downStarted = 0;\n this._downTarget = null;\n },\n\n destroy: function() {\n var that = this;\n\n if (that._destroyed) {\n return;\n }\n\n that._destroyed = true;\n\n that.element.kendoDestroy(that.eventNS);\n that.surface.kendoDestroy(that.eventNS);\n that.element.removeData(\"handler\");\n that.surface.removeData(\"handler\");\n that._disposeAll();\n\n that.unbind();\n delete that.surface;\n delete that.element;\n delete that.currentTarget;\n },\n\n capture: function() {\n ClickMoveClick.current = this;\n },\n\n cancel: function() {\n if (this._preventCancel) {\n this._preventCancel = false;\n return;\n } else if (this.touches && this.touches.length > 0) {\n this._disposeAll();\n this.trigger(CANCEL);\n }\n },\n\n notify: function(eventName, data) {\n data.clickMoveClick = true;\n return this.trigger(eventName, extend(data, { type: eventName }));\n },\n\n _maxTouchesReached: function() {\n return this.touches.length >= this._maxTouches;\n },\n\n _disposeAll: function() {\n var touches = this.touches;\n\n while (touches.length > 0) {\n touches.pop().dispose();\n }\n },\n\n _start: function(e) {\n var that = this,\n idx = 0,\n filter = that.filter,\n target,\n touches = getTouches(e),\n length = touches.length,\n touch,\n which = e.which;\n\n if ((which && which > 1) || (that._maxTouchesReached())) {\n return;\n }\n\n ClickMoveClick.current = null;\n\n that.currentTarget = e.currentTarget;\n\n if (that.stopPropagation) {\n e.stopPropagation();\n }\n\n for (; idx < length; idx ++) {\n if (that._maxTouchesReached()) {\n break;\n }\n\n touch = touches[idx];\n\n if (filter) {\n target = $(touch.currentTarget);\n } else {\n target = that.element;\n }\n\n if (!target.length) {\n continue;\n }\n\n touch = new Touch(that, target, touch);\n that.touches.push(touch);\n touch.press();\n touch._start(touch);\n }\n },\n\n _move: function(e) {\n this._eachTouch(\"move\", e);\n },\n\n _end: function(e) {\n this._eachTouch(\"move\", e);\n this._eachTouch(\"end\", e);\n },\n\n _eachTouch: function(methodName, e) {\n var that = this,\n dict = {},\n touches = getTouches(e),\n activeTouches = that.touches,\n idx,\n touch,\n touchInfo,\n matchingTouch;\n\n for (idx = 0; idx < activeTouches.length; idx ++) {\n touch = activeTouches[idx];\n dict[touch.id] = touch;\n }\n\n for (idx = 0; idx < touches.length; idx ++) {\n touchInfo = touches[idx];\n matchingTouch = dict[touchInfo.id];\n\n if (matchingTouch) {\n matchingTouch.x.move(touchInfo.location);\n matchingTouch.y.move(touchInfo.location);\n matchingTouch[methodName](touchInfo);\n }\n }\n }\n });\n\n UserEvents.defaultThreshold = function(value) {\n DEFAULT_THRESHOLD = value;\n };\n\n UserEvents.minHold = function(value) {\n DEFAULT_MIN_HOLD = value;\n };\n\n kendo.getTouches = getTouches;\n kendo.touchDelta = touchDelta;\n kendo.UserEvents = UserEvents;\n kendo.ClickMoveClick = ClickMoveClick;\n })(window.kendo.jQuery);\n var kendo$6 = kendo;\n\n var __meta__$4 = {\n id: \"draganddrop\",\n name: \"Drag & drop\",\n category: \"framework\",\n description: \"Drag & drop functionality for any DOM element.\",\n depends: [ \"core\", \"userevents\" ]\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n support = kendo.support,\n document = window.document,\n $window = $(window),\n Class = kendo.Class,\n Widget = kendo.ui.Widget,\n Observable = kendo.Observable,\n UserEvents = kendo.UserEvents,\n ClickMoveClick = kendo.ClickMoveClick,\n extend = $.extend,\n getOffset = kendo.getOffset,\n draggables = {},\n dropTargets = {},\n dropAreas = {},\n lastDropTarget,\n elementUnderCursor = kendo.elementUnderCursor,\n KEYUP = \"keyup\",\n CHANGE = \"change\",\n\n // Draggable events\n DRAGSTART = \"dragstart\",\n HOLD = \"hold\",\n DRAG = \"drag\",\n DRAGEND = \"dragend\",\n DRAGCANCEL = \"dragcancel\",\n HINTDESTROYED = \"hintDestroyed\",\n\n // DropTarget events\n DRAGENTER = \"dragenter\",\n DRAGLEAVE = \"dragleave\",\n DROP = \"drop\";\n\n function contains(parent, child) {\n try {\n return $.contains(parent, child) || parent == child;\n } catch (e) {\n return false;\n }\n }\n\n function numericCssPropery(element, property) {\n return parseInt(element.css(property), 10) || 0;\n }\n\n function within(value, range) {\n return Math.min(Math.max(value, range.min), range.max);\n }\n\n function containerBoundaries(container, element) {\n var offset = getOffset(container),\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n minX = offset.left + numericCssPropery(container, \"borderLeftWidth\") + numericCssPropery(container, \"paddingLeft\"),\n minY = offset.top + numericCssPropery(container, \"borderTopWidth\") + numericCssPropery(container, \"paddingTop\"),\n maxX = minX + container.width() - outerWidth(element, true),\n maxY = minY + container.height() - outerHeight(element, true);\n\n return {\n x: { min: minX, max: maxX },\n y: { min: minY, max: maxY }\n };\n }\n\n function checkTarget(target, targets, areas) {\n var theTarget, theFilter, i = 0,\n targetLen = targets && targets.length,\n areaLen = areas && areas.length;\n\n while (target && target.parentNode) {\n for (i = 0; i < targetLen; i ++) {\n theTarget = targets[i];\n if (theTarget.element[0] === target) {\n return { target: theTarget, targetElement: target };\n }\n }\n\n for (i = 0; i < areaLen; i ++) {\n theFilter = areas[i];\n if ($.contains(theFilter.element[0], target) && support.matchesSelector.call(target, theFilter.options.filter)) {\n return { target: theFilter, targetElement: target };\n }\n }\n\n target = target.parentNode;\n }\n\n return undefined$1;\n }\n\n var TapCapture = Observable.extend({\n init: function(element, options) {\n var that = this,\n domElement = element[0];\n\n that.capture = false;\n\n if (domElement.addEventListener) {\n $.each(kendo.eventMap.down.split(\" \"), function() {\n domElement.addEventListener(this, that._press.bind(that), true);\n });\n $.each(kendo.eventMap.up.split(\" \"), function() {\n domElement.addEventListener(this, that._release.bind(that), true);\n });\n } else {\n $.each(kendo.eventMap.down.split(\" \"), function() {\n domElement.attachEvent(this, that._press.bind(that));\n });\n $.each(kendo.eventMap.up.split(\" \"), function() {\n domElement.attachEvent(this, that._release.bind(that));\n });\n }\n\n Observable.fn.init.call(that);\n\n that.bind([\"press\", \"release\"], options || {});\n },\n\n captureNext: function() {\n this.capture = true;\n },\n\n cancelCapture: function() {\n this.capture = false;\n },\n\n _press: function(e) {\n var that = this;\n that.trigger(\"press\");\n if (that.capture) {\n e.preventDefault();\n }\n },\n\n _release: function(e) {\n var that = this;\n that.trigger(\"release\");\n\n if (that.capture) {\n e.preventDefault();\n that.cancelCapture();\n }\n }\n });\n\n var PaneDimension = Observable.extend({\n init: function(options) {\n var that = this;\n Observable.fn.init.call(that);\n\n that.forcedEnabled = false;\n\n $.extend(that, options);\n\n that.scale = 1;\n\n if (that.horizontal) {\n that.measure = \"offsetWidth\";\n that.scrollSize = \"scrollWidth\";\n that.axis = \"x\";\n } else {\n that.measure = \"offsetHeight\";\n that.scrollSize = \"scrollHeight\";\n that.axis = \"y\";\n }\n },\n\n makeVirtual: function() {\n $.extend(this, {\n virtual: true,\n forcedEnabled: true,\n _virtualMin: 0,\n _virtualMax: 0\n });\n },\n\n virtualSize: function(min, max) {\n if (this._virtualMin !== min || this._virtualMax !== max) {\n this._virtualMin = min;\n this._virtualMax = max;\n this.update();\n }\n },\n\n outOfBounds: function(offset) {\n return offset > this.max || offset < this.min;\n },\n\n forceEnabled: function() {\n this.forcedEnabled = true;\n },\n\n getSize: function() {\n return this.container[0][this.measure];\n },\n\n getTotal: function() {\n return this.element[0][this.scrollSize];\n },\n\n rescale: function(scale) {\n this.scale = scale;\n },\n\n update: function(silent) {\n var that = this,\n total = that.virtual ? that._virtualMax : that.getTotal(),\n scaledTotal = total * that.scale,\n size = that.getSize();\n\n if (total === 0 && !that.forcedEnabled) {\n return; // we are not visible.\n }\n\n that.max = that.virtual ? -that._virtualMin : 0;\n that.size = size;\n that.total = scaledTotal;\n that.min = Math.min(that.max, size - scaledTotal);\n that.minScale = size / total;\n that.centerOffset = (scaledTotal - size) / 2;\n\n that.enabled = that.forcedEnabled || (scaledTotal > size);\n\n if (!silent) {\n that.trigger(CHANGE, that);\n }\n }\n });\n\n var PaneDimensions = Observable.extend({\n init: function(options) {\n var that = this;\n\n Observable.fn.init.call(that);\n\n that.x = new PaneDimension(extend({ horizontal: true }, options));\n that.y = new PaneDimension(extend({ horizontal: false }, options));\n that.container = options.container;\n that.forcedMinScale = options.minScale;\n that.maxScale = options.maxScale || 100;\n\n that.bind(CHANGE, options);\n },\n\n rescale: function(newScale) {\n this.x.rescale(newScale);\n this.y.rescale(newScale);\n this.refresh();\n },\n\n centerCoordinates: function() {\n return { x: Math.min(0, -this.x.centerOffset), y: Math.min(0, -this.y.centerOffset) };\n },\n\n refresh: function() {\n var that = this;\n that.x.update();\n that.y.update();\n that.enabled = that.x.enabled || that.y.enabled;\n that.minScale = that.forcedMinScale || Math.min(that.x.minScale, that.y.minScale);\n that.fitScale = Math.max(that.x.minScale, that.y.minScale);\n that.trigger(CHANGE);\n }\n });\n\n var PaneAxis = Observable.extend({\n init: function(options) {\n var that = this;\n extend(that, options);\n Observable.fn.init.call(that);\n },\n\n outOfBounds: function() {\n return this.dimension.outOfBounds(this.movable[this.axis]);\n },\n\n dragMove: function(delta) {\n var that = this,\n dimension = that.dimension,\n axis = that.axis,\n movable = that.movable,\n position = movable[axis] + delta;\n\n if (!dimension.enabled) {\n return;\n }\n\n if ((position < dimension.min && delta < 0) || (position > dimension.max && delta > 0)) {\n delta *= that.resistance;\n }\n\n movable.translateAxis(axis, delta);\n that.trigger(CHANGE, that);\n }\n });\n\n var Pane = Class.extend({\n\n init: function(options) {\n var that = this,\n x,\n y,\n resistance,\n movable;\n\n extend(that, { elastic: true }, options);\n\n resistance = that.elastic ? 0.5 : 0;\n movable = that.movable;\n\n that.x = x = new PaneAxis({\n axis: \"x\",\n dimension: that.dimensions.x,\n resistance: resistance,\n movable: movable\n });\n\n that.y = y = new PaneAxis({\n axis: \"y\",\n dimension: that.dimensions.y,\n resistance: resistance,\n movable: movable\n });\n\n that.userEvents.bind([\"press\", \"move\", \"end\", \"gesturestart\", \"gesturechange\"], {\n gesturestart: function(e) {\n that.gesture = e;\n that.offset = that.dimensions.container.offset();\n },\n\n press: function(e) {\n if ($(e.event.target).closest(\"a\").is(\"[data-navigate-on-press=true]\")) {\n e.sender.cancel();\n }\n },\n\n gesturechange: function(e) {\n var previousGesture = that.gesture,\n previousCenter = previousGesture.center,\n\n center = e.center,\n\n scaleDelta = e.distance / previousGesture.distance,\n\n minScale = that.dimensions.minScale,\n maxScale = that.dimensions.maxScale,\n coordinates;\n\n if (movable.scale <= minScale && scaleDelta < 1) {\n // Resist shrinking. Instead of shrinking from 1 to 0.5, it will shrink to 0.5 + (1 /* minScale */ - 0.5) * 0.8 = 0.9;\n scaleDelta += (1 - scaleDelta) * 0.8;\n }\n\n if (movable.scale * scaleDelta >= maxScale) {\n scaleDelta = maxScale / movable.scale;\n }\n\n var offsetX = movable.x + that.offset.left,\n offsetY = movable.y + that.offset.top;\n\n coordinates = {\n x: (offsetX - previousCenter.x) * scaleDelta + center.x - offsetX,\n y: (offsetY - previousCenter.y) * scaleDelta + center.y - offsetY\n };\n\n movable.scaleWith(scaleDelta);\n\n x.dragMove(coordinates.x);\n y.dragMove(coordinates.y);\n\n that.dimensions.rescale(movable.scale);\n that.gesture = e;\n e.preventDefault();\n },\n\n move: function(e) {\n if (e.event.target.tagName.match(/textarea|input/i)) {\n return;\n }\n\n if (x.dimension.enabled || y.dimension.enabled) {\n x.dragMove(e.x.delta);\n y.dragMove(e.y.delta);\n e.preventDefault();\n } else {\n e.touch.skip();\n }\n },\n\n end: function(e) {\n e.preventDefault();\n }\n });\n }\n });\n\n var TRANSFORM_STYLE = support.transitions.prefix + \"Transform\",\n translate;\n\n\n if (support.hasHW3D) {\n translate = function(x, y, scale) {\n return \"translate3d(\" + x + \"px,\" + y + \"px,0) scale(\" + scale + \")\";\n };\n } else {\n translate = function(x, y, scale) {\n return \"translate(\" + x + \"px,\" + y + \"px) scale(\" + scale + \")\";\n };\n }\n\n var Movable = Observable.extend({\n init: function(element) {\n var that = this;\n\n Observable.fn.init.call(that);\n\n that.element = $(element);\n that.element[0].style.webkitTransformOrigin = \"left top\";\n that.x = 0;\n that.y = 0;\n that.scale = 1;\n that._saveCoordinates(translate(that.x, that.y, that.scale));\n },\n\n translateAxis: function(axis, by) {\n this[axis] += by;\n this.refresh();\n },\n\n scaleTo: function(scale) {\n this.scale = scale;\n this.refresh();\n },\n\n scaleWith: function(scaleDelta) {\n this.scale *= scaleDelta;\n this.refresh();\n },\n\n translate: function(coordinates) {\n this.x += coordinates.x;\n this.y += coordinates.y;\n this.refresh();\n },\n\n moveAxis: function(axis, value) {\n this[axis] = value;\n this.refresh();\n },\n\n moveTo: function(coordinates) {\n extend(this, coordinates);\n this.refresh();\n },\n\n refresh: function() {\n var that = this,\n x = that.x,\n y = that.y,\n newCoordinates;\n\n if (that.round) {\n x = Math.round(x);\n y = Math.round(y);\n }\n\n newCoordinates = translate(x, y, that.scale);\n\n if (newCoordinates != that.coordinates) {\n if (kendo.support.browser.msie && kendo.support.browser.version < 10) {\n that.element[0].style.position = \"absolute\";\n that.element[0].style.left = that.x + \"px\";\n that.element[0].style.top = that.y + \"px\";\n\n } else {\n that.element[0].style[TRANSFORM_STYLE] = newCoordinates;\n }\n that._saveCoordinates(newCoordinates);\n that.trigger(CHANGE);\n }\n },\n\n _saveCoordinates: function(coordinates) {\n this.coordinates = coordinates;\n }\n });\n\n function destroyDroppable(collection, widget) {\n var groupName = widget.options.group,\n droppables = collection[groupName],\n i;\n\n Widget.fn.destroy.call(widget);\n\n if (droppables.length > 1) {\n for (i = 0; i < droppables.length; i++) {\n if (droppables[i] == widget) {\n droppables.splice(i, 1);\n break;\n }\n }\n } else {\n droppables.length = 0; // WTF, porting this from the previous destroyGroup\n delete collection[groupName];\n }\n }\n\n var DropTarget = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n var group = that.options.group;\n\n if (!(group in dropTargets)) {\n dropTargets[group] = [ that ];\n } else {\n dropTargets[group].push( that );\n }\n },\n\n events: [\n DRAGENTER,\n DRAGLEAVE,\n DROP\n ],\n\n options: {\n name: \"DropTarget\",\n group: \"default\"\n },\n\n destroy: function() {\n destroyDroppable(dropTargets, this);\n },\n\n _trigger: function(eventName, e) {\n var that = this,\n draggable = draggables[that.options.group];\n\n if (draggable) {\n return that.trigger(eventName, extend({}, e.event, {\n draggable: draggable,\n dropTarget: e.dropTarget\n }));\n }\n },\n\n _over: function(e) {\n this._trigger(DRAGENTER, e);\n },\n\n _out: function(e) {\n this._trigger(DRAGLEAVE, e);\n },\n\n _drop: function(e) {\n var that = this,\n draggable = draggables[that.options.group];\n\n if (draggable) {\n draggable.dropped = !that._trigger(DROP, e);\n }\n }\n });\n\n DropTarget.destroyGroup = function(groupName) {\n var group = dropTargets[groupName] || dropAreas[groupName],\n i;\n\n if (group) {\n for (i = 0; i < group.length; i++) {\n Widget.fn.destroy.call(group[i]);\n }\n\n group.length = 0;\n delete dropTargets[groupName];\n delete dropAreas[groupName];\n }\n };\n\n DropTarget._cache = dropTargets;\n\n var DropTargetArea = DropTarget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n var group = that.options.group;\n\n if (!(group in dropAreas)) {\n dropAreas[group] = [ that ];\n } else {\n dropAreas[group].push( that );\n }\n },\n\n destroy: function() {\n destroyDroppable(dropAreas, this);\n },\n\n options: {\n name: \"DropTargetArea\",\n group: \"default\",\n filter: null\n }\n });\n\n var Draggable = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n\n that._activated = false;\n\n if (this.options.clickMoveClick) {\n that.clickMoveClick = new ClickMoveClick(that.element, {\n global: true,\n filter: that.options.filter,\n start: that._startClickMoveClick.bind(that),\n move: that._drag.bind(that),\n end: that._end.bind(that),\n cancel: that._onCancel.bind(that)\n });\n }\n\n that.userEvents = new UserEvents(that.element, {\n global: true,\n allowSelection: true,\n filter: that.options.filter,\n threshold: that.options.distance,\n start: that._start.bind(that),\n hold: that._hold.bind(that),\n move: that._drag.bind(that),\n end: that._end.bind(that),\n cancel: that._onCancel.bind(that),\n select: that._select.bind(that)\n });\n\n if (kendo.support.touch) {\n that.element.find(that.options.filter).css('touch-action', 'none');\n }\n\n that._afterEndHandler = that._afterEnd.bind(that);\n that._captureEscape = that._captureEscape.bind(that);\n },\n\n events: [\n HOLD,\n DRAGSTART,\n DRAG,\n DRAGEND,\n DRAGCANCEL,\n HINTDESTROYED\n ],\n\n options: {\n name: \"Draggable\",\n distance: ( kendo.support.touch ? 0 : 5),\n group: \"default\",\n cursorOffset: null,\n axis: null,\n container: null,\n filter: null,\n ignore: null,\n holdToDrag: false,\n autoScroll: false,\n dropped: false,\n clickMoveClick: false\n },\n\n cancelHold: function() {\n this._activated = false;\n },\n\n _captureEscape: function(e) {\n var that = this;\n\n if (e.keyCode === kendo.keys.ESC) {\n that.userEvents.cancel();\n\n if (that.clickMoveClick) {\n that.clickMoveClick.cancel();\n }\n\n this._trigger(DRAGCANCEL, { event: e });\n }\n },\n\n _updateHint: function(e) {\n var that = this,\n coordinates,\n options = that.options,\n boundaries = that.boundaries,\n axis = options.axis,\n cursorOffset = that.options.cursorOffset;\n\n if (cursorOffset) {\n coordinates = { left: e.x.location + cursorOffset.left, top: e.y.location + cursorOffset.top };\n } else {\n if (e.x.delta !== 0 || e.y.delta !== 0) {\n that.hintOffset.left += e.x.delta;\n that.hintOffset.top += e.y.delta;\n coordinates = $.extend({}, that.hintOffset);\n } else {\n that.hintOffset.left = e.x.startLocation + e.x.initialDelta;\n that.hintOffset.top = e.y.startLocation + e.y.initialDelta;\n coordinates = $.extend({}, that.hintOffset);\n }\n }\n\n if (boundaries) {\n coordinates.top = within(coordinates.top, boundaries.y);\n coordinates.left = within(coordinates.left, boundaries.x);\n }\n\n if (axis === \"x\") {\n delete coordinates.top;\n } else if (axis === \"y\") {\n delete coordinates.left;\n }\n\n that.hint.css(coordinates);\n },\n\n _shouldIgnoreTarget: function(target) {\n var ignoreSelector = this.options.ignore;\n return ignoreSelector && $(target).is(ignoreSelector);\n },\n\n _select: function(e) {\n if (!this._shouldIgnoreTarget(e.event.target)) {\n e.preventDefault();\n }\n },\n\n _startClickMoveClick: function(e) {\n this._activated = true;\n\n this._start(e);\n },\n\n _start: function(e) {\n var that = this,\n options = that.options,\n container = options.container ? $(options.container) : null,\n hint = options.hint;\n\n if (this._shouldIgnoreTarget(e.touch.initialTouch) || (options.holdToDrag && !that._activated)) {\n that.userEvents.cancel();\n return;\n }\n\n that.currentTarget = e.target;\n that.currentTargetOffset = getOffset(that.currentTarget);\n\n if (hint) {\n if (that.hint) {\n that.hint.stop(true, true).remove();\n }\n\n that.hint = kendo.isFunction(hint) ? $(hint.call(that, that.currentTarget)) : hint;\n\n var offset = getOffset(that.currentTarget);\n that.hintOffset = offset;\n\n that.hint.css( {\n position: \"absolute\",\n zIndex: 20000, // the Window's z-index is 10000 and can be raised because of z-stacking\n left: offset.left,\n top: offset.top\n })\n .appendTo(document.body);\n\n that.angular(\"compile\", function() {\n that.hint.removeAttr(\"ng-repeat\");\n var scopeTarget = $(e.target);\n\n while (!scopeTarget.data(\"$$kendoScope\") && scopeTarget.length) {\n scopeTarget = scopeTarget.parent();\n }\n\n return {\n elements: that.hint.get(),\n scopeFrom: scopeTarget.data(\"$$kendoScope\")\n };\n });\n }\n\n draggables[options.group] = that;\n\n that.dropped = false;\n\n if (container) {\n that.boundaries = containerBoundaries(container, that.hint);\n }\n\n $(document).on(KEYUP, that._captureEscape);\n\n if (that._trigger(DRAGSTART, e)) {\n that.userEvents.cancel();\n\n if (that.clickMoveClick) {\n that.clickMoveClick.cancel();\n }\n\n that._afterEnd();\n }\n\n that.userEvents.capture();\n },\n\n _hold: function(e) {\n this.currentTarget = e.target;\n\n if (this._trigger(HOLD, e)) {\n this.userEvents.cancel();\n } else {\n this._activated = true;\n }\n },\n\n _drag: function(e) {\n e.preventDefault();\n\n var cursorElement = this._elementUnderCursor(e);\n\n if (this.options.autoScroll && this._cursorElement !== cursorElement) {\n this._scrollableParent = findScrollableParent(cursorElement);\n this._cursorElement = cursorElement;\n }\n\n this._lastEvent = e;\n this._processMovement(e, cursorElement);\n\n if (this.options.autoScroll) {\n // chrome seems to trigger mousemove when mouse is moved outside of the window (over the Chrome), too.\n if (this._scrollableParent[0]) {\n var velocity = autoScrollVelocity(e.x.location, e.y.location, scrollableViewPort(this._scrollableParent));\n\n\n this._scrollCompenstation = $.extend({}, this.hintOffset);\n this._scrollVelocity = velocity;\n\n if (velocity.y === 0 && velocity.x === 0) {\n clearInterval(this._scrollInterval);\n this._scrollInterval = null;\n } else if (!this._scrollInterval) {\n this._scrollInterval = setInterval(this._autoScroll.bind(this), 50);\n }\n }\n }\n\n if (this.hint) {\n this._updateHint(e);\n }\n },\n\n _processMovement: function(e, cursorElement) {\n this._withDropTarget(cursorElement, function(target, targetElement) {\n if (!target) {\n if (lastDropTarget) {\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n lastDropTarget = null;\n }\n return;\n }\n\n if (lastDropTarget) {\n if (targetElement === lastDropTarget.targetElement) {\n return;\n }\n\n lastDropTarget._trigger(DRAGLEAVE, extend(e, { dropTarget: $(lastDropTarget.targetElement) }));\n }\n\n target._trigger(DRAGENTER, extend(e, { dropTarget: $(targetElement) }));\n lastDropTarget = extend(target, { targetElement: targetElement });\n });\n\n this._trigger(DRAG, extend(e, { dropTarget: lastDropTarget, elementUnderCursor: cursorElement }));\n },\n\n _autoScroll: function() {\n var parent = this._scrollableParent[0],\n velocity = this._scrollVelocity,\n compensation = this._scrollCompenstation;\n\n if (!parent) {\n return;\n }\n\n var cursorElement = this._elementUnderCursor(this._lastEvent);\n this._processMovement(this._lastEvent, cursorElement);\n\n var yIsScrollable, xIsScrollable;\n\n var isRootNode = parent === scrollableRoot()[0];\n\n if (isRootNode) {\n yIsScrollable = document.body.scrollHeight > $window.height();\n xIsScrollable = document.body.scrollWidth > $window.width();\n } else {\n yIsScrollable = parent.offsetHeight <= parent.scrollHeight;\n xIsScrollable = parent.offsetWidth <= parent.scrollWidth;\n }\n\n var yDelta = parent.scrollTop + velocity.y;\n var yInBounds = yIsScrollable && yDelta > 0 && yDelta < parent.scrollHeight;\n\n var xDelta = parent.scrollLeft + velocity.x;\n var xInBounds = xIsScrollable && xDelta > 0 && xDelta < parent.scrollWidth;\n\n if (yInBounds) {\n parent.scrollTop += velocity.y;\n } else if (yIsScrollable && yDelta < 0) {\n parent.scrollTop = 0;\n }\n\n if (xInBounds) {\n parent.scrollLeft += velocity.x;\n } else if (xIsScrollable && xDelta < 0) {\n parent.scrollLeft = 0;\n }\n\n if (this.hint && isRootNode && (xInBounds || yInBounds)) {\n if (yInBounds) {\n compensation.top += velocity.y;\n }\n\n if (xInBounds) {\n compensation.left += velocity.x;\n }\n\n this.hint.css(compensation);\n }\n },\n\n _end: function(e) {\n this._withDropTarget(this._elementUnderCursor(e), function(target, targetElement) {\n if (target) {\n target._drop(extend({}, e, { dropTarget: $(targetElement) }));\n lastDropTarget = null;\n }\n });\n\n clearInterval(this._scrollInterval);\n this._scrollInterval = null;\n this._cancel(this._trigger(DRAGEND, e));\n },\n\n _onCancel: function(e) {\n this._cancel();\n this._trigger(DRAGCANCEL, { event: e });\n },\n\n _cancel: function(isDefaultPrevented) {\n var that = this;\n\n that._scrollableParent = null;\n this._cursorElement = null;\n clearInterval(this._scrollInterval);\n that._activated = false;\n\n if (that.hint && !that.dropped) {\n setTimeout(function() {\n that.hint.stop(true, true);\n\n if (isDefaultPrevented) {\n that._afterEndHandler();\n } else {\n that.hint.animate(that.currentTargetOffset, \"fast\", that._afterEndHandler);\n }\n }, 0);\n } else {\n that._afterEnd();\n }\n },\n\n _trigger: function(eventName, e) {\n var that = this;\n\n return that.trigger(\n eventName, extend(\n {},\n e.event,\n {\n x: e.x,\n y: e.y,\n currentTarget: that.currentTarget,\n initialTarget: e.touch ? e.touch.initialTouch : null,\n dropTarget: e.dropTarget,\n elementUnderCursor: e.elementUnderCursor,\n clickMoveClick: e.clickMoveClick\n }\n ));\n },\n\n _elementUnderCursor: function(e) {\n var target = elementUnderCursor(e),\n hint = this.hint;\n\n if (hint && contains(hint[0], target)) {\n hint.hide();\n target = elementUnderCursor(e);\n // IE8 does not return the element in iframe from first attempt\n if (!target) {\n target = elementUnderCursor(e);\n }\n hint.show();\n }\n\n return target;\n },\n\n _withDropTarget: function(element, callback) {\n var result,\n group = this.options.group,\n targets = dropTargets[group],\n areas = dropAreas[group];\n\n if (targets && targets.length || areas && areas.length) {\n result = checkTarget(element, targets, areas);\n\n if (result) {\n callback(result.target, result.targetElement);\n } else {\n callback();\n }\n }\n },\n\n destroy: function() {\n var that = this;\n\n Widget.fn.destroy.call(that);\n\n that._afterEnd();\n\n that.userEvents.destroy();\n\n if (that.clickMoveClick) {\n that.clickMoveClick.destroy();\n }\n\n this._scrollableParent = null;\n this._cursorElement = null;\n clearInterval(this._scrollInterval);\n\n that.currentTarget = null;\n },\n\n _afterEnd: function() {\n var that = this;\n\n if (that.hint) {\n that.hint.remove();\n }\n\n delete draggables[that.options.group];\n\n that.trigger(\"destroy\");\n that.trigger(HINTDESTROYED);\n $(document).off(KEYUP, that._captureEscape);\n }\n });\n\n kendo.ui.plugin(DropTarget);\n kendo.ui.plugin(DropTargetArea);\n kendo.ui.plugin(Draggable);\n kendo.TapCapture = TapCapture;\n kendo.containerBoundaries = containerBoundaries;\n\n extend(kendo.ui, {\n Pane: Pane,\n PaneDimensions: PaneDimensions,\n Movable: Movable\n });\n\n function scrollableViewPort(element) {\n var root = scrollableRoot()[0],\n offset,\n top,\n left;\n\n if (element[0] === root) {\n top = root.scrollTop;\n left = root.scrollLeft;\n\n return {\n top: top,\n left: left,\n bottom: top + $window.height(),\n right: left + $window.width()\n };\n } else {\n offset = element.offset();\n offset.bottom = offset.top + element.height();\n offset.right = offset.left + element.width();\n return offset;\n }\n }\n\n function scrollableRoot() {\n return $(kendo.support.browser.edge || kendo.support.browser.safari ? document.body : document.documentElement);\n }\n\n function findScrollableParent(element) {\n var root = scrollableRoot();\n\n if (!element || element === document.body || element === document.documentElement) {\n return root;\n }\n\n var parent = $(element)[0];\n\n while (parent && !kendo.isScrollable(parent) && parent !== document.body) {\n parent = parent.parentNode;\n }\n\n if (parent === document.body) {\n return root;\n }\n\n return $(parent);\n }\n\n function autoScrollVelocity(mouseX, mouseY, rect) {\n var velocity = { x: 0, y: 0 };\n\n var AUTO_SCROLL_AREA = 50;\n\n if (mouseX - rect.left < AUTO_SCROLL_AREA) {\n velocity.x = -(AUTO_SCROLL_AREA - (mouseX - rect.left));\n } else if (rect.right - mouseX < AUTO_SCROLL_AREA) {\n velocity.x = AUTO_SCROLL_AREA - (rect.right - mouseX);\n }\n\n if (mouseY - rect.top < AUTO_SCROLL_AREA) {\n velocity.y = -(AUTO_SCROLL_AREA - (mouseY - rect.top));\n } else if (rect.bottom - mouseY < AUTO_SCROLL_AREA) {\n velocity.y = AUTO_SCROLL_AREA - (rect.bottom - mouseY);\n }\n\n return velocity;\n }\n\n // export for testing\n kendo.ui.Draggable.utils = {\n autoScrollVelocity: autoScrollVelocity,\n scrollableViewPort: scrollableViewPort,\n findScrollableParent: findScrollableParent\n };\n\n })(window.kendo.jQuery);\n var kendo$5 = kendo;\n\n var __meta__$3 = {\n id: \"popup\",\n name: \"Pop-up\",\n category: \"framework\",\n depends: [ \"core\" ],\n advanced: true\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n ui = kendo.ui,\n Widget = ui.Widget,\n Class = kendo.Class,\n support = kendo.support,\n getOffset = kendo.getOffset,\n outerWidth = kendo._outerWidth,\n outerHeight = kendo._outerHeight,\n OPEN = \"open\",\n CLOSE = \"close\",\n DEACTIVATE = \"deactivate\",\n ACTIVATE = \"activate\",\n CENTER = \"center\",\n LEFT = \"left\",\n RIGHT = \"right\",\n TOP = \"top\",\n BOTTOM = \"bottom\",\n ABSOLUTE = \"absolute\",\n HIDDEN = \"hidden\",\n BODY = \"body\",\n LOCATION = \"location\",\n POSITION = \"position\",\n VISIBLE = \"visible\",\n EFFECTS = \"effects\",\n ACTIVE = \"k-active\",\n ACTIVEBORDER = \"k-state-border\",\n ACTIVEBORDERREGEXP = /k-state-border-(\\w+)/,\n ACTIVECHILDREN = \".k-picker-wrap, .k-dropdown-wrap, .k-link\",\n MOUSEDOWN = \"down\",\n DOCUMENT_ELEMENT = $(document.documentElement),\n WINDOW = $(window),\n SCROLL = \"scroll\",\n cssPrefix = support.transitions.css,\n TRANSFORM = cssPrefix + \"transform\",\n extend = $.extend,\n NS = \".kendoPopup\",\n styles = [\"font-size\",\n \"font-family\",\n \"font-stretch\",\n \"font-style\",\n \"font-weight\",\n \"line-height\"];\n\n function contains(container, target) {\n if (!container || !target) {\n return false;\n }\n return container === target || $.contains(container, target);\n }\n\n var Popup = Widget.extend({\n init: function(element, options) {\n var that = this, parentPopup;\n\n options = options || {};\n\n if (options.isRtl) {\n options.origin = options.origin || BOTTOM + \" \" + RIGHT;\n options.position = options.position || TOP + \" \" + RIGHT;\n }\n\n Widget.fn.init.call(that, element, options);\n\n element = that.element;\n options = that.options;\n\n that.collisions = options.collision ? options.collision.split(\" \") : [];\n that.downEvent = kendo.applyEventMap(MOUSEDOWN, kendo.guid());\n\n if (that.collisions.length === 1) {\n that.collisions.push(that.collisions[0]);\n }\n\n parentPopup = $(that.options.anchor).closest(\".k-popup,.k-group\").filter(\":not([class^=km-])\"); // When popup is in another popup, make it relative.\n\n options.appendTo = $($(options.appendTo)[0] || parentPopup[0] || document.body);\n\n that.element.hide()\n .addClass(\"k-popup\")\n .toggleClass(\"k-rtl\", !!options.isRtl)\n .appendTo(options.appendTo)\n .attr(\"aria-hidden\", true)\n .on(\"mouseenter\" + NS, function() {\n that._hovered = true;\n })\n .on(\"wheel\" + NS, function(e) {\n var list = $(e.target).find(\".k-list\");\n var scrollArea = list.parent();\n if (list.length && list.is(\":visible\") && ((scrollArea.scrollTop() === 0 && e.originalEvent.deltaY < 0) ||\n (scrollArea.scrollTop() === scrollArea.prop('scrollHeight') - scrollArea.prop('offsetHeight') && e.originalEvent.deltaY > 0))) {\n e.preventDefault();\n }\n })\n .on(\"mouseleave\" + NS, function() {\n that._hovered = false;\n });\n\n that.wrapper = $();\n\n if (options.animation === false) {\n options.animation = { open: { effects: {} }, close: { hide: true, effects: {} } };\n }\n\n extend(options.animation.open, {\n complete: function() {\n that.wrapper.addClass(\"k-animation-container-shown\"); // Forcing refresh causes flickering in mobile.\n that.wrapper.css(\"overflow\",\"\");\n that._activated = true;\n that._trigger(ACTIVATE);\n }\n });\n\n extend(options.animation.close, {\n complete: function() {\n that._animationClose();\n }\n });\n\n that._mousedownProxy = function(e) {\n that._mousedown(e);\n };\n\n if (support.mobileOS.android) {\n that._resizeProxy = function(e) {\n setTimeout(function() {\n that._resize(e);\n }, 600); //Logic from kendo.onResize\n };\n } else {\n that._resizeProxy = function(e) {\n that._resize(e);\n };\n }\n\n if (options.toggleTarget) {\n $(options.toggleTarget).on(options.toggleEvent + NS, that.toggle.bind(that));\n }\n },\n\n events: [\n OPEN,\n ACTIVATE,\n CLOSE,\n DEACTIVATE\n ],\n\n options: {\n name: \"Popup\",\n toggleEvent: \"click\",\n origin: BOTTOM + \" \" + LEFT,\n position: TOP + \" \" + LEFT,\n anchor: BODY,\n appendTo: null,\n collision: \"flip fit\",\n viewport: window,\n copyAnchorStyles: true,\n autosize: false,\n modal: false,\n adjustSize: {\n width: 0,\n height: 0\n },\n animation: {\n open: {\n effects: \"slideIn:down\",\n transition: true,\n duration: 200\n },\n close: { // if close animation effects are defined, they will be used instead of open.reverse\n duration: 100,\n hide: true\n }\n },\n omitOriginOffsets: false\n },\n\n _animationClose: function() {\n var that = this;\n var location = that.wrapper.data(LOCATION);\n\n that.wrapper.hide();\n\n if (location) {\n that.wrapper.css(location);\n }\n\n if (that.options.anchor != BODY) {\n that._hideDirClass();\n }\n\n that._closing = false;\n that._trigger(DEACTIVATE);\n },\n\n destroy: function() {\n var that = this,\n options = that.options,\n element = that.element.off(NS),\n parent;\n\n Widget.fn.destroy.call(that);\n\n if (options.toggleTarget) {\n $(options.toggleTarget).off(NS);\n }\n\n if (!options.modal) {\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n that._toggleResize(false);\n }\n\n kendo.destroy(that.element.children());\n element.removeData();\n\n if (options.appendTo[0] === document.body) {\n parent = element.closest(\".k-animation-container\");\n\n if (parent[0]) {\n parent.remove();\n } else {\n element.remove();\n }\n }\n },\n\n open: function(x, y) {\n var that = this,\n fixed = { isFixed: !isNaN(parseInt(y,10)), x: x, y: y },\n element = that.element,\n options = that.options,\n animation, wrapper,\n anchor = $(options.anchor),\n mobile = element[0] && element.hasClass(\"km-widget\"),\n listbox = element.find(\"[role='listbox']\"),\n parent;\n\n if (!that.visible()) {\n if (options.copyAnchorStyles) {\n if (mobile && styles[0] == \"font-size\") {\n styles.shift();\n }\n element.css(kendo.getComputedStyles(anchor[0], styles));\n }\n\n if (that.element.parent().data(\"animating\") || that._trigger(OPEN)) {\n return;\n }\n\n that._activated = false;\n\n if (!options.modal) {\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy)\n .on(that.downEvent, that._mousedownProxy);\n\n // this binding hangs iOS in editor\n // all elements in IE7/8 fire resize event, causing mayhem\n that._toggleResize(false);\n that._toggleResize(true);\n }\n\n that.wrapper = wrapper = kendo.wrap(element, options.autosize, options._resizeOnWrap)\n .css({\n overflow: HIDDEN,\n display: \"block\",\n position: ABSOLUTE\n })\n .attr(\"aria-hidden\", false);\n\n parent = element.parent();\n\n if (listbox.attr(\"aria-label\")) {\n wrapper.attr(\"aria-label\", listbox.attr(\"aria-label\"));\n } else if (listbox.attr(\"aria-labelledby\")) {\n wrapper.attr(\"aria-labelledby\", listbox.attr(\"aria-labelledby\"));\n }\n\n if (support.mobileOS.android) {\n parent.css(TRANSFORM, \"translatez(0)\"); // Android is VERY slow otherwise. Should be tested in other droids as well since it may cause blur.\n }\n\n wrapper.css(POSITION);\n\n if ($(options.appendTo)[0] == document.body) {\n wrapper.css(TOP, \"-10000px\");\n }\n\n that.flipped = that._position(fixed);\n animation = that._openAnimation();\n\n if (options.anchor != BODY && !that.element.hasClass(\"k-tooltip\")) {\n that._showDirClass(animation);\n }\n\n parent.hide();\n element.show();\n that.wrapper.show();\n\n parent.data(EFFECTS, animation.effects)\n .kendoStop(true)\n .kendoAnimate(animation);\n\n\n element.attr(\"aria-hidden\", false);\n }\n },\n\n _location: function(isFixed) {\n var that = this,\n element = that.element,\n options = that.options,\n wrapper,\n anchor = $(options.anchor),\n mobile = element[0] && element.hasClass(\"km-widget\");\n\n if (options.copyAnchorStyles) {\n if (mobile && styles[0] == \"font-size\") {\n styles.shift();\n }\n element.css(kendo.getComputedStyles(anchor[0], styles));\n }\n\n that.wrapper = wrapper = kendo.wrap(element, options.autosize)\n .css({\n overflow: HIDDEN,\n display: \"block\",\n position: ABSOLUTE\n });\n\n if (support.mobileOS.android) {\n wrapper.css(TRANSFORM, \"translatez(0)\"); // Android is VERY slow otherwise. Should be tested in other droids as well since it may cause blur.\n }\n\n wrapper.css(POSITION);\n\n if ($(options.appendTo)[0] == document.body) {\n wrapper.css(TOP, \"-10000px\");\n }\n\n that._position(isFixed || {});\n\n var offset = wrapper.offset();\n return {\n width: kendo._outerWidth(wrapper),\n height: kendo._outerHeight(wrapper),\n left: offset.left,\n top: offset.top\n };\n },\n\n _openAnimation: function() {\n var animation = extend(true, {}, this.options.animation.open);\n animation.effects = kendo.parseEffects(animation.effects, this.flipped);\n\n return animation;\n },\n\n _hideDirClass: function() {\n var anchor = $(this.options.anchor);\n var direction = ((anchor.attr(\"class\") || \"\").match(ACTIVEBORDERREGEXP) || [\"\", \"down\"])[1];\n var dirClass = ACTIVEBORDER + \"-\" + direction;\n\n anchor\n .removeClass(dirClass)\n .children(ACTIVECHILDREN)\n .removeClass(ACTIVE)\n .removeClass(dirClass);\n\n this.element.removeClass(ACTIVEBORDER + \"-\" + kendo.directions[direction].reverse);\n },\n\n _showDirClass: function(animation) {\n var direction = animation.effects.slideIn ? animation.effects.slideIn.direction : \"down\";\n var dirClass = ACTIVEBORDER + \"-\" + direction;\n\n $(this.options.anchor)\n .addClass(dirClass)\n .children(ACTIVECHILDREN)\n .addClass(ACTIVE)\n .addClass(dirClass);\n },\n\n position: function() {\n if (this.visible()) {\n this.flipped = this._position();\n //this._hideDirClass();\n //this._showDirClass(this._openAnimation());\n }\n },\n\n toggle: function() {\n var that = this;\n\n that[that.visible() ? CLOSE : OPEN]();\n },\n\n visible: function() {\n return this.wrapper.is(\":\" + VISIBLE) && this.element.is(\":\" + VISIBLE);\n },\n\n close: function(skipEffects) {\n var that = this,\n parent = that.element.parent(),\n options = that.options, wrap,\n animation, openEffects, closeEffects;\n\n if (that.visible()) {\n wrap = (that.wrapper[0] ? that.wrapper : kendo.wrap(that.element).hide());\n\n that.wrapper.removeClass(\"k-animation-container-shown\");\n that._toggleResize(false);\n\n if (that._closing || that._trigger(CLOSE)) {\n that._toggleResize(true);\n return;\n }\n\n // Close all inclusive popups.\n that.element.find(\".k-popup\").each(function() {\n var that = $(this),\n popup = that.data(\"kendoPopup\");\n\n if (popup) {\n popup.close(skipEffects);\n }\n });\n\n DOCUMENT_ELEMENT.off(that.downEvent, that._mousedownProxy);\n\n if (skipEffects) {\n animation = { hide: true, effects: {} };\n } else {\n animation = extend(true, {}, options.animation.close);\n openEffects = parent.data(EFFECTS);\n closeEffects = animation.effects;\n\n if (!closeEffects && !kendo.size(closeEffects) && openEffects && kendo.size(openEffects)) {\n animation.effects = openEffects;\n animation.reverse = true;\n }\n\n that._closing = true;\n }\n\n parent.kendoStop(true);\n that.element.attr(\"aria-hidden\", true);\n wrap\n .css({ overflow: HIDDEN }) // stop callback will remove hidden overflow\n .attr(\"aria-hidden\", true);\n parent.kendoAnimate(animation);\n\n if (skipEffects) {\n that._animationClose();\n }\n }\n },\n\n _trigger: function(ev) {\n return this.trigger(ev, { type: ev });\n },\n\n _resize: function(e) {\n var that = this;\n\n if (support.resize.indexOf(e.type) !== -1) {\n clearTimeout(that._resizeTimeout);\n that._resizeTimeout = setTimeout(function() {\n that._position();\n that._resizeTimeout = null;\n }, 50);\n } else {\n if (!that._hovered || (that._activated && that.element.find(\".k-list\").length > 0)) {\n that.close();\n }\n }\n },\n\n _toggleResize: function(toggle) {\n var method = toggle ? \"on\" : \"off\";\n var eventNames = support.resize;\n\n if (!(support.mobileOS.ios || support.mobileOS.android || support.browser.safari)) {\n eventNames += \" \" + SCROLL;\n }\n\n if (toggle && !this.scrollableParents) {\n this.scrollableParents = this._scrollableParents();\n }\n\n if (this.scrollableParents && this.scrollableParents.length) {\n this.scrollableParents[method](SCROLL, this._resizeProxy);\n }\n\n WINDOW[method](eventNames, this._resizeProxy);\n },\n\n _mousedown: function(e) {\n var that = this,\n container = that.element[0],\n options = that.options,\n anchor = $(options.anchor)[0],\n toggleTarget = options.toggleTarget,\n target = kendo.eventTarget(e),\n popup = $(target).closest(\".k-popup\"),\n mobile = popup.parent().parent(\".km-shim\").length;\n\n popup = popup[0];\n if (!mobile && popup && popup !== that.element[0]) {\n return;\n }\n\n // This MAY result in popup not closing in certain cases.\n if ($(e.target).closest(\"a\").data(\"rel\") === \"popover\") {\n return;\n }\n\n if (!contains(container, target) && !contains(anchor, target) && !(toggleTarget && contains($(toggleTarget)[0], target))) {\n that.close();\n }\n },\n\n _fit: function(position, size, viewPortSize) {\n var output = 0;\n\n if (position + size > viewPortSize) {\n output = viewPortSize - (position + size);\n }\n\n if (position < 0) {\n output = -position;\n }\n\n return output;\n },\n\n _flip: function(offset, size, anchorSize, viewPortSize, origin, position, boxSize) {\n var output = 0;\n boxSize = boxSize || size;\n\n if (position !== origin && position !== CENTER && origin !== CENTER) {\n if (offset + boxSize > viewPortSize) {\n output += -(anchorSize + size);\n }\n\n if (offset + output < 0) {\n output += anchorSize + size;\n }\n }\n return output;\n },\n\n _scrollableParents: function() {\n return $(this.options.anchor)\n .parentsUntil(\"body\")\n .filter(function(index, element) {\n return kendo.isScrollable(element);\n });\n },\n\n _position: function(fixed) {\n var that = this,\n //element = that.element.css(POSITION, \"\"), /* fixes telerik/kendo-ui-core#790, comes from telerik/kendo#615 */\n element = that.element,\n wrapper = that.wrapper,\n options = that.options,\n viewport = $(options.viewport),\n zoomLevel = support.zoomLevel(),\n isWindow = !!((viewport[0] == window) && window.innerWidth && (zoomLevel <= 1.02)),\n anchor = $(options.anchor),\n origins = options.origin.toLowerCase().split(\" \"),\n positions = options.position.toLowerCase().split(\" \"),\n collisions = that.collisions,\n siblingContainer, parents,\n parentZIndex, zIndex = 10002,\n idx = 0,\n docEl = document.documentElement,\n length, viewportOffset, viewportWidth, viewportHeight;\n\n if (options.viewport === window) {\n viewportOffset = {\n top: (window.pageYOffset || document.documentElement.scrollTop || 0),\n left: (window.pageXOffset || document.documentElement.scrollLeft || 0)\n };\n } else {\n viewportOffset = viewport.offset();\n }\n\n if (isWindow) {\n viewportWidth = window.innerWidth;\n viewportHeight = window.innerHeight;\n } else {\n viewportWidth = viewport.width();\n viewportHeight = viewport.height();\n }\n\n if (isWindow && docEl.scrollHeight - docEl.clientHeight > 0) {\n var sign = options.isRtl ? -1 : 1;\n\n viewportWidth -= sign * kendo.support.scrollbar();\n }\n\n siblingContainer = anchor.parents().filter(wrapper.siblings());\n\n if (siblingContainer[0]) {\n parentZIndex = Math.max(Number(siblingContainer.css(\"zIndex\")), 0);\n\n // set z-index to be more than that of the container/sibling\n // compensate with more units for window z-stack\n if (parentZIndex) {\n zIndex = parentZIndex + 10;\n } else {\n parents = anchor.parentsUntil(siblingContainer);\n for (length = parents.length; idx < length; idx++) {\n parentZIndex = Number($(parents[idx]).css(\"zIndex\"));\n if (parentZIndex && zIndex < parentZIndex) {\n zIndex = parentZIndex + 10;\n }\n }\n }\n }\n\n wrapper.css(\"zIndex\", zIndex);\n\n if (fixed && fixed.isFixed) {\n wrapper.css({ left: fixed.x, top: fixed.y });\n } else {\n wrapper.css(that._align(origins, positions));\n }\n\n var pos = getOffset(wrapper, POSITION, anchor[0] === wrapper.offsetParent()[0]),\n offset = getOffset(wrapper),\n anchorParent = anchor.offsetParent().parent(\".k-animation-container,.k-popup,.k-group\"); // If the parent is positioned, get the current positions\n\n if (anchorParent.length) {\n pos = getOffset(wrapper, POSITION, true);\n offset = getOffset(wrapper);\n }\n\n offset.top -= viewportOffset.top;\n offset.left -= viewportOffset.left;\n\n if (!that.wrapper.data(LOCATION)) { // Needed to reset the popup location after every closure - fixes the resize bugs.\n wrapper.data(LOCATION, extend({}, pos));\n }\n\n var offsets = extend({}, offset),\n location = extend({}, pos),\n adjustSize = options.adjustSize;\n\n if (collisions[0] === \"fit\") {\n location.top += that._fit(offsets.top, outerHeight(wrapper) + adjustSize.height, viewportHeight / zoomLevel);\n }\n\n if (collisions[1] === \"fit\") {\n location.left += that._fit(offsets.left, outerWidth(wrapper) + adjustSize.width, viewportWidth / zoomLevel);\n }\n\n var flipPos = extend({}, location);\n var elementHeight = outerHeight(element);\n var wrapperHeight = outerHeight(wrapper);\n\n if (!wrapper.height() && elementHeight) {\n wrapperHeight = wrapperHeight + elementHeight;\n }\n\n if (collisions[0] === \"flip\") {\n location.top += that._flip(offsets.top, elementHeight, outerHeight(anchor), viewportHeight / zoomLevel, origins[0], positions[0], wrapperHeight);\n }\n\n if (collisions[1] === \"flip\") {\n location.left += that._flip(offsets.left, outerWidth(element), outerWidth(anchor), viewportWidth / zoomLevel, origins[1], positions[1], outerWidth(wrapper));\n }\n\n wrapper.css(location);\n\n return (location.left != flipPos.left || location.top != flipPos.top);\n },\n\n _align: function(origin, position) {\n var that = this,\n element = that.wrapper,\n anchor = $(that.options.anchor),\n verticalOrigin = origin[0],\n horizontalOrigin = origin[1],\n verticalPosition = position[0],\n horizontalPosition = position[1],\n anchorOffset = getOffset(anchor),\n appendTo = $(that.options.appendTo),\n appendToOffset,\n width = outerWidth(element),\n height = outerHeight(element) || outerHeight(element.find(\".k-child-animation-container\").children().first()),\n anchorWidth = outerWidth(anchor),\n anchorHeight = outerHeight(anchor),\n top = that.options.omitOriginOffsets ? 0 : anchorOffset.top,\n left = that.options.omitOriginOffsets ? 0 : anchorOffset.left,\n round = Math.round;\n\n if (appendTo[0] != document.body) {\n appendToOffset = getOffset(appendTo);\n top -= appendToOffset.top;\n left -= appendToOffset.left;\n }\n\n\n if (verticalOrigin === BOTTOM) {\n top += anchorHeight;\n }\n\n if (verticalOrigin === CENTER) {\n top += round(anchorHeight / 2);\n }\n\n if (verticalPosition === BOTTOM) {\n top -= height;\n }\n\n if (verticalPosition === CENTER) {\n top -= round(height / 2);\n }\n\n if (horizontalOrigin === RIGHT) {\n left += anchorWidth;\n }\n\n if (horizontalOrigin === CENTER) {\n left += round(anchorWidth / 2);\n }\n\n if (horizontalPosition === RIGHT) {\n left -= width;\n }\n\n if (horizontalPosition === CENTER) {\n left -= round(width / 2);\n }\n\n return {\n top: top,\n left: left\n };\n }\n });\n\n ui.plugin(Popup);\n\n var stableSort = kendo.support.stableSort;\n var tabKeyTrapNS = \"kendoTabKeyTrap\";\n var focusableNodesSelector = \"a[href], area[href], input:not([disabled]), select:not([disabled]), textarea:not([disabled]), button:not([disabled]), iframe, object, embed, [tabindex], *[contenteditable]\";\n var TabKeyTrap = Class.extend({\n init: function(element, options) {\n this.element = $(element);\n this.element.autoApplyNS(tabKeyTrapNS);\n },\n\n trap: function() {\n this.element.on(\"keydown\", this._keepInTrap.bind(this));\n },\n\n removeTrap: function() {\n this.element.kendoDestroy(tabKeyTrapNS);\n },\n\n destroy: function() {\n this.element.kendoDestroy(tabKeyTrapNS);\n this.element = undefined$1;\n },\n\n shouldTrap: function() {\n return true;\n },\n\n _keepInTrap: function(e) {\n if (e.which !== 9 || !this.shouldTrap() || e.isDefaultPrevented()) {\n return;\n }\n\n var elements = this._focusableElements();\n var sortedElements = this._sortFocusableElements(elements);\n var next = this._nextFocusable(e, sortedElements);\n\n if (next) {\n this._focus(next);\n }\n\n e.preventDefault();\n },\n _focusableElements: function() {\n var elements = this.element.find(focusableNodesSelector).filter(function(i, item) {\n return item.tabIndex >= 0 && $(item).is(':visible') && !$(item).is('[disabled]');\n });\n\n if (this.element.is(\"[tabindex]\")) {\n elements.push(this.element[0]);\n }\n\n return elements;\n },\n _sortFocusableElements: function(elements) {\n var sortedElements;\n\n if (stableSort) {\n sortedElements = elements.sort(function(prev, next) {\n return prev.tabIndex - next.tabIndex;\n });\n } else {\n var attrName = \"__k_index\";\n elements.each(function(i, item) {\n item.setAttribute(attrName, i);\n });\n\n sortedElements = elements.sort(function(prev, next) {\n return prev.tabIndex === next.tabIndex ?\n parseInt(prev.getAttribute(attrName), 10) - parseInt(next.getAttribute(attrName), 10) :\n prev.tabIndex - next.tabIndex;\n });\n\n elements.removeAttr(attrName);\n }\n\n return sortedElements;\n },\n _nextFocusable: function(e, elements) {\n var count = elements.length;\n var current = elements.index(e.target);\n\n return elements.get((current + (e.shiftKey ? -1 : 1)) % count);\n },\n _focus: function(element) {\n if (element.nodeName == \"IFRAME\") {\n element.contentWindow.document.body.focus();\n return;\n }\n\n element.focus();\n\n if (element.nodeName == \"INPUT\" && element.setSelectionRange && this._haveSelectionRange(element)) {\n element.setSelectionRange(0, element.value.length);\n }\n },\n _haveSelectionRange: function(element) {\n var elementType = element.type.toLowerCase();\n\n return elementType === \"text\" || elementType === \"search\" ||\n elementType === \"url\" || elementType === \"tel\" ||\n elementType === \"password\";\n }\n });\n ui.Popup.TabKeyTrap = TabKeyTrap;\n })(window.kendo.jQuery);\n var kendo$4 = kendo;\n\n var __meta__$2 = {\n id: \"touch\",\n name: \"Touch\",\n category: \"mobile\",\n description: \"The kendo Touch widget provides a cross-platform compatible API for handling user-initiated touch events, multi-touch gestures and event sequences (drag, swipe, etc.). \",\n depends: [ \"core\", \"userevents\" ]\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n Widget = kendo.ui.Widget,\n abs = Math.abs,\n MAX_DOUBLE_TAP_DISTANCE = 20;\n\n var Touch = Widget.extend({\n init: function(element, options) {\n var that = this;\n\n Widget.fn.init.call(that, element, options);\n options = that.options;\n\n element = that.element;\n that.wrapper = element;\n\n function eventProxy(name) {\n return function(e) {\n that._triggerTouch(name, e);\n };\n }\n\n function gestureEventProxy(name) {\n return function(e) {\n that.trigger(name, { touches: e.touches, distance: e.distance, center: e.center, event: e.event });\n };\n }\n\n that.events = new kendo.UserEvents(element, {\n filter: options.filter,\n surface: options.surface,\n minHold: options.minHold,\n multiTouch: options.multiTouch,\n allowSelection: true,\n fastTap: options.fastTap,\n press: eventProxy(\"touchstart\"),\n hold: eventProxy(\"hold\"),\n tap: that._tap.bind(that),\n gesturestart: gestureEventProxy(\"gesturestart\"),\n gesturechange: gestureEventProxy(\"gesturechange\"),\n gestureend: gestureEventProxy(\"gestureend\")\n });\n\n if (options.enableSwipe) {\n that.events.bind(\"start\", that._swipestart.bind(that));\n that.events.bind(\"move\", that._swipemove.bind(that));\n } else {\n that.events.bind(\"start\", that._dragstart.bind(that));\n that.events.bind(\"move\", eventProxy(\"drag\"));\n that.events.bind(\"end\", eventProxy(\"dragend\"));\n }\n\n kendo.notify(that);\n },\n\n events: [\n \"touchstart\",\n \"dragstart\",\n \"drag\",\n \"dragend\",\n \"tap\",\n \"doubletap\",\n \"hold\",\n \"swipe\",\n \"gesturestart\",\n \"gesturechange\",\n \"gestureend\"\n ],\n\n options: {\n name: \"Touch\",\n surface: null,\n global: false,\n fastTap: false,\n filter: null,\n multiTouch: false,\n enableSwipe: false,\n minXDelta: 30,\n maxYDelta: 20,\n maxDuration: 1000,\n minHold: 800,\n doubleTapTimeout: 800\n },\n\n cancel: function() {\n this.events.cancel();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n\n this.events.destroy();\n },\n\n _triggerTouch: function(type, e) {\n if (this.trigger(type, { touch: e.touch, event: e.event })) {\n e.preventDefault();\n }\n },\n\n _tap: function(e) {\n var that = this,\n lastTap = that.lastTap,\n touch = e.touch;\n\n if (lastTap &&\n (touch.endTime - lastTap.endTime < that.options.doubleTapTimeout) &&\n kendo.touchDelta(touch, lastTap).distance < MAX_DOUBLE_TAP_DISTANCE\n ) {\n\n that._triggerTouch(\"doubletap\", e);\n that.lastTap = null;\n } else {\n that._triggerTouch(\"tap\", e);\n that.lastTap = touch;\n }\n },\n\n _dragstart: function(e) {\n this._triggerTouch(\"dragstart\", e);\n },\n\n _swipestart: function(e) {\n if (abs(e.x.velocity) * 2 >= abs(e.y.velocity)) {\n e.sender.capture();\n }\n },\n\n _swipemove: function(e) {\n var that = this,\n options = that.options,\n touch = e.touch,\n duration = e.event.timeStamp - touch.startTime,\n direction = touch.x.initialDelta > 0 ? \"right\" : \"left\";\n\n if (\n abs(touch.x.initialDelta) >= options.minXDelta &&\n abs(touch.y.initialDelta) < options.maxYDelta &&\n duration < options.maxDuration\n )\n {\n that.trigger(\"swipe\", {\n direction: direction,\n touch: e.touch\n });\n\n touch.cancel();\n }\n }\n });\n\n kendo.ui.plugin(Touch);\n })(window.kendo.jQuery);\n var kendo$3 = kendo;\n\n var __meta__$1 = {\n id: \"mobile.scroller\",\n name: \"Scroller\",\n category: \"mobile\",\n description: \"The Kendo Mobile Scroller widget enables touch friendly kinetic scrolling for the contents of a given DOM element.\",\n depends: [ \"fx\", \"draganddrop\" ]\n };\n\n (function($, undefined$1) {\n var kendo = window.kendo,\n mobile = kendo.mobile,\n fx = kendo.effects,\n ui = mobile.ui,\n extend = $.extend,\n Widget = ui.Widget,\n Class = kendo.Class,\n Movable = kendo.ui.Movable,\n Pane = kendo.ui.Pane,\n PaneDimensions = kendo.ui.PaneDimensions,\n Transition = fx.Transition,\n Animation = fx.Animation,\n abs = Math.abs,\n SNAPBACK_DURATION = 500,\n SCROLLBAR_OPACITY = 0.7,\n FRICTION = 0.96,\n VELOCITY_MULTIPLIER = 10,\n MAX_VELOCITY = 55,\n OUT_OF_BOUNDS_FRICTION = 0.5,\n ANIMATED_SCROLLER_PRECISION = 5,\n RELEASECLASS = \"km-scroller-release\",\n REFRESHCLASS = \"km-scroller-refresh\",\n PULL = \"pull\",\n CHANGE = \"change\",\n RESIZE = \"resize\",\n SCROLL = \"scroll\",\n MOUSE_WHEEL_ID = 2;\n\n var ZoomSnapBack = Animation.extend({\n init: function(options) {\n var that = this;\n Animation.fn.init.call(that);\n extend(that, options);\n\n that.userEvents.bind(\"gestureend\", that.start.bind(that));\n that.tapCapture.bind(\"press\", that.cancel.bind(that));\n },\n\n enabled: function() {\n return this.movable.scale < this.dimensions.minScale;\n },\n\n done: function() {\n return this.dimensions.minScale - this.movable.scale < 0.01;\n },\n\n tick: function() {\n var movable = this.movable;\n movable.scaleWith(1.1);\n this.dimensions.rescale(movable.scale);\n },\n\n onEnd: function() {\n var movable = this.movable;\n movable.scaleTo(this.dimensions.minScale);\n this.dimensions.rescale(movable.scale);\n }\n });\n\n var DragInertia = Animation.extend({\n init: function(options) {\n var that = this;\n\n Animation.fn.init.call(that);\n\n extend(that, options, {\n transition: new Transition({\n axis: options.axis,\n movable: options.movable,\n onEnd: function() { that._end(); }\n })\n });\n\n that.tapCapture.bind(\"press\", function() { that.cancel(); });\n that.userEvents.bind(\"end\", that.start.bind(that));\n that.userEvents.bind(\"gestureend\", that.start.bind(that));\n that.userEvents.bind(\"tap\", that.onEnd.bind(that));\n },\n\n onCancel: function() {\n this.transition.cancel();\n },\n\n freeze: function(location) {\n var that = this;\n that.cancel();\n that._moveTo(location);\n },\n\n onEnd: function() {\n var that = this;\n if (that.paneAxis.outOfBounds()) {\n that._snapBack();\n } else {\n that._end();\n }\n },\n\n done: function() {\n return abs(this.velocity) < 1;\n },\n\n start: function(e) {\n var that = this,\n velocity;\n\n if (!that.dimension.enabled) { return; }\n\n if (that.paneAxis.outOfBounds()) {\n if (that.transition._started) {\n that.transition.cancel();\n that.velocity = Math.min(e.touch[that.axis].velocity * that.velocityMultiplier, MAX_VELOCITY);\n\n Animation.fn.start.call(that);\n } else {\n that._snapBack();\n }\n } else {\n velocity = e.touch.id === MOUSE_WHEEL_ID ? 0 : e.touch[that.axis].velocity;\n that.velocity = Math.max(Math.min(velocity * that.velocityMultiplier, MAX_VELOCITY), -MAX_VELOCITY);\n\n that.tapCapture.captureNext();\n Animation.fn.start.call(that);\n }\n },\n\n tick: function() {\n var that = this,\n dimension = that.dimension,\n friction = that.paneAxis.outOfBounds() ? OUT_OF_BOUNDS_FRICTION : that.friction,\n delta = (that.velocity *= friction),\n location = that.movable[that.axis] + delta;\n\n if (!that.elastic && dimension.outOfBounds(location)) {\n location = Math.max(Math.min(location, dimension.max), dimension.min);\n that.velocity = 0;\n }\n\n that.movable.moveAxis(that.axis, location);\n },\n\n _end: function() {\n this.tapCapture.cancelCapture();\n this.end();\n },\n\n _snapBack: function() {\n var that = this,\n dimension = that.dimension,\n snapBack = that.movable[that.axis] > dimension.max ? dimension.max : dimension.min;\n that._moveTo(snapBack);\n },\n\n _moveTo: function(location) {\n this.transition.moveTo({ location: location, duration: SNAPBACK_DURATION, ease: Transition.easeOutExpo });\n }\n });\n\n var AnimatedScroller = Animation.extend({\n init: function(options) {\n var that = this;\n\n kendo.effects.Animation.fn.init.call(this);\n\n extend(that, options, {\n origin: {},\n destination: {},\n offset: {}\n });\n },\n\n tick: function() {\n this._updateCoordinates();\n this.moveTo(this.origin);\n },\n\n done: function() {\n return abs(this.offset.y) < ANIMATED_SCROLLER_PRECISION && abs(this.offset.x) < ANIMATED_SCROLLER_PRECISION;\n },\n\n onEnd: function() {\n this.moveTo(this.destination);\n if (this.callback) {\n this.callback.call();\n }\n },\n\n setCoordinates: function(from, to) {\n this.offset = {};\n this.origin = from;\n this.destination = to;\n },\n\n setCallback: function(callback) {\n if (callback && kendo.isFunction(callback)) {\n this.callback = callback;\n } else {\n callback = undefined$1;\n }\n },\n\n _updateCoordinates: function() {\n this.offset = {\n x: (this.destination.x - this.origin.x) / 4,\n y: (this.destination.y - this.origin.y) / 4\n };\n\n this.origin = {\n y: this.origin.y + this.offset.y,\n x: this.origin.x + this.offset.x\n };\n }\n });\n\n var ScrollBar = Class.extend({\n init: function(options) {\n var that = this,\n horizontal = options.axis === \"x\",\n element = $('
    ');\n\n if (horizontal) {\n element.attr(\"aria-orientation\", \"horizontal\");\n }\n\n extend(that, options, {\n element: element,\n elementSize: 0,\n movable: new Movable(element),\n scrollMovable: options.movable,\n alwaysVisible: options.alwaysVisible,\n size: horizontal ? \"width\" : \"height\"\n });\n\n that.scrollMovable.bind(CHANGE, that.refresh.bind(that));\n that.container.append(element);\n if (options.alwaysVisible) {\n that.show();\n }\n },\n\n refresh: function() {\n var that = this,\n axis = that.axis,\n dimension = that.dimension,\n paneSize = dimension.size,\n scrollMovable = that.scrollMovable,\n sizeRatio = paneSize / dimension.total,\n position = Math.round(-scrollMovable[axis] * sizeRatio),\n size = Math.round(paneSize * sizeRatio);\n\n if (sizeRatio >= 1) {\n this.element.css(\"display\", \"none\");\n } else {\n this.element.css(\"display\", \"\");\n }\n\n if (position + size > paneSize) {\n size = paneSize - position;\n } else if (position < 0) {\n size += position;\n position = 0;\n }\n\n if (that.elementSize != size) {\n that.element.css(that.size, size + \"px\");\n that.elementSize = size;\n }\n\n that._ariaValue(position, dimension.size - that.elementSize);\n\n that.movable.moveAxis(axis, position);\n },\n\n show: function() {\n this.element.css({ opacity: SCROLLBAR_OPACITY, visibility: \"visible\" });\n },\n\n hide: function() {\n if (!this.alwaysVisible) {\n this.element.css({ opacity: 0 });\n }\n },\n\n _ariaValue: function(current, total) {\n var element = this.element;\n\n if (current > total) {\n current = total;\n }\n\n element.attr(\"aria-valuemax\", total);\n element.attr(\"aria-valuenow\", current);\n }\n });\n\n var Scroller = Widget.extend({\n init: function(element, options) {\n var that = this;\n Widget.fn.init.call(that, element, options);\n\n element = that.element;\n\n that._native = that.options.useNative && kendo.support.hasNativeScrolling;\n if (that._native) {\n element.addClass(\"km-native-scroller\")\n .prepend('
    ');\n\n extend(that, {\n scrollElement: element,\n fixedContainer: element.children().first()\n });\n\n return;\n }\n\n element\n .css(\"overflow\", \"hidden\")\n .addClass(\"km-scroll-wrapper\")\n .wrapInner('
    ')\n .prepend('
    ');\n\n var inner = element.children().eq(1),\n\n tapCapture = new kendo.TapCapture(element),\n\n movable = new Movable(inner),\n\n dimensions = new PaneDimensions({\n element: inner,\n container: element,\n forcedEnabled: that.options.zoom\n }),\n\n avoidScrolling = this.options.avoidScrolling,\n\n userEvents = new kendo.UserEvents(element, {\n touchAction: \"pan-y\",\n fastTap: true,\n allowSelection: true,\n preventDragEvent: true,\n captureUpIfMoved: true,\n multiTouch: that.options.zoom,\n supportDoubleTap: that.options.supportDoubleTap,\n start: function(e) {\n dimensions.refresh();\n\n var velocityX = abs(e.x.velocity),\n velocityY = abs(e.y.velocity),\n horizontalSwipe = velocityX * 2 >= velocityY,\n originatedFromFixedContainer = $.contains(that.fixedContainer[0], e.event.target),\n verticalSwipe = velocityY * 2 >= velocityX;\n\n\n if (!originatedFromFixedContainer && !avoidScrolling(e) && that.enabled && (dimensions.x.enabled && horizontalSwipe || dimensions.y.enabled && verticalSwipe)) {\n userEvents.capture();\n } else {\n userEvents.cancel();\n }\n }\n }),\n\n pane = new Pane({\n movable: movable,\n dimensions: dimensions,\n userEvents: userEvents,\n elastic: that.options.elastic\n }),\n\n zoomSnapBack = new ZoomSnapBack({\n movable: movable,\n dimensions: dimensions,\n userEvents: userEvents,\n tapCapture: tapCapture\n }),\n\n animatedScroller = new AnimatedScroller({\n moveTo: function(coordinates) {\n that.scrollTo(coordinates.x, coordinates.y);\n }\n });\n\n movable.bind(CHANGE, function() {\n that.scrollTop = - movable.y;\n that.scrollLeft = - movable.x;\n\n that.trigger(SCROLL, {\n scrollTop: that.scrollTop,\n scrollLeft: that.scrollLeft\n });\n });\n\n if (that.options.mousewheelScrolling) {\n element.on(\"DOMMouseScroll mousewheel\", this._wheelScroll.bind(this));\n }\n\n extend(that, {\n movable: movable,\n dimensions: dimensions,\n zoomSnapBack: zoomSnapBack,\n animatedScroller: animatedScroller,\n userEvents: userEvents,\n pane: pane,\n tapCapture: tapCapture,\n pulled: false,\n enabled: true,\n scrollElement: inner,\n scrollTop: 0,\n scrollLeft: 0,\n fixedContainer: element.children().first()\n });\n\n that._initAxis(\"x\");\n that._initAxis(\"y\");\n\n // build closure\n that._wheelEnd = function() {\n that._wheel = false;\n that.userEvents.end(0, that._wheelY);\n };\n\n dimensions.refresh();\n\n if (that.options.pullToRefresh) {\n that._initPullToRefresh();\n }\n },\n\n _wheelScroll: function(e) {\n if (e.ctrlKey) {\n return;\n }\n\n if (!this._wheel) {\n this._wheel = true;\n this._wheelY = 0;\n this.userEvents.press(0, this._wheelY);\n }\n\n clearTimeout(this._wheelTimeout);\n this._wheelTimeout = setTimeout(this._wheelEnd, 50);\n\n var delta = kendo.wheelDeltaY(e);\n\n if (delta) {\n this._wheelY += delta;\n this.userEvents.move(0, this._wheelY);\n }\n\n e.preventDefault();\n },\n\n makeVirtual: function() {\n this.dimensions.y.makeVirtual();\n },\n\n virtualSize: function(min, max) {\n this.dimensions.y.virtualSize(min, max);\n },\n\n height: function() {\n return this.dimensions.y.size;\n },\n\n scrollHeight: function() {\n return this.scrollElement[0].scrollHeight;\n },\n\n scrollWidth: function() {\n return this.scrollElement[0].scrollWidth;\n },\n\n options: {\n name: \"Scroller\",\n zoom: false,\n pullOffset: 140,\n visibleScrollHints: false,\n elastic: true,\n useNative: false,\n mousewheelScrolling: true,\n avoidScrolling: function() { return false; },\n pullToRefresh: false,\n messages: {\n pullTemplate: \"Pull to refresh\",\n releaseTemplate: \"Release to refresh\",\n refreshTemplate: \"Refreshing\"\n }\n },\n\n events: [\n PULL,\n SCROLL,\n RESIZE\n ],\n\n _resize: function() {\n if (!this._native) {\n this.contentResized();\n }\n },\n\n setOptions: function(options) {\n var that = this;\n Widget.fn.setOptions.call(that, options);\n if (options.pullToRefresh) {\n that._initPullToRefresh();\n }\n },\n\n reset: function() {\n if (this._native) {\n this.scrollElement.scrollTop(0);\n } else {\n this.movable.moveTo({ x: 0, y: 0 });\n this._scale(1);\n }\n },\n\n contentResized: function() {\n this.dimensions.refresh();\n if (this.pane.x.outOfBounds()) {\n this.movable.moveAxis(\"x\", this.dimensions.x.min);\n }\n\n if (this.pane.y.outOfBounds()) {\n this.movable.moveAxis(\"y\", this.dimensions.y.min);\n }\n },\n\n zoomOut: function() {\n var dimensions = this.dimensions;\n dimensions.refresh();\n this._scale(dimensions.fitScale);\n this.movable.moveTo(dimensions.centerCoordinates());\n },\n\n enable: function() {\n this.enabled = true;\n },\n\n disable: function() {\n this.enabled = false;\n },\n\n scrollTo: function(x, y) {\n if (this._native) {\n kendo.scrollLeft(this.scrollElement, abs(x));\n this.scrollElement.scrollTop(abs(y));\n } else {\n this.dimensions.refresh();\n this.movable.moveTo({ x: x, y: y });\n }\n },\n\n animatedScrollTo: function(x, y, callback) {\n var from,\n to;\n\n if (this._native) {\n this.scrollTo(x, y);\n } else {\n from = { x: this.movable.x, y: this.movable.y };\n to = { x: x, y: y };\n\n this.animatedScroller.setCoordinates(from, to);\n this.animatedScroller.setCallback(callback);\n this.animatedScroller.start();\n }\n },\n\n pullHandled: function() {\n var that = this;\n that.refreshHint.removeClass(REFRESHCLASS);\n that.hintContainer.html(that.pullTemplate({}));\n that.yinertia.onEnd();\n that.xinertia.onEnd();\n that.userEvents.cancel();\n },\n\n destroy: function() {\n Widget.fn.destroy.call(this);\n if (this.userEvents) {\n this.userEvents.destroy();\n }\n },\n\n _scale: function(scale) {\n this.dimensions.rescale(scale);\n this.movable.scaleTo(scale);\n },\n\n _initPullToRefresh: function() {\n var that = this;\n\n that.dimensions.y.forceEnabled();\n that.pullTemplate = kendo.template(that.options.messages.pullTemplate);\n that.releaseTemplate = kendo.template(that.options.messages.releaseTemplate);\n that.refreshTemplate = kendo.template(that.options.messages.refreshTemplate);\n\n that.scrollElement.prepend('' + that.pullTemplate({}) + '');\n that.refreshHint = that.scrollElement.children().first();\n that.hintContainer = that.refreshHint.children(\".km-template\");\n\n that.pane.y.bind(\"change\", that._paneChange.bind(that));\n that.userEvents.bind(\"end\", that._dragEnd.bind(that));\n },\n\n _dragEnd: function() {\n var that = this;\n\n if (!that.pulled) {\n return;\n }\n\n that.pulled = false;\n that.refreshHint.removeClass(RELEASECLASS).addClass(REFRESHCLASS);\n that.hintContainer.html(that.refreshTemplate({}));\n that.yinertia.freeze(that.options.pullOffset / 2);\n that.trigger(\"pull\");\n },\n\n _paneChange: function() {\n var that = this;\n\n if (that.movable.y / OUT_OF_BOUNDS_FRICTION > that.options.pullOffset) {\n if (!that.pulled) {\n that.pulled = true;\n that.refreshHint.removeClass(REFRESHCLASS).addClass(RELEASECLASS);\n that.hintContainer.html(that.releaseTemplate({}));\n }\n } else if (that.pulled) {\n that.pulled = false;\n that.refreshHint.removeClass(RELEASECLASS);\n that.hintContainer.html(that.pullTemplate({}));\n }\n },\n\n _initAxis: function(axis) {\n var that = this,\n elementId = that.element.attr(\"id\"),\n movable = that.movable,\n dimension = that.dimensions[axis],\n tapCapture = that.tapCapture,\n paneAxis = that.pane[axis],\n scrollBar;\n\n if (!elementId) {\n elementId = kendo.guid();\n that.element.attr(\"id\", elementId);\n }\n\n scrollBar = new ScrollBar({\n axis: axis,\n movable: movable,\n dimension: dimension,\n container: that.element,\n alwaysVisible: that.options.visibleScrollHints,\n controlsId: elementId\n });\n\n dimension.bind(CHANGE, function() {\n scrollBar.refresh();\n });\n\n paneAxis.bind(CHANGE, function() {\n scrollBar.show();\n });\n\n that[axis + \"inertia\"] = new DragInertia({\n axis: axis,\n paneAxis: paneAxis,\n movable: movable,\n tapCapture: tapCapture,\n userEvents: that.userEvents,\n dimension: dimension,\n elastic: that.options.elastic,\n friction: that.options.friction || FRICTION,\n velocityMultiplier: that.options.velocityMultiplier || VELOCITY_MULTIPLIER,\n end: function() {\n scrollBar.hide();\n that.trigger(\"scrollEnd\", {\n axis: axis,\n scrollTop: that.scrollTop,\n scrollLeft: that.scrollLeft\n });\n }\n });\n }\n });\n\n ui.plugin(Scroller);\n })(window.kendo.jQuery);\n var kendo$2 = kendo;\n\n var __meta__ = {\n id: \"angular\",\n name: \"AngularJS Directives\",\n category: \"framework\",\n description: \"Adds Kendo UI for AngularJS directives\",\n depends: [ \"core\" ],\n defer: true\n };\n\n (function($, angular, undefined$1) {\n \"use strict\";\n\n // Angular2 exposes a global angular object, but it does not have an injector...\n if (!angular || !angular.injector) {\n return;\n }\n\n\n var module = angular.module('kendo.directives', []),\n $injector = angular.injector(['ng']),\n $parse = $injector.get('$parse'),\n $timeout = $injector.get('$timeout'),\n $defaultCompile,\n $log = $injector.get('$log');\n\n function withoutTimeout(f) {\n var save = $timeout;\n try {\n $timeout = function(f) { return f(); };\n return f();\n } finally {\n $timeout = save;\n }\n }\n\n var OPTIONS_NOW;\n\n var createDataSource = (function() {\n var types = {\n TreeList: 'TreeListDataSource',\n TreeView: 'HierarchicalDataSource',\n Scheduler: 'SchedulerDataSource',\n PivotGrid: 'PivotDataSource',\n PivotConfigurator: 'PivotDataSource',\n PanelBar: 'HierarchicalDataSource',\n Menu: \"$PLAIN\",\n ContextMenu: \"$PLAIN\"\n };\n var toDataSource = function(dataSource, type) {\n if (type == '$PLAIN') {\n return dataSource;\n }\n return kendo.data[type].create(dataSource);\n };\n return function(scope, element, role, source) {\n var type = types[role] || 'DataSource';\n var current = scope.$eval(source);\n var ds = toDataSource(current, type);\n\n scope.$watch(source, function(mew) {\n var widget = kendoWidgetInstance(element);\n\n if (widget && typeof widget.setDataSource == \"function\") {\n if (mew !== current && mew !== widget.dataSource) {\n var ds = toDataSource(mew, type);\n widget.setDataSource(ds);\n current = mew;\n }\n }\n });\n return ds;\n };\n }());\n\n var ignoredAttributes = {\n kDataSource: true,\n kOptions: true,\n kRebind: true,\n kNgModel: true,\n kNgDelay: true\n };\n\n var ignoredOwnProperties = {\n // XXX: other names to ignore here?\n name: true,\n title: true,\n style: true\n };\n\n function createWidget(scope, element, attrs, widget, origAttr, controllers) {\n\n if (!(element instanceof jQuery)) {\n throw new Error(\"The Kendo UI directives require jQuery to be available before AngularJS. Please include jquery before angular in the document.\");\n }\n\n var kNgDelay = attrs.kNgDelay,\n delayValue = scope.$eval(kNgDelay);\n\n controllers = controllers || [];\n\n var ngModel = controllers[0],\n ngForm = controllers[1];\n\n var ctor = $(element)[widget];\n\n if (!ctor) {\n window.console.error(\"Could not find: \" + widget);\n return null;\n }\n\n var parsed = parseOptions(scope, element, attrs, widget, ctor);\n\n var options = parsed.options;\n\n if (parsed.unresolved.length) {\n var promises = [];\n\n for (var i = 0, len = parsed.unresolved.length; i < len; i++) {\n\n var unresolved = parsed.unresolved[i];\n\n var promise = $.Deferred(function(d) {\n var unwatch = scope.$watch(unresolved.path, function(newValue) {\n if (newValue !== undefined$1) {\n unwatch();\n d.resolve();\n }\n });\n }).promise();\n\n promises.push(promise);\n }\n\n $.when.apply(null, promises).then(createIt);\n\n return;\n }\n\n if (kNgDelay && !delayValue) {\n var root = scope.$root || scope;\n\n var register = function() {\n var unregister = scope.$watch(kNgDelay, function(newValue) {\n if (newValue !== undefined$1) {\n unregister();\n // remove subsequent delays, to make ng-rebind work\n element.removeAttr(attrs.$attr.kNgDelay);\n kNgDelay = null;\n $timeout(createIt); // XXX: won't work without `timeout` ;-\\\n }\n });\n };\n\n // WARNING: the watchers should be registered in the digest cycle.\n // the fork here is for the timeout/non-timeout initiated widgets.\n if (/^\\$(digest|apply)$/.test(root.$$phase)) {\n register();\n } else {\n scope.$apply(register);\n }\n\n return;\n } else {\n return createIt();\n }\n\n function createIt() {\n var originalElement;\n\n if (attrs.kRebind) {\n originalElement = $($(element)[0].cloneNode(true));\n }\n\n // re-parse the options here.\n options = parseOptions(scope, element, attrs, widget, ctor).options;\n\n if (element.is(\"select\")) {\n (function(options) {\n if (options.length > 0) {\n var first = $(options[0]);\n if (!/\\S/.test(first.text()) && /^\\?/.test(first.val())) {\n first.remove();\n }\n\n for (var i = 0; i < options.length; i++) {\n $(options[i]).off(\"$destroy\");\n }\n }\n }(element[0].options));\n }\n\n var object = ctor.call(element, OPTIONS_NOW = options).data(widget);\n\n exposeWidget(object, scope, attrs, widget, origAttr);\n\n scope.$emit(\"kendoWidgetCreated\", object);\n\n var destroyRegister = destroyWidgetOnScopeDestroy(scope, object);\n\n if (attrs.kRebind) {\n setupRebind(object, scope, element, originalElement, attrs.kRebind, destroyRegister, attrs);\n }\n\n if (attrs.kNgDisabled) {\n var kNgDisabled = attrs.kNgDisabled;\n var isDisabled = scope.$eval(kNgDisabled);\n if (isDisabled) {\n object.enable(!isDisabled);\n }\n bindToKNgDisabled(object, scope, element, kNgDisabled);\n }\n\n if (attrs.kNgReadonly) {\n var kNgReadonly = attrs.kNgReadonly;\n var isReadonly = scope.$eval(kNgReadonly);\n if (isReadonly) {\n object.readonly(isReadonly);\n }\n bindToKNgReadonly(object, scope, element, kNgReadonly);\n }\n\n // kNgModel is used for the \"logical\" value\n if (attrs.kNgModel) {\n bindToKNgModel(object, scope, attrs.kNgModel);\n }\n\n // 2 way binding: ngModel <-> widget.value()\n if (ngModel) {\n bindToNgModel(object, scope, element, ngModel, ngForm);\n }\n\n if (object) {\n propagateClassToWidgetWrapper(object, element);\n }\n\n return object;\n }\n }\n\n\n function parseOptions(scope, element, attrs, widget, ctor) {\n var role = widget.replace(/^kendo/, '');\n var unresolved = [];\n var optionsPath = attrs.kOptions || attrs.options;\n var optionsValue = scope.$eval(optionsPath);\n\n if (optionsPath && optionsValue === undefined$1) {\n unresolved.push({ option: \"options\", path: optionsPath });\n }\n\n var options = angular.extend({}, attrs.defaultOptions, optionsValue);\n\n function addOption(name, value) {\n var scopeValue = angular.copy(scope.$eval(value));\n if (scopeValue === undefined$1) {\n unresolved.push({ option: name, path: value });\n } else {\n options[name] = scopeValue;\n }\n }\n\n\n var widgetOptions = ctor.widget.prototype.options;\n var widgetEvents = ctor.widget.prototype.events;\n\n\n $.each(attrs, function(name, value) {\n if (name === \"source\" || name === \"kDataSource\" || name === \"kScopeField\" || name === \"scopeField\") {\n return;\n }\n\n var dataName = \"data\" + name.charAt(0).toUpperCase() + name.slice(1);\n\n if (name.indexOf(\"on\") === 0) { // let's search for such event.\n var eventKey = name.replace(/^on./, function(prefix) {\n return prefix.charAt(2).toLowerCase();\n });\n\n if (widgetEvents.indexOf(eventKey) > -1) {\n options[eventKey] = value;\n }\n } // don't elsif here - there are on* options\n\n if (widgetOptions.hasOwnProperty(dataName)) {\n addOption(dataName, value);\n } else if (widgetOptions.hasOwnProperty(name) && !ignoredOwnProperties[name]) {\n addOption(name, value);\n } else if (!ignoredAttributes[name]) {\n var match = name.match(/^k(On)?([A-Z].*)/);\n if (match) {\n var optionName = match[2].charAt(0).toLowerCase() + match[2].slice(1);\n if (match[1] && name != \"kOnLabel\" // XXX: k-on-label can be used on MobileSwitch :-\\\n ) {\n options[optionName] = value;\n } else {\n if (name == \"kOnLabel\") {\n optionName = \"onLabel\"; // XXX: that's awful.\n }\n addOption(optionName, value);\n }\n }\n }\n });\n\n // parse the datasource attribute\n var dataSource = attrs.kDataSource || attrs.source;\n\n if (dataSource) {\n options.dataSource = createDataSource(scope, element, role, dataSource);\n }\n\n // deepExtend in kendo.core (used in Editor) will fail with stack\n // overflow if we don't put it in an array :-\\\n options.$angular = [ scope ];\n\n return {\n options: options,\n unresolved: unresolved\n };\n }\n\n function bindToKNgDisabled(widget, scope, element, kNgDisabled) {\n if ((kendo.ui.PanelBar && widget instanceof kendo.ui.PanelBar) || (kendo.ui.Menu && widget instanceof kendo.ui.Menu)) {\n $log.warn(\"k-ng-disabled specified on a widget that does not have the enable() method: \" + (widget.options.name));\n return;\n }\n scope.$watch(kNgDisabled, function(newValue, oldValue) {\n if (newValue != oldValue) {\n widget.enable(!newValue);\n }\n });\n }\n\n function bindToKNgReadonly(widget, scope, element, kNgReadonly) {\n if (typeof widget.readonly != \"function\") {\n $log.warn(\"k-ng-readonly specified on a widget that does not have the readonly() method: \" + (widget.options.name));\n return;\n }\n scope.$watch(kNgReadonly, function(newValue, oldValue) {\n if (newValue != oldValue) {\n widget.readonly(newValue);\n }\n });\n }\n\n function exposeWidget(widget, scope, attrs, kendoWidget, origAttr) {\n if (attrs[origAttr]) {\n var set = $parse(attrs[origAttr]).assign;\n if (set) {\n // set the value of the expression to the kendo widget object to expose its api\n set(scope, widget);\n } else {\n throw new Error(origAttr + ' attribute used but expression in it is not assignable: ' + attrs[kendoWidget]);\n }\n }\n }\n\n function formValue(element) {\n if (/checkbox|radio/i.test(element.attr(\"type\"))) {\n return element.prop(\"checked\");\n }\n return element.val();\n }\n\n var formRegExp = /^(input|select|textarea)$/i;\n\n function isForm(element) {\n return formRegExp.test(element[0].tagName);\n }\n\n function bindToNgModel(widget, scope, element, ngModel, ngForm) {\n if (!widget.value) {\n return;\n }\n\n var value;\n // Some widgets trigger \"change\" on the input field\n // and this would result in two events sent (#135)\n var haveChangeOnElement = false;\n\n if (isForm(element)) {\n value = function() {\n return formValue(element);\n };\n } else {\n value = function() {\n return widget.value();\n };\n }\n\n // Angular will invoke $render when the view needs to be updated with the view value.\n var viewRender = function() {\n // Update the widget with the view value.\n\n // delaying with setTimout for cases where the datasource is set thereafter.\n // https://github.com/kendo-labs/angular-kendo/issues/304\n var val = ngModel.$viewValue;\n if (val === undefined$1) {\n val = ngModel.$modelValue;\n }\n\n if (val === undefined$1) {\n val = null;\n }\n\n haveChangeOnElement = true;\n setTimeout(function() {\n haveChangeOnElement = false;\n if (widget) { // might have been destroyed in between. :-(\n var kNgModel = scope[widget.element.attr(\"k-ng-model\")];\n\n if (kNgModel) {\n val = kNgModel;\n }\n\n if (widget.options.autoBind === false && !widget.listView.bound()) {\n if (val) {\n widget.value(val);\n }\n } else {\n widget.value(val);\n }\n }\n }, 0);\n };\n\n ngModel.$render = viewRender;\n setTimeout(function() {\n if (ngModel.$render !== viewRender) {\n ngModel.$render = viewRender;\n ngModel.$render();\n }\n });\n\n if (isForm(element)) {\n element.on(\"change\", function() {\n haveChangeOnElement = true;\n });\n }\n\n var onChange = function(pristine) {\n return function() {\n var formPristine;\n if (haveChangeOnElement && !element.is(\"select\")) {\n return;\n }\n if (pristine && ngForm) {\n formPristine = ngForm.$pristine;\n }\n ngModel.$setViewValue(value());\n if (pristine) {\n ngModel.$setPristine();\n if (formPristine) {\n ngForm.$setPristine();\n }\n }\n digest(scope);\n };\n };\n\n widget.first(\"change\", onChange(false));\n widget.first(\"spin\", onChange(false));\n\n if (!(kendo.ui.AutoComplete && widget instanceof kendo.ui.AutoComplete)) {\n widget.first(\"dataBound\", onChange(true));\n }\n\n var currentVal = value();\n\n // if the model value is undefined, then we set the widget value to match ( == null/undefined )\n // In telerik/kendo-ui-core#1027 we discovered that after the timeout the $viewValue arives as NaN in some weird, default form.\n // Hence the check below.\n if (!isNaN(ngModel.$viewValue) && currentVal != ngModel.$viewValue) {\n if (!ngModel.$isEmpty(ngModel.$viewValue)) {\n widget.value(ngModel.$viewValue);\n } else if (currentVal != null && currentVal !== \"\" && currentVal != ngModel.$viewValue) {\n ngModel.$setViewValue(currentVal);\n }\n }\n\n ngModel.$setPristine();\n }\n\n function bindToKNgModel(widget, scope, kNgModel) {\n if (kendo.ui.DateRangePicker && widget instanceof kendo.ui.DateRangePicker) {\n var rangePickerModels = kNgModel.split(\",\");\n var rangePickerStartModel = rangePickerModels[0].trim();\n var rangePickerEndModel;\n\n bindToKNgModel(widget._startDateInput, scope, rangePickerStartModel);\n if (rangePickerModels[1]) {\n rangePickerEndModel = rangePickerModels[1].trim();\n bindToKNgModel(widget._endDateInput, scope, rangePickerEndModel);\n widget.range({ start: scope[rangePickerStartModel], end: scope[rangePickerEndModel] });\n } else {\n widget.range({ start: scope[rangePickerStartModel], end: null });\n }\n\n return;\n }\n\n if (typeof widget.value != \"function\") {\n $log.warn(\"k-ng-model specified on a widget that does not have the value() method: \" + (widget.options.name));\n return;\n }\n\n var form = $(widget.element).parents(\"ng-form, form\").first();\n var ngForm = kendo.getter(form.attr(\"name\"), true)(scope);\n var getter = $parse(kNgModel);\n var setter = getter.assign;\n var updating = false;\n\n var valueIsCollection = kendo.ui.MultiSelect && widget instanceof kendo.ui.MultiSelect ||\n kendo.ui.RangeSlider && widget instanceof kendo.ui.RangeSlider;\n\n var length = function(value) {\n //length is irrelevant when value is not collection\n return value && valueIsCollection ? value.length : 0;\n };\n\n var currentValueLength = length(getter(scope));\n\n widget.$angular_setLogicValue(getter(scope));\n\n // keep in sync\n var watchHandler = function(newValue, oldValue) {\n if (newValue === undefined$1) {\n // because widget's value() method usually checks if the new value is undefined,\n // in which case it returns the current value rather than clearing the field.\n // https://github.com/telerik/kendo-ui-core/issues/299\n newValue = null;\n }\n\n //compare values by reference if a collection\n if (updating || (newValue == oldValue && length(newValue) == currentValueLength)) {\n return;\n }\n\n currentValueLength = length(newValue);\n widget.$angular_setLogicValue(newValue);\n };\n\n if (valueIsCollection) {\n scope.$watchCollection(kNgModel, watchHandler);\n } else {\n scope.$watch(kNgModel, watchHandler);\n }\n\n var changeHandler = function() {\n updating = true;\n\n if (ngForm && ngForm.$pristine) {\n ngForm.$setDirty();\n }\n\n digest(scope, function() {\n setter(scope, widget.$angular_getLogicValue());\n currentValueLength = length(getter(scope));\n });\n\n updating = false;\n };\n\n widget.first(\"change\", changeHandler);\n widget.first(\"spin\", changeHandler);\n }\n\n function destroyWidgetOnScopeDestroy(scope, widget) {\n var deregister = scope.$on(\"$destroy\", function() {\n deregister();\n if (widget) {\n kendo.destroy(widget.element);\n widget = null;\n }\n });\n\n return deregister;\n }\n\n // mutation observers - propagate the original\n // element's class to the widget wrapper.\n function propagateClassToWidgetWrapper(widget, element) {\n if (!(window.MutationObserver && widget.wrapper)) {\n return;\n }\n\n var prevClassList = [].slice.call($(element)[0].classList);\n\n var mo = new MutationObserver(function(changes) {\n suspend(); // make sure we don't trigger a loop\n if (!widget) {\n return;\n }\n\n changes.forEach(function(chg) {\n var w = $(widget.wrapper)[0];\n switch (chg.attributeName) {\n\n case \"class\":\n // sync classes to the wrapper element\n var currClassList = [].slice.call(chg.target.classList);\n currClassList.forEach(function(cls) {\n if (prevClassList.indexOf(cls) < 0) {\n w.classList.add(cls);\n if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) { // https://github.com/kendo-labs/angular-kendo/issues/356\n widget.input[0].classList.add(cls);\n }\n }\n });\n prevClassList.forEach(function(cls) {\n if (currClassList.indexOf(cls) < 0) {\n w.classList.remove(cls);\n if (kendo.ui.ComboBox && widget instanceof kendo.ui.ComboBox) { // https://github.com/kendo-labs/angular-kendo/issues/356\n widget.input[0].classList.remove(cls);\n }\n }\n });\n prevClassList = currClassList;\n break;\n\n case \"disabled\":\n if (typeof widget.enable == \"function\" && !widget.element.attr(\"readonly\")) {\n widget.enable(!$(chg.target).attr(\"disabled\"));\n }\n break;\n\n case \"readonly\":\n if (typeof widget.readonly == \"function\" && !widget.element.attr(\"disabled\")) {\n widget.readonly(!!$(chg.target).attr(\"readonly\"));\n }\n break;\n }\n });\n\n resume();\n });\n\n function suspend() {\n mo.disconnect();\n }\n\n function resume() {\n mo.observe($(element)[0], { attributes: true });\n }\n\n resume();\n widget.first(\"destroy\", suspend);\n }\n\n function setupRebind(widget, scope, element, originalElement, rebindAttr, destroyRegister, attrs) {\n // watch for changes on the expression passed in the k-rebind attribute\n var unregister = scope.$watch(rebindAttr, function(newValue, oldValue) {\n if (!widget._muteRebind && newValue !== oldValue) {\n unregister(); // this watcher will be re-added if we compile again!\n\n if (attrs._cleanUp) {\n attrs._cleanUp();\n }\n\n var templateOptions = WIDGET_TEMPLATE_OPTIONS[widget.options.name];\n\n if (templateOptions) {\n templateOptions.forEach(function(name) {\n var templateContents = scope.$eval(attrs[\"k\" + name]);\n\n if (templateContents) {\n originalElement.append($(templateContents).attr(kendo.toHyphens(\"k\" + name), \"\"));\n }\n });\n }\n\n var _wrapper = $(widget.wrapper)[0];\n var _element = $(widget.element)[0];\n var isUpload = widget.options.name === \"Upload\";\n\n if (isUpload) {\n element = $(_element);\n }\n\n var compile = element.injector().get(\"$compile\");\n widget._destroy();\n\n if (destroyRegister) {\n destroyRegister();\n }\n\n widget = null;\n\n if (_element) {\n if (_wrapper) {\n _wrapper.parentNode.replaceChild(_element, _wrapper);\n }\n $(element).replaceWith(originalElement);\n }\n\n compile(originalElement)(scope);\n }\n }, true); // watch for object equality. Use native or simple values.\n digest(scope);\n }\n\n function bind(f, obj) {\n return function(a, b) {\n return f.call(obj, a, b);\n };\n }\n\n function setTemplate(key, value) {\n this[key] = kendo.stringify(value);\n }\n\n module.factory('directiveFactory', [ '$compile', function(compile) {\n var kendoRenderedTimeout;\n var RENDERED = false;\n\n // caching $compile for the dirty hack upstairs. This is awful, but we happen to have elements outside of the bootstrapped root :(.\n $defaultCompile = compile;\n\n var create = function(role, origAttr) {\n return {\n // Parse the directive for attributes and classes\n restrict: \"AC\",\n require: [ \"?ngModel\", \"^?form\" ],\n scope: false,\n\n controller: [ '$scope', '$attrs', '$element', function($scope, $attrs) {\n this.template = bind(setTemplate, $attrs);\n $attrs._cleanUp = bind(function() {\n this.template = null;\n $attrs._cleanUp = null;\n }, this);\n }],\n\n link: function(scope, element, attrs, controllers) {\n var $element = $(element);\n\n // we must remove data-kendo-widget-name attribute because\n // it breaks kendo.widgetInstance; can generate all kinds\n // of funny issues like\n //\n // https://github.com/kendo-labs/angular-kendo/issues/167\n //\n // but we still keep the attribute without the\n // `data-` prefix, so k-rebind would work.\n var roleattr = role.replace(/([A-Z])/g, \"-$1\");\n\n $element.attr(roleattr, $element.attr(\"data-\" + roleattr));\n $element[0].removeAttribute(\"data-\" + roleattr);\n\n var widget = createWidget(scope, element, attrs, role, origAttr, controllers);\n\n if (!widget) {\n return;\n }\n\n if (kendoRenderedTimeout) {\n clearTimeout(kendoRenderedTimeout);\n }\n\n kendoRenderedTimeout = setTimeout(function() {\n scope.$emit(\"kendoRendered\");\n if (!RENDERED) {\n RENDERED = true;\n $(\"form\").each(function() {\n var form = $(this).controller(\"form\");\n if (form) {\n form.$setPristine();\n }\n });\n }\n });\n }\n };\n };\n\n return {\n create: create\n };\n }]);\n\n var TAGNAMES = {\n Editor: \"textarea\",\n NumericTextBox: \"input\",\n DatePicker: \"input\",\n DateTimePicker: \"input\",\n TimePicker: \"input\",\n AutoComplete: \"input\",\n ColorPicker: \"input\",\n MaskedTextBox: \"input\",\n MultiSelect: \"input\",\n Upload: \"input\",\n Validator: \"form\",\n Button: \"button\",\n ListView: \"ul\",\n ScrollView: \"div\",\n PanelBar: \"ul\",\n TreeView: \"ul\",\n Menu: \"ul\",\n ContextMenu: \"ul\",\n ActionSheet: \"ul\",\n Switch: \"input\"\n };\n\n var SKIP_SHORTCUTS = [];\n\n var MANUAL_DIRECTIVES = [];\n\n angular.forEach(['MobileScroller'], function(widget) {\n MANUAL_DIRECTIVES.push(widget);\n widget = \"kendo\" + widget;\n module.directive(widget, function() {\n return {\n restrict: \"A\",\n link: function(scope, element, attrs) {\n createWidget(scope, element, attrs, widget, widget);\n }\n };\n });\n });\n\n function createDirectives(klass, isMobile) {\n function make(directiveName, widgetName) {\n module.directive(directiveName, [\n \"directiveFactory\",\n function(directiveFactory) {\n return directiveFactory.create(widgetName, directiveName);\n }\n ]);\n }\n\n var name = isMobile ? \"Mobile\" : \"\";\n name += klass.fn.options.name;\n\n var className = name;\n var shortcut = \"kendo\" + name.charAt(0) + name.substr(1).toLowerCase();\n name = \"kendo\" + name;\n\n // -type directives\n var dashed = name.replace(/([A-Z])/g, \"-$1\");\n\n if (SKIP_SHORTCUTS.indexOf(name.replace(\"kendo\", \"\")) == -1) {\n var names = name === shortcut ? [ name ] : [ name, shortcut ];\n angular.forEach(names, function(directiveName) {\n module.directive(directiveName, function() {\n return {\n restrict: \"E\",\n replace: true,\n template: function(element, attributes) {\n var tag = TAGNAMES[className] || \"div\";\n var scopeField = attributes.kScopeField || attributes.scopeField;\n\n return \"<\" + tag + \" \" + dashed + (scopeField ? ('=\"' + scopeField + '\"') : \"\") + \">\" + element.html() + \"\";\n }\n };\n });\n });\n }\n\n if (MANUAL_DIRECTIVES.indexOf(name.replace(\"kendo\", \"\")) > -1) {\n return;\n }\n\n make(name, name);\n if (shortcut != name) {\n make(shortcut, name);\n }\n\n }\n\n /* -----[ utils ]----- */\n\n function kendoWidgetInstance(el) {\n el = $(el);\n return kendo.widgetInstance(el, kendo.ui) ||\n kendo.widgetInstance(el, kendo.mobile.ui) ||\n kendo.widgetInstance(el, kendo.dataviz.ui);\n }\n\n function digest(scope, func) {\n var root = scope.$root || scope;\n var isDigesting = /^\\$(digest|apply)$/.test(root.$$phase);\n if (func) {\n if (isDigesting) {\n func();\n } else {\n root.$apply(func);\n }\n } else if (!isDigesting) {\n root.$digest();\n }\n }\n\n function destroyScope(scope, el) {\n scope.$destroy();\n if (el) {\n // prevent leaks. https://github.com/kendo-labs/angular-kendo/issues/237\n $(el)\n .removeData(\"$scope\")\n .removeData(\"$$kendoScope\")\n .removeData(\"$isolateScope\")\n .removeData(\"$isolateScopeNoTemplate\")\n .removeClass(\"ng-scope\");\n }\n }\n\n var encode = kendo.htmlEncode;\n var open = /{{/g;\n var close = /}}/g;\n var encOpen = '{​{';\n var encClose = '}​}';\n\n kendo.htmlEncode = function(str) {\n return encode(str)\n .replace(open, encOpen)\n .replace(close, encClose);\n };\n\n var pendingPatches = [];\n\n // defadvice will patch a class' method with another function. That\n // function will be called in a context containing `next` (to call\n // the next method) and `object` (a reference to the original\n // object).\n function defadvice(klass, methodName, func) {\n if (Array.isArray(klass)) {\n return angular.forEach(klass, function(klass) {\n defadvice(klass, methodName, func);\n });\n }\n if (typeof klass == \"string\") {\n var a = klass.split(\".\");\n var x = kendo;\n while (x && a.length > 0) {\n x = x[a.shift()];\n }\n if (!x) {\n pendingPatches.push([ klass, methodName, func ]);\n return false;\n }\n klass = x.prototype;\n }\n var origMethod = klass[methodName];\n klass[methodName] = function() {\n var self = this, args = arguments;\n return func.apply({\n self: self,\n next: function() {\n return origMethod.apply(self, arguments.length > 0 ? arguments : args);\n }\n }, args);\n };\n return true;\n }\n\n kendo.onWidgetRegistered(function(entry) {\n pendingPatches = $.grep(pendingPatches, function(args) {\n return !defadvice.apply(null, args);\n });\n createDirectives(entry.widget, entry.prefix == \"Mobile\");\n });\n\n /* -----[ Customize widgets for Angular ]----- */\n\n defadvice([ \"ui.Widget\", \"mobile.ui.Widget\" ], \"angular\", function(cmd, arg) {\n var self = this.self;\n if (cmd == \"init\") {\n // `arg` here should be the widget options.\n // the Chart doesn't send the options to Widget::init in constructor\n // hence the OPTIONS_NOW hack (initialized in createWidget).\n if (!arg && OPTIONS_NOW) {\n arg = OPTIONS_NOW;\n }\n OPTIONS_NOW = null;\n if (arg && arg.$angular) {\n self.$angular_scope = arg.$angular[0];\n self.$angular_init(self.element, arg);\n }\n return;\n }\n\n var scope = self.$angular_scope;\n\n if (scope) {\n withoutTimeout(function() {\n var x = arg(), elements = x.elements, data = x.data;\n if (elements.length > 0) {\n switch (cmd) {\n\n case \"cleanup\":\n angular.forEach(elements, function(el) {\n var itemScope = $(el).data(\"$$kendoScope\");\n\n if (itemScope && itemScope !== scope && itemScope.$$kendoScope) {\n destroyScope(itemScope, el);\n }\n });\n break;\n\n case \"compile\":\n var injector = self.element.injector();\n var compile = injector ? injector.get(\"$compile\") : $defaultCompile;\n\n angular.forEach(elements, function(el, i) {\n var itemScope;\n if (x.scopeFrom) {\n itemScope = x.scopeFrom;\n } else {\n var vars = data && data[i];\n if (vars !== undefined$1) {\n itemScope = $.extend(scope.$new(), vars);\n itemScope.$$kendoScope = true;\n } else {\n itemScope = scope;\n }\n }\n\n $(el).data(\"$$kendoScope\", itemScope);\n compile(el)(itemScope);\n });\n digest(scope);\n break;\n }\n }\n });\n }\n });\n\n defadvice(\"ui.Widget\", \"$angular_getLogicValue\", function() {\n return this.self.value();\n });\n\n defadvice(\"ui.Widget\", \"$angular_setLogicValue\", function(val) {\n this.self.value(val);\n });\n\n defadvice(\"ui.Select\", \"$angular_getLogicValue\", function() {\n var item = this.self.dataItem(),\n valueField = this.self.options.dataValueField;\n\n if (item) {\n if (this.self.options.valuePrimitive) {\n if (!!valueField) {\n return item[valueField];\n } else {\n return item;\n }\n } else {\n return item.toJSON();\n }\n } else {\n return null;\n }\n });\n\n defadvice(\"ui.Select\", \"$angular_setLogicValue\", function(val) {\n var self = this.self;\n var options = self.options;\n var valueField = options.dataValueField;\n var text = options.text || \"\";\n\n if (val === undefined$1) {\n val = \"\";\n }\n\n if (valueField && !options.valuePrimitive && val) {\n text = val[options.dataTextField] || \"\";\n val = val[valueField || options.dataTextField];\n }\n\n if (self.options.autoBind === false && !self.listView.bound()) {\n if (!text && val && options.valuePrimitive) {\n self.value(val);\n } else {\n self._preselect(val, text);\n }\n } else {\n self.value(val);\n }\n });\n\n defadvice(\"ui.MultiSelect\", \"$angular_getLogicValue\", function() {\n var value = this.self.dataItems().slice(0);\n var valueField = this.self.options.dataValueField;\n\n if (valueField && this.self.options.valuePrimitive) {\n value = $.map(value, function(item) {\n return item[valueField];\n });\n }\n\n return value;\n });\n\n defadvice(\"ui.MultiSelect\", \"$angular_setLogicValue\", function(val) {\n if (val == null) {\n val = [];\n }\n\n var self = this.self;\n var options = self.options;\n var valueField = options.dataValueField;\n var data = val;\n\n if (valueField && !options.valuePrimitive) {\n val = $.map(val, function(item) {\n return item[valueField];\n });\n }\n\n if (options.autoBind === false && !options.valuePrimitive && !self.listView.bound()) {\n self._preselect(data, val);\n } else {\n self.value(val);\n }\n });\n\n /* AutoComplete's getter and setter are removed!\n By design, AutoComplete should be bound only to primitive string\n value and data items are bound only to serve the list of suggestions.\n\n Binding multiple data items is supported by the MultiSelect widget.\n */\n\n // All event handlers that are strings are compiled the Angular way.\n defadvice(\"ui.Widget\", \"$angular_init\", function(element, options) {\n var self = this.self;\n if (options && !Array.isArray(options)) {\n var scope = self.$angular_scope;\n for (var i = self.events.length; --i >= 0;) {\n var event = self.events[i];\n var handler = options[event];\n if (handler && typeof handler == \"string\") {\n options[event] = self.$angular_makeEventHandler(event, scope, handler);\n }\n }\n }\n });\n\n // most handers will only contain a kendoEvent in the scope.\n defadvice(\"ui.Widget\", \"$angular_makeEventHandler\", function(event, scope, handler) {\n handler = $parse(handler);\n return function(e) {\n digest(scope, function() {\n handler(scope, { kendoEvent: e });\n });\n };\n });\n\n // for the Grid and ListView we add `data` and `selected` too.\n defadvice([ \"ui.Grid\", \"ui.ListView\", \"ui.TreeView\", \"ui.PanelBar\" ], \"$angular_makeEventHandler\", function(event, scope, handler) {\n if (event != \"change\") {\n return this.next();\n }\n handler = $parse(handler);\n return function(ev) {\n var widget = ev.sender;\n var options = widget.options;\n var cell, multiple, locals = { kendoEvent: ev }, elems, items, columns, colIdx;\n\n if (angular.isString(options.selectable)) {\n cell = options.selectable.indexOf('cell') !== -1;\n multiple = options.selectable.indexOf('multiple') !== -1;\n }\n if (widget._checkBoxSelection) {\n multiple = true;\n }\n\n elems = locals.selected = this.select();\n items = locals.data = [];\n columns = locals.columns = [];\n for (var i = 0; i < elems.length; i++) {\n var item = cell ? elems[i].parentNode : elems[i];\n var dataItem = widget.dataItem(item);\n if (cell) {\n if (angular.element.inArray(dataItem, items) < 0) {\n items.push(dataItem);\n }\n colIdx = angular.element(elems[i]).index();\n if (angular.element.inArray(colIdx, columns) < 0 ) {\n columns.push(colIdx);\n }\n } else {\n items.push(dataItem);\n }\n }\n\n if (!multiple) {\n locals.dataItem = locals.data = items[0];\n locals.angularDataItem = kendo.proxyModelSetters(locals.dataItem);\n locals.selected = elems[0];\n }\n\n digest(scope, function() {\n handler(scope, locals);\n });\n };\n });\n\n // If no `template` is supplied for Grid columns, provide an Angular\n // template. The reason is that in this way AngularJS will take\n // care to update the view as the data in scope changes.\n defadvice(\"ui.Grid\", \"$angular_init\", function(element, options) {\n this.next();\n if (options.columns) {\n var settings = $.extend({}, kendo.Template, options.templateSettings);\n angular.forEach(options.columns, function(col) {\n if (col.field && !col.template && !col.format && !col.values && (col.encoded === undefined$1 || col.encoded)) {\n col.template = \"#: \" +\n kendo.expr(col.field, settings.paramName) + \"#\";\n }\n });\n }\n });\n\n var WIDGET_TEMPLATE_OPTIONS = {\n \"TreeMap\": [ \"Template\" ],\n \"Grid\": [ \"AltRowTemplate\", \"DetailTemplate\", \"RowTemplate\" ],\n \"ListView\": [ \"EditTemplate\", \"Template\", \"AltTemplate\" ],\n \"Pager\": [ \"SelectTemplate\", \"LinkTemplate\" ],\n \"PivotGrid\": [ \"ColumnHeaderTemplate\", \"DataCellTemplate\", \"RowHeaderTemplate\" ],\n \"Scheduler\": [\"AllDayEventTemplate\", \"DateHeaderTemplate\", \"EventTemplate\", \"MajorTimeHeaderTemplate\", \"MinorTimeHeaderTemplate\"],\n \"ScrollView\": [ \"Template\" ],\n \"PanelBar\": [ \"Template\" ],\n \"TreeView\": [ \"Template\" ],\n \"Validator\": [ \"ErrorTemplate\" ]\n };\n\n (function() {\n var templateDirectives = {};\n angular.forEach(WIDGET_TEMPLATE_OPTIONS, function(templates, widget) {\n angular.forEach(templates, function(template) {\n if (!templateDirectives[template]) {\n templateDirectives[template] = [ ];\n }\n templateDirectives[template].push(\"?^^kendo\" + widget);\n });\n });\n\n angular.forEach(templateDirectives, function(parents, directive) {\n var templateName = \"k\" + directive;\n var attrName = kendo.toHyphens(templateName);\n\n module.directive(templateName, function() {\n return {\n restrict: \"A\",\n require: parents,\n terminal: true,\n compile: function($element, $attrs) {\n if ($attrs[templateName] !== \"\") {\n return;\n }\n\n $element.removeAttr(attrName);\n var template = $element[0].outerHTML;\n\n return function(scope, element, attrs, controllers) {\n var controller;\n\n while (!controller && controllers.length) {\n controller = controllers.shift();\n }\n\n if (!controller) {\n $log.warn(attrName + \" without a matching parent widget found. It can be one of the following: \" + parents.join(\", \"));\n } else {\n controller.template(templateName, template);\n element.remove();\n }\n };\n }\n };\n });\n });\n\n })();\n\n\n })(window.kendo.jQuery, window.angular);\n\n \"bundle all\";\n var kendo$1 = kendo;\n\n return kendo$1;\n\n}));\n"]}