{"version":3,"sources":["webpack:///src/index.ts?c6ae","webpack:///src/modules/fabrikam/views/navigation-menu.view.tsx?5991","webpack:///./src/themes/newsunshine-dev/views/components/navigation-menu-utilities.tsx?1d50","webpack:///./src/themes/newsunshine-dev/views/components/navigation-menu-root-disabled.tsx?5e46","webpack:///./src/themes/newsunshine-dev/views/components/navigation-menu-root-enabled.tsx?49ac","webpack:///./src/themes/newsunshine-dev/views/navigation-menu.view.tsx?82bc","webpack:///src/modules/adventureworks/views/components/navigation-menu-utilities.tsx?9734","webpack:///src/modules/adventureworks/views/components/navigation-menu-root-disabled.tsx?8952","webpack:///src/modules/adventureworks/views/components/navigation-menu-root-enabled.tsx?083d","webpack:///src/modules/adventureworks/views/navigation-menu.view.tsx?c096","webpack:///./src/themes/newsunshine-b2c/views/components/navigation-menu-utilities.tsx?cb36","webpack:///./src/themes/newsunshine-b2c/views/components/navigation-menu-root-disabled.tsx?3382","webpack:///./src/themes/newsunshine-b2c/views/components/navigation-menu-root-enabled.tsx?4e3d","webpack:///./src/themes/newsunshine-b2c/views/navigation-menu.view.tsx?42f2","webpack:///./src/themes/newsunshine-dev-b2c/views/components/navigation-menu-utilities.tsx?dec3","webpack:///./src/themes/newsunshine-dev-b2c/views/components/navigation-menu-root-disabled.tsx?6b3a","webpack:///./src/themes/newsunshine-dev-b2c/views/components/navigation-menu-root-enabled.tsx?dccf","webpack:///./src/themes/newsunshine-dev-b2c/views/navigation-menu.view.tsx?7530","webpack:///src/modules/navigation-menu/navigation-menu.data.ts?a9f0","webpack:///src/modules/navigation-menu/navigation-menu.tsx?390c","webpack:///external \"React\"?c481","webpack:///./lib/navigation-menu/module-registration.js?7039","webpack:///./src/themes/newsunshine/views/components/navigation-menu-utilities.tsx?56a7","webpack:///./src/themes/newsunshine/views/components/navigation-menu-root-disabled.tsx?76d9","webpack:///./src/themes/newsunshine/views/components/navigation-menu-root-enabled.tsx?c4ae","webpack:///./src/themes/newsunshine/views/navigation-menu.view.tsx?e5fd","webpack:///external \"ReactDOM\"?4b2d","webpack:///src/modules/navigation-menu/navigation-menu.view.tsx?df40"],"names":["NavigationMenuView","React","constructor","props","super","currentLevel","_positionInSetOffset","escapeKey","_updateCategoryImage","categoryImageSrc","option","linkText","promotionalImage","src","altText","ArrayExtensions","hasElements","promotionalContent","map","item","image","imageSrc","promotionalItemImageSettings","imageSettings","push","text","additionalProperties","linkUrl","destinationUrl","this","setState","categoryImage","length","categoryImageAltText","_handleDropdownToggle","data","parentId","isMobileView","activeMenu","id","parentMenu","state","undefined","showCategoryImage","imageSource","_resetFocus","setTimeout","menuNode","current","focus","_handleClickOutside","event","contains","target","_handleFocusOutside","relatedTarget","_closeSubmenu","_escFunction","keyCode","navDrawerList","Array","from","childNodes","navDrawerButton","firstChild","getAttribute","_getCategoryImage","categoryImageUrl","generateImageUrl","context","actionContext","requestContext","apiSettings","defaultImageSettings","viewports","xs","q","w","h","sm","md","lg","lazyload","_ref","_categoryImage$imageS","ImageData","Image","Object","assign","className","gridSettings","request","config","categoryImageSettings","loadFailureBehavior","role","_onDrawerChange","drawerState","drawerKeyValue","newPair","buttonText","isOpen","_objectSpread","bind","telemetryContent","getTelemetryObject","telemetryPageName","friendlyName","telemetry","payLoad","getPayloadObject","componentDidMount","MsDyn365","isBrowser","document","body","addEventListener","componentWillUnmount","removeEventListener","render","_renderMobileMenu","_renderDesktopMenu","menuItemData","Navigation","Module","classnames","menuItem","posinset","_renderDrawerMenu","MenuList","Node","ref","tabIndex","_renderDisplay","setSize","subMenu","_renderDrawer","_renderLinkMenuItem","toggleButtonText","keyValue","keys","isDrawerOpen","colProps","Drawer","toggleButtonProps","ariaLabel","key","openGlyph","onToggle","collapseProps","closeGlyph","glyphPlacement","_renderLinkText","menuSubItem","currentPos","_menuItem$subMenu2","_menuItem$subMenu","_renderDrawerLink","linkURL","_renderSpanMenuItem","ListItem","menuItemList","menuItemDatum","_getFromSubMenu","_createMenuItemList","forEach","index","subMenus","i","found","_renderSubMenu","_renderButtonMenuItem","IsSubMenu","enableMultiSupportMenu","enableMultilevelMenu","multiLevelSupportedMenu","menuLevelSupport","error","levelClassName","menuOptions","idx","hasOptions","haveSubmenu","Math","round","toString","_renderMenu","Button","onClick","onFocus","hoverEffect","arguments","isParent","Link","imagesource","contentAction","etext","attributes","getTelemetryAttributes","shouldOpenNewTab","onMouseOver","href","onTelemetryClick","_renderPromotionalLink","Span","level","currentItem","submenu","DivContainer","ImageDivContainer","showPromotionalContent","categoryImageDisplay","promotionalContentDisplay","DivContainerClass","_item$additionalPrope","NavMenuConstants","getCategoryImage","alttext","navProps","_props$navProps$confi","imageData","Msdyn365","NavigationMenuRootDisabled","supportedLevel","four","zero","_bindDesktopCategoryClick","menuId","categoryImageSource","isOnlyMobile","isBackTrack","mobileViewLabelText","_handleGoBack","previousState","isNavOpen","_shouldAddFocusMenuRef","optionLinkText","_customUpdateViewport","menuItemRef","isMobile","variant","VariantType","Browser","customResizeThrottledEventHandler","addThrottledEvent","window","componentDidUpdate","_this$menuItemRef$cur","children","_renderCollapseMenu","MobileBackButton","MobileDescriptionContainer","MobileDescriptionLabel","StringExtensions","isNullOrWhitespace","entries","parentMenuId","menu","one","Number","subMenuArray","isSubMenu","_this$props$navProps$","_this$props$navProps$2","rootMenu","filter","subMenuItem","MenuTypeIndexId","Retail","isEnableMultiSupportMenu","three","getMenuItem","isHavingSubmenu","two","_renderSubMenuDrawer","_renderLinkMenuItemLevelOne","_this$props$navProps$3","timeout","isHoverEffect","isSubmenu","_this$state$categoryI","isCategoryImageDisplay","isPromotionalContentDisplay","divContainerClass","menuLevelSupportClassName","categoryImages","imagesContainerKey","join","_item$src","__decorate","computed","NavigationMenuRootEnabled","_toggleNavBar","_addShopAllLink","_this$menuItemData$0$","shopAllObject","resources","allCategoryMenuText","menuSource","MenuSource","unshift","_closeNavMenu","title","hamburgerAriaLabel","Collapse","cmsMenuData","retailMenuItemData","retailMenuData","JSON","parse","stringify","navigationMenuView","enabletopMenu","_this$menuNode$curren","_this$menuNode$curren2","NavigationMenu","isRetail","isCMS","_setNavigationSource","sourceType","_updateViewport","viewport","device","Type","navigationMenuSource","locale","nameTranslations","nameTranslation","find","Language","toLowerCase","Text","resizeThrottledEventHandler","_this$props$config$di","_this$props$config$di2","_mapData","isEmptyOrNullObject","viewProps","xl","moduleProps","tag","displayCategoryImage","displayPromotionalImage","ImageContainer","backButtonAriaLabel","renderView","mergedData","categories","result","_constructMenuItemData","cmsNavItems","_constructTopMenuItemData","_this$props$config$en","_this$props$config$ro","mergedRootMenuData","topMenu","rootMenuNavigation","retailItem","cmsItem","addedAllMenu","categoryPromotionalContent","cmsItemText","menuAriaLabel","promotionalData","promoItem","_promoItem$categoryNa","_retailItem$Name","categoryName","Name","_NavigationMenu$getFr","_NavigationMenu$getFr2","Images","Uri","RSItemIdInit","getFriendlyName","NameTranslations","Url","_getNestedChildren","CMSItemIdInit","imageDestinationURL","imageLink","_getCMSNestedChildren","Cms","openInNewTab","category","imageSourceUrl","nestedChildren","Children","getCategoryUrl","_getViewport","innerWidth","observable","module","exports","binding","modules","dataActions","c","require","$type","da","name","path","runOn","iNM","ns","n","p","pdp","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","Error","prototype","RegistrationId","__bindings__","viewDictionary","cn","ReactDOM"],"mappings":";sHAAA,8I,oyBCqCO,MAAMA,UAA2BC,gBAapCC,YAAYC,GACRC,MAAMD,GAbF,KAAAE,aAAuB,EAEd,KAAAC,qBAA+B,EAE/B,KAAAC,UAAoB,GAqcpB,KAAAC,qBAAuB,CAACC,EAA0BC,IAA0B,KACzF,MAAMC,EAAWD,GAAUA,EAAOC,SAAWD,EAAOC,SAAW,GACzDC,EAAiC,CAAC,CAAEC,IAAKJ,EAAkBK,QAASH,IAGtEI,kBAAgBC,YAAYN,EAAOO,qBACnCP,EAAOO,mBAAmBC,IAAIC,IAC1B,GAAIA,GAAQA,EAAKC,MAAO,CACpB,MAAMC,EAAWF,EAAKC,MAAMP,IACtBS,EAA+BH,EAAKC,MAAMG,cAChDX,EAAiBY,KAAK,CAClBX,IAAKQ,EACLP,QAASK,EAAKM,KACdF,cAAeD,EACfI,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,qBAK9DC,KAAKC,SAAS,CACVC,cAAenB,EAAiBoB,OAAS,EAAIpB,EAAmB,CAAC,CAAEC,IAAK,UACxEoB,qBAAsBtB,KAUb,KAAAuB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAK1B,MAAMkC,aASZR,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,KAVhBP,KAAKC,SAAS,CACVQ,WAAYT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAeH,EAAKI,QAAMG,EAAYP,EAAKI,GAC3FC,WAAYJ,IAEZP,KAAK1B,MAAMwC,mBACXd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,IASRA,KAAKgB,eAMQ,KAAAA,YAAc,KACvBhB,KAAK1B,MAAMkC,cACXS,WAAW,KACPjB,KAAKkB,UAAYlB,KAAKkB,SAASC,SAAWnB,KAAKkB,SAASC,QAAQC,SACjE,IAQM,KAAAC,oBAAuBC,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,SAC/DxB,KAAKC,SAAS,CACVQ,gBAAYI,EACZX,cAAe,QASV,KAAAuB,oBAAuBH,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAMI,gBAC/D1B,KAAK2B,iBAiBI,KAAAC,aAAgBN,IAC7B,GAAIA,EAAMO,UAAY7B,KAAKtB,UAAW,CAClC,IAAKsB,KAAK1B,MAAMkC,aAAc,CAC1B,MAAMsB,EAAgBC,MAAMC,KAAKhC,KAAKkB,SAASC,QAASc,YACxD,IAAK,MAAM3C,KAAQwC,EAAe,CAC9B,MAAMI,EAAkB5C,EAAK6C,WACyB,SAAlDD,EAAgBE,aAAa,kBAC7BF,EAAgBd,SAI5BpB,KAAK2B,kBAII,KAAAU,kBAAqBnC,IAClC,IAAKA,IAAkBA,EAAclB,IACjC,OAAO,KAGX,MAAMsD,EAAmBC,2BAAiBrC,EAAclB,IAAKgB,KAAK1B,MAAMkE,QAAQC,cAAcC,eAAeC,aACvGC,EAAuC,CACzCC,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCG,GAAI,CAAEL,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCI,UAAU,GAEd,QAAyBxC,IAArByB,EAAgC,CAAC,IAADgB,EAAAC,EAChC,MAAMC,EAAwB,CAAExE,IAAKsD,GACrC,OACIlE,gBAACqF,IAAKC,OAAAC,OAAA,CACFjB,eAAgB1C,KAAK1B,MAAMkE,QAAQC,cAAcC,eACjDkB,UAAU,sBACNJ,EAAS,CACbK,aAAc7D,KAAK1B,MAAMkE,QAAQsB,QAAQD,aACzCnE,cAAqF,QAAxE4D,EAA6B,QAA7BC,EAAErD,EAAcR,qBAAa,IAAA6D,IAAIvD,KAAK1B,MAAMyF,OAAOC,6BAAqB,IAAAV,IAAIV,EACzFqB,oBAAoB,OACpBC,KAAK,WACLxD,GAAOR,EAAclB,IAAjB,kBACJC,QAASiB,EAAcjB,WAInC,OAAO,MAOM,KAAAkF,gBAAmBC,IAChC,MAAM,eAAEC,GAAmBrE,KAAKY,MAE1B0D,EAAU,CAAE,MADoCzD,IAA3BuD,EAAYG,WAA2BH,EAAYG,WAAa,IAC3DH,EAAYI,QAC5CxE,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MArlBxDtE,KAAKkB,SAAW9C,cAChB4B,KAAKY,MAAQ,CAAEH,gBAAYI,EAAWF,gBAAYE,EAAWT,qBAAsB,GAAIiE,eAAgB,IACvGrE,KAAK2B,cAAgB3B,KAAK2B,cAAc+C,KAAK1E,MAC7CA,KAAK4B,aAAe5B,KAAK4B,aAAa8C,KAAK1E,MAC3CA,KAAK2E,iBAAmBC,6BACpB5E,KAAK1B,MAAMkE,QAAQsB,QAAQe,kBAC3B7E,KAAK1B,MAAMwG,aACX9E,KAAK1B,MAAMyG,WAEf/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IAGjEO,oBACCC,IAASC,YACTC,SAASC,KAAKC,iBAAiB,UAAYvF,KAAK4B,cAA2C,GAC3FyD,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBACjDgE,SAASC,KAAKC,iBAAiB,WAAYvF,KAAKyB,sBAIjD+D,uBACCL,IAASC,YACTC,SAASI,oBAAoB,UAAYzF,KAAK4B,cAA2C,GACzFyD,SAASC,KAAKG,oBAAoB,YAAazF,KAAKqB,qBAAqB,GACzEgE,SAASC,KAAKG,oBAAoB,WAAYzF,KAAKyB,qBAAqB,IAIzEiE,SACH,MAAM,aAAElF,GAAiBR,KAAK1B,MAG9B,OADA0B,KAAKxB,aAAe,EACbJ,2BAAA,KAAGoC,EAAeR,KAAK2F,oBAAsB3F,KAAK4F,sBAOrDD,oBACJ,MAAM,aAAEnF,EAAY,aAAEqF,EAAY,WAAEC,GAAe9F,KAAK1B,MACxD,OACIF,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,UAAWpD,EAAe,cAAgB,kBAC9FqF,EAAaxG,IAAI,CAAC4G,EAAyBC,IACjClG,KAAKmG,kBAAkBF,EAAUJ,EAAa1F,OAAQ+F,EAAWlG,KAAKvB,wBAUrFmH,qBACJ,MAAM,SAAEQ,EAAQ,WAAEN,GAAe9F,KAAK1B,MACtC,OACIF,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,aACrDxF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEE,IAAKtG,KAAKkB,SAAUqF,SAAS,OAC5CvG,KAAKwG,mBAadL,kBAAkBF,EAAyBQ,EAAiBP,GAChE,OAAID,GAAYA,EAASS,SAAWxH,kBAAgBC,YAAY8G,EAASS,SAC9D1G,KAAK2G,cAAcV,EAAUQ,EAASP,GAE1ClG,KAAK4G,oBAAoBX,OAAUpF,GAAW,GAAM,EAAO4F,EAASP,GAUvES,cAAcV,EAAyBQ,EAAkBP,GAC7D,MAAMW,EAAmBZ,EAASnH,SAC5BgI,EAAW9G,KAAKY,MAAMyD,eACtBE,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,OAAoBlG,IAAbiG,EAAyBA,EAAW,IAC3C,aAAEtG,GAAiBR,KAAK1B,MAE9B,IAAI0I,GAAe,EACfD,EAAKxC,KACLyC,GAAe,GAEnB,MAAMC,EAA2B,CAAEzC,OAAQwC,GAC3C,OACI5I,gBAAC8I,SAAM,CACHhD,KAAK,UACLiD,kBAAmB,CACf,eAAgBV,EAChB,gBAAiBP,EACjBhC,KAAM,YAEVkD,UAAW5G,EAAeyF,EAASmB,eAAYvG,EAC/CwG,IAAKpB,EAASvF,GACdkD,UAAU,iBACV0D,UAAU,sBACVC,SAAUvH,KAAKmE,gBACfqD,cAAeP,EACfQ,WAAW,uBACXC,eAAe,MACfb,iBAAkB7G,KAAK2H,gBAAgBd,EAAkBJ,EAASP,IAElE9H,gBAAA,OAAK8F,KAAK,WACL+B,EAASS,QAASrH,IAAI,CAACuI,EAA4BC,KAAsB,IAAAC,EAChBC,EAAtD,OAAI7I,kBAAgBC,YAAYyI,EAAYlB,SACjC1G,KAAK2G,cAAciB,EAA6B,QAAlBG,EAAE9B,EAASS,eAAO,IAAAqB,OAAA,EAAhBA,EAAkB5H,OAAQ0H,EAAa7H,KAAKvB,sBAEhFuB,KAAKgI,kBAAkBJ,EAA6B,QAAlBE,EAAE7B,EAASS,eAAO,IAAAoB,OAAA,EAAhBA,EAAkB3H,OAAQ0H,EAAa7H,KAAKvB,0BAcnGkJ,gBAAgB7I,EAA8B2H,EAA6BP,GAC/E,OACI9H,gBAAA,uBAAoBqI,EAAO,gBAAiBP,GACvCpH,GAYLkJ,kBAAkB1I,EAAqBmH,EAA6BP,GACxE,OAAI5G,GAAQA,EAAKR,UAAYQ,EAAK2I,SAAW3I,EAAK2I,QAAQ9H,OAAS,EACxDH,KAAK4G,oBAAoBtH,OAAMuB,GAAW,GAAM,EAAO4F,EAASP,GAChE5G,GAAQA,EAAKR,WAAaQ,EAAK2I,QAC/BjI,KAAKkI,oBAAoB5I,GAE7B,KAOHkH,iBACJ,MAAM,SAAE2B,EAAQ,aAAEtC,EAAY,aAAErF,GAAiBR,KAAK1B,OAChD,WAAEmC,GAAeT,KAAKY,MACtBwH,EAA8B,GAEpC,GAAI5H,QAA+BK,IAAfJ,GAA4BoF,EAAa1F,OAAS,EAAG,CACrE,IAAI8F,EAA0B,GAC9B,IAAK,MAAMoC,KAAiBxC,EAAc,CACtC,GAAIwC,GAAiBA,EAAc3H,KAAOD,EAAY,CAClDwF,EAAWoC,EACXrI,KAAKC,SAAS,CAAEU,gBAAYE,IAC5B,MAGJ,GADAoF,EAAWjG,KAAKsI,gBAAgBD,GAC5BpC,GAAYA,EAASvF,KAAOD,EAC5B,MAIRwF,GACImC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GACzB,WAIbJ,EAAa2C,QAAQ,CAAClJ,EAAqBmJ,KACvCL,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWN,GACjBnI,KAAKuI,oBAAoBjJ,OAM1C,OAAO8I,EAQHE,gBAAgBhJ,GACpB,MAAMoJ,EAAWpJ,GAAQA,EAAKoH,QAC9B,GAAIgC,GAAYA,EAASvI,OAAS,EAC9B,IAAK,IAAIwI,EAAI,EAAGA,GAAKD,EAASvI,OAAS,EAAGwI,IAAK,CAC3C,GAAID,EAASC,GAAGjI,KAAOV,KAAKY,MAAMH,WAE9B,OADAT,KAAKC,SAAS,CAAEU,WAAYrB,aAAI,EAAJA,EAAMoB,KAC3BgI,EAASC,GAEpB,MAAMC,EAAQ5I,KAAKsI,gBAAgBI,EAASC,IAC5C,GAAIC,EACA,OAAOA,EAInB,OAAO,KAQHL,oBAAoB1C,GACxB,OAAIA,GAAgBA,EAAaa,SAAWb,EAAaa,QAAQvG,OAAS,EAClEH,KAAK1B,MAAMkC,mBAA0CK,IAA1Bb,KAAKY,MAAMH,WAC/BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAG9DtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAGzDmF,GAAgBA,EAAa/G,UAAY+G,EAAaoC,SAAWpC,EAAaoC,QAAQ9H,OAAS,EAC/FH,KAAK4G,oBAAoBf,EAAcA,EAAanF,IAAI,GAAO,GAC/DmF,GAAgBA,EAAa/G,WAAa+G,EAAaoC,QACvDjI,KAAKkI,oBAAoBrC,EAAcA,EAAanF,IAAI,GAG5D,KAGHmI,eAAeH,EAA4BjI,EAAqBsI,GACpE,MAAM,aAAEvI,EAAY,SAAE2H,GAAanI,KAAK1B,MAClC0K,EAAyBhJ,KAAK1B,MAAMyF,OAAOkF,uBAAwB,EAEnEC,EAA0BlJ,KAAK1B,MAAMyF,OAAOoF,kBAD7B,EAIrB,GAAI1I,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMkE,QAAQuC,UAAUqE,MAAM,gEAC5B,KAGX,IAAKV,GAAgC,IAApBA,EAASvI,OAEtB,OADAH,KAAK1B,MAAMkE,QAAQuC,UAAUqE,MAAM,4DAC5B,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EACFZ,GACAA,EAASrJ,IAAI,CAACR,EAAuB0K,KACjC,MAAMC,EAAa3K,EAAO6H,SAAW7H,EAAO6H,QAAQvG,OAAS,EAC7D,IAAI8F,EAMAS,EAJAT,EADAuD,GAAchJ,EACHR,KAAK8I,sBAAsBjK,EAAQ4B,EAAY8I,GAE/C1K,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ0K,GAAOvJ,KAAKkI,oBAAoBrJ,GAGjG,MAAM4K,EAAcD,GAAcR,GAA0BhJ,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2B,EAMvH,OALIO,IACAzJ,KAAKxB,eACL6K,EAAiBL,EAAyB,SAAShJ,KAAKxB,aAAaoL,WAAe,GACpFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAASlG,EAAe3B,EAAO6B,QAAKG,GAAW,IAGpFzC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwE,EAAQ,CAAEd,IAAKxI,EAAO6B,GAAIkD,UAAWoC,IAAWmC,EAASvE,UAAW6F,GAAe,iBACxFxD,EACAS,KAIjB,OAAO1G,KAAK6J,YAAYR,EAAgBC,EAAa7I,EAAYsI,GAU7DD,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,MAAM,OAAEqB,GAAW9J,KAAK1B,MACxB,OACIF,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDqB,EAAM,CACVC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAC5CuJ,QAAShK,KAAK2B,cAAa,kBACV3B,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,IAEZ5B,EAAOC,UAeZ8H,oBACJ/H,EACA4J,GAIiB,IAHjBwB,IAAAC,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACAC,EAAAD,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,IAAAA,UAAA,GACAzD,EAAgByD,UAAA/J,OAAA,EAAA+J,UAAA,QAAArJ,EAChBqF,EAAiBgE,UAAA/J,OAAA,EAAA+J,UAAA,QAAArJ,EAEjB,MAAM,KAAEuJ,EAAI,aAAE5J,GAAiBR,KAAK1B,MAC9BQ,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,gBACanD,EAAeiG,OAAU5F,EAAS,gBACjCL,EAAe0F,OAAWrF,EAAS,aACtCL,EAAe3B,EAAOuI,eAAYvG,GAC1CuJ,EAAI,CACR/C,IAAKoB,EACLuB,QAASG,GAAYnK,KAAK2B,cAC1BH,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7C8J,YAAaV,GAAejK,KAAKrB,qBAAqB0L,EAAaxL,GACnE+L,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAWZgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MACtB0B,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACzGA,GAIN,KAUHoJ,oBAAoBrJ,EAAuB4J,GAAyC,IAAzB0B,EAAAD,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,IAAAA,UAAA,GAC/D,MAAM,KAAEa,GAAS/K,KAAK1B,MACtB,OACIF,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,EAAI,CAAEf,QAASG,GAAYnK,KAAK2B,gBACjD9C,EAAOC,UAaZ+K,YAAYmB,EAAe1B,EAA4B2B,EAAsBC,GACjF,MAAM,aAAEC,EAAY,SAAE/E,EAAQ,kBAAEgF,EAAiB,kBAAEtK,EAAiB,aAAEN,EAAY,uBAAE6K,GAA2BrL,KAAK1B,MAC9GgN,GACD9K,GAAgBM,GAAkD,OAA7Bd,KAAKY,MAAMV,oBAAuDW,IAA7Bb,KAAKY,MAAMV,gBAAgCgL,EACpHK,GACD/K,GAAgB6K,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBgL,EACnGM,EAAoBxL,KAAKxB,aAAe,GAAK8M,EAAuBH,EAAcvH,UAAY,kBAEpG,OADA5D,KAAKxB,aAAe,EAEhBJ,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAW4H,IAC/BpN,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyC,EAAQ,CACZxC,UAAWoC,IACPI,EAASxC,UACToH,EACAM,GAAwB,gBACxBA,GACItL,KAAK1B,MAAMyF,OAAOoF,kBAClBnJ,KAAK1B,MAAMyF,OAAOoF,iBAAmB,GACrC,yBAGPG,GAELlL,gBAAA,OAAKwF,UAAU,4BACV0H,GACGtL,KAAKY,MAAMV,eACXF,KAAKY,MAAMV,cAAcb,IAAIC,IAAI,IAAAmM,EAAA,OAC7BrN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAK/H,EAAKN,KAASoM,EAAiB,CAAExH,UAAWwH,EAAmBxH,YACrE5D,KAAKY,MAAMV,eAAiBF,KAAKqC,kBAAkB/C,GACnDiM,GAA6BvL,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,cA+FvH6B,gBACC3B,KAAK1B,MAAMkC,cACZR,KAAKC,SAAS,CAAEQ,gBAAYI,KAqEzB1C,a,6CC1mBHuN,E,kKAAZ,SAAYA,GACRA,IAAA,eACAA,IAAA,aACAA,IAAA,aACAA,IAAA,iBACAA,IAAA,eACAA,IAAA,0BACAA,IAAA,uBAPJ,CAAYA,MAAgB,KAsBrB,MAAMC,EAAmBA,CAACrN,EAAqC4B,EAAuB0L,KACzF,MAAMtJ,EAAmBC,2BAAiB,GAAGrC,EAAiB5B,EAAMuN,SAASrJ,QAAQC,cAAcC,eAAeC,aAC5GC,EAAgD,CAClDC,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCG,GAAI,CAAEL,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCI,UAAU,GAEd,QAAyBxC,IAArByB,EAAgC,KAAAwJ,EAChC,MAAMC,EAAiC,CAAE/M,IAAKsD,GAC9C,OACIlE,gBAAC4N,IAActI,OAAAC,OAAA,CACXjB,eAAgBpE,EAAMuN,SAASrJ,QAAQC,cAAcC,eACrDkB,UAAU,sBACNmI,EAAS,CACblI,aAAcvF,EAAMuN,SAASrJ,QAAQsB,QAAQD,aAC7CnE,cAA0D,QAA7CoM,EAAExN,EAAMuN,SAAS9H,OAAOC,6BAAqB,IAAA8H,IAAIlJ,EAC9DqB,oBAAoB,OACpBC,KAAK,WACLjF,QAAS2M,KAIrB,OAAO,M,ykBC/CL,MAAOK,UAAmC7N,gBAuB5CC,YAAmBC,GACfC,MAAMD,GArBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GA+X1C,KAAAsN,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAgJ3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAClBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAI1DC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZP,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAgBK,KAAA2M,cAAgB,IAAM,KACnCV,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS2M,IAAiB,CAAGnM,WAAYmM,EAAcjM,eAO/C,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UAC1DxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,MAc9D,KAAAC,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/Ed,EAA2BQ,aADL,IACoBhE,MAG1CsE,IAAmBL,IAGjBA,IAAwBK,EAkBlB,KAAAnL,aAAgBN,IACzBA,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,WAC3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,KAO1D,KAAAG,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBAvnBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAM/B,OALAgB,KAAKjB,iBAAiBY,KAAK,CACvBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAE3C,OAKnBC,KAAKY,MAAQ,CACTH,gBAAYI,EACZ6L,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAEf7M,KAAK2E,iBAAmBC,6BACpB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBACpC7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WAExB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IAI9D,mBACN,MAAoG,OAA7FuI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGlFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACDhN,KAAKY,MAAM4L,aACXnH,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAEjDgE,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAIlDoM,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC1EtN,KAAKY,MAAM4L,aACXnH,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAEjDgE,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAIlDqE,SAGH,OAFA1F,KAAKxB,aAAe,EAGhBJ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAC1ClB,KAAKY,MAAM4L,aACRxM,KAAK2F,oBAELvH,2BAAA,KASK4B,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAA,OAAKwF,UAAU,oCACV5D,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAQ/DD,oBACJ,MAAM,SAAES,EAAQ,iBAAEyH,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGlH,OADA7L,KAAKxB,aAAe,EAEhBJ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IACPF,EAAWlC,UACX5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YAG/ErC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GAAyB/N,KAAKY,MAAM8L,sBAGrD1M,KAAKwG,mBAMdZ,qBACJ,MAAM,SAAEQ,EAAQ,WAAEN,GAAe9F,KAAK1B,MAAMuN,SAE5C,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,UAAW,8BAChExF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKwG,mBASdwB,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SACnDjI,KAAK4G,oBAAoBtH,GACxBA,EAAK2I,QAGV,KAFIjI,KAAKkI,oBAAoB5I,GAKhCkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAC1BhG,EAAgC7F,KAAK1B,MAAMuN,SAAShG,cACpD,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GAMpC,GAJIlJ,kBAAgBC,YAAY0G,KAC5BA,EAAa,GAAGnF,GAAK,GAGrBV,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,MAAMI,EAAWjG,KAAKsI,qBAAgBzH,EAAWgF,GAE7CI,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GAAW,WAKjD,IAAK,MAAOwC,EAAOnJ,KAASuG,EAAaqI,UACrC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgB6F,EAAuBC,GAC3C,IAAKA,EACD,OAAO,KAGX,IAAK,IAAI3F,EAAQ,EAAGA,GAAS2F,EAAKjO,OAASuL,EAAiB2C,IAAK5F,IAAS,CACtE,MAAMnJ,EAAsB8O,EAAKE,OAAO7F,IAExC,GAAInJ,EAAKoB,KAAOV,KAAKY,MAAMH,WAMvB,OALKwL,EAA2BQ,YAG5BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBpN,EAAKR,WAFpEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzB7O,EAEX,MAAMsJ,EAAQ5I,KAAKsI,gBAAgBhJ,EAAKoB,GAAIpB,EAAKoH,SACjD,GAAIkC,EACA,OAAOA,EAGf,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC/BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAIlEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAGzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SAC1EjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACnDmF,EAAaoC,SAAajI,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAIrE,KAHIT,KAAKkI,oBAAoBrC,GAMhCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAC3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAeA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGvG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,GAAwB,QAApB5J,EAAOC,SACP,OAAOV,2BAAA,MAEX,MAAMoL,EAAa3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACxE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EACF3F,GAAcwF,GAA4BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAEtH7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,iBACjClM,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAI7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE7GhH,EACAS,KAIb,OAAO1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGjDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC5BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GAEvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OAAOzI,KAAKwM,aACRpO,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAGZV,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAASzB,KAAI,CAC5BQ,KAAM/L,EAAOoJ,QACb0C,YAAa3K,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBAC1CT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAKZ8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GACrE+L,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACzGA,GAIN,KAGHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GACjBlM,EAAOC,UAKZ+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,SAAE/E,EAAQ,kBAAEgF,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SACtG+D,GACD5P,KAAKY,MAAM4L,cACZ1L,GAC6B,OAA7Bd,KAAKY,MAAMV,oBACkBW,IAA7Bb,KAAKY,MAAMV,gBACVwP,EACCG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EACF9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACnG5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GACA5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBAC3BnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAC/D,sBAEEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyC,EAAQ,CACZxC,UAAWoC,IAAWI,EAASxC,UAAWoH,EAAO4E,GAA0B,gBAAiBG,KAE3FzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAC1CL,GACG1Q,kBAAgBC,YAAY6Q,IAC5BA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OACnBrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC3E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GACG7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eAlhBtFmM,EAAAQ,aAAuB,EAgE5B2D,YAAA,CAATC,K,iCAmlBUpE,Q,ykBCvpBT,MAAOqE,UAAkClS,gBAyB3CC,YAAmBC,GACfC,MAAMD,GAvBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GAEnD,KAAA8G,aAAgC,GA4FvB,KAAA0K,cAAgB,KAC7BvQ,KAAKC,SAAS2M,IAAiB,CAC3BnM,WAAYiL,EAAiBiD,SAC7B9B,WAAYD,EAAcC,cA4TjB,KAAAR,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAqH3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAAEX,IAAK+B,EAAa9B,QAASK,EAAKM,KAAMC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAGpHC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZ8D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAiBK,KAAA2M,cAAgB,IAAM,KACnC2D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAU2M,IAAa,CAAQnM,WAAYmM,EAAcjM,eAOjD,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UACbnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UACjCxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,MAUtF,KAAA2D,gBAAkB,KAC/B,MAAM,aAAE3K,GAAiB7F,KAAK1B,MAAMuN,SAEmE,IAAA4E,GADvGzQ,KAAK6F,aAAeA,EAChB3G,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,YAC7D,QAA5B+J,EAAAzQ,KAAK6F,aAAa,GAAGa,eAAO,IAAA+J,GAA5BA,EAA8BpR,IAAIC,IAC9B,MAAMoR,EAAgB,GAOtB,OANAhN,OAAOC,OAAO+M,EAAe,CAAE3P,YAAazB,EAAKyB,cACjD2C,OAAOC,OAAO+M,EAAe,CAAE5R,SAAUkB,KAAK1B,MAAMuN,SAAS8E,UAAUC,sBACvElN,OAAOC,OAAO+M,EAAe,CAAEzI,QAAS3I,EAAK2I,UACzC/I,kBAAgBC,YAAYG,EAAKoH,UAAYpH,EAAKuR,aAAeC,aAAW/B,QAC5EzP,EAAKoH,QAAQqK,QAAQL,GAElBpR,MAYF,KAAAwN,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/EuD,EAA0B7D,aADJ,IACmBhE,MAGzCsE,IAAmBL,IAGjBA,IAAwBK,EAMlB,KAAAiE,cAAgB,KACxBhR,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAUlF,KAAAjL,aAAgBN,IACzBA,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,WAC3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAOlF,KAAAG,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBA1oBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAE/B,OADAgB,KAAKjB,iBAAiBY,KAAK,CAAEX,IAAK+B,EAAa9B,QAASK,EAAKM,KAAMC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAC1G,OAInBC,KAAKY,MAAQ,CACTH,WAAYiL,EAAiBiD,SAC7BjC,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAGf7M,KAAK2E,iBAAmBC,6BAAmB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBAC3E7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WACxB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IACpE3E,KAAKwK,WAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SAG/D,mBACN,MAAqG,OAA7FkI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGnFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACL3H,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBACjDrB,KAAKwQ,kBAGF/C,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC9EjI,SAASC,KAAKG,oBAAoB,YAAazF,KAAKqB,qBAAqB,GAGtEqE,SACH1F,KAAKxB,aAAekN,EAAiB2C,IAErC,OACIjQ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAEvClB,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAuBvH,2BAAA,KAClDA,gBAAC0L,SAAMpG,OAAAC,OAAA,CACHC,UAAU,sBACVmG,QAAS/J,KAAKuQ,cAAa,gBAP7B,oBASEU,MAAOjR,KAAK1B,MAAMuN,SAAS8E,UAAUO,mBAAkB,aAC3ClR,KAAK1B,MAAMuN,SAAS8E,UAAUO,oBACtClR,KAAKwK,aAEZxK,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAC+S,WAAQ,CAACvN,UAAU,mCAAmCY,OAAQxE,KAAKY,MAAMiM,WACrE7M,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAK/DD,oBACJ,MAAM,iBAAEkI,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGxG,OADA7L,KAAKxB,aAAekN,EAAiB2C,IAEjCjQ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IAAWF,EAAWlC,UAAW5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YACvHrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GACL/N,KAAKY,MAAM8L,sBAGvB1M,KAAKwG,mBAMdZ,qBACJ,MAAM,WAAEE,GAAe9F,KAAK1B,MAAMuN,SAClC,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,aACrDxF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKwG,iBACNpI,gBAAA,OAAKwF,UAAU,uBACXxF,gBAAA,UAAQwF,UAAU,qBAAoB,aAAY,QAAQmG,QAAS/J,KAAKgR,mBAOpFhJ,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SAEtDjI,KAAK4G,oBAAoBtH,GAErBA,EAAK2I,QAKV,KAHCjI,KAAKkI,oBAAoB5I,GAM7BkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAChC,IAAIhG,EAAgC,GAEhCA,EADA7F,KAAKY,MAAM4L,aACIxM,KAAK6F,aAEL7F,KAAK1B,MAAMuN,SAAShG,aAEvC,MAAM,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GACpC,IAAIgJ,EAA2C,GAC3CC,EAAkD,GACtD,MAAMC,EAAiBC,KAAKC,MAAMD,KAAKE,UAAU5L,IAEjD,IAAK,MAAMvG,KAAQgS,EACfD,EAAqB/R,EAAKoH,QAASkI,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,QAC9GzP,EAAKoH,QAAU2K,EAGnB,IAAK,MAAM/R,KAAQuG,EACfuL,EAAc9R,EAAKoH,QAASkI,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,GAAKoO,kBAAgBC,QAG1G,GAAI/O,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,IAAII,EAAiC,GACrC,IAAK,MAAMoC,KAAiBxC,EAAc,CACtC,GAAIwC,EAAc3H,KAAOD,EAAY,CACjCwF,EAAWoC,EACNiI,EAA0B7D,YAK3BzM,KAAKC,SAAS,CACVU,gBAAYE,EACZ6L,oBAAqBrE,EAAcvJ,WANvCkB,KAAKC,SAAS,CACVU,gBAAYE,IAQpB,MAGJ,GADAoF,EAAWjG,KAAKsI,gBAAgBD,GAC5BpC,GAAYA,EAASvF,KAAOD,EAC5B,MAIJwF,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GACzB,UAKV,CACH,IAAK,MAAOwC,EAAOnJ,KAASgS,EAAepD,UACvC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAKtC,IAAK,MAAOmJ,EAAOnJ,KAAS8R,EAAYlD,UACpC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgBhJ,GACpB,MAAMoJ,EAAWpJ,aAAI,EAAJA,EAAMoH,QACvB,GAAIgC,GAAYxJ,kBAAgBC,YAAYuJ,GACxC,IAAK,IAAID,EAAQ,EAAGA,GAASC,EAASvI,OAASuL,EAAiB2C,IAAK5F,IAAS,CAC1E,MAAM/B,EAAyBgC,EAAS4F,OAAO7F,IAC/C,IAAI0F,EAAe7O,aAAI,EAAJA,EAAMoB,GAEzB,GAAIgG,EAAQhG,KAAOV,KAAKY,MAAMH,WAU1B,OATI0N,IAAiBzC,EAAiBiD,UAAYjI,EAAQhG,GAAMoO,kBAAgBC,SAC5EZ,OAAetN,GAGdyP,EAA0B7D,YAG3BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBhG,EAAQ5H,WAFvEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzBzH,EAEX,MAAMkC,EAAQ5I,KAAKsI,gBAAgB5B,GACnC,GAAIkC,EACA,OAAOA,EAInB,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC9BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAGnEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAIzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SACzEjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACpDmF,EAAaoC,QAIlB,KAHKjI,KAAKkI,oBAAoBrC,GAMjCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAE3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGxG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,MAAMe,EAAc3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACzE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EAAkB3F,GAAcwF,GAA6BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAE3I7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,eAAiBR,EAAiB2C,MACnErO,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAG7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE5GhH,EACAS,KAId,OAAQ1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGlDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC3BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE7FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GACvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OACIrK,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAEvDhC,EAAOC,UAKb8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAE/C,IAAKoB,EACfmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAC7DD,EAAOC,UAKbwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAE/C,IAAKoB,EAAOkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GAC3F+L,KAAM/L,EAAOoJ,SAAauC,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACnGD,EAAOC,UAKbgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CACvCT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAC7DA,GAIP,KAIHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GAChBlM,EAAOC,UAKb+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,kBAAEC,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SAC5F+D,GACD5P,KAAKY,MAAM4L,cAAgB1L,GAAkD,OAA7Bd,KAAKY,MAAMV,oBAAuDW,IAA7Bb,KAAKY,MAAMV,gBAAgCwP,EAC/HG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EAAoB9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACzH5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GAA0B5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBACrDnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAAO,sBAEpEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACG3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAChCxC,UAAWoC,IAAWhG,KAAK1B,MAAMuN,SAASzF,SAASxC,UAAWoH,EAAO4E,GAA0B,gBAAiBG,KAC/GzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAEvCL,GAA0B1Q,kBAAgBC,YAAY6Q,IAAmBA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OAC5FrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC1E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GAA+B7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eArhBnHwQ,EAAA7D,aAAuB,EA4D5B2D,YAAA,CAATC,K,iCA6mBUC,QClrBAoB,UARapT,GACpBA,EAAMyF,OAAO4N,cACNvT,gBAACkS,EAAyB,CAACzE,SAAUvN,IAGzCF,gBAAC6N,EAA0B,CAACJ,SAAUvN,K,6CCarCoN,E,kKAAZ,SAAYA,GACRA,IAAA,eACAA,IAAA,aACAA,IAAA,aACAA,IAAA,iBACAA,IAAA,eACAA,IAAA,0BACAA,IAAA,uBAPJ,CAAYA,MAAgB,KAsBrB,MAAMC,EAAmBA,CAACrN,EAAqC4B,EAAuB0L,KACzF,MAAMtJ,EAAmBC,2BAAiB,GAAGrC,EAAiB5B,EAAMuN,SAASrJ,QAAQC,cAAcC,eAAeC,aAC5GC,EAAgD,CAClDC,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCG,GAAI,CAAEL,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCI,UAAU,GAEd,QAAyBxC,IAArByB,EAAgC,CAAC,IAADwJ,EAChC,MAAMC,EAAiC,CAAE/M,IAAKsD,GAC9C,OACIlE,gBAAC4N,IAActI,OAAAC,OAAA,CACXjB,eAAgBpE,EAAMuN,SAASrJ,QAAQC,cAAcC,eACrDkB,UAAU,sBACNmI,EAAS,CACblI,aAAcvF,EAAMuN,SAASrJ,QAAQsB,QAAQD,aAC7CnE,cAA0D,QAA7CoM,EAAExN,EAAMuN,SAAS9H,OAAOC,6BAAqB,IAAA8H,IAAIlJ,EAC9DqB,oBAAoB,OACpBC,KAAK,WACLjF,QAAS2M,KAIrB,OAAO,M,ykBC/CJ,MAAMK,UAAmC7N,gBAuB5CC,YAAmBC,GACfC,MAAMD,GArBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GAmG1C,KAAAwR,cAAgB,KAC7BvQ,KAAKC,SAAS2M,IAAa,CACvBnM,WAAY,EACZoM,WAAYD,EAAcC,cA2QjB,KAAAR,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAmI3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAClBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAI1DC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZP,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAgBK,KAAA2M,cAAgB,IAAM,KACnCV,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS2M,IAAa,CAAOnM,WAAYmM,EAAcjM,eAO/C,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UAC1DxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,MAc9D,KAAAC,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/Ed,EAA2BQ,aADL,IACoBhE,MAG1CsE,IAAmBL,IAGjBA,IAAwBK,EAMlB,KAAAiE,cAAgB,KAAW,IAAAY,EACnC5R,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,IAIjD,QAArB+E,EAAA5R,KAAKkB,SAASC,eAAO,IAAAyQ,GAArBA,EAAuBjE,SAAS,GAAmBvM,SAOvC,KAAAQ,aAAgBN,IAC8D,IAADuQ,EAAtFvQ,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,YAC3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,IAC7C,QAArBgF,EAAA7R,KAAKkB,SAASC,eAAO,IAAA0Q,GAArBA,EAAuBlE,SAAS,GAAmBvM,UAO3C,KAAA4L,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBA9lBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAM/B,OALAgB,KAAKjB,iBAAiBY,KAAK,CACvBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAE3C,OAKnBC,KAAKY,MAAQ,CACTH,WAAY,EACZiM,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAEf7M,KAAK2E,iBAAmBC,6BACpB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBACpC7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WAExB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IACpE3E,KAAKwK,WAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SAG/D,mBACN,MAAoG,OAA7FkI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGlFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACL3H,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAG9CoM,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC9EjI,SAASC,KAAKG,oBAAoB,YAAazF,KAAKqB,qBAAqB,GAGtEqE,SACH1F,KAAKxB,aAAe,EAEpB,OACIJ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAC1ClB,KAAKY,MAAM4L,aACRxM,KAAK2F,oBAELvH,2BAAA,KACIA,gBAAC0L,SAAMpG,OAAAC,OAAA,CACHC,UAAU,sBACVmG,QAAS/J,KAAKuQ,cAAa,gBAT7B,oBAWEU,MAAOjR,KAAK1B,MAAMuN,SAAS8E,UAAUO,mBAAkB,aAC3ClR,KAAK1B,MAAMuN,SAAS8E,UAAUO,oBACtClR,KAAKwK,aAEZxK,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAC+S,WAAQ,CAACvN,UAAU,mCAAmCY,OAAQxE,KAAKY,MAAMiM,WACrE7M,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAK/DD,oBACJ,MAAM,SAAES,EAAQ,iBAAEyH,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGlH,OADA7L,KAAKxB,aAAe,EAEhBJ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IACPF,EAAWlC,UACX5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YAG/ErC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GAAyB/N,KAAKY,MAAM8L,sBAGrD1M,KAAKwG,mBAMdZ,qBACJ,MAAM,SAAEQ,EAAQ,WAAEN,GAAe9F,KAAK1B,MAAMuN,SAE5C,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,UAAW,8BAChExF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKwG,iBACNpI,gBAAA,OAAKwF,UAAU,uBACXxF,gBAAA,UAAQwF,UAAU,qBAAoB,aAAY,QAAQmG,QAAS/J,KAAKgR,mBAOpFhJ,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SACnDjI,KAAK4G,oBAAoBtH,GACxBA,EAAK2I,QAGV,KAFIjI,KAAKkI,oBAAoB5I,GAKhCkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAC1BhG,EAAgC7F,KAAK1B,MAAMuN,SAAShG,cACpD,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GAMpC,GAJIlJ,kBAAgBC,YAAY0G,KAC5BA,EAAa,GAAGnF,GAAK,GAGrBV,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,MAAMI,EAAWjG,KAAKsI,qBAAgBzH,EAAWgF,GAE7CI,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,G,IAAY,WAKlD,IAAK,MAAOwC,EAAOnJ,KAASuG,EAAaqI,UACrC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgB6F,EAAuBC,GAC3C,IAAKA,EACD,OAAO,KAGX,IAAK,IAAI3F,EAAQ,EAAGA,GAAS2F,EAAKjO,OAASuL,EAAiB2C,IAAK5F,IAAS,CACtE,MAAMnJ,EAAsB8O,EAAKE,OAAO7F,IAExC,GAAInJ,EAAKoB,KAAOV,KAAKY,MAAMH,WAMvB,OALKwL,EAA2BQ,YAG5BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBpN,EAAKR,WAFpEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzB7O,EAEX,MAAMsJ,EAAQ5I,KAAKsI,gBAAgBhJ,EAAKoB,GAAIpB,EAAKoH,SACjD,GAAIkC,EACA,OAAOA,EAGf,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC/BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAIlEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAGzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SAC1EjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACnDmF,EAAaoC,SAAajI,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAIrE,KAHIT,KAAKkI,oBAAoBrC,GAMhCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAC3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAeA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGvG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,MAAMe,EAAa3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACxE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EACF3F,GAAcwF,GAA4BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAEtH7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,iBACjClM,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAI7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE7GhH,EACAS,KAIb,OAAO1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGjDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC5BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GAEvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OACIrK,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAKZ8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GACrE+L,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACzGA,GAIN,KAGHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GACjBlM,EAAOC,UAKZ+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,SAAE/E,EAAQ,kBAAEgF,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SACtG+D,GACD5P,KAAKY,MAAM4L,cACZ1L,GAC6B,OAA7Bd,KAAKY,MAAMV,oBACkBW,IAA7Bb,KAAKY,MAAMV,gBACVwP,EACCG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EACF9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACnG5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GACA5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBAC3BnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAC/D,sBAEEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyC,EAAQ,CACZxC,UAAWoC,IAAWI,EAASxC,UAAWoH,EAAO4E,GAA0B,gBAAiBG,KAE3FzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAC1CL,GACG1Q,kBAAgBC,YAAY6Q,IAC5BA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OACnBrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC3E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GACG7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eAvftFmM,EAAAQ,aAAuB,EAgE5B2D,YAAA,CAATC,K,iCA0jBUpE,Q,ykBC3nBR,MAAMqE,UAAkClS,gBAyB3CC,YAAmBC,GACfC,MAAMD,GAvBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GAEnD,KAAA8G,aAAgC,GAoGvB,KAAA0K,cAAgB,KAC7BvQ,KAAKC,SAAS2M,IAAa,CACvBnM,WAAYiL,EAAiBiD,SAC7B9B,WAAYD,EAAcC,cAwTjB,KAAAR,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAwI3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAClBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAI1DC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZ8D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAgBK,KAAA2M,cAAgB,IAAM,KACnC2D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAS2M,IAAa,CAAOnM,WAAYmM,EAAcjM,eAO/C,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UAC1DxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,MAUtF,KAAA2D,gBAAkB,KAC/B,MAAM,aAAE3K,GAAiB7F,KAAK1B,MAAMuN,SAEoE,IAAD4E,GADvGzQ,KAAK6F,aAAeA,EAChB3G,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,YAC7D,QAA5B+J,EAAAzQ,KAAK6F,aAAa,GAAGa,eAAO,IAAA+J,GAA5BA,EAA8BpR,IAAIC,IAC9B,MAAMoR,EAAgB,GAOtB,OANAhN,OAAOC,OAAO+M,EAAe,CAAE3P,YAAazB,EAAKyB,cACjD2C,OAAOC,OAAO+M,EAAe,CAAE5R,SAAUkB,KAAK1B,MAAMuN,SAAS8E,UAAUC,sBACvElN,OAAOC,OAAO+M,EAAe,CAAEzI,QAAS3I,EAAK2I,UACzC/I,kBAAgBC,YAAYG,EAAKoH,UAAYpH,EAAKuR,aAAeC,aAAW/B,QAC5EzP,EAAKoH,QAAQqK,QAAQL,GAElBpR,MAYF,KAAAwN,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/EuD,EAA0B7D,aADJ,IACmBhE,MAGzCsE,IAAmBL,IAGjBA,IAAwBK,EAMlB,KAAAiE,cAAgB,KACxBhR,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAUlF,KAAAjL,aAAgBN,IACzBA,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,WAC3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAOlF,KAAAG,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBAnqBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAM/B,OALAgB,KAAKjB,iBAAiBY,KAAK,CACvBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAE3C,OAInBC,KAAKY,MAAQ,CACTH,WAAYiL,EAAiBiD,SAC7BjC,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAGf7M,KAAK2E,iBAAmBC,6BACpB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBACpC7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WAExB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IACpE3E,KAAKwK,WAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SAG/D,mBACN,MAAoG,OAA7FkI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGlFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACL3H,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBACjDrB,KAAKwQ,kBAGF/C,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC9EjI,SAASC,KAAKG,oBAAoB,YAAazF,KAAKqB,qBAAqB,GAGtEqE,SACH1F,KAAKxB,aAAekN,EAAiB2C,IAErC,OACIjQ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAC1ClB,KAAKY,MAAM4L,aACRxM,KAAK2F,oBAELvH,2BAAA,KACIA,gBAAC0L,SAAMpG,OAAAC,OAAA,CACHC,UAAU,sBACVmG,QAAS/J,KAAKuQ,cAAa,gBAT7B,oBAWEU,MAAOjR,KAAK1B,MAAMuN,SAAS8E,UAAUO,mBAAkB,aAC3ClR,KAAK1B,MAAMuN,SAAS8E,UAAUO,oBACtClR,KAAKwK,aAEZxK,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAC+S,WAAQ,CAACvN,UAAU,mCAAmCY,OAAQxE,KAAKY,MAAMiM,WACrE7M,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAK/DD,oBACJ,MAAM,iBAAEkI,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGxG,OADA7L,KAAKxB,aAAekN,EAAiB2C,IAEjCjQ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IACPF,EAAWlC,UACX5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YAG/ErC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GAAyB/N,KAAKY,MAAM8L,sBAGrD1M,KAAKwG,mBAMdZ,qBACJ,MAAM,WAAEE,GAAe9F,KAAK1B,MAAMuN,SAClC,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,aACrDxF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKwG,iBACNpI,gBAAA,OAAKwF,UAAU,uBACXxF,gBAAA,UAAQwF,UAAU,qBAAoB,aAAY,QAAQmG,QAAS/J,KAAKgR,mBAOpFhJ,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SACnDjI,KAAK4G,oBAAoBtH,GACxBA,EAAK2I,QAGV,KAFIjI,KAAKkI,oBAAoB5I,GAKhCkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAChC,IAAIhG,EAAgC,GAEhCA,EADA7F,KAAKY,MAAM4L,aACIxM,KAAK6F,aAEL7F,KAAK1B,MAAMuN,SAAShG,aAEvC,MAAM,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GACpC,IAAIgJ,EAA2C,GAC3CC,EAAkD,GACtD,MAAMC,EAAiBC,KAAKC,MAAMD,KAAKE,UAAU5L,IAEjD,IAAK,MAAMvG,KAAQgS,EACfD,EAAqB/R,EAAKoH,QAASkI,OAAOC,GAAeA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,QAC7GzP,EAAKoH,QAAU2K,EAGnB,IAAK,MAAM/R,KAAQuG,EACfuL,EAAc9R,EAAKoH,QAASkI,OAAOC,GAAeA,EAAYnO,IAAMmO,EAAYnO,GAAKoO,kBAAgBC,QAGzG,GAAI/O,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,IAAII,EAAiC,GACrC,IAAK,MAAMoC,KAAiBxC,EAAc,CACtC,GAAIwC,EAAc3H,KAAOD,EAAY,CACjCwF,EAAWoC,EACNiI,EAA0B7D,YAK3BzM,KAAKC,SAAS,CACVU,gBAAYE,EACZ6L,oBAAqBrE,EAAcvJ,WANvCkB,KAAKC,SAAS,CACVU,gBAAYE,IAQpB,MAGJ,GADAoF,EAAWjG,KAAKsI,gBAAgBD,GAC5BpC,GAAYA,EAASvF,KAAOD,EAC5B,MAIJwF,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,G,IAAY,UAI/C,CACH,IAAK,MAAOwC,EAAOnJ,KAASgS,EAAepD,UACvC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAKtC,IAAK,MAAOmJ,EAAOnJ,KAAS8R,EAAYlD,UACpC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgBhJ,GACpB,MAAMoJ,EAAWpJ,aAAI,EAAJA,EAAMoH,QACvB,GAAIgC,GAAYxJ,kBAAgBC,YAAYuJ,GACxC,IAAK,IAAID,EAAQ,EAAGA,GAASC,EAASvI,OAASuL,EAAiB2C,IAAK5F,IAAS,CAC1E,MAAM/B,EAAyBgC,EAAS4F,OAAO7F,IAC/C,IAAI0F,EAAe7O,aAAI,EAAJA,EAAMoB,GAEzB,GAAIgG,EAAQhG,KAAOV,KAAKY,MAAMH,WAU1B,OATI0N,IAAiBzC,EAAiBiD,UAAYjI,EAAQhG,GAAMoO,kBAAgBC,SAC5EZ,OAAetN,GAGdyP,EAA0B7D,YAG3BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBhG,EAAQ5H,WAFvEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzBzH,EAEX,MAAMkC,EAAQ5I,KAAKsI,gBAAgB5B,GACnC,GAAIkC,EACA,OAAOA,EAInB,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC/BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAGlEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAGzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SAC1EjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACnDmF,EAAaoC,QAIlB,KAHIjI,KAAKkI,oBAAoBrC,GAMhCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAC3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAeA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGvG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,MAAMe,EAAa3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACxE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EACF3F,GAAcwF,GAA4BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAEtH7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,eAAiBR,EAAiB2C,MACnErO,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAG7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE7GhH,EACAS,KAIb,OAAO1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGjDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC5BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GACvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OACIrK,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAKZ8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GACrE+L,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACzGA,GAIN,KAGHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GACjBlM,EAAOC,UAKZ+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,kBAAEC,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SAC5F+D,GACD5P,KAAKY,MAAM4L,cACZ1L,GAC6B,OAA7Bd,KAAKY,MAAMV,oBACkBW,IAA7Bb,KAAKY,MAAMV,gBACVwP,EACCG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EACF9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACnG5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GACA5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBAC3BnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAC/D,sBAEEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACG3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAChCxC,UAAWoC,IACPhG,KAAK1B,MAAMuN,SAASzF,SAASxC,UAC7BoH,EACA4E,GAA0B,gBAC1BG,KAGHzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAC1CL,GACG1Q,kBAAgBC,YAAY6Q,IAC5BA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OACnBrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC3E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GACG7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eA5iBtFwQ,EAAA7D,aAAuB,EAkE5B2D,YAAA,CAATC,K,iCA+nBUC,QC7sBAoB,UARapT,GACpBA,EAAMyF,OAAO4N,cACNvT,gBAACkS,EAAyB,CAACzE,SAAUvN,IAGzCF,gBAAC6N,EAA0B,CAACJ,SAAUvN,K,6CCarCoN,E,kKAAZ,SAAYA,GACRA,IAAA,eACAA,IAAA,aACAA,IAAA,aACAA,IAAA,iBACAA,IAAA,eACAA,IAAA,0BACAA,IAAA,uBAPJ,CAAYA,MAAgB,KAsBrB,MAAMC,EAAmBA,CAACrN,EAAqC4B,EAAuB0L,KACzF,MAAMtJ,EAAmBC,2BAAiB,GAAGrC,EAAiB5B,EAAMuN,SAASrJ,QAAQC,cAAcC,eAAeC,aAC5GC,EAAgD,CAClDC,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCG,GAAI,CAAEL,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCI,UAAU,GAEd,QAAyBxC,IAArByB,EAAgC,KAAAwJ,EAChC,MAAMC,EAAiC,CAAE/M,IAAKsD,GAC9C,OACIlE,gBAAC4N,IAActI,OAAAC,OAAA,CACXjB,eAAgBpE,EAAMuN,SAASrJ,QAAQC,cAAcC,eACrDkB,UAAU,sBACNmI,EAAS,CACblI,aAAcvF,EAAMuN,SAASrJ,QAAQsB,QAAQD,aAC7CnE,cAA0D,QAA7CoM,EAAExN,EAAMuN,SAAS9H,OAAOC,6BAAqB,IAAA8H,IAAIlJ,EAC9DqB,oBAAoB,OACpBC,KAAK,WACLjF,QAAS2M,KAIrB,OAAO,M,ykBC/CL,MAAOK,UAAmC7N,gBAuB5CC,YAAmBC,GACfC,MAAMD,GArBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GA+X1C,KAAAsN,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAgJ3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAClBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAI1DC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZP,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAgBK,KAAA2M,cAAgB,IAAM,KACnCV,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS2M,IAAiB,CAAGnM,WAAYmM,EAAcjM,eAO/C,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UAC1DxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,MAc9D,KAAAC,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/Ed,EAA2BQ,aADL,IACoBhE,MAG1CsE,IAAmBL,IAGjBA,IAAwBK,EAkBlB,KAAAnL,aAAgBN,IACzBA,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,WAC3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,KAO1D,KAAAG,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBAvnBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAM/B,OALAgB,KAAKjB,iBAAiBY,KAAK,CACvBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAE3C,OAKnBC,KAAKY,MAAQ,CACTH,gBAAYI,EACZ6L,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAEf7M,KAAK2E,iBAAmBC,6BACpB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBACpC7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WAExB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IAI9D,mBACN,MAAoG,OAA7FuI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGlFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACDhN,KAAKY,MAAM4L,aACXnH,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAEjDgE,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAIlDoM,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC1EtN,KAAKY,MAAM4L,aACXnH,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAEjDgE,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAIlDqE,SAGH,OAFA1F,KAAKxB,aAAe,EAGhBJ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAC1ClB,KAAKY,MAAM4L,aACRxM,KAAK2F,oBAELvH,2BAAA,KASK4B,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAA,OAAKwF,UAAU,oCACV5D,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAQ/DD,oBACJ,MAAM,SAAES,EAAQ,iBAAEyH,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGlH,OADA7L,KAAKxB,aAAe,EAEhBJ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IACPF,EAAWlC,UACX5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YAG/ErC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GAAyB/N,KAAKY,MAAM8L,sBAGrD1M,KAAKwG,mBAMdZ,qBACJ,MAAM,SAAEQ,EAAQ,WAAEN,GAAe9F,KAAK1B,MAAMuN,SAE5C,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,UAAW,8BAChExF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKwG,mBASdwB,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SACnDjI,KAAK4G,oBAAoBtH,GACxBA,EAAK2I,QAGV,KAFIjI,KAAKkI,oBAAoB5I,GAKhCkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAC1BhG,EAAgC7F,KAAK1B,MAAMuN,SAAShG,cACpD,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GAMpC,GAJIlJ,kBAAgBC,YAAY0G,KAC5BA,EAAa,GAAGnF,GAAK,GAGrBV,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,MAAMI,EAAWjG,KAAKsI,qBAAgBzH,EAAWgF,GAE7CI,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GAAW,WAKjD,IAAK,MAAOwC,EAAOnJ,KAASuG,EAAaqI,UACrC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgB6F,EAAuBC,GAC3C,IAAKA,EACD,OAAO,KAGX,IAAK,IAAI3F,EAAQ,EAAGA,GAAS2F,EAAKjO,OAASuL,EAAiB2C,IAAK5F,IAAS,CACtE,MAAMnJ,EAAsB8O,EAAKE,OAAO7F,IAExC,GAAInJ,EAAKoB,KAAOV,KAAKY,MAAMH,WAMvB,OALKwL,EAA2BQ,YAG5BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBpN,EAAKR,WAFpEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzB7O,EAEX,MAAMsJ,EAAQ5I,KAAKsI,gBAAgBhJ,EAAKoB,GAAIpB,EAAKoH,SACjD,GAAIkC,EACA,OAAOA,EAGf,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC/BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAIlEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAGzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SAC1EjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACnDmF,EAAaoC,SAAajI,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAIrE,KAHIT,KAAKkI,oBAAoBrC,GAMhCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAC3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAeA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGvG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,GAAwB,QAApB5J,EAAOC,SACP,OAAOV,2BAAA,MAEX,MAAMoL,EAAa3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACxE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EACF3F,GAAcwF,GAA4BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAEtH7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,iBACjClM,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAI7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE7GhH,EACAS,KAIb,OAAO1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGjDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC5BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GAEvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OAAOzI,KAAKwM,aACRpO,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAGZV,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAASzB,KAAI,CAC5BQ,KAAM/L,EAAOoJ,QACb0C,YAAa3K,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBAC1CT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAKZ8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GACrE+L,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACzGA,GAIN,KAGHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GACjBlM,EAAOC,UAKZ+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,SAAE/E,EAAQ,kBAAEgF,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SACtG+D,GACD5P,KAAKY,MAAM4L,cACZ1L,GAC6B,OAA7Bd,KAAKY,MAAMV,oBACkBW,IAA7Bb,KAAKY,MAAMV,gBACVwP,EACCG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EACF9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACnG5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GACA5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBAC3BnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAC/D,sBAEEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyC,EAAQ,CACZxC,UAAWoC,IAAWI,EAASxC,UAAWoH,EAAO4E,GAA0B,gBAAiBG,KAE3FzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAC1CL,GACG1Q,kBAAgBC,YAAY6Q,IAC5BA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OACnBrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC3E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GACG7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eAlhBtFmM,EAAAQ,aAAuB,EAgE5B2D,YAAA,CAATC,K,iCAmlBUpE,Q,ykBCvpBT,MAAOqE,UAAkClS,gBAyB3CC,YAAmBC,GACfC,MAAMD,GAvBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GAEnD,KAAA8G,aAAgC,GA4FvB,KAAA0K,cAAgB,KAC7BvQ,KAAKC,SAAS2M,IAAiB,CAC3BnM,WAAYiL,EAAiBiD,SAC7B9B,WAAYD,EAAcC,cA4TjB,KAAAR,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAqH3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAAEX,IAAK+B,EAAa9B,QAASK,EAAKM,KAAMC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAGpHC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZ8D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAiBK,KAAA2M,cAAgB,IAAM,KACnC2D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAU2M,IAAa,CAAQnM,WAAYmM,EAAcjM,eAOjD,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UACbnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UACjCxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,MAUtF,KAAA2D,gBAAkB,KAC/B,MAAM,aAAE3K,GAAiB7F,KAAK1B,MAAMuN,SAEmE,IAAA4E,GADvGzQ,KAAK6F,aAAeA,EAChB3G,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,YAC7D,QAA5B+J,EAAAzQ,KAAK6F,aAAa,GAAGa,eAAO,IAAA+J,GAA5BA,EAA8BpR,IAAIC,IAC9B,MAAMoR,EAAgB,GAOtB,OANAhN,OAAOC,OAAO+M,EAAe,CAAE3P,YAAazB,EAAKyB,cACjD2C,OAAOC,OAAO+M,EAAe,CAAE5R,SAAUkB,KAAK1B,MAAMuN,SAAS8E,UAAUC,sBACvElN,OAAOC,OAAO+M,EAAe,CAAEzI,QAAS3I,EAAK2I,UACzC/I,kBAAgBC,YAAYG,EAAKoH,UAAYpH,EAAKuR,aAAeC,aAAW/B,QAC5EzP,EAAKoH,QAAQqK,QAAQL,GAElBpR,MAYF,KAAAwN,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/EuD,EAA0B7D,aADJ,IACmBhE,MAGzCsE,IAAmBL,IAGjBA,IAAwBK,EAMlB,KAAAiE,cAAgB,KACxBhR,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAUlF,KAAAjL,aAAgBN,IACzBA,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,WAC3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAOlF,KAAAG,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBA1oBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAE/B,OADAgB,KAAKjB,iBAAiBY,KAAK,CAAEX,IAAK+B,EAAa9B,QAASK,EAAKM,KAAMC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAC1G,OAInBC,KAAKY,MAAQ,CACTH,WAAYiL,EAAiBiD,SAC7BjC,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAGf7M,KAAK2E,iBAAmBC,6BAAmB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBAC3E7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WACxB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IACpE3E,KAAKwK,WAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SAG/D,mBACN,MAAqG,OAA7FkI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGnFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACL3H,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBACjDrB,KAAKwQ,kBAGF/C,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC9EjI,SAASC,KAAKG,oBAAoB,YAAazF,KAAKqB,qBAAqB,GAGtEqE,SACH1F,KAAKxB,aAAekN,EAAiB2C,IAErC,OACIjQ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAEvClB,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAuBvH,2BAAA,KAClDA,gBAAC0L,SAAMpG,OAAAC,OAAA,CACHC,UAAU,sBACVmG,QAAS/J,KAAKuQ,cAAa,gBAP7B,oBASEU,MAAOjR,KAAK1B,MAAMuN,SAAS8E,UAAUO,mBAAkB,aAC3ClR,KAAK1B,MAAMuN,SAAS8E,UAAUO,oBACtClR,KAAKwK,aAEZxK,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAC+S,WAAQ,CAACvN,UAAU,mCAAmCY,OAAQxE,KAAKY,MAAMiM,WACrE7M,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAK/DD,oBACJ,MAAM,iBAAEkI,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGxG,OADA7L,KAAKxB,aAAekN,EAAiB2C,IAEjCjQ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IAAWF,EAAWlC,UAAW5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YACvHrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GACL/N,KAAKY,MAAM8L,sBAGvB1M,KAAKwG,mBAMdZ,qBACJ,MAAM,WAAEE,GAAe9F,KAAK1B,MAAMuN,SAClC,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,aACrDxF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKwG,iBACNpI,gBAAA,OAAKwF,UAAU,uBACXxF,gBAAA,UAAQwF,UAAU,qBAAoB,aAAY,QAAQmG,QAAS/J,KAAKgR,mBAOpFhJ,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SAEtDjI,KAAK4G,oBAAoBtH,GAErBA,EAAK2I,QAKV,KAHCjI,KAAKkI,oBAAoB5I,GAM7BkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAChC,IAAIhG,EAAgC,GAEhCA,EADA7F,KAAKY,MAAM4L,aACIxM,KAAK6F,aAEL7F,KAAK1B,MAAMuN,SAAShG,aAEvC,MAAM,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GACpC,IAAIgJ,EAA2C,GAC3CC,EAAkD,GACtD,MAAMC,EAAiBC,KAAKC,MAAMD,KAAKE,UAAU5L,IAEjD,IAAK,MAAMvG,KAAQgS,EACfD,EAAqB/R,EAAKoH,QAASkI,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,QAC9GzP,EAAKoH,QAAU2K,EAGnB,IAAK,MAAM/R,KAAQuG,EACfuL,EAAc9R,EAAKoH,QAASkI,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,GAAKoO,kBAAgBC,QAG1G,GAAI/O,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,IAAII,EAAiC,GACrC,IAAK,MAAMoC,KAAiBxC,EAAc,CACtC,GAAIwC,EAAc3H,KAAOD,EAAY,CACjCwF,EAAWoC,EACNiI,EAA0B7D,YAK3BzM,KAAKC,SAAS,CACVU,gBAAYE,EACZ6L,oBAAqBrE,EAAcvJ,WANvCkB,KAAKC,SAAS,CACVU,gBAAYE,IAQpB,MAGJ,GADAoF,EAAWjG,KAAKsI,gBAAgBD,GAC5BpC,GAAYA,EAASvF,KAAOD,EAC5B,MAIJwF,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GACzB,UAKV,CACH,IAAK,MAAOwC,EAAOnJ,KAASgS,EAAepD,UACvC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAKtC,IAAK,MAAOmJ,EAAOnJ,KAAS8R,EAAYlD,UACpC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgBhJ,GACpB,MAAMoJ,EAAWpJ,aAAI,EAAJA,EAAMoH,QACvB,GAAIgC,GAAYxJ,kBAAgBC,YAAYuJ,GACxC,IAAK,IAAID,EAAQ,EAAGA,GAASC,EAASvI,OAASuL,EAAiB2C,IAAK5F,IAAS,CAC1E,MAAM/B,EAAyBgC,EAAS4F,OAAO7F,IAC/C,IAAI0F,EAAe7O,aAAI,EAAJA,EAAMoB,GAEzB,GAAIgG,EAAQhG,KAAOV,KAAKY,MAAMH,WAU1B,OATI0N,IAAiBzC,EAAiBiD,UAAYjI,EAAQhG,GAAMoO,kBAAgBC,SAC5EZ,OAAetN,GAGdyP,EAA0B7D,YAG3BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBhG,EAAQ5H,WAFvEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzBzH,EAEX,MAAMkC,EAAQ5I,KAAKsI,gBAAgB5B,GACnC,GAAIkC,EACA,OAAOA,EAInB,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC9BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAGnEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAIzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SACzEjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACpDmF,EAAaoC,QAIlB,KAHKjI,KAAKkI,oBAAoBrC,GAMjCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAE3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGxG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,MAAMe,EAAc3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACzE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EAAkB3F,GAAcwF,GAA6BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAE3I7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,eAAiBR,EAAiB2C,MACnErO,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAG7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE5GhH,EACAS,KAId,OAAQ1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGlDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC3BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE7FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GACvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OACIrK,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAEvDhC,EAAOC,UAKb8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAE/C,IAAKoB,EACfmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAC7DD,EAAOC,UAKbwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAE/C,IAAKoB,EAAOkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GAC3F+L,KAAM/L,EAAOoJ,SAAauC,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACnGD,EAAOC,UAKbgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CACvCT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAC7DA,GAIP,KAIHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GAChBlM,EAAOC,UAKb+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,kBAAEC,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SAC5F+D,GACD5P,KAAKY,MAAM4L,cAAgB1L,GAAkD,OAA7Bd,KAAKY,MAAMV,oBAAuDW,IAA7Bb,KAAKY,MAAMV,gBAAgCwP,EAC/HG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EAAoB9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACzH5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GAA0B5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBACrDnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAAO,sBAEpEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACG3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAChCxC,UAAWoC,IAAWhG,KAAK1B,MAAMuN,SAASzF,SAASxC,UAAWoH,EAAO4E,GAA0B,gBAAiBG,KAC/GzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAEvCL,GAA0B1Q,kBAAgBC,YAAY6Q,IAAmBA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OAC5FrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC1E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GAA+B7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eArhBnHwQ,EAAA7D,aAAuB,EA4D5B2D,YAAA,CAATC,K,iCA6mBUC,QClrBAoB,UARapT,GACpBA,EAAMyF,OAAO4N,cACNvT,gBAACkS,EAAyB,CAACzE,SAAUvN,IAGzCF,gBAAC6N,EAA0B,CAACJ,SAAUvN,K,6CCarCoN,E,kKAAZ,SAAYA,GACRA,IAAA,eACAA,IAAA,aACAA,IAAA,aACAA,IAAA,iBACAA,IAAA,eACAA,IAAA,0BACAA,IAAA,uBAPJ,CAAYA,MAAgB,KAsBrB,MAAMC,EAAmBA,CAACrN,EAAqC4B,EAAuB0L,KACzF,MAAMtJ,EAAmBC,2BAAiB,GAAGrC,EAAiB5B,EAAMuN,SAASrJ,QAAQC,cAAcC,eAAeC,aAC5GC,EAAgD,CAClDC,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCG,GAAI,CAAEL,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCI,UAAU,GAEd,QAAyBxC,IAArByB,EAAgC,KAAAwJ,EAChC,MAAMC,EAAiC,CAAE/M,IAAKsD,GAC9C,OACIlE,gBAAC4N,IAActI,OAAAC,OAAA,CACXjB,eAAgBpE,EAAMuN,SAASrJ,QAAQC,cAAcC,eACrDkB,UAAU,sBACNmI,EAAS,CACblI,aAAcvF,EAAMuN,SAASrJ,QAAQsB,QAAQD,aAC7CnE,cAA0D,QAA7CoM,EAAExN,EAAMuN,SAAS9H,OAAOC,6BAAqB,IAAA8H,IAAIlJ,EAC9DqB,oBAAoB,OACpBC,KAAK,WACLjF,QAAS2M,KAIrB,OAAO,M,ykBC/CL,MAAOK,UAAmC7N,gBAuB5CC,YAAmBC,GACfC,MAAMD,GArBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GA+X1C,KAAAsN,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAgJ3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAClBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAI1DC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZP,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAgBK,KAAA2M,cAAgB,IAAM,KACnCV,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS2M,IAAiB,CAAGnM,WAAYmM,EAAcjM,eAO/C,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UAC1DxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,MAc9D,KAAAC,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/Ed,EAA2BQ,aADL,IACoBhE,MAG1CsE,IAAmBL,IAGjBA,IAAwBK,EAkBlB,KAAAnL,aAAgBN,IACzBA,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,WAC3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,KAO1D,KAAAG,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBAvnBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAM/B,OALAgB,KAAKjB,iBAAiBY,KAAK,CACvBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAE3C,OAKnBC,KAAKY,MAAQ,CACTH,gBAAYI,EACZ6L,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAEf7M,KAAK2E,iBAAmBC,6BACpB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBACpC7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WAExB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IAI9D,mBACN,MAAoG,OAA7FuI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGlFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACDhN,KAAKY,MAAM4L,aACXnH,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAEjDgE,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAIlDoM,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC1EtN,KAAKY,MAAM4L,aACXnH,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAEjDgE,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAIlDqE,SAGH,OAFA1F,KAAKxB,aAAe,EAGhBJ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAC1ClB,KAAKY,MAAM4L,aACRxM,KAAK2F,oBAELvH,2BAAA,KASK4B,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAA,OAAKwF,UAAU,oCACV5D,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAQ/DD,oBACJ,MAAM,SAAES,EAAQ,iBAAEyH,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGlH,OADA7L,KAAKxB,aAAe,EAEhBJ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IACPF,EAAWlC,UACX5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YAG/ErC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GAAyB/N,KAAKY,MAAM8L,sBAGrD1M,KAAKwG,mBAMdZ,qBACJ,MAAM,SAAEQ,EAAQ,WAAEN,GAAe9F,KAAK1B,MAAMuN,SAE5C,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,UAAW,8BAChExF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKwG,mBASdwB,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SACnDjI,KAAK4G,oBAAoBtH,GACxBA,EAAK2I,QAGV,KAFIjI,KAAKkI,oBAAoB5I,GAKhCkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAC1BhG,EAAgC7F,KAAK1B,MAAMuN,SAAShG,cACpD,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GAMpC,GAJIlJ,kBAAgBC,YAAY0G,KAC5BA,EAAa,GAAGnF,GAAK,GAGrBV,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,MAAMI,EAAWjG,KAAKsI,qBAAgBzH,EAAWgF,GAE7CI,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GAAW,WAKjD,IAAK,MAAOwC,EAAOnJ,KAASuG,EAAaqI,UACrC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgB6F,EAAuBC,GAC3C,IAAKA,EACD,OAAO,KAGX,IAAK,IAAI3F,EAAQ,EAAGA,GAAS2F,EAAKjO,OAASuL,EAAiB2C,IAAK5F,IAAS,CACtE,MAAMnJ,EAAsB8O,EAAKE,OAAO7F,IAExC,GAAInJ,EAAKoB,KAAOV,KAAKY,MAAMH,WAMvB,OALKwL,EAA2BQ,YAG5BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBpN,EAAKR,WAFpEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzB7O,EAEX,MAAMsJ,EAAQ5I,KAAKsI,gBAAgBhJ,EAAKoB,GAAIpB,EAAKoH,SACjD,GAAIkC,EACA,OAAOA,EAGf,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC/BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAIlEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAGzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SAC1EjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACnDmF,EAAaoC,SAAajI,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAIrE,KAHIT,KAAKkI,oBAAoBrC,GAMhCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAC3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAeA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGvG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,GAAwB,QAApB5J,EAAOC,SACP,OAAOV,2BAAA,MAEX,MAAMoL,EAAa3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACxE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EACF3F,GAAcwF,GAA4BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAEtH7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,iBACjClM,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAI7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE7GhH,EACAS,KAIb,OAAO1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGjDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC5BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GAEvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OAAOzI,KAAKwM,aACRpO,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAGZV,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAASzB,KAAI,CAC5BQ,KAAM/L,EAAOoJ,QACb0C,YAAa3K,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBAC1CT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAKZ8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GACrE+L,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACzGA,GAIN,KAGHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GACjBlM,EAAOC,UAKZ+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,SAAE/E,EAAQ,kBAAEgF,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SACtG+D,GACD5P,KAAKY,MAAM4L,cACZ1L,GAC6B,OAA7Bd,KAAKY,MAAMV,oBACkBW,IAA7Bb,KAAKY,MAAMV,gBACVwP,EACCG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EACF9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACnG5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GACA5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBAC3BnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAC/D,sBAEEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyC,EAAQ,CACZxC,UAAWoC,IAAWI,EAASxC,UAAWoH,EAAO4E,GAA0B,gBAAiBG,KAE3FzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAC1CL,GACG1Q,kBAAgBC,YAAY6Q,IAC5BA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OACnBrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC3E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GACG7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eAlhBtFmM,EAAAQ,aAAuB,EAgE5B2D,YAAA,CAATC,K,iCAmlBUpE,Q,ykBCvpBT,MAAOqE,UAAkClS,gBAyB3CC,YAAmBC,GACfC,MAAMD,GAvBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GAEnD,KAAA8G,aAAgC,GA4FvB,KAAA0K,cAAgB,KAC7BvQ,KAAKC,SAAS2M,IAAiB,CAC3BnM,WAAYiL,EAAiBiD,SAC7B9B,WAAYD,EAAcC,cA4TjB,KAAAR,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAqH3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAAEX,IAAK+B,EAAa9B,QAASK,EAAKM,KAAMC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAGpHC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZ8D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAiBK,KAAA2M,cAAgB,IAAM,KACnC2D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAU2M,IAAa,CAAQnM,WAAYmM,EAAcjM,eAOjD,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UACbnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UACjCxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,MAUtF,KAAA2D,gBAAkB,KAC/B,MAAM,aAAE3K,GAAiB7F,KAAK1B,MAAMuN,SAEmE,IAAA4E,GADvGzQ,KAAK6F,aAAeA,EAChB3G,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,YAC7D,QAA5B+J,EAAAzQ,KAAK6F,aAAa,GAAGa,eAAO,IAAA+J,GAA5BA,EAA8BpR,IAAIC,IAC9B,MAAMoR,EAAgB,GAOtB,OANAhN,OAAOC,OAAO+M,EAAe,CAAE3P,YAAazB,EAAKyB,cACjD2C,OAAOC,OAAO+M,EAAe,CAAE5R,SAAUkB,KAAK1B,MAAMuN,SAAS8E,UAAUC,sBACvElN,OAAOC,OAAO+M,EAAe,CAAEzI,QAAS3I,EAAK2I,UACzC/I,kBAAgBC,YAAYG,EAAKoH,UAAYpH,EAAKuR,aAAeC,aAAW/B,QAC5EzP,EAAKoH,QAAQqK,QAAQL,GAElBpR,MAYF,KAAAwN,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/EuD,EAA0B7D,aADJ,IACmBhE,MAGzCsE,IAAmBL,IAGjBA,IAAwBK,EAMlB,KAAAiE,cAAgB,KACxBhR,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAUlF,KAAAjL,aAAgBN,IACzBA,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,WAC3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAOlF,KAAAG,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBA1oBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAE/B,OADAgB,KAAKjB,iBAAiBY,KAAK,CAAEX,IAAK+B,EAAa9B,QAASK,EAAKM,KAAMC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAC1G,OAInBC,KAAKY,MAAQ,CACTH,WAAYiL,EAAiBiD,SAC7BjC,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAGf7M,KAAK2E,iBAAmBC,6BAAmB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBAC3E7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WACxB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IACpE3E,KAAKwK,WAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SAG/D,mBACN,MAAqG,OAA7FkI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGnFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACL3H,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBACjDrB,KAAKwQ,kBAGF/C,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC9EjI,SAASC,KAAKG,oBAAoB,YAAazF,KAAKqB,qBAAqB,GAGtEqE,SACH1F,KAAKxB,aAAekN,EAAiB2C,IAErC,OACIjQ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAEvClB,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAuBvH,2BAAA,KAClDA,gBAAC0L,SAAMpG,OAAAC,OAAA,CACHC,UAAU,sBACVmG,QAAS/J,KAAKuQ,cAAa,gBAP7B,oBASEU,MAAOjR,KAAK1B,MAAMuN,SAAS8E,UAAUO,mBAAkB,aAC3ClR,KAAK1B,MAAMuN,SAAS8E,UAAUO,oBACtClR,KAAKwK,aAEZxK,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAC+S,WAAQ,CAACvN,UAAU,mCAAmCY,OAAQxE,KAAKY,MAAMiM,WACrE7M,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAK/DD,oBACJ,MAAM,iBAAEkI,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGxG,OADA7L,KAAKxB,aAAekN,EAAiB2C,IAEjCjQ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IAAWF,EAAWlC,UAAW5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YACvHrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GACL/N,KAAKY,MAAM8L,sBAGvB1M,KAAKwG,mBAMdZ,qBACJ,MAAM,WAAEE,GAAe9F,KAAK1B,MAAMuN,SAClC,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,aACrDxF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKwG,iBACNpI,gBAAA,OAAKwF,UAAU,uBACXxF,gBAAA,UAAQwF,UAAU,qBAAoB,aAAY,QAAQmG,QAAS/J,KAAKgR,mBAOpFhJ,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SAEtDjI,KAAK4G,oBAAoBtH,GAErBA,EAAK2I,QAKV,KAHCjI,KAAKkI,oBAAoB5I,GAM7BkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAChC,IAAIhG,EAAgC,GAEhCA,EADA7F,KAAKY,MAAM4L,aACIxM,KAAK6F,aAEL7F,KAAK1B,MAAMuN,SAAShG,aAEvC,MAAM,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GACpC,IAAIgJ,EAA2C,GAC3CC,EAAkD,GACtD,MAAMC,EAAiBC,KAAKC,MAAMD,KAAKE,UAAU5L,IAEjD,IAAK,MAAMvG,KAAQgS,EACfD,EAAqB/R,EAAKoH,QAASkI,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,QAC9GzP,EAAKoH,QAAU2K,EAGnB,IAAK,MAAM/R,KAAQuG,EACfuL,EAAc9R,EAAKoH,QAASkI,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,GAAKoO,kBAAgBC,QAG1G,GAAI/O,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,IAAII,EAAiC,GACrC,IAAK,MAAMoC,KAAiBxC,EAAc,CACtC,GAAIwC,EAAc3H,KAAOD,EAAY,CACjCwF,EAAWoC,EACNiI,EAA0B7D,YAK3BzM,KAAKC,SAAS,CACVU,gBAAYE,EACZ6L,oBAAqBrE,EAAcvJ,WANvCkB,KAAKC,SAAS,CACVU,gBAAYE,IAQpB,MAGJ,GADAoF,EAAWjG,KAAKsI,gBAAgBD,GAC5BpC,GAAYA,EAASvF,KAAOD,EAC5B,MAIJwF,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GACzB,UAKV,CACH,IAAK,MAAOwC,EAAOnJ,KAASgS,EAAepD,UACvC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAKtC,IAAK,MAAOmJ,EAAOnJ,KAAS8R,EAAYlD,UACpC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgBhJ,GACpB,MAAMoJ,EAAWpJ,aAAI,EAAJA,EAAMoH,QACvB,GAAIgC,GAAYxJ,kBAAgBC,YAAYuJ,GACxC,IAAK,IAAID,EAAQ,EAAGA,GAASC,EAASvI,OAASuL,EAAiB2C,IAAK5F,IAAS,CAC1E,MAAM/B,EAAyBgC,EAAS4F,OAAO7F,IAC/C,IAAI0F,EAAe7O,aAAI,EAAJA,EAAMoB,GAEzB,GAAIgG,EAAQhG,KAAOV,KAAKY,MAAMH,WAU1B,OATI0N,IAAiBzC,EAAiBiD,UAAYjI,EAAQhG,GAAMoO,kBAAgBC,SAC5EZ,OAAetN,GAGdyP,EAA0B7D,YAG3BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBhG,EAAQ5H,WAFvEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzBzH,EAEX,MAAMkC,EAAQ5I,KAAKsI,gBAAgB5B,GACnC,GAAIkC,EACA,OAAOA,EAInB,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC9BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAGnEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAIzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SACzEjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACpDmF,EAAaoC,QAIlB,KAHKjI,KAAKkI,oBAAoBrC,GAMjCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAE3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGxG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,MAAMe,EAAc3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACzE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EAAkB3F,GAAcwF,GAA6BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAE3I7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,eAAiBR,EAAiB2C,MACnErO,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAG7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE5GhH,EACAS,KAId,OAAQ1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGlDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC3BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE7FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GACvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OACIrK,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAEvDhC,EAAOC,UAKb8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAE/C,IAAKoB,EACfmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAC7DD,EAAOC,UAKbwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAE/C,IAAKoB,EAAOkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GAC3F+L,KAAM/L,EAAOoJ,SAAauC,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACnGD,EAAOC,UAKbgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CACvCT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAC7DA,GAIP,KAIHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GAChBlM,EAAOC,UAKb+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,kBAAEC,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SAC5F+D,GACD5P,KAAKY,MAAM4L,cAAgB1L,GAAkD,OAA7Bd,KAAKY,MAAMV,oBAAuDW,IAA7Bb,KAAKY,MAAMV,gBAAgCwP,EAC/HG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EAAoB9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACzH5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GAA0B5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBACrDnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAAO,sBAEpEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACG3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAChCxC,UAAWoC,IAAWhG,KAAK1B,MAAMuN,SAASzF,SAASxC,UAAWoH,EAAO4E,GAA0B,gBAAiBG,KAC/GzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAEvCL,GAA0B1Q,kBAAgBC,YAAY6Q,IAAmBA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OAC5FrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC1E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GAA+B7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eArhBnHwQ,EAAA7D,aAAuB,EA4D5B2D,YAAA,CAATC,K,iCA6mBUC,QClrBAoB,UARapT,GACpBA,EAAMyF,OAAO4N,cACNvT,gBAACkS,EAAyB,CAACzE,SAAUvN,IAGzCF,gBAAC6N,EAA0B,CAACJ,SAAUvN,K,kCCS1C,IAAKwQ,EASAgC,EATZ,6EAAYhC,GACRA,IAAA,eACAA,IAAA,qBAFJ,CAAYA,MAAe,KAS3B,SAAYgC,GACRA,EAAA,UACAA,EAAA,gBAFJ,CAAYA,MAAU,M,qvBCUtB,MAAMgB,UAAuB1T,gBAyBzBC,YAAYC,GACRC,MAAMD,GAjBF,KAAAyT,UAAoB,EAEpB,KAAAC,OAAiB,EAmPR,KAAAC,qBAAwBC,IACrC,OAAQA,GACJ,IAAI,mBACAlS,KAAK+R,UAAW,EAChB/R,KAAKgS,OAAQ,EACb,MACJ,IAAI,UACAhS,KAAK+R,UAAW,EAChB/R,KAAKgS,OAAQ,EACb,MACJ,IAAI,MACAhS,KAAK+R,UAAW,EAChB/R,KAAKgS,OAAQ,IA/OrBhS,KAAKmS,gBAAkBnS,KAAKmS,gBAAgBzN,KAAK1E,MACjDA,KAAKoS,SACD9T,EAAMkE,QAAQsB,SAAWxF,EAAMkE,QAAQsB,QAAQuO,QAAgD,WAAtC/T,EAAMkE,QAAQsB,QAAQuO,OAAOC,KAAoB,KAAO,KACrHtS,KAAKiS,qBAAqBjS,KAAK1B,MAAMyF,QAAU/D,KAAK1B,MAAMyF,OAAOwO,sBACjEvS,KAAKY,MAAQ,CAAEsM,SAAUlN,KAAKkN,UAC9BlN,KAAKoI,aAAe,GAhBjB,uBAAuBoK,EAAgBC,GAC1C,IAAIC,EAKJ,OAJIF,GAAUC,GAAoBA,EAAiBtS,OAAS,IACxDuS,EAAkBD,EAAiBE,KAAKrT,GAAQA,EAAKsT,SAAUC,gBAAkBL,EAAOK,gBAGrFH,GAAmBA,EAAgBI,KAapC,eACN,MAAyB,OAAlB9S,KAAKoS,UAAuC,OAAlBpS,KAAKoS,SAGnClN,oBACCC,IAASC,YACTpF,KAAK+S,4BAA8BxF,4BAAkBC,OAAQ,SAAUxN,KAAKmS,kBAEhFnS,KAAKmS,kBAGF3M,uBACCL,IAASC,WACToI,OAAO/H,oBAAoB,SAAUzF,KAAK+S,6BAA8B,GAIzErN,SAAM,IAAAsN,EAAAC,EAET,GADAjT,KAAKoI,aAAepI,KAAKkT,WACrBC,YAAoBnT,KAAK1B,MAAMgC,MAE/B,OADAN,KAAK1B,MAAMyG,UAAUqE,MAAM,+BACpB,KAGX,MAQMgK,EAAS3O,MAAA,GACRzE,KAAK1B,OACL0B,KAAKY,OAAK,IACblB,cAXyC,CACzCmD,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCoQ,GAAI,CAAEtQ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCI,UAAU,GAOVQ,aAAc7D,KAAK1B,MAAMkE,QAAQsB,QAAQD,aACzCiC,WAAY,CACRwN,YAAatT,KAAK1B,MAClBsF,UAAWoC,IAAW,SAAUhG,KAAK1B,MAAMyF,OAAOH,UAAW5D,KAAKY,MAAMsM,SAAW,YAAc,cACjGqG,IAAK,MACLrP,KAAMlE,KAAKkN,SAAW,UAAY,cAEtC9G,SAAU,CACNxC,UAAW,eACX2P,IAAK,KACLrP,KAAMlE,KAAKkN,SAAW,UAAY,QAEtC/E,SAAU,CACNvE,UAAW,qBACXM,KAAM,eACNqP,IAAK,MAETzS,kBAAyD,QAAxCkS,EAAEhT,KAAK1B,MAAMyF,OAAOyP,4BAAoB,IAAAR,KACzD3H,uBAAiE,QAA3C4H,EAAEjT,KAAK1B,MAAMyF,OAAO0P,+BAAuB,IAAAR,KACjE7I,KAAM,CACFmJ,IAAK,IACL3P,UAAW,2BACXM,KAAMlE,KAAKkN,SAAW,SAAW,YAErC/B,aAAc,CACVoI,IAAK,MACL3P,UAAW,mBAEfwH,kBAAmB,CACfmI,IAAK,MACL3P,UAAW,iBACXM,KAAM,YAEV4F,OAAQ,CACJlG,UAAW,6BACX2P,IAAK,SACLrP,KAAMlE,KAAKkN,SAAW,SAAW,WACjCnD,QAAS/J,KAAK1B,OAElBoV,eAAgB,CACZ9P,UAAW,6BAEfmH,KAAM,CACFnH,UAAW,2BACX2P,IAAK,QAETzF,2BAA4B,CACxBlK,UAAW,mCAEfiK,iBAAkB,CACdjK,UAAW,0CACX2P,IAAK,SACL,aAAcvT,KAAK1B,MAAMqS,UAAUgD,oBACnC5J,QAAS/J,KAAK1B,OAElByP,uBAAwB,CACpBnK,UAAW,wCACX2P,IAAK,QAET/S,aAAcR,KAAKY,MAAMsM,SACzBrH,aAAc7F,KAAKoI,aACnBxE,UAAWoC,IAAW,SAAUhG,KAAK1B,MAAMyF,OAAOH,aAGtD,OAAO5D,KAAK1B,MAAMsV,WAAWR,GAGzBF,WACJ,MAAM,KAAE5S,EAAI,OAAEyD,GAAW/D,KAAK1B,MACxBuV,EAA8B,GAYpC,OAXI7T,KAAK+R,UAAYzR,GAAQA,EAAKwT,YAAcxT,EAAKwT,WAAWC,QAAUzT,EAAKwT,WAAWC,OAAO5T,OAAS,GACtGG,EAAKwT,WAAWC,OAAO1U,IAAI,CAACC,EAAyBmJ,IACjDoL,EAAWlU,KAAKK,KAAKgU,uBAAuB1U,OAAMuB,GAAW,EAAM4H,GAAO,KAI9EzI,KAAKgS,OAASjO,EAAOkQ,aAAelQ,EAAOkQ,YAAY9T,OAAS,GAChE4D,EAAOkQ,YAAY5U,IAAI,CAACC,EAAwBiK,IAC5CsK,EAAWlU,KAAKK,KAAKgU,4BAAuBnT,EAAWvB,GAAM,EAAOiK,EAAM,KAG3EvJ,KAAKkU,0BAA0BL,GAGlCK,0BAA0BL,GAA2B,IAAAM,EAAAC,EAEzD,KAD0D,QAAlCD,EAAGnU,KAAK1B,MAAMyF,OAAO4N,qBAAa,IAAAwC,MAEtD,OAAON,EAEX,MAAMQ,EAAsC,GACtCC,EAAU,CACZ5T,GAAI,EACJ5B,SAA8C,QAAtCsV,EAAEpU,KAAK1B,MAAMyF,OAAOwQ,0BAAkB,IAAAH,IAAI,MAClDnM,QAAS,IACTlH,iBAAaF,EACb6F,QAASmN,GAIb,OAFAQ,EAAmB1U,KAAK2U,GAEjBD,EAGHL,uBACJQ,EACAC,EACA1C,EACAxI,EACAmL,GAEA,MAAMlC,EACFxS,KAAK1B,MAAMkE,SAAWxC,KAAK1B,MAAMkE,QAAQsB,SAAW9D,KAAK1B,MAAMkE,QAAQsB,QAAQ0O,OACzExS,KAAK1B,MAAMkE,QAAQsB,QAAQ0O,OAC3B,SACJ,2BAAEmC,GAA+B3U,KAAK1B,MAAMyF,OAC5C6Q,EAAeH,GAAWA,EAAQ3V,UAAa,IAC/C,cAAE+V,GAAkB7U,KAAK1B,MAAMqS,UAG/BmE,EACFN,IACAG,aAA0B,EAA1BA,EAA4B/F,OAAOmG,IAAS,IAAAC,EAAAC,EAAA,OAA0B,QAAtBD,EAAAD,EAAUG,oBAAY,IAAAF,OAAA,EAAtBA,EAAwBnC,kBAAkB2B,SAAgB,QAANS,EAAVT,EAAYW,YAAI,IAAAF,OAAA,EAAhBA,EAAkBpC,kBAGhH,IAAI9R,EAAsB,QAIX,IAADqU,EAAAC,EAAd,OAHInW,kBAAgBC,YAAYqV,aAAU,EAAVA,EAAYc,SAAWd,EAAYc,OAAO,GAAGC,MACzExU,EAAcyT,EAAYc,OAAO,GAAGC,KAEpCxD,EACO,CACHrR,GAAIoR,EAAe0D,eACnB1W,SAA8E,QAAtEsW,EAAEtD,EAAe2D,gBAAgBjD,EAAQgC,aAAU,EAAVA,EAAYkB,yBAAiB,IAAAN,IAAI,GAClFnN,QAASuM,aAAU,EAAVA,EAAYmB,IACrB5U,cACA2F,QAAS1G,KAAK4V,mBAAmBpB,EAAYzT,EAAa2T,GAC1DtV,mBAAoBY,KAAK1B,MAAMyF,OAAO0P,yBAA2BqB,EACjEjE,WAAYC,IAAW/B,OACvB3H,UAAW,GAAuE,QAAvEiO,EAAGvD,EAAe2D,gBAAgBjD,EAAQgC,aAAU,EAAVA,EAAYkB,yBAAiB,IAAAL,IAAI,MAAMR,KAG7F,CACHnU,GAAIoR,EAAe+D,gBACnB/W,SAAU8V,EACV3M,QAAUwM,GAAWA,EAAQ3U,SAAW2U,EAAQ3U,QAAQC,gBAAmB,GAC3E+V,oBAAsBrB,GAAWA,EAAQsB,WAAatB,EAAQsB,UAAUhW,gBAAmB,GAC3FgB,YAAc0T,GAAWA,EAAQlV,OAASkV,EAAQlV,MAAMP,KAAQ,GAChE0H,QAAS1G,KAAKgW,sBAAsBvB,GACpC5D,WAAYC,IAAWmF,IACvBvL,iBAAkB+J,aAAO,EAAPA,EAASyB,aAC3B9O,UAAW,GAAGwN,KAAeC,KAI7Be,mBAAmBO,EAA8BC,GAAsD,IAA7B1B,EAAAxK,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,IAAAA,UAAA,GAC9E,MAAMmM,EAAkC,GACxC,OAAKF,GAAaA,EAASG,UAAyC,IAA7BH,EAASG,SAASnW,SAGpDH,KAAK1B,MAAMyF,OAAO4N,eAAiB+C,GACpC2B,EAAe1W,KAAK,CAChBb,SAAUkB,KAAK1B,MAAMqS,UAAUC,oBAC/B7P,YAAaqV,EACbnO,QAASsO,yBAAeJ,EAAWnW,KAAK1B,MAAMkE,QAAuC,MAG7F2T,EAASG,SAASjX,IAAI,CAACC,EAAyBmJ,KAC5C4N,EAAe1W,KAAKK,KAAKgU,uBAAuB1U,OAAMuB,GAAW,EAAM4H,GAAO,MAE3E4N,GAZI,GAePL,sBAAsBG,GAC1B,MAAME,EAAkC,GAExC,OAAKF,GAAaA,EAASzN,UAAyC,IAA7ByN,EAASzN,SAASvI,QAIzDgW,EAASzN,SAASrJ,IAAI,CAACC,EAAqBiK,KACxC8M,EAAe1W,KAAKK,KAAKgU,4BAAuBnT,EAAWvB,GAAM,EAAOiK,MAErE8M,GANI,GA2BPlE,kBACJnS,KAAKoS,SAAWpS,KAAKwW,eACrBxW,KAAKC,SAAS,CAAEiN,SAAUlN,KAAKkN,WAG3BsJ,eACJ,MAAM,QAAEhU,GAAYxC,KAAK1B,MAGzB,GAAIkE,EAAQsB,SAAWtB,EAAQsB,QAAQuO,QAA0C,WAAhC7P,EAAQsB,QAAQuO,OAAOC,KACpE,MAAO,KAGX,GAAInN,IAASC,WAAaoI,OAAOiJ,WAAY,CACzC,MAAM5S,EAAerB,EAAQsB,QAAQD,aACrC,GAAIA,EACA,OAAIA,EAAaf,IAAM0K,OAAOiJ,YAAc5S,EAAaf,GAAGE,EACjD,KACAa,EAAaX,IAAMsK,OAAOiJ,YAAc5S,EAAaX,GAAGF,EACxD,KACAa,EAAaV,IAAMqK,OAAOiJ,YAAc5S,EAAaV,GAAGH,EACxD,KACAa,EAAaT,IAAMoK,OAAOiJ,YAAc5S,EAAaT,GAAGJ,EACxD,KAEJ,KAIf,MAAO,MA5SI8O,EAAA+D,cAAwB/G,IAAgBmH,IAExCnE,EAAA0D,aAAuB1G,IAAgBC,OAWtDqB,YAAA,CADCsG,K,+BAsBStG,YAAA,CAATC,K,6BA8QUyB,a,mBCnWf6E,EAAOC,QAAUxY,O,2rBCAjB,MAAMyY,EAAU,CAAEC,QAAS,GAAIC,YAAa,IAwCvCF,EAAQC,QAAQ,mBAAqB,CAClCE,EAAGA,IAAMC,EAAQ,QACjBC,MAAO,gBACPC,GAAI,CAAC,CAACC,KAAK,aAAeC,KAAK,8EAA+EC,MAAO,IAErHC,KAAK,EACLC,GAAI,6BACJC,EAAG,kBACHC,EAAG,kBAEHC,IAAK,GAGLxU,GAAI,4FAlC4ByU,EAACC,EAAqBC,KAUlD,GADAjB,EAAQE,YAAYc,GAAuBC,GACtCjB,EAAQE,YAAYc,GAAqBE,QAC1C,MAAM,IAAIC,MAAM,oBAAsBH,EAAsB,mCAEhEhB,EAAQE,YAAYc,GAAqBE,QAAQE,UAAUC,eAAiBL,EACxEhB,EAAQE,YAAYc,GAAqBE,QAAQE,UAAUvX,KAC3DmW,EAAQE,YAAYF,EAAQE,YAAYc,GAAqBE,QAAQE,UAAUvX,IAAMmX,IA0BzFD,CAF4B,8EACXX,EAAQ,SAMjCzJ,OAAO2K,aAAe3K,OAAO2K,cAAgB,GAC7C3K,OAAO2K,aAAarB,QAAOrS,IAAA,GACpB+I,OAAO2K,aAAarB,SAAW,IAC/BD,EAAQC,SAGXtJ,OAAO2K,aAAapB,YAAWtS,IAAA,GAC5B+I,OAAO2K,aAAapB,aAAe,IACnCF,EAAQE,aAEY,MAAMqB,EAAiB,GAC9BA,EAAe,oEAAsE,CAC7FpB,EAAGA,IAAMC,EAAQ,QACjBoB,GAAI,uCAEpBD,EAAe,wEAA0E,CACzEpB,EAAGA,IAAMC,EAAQ,QACjBoB,GAAI,uCAEpBD,EAAe,oEAAsE,CACrEpB,EAAGA,IAAMC,EAAQ,QACjBoB,GAAI,uCAEpBD,EAAe,gEAAkE,CACjEpB,EAAGA,IAAMC,EAAQ,QACjBoB,GAAI,uCAEpBD,EAAe,yFAA2F,CAC1FpB,EAAGA,IAAMC,EAAQ,QACjBoB,GAAI,kEAEpBD,EAAe,sFAAwF,CACvFpB,EAAGA,IAAMC,EAAQ,QACjBoB,GAAI,8DAEpBD,EAAe,kGAAoG,CACnGpB,EAAGA,IAAMC,EAAQ,QACjBoB,GAAI,qEAEpB7K,OAAO2K,aAAe3K,OAAO2K,cAAgB,GAC7C3K,OAAO2K,aAAaC,eAAc3T,IAAA,GACP+I,OAAO2K,aAAaC,gBAAkB,IACtCA,I,6CCxEf1M,E,kKAAZ,SAAYA,GACRA,IAAA,eACAA,IAAA,aACAA,IAAA,aACAA,IAAA,iBACAA,IAAA,eACAA,IAAA,0BACAA,IAAA,uBAPJ,CAAYA,MAAgB,KAsBrB,MAAMC,EAAmBA,CAACrN,EAAqC4B,EAAuB0L,KACzF,MAAMtJ,EAAmBC,2BAAiB,GAAGrC,EAAiB5B,EAAMuN,SAASrJ,QAAQC,cAAcC,eAAeC,aAC5GC,EAAgD,CAClDC,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCG,GAAI,CAAEL,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCI,UAAU,GAEd,QAAyBxC,IAArByB,EAAgC,KAAAwJ,EAChC,MAAMC,EAAiC,CAAE/M,IAAKsD,GAC9C,OACIlE,gBAAC4N,IAActI,OAAAC,OAAA,CACXjB,eAAgBpE,EAAMuN,SAASrJ,QAAQC,cAAcC,eACrDkB,UAAU,sBACNmI,EAAS,CACblI,aAAcvF,EAAMuN,SAASrJ,QAAQsB,QAAQD,aAC7CnE,cAA0D,QAA7CoM,EAAExN,EAAMuN,SAAS9H,OAAOC,6BAAqB,IAAA8H,IAAIlJ,EAC9DqB,oBAAoB,OACpBC,KAAK,WACLjF,QAAS2M,KAIrB,OAAO,M,ykBC/CL,MAAOK,UAAmC7N,gBAuB5CC,YAAmBC,GACfC,MAAMD,GArBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GA+X1C,KAAAsN,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAgJ3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAClBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAI1DC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZP,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAgBK,KAAA2M,cAAgB,IAAM,KACnCV,EAA2BQ,aAAc,EACzCzM,KAAKC,SAAS2M,IAAiB,CAAGnM,WAAYmM,EAAcjM,eAO/C,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UAC1DxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,MAc9D,KAAAC,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/Ed,EAA2BQ,aADL,IACoBhE,MAG1CsE,IAAmBL,IAGjBA,IAAwBK,EAkBlB,KAAAnL,aAAgBN,IACzBA,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,WAC3E7M,KAAKC,SAAS,CAAEQ,WAAY,EAAGiM,oBAAqB,GAAIG,WAAW,KAO1D,KAAAG,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBAvnBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAM/B,OALAgB,KAAKjB,iBAAiBY,KAAK,CACvBX,IAAK+B,EACL9B,QAASK,EAAKM,KACdC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAE3C,OAKnBC,KAAKY,MAAQ,CACTH,gBAAYI,EACZ6L,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAEf7M,KAAK2E,iBAAmBC,6BACpB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBACpC7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WAExB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IAI9D,mBACN,MAAoG,OAA7FuI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGlFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACDhN,KAAKY,MAAM4L,aACXnH,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAEjDgE,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAIlDoM,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC1EtN,KAAKY,MAAM4L,aACXnH,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAEjDgE,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBAIlDqE,SAGH,OAFA1F,KAAKxB,aAAe,EAGhBJ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAC1ClB,KAAKY,MAAM4L,aACRxM,KAAK2F,oBAELvH,2BAAA,KASK4B,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAA,OAAKwF,UAAU,oCACV5D,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAQ/DD,oBACJ,MAAM,SAAES,EAAQ,iBAAEyH,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGlH,OADA7L,KAAKxB,aAAe,EAEhBJ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IACPF,EAAWlC,UACX5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YAG/ErC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GAAyB/N,KAAKY,MAAM8L,sBAGrD1M,KAAKwG,mBAMdZ,qBACJ,MAAM,SAAEQ,EAAQ,WAAEN,GAAe9F,KAAK1B,MAAMuN,SAE5C,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,UAAW,8BAChExF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEG,SAAS,OACxBvG,KAAKwG,mBASdwB,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SACnDjI,KAAK4G,oBAAoBtH,GACxBA,EAAK2I,QAGV,KAFIjI,KAAKkI,oBAAoB5I,GAKhCkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAC1BhG,EAAgC7F,KAAK1B,MAAMuN,SAAShG,cACpD,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GAMpC,GAJIlJ,kBAAgBC,YAAY0G,KAC5BA,EAAa,GAAGnF,GAAK,GAGrBV,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,MAAMI,EAAWjG,KAAKsI,qBAAgBzH,EAAWgF,GAE7CI,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GAAW,WAKjD,IAAK,MAAOwC,EAAOnJ,KAASuG,EAAaqI,UACrC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgB6F,EAAuBC,GAC3C,IAAKA,EACD,OAAO,KAGX,IAAK,IAAI3F,EAAQ,EAAGA,GAAS2F,EAAKjO,OAASuL,EAAiB2C,IAAK5F,IAAS,CACtE,MAAMnJ,EAAsB8O,EAAKE,OAAO7F,IAExC,GAAInJ,EAAKoB,KAAOV,KAAKY,MAAMH,WAMvB,OALKwL,EAA2BQ,YAG5BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBpN,EAAKR,WAFpEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzB7O,EAEX,MAAMsJ,EAAQ5I,KAAKsI,gBAAgBhJ,EAAKoB,GAAIpB,EAAKoH,SACjD,GAAIkC,EACA,OAAOA,EAGf,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC/BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAIlEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAGzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SAC1EjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACnDmF,EAAaoC,SAAajI,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAIrE,KAHIT,KAAKkI,oBAAoBrC,GAMhCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAC3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAeA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGvG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,GAAwB,QAApB5J,EAAOC,SACP,OAAOV,2BAAA,MAEX,MAAMoL,EAAa3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACxE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EACF3F,GAAcwF,GAA4BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAEtH7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,iBACjClM,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAI7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE7GhH,EACAS,KAIb,OAAO1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGjDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC5BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GAEvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OAAOzI,KAAKwM,aACRpO,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAGZV,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAASzB,KAAI,CAC5BQ,KAAM/L,EAAOoJ,QACb0C,YAAa3K,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBAC1CT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAExDhC,EAAOC,UAKZ8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GACrE+L,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACzGA,GAIN,KAGHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GACjBlM,EAAOC,UAKZ+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,SAAE/E,EAAQ,kBAAEgF,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SACtG+D,GACD5P,KAAKY,MAAM4L,cACZ1L,GAC6B,OAA7Bd,KAAKY,MAAMV,oBACkBW,IAA7Bb,KAAKY,MAAMV,gBACVwP,EACCG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EACF9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACnG5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GACA5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBAC3BnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAC/D,sBAEEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyC,EAAQ,CACZxC,UAAWoC,IAAWI,EAASxC,UAAWoH,EAAO4E,GAA0B,gBAAiBG,KAE3FzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAC1CL,GACG1Q,kBAAgBC,YAAY6Q,IAC5BA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OACnBrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC3E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GACG7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eAlhBtFmM,EAAAQ,aAAuB,EAgE5B2D,YAAA,CAATC,K,iCAmlBUpE,Q,ykBCvpBT,MAAOqE,UAAkClS,gBAyB3CC,YAAmBC,GACfC,MAAMD,GAvBO,KAAA4N,eAAyBR,EAAiBS,KAEnD,KAAA3N,aAAuBkN,EAAiBU,KAM/B,KAAA1N,UAAoBgN,EAAiBhN,UAIrC,KAAAK,iBAA0C,GAEnD,KAAA8G,aAAgC,GA4FvB,KAAA0K,cAAgB,KAC7BvQ,KAAKC,SAAS2M,IAAiB,CAC3BnM,WAAYiL,EAAiBiD,SAC7B9B,WAAYD,EAAcC,cA4TjB,KAAAR,0BAA4B,CAACC,EAA4BtF,IAA0B,KAChG,MAAM,eAAE3C,GAAmBrE,KAAKY,MAC1B0D,EAAU,CAAE,CAACgI,IAAWtF,GAC9BhH,KAAKC,SAAS,CAAEoE,eAAcI,IAAA,GAAOJ,GAAmBC,MAqH3C,KAAA3F,qBAAuB,CAAC4N,EAA6B1N,IAA0B,KAC5F,MAAMC,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CC,EAA0C,CAAC,CAAEC,IAAKuN,EAAqBtN,QAASH,IAGtF,GAAII,kBAAgBC,YAAYN,EAAOO,oBACnC,IAAK,MAAME,KAAQT,EAAOO,mBAAoB,CAC1C,MAAM2B,EAAczB,EAAKC,MAAMP,IAC/BD,EAAiBY,KAAK,CAAEX,IAAK+B,EAAa9B,QAASK,EAAKM,KAAMC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAGpHC,KAAKC,SAAS,CACVC,cAAehB,kBAAgBC,YAAYJ,GAAoBA,EAAmB,CAAC,CAAEC,IAAK,aAUjF,KAAAqB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAKY,MAAM4L,cASZ8D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBC,WAAYJ,IAEZP,KAAK1B,MAAMuN,SAAS/K,mBACpBd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAiBK,KAAA2M,cAAgB,IAAM,KACnC2D,EAA0B7D,aAAc,EACxCzM,KAAKC,SAAU2M,IAAa,CAAQnM,WAAYmM,EAAcjM,eAOjD,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UACbnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,UACjCxB,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,MAUtF,KAAA2D,gBAAkB,KAC/B,MAAM,aAAE3K,GAAiB7F,KAAK1B,MAAMuN,SAEmE,IAAA4E,GADvGzQ,KAAK6F,aAAeA,EAChB3G,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,YAC7D,QAA5B+J,EAAAzQ,KAAK6F,aAAa,GAAGa,eAAO,IAAA+J,GAA5BA,EAA8BpR,IAAIC,IAC9B,MAAMoR,EAAgB,GAOtB,OANAhN,OAAOC,OAAO+M,EAAe,CAAE3P,YAAazB,EAAKyB,cACjD2C,OAAOC,OAAO+M,EAAe,CAAE5R,SAAUkB,KAAK1B,MAAMuN,SAAS8E,UAAUC,sBACvElN,OAAOC,OAAO+M,EAAe,CAAEzI,QAAS3I,EAAK2I,UACzC/I,kBAAgBC,YAAYG,EAAKoH,UAAYpH,EAAKuR,aAAeC,aAAW/B,QAC5EzP,EAAKoH,QAAQqK,QAAQL,GAElBpR,MAYF,KAAAwN,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAE/EuD,EAA0B7D,aADJ,IACmBhE,MAGzCsE,IAAmBL,IAGjBA,IAAwBK,EAMlB,KAAAiE,cAAgB,KACxBhR,KAAKY,MAAM4L,aAGZxM,KAAKC,SAAS,CAAEQ,gBAAYI,EAAW6L,oBAAqB,GAAIG,WAAW,IAF3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAUlF,KAAAjL,aAAgBN,IACzBA,EAAMO,UAAY7B,KAAKtB,YAAcsB,KAAKY,MAAM4L,cAAgBxM,KAAKY,MAAMiM,WAC3E7M,KAAKC,SAAS,CAAEQ,WAAYiL,EAAiBiD,SAAUjC,oBAAqB,GAAIG,WAAW,KAOlF,KAAAG,sBAAwB,KACrChN,KAAKC,SAAS,CAAEuM,aAAcxM,KAAKwM,gBA1oBnCxM,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB,MAAM,aAAEyH,GAAiB7F,KAAK1B,MAAMuN,SACpC,GAAI3M,kBAAgBC,YAAY0G,IAAiB3G,kBAAgBC,YAAY0G,EAAa,GAAGa,SAAU,CACnG,MAAM2D,EAAcxE,EAAa,GAAGa,QAAQ,GAAG3F,YAAc8E,EAAa,GAAGa,QAAQ,GAAG3F,YAAc,GAChGjC,EAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW+G,EAAa,GAAGa,QAAQ,GAAG5H,SAAW,GAC7FkB,KAAKjB,iBAAmB,CAAC,CAAEC,IAAKqL,EAAapL,QAASH,IAGlDI,kBAAgBC,YAAY0G,EAAa,GAAGa,QAAQ,GAAGtH,qBACvDyG,EAAa,GAAGa,QAAQ,GAAGtH,mBAAmBC,IAAIC,IAC9C,MAAMyB,EAAczB,EAAKC,MAAMP,IAE/B,OADAgB,KAAKjB,iBAAiBY,KAAK,CAAEX,IAAK+B,EAAa9B,QAASK,EAAKM,KAAMC,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,kBAC1G,OAInBC,KAAKY,MAAQ,CACTH,WAAYiL,EAAiBiD,SAC7BjC,oBAAqB,GACrB/L,gBAAYE,EACZwD,eAAgB,GAChBmI,aAAcxM,KAAKwM,aACnBtM,cAAeF,KAAKjB,iBACpB8N,WAAW,GAGf7M,KAAK2E,iBAAmBC,6BAAmB5E,KAAK1B,MAAMuN,SAASrJ,QAAQsB,QAAQe,kBAC3E7E,KAAK1B,MAAMuN,SAAS/G,aACpB9E,KAAK1B,MAAMuN,SAAS9G,WACxB/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IACpE3E,KAAKwK,WAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SAG/D,mBACN,MAAqG,OAA7FkI,mBAAS,CAAEC,QAASC,cAAYC,QAAS7K,QAASxC,KAAK1B,MAAMuN,SAASrJ,QAAQsB,UAGnFoB,oBACHlF,KAAKsN,kCAAoCC,4BAAkBC,OAAQ,SAAUxN,KAAKgN,uBAClF3H,SAASE,iBAAiB,UAAYvF,KAAK4B,cAA2C,GACtF5B,KAAKgN,wBACL3H,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBACjDrB,KAAKwQ,kBAGF/C,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMuN,SAASrL,cAC5DR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACHgI,OAAO/H,oBAAoB,SAAUzF,KAAKsN,mCAAoC,GAC9EjI,SAASC,KAAKG,oBAAoB,YAAazF,KAAKqB,qBAAqB,GAGtEqE,SACH1F,KAAKxB,aAAekN,EAAiB2C,IAErC,OACIjQ,gBAACiI,OAAI,CAACzC,UAAU,qBAAqB0C,IAAKtG,KAAKkB,UAEvClB,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAuBvH,2BAAA,KAClDA,gBAAC0L,SAAMpG,OAAAC,OAAA,CACHC,UAAU,sBACVmG,QAAS/J,KAAKuQ,cAAa,gBAP7B,oBASEU,MAAOjR,KAAK1B,MAAMuN,SAAS8E,UAAUO,mBAAkB,aAC3ClR,KAAK1B,MAAMuN,SAAS8E,UAAUO,oBACtClR,KAAKwK,aAEZxK,KAAK4N,wBAiBlBA,sBACJ,OACIxP,gBAAC+S,WAAQ,CAACvN,UAAU,mCAAmCY,OAAQxE,KAAKY,MAAMiM,WACrE7M,KAAKY,MAAM4L,aAAexM,KAAK2F,oBAAsB3F,KAAK4F,sBAK/DD,oBACJ,MAAM,iBAAEkI,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAAMuN,SAGxG,OADA7L,KAAKxB,aAAekN,EAAiB2C,IAEjCjQ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IAAWF,EAAWlC,UAAW5D,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YACvHrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,YACnCrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GACL/N,KAAKY,MAAM8L,sBAGvB1M,KAAKwG,mBAMdZ,qBACJ,MAAM,WAAEE,GAAe9F,KAAK1B,MAAMuN,SAClC,OACIzN,gBAAC2H,SAAMrC,OAAAC,OAAA,GAAKmC,EAAU,CAAElC,UAAWoC,IAAWF,EAAWlC,aACrDxF,gBAACiI,OAAI3C,OAAAC,OAAA,GAAK3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAAEG,SAAS,OAC5CvG,KAAKwG,iBACNpI,gBAAA,OAAKwF,UAAU,uBACXxF,gBAAA,UAAQwF,UAAU,qBAAoB,aAAY,QAAQmG,QAAS/J,KAAKgR,mBAOpFhJ,kBAAkB1I,GACtB,OAAIA,EAAK2I,UAAY+F,mBAAiBC,mBAAmB3O,EAAK2I,SAEtDjI,KAAK4G,oBAAoBtH,GAErBA,EAAK2I,QAKV,KAHCjI,KAAKkI,oBAAoB5I,GAM7BkH,iBACJ,MAAM,SAAE2B,GAAanI,KAAK1B,MAAMuN,SAChC,IAAIhG,EAAgC,GAEhCA,EADA7F,KAAKY,MAAM4L,aACIxM,KAAK6F,aAEL7F,KAAK1B,MAAMuN,SAAShG,aAEvC,MAAM,WAAEpF,GAAeT,KAAKY,MACtBwH,EAA8B,GACpC,IAAIgJ,EAA2C,GAC3CC,EAAkD,GACtD,MAAMC,EAAiBC,KAAKC,MAAMD,KAAKE,UAAU5L,IAEjD,IAAK,MAAMvG,KAAQgS,EACfD,EAAqB/R,EAAKoH,QAASkI,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,QAC9GzP,EAAKoH,QAAU2K,EAGnB,IAAK,MAAM/R,KAAQuG,EACfuL,EAAc9R,EAAKoH,QAASkI,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,GAAKoO,kBAAgBC,QAG1G,GAAI/O,KAAKY,MAAM4L,mBAA+B3L,IAAfJ,GAA4BvB,kBAAgBC,YAAY0G,GAAe,CAClG,IAAII,EAAiC,GACrC,IAAK,MAAMoC,KAAiBxC,EAAc,CACtC,GAAIwC,EAAc3H,KAAOD,EAAY,CACjCwF,EAAWoC,EACNiI,EAA0B7D,YAK3BzM,KAAKC,SAAS,CACVU,gBAAYE,EACZ6L,oBAAqBrE,EAAcvJ,WANvCkB,KAAKC,SAAS,CACVU,gBAAYE,IAQpB,MAGJ,GADAoF,EAAWjG,KAAKsI,gBAAgBD,GAC5BpC,GAAYA,EAASvF,KAAOD,EAC5B,MAIJwF,GACAmC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GACzB,UAKV,CACH,IAAK,MAAOwC,EAAOnJ,KAASgS,EAAepD,UACvC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAKtC,IAAK,MAAOmJ,EAAOnJ,KAAS8R,EAAYlD,UACpC9F,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAK/H,EAAKoB,IACNyH,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,KAM1C,OAAO8I,EAGHE,gBAAgBhJ,GACpB,MAAMoJ,EAAWpJ,aAAI,EAAJA,EAAMoH,QACvB,GAAIgC,GAAYxJ,kBAAgBC,YAAYuJ,GACxC,IAAK,IAAID,EAAQ,EAAGA,GAASC,EAASvI,OAASuL,EAAiB2C,IAAK5F,IAAS,CAC1E,MAAM/B,EAAyBgC,EAAS4F,OAAO7F,IAC/C,IAAI0F,EAAe7O,aAAI,EAAJA,EAAMoB,GAEzB,GAAIgG,EAAQhG,KAAOV,KAAKY,MAAMH,WAU1B,OATI0N,IAAiBzC,EAAiBiD,UAAYjI,EAAQhG,GAAMoO,kBAAgBC,SAC5EZ,OAAetN,GAGdyP,EAA0B7D,YAG3BzM,KAAKC,SAAS,CAAEU,WAAYwN,EAAczB,oBAAqBhG,EAAQ5H,WAFvEkB,KAAKC,SAAS,CAAEU,WAAYwN,IAIzBzH,EAEX,MAAMkC,EAAQ5I,KAAKsI,gBAAgB5B,GACnC,GAAIkC,EACA,OAAOA,EAInB,OAAO,KAGHL,oBAAoB1C,GACxB,OAAI3G,kBAAgBC,YAAY0G,EAAaa,SACrC1G,KAAKY,MAAM4L,mBAA0C3L,IAA1Bb,KAAKY,MAAMH,WAC9BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAGnEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,KAIzDmF,EAAaoC,UAAY+F,mBAAiBC,mBAAmBpI,EAAaoC,SACzEjI,KAAK4G,oBAAoBf,EAAcA,EAAanF,IACpDmF,EAAaoC,QAIlB,KAHKjI,KAAKkI,oBAAoBrC,GAMjCgD,eAAe0F,EAAgC9N,EAAqB+N,GAAmB,IAAAC,EAAAC,EAE3F,IAAIhG,EAAwC6F,EACxC9N,IAAeiL,EAAiBiD,WAChCjG,EAAW6F,EAAcK,OAAOC,GAAgBA,EAAYnO,IAAMmO,EAAYnO,IAAMoO,kBAAgBC,SAGxG,MAAM,SAAE5G,GAAanI,KAAK1B,MAAMuN,SAC1BmD,EAA0E,QAAlDP,EAAGzO,KAAK1B,MAAMuN,SAAS9H,OAAOkF,4BAAoB,IAAAwF,KAC1EvF,EAAqE,QAA9CwF,EAAG1O,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAuF,IAAIhD,EAAiBuD,MAEhG,GAAIxO,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,gEACrC,KAGX,IAAKV,IAAaxJ,kBAAgBC,YAAYuJ,GAE1C,OADA1I,KAAK1B,MAAMuN,SAASrJ,QAAQuC,UAAUqE,MAAM,4DACrC,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EAAcZ,EAASrJ,IAAI,CAACR,EAAuB4J,KACrD,MAAMe,EAAc3K,EAAO6H,SAAWxH,kBAAgBC,YAAYN,EAAO6H,SACzE,IAAIT,EAQAS,EANAT,EADAuD,GAAcxJ,KAAKY,MAAM4L,aACdxM,KAAK8I,sBAAsBjK,EAAQ4B,EAAYgI,GACnDzI,KAAKxB,eAAiBkN,EAAiB2C,KAAQ7E,EAG3C,KAFAxJ,KAAKkP,YAAYrQ,EAAQ4J,GAKxC,MAAM0G,EAAkB3F,GAAcwF,GAA6BhP,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2BwC,EAAiB2C,IAE3I7E,IAAexJ,KAAKY,MAAM4L,eACtBxM,KAAKxB,cAAgBkN,EAAiB0D,IACtC1I,EAAU1G,KAAKqP,qBAAqBxQ,GAC7BmB,KAAKxB,cAAgBwB,KAAKkM,eAAiBR,EAAiB2C,MACnErO,KAAKxB,eACL6K,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5ClD,EAAU1G,KAAK6I,eAAehK,EAAO6H,aAAS7F,GAAW,KAG7DsO,GAAmBnP,KAAKY,MAAM4L,eAC9BxM,KAAKxB,eACL6K,EAAiB2F,EAA2B,SAAShP,KAAKxB,aAAaoL,WAAe,GACtFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAAS7H,EAAO6B,IAAI,IAE7D,MAAM2J,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9D,OACI3C,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZiK,YAAa3K,KAAKxB,eAAiBkN,EAAiB2C,KAAOrO,KAAKrB,qBAAqB0L,EAAaxL,GAClG+E,UAAWoC,IAAWmC,EAASvE,UAAWuL,GAAmB,eAC7D7I,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE5GhH,EACAS,KAId,OAAQ1G,KAAK6J,YAAYR,EAAgBC,EAAakF,GAGlDU,YAAYrQ,EAAuB4J,GACvC,IAAIxC,EAMJ,OAJIA,EADAjG,KAAKxB,eAAiBkN,EAAiB2C,IAC3BxP,EAAOoJ,QAAUjI,KAAKsP,4BAA4BzQ,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE5FA,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ4J,GAASzI,KAAKkI,oBAAoBrJ,GAE7FoH,EAGHoJ,qBAAqBpJ,GAAuB,IAAAsJ,EAChD,MAAMlG,EAAiB,SAASrJ,KAAKxB,aAAaoL,WAC5C/C,EAAmBZ,EAASnH,SAE5ByF,OAAkC1D,IAArBgG,EAAiCA,EAAmB,GACjEE,EAFW/G,KAAKY,MAAMyD,eAGtB6E,EAAqE,QAA9CqG,EAAGvP,KAAK1B,MAAMuN,SAAS9H,OAAOoF,wBAAgB,IAAAoG,IAAI7D,EAAiBuD,MAEhG,IAAIjI,GAAe,EACfD,EAAKd,EAASvF,MACdsG,GAAe,GAEnB,MAAMC,EAA2B,CAAEuI,QAAS,EAAGhL,OAAQwC,GACvD,OACI5I,gBAAC8I,SAAM,CACHM,cAAeP,EACfI,IAAKpB,EAASvF,GACdkD,UAAWoC,IAAW,yBAA0BqD,GAChD/B,UAAU,sBACVG,WAAW,uBACXC,eAAe,QACfb,iBAAkBtC,EAClBgD,SAAUvH,KAAKqM,0BAA0BpG,EAASvF,GAAIsG,IAEtD5I,gBAAA,WACK6H,EAASS,QAASrH,IAAKuI,GAChB1I,kBAAgBC,YAAYyI,EAAYlB,WACxC1G,KAAKxB,eACDwB,KAAKxB,aAAe0K,GACblJ,KAAKqP,qBAAqBzH,GAGlC5H,KAAKgI,kBAAkBJ,MAmB1CkB,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,OACIrK,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDzI,KAAK1B,MAAMuN,SAAS/B,OAAM,CAC9BC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAAW,kBACtCT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,EAAU,aACXT,KAAKY,MAAM4L,aAAe3N,EAAOuI,eAAYvG,IAEvDhC,EAAOC,UAKb8H,oBAAoB/H,EAAuB4J,GAC/C,MAAM,KAAE2B,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GACrDkB,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAE/C,IAAKoB,EACfmC,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdhJ,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7CkJ,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAC7DD,EAAOC,UAKbwQ,4BAA4BzQ,EAAuB4J,GAA6C,IAA7BgH,IAAAvF,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACvE,MAAM,KAAEE,GAASpK,KAAK1B,MAAMuN,SACtB/M,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAE/C,IAAKoB,EAAOkC,YAAa8E,GAAiBzP,KAAKrB,qBAAqB0L,EAAaxL,GAC3F+L,KAAM/L,EAAOoJ,SAAauC,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACnGD,EAAOC,UAKbgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MAAMuN,SAC5B7L,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CACvCT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAC7DA,GAIP,KAIHoJ,oBAAoBrJ,EAAuB4J,GAC/C,MAAM,KAAEsC,GAAS/K,KAAK1B,MAAMuN,SAC5B,OACIzN,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,GAChBlM,EAAOC,UAKb+K,YAAYmB,EAAe1B,EAA4BoG,GAAmB,IAAAC,EAC9E,MAAM,aAAExE,EAAY,kBAAEC,EAAiB,kBAAEtK,EAAiB,uBAAEuK,GAA2BrL,KAAK1B,MAAMuN,SAC5F+D,GACD5P,KAAKY,MAAM4L,cAAgB1L,GAAkD,OAA7Bd,KAAKY,MAAMV,oBAAuDW,IAA7Bb,KAAKY,MAAMV,gBAAgCwP,EAC/HG,GACD7P,KAAKY,MAAM4L,cAAgBnB,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBwP,EAC9GI,EAAoB9P,KAAKxB,aAAekN,EAAiB0D,KAAOQ,EAAyBzE,EAAcvH,UAAY,kBACzH5D,KAAKxB,aAAekN,EAAiB2C,IACrC,MAAM0B,EACFH,GAA0B5P,KAAK1B,MAAMuN,SAAS9H,OAAOoF,kBACrDnJ,KAAK1B,MAAMuN,SAAS9H,OAAOoF,iBAAmBuC,EAAiB0D,KAAO,sBAEpEY,EAAyC,QAA3BL,EAAG3P,KAAKY,MAAMV,qBAAa,IAAAyP,OAAA,EAAxBA,EAA0Bf,OAAOrP,IAAUyO,mBAAiBC,mBAAmB1O,EAAMP,MACtGiR,EAAqBD,aAAc,EAAdA,EAAgB3Q,IAAIC,GAAQA,EAAKN,KAAKkR,KAAK,KACtE,OACI9R,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAWkM,IAC/B1R,gBAACiI,OAAI3C,OAAAC,OAAA,GACG3D,KAAK1B,MAAMuN,SAASzF,SAAQ,CAChCxC,UAAWoC,IAAWhG,KAAK1B,MAAMuN,SAASzF,SAASxC,UAAWoH,EAAO4E,GAA0B,gBAAiBG,KAC/GzG,GAELlL,gBAAA,OAAKwF,UAAU,2BAA2ByD,IAAK4I,GAEvCL,GAA0B1Q,kBAAgBC,YAAY6Q,IAAmBA,EAAe3Q,IAAIC,IAAI,IAAA6Q,EAAA1E,EAAA,OAC5FrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAExH,UAAWwH,EAAmBxH,UAAWyD,IAAK/H,EAAKN,MAC1E2M,EAAiB3L,KAAK1B,MAAe,QAAV6R,EAAE7Q,EAAKN,WAAG,IAAAmR,IAAI,GAAI7Q,EAAKL,QAAS2K,YAC3DiG,GAA+B7P,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,eArhBnHwQ,EAAA7D,aAAuB,EA4D5B2D,YAAA,CAATC,K,iCA6mBUC,QClrBAoB,UARapT,GACpBA,EAAMyF,OAAO4N,cACNvT,gBAACkS,EAAyB,CAACzE,SAAUvN,IAGzCF,gBAAC6N,EAA0B,CAACJ,SAAUvN,K,mBCtBjDqY,EAAOC,QAAU0B,U,6MCoCV,MAAMna,UAA2BC,gBAapCC,YAAYC,GACRC,MAAMD,GAXF,KAAAE,aAAuB,EAmTd,KAAAG,qBAAuB,CAACC,EAA0BC,IAA0B,KACzF,MAAMC,EAAWD,GAAUA,EAAOC,SAAWD,EAAOC,SAAW,GACzDC,EAAiC,CAAC,CAAEC,IAAKJ,EAAkBK,QAASH,IAGtEI,kBAAgBC,YAAYN,EAAOO,qBACnCP,EAAOO,mBAAmBC,IAAIC,IAC1B,GAAIA,GAAQA,EAAKC,MAAO,CACpB,MAAMC,EAAWF,EAAKC,MAAMP,IACtBS,EAA+BH,EAAKC,MAAMG,cAChDX,EAAiBY,KAAK,CAClBX,IAAKQ,EACLP,QAASK,EAAKM,KACdF,cAAeD,EACfI,qBAAsB,CAAEC,QAASR,EAAKQ,QAAQC,qBAK9DC,KAAKC,SAAS,CACVC,cAAenB,EAAiBoB,OAAS,EAAIpB,EAAmB,CAAC,CAAEC,IAAK,UACxEoB,qBAAsBtB,KAIb,KAAAuB,sBAAwB,CAACC,EAAqBC,IAAsB,KAC5EP,KAAK1B,MAAMkC,cASZrC,EAAmBsO,aAAc,EACjCzM,KAAKC,SAAS,CACVQ,WAAYH,EAAKI,GACjBgM,oBAAqBpM,EAAKxB,SAC1B6B,WAAYJ,MAZhBP,KAAKC,SAAS,CACVQ,WAAYT,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAeH,EAAKI,QAAMG,EAAYP,EAAKI,GAC3FC,WAAYJ,IAEZP,KAAK1B,MAAMwC,mBACXd,KAAKrB,qBAAqB2B,EAAKS,YAAcT,EAA7CN,KAYK,KAAA2M,cAAgB,IAAM,KACnCxO,EAAmBsO,aAAc,EACjCzM,KAAKC,SAAS,CAAEQ,WAAYT,KAAKY,MAAMD,cAO1B,KAAAU,oBAAuBC,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAME,SAC/DxB,KAAKC,SAAS,CACVQ,gBAAYI,EACZ6L,oBAAqB,GACrBxM,cAAe,QASV,KAAAuB,oBAAuBH,IAChCtB,KAAKkB,SAASC,UAAYnB,KAAKkB,SAASC,QAAQI,SAASD,EAAMI,gBAC/D1B,KAAK2B,iBAWI,KAAAmL,uBAAyB,CAACrE,EAAeiE,EAA8BK,KAC/E5O,EAAmBsO,aAAyB,IAAVhE,MAGlCsE,IAAmBL,IAGjBA,IAAwBK,EASlB,KAAA1K,kBAAqBnC,IAClC,IAAKA,IAAkBA,EAAclB,IACjC,OAAO,KAGX,MACM4D,EAAuC,CACzCC,UAAW,CACPC,GAAI,CAAEC,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCC,GAAI,CAAEH,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCE,GAAI,CAAEJ,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,GACrCG,GAAI,CAAEL,EAAG,kBAAmBC,EAAG,EAAGC,EAAG,IAEzCI,UAAU,GAEuB,IAADC,EAAAC,EAApC,YAAyB1C,IAVA0B,2BAAiB,GAAGrC,EAAclB,IAAOgB,KAAK1B,MAAMkE,QAAQC,cAAcC,eAAeC,aAY1GvE,gBAACqF,IAAKC,OAAAC,OAAA,CACFjB,eAAgB1C,KAAK1B,MAAMkE,QAAQC,cAAcC,eACjDkB,UAAU,sBACN1D,EAAa,CACjB2D,aAAc7D,KAAK1B,MAAMkE,QAAQsB,QAAQD,aACzCnE,cAAqF,QAAxE4D,EAA6B,QAA7BC,EAAErD,EAAcR,qBAAa,IAAA6D,IAAIvD,KAAK1B,MAAMyF,OAAOC,6BAAqB,IAAAV,IAAIV,EACzFqB,oBAAoB,OACpBC,KAAK,WACLxD,GAAG,kCACHzB,QAASiB,EAAcjB,WAI5B,MAraPe,KAAKkB,SAAW9C,cAChB4B,KAAKiN,YAAc7O,cACnB4B,KAAKY,MAAQ,CAAEH,gBAAYI,EAAW6L,oBAAqB,GAAI/L,gBAAYE,EAAWT,qBAAsB,IAC5GJ,KAAK2B,cAAgB3B,KAAK2B,cAAc+C,KAAK1E,MAC7CA,KAAK2E,iBAAmBC,6BACpB5E,KAAK1B,MAAMkE,QAAQsB,QAAQe,kBAC3B7E,KAAK1B,MAAMwG,aACX9E,KAAK1B,MAAMyG,WAEf/E,KAAKgF,QAAUC,2BAAiB,QAASjF,KAAK2E,iBAAkB,GAAI,IAGjEO,oBACCC,IAASC,YACTC,SAASC,KAAKC,iBAAiB,YAAavF,KAAKqB,qBACjDgE,SAASC,KAAKC,iBAAiB,WAAYvF,KAAKyB,sBAIjDgM,qBAAkB,IAAAC,EACO,QAAxBA,EAAA1N,KAAKiN,YAAY9L,eAAO,IAAAuM,GAAxBA,EAA0BC,SAAS,IAAM3N,KAAK1B,MAAMkC,cACnDR,KAAKiN,YAAY9L,QAAQwM,SAAS,GAAmBvM,QAIvDoE,uBACCL,IAASC,YACTC,SAASC,KAAKG,oBAAoB,YAAazF,KAAKqB,qBAAqB,GACzEgE,SAASC,KAAKG,oBAAoB,WAAYzF,KAAKyB,qBAAqB,IAIzEiE,SACH,MAAM,aAAElF,EAAY,SAAE4F,EAAQ,iBAAEyH,EAAgB,2BAAEC,EAA0B,uBAAEC,EAAsB,WAAEjI,GAAe9F,KAAK1B,MAG1H,OADA0B,KAAKxB,aAAe,EAEhBJ,gBAAC2H,SAAMrC,OAAAC,OAAA,GACCmC,EAAU,CACdlC,UAAWoC,IAAWF,EAAWlC,UAAWpD,QAA0CK,IAA1Bb,KAAKY,MAAMH,WAA2B,QAAU,YAE5GrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyC,EAAQ,CAAEE,IAAKtG,KAAKkB,SAAUqF,SAAS,OAC5C/F,QAA0CK,IAA1Bb,KAAKY,MAAMH,YACxBrC,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKmK,GACN1P,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKkK,EAAgB,CAAE9D,QAAS/J,KAAK2M,mBAC1CvO,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKoK,GAAyB/N,KAAKY,MAAM8L,sBAGrD1M,KAAKwG,mBAMdA,iBACJ,MAAM,SAAE2B,EAAQ,aAAEtC,EAAY,aAAErF,GAAiBR,KAAK1B,OAChD,WAAEmC,GAAeT,KAAKY,MACtBwH,EAA8B,GAEpC,GAAI5H,QAA+BK,IAAfJ,GAA4BoF,EAAa1F,OAAS,EAAG,CACrE,IAAI8F,EAA0B,GAC9B,IAAK,MAAMoC,KAAiBxC,EAAc,CACtC,GAAIwC,GAAiBA,EAAc3H,KAAOD,EAAY,CAClDwF,EAAWoC,EACVlK,EAAmBsO,YAEdzM,KAAKC,SAAS,CAAEU,gBAAYE,EAAW6L,oBAAqBrE,EAAcvJ,WAD1EkB,KAAKC,SAAS,CAAEU,gBAAYE,IAElC,MAGJ,GADAoF,EAAWjG,KAAKsI,gBAAgBD,GAC5BpC,GAAYA,EAASvF,KAAOD,EAC5B,MAIRwF,GACImC,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKpB,EAASvF,IAAQyH,GACvB,IACAnI,KAAKuI,oBAAoBtC,GAAW,WAIjDJ,EAAa2C,QAAQ,CAAClJ,EAAqBmJ,KACvCL,EAAazI,KACTvB,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDN,EAAQ,CACZ7B,IAAKtG,KAAK8M,uBAAuBrE,EAAOzI,KAAKY,MAAM8L,oBAAqBpN,EAAKR,UAAYkB,KAAKiN,YAAc,OAE3GjN,KAAKuI,oBAAoBjJ,OAM1C,OAAO8I,EAGHE,gBAAgBhJ,GACpB,MAAMoJ,EAAWpJ,GAAQA,EAAKoH,QAC9B,GAAIgC,GAAYA,EAASvI,OAAS,EAC9B,IAAK,IAAIwI,EAAI,EAAGA,GAAKD,EAASvI,OAAS,EAAGwI,IAAK,CAC3C,GAAID,EAASC,GAAGjI,KAAOV,KAAKY,MAAMH,WAI9B,OAHCtC,EAAmBsO,YAEdzM,KAAKC,SAAS,CAAEU,WAAYrB,GAAQA,EAAKoB,GAAIgM,oBAAqBhE,EAASC,GAAG7J,WAD9EkB,KAAKC,SAAS,CAAEU,WAAYrB,aAAI,EAAJA,EAAMoB,KAEjCgI,EAASC,GAEpB,MAAMC,EAAQ5I,KAAKsI,gBAAgBI,EAASC,IAC5C,GAAIC,EACA,OAAOA,EAKnB,OADA5I,KAAK1B,MAAMkE,QAAQuC,UAAUqE,MAAM,iDAC5B,KAGHb,oBAAoB1C,GACxB,OAAIA,GAAgBA,EAAaa,SAAWb,EAAaa,QAAQvG,OAAS,EAClEH,KAAK1B,MAAMkC,mBAA0CK,IAA1Bb,KAAKY,MAAMH,WAC/BT,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,GAGlEtC,2BAAA,KACK4B,KAAK8I,sBAAsBjD,GAC3B7F,KAAK6I,eAAehD,EAAaa,QAASb,EAAanF,IAAI,IAG7DmF,GAAgBA,EAAa/G,UAAY+G,EAAaoC,SAAWpC,EAAaoC,QAAQ9H,OAAS,EAC/FH,KAAK4G,oBAAoBf,EAAcA,EAAanF,IAAI,GAAO,GAC/DmF,GAAgBA,EAAa/G,WAAa+G,EAAaoC,QACvDjI,KAAKkI,oBAAoBrC,EAAcA,EAAanF,IAAI,IAEnEV,KAAK1B,MAAMkE,QAAQuC,UAAUqE,MAAM,yDAC5B,MAGHP,eAAeH,EAA4BjI,EAAqBsI,GACpE,MAAM,aAAEvI,EAAY,SAAE2H,GAAanI,KAAK1B,MAClC0K,EAAyBhJ,KAAK1B,MAAMyF,OAAOkF,uBAAwB,EACnEC,EAA0BlJ,KAAK1B,MAAMyF,OAAOoF,kBAAoB,EAGtE,GAAI1I,GAAcT,KAAKY,MAAMH,aAAeA,EAExC,OADAT,KAAK1B,MAAMkE,QAAQuC,UAAUqE,MAAM,gEAC5B,KAGX,IAAKV,GAAgC,IAApBA,EAASvI,OAEtB,OADAH,KAAK1B,MAAMkE,QAAQuC,UAAUqE,MAAM,4DAC5B,KAGX,IAAIC,EAAyB,GAC7B,MAAMC,EACFZ,GACAA,EAASrJ,IAAI,CAACR,EAAuB0K,KACjC,MAAMC,EAAa3K,EAAO6H,SAAW7H,EAAO6H,QAAQvG,OAAS,EAC7D,IAAI8F,EAOAS,EALAT,EADAuD,GAAchJ,EACHR,KAAK8I,sBAAsBjK,EAAQ4B,EAAY8I,GAE/C1K,EAAOoJ,QAAUjI,KAAK4G,oBAAoB/H,EAAQ0K,GAAOvJ,KAAKkI,oBAAoBrJ,GAIjG,MAAM4K,EAAcD,GAAcR,GAA0BhJ,KAAKxB,cAAgBkL,KAAKC,MAAMT,GAA2B,EAMvH,OALIO,IACAzJ,KAAKxB,eACL6K,EAAiBL,EAAyB,SAAShJ,KAAKxB,aAAaoL,WAAe,GACpFlD,EAAU1G,KAAK6I,eAAehK,EAAO6H,QAASlG,EAAe3B,EAAO6B,QAAKG,GAAW,IAGpFzC,gBAACiI,OAAI3C,OAAAC,OAAA,GACGwE,EAAQ,CACZd,IAAKxI,EAAO6B,GACZkD,UAAWoC,IAAWmC,EAASvE,UAAW6F,GAAe,eACzDnD,IAAKtG,KAAK8M,uBAAuBvD,EAAKvJ,KAAKY,MAAM8L,oBAAqB7N,EAAOC,UAAYkB,KAAKiN,YAAc,OAE3GhH,EACAS,KAIjB,OAAO1G,KAAK6J,YAAYR,EAAgBC,EAAa7I,EAAYsI,GAG7DD,sBAAsBjK,EAAuB4B,EAAqBgI,GACtE,MAAM,OAAEqB,GAAW9J,KAAK1B,MACxB,OACIF,gBAACiI,OAAI3C,OAAAC,OAAA,CACD0D,IAAKoB,GACDqB,EAAM,CACVC,QAAS/J,KAAKK,sBAAsBxB,EAAQ4B,GAC5CuJ,QAAShK,KAAK2B,cAAa,kBACV3B,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,mBAC5DV,KAAKY,MAAMH,YAAcT,KAAKY,MAAMH,aAAe5B,EAAO6B,IAAG,cAClED,IAEZ5B,EAAOC,UAKZ8H,oBACJ/H,EACA4J,GAEyB,IADzBwB,IAAAC,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,KAAAA,UAAA,GACAC,EAAAD,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,IAAAA,UAAA,GAEA,MAAM,KAAEE,GAASpK,KAAK1B,MAChBQ,EAAWD,EAAOC,SAAWD,EAAOC,SAAW,GAC/CuL,EAAcxL,EAAOkC,YAAclC,EAAOkC,YAAc,GAC9Df,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OACI5G,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyG,EAAI,CACR/C,IAAKoB,EACLuB,QAASG,GAAYnK,KAAK2B,cAC1BH,OAAQ3C,EAAO6L,iBAAmB,cAAW7J,EAC7C8J,YAAaV,GAAejK,KAAKrB,qBAAqB0L,EAAaxL,GACnE+L,KAAM/L,EAAOoJ,SACTuC,EAAU,CACdT,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KAE9DD,EAAOC,UAKZgM,uBAAuBhM,EAAmBgB,GAC9C,MAAM,KAAEsK,GAASpK,KAAK1B,MACtB0B,KAAKgF,QAAQsF,cAAcC,MAAQzL,EACnC,MAAM0L,EAAaC,iCAAuBzK,KAAK2E,iBAAkB3E,KAAKgF,SACtE,OAAIlG,GAAYgB,EAER1B,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyG,EAAI,CAAEQ,KAAM9K,GAAa0K,EAAU,CAAET,QAASc,2BAAiB7K,KAAK2E,iBAAkB3E,KAAKgF,QAASlG,KACzGA,GAIN,KAGHoJ,oBAAoBrJ,EAAuB4J,GAAyC,IAAzB0B,EAAAD,UAAA/J,OAAA,QAAAU,IAAAqJ,UAAA,IAAAA,UAAA,GAC/D,MAAM,KAAEa,GAAS/K,KAAK1B,MACtB,OACIF,gBAACiI,OAAI3C,OAAAC,OAAA,CAAC0D,IAAKoB,GAAWsC,EAAI,CAAEf,QAASG,GAAYnK,KAAK2B,gBACjD9C,EAAOC,UAKZ+K,YAAYmB,EAAe1B,EAA4B2B,EAAsBC,GACjF,MAAM,aAAEC,EAAY,SAAE/E,EAAQ,kBAAEgF,EAAiB,kBAAEtK,EAAiB,uBAAEuK,EAAsB,aAAE7K,GAAiBR,KAAK1B,MAC9GgN,GACD9K,IACAM,GAAqBuK,KACrBnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBACvCgL,EACCK,GACD/K,GAAgB6K,GAA0BnM,kBAAgBC,YAAYa,KAAKY,MAAMV,iBAAmBgL,EACnGM,EAAoBxL,KAAKxB,aAAe,GAAK8M,EAAuBH,EAAcvH,UAAY,kBAEpG,OADA5D,KAAKxB,aAAe,EAEhBJ,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKwH,EAAY,CAAEvH,UAAW4H,IAC/BpN,gBAACiI,OAAI3C,OAAAC,OAAA,GACGyC,EAAQ,CACZxC,UAAWoC,IACPI,EAASxC,UACToH,EACAM,GAAwB,gBACxBA,GACItL,KAAK1B,MAAMyF,OAAOoF,kBAClBnJ,KAAK1B,MAAMyF,OAAOoF,iBAAmB,GACrC,yBAGPG,GAEJgC,GACGtL,KAAKY,MAAMV,eACXF,KAAKY,MAAMV,cAAcb,IAAIC,IAAI,IAAAmM,EAAA,OAC7BrN,gBAACiI,OAAI3C,OAAAC,OAAA,GAAKyH,EAAiB,CAAE/D,IAAK/H,EAAKN,IAAK4E,UAAWwH,EAAmBxH,YACrE5D,KAAKY,MAAMV,eAAiBF,KAAKqC,kBAAkB/C,GACnDiM,GAA6BvL,KAAK8K,uBAAuBxL,EAAKL,QAAkC,QAA3BwM,EAAEnM,EAAKO,4BAAoB,IAAA4L,OAAA,EAAzBA,EAA2B3L,aAiGnH6B,gBACC3B,KAAK1B,MAAMkC,cACZR,KAAKC,SAAS,CAAEQ,gBAAYI,EAAWX,cAAe,KAAMwM,oBAAqB,MAjZ1EvO,EAAAsO,aAAuB,EAub3BtO,c","file":"static/js/109.fa5ae43415b1afcc0e2f.chunk.js","sourcesContent":["/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport NavigationMenu from './modules/navigation-menu/navigation-menu';\nimport NavigationMenuView from './modules/navigation-menu/navigation-menu.view';\n\nexport * from './modules/navigation-menu/navigation-menu';\nexport * from './modules/navigation-menu/navigation-menu.data';\nexport * from './modules/navigation-menu/navigation-menu.props.autogenerated';\nexport * from './modules/navigation-menu/navigation-menu.view';\n\nexport { NavigationMenu, NavigationMenuView };\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IDictionary, IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { IMenuItemData, INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\nimport { ArrayExtensions, generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n Drawer,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n ICollapseProps,\n IDrawerState,\n IPayLoad,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\ninterface INavigationState {\n parentMenu?: number;\n activeMenu?: number;\n categoryImage?: IImageData[] | null;\n categoryImageAltText: string;\n drawerKeyValue: IDictionary;\n}\n\n/**\n *\n * NavigationMenuView component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuView extends React.PureComponent {\n private currentLevel: number = 0;\n\n private readonly _positionInSetOffset: number = 1;\n\n private readonly escapeKey: number = 27;\n\n private readonly menuNode: React.RefObject;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n constructor(props: INavigationMenuViewProps) {\n super(props);\n this.menuNode = React.createRef();\n this.state = { activeMenu: undefined, parentMenu: undefined, categoryImageAltText: '', drawerKeyValue: {} };\n this._closeSubmenu = this._closeSubmenu.bind(this);\n this._escFunction = this._escFunction.bind(this);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n document.body.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\n document.body.addEventListener('mousedown', this._handleClickOutside);\n document.body.addEventListener('focusout', this._handleFocusOutside);\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n document.removeEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n document.body.removeEventListener('focusout', this._handleFocusOutside, false);\n }\n }\n\n public render(): JSX.Element | null {\n const { isMobileView } = this.props;\n\n this.currentLevel = 1;\n return <>{isMobileView ? this._renderMobileMenu() : this._renderDesktopMenu()};\n }\n\n /**\n * Method to render mobile menu.\n * @returns Jsx element.\n */\n private _renderMobileMenu(): JSX.Element {\n const { isMobileView, menuItemData, Navigation } = this.props;\n return (\n \n {menuItemData.map((menuItem: IMenuItemData, posinset: number) => {\n return this._renderDrawerMenu(menuItem, menuItemData.length, posinset + this._positionInSetOffset);\n })}\n \n );\n }\n\n /**\n * Method to render desktop menu.\n * @returns Jsx element.\n */\n private _renderDesktopMenu(): JSX.Element {\n const { MenuList, Navigation } = this.props;\n return (\n \n \n {this._renderDisplay()}\n \n \n );\n }\n\n /**\n * Method to render drawer menu.\n * @param menuItem -Menuitem data.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderDrawerMenu(menuItem: IMenuItemData, setSize: number, posinset: number): JSX.Element | null {\n if (menuItem && menuItem.subMenu && ArrayExtensions.hasElements(menuItem.subMenu)) {\n return this._renderDrawer(menuItem, setSize, posinset);\n }\n return this._renderLinkMenuItem(menuItem, undefined, true, false, setSize, posinset);\n }\n\n /**\n * Method to render drawer component.\n * @param menuItem -Menuitem data.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderDrawer(menuItem: IMenuItemData, setSize?: number, posinset?: number): JSX.Element | null {\n const toggleButtonText = menuItem.linkText;\n const keyValue = this.state.drawerKeyValue;\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\n const keys = keyValue !== undefined ? keyValue : {};\n const { isMobileView } = this.props;\n\n let isDrawerOpen = false;\n if (keys[buttonText]) {\n isDrawerOpen = true;\n }\n const colProps: ICollapseProps = { isOpen: isDrawerOpen };\n return (\n \n
\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData, currentPos: number) => {\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\n return this._renderDrawer(menuSubItem, menuItem.subMenu?.length, currentPos + this._positionInSetOffset);\n }\n return this._renderDrawerLink(menuSubItem, menuItem.subMenu?.length, currentPos + this._positionInSetOffset);\n })}\n
\n \n );\n }\n\n /**\n * Method to render link.\n * @param linkText -Text on Menu link.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderLinkText(linkText: string | undefined, setSize: number | undefined, posinset: number | undefined): JSX.Element {\n return (\n \n {linkText}\n \n );\n }\n\n /**\n * Method to render drawer link.\n * @param item -Single Menuitem.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderDrawerLink(item: IMenuItemData, setSize: number | undefined, posinset: number): JSX.Element | null {\n if (item && item.linkText && item.linkURL && item.linkURL.length > 0) {\n return this._renderLinkMenuItem(item, undefined, true, false, setSize, posinset);\n } else if (item && item.linkText && !item.linkURL) {\n return this._renderSpanMenuItem(item);\n }\n return null;\n }\n\n /**\n * Method to generate menu.\n * @returns Jsx element.\n */\n private _renderDisplay(): JSX.Element[] {\n const { ListItem, menuItemData, isMobileView } = this.props;\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n\n if (isMobileView && activeMenu !== undefined && menuItemData.length > 0) {\n let menuItem: IMenuItemData = {};\n for (const menuItemDatum of menuItemData) {\n if (menuItemDatum && menuItemDatum.id === activeMenu) {\n menuItem = menuItemDatum;\n this.setState({ parentMenu: undefined });\n break;\n }\n menuItem = this._getFromSubMenu(menuItemDatum) as IMenuItemData;\n if (menuItem && menuItem.id === activeMenu) {\n break;\n }\n }\n\n menuItem &&\n menuItemList.push(\n \n {` `}\n {this._createMenuItemList(menuItem)}\n {` `}\n \n );\n } else {\n menuItemData.forEach((item: IMenuItemData, index: number) => {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n \n );\n });\n }\n\n return menuItemList;\n }\n\n /**\n * Method to get data for submenu.\n * @param item -Single Menuitem.\n * @returns IMenuItemData.\n */\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\n const subMenus = item && item.subMenu;\n if (subMenus && subMenus.length > 0) {\n for (let i = 0; i <= subMenus.length - 1; i++) {\n if (subMenus[i].id === this.state.activeMenu) {\n this.setState({ parentMenu: item?.id });\n return subMenus[i];\n }\n const found = this._getFromSubMenu(subMenus[i]);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n /**\n * Method to create item list.\n * @param menuItemData -Single Menuitem.\n * @returns Jsx element.\n */\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\n if (this.props.isMobileView && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id);\n }\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\n \n );\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id, false, true);\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\n return this._renderSpanMenuItem(menuItemData, menuItemData.id, true);\n }\n\n return null;\n }\n\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number, IsSubMenu?: boolean): JSX.Element | null {\n const { isMobileView, ListItem } = this.props;\n const enableMultiSupportMenu = this.props.config.enableMultilevelMenu || false;\n const subMenuLevel = 3;\n const multiLevelSupportedMenu = this.props.config.menuLevelSupport || subMenuLevel;\n\n // Const isParentMenu:boolean= false;\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || subMenus.length === 0) {\n this.props.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions =\n subMenus &&\n subMenus.map((option: IMenuItemData, idx: number) => {\n const hasOptions = option.subMenu && option.subMenu.length > 0;\n let menuItem: JSX.Element | null;\n if (hasOptions && isMobileView) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, idx) : this._renderSpanMenuItem(option);\n }\n let subMenu;\n const haveSubmenu = hasOptions && enableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - 1;\n if (haveSubmenu) {\n this.currentLevel++;\n levelClassName = enableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, true);\n }\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, activeMenu, IsSubMenu);\n }\n\n /**\n * Method to render button menu item.\n * @param option -Single Menuitem.\n * @param activeMenu -Active menu number.\n * @param index -Active menu index.\n * @returns Jsx element.\n */\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n const { Button } = this.props;\n return (\n \n {option.linkText}\n \n );\n }\n\n /**\n * Method to render link menu item.\n * @param option -Single Menuitem.\n * @param index -Active menu index.\n * @param hoverEffect -Active menu effect.\n * @param isParent -Is parent menu.\n * @param setSize -Setsize data.\n * @param posinset -Current position.\n * @returns Jsx element.\n */\n private _renderLinkMenuItem(\n option: IMenuItemData,\n index?: number,\n hoverEffect: boolean = true,\n isParent: boolean = false,\n setSize?: number,\n posinset?: number\n ): JSX.Element | null {\n const { Link, isMobileView } = this.props;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n /**\n * Method to render promotional link.\n * @param linkText -Link text.\n * @param linkUrl -Link url.\n * @returns Jsx element.\n */\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n /**\n * Method to render span menu item.\n * @param option -Single Menu Item.\n * @param index -Index.\n * @param isParent -Is parent menu.\n * @returns Jsx element.\n */\n private _renderSpanMenuItem(option: IMenuItemData, index?: number, isParent: boolean = false): JSX.Element | null {\n const { Span } = this.props;\n return (\n \n {option.linkText}\n \n );\n }\n\n /**\n * Method to render menu.\n * @param level -Menu level.\n * @param menuOptions -Menu lists.\n * @param currentItem -Menu current.\n * @param submenu -Mneu has submenu or not.\n * @returns Jsx element.\n */\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number, submenu?: boolean): JSX.Element | null {\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, isMobileView, showPromotionalContent } = this.props;\n const categoryImageDisplay =\n !isMobileView && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !submenu;\n const promotionalContentDisplay =\n !isMobileView && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !submenu;\n const DivContainerClass = this.currentLevel > 2 || categoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = 1;\n return (\n \n 2 &&\n 'navmenu-multi-level'\n )}\n >\n {menuOptions}\n \n
\n {categoryImageDisplay &&\n this.state.categoryImage &&\n this.state.categoryImage.map(item => (\n \n {this.state.categoryImage && this._getCategoryImage(item)}\n {promotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n
\n \n );\n }\n\n private readonly _updateCategoryImage = (categoryImageSrc: string, option: IMenuItemData) => () => {\n const linkText = option && option.linkText ? option.linkText : '';\n const promotionalImage: IImageData[] = [{ src: categoryImageSrc, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n option.promotionalContent.map(item => {\n if (item && item.image) {\n const imageSrc = item.image.src;\n const promotionalItemImageSettings = item.image.imageSettings;\n promotionalImage.push({\n src: imageSrc,\n altText: item.text,\n imageSettings: promotionalItemImageSettings,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n });\n }\n this.setState({\n categoryImage: promotionalImage.length > 0 ? promotionalImage : [{ src: 'empty' }],\n categoryImageAltText: linkText\n });\n };\n\n /**\n * Method to handle dropdwon change.\n * @param data -Menuitem data.\n * @param parentId -Menu parent.\n * @returns Jsx element.\n */\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.props.isMobileView) {\n this.setState({\n activeMenu: this.state.activeMenu && this.state.activeMenu === data.id! ? undefined : data.id!,\n parentMenu: parentId\n });\n if (this.props.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n this.setState({\n activeMenu: data.id,\n parentMenu: parentId\n });\n }\n\n this._resetFocus();\n };\n\n /**\n * Method to call when focus lost from menu.\n */\n private readonly _resetFocus = () => {\n if (this.props.isMobileView) {\n setTimeout(() => {\n this.menuNode && this.menuNode.current && this.menuNode.current.focus();\n }, 0);\n }\n };\n\n /**\n * Method to handle click outside of menu.\n * @param event -HTML event.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n this.setState({\n activeMenu: undefined,\n categoryImage: null\n });\n }\n };\n\n /**\n * Method to handle click outside of menu.\n * @param event -HTML event.\n */\n private readonly _handleFocusOutside = (event: FocusEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.relatedTarget as Node)) {\n this._closeSubmenu();\n }\n };\n\n /**\n * Method to handle close submenu event.\n */\n private _closeSubmenu(): void {\n if (!this.props.isMobileView) {\n this.setState({ activeMenu: undefined });\n }\n }\n\n /**\n * Method to handle escape key event.\n * @param event -HTML event.\n */\n private readonly _escFunction = (event: React.KeyboardEvent) => {\n if (event.keyCode === this.escapeKey) {\n if (!this.props.isMobileView) {\n const navDrawerList = Array.from(this.menuNode.current!.childNodes);\n for (const item of navDrawerList) {\n const navDrawerButton = item.firstChild as HTMLButtonElement;\n if (navDrawerButton.getAttribute('aria-expanded') === 'true') {\n navDrawerButton.focus();\n }\n }\n }\n this._closeSubmenu();\n }\n };\n\n private readonly _getCategoryImage = (categoryImage?: IImageData): React.ReactNode | null => {\n if (!categoryImage || !categoryImage.src) {\n return null;\n }\n\n const categoryImageUrl = generateImageUrl(categoryImage.src, this.props.context.actionContext.requestContext.apiSettings);\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n sm: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n md: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n lg: { q: 'w=300&h=250&m=8', w: 0, h: 0 }\n },\n lazyload: true\n };\n if (categoryImageUrl !== undefined) {\n const ImageData: IImageData = { src: categoryImageUrl };\n return (\n \n );\n }\n return null;\n };\n\n /**\n * Method to handle escape key event.\n * @param drawerState -HTML event.\n */\n private readonly _onDrawerChange = (drawerState: IDrawerState) => {\n const { drawerKeyValue } = this.state;\n const drawerText: string = drawerState.buttonText !== undefined ? drawerState.buttonText : '';\n const newPair = { [drawerText]: drawerState.isOpen };\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\n };\n}\n\nexport default NavigationMenuView;\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\r\n\r\n/**\r\n * INavigationMenuViewRootProps.\r\n */\r\nexport interface INavigationMenuViewRootProps {\r\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\r\n}\r\n\r\n/**\r\n * Represent navigation menu state interface.\r\n */\r\nexport interface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n categoryImage?: Msdyn365.IImageData[] | null;\r\n mobileViewLabelText?: string;\r\n drawerKeyValue: Msdyn365.IDictionary;\r\n isOnlyMobile: boolean;\r\n isNavOpen: boolean;\r\n}\r\n\r\n/**\r\n * NavMenuConstants enum.\r\n */\r\nexport enum NavMenuConstants {\r\n zero = 0,\r\n one = 1,\r\n two = 2,\r\n three = 3,\r\n four = 4,\r\n escapeKey = 27,\r\n rootMenu = 1\r\n}\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Get category image.\r\n * @param props - Navigation menu props.\r\n * @param categoryImage - Category Image.\r\n * @param alttext - AltText String.\r\n * @returns Returns Node.\r\n */\r\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n if (categoryImageUrl !== undefined) {\r\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n // Button,\r\n // Collapse,\r\n Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n ICollapseProps,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootDisabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootDisabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n // private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({\r\n src: imageSource,\r\n altText: item.text,\r\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\r\n });\r\n return null;\r\n });\r\n }\r\n }\r\n\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n drawerKeyValue: {},\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry\r\n );\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n // this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n if (this.state.isOnlyMobile) {\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n } else {\r\n document.body.addEventListener('mouseover', this._handleClickOutside);\r\n }\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n if (this.state.isOnlyMobile) {\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n } else {\r\n document.body.addEventListener('mouseover', this._handleClickOutside);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = 1;\r\n // const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {this.state.isOnlyMobile ? (\r\n this._renderMobileMenu()\r\n ) : (\r\n <>\r\n {/* */}\r\n {this._renderCollapseMenu()}\r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n // private readonly _toggleNavBar = (): void => {\r\n // this.setState(previousState => ({\r\n // activeMenu: 1,\r\n // isNavOpen: !previousState.isNavOpen\r\n // }));\r\n // };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n
\r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n
\r\n // \r\n // {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n // \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n )}\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { MenuList, Navigation } = this.props.navProps;\r\n\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n {/*
\r\n
*/}\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return this._renderLinkMenuItem(item);\r\n } else if (!item.linkURL) {\r\n return this._renderSpanMenuItem(item);\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (ArrayExtensions.hasElements(menuItemData)) {\r\n menuItemData[0].id = 1;\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}{' '}\r\n \r\n );\r\n }\r\n } else {\r\n for (const [index, item] of menuItemData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\r\n if (!menu) {\r\n return null;\r\n }\r\n\r\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\r\n const item: IMenuItemData = menu[Number(index)];\r\n\r\n if (item.id === this.state.activeMenu) {\r\n if (!NavigationMenuRootDisabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\r\n }\r\n return item;\r\n }\r\n const found = this._getFromSubMenu(item.id, item.subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\r\n }\r\n\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\r\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\r\n return this._renderSpanMenuItem(menuItemData);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n if (option.linkText === 'All') {\r\n return <>;\r\n }\r\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu =\r\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n subMenu = this._renderSubMenuDrawer(option);\r\n } else if (this.currentLevel <= this.supportedLevel) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\r\n } else {\r\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\r\n const levelClassName = `level-${this.currentLevel.toString()}`;\r\n const toggleButtonText = menuItem.linkText;\r\n const keyValue = this.state.drawerKeyValue;\r\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\r\n const keys = keyValue;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n let isDrawerOpen = false;\r\n if (keys[menuItem.id!]) {\r\n isDrawerOpen = true;\r\n }\r\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\r\n\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\r\n this.currentLevel++;\r\n if (this.currentLevel < multiLevelSupportedMenu) {\r\n return this._renderSubMenuDrawer(menuSubItem);\r\n }\r\n }\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Method to handle escape key event.\r\n * @param menuId -Number.\r\n * @param isDrawerOpen -Boolean.\r\n * @returns Void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\r\n const { drawerKeyValue } = this.state;\r\n const newPair = { [menuId!]: !isDrawerOpen };\r\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return this.isOnlyMobile ? (\r\n \r\n {option.linkText}\r\n \r\n ) : (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n {linkText}\r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile &&\r\n showCategoryImage &&\r\n this.state.categoryImage !== null &&\r\n this.state.categoryImage !== undefined &&\r\n !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass =\r\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay &&\r\n this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\r\n 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {isCategoryImageDisplay &&\r\n ArrayExtensions.hasElements(categoryImages) &&\r\n categoryImages.map(item => (\r\n \r\n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n {isPromotionalContentDisplay &&\r\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n \r\n ))}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({\r\n src: imageSource,\r\n altText: item.text,\r\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\r\n });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootDisabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootDisabled.isBackTrack = true;\r\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 0, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n // private readonly _closeNavMenu = (): void => {\r\n // if (!this.state.isOnlyMobile) {\r\n // this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n // } else {\r\n // this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n // }\r\n // };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n}\r\n\r\nexport default NavigationMenuRootDisabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer, getPayloadObject, getTelemetryAttributes,\r\n getTelemetryObject,\r\n ICollapseProps,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootEnabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootEnabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private menuItemData: IMenuItemData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: NavMenuConstants.rootMenu,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n drawerKeyValue: {},\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n this._addShopAllLink();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = NavMenuConstants.one;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n \r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: NavMenuConstants.rootMenu,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = NavMenuConstants.one;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { Navigation } = this.props.navProps;\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n let menuItemData: IMenuItemData[] = [];\r\n if (this.state.isOnlyMobile) {\r\n menuItemData = this.menuItemData;\r\n } else {\r\n menuItemData = this.props.navProps.menuItemData;\r\n }\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n let cmsMenuData: IMenuItemData[] | undefined = [];\r\n let retailMenuItemData: IMenuItemData[] | undefined = [];\r\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\r\n\r\n for (const item of retailMenuData) {\r\n retailMenuItemData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n item.subMenu = retailMenuItemData;\r\n }\r\n\r\n for (const item of menuItemData) {\r\n cmsMenuData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail));\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n let menuItem: IMenuItemData | null = {};\r\n for (const menuItemDatum of menuItemData) {\r\n if (menuItemDatum.id === activeMenu) {\r\n menuItem = menuItemDatum;\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({\r\n parentMenu: undefined\r\n });\r\n } else {\r\n this.setState({\r\n parentMenu: undefined,\r\n mobileViewLabelText: menuItemDatum.linkText\r\n });\r\n }\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemDatum);\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n\r\n } else {\r\n for (const [index, item] of retailMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n for (const [index, item] of cmsMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item?.subMenu;\r\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\r\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\r\n const subMenu: IMenuItemData = subMenus[Number(index)];\r\n let parentMenuId = item?.id;\r\n\r\n if (subMenu.id === this.state.activeMenu) {\r\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\r\n parentMenuId = undefined;\r\n }\r\n\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\r\n }\r\n return subMenu;\r\n }\r\n const found = this._getFromSubMenu(subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n subMenu = this._renderSubMenuDrawer(option);\r\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\r\n const levelClassName = `level-${this.currentLevel.toString()}`;\r\n const toggleButtonText = menuItem.linkText;\r\n const keyValue = this.state.drawerKeyValue;\r\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\r\n const keys = keyValue;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n let isDrawerOpen = false;\r\n if (keys[menuItem.id!]) {\r\n isDrawerOpen = true;\r\n }\r\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\r\n this.currentLevel++;\r\n if (this.currentLevel < multiLevelSupportedMenu) {\r\n return this._renderSubMenuDrawer(menuSubItem);\r\n }\r\n }\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Method to handle escape key event.\r\n * @param menuId -Number.\r\n * @param isDrawerOpen -Boolean.\r\n * @returns Void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\r\n const { drawerKeyValue } = this.state;\r\n const newPair = { [menuId!]: !isDrawerOpen };\r\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootEnabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootEnabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Add shop all link for Mobile submenu.\r\n */\r\n private readonly _addShopAllLink = (): void => {\r\n const { menuItemData } = this.props.navProps;\r\n this.menuItemData = menuItemData;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n this.menuItemData[0].subMenu?.map(item => {\r\n const shopAllObject = {};\r\n Object.assign(shopAllObject, { imageSource: item.imageSource });\r\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\r\n Object.assign(shopAllObject, { linkURL: item.linkURL });\r\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\r\n item.subMenu.unshift(shopAllObject);\r\n }\r\n return item;\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n\r\n}\r\n\r\nexport default NavigationMenuRootEnabled;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\r\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\r\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\r\n\r\n/**\r\n * Render the Navigation menu.\r\n * @param props - The navigation menu view props.\r\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\r\n */\r\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\r\n if (props.config.enabletopMenu) {\r\n return ;\r\n }\r\n\r\n return ;\r\n};\r\n\r\nexport default navigationMenuView;\r\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport * as React from 'react';\n\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\n\n/**\n * INavigationMenuViewRootProps.\n */\nexport interface INavigationMenuViewRootProps {\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\n}\n\n/**\n * Represent navigation menu state interface.\n */\nexport interface INavigationState {\n parentMenu?: number;\n activeMenu?: number;\n categoryImage?: Msdyn365.IImageData[] | null;\n mobileViewLabelText?: string;\n drawerKeyValue: Msdyn365.IDictionary;\n isOnlyMobile: boolean;\n isNavOpen: boolean;\n}\n\n/**\n * NavMenuConstants enum.\n */\nexport enum NavMenuConstants {\n zero = 0,\n one = 1,\n two = 2,\n three = 3,\n four = 4,\n escapeKey = 27,\n rootMenu = 1\n}\n\n/**\n * GridSizes.\n */\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\n/**\n * Get category image.\n * @param props - Navigation menu props.\n * @param categoryImage - Category Image.\n * @param alttext - AltText String.\n * @returns Returns Node.\n */\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\n const defaultImageSettings: Msdyn365.IImageSettings = {\n viewports: {\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\n },\n lazyload: true\n };\n if (categoryImageUrl !== undefined) {\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\n return (\n \n );\n }\n return null;\n};\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n addThrottledEvent,\n Button,\n Collapse,\n Drawer,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n ICollapseProps,\n IPayLoad,\n isMobile,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\n\n/**\n *\n * NavigationMenuRootDisabled component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuRootDisabled extends React.PureComponent {\n private static isBackTrack: boolean = false;\n\n private readonly supportedLevel: number = NavMenuConstants.four;\n\n private currentLevel: number = NavMenuConstants.zero;\n\n private readonly menuNode: React.RefObject;\n\n private readonly menuItemRef: React.RefObject;\n\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\n\n private readonly payLoad: IPayLoad;\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n private customResizeThrottledEventHandler?: (event: Event) => void;\n\n public constructor(props: INavigationMenuViewRootProps) {\n super(props);\n this.menuNode = React.createRef();\n this.menuItemRef = React.createRef();\n const { menuItemData } = this.props.navProps;\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\n const imageSource = item.image.src;\n this.promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n return null;\n });\n }\n }\n\n this.state = {\n activeMenu: 1,\n mobileViewLabelText: '',\n parentMenu: undefined,\n drawerKeyValue: {},\n isOnlyMobile: this.isOnlyMobile,\n categoryImage: this.promotionalImage,\n isNavOpen: false\n };\n this.telemetryContent = getTelemetryObject(\n this.props.navProps.context.request.telemetryPageName!,\n this.props.navProps.friendlyName,\n this.props.navProps.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n }\n\n @computed public get isOnlyMobile(): boolean {\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\n }\n\n public componentDidMount(): void {\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\n this._customUpdateViewport();\n document.body.addEventListener('mousedown', this._handleClickOutside);\n }\n\n public componentDidUpdate(): void {\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\n }\n }\n\n public componentWillUnmount(): void {\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n }\n\n public render(): JSX.Element | null {\n this.currentLevel = 1;\n const navbarKey = 'header-nav-mobile';\n return (\n \n {this.state.isOnlyMobile ? (\n this._renderMobileMenu()\n ) : (\n <>\n \n {this._renderCollapseMenu()}\n \n )}\n \n );\n }\n\n /**\n * Function to handle nav bar toggle.\n */\n private readonly _toggleNavBar = (): void => {\n this.setState(previousState => ({\n activeMenu: 1,\n isNavOpen: !previousState.isNavOpen\n }));\n };\n\n private _renderCollapseMenu(): JSX.Element | null {\n return (\n \n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\n \n );\n }\n\n private _renderMobileMenu(): JSX.Element {\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\n\n this.currentLevel = 1;\n return (\n \n \n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\n \n \n {this.state.mobileViewLabelText}\n \n )}\n {this._renderDisplay()}\n \n \n );\n }\n\n private _renderDesktopMenu(): JSX.Element {\n const { MenuList, Navigation } = this.props.navProps;\n\n return (\n \n \n {this._renderDisplay()}\n
\n
\n
\n
\n );\n }\n\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\n return this._renderLinkMenuItem(item);\n } else if (!item.linkURL) {\n return this._renderSpanMenuItem(item);\n }\n return null;\n }\n\n private _renderDisplay(): JSX.Element[] {\n const { ListItem } = this.props.navProps;\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n\n if (ArrayExtensions.hasElements(menuItemData)) {\n menuItemData[0].id = 1;\n }\n\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\n\n if (menuItem) {\n menuItemList.push(\n \n {` `}\n {this._createMenuItemList(menuItem)} {` `}\n \n );\n }\n } else {\n for (const [index, item] of menuItemData.entries()) {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n
\n );\n }\n }\n\n return menuItemList;\n }\n\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\n if (!menu) {\n return null;\n }\n\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\n const item: IMenuItemData = menu[Number(index)];\n\n if (item.id === this.state.activeMenu) {\n if (!NavigationMenuRootDisabled.isBackTrack) {\n this.setState({ parentMenu: parentMenuId });\n } else {\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\n }\n return item;\n }\n const found = this._getFromSubMenu(item.id, item.subMenu);\n if (found) {\n return found;\n }\n }\n return null;\n }\n\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\n }\n\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\n \n );\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\n return this._renderSpanMenuItem(menuItemData);\n }\n\n return null;\n }\n\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\n if (activeMenu === NavMenuConstants.rootMenu) {\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\n }\n\n const { ListItem } = this.props.navProps;\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\n let menuItem: JSX.Element | null;\n if (hasOptions && this.state.isOnlyMobile) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\n menuItem = this.getMenuItem(option, index);\n } else {\n menuItem = null;\n }\n let subMenu;\n const isHavingSubmenu =\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\n\n if (hasOptions && !this.state.isOnlyMobile) {\n if (this.currentLevel >= NavMenuConstants.two) {\n subMenu = this._renderSubMenuDrawer(option);\n } else if (this.currentLevel <= this.supportedLevel) {\n this.currentLevel++;\n levelClassName = `level-${this.currentLevel.toString()}`;\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\n }\n }\n\n if (isHavingSubmenu && this.state.isOnlyMobile) {\n this.currentLevel++;\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\n }\n const imagesource = option.imageSource ? option.imageSource : '';\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\n }\n\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\n let menuItem: JSX.Element | null;\n if (this.currentLevel === NavMenuConstants.one) {\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\n }\n return menuItem;\n }\n\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\n const levelClassName = `level-${this.currentLevel.toString()}`;\n const toggleButtonText = menuItem.linkText;\n const keyValue = this.state.drawerKeyValue;\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\n const keys = keyValue;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n let isDrawerOpen = false;\n if (keys[menuItem.id!]) {\n isDrawerOpen = true;\n }\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\n\n return (\n \n
\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\n this.currentLevel++;\n if (this.currentLevel < multiLevelSupportedMenu) {\n return this._renderSubMenuDrawer(menuSubItem);\n }\n }\n return this._renderDrawerLink(menuSubItem);\n })}\n
\n \n );\n }\n\n /**\n * Method to handle escape key event.\n * @param menuId -Number.\n * @param isDrawerOpen -Boolean.\n * @returns Void.\n */\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\n const { drawerKeyValue } = this.state;\n const newPair = { [menuId!]: !isDrawerOpen };\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\n };\n\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props.navProps;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Span } = this.props.navProps;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\n const isCategoryImageDisplay =\n !this.state.isOnlyMobile &&\n showCategoryImage &&\n this.state.categoryImage !== null &&\n this.state.categoryImage !== undefined &&\n !isSubmenu;\n const isPromotionalContentDisplay =\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\n const divContainerClass =\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = NavMenuConstants.one;\n const menuLevelSupportClassName =\n isCategoryImageDisplay &&\n this.props.navProps.config.menuLevelSupport &&\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\n 'navmenu-multi-level';\n\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\n return (\n \n \n {menuOptions}\n \n
\n {isCategoryImageDisplay &&\n ArrayExtensions.hasElements(categoryImages) &&\n categoryImages.map(item => (\n \n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\n {isPromotionalContentDisplay &&\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n
\n \n );\n }\n\n /**\n * Handle Category image update.\n * @param categoryImageSource - Image source.\n * @param option - Menu Item data.\n * @returns Returns empty.\n */\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\n const linkText = option.linkText ? option.linkText : '';\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n for (const item of option.promotionalContent) {\n const imageSource = item.image.src;\n promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n }\n this.setState({\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\n });\n };\n\n /**\n * Handle dropdown toggle.\n * @param data - Menu Item data.\n * @param parentId - Number.\n * @returns Returns empty.\n */\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.state.isOnlyMobile) {\n this.setState({\n activeMenu: data.id,\n parentMenu: parentId\n });\n if (this.props.navProps.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n NavigationMenuRootDisabled.isBackTrack = false;\n this.setState({\n activeMenu: data.id,\n mobileViewLabelText: data.linkText!,\n parentMenu: parentId\n });\n }\n };\n\n /**\n * Handle back navigation for menu items for mobile view.\n * @returns Returns empty.\n */\n private readonly _handleGoBack = () => () => {\n NavigationMenuRootDisabled.isBackTrack = true;\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\n };\n\n /**\n * Function to close the nav menu on click on body.\n * @param event - MouseEvent.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n }\n };\n\n /**\n * Checks to assign a ref for focus.\n * @param index -Sub menu list index.\n * @param mobileViewLabelText -Mobile view label text.\n * @param optionLinkText -Sub menu item link text.\n * @returns Boolean.\n */\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\n const firstIndex: number = 0;\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\n return true;\n }\n if (!optionLinkText || !mobileViewLabelText) {\n return false;\n }\n return mobileViewLabelText === optionLinkText;\n };\n\n /**\n * Function to handle nav menu close.\n */\n private readonly _closeNavMenu = (): void => {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n (this.menuNode.current?.children[0] as HTMLElement).focus();\n };\n\n /**\n * Function to close the nav menu on esc key.\n * @param event - Event.\n */\n private readonly _escFunction = (event: React.KeyboardEvent) => {\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\n (this.menuNode.current?.children[0] as HTMLElement).focus();\n }\n };\n\n /**\n * Custom update viewport.\n */\n private readonly _customUpdateViewport = (): void => {\n this.setState({ isOnlyMobile: this.isOnlyMobile });\n };\n}\n\nexport default NavigationMenuRootDisabled;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport * as Msdyn365 from '@msdyn365-commerce/core';\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n addThrottledEvent,\n Button,\n Collapse,\n Drawer,\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n ICollapseProps,\n IPayLoad,\n isMobile,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick,\n VariantType\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed } from 'mobx';\nimport * as React from 'react';\n\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\n\n/**\n *\n * NavigationMenuRootEnabled component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuRootEnabled extends React.PureComponent {\n private static isBackTrack: boolean = false;\n\n private readonly supportedLevel: number = NavMenuConstants.four;\n\n private currentLevel: number = NavMenuConstants.zero;\n\n private readonly menuNode: React.RefObject;\n\n private readonly menuItemRef: React.RefObject;\n\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\n\n private menuItemData: IMenuItemData[] = [];\n\n private readonly payLoad: IPayLoad;\n\n private readonly attributes?: Msdyn365.IDictionary;\n\n private customResizeThrottledEventHandler?: (event: Event) => void;\n\n public constructor(props: INavigationMenuViewRootProps) {\n super(props);\n this.menuNode = React.createRef();\n this.menuItemRef = React.createRef();\n const { menuItemData } = this.props.navProps;\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\n const imageSource = item.image.src;\n this.promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n return null;\n });\n }\n }\n this.state = {\n activeMenu: NavMenuConstants.rootMenu,\n mobileViewLabelText: '',\n parentMenu: undefined,\n drawerKeyValue: {},\n isOnlyMobile: this.isOnlyMobile,\n categoryImage: this.promotionalImage,\n isNavOpen: false\n };\n\n this.telemetryContent = getTelemetryObject(\n this.props.navProps.context.request.telemetryPageName!,\n this.props.navProps.friendlyName,\n this.props.navProps.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n }\n\n @computed public get isOnlyMobile(): boolean {\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\n }\n\n public componentDidMount(): void {\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\n this._customUpdateViewport();\n document.body.addEventListener('mousedown', this._handleClickOutside);\n this._addShopAllLink();\n }\n\n public componentDidUpdate(): void {\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\n }\n }\n\n public componentWillUnmount(): void {\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n }\n\n public render(): JSX.Element | null {\n this.currentLevel = NavMenuConstants.one;\n const navbarKey = 'header-nav-mobile';\n return (\n \n {this.state.isOnlyMobile ? (\n this._renderMobileMenu()\n ) : (\n <>\n \n {this._renderCollapseMenu()}\n \n )}\n \n );\n }\n\n /**\n * Function to handle nav bar toggle.\n */\n private readonly _toggleNavBar = (): void => {\n this.setState(previousState => ({\n activeMenu: NavMenuConstants.rootMenu,\n isNavOpen: !previousState.isNavOpen\n }));\n };\n\n private _renderCollapseMenu(): JSX.Element | null {\n return (\n \n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\n \n );\n }\n\n private _renderMobileMenu(): JSX.Element {\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\n\n this.currentLevel = NavMenuConstants.one;\n return (\n \n \n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\n \n \n {this.state.mobileViewLabelText}\n \n )}\n {this._renderDisplay()}\n \n \n );\n }\n\n private _renderDesktopMenu(): JSX.Element {\n const { Navigation } = this.props.navProps;\n return (\n \n \n {this._renderDisplay()}\n
\n
\n
\n
\n );\n }\n\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\n return this._renderLinkMenuItem(item);\n } else if (!item.linkURL) {\n return this._renderSpanMenuItem(item);\n }\n return null;\n }\n\n private _renderDisplay(): JSX.Element[] {\n const { ListItem } = this.props.navProps;\n let menuItemData: IMenuItemData[] = [];\n if (this.state.isOnlyMobile) {\n menuItemData = this.menuItemData;\n } else {\n menuItemData = this.props.navProps.menuItemData;\n }\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n let cmsMenuData: IMenuItemData[] | undefined = [];\n let retailMenuItemData: IMenuItemData[] | undefined = [];\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\n\n for (const item of retailMenuData) {\n retailMenuItemData = item.subMenu!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\n item.subMenu = retailMenuItemData;\n }\n\n for (const item of menuItemData) {\n cmsMenuData = item.subMenu!.filter(subMenuItem => subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail);\n }\n\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\n let menuItem: IMenuItemData | null = {};\n for (const menuItemDatum of menuItemData) {\n if (menuItemDatum.id === activeMenu) {\n menuItem = menuItemDatum;\n if (!NavigationMenuRootEnabled.isBackTrack) {\n this.setState({\n parentMenu: undefined\n });\n } else {\n this.setState({\n parentMenu: undefined,\n mobileViewLabelText: menuItemDatum.linkText\n });\n }\n break;\n }\n menuItem = this._getFromSubMenu(menuItemDatum);\n if (menuItem && menuItem.id === activeMenu) {\n break;\n }\n }\n\n if (menuItem) {\n menuItemList.push(\n \n {` `}\n {this._createMenuItemList(menuItem)} {` `}\n \n );\n }\n } else {\n for (const [index, item] of retailMenuData.entries()) {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n
\n );\n }\n\n for (const [index, item] of cmsMenuData.entries()) {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n \n );\n }\n }\n\n return menuItemList;\n }\n\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\n const subMenus = item?.subMenu;\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\n const subMenu: IMenuItemData = subMenus[Number(index)];\n let parentMenuId = item?.id;\n\n if (subMenu.id === this.state.activeMenu) {\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\n parentMenuId = undefined;\n }\n\n if (!NavigationMenuRootEnabled.isBackTrack) {\n this.setState({ parentMenu: parentMenuId });\n } else {\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\n }\n return subMenu;\n }\n const found = this._getFromSubMenu(subMenu);\n if (found) {\n return found;\n }\n }\n }\n return null;\n }\n\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\n }\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\n \n );\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\n } else if (!menuItemData.linkURL) {\n return this._renderSpanMenuItem(menuItemData);\n }\n\n return null;\n }\n\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\n if (activeMenu === NavMenuConstants.rootMenu) {\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\n }\n\n const { ListItem } = this.props.navProps;\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\n let menuItem: JSX.Element | null;\n if (hasOptions && this.state.isOnlyMobile) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\n menuItem = this.getMenuItem(option, index);\n } else {\n menuItem = null;\n }\n let subMenu;\n const isHavingSubmenu =\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\n\n if (hasOptions && !this.state.isOnlyMobile) {\n if (this.currentLevel >= NavMenuConstants.two) {\n subMenu = this._renderSubMenuDrawer(option);\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\n this.currentLevel++;\n levelClassName = `level-${this.currentLevel.toString()}`;\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\n }\n }\n if (isHavingSubmenu && this.state.isOnlyMobile) {\n this.currentLevel++;\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\n }\n const imagesource = option.imageSource ? option.imageSource : '';\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\n }\n\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\n let menuItem: JSX.Element | null;\n if (this.currentLevel === NavMenuConstants.one) {\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\n }\n return menuItem;\n }\n\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\n const levelClassName = `level-${this.currentLevel.toString()}`;\n const toggleButtonText = menuItem.linkText;\n const keyValue = this.state.drawerKeyValue;\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\n const keys = keyValue;\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\n\n let isDrawerOpen = false;\n if (keys[menuItem.id!]) {\n isDrawerOpen = true;\n }\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\n return (\n \n
\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\n this.currentLevel++;\n if (this.currentLevel < multiLevelSupportedMenu) {\n return this._renderSubMenuDrawer(menuSubItem);\n }\n }\n return this._renderDrawerLink(menuSubItem);\n })}\n
\n \n );\n }\n\n /**\n * Method to handle escape key event.\n * @param menuId -Number.\n * @param isDrawerOpen -Boolean.\n * @returns Void.\n */\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\n const { drawerKeyValue } = this.state;\n const newPair = { [menuId!]: !isDrawerOpen };\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\n };\n\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\n const { Link } = this.props.navProps;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props.navProps;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\n const { Span } = this.props.navProps;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\n const isCategoryImageDisplay =\n !this.state.isOnlyMobile &&\n showCategoryImage &&\n this.state.categoryImage !== null &&\n this.state.categoryImage !== undefined &&\n !isSubmenu;\n const isPromotionalContentDisplay =\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\n const divContainerClass =\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = NavMenuConstants.one;\n const menuLevelSupportClassName =\n isCategoryImageDisplay &&\n this.props.navProps.config.menuLevelSupport &&\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\n 'navmenu-multi-level';\n\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\n return (\n \n \n {menuOptions}\n \n
\n {isCategoryImageDisplay &&\n ArrayExtensions.hasElements(categoryImages) &&\n categoryImages.map(item => (\n \n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\n {isPromotionalContentDisplay &&\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n
\n \n );\n }\n\n /**\n * Handle Category image update.\n * @param categoryImageSource - Image source.\n * @param option - Menu Item data.\n * @returns Returns empty.\n */\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\n const linkText = option.linkText ? option.linkText : '';\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n for (const item of option.promotionalContent) {\n const imageSource = item.image.src;\n promotionalImage.push({\n src: imageSource,\n altText: item.text,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n }\n this.setState({\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\n });\n };\n\n /**\n * Handle dropdown toggle.\n * @param data - Menu Item data.\n * @param parentId - Number.\n * @returns Returns empty.\n */\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.state.isOnlyMobile) {\n this.setState({\n activeMenu: data.id,\n parentMenu: parentId\n });\n if (this.props.navProps.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n NavigationMenuRootEnabled.isBackTrack = false;\n this.setState({\n activeMenu: data.id,\n mobileViewLabelText: data.linkText!,\n parentMenu: parentId\n });\n }\n };\n\n /**\n * Handle back navigation for menu items for mobile view.\n * @returns Returns empty.\n */\n private readonly _handleGoBack = () => () => {\n NavigationMenuRootEnabled.isBackTrack = true;\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\n };\n\n /**\n * Function to close the nav menu on click on body.\n * @param event - MouseEvent.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n }\n };\n\n /**\n * Add shop all link for Mobile submenu.\n */\n private readonly _addShopAllLink = (): void => {\n const { menuItemData } = this.props.navProps;\n this.menuItemData = menuItemData;\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\n this.menuItemData[0].subMenu?.map(item => {\n const shopAllObject = {};\n Object.assign(shopAllObject, { imageSource: item.imageSource });\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\n Object.assign(shopAllObject, { linkURL: item.linkURL });\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\n item.subMenu.unshift(shopAllObject);\n }\n return item;\n });\n }\n };\n\n /**\n * Checks to assign a ref for focus.\n * @param index -Sub menu list index.\n * @param mobileViewLabelText -Mobile view label text.\n * @param optionLinkText -Sub menu item link text.\n * @returns Boolean.\n */\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\n const firstIndex: number = 0;\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\n return true;\n }\n if (!optionLinkText || !mobileViewLabelText) {\n return false;\n }\n return mobileViewLabelText === optionLinkText;\n };\n\n /**\n * Function to handle nav menu close.\n */\n private readonly _closeNavMenu = (): void => {\n if (!this.state.isOnlyMobile) {\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\n } else {\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\n }\n };\n\n /**\n * Function to close the nav menu on esc key.\n * @param event - Event.\n */\n private readonly _escFunction = (event: React.KeyboardEvent) => {\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\n }\n };\n\n /**\n * Custom update viewport.\n */\n private readonly _customUpdateViewport = (): void => {\n this.setState({ isOnlyMobile: this.isOnlyMobile });\n };\n}\n\nexport default NavigationMenuRootEnabled;\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\nimport * as React from 'react';\n\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\n\n/**\n * Render the Navigation menu.\n * @param props - The navigation menu view props.\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\n */\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\n if (props.config.enabletopMenu) {\n return ;\n }\n\n return ;\n};\n\nexport default navigationMenuView;\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\r\n\r\n/**\r\n * INavigationMenuViewRootProps.\r\n */\r\nexport interface INavigationMenuViewRootProps {\r\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\r\n}\r\n\r\n/**\r\n * Represent navigation menu state interface.\r\n */\r\nexport interface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n categoryImage?: Msdyn365.IImageData[] | null;\r\n mobileViewLabelText?: string;\r\n drawerKeyValue: Msdyn365.IDictionary;\r\n isOnlyMobile: boolean;\r\n isNavOpen: boolean;\r\n}\r\n\r\n/**\r\n * NavMenuConstants enum.\r\n */\r\nexport enum NavMenuConstants {\r\n zero = 0,\r\n one = 1,\r\n two = 2,\r\n three = 3,\r\n four = 4,\r\n escapeKey = 27,\r\n rootMenu = 1\r\n}\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Get category image.\r\n * @param props - Navigation menu props.\r\n * @param categoryImage - Category Image.\r\n * @param alttext - AltText String.\r\n * @returns Returns Node.\r\n */\r\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n if (categoryImageUrl !== undefined) {\r\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n // Button,\r\n // Collapse,\r\n Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n ICollapseProps,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootDisabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootDisabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n // private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({\r\n src: imageSource,\r\n altText: item.text,\r\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\r\n });\r\n return null;\r\n });\r\n }\r\n }\r\n\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n drawerKeyValue: {},\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry\r\n );\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n // this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n if (this.state.isOnlyMobile) {\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n } else {\r\n document.body.addEventListener('mouseover', this._handleClickOutside);\r\n }\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n if (this.state.isOnlyMobile) {\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n } else {\r\n document.body.addEventListener('mouseover', this._handleClickOutside);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = 1;\r\n // const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {this.state.isOnlyMobile ? (\r\n this._renderMobileMenu()\r\n ) : (\r\n <>\r\n {/* */}\r\n {this._renderCollapseMenu()}\r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n // private readonly _toggleNavBar = (): void => {\r\n // this.setState(previousState => ({\r\n // activeMenu: 1,\r\n // isNavOpen: !previousState.isNavOpen\r\n // }));\r\n // };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n
\r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n
\r\n // \r\n // {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n // \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n )}\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { MenuList, Navigation } = this.props.navProps;\r\n\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n {/*
\r\n
*/}\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return this._renderLinkMenuItem(item);\r\n } else if (!item.linkURL) {\r\n return this._renderSpanMenuItem(item);\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (ArrayExtensions.hasElements(menuItemData)) {\r\n menuItemData[0].id = 1;\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}{' '}\r\n \r\n );\r\n }\r\n } else {\r\n for (const [index, item] of menuItemData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\r\n if (!menu) {\r\n return null;\r\n }\r\n\r\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\r\n const item: IMenuItemData = menu[Number(index)];\r\n\r\n if (item.id === this.state.activeMenu) {\r\n if (!NavigationMenuRootDisabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\r\n }\r\n return item;\r\n }\r\n const found = this._getFromSubMenu(item.id, item.subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\r\n }\r\n\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\r\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\r\n return this._renderSpanMenuItem(menuItemData);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n if (option.linkText === 'All') {\r\n return <>;\r\n }\r\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu =\r\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n subMenu = this._renderSubMenuDrawer(option);\r\n } else if (this.currentLevel <= this.supportedLevel) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\r\n } else {\r\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\r\n const levelClassName = `level-${this.currentLevel.toString()}`;\r\n const toggleButtonText = menuItem.linkText;\r\n const keyValue = this.state.drawerKeyValue;\r\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\r\n const keys = keyValue;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n let isDrawerOpen = false;\r\n if (keys[menuItem.id!]) {\r\n isDrawerOpen = true;\r\n }\r\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\r\n\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\r\n this.currentLevel++;\r\n if (this.currentLevel < multiLevelSupportedMenu) {\r\n return this._renderSubMenuDrawer(menuSubItem);\r\n }\r\n }\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Method to handle escape key event.\r\n * @param menuId -Number.\r\n * @param isDrawerOpen -Boolean.\r\n * @returns Void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\r\n const { drawerKeyValue } = this.state;\r\n const newPair = { [menuId!]: !isDrawerOpen };\r\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return this.isOnlyMobile ? (\r\n \r\n {option.linkText}\r\n \r\n ) : (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n {linkText}\r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile &&\r\n showCategoryImage &&\r\n this.state.categoryImage !== null &&\r\n this.state.categoryImage !== undefined &&\r\n !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass =\r\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay &&\r\n this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\r\n 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {isCategoryImageDisplay &&\r\n ArrayExtensions.hasElements(categoryImages) &&\r\n categoryImages.map(item => (\r\n \r\n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n {isPromotionalContentDisplay &&\r\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n \r\n ))}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({\r\n src: imageSource,\r\n altText: item.text,\r\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\r\n });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootDisabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootDisabled.isBackTrack = true;\r\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 0, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n // private readonly _closeNavMenu = (): void => {\r\n // if (!this.state.isOnlyMobile) {\r\n // this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n // } else {\r\n // this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n // }\r\n // };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n}\r\n\r\nexport default NavigationMenuRootDisabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer, getPayloadObject, getTelemetryAttributes,\r\n getTelemetryObject,\r\n ICollapseProps,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootEnabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootEnabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private menuItemData: IMenuItemData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: NavMenuConstants.rootMenu,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n drawerKeyValue: {},\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n this._addShopAllLink();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = NavMenuConstants.one;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n \r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: NavMenuConstants.rootMenu,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = NavMenuConstants.one;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { Navigation } = this.props.navProps;\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n let menuItemData: IMenuItemData[] = [];\r\n if (this.state.isOnlyMobile) {\r\n menuItemData = this.menuItemData;\r\n } else {\r\n menuItemData = this.props.navProps.menuItemData;\r\n }\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n let cmsMenuData: IMenuItemData[] | undefined = [];\r\n let retailMenuItemData: IMenuItemData[] | undefined = [];\r\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\r\n\r\n for (const item of retailMenuData) {\r\n retailMenuItemData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n item.subMenu = retailMenuItemData;\r\n }\r\n\r\n for (const item of menuItemData) {\r\n cmsMenuData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail));\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n let menuItem: IMenuItemData | null = {};\r\n for (const menuItemDatum of menuItemData) {\r\n if (menuItemDatum.id === activeMenu) {\r\n menuItem = menuItemDatum;\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({\r\n parentMenu: undefined\r\n });\r\n } else {\r\n this.setState({\r\n parentMenu: undefined,\r\n mobileViewLabelText: menuItemDatum.linkText\r\n });\r\n }\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemDatum);\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n\r\n } else {\r\n for (const [index, item] of retailMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n for (const [index, item] of cmsMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item?.subMenu;\r\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\r\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\r\n const subMenu: IMenuItemData = subMenus[Number(index)];\r\n let parentMenuId = item?.id;\r\n\r\n if (subMenu.id === this.state.activeMenu) {\r\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\r\n parentMenuId = undefined;\r\n }\r\n\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\r\n }\r\n return subMenu;\r\n }\r\n const found = this._getFromSubMenu(subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n subMenu = this._renderSubMenuDrawer(option);\r\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\r\n const levelClassName = `level-${this.currentLevel.toString()}`;\r\n const toggleButtonText = menuItem.linkText;\r\n const keyValue = this.state.drawerKeyValue;\r\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\r\n const keys = keyValue;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n let isDrawerOpen = false;\r\n if (keys[menuItem.id!]) {\r\n isDrawerOpen = true;\r\n }\r\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\r\n this.currentLevel++;\r\n if (this.currentLevel < multiLevelSupportedMenu) {\r\n return this._renderSubMenuDrawer(menuSubItem);\r\n }\r\n }\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Method to handle escape key event.\r\n * @param menuId -Number.\r\n * @param isDrawerOpen -Boolean.\r\n * @returns Void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\r\n const { drawerKeyValue } = this.state;\r\n const newPair = { [menuId!]: !isDrawerOpen };\r\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootEnabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootEnabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Add shop all link for Mobile submenu.\r\n */\r\n private readonly _addShopAllLink = (): void => {\r\n const { menuItemData } = this.props.navProps;\r\n this.menuItemData = menuItemData;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n this.menuItemData[0].subMenu?.map(item => {\r\n const shopAllObject = {};\r\n Object.assign(shopAllObject, { imageSource: item.imageSource });\r\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\r\n Object.assign(shopAllObject, { linkURL: item.linkURL });\r\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\r\n item.subMenu.unshift(shopAllObject);\r\n }\r\n return item;\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n\r\n}\r\n\r\nexport default NavigationMenuRootEnabled;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\r\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\r\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\r\n\r\n/**\r\n * Render the Navigation menu.\r\n * @param props - The navigation menu view props.\r\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\r\n */\r\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\r\n if (props.config.enabletopMenu) {\r\n return ;\r\n }\r\n\r\n return ;\r\n};\r\n\r\nexport default navigationMenuView;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\r\n\r\n/**\r\n * INavigationMenuViewRootProps.\r\n */\r\nexport interface INavigationMenuViewRootProps {\r\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\r\n}\r\n\r\n/**\r\n * Represent navigation menu state interface.\r\n */\r\nexport interface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n categoryImage?: Msdyn365.IImageData[] | null;\r\n mobileViewLabelText?: string;\r\n drawerKeyValue: Msdyn365.IDictionary;\r\n isOnlyMobile: boolean;\r\n isNavOpen: boolean;\r\n}\r\n\r\n/**\r\n * NavMenuConstants enum.\r\n */\r\nexport enum NavMenuConstants {\r\n zero = 0,\r\n one = 1,\r\n two = 2,\r\n three = 3,\r\n four = 4,\r\n escapeKey = 27,\r\n rootMenu = 1\r\n}\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Get category image.\r\n * @param props - Navigation menu props.\r\n * @param categoryImage - Category Image.\r\n * @param alttext - AltText String.\r\n * @returns Returns Node.\r\n */\r\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n if (categoryImageUrl !== undefined) {\r\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n // Button,\r\n // Collapse,\r\n Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n ICollapseProps,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootDisabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootDisabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n // private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({\r\n src: imageSource,\r\n altText: item.text,\r\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\r\n });\r\n return null;\r\n });\r\n }\r\n }\r\n\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n drawerKeyValue: {},\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry\r\n );\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n // this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n if (this.state.isOnlyMobile) {\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n } else {\r\n document.body.addEventListener('mouseover', this._handleClickOutside);\r\n }\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n if (this.state.isOnlyMobile) {\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n } else {\r\n document.body.addEventListener('mouseover', this._handleClickOutside);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = 1;\r\n // const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {this.state.isOnlyMobile ? (\r\n this._renderMobileMenu()\r\n ) : (\r\n <>\r\n {/* */}\r\n {this._renderCollapseMenu()}\r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n // private readonly _toggleNavBar = (): void => {\r\n // this.setState(previousState => ({\r\n // activeMenu: 1,\r\n // isNavOpen: !previousState.isNavOpen\r\n // }));\r\n // };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n
\r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n
\r\n // \r\n // {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n // \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n )}\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { MenuList, Navigation } = this.props.navProps;\r\n\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n {/*
\r\n
*/}\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return this._renderLinkMenuItem(item);\r\n } else if (!item.linkURL) {\r\n return this._renderSpanMenuItem(item);\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (ArrayExtensions.hasElements(menuItemData)) {\r\n menuItemData[0].id = 1;\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}{' '}\r\n \r\n );\r\n }\r\n } else {\r\n for (const [index, item] of menuItemData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\r\n if (!menu) {\r\n return null;\r\n }\r\n\r\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\r\n const item: IMenuItemData = menu[Number(index)];\r\n\r\n if (item.id === this.state.activeMenu) {\r\n if (!NavigationMenuRootDisabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\r\n }\r\n return item;\r\n }\r\n const found = this._getFromSubMenu(item.id, item.subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\r\n }\r\n\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\r\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\r\n return this._renderSpanMenuItem(menuItemData);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n if (option.linkText === 'All') {\r\n return <>;\r\n }\r\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu =\r\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n subMenu = this._renderSubMenuDrawer(option);\r\n } else if (this.currentLevel <= this.supportedLevel) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\r\n } else {\r\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\r\n const levelClassName = `level-${this.currentLevel.toString()}`;\r\n const toggleButtonText = menuItem.linkText;\r\n const keyValue = this.state.drawerKeyValue;\r\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\r\n const keys = keyValue;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n let isDrawerOpen = false;\r\n if (keys[menuItem.id!]) {\r\n isDrawerOpen = true;\r\n }\r\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\r\n\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\r\n this.currentLevel++;\r\n if (this.currentLevel < multiLevelSupportedMenu) {\r\n return this._renderSubMenuDrawer(menuSubItem);\r\n }\r\n }\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Method to handle escape key event.\r\n * @param menuId -Number.\r\n * @param isDrawerOpen -Boolean.\r\n * @returns Void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\r\n const { drawerKeyValue } = this.state;\r\n const newPair = { [menuId!]: !isDrawerOpen };\r\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return this.isOnlyMobile ? (\r\n \r\n {option.linkText}\r\n \r\n ) : (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n {linkText}\r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile &&\r\n showCategoryImage &&\r\n this.state.categoryImage !== null &&\r\n this.state.categoryImage !== undefined &&\r\n !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass =\r\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay &&\r\n this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\r\n 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {isCategoryImageDisplay &&\r\n ArrayExtensions.hasElements(categoryImages) &&\r\n categoryImages.map(item => (\r\n \r\n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n {isPromotionalContentDisplay &&\r\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n \r\n ))}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({\r\n src: imageSource,\r\n altText: item.text,\r\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\r\n });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootDisabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootDisabled.isBackTrack = true;\r\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 0, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n // private readonly _closeNavMenu = (): void => {\r\n // if (!this.state.isOnlyMobile) {\r\n // this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n // } else {\r\n // this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n // }\r\n // };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n}\r\n\r\nexport default NavigationMenuRootDisabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer, getPayloadObject, getTelemetryAttributes,\r\n getTelemetryObject,\r\n ICollapseProps,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootEnabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootEnabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private menuItemData: IMenuItemData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: NavMenuConstants.rootMenu,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n drawerKeyValue: {},\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n this._addShopAllLink();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = NavMenuConstants.one;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n \r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: NavMenuConstants.rootMenu,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = NavMenuConstants.one;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { Navigation } = this.props.navProps;\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n let menuItemData: IMenuItemData[] = [];\r\n if (this.state.isOnlyMobile) {\r\n menuItemData = this.menuItemData;\r\n } else {\r\n menuItemData = this.props.navProps.menuItemData;\r\n }\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n let cmsMenuData: IMenuItemData[] | undefined = [];\r\n let retailMenuItemData: IMenuItemData[] | undefined = [];\r\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\r\n\r\n for (const item of retailMenuData) {\r\n retailMenuItemData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n item.subMenu = retailMenuItemData;\r\n }\r\n\r\n for (const item of menuItemData) {\r\n cmsMenuData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail));\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n let menuItem: IMenuItemData | null = {};\r\n for (const menuItemDatum of menuItemData) {\r\n if (menuItemDatum.id === activeMenu) {\r\n menuItem = menuItemDatum;\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({\r\n parentMenu: undefined\r\n });\r\n } else {\r\n this.setState({\r\n parentMenu: undefined,\r\n mobileViewLabelText: menuItemDatum.linkText\r\n });\r\n }\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemDatum);\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n\r\n } else {\r\n for (const [index, item] of retailMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n for (const [index, item] of cmsMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item?.subMenu;\r\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\r\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\r\n const subMenu: IMenuItemData = subMenus[Number(index)];\r\n let parentMenuId = item?.id;\r\n\r\n if (subMenu.id === this.state.activeMenu) {\r\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\r\n parentMenuId = undefined;\r\n }\r\n\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\r\n }\r\n return subMenu;\r\n }\r\n const found = this._getFromSubMenu(subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n subMenu = this._renderSubMenuDrawer(option);\r\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\r\n const levelClassName = `level-${this.currentLevel.toString()}`;\r\n const toggleButtonText = menuItem.linkText;\r\n const keyValue = this.state.drawerKeyValue;\r\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\r\n const keys = keyValue;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n let isDrawerOpen = false;\r\n if (keys[menuItem.id!]) {\r\n isDrawerOpen = true;\r\n }\r\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\r\n this.currentLevel++;\r\n if (this.currentLevel < multiLevelSupportedMenu) {\r\n return this._renderSubMenuDrawer(menuSubItem);\r\n }\r\n }\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Method to handle escape key event.\r\n * @param menuId -Number.\r\n * @param isDrawerOpen -Boolean.\r\n * @returns Void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\r\n const { drawerKeyValue } = this.state;\r\n const newPair = { [menuId!]: !isDrawerOpen };\r\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootEnabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootEnabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Add shop all link for Mobile submenu.\r\n */\r\n private readonly _addShopAllLink = (): void => {\r\n const { menuItemData } = this.props.navProps;\r\n this.menuItemData = menuItemData;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n this.menuItemData[0].subMenu?.map(item => {\r\n const shopAllObject = {};\r\n Object.assign(shopAllObject, { imageSource: item.imageSource });\r\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\r\n Object.assign(shopAllObject, { linkURL: item.linkURL });\r\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\r\n item.subMenu.unshift(shopAllObject);\r\n }\r\n return item;\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n\r\n}\r\n\r\nexport default NavigationMenuRootEnabled;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\r\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\r\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\r\n\r\n/**\r\n * Render the Navigation menu.\r\n * @param props - The navigation menu view props.\r\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\r\n */\r\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\r\n if (props.config.enabletopMenu) {\r\n return ;\r\n }\r\n\r\n return ;\r\n};\r\n\r\nexport default navigationMenuView;\r\n","/*--------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * See License.txt in the project root for license information.\n *--------------------------------------------------------------*/\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport { AsyncResult } from '@msdyn365-commerce/retail-proxy';\n\nimport { ICategoryPromotionalContentData } from './navigation-menu.props.autogenerated';\n\nexport interface INavigationMenuData {\n categories: AsyncResult;\n}\n\nexport interface IMenuItemData {\n id?: number;\n linkText?: string;\n linkURL?: string;\n imageSource?: string;\n imageDestinationURL?: string;\n subMenu?: IMenuItemData[];\n promotionalContent?: ICategoryPromotionalContentData[];\n menuSource?: string;\n shouldOpenNewTab?: boolean;\n ariaLabel?: string;\n}\n\n/**\n *\n * Menu type index id.\n */\nexport enum MenuTypeIndexId {\n Cms = 1000,\n Retail = 5000\n}\n\n/**\n *\n * Menu type source.\n */\nexport enum MenuSource {\n Cms = 'Cms',\n Retail = 'Retail'\n}\n","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport { CategoryHierarchy } from '@msdyn365-commerce/commerce-entities';\nimport MsDyn365, { IActionContext, IGridSettings, IImageSettings, isEmptyOrNullObject } from '@msdyn365-commerce/core';\nimport { TextValueTranslation } from '@msdyn365-commerce/retail-proxy';\nimport { ArrayExtensions, getCategoryUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport { addThrottledEvent, IModuleProps, INodeProps } from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport { computed, observable } from 'mobx';\nimport * as React from 'react';\n\nimport { IMenuItemData, INavigationMenuData, MenuSource, MenuTypeIndexId } from './navigation-menu.data';\nimport { ICmsNavItemsData, INavigationMenuProps, ISubMenusData, navigationMenuSource } from './navigation-menu.props.autogenerated';\n\nexport interface INavigationMenuViewProps extends INavigationMenuProps {\n className: string;\n menuItemData: IMenuItemData[];\n Navigation: IModuleProps;\n MenuList: INodeProps;\n ListItem: INodeProps;\n Link: INodeProps;\n Button: INodeProps;\n Span: INodeProps;\n ImageContainer: INodeProps;\n MobileDescriptionContainer: INodeProps;\n MobileBackButton: INodeProps;\n MobileDescriptionLabel: INodeProps;\n imageSettings: IImageSettings;\n gridSettings: IGridSettings;\n isMobileView: boolean;\n DivContainer?: INodeProps;\n ImageDivContainer?: INodeProps;\n showCategoryImage?: boolean;\n showPromotionalContent?: boolean;\n}\n\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\n\nexport interface INavigationMenuState {\n isMobile: boolean;\n}\n\n/**\n *\n * NavigationMenu component.\n * @extends {React.PureComponent>}\n */\nclass NavigationMenu extends React.PureComponent, INavigationMenuState> {\n private static CMSItemIdInit: number = MenuTypeIndexId.Cms;\n\n private static RSItemIdInit: number = MenuTypeIndexId.Retail;\n\n private resizeThrottledEventHandler?: (event: Event) => void;\n\n private menuItemList: IMenuItemData[];\n\n private isRetail: boolean = true;\n\n private isCMS: boolean = true;\n\n @observable\n private viewport: GridSize;\n\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\n let nameTranslation: TextValueTranslation | undefined;\n if (locale && nameTranslations && nameTranslations.length > 0) {\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\n }\n\n return nameTranslation && nameTranslation.Text;\n }\n\n constructor(props: INavigationMenuProps) {\n super(props);\n this._updateViewport = this._updateViewport.bind(this);\n this.viewport =\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\n this._setNavigationSource(this.props.config && this.props.config.navigationMenuSource);\n this.state = { isMobile: this.isMobile };\n this.menuItemList = [];\n }\n\n @computed get isMobile(): boolean {\n return this.viewport === 'xs' || this.viewport === 'sm';\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n this.resizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._updateViewport as EventListener);\n }\n this._updateViewport();\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n window.removeEventListener('resize', this.resizeThrottledEventHandler!, false);\n }\n }\n\n public render(): JSX.Element | null {\n this.menuItemList = this._mapData();\n if (isEmptyOrNullObject(this.props.data)) {\n this.props.telemetry.error('Navigatiomenu returned null');\n return null;\n }\n\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=224&h=300&m=6', w: 0, h: 0 },\n xl: { q: 'w=224&h=300&m=6', w: 0, h: 0 }\n },\n lazyload: true\n };\n\n const viewProps = {\n ...this.props,\n ...this.state,\n imageSettings: defaultImageSettings,\n gridSettings: this.props.context.request.gridSettings,\n Navigation: {\n moduleProps: this.props,\n className: classnames('ms-nav', this.props.config.className, this.state.isMobile ? 'mobile-vp' : 'desktop-vp'),\n tag: 'nav',\n role: this.isMobile ? 'listbox' : 'navigation'\n },\n MenuList: {\n className: 'ms-nav__list',\n tag: 'ul',\n role: this.isMobile ? 'listbox' : 'menu'\n },\n ListItem: {\n className: 'ms-nav__list__item',\n role: 'presentation',\n tag: 'li'\n },\n showCategoryImage: this.props.config.displayCategoryImage ?? false,\n showPromotionalContent: this.props.config.displayPromotionalImage ?? false,\n Link: {\n tag: 'a',\n className: 'ms-nav__list__item__link',\n role: this.isMobile ? 'option' : 'menuitem'\n },\n DivContainer: {\n tag: 'div',\n className: 'ms-nav__feature'\n },\n ImageDivContainer: {\n tag: 'div',\n className: 'category-image',\n role: 'tabpanel'\n },\n Button: {\n className: 'ms-nav__list__item__button',\n tag: 'button',\n role: this.isMobile ? 'option' : 'menuitem',\n onClick: this.props\n },\n ImageContainer: {\n className: 'ms-nav__list__item__image'\n },\n Span: {\n className: 'ms-nav__list__item__span',\n tag: 'span'\n },\n MobileDescriptionContainer: {\n className: 'ms-nav__list__mobile__container'\n },\n MobileBackButton: {\n className: 'ms-nav__list__mobile__container__button',\n tag: 'button',\n 'aria-label': this.props.resources.backButtonAriaLabel,\n onClick: this.props\n },\n MobileDescriptionLabel: {\n className: 'ms-nav__list__mobile__container__span',\n tag: 'span'\n },\n isMobileView: this.state.isMobile,\n menuItemData: this.menuItemList,\n className: classnames('ms-nav', this.props.config.className)\n };\n\n return this.props.renderView(viewProps) as React.ReactElement;\n }\n\n private _mapData(): IMenuItemData[] {\n const { data, config } = this.props;\n const mergedData: IMenuItemData[] = [];\n if (this.isRetail && data && data.categories && data.categories.result && data.categories.result.length > 0) {\n data.categories.result.map((item: CategoryHierarchy, index) =>\n mergedData.push(this._constructMenuItemData(item, undefined, true, index, true))\n );\n }\n\n if (this.isCMS && config.cmsNavItems && config.cmsNavItems.length > 0) {\n config.cmsNavItems.map((item: ICmsNavItemsData, idx: number) =>\n mergedData.push(this._constructMenuItemData(undefined, item, false, idx + 1))\n );\n }\n return this._constructTopMenuItemData(mergedData);\n }\n\n private _constructTopMenuItemData(mergedData: IMenuItemData[]): IMenuItemData[] {\n const enableTopLevelMenu = this.props.config.enabletopMenu ?? false;\n if (!enableTopLevelMenu) {\n return mergedData;\n }\n const mergedRootMenuData: IMenuItemData[] = [];\n const topMenu = {\n id: 1,\n linkText: this.props.config.rootMenuNavigation ?? '...',\n linkURL: '#',\n imageSource: undefined,\n subMenu: mergedData\n } as IMenuItemData;\n mergedRootMenuData.push(topMenu);\n\n return mergedRootMenuData;\n }\n\n private _constructMenuItemData(\n retailItem?: CategoryHierarchy,\n cmsItem?: ICmsNavItemsData,\n isRetail?: boolean,\n idx?: number,\n addedAllMenu?: boolean\n ): IMenuItemData {\n const locale =\n this.props.context && this.props.context.request && this.props.context.request.locale\n ? this.props.context.request.locale\n : 'en-us';\n const { categoryPromotionalContent } = this.props.config;\n const cmsItemText = (cmsItem && cmsItem.linkText) || '';\n const { menuAriaLabel } = this.props.resources;\n\n // Filter category promotional data based on category name\n const promotionalData =\n retailItem &&\n categoryPromotionalContent?.filter(promoItem => promoItem.categoryName?.toLowerCase() === retailItem?.Name?.toLowerCase());\n\n // First check if image is available from promotional data else read from retail server\n let imageSource: string = 'empty';\n if (ArrayExtensions.hasElements(retailItem?.Images) && retailItem!.Images[0].Uri) {\n imageSource = retailItem!.Images[0].Uri;\n }\n if (isRetail) {\n return {\n id: NavigationMenu.RSItemIdInit++,\n linkText: NavigationMenu.getFriendlyName(locale, retailItem?.NameTranslations) ?? '',\n linkURL: retailItem?.Url,\n imageSource,\n subMenu: this._getNestedChildren(retailItem, imageSource, addedAllMenu),\n promotionalContent: this.props.config.displayPromotionalImage && promotionalData,\n menuSource: MenuSource.Retail,\n ariaLabel: `${NavigationMenu.getFriendlyName(locale, retailItem?.NameTranslations) ?? ''} ${menuAriaLabel}`\n } as IMenuItemData;\n }\n return {\n id: NavigationMenu.CMSItemIdInit++,\n linkText: cmsItemText,\n linkURL: (cmsItem && cmsItem.linkUrl && cmsItem.linkUrl.destinationUrl) || '',\n imageDestinationURL: (cmsItem && cmsItem.imageLink && cmsItem.imageLink.destinationUrl) || '',\n imageSource: (cmsItem && cmsItem.image && cmsItem.image.src) || '',\n subMenu: this._getCMSNestedChildren(cmsItem),\n menuSource: MenuSource.Cms,\n shouldOpenNewTab: cmsItem?.openInNewTab,\n ariaLabel: `${cmsItemText} ${menuAriaLabel}`\n } as IMenuItemData;\n }\n\n private _getNestedChildren(category?: CategoryHierarchy, imageSourceUrl?: string, addedAllMenu: boolean = false): IMenuItemData[] {\n const nestedChildren: IMenuItemData[] = [];\n if (!category || !category.Children || category.Children.length === 0) {\n return [];\n }\n if (!this.props.config.enabletopMenu && addedAllMenu) {\n nestedChildren.push({\n linkText: this.props.resources.allCategoryMenuText,\n imageSource: imageSourceUrl,\n linkURL: getCategoryUrl(category, (this.props.context as unknown) as IActionContext, {})\n });\n }\n category.Children.map((item: CategoryHierarchy, index) => {\n nestedChildren.push(this._constructMenuItemData(item, undefined, true, index, false));\n });\n return nestedChildren;\n }\n\n private _getCMSNestedChildren(category?: ICmsNavItemsData): IMenuItemData[] {\n const nestedChildren: IMenuItemData[] = [];\n\n if (!category || !category.subMenus || category.subMenus.length === 0) {\n return [];\n }\n\n category.subMenus.map((item: ISubMenusData, idx: number) => {\n nestedChildren.push(this._constructMenuItemData(undefined, item, false, idx));\n });\n return nestedChildren;\n }\n\n private readonly _setNavigationSource = (sourceType?: navigationMenuSource): void => {\n switch (sourceType) {\n case navigationMenuSource.retailServerOnly:\n this.isRetail = true;\n this.isCMS = false;\n break;\n case navigationMenuSource.cmsOnly:\n this.isRetail = false;\n this.isCMS = true;\n break;\n case navigationMenuSource.all:\n this.isRetail = true;\n this.isCMS = true;\n break;\n default:\n }\n };\n\n private _updateViewport(): void {\n this.viewport = this._getViewport();\n this.setState({ isMobile: this.isMobile });\n }\n\n private _getViewport(): GridSize {\n const { context } = this.props;\n\n // Always render in mobile viewport on a mobile device\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\n return 'xs';\n }\n\n if (MsDyn365.isBrowser && window.innerWidth) {\n const gridSettings = context.request.gridSettings;\n if (gridSettings) {\n if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\n return 'xs';\n } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\n return 'sm';\n } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\n return 'md';\n } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\n return 'lg';\n }\n return 'xl';\n }\n }\n\n return 'xs';\n }\n}\n\nexport default NavigationMenu;\n","module.exports = React;","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['navigation-menu'] = {\n c: () => require('@msdyn365-commerce-modules/navigation-menu/dist/lib/modules/navigation-menu/navigation-menu'),\n $type: 'contentModule',\n da: [{name:'categories', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy', runOn: 0}],\n \n iNM: true,\n ns: '@msdyn365-commerce-modules',\n n: 'navigation-menu',\n p: 'navigation-menu',\n \n pdp: '',\n \n \n md: 'node_modules/@msdyn365-commerce-modules/navigation-menu/dist/lib/modules/navigation-menu'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-categories-hierarchy');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|themes|newsunshine-b2c|views|navigation-menu'] = {\n c: () => require('partner/themes/newsunshine-b2c/views/navigation-menu.view.tsx'),\n cn: '__local__-__local__-navigation-menu'\n };\nviewDictionary['__local__|__local__|themes|newsunshine-dev-b2c|views|navigation-menu'] = {\n c: () => require('partner/themes/newsunshine-dev-b2c/views/navigation-menu.view.tsx'),\n cn: '__local__-__local__-navigation-menu'\n };\nviewDictionary['__local__|__local__|themes|newsunshine-dev|views|navigation-menu'] = {\n c: () => require('partner/themes/newsunshine-dev/views/navigation-menu.view.tsx'),\n cn: '__local__-__local__-navigation-menu'\n };\nviewDictionary['__local__|__local__|themes|newsunshine|views|navigation-menu'] = {\n c: () => require('partner/themes/newsunshine/views/navigation-menu.view.tsx'),\n cn: '__local__-__local__-navigation-menu'\n };\nviewDictionary['@msdyn365-commerce-modules|fabrikam-design-kit|modules|fabrikam|views|navigation-menu'] = {\n c: () => require('@msdyn365-commerce-modules/fabrikam-design-kit/dist/lib/modules/fabrikam/views/navigation-menu.view.js'),\n cn: '@msdyn365-commerce-modules-fabrikam-design-kit-navigation-menu'\n };\nviewDictionary['@msdyn365-commerce-modules|navigation-menu|modules|navigation-menu|navigation-menu'] = {\n c: () => require('@msdyn365-commerce-modules/navigation-menu/dist/lib/modules/navigation-menu/navigation-menu.view.js'),\n cn: '@msdyn365-commerce-modules-navigation-menu-navigation-menu'\n };\nviewDictionary['@msdyn365-commerce-theme|adventureworks-theme-kit|modules|adventureworks|views|navigation-menu'] = {\n c: () => require('@msdyn365-commerce-theme/adventureworks-theme-kit/dist/lib/modules/adventureworks/views/navigation-menu.view.js'),\n cn: '@msdyn365-commerce-theme-adventureworks-theme-kit-navigation-menu'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../../definition-extensions/navigation-menu.ext.props.autogenerated';\r\n\r\n/**\r\n * INavigationMenuViewRootProps.\r\n */\r\nexport interface INavigationMenuViewRootProps {\r\n navProps: INavigationMenuViewProps & INavigationMenuProps<{}>;\r\n}\r\n\r\n/**\r\n * Represent navigation menu state interface.\r\n */\r\nexport interface INavigationState {\r\n parentMenu?: number;\r\n activeMenu?: number;\r\n categoryImage?: Msdyn365.IImageData[] | null;\r\n mobileViewLabelText?: string;\r\n drawerKeyValue: Msdyn365.IDictionary;\r\n isOnlyMobile: boolean;\r\n isNavOpen: boolean;\r\n}\r\n\r\n/**\r\n * NavMenuConstants enum.\r\n */\r\nexport enum NavMenuConstants {\r\n zero = 0,\r\n one = 1,\r\n two = 2,\r\n three = 3,\r\n four = 4,\r\n escapeKey = 27,\r\n rootMenu = 1\r\n}\r\n\r\n/**\r\n * GridSizes.\r\n */\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Get category image.\r\n * @param props - Navigation menu props.\r\n * @param categoryImage - Category Image.\r\n * @param alttext - AltText String.\r\n * @returns Returns Node.\r\n */\r\nexport const getCategoryImage = (props: INavigationMenuViewRootProps, categoryImage: string, alttext: string): React.ReactNode | null => {\r\n const categoryImageUrl = generateImageUrl(`${categoryImage}`, props.navProps.context.actionContext.requestContext.apiSettings);\r\n const defaultImageSettings: Msdyn365.IImageSettings = {\r\n viewports: {\r\n xs: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n sm: { q: 'w=162&h=162&m=8', w: 0, h: 0 },\r\n md: { q: 'w=203&h=203&m=8', w: 0, h: 0 },\r\n lg: { q: 'w=203&h=203&m=8', w: 0, h: 0 }\r\n },\r\n lazyload: true\r\n };\r\n if (categoryImageUrl !== undefined) {\r\n const imageData: Msdyn365.IImageData = { src: categoryImageUrl };\r\n return (\r\n \r\n );\r\n }\r\n return null;\r\n};\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n // Button,\r\n // Collapse,\r\n Drawer,\r\n getPayloadObject,\r\n getTelemetryAttributes,\r\n getTelemetryObject,\r\n ICollapseProps,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootDisabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootDisabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n // private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({\r\n src: imageSource,\r\n altText: item.text,\r\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\r\n });\r\n return null;\r\n });\r\n }\r\n }\r\n\r\n this.state = {\r\n activeMenu: undefined,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n drawerKeyValue: {},\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry\r\n );\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n // this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs';\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n if (this.state.isOnlyMobile) {\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n } else {\r\n document.body.addEventListener('mouseover', this._handleClickOutside);\r\n }\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n if (this.state.isOnlyMobile) {\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n } else {\r\n document.body.addEventListener('mouseover', this._handleClickOutside);\r\n }\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = 1;\r\n // const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {this.state.isOnlyMobile ? (\r\n this._renderMobileMenu()\r\n ) : (\r\n <>\r\n {/* */}\r\n {this._renderCollapseMenu()}\r\n \r\n )}\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n // private readonly _toggleNavBar = (): void => {\r\n // this.setState(previousState => ({\r\n // activeMenu: 1,\r\n // isNavOpen: !previousState.isNavOpen\r\n // }));\r\n // };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n
\r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n
\r\n // \r\n // {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n // \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = 1;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined && (\r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n )}\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { MenuList, Navigation } = this.props.navProps;\r\n\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n {/*
\r\n
*/}\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return this._renderLinkMenuItem(item);\r\n } else if (!item.linkURL) {\r\n return this._renderSpanMenuItem(item);\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n const menuItemData: IMenuItemData[] = this.props.navProps.menuItemData;\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n\r\n if (ArrayExtensions.hasElements(menuItemData)) {\r\n menuItemData[0].id = 1;\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n const menuItem = this._getFromSubMenu(undefined, menuItemData);\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}{' '}\r\n \r\n );\r\n }\r\n } else {\r\n for (const [index, item] of menuItemData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(parentMenuId?: number, menu?: IMenuItemData[]): IMenuItemData | null {\r\n if (!menu) {\r\n return null;\r\n }\r\n\r\n for (let index = 0; index <= menu.length - NavMenuConstants.one; index++) {\r\n const item: IMenuItemData = menu[Number(index)];\r\n\r\n if (item.id === this.state.activeMenu) {\r\n if (!NavigationMenuRootDisabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: item.linkText });\r\n }\r\n return item;\r\n }\r\n const found = this._getFromSubMenu(item.id, item.subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\r\n }\r\n\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return this._renderLinkMenuItem(menuItemData, menuItemData.id);\r\n } else if (!menuItemData.linkURL && !(this.state.isOnlyMobile && this.state.activeMenu !== undefined)) {\r\n return this._renderSpanMenuItem(menuItemData);\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail);\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n if (option.linkText === 'All') {\r\n return <>;\r\n }\r\n const hasOptions = option.subMenu && ArrayExtensions.hasElements(option.subMenu);\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu =\r\n hasOptions && isEnableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one;\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n subMenu = this._renderSubMenuDrawer(option);\r\n } else if (this.currentLevel <= this.supportedLevel) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n {menuItem}\r\n {subMenu}\r\n \r\n );\r\n });\r\n return this._renderMenu(levelClassName, menuOptions, isSubMenu);\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option);\r\n } else {\r\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option);\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\r\n const levelClassName = `level-${this.currentLevel.toString()}`;\r\n const toggleButtonText = menuItem.linkText;\r\n const keyValue = this.state.drawerKeyValue;\r\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\r\n const keys = keyValue;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n let isDrawerOpen = false;\r\n if (keys[menuItem.id!]) {\r\n isDrawerOpen = true;\r\n }\r\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\r\n\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\r\n this.currentLevel++;\r\n if (this.currentLevel < multiLevelSupportedMenu) {\r\n return this._renderSubMenuDrawer(menuSubItem);\r\n }\r\n }\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Method to handle escape key event.\r\n * @param menuId -Number.\r\n * @param isDrawerOpen -Boolean.\r\n * @returns Void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\r\n const { drawerKeyValue } = this.state;\r\n const newPair = { [menuId!]: !isDrawerOpen };\r\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return this.isOnlyMobile ? (\r\n \r\n {option.linkText}\r\n \r\n ) : (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n {linkText}\r\n \r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n {option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile &&\r\n showCategoryImage &&\r\n this.state.categoryImage !== null &&\r\n this.state.categoryImage !== undefined &&\r\n !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass =\r\n this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay &&\r\n this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two &&\r\n 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {isCategoryImageDisplay &&\r\n ArrayExtensions.hasElements(categoryImages) &&\r\n categoryImages.map(item => (\r\n \r\n {getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n {isPromotionalContentDisplay &&\r\n this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n \r\n ))}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({\r\n src: imageSource,\r\n altText: item.text,\r\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\r\n });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootDisabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootDisabled.isBackTrack = true;\r\n this.setState(previousState => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: 0, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootDisabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n // private readonly _closeNavMenu = (): void => {\r\n // if (!this.state.isOnlyMobile) {\r\n // this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n // } else {\r\n // this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n // }\r\n // };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: 1, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n}\r\n\r\nexport default NavigationMenuRootDisabled;\r\n","/*--------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * See License.txt in the project root for license information.\r\n *--------------------------------------------------------------*/\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport { IMenuItemData, MenuSource, MenuTypeIndexId } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport { ArrayExtensions, StringExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n addThrottledEvent,\r\n Button,\r\n Collapse, Drawer, getPayloadObject, getTelemetryAttributes,\r\n getTelemetryObject,\r\n ICollapseProps,\r\n IPayLoad,\r\n isMobile,\r\n ITelemetryContent,\r\n Module,\r\n Node,\r\n onTelemetryClick,\r\n VariantType\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed } from 'mobx';\r\nimport * as React from 'react';\r\n\r\nimport { getCategoryImage, INavigationMenuViewRootProps, INavigationState, NavMenuConstants } from './navigation-menu-utilities';\r\n\r\n/**\r\n *\r\n * NavigationMenuRootEnabled component.\r\n * @extends {React.PureComponent}\r\n */\r\nexport class NavigationMenuRootEnabled extends React.PureComponent {\r\n private static isBackTrack: boolean = false;\r\n\r\n private readonly supportedLevel: number = NavMenuConstants.four;\r\n\r\n private currentLevel: number = NavMenuConstants.zero;\r\n\r\n private readonly menuNode: React.RefObject;\r\n\r\n private readonly menuItemRef: React.RefObject;\r\n\r\n private readonly escapeKey: number = NavMenuConstants.escapeKey;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private readonly promotionalImage: Msdyn365.IImageData[] = [];\r\n\r\n private menuItemData: IMenuItemData[] = [];\r\n\r\n private readonly payLoad: IPayLoad;\r\n\r\n private readonly attributes?: Msdyn365.IDictionary;\r\n\r\n private customResizeThrottledEventHandler?: (event: Event) => void;\r\n\r\n public constructor(props: INavigationMenuViewRootProps) {\r\n super(props);\r\n this.menuNode = React.createRef();\r\n this.menuItemRef = React.createRef();\r\n const { menuItemData } = this.props.navProps;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n const imagesource = menuItemData[0].subMenu[0].imageSource ? menuItemData[0].subMenu[0].imageSource : '';\r\n const linkText = menuItemData[0].subMenu[0].linkText ? menuItemData[0].subMenu[0].linkText : '';\r\n this.promotionalImage = [{ src: imagesource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(menuItemData[0].subMenu[0].promotionalContent)) {\r\n menuItemData[0].subMenu[0].promotionalContent.map(item => {\r\n const imageSource = item.image.src;\r\n this.promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n return null;\r\n });\r\n }\r\n }\r\n this.state = {\r\n activeMenu: NavMenuConstants.rootMenu,\r\n mobileViewLabelText: '',\r\n parentMenu: undefined,\r\n drawerKeyValue: {},\r\n isOnlyMobile: this.isOnlyMobile,\r\n categoryImage: this.promotionalImage,\r\n isNavOpen: false\r\n };\r\n\r\n this.telemetryContent = getTelemetryObject(this.props.navProps.context.request.telemetryPageName!,\r\n this.props.navProps.friendlyName,\r\n this.props.navProps.telemetry);\r\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\r\n this.attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n }\r\n\r\n @computed public get isOnlyMobile(): boolean {\r\n return (isMobile({ variant: VariantType.Browser, context: this.props.navProps.context.request }) === 'xs');\r\n }\r\n\r\n public componentDidMount(): void {\r\n this.customResizeThrottledEventHandler = addThrottledEvent(window, 'resize', this._customUpdateViewport as EventListener);\r\n document.addEventListener('keydown', (this._escFunction as unknown) as EventListener, false);\r\n this._customUpdateViewport();\r\n document.body.addEventListener('mousedown', this._handleClickOutside);\r\n this._addShopAllLink();\r\n }\r\n\r\n public componentDidUpdate(): void {\r\n if (this.menuItemRef.current?.children[0] && this.props.navProps.isMobileView) {\r\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\r\n }\r\n }\r\n\r\n public componentWillUnmount(): void {\r\n window.removeEventListener('resize', this.customResizeThrottledEventHandler!, false);\r\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\r\n }\r\n\r\n public render(): JSX.Element | null {\r\n this.currentLevel = NavMenuConstants.one;\r\n const navbarKey = 'header-nav-mobile';\r\n return (\r\n \r\n {\r\n this.state.isOnlyMobile ? this._renderMobileMenu() : (<>\r\n \r\n {this._renderCollapseMenu()}\r\n )\r\n }\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Function to handle nav bar toggle.\r\n */\r\n private readonly _toggleNavBar = (): void => {\r\n this.setState(previousState => ({\r\n activeMenu: NavMenuConstants.rootMenu,\r\n isNavOpen: !previousState.isNavOpen\r\n }));\r\n };\r\n\r\n private _renderCollapseMenu(): JSX.Element | null {\r\n return (\r\n \r\n {this.state.isOnlyMobile ? this._renderMobileMenu() : this._renderDesktopMenu()}\r\n \r\n );\r\n }\r\n\r\n private _renderMobileMenu(): JSX.Element {\r\n const { MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props.navProps;\r\n\r\n this.currentLevel = NavMenuConstants.one;\r\n return (\r\n \r\n \r\n {this.state.isOnlyMobile && this.state.activeMenu !== undefined &&\r\n \r\n \r\n \r\n {this.state.mobileViewLabelText}\r\n \r\n }\r\n {this._renderDisplay()}\r\n \r\n \r\n );\r\n }\r\n\r\n private _renderDesktopMenu(): JSX.Element {\r\n const { Navigation } = this.props.navProps;\r\n return (\r\n \r\n \r\n {this._renderDisplay()}\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n\r\n private _renderDrawerLink(item: IMenuItemData): JSX.Element | null {\r\n if (item.linkURL && !StringExtensions.isNullOrWhitespace(item.linkURL)) {\r\n return (\r\n this._renderLinkMenuItem(item)\r\n );\r\n } else if (!item.linkURL) {\r\n return (\r\n this._renderSpanMenuItem(item)\r\n );\r\n }\r\n return null;\r\n }\r\n\r\n private _renderDisplay(): JSX.Element[] {\r\n const { ListItem } = this.props.navProps;\r\n let menuItemData: IMenuItemData[] = [];\r\n if (this.state.isOnlyMobile) {\r\n menuItemData = this.menuItemData;\r\n } else {\r\n menuItemData = this.props.navProps.menuItemData;\r\n }\r\n const { activeMenu } = this.state;\r\n const menuItemList: JSX.Element[] = [];\r\n let cmsMenuData: IMenuItemData[] | undefined = [];\r\n let retailMenuItemData: IMenuItemData[] | undefined = [];\r\n const retailMenuData = JSON.parse(JSON.stringify(menuItemData)) as IMenuItemData[];\r\n\r\n for (const item of retailMenuData) {\r\n retailMenuItemData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n item.subMenu = retailMenuItemData;\r\n }\r\n\r\n for (const item of menuItemData) {\r\n cmsMenuData = item.subMenu!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id < MenuTypeIndexId.Retail));\r\n }\r\n\r\n if (this.state.isOnlyMobile && activeMenu !== undefined && ArrayExtensions.hasElements(menuItemData)) {\r\n let menuItem: IMenuItemData | null = {};\r\n for (const menuItemDatum of menuItemData) {\r\n if (menuItemDatum.id === activeMenu) {\r\n menuItem = menuItemDatum;\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({\r\n parentMenu: undefined\r\n });\r\n } else {\r\n this.setState({\r\n parentMenu: undefined,\r\n mobileViewLabelText: menuItemDatum.linkText\r\n });\r\n }\r\n break;\r\n }\r\n menuItem = this._getFromSubMenu(menuItemDatum);\r\n if (menuItem && menuItem.id === activeMenu) {\r\n break;\r\n }\r\n }\r\n\r\n if (menuItem) {\r\n menuItemList.push(\r\n \r\n {' '}\r\n {this._createMenuItemList(menuItem)}\r\n {' '}\r\n \r\n );\r\n }\r\n\r\n } else {\r\n for (const [index, item] of retailMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n
\r\n );\r\n }\r\n\r\n for (const [index, item] of cmsMenuData.entries()) {\r\n menuItemList.push(\r\n \r\n {this._createMenuItemList(item)}\r\n \r\n );\r\n }\r\n }\r\n\r\n return menuItemList;\r\n }\r\n\r\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\r\n const subMenus = item?.subMenu;\r\n if (subMenus && ArrayExtensions.hasElements(subMenus)) {\r\n for (let index = 0; index <= subMenus.length - NavMenuConstants.one; index++) {\r\n const subMenu: IMenuItemData = subMenus[Number(index)];\r\n let parentMenuId = item?.id;\r\n\r\n if (subMenu.id === this.state.activeMenu) {\r\n if (parentMenuId === NavMenuConstants.rootMenu && subMenu.id! < MenuTypeIndexId.Retail) {\r\n parentMenuId = undefined;\r\n }\r\n\r\n if (!NavigationMenuRootEnabled.isBackTrack) {\r\n this.setState({ parentMenu: parentMenuId });\r\n } else {\r\n this.setState({ parentMenu: parentMenuId, mobileViewLabelText: subMenu.linkText });\r\n }\r\n return subMenu;\r\n }\r\n const found = this._getFromSubMenu(subMenu);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\r\n if (ArrayExtensions.hasElements(menuItemData.subMenu)) {\r\n if (this.state.isOnlyMobile && this.state.activeMenu !== undefined) {\r\n return (this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false));\r\n }\r\n return (\r\n <>\r\n {this._renderButtonMenuItem(menuItemData)}\r\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id)}\r\n \r\n );\r\n\r\n } else if (menuItemData.linkURL && !StringExtensions.isNullOrWhitespace(menuItemData.linkURL)) {\r\n return (this._renderLinkMenuItem(menuItemData, menuItemData.id));\r\n } else if (!menuItemData.linkURL) {\r\n return (this._renderSpanMenuItem(menuItemData));\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private _renderSubMenu(subMenuArray?: IMenuItemData[], activeMenu?: number, isSubMenu?: boolean): JSX.Element | null {\r\n\r\n let subMenus: IMenuItemData[] | undefined = subMenuArray;\r\n if (activeMenu === NavMenuConstants.rootMenu) {\r\n subMenus = subMenuArray!.filter(subMenuItem => (subMenuItem.id && subMenuItem.id >= MenuTypeIndexId.Retail));\r\n }\r\n\r\n const { ListItem } = this.props.navProps;\r\n const isEnableMultiSupportMenu = this.props.navProps.config.enableMultilevelMenu ?? false;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n if (activeMenu && this.state.activeMenu !== activeMenu) {\r\n this.props.navProps.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n if (!subMenus || !ArrayExtensions.hasElements(subMenus)) {\r\n this.props.navProps.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\r\n return null;\r\n }\r\n\r\n let levelClassName: string = '';\r\n const menuOptions = subMenus.map((option: IMenuItemData, index: number) => {\r\n const hasOptions = (option.subMenu && ArrayExtensions.hasElements(option.subMenu));\r\n let menuItem: JSX.Element | null;\r\n if (hasOptions && this.state.isOnlyMobile) {\r\n menuItem = this._renderButtonMenuItem(option, activeMenu, index);\r\n } else if (this.currentLevel === NavMenuConstants.one || !hasOptions) {\r\n menuItem = this.getMenuItem(option, index);\r\n } else {\r\n menuItem = null;\r\n }\r\n let subMenu;\r\n const isHavingSubmenu = hasOptions && isEnableMultiSupportMenu && (this.currentLevel <= Math.round(multiLevelSupportedMenu) - NavMenuConstants.one);\r\n\r\n if (hasOptions && !this.state.isOnlyMobile) {\r\n if (this.currentLevel >= NavMenuConstants.two) {\r\n subMenu = this._renderSubMenuDrawer(option);\r\n } else if (this.currentLevel <= this.supportedLevel - NavMenuConstants.one) {\r\n this.currentLevel++;\r\n levelClassName = `level-${this.currentLevel.toString()}`;\r\n subMenu = this._renderSubMenu(option.subMenu, undefined, true);\r\n }\r\n }\r\n if (isHavingSubmenu && this.state.isOnlyMobile) {\r\n this.currentLevel++;\r\n levelClassName = isEnableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\r\n subMenu = this._renderSubMenu(option.subMenu, option.id, true);\r\n }\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n return (\r\n \r\n { menuItem}\r\n { subMenu}\r\n \r\n );\r\n });\r\n return (this._renderMenu(levelClassName, menuOptions, isSubMenu));\r\n }\r\n\r\n private getMenuItem(option: IMenuItemData, index: number): JSX.Element | null {\r\n let menuItem: JSX.Element | null;\r\n if (this.currentLevel === NavMenuConstants.one) {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItemLevelOne(option, index) : this._renderSpanMenuItem(option));\r\n } else {\r\n menuItem = (option.linkURL ? this._renderLinkMenuItem(option, index) : this._renderSpanMenuItem(option));\r\n }\r\n return menuItem;\r\n }\r\n\r\n private _renderSubMenuDrawer(menuItem: IMenuItemData): JSX.Element | null {\r\n const levelClassName = `level-${this.currentLevel.toString()}`;\r\n const toggleButtonText = menuItem.linkText;\r\n const keyValue = this.state.drawerKeyValue;\r\n const buttonText = toggleButtonText !== undefined ? toggleButtonText : '';\r\n const keys = keyValue;\r\n const multiLevelSupportedMenu = this.props.navProps.config.menuLevelSupport ?? NavMenuConstants.three;\r\n\r\n let isDrawerOpen = false;\r\n if (keys[menuItem.id!]) {\r\n isDrawerOpen = true;\r\n }\r\n const colProps: ICollapseProps = { timeout: 0, isOpen: isDrawerOpen };\r\n return (\r\n \r\n
\r\n {menuItem.subMenu!.map((menuSubItem: IMenuItemData) => {\r\n if (ArrayExtensions.hasElements(menuSubItem.subMenu)) {\r\n this.currentLevel++;\r\n if (this.currentLevel < multiLevelSupportedMenu) {\r\n return this._renderSubMenuDrawer(menuSubItem);\r\n }\r\n }\r\n return this._renderDrawerLink(menuSubItem);\r\n })}\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Method to handle escape key event.\r\n * @param menuId -Number.\r\n * @param isDrawerOpen -Boolean.\r\n * @returns Void.\r\n */\r\n private readonly _bindDesktopCategoryClick = (menuId: number | undefined, isDrawerOpen: boolean) => (): void => {\r\n const { drawerKeyValue } = this.state;\r\n const newPair = { [menuId!]: !isDrawerOpen };\r\n this.setState({ drawerKeyValue: { ...drawerKeyValue, ...newPair } });\r\n };\r\n\r\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderLinkMenuItemLevelOne(option: IMenuItemData, index?: number, isHoverEffect: boolean = true): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n const linkText = option.linkText ? option.linkText : '';\r\n const imagesource = option.imageSource ? option.imageSource : '';\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\r\n const { Link } = this.props.navProps;\r\n this.payLoad.contentAction.etext = linkText;\r\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\r\n if (linkText && linkUrl) {\r\n return (\r\n \r\n { linkText}\r\n \r\n );\r\n }\r\n return null;\r\n\r\n }\r\n\r\n private _renderSpanMenuItem(option: IMenuItemData, index?: number): JSX.Element | null {\r\n const { Span } = this.props.navProps;\r\n return (\r\n \r\n { option.linkText}\r\n \r\n );\r\n }\r\n\r\n private _renderMenu(level: string, menuOptions: JSX.Element[], isSubmenu?: boolean): JSX.Element | null {\r\n const { DivContainer, ImageDivContainer, showCategoryImage, showPromotionalContent } = this.props.navProps;\r\n const isCategoryImageDisplay =\r\n !this.state.isOnlyMobile && showCategoryImage && this.state.categoryImage !== null && this.state.categoryImage !== undefined && !isSubmenu;\r\n const isPromotionalContentDisplay =\r\n !this.state.isOnlyMobile && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !isSubmenu;\r\n const divContainerClass = this.currentLevel > NavMenuConstants.two || isCategoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\r\n this.currentLevel = NavMenuConstants.one;\r\n const menuLevelSupportClassName =\r\n isCategoryImageDisplay && this.props.navProps.config.menuLevelSupport &&\r\n this.props.navProps.config.menuLevelSupport > NavMenuConstants.two && 'navmenu-multi-level';\r\n\r\n const categoryImages = this.state.categoryImage?.filter(image => !StringExtensions.isNullOrWhitespace(image.src));\r\n const imagesContainerKey = categoryImages?.map(item => item.src).join('-');\r\n return (\r\n \r\n \r\n {menuOptions}\r\n \r\n
\r\n {\r\n isCategoryImageDisplay && ArrayExtensions.hasElements(categoryImages) && categoryImages.map(item => (\r\n \r\n { getCategoryImage(this.props, item.src ?? '', item.altText!.toString())}\r\n { isPromotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\r\n ))\r\n }\r\n
\r\n \r\n );\r\n }\r\n\r\n /**\r\n * Handle Category image update.\r\n * @param categoryImageSource - Image source.\r\n * @param option - Menu Item data.\r\n * @returns Returns empty.\r\n */\r\n private readonly _updateCategoryImage = (categoryImageSource: string, option: IMenuItemData) => () => {\r\n const linkText = option.linkText ? option.linkText : '';\r\n const promotionalImage: Msdyn365.IImageData[] = [{ src: categoryImageSource, altText: linkText }];\r\n\r\n // Read category and promotional image in one array\r\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\r\n for (const item of option.promotionalContent) {\r\n const imageSource = item.image.src;\r\n promotionalImage.push({ src: imageSource, altText: item.text, additionalProperties: { linkUrl: item.linkUrl.destinationUrl } });\r\n }\r\n }\r\n this.setState({\r\n categoryImage: ArrayExtensions.hasElements(promotionalImage) ? promotionalImage : [{ src: 'empty' }]\r\n });\r\n };\r\n\r\n /**\r\n * Handle dropdown toggle.\r\n * @param data - Menu Item data.\r\n * @param parentId - Number.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({\r\n activeMenu: data.id,\r\n parentMenu: parentId\r\n });\r\n if (this.props.navProps.showCategoryImage) {\r\n this._updateCategoryImage(data.imageSource!, data)();\r\n }\r\n } else {\r\n NavigationMenuRootEnabled.isBackTrack = false;\r\n this.setState({\r\n activeMenu: data.id,\r\n mobileViewLabelText: data.linkText!,\r\n parentMenu: parentId\r\n });\r\n }\r\n\r\n };\r\n\r\n /**\r\n * Handle back navigation for menu items for mobile view.\r\n * @returns Returns empty.\r\n */\r\n private readonly _handleGoBack = () => () => {\r\n NavigationMenuRootEnabled.isBackTrack = true;\r\n this.setState((previousState) => ({ activeMenu: previousState.parentMenu }));\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on click on body.\r\n * @param event - MouseEvent.\r\n */\r\n private readonly _handleClickOutside = (event: MouseEvent) => {\r\n if (this.menuNode.current &&\r\n !this.menuNode.current.contains(event.target as Node)) {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n }\r\n };\r\n\r\n /**\r\n * Add shop all link for Mobile submenu.\r\n */\r\n private readonly _addShopAllLink = (): void => {\r\n const { menuItemData } = this.props.navProps;\r\n this.menuItemData = menuItemData;\r\n if (ArrayExtensions.hasElements(menuItemData) && ArrayExtensions.hasElements(menuItemData[0].subMenu)) {\r\n this.menuItemData[0].subMenu?.map(item => {\r\n const shopAllObject = {};\r\n Object.assign(shopAllObject, { imageSource: item.imageSource });\r\n Object.assign(shopAllObject, { linkText: this.props.navProps.resources.allCategoryMenuText });\r\n Object.assign(shopAllObject, { linkURL: item.linkURL });\r\n if (ArrayExtensions.hasElements(item.subMenu) && item.menuSource === MenuSource.Retail) {\r\n item.subMenu.unshift(shopAllObject);\r\n }\r\n return item;\r\n });\r\n }\r\n };\r\n\r\n /**\r\n * Checks to assign a ref for focus.\r\n * @param index -Sub menu list index.\r\n * @param mobileViewLabelText -Mobile view label text.\r\n * @param optionLinkText -Sub menu item link text.\r\n * @returns Boolean.\r\n */\r\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\r\n const firstIndex: number = 0;\r\n if (!NavigationMenuRootEnabled.isBackTrack && index === firstIndex) {\r\n return true;\r\n }\r\n if (!optionLinkText || !mobileViewLabelText) {\r\n return false;\r\n }\r\n return mobileViewLabelText === optionLinkText;\r\n };\r\n\r\n /**\r\n * Function to handle nav menu close.\r\n */\r\n private readonly _closeNavMenu = (): void => {\r\n if (!this.state.isOnlyMobile) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n } else {\r\n this.setState({ activeMenu: undefined, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Function to close the nav menu on esc key.\r\n * @param event - Event.\r\n */\r\n private readonly _escFunction = (event: React.KeyboardEvent) => {\r\n if (event.keyCode === this.escapeKey && !this.state.isOnlyMobile && this.state.isNavOpen) {\r\n this.setState({ activeMenu: NavMenuConstants.rootMenu, mobileViewLabelText: '', isNavOpen: false });\r\n }\r\n };\r\n\r\n /**\r\n * Custom update viewport.\r\n */\r\n private readonly _customUpdateViewport = (): void => {\r\n this.setState({ isOnlyMobile: this.isOnlyMobile });\r\n };\r\n\r\n}\r\n\r\nexport default NavigationMenuRootEnabled;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\nimport { INavigationMenuViewProps } from '@msdyn365-commerce-modules/navigation-menu';\r\nimport * as React from 'react';\r\n\r\nimport { INavigationMenuProps } from '../definition-extensions/navigation-menu.ext.props.autogenerated';\r\nimport NavigationMenuRootDisabled from './components/navigation-menu-root-disabled';\r\nimport NavigationMenuRootEnabled from './components/navigation-menu-root-enabled';\r\n\r\n/**\r\n * Render the Navigation menu.\r\n * @param props - The navigation menu view props.\r\n * @returns Return HTML having INavigationMenuViewProps props with navigation menu.\r\n */\r\nconst navigationMenuView = (props: INavigationMenuViewProps & INavigationMenuProps<{}>): JSX.Element => {\r\n if (props.config.enabletopMenu) {\r\n return ;\r\n }\r\n\r\n return ;\r\n};\r\n\r\nexport default navigationMenuView;\r\n","module.exports = ReactDOM;","/*!\n * Copyright (c) Microsoft Corporation.\n * All rights reserved. See LICENSE in the project root for license information.\n */\n\nimport MsDyn365, { IImageData, IImageSettings, Image } from '@msdyn365-commerce/core';\nimport { ArrayExtensions, generateImageUrl } from '@msdyn365-commerce-modules/retail-actions';\nimport {\n getPayloadObject,\n getTelemetryAttributes,\n getTelemetryObject,\n IPayLoad,\n ITelemetryContent,\n Module,\n Node,\n onTelemetryClick\n} from '@msdyn365-commerce-modules/utilities';\nimport classnames from 'classnames';\nimport * as React from 'react';\n\nimport { INavigationMenuViewProps } from './navigation-menu';\nimport { IMenuItemData } from './navigation-menu.data';\n\ninterface INavigationState {\n parentMenu?: number;\n activeMenu?: number;\n categoryImage?: IImageData[] | null;\n mobileViewLabelText?: string;\n categoryImageAltText: string;\n}\n\n/**\n *\n * NavigationMenuView component.\n * @extends {React.PureComponent}\n */\nexport class NavigationMenuView extends React.PureComponent {\n private static isBackTrack: boolean = false;\n\n private currentLevel: number = 0;\n\n private readonly menuNode: React.RefObject;\n\n private readonly menuItemRef: React.RefObject;\n\n private readonly telemetryContent: ITelemetryContent;\n\n private readonly payLoad: IPayLoad;\n\n constructor(props: INavigationMenuViewProps) {\n super(props);\n this.menuNode = React.createRef();\n this.menuItemRef = React.createRef();\n this.state = { activeMenu: undefined, mobileViewLabelText: '', parentMenu: undefined, categoryImageAltText: '' };\n this._closeSubmenu = this._closeSubmenu.bind(this);\n this.telemetryContent = getTelemetryObject(\n this.props.context.request.telemetryPageName!,\n this.props.friendlyName,\n this.props.telemetry\n );\n this.payLoad = getPayloadObject('click', this.telemetryContent, '', '');\n }\n\n public componentDidMount(): void {\n if (MsDyn365.isBrowser) {\n document.body.addEventListener('mousedown', this._handleClickOutside);\n document.body.addEventListener('focusout', this._handleFocusOutside);\n }\n }\n\n public componentDidUpdate(): void {\n if (this.menuItemRef.current?.children[0] && this.props.isMobileView) {\n (this.menuItemRef.current.children[0] as HTMLElement).focus();\n }\n }\n\n public componentWillUnmount(): void {\n if (MsDyn365.isBrowser) {\n document.body.removeEventListener('mousedown', this._handleClickOutside, false);\n document.body.removeEventListener('focusout', this._handleFocusOutside, false);\n }\n }\n\n public render(): JSX.Element | null {\n const { isMobileView, MenuList, MobileBackButton, MobileDescriptionContainer, MobileDescriptionLabel, Navigation } = this.props;\n\n this.currentLevel = 1;\n return (\n \n \n {isMobileView && this.state.activeMenu !== undefined && (\n \n \n {this.state.mobileViewLabelText}\n \n )}\n {this._renderDisplay()}\n \n \n );\n }\n\n private _renderDisplay(): JSX.Element[] {\n const { ListItem, menuItemData, isMobileView } = this.props;\n const { activeMenu } = this.state;\n const menuItemList: JSX.Element[] = [];\n\n if (isMobileView && activeMenu !== undefined && menuItemData.length > 0) {\n let menuItem: IMenuItemData = {};\n for (const menuItemDatum of menuItemData) {\n if (menuItemDatum && menuItemDatum.id === activeMenu) {\n menuItem = menuItemDatum;\n !NavigationMenuView.isBackTrack\n ? this.setState({ parentMenu: undefined })\n : this.setState({ parentMenu: undefined, mobileViewLabelText: menuItemDatum.linkText });\n break;\n }\n menuItem = this._getFromSubMenu(menuItemDatum) as IMenuItemData;\n if (menuItem && menuItem.id === activeMenu) {\n break;\n }\n }\n\n menuItem &&\n menuItemList.push(\n \n {' '}\n {this._createMenuItemList(menuItem)}{' '}\n \n );\n } else {\n menuItemData.forEach((item: IMenuItemData, index: number) => {\n menuItemList.push(\n \n {this._createMenuItemList(item)}\n \n );\n });\n }\n\n return menuItemList;\n }\n\n private _getFromSubMenu(item?: IMenuItemData): IMenuItemData | null {\n const subMenus = item && item.subMenu;\n if (subMenus && subMenus.length > 0) {\n for (let i = 0; i <= subMenus.length - 1; i++) {\n if (subMenus[i].id === this.state.activeMenu) {\n !NavigationMenuView.isBackTrack\n ? this.setState({ parentMenu: item?.id })\n : this.setState({ parentMenu: item && item.id, mobileViewLabelText: subMenus[i].linkText });\n return subMenus[i];\n }\n const found = this._getFromSubMenu(subMenus[i]);\n if (found) {\n return found;\n }\n }\n }\n this.props.context.telemetry.error('Submenu content is empty, module wont render.');\n return null;\n }\n\n private _createMenuItemList(menuItemData: IMenuItemData): JSX.Element | null {\n if (menuItemData && menuItemData.subMenu && menuItemData.subMenu.length > 0) {\n if (this.props.isMobileView && this.state.activeMenu !== undefined) {\n return this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false);\n }\n return (\n <>\n {this._renderButtonMenuItem(menuItemData)}\n {this._renderSubMenu(menuItemData.subMenu, menuItemData.id, false)}\n \n );\n } else if (menuItemData && menuItemData.linkText && menuItemData.linkURL && menuItemData.linkURL.length > 0) {\n return this._renderLinkMenuItem(menuItemData, menuItemData.id, false, true);\n } else if (menuItemData && menuItemData.linkText && !menuItemData.linkURL) {\n return this._renderSpanMenuItem(menuItemData, menuItemData.id, true);\n }\n this.props.context.telemetry.error('Navigation menu content is empty, module wont render.');\n return null;\n }\n\n private _renderSubMenu(subMenus?: IMenuItemData[], activeMenu?: number, IsSubMenu?: boolean): JSX.Element | null {\n const { isMobileView, ListItem } = this.props;\n const enableMultiSupportMenu = this.props.config.enableMultilevelMenu || false;\n const multiLevelSupportedMenu = this.props.config.menuLevelSupport || 3;\n\n // Const isParentMenu:boolean= false;\n if (activeMenu && this.state.activeMenu !== activeMenu) {\n this.props.context.telemetry.error('Navigation Active menu content is empty, module wont render.');\n return null;\n }\n\n if (!subMenus || subMenus.length === 0) {\n this.props.context.telemetry.error('Navigation Submenu content is empty, module wont render.');\n return null;\n }\n\n let levelClassName: string = '';\n const menuOptions =\n subMenus &&\n subMenus.map((option: IMenuItemData, idx: number) => {\n const hasOptions = option.subMenu && option.subMenu.length > 0;\n let menuItem: JSX.Element | null;\n if (hasOptions && isMobileView) {\n menuItem = this._renderButtonMenuItem(option, activeMenu, idx);\n } else {\n menuItem = option.linkURL ? this._renderLinkMenuItem(option, idx) : this._renderSpanMenuItem(option);\n }\n\n let subMenu;\n const haveSubmenu = hasOptions && enableMultiSupportMenu && this.currentLevel <= Math.round(multiLevelSupportedMenu) - 1;\n if (haveSubmenu) {\n this.currentLevel++;\n levelClassName = enableMultiSupportMenu ? `level-${this.currentLevel.toString()}` : '';\n subMenu = this._renderSubMenu(option.subMenu, isMobileView ? option.id : undefined, true);\n }\n return (\n \n {menuItem}\n {subMenu}\n \n );\n });\n return this._renderMenu(levelClassName, menuOptions, activeMenu, IsSubMenu);\n }\n\n private _renderButtonMenuItem(option: IMenuItemData, activeMenu?: number, index?: number): JSX.Element | null {\n const { Button } = this.props;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderLinkMenuItem(\n option: IMenuItemData,\n index?: number,\n hoverEffect: boolean = true,\n isParent: boolean = false\n ): JSX.Element | null {\n const { Link } = this.props;\n const linkText = option.linkText ? option.linkText : '';\n const imagesource = option.imageSource ? option.imageSource : '';\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderPromotionalLink(linkText?: string, linkUrl?: string): JSX.Element | null {\n const { Link } = this.props;\n this.payLoad.contentAction.etext = linkText;\n const attributes = getTelemetryAttributes(this.telemetryContent, this.payLoad);\n if (linkText && linkUrl) {\n return (\n \n {linkText}\n \n );\n }\n return null;\n }\n\n private _renderSpanMenuItem(option: IMenuItemData, index?: number, isParent: boolean = false): JSX.Element | null {\n const { Span } = this.props;\n return (\n \n {option.linkText}\n \n );\n }\n\n private _renderMenu(level: string, menuOptions: JSX.Element[], currentItem?: number, submenu?: boolean): JSX.Element | null {\n const { DivContainer, MenuList, ImageDivContainer, showCategoryImage, showPromotionalContent, isMobileView } = this.props;\n const categoryImageDisplay =\n !isMobileView &&\n (showCategoryImage || showPromotionalContent) &&\n !ArrayExtensions.hasElements(this.state.categoryImage) &&\n !submenu;\n const promotionalContentDisplay =\n !isMobileView && showPromotionalContent && ArrayExtensions.hasElements(this.state.categoryImage) && !submenu;\n const DivContainerClass = this.currentLevel > 2 || categoryImageDisplay ? DivContainer!.className : 'ms-nav__deafult';\n this.currentLevel = 1;\n return (\n \n 2 &&\n 'navmenu-multi-level'\n )}\n >\n {menuOptions}\n \n {categoryImageDisplay &&\n this.state.categoryImage &&\n this.state.categoryImage.map(item => (\n \n {this.state.categoryImage && this._getCategoryImage(item)}\n {promotionalContentDisplay && this._renderPromotionalLink(item.altText, item.additionalProperties?.linkUrl)}\n \n ))}\n \n );\n }\n\n private readonly _updateCategoryImage = (categoryImageSrc: string, option: IMenuItemData) => () => {\n const linkText = option && option.linkText ? option.linkText : '';\n const promotionalImage: IImageData[] = [{ src: categoryImageSrc, altText: linkText }];\n\n // Read category and promotional image in one array\n if (ArrayExtensions.hasElements(option.promotionalContent)) {\n option.promotionalContent.map(item => {\n if (item && item.image) {\n const imageSrc = item.image.src;\n const promotionalItemImageSettings = item.image.imageSettings;\n promotionalImage.push({\n src: imageSrc,\n altText: item.text,\n imageSettings: promotionalItemImageSettings,\n additionalProperties: { linkUrl: item.linkUrl.destinationUrl }\n });\n }\n });\n }\n this.setState({\n categoryImage: promotionalImage.length > 0 ? promotionalImage : [{ src: 'empty' }],\n categoryImageAltText: linkText\n });\n };\n\n private readonly _handleDropdownToggle = (data: IMenuItemData, parentId?: number) => () => {\n if (!this.props.isMobileView) {\n this.setState({\n activeMenu: this.state.activeMenu && this.state.activeMenu === data.id! ? undefined : data.id!,\n parentMenu: parentId\n });\n if (this.props.showCategoryImage) {\n this._updateCategoryImage(data.imageSource!, data)();\n }\n } else {\n NavigationMenuView.isBackTrack = false;\n this.setState({\n activeMenu: data.id,\n mobileViewLabelText: data.linkText!,\n parentMenu: parentId\n });\n }\n };\n\n private readonly _handleGoBack = () => () => {\n NavigationMenuView.isBackTrack = true;\n this.setState({ activeMenu: this.state.parentMenu });\n };\n\n /**\n * Method to handle click outside of menu.\n * @param event -HTML event.\n */\n private readonly _handleClickOutside = (event: MouseEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.target as Node)) {\n this.setState({\n activeMenu: undefined,\n mobileViewLabelText: '',\n categoryImage: null\n });\n }\n };\n\n /**\n * Method to handle click outside of menu.\n * @param event -HTML event.\n */\n private readonly _handleFocusOutside = (event: FocusEvent) => {\n if (this.menuNode.current && !this.menuNode.current.contains(event.relatedTarget as Node)) {\n this._closeSubmenu();\n }\n };\n\n /**\n * Checks to assign a ref for focus.\n * @param index -Sub menu list index.\n * @param mobileViewLabelText -Parent user clicked Sub menu list.\n * @param optionLinkText -Sub menu list.\n * @returns Ref.\n */\n private readonly _shouldAddFocusMenuRef = (index: number, mobileViewLabelText?: string, optionLinkText?: string) => {\n if (!NavigationMenuView.isBackTrack && index === 0) {\n return true;\n }\n if (!optionLinkText || !mobileViewLabelText) {\n return false;\n }\n return mobileViewLabelText === optionLinkText;\n };\n\n private _closeSubmenu(): void {\n if (!this.props.isMobileView) {\n this.setState({ activeMenu: undefined, categoryImage: null, mobileViewLabelText: '' });\n }\n }\n\n private readonly _getCategoryImage = (categoryImage?: IImageData): React.ReactNode | null => {\n if (!categoryImage || !categoryImage.src) {\n return null;\n }\n\n const categoryImageUrl = generateImageUrl(`${categoryImage.src}`, this.props.context.actionContext.requestContext.apiSettings);\n const defaultImageSettings: IImageSettings = {\n viewports: {\n xs: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n sm: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n md: { q: 'w=300&h=250&m=8', w: 0, h: 0 },\n lg: { q: 'w=300&h=250&m=8', w: 0, h: 0 }\n },\n lazyload: true\n };\n if (categoryImageUrl !== undefined) {\n return (\n \n );\n }\n return null;\n };\n}\n\nexport default NavigationMenuView;\n"],"sourceRoot":""}