@kodiak-finance/orderly-ui-positions 2.8.15-rc.0 → 2.8.15
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +29 -12
- package/dist/index.d.ts +29 -12
- package/dist/index.js +23 -23
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +7 -7
- package/dist/index.mjs.map +1 -1
- package/package.json +13 -13
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/components/positions/closePosition/components/confirmDialog.tsx","../src/components/positions/positionsRowContext.tsx","../src/components/fundingFeeHistory/fundingFeeHistory.ui.tsx","../src/components/fundingFeeHistory/endReachedBox.tsx","../src/components/fundingFeeHistory/useEndReached.ts","../src/components/fundingFeeHistory/fundingFeeButton.tsx","../src/components/positions/combinePositions.script.ts","../src/components/positions/hooks/useSubAccountQuery.ts","../src/components/positions/positions.script.ts","../src/constants.ts","../src/utils/sorting.ts","../src/components/shared/hooks/useTabSort.ts","../src/components/positions/positions.ui.tsx","../src/provider/symbolProvider.tsx","../src/provider/symbolContext.tsx","../src/components/positions/desktop/useColumn.tsx","../src/components/positions/closePosition/closePositions.mobile.ui.tsx","../src/components/positions/closePosition/components/quantitySlider.tsx","../src/components/positions/closePosition/closePosition.ui.tsx","../src/components/positions/closePosition/closePosition.widget.tsx","../src/components/positions/closePosition/closePosition.script.tsx","../src/components/positions/desktop/components.tsx","../src/components/positions/desktop/listElement.tsx","../src/components/positions/desktop/priceInput.tsx","../src/components/positions/desktop/quantityInput.tsx","../src/components/positions/desktop/numeralWithCtx.tsx","../src/components/positions/desktop/partialTPSL.tsx","../src/components/positions/desktop/shareButton/shareButton.ui.tsx","../src/components/positions/desktop/shareButton/shareButton.script.tsx","../src/components/positions/desktop/shareButton/shareButton.widget.tsx","../src/components/positions/desktop/triggerPrice.tsx","../src/components/positions/desktop/unrealPnLHover.tsx","../src/components/positions/mobile/positionCell/positionCell.ui.tsx","../src/components/positions/mobile/positionCell/items.tsx","../src/components/positions/mobile/positionCell/positionCell.script.tsx","../src/components/positions/mobile/positionCell/positionCell.widget.tsx","../src/components/positions/positionsRowProvider.tsx","../src/components/positions/positions.widget.tsx","../src/components/positionHistory/positionHistory.ui.tsx","../src/components/positionHistory/desktop/usePositionHistoryColumn.tsx","../src/components/positionHistory/mobile/positionHistoryCell.ui.tsx","../src/components/positionHistory/mobile/items.tsx","../src/components/positionHistory/positionHistory.script.tsx","../src/utils/utils.ts","../src/components/positionHistory/mobile/positionHistoryCell.script.tsx","../src/components/positionHistory/mobile/positionHistoryCell.widget.tsx","../src/components/positionHistory/positionHistory.widget.tsx","../src/components/liquidation/liquidation.ui.tsx","../src/components/liquidation/desktop/useLiquidationColumn.tsx","../src/components/liquidation/mobile/liquidationCell.ui.tsx","../src/components/liquidation/mobile/liquidationCell.script.tsx","../src/components/liquidation/mobile/liquidationCell.widget.tsx","../src/components/liquidation/liquidation.script.tsx","../src/components/liquidation/liquidation.widget.tsx"],"names":["registerSimpleDialog","useMemo","useTranslation","OrderSide","Button","Text","CloseIcon","Flex","Divider","Badge","ThrottledButton","Box","commify","commifyOptional","Decimal","Fragment","jsx","jsxs","ConfirmHeader","props","hideCloseIcon","ConfirmFooter","t","OrderDetail","quantity","price","quoteDp","side","total","MarketCloseConfirm","onCancel","LimitConfirmDialog","order","createContext","useContext","PositionsRowContext","usePositionsRowContext","useCallback","usePrivateInfiniteQuery","EMPTY_LIST","Grid","Statistic","DataTable","ListView","useScreen","cn","useRef","useEffect","useEndReached","sentinelRef","onEndReached","observer","cb","options","handleObserver","entries","entry","EndReachedBox","PAGE_SIZE","FundingFeeHistoryUI","symbol","start_t","end_t","isMobile","isLoading","data","setSize","pageIndex","previousPageData","loadMore","prev","flattenData","item","listView","HistoryDataListViewSimple","HistoryDataListView","columns","value","renderItem","FundingFeeItem","useBoolean","SimpleDialog","SimpleSheet","FundingFeeButton","fee","isOpen","setTrue","setFalse","produce","useAccount","usePositionStream","usePrivateQuery","useSymbolsInfo","i18n","positions","_account","useDataTap","formatAddress","usePagination","useSWR","fetcher","useConfig","AccountStatusEnum","getTimestamp","signatureMiddleware","account","accountId","apiBaseUrl","useSWRNext","key","config","args","url","fullUrl","signer","payload","signature","ids","id","e","useSubAccountQuery","query","formatter","swrOptions","state","middleware","shouldFetch","init","useCombinePositionsScript","calcMode","includedPendingOrder","pnlNotionalDecimalPrecision","sharePnLConfig","onSymbolChange","selectedAccount","pagination","setPage","symbolsInfo","oldPositions","newPositions","isPositionLoading","mutatePositions","accountInfo","isAccountInfoLoading","processPositions","acc","draft","info","notional","MMR","mm","unrealPnl","maxLeverage","imr","unrealPnlROI","unrealPnl_index","unrealPnlROI_index","dataSource","filtered","groupDataSource","groupDataByAccount","mergedLoading","mainAccountId","subAccounts","map","findSubAccount","React","TRADING_POSITIONS_SORT_STORAGE_KEY","useState","compareValues","aValue","bValue","aStr","bStr","aNum","bNum","aIsNumber","bIsNumber","aIsDate","bIsDate","aDate","bDate","sortList","list","sort","sortKey","sortOrder","sortedList","a","b","comparison","useSort","initialSort","onSortChange","setSort","onSort","nextSort","getSortedList","useSessionStorage","PositionsTabName","useTabSort","tabSort","setTabSort","onTabSort","type","usePositionsScript","enableSortingStorage","rawDataSource","AuthGuardDataTable","SymbolContext","useSymbolContext","SymbolProvider","children","symbolInfo","memoizedValue","HoverCard","Tooltip","SymbolLeverageDialogId","SharePnLDialogId","Input","inputFormatter","Slider","QuantitySlider","MobileClosePosition","base","base_dp","quote","quote_dp","sheetOpen","setSheetOpen","dialogOpen","setDialogOpen","submitting","priceErrorMsg","quantityErrorMsg","disabled","isMarketClose","position","maxQty","isBuy","title","orderType","orderSide","header","lastPrice","inputForm","slider","footer","OrderType","PopoverContent","PopoverRoot","PopoverTrigger","Select","DesktopClosePosition","popoverOpen","setPopoverOpen","isEntirePosition","quantityForm","suffix","disabledInput","priceForm","useLocalStorage","utils","useOrderEntryFormErrorMsg","useClosePositionScript","sliderValue","setSliderValue","quantityInputRef","orderConfirm","onSubmit","closeOrderData","updatePriceChange","updateOrderType","updateQuantity","errors","baseTick","getErrorMsg","closeType","formatQuantityToBaseTick","formatQty","onSliderValueChange","qty","onMax","onConfirm","res","onDoubleConfirm","onCloseSheet","onCloseDialog","onClosePopover","onEntirePosition","ClosePositionWidget","useLeverageBySymbol","ChevronRightIcon","EditIcon","modal","PositionTPSLPopover","TPSLDetailDialogId","TPSLDialogId","TPSLSheetId","TPSLDetailSheetId","TPSLEditIcon","baseDp","tpslOrder","dialogId","AddIcon","needConfirm","onAdd","modalParams","LeverageBadge","leverage","showModal","LeverageDisplay","CaretDownIcon","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","DropdownMenuRoot","DropdownMenuTrigger","renderQuantity","NumeralWithCtx","tick","rest","PositionType","PartialTPSL","orderNum","tpTriggerPrice","slTriggerPrice","direction","child","hasTPSL","ShareIcon","ShareButton","useAccountInfo","useReferralInfo","useShareButtonScript","iconSize","getFirstRefCode","refCode","symbolLeverage","getHistoryEntity","netPnL","openPrice","roi","baseIMR","IMR_Factor","unrealizedPnLROI","entity","ShareButtonWidget","AlgoOrderType","TriggerPrice","stopLossPrice","takeProfitPrice","TPSLTriggerPrice","TriggerPriceItem","entryPrice","pnl","msgs","Label","content","showIcon","UnrealizedPnLPopoverCard","unPnlPriceBasis","setUnPnlPriceBasic","UnPnlPriceBasisCheckBox","onValueChange","RadioButton","sel","label","onCheckChange","SelIcon","UnselIcon","useColumn","fundingFeeEndTime","r1","r2","record","_","SymbolLeverageSheetId","SharePnLBottomSheetId","SymbolToken","UnrealPnL","Qty","Margin","Notional","AvgOpen","MarkPrice","LiqPrice","liqPrice","TPSLPrice","fullTPSL","partialTPSL","FundingFee","PositionCell","className","body","buttons","usePositionCellScript","PositionCellWidget","usePositionClose","toast","PositionsRowProvider","setQuantity","setPrice","setType","submit","calculate","newValues","transSymbolformString","err","formatString","arr","Positions","index","MobilePositions","CombinePositions","tableData","row","column","PositionsWidget","MobilePositionsWidget","CombinePositionsWidget","DataFilter","useMaxLeverage","capitalizeFirstLetter","usePositionHistoryColumn","SymbolInfo","Quantity","NetPnL","avgOpen","avgClose","tags","status","renderStatus","netPnl","text","differenceInDays","subDays","setHours","offsetStartOfDay","date","newDate","offsetEndOfDay","formatDatePickerRange","option","areDatesEqual","date1","date2","usePositionHistoryScript","dateRange","filterDays","updateFilterDays","filterItems","onFilter","useFilter","filterData","sideFilter","statusFilter","time","dateFilter","symbolFilter","setStatus","setSide","defaultRange","setFilterDays","setDateRange","days","filter","newDateRange","diffDays","dateRangeFilter","PositionHistoryType","showAlert","ClosedQty","closedQty","MaxClosedQty","maxClosedQty","AvgClosed","OpenTime","ClosedTime","PositionHistoryCell","Header","Body","usePositionHistoryCellScript","PositionHistoryCellWidget","PositionHistory","dayLabel","MobilePositionHistory","PositionHistoryWidget","MobilePositionHistoryWidget","classNames","TooltipButton","useLiquidationColumn","FormattedText","abs_liquidation_fee","ctx","isExpanded","ArrowIcon","LiquidationCell","mr","DataItem","align","useLiquidationCellScript","LiquidationCellWidget","Liquidation","expanded","setExpanded","LiquidationDetails","TooltipHeaderCell","margin_ratio","account_mmr","collateral_value","position_notional","MobileLiquidation","useLiquidationScript","enableLoadMore","page","pageSize","parsePagination","meta","useLiquidation","ordersResponse","generateKeyFun","liquidationFeeRate","firstPosition","size","search","LiquidationWidget","MobileLiquidationWidget","MarketCloseConfirmID"],"mappings":"AAAA,OAAS,wBAAAA,OAA4B,6BCArC,OAAa,WAAAC,OAAe,QAC5B,OAAS,kBAAAC,OAAsB,+BAC/B,OAAsB,aAAAC,OAAiB,gCACvC,OACE,UAAAC,GACA,QAAAC,EACA,aAAAC,GACA,QAAAC,GACA,WAAAC,GACA,SAAAC,GACA,mBAAAC,GACA,OAAAC,OACK,6BACP,OAAS,WAAAC,GAAS,mBAAAC,GAAiB,WAAAC,OAAe,gCAS9C,OA0KA,YAAAC,GAzKE,OAAAC,EADF,QAAAC,OAAA,oBAPG,IAAMC,GAIPC,GAAU,CACd,GAAM,CAAE,cAAAC,EAAgB,EAAM,EAAID,EAClC,OACEF,GAAC,OAAI,UAAU,kEACb,UAAAD,EAACX,EAAA,CAAK,KAAM,OAAS,SAAAc,EAAM,MAAM,EAChC,CAACC,GACAJ,EAAC,UACC,QAASG,EAAM,QACf,UAAU,uGAEV,SAAAH,EAACV,GAAA,CAAU,KAAM,GAAI,MAAM,QAAQ,EACrC,GAEJ,CAEJ,EAEae,GAKPF,GAAU,CACd,GAAM,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAE7B,OACEe,GAACV,GAAA,CACC,GAAG,+BACH,IAAK,EACL,MAAO,OACP,UAAU,oBAEV,UAAAS,EAACZ,GAAA,CACC,GAAG,6CACH,MAAO,YACP,UAAS,GACT,QAASe,EAAM,SACf,KAAK,KAEJ,SAAAG,EAAE,eAAe,EACpB,EACAN,EAACN,GAAA,CACC,GAAG,8CACH,QAASS,EAAM,UACf,UAAS,GACT,QAASA,EAAM,WACf,SAAUA,EAAM,SAChB,KAAK,KAEJ,SAAAG,EAAE,gBAAgB,EACrB,GACF,CAEJ,EAEaC,GAAeJ,GAMtB,CACJ,GAAM,CAAE,SAAAK,EAAU,MAAAC,EAAO,QAAAC,EAAS,KAAAC,CAAK,EAAIR,EACrC,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvB0B,EAAQ3B,GAAQ,IAChBwB,GAASD,EACJ,IAAIV,GAAQW,CAAK,EACrB,IAAID,CAAQ,EACZ,QAAQE,EAASZ,GAAQ,UAAU,EAEjC,KACN,CAACW,EAAOD,CAAQ,CAAC,EAEpB,OACEP,GAACV,GAAA,CACC,UAAW,SACX,IAAK,EACL,MAAO,OACP,UAAU,wCACV,GAAI,EAEJ,UAAAU,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,EAAA,CAAM,SAAAiB,EAAE,YAAY,EAAE,EACvBN,EAACX,EAAA,CAAK,MAAOsB,IAASxB,GAAU,IAAM,UAAY,SAC/C,SAAAqB,EACH,GACF,EACAP,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,EAAA,CAAM,SAAAiB,EAAE,cAAc,EAAE,EACzBN,EAACX,EAAK,UAAL,CACC,UAAW,GACX,OAAQW,EAACX,EAAA,CAAK,UAAW,GAAI,gBAAI,EAEhC,SAAAoB,EACH,GACF,EACAR,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,EAAA,CAAM,SAAAiB,EAAE,iBAAiB,EAAE,EAC5BN,EAACX,EAAK,UAAL,CACC,UAAW,GACX,OAAQW,EAACX,EAAA,CAAK,UAAW,GAAI,gBAAI,EAEhC,SAAAuB,EACH,GACF,GACF,CAEJ,EAEaC,GAWPV,GAAU,CACd,GAAM,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvB4B,EAAW,IAAM,EACRX,GAAO,SAAWA,EAAM,SAC9B,CACT,EACA,OACEF,GAACV,GAAA,CAAK,UAAW,SAAU,UAAWY,EAAM,YAAY,KACtD,UAAAH,EAACE,GAAA,CACC,QAASY,EACT,MAAOR,EAAE,uBAAuB,EAChC,cAAeH,EAAM,cACvB,EACAH,EAACX,EAAA,CAAK,UAAW,GAAI,KAAK,KAAK,UAAU,WACtC,SAAAiB,EAAE,oCAAqC,CACtC,SAAUT,GAAgBM,EAAM,QAAQ,EACxC,KAAMA,EAAM,IACd,CAAC,EACH,EACAH,EAACK,GAAA,CACC,SAAUS,EACV,UAAW,SAAY,CACrB,MAAMX,EAAM,YAAY,EACxBW,EAAS,CACX,EACA,WAAYX,EAAM,WACpB,GACF,CAEJ,EAEaY,GAUPZ,GAAU,CACd,GAAM,CAAE,MAAAa,EAAO,QAAAN,EAAS,SAAAF,EAAU,MAAAC,CAAM,EAAIN,EACtC,CAAE,KAAAQ,CAAK,EAAIK,EACX,CAAE,EAAAV,CAAE,EAAIpB,GAAe,EAEvB4B,EAAW,IAAM,CACrBX,EAAM,UAAU,CAClB,EAEA,OACEF,GAAAF,GAAA,CACE,UAAAC,EAACE,GAAA,CACC,QAASY,EACT,MAAOR,EAAE,sBAAsB,EAC/B,cAAeH,EAAM,cACvB,EACAH,EAACL,GAAA,CAAI,GAAI,EACP,SAAAK,EAACX,EAAA,CAAK,UAAW,GAAI,KAAK,KACvB,SAAAiB,EAAE,mCAAoC,CACrC,SAAUV,GAAQO,EAAM,QAAQ,EAChC,KAAMA,EAAM,IACd,CAAC,EACH,EACF,EAEAF,GAACV,GAAA,CAAK,IAAK,EAAG,GAAI,EAAG,GAAI,EAAG,QAAS,UACnC,UAAAS,EAACX,EAAK,UAAL,CACC,KAAK,SACL,aAAa,YACb,KAAK,OACL,SAAQ,GAEP,SAAA2B,EAAM,OACT,EACAf,GAACV,GAAA,CAAK,IAAK,EACT,UAAAS,EAACP,GAAA,CAAM,MAAM,UAAU,KAAK,KACzB,SAAAa,EAAE,4BAA4B,EACjC,EACAN,EAACP,GAAA,CACC,MAAOkB,IAASxB,GAAU,IAAM,UAAY,SAC5C,KAAK,KAEJ,SAAAwB,IAASxB,GAAU,IAAMmB,EAAE,YAAY,EAAIA,EAAE,aAAa,EAC7D,GACF,GACF,EAEAN,EAACR,GAAA,CAAQ,UAAU,aAAa,EAEhCQ,EAACO,GAAA,CACC,UAAU,cACV,MAAOE,EACP,SAAUD,EACV,KAAMQ,EAAM,KACZ,QAASN,GAAW,EACtB,EACAV,EAACK,GAAA,CACC,SAAUS,EACV,UAAWX,EAAM,UACjB,WAAYA,EAAM,WACpB,GACF,CAEJ,ECrPA,OAAS,iBAAAc,GAAe,cAAAC,OAAkB,QAyBnC,IAAMC,GAAsBF,GACjC,CAAC,CACH,EAEaG,GAAyB,IAC7BF,GAAWC,EAAmB,EC9BvC,OAAa,eAAAE,GAAa,WAAApC,OAAe,QACzC,OAAS,2BAAAqC,OAA+B,gCACxC,OAAS,kBAAApC,OAAsB,+BAC/B,OAAS,cAAAqC,OAAkB,gCAC3B,OACE,QAAAC,GACA,aAAAC,GACA,aAAAC,GACA,QAAArC,GACA,YAAAsC,GACA,QAAApC,GACA,aAAAqC,GACA,MAAAC,OACK,6BACP,OAAS,WAAA/B,OAAe,gCCdxB,OAAa,UAAAgC,OAAsC,QCAnD,OAAS,aAAAC,GAAW,UAAAD,OAAgC,QAK7C,SAASE,GACdC,EACAC,EACA,CACA,IAAMC,EAAWL,GAA6B,EACxCM,EAAKN,GAAOI,CAAY,EAE9BE,EAAG,QAAUF,EAEbH,GAAU,IAAM,CACd,IAAMM,EAAoC,CACxC,KAAM,KACN,WAAY,MACZ,UAAW,CACb,EAEMC,EAAkBC,GAAyC,CAE/DA,EAAQ,QAASC,GAAU,CACrBA,EAAM,gBACRJ,EAAG,UAAU,CAEjB,CAAC,CACH,EAEA,OAAAD,EAAS,QAAU,IAAI,qBAAqBG,EAAgBD,CAAO,EAE5D,IAAM,CAEXF,EAAS,SAAS,WAAW,CAC/B,CACF,EAAG,CAAC,CAAC,EAELJ,GAAU,IAAM,CACdI,EAAS,SAAS,QAAQF,EAAY,OAAQ,CAChD,EAAG,CAAC,CAAC,CACP,CDtBI,mBAAAlC,GAEE,OAAAC,GAFF,QAAAC,OAAA,oBAXG,IAAMwC,GACXtC,GACG,CACH,IAAM8B,EAAcH,GAA8B,IAAI,EAChD,CAAE,aAAAI,CAAa,EAAI/B,EAEzB,OAAA6B,GAAcC,EAAa,IAAM,CAC/BC,IAAe,CACjB,CAAC,EAGCjC,GAAAF,GAAA,CACG,UAAAI,EAAM,SACPH,GAAC,OACC,IAAKiC,EACL,UAAU,0EACZ,GACF,CAEJ,ED8CQ,cAAAjC,EAyBE,QAAAC,OAzBF,oBA7CR,IAAMyC,GAAY,GAELC,GAKR,CAAC,CAAE,MAAA/B,EAAO,OAAAgC,EAAQ,QAAAC,EAAS,MAAAC,CAAM,IAAM,CAC1C,GAAM,CAAE,EAAAxC,CAAE,EAAIpB,GAAe,EACvB,CAAE,SAAA6D,CAAS,EAAInB,GAAU,EAEzB,CAAE,UAAAoB,EAAW,KAAAC,EAAM,QAAAC,CAAQ,EAC/B5B,GACE,CAAC6B,EAAWC,KAEP,CAACA,IAAqBA,EAAiB,QAAU,GAAKV,KACvDS,EAAY,EAEL,KACF,gCAAgCA,EAAY,CAAC,SAAST,EAAS,WAAWE,CAAM,YAAYC,CAAO,UAAUC,CAAK,GAE3H,CACE,oBAAqB,EACvB,CACF,EAEIO,EAAWhC,GAAY,IAAM,CACjC6B,EAASI,GACAA,EAAO,CACf,CACH,EAAG,CAACJ,CAAO,CAAC,EAENK,EAActE,GAAQ,IACrB,MAAM,QAAQgE,CAAI,EAChBA,EAAK,KAAK,EAAE,IAAKO,IACf,CACL,GAAGA,EACH,YAAa,CAACA,EAAK,WACrB,EACD,EANgC,CAAC,EAOjC,CAACP,CAAI,CAAC,EAEHQ,EAAWxE,GAAQ,IACnB8D,EAEA/C,EAAC0D,GAAA,CACC,KAAMH,GAAehC,GACrB,UAAWyB,EACX,SAAUK,EACZ,EAIFrD,EAAC2D,GAAA,CACC,KAAMJ,GAAehC,GACrB,UAAWyB,EACX,SAAUK,EACZ,EAED,CAACN,EAAUQ,EAAaP,CAAS,CAAC,EAErC,OACE/C,GAAC,OACC,UAAAA,GAACuB,GAAA,CACC,KAAM,EACN,KAAM,EACN,UAAU,uDAEV,UAAAxB,EAAC,OAAI,UAAU,oEAEb,SAAAC,GAACV,GAAA,CAAK,UAAW,SAAU,IAAK,EAAG,UAAW,QAC5C,UAAAS,EAAC,QAAK,UAAU,yCACb,SAAAM,EAAE,eAAe,EACpB,EACAN,EAACX,GAAK,UAAL,CACC,KAAK,SACL,UAAU,oBACV,UAAW,GAEV,SAAAuD,EACH,GACF,EACF,EACA5C,EAAC,OAAI,UAAU,oEACb,SAAAA,EAACyB,GAAA,CACC,MAAO,GAAGnB,EAAE,oBAAoB,CAAC,UACjC,WAAY,CACV,SAAU,GACV,SAAU,GACV,eAAgB,EAClB,EAEC,SAAAM,EACH,EACF,GACF,EACC6C,GACH,CAEJ,EAQME,GAAqC,CAAC,CAAE,UAAAX,EAAW,KAAAC,EAAM,SAAAI,CAAS,IAAM,CAC5E,GAAM,CAAE,EAAA/C,CAAE,EAAIpB,GAAe,EACvB0E,EAAU3E,GAAQ,IACf,CACL,CACE,MAAOqB,EAAE,aAAa,EACtB,UAAW,eACX,MAAO,IACP,OAASuD,GACA7D,EAACX,GAAK,UAAL,CAAe,KAAK,OAAQ,SAAAwE,EAAM,CAE9C,EACA,CACE,MAAOvD,EAAE,qBAAqB,EAC9B,UAAW,eACX,UAAYuD,GAAkB,IAAI/D,GAAQ+D,CAAK,EAAE,IAAI,GAAG,EAAE,SAAS,EACnE,OAASA,GACA7D,EAAC,QAAM,YAAG6D,CAAK,IAAI,CAE9B,EACA,CACE,MAAOvD,EAAE,qBAAqB,EAC9B,UAAW,eACX,UAAYuD,GAENvD,EADGuD,IAAU,MACX,2BACA,8BAD0B,EAGlC,OAASA,GAAU7D,EAAC,QAAM,SAAA6D,EAAM,CAClC,EACA,CACE,MAAO,GAAGvD,EAAE,oBAAoB,CAAC,UACjC,UAAW,cACX,OAASuD,GAEL7D,EAACX,GAAK,QAAL,CAAa,KAAK,QAAQ,SAAQ,GAAC,eAAc,GAAC,SAAQ,GACxD,SAAAwE,EACH,CAGN,CACF,EACC,CAACvD,CAAC,CAAC,EAEN,OACEN,EAAC,OAAI,UAAU,uDACb,SAAAA,EAACyC,GAAA,CAAc,aAAcY,EAC3B,SAAArD,EAAC0B,GAAA,CACC,WAAY,CACV,KAAMG,GAAG,sCAAsC,CACjD,EACA,QAAS+B,EACT,WAAYX,GAAQ1B,GACpB,QAASyB,EACX,EACF,EACF,CAEJ,EAEMU,GAA2C,CAAC,CAChD,KAAAT,EACA,UAAAD,EACA,SAAAK,CACF,IAAM,CACJ,IAAMS,EAAazC,GAAamC,GACvBxD,EAAC+D,GAAA,CAAe,KAAMP,EAAM,EAClC,CAAC,CAAC,EACL,OACExD,EAAC,OAAI,UAAU,iDACb,SAAAA,EAAC2B,GAAA,CACC,WAAYsB,EACZ,WAAYa,EACZ,UAAWd,EACX,iBAAiB,gBACjB,SAAUK,EACZ,EACF,CAEJ,EAEMU,GAED,CAAC,CAAE,KAAAP,CAAK,IAAM,CACjB,GAAM,CAAE,EAAAlD,CAAE,EAAIpB,GAAe,EAC7B,OACEe,GAAC,OAAI,UAAU,8EACb,UAAAA,GAACV,GAAA,CAAK,QAAS,UACb,UAAAS,EAACyB,GAAA,CACC,MAAOnB,EAAE,qBAAqB,EAC9B,WAAY,CACV,MAAO,cACT,EACA,WAAY,CACV,SAAU,GACV,KAAM,cACN,UAAW,aACb,EAEC,SAAAkD,EAAK,aACR,EACAxD,EAACyB,GAAA,CACC,MAAOnB,EAAE,eAAe,EACxB,UAAU,gBACV,WAAY,CACV,MAAO,cACT,EACA,WAAY,CACV,SAAU,GACV,SAAU,GACV,GAAI,MACJ,UAAW,cACX,eAAgB,EAClB,EAEC,SAAAkD,EAAK,YACR,GACF,EACAvD,GAACV,GAAA,CAAK,QAAS,UACb,UAAAS,EAACX,GAAK,UAAL,CACC,KAAK,OACL,UAAU,4BACV,KAAK,MAEJ,SAAAmE,EAAK,aACR,EACAxD,EAACX,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,SAAAmE,EAAK,eAAiB,MACnBlD,EAAE,0BAA0B,EAC5BA,EAAE,8BAA8B,EACtC,GACF,GACF,CAEJ,EG5QA,OAAS,cAAA0D,OAAkB,gCAC3B,OAAS,kBAAA9E,OAAsB,+BAC/B,OACE,gBAAA+E,GACA,eAAAC,GACA,QAAA7E,GACA,aAAAuC,OACK,6BAcH,mBAAA7B,GAEI,OAAAC,GAFJ,QAAAC,OAAA,oBAXG,IAAMkE,GAKR,CAAC,CAAE,IAAAC,EAAK,OAAAxB,EAAQ,QAAAC,EAAS,MAAAC,CAAM,IAAM,CACxC,GAAM,CAAE,EAAAxC,CAAE,EAAIpB,GAAe,EACvB,CAACmF,EAAQ,CAAE,QAAAC,EAAS,SAAAC,CAAS,CAAC,EAAIP,GAAW,EAAK,EAClD,CAAE,SAAAjB,CAAS,EAAInB,GAAU,EAE/B,OACE3B,GAAAF,GAAA,CACE,UAAAC,GAAC,UAAO,QAASsE,EACf,SAAAtE,GAACX,GAAK,QAAL,CACC,KAAK,QACL,SAAQ,GACR,eAAc,GACd,SAAQ,GACR,UAAU,+DAET,SAAA+E,EACH,EACF,EACCrB,EACC/C,GAACkE,GAAA,CACC,KAAMG,EACN,aAAcE,EACd,MAAOjE,EAAE,oBAAoB,EAC7B,WAAY,CACV,KAAM,2BACR,EAEA,SAAAN,GAAC2C,GAAA,CACC,MAAOyB,EACP,OAAQxB,EACR,QAASC,EACT,MAAOC,EACT,EACF,EAEA9C,GAACiE,GAAA,CACC,KAAMI,EACN,aAAcE,EACd,MAAOjE,EAAE,oBAAoB,EAC7B,WAAY,CACV,QAAS,uBACT,KAAM,4CACR,EAEA,SAAAN,GAAC2C,GAAA,CACC,MAAOyB,EACP,OAAQxB,EACR,QAASC,EACT,MAAOC,EACT,EACF,GAEJ,CAEJ,ECtEA,OAAS,aAAAf,GAAW,WAAA9C,OAAe,QACnC,OAAS,WAAAuF,OAAe,QACxB,OAEE,cAAAC,GACA,qBAAAC,GACA,mBAAAC,GACA,kBAAAC,OACK,gCACP,OAAS,QAAAC,OAAY,+BACrB,OAAS,aAAAC,GAAW,WAAWC,OAAgB,+BAC/C,OAAS,cAAAC,OAAkB,oCAE3B,OAAS,iBAAAC,GAAe,iBAAAC,OAAqB,6BCZ7C,OAKE,cAAAT,GACA,UAAAU,GACA,WAAAC,GACA,aAAAC,OAEK,gCACP,OAAS,qBAAAC,OAAyB,gCAClC,OAAS,gBAAAC,OAAoB,gCAO7B,IAAMC,GAAsB,CAC1BC,EACAC,IACe,CACf,IAAMC,EAAaN,GAAU,YAAY,EAEzC,OAAQO,GACC,CAACC,EAAKT,EAASU,IAAW,CAC/B,GAAI,CAqBF,OAAOF,EAAWC,EApBM,MAAOE,GAAc,CAC3C,IAAMC,EAAM,MAAM,QAAQD,CAAI,EAAIA,EAAK,CAAC,EAAIA,EACtCE,EAAU,GAAGN,CAAU,GAAGK,CAAG,GAC7BE,EAAST,EAAQ,OACjBU,EAAyB,CAAE,OAAQ,MAAO,IAAAH,CAAI,EAC9CI,EAAY,MAAMF,EAAO,KAAKC,EAASZ,GAAa,CAAC,EACrDc,EAAM,MAAM,QAAQX,CAAS,EAAIA,EAAY,CAACA,CAAS,EAC7D,OAAO,QAAQ,IACbW,EAAI,IAAKC,GAEAlB,EAAQa,EAAS,CACtB,QAAS,CACP,GAAGG,EACH,qBAAsBE,CACxB,CACF,CAAC,CACF,CACH,CACF,EAEwCR,CAAM,CAChD,OAASS,EAAG,CACV,MAAMA,CACR,CACF,CAEJ,EAEaC,GAAqB,CAChCC,EACApE,IACmB,CACnB,GAAM,CAAE,UAAAqE,EAAW,UAAAhB,EAAW,GAAGiB,CAAW,EAAItE,GAAW,CAAC,EACtD,CAAE,MAAAuE,EAAO,QAAAnB,CAAQ,EAAIhB,GAAW,EAChCoC,EAAa,MAAM,QAAQxE,GAAS,GAAG,EAAKA,GAAS,KAAO,CAAC,EAAK,CAAC,EAEnEgE,EAAM,MAAM,QAAQX,CAAS,EAAIA,EAAY,CAACA,CAAS,EAEvDoB,EACJT,EAAI,OAAO,OAAO,EAAE,SACnBO,EAAM,QAAUtB,GAAkB,eACjCsB,EAAM,SAAWtB,GAAkB,+BAEvC,OAAOH,GACL,IAAO2B,EAAc,CAACL,EAAOJ,CAAG,EAAI,KACpC,CAACL,EAAae,IACL3B,GAAQY,EAAKe,EAAM,CAAE,UAAAL,CAAU,CAAC,EAEzC,CACE,GAAGC,EACH,IAAK,CAAC,GAAGE,EAAYrB,GAAoBC,EAASY,CAAe,CAAC,EAClE,QAAS,IAAM,CAAC,CAClB,CACF,CACF,ED7DO,IAAMW,GAA6B7G,GAA0B,CAClE,GAAM,CACJ,OAAAyC,EACA,SAAAqE,EACA,qBAAAC,EACA,4BAAAC,EACA,eAAAC,EACA,eAAAC,EACA,gBAAAC,CACF,EAAInH,EAEE,CAAE,WAAAoH,EAAY,QAAAC,CAAQ,EAAItC,GAAc,CAAE,SAAU,EAAG,CAAC,EAE9DnD,GAAU,IAAM,CACdyF,EAAQ,CAAC,CACX,EAAG,CAAC5E,CAAM,CAAC,EAEX,IAAM6E,EAAc7C,GAAe,EAE7B,CAAE,MAAAgC,CAAM,EAAInC,GAAW,EAEvB,CAACiD,EAAc,CAAE,CAAE,UAAA1E,CAAU,CAAC,EAAI0B,GAAkB9B,EAAQ,CAChE,SAAAqE,EACA,qBAAAC,CACF,CAAC,EAGK,CACJ,KAAMS,EAAe,CAAC,EACtB,UAAWC,EACX,OAAQC,CACV,EAAIlD,GAAmC,iCAAkC,CAEvE,gBAAiB,CACnB,CAAC,EAGK,CAAE,KAAMmD,EAAc,CAAC,EAAG,UAAWC,CAAqB,EAC9DvB,GAAsC,kBAAmB,CACvD,UAAWmB,EAAa,IAAKnE,GAASA,EAAK,UAAW,EACtD,kBAAmB,EACrB,CAAC,EAEGwE,EAAmBxD,GACvBmD,EAAa,OAAQM,GAAQA,EAAI,aAAerB,EAAM,aAAa,EAClEsB,GAAU,CACT,QAAW1E,KAAQ0E,EAAO,CACxB,IAAMC,EAAOV,EAAYjE,EAAK,MAAM,EAC9B4E,EAAWtD,GAAU,SAAStB,EAAK,aAAcA,EAAK,UAAU,EAChEiC,EAAUqC,EAAY,KACzBG,IAAQA,GAAI,aAAezE,EAAK,UACnC,EAEM6E,EAAMvD,GAAU,IAAI,CACxB,QAASqD,IAAO,UAAU,EAC1B,QAASA,IAAO,UAAU,EAC1B,UAAW1C,GAAS,WAAWjC,EAAK,MAAM,GAAK,EAC/C,iBAAkB4E,EAClB,iBAAkB,EAAI,CACxB,CAAC,EAEKE,GAAKxD,GAAU,kBAAkB,CACrC,YAAatB,EAAK,aAClB,UAAWA,EAAK,WAChB,IAAK6E,CACP,CAAC,EAEKE,GAAYzD,GAAU,cAAc,CACxC,IAAKtB,EAAK,aACV,UAAWA,GAAM,mBAEjB,UAAWA,EAAK,UAClB,CAAC,EAEKgF,GAAchF,EAAK,UAAY,EAE/BiF,GAAM1D,GAAS,IAAI,CACvB,YAAAyD,GACA,QAASL,IAAO,UAAU,EAC1B,WAAY1C,GAAS,WAAWjC,EAAK,MAAM,GAAK,EAChD,iBAAkB4E,EAClB,eAAgB,EAChB,iBAAkB,EAAI,CACxB,CAAC,EAEKM,GAAe5D,GAAU,iBAAiB,CAC9C,YAAatB,EAAK,aAClB,UAAWA,EAAK,mBAChB,IAAKiF,GACL,cAAeF,EACjB,CAAC,EAEGI,GAAkB,EAClBC,GAAqB,EACrBpF,EAAK,cACPmF,GAAkB7D,GAAU,cAAc,CACxC,IAAKtB,EAAK,aACV,UAAWA,GAAM,mBAEjB,UAAWA,EAAK,WAClB,CAAC,EACDoF,GAAqB9D,GAAU,iBAAiB,CAC9C,YAAatB,EAAK,aAClB,UAAWA,EAAK,mBAChB,IAAKiF,GACL,cAAeE,EACjB,CAAC,GAEHnF,EAAK,IAAM6E,EACX7E,EAAK,GAAK8E,GACV9E,EAAK,SAAW4E,EAChB5E,EAAK,eAAiB+E,GACtB/E,EAAK,mBAAqBkF,GAC1BlF,EAAK,yBAA2BoF,EAClC,CACF,CACF,EAEMC,EACJ7D,GACE,CAAC,GAAG0C,GAAc,KAAM,GAAGM,CAAgB,EAAE,OAC1CC,GAAQA,EAAI,eAAiB,CAChC,CACF,GAAK,CAAC,EAEFa,EAAW7J,GAAQ,IACnB,CAACqI,GAAmBA,IAAoB,eACnCuB,EAEFA,EAAW,OAAQrF,GACpB8D,IAAoB,gBACf9D,EAAK,aAAeoD,EAAM,eAAiB,CAACpD,EAAK,WAEjDA,EAAK,aAAe8D,CAE9B,EACA,CAACuB,EAAYvB,EAAiBV,EAAM,aAAa,CAAC,EAE/CmC,EAAkB9J,GAAQ,IACvB+J,GAAmBF,EAAU,CAClC,cAAelC,EAAM,cACrB,YAAaA,EAAM,WACrB,CAAC,EACA,CAACkC,EAAUlC,EAAM,cAAeA,EAAM,WAAW,CAAC,EAE/CqC,GAAgBhK,GAAiB,IAC9B+D,GAAa4E,GAAqBG,EACxC,CAAC/E,EAAW4E,EAAmBG,CAAoB,CAAC,EAEvD,MAAO,CACL,UAAWgB,EACX,UAAWE,GACX,4BAAA9B,EACA,eAAAC,EACA,OAAAxE,EACA,eAAAyE,EACA,WAAAE,EACA,gBAAAM,CACF,CACF,EAMamB,GAAqB,CAChC/F,EACAZ,IAIG,CACH,GAAM,CAAE,cAAA6G,EAAgB,GAAI,YAAAC,EAAc,CAAC,CAAE,EAAI9G,EAE3C+G,EAAM,IAAI,IAShB,QAAW5F,KAAQP,EAAM,CAEvB,IAAMyC,EAAYlC,EAAK,YAAc0F,EAC/BG,EAAiBF,EAAY,KAAMlB,GAAQA,EAAI,KAAOvC,CAAS,EACjE0D,EAAI,IAAI1D,CAAS,EACnB0D,EAAI,IAAI1D,CAAS,GAAG,UAAU,KAAKlC,CAAI,EAEvC4F,EAAI,IAAI1D,EAAW,CACjB,GAAIA,EACJ,YACEA,IAAcwD,EACVrE,GAAK,EAAE,oBAAoB,EAC3BwE,GAAgB,aAChBpE,GAAcoE,GAAgB,IAAM,EAAE,EAC5C,SAAU,CAAC7F,CAAI,CACjB,CAAC,CAEL,CACA,MAAO,CACL,SAAU,MAAM,KAAK4F,EAAI,KAAK,CAAC,EAC/B,WAAY,MAAM,KAAKA,EAAI,OAAO,CAAC,CACrC,CACF,EEnOA,OAAOE,OAAW,QAClB,OAAS,qBAAA5E,OAAyB,gCAClC,OAAS,cAAAM,OAAkB,oCAC3B,OAAS,iBAAAE,OAAqB,6BCHvB,IAAMqE,GACX,iCCDF,OAAS,eAAAlI,GAAwB,YAAAmI,OAAgB,QAOjD,IAAMC,GAAgB,CAACC,EAAaC,IAAwB,CAE1D,GAAID,GAAU,MAAQC,GAAU,KAAM,MAAO,GAC7C,GAAID,GAAU,KAAM,MAAO,GAC3B,GAAIC,GAAU,KAAM,MAAO,GAG3B,IAAMC,EAAO,OAAOF,CAAM,EAAE,KAAK,EAC3BG,EAAO,OAAOF,CAAM,EAAE,KAAK,EAG3BG,EAAO,OAAOF,CAAI,EAClBG,EAAO,OAAOF,CAAI,EAClBG,EACJ,CAAC,MAAMF,CAAI,GAAK,SAASA,CAAI,GAAK,+BAA+B,KAAKF,CAAI,EACtEK,EACJ,CAAC,MAAMF,CAAI,GAAK,SAASA,CAAI,GAAK,+BAA+B,KAAKF,CAAI,EAE5E,GAAIG,GAAaC,EACf,OAAOH,EAAOC,EAIhB,IAAMG,EAAU,qBAAqB,KAAKN,CAAI,GAAK,WAAW,KAAKA,CAAI,EACjEO,EAAU,qBAAqB,KAAKN,CAAI,GAAK,WAAW,KAAKA,CAAI,EAEvE,GAAIK,GAAWC,EAAS,CACtB,IAAMC,EAAQ,IAAI,KAAKV,CAAM,EACvBW,EAAQ,IAAI,KAAKV,CAAM,EAC7B,GAAI,CAAC,MAAMS,EAAM,QAAQ,CAAC,GAAK,CAAC,MAAMC,EAAM,QAAQ,CAAC,EACnD,OAAOD,EAAM,QAAQ,EAAIC,EAAM,QAAQ,CAE3C,CAGA,OAAOT,EAAK,cAAcC,EAAM,OAAW,CACzC,YAAa,OACb,QAAS,EACX,CAAC,CACH,EAEO,SAASS,GAASC,EAAaC,EAAiB,CACrD,GAAM,CAAE,QAAAC,EAAS,UAAAC,CAAU,EAAIF,GAAQ,CAAC,EAClCG,EAAa,CAAC,GAAIJ,GAAQ,CAAC,CAAE,EAEnC,OAAIE,GAAWC,GAEbC,EAAW,KAAK,CAACC,EAAQC,IAAW,CAClC,IAAMC,EAAarB,GAAcmB,EAAEH,CAAO,EAAGI,EAAEJ,CAAO,CAAC,EAEvD,OAAOC,IAAc,OAAS,CAACI,EAAaA,CAC9C,CAAC,EAEIH,CACT,CAEO,SAASI,GACdC,EACAC,EACA,CACA,GAAM,CAACT,EAAMU,CAAO,EAAI1B,GAA+BwB,CAAW,EAE5DG,EAAS9J,GAAagB,GAAwB,CAClD,IAAM+I,EAAW/I,EACb,CACE,QAASA,EAAQ,QACjB,UAAWA,EAAQ,IACrB,EACA,OAEJ6I,EAAQE,CAAQ,EAChBH,IAAeG,CAAQ,CAEzB,EAAG,CAAC,CAAC,EAECC,EAAgBhK,GACnBkJ,GAAgBD,GAASC,EAAMC,CAAI,EACpC,CAACA,CAAI,CACP,EAEA,MAAO,CACL,KAAAA,EACA,OAAAW,EACA,cAAAE,CACF,CACF,CC5FA,OAAS,eAAAhK,OAAmB,QAC5B,OAAS,qBAAAiK,OAAyB,gCAG3B,IAAKC,QACVA,EAAA,UAAY,YACZA,EAAA,gBAAkB,kBAFRA,QAAA,IAKL,SAASC,GAAWnJ,EAAiC,CAC1D,GAAM,CAACoJ,EAASC,CAAU,EAAIJ,GAAkBjJ,EAAQ,WAAY,CACjE,UAA6B,CAC5B,QAAS,iBACT,UAAW,MACb,EACC,gBAAmC,CAClC,QAAS,kBACT,UAAW,MACb,CACF,CAAuC,EAEjCsJ,EAAYtK,GACfuK,GAA4BpB,GAAoB,CAC/CkB,EAAW,CAAE,GAAGD,EAAS,CAACG,CAAI,EAAGpB,CAAK,CAAC,CACzC,EACA,CAACiB,EAASC,CAAU,CACtB,EAEA,MAAO,CACL,QAAAD,EACA,UAAAE,CACF,CACF,CHvBO,IAAME,GAAsB1L,GAA0B,CAC3D,GAAM,CACJ,OAAAyC,EACA,SAAAqE,EACA,qBAAAC,EACA,4BAAAC,EACA,eAAAC,EACA,eAAAC,EACA,qBAAAyE,EAAuB,EACzB,EAAI3L,EAKE,CAAE,WAAAoH,EAAY,QAAAC,CAAQ,EAAItC,GAAc,CAAE,SAAU,EAAG,CAAC,EAGxD,CAAE,QAAAuG,EAAS,UAAAE,CAAU,EAAIH,GAAW,CACxC,WAAYjC,EACd,CAAC,EAEK,CAAE,OAAA4B,EAAQ,cAAAE,EAAe,KAAAb,CAAK,EAAIO,GACtCe,EAAuBL,GAAU,UAA8B,OAC/DK,EAAuBH,aAAoC,EAAI,MACjE,EAEArC,GAAM,UAAU,IAAM,CACpB9B,EAAQ,CAAC,CACX,EAAG,CAAC5E,CAAM,CAAC,EAEX,GAAM,CAACK,EAAM,CAAE,CAAE,UAAAD,CAAU,CAAC,EAAI0B,GAAkB9B,EAAQ,CACxD,SAAAqE,EACA,qBAAAC,CACF,CAAC,EAEK6E,EACJ/G,GAAW/B,GAAM,KAAM,CAAE,aAAc,CAAC,CAAE,CAAC,GAAK,OAGlD,MAAO,CACL,WAHiBoI,EAAcU,GAAiB,CAAC,CAAC,EAIlD,UAAA/I,EACA,4BAAAmE,EACA,eAAAC,EACA,OAAAxE,EACA,eAAAyE,EACA,WAAAE,EACA,OAAA4D,EACA,YAAaW,EACTL,GAAU,UACV,MACN,CACF,EI3DA,OAAS,SAAAhM,GAAO,iBAAAwF,GAAe,YAAAtD,OAAgB,6BAC/C,OAAS,sBAAAqK,OAA0B,uCCHnC,OAAgC,WAAA/M,OAAe,QAC/C,OAAS,kBAAA2F,OAAsB,gCCD/B,OAAS,iBAAA3D,GAAe,cAAAC,OAAkB,QAgBnC,IAAM+K,GAAgBhL,GAC3B,CAAC,CACH,EAEaiL,EAAmB,IACvBhL,GAAW+K,EAAa,EDO7B,cAAAjM,OAAA,oBApBG,IAAMmM,GACXhM,GACG,CACH,GAAM,CAAE,OAAAyC,EAAQ,SAAAwJ,CAAS,EAAIjM,EACvBkM,EAAazH,GAAe,EAAEhC,CAAM,EACpC0J,EAAgBrN,GAA4B,KACzC,CACL,OAAQ2D,EACR,QAASyJ,EAAW,SAAS,EAC7B,SAAUA,EAAW,UAAU,EAC/B,UAAWA,EAAW,WAAW,EACjC,WAAYA,EAAW,YAAY,EACnC,KAAMA,EAAW,MAAM,EACvB,MAAOA,EAAW,OAAO,EACzB,OAAQA,EAAW,EACnB,UAAWA,EAAW,WAAW,EACjC,UAAWA,EAAW,WAAW,CACnC,GACC,CAACzJ,EAAQyJ,CAAU,CAAC,EACvB,OACErM,GAACiM,GAAc,SAAd,CAAuB,MAAOK,EAC5B,SAAAF,EACH,CAEJ,EEhCA,OAAS,WAAAnN,GAAS,UAAA6C,OAAc,QAChC,OAAS,kBAAA5C,OAAsB,+BAE/B,OACE,OAAAS,GACA,MAAAkC,GACA,WAAArC,GACA,QAAAD,GACA,aAAAgN,GAEA,QAAAlN,GACA,WAAAmN,OACK,6BACP,OAAS,0BAAAC,OAA8B,sCACvC,OAA0B,oBAAAC,OAAwB,mCAClD,OAAS,WAAA5M,OAAe,gCCdxB,OAAS,kBAAAZ,OAAsB,+BAC/B,OACE,SAAAO,GACA,UAAAL,GACA,MAAAyC,GACA,WAAArC,GACA,QAAAD,GACA,SAAAoN,GACA,kBAAAC,GACA,gBAAA3I,GACA,eAAAC,GACA,QAAA7E,GACA,mBAAAK,OACK,6BCdP,OAAS,kBAAAR,OAAsB,+BAC/B,OAAS,QAAAK,GAAM,UAAAsN,GAAQ,QAAAxN,OAAY,6BAc/B,mBAAAU,GACE,OAAAC,GAWE,QAAAC,OAZJ,oBAJG,IAAM6M,GAAkB3M,GAA+B,CAC5D,GAAM,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAE7B,OACEe,GAAAF,GAAA,CACE,UAAAC,GAAC6M,GAAA,CACC,QAAO,GACP,UAAW,EACX,MAAO,CAAC1M,EAAM,KAAK,EACnB,MAAM,UACN,cAAgB0D,GAAU,CACxB1D,EAAM,cAAc0D,EAAM,CAAC,CAAC,CAC9B,EACF,EACA5D,GAACV,GAAA,CAAK,MAAO,OAAQ,QAAS,UAC5B,UAAAS,GAACX,GAAA,CAAK,MAAM,UAAU,KAAK,MAAO,YAAGc,EAAM,KAAK,IAAI,EACpDF,GAACV,GAAA,CAAK,IAAK,EAAG,QAASY,EAAM,MAAO,UAAU,qBAC5C,UAAAH,GAACX,GAAA,CAAK,KAAK,MAAM,MAAM,UACpB,SAAAiB,EAAE,YAAY,EACjB,EACAN,GAACX,GAAK,QAAL,CACC,UAAW,GACX,KAAK,MACL,GAAIc,EAAM,QACV,QAAS,GAER,SAAAA,EAAM,IACT,GACF,GACF,GACF,CAEJ,EDWI,OAiCA,YAAAJ,GAjCA,OAAAC,EAcE,QAAAC,OAdF,oBAhCG,IAAM8M,GAAsD5M,GAAU,CAC3E,GAAM,CACJ,KAAA6M,EACA,QAAAC,EACA,MAAAC,EACA,SAAAC,EACA,UAAAC,EACA,aAAAC,EACA,WAAAC,EACA,cAAAC,EACA,SAAA/M,EACA,MAAAC,EACA,WAAA+M,EACA,cAAAC,EACA,iBAAAC,EACA,SAAAC,EACA,cAAAC,EACA,SAAAC,EACA,OAAAC,EACA,MAAAC,CACF,EAAI5N,EACE,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvB8O,EACF1N,EADUsN,EACR,wBACA,sBADuB,EAGvBK,EACF3N,EADcsN,EACZ,8BACA,4BAD6B,EAG7BM,EAAYH,EAChB/N,EAACP,GAAA,CAAM,MAAM,UAAU,KAAK,KACzB,SAAAa,EAAE,YAAY,EACjB,EAEAN,EAACP,GAAA,CAAM,MAAM,SAAS,KAAK,KACxB,SAAAa,EAAE,aAAa,EAClB,EAGI6N,GACJlO,GAACV,GAAA,CAAK,MAAO,OAAQ,QAAS,UAC5B,UAAAS,EAACX,GAAK,UAAL,CAAe,KAAM,SAAU,SAAQ,GACrC,SAAAwO,EAAS,OACZ,EACA5N,GAACV,GAAA,CAAK,IAAK,EACT,UAAAS,EAACP,GAAA,CAAM,MAAM,UAAU,KAAK,KACzB,SAAAwO,EACH,EACCC,GACH,GACF,EAGIE,EACJnO,GAACV,GAAA,CAAK,MAAO,OAAQ,QAAS,UAC5B,UAAAS,EAACX,GAAA,CAAK,UAAW,GAAK,SAAAiB,EAAE,kBAAkB,EAAE,EAC5CN,EAACX,GAAK,QAAL,CAAa,GAAI8N,EAAU,OAAQlN,GAACZ,GAAA,CAAK,UAAW,GAAI,cAAE6N,GAAM,EAC9D,SAAAW,EAAS,WACZ,GACF,EAGIQ,EAAY,CAACT,GACjB5N,EAAAD,GAAA,CACE,SAAAE,GAACV,GAAA,CAAK,MAAO,OAAQ,UAAW,SAAU,IAAK,EAC7C,UAAAS,EAAC2M,GAAM,QAAN,CACC,OAAQrM,EAAE,cAAc,EACxB,OAAQ4M,EACR,MAAM,QACN,UAAS,GACT,aAAa,MACb,UAAU,UACV,WAAY,CACVN,GAAe,gBACfA,GAAe,YAAYO,CAAQ,CACrC,EACA,iBAAiB,aACjB,QAASM,EACT,MAAOA,EAAgB,SAAW,OAClC,MAAOhN,EACP,cAAeN,EAAM,kBACrB,WAAY,CACV,OAAQ,4BACR,OAAQ,4BACR,KAAM0B,GACJ,iCACA4L,EAAgB,qBAAuB,MACzC,CACF,EACF,EACAzN,EAAC2M,GAAM,QAAN,CACC,OAAQrM,EAAE,iBAAiB,EAC3B,OAAQ0M,EACR,MAAM,QACN,UAAS,GACT,aAAa,MACb,UAAU,UACV,WAAY,CACVJ,GAAe,gBACfA,GAAe,YAAYK,CAAO,CACpC,EACA,iBAAiB,aACjB,QAASS,EACT,MAAOA,EAAmB,SAAW,OACrC,MAAOlN,EACP,OAAQ,IAAML,EAAM,yBAAyBK,CAAQ,EACrD,cAAeL,EAAM,eACrB,WAAY,CACV,OAAQ,4BACR,OAAQ,4BACR,KAAM0B,GACJ,iCACA6L,EAAmB,qBAAuB,MAC5C,CACF,EACF,GACF,EACF,EAGIY,EACJtO,EAAC8M,GAAA,CACC,MAAO3M,EAAM,YACb,cAAeA,EAAM,oBACrB,QAAS8M,EACT,IAAKa,EACL,MAAO3N,EAAM,MACf,EAGIoO,EACJtO,GAACV,GAAA,CAAK,MAAO,OAAQ,IAAK,EAAG,GAAI,EAC/B,UAAAS,EAACZ,GAAA,CAAO,UAAS,GAAC,MAAM,YAAY,QAASe,EAAM,aAChD,SAAAG,EAAE,eAAe,EACpB,EAEAN,EAACN,GAAA,CACC,UAAS,GACT,SAAU8N,GAAcG,EACxB,QAASH,EACT,QAAUjH,GAAM,CACdA,EAAE,gBAAgB,EAClBA,EAAE,eAAe,EACjBpG,EAAM,gBAAgB,CACxB,EAEC,SAAAG,EAAE,gBAAgB,EACrB,GACF,EAGF,OACEL,GAAAF,GAAA,CACE,UAAAC,EAACZ,GAAA,CACC,QAAQ,WACR,MAAM,YACN,KAAK,KACL,UAAU,8BACV,QAAUmH,GAAM,CACdA,EAAE,gBAAgB,EAClBA,EAAE,eAAe,EACjB8G,EAAa,EAAI,CACnB,EAEC,SAAAW,EACH,EAEAhO,EAACkE,GAAA,CAAY,MAAO8J,EAAO,KAAMZ,EAAW,aAAcC,EACxD,SAAApN,GAACV,GAAA,CACC,UAAW,SACX,IAAK,EACL,MAAO,OACP,UAAW,QACX,UAAU,cAET,UAAA4O,GACDnO,EAACR,GAAA,CAAQ,UAAU,aAAa,EAC/B4O,EACAC,EACAC,EACAC,GACH,EACF,EAEAvO,EAACiE,GAAA,CAAa,KAAMqJ,EAAY,aAAcC,EAAe,KAAK,KAC/D,SAAAK,EACC5N,EAACa,GAAA,CACC,KAAMmM,EACN,SAAUxM,EACV,WAAYgN,EACZ,QAASrN,EAAM,cACf,UAAWA,EAAM,UACjB,cAAa,GACf,EAEAH,EAACe,GAAA,CACC,KAAMiM,EACN,QAASG,EACT,SAAU3M,EACV,MAAOC,EACP,WAAY+M,EACZ,MAAOrN,EAAM,eACb,QAASA,EAAM,cACf,UAAWA,EAAM,UACjB,cAAa,GACf,EAEJ,GACF,CAEJ,EEzOA,OAAS,kBAAAjB,OAAsB,+BAC/B,OAAS,aAAAsP,OAAiB,gCAC1B,OACE,UAAApP,GACA,MAAAyC,GACA,WAAArC,GACA,QAAAD,GACA,SAAAoN,GACA,kBAAAC,GACA,kBAAA6B,GACA,eAAAC,GACA,kBAAAC,GACA,UAAAC,GACA,gBAAA3K,GACA,QAAA5E,OACK,6BAkCH,OAyHA,YAAAU,GAnHQ,OAAAC,EANR,QAAAC,OAAA,oBAzBG,IAAM4O,GAAuD1O,GAAU,CAC5E,GAAM,CACJ,SAAA0N,EACA,KAAAb,EACA,QAAAC,EACA,SAAAE,EACA,MAAA1M,EACA,SAAAD,EACA,WAAAgN,EACA,WAAAF,EACA,cAAAC,EACA,cAAAK,EACA,YAAAkB,EACA,eAAAC,EACA,OAAAjB,EACA,iBAAAJ,EACA,cAAAD,EACA,iBAAAuB,CACF,EAAI7O,EAEE,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAIvB+P,EACJhP,GAACV,GAAA,CAAK,MAAM,OAAO,IAAK,EAAG,GAAI,EAC7B,UAAAS,EAAC2M,GAAM,QAAN,CACC,IAAKxM,EAAM,iBACX,OAAQG,EAAE,iBAAiB,EAC3B,OACE0O,EACEhP,EAACX,GAAA,CACC,KAAK,MACL,UAAW,GACX,UAAU,8BACV,QAASc,EAAM,iBAEd,SAAAG,EAAE,qBAAqB,EAC1B,EAEA0M,EAGJ,MAAM,QACN,KAAK,KACL,UAAS,GACT,aAAa,MACb,UAAU,UACV,WAAY,CACVJ,GAAe,gBACfA,GAAe,YAAYK,CAAO,CACpC,EACA,iBAAiB,aACjB,QAASS,EACT,MAAOA,EAAmB,SAAW,OACrC,MAAOsB,EAAmB,GAAKxO,EAC/B,OAAQ,IAAML,EAAM,yBAAyBK,CAAQ,EACrD,cAAeL,EAAM,eACrB,WAAY,CACV,OAAQ,4BACR,OAAQ,4BACR,KAAM0B,GACJ,iCACA6L,EAAmB,qBAAuB,MAC5C,CACF,EACF,EACA1N,EAACZ,GAAA,CACC,QAASe,EAAM,MACf,KAAK,KACL,QAAQ,WACR,UAAW0B,GACT,eACAmN,EACI,gFACA,gFACN,EAEC,SAAA1O,EAAE,iBAAiB,EACtB,GACF,EAGI4O,EACJlP,EAAC4O,GAAO,QAAP,CACC,QAAQ,OACR,KAAK,KACL,QAAS,CACP,CACE,MAAOtO,EAAE,4BAA4B,EACrC,MAAOkO,GAAU,KACnB,EACA,CACE,MAAOlO,EAAE,6BAA6B,EACtC,MAAOkO,GAAU,MACnB,CACF,EACA,WAAY,CAEV,QAAS,gDACX,EACA,MAAOrO,EAAM,KACb,cAAgB0D,GAAU,CACxB1D,EAAM,gBAAgB0D,CAAkB,CAC1C,EACA,aAAc,CACZ,MAAO,MACP,UAAW,8BACb,EACF,EAGIsL,EAAgBvB,EAEhBwB,EACJpP,EAAC2M,GAAM,QAAN,CACC,OAAQuC,EACR,KAAK,KACL,UAAS,GACT,aAAa,MACb,UAAU,UACV,WAAY,CACVtC,GAAe,gBACfA,GAAe,YAAYO,CAAQ,CACrC,EACA,iBAAiB,aACjB,QAASM,EACT,MAAOA,EAAgB,SAAW,OAClC,MAAOhN,EACP,cAAeN,EAAM,kBACrB,YAAagP,EAAgB,KAAO,GACpC,SAAUA,EACV,WAAY,CACV,OAAQ,4BACR,OAAQ,4BACR,KAAMtN,GACJ,iCACA4L,EAAgB,qBAAuB,OAEvC0B,EAAgB,mCAAqC,MACvD,CACF,EACF,EAGF,OACElP,GAAAF,GAAA,CACE,UAAAE,GAACyO,GAAA,CAAY,KAAMI,EAAa,aAAcC,EAC5C,UAAA/O,EAAC2O,GAAA,CACC,QAAO,GACP,QAAS,IAAM,CACbI,EAAe,EAAI,CACrB,EAEA,SAAA/O,EAACZ,GAAA,CAAO,QAAQ,WAAW,KAAK,KAAK,MAAM,YACxC,SAAAkB,EAAE,wBAAwB,EAC7B,EACF,EACAN,EAACyO,GAAA,CACC,UAAW5M,GACT,wBACAiN,EAAc,cAAgB,eAChC,EACA,MAAM,MACN,KAAK,MACL,gBAAkBvI,GAAMA,EAAE,eAAe,EAEzC,SAAAtG,GAACV,GAAA,CAAK,KAAM,EAAG,UAAU,SACtB,UAAA0P,EACDjP,EAAC8M,GAAA,CACC,MAAO3M,EAAM,YACb,cAAeA,EAAM,oBACrB,QAAS8M,EACT,IAAKa,EACL,MAAO3N,EAAM,MACf,EACAH,EAACR,GAAA,CAAQ,GAAI,EAAG,UAAW,EAAG,UAAU,aAAa,EACpD4P,EACDpP,EAACK,GAAA,CACC,UAAWF,EAAM,gBACjB,SAAUA,EAAM,eAChB,WAAYqN,EACZ,SAAUrN,EAAM,SAClB,GACF,EACF,GACF,EAEAH,EAACiE,GAAA,CAAa,KAAMqJ,EAAY,aAAcC,EAAe,KAAK,KAC/D,SAAAK,EACC5N,EAACa,GAAA,CACC,KAAMmM,EACN,SAAUxM,EACV,WAAYgN,EACZ,QAASrN,EAAM,cACf,UAAWA,EAAM,UACjB,WAAY,CACV,KAAM,iBACR,EACA,cAAa,GACf,EAEAH,EAACe,GAAA,CACC,KAAMiM,EACN,QAASG,EACT,SAAU3M,EACV,MAAOC,EACP,WAAY+M,EACZ,MAAOrN,EAAM,eACb,QAASA,EAAM,cACf,UAAWA,EAAM,UACjB,cAAa,GACf,EAEJ,GACF,CAEJ,EClPA,OAAS,aAAAyB,OAAiB,6BCA1B,OAAS,eAAAP,GAAa,aAAAU,GAAW,WAAA9C,GAAS,UAAA6C,GAAQ,YAAA0H,OAAgB,QAClE,OAAS,mBAAA6F,GAAiB,SAAAC,OAAa,gCACvC,OAAS,6BAAAC,OAAiC,oCAC1C,OAAS,aAAAf,OAAiB,gCAC1B,OAAS,WAAA1O,OAAe,gCAYjB,IAAM0P,GAA0BrP,GAAoC,CACzE,GAAM,CAACiN,EAAWC,CAAY,EAAI7D,GAAS,EAAK,EAC1C,CAAC8D,EAAYC,CAAa,EAAI/D,GAAS,EAAK,EAC5C,CAACsF,EAAaC,CAAc,EAAIvF,GAAS,EAAK,EAC9C,CAACiG,EAAaC,CAAc,EAAIlG,GAAS,GAAG,EAC5CmG,EAAmB7N,GAAyB,IAAI,EAChD,CAAC8N,CAAY,EAAIP,GAAgB,wBAAyB,EAAI,EAE9D,CACJ,SAAAxB,EACA,SAAAgC,EACA,MAAApP,EACA,SAAAD,EACA,eAAAsP,EACA,WAAAtC,EACA,kBAAAuC,EACA,gBAAAC,EACA,eAAAC,EACA,OAAAC,EACA,SAAAC,EACA,KAAAvE,CACF,EAAIxK,GAAuB,EACrB,CAAE,SAAA+L,GAAU,QAAAF,EAAS,KAAAD,EAAM,MAAAE,CAAM,EAAIhB,EAAiB,EACtD,CAAE,YAAAkE,CAAY,EAAIb,GAA0BW,CAAM,EAGlDnC,EAAQF,EAAS,aAAe,EAGhCC,EAAS,KAAK,IAAID,EAAS,YAAY,EAGvCwC,GAAYlQ,EAAM,MAAQyL,EAE1BgC,GAAgByC,KAAc7B,GAAU,OAExCQ,GAAmBlB,GAAQ,SAAS,IAAMtN,EAAS,SAAS,EAElEuB,GAAU,IAAM,CAEVqL,GACF4C,EAAgB7P,EAAM,IAAiB,CAE3C,EAAG,CAACA,EAAM,KAAMiN,CAAS,CAAC,EAU1B,GAAM,CAAE,cAAAK,GAAe,iBAAAC,EAAiB,EAAIzO,GAAQ,KAC3C,CACL,cAAemR,EAAY,aAAa,EACxC,iBAAkBA,EAAY,gBAAgB,CAChD,GAEC,CAACF,CAAM,CAAC,EAELvC,GAAW,CAAC,EAAEF,IAAiBC,IAE/B4C,GAA2BjP,GAC9BwC,IAAkB,CACjB,GAAIsM,GAAYA,EAAW,EAAG,CAE5B,IAAMI,GAAYjB,GAAM,aAAazL,GAAOsM,CAAQ,GAAKtM,GACzDoM,EAAeM,EAAS,CAC1B,CACF,EACA,CAACJ,EAAUF,CAAc,CAC3B,EAEMO,GAAsBnP,GACzBwC,IAAkB,CACjB6L,EAAe7L,EAAK,EAGpB,IAAM4M,GAAM,IAAI3Q,GAAQ+D,EAAK,EAC1B,IAAI,GAAG,EACP,IAAIiK,CAAM,EACV,QAAQb,EAASnN,GAAQ,UAAU,EAEtCwQ,GAAyBG,EAAG,CAC9B,EACA,CAAC3C,EAAQb,EAASqD,EAAwB,CAC5C,EAEAvO,GAAU,IAAM,CACd,IAAM0O,GAAM,KAAK,IAAI,OAAOjQ,GAAY,CAAC,EAAGsN,CAAM,EAE5CQ,GAAS,IAAIxO,GAAQ2Q,EAAG,EAC3B,IAAI3C,CAAM,EACV,IAAI,GAAG,EACP,gBAAgB,EAAGhO,GAAQ,UAAU,EACrC,SAAS,EAEZ4P,EAAepB,EAAM,CACvB,EAAG,CAAC9N,CAAQ,CAAC,EAEb,IAAMkQ,GAAQrP,GAAY,IAAM,CAC9B4O,EAAenC,GAAQ,SAAS,CAAC,CACnC,EAAG,CAACA,EAAQmC,CAAc,CAAC,EAErBU,GAAYtP,GAAY,IACrBwO,EAAS,EAAE,KAAMe,IAAQ,CAC9BvD,EAAa,EAAK,EAClBE,EAAc,EAAK,EACnBwB,EAAe,EAAK,CACtB,CAAC,EACA,CAACc,CAAQ,CAAC,EAEPgB,GAAkBxP,GAAY,IAC7BuO,GAGLrC,EAAc,EAAI,EACX,QAAQ,QAAQ,GAHdoD,GAAU,EAIlB,CAACA,GAAWf,CAAY,CAAC,EAEtBkB,GAAezP,GAAY,IAAM,CACrCgM,EAAa,EAAK,CACpB,EAAG,CAAC,CAAC,EAEC0D,GAAgB1P,GAAY,IAAM,CACtCkM,EAAc,EAAK,CACrB,EAAG,CAAC,CAAC,EAECyD,GAAiB3P,GAAY,IAAM,CACvC0N,EAAe,EAAK,CACtB,EAAG,CAAC,CAAC,EAGCkC,GAAmB5P,GAAY,IAAM,CACzC4O,EAAe,GAAG,EAClBN,EAAiB,SAAS,MAAM,EAEhC,WAAW,IAAM,CACfA,EAAiB,SAAS,kBAAkB,EAAG,CAAC,CAClD,EAAG,CAAC,CACN,EAAG,CAACM,CAAc,CAAC,EAEnB,MAAO,CACL,SAAApC,EACA,eAAAiC,EACA,SAAA3C,GACA,QAAAF,EACA,KAAAD,EACA,MAAAE,EACA,MAAAzM,EACA,SAAAD,EACA,WAAAgN,EAEA,UAAAmD,GACA,gBAAAE,GACA,kBAAAd,EACA,eAAAE,EACA,yBAAAK,GACA,gBAAAN,EAEA,YAAAP,EACA,oBAAAe,GAEA,cAAA/C,GACA,iBAAAC,GACA,SAAAC,GACA,cAAAC,GAEA,OAAAE,EACA,MAAA4C,GACA,MAAA3C,EACA,iBAAAiB,GACA,KAAMqB,GACN,iBAAAV,EACA,iBAAAsB,GAEA,UAAA7D,EACA,aAAA0D,GACA,aAAAzD,EAEA,WAAAC,EACA,cAAAC,EACA,cAAAwD,GAEA,YAAAjC,EACA,eAAAC,EACA,eAAAiC,EACF,CACF,ED9LW,cAAAhR,OAAA,oBALJ,IAAMkR,GAAuB/Q,GAAoC,CACtE,IAAMyG,EAAQ4I,GAAuBrP,CAAK,EACpC,CAAE,SAAA4C,CAAS,EAAInB,GAAU,EAE/B,OAAImB,EACK/C,GAAC+M,GAAA,CAAqB,GAAGnG,EAAO,EAGlC5G,GAAC6O,GAAA,CAAsB,GAAGjI,EAAO,CAC1C,EEnBA,OAAS,mBAAAyI,GAAiB,uBAAA8B,OAA2B,gCACrD,OAAS,kBAAAjS,OAAsB,+BAE/B,OACE,oBAAAkS,GACA,MAAAvP,GACA,YAAAwP,GACA,QAAAhS,GACA,aAAAuC,OACK,6BACP,OAAS,SAAA0P,OAAa,6BACtB,OACE,uBAAAC,GACA,sBAAAC,GACA,gBAAAC,GACA,eAAAC,GACA,qBAAAC,OACK,kCACP,OAAS,WAAA7R,OAAe,gCAQpB,cAAAE,GAyFA,QAAAC,OAzFA,oBAWG,IAAM2R,GAAe,IAAM,CAChC,GAAM,CAAE,SAAA/D,EAAU,OAAAgE,EAAQ,QAAAnR,EAAS,UAAAoR,CAAU,EAAI1Q,GAAuB,EAClE,CAAE,SAAA2B,CAAS,EAAInB,GAAU,EAY/B,OAQE5B,GAACqR,GAAA,CACC,QAnBW,IAAM,CACnB,IAAMU,EAAWhP,EAAW4O,GAAoBH,GAChDF,GAAM,KAAKS,EAAU,CACnB,MAAOD,EACP,SAAUjE,EACV,OAAQgE,EACR,QAASnR,CACX,CAAC,CACH,EAYI,QAAS,EACT,UAAU,+CACV,KAAM,GACR,CAGJ,EAEasR,GAAW7R,GAA0C,CAChE,GAAM,CAAE,SAAA0N,EAAU,OAAAgE,EAAQ,QAAAnR,EAAS,UAAAoR,CAAU,EAAI1Q,GAAuB,EAClE,CAAC6Q,CAAW,EAAI5C,GAAgB,wBAAyB,EAAI,EAC7D,CAAE,EAAA/O,CAAE,EAAIpB,GAAe,EACvB,CAAE,SAAA6D,CAAS,EAAInB,GAAU,EACzBsQ,EAAQ,IAAM,CAClB,IAAMH,EAAWhP,EAAW2O,GAAcD,GACpCU,EAAc,CAClB,OAAQtE,EAAS,OACjB,OAAQgE,EACR,QAASnR,EACT,UAAW,GACX,aAAcP,EAAM,YACtB,EACAmR,GAAM,KAAKS,EAAUI,CAAW,CAClC,EACA,OACEnS,GAACX,GAAA,CACC,UAAWwC,GACT,4CACAkB,GAAY,2BACd,EACA,QAASmP,EAER,SAAA5R,EAAE,UAAU,EACf,CAEJ,EAQa8R,GAAiBjS,GAA8B,CAC1D,GAAM,CAAE,OAAAyC,EAAQ,SAAAyP,CAAS,EAAIlS,EAEvBmS,EAAY,IAAM,CACtBhB,GAAM,KAAKnR,EAAM,QAAS,CACxB,OAAAyC,EACA,YAAayP,CACf,CAAC,CACH,EAEA,OACEpS,GAAC,OACC,UAAW4B,GACT,mDACA,iEACA,0DACF,EACA,QAASyQ,EAET,UAAAtS,GAACX,GAAA,CAAK,iBAAK,EACVgT,EACCrS,GAACX,GAAK,QAAL,CAAa,GAAI,EAAG,GAAIS,GAAQ,WAAY,KAAK,MAAM,KAAK,IAC1D,SAAAuS,EACH,EAEArS,GAACuS,GAAA,CAAgB,OAAQ3P,EAAQ,EAEnC5C,GAACoR,GAAA,CACC,KAAM,GACN,QAAS,EACT,UAAU,4BACZ,GACF,CAEJ,EAGamB,GAAkB,CAAC,CAAE,OAAA3P,CAAO,IAA0B,CACjE,IAAMyP,EAAWlB,GAAoBvO,CAAM,EAE3C,OACE5C,GAACX,GAAK,QAAL,CAAa,GAAI,EAAG,GAAIS,GAAQ,WAAY,KAAK,MAAM,KAAK,IAC1D,SAAAuS,GAAY,EACf,CAEJ,ECrJA,OAAS,QAAAhT,OAAY,6BACrB,OAAS,WAAAS,OAAe,gCCDxB,OAAS,kBAAAZ,OAAsB,+BAC/B,OAAS,aAAAsP,OAAiB,gCAC1B,OACE,iBAAAgE,GACA,MAAA3Q,GACA,uBAAA4Q,GACA,qBAAAC,GACA,oBAAAC,GACA,oBAAAC,GACA,uBAAAC,GACA,SAAAlG,GACA,kBAAAC,OACK,6BASH,OAoBU,OAAA5M,GApBV,QAAAC,OAAA,oBCrBJ,OAAS,aAAA8B,GAAW,YAAAyH,OAAgB,QACpC,OAAS,SAAA8F,OAAa,gCACtB,OAAS,kBAAApQ,OAAsB,+BAC/B,OACE,eAAAwP,GACA,kBAAAD,GACA,kBAAAE,GACA,QAAApP,GACA,QAAAF,GACA,UAAAwN,GACA,UAAAzN,GACA,kBAAAwN,OACK,6BACP,OAAS,SAAAD,OAAa,6BACtB,OAAS,WAAA7M,OAAe,gCAqChB,cAAAE,GA2BE,QAAAC,OA3BF,oBF1CJ,cAAAD,OAAA,oBAHG,IAAM8S,GAAkBjP,GAAkB,CAC/C,IAAMwI,EAAaH,EAAiB,EACpC,OACElM,GAACX,GAAK,QAAL,CACC,GAAIgN,EAAW,QACf,GAAIvM,GAAQ,WACZ,QAAS,GACT,SAAQ,GAEP,SAAA+D,EACH,CAEJ,EGjBA,OAAuB,QAAAxE,OAAY,6BAmB/B,cAAAW,OAAA,oBAdG,IAAM+S,GAIR5S,GAAU,CACb,GAAM,CAAE,KAAA6S,EAAO,WAAY,SAAA5G,EAAU,GAAG6G,CAAK,EAAI9S,EAC3CkM,EAAaH,EAAiB,EAEpC,GAAI,CAACG,EAEH,MAAM,IAAI,MAAM,mDAAmD,EAGrE,OACErM,GAACX,GAAK,QAAL,CAAa,GAAI,OAAe,GAAIgN,EAAW2G,CAAI,EAAI,GAAGC,EACxD,SAAA7G,EACH,CAEJ,ECxBA,OAAa,WAAAnN,OAAe,QAC5B,OAAS,kBAAA2F,OAAsB,gCAC/B,OAAS,kBAAA1F,OAAsB,+BAC/B,OAAS,gBAAAgU,OAAoB,gCAC7B,OAAS,MAAArR,GAAI,QAAAtC,GAAM,QAAAF,OAAY,6BAuBA,OA0DvB,YAAAU,GA1DuB,OAAAC,GA2DrB,QAAAC,OA3DqB,oBAnBxB,IAAMkT,GAKPhT,GAAU,CACd,GAAM,CACJ,SAAAiT,EACA,eAAAC,EACA,eAAAC,EACA,UAAAC,EAAY,QACd,EAAIpT,EACE,CAAE,iBAAkBa,EAAO,QAAAN,EAAS,OAAAmR,CAAO,EAAIzQ,GAAuB,EACtEiL,EAAazH,GAAe,EAC5B,CAAE,EAAAtE,CAAE,EAAIpB,GAAe,EAEvBsU,EAAQvU,GAAQ,IAAM,CAC1B,IAAMmN,EAAW,CAAC,EAElB,OAAKpL,GAAO,QAERqS,GACFjH,EAAS,KACPpM,GAACX,GAAK,UAAL,CACC,UAAWwC,GACT,yDACF,EAEA,KAAK,QACL,GAAIwK,EAAWrL,EAAO,MAAM,EAAE,WAAY,CAAC,EAC3C,SAAUqS,EACV,OACE,CAACC,GAAkBC,IAAc,SAC/BvT,GAACX,GAAA,CAAK,UAAW,GAAK,YAAGiB,EAAE,SAAS,CAAC,MAAM,EAE3C,IARC,IAWP,CACF,EAEEgT,GACFlH,EAAS,KACPpM,GAACX,GAAK,UAAL,CAEC,UAAWwC,GACT,wDACF,EACA,KAAM,QACN,GAAIwK,EAAWrL,EAAO,MAAM,EAAE,WAAY,CAAC,EAC3C,OAAQhB,GAACX,GAAA,CAAK,UAAW,GAAK,YAAGiB,EAAE,SAAS,CAAC,MAAM,EAElD,SAAAgT,GARI,IASP,CACF,EAEElH,EAAS,SAAW,EACfpM,GAACgS,GAAA,CAAQ,aAAckB,GAAa,QAAS,GAElD9G,EAAS,SAAW,GAAKmH,IAAc,OACzCnH,EAAS,OAAO,EAAG,EAAGpM,GAACX,GAAA,CAAmB,cAAT,OAAU,CAAO,EAG7C+M,IA5CoBpM,GAACgS,GAAA,CAAQ,aAAckB,GAAa,QAAS,CA6C1E,EAAG,CAACG,EAAgBC,EAAgBtS,GAAO,OAAQV,CAAC,CAAC,EAC/CmT,EAAU,MAAM,QAAQD,CAAK,EAAI,CAAC,CAACA,EAAM,OAAS,CAACA,EACzD,OACEvT,GAACV,GAAA,CAAK,UAAU,gBACd,UAAAS,GAAC,OACC,UAAW6B,GACT,4CACA0R,IAAc,SAAW,eAAiB,wBAC5C,EAEC,SAAAC,EACH,EACCC,GACCxT,GAAAF,GAAA,CACE,UAAAE,GAACZ,GAAA,CAAK,UAAU,4BAA4B,cAAE+T,EAAS,KAAC,EACxDpT,GAAC4R,GAAA,EAAa,GAChB,GAEJ,CAEJ,EC3FA,OAAS,aAAA8B,OAAiB,6BAgBpB,cAAA1T,OAAA,oBAbC,IAAM2T,GAA4CxT,GAClDA,EAAM,eAKTH,GAAC,UACC,KAAK,SACL,QAAU,GAAW,CACnB,EAAE,gBAAgB,EAClBG,EAAM,UAAU,CAClB,EAEA,SAAAH,GAAC0T,GAAA,CAAU,MAAM,QAAQ,QAAS,IAAM,KAAMvT,EAAM,UAAY,GAAI,EACtE,EAZO,KCNX,OAAS,WAAAlB,OAAe,QACxB,OACE,kBAAA2U,GACA,mBAAAC,GACA,uBAAA1C,GACA,kBAAAvM,OACK,gCACP,OAAS,WAAAa,GAAS,aAAAX,OAAiB,+BACnC,OAAS,SAAAwM,OAAa,6BAEtB,OAAS,WAAAxR,OAAe,gCAYjB,IAAMgU,GAAwB3T,GAAoC,CACvE,GAAM,CAAE,SAAA0N,EAAU,eAAAzG,EAAgB,SAAA2M,CAAS,EAAI5T,EACzC,CAAE,gBAAA6T,CAAgB,EAAIH,GAAgB,EACtCpM,EAAc7C,GAAe,EAC7B,CAAE,KAAMkD,CAAY,EAAI8L,GAAe,EAEvCK,EAAUhV,GAAQ,IACf+U,EAAgB,GAAG,KACzB,CAACA,CAAe,CAAC,EAEdE,EAAiB/C,GAAoBtD,EAAS,MAAM,EAEpDsG,EAAmB,IAAM,CAC7B,IAAMC,EAASvG,EAAS,QAAU,EAC5BwG,EAAY,KAAK,IAAIxG,EAAS,cAAc,EAC5CrN,EAAW,KAAK,IAAIqN,EAAS,mBAAmB,EAElDyG,EAEEjI,EAAa5E,EAAYoG,EAAS,MAAM,EACxC0G,EAAUlI,EAAW,UAAU,EAC/BmI,EAAanI,EAAW,YAAY,EAG1C,GACE+H,IAAW,GACX5T,IAAa,GACb6T,IAAc,GACdvM,GAAa,cACbyM,GACAC,EACA,CACA,IAAMpM,EAAWtD,GAAU,SAAStE,EAAU6T,CAAS,EAEjD7L,EAAcqF,EAAS,SACzBA,EAAS,SACT/F,EAAY,aAEVW,EAAMhD,GAAQ,IAAI,CACtB,YAAA+C,EACA,QAAS+L,EACT,WAAYC,EACZ,iBAAkBpM,EAClB,eAAgB,EAChB,iBAAkB,EAAI,CACxB,CAAC,EAEKqM,EAAmB3P,GAAU,iBAAiB,CAClD,YAAatE,EACb,UAAW6T,EACX,IAAK5L,EACL,cAAe2L,CACjB,CAAC,EAEDE,EAAM,IAAIxU,GAAQ2U,EAAmB,GAAG,EAAE,QAAQ,EAAG3U,GAAQ,UAAU,CACzE,CAEA,MAAO,CACL,KAAM+N,EAAS,KACf,IAAKuG,EACL,IAAKE,EACL,UAAWD,EACX,WAAY,KAAK,IAAIxG,EAAS,eAAe,EAC7C,SAAUA,EAAS,eACnB,UAAWA,EAAS,gBACpB,SAAUA,EAAS,mBACrB,CACF,EAgCA,MAAO,CACL,SAAAkG,EACA,eAAA3M,EACA,UAjCgB,IAAM,CACtB,IAAMsN,EAASvU,EAAM,kBACjBgU,EAAiB,EACjB,CACE,KAAMtG,EAAS,aAAe,EAAI,OAAS,QAC3C,IAAKA,EAAS,eACd,IAAK,IAAI/N,GAAQ+N,EAAS,mBAAqB,GAAG,EAAE,QAClD,EACA/N,GAAQ,UACV,EACA,UAAW,KAAK,IAAI+N,EAAS,kBAAkB,EAC/C,UAAWA,EAAS,WACpB,SAAUA,EAAS,UACnB,SAAUA,EAAS,YACrB,EAEJyD,GAAM,KAAKnR,EAAM,QAAS,CACxB,IAAK,CACH,OAAQ,CACN,OAAQ0N,EAAS,OAEjB,SAAUA,EAAS,UAAYqG,EAC/B,GAAGQ,CACL,EACA,QAAAT,EACA,GAAG7M,CACL,CACF,CAAC,CACH,CAMA,CACF,ECpHS,cAAApH,OAAA,oBAFF,IAAM2U,GAAqBxU,GAAkC,CAClE,IAAMyG,EAAQkN,GAAqB3T,CAAK,EACxC,OAAOH,GAAC2T,GAAA,CAAa,GAAG/M,EAAO,CACjC,ECXA,OAAa,WAAA3H,OAAe,QAC5B,OAAS,kBAAA2F,GAAgB,SAAA0K,OAAa,gCACtC,OAAS,kBAAApQ,OAAsB,+BAC/B,OACE,iBAAA0V,GAGA,gBAAA1B,OACK,gCACP,OAAS,MAAArR,GAAI,QAAAtC,GAAM,QAAAF,GAAM,WAAAmN,OAAe,6BAYpC,cAAAxM,EAoCA,QAAAC,OApCA,oBARG,IAAM4U,GAGP1U,GAAU,CACd,GAAM,CAAE,cAAA2U,EAAe,gBAAAC,CAAgB,EAAI5U,EACrC,CAAE,UAAA2R,EAAW,SAAAjE,CAAS,EAAIzM,GAAuB,EAEvD,OACEpB,EAACgV,GAAA,CACC,cAAeF,EACf,gBAAiBC,EACjB,UAAW,SACX,MAAOjD,EACP,SAAUjE,EACV,QAAO,GACT,CAEJ,EAEaoH,GAOP9U,GAAU,CACd,GAAM,CAAE,IAAAsQ,EAAK,MAAAhQ,EAAO,WAAAyU,EAAY,UAAAhH,EAAW,UAAAD,EAAW,WAAA5B,CAAW,EAAIlM,EAC/DgV,EAAM7F,GAAM,WAChB,CACE,IAAAmB,EACA,MAAAhQ,EACA,WAAAyU,EACA,UAAAhH,EACA,UAAAD,CACF,EACA,CACE,OAAQ5B,CACV,CACF,EAEMT,EAAOqC,IAAc2G,GAAc,YAAc,KAAO,KAE9D,OACE3U,GAACV,GAAA,CACC,UAAAS,EAACX,GAAA,CAAK,UAAW,GAAI,UAAU,WAAY,YAAGuM,CAAI,QAAQ,EAC1D5L,EAACX,GAAK,UAAL,CACC,KAAK,QACL,UACE8V,IAAQ,EACJ,4BACAA,EAAM,EACJ,kCACA,gCAER,OAAQnV,EAACX,GAAA,CAAM,SAAA8V,IAAQ,EAAI,GAAKA,EAAM,EAAI,IAAM,IAAI,EACpD,OACEnV,EAACX,GAAA,CAAK,UAAW,GAAI,UAAU,WAAW,gBAE1C,EAEF,YAAG,KAAK,IAAI8V,CAAG,CAAC,GAAG,GACvB,CAEJ,EAEaH,GAQP7U,GAAU,CACd,GAAM,CAAE,UAAAoT,EAAY,MAAO,MAAAvS,EAAO,SAAA6M,CAAS,EAAI1N,EAEzCkM,EAAazH,GAAe,EAC5B,CAAE,EAAAtE,CAAE,EAAIpB,GAAe,EACvBiW,EAAMlW,GAAQ,IAAM,CACxB,IAAMmW,EAAO,CAAC,EAEd,GAAI,CAACjV,EAAM,SAAW,CAACa,GAAS,CAAC6M,EAAU,OAE3C,IAAIrN,EAAWQ,EAAM,SAErB,OAAIR,IAAa,GACXQ,EAAM,aAAa,CAAC,EAAE,OAAS,mBACjCR,EAAWqN,EAAS,cAIlB1N,EAAM,iBACViV,EAAK,KACHpV,EAACiV,GAAA,CAEC,IAAKzU,EACL,MAAOL,EAAM,gBACb,WAAY0N,EAAS,mBACrB,UAAW7M,EAAM,KACjB,UAAW4T,GAAc,YACzB,WAAYvI,EAAWrL,EAAM,MAAM,EAAE,GANhC,IAOP,CACF,EAGIb,EAAM,eACViV,EAAK,KACHpV,EAACiV,GAAA,CAEC,IAAKzU,EACL,MAAOL,EAAM,cACb,WAAY0N,EAAS,mBACrB,UAAW7M,EAAM,KACjB,UAAW4T,GAAc,UACzB,WAAYvI,EAAWrL,EAAM,MAAM,EAAE,GANhC,IAOP,CACF,EAGKhB,EAAC,OAAK,SAAAoV,EAAK,CACpB,EAAG,CACDjV,EAAM,gBACNA,EAAM,cACN0N,GAAU,mBACV7M,GAAO,KACPA,GAAO,SACPA,GAAO,SACT,CAAC,EAEKwS,EAAQvU,GAAQ,IAAM,CAC1B,IAAMmN,EAAW,CAAC,EAElB,GAAI,CAACpL,GAAO,OAAQ,OAAOhB,EAACgS,GAAA,CAAQ,aAAckB,GAAa,KAAM,EAErE,IAAMmC,EAAQ,CAAC,CAAE,SAAAjJ,CAAS,IACjB,CAACjM,EAAM,eAAiBoT,IAAc,SAC3CvT,EAACX,GAAA,CAAK,UAAW,GAAK,SAAA+M,EAAS,EAE/B,GA6CJ,OAzCIjM,EAAM,iBACRiM,EAAS,KACPpM,EAACX,GAAK,UAAL,CACC,UAAWwC,GACT,yDACF,EAEA,KAAK,QACL,GAAIwK,EAAWrL,EAAO,MAAM,EAAE,WAAY,CAAC,EAC3C,SAAUb,EAAM,gBAChB,OACE,CAACA,EAAM,eAAiBoT,IAAc,SACpCvT,EAACX,GAAA,CAAK,UAAW,GAAK,YAAGiB,EAAE,SAAS,CAAC,MAAM,EAE3C,IARC,IAWP,CACF,EAEEH,EAAM,eACRiM,EAAS,KACPpM,EAACX,GAAK,UAAL,CAEC,UAAWwC,GACT,wDACF,EACA,KAAM,QACN,GAAIwK,EAAWrL,EAAO,MAAM,EAAE,WAAY,CAAC,EAC3C,SAAUb,EAAM,cAChB,OACE,CAACA,EAAM,iBAAmBoT,IAAc,SACtCvT,EAACX,GAAA,CAAK,UAAW,GAAK,YAAGiB,EAAE,SAAS,CAAC,MAAM,EAE3C,IAXC,IAcP,CACF,EAGE8L,EAAS,SAAW,EACfpM,EAACgS,GAAA,CAAQ,aAAckB,GAAa,KAAM,GAE/C9G,EAAS,SAAW,GAAKmH,IAAc,OACzCnH,EAAS,OAAO,EAAG,EAAGpM,EAACX,GAAA,CAAmB,cAAT,OAAU,CAAO,EAG7C+M,EACT,EAAG,CAACjM,EAAM,gBAAiBA,EAAM,cAAea,GAAO,OAAQV,CAAC,CAAC,EAE3DgV,EACJtV,EAAC,OACC,UAAW6B,GACT,4CACA1B,EAAM,YAAc,SAChB,eACA,yBACJA,EAAM,SACR,EAEC,SAAAqT,EACH,EAGI+B,EAAW,MAAM,QAAQ/B,CAAK,EAAI,CAAC,CAACA,EAAM,OAAS,CAACA,EAE1D,OAAIrT,EAAM,QAENF,GAACV,GAAA,CAAK,KAAM,EACV,UAAAS,EAACwM,GAAA,CAAQ,QAAS2I,EAAM,SAAAG,EAAQ,EAC/BC,GAAYvV,EAAC4R,GAAA,EAAa,GAC7B,EAIG0D,CACT,ECxOA,OAAS,mBAAAjG,OAAuB,gCAChC,OAAS,WAAA7P,GAAS,QAAAD,GAAM,QAAAF,OAAY,6BACpC,OAAS,kBAAAH,OAAsB,+BAS3B,OAKE,OAAAc,EALF,QAAAC,OAAA,oBAPG,IAAMuV,GAAoCrV,GAAU,CACzD,GAAM,CAACsV,EAAiBC,CAAkB,EAAIrG,GAC5C,kBACA,WACF,EACM,CAAE,EAAA/O,CAAE,EAAIpB,GAAe,EAC7B,OACEe,GAACV,GAAA,CACC,UAAW,SACX,IAAK,EACL,UAAU,4CAEV,UAAAS,EAACX,GAAA,CAAM,SAAAiB,EAAE,oCAAoC,EAAE,EAC/CN,EAACR,GAAA,CAAQ,UAAU,aAAa,EAChCQ,EAAC,OAAI,UAAU,WACZ,SAAAM,EAAE,uCAAuC,EAC5C,EACAN,EAAC2V,GAAA,CACC,MAAOF,EACP,cAAeC,EACjB,GACF,CAEJ,EAEMC,GAA2BxV,GAG3B,CACJ,GAAM,CAAE,MAAA0D,EAAO,cAAA+R,CAAc,EAAIzV,EAC3B,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAG7B,OACEe,GAACV,GAAA,CAAK,IAAK,EACT,UAAAS,EAAC6V,GAAA,CACC,IAAKhS,IAAU,YACf,MAAOvD,EAAE,kBAAkB,EAC3B,MAAO,YACP,cAAesV,EACjB,EACA5V,EAAC6V,GAAA,CACC,IAAKhS,IAAU,YACf,MAAOvD,EAAE,kBAAkB,EAC3B,MAAO,YACP,cAAesV,EACjB,GACF,CAEJ,EAEMC,GAAe1V,GAKf,CACJ,GAAM,CAAE,IAAA2V,EAAK,MAAAC,EAAO,MAAAlS,EAAO,cAAAmS,CAAc,EAAI7V,EAC7C,OACEF,GAACV,GAAA,CACC,QAAUgH,GAAM,CACdyP,EAAcnS,CAAK,EACnB0C,EAAE,gBAAgB,CACpB,EACA,IAAK,EACL,UAAU,qBAET,UAAAuP,EAAM9V,EAACiW,GAAA,EAAQ,EAAKjW,EAACkW,GAAA,EAAU,EAChClW,EAACX,GAAA,CAAK,KAAK,KAAK,UAAWyW,EAAM,GAAK,GACnC,SAAAC,EACH,GACF,CAEJ,EAEME,GAAU,IAEZhW,GAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,eACL,MAAM,6BACN,UAAU,iBAEV,UAAAD,EAAC,QACC,EAAE,qIACF,KAAK,OACL,YAAY,MACd,EACAA,EAAC,UAAO,GAAG,IAAI,GAAG,IAAI,EAAE,QAAQ,GAClC,EAIEkW,GAAY,IAEdlW,EAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BAEN,SAAAA,EAAC,QACC,EAAE,qIACF,KAAK,OACL,YAAY,MACd,EACF,EhB7DQ,cAAAA,EAUA,QAAAC,OAVA,oBArBL,IAAMkW,GAAarQ,GAAyB,CACjD,GAAM,CAAE,4BAAAqB,EAA6B,eAAAC,EAAgB,eAAAC,CAAe,EAClEvB,EACI,CAAE,EAAAxF,CAAE,EAAIpB,GAAe,EACvBkX,EAAoBtU,GAAO,KAAK,IAAI,EAAE,SAAS,CAAC,EA2RtD,OA1Re7C,GACb,IAAM,CACJ,CACE,MAAOqB,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,OACP,MAAO,IACP,OAAQ,CAAC+V,EAAIC,IACJD,EAAG,QAAQ,cAAcC,EAAG,QAAU,EAAE,EAMjD,OAAQ,CAACzS,EAAe0S,IACtBtW,GAACV,GAAA,CAAK,IAAK,EACT,UAAAS,EAACL,GAAA,CACC,MAAO,EACP,OAAQ,GACR,UAAWkC,GACT,iCACA0U,EAAO,aAAe,EAClB,sBACA,mBACN,EACF,EACAtW,GAACV,GAAA,CAAK,UAAU,SAAS,UAAU,QACjC,UAAAS,EAACX,GAAK,UAAL,CAEC,aAAa,YACb,UAAU,qBACV,QAAUkH,GAAM,CACdc,IAAiB,CAAE,OAAQxD,CAAM,CAAe,EAChD0C,EAAE,gBAAgB,EAClBA,EAAE,eAAe,CACnB,EAEC,YAAG1C,EAAM,MAAM,GAAG,EAAE,CAAC,CAAC,QACzB,EACA7D,EAACoS,GAAA,CACC,OAAQvO,EACR,SAAU0S,EAAO,SACjB,QAAS9J,GACX,GACF,GACF,CAEJ,EACA,CACE,MAAOnM,EAAE,iBAAiB,EAC1B,UAAW,eAEX,OAAQ,CAACsK,EAAGC,IACHD,EAAE,aAAeC,EAAE,aAE5B,MAAO,IACP,UAAW,WAMX,OAAQiI,EAUV,EACA,CACE,MAAOxS,EAAE,gBAAgB,EACzB,UAAW,eACX,MAAO,IACP,OAAQ,GACR,UAAW,qBACX,OAASuD,GAGL7D,EAAC+S,GAAA,CAAe,GAAIjT,GAAQ,WAAa,SAAA+D,EAAM,CAGrD,EACA,CACE,MAAOvD,EAAE,kBAAkB,EAC3B,UAAW,aACX,MAAO,IACP,OAAQ,GACR,UAAW,eACX,OAASuD,GAEL7D,EAAC+S,GAAA,CAAe,GAAIjT,GAAQ,WAAa,SAAA+D,EAAM,CAGrD,EACA,CACE,MACE7D,EAACwM,GAAA,CACC,UAAU,iFACV,QAASlM,EAAE,mCAAmC,EAE9C,SAAAN,EAACX,GAAA,CAAM,SAAAiB,EAAE,2BAA2B,EAAE,EACxC,EAEF,MAAO,IACP,OAAQ,GACR,UAAW,gBACX,OAASuD,GACA,OAAOA,CAAK,IAAM,EACvB,KAEA7D,EAAC+S,GAAA,CACC,GAAIjT,GAAQ,WACZ,UAAW,OAAO+D,CAAK,EAAI,EAAI,yBAA2B,GAEzD,SAAAA,GAAS,KACZ,CAGN,EACA,CACE,MACE7D,EAACuM,GAAA,CACC,QAASvM,EAACwV,GAAA,EAAyB,EACnC,KAAK,MACL,MAAM,SACN,UAAU,iCAEV,SAAAxV,EAACX,GAAA,CAAM,SAAAiB,EAAE,sBAAsB,EAAE,EACnC,EAEF,UAAW,iBACX,MAAO,IACP,OAAQ,GACR,KAAM,QACN,aAAc,CACZ,SAAU,EAEZ,EAEA,OAAQ,CAACuD,EAAe0S,IAEpBtW,GAACV,GAAA,CAAK,IAAK,EACT,UAAAU,GAACV,GAAA,CACC,UAAAS,EAACX,GAAK,QAAL,CACC,GAAI8H,EACJ,GAAIrH,GAAQ,WACZ,SAAQ,GACR,UAAU,oBAET,SAAA+D,EACH,EACA7D,EAACX,GAAK,QAAL,CACC,KAAK,cACL,GAAI8H,EACJ,GAAIrH,GAAQ,WACZ,SAAQ,GACR,UAAU,oBACV,OAAO,IACP,OAAO,IAEN,SAAAyW,EAAO,mBACV,GACF,EACAvW,EAAC2U,GAAA,CACC,SAAU4B,EACV,eAAgBnP,EAChB,QAASsF,GACX,GACF,CAGN,EACA,CACE,MAAOpM,EAAE,iBAAiB,EAC1B,UAAW,YACX,MAAO,IACP,OAAQ,CAACkW,EAAWD,IAEhBvW,EAAC6U,GAAA,CACC,cAAe0B,EAAO,YAAY,iBAClC,gBAAiBA,EAAO,YAAY,iBACtC,CAGN,EAEA,CACE,MAAOjW,EAAE,oBAAoB,EAC7B,UAAW,eACX,MAAO,IACP,OAAQ,CAACkW,EAAWD,IAClBvW,EAACmT,GAAA,CACC,SAAUoD,EAAO,eAAe,UAChC,eAAgBA,EAAO,eAAe,iBACtC,eAAgBA,EAAO,eAAe,iBACxC,CAEJ,EACA,CACE,MAAOjW,EAAE,iBAAiB,EAC1B,UAAW,WACX,UAAW,eACX,MAAO,IACP,OAAQ,GACR,OAASuD,GACP7D,EAACX,GAAK,QAAL,CAAa,GAAI8H,EAA8B,SAAAtD,EAAM,CAE1D,EACA,CACE,MACE7D,EAACwM,GAAA,CACC,UAAU,iFACV,QACEvM,GAACV,GAAA,CACC,UAAW,SACX,IAAK,EACL,UAAU,yDAEV,UAAAS,EAAC,QAAM,SAAAM,EAAE,iCAAiC,EAAE,EAC5CN,EAACR,GAAA,CAAQ,UAAU,aAAa,EAChCQ,EAAC,QAAM,SAAAM,EAAE,iCAAiC,EAAE,GAC9C,EAGF,SAAAN,EAACX,GAAA,CAAM,SAAAiB,EAAE,yBAAyB,EAAE,EACtC,EAEF,UAAW,KACX,OAAQ,GACR,MAAO,IACP,KAAM,QACN,OAASuD,GAAkB7D,EAACX,GAAK,QAAL,CAAc,SAAAwE,EAAM,CAClD,EACA,CACE,MAAOvD,EAAE,oBAAoB,EAC7B,UAAW,aACX,MAAO,IACP,OAAQ,CAACuD,EAAO0S,IACdvW,EAACmE,GAAA,CACC,IAAKN,EACL,OAAQ0S,EAAO,OACf,QAASA,EAAO,UAAU,SAAS,EACnC,MAAOH,EAAkB,QAC3B,CAEJ,EAgBA,CACE,MAAO,KACP,UAAW,iBACX,MAAO,QACP,MAAO,GACP,MAAO,QACP,QAAS,CACP,OACEpW,EAACT,GAAA,CAAK,KAAM,EAAG,QAAS,MACtB,SAAAS,EAACkR,GAAA,EAAoB,EACvB,CAEJ,CACF,CACF,EACA,CAAC/J,EAA6BC,EAAgB9G,CAAC,CACjD,CAEF,EiB/TA,OAAS,aAAAkO,OAAiB,gCAC1B,OAAS,MAAA3M,GAAI,WAAArC,GAAS,QAAAD,GAAM,QAAAiC,OAAY,6BCFxC,OAAa,WAAAvC,GAAS,UAAA6C,OAAc,QACpC,OAAS,kBAAA5C,OAAsB,+BAC/B,OAAc,gBAAAgU,OAAoB,gCAClC,OAAS,SAAAzT,GAAO,MAAAoC,GAAI,QAAAtC,GAAM,QAAAiC,GAAM,aAAAC,GAAW,QAAApC,MAAY,6BACvD,OAAS,yBAAAoX,OAA6B,sCACtC,OAAS,yBAAAC,OAA6B,mCACtC,OAAS,WAAA5W,OAAe,gCAiBhB,OACE,OAAAE,EADF,QAAAC,MAAA,oBAVD,IAAM0W,GAAsCxW,GAAU,CAC3D,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX4N,EAAQvK,EAAK,aAAe,EAC5B,CAAE,EAAAlD,CAAE,EAAIpB,GAAe,EAC7B,OACEc,EAACX,EAAK,UAAL,CACC,KAAK,SACL,aAAa,YACb,KAAK,MACL,OACEY,EAAC,OAAI,UAAU,sCACb,UAAAD,EAACP,GAAA,CAAM,MAAOsO,EAAQ,UAAY,SAAU,KAAK,KAC9C,SAAQzN,EAARyN,EAAU,cAAmB,cAAN,EAC1B,EACA/N,EAACoS,GAAA,CACC,OAAQ5O,EAAK,OACb,SAAUA,EAAK,SACf,QAASiT,GACX,GACF,EAEF,SAAQ,GACR,QAAS,IAAM,CACbtW,EAAM,iBAAiB,CAAE,OAAQqD,EAAK,MAAO,CAAe,CAC9D,EAEC,SAAAA,EAAK,OACR,CAEJ,EAEaoT,GAAoCzW,GAAU,CACzD,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAC7B,OACEe,EAACV,GAAA,CAAK,IAAK,EACT,UAAAU,EAACV,GAAA,CAAK,UAAW,SAAU,UAAU,eAAe,UAAW,MAC7D,UAAAU,EAAC,OACC,UAAAD,EAACX,EAAA,CAAK,UAAW,GAAK,SAAAiB,EAAE,sBAAsB,EAAE,EAChDN,EAACX,EAAA,CAAK,UAAW,GAAI,kBAAM,GAC7B,EAEAW,EAACX,EAAK,QAAL,CACC,KAAK,KACL,GAAIc,EAAM,4BACV,GAAIL,GAAQ,WACZ,SAAQ,GACR,UAAU,wBACV,OACEE,EAACX,EAAK,QAAL,CACC,KAAK,cACL,GAAIc,EAAM,4BACV,GAAIL,GAAQ,WACZ,OAAO,IACP,OAAO,IACP,UAAW+B,GACT,WACA2B,EAAK,mBAAqB,EACtB,0BACA,wBACN,EAEC,SAAAA,EAAK,mBACR,EAGD,SAAAA,EAAK,eACR,GACF,EACAxD,EAAC2U,GAAA,CACC,SAAUnR,EACV,eAAgBrD,EAAM,eACtB,QAASuW,GACT,SAAU,GACZ,GACF,CAEJ,EAEaG,GAA8B1W,GAAU,CACnD,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAE7B,OACEc,EAACyB,GAAA,CACC,MAAOnB,EAAE,YAAY,EACrB,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAN,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,QAAS,QAAS,GAAO,SAAQ,GACtD,SAAAqD,EAAK,aACR,EACF,CAEJ,EAEasT,GAAiC3W,GAAU,CACtD,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAE7B,OACEc,EAACyB,GAAA,CACC,MACExB,EAAC,QACE,UAAAK,EAAE,yBAAyB,EAC5BN,EAACX,EAAA,CAAK,UAAW,GAAI,kBAAM,GAC7B,EAEF,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAW,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,SAAU,UAAW,GAC1C,SAAAqD,EAAK,GACR,EACF,CAEJ,EAEauT,GAAmC5W,GAAU,CACxD,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAE7B,OACEc,EAACyB,GAAA,CACC,MAAM,MACN,MACExB,EAAC,QACE,UAAAK,EAAE,iBAAiB,EACpBN,EAACX,EAAA,CAAK,UAAW,GAAI,kBAAM,GAC7B,EAEF,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAW,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,SAAU,UAAW,GAC1C,SAAAqD,EAAK,SACR,EACF,CAEJ,EAEawT,GAAkC7W,GAAU,CACvD,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAE7B,OACEc,EAACyB,GAAA,CACC,MAAOnB,EAAE,gBAAgB,EACzB,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAN,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,SAAU,GAAIL,GAAQ,WAAY,UAAW,GAClE,SAAA0D,EAAK,mBACR,EACF,CAEJ,EAEayT,GAAoC9W,GAAU,CACzD,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAC7B,OACEc,EAACyB,GAAA,CACC,MAAOnB,EAAE,kBAAkB,EAC3B,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAN,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,SAAU,GAAIL,GAAQ,WAAY,UAAW,GAClE,SAAA0D,EAAK,WACR,EACF,CAEJ,EAEa0T,GAAmC/W,GAAU,CACxD,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EACvBiY,EACJ3T,EAAK,eAAiBA,EAAK,cAAgB,EAAIA,EAAK,cAAgB,IAEtE,OACExD,EAACyB,GAAA,CACC,MAAOnB,EAAE,2BAA2B,EACpC,MAAM,MACN,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAN,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,SAAU,GAAIL,GAAQ,WAAY,MAAM,UAC7D,SAAAqX,EACH,EACF,CAEJ,EAEaC,GAAoCjX,GAAU,CACzD,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvBmY,EAAWpY,GAAQ,IAErBuE,EAAK,YAAY,kBAAoB,MACrCA,EAAK,YAAY,kBAAoB,KAE9BxD,EAACgS,GAAA,CAAQ,aAAckB,GAAa,KAAM,EAGjDjT,EAACV,GAAA,CAAK,UAAU,gBACb,UAAAiE,EAAK,YAAY,kBAChBxD,EAACX,EAAK,QAAL,CAAa,MAAM,MACjB,SAAAmE,EAAK,WAAW,iBACnB,EAEDA,EAAK,YAAY,kBAAoB,IACrCA,EAAK,YAAY,kBAChBxD,EAACX,EAAK,QAAL,CAAa,MAAM,OACjB,SAAAmE,EAAK,WAAW,iBACnB,EAEFxD,EAAC4R,GAAA,EAAa,GAChB,EAED,CAACpO,EAAK,UAAU,CAAC,EAEd8T,EAAcrY,GAAQ,IAExBuE,EAAK,eAAe,kBAAoB,MACxCA,EAAK,eAAe,kBAAoB,KAEjCxD,EAACgS,GAAA,CAAQ,aAAckB,GAAa,QAAS,EAGpDjT,EAACV,GAAA,CAAK,UAAU,gBAAgB,UAAW,SACxC,UAAAiE,EAAK,eAAe,kBACnBxD,EAACX,EAAK,QAAL,CAAa,MAAM,MACjB,SAAAmE,EAAK,cAAc,iBACtB,EAEDA,EAAK,eAAe,kBAAoB,IACxCA,EAAK,eAAe,kBACnBxD,EAACX,EAAK,QAAL,CAAa,MAAM,OACjB,SAAAmE,EAAK,cAAc,iBACtB,EAEFxD,EAACX,EAAA,CAAM,aAAImE,EAAK,eAAe,SAAS,IAAI,EAC5CxD,EAAC4R,GAAA,EAAa,GAChB,EAED,CAACpO,EAAK,aAAa,CAAC,EAEvB,OACEvD,EAACuB,GAAA,CAAK,KAAM,EAAG,KAAM,EAAG,IAAK,EAAG,MAAO,OACrC,UAAAvB,EAACV,GAAA,CACC,UAAU,yCACV,UAAW,SACX,UAAW,QAEX,UAAAU,EAACZ,EAAA,CAAM,UAAAiB,EAAE,iBAAiB,EAAE,MAAE,EAC7B+W,GACH,EACApX,EAACV,GAAA,CACC,UAAU,2DACV,UAAW,SACX,UAAW,MAEX,UAAAU,EAACZ,EAAA,CAAM,UAAAiB,EAAE,oBAAoB,EAAE,MAAE,EAChCgX,GACH,GACF,CAEJ,EAEaC,GAAqCpX,GAAU,CAC1D,GAAM,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EACvBkX,EAAoBtU,GAAO,KAAK,IAAI,EAAE,SAAS,CAAC,EACtD,OACE7B,EAACV,GAAA,CAAK,QAAS,MAAO,UAAU,0BAC9B,UAAAU,EAACZ,EAAA,CAAK,UAAW,GAAK,UAAAiB,EAAE,oBAAoB,EAAE,MAAE,EAChDN,EAACmE,GAAA,CACC,IAAKhE,EAAM,KAAK,WAChB,OAAQA,EAAM,KAAK,OACnB,QAASA,EAAM,KAAK,UAAU,SAAS,EACvC,MAAOiW,EAAkB,QAC3B,GACF,CAEJ,ED3RI,OACE,OAAApW,EADF,QAAAC,OAAA,oBARG,IAAMuX,GAIRrX,GAAU,CACb,GAAM,CAAE,UAAAsX,EAAW,GAAGxE,CAAK,EAAI9S,EAEzBgO,EACJlO,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAC/B,UAAAS,EAAC2W,GAAA,CAAa,GAAGxW,EAAO,EACxBH,EAAC4W,GAAA,CAAW,GAAGzW,EAAO,GACxB,EAGIuX,EACJzX,GAACuB,GAAA,CAAK,KAAM,EAAG,KAAM,EAAG,IAAK,EAAG,MAAO,OACrC,UAAAxB,EAAC6W,GAAA,CAAK,GAAG1W,EAAO,EAChBH,EAAC8W,GAAA,CAAQ,GAAG3W,EAAO,EACnBH,EAAC+W,GAAA,CAAU,GAAG5W,EAAO,EACrBH,EAACgX,GAAA,CAAS,GAAG7W,EAAO,EACpBH,EAACiX,GAAA,CAAW,GAAG9W,EAAO,EACtBH,EAACkX,GAAA,CAAU,GAAG/W,EAAO,GACvB,EAGIwX,EACJ1X,GAACuB,GAAA,CAAK,MAAO,OAAQ,IAAK,EAAG,KAAM,EAAG,KAAM,EAC1C,UAAAxB,EAACkR,GAAA,CAAoB,KAAM1C,GAAU,MAAO,EAC5CxO,EAACkR,GAAA,CAAoB,KAAM1C,GAAU,OAAQ,GAC/C,EAGF,OACEvO,GAACV,GAAA,CACC,UAAW,SACX,MAAO,OACP,IAAK,EACL,EAAG,EACH,EAAE,KACF,UAAW,QACX,UAAWsC,GAAG4V,EAAW,eAAe,EAEvC,UAAAtJ,EACDnO,EAACR,GAAA,CAAQ,UAAW,EAAG,UAAU,aAAa,EAC7CkY,EACD1X,EAACoX,GAAA,CAAW,GAAGnE,EAAM,EACrBjT,EAACuX,GAAA,CAAY,GAAGtE,EAAM,EACrB0E,GACH,CAEJ,EE1DO,IAAMC,GAAyBzX,GAAmC,CACvE,IAAMkM,EAAaH,EAAiB,EACpC,MAAO,CACL,GAAG/L,EACH,GAAGkM,CACL,CACF,ECFS,cAAArM,OAAA,oBATF,IAAM6X,GAOR1X,GAAU,CACb,IAAMyG,EAAQgR,GAAsBzX,CAAK,EACzC,OAAOH,GAACwX,GAAA,CAAc,GAAG5Q,EAAO,UAAWzG,EAAM,UAAW,CAC9D,EChBA,OAIE,eAAAkB,GAEA,aAAAU,GACA,WAAA9C,GACA,YAAAuK,OACK,QACP,OAEE,oBAAAsO,GACA,kBAAAlT,OACK,gCACP,OAAS,kBAAA1F,OAAsB,+BAC/B,OAAyB,aAAAsP,OAAiB,gCAC1C,OAAS,SAAAuJ,OAAa,6BAqHd,OAEE,OAAA/X,GAFF,QAAAC,OAAA,oBA7ED,IAAM+X,GAAuD7X,GAAU,CAC5E,GAAM,CAAE,SAAA0N,EAAU,SAAAzB,EAAU,gBAAAvE,CAAgB,EAAI1H,EAC1C,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EACvB,CAACsB,EAAUyX,CAAW,EAAIzO,GAC9B,KAAK,IAAIqE,EAAS,YAAY,EAAE,SAAS,CAC3C,EACM,CAACpN,EAAOyX,CAAQ,EAAI1O,GAAiB,EAAE,EACvC,CAACoC,EAAMuM,CAAO,EAAI3O,GAAoBgF,GAAU,MAAM,EAE5DzM,GAAU,IAAM,CACdkW,EAAY,KAAK,IAAIpK,EAAS,YAAY,EAAE,SAAS,CAAC,CACxD,EAAG,CAACA,EAAS,YAAY,CAAC,EAE1B,IAAMjL,EAASiL,EAAS,OAClBpG,EAAc7C,GAAe,EAC7ByH,EAAa5E,IAAc7E,CAAM,EACjClC,EAAU2L,EAAW,UAAU,EAC/BwF,EAASxF,EAAW,SAAS,EAC7B8D,EAAW9D,EAAW,WAAW,EAEjC,CACJ,KAAA1L,EACA,eAAAmP,EACA,OAAAsI,EACA,WAAY5K,EACZ,OAAA0C,EACA,UAAAmI,CACF,EAAIP,GAAiB,CACnB,SAAAjK,EACA,MAAO,CACL,KAAAjC,EACA,SAAApL,EACA,MAAAC,CACF,CACF,CAAC,EAEKwP,GAAiB5O,GACpBwC,GAAkB,CACjB,IAAMyU,EAAYD,EAChB,CAAC,EACD,iBACAxU,EACAgK,EAAS,WACTxB,EAAW,CACb,EACA4L,EAAYK,EAAU,cAAe,CACvC,EACA,CAACD,EAAW5Q,EAAaoG,EAAS,UAAU,CAC9C,EAEMkC,EAAoB1O,GACvBwC,GAAkB,CACjB,IAAMyU,EAAYD,EAChB,CAAC,EACD,cACAxU,EACAgK,EAAS,WACTxB,EAAW,CACb,EACA6L,EAASI,EAAU,WAAY,CACjC,EACA,CAACD,EAAW5Q,EAAaoG,EAAS,UAAU,CAC9C,EAEMmC,EAAkB3O,GACrBuK,GAAoB,CACnBuM,EAAQvM,CAAI,EAGZsM,EAAStM,IAAS4C,GAAU,MAAQX,EAAS,YAAY,SAAS,EAAI,EAAE,CAC1E,EACA,CAACA,EAAS,UAAU,CACtB,EAEMgC,EAAWxO,GAAY,SAAY,CACvC,GAAI,OAAOb,CAAQ,EAAI6L,EAAW,UAAU,EAAG,CAC7C0L,GAAM,MACJ9X,GAAC,OACE,UAAAK,EAAE,0CAA0C,EAC7CN,GAAC,OAAG,EACJA,GAAC,OAAI,UAAU,mBACZ,SAAAM,EAAE,iDAAkD,CACnD,SAAUE,EACV,OAAQ+X,GAAsB3V,EAAQ,MAAM,EAC5C,YAAayJ,EAAW,UAAU,CACpC,CAAC,EACH,GACF,CACF,EACA,MACF,CAEA,OAAO+L,EAAO,EACX,KAAMxH,GAAQ,CACb,GAAIA,EAAI,QACN,OAAA/I,IAAkB,EACX+I,EAGT,MAAIA,EAAI,SACNmH,GAAM,MAAMnH,EAAI,OAAO,EAGnB,EACR,CAAC,EACA,MAAO4H,IACFA,EAAI,SACNT,GAAM,MAAMS,EAAI,OAAO,EAElB,GACR,CACL,EAAG,CAACJ,CAAM,CAAC,EAEL9L,EAAgBrN,GAAkC,KAC/C,CACL,SAAAuB,EACA,MAAAC,EACA,KAAAmL,EACA,KAAAjL,EACA,SAAAkN,EACA,kBAAAkC,EACA,eAAAE,GACA,gBAAAD,EACA,UAAYnC,EAAiC,YAAY,WACzD,iBAAmBA,EAAiC,eAChD,WACJ,SAAAgC,EACA,WAAArC,EACA,eAAAsC,EACA,QAAApP,EACA,OAAAmR,EACA,SAAA1B,EACA,OAAAD,CACF,GACC,CACD1P,EACAC,EACAmL,EACAjL,EACAkN,EACAkC,EACAE,GACAD,EACAH,EACArC,EACAsC,EACApP,EACAmR,EACA1B,EACAD,CACF,CAAC,EAED,OACElQ,GAACmB,GAAoB,SAApB,CAA6B,MAAOmL,EAClC,SAAAF,EACH,CAEJ,EAEA,SAASmM,GAAsB3V,EAAgB6V,EAAe,OAAQ,CACpE,IAAMC,EAAM9V,EAAO,MAAM,GAAG,EACtBgJ,EAAO8M,EAAI,CAAC,EACZ1L,EAAO0L,EAAI,CAAC,EACZxL,EAAQwL,EAAI,CAAC,EACnB,OAAQD,GAAgB,cACrB,QAAQ,OAAQ7M,CAAI,EACpB,QAAQ,OAAQoB,CAAI,EACpB,QAAQ,QAASE,CAAK,CAC3B,CxB1LY,cAAAlN,OAAA,oBA3BL,IAAM2Y,GAAiDxY,GAAU,CACtE,GAAM,CACJ,4BAAAgH,EACA,eAAAC,EACA,WAAAG,EACA,UAAAvE,EACA,WAAA6F,EACA,eAAAxB,CACF,EAAIlH,EAEEyD,EAAUuS,GAAU,CACxB,4BAAAhP,EACA,eAAAC,EACA,eAAgBC,CAClB,CAAC,EAED,OACErH,GAACgM,GAAA,CACC,QAAShJ,EACT,GAAG,gCACH,QAASY,EACT,SAAQ,GACR,WAAYiF,EACZ,gBAAkB0N,GAAgBA,EAAO,OACzC,mBAAoB,CAACA,EAAaqC,EAAexM,IAE7CpM,GAACmM,GAAA,CAAe,OAAQoK,EAAO,OAC7B,SAAAvW,GAACgY,GAAA,CAAqB,SAAUzB,EAC7B,SAAAnK,EACH,EACF,EAGJ,iBAAkB,GAClB,WAAY7E,EACZ,cAAe,GACf,OAAQpH,EAAM,OACd,YACEA,EAAM,YACF,CACE,QAASA,EAAM,YAAY,QAC3B,KAAMA,EAAM,YAAY,SAC1B,EACA,OAEN,QAAS,CACP,KAAM,uCACR,EACF,CAEJ,EAEa0Y,GAER1Y,GAAU,CACb,GAAM,CACJ,4BAAAgH,EACA,eAAAC,EACA,WAAAyB,EACA,eAAAxB,CACF,EAAIlH,EACJ,OACEH,GAAC2B,GAAA,CACC,UAAU,oEACV,iBAAiB,iBACjB,WAAYkH,EACZ,WAAY,CAACrF,EAAMoV,IACjB5Y,GAACmM,GAAA,CAAe,OAAQ3I,EAAK,OAC3B,SAAAxD,GAACgY,GAAA,CAAqB,SAAUxU,EAC9B,SAAAxD,GAAC6X,GAAA,CACC,KAAMrU,EACN,MAAOoV,EACP,4BAA6BzR,EAC7B,eAAgBC,EAChB,eAAgBC,EAClB,EACF,EACF,EAEJ,CAEJ,EAEayR,GACX3Y,GACG,CACH,GAAM,CACJ,4BAAAgH,EACA,eAAAC,EACA,WAAAG,EACA,UAAAvE,EACA,UAAA+V,EACA,eAAA1R,EACA,gBAAAQ,CACF,EAAI1H,EAEEyD,EAAUuS,GAAU,CACxB,4BAAAhP,EACA,eAAAC,EACA,eAAgBC,CAClB,CAAC,EAEK,CAAE,WAAAwB,EAAa,CAAC,CAAE,EAAIkQ,EAE5B,OACE/Y,GAACgM,GAAA,CACC,SAAQ,GACR,QAAShJ,EACT,GAAG,gCACH,QAASY,EACT,WAAYiF,EACZ,SAAQ,GACR,WAAamQ,GAAQA,EAAI,SACzB,gBAAkBzC,GAAWA,EAAO,GACpC,OAAQ,CAAC0C,EAAQ1C,IAAW,CAE1B,IADiBA,EAAO,UAAY,CAAC,GAAG,OAAS,EAE/C,MAAO,CACL,SACE0C,EAAO,KAAO,SACZjZ,GAACP,GAAA,CAAM,MAAM,UAAU,KAAK,KACzB,SAAA8W,GAAQ,aAAetR,GAAcsR,GAAQ,EAAE,EAClD,EACE,IACR,CAEJ,EACA,mBAAoB,CAACA,EAAaqC,EAAexM,IAC3CmK,EAAO,OAEPvW,GAACmM,GAAA,CAAe,OAAQoK,EAAO,OAC7B,SAAAvW,GAACgY,GAAA,CACC,SAAUzB,EACV,gBAAiB1O,EAEhB,SAAAuE,EACH,EACF,EAGGA,EAET,iBAAkB,GAClB,WAAY7E,EACZ,QAAS,CACP,KAAM,uCACR,EACF,CAEJ,EyBzJS,cAAAvH,OAAA,oBAFF,IAAMkZ,GAA6C/Y,GAAU,CAClE,IAAMyG,EAAQiF,GAAmB1L,CAAK,EACtC,OAAOH,GAAC2Y,GAAA,CAAW,GAAG/R,EAAO,CAC/B,EAEauS,GAAmDhZ,GAAU,CACxE,IAAMyG,EAAQiF,GAAmB1L,CAAK,EACtC,OAAOH,GAAC6Y,GAAA,CAAiB,GAAGjS,EAAO,CACrC,EAEawS,GAAoDjZ,GAAU,CACzE,IAAMyG,EAAQI,GAA0B7G,CAAK,EAC7C,OAAOH,GAAC8Y,GAAA,CAAkB,GAAGlS,EAAO,CACtC,ECnBA,OAAa,WAAA3H,OAAe,QAC5B,OAAS,kBAAAC,OAAsB,+BAC/B,OACE,MAAA2C,GACA,cAAAwX,GACA,QAAA9Z,GACA,QAAAiC,GACA,YAAAG,GACA,QAAAtC,OACK,6BACP,OAAS,sBAAA2M,OAA0B,uCCTnC,OAAS,WAAA/M,OAAe,QACxB,OAA8B,kBAAAqa,OAAsB,gCACpD,OAAS,kBAAApa,OAAsB,+BAE/B,OACE,SAAAO,GACA,OAAAE,GACA,yBAAA4Z,GACA,MAAA1X,GAEA,QAAAtC,EACA,QAAAF,EACA,WAAAmN,OACK,6BACP,OAAyB,oBAAAE,OAAwB,mCACjD,OAAS,mBAAA7M,OAAuB,gCA2BpB,cAAAG,EAoBA,QAAAC,MApBA,oBArBL,IAAMuZ,GAA4BrZ,GAInC,CACJ,GAAM,CAAE,eAAAkH,EAAgB,4BAAAF,CAA4B,EAAIhH,EAClD,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAmJ7B,OAjJeD,GACb,IACE,CAEE,CACE,MAAOqB,EAAE,eAAe,EACxB,UAAW,SACX,MAAO,OACP,MAAO,IACP,OAAQ,CAAC+V,EAASC,IACTD,EAAG,QAAQ,cAAcC,EAAG,QAAU,EAAE,EAEjD,OAAQ,CAACzS,EAAe0S,IACtBvW,EAACyZ,GAAA,CAAW,OAAQlD,EAAQ,eAAgBlP,EAAgB,CAEhE,EAEA,CACE,MAAO/G,EAAE,2CAA2C,EACpD,UAAW,iBACX,MAAO,IACP,OAAQ,CAACuD,EAAe0S,IAAWvW,EAAC0Z,GAAA,CAAS,OAAQnD,EAAQ,CAC/D,EAEA,CACE,MAAOjW,EAAE,iCAAiC,EAC1C,UAAW,SACX,MAAO,IACP,OAAQ,CAACsK,EAAGC,IACND,EAAE,QAAU,MAAQC,EAAE,QAAU,KAAa,IACzCD,EAAE,QAAU,IAAMC,EAAE,QAAU,GAExC,OAAQ,CAAC2L,EAAQD,IACftW,EAACV,EAAA,CAAK,KAAM,EACV,UAAAS,EAAC2Z,GAAA,CACC,OAAQpD,EACR,4BAA6BpP,EAC/B,EACAnH,EAAC2U,GAAA,CACC,SAAU4B,EACV,eAAgBpW,EAAM,eACtB,QAASuM,GACT,kBAAiB,GACnB,GACF,CAEJ,EAEA,CACE,MAAOpM,EAAE,iBAAiB,EAC1B,UAAW,WACX,MAAO,IACP,OAAQ,CAACkW,EAAQD,IAAW,CAC1B,IAAMqD,EACJrD,EAAO,gBAAkB,KACrB,KAAK,IAAIA,EAAO,cAAc,EAC9B,KACA,CAAE,SAAApJ,CAAS,EAAIjB,EAAiB,EACtC,OACElM,EAACX,EAAK,QAAL,CAAa,GAAI8N,EAAU,QAAS,GAClC,SAAAyM,EACH,CAEJ,CACF,EAEA,CACE,MAAOtZ,EAAE,iBAAiB,EAC1B,UAAW,YACX,MAAO,IACP,OAAQ,CAACkW,EAAQD,IAAW,CAC1B,IAAMsD,EACJtD,EAAO,iBAAmB,KACtB,KAAK,IAAIA,EAAO,eAAe,EAC/B,KACA,CAAE,SAAApJ,CAAS,EAAIjB,EAAiB,EACtC,OACElM,EAACX,EAAK,QAAL,CAAa,GAAI8N,EAAU,QAAS,GAClC,SAAA0M,EACH,CAEJ,CACF,EACA,CACE,MAAOvZ,EAAE,oBAAoB,EAC7B,UAAW,0BACX,OAAQ,CAACuD,EAAO0S,IAEZvW,EAACmE,GAAA,CACC,IAAK,CAACN,EACN,OAAQ0S,EAAO,OACf,QAASA,EAAO,eAAe,SAAS,EACxC,MAAOA,EAAO,iBAAiB,SAAS,EAC1C,CAGN,EAEA,CACE,MAAOjW,EAAE,qCAAqC,EAC9C,UAAW,iBACX,MAAO,IACP,OAAQ,GACR,OAAQ,CAACkW,EAAQD,IACfvW,EAACX,EAAK,UAAL,CAAe,KAAM,OAAQ,aAAa,sBACxC,SAAAkX,EAAO,eACV,CAEJ,EAEA,CACE,MAAOjW,EAAE,qCAAqC,EAC9C,UAAW,kBACX,MAAO,IACP,OAAQ,GACR,OAAQ,CAACkW,EAAQD,IACXA,EAAO,iBAAmB,UAAYA,EAAO,gBAE7CvW,EAACX,EAAK,UAAL,CACC,KAAM,OACN,aAAa,sBAEZ,SAAAkX,EAAO,iBAAmB,KAC7B,EAGG,IAEX,EAEA,CACE,MAAOjW,EAAE,sCAAsC,EAC/C,UAAW,mBACX,MAAO,IACP,OAAQ,GACR,OAAQ,CAACkW,EAAQD,IACfvW,EAACX,EAAK,UAAL,CAAe,KAAM,OAAQ,aAAa,sBACxC,SAAAkX,EAAO,iBACV,CAEJ,CACF,EACF,CAACpP,EAA6B7G,CAAC,CACjC,CAGF,EAEamZ,GAActZ,GAGrB,CACJ,GAAM,CAAE,OAAAoW,EAAQ,eAAAlP,CAAe,EAAIlH,EAC7B,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvB4a,EAAO7a,GAAQ,IAAM,CACzB,IAAMsL,EAAoB,CAAC,EAErBwP,EAASxD,EAAO,gBAEhByD,EAAe,IACfD,IAAW,SACNzZ,EAAE,iCAAiC,EACjCyZ,IAAW,iBACbzZ,EAAE,wCAAwC,EAE1CiZ,GAAsBQ,EAAO,QAAQ,IAAK,GAAG,CAAC,EAIzD,OAAAxP,EAAK,KACHvK,EAACP,GAAA,CAEC,MAAOsa,IAAW,SAAW,eAAiB,UAC9C,KAAK,KACL,UAAU,yCAET,SAAAC,EAAa,GALT,UAAUD,CAAM,EAMvB,CACF,EAEIxD,EAAO,OAAS,MAClBhM,EAAK,KACHvK,EAACP,GAAA,CAAkC,MAAO,SAAU,KAAK,KACtD,SAAAa,EAAE,4BAA4B,GADrB,QAAQiW,EAAO,IAAI,EAE/B,CACF,EACSA,EAAO,OAAS,cACzBhM,EAAK,KACHvK,EAACwM,GAAA,CAEC,UAAU,kCACV,MAAO,CAAE,UAAW,iBAAkB,EACtC,QACEvM,EAACV,EAAA,CACC,UAAW,SACX,UAAW,QACX,UAAU,eAET,UAAAgX,EAAO,gBAAkB,MACxBtW,EAACV,EAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,EAAA,CAAK,UAAW,GACd,SAAAiB,EAAE,4CAA4C,EACjD,EACAN,EAACX,EAAA,CAAK,UAAW,GAAK,SAAAkX,EAAO,eAAe,GAC9C,EAEFtW,EAACV,EAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,EAAA,CAAK,UAAW,GACd,SAAAiB,EAAE,4CAA4C,EACjD,EACAL,EAACZ,EAAA,CAAK,MAAM,OACT,UAAAkX,EAAO,eAAiB,GAAK,IAC7B1W,GAAgB0W,EAAO,cAAc,GACxC,GACF,EACAtW,EAACV,EAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,EAAA,CAAK,UAAW,GACd,SAAAiB,EAAE,yCAAyC,EAC9C,EACAL,EAACZ,EAAA,CAAK,MAAM,OACT,UAAAkX,EAAO,mBAAqB,GAAK,IACjC1W,GAAgB0W,EAAO,kBAAkB,GAC5C,GACF,GACF,EAGF,SAAAvW,EAAC,OACC,SAAAA,EAACP,GAAA,CAAM,KAAK,KAAK,MAAM,SAAS,UAAU,qBACxC,SAAAO,EAAC,QAAK,UAAU,uDACb,SAAAM,EAAE,mCAAmC,EACxC,EACF,EACF,GA5CK,QAAQiW,EAAO,IAAI,EA6C1B,CACF,EAGFhM,EAAK,KACHvK,EAACoS,GAAA,CAEC,OAAQmE,EAAO,OACf,SAAUA,EAAO,UAFZ,YAAYA,EAAO,MAAM,EAGhC,CACF,EAEOhM,CACT,EAAG,CAACgM,EAAQjW,CAAC,CAAC,EAEd,OACEL,EAACV,EAAA,CAAK,IAAK,EAAG,OAAQ,GACpB,UAAAS,EAACL,GAAA,CACC,MAAO,EACP,OAAQ,GACR,UAAWkC,GACT,iCACA0U,EAAO,OAAS,OAAS,sBAAwB,mBACnD,EACF,EAEAtW,EAACV,EAAA,CAAK,UAAW,SAAU,UAAW,QACpC,UAAAS,EAACX,EAAK,UAAL,CAEC,aAAa,YACb,UAAU,qBACV,QAAUkH,GAAM,CACdc,IAAiB,CAAE,OAAQkP,EAAO,MAAO,CAAe,EACxDhQ,EAAE,gBAAgB,EAClBA,EAAE,eAAe,CACnB,EAEC,YAAGgQ,EAAO,OAAO,MAAM,GAAG,EAAE,CAAC,CAAC,QACjC,EACAvW,EAACT,EAAA,CAAK,IAAK,EAAI,SAAAua,EAAK,GACtB,GACF,CAEJ,EAEaJ,GAAYvZ,GAA0C,CACjE,GAAM,CAAE,OAAAoW,CAAO,EAAIpW,EAEb,CAAE,QAAA8M,CAAQ,EAAIf,EAAiB,EAErC,OACEjM,EAACV,EAAA,CACC,IAAK,EACL,UAAW,SACX,UAAW,QACX,UAAU,eAEV,UAAAS,EAACX,EAAK,QAAL,CAAa,GAAI4N,EAAS,QAAS,GACjC,cAAK,IAAIsJ,EAAO,mBAAmB,EACtC,EACAvW,EAACX,EAAK,QAAL,CAAa,GAAI4N,EAAS,QAAS,GAAO,UAAU,eAClD,cAAK,IAAIsJ,EAAO,gBAAgB,EACnC,GAEF,CAEJ,EAEaoD,GAAUxZ,GAGjB,CACJ,GAAM,CAAE,OAAAoW,EAAQ,4BAAApP,CAA4B,EAAIhH,EAC1C,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EACvB+a,EAAS1D,EAAO,QAAU,KAAOA,EAAO,OAAS,OAEjD2D,EAAO,IACXla,EAACX,EAAK,QAAL,CACC,GAAI8H,EACJ,MACEoP,EAAO,QAAU,KACbA,EAAO,OAAS,EACd,SACA,OACF,OAEN,UACE0D,GAAU,KACN,GACA,uEAGL,SAAAA,GAAU,KACb,EAGF,OAAI1D,EAAO,QAAU,KAAa2D,EAAK,EAGrCla,EAACwM,GAAA,CAEC,cAAe,IAEf,QACEvM,EAACV,EAAA,CAAK,UAAW,SAAU,UAAW,QAAS,UAAU,eACvD,UAAAS,EAACX,EAAA,CAAK,UAAW,GAAK,SAAAiB,EAAE,iCAAiC,EAAE,EAC3DL,EAACV,EAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,EAAA,CAAK,UAAW,GAAK,SAAAiB,EAAE,oBAAoB,EAAE,EAC9CN,EAACX,EAAA,CACC,MAAOkX,EAAO,cAAgB,EAAI,SAAW,OAC7C,UAAU,qBAET,SAAA1W,GAAgB0W,EAAO,YAAY,EACtC,GACF,EACAtW,EAACV,EAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,EAAA,CAAK,UAAW,GAAK,SAAAiB,EAAE,oBAAoB,EAAE,EAC9CN,EAACX,EAAA,CACC,MAAOkX,EAAO,wBAA0B,EAAI,OAAS,SACrD,UAAU,qBAET,SAAA1W,GAAgB,CAAC0W,EAAO,uBAAuB,EAClD,GACF,EACAtW,EAACV,EAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,EAAA,CAAK,UAAW,GACd,SAAAiB,EAAE,qCAAqC,EAC1C,EACAN,EAACX,EAAA,CACC,MAAOkX,EAAO,YAAc,EAAI,OAAS,SACzC,UAAU,qBAET,SAAA1W,GAAgB,CAAC0W,EAAO,WAAW,EACtC,GACF,GACF,EAEF,UAAU,kCACV,MAAO,CACL,UAAW,iBACb,EAEA,SAAAvW,EAAC,OAAK,SAAAka,EAAK,EAAE,EACf,CAEJ,EAEM9H,GAAiBjS,GAAgD,CACrE,GAAM,CAAE,OAAAyC,EAAQ,SAAAyP,CAAS,EAAIlS,EAE7B,OACEH,EAACP,GAAA,CAAM,MAAM,UAAU,KAAK,KACzB,SAAA4S,EACCrS,EAACX,EAAK,QAAL,CAAa,GAAI,EAAG,KAAK,MAAM,KAAK,IAClC,SAAAgT,EACH,EAEArS,EAACuS,GAAA,CAAgB,OAAQ3P,EAAQ,EAErC,CAEJ,EAEM2P,GAAkB,CAAC,CAAE,OAAA3P,CAAO,IAA0B,CAC1D,IAAMyP,EAAWiH,GAAe1W,CAAM,EAEtC,OACE5C,EAACX,EAAK,QAAL,CAAa,GAAI,EAAG,KAAK,MAAM,KAAK,IAClC,SAAAgT,EACH,CAEJ,ECnbA,OAAS,kBAAAnT,OAAsB,+BAC/B,OAAS,WAAAM,GAAS,QAAAD,GAAM,QAAAiC,GAAM,SAAA8P,GAAO,QAAAjS,OAAY,6BACjD,OAAS,yBAAAqX,OAA6B,mCACtC,OAAS,mBAAA7W,OAAuB,gCCJhC,OAAwB,WAAAZ,OAAe,QACvC,OAAS,kBAAAC,OAAsB,+BAE/B,OACE,SAAAO,GACA,yBAAA8Z,GACA,QAAAha,GACA,SAAA+R,GACA,aAAA7P,GACA,QAAApC,MACK,6BACP,OAAS,mBAAAQ,OAAuB,gCCXhC,OAAS,aAAAkC,GAAW,WAAA9C,GAAS,YAAAuK,OAAgB,QAC7C,OAAS,oBAAA2Q,GAAqC,WAAAC,OAAe,WAC7D,OACE,cAAA3V,GACA,mBAAAE,OAEK,gCACP,OAAS,kBAAAzF,OAAsB,+BAC/B,OAAS,cAAA8F,OAAkB,oCAC3B,OAAS,qBAAAM,OAAyB,gCAElC,OAAS,iBAAAJ,GAAe,aAAAtD,OAAiB,6BCXzC,OAAS,oBAAAuY,GAA2B,YAAAE,OAAyB,WAuBtD,SAASC,EAAiBC,EAAa,CAC5C,GAAIA,GAAQ,KAAM,OAAOA,EAEzB,IAAMC,EAAU,IAAI,KAAKD,CAAI,EAC7B,OAAAC,EAAQ,SAAS,EAAG,EAAG,EAAG,CAAC,EACpBA,CACT,CAEO,SAASC,EAAeF,EAAa,CAC1C,GAAIA,GAAQ,KAAM,OAAOA,EAEzB,IAAMC,EAAU,IAAI,KAAKD,CAAI,EAC7B,OAAAC,EAAQ,SAAS,GAAI,GAAI,GAAI,GAAG,EACzBA,CACT,CAEO,IAAME,GAAyBC,IAAwC,CAC5E,KAAML,EAAiBK,EAAO,IAAI,EAClC,GAAIF,EAAeE,EAAO,IAAMA,EAAO,IAAI,CAC7C,GAEaC,GAAgB,CAACC,EAAaC,IAClCD,EAAM,QAAQ,IAAMC,EAAM,QAAQ,EDPpC,IAAMC,GAA4B5a,GAAgC,CACvE,GAAM,CACJ,eAAAkH,EACA,OAAAzE,EACA,4BAAAuE,EACA,qBAAA2E,EAAuB,EACzB,EAAI3L,EACE,CAAE,MAAAyG,CAAM,EAAInC,GAAW,EAGvB,CAAE,QAAAgH,EAAS,UAAAE,CAAU,EAAIH,GAAW,CACxC,WAAYjC,EACd,CAAC,EAEK,CAAE,OAAA4B,EAAQ,cAAAE,CAAc,EAAIN,GAChCe,EACIL,GAAU,gBACV,OACJK,EACIH,mBAA0C,EAC1C,MACN,EAEM,CAAE,KAAA1I,EAAM,UAAAD,CAAU,EAAI2B,GAC1B/B,EACI,+BAA+BA,CAAM,cACrC,kCACJ,CACE,UAAUK,EAAM,CACd,OAAQA,EAAK,MAAQ,OAAO,IACzBO,GAAkD,CACjD,GACEA,EAAK,cAAgB,MACrBA,EAAK,yBAA2B,MAChCA,EAAK,aAAe,KACpB,CACA,IAAM4Q,EACJ5Q,EAAK,aACLA,EAAK,wBACLA,EAAK,YACP,MAAO,CACL,GAAGA,EACH,OAAQ4Q,CACV,CACF,CACA,OAAO5Q,CACT,CACF,CACF,EACA,kBAAmB,EACrB,CACF,EAEM,CAAE,WAAA+D,EAAY,QAAAC,CAAQ,EAAItC,GAAc,CAC5C,SAAU,EACZ,CAAC,EAEK,CACJ,OAAA6U,EACA,KAAApZ,EACA,UAAAqa,EACA,WAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,SAAAC,CACF,EAAIC,GAAU,EAEdtZ,GAAU,IAAM,CACdyF,EAAQ,CAAC,CACX,EAAG,CAACuS,EAAQpZ,EAAMqa,EAAWC,EAAYrY,CAAM,CAAC,EAEhD,IAAM0Y,EAAarc,GAAQ,IACrBgE,GAAQ,KAAaA,EAElBA,EAAK,OAAQO,GAAS,CAC3B,IAAM+X,EACJ5a,IAAS,MACL,GACA6C,EAAK,KAAK,YAAY,IAAM7C,EAAK,YAAY,EAC7C6a,EACJzB,IAAW,MACP,GACAvW,EAAK,gBAAgB,YAAY,IAAMuW,EAAO,YAAY,EAG1D0B,EAAOjY,GAAM,kBAAoBA,EAAK,eACtCkY,EACJV,EAAU,MAAQA,EAAU,GACxBS,GAAQT,EAAU,KAAK,QAAQ,GAAKS,GAAQT,EAAU,GAAG,QAAQ,EACjE,GAEAW,EAAe/Y,EAASY,EAAK,QAAUZ,EAAS,GAEtD,OAAO2Y,GAAcC,GAAgBE,GAAcC,CACrD,CAAC,EACA,CAAC5B,EAAQpZ,EAAMqa,EAAW/X,EAAML,CAAM,CAAC,EAEpCmJ,EAAgB/G,GAAWsW,EAAY,CAC3C,cACE1U,EAAM,SAAWtB,GAAkB,8BAC/BA,GAAkB,8BAClBA,GAAkB,cACxB,aAAc,CAAC,CACjB,CAAC,EAID,MAAO,CACL,WAHiB+F,EAAcU,GAAiB,CAAC,CAAC,EAIlD,UAAA/I,EACA,eAAAqE,EACA,WAAAE,EACA,YAAA4T,EACA,SAAAC,EACA,OAAAxY,EACA,WAAAqY,EACA,iBAAAC,EACA,4BAAA/T,EACA,OAAAgE,EACA,YAAaW,EACTL,GAAU,gBACV,MACN,CACF,EAEM4P,GAAY,IAAM,CACtB,GAAM,CAAE,CAAE,EAAInc,GAAe,EAEvB,CAAC6a,EAAQ6B,CAAS,EAAIpS,GAC1B,KACF,EACM,CAAC7I,EAAMkb,CAAO,EAAIrS,GACtB,KACF,EACMsS,EAAepB,GAAsB,CACzC,GAAID,EAAe,IAAI,IAAM,EAC7B,KAAMH,EAAiBF,GAAQ,IAAI,KAAQ,EAAE,CAAC,CAChD,CAAC,EAGK,CAACa,EAAYc,CAAa,EAAIvS,GAAiC,EAAE,EAEjE,CAACwR,EAAWgB,CAAY,EAAIxS,GAG/BsS,CAAY,EAETZ,EAAoBe,GAA0B,CAClDF,EAAcE,CAAI,EAClBD,EAAa,CACX,KAAM1B,EAAiBF,GAAQ,IAAI,KAAQ6B,EAAO,CAAC,CAAC,EACpD,GAAIxB,EAAe,IAAI,IAAM,CAC/B,CAAC,CACH,EAEMW,EAAYc,GAAyC,CASzD,GARIA,EAAO,OAAS,QAClBL,EAAQK,EAAO,KAAK,EAGlBA,EAAO,OAAS,UAClBN,EAAUM,EAAO,KAAK,EAGpBA,EAAO,OAAS,YAAa,CAC/B,IAAMC,EAAezB,GAAsBwB,EAAO,KAAK,EAEvD,GADAF,EAAaG,CAAY,EACrBA,EAAa,MAAQA,EAAa,GAAI,CACxC,IAAMC,EACJ,KAAK,IAAIjC,GAAiBgC,EAAa,KAAMA,EAAa,EAAE,CAAC,EAAI,EAoB7DnB,EAnB4D,CAChE,EAAG,CACD,KAAMV,EAAiB,IAAI,IAAM,EACjC,GAAIG,EAAe,IAAI,IAAM,CAC/B,EACA,EAAG,CACD,KAAMH,EAAiBF,GAAQ,IAAI,KAAQ,CAAC,CAAC,EAC7C,GAAIK,EAAe,IAAI,IAAM,CAC/B,EACA,GAAI,CACF,KAAMH,EAAiBF,GAAQ,IAAI,KAAQ,EAAE,CAAC,EAC9C,GAAIK,EAAe,IAAI,IAAM,CAC/B,EACA,GAAI,CACF,KAAMH,EAAiBF,GAAQ,IAAI,KAAQ,EAAE,CAAC,EAC9C,GAAIK,EAAe,IAAI,IAAM,CAC/B,CACF,EAE+B2B,CAAQ,EAErCpB,GACAJ,GAAcI,EAAU,KAAMmB,EAAa,IAAI,GAC/CvB,GAAcI,EAAU,GAAImB,EAAa,EAAE,EAE3CJ,EAAcK,CAAe,EAE7BL,EAAc,IAAI,CAEtB,CACF,CACF,EAEM,CAAE,SAAAhZ,CAAS,EAAInB,GAAU,EAyD/B,MAAO,CACL,YAxDkB3C,GAAQ,IAAa,CACvC,IAAMsc,EAAa,CACjB,KAAM,SACN,KAAM,OACN,QAAS,CACP,CACE,MAAO,EAAE,iBAAiB,EAC1B,MAAO,KACT,EACA,CACE,MAAO,EAAE,YAAY,EACrB,MAAO,MACT,EACA,CACE,MAAO,EAAE,aAAa,EACtB,MAAO,OACT,CACF,EACA,MAAO5a,CACT,EAEM0b,EAAkB,CACtB,KAAM,QACN,KAAM,YACN,MAAOrB,EACP,SAAUV,EAAiBF,GAAQ,IAAI,KAAQ,EAAE,CAAC,EAClD,OAAQK,EAAe,IAAI,IAAM,CACnC,EAEMe,EAAe,CACnB,KAAM,SACN,KAAM,SACN,QAAS,CACP,CACE,MAAO,EAAE,mBAAmB,EAC5B,MAAO,KACT,EACA,CACE,MAAO,EAAE,iCAAiC,EAC1C,MAAO,QACT,EACA,CACE,MAAO,EAAE,wCAAwC,EACjD,MAAO,gBACT,CACF,EACA,MAAOzB,CACT,EAEA,OAAIhX,EACK,CAACwY,EAAYC,CAAY,EAE3B,CAACD,EAAYC,EAAca,CAAe,CACnD,EAAG,CAAC1b,EAAMoZ,EAAQiB,CAAS,CAAC,EAI1B,SAAAI,EACA,KAAAza,EACA,UAAAqa,EACA,OAAAjB,EACA,WAAAkB,EACA,iBAAAC,CACF,CACF,EDtRQ,cAAAlb,EA4CI,QAAAC,OA5CJ,oBAbD,IAAM0W,GAA6CxW,GAAU,CAClE,GAAM,CAAE,KAAAQ,EAAM,OAAAiC,CAAO,EAAIzC,EAAM,KACzB,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EACvB6O,EAAQpN,WAEd,OACEX,EAACX,EAAK,UAAL,CACC,UAAW,GACX,KAAK,SACL,aAAa,YACb,KAAK,KAEL,OACEW,EAACP,GAAA,CAAM,MAAOsO,EAAQ,UAAY,SAAU,KAAK,KAC9C,SAAQzN,EAARyN,EAAU,aAAkB,aAAN,EACzB,EAEF,QAAS,IAAM,CACb5N,EAAM,iBAAiB,CAAE,OAAQyC,CAAO,CAAe,CACzD,EAGC,SAAAA,EACH,CAEJ,EAiBO,IAAM0Z,GAAqDnc,GAAU,CAC1E,GAAM,CAAE,KAAMoW,CAAO,EAAIpW,EACnB,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvBqd,EAAY,IAAM,CACtBjL,GAAM,MAAM,CACV,MAAOhR,EAAE,uBAAuB,EAChC,QACEL,GAACV,GAAA,CACC,UAAW,SACX,MAAO,OACP,IAAK,EACL,UAAU,yCAET,UAAAgX,EAAO,gBAAkB,MACxBtW,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAC/B,UAAAS,EAACX,EAAA,CAAM,SAAAiB,EAAE,4CAA4C,EAAE,EACvDN,EAACX,EAAA,CAAK,UAAW,GAAK,SAAAkX,EAAO,eAAe,GAC9C,EAEFtW,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAC/B,UAAAS,EAACX,EAAA,CAAM,SAAAiB,EAAE,4CAA4C,EAAE,EACvDL,GAACZ,EAAA,CAAK,MAAM,OACT,UAAAkX,EAAO,eAAiB,GAAK,IAC7B1W,GAAgB0W,EAAO,cAAc,GACxC,GACF,EACAtW,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAC/B,UAAAS,EAACX,EAAA,CAAM,SAAAiB,EAAE,yCAAyC,EAAE,EACpDL,GAACZ,EAAA,CAAK,MAAM,OACT,UAAAkX,EAAO,mBAAqB,GAAK,IACjC1W,GAAgB0W,EAAO,kBAAkB,GAC5C,GACF,GACF,CAEJ,CAAC,CACH,EAEMuD,EAAO7a,GAAQ,IAAM,CACzB,IAAMsL,EAAoB,CAAC,EAErBwP,EAASxD,EAAO,gBAEhByD,EAAe,IACfD,IAAW,SACNzZ,EAAE,iCAAiC,EACjCyZ,IAAW,iBACbzZ,EAAE,wCAAwC,EAE1CiZ,GAAsBQ,EAAO,QAAQ,IAAK,GAAG,CAAC,EAIzD,OAAAxP,EAAK,KACHvK,EAACP,GAAA,CAEC,MAAOsa,IAAW,SAAW,eAAiB,UAC9C,KAAK,KAEJ,SAAAC,EAAa,GAJT,CAKP,CACF,EAEIzD,EAAO,OAAS,MAClBhM,EAAK,KACHvK,EAACP,GAAA,CAAc,MAAO,SAAU,KAAK,KAClC,SAAAa,EAAE,4BAA4B,GADrB,CAEZ,CACF,EACSiW,EAAO,OAAS,cACzBhM,EAAK,KACHvK,EAACP,GAAA,CAEC,KAAK,KACL,MAAM,SACN,UAAU,qBACV,QAAS8c,EAET,SAAAvc,EAAC,QAAK,UAAU,uDAEb,SAAAM,EAAE,mCAAmC,EACxC,GATK,CAUP,CACF,EAGKiK,CACT,EAAG,CAACgM,CAAM,CAAC,EAEX,OAAOvW,EAACT,GAAA,CAAK,IAAK,EAAI,SAAAua,EAAK,CAC7B,EAEa0C,GAA2Crc,GAAU,CAChE,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvBud,EACJjZ,EAAK,qBAAuB,KACxB,KAAK,IAAIA,EAAK,mBAAmB,EACjC,KAEN,OACExD,EAACyB,GAAA,CAIC,MAAOzB,EAACX,EAAA,CAAM,SAAAiB,EAAE,iCAAiC,EAAE,EACnD,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAN,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,QAAS,QAAS,GAAO,SAAQ,GAAC,UAAW,GAClE,SAAAsc,EACH,EACF,CAEJ,EAEaC,GAA8Cvc,GAAU,CACnE,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvByd,EACJnZ,EAAK,kBAAoB,KAAO,KAAK,IAAIA,EAAK,gBAAgB,EAAI,KACpE,OACExD,EAACyB,GAAA,CAMC,MAAOzB,EAACX,EAAA,CAAM,SAAAiB,EAAE,oCAAoC,EAAE,EACtD,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAN,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,QAAS,QAAS,GAAO,SAAQ,GAAC,UAAW,GAClE,SAAAwc,EACH,EACF,CAEJ,EAEa3F,GAAyC7W,GAAU,CAC9D,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACXyZ,EACJpW,EAAK,gBAAkB,KAAO,KAAK,IAAIA,EAAK,cAAc,EAAI,KAC1D,CAAE,EAAAlD,CAAE,EAAIpB,GAAe,EAC7B,OACEc,EAACyB,GAAA,CACC,MACExB,GAACV,GAAA,CAAK,IAAK,EACR,UAAAe,EAAE,gBAAgB,EACnBN,EAACX,EAAA,CAAK,UAAW,GAAI,kBAAM,GAC7B,EAEF,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAW,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,SAAU,QAAS,GAAO,SAAQ,GAAC,UAAW,GACnE,SAAAyZ,EACH,EACF,CAEJ,EAEagD,GAA2Czc,GAAU,CAChE,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX0Z,EACJrW,EAAK,iBAAmB,KAAO,KAAK,IAAIA,EAAK,eAAe,EAAI,KAC5D,CAAE,EAAAlD,CAAE,EAAIpB,GAAe,EAC7B,OACEc,EAACyB,GAAA,CACC,MACExB,GAACV,GAAA,CAAK,IAAK,EACR,UAAAe,EAAE,iBAAiB,EACpBN,EAACX,EAAA,CAAK,UAAW,GAAI,kBAAM,GAC7B,EAEF,WAAY,CACV,KAAM,cACN,MAAO,cACT,EAEA,SAAAW,EAACX,EAAK,QAAL,CAAa,GAAIc,EAAM,SAAU,QAAS,GAAO,SAAQ,GAAC,UAAW,GACnE,SAAA0Z,EACH,EACF,CAEJ,EAEagD,GAA0C1c,GAAU,CAC/D,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAE7B,OACEc,EAACyB,GAAA,CACC,MAAOzB,EAACX,EAAA,CAAM,SAAAiB,EAAE,qCAAqC,EAAE,EACvD,WAAY,CACV,KAAM,cACN,MAAO,cACT,EACA,MAAM,MAEN,SAAAN,EAACX,EAAK,UAAL,CACC,UAAW,GACX,aAAa,sBACb,KAAM,OAEL,SAAAmE,EAAK,eACR,EACF,CAEJ,EACasZ,GAA4C3c,GAAU,CACjE,GAAM,CAAE,KAAAqD,CAAK,EAAIrD,EACX,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvBsU,EACJhQ,EAAK,iBAAmB,UAAYA,EAAK,gBACvCxD,EAACX,EAAK,UAAL,CACC,UAAW,GACX,aAAa,sBACb,KAAM,OAEL,SAAAmE,EAAK,gBACR,EAEA,KAGJ,OACExD,EAACyB,GAAA,CACC,MAAOzB,EAACX,EAAA,CAAM,SAAAiB,EAAE,qCAAqC,EAAE,EACvD,WAAY,CACV,KAAM,cACN,MAAO,cACT,EACA,MAAM,MAEL,SAAAkT,EACH,CAEJ,EAEa+D,GAA4CpX,GAAU,CACjE,GAAM,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAC7B,OACEe,GAACV,GAAA,CACC,QAAS,MACT,UAAU,uDAEV,UAAAU,GAACZ,EAAA,CAAK,UAAW,GAAK,UAAAiB,EAAE,oBAAoB,EAAE,MAAE,EAChDN,EAACmE,GAAA,CACC,IAAK,CAAChE,EAAM,KAAK,wBACjB,OAAQA,EAAM,KAAK,OACnB,QAASA,EAAM,KAAK,eAAe,SAAS,EAC5C,MAAOA,EAAM,KAAK,iBAAiB,SAAS,EAC9C,GACF,CAEJ,ED/SI,OAOE,OAAAH,EAPF,QAAAC,OAAA,oBAFG,IAAM8c,GAAqD5c,GAE9DF,GAACV,GAAA,CACC,UAAW,SACX,MAAO,OACP,IAAK,EACL,UAAW,QACX,UAAWY,EAAM,YAAY,KAE7B,UAAAH,EAACgd,GAAA,CAAQ,GAAG7c,EAAO,EACnBH,EAACR,GAAA,CAAQ,UAAW,EAAG,UAAU,aAAa,EAC9CQ,EAACid,GAAA,CAAM,GAAG9c,EAAO,GACnB,EAIS6c,GAAwC7c,GAAU,CAC7D,GAAM,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvBqd,EAAY,IAAM,CACtB,GAAM,CAAE,KAAMhG,CAAO,EAAIpW,EAEzBmR,GAAM,MAAM,CACV,MAAOhR,EAAE,iCAAiC,EAC1C,QACEL,GAACV,GAAA,CACC,UAAW,SACX,MAAO,OACP,IAAK,EACL,UAAU,yCAEV,UAAAU,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,GAAA,CAAK,UAAW,GAAK,SAAAiB,EAAE,oBAAoB,EAAE,EAC9CN,EAACX,GAAA,CAAK,MAAOkX,EAAO,cAAgB,EAAI,SAAW,OAChD,SAAA1W,GAAgB0W,EAAO,YAAY,EACtC,GACF,EACAtW,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,GAAA,CAAK,UAAW,GAAK,SAAAiB,EAAE,oBAAoB,EAAE,EAC9CN,EAACX,GAAA,CACC,MAAOkX,EAAO,wBAA0B,EAAI,OAAS,SAEpD,SAAA1W,GAAgB,CAAC0W,EAAO,uBAAuB,EAClD,GACF,EACAtW,GAACV,GAAA,CAAK,QAAS,UAAW,MAAO,OAAQ,IAAK,EAC5C,UAAAS,EAACX,GAAA,CAAK,UAAW,GACd,SAAAiB,EAAE,qCAAqC,EAC1C,EACAN,EAACX,GAAA,CAAK,MAAOkX,EAAO,YAAc,EAAI,OAAS,SAC5C,SAAA1W,GAAgB,CAAC0W,EAAO,WAAW,EACtC,GACF,GACF,CAEJ,CAAC,CACH,EAEA,OACEtW,GAACV,GAAA,CAAK,IAAK,EAAG,MAAO,OACnB,UAAAU,GAACV,GAAA,CACC,UAAW,SACX,UAAW,QACX,UAAU,aACV,IAAK,EAEL,UAAAS,EAAC2W,GAAA,CAAa,GAAGxW,EAAO,EACxBH,EAACsc,GAAA,CAAqB,GAAGnc,EAAO,GAClC,EACAF,GAACV,GAAA,CAAK,UAAW,SAAU,UAAW,MAAO,UAAU,aACrD,UAAAS,EAACX,GAAA,CAAK,KAAK,MAAM,UAAW,GACzB,SAAAiB,EAAE,iCAAiC,EACtC,EACAL,GAACV,GAAA,CAAK,KAAM,EACV,UAAAS,EAAC,UAAO,QAASuc,EACf,SAAAvc,EAACX,GAAK,QAAL,CAAa,KAAK,KAAK,SAAQ,GAC7B,SAAAc,EAAM,KAAK,QAAU,KACxB,EACF,EAEAH,EAAC2U,GAAA,CACC,SAAUxU,EAAM,KAChB,eAAgBA,EAAM,eACtB,QAASuW,GACT,SAAU,GACV,kBAAiB,GACnB,GACF,GACF,GACF,CAEJ,EAEauG,GAAsC9c,GAE/CF,GAAC,OAAI,UAAU,aACb,UAAAA,GAACuB,GAAA,CACC,KAAM,EACN,KAAM,EACN,MAAO,OACP,IAAK,EACL,UAAU,gCAEV,UAAAxB,EAACwc,GAAA,CAAW,GAAGrc,EAAO,EACtBH,EAAC0c,GAAA,CAAc,GAAGvc,EAAO,EACzBH,EAAC6c,GAAA,CAAU,GAAG1c,EAAO,EACrBH,EAACgX,GAAA,CAAS,GAAG7W,EAAO,EACpBH,EAAC4c,GAAA,CAAW,GAAGzc,EAAO,EACtBH,EAAC8c,GAAA,CAAY,GAAG3c,EAAO,GACzB,EACAH,EAACuX,GAAA,CAAY,GAAGpX,EAAO,GACzB,EI7HG,IAAM+c,GAAgC/c,GAQvC,CACJ,IAAMkM,EAAaH,EAAiB,EAEpC,MAAO,CACL,GAAG/L,EACH,GAAGkM,CACL,CACF,ECJS,cAAArM,OAAA,oBAVF,IAAMmd,GAA6Bhd,GAQpC,CACJ,IAAMyG,EAAQsW,GAA6B/c,CAAK,EAChD,OAAOH,GAAC+c,GAAA,CAAqB,GAAGnW,EAAO,CACzC,EP+BU,cAAA5G,GASE,QAAAC,OATF,oBAxBH,IAAMmd,GAA6Cjd,GAAU,CAClE,GAAM,CAAE,eAAAkH,EAAgB,WAAAE,EAAY,4BAAAJ,CAA4B,EAAIhH,EAC9D8Y,EAASO,GAAyB,CACtC,eAAAnS,EACA,4BAAAF,EACA,eAAgBhH,EAAM,cACxB,CAAC,EAEK,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAEvBme,EAAmCpe,GAAQ,KACxC,CACL,EAAGqB,EAAE,kBAAkB,EACvB,EAAGA,EAAE,kBAAkB,EACvB,GAAIA,EAAE,mBAAmB,EACzB,GAAIA,EAAE,mBAAmB,CAC3B,GACC,CAACA,CAAC,CAAC,EAEN,OACEL,GAACV,GAAA,CAAK,UAAU,SAAS,MAAM,OAAO,OAAO,OAAO,UAAU,QAE5D,UAAAU,GAACV,GAAA,CAAK,IAAK,EACR,UAAAY,EAAM,YAAY,OAAS,GAC1BH,GAACqZ,GAAA,CACC,MAAOlZ,EAAM,YACb,SAAW0D,GAAe,CACxB1D,EAAM,SAAS0D,CAAK,CACtB,EACF,EAED,CAAC,EAAG,EAAG,GAAI,EAAE,EAAE,IAAKA,GAEjB5D,GAAC,UAEC,UAAU,iDAEV,UAAAD,GAAC,OAAI,UAAU,WACb,SAAAA,GAACX,GAAK,SAAL,CACC,MAAOc,EAAM,aAAe0D,EAAQ,QAAU,OAC9C,UAAWhC,GACT,yCACA1B,EAAM,aAAe0D,EACjB,4BACA,EACN,EAEC,SAAAwZ,EAASxZ,CAAK,GAAK,GAAGA,CAAK,IAC9B,EACF,EACA7D,GAAC,OACC,UAAU,8EACV,QAAS,IAAM,CACbG,EAAM,iBAAiB0D,CAAY,CACrC,EACD,IArBI,QAAQA,CAAK,EAsBpB,CAEH,GACH,EAEA7D,GAACgM,GAAA,CACC,QAAS7L,EAAM,UACf,GAAG,gCACH,QAAS8Y,EACT,SAAQ,GACR,WAAY9Y,EAAM,WAClB,gBAAkBoW,GAChB,GAAGA,EAAO,MAAM,IAAIA,EAAO,WAAW,GAExC,mBAAoB,CAACA,EAAaqC,EAAexM,IAC/CpM,GAACmM,GAAA,CAAe,OAAQoK,EAAO,OAAS,SAAAnK,EAAS,EAEnD,iBAAkB,GAClB,WAAY7E,EACZ,cAAe,GACf,OAAQpH,EAAM,OACd,YACEA,EAAM,YACF,CACE,QAASA,EAAM,YAAY,QAC3B,KAAMA,EAAM,YAAY,SAC1B,EACA,OAEN,QAAS,CACP,KAAM,8CACR,EACA,WAAY,CACV,KAAM,4BACR,EACF,GACF,CAEJ,EAEamd,GAKRnd,GAEDF,GAACuB,GAAA,CACC,KAAM,EACN,KAAM,EACN,UAAU,sCACV,IAAK,EAEL,UAAAxB,GAACT,GAAA,CAAK,IAAK,EAAG,EAAG,EAAG,UAAU,iCAC5B,SAAAS,GAACqZ,GAAA,CACC,UAAU,2BACV,MAAOlZ,EAAM,YACb,SAAW0D,GAAe,CACxB1D,EAAM,SAAS0D,CAAK,CACtB,EACF,EACF,EACA7D,GAAC2B,GAAA,CACC,UAAWE,GACT,oEACA1B,EAAM,YAAY,IACpB,EACA,iBAAkB0B,GAAG,iBAAkB1B,EAAM,YAAY,OAAO,EAChE,WAAYA,EAAM,WAClB,WAAY,CAACqD,EAAMoV,IACjB5Y,GAACmM,GAAA,CAAe,OAAQ3I,EAAK,OAC3B,SAAAxD,GAACmd,GAAA,CACC,KAAM3Z,EACN,MAAOoV,EACP,eAAgBzY,EAAM,eACtB,WAAY,CACV,KAAMA,EAAM,YAAY,IAC1B,EACA,eAAgBA,EAAM,eACxB,EACF,EAEJ,GACF,EQjJK,cAAAH,OAAA,oBAJF,IAAMud,GACXpd,GACG,CACH,IAAMyG,EAAQmU,GAAyB5a,CAAK,EAC5C,OAAOH,GAACod,GAAA,CAAiB,GAAGxW,EAAO,eAAgBzG,EAAM,eAAgB,CAC3E,EAEaqd,GAIRrd,GAAU,CACb,GAAM,CAAE,WAAAsd,EAAY,GAAGxK,CAAK,EAAI9S,EAC1ByG,EAAQmU,GAAyB9H,CAAI,EAC3C,OACEjT,GAACsd,GAAA,CACE,GAAG1W,EACJ,WAAY6W,EACZ,eAAgBtd,EAAM,eACxB,CAEJ,ECnCA,OAAa,YAAAqJ,OAAgB,QAC7B,OAAS,kBAAAtK,OAAsB,+BAE/B,OACE,MAAA2C,GACA,cAAAwX,GACA,QAAA9Z,GACA,QAAAiC,GACA,YAAAG,GACA,QAAAtC,GACA,WAAAmN,OACK,6BACP,OAAS,sBAAAR,OAA0B,uCACnC,OAAS,mBAAAnM,OAAuB,gCCbhC,OAAa,WAAAZ,OAAe,QAC5B,OAAS,kBAAAC,OAAsB,+BAE/B,OAAiB,QAAAK,GAAM,QAAAF,GAAM,WAAAmN,OAAe,6BAC5C,OAAS,mBAAA3M,OAAuB,gCAc1B,cAAAG,MAAA,oBAZN,IAAM0d,GAGAvd,GAEFH,EAACwM,GAAA,CACC,UAAU,8BACV,QAASrM,EAAM,QACf,MAAO,CACL,UAAW,iBACb,EAEA,SAAAH,EAAC,UAAO,UAAU,oDACf,SAAAG,EAAM,MACT,EACF,EAISwd,GAAwBxd,GAAc,CACjD,GAAM,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAiK7B,OA/JeD,GACb,IACE,CAEE,CACE,MAAOqB,EAAE,aAAa,EACtB,UAAW,YACX,MAAO,IACP,OAASuD,GACP7D,EAACX,GAAK,UAAL,CAAe,KAAM,OAAQ,aAAa,sBACxC,SAAAwE,EACH,CAEJ,EAEA,CACE,MAAOvD,EAAE,4CAA4C,EACrD,UAAW,iBACX,MAAO,IACP,OAASuD,GAAU7D,EAACX,GAAA,CAAM,SAAAwE,EAAM,CAClC,EAEA,CACE,MAAOvD,EAAE,eAAe,EACxB,UAAW,SAEX,OAAQ,CAACkW,EAAQD,IACfvW,EAACT,GAAA,CAAK,UAAW,SAAU,UAAW,QACnC,SAAAgX,EAAO,mBAAmB,IAAK/S,GAC9BxD,EAACX,GAAK,UAAL,CACC,KAAM,SACN,aAAa,aAGZ,SAAAmE,EAAK,QAFDA,EAAK,MAGZ,CACD,EACH,CAEJ,EAEA,CACE,MAAOlD,EAAE,wCAAwC,EACjD,UAAW,eAEX,OAAQ,CAACkW,EAAQD,IAEbvW,EAACT,GAAA,CAAK,UAAW,SAAU,UAAW,QACnC,SAAAgX,EAAO,mBAAmB,IAAK/S,GAG9BxD,EAAC4d,GAAA,CACC,MAAOpa,EAAK,WACZ,KAAK,SACAA,EAAK,MACZ,CACD,EACH,CAGN,EAEA,CACE,MAAOlD,EAAE,iBAAiB,EAC1B,UAAW,WAEX,OAAQ,CAACkW,EAAQD,IAEbvW,EAACT,GAAA,CAAK,UAAW,SAAU,UAAW,QACnC,SAAAgX,EAAO,mBAAmB,IAAK/S,GAG9BxD,EAAC4d,GAAA,CACC,MAAOpa,EAAK,aACZ,KAAK,QACAA,EAAK,MACZ,CACD,EACH,CAGN,EAaA,CACE,MACExD,EAAC0d,GAAA,CACC,QAASpd,EAAE,2CAA2C,EACtD,MAAOA,EAAE,iDAAiD,EAC5D,EAEF,UAAW,qBAEX,OAASuD,GACA7D,EAACX,GAAK,QAAL,CAAa,KAAK,cAAe,SAAAwE,EAAM,CAGnD,EAGA,CACE,MACE7D,EAAC0d,GAAA,CACC,QAASpd,EAAE,uCAAuC,EAClD,MAAOA,EAAE,6CAA6C,EACxD,EAEF,UAAW,sBACX,MAAO,IACP,OAAQ,CAACud,EAA0BtH,IAE/BvW,EAACT,GAAA,CAAK,UAAW,SAAU,UAAW,QACnC,SAAAgX,EAAO,mBAAmB,IAAK/S,GAG9BxD,EAAC4d,GAAA,CAEC,MAAOpa,EAAK,oBACZ,KAAK,SAFAA,EAAK,MAGZ,CACD,EACH,CAGN,EACA,CACE,MAAO,GACP,UAAW,UACX,MAAO,QACP,MAAO,GACP,OAAQ,CAACgT,EAAQD,EAAyBqC,EAAOkF,IAAQ,CACvD,IAAMC,EAAaD,EAAI,IAAI,cAAc,EAEzC,OACE9d,EAAC,UACC,UAAU,UACV,QAAS,IAAM,CACb8d,EAAI,IAAI,yBAAyB,EAAE,CACrC,EAEA,SAAA9d,EAACge,GAAA,CAAU,UAAWD,EAAa,iBAAmB,GAAI,EAC5D,CAEJ,CACF,CACF,EACF,CAACzd,CAAC,CACJ,CAGF,EAEMsd,GACJzd,GAEOH,EAACX,GAAA,CAAM,SAAAQ,GAAgBM,EAAM,KAAK,EAAE,EAGvC6d,GAGA7d,GAEFH,EAAC,OACC,MAAM,KACN,OAAO,KACP,QAAQ,YACR,KAAK,OACL,MAAM,6BACN,UAAWG,EAAM,UAEjB,SAAAH,EAAC,QACC,EAAE,6LACF,KAAK,OACL,YAAY,MACd,EACF,ECtNJ,OAAa,WAAAf,OAAe,QAC5B,OAAS,kBAAAC,OAAsB,+BAC/B,OAAS,MAAA2C,GAAI,QAAAtC,GAAM,QAAAF,GAAM,WAAAG,OAAsB,6BAC/C,OAAS,mBAAAK,GAAiB,WAAAC,OAAe,gCAWrC,OAWE,OAAAE,EAXF,QAAAC,OAAA,oBARG,IAAMge,GAMR9d,GAEDF,GAACV,GAAA,CAEC,UAAW,SACX,MAAO,OACP,IAAK,EACL,UAAW,QACX,UAAWsC,GACT,uCACA1B,EAAM,YAAY,IACpB,EAEA,UAAAH,EAACgd,GAAA,CAAQ,GAAG7c,EAAO,EACnBH,EAACR,GAAA,EAAQ,EACTQ,EAACid,GAAA,CAAM,GAAG9c,EAAO,IAZZA,EAAM,KAAK,SAalB,EAIS6c,GAAoC7c,GAAU,CACzD,GAAM,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAC7B,OACEe,GAACV,GAAA,CAAK,MAAO,OAAQ,QAAS,UAAW,UAAW,QAClD,UAAAS,EAACT,GAAA,CAAK,UAAW,SAAU,UAAW,QAAS,IAAK,EAClD,SAAAS,EAACT,GAAA,CAAK,IAAK,EAAG,UAAW,SACvB,SAAAS,EAACT,GAAA,CAAK,UAAW,SAAU,IAAK,EAAG,UAAW,QAC5C,SAAAS,EAACX,GAAK,UAAL,CACC,KAAM,SACN,aAAa,aACb,KAAK,KACL,UAAW,GAEV,SAAAc,EAAM,KAAK,oBAAoB,CAAC,GAAG,QAAU,GAChD,EAIF,EACF,EACF,EACAF,GAACV,GAAA,CAAK,UAAW,SAAU,UAAW,MACpC,UAAAS,EAACX,GAAA,CAAK,KAAK,MAAM,UAAW,GAC1B,SAAAW,EAACX,GAAK,UAAL,CAAe,KAAM,OAAQ,aAAa,sBACxC,SAAAc,EAAM,KAAK,UACd,EACF,EACAF,GAACZ,GAAA,CAAK,KAAK,MAAM,UAAW,GACzB,aAAGiB,EAAE,4CAA4C,CAAC,KACnDN,EAACX,GAAA,CAAK,GAAG,OAAO,UAAW,GACxB,SAAAc,EAAM,KAAK,eACd,GACF,GACF,GACF,CAEJ,EAEa8c,GAAkC9c,GAAU,CACvD,IAAM0N,EAAW1N,EAAM,KAAK,oBAAoB,CAAC,EAC3C,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EACvBgf,EAAKjf,GAAQ,IACb,MAAMkB,EAAM,MAAM,YAAY,EAAU,KACrC,GAAG,IAAIL,GAAQK,EAAM,KAAK,YAAY,EAAE,IAAI,GAAG,EAAE,KAAK,EAAGL,GAAQ,UAAU,EAAE,SAAS,CAAC,IAC7F,CAACK,EAAM,MAAM,YAAY,CAAC,EAE7B,OAAK0N,EAGH5N,GAACV,GAAA,CAAK,UAAW,SAAU,MAAO,OAAQ,IAAK,EAE7C,UAAAU,GAACV,GAAA,CAAK,IAAK,EAAG,MAAO,OACnB,UAAAS,EAACme,GAAA,CACC,MAAO7d,EAAE,wCAAwC,EACjD,MAAOT,GAAgBgO,EAAS,cAAc,EAC9C,UAAU,aACZ,EACA7N,EAACme,GAAA,CACC,MAAO7d,EAAE,iBAAiB,EAC1B,MAAOT,GAAgBgO,EAAS,YAAY,EAC5C,UAAU,aACZ,EACA7N,EAACme,GAAA,CACC,MAAO7d,EAAE,iDAAiD,EAC1D,MAAOH,EAAM,KAAK,mBAClB,UAAU,aACV,MAAM,MACR,GACF,EAGAF,GAACV,GAAA,CAAK,IAAK,EAAG,MAAO,OACnB,UAAAS,EAACme,GAAA,CACC,MAAO7d,EAAE,6CAA6C,EACtD,MAAOT,GAAgBgO,EAAS,mBAAmB,EACnD,UAAU,aACZ,EACA7N,EAACme,GAAA,CACC,MAAO7d,EAAE,uCAAuC,EAChD,MAAO4d,EACP,UAAU,aACZ,EACAle,EAACme,GAAA,CACC,MAAO7d,EAAE,wCAAwC,EACjD,MACEH,EAAM,KAAK,sBACP,GAAGA,EAAM,KAAK,qBAAqB,IACnC,KAEN,UAAU,aACV,MAAM,MACR,GACF,EAGAF,GAACV,GAAA,CAAK,IAAK,EAAG,MAAO,OACnB,UAAAS,EAACme,GAAA,CACC,MAAO7d,EAAE,+CAA+C,EACxD,MAAOT,GAAgBM,EAAM,KAAK,gBAAgB,EAClD,UAAU,aACZ,EACAH,EAACme,GAAA,CACC,MAAO7d,EAAE,6CAA6C,EACtD,MAAOT,GAAgBM,EAAM,KAAK,iBAAiB,EACnD,UAAU,aACZ,EACAH,EAAC,OAAI,UAAU,2BAA2B,EAAE,KAC9C,GACF,EA9DoB,IAgExB,EAEMme,GAKD,CAAC,CAAE,MAAApI,EAAO,MAAAlS,EAAO,UAAA4T,EAAW,MAAA2G,EAAQ,OAAQ,IAE7Cne,GAACV,GAAA,CAAK,UAAW,SAAU,UAAW6e,EAAO,UAAW3G,EACtD,UAAAzX,EAACX,GAAA,CAAK,KAAK,MAAM,UAAW,GACzB,SAAA0W,EACH,EACA/V,EAACX,GAAA,CAAK,KAAK,KAAK,UAAW,GACxB,SAAAwE,EACH,GACF,EC5JG,IAAMwa,GAA4Ble,IAQhC,CACL,GAAGA,CACL,GCEO,cAAAH,OAAA,oBAVF,IAAMse,GAAyBne,GAOhC,CACJ,GAAM,CAAE,WAAAsd,EAAY,GAAGxK,CAAK,EAAI9S,EAC1ByG,EAAQyX,GAAyBpL,CAAI,EAC3C,OAAOjT,GAACie,GAAA,CAAgB,WAAYR,EAAa,GAAG7W,EAAO,CAC7D,EJYU,cAAA5G,EASE,QAAAC,OATF,oBATH,IAAMse,GAAqCpe,GAAU,CAC1D,GAAM,CAACqe,EAAUC,CAAW,EAAIjV,GAAS,CAAC,CAAC,EACrCyP,EAAS0E,GAAqB,CAAC,CAAC,EAEtC,OACE1d,GAACV,GAAA,CAAK,UAAU,SAAS,MAAM,OAAO,OAAO,OAAO,UAAU,QAE5D,UAAAU,GAACV,GAAA,CAAK,IAAK,EACR,UAAAY,EAAM,YAAY,OAAS,GAC1BH,EAACqZ,GAAA,CACC,MAAOlZ,EAAM,YACb,SAAW0D,GAAe,CACxB1D,EAAM,SAAS0D,CAAK,CACtB,EACF,EAED,CAAC,EAAG,EAAG,GAAI,EAAE,EAAE,IAAKA,GAEjB5D,GAAC,UAEC,UAAU,iDAEV,UAAAD,EAAC,OAAI,UAAU,WACb,SAAAA,EAACX,GAAK,SAAL,CACC,MAAOc,EAAM,aAAe0D,EAAQ,QAAU,OAC9C,UACE1D,EAAM,aAAe0D,EACjB,4BACA,GAGL,YAAGA,CAAK,IACX,EACF,EACA7D,EAAC,OACC,UAAU,8EACV,QAAS,IAAM,CACbG,EAAM,iBAAiB0D,CAAY,CACrC,EACD,IApBI,QAAQA,CAAK,EAqBpB,CAEH,GACH,EAEA7D,EAACgM,GAAA,CACC,QAAS7L,EAAM,UACf,GAAG,kCACH,QAAS8Y,EACT,SAAQ,GACR,WAAY9Y,EAAM,WAClB,gBAAkBoW,GAChB,GAAGA,EAAO,cAAc,GAG1B,WAAYpW,EAAM,WAClB,QAAS,CACP,KAAM,0CACR,EACA,WAAY,CACV,KAAM,4BACR,EAMA,SAAUqe,EACV,iBAAkBC,EAClB,gBAAiB,IAAM,GACvB,gBAAkBlI,GACTvW,EAAC0e,GAAA,CAAmB,OAAQnI,EAAO,SAAU,EAExD,GACF,CAEJ,EAEMoI,GAIAxe,GAEFH,EAAC,MAAG,UAAU,gFACZ,SAAAA,EAACwM,GAAA,CACC,QAASrM,EAAM,QACf,UAAU,8BACV,KAAMA,EAAM,KACZ,MAAO,CACL,UAAW,iBACb,EAEA,SAAAH,EAAC,UAAO,UAAU,oDACf,SAAAG,EAAM,MACT,EACF,EACF,EAIEue,GAEAve,GAAU,CACd,GAAM,CAAE,aAAAye,EAAc,YAAAC,EAAa,iBAAAC,EAAkB,kBAAAC,CAAkB,EACrE5e,EAAM,OAEF,CAAE,EAAAG,CAAE,EAAIpB,GAAe,EAE7B,OACEc,EAAC,OAAI,UAAU,oCAGb,SAAAC,GAAC,SAAM,UAAU,aACf,UAAAD,EAAC,SACC,SAAAC,GAAC,MACC,UAAAD,EAAC2e,GAAA,CACC,QAASre,EAAE,yCAAyC,EACpD,MAAOA,EAAE,uCAAuC,EAChD,KAAK,OACP,EACAN,EAAC2e,GAAA,CACC,QAASre,EAAE,0CAA0C,EACrD,MAAOA,EAAE,wCAAwC,EACnD,EACAN,EAAC2e,GAAA,CACC,QAASre,EAAE,iDAAiD,EAC5D,MAAOA,EAAE,+CAA+C,EAC1D,EACAN,EAAC2e,GAAA,CACC,QAASre,EAAE,+CAA+C,EAC1D,MAAOA,EAAE,6CAA6C,EACxD,GACF,EACF,EACAN,EAAC,SACC,SAAAC,GAAC,MACC,UAAAD,EAAC,MAAG,UAAU,WACZ,SAAAA,EAACX,GAAK,QAAL,CAAa,KAAK,cAAe,SAAAuf,EAAa,EACjD,EACA5e,EAAC,MAAG,UAAU,WACZ,SAAAA,EAACX,GAAK,QAAL,CAAa,KAAK,cAAe,SAAAwf,EAAY,EAChD,EACA7e,EAAC,MAAG,UAAU,WAAY,SAAAH,GAAgBif,CAAgB,EAAE,EAC5D9e,EAAC,MAAG,UAAU,WAAY,SAAAH,GAAgBkf,CAAiB,EAAE,GAC/D,EACF,GACF,EACF,CAEJ,EAEaC,GAQR7e,GAEDF,GAACuB,GAAA,CACC,KAAM,EACN,KAAM,EACN,UAAU,sCACV,IAAK,EAEL,UAAAxB,EAACT,GAAA,CAAK,IAAK,EAAG,EAAG,EAAG,UAAU,iCAC5B,SAAAS,EAACqZ,GAAA,CACC,UAAU,2BACV,MAAOlZ,EAAM,YACb,SAAW0D,GAAe,CACxB1D,EAAM,SAAS0D,CAAK,CACtB,EACF,EACF,EACA7D,EAAC2B,GAAA,CACC,UAAWE,GACT,oEACA1B,EAAM,YAAY,IACpB,EACA,iBAAkB0B,GAAG,iBAAkB1B,EAAM,YAAY,OAAO,EAChE,WAAYA,EAAM,WAClB,SAAUA,EAAM,SAChB,WAAY,CAACqD,EAAMoV,IACjB5Y,EAACse,GAAA,CACC,KAAM9a,EACN,MAAOoV,EACP,WAAY,CACV,KAAMzY,EAAM,YAAY,IAC1B,EACF,EAEJ,GACF,EKrNJ,OAAS,aAAA4B,GAAW,WAAA9C,GAAS,YAAAuK,OAAgB,QAC7C,OAAS,oBAAA2Q,GAAkB,WAAAC,OAAe,WAC1C,OACE,2BAAA9Y,OAEK,gCACP,OAAS,cAAA0D,OAAkB,oCAE3B,OAAS,iBAAAE,GAAe,aAAAtD,OAAiB,6BACzC,OAAS,WAAA9B,OAAqB,gCASvB,IAAMmf,GAAwB9e,GAA4B,CAC/D,GAAM,CAAE,OAAAyC,EAAQ,eAAAsc,CAAe,EAAI/e,EAC7B,CAAE,KAAAgf,EAAM,SAAAC,EAAU,QAAA5X,EAAS,WAAAD,EAAY,gBAAA8X,CAAgB,EAC3Dna,GAAc,CACZ,SAAU,EACZ,CAAC,EAEG,CAAE,UAAA8V,EAAW,WAAAC,EAAY,iBAAAC,EAAkB,YAAAC,EAAa,SAAAC,CAAS,EACrEC,GAAU,EAEZtZ,GAAU,IAAM,CACdyF,EAAQ,CAAC,CACX,EAAG,CAAC5E,EAAQoY,EAAWC,CAAU,CAAC,EAElC,GAAM,CAAChY,EAAM,CAAE,KAAAqc,EAAM,UAAAtc,EAAW,SAAAK,CAAS,CAAC,EAAIkc,GAAe,CAC3D,KAAML,EAAiB,OAAYC,EACnC,KAAMC,EACN,OAAAxc,EACA,QAASoY,EAAU,MAAQ,KAAOA,EAAU,KAAK,QAAQ,EAAI,OAC7D,MAAOA,EAAU,IAAM,KAAOA,EAAU,GAAG,QAAQ,EAAI,MACzD,CAAC,EAYD,MAAO,CACL,WAXiBhW,GAAW/B,EAAM,CAClC,aAAc,CAAC,CACjB,CAAC,EAUC,UAAAD,EACA,SAAAK,EAEA,WAAYgc,EAAgBC,CAAI,EAGhC,UAAAtE,EACA,WAAAC,EACA,iBAAAC,EACA,YAAAC,EACA,SAAAC,CACF,CACF,EAQMmE,GAAkBpf,GAMlB,CACJ,IAAMqf,EAAiBle,GAAwBme,GAAetf,CAAK,EAAG,CACpE,YAAa,EACb,UAAY8C,GAASA,EACrB,kBAAmB,EACrB,CAAC,EAEKqc,EAAOrgB,GAAQ,IAEZugB,EAAe,OAAO,CAAC,GAAG,KAChC,CAACA,EAAe,OAAO,CAAC,CAAC,CAAC,EAEvBvc,EAAOhE,GAAQ,IACZugB,EAAe,MAClB,IAAKhc,GAELA,EAAK,MAAM,IAAKA,GAAS,CACvB,IAAIkc,EAAqB,KACnBC,EAAgBnc,EAAK,kBAAkB,CAAC,EAE9C,OAAImc,IACFD,EAAqB,IAAI5f,GAAQ6f,EAAc,cAAc,EAC1D,IAAIA,EAAc,kBAAkB,EACpC,SAAS,GAGP,CACL,GAAGnc,EACH,sBAAuB,MAAMA,EAAK,WAAW,EACzC,KACA,IAAI1D,GAAQ0D,EAAK,WAAW,EAAE,IAAI,GAAG,EAAE,QAAQ,CAAC,EAAE,SAAS,EAC/D,mBAAAkc,CACF,CACF,CAAC,CACH,GACE,KAAK,EACR,CAACF,EAAe,IAAI,CAAC,EAElBxc,EAAYwc,EAAe,UAMjC,MAAO,CAACvc,EAAM,CAAE,KAAAqc,EAAM,UAAAtc,EAAW,SAJhB,IAAM,CACrBwc,EAAe,QAAQA,EAAe,KAAO,CAAC,CAChD,CAE0C,CAAC,CAC7C,EAEMnE,GAAY,IAAM,CACtB,IAAMS,EAAepB,GAAsB,CACzC,GAAID,EAAe,IAAI,IAAM,EAC7B,KAAMH,EAAiBF,GAAQ,IAAI,KAAQ,EAAE,CAAC,CAChD,CAAC,EAGK,CAACa,EAAYc,CAAa,EAAIvS,GAAiC,EAAE,EAEjE,CAACwR,EAAWgB,CAAY,EAAIxS,GAG/BsS,CAAY,EAETZ,EAAoBe,GAA0B,CAClDF,EAAcE,CAAI,EAClBD,EAAa,CACX,KAAM1B,EAAiBF,GAAQ,IAAI,KAAQ6B,EAAO,CAAC,CAAC,EACpD,GAAIxB,EAAe,IAAI,IAAM,CAC/B,CAAC,CACH,EAEMW,EAAYc,GAAyC,CACzD,GAAIA,EAAO,OAAS,YAAa,CAC/B,IAAMC,EAAezB,GAAsBwB,EAAO,KAAK,EAEvD,GADAF,EAAaG,CAAY,EACrBA,EAAa,MAAQA,EAAa,GAAI,CACxC,IAAMC,EACJ,KAAK,IAAIjC,GAAiBgC,EAAa,KAAMA,EAAa,EAAE,CAAC,EAAI,EAoB7DnB,EAnB4D,CAChE,EAAG,CACD,KAAMV,EAAiB,IAAI,IAAM,EACjC,GAAIG,EAAe,IAAI,IAAM,CAC/B,EACA,EAAG,CACD,KAAMH,EAAiBF,GAAQ,IAAI,KAAQ,CAAC,CAAC,EAC7C,GAAIK,EAAe,IAAI,IAAM,CAC/B,EACA,GAAI,CACF,KAAMH,EAAiBF,GAAQ,IAAI,KAAQ,EAAE,CAAC,EAC9C,GAAIK,EAAe,IAAI,IAAM,CAC/B,EACA,GAAI,CACF,KAAMH,EAAiBF,GAAQ,IAAI,KAAQ,EAAE,CAAC,EAC9C,GAAIK,EAAe,IAAI,IAAM,CAC/B,CACF,EAE+B2B,CAAQ,EAErCpB,GACAJ,GAAcI,EAAU,KAAMmB,EAAa,IAAI,GAC/CvB,GAAcI,EAAU,GAAImB,EAAa,EAAE,EAE3CJ,EAAcK,CAAe,EAE7BL,EAAc,IAAI,CAEtB,CACF,CACF,EAEM,CAAE,SAAAhZ,CAAS,EAAInB,GAAU,EAiB/B,MAAO,CACL,YAhBkB3C,GAAQ,IAAa,CACvC,IAAMod,EAAkB,CACtB,KAAM,QACN,KAAM,YACN,MAAOrB,EACP,SAAUV,EAAiBF,GAAQ,IAAI,KAAQ,EAAE,CAAC,EAClD,OAAQK,EAAe,IAAI,IAAM,CACnC,EAEA,OAAI1X,EACK,CAACsZ,CAAe,EAElB,CAACA,CAAe,CACzB,EAAG,CAACrB,CAAS,CAAC,EAIZ,SAAAI,EACA,UAAAJ,EACA,WAAAC,EACA,iBAAAC,CACF,CACF,EAEMuE,GACH1Z,GAOD,CAAC5C,EAAmBC,IAAyC,CAE3D,GAAIA,GAAoB,CAACA,EAAiB,MAAM,OAAQ,OAAO,KAE/D,GAAM,CAAE,OAAAR,EAAQ,KAAAgd,EAAO,GAAI,KAAAT,EAAM,MAAArc,EAAO,QAAAD,CAAQ,EAAIkD,EAE9C8Z,EAAS,IAAI,gBAAgB,CACjC,CAAC,OAAQD,EAAK,SAAS,CAAC,EACxB,CAAC,OAAQ,GAAGzc,EAAY,CAAC,EAAE,CAC7B,CAAC,EAED,OAAIgc,GACFU,EAAO,IAAI,OAAQ,GAAGV,CAAI,EAAE,EAG1Bvc,GACFid,EAAO,IAAI,SAAUjd,CAAM,EAGzBE,GACF+c,EAAO,IAAI,QAAS,GAAG/c,CAAK,EAAE,EAG5BD,GACFgd,EAAO,IAAI,UAAW,GAAGhd,CAAO,EAAE,EAG7B,oBAAoBgd,EAAO,SAAS,CAAC,EAC9C,EC9OO,cAAA7f,OAAA,oBAFF,IAAM8f,GAAiD3f,GAAU,CACtE,IAAMyG,EAAQqY,GAAqB9e,CAAK,EACxC,OAAOH,GAACue,GAAA,CAAa,GAAG3X,EAAO,CACjC,EAEamZ,GAIR5f,GAAU,CACb,GAAM,CAAE,WAAAsd,EAAY,GAAGxK,CAAK,EAAI9S,EAC1ByG,EAAQqY,GAAqBhM,CAAI,EACvC,OAAOjT,GAACgf,GAAA,CAAkB,WAAYvB,EAAa,GAAG7W,EAAO,CAC/D,EtDDO,IAAMoZ,GAAuB,uBAEpChhB,GAAqBghB,GAAsBnf,GAAoB,CAC7D,KAAM,KACN,SAAU,EACZ,CAAC","sourcesContent":["import { registerSimpleDialog } from \"@kodiak-finance/orderly-ui\";\nimport { MarketCloseConfirm } from \"./components/positions/closePosition/components/confirmDialog\";\n\nexport { usePositionsRowContext } from \"./components/positions/positionsRowContext\";\n\nexport { FundingFeeHistoryUI } from \"./components/fundingFeeHistory/fundingFeeHistory.ui\";\nexport { FundingFeeButton } from \"./components/fundingFeeHistory/fundingFeeButton\";\n\nexport {\n PositionsWidget,\n MobilePositionsWidget,\n CombinePositionsWidget,\n} from \"./components/positions/positions.widget\";\n\nexport type { PositionsProps, SortType } from \"./types/types\";\nexport {\n useTabSort,\n PositionsTabName,\n} from \"./components/shared/hooks/useTabSort\";\nexport { useSort, sortList } from \"./utils/sorting\";\n\nexport const MarketCloseConfirmID = \"MarketCloseConfirmID\";\n\nregisterSimpleDialog(MarketCloseConfirmID, MarketCloseConfirm, {\n size: \"md\",\n closable: false,\n});\n\nexport * from \"./components/positionHistory\";\nexport * from \"./components/liquidation\";\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { OrderEntity, OrderSide } from \"@kodiak-finance/orderly-types\";\nimport {\n Button,\n Text,\n CloseIcon,\n Flex,\n Divider,\n Badge,\n ThrottledButton,\n Box,\n} from \"@kodiak-finance/orderly-ui\";\nimport { commify, commifyOptional, Decimal } from \"@kodiak-finance/orderly-utils\";\n\nexport const ConfirmHeader: FC<{\n onClose?: () => void;\n title: string;\n hideCloseIcon?: boolean;\n}> = (props) => {\n const { hideCloseIcon = false } = props;\n return (\n <div className=\"oui-relative oui-w-full oui-border-b oui-border-line-4 oui-pb-3\">\n <Text size={\"base\"}>{props.title}</Text>\n {!hideCloseIcon && (\n <button\n onClick={props.onClose}\n className=\"oui-absolute oui-right-0 oui-top-0 oui-p-2 oui-text-base-contrast-54 hover:oui-text-base-contrast-80\"\n >\n <CloseIcon size={18} color=\"white\" />\n </button>\n )}\n </div>\n );\n};\n\nexport const ConfirmFooter: FC<{\n onConfirm?: () => Promise<any>;\n onCancel?: () => void;\n submitting?: boolean;\n disabled?: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex\n id=\"oui-positions-confirm-footer\"\n gap={2}\n width={\"100%\"}\n className=\"oui-mt-3 oui-pb-1\"\n >\n <Button\n id=\"oui-positions-confirm-footer-cancel-button\"\n color={\"secondary\"}\n fullWidth\n onClick={props.onCancel}\n size=\"md\"\n >\n {t(\"common.cancel\")}\n </Button>\n <ThrottledButton\n id=\"oui-positions-confirm-footer-confirm-button\"\n onClick={props.onConfirm}\n fullWidth\n loading={props.submitting}\n disabled={props.disabled}\n size=\"md\"\n >\n {t(\"common.confirm\")}\n </ThrottledButton>\n </Flex>\n );\n};\n\nexport const OrderDetail = (props: {\n quantity: any;\n price: any;\n side: OrderSide;\n quoteDp: number;\n className?: string;\n}) => {\n const { quantity, price, quoteDp, side } = props;\n const { t } = useTranslation();\n\n const total = useMemo(() => {\n if (price && quantity) {\n return new Decimal(price)\n .mul(quantity)\n .toFixed(quoteDp, Decimal.ROUND_DOWN);\n }\n return \"--\";\n }, [price, quantity]);\n\n return (\n <Flex\n direction={\"column\"}\n gap={1}\n width={\"100%\"}\n className=\"oui-text-sm oui-text-base-contrast-54\"\n py={5}\n >\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>{t(\"common.qty\")}</Text>\n <Text color={side === OrderSide.BUY ? \"success\" : \"danger\"}>\n {quantity}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>{t(\"common.price\")}</Text>\n <Text.formatted\n intensity={98}\n suffix={<Text intensity={54}>USDC</Text>}\n >\n {price}\n </Text.formatted>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.formatted\n intensity={98}\n suffix={<Text intensity={54}>USDC</Text>}\n >\n {total}\n </Text.formatted>\n </Flex>\n </Flex>\n );\n};\n\nexport const MarketCloseConfirm: FC<{\n base?: string;\n quantity?: string;\n onClose?: () => void;\n close?: () => void;\n onConfirm?: () => Promise<any>;\n submitting?: boolean;\n hideCloseIcon?: boolean;\n classNames?: {\n root?: string;\n };\n}> = (props) => {\n const { t } = useTranslation();\n\n const onCancel = () => {\n const func = props?.onClose ?? props.close;\n func?.();\n };\n return (\n <Flex direction={\"column\"} className={props.classNames?.root}>\n <ConfirmHeader\n onClose={onCancel}\n title={t(\"positions.marketClose\")}\n hideCloseIcon={props.hideCloseIcon}\n />\n <Text intensity={54} size=\"sm\" className=\"oui-my-5\">\n {t(\"positions.marketClose.description\", {\n quantity: commifyOptional(props.quantity),\n base: props.base,\n })}\n </Text>\n <ConfirmFooter\n onCancel={onCancel}\n onConfirm={async () => {\n await props.onConfirm?.();\n onCancel();\n }}\n submitting={props.submitting}\n />\n </Flex>\n );\n};\n\nexport const LimitConfirmDialog: FC<{\n base: string;\n quantity: string;\n price: string;\n onClose?: () => void;\n onConfirm: () => Promise<any>;\n order: OrderEntity;\n submitting: boolean;\n quoteDp?: number;\n hideCloseIcon?: boolean;\n}> = (props) => {\n const { order, quoteDp, quantity, price } = props;\n const { side } = order;\n const { t } = useTranslation();\n\n const onCancel = () => {\n props.onClose?.();\n };\n\n return (\n <>\n <ConfirmHeader\n onClose={onCancel}\n title={t(\"positions.limitClose\")}\n hideCloseIcon={props.hideCloseIcon}\n />\n <Box mt={5}>\n <Text intensity={54} size=\"sm\">\n {t(\"positions.limitClose.description\", {\n quantity: commify(props.quantity),\n base: props.base,\n })}\n </Text>\n </Box>\n\n <Flex gap={2} mb={4} mt={5} justify={\"between\"}>\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size=\"base\"\n showIcon\n >\n {order.symbol}\n </Text.formatted>\n <Flex gap={1}>\n <Badge color=\"neutral\" size=\"xs\">\n {t(\"orderEntry.orderType.limit\")}\n </Badge>\n <Badge\n color={side === OrderSide.BUY ? \"success\" : \"danger\"}\n size=\"xs\"\n >\n {side === OrderSide.BUY ? t(\"common.buy\") : t(\"common.sell\")}\n </Badge>\n </Flex>\n </Flex>\n\n <Divider className=\"oui-w-full\" />\n\n <OrderDetail\n className=\"oui-text-sm\"\n price={price}\n quantity={quantity}\n side={order.side}\n quoteDp={quoteDp ?? 2}\n />\n <ConfirmFooter\n onCancel={onCancel}\n onConfirm={props.onConfirm}\n submitting={props.submitting}\n />\n </>\n );\n};\n","import { createContext, useContext } from \"react\";\nimport { API, OrderSide, OrderType } from \"@kodiak-finance/orderly-types\";\n\nexport interface PositionsRowContextState {\n quantity: string;\n price: string;\n type: OrderType;\n side: OrderSide;\n position: API.PositionExt | API.PositionTPSLExt;\n updateQuantity: (value: string) => void;\n updatePriceChange: (value: string) => void;\n updateOrderType: (value: OrderType) => void;\n\n closeOrderData: any;\n\n onSubmit: () => Promise<any>;\n submitting: boolean;\n tpslOrder?: API.AlgoOrder;\n partialTPSLOrder?: API.AlgoOrder;\n quoteDp?: number;\n baseDp?: number;\n baseTick?: number;\n errors: any | undefined;\n}\n\nexport const PositionsRowContext = createContext(\n {} as PositionsRowContextState,\n);\n\nexport const usePositionsRowContext = () => {\n return useContext(PositionsRowContext);\n};\n","import { FC, useCallback, useMemo } from \"react\";\nimport { usePrivateInfiniteQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport {\n Grid,\n Statistic,\n DataTable,\n Text,\n ListView,\n Flex,\n useScreen,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { EndReachedBox } from \"./endReachedBox\";\n\ntype FundingFeeHistory = {\n created_time: number;\n funding_fee: number;\n funding_rate: number;\n mark_price: number;\n payment_type: \"Pay\" | \"Receive\";\n status: \"Accrued\" | \"Settled\";\n symbol: string;\n updated_time: number;\n};\n\nconst PAGE_SIZE = 60;\n\nexport const FundingFeeHistoryUI: FC<{\n total: number;\n symbol: string;\n start_t: string;\n end_t: string;\n}> = ({ total, symbol, start_t, end_t }) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const { isLoading, data, setSize } =\n usePrivateInfiniteQuery<FundingFeeHistory>(\n (pageIndex, previousPageData) => {\n if (\n (!previousPageData || (previousPageData.length ?? 0) < PAGE_SIZE) &&\n pageIndex > 0\n )\n return null;\n return `/v1/funding_fee/history?page=${pageIndex + 1}&size=${PAGE_SIZE}&symbol=${symbol}&start_t=${start_t}&end_t=${end_t}`;\n },\n {\n revalidateFirstPage: false,\n },\n );\n\n const loadMore = useCallback(() => {\n setSize((prev) => {\n return prev + 1;\n });\n }, [setSize]);\n\n const flattenData = useMemo(() => {\n if (!Array.isArray(data)) return [];\n return data.flat().map((item) => {\n return {\n ...item,\n funding_fee: -item.funding_fee,\n };\n });\n }, [data]);\n\n const listView = useMemo(() => {\n if (isMobile) {\n return (\n <HistoryDataListViewSimple\n data={flattenData ?? EMPTY_LIST}\n isLoading={isLoading}\n loadMore={loadMore}\n />\n );\n }\n return (\n <HistoryDataListView\n data={flattenData ?? EMPTY_LIST}\n isLoading={isLoading}\n loadMore={loadMore}\n />\n );\n }, [isMobile, flattenData, isLoading]);\n\n return (\n <div>\n <Grid\n cols={2}\n gapX={3}\n className=\"oui-sticky oui-top-0 oui-z-10 oui-bg-base-8 oui-py-4\"\n >\n <div className=\"oui-rounded-lg oui-border oui-border-line-6 oui-bg-base-9 oui-p-3\">\n {/* <Statistic label={\"Instrument\"} /> */}\n <Flex direction={\"column\"} gap={1} itemAlign={\"start\"}>\n <span className=\"oui-text-2xs oui-text-base-contrast-36\">\n {t(\"common.symbol\")}\n </span>\n <Text.formatted\n rule=\"symbol\"\n className=\"oui-font-semibold\"\n intensity={98}\n >\n {symbol}\n </Text.formatted>\n </Flex>\n </div>\n <div className=\"oui-rounded-lg oui-border oui-border-line-6 oui-bg-base-9 oui-p-3\">\n <Statistic\n label={`${t(\"funding.fundingFee\")} (USDC)`}\n valueProps={{\n ignoreDP: true,\n coloring: true,\n showIdentifier: true,\n }}\n >\n {total}\n </Statistic>\n </div>\n </Grid>\n {listView}\n </div>\n );\n};\n\ntype ListProps = {\n isLoading: boolean;\n data: any[];\n loadMore: () => void;\n};\n\nconst HistoryDataListView: FC<ListProps> = ({ isLoading, data, loadMore }) => {\n const { t } = useTranslation();\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n width: 120,\n render: (value: string) => {\n return <Text.formatted rule=\"date\">{value}</Text.formatted>;\n },\n },\n {\n title: t(\"funding.fundingRate\"),\n dataIndex: \"funding_rate\",\n formatter: (value: string) => new Decimal(value).mul(100).toString(),\n render: (value: string) => {\n return <span>{`${value}%`}</span>;\n },\n },\n {\n title: t(\"funding.paymentType\"),\n dataIndex: \"payment_type\",\n formatter: (value: string) => {\n return value === \"Pay\"\n ? t(\"funding.paymentType.paid\")\n : t(\"funding.paymentType.received\");\n },\n render: (value) => <span>{value}</span>,\n },\n {\n title: `${t(\"funding.fundingFee\")} (USDC)`,\n dataIndex: \"funding_fee\",\n render: (value: string) => {\n return (\n <Text.numeral rule=\"price\" coloring showIdentifier ignoreDP>\n {value}\n </Text.numeral>\n );\n },\n },\n ];\n }, [t]);\n\n return (\n <div className=\"oui-h-[calc(80vh_-_132px_-_8px)] oui-overflow-y-auto\">\n <EndReachedBox onEndReached={loadMore}>\n <DataTable\n classNames={{\n root: cn(\"oui-h-auto oui-bg-base-8 oui-text-sm\"),\n }}\n columns={columns}\n dataSource={data ?? EMPTY_LIST}\n loading={isLoading}\n />\n </EndReachedBox>\n </div>\n );\n};\n\nconst HistoryDataListViewSimple: FC<ListProps> = ({\n data,\n isLoading,\n loadMore,\n}) => {\n const renderItem = useCallback((item: FundingFeeHistory) => {\n return <FundingFeeItem item={item} />;\n }, []);\n return (\n <div className=\"oui-h-[calc(80vh_-_104px)] oui-overflow-y-auto\">\n <ListView\n dataSource={data}\n renderItem={renderItem}\n isLoading={isLoading}\n contentClassName=\"oui-space-y-0\"\n loadMore={loadMore}\n />\n </div>\n );\n};\n\nconst FundingFeeItem: FC<{\n item: any;\n}> = ({ item }) => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-flex-col oui-space-y-2 oui-border-t oui-border-line-6 oui-py-2\">\n <Flex justify={\"between\"}>\n <Statistic\n label={t(\"funding.fundingRate\")}\n classNames={{\n label: \"oui-text-2xs\",\n }}\n valueProps={{\n ignoreDP: true,\n rule: \"percentages\",\n className: \"oui-text-xs\",\n }}\n >\n {item.funding_rate}\n </Statistic>\n <Statistic\n label={t(\"common.amount\")}\n className=\"oui-items-end\"\n classNames={{\n label: \"oui-text-2xs\",\n }}\n valueProps={{\n ignoreDP: true,\n coloring: true,\n as: \"div\",\n className: \"oui-text-xs\",\n showIdentifier: true,\n }}\n >\n {item.funding_fee}\n </Statistic>\n </Flex>\n <Flex justify={\"between\"}>\n <Text.formatted\n rule=\"date\"\n className=\"oui-text-base-contrast-36\"\n size=\"2xs\"\n >\n {item.created_time}\n </Text.formatted>\n <Text size=\"sm\" intensity={80}>\n {item.payment_type === \"Pay\"\n ? t(\"funding.paymentType.paid\")\n : t(\"funding.paymentType.received\")}\n </Text>\n </Flex>\n </div>\n );\n};\n","import { FC, useRef, type PropsWithChildren } from \"react\";\nimport { useEndReached } from \"./useEndReached\";\n\nexport interface EndReachedBoxProps {\n onEndReached?: () => void;\n // className?: string;\n}\n\nexport const EndReachedBox: FC<PropsWithChildren<EndReachedBoxProps>> = (\n props,\n) => {\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const { onEndReached } = props;\n\n useEndReached(sentinelRef, () => {\n onEndReached?.();\n });\n\n return (\n <>\n {props.children}\n <div\n ref={sentinelRef}\n className=\"oui-relative oui-invisible oui-h-[25px] oui-bg-red-400 oui-top-[-300px]\"\n />\n </>\n );\n};\n","import { useEffect, useRef, MutableRefObject } from \"react\";\n\n/**\n * Listen for the specified element to scroll to the bottom\n */\nexport function useEndReached(\n sentinelRef: MutableRefObject<HTMLDivElement | null>,\n onEndReached?: () => void,\n) {\n const observer = useRef<IntersectionObserver>();\n const cb = useRef(onEndReached);\n\n cb.current = onEndReached;\n\n useEffect(() => {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: \"0px\",\n threshold: 0,\n };\n\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n console.log(\">>>>>>>>handleObserver\", entries);\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n cb.current?.();\n }\n });\n };\n\n observer.current = new IntersectionObserver(handleObserver, options);\n\n return () => {\n // console.log(\"------->disconnect\");\n observer.current?.disconnect();\n };\n }, []);\n\n useEffect(() => {\n observer.current?.observe(sentinelRef.current!);\n }, []);\n}\n","import { FC } from \"react\";\nimport { useBoolean } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n SimpleDialog,\n SimpleSheet,\n Text,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { FundingFeeHistoryUI } from \"./fundingFeeHistory.ui\";\n\nexport const FundingFeeButton: FC<{\n fee: number;\n symbol: string;\n start_t: string;\n end_t: string;\n}> = ({ fee, symbol, start_t, end_t }) => {\n const { t } = useTranslation();\n const [isOpen, { setTrue, setFalse }] = useBoolean(false);\n const { isMobile } = useScreen();\n\n return (\n <>\n <button onClick={setTrue}>\n <Text.numeral\n rule=\"price\"\n coloring\n showIdentifier\n ignoreDP\n className=\"oui-border-b oui-border-line-16 oui-border-dashed oui-py-0.5\"\n >\n {fee}\n </Text.numeral>\n </button>\n {isMobile ? (\n <SimpleSheet\n open={isOpen}\n onOpenChange={setFalse}\n title={t(\"funding.fundingFee\")}\n classNames={{\n body: \"oui-max-h-[80vh] oui-py-0\",\n }}\n >\n <FundingFeeHistoryUI\n total={fee}\n symbol={symbol}\n start_t={start_t}\n end_t={end_t}\n />\n </SimpleSheet>\n ) : (\n <SimpleDialog\n open={isOpen}\n onOpenChange={setFalse}\n title={t(\"funding.fundingFee\")}\n classNames={{\n content: \"lg:oui-max-w-[640px]\",\n body: \"oui-max-h-[80vh] oui-bg-base-8 lg:oui-py-0\",\n }}\n >\n <FundingFeeHistoryUI\n total={fee}\n symbol={symbol}\n start_t={start_t}\n end_t={end_t}\n />\n </SimpleDialog>\n )}\n </>\n );\n};\n","import { useEffect, useMemo } from \"react\";\nimport { produce } from \"immer\";\nimport {\n SubAccount,\n useAccount,\n usePositionStream,\n usePrivateQuery,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { positions, account as _account } from \"@kodiak-finance/orderly-perp\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { formatAddress, usePagination } from \"@kodiak-finance/orderly-ui\";\nimport type { PositionsProps } from \"../../types/types\";\nimport { useSubAccountQuery } from \"./hooks/useSubAccountQuery\";\n\nexport enum AccountType {\n ALL = \"All accounts\",\n MAIN = \"Main accounts\",\n}\n\nexport const useCombinePositionsScript = (props: PositionsProps) => {\n const {\n symbol,\n calcMode,\n includedPendingOrder,\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n onSymbolChange,\n selectedAccount,\n } = props;\n\n const { pagination, setPage } = usePagination({ pageSize: 50 });\n\n useEffect(() => {\n setPage(1);\n }, [symbol]);\n\n const symbolsInfo = useSymbolsInfo();\n\n const { state } = useAccount();\n\n const [oldPositions, , { isLoading }] = usePositionStream(symbol, {\n calcMode,\n includedPendingOrder,\n });\n\n // need to get sub account Positions info to calculate portfolio and positions\n const {\n data: newPositions = [],\n isLoading: isPositionLoading,\n mutate: mutatePositions,\n } = usePrivateQuery<API.PositionExt[]>(\"/v1/client/aggregate/positions\", {\n // formatter: (data) => data,\n errorRetryCount: 3,\n });\n\n // need to get sub account info to calculate portfolio and positions\n const { data: accountInfo = [], isLoading: isAccountInfoLoading } =\n useSubAccountQuery<API.AccountInfo[]>(\"/v1/client/info\", {\n accountId: newPositions.map((item) => item.account_id!),\n revalidateOnFocus: false,\n });\n\n const processPositions = produce<API.PositionTPSLExt[]>(\n newPositions.filter((acc) => acc.account_id !== state.mainAccountId),\n (draft) => {\n for (const item of draft) {\n const info = symbolsInfo[item.symbol];\n const notional = positions.notional(item.position_qty, item.mark_price);\n const account = accountInfo.find(\n (acc) => acc.account_id === item.account_id,\n );\n\n const MMR = positions.MMR({\n baseMMR: info?.(\"base_mmr\"),\n baseIMR: info?.(\"base_imr\"),\n IMRFactor: account?.imr_factor[item.symbol] ?? 0,\n positionNotional: notional,\n IMR_factor_power: 4 / 5,\n });\n\n const mm = positions.maintenanceMargin({\n positionQty: item.position_qty,\n markPrice: item.mark_price,\n MMR: MMR,\n });\n\n const unrealPnl = positions.unrealizedPnL({\n qty: item.position_qty,\n openPrice: item?.average_open_price,\n // markPrice: unRealizedPrice,\n markPrice: item.mark_price,\n });\n\n const maxLeverage = item.leverage || 1;\n\n const imr = _account.IMR({\n maxLeverage,\n baseIMR: info?.(\"base_imr\"),\n IMR_Factor: account?.imr_factor[item.symbol] ?? 0,\n positionNotional: notional,\n ordersNotional: 0,\n IMR_factor_power: 4 / 5,\n });\n\n const unrealPnlROI = positions.unrealizedPnLROI({\n positionQty: item.position_qty,\n openPrice: item.average_open_price,\n IMR: imr,\n unrealizedPnL: unrealPnl,\n });\n\n let unrealPnl_index = 0;\n let unrealPnlROI_index = 0;\n if (item.index_price) {\n unrealPnl_index = positions.unrealizedPnL({\n qty: item.position_qty,\n openPrice: item?.average_open_price,\n // markPrice: unRealizedPrice,\n markPrice: item.index_price,\n });\n unrealPnlROI_index = positions.unrealizedPnLROI({\n positionQty: item.position_qty,\n openPrice: item.average_open_price,\n IMR: imr,\n unrealizedPnL: unrealPnl_index,\n });\n }\n item.mmr = MMR;\n item.mm = mm;\n item.notional = notional;\n item.unrealized_pnl = unrealPnl;\n item.unrealized_pnl_ROI = unrealPnlROI;\n item.unrealized_pnl_ROI_index = unrealPnlROI_index;\n }\n },\n );\n\n const dataSource =\n useDataTap(\n [...oldPositions?.rows, ...processPositions].filter(\n (acc) => acc.position_qty !== 0,\n ),\n ) ?? [];\n\n const filtered = useMemo(() => {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return dataSource;\n }\n return dataSource.filter((item) => {\n if (selectedAccount === AccountType.MAIN) {\n return item.account_id === state.mainAccountId || !item.account_id;\n } else {\n return item.account_id === selectedAccount;\n }\n });\n }, [dataSource, selectedAccount, state.mainAccountId]);\n\n const groupDataSource = useMemo(() => {\n return groupDataByAccount(filtered, {\n mainAccountId: state.mainAccountId,\n subAccounts: state.subAccounts,\n });\n }, [filtered, state.mainAccountId, state.subAccounts]);\n\n const mergedLoading = useMemo<boolean>(() => {\n return isLoading || isPositionLoading || isAccountInfoLoading;\n }, [isLoading, isPositionLoading, isAccountInfoLoading]);\n\n return {\n tableData: groupDataSource,\n isLoading: mergedLoading,\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n symbol,\n onSymbolChange,\n pagination,\n mutatePositions,\n };\n};\n\nexport type CombinePositionsState = ReturnType<\n typeof useCombinePositionsScript\n>;\n\nexport const groupDataByAccount = (\n data: API.PositionExt[],\n options: {\n mainAccountId?: string;\n subAccounts?: SubAccount[];\n },\n) => {\n const { mainAccountId = \"\", subAccounts = [] } = options;\n\n const map = new Map<\n PropertyKey,\n {\n id: string;\n description: string;\n children: API.PositionExt[];\n }\n >();\n\n for (const item of data) {\n // if account_id is not set, as a main account\n const accountId = item.account_id || mainAccountId;\n const findSubAccount = subAccounts.find((acc) => acc.id === accountId);\n if (map.has(accountId)) {\n map.get(accountId)?.children?.push(item);\n } else {\n map.set(accountId, {\n id: accountId,\n description:\n accountId === mainAccountId\n ? i18n.t(\"common.mainAccount\")\n : findSubAccount?.description ||\n formatAddress(findSubAccount?.id || \"\"),\n children: [item],\n });\n }\n }\n return {\n expanded: Array.from(map.keys()),\n dataSource: Array.from(map.values()),\n };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n type SWRConfiguration,\n type SWRHook,\n type SWRResponse,\n type Middleware,\n useAccount,\n useSWR,\n fetcher,\n useConfig,\n useAccountInstance,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nexport type QueryOptions<T> = SWRConfiguration & {\n formatter?: (data: any) => T;\n accountId?: string | string[];\n};\n\nconst signatureMiddleware = (\n account: ReturnType<typeof useAccountInstance>,\n accountId?: string | string[],\n): Middleware => {\n const apiBaseUrl = useConfig(\"apiBaseUrl\");\n // @ts-ignore\n return (useSWRNext: SWRHook) => {\n return (key, fetcher, config) => {\n try {\n const extendedFetcher = async (args: any) => {\n const url = Array.isArray(args) ? args[0] : args;\n const fullUrl = `${apiBaseUrl}${url}`;\n const signer = account.signer;\n const payload: MessageFactor = { method: \"GET\", url };\n const signature = await signer.sign(payload, getTimestamp());\n const ids = Array.isArray(accountId) ? accountId : [accountId];\n return Promise.all(\n ids.map((id) => {\n // @ts-ignore\n return fetcher(fullUrl, {\n headers: {\n ...signature,\n \"orderly-account-id\": id,\n },\n });\n }),\n );\n };\n // @ts-ignore\n return useSWRNext(key, extendedFetcher, config);\n } catch (e) {\n throw e;\n }\n };\n };\n};\n\nexport const useSubAccountQuery = <T>(\n query: Parameters<SWRHook>[0],\n options?: QueryOptions<T>,\n): SWRResponse<T> => {\n const { formatter, accountId, ...swrOptions } = options || {};\n const { state, account } = useAccount();\n const middleware = Array.isArray(options?.use) ? (options?.use ?? []) : [];\n\n const ids = Array.isArray(accountId) ? accountId : [accountId];\n\n const shouldFetch =\n ids.filter(Boolean).length &&\n (state.status >= AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n return useSWR<T>(\n () => (shouldFetch ? [query, ids] : null),\n (url: string, init: RequestInit) => {\n return fetcher(url, init, { formatter });\n },\n {\n ...swrOptions,\n use: [...middleware, signatureMiddleware(account, ids as string[])],\n onError: () => {},\n },\n );\n};\n\nexport type MessageFactor = {\n url: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n data?: any;\n};\n","import React from \"react\";\nimport { usePositionStream } from \"@kodiak-finance/orderly-hooks\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { TRADING_POSITIONS_SORT_STORAGE_KEY } from \"../../constants\";\nimport type { PositionsProps } from \"../../types/types\";\nimport { useSort } from \"../../utils/sorting\";\nimport { useTabSort, PositionsTabName } from \"../shared/hooks/useTabSort\";\n\nexport const usePositionsScript = (props: PositionsProps) => {\n const {\n symbol,\n calcMode,\n includedPendingOrder,\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n onSymbolChange,\n enableSortingStorage = true, // Default to true for backward compatibility\n } = props;\n // const [showAllSymbol] = useLocalStorage(\n // \"showAllSymbol\",\n // true\n // );\n const { pagination, setPage } = usePagination({ pageSize: 50 });\n\n // Sorting functionality\n const { tabSort, onTabSort } = useTabSort({\n storageKey: TRADING_POSITIONS_SORT_STORAGE_KEY,\n });\n\n const { onSort, getSortedList, sort } = useSort(\n enableSortingStorage ? tabSort?.[PositionsTabName.Positions] : undefined,\n enableSortingStorage ? onTabSort(PositionsTabName.Positions) : undefined,\n );\n\n React.useEffect(() => {\n setPage(1);\n }, [symbol]);\n\n const [data, , { isLoading }] = usePositionStream(symbol, {\n calcMode,\n includedPendingOrder,\n });\n\n const rawDataSource =\n useDataTap(data?.rows, { fallbackData: [] }) ?? undefined;\n const dataSource = getSortedList(rawDataSource || []);\n\n return {\n dataSource,\n isLoading, // will be use isLoading when usePositionStream support\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n symbol,\n onSymbolChange,\n pagination,\n onSort,\n initialSort: enableSortingStorage\n ? tabSort?.[PositionsTabName.Positions]\n : undefined,\n };\n};\n\nexport type PositionsState = ReturnType<typeof usePositionsScript>;\n","export const TRADING_POSITIONS_SORT_STORAGE_KEY =\n \"orderly_trading_positions_sort\";\n","import { useCallback, useEffect, useState } from \"react\";\nimport { TableSort } from \"@kodiak-finance/orderly-ui\";\nimport { SortType } from \"../types/types\";\n\n/**\n * Compare two values intelligently\n */\nconst compareValues = (aValue: any, bValue: any): number => {\n // Handle null/undefined values (always sort to bottom)\n if (aValue == null && bValue == null) return 0;\n if (aValue == null) return 1;\n if (bValue == null) return -1;\n\n // Convert to string first for type checking\n const aStr = String(aValue).trim();\n const bStr = String(bValue).trim();\n\n // More robust number detection - check if values can be converted to valid numbers\n const aNum = Number(aStr);\n const bNum = Number(bStr);\n const aIsNumber =\n !isNaN(aNum) && isFinite(aNum) && /^-?\\d*\\.?\\d+([eE][+-]?\\d+)?$/.test(aStr);\n const bIsNumber =\n !isNaN(bNum) && isFinite(bNum) && /^-?\\d*\\.?\\d+([eE][+-]?\\d+)?$/.test(bStr);\n\n if (aIsNumber && bIsNumber) {\n return aNum - bNum;\n }\n\n // Check if both are valid dates (ISO format or timestamp)\n const aIsDate = /^\\d{4}-\\d{2}-\\d{2}/.test(aStr) || /^\\d{13}$/.test(aStr);\n const bIsDate = /^\\d{4}-\\d{2}-\\d{2}/.test(bStr) || /^\\d{13}$/.test(bStr);\n\n if (aIsDate && bIsDate) {\n const aDate = new Date(aValue);\n const bDate = new Date(bValue);\n if (!isNaN(aDate.getTime()) && !isNaN(bDate.getTime())) {\n return aDate.getTime() - bDate.getTime();\n }\n }\n\n // String comparison - use localeCompare for proper string sorting\n return aStr.localeCompare(bStr, undefined, {\n sensitivity: \"base\",\n numeric: false,\n });\n};\n\nexport function sortList(list: any[], sort?: SortType) {\n const { sortKey, sortOrder } = sort || {};\n const sortedList = [...(list || [])];\n\n if (sortKey && sortOrder) {\n // sort list\n sortedList.sort((a: any, b: any) => {\n const comparison = compareValues(a[sortKey], b[sortKey]);\n // Handle sort order: desc means reverse the comparison result\n return sortOrder === \"desc\" ? -comparison : comparison;\n });\n }\n return sortedList;\n}\n\nexport function useSort(\n initialSort?: SortType,\n onSortChange?: (sort?: SortType) => void,\n) {\n const [sort, setSort] = useState<SortType | undefined>(initialSort);\n\n const onSort = useCallback((options?: TableSort) => {\n const nextSort = options\n ? {\n sortKey: options.sortKey,\n sortOrder: options.sort,\n }\n : undefined;\n\n setSort(nextSort);\n onSortChange?.(nextSort);\n // initialSort, onSortChange is not needed to be in the dependency array, otherwise it will cause infinite loop\n }, []);\n\n const getSortedList = useCallback(\n (list: any[]) => sortList(list, sort),\n [sort],\n );\n\n return {\n sort,\n onSort,\n getSortedList,\n };\n}\n","import { useCallback } from \"react\";\nimport { useSessionStorage } from \"@kodiak-finance/orderly-hooks\";\nimport { SortType } from \"../../../types/types\";\n\nexport enum PositionsTabName {\n Positions = \"positions\",\n PositionHistory = \"positionHistory\",\n}\n\nexport function useTabSort(options: { storageKey: string }) {\n const [tabSort, setTabSort] = useSessionStorage(options.storageKey, {\n [PositionsTabName.Positions]: {\n sortKey: \"unrealized_pnl\",\n sortOrder: \"desc\",\n },\n [PositionsTabName.PositionHistory]: {\n sortKey: \"close_timestamp\",\n sortOrder: \"desc\",\n },\n } as Record<PositionsTabName, SortType>);\n\n const onTabSort = useCallback(\n (type: PositionsTabName) => (sort?: SortType) => {\n setTabSort({ ...tabSort, [type]: sort });\n },\n [tabSort, setTabSort],\n );\n\n return {\n tabSort,\n onTabSort,\n };\n}\n","import React from \"react\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { Badge, formatAddress, ListView } from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { SymbolProvider } from \"../../provider/symbolProvider\";\nimport type { PositionsProps } from \"../../types/types\";\nimport type { CombinePositionsState } from \"./combinePositions.script\";\nimport { useColumn } from \"./desktop/useColumn\";\nimport { PositionCellWidget } from \"./mobile/positionCell\";\nimport type { PositionsState } from \"./positions.script\";\nimport { PositionsRowProvider } from \"./positionsRowProvider\";\n\nexport const Positions: React.FC<Readonly<PositionsState>> = (props) => {\n const {\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n pagination,\n isLoading,\n dataSource,\n onSymbolChange,\n } = props;\n\n const columns = useColumn({\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n onSymbolChange: onSymbolChange,\n });\n\n return (\n <AuthGuardDataTable<API.PositionTPSLExt>\n loading={isLoading}\n id=\"oui-desktop-positions-content\"\n columns={columns}\n bordered\n dataSource={dataSource}\n generatedRowKey={(record: any) => record.symbol}\n renderRowContainer={(record: any, index: number, children: any) => {\n return (\n <SymbolProvider symbol={record.symbol}>\n <PositionsRowProvider position={record}>\n {children}\n </PositionsRowProvider>\n </SymbolProvider>\n );\n }}\n manualPagination={false}\n pagination={pagination}\n manualSorting={true}\n onSort={props.onSort}\n initialSort={\n props.initialSort\n ? {\n sortKey: props.initialSort.sortKey,\n sort: props.initialSort.sortOrder,\n }\n : undefined\n }\n testIds={{\n body: \"oui-testid-dataList-position-tab-body\",\n }}\n />\n );\n};\n\nexport const MobilePositions: React.FC<\n Readonly<PositionsState & PositionsProps>\n> = (props) => {\n const {\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n dataSource,\n onSymbolChange,\n } = props;\n return (\n <ListView\n className=\"oui-hide-scrollbar oui-w-full oui-space-y-0 oui-overflow-y-hidden\"\n contentClassName=\"!oui-space-y-1\"\n dataSource={dataSource}\n renderItem={(item, index) => (\n <SymbolProvider symbol={item.symbol}>\n <PositionsRowProvider position={item}>\n <PositionCellWidget\n item={item}\n index={index}\n pnlNotionalDecimalPrecision={pnlNotionalDecimalPrecision}\n sharePnLConfig={sharePnLConfig}\n onSymbolChange={onSymbolChange}\n />\n </PositionsRowProvider>\n </SymbolProvider>\n )}\n />\n );\n};\n\nexport const CombinePositions: React.FC<Readonly<CombinePositionsState>> = (\n props,\n) => {\n const {\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n pagination,\n isLoading,\n tableData,\n onSymbolChange,\n mutatePositions,\n } = props;\n\n const columns = useColumn({\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n onSymbolChange: onSymbolChange,\n });\n\n const { dataSource = [] } = tableData;\n\n return (\n <AuthGuardDataTable<any>\n bordered\n loading={isLoading}\n id=\"oui-desktop-positions-content\"\n columns={columns}\n dataSource={dataSource}\n expanded\n getSubRows={(row) => row.children}\n generatedRowKey={(record) => record.id}\n onCell={(column, record) => {\n const isGroup = (record.children ?? []).length > 0;\n if (isGroup) {\n return {\n children:\n column.id === \"symbol\" ? (\n <Badge color=\"neutral\" size=\"xs\">\n {record?.description || formatAddress(record?.id)}\n </Badge>\n ) : null,\n };\n }\n }}\n renderRowContainer={(record: any, index: number, children: any) => {\n if (record.symbol) {\n return (\n <SymbolProvider symbol={record.symbol}>\n <PositionsRowProvider\n position={record}\n mutatePositions={mutatePositions}\n >\n {children}\n </PositionsRowProvider>\n </SymbolProvider>\n );\n }\n return children;\n }}\n manualPagination={false}\n pagination={pagination}\n testIds={{\n body: \"oui-testid-dataList-position-tab-body\",\n }}\n />\n );\n};\n","import { FC, PropsWithChildren, useMemo } from \"react\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { SymbolContext, SymbolContextState } from \"./symbolContext\";\n\ninterface FormatterProviderProps {\n symbol: string;\n}\n\nexport const SymbolProvider: FC<PropsWithChildren<FormatterProviderProps>> = (\n props,\n) => {\n const { symbol, children } = props;\n const symbolInfo = useSymbolsInfo()[symbol];\n const memoizedValue = useMemo<SymbolContextState>(() => {\n return {\n symbol: symbol,\n base_dp: symbolInfo(\"base_dp\"),\n quote_dp: symbolInfo(\"quote_dp\"),\n base_tick: symbolInfo(\"base_tick\"),\n quote_tick: symbolInfo(\"quote_tick\"),\n base: symbolInfo(\"base\"),\n quote: symbolInfo(\"quote\"),\n origin: symbolInfo(),\n quote_max: symbolInfo(\"quote_max\"),\n quote_min: symbolInfo(\"quote_min\"),\n };\n }, [symbol, symbolInfo]);\n return (\n <SymbolContext.Provider value={memoizedValue}>\n {children}\n </SymbolContext.Provider>\n );\n};\n","import { createContext, useContext } from \"react\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\n\nexport interface SymbolContextState {\n base_dp: number;\n quote_dp: number;\n base_tick: number;\n quote_tick: number;\n base: string;\n quote: string;\n symbol: string;\n origin: API.SymbolExt;\n quote_min: number;\n quote_max: number;\n}\n\nexport const SymbolContext = createContext<SymbolContextState>(\n {} as SymbolContextState,\n);\n\nexport const useSymbolContext = () => {\n return useContext(SymbolContext);\n};\n","import { useMemo, useRef } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n Box,\n cn,\n Divider,\n Flex,\n HoverCard,\n Column,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport { SymbolLeverageDialogId } from \"@kodiak-finance/orderly-ui-leverage\";\nimport { SharePnLOptions, SharePnLDialogId } from \"@kodiak-finance/orderly-ui-share\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { FundingFeeButton } from \"../../fundingFeeHistory/fundingFeeButton\";\nimport { ClosePositionWidget } from \"../closePosition\";\nimport { LeverageBadge } from \"./components\";\nimport { renderQuantity } from \"./listElement\";\nimport { NumeralWithCtx } from \"./numeralWithCtx\";\nimport { PartialTPSL } from \"./partialTPSL\";\nimport { ShareButtonWidget } from \"./shareButton\";\nimport { TriggerPrice } from \"./triggerPrice\";\nimport { UnrealizedPnLPopoverCard } from \"./unrealPnLHover\";\n\ninterface ColumnConfig {\n pnlNotionalDecimalPrecision?: number;\n sharePnLConfig?: SharePnLOptions;\n onSymbolChange?: (symbol: API.Symbol) => void;\n}\n\nexport const useColumn = (config: ColumnConfig) => {\n const { pnlNotionalDecimalPrecision, sharePnLConfig, onSymbolChange } =\n config;\n const { t } = useTranslation();\n const fundingFeeEndTime = useRef(Date.now().toString());\n const column = useMemo<Column<API.PositionTPSLExt>[]>(\n () => [\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n fixed: \"left\",\n width: 140,\n onSort: (r1, r2) => {\n return r1.symbol?.localeCompare(r2.symbol || \"\");\n // if (sortOrder === \"asc\") {\n // return r1.symbol.localeCompare(r2.symbol);\n // }\n // return r2.symbol.localeCompare(r1.symbol);\n },\n render: (value: string, record) => (\n <Flex gap={2}>\n <Box\n width={4}\n height={20}\n className={cn(\n \"oui-h-[38px] oui-rounded-[1px]\",\n record.position_qty > 0\n ? \"oui-bg-trade-profit\"\n : \"oui-bg-trade-loss\",\n )}\n />\n <Flex direction=\"column\" itemAlign=\"start\">\n <Text.formatted\n // rule={\"symbol\"}\n formatString=\"base-type\"\n className=\"oui-cursor-pointer\"\n onClick={(e) => {\n onSymbolChange?.({ symbol: value } as API.Symbol);\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {`${value.split(\"_\")[1]}-PERP`}\n </Text.formatted>\n <LeverageBadge\n symbol={value}\n leverage={record.leverage}\n modalId={SymbolLeverageDialogId}\n />\n </Flex>\n </Flex>\n ),\n },\n {\n title: t(\"common.quantity\"),\n dataIndex: \"position_qty\",\n // onSort: true,\n onSort: (a, b) => {\n return a.position_qty - b.position_qty;\n },\n width: 120,\n className: \"oui-pl-6\",\n // rule: \"price\",\n // numeralProps: {\n // coloring: true,\n // // tick: \"base_dp\",\n // },\n render: renderQuantity,\n // render: (value: string) => (\n // <NumeralWithCtx\n // coloring\n // className=\"oui-font-semibold\"\n // tick=\"base_dp\"\n // >\n // {value}\n // </NumeralWithCtx>\n // ),\n },\n {\n title: t(\"common.avgOpen\"),\n className: \"oui-h-[48px]\",\n width: 120,\n onSort: true,\n dataIndex: \"average_open_price\",\n render: (value: string) => {\n // const ctx = usePositionsRowContext();\n return (\n <NumeralWithCtx rm={Decimal.ROUND_DOWN}>{value}</NumeralWithCtx>\n );\n },\n },\n {\n title: t(\"common.markPrice\"),\n dataIndex: \"mark_price\",\n width: 120,\n onSort: true,\n className: \"oui-h-[48px]\",\n render: (value: string) => {\n return (\n <NumeralWithCtx rm={Decimal.ROUND_DOWN}>{value}</NumeralWithCtx>\n );\n },\n },\n {\n title: (\n <Tooltip\n className=\"oui-max-w-[280px] oui-bg-base-8 oui-p-3 oui-text-2xs oui-text-base-contrast-54\"\n content={t(\"positions.column.liqPrice.tooltip\")}\n >\n <Text>{t(\"positions.column.liqPrice\")}</Text>\n </Tooltip>\n ),\n width: 100,\n onSort: true,\n dataIndex: \"est_liq_price\",\n render: (value: string) => {\n return Number(value) === 0 ? (\n \"--\"\n ) : (\n <NumeralWithCtx\n rm={Decimal.ROUND_DOWN}\n className={Number(value) > 0 ? \"oui-text-warning-light\" : \"\"}\n >\n {value ?? \"--\"}\n </NumeralWithCtx>\n );\n },\n },\n {\n title: (\n <HoverCard\n content={<UnrealizedPnLPopoverCard />}\n side=\"top\"\n align=\"center\"\n className=\"oui-max-w-[280px] oui-text-2xs\"\n >\n <Text>{t(\"common.unrealizedPnl\")}</Text>\n </HoverCard>\n ),\n dataIndex: \"unrealized_pnl\",\n width: 180,\n onSort: true,\n rule: \"price\",\n numeralProps: {\n coloring: true,\n // tick: \"base_dp\",\n },\n // hint: <UnrealizedPnLPopoverCard />,\n render: (value: string, record) => {\n return (\n <Flex gap={2}>\n <Flex>\n <Text.numeral\n dp={pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"oui-font-semibold\"\n >\n {value}\n </Text.numeral>\n <Text.numeral\n rule=\"percentages\"\n dp={pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"oui-font-semibold\"\n prefix=\"(\"\n suffix=\")\"\n >\n {record.unrealized_pnl_ROI}\n </Text.numeral>\n </Flex>\n <ShareButtonWidget\n position={record}\n sharePnLConfig={sharePnLConfig}\n modalId={SharePnLDialogId}\n />\n </Flex>\n );\n },\n },\n {\n title: t(\"common.fullTPSL\"),\n dataIndex: \"full_tpsl\",\n width: 150,\n render: (_: string, record) => {\n return (\n <TriggerPrice\n stopLossPrice={record.full_tp_sl?.sl_trigger_price}\n takeProfitPrice={record.full_tp_sl?.tp_trigger_price}\n />\n );\n },\n },\n\n {\n title: t(\"common.partialTPSL\"),\n dataIndex: \"partial_tpsl\",\n width: 150,\n render: (_: string, record) => (\n <PartialTPSL\n orderNum={record.partial_tp_sl?.order_num}\n tpTriggerPrice={record.partial_tp_sl?.tp_trigger_price}\n slTriggerPrice={record.partial_tp_sl?.sl_trigger_price}\n />\n ),\n },\n {\n title: t(\"common.notional\"),\n dataIndex: \"notional\",\n className: \"oui-h-[48px]\",\n width: 100,\n onSort: true,\n render: (value: string) => (\n <Text.numeral dp={pnlNotionalDecimalPrecision}>{value}</Text.numeral>\n ),\n },\n {\n title: (\n <Tooltip\n className=\"oui-max-w-[280px] oui-bg-base-8 oui-p-3 oui-text-2xs oui-text-base-contrast-54\"\n content={\n <Flex\n direction={\"column\"}\n gap={3}\n className=\"oui-rounded-sm oui-bg-base-8 oui-text-base-contrast-54\"\n >\n <span>{t(\"positions.column.margin.tooltip\")}</span>\n <Divider className=\"oui-w-full\" />\n <span>{t(\"positions.column.margin.formula\")}</span>\n </Flex>\n }\n >\n <Text>{t(\"positions.column.margin\")}</Text>\n </Tooltip>\n ),\n dataIndex: \"mm\",\n onSort: true,\n width: 100,\n rule: \"price\",\n render: (value: string) => <Text.numeral>{value}</Text.numeral>,\n },\n {\n title: t(\"funding.fundingFee\"),\n dataIndex: \"fundingFee\",\n width: 100,\n render: (value, record) => (\n <FundingFeeButton\n fee={value}\n symbol={record.symbol}\n start_t={record.timestamp.toString()}\n end_t={fundingFeeEndTime.current}\n />\n ),\n },\n // {\n // title: t(\"common.qty\"),\n // dataIndex: \"close_qty\",\n // width: 100,\n // fixed: \"right\",\n // render: renderQuantityInput,\n // },\n // {\n // title: t(\"common.price\"),\n // dataIndex: \"close_price\",\n // width: 100,\n // fixed: \"right\",\n // render: renderPriceInput,\n // // render: (value: string) => <PriceInput />,\n // },\n {\n title: null,\n dataIndex: \"close_position\",\n align: \"right\",\n width: 70,\n fixed: \"right\",\n render() {\n return (\n <Flex gapX={2} justify={\"end\"}>\n <ClosePositionWidget />\n </Flex>\n );\n },\n },\n ],\n [pnlNotionalDecimalPrecision, sharePnLConfig, t],\n );\n return column;\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Badge,\n Button,\n cn,\n Divider,\n Flex,\n Input,\n inputFormatter,\n SimpleDialog,\n SimpleSheet,\n Text,\n ThrottledButton,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ClosePositionScriptReturn } from \"./closePosition.script\";\nimport {\n LimitConfirmDialog,\n MarketCloseConfirm,\n} from \"./components/confirmDialog\";\nimport { QuantitySlider } from \"./components/quantitySlider\";\n\nexport const MobileClosePosition: FC<ClosePositionScriptReturn> = (props) => {\n const {\n base,\n base_dp,\n quote,\n quote_dp,\n sheetOpen,\n setSheetOpen,\n dialogOpen,\n setDialogOpen,\n quantity,\n price,\n submitting,\n priceErrorMsg,\n quantityErrorMsg,\n disabled,\n isMarketClose,\n position,\n maxQty,\n isBuy,\n } = props;\n const { t } = useTranslation();\n\n const title = isMarketClose\n ? t(\"positions.marketClose\")\n : t(\"positions.limitClose\");\n\n const orderType = isMarketClose\n ? t(\"orderEntry.orderType.market\")\n : t(\"orderEntry.orderType.limit\");\n\n const orderSide = isBuy ? (\n <Badge color=\"success\" size=\"xs\">\n {t(\"common.buy\")}\n </Badge>\n ) : (\n <Badge color=\"danger\" size=\"xs\">\n {t(\"common.sell\")}\n </Badge>\n );\n\n const header = (\n <Flex width={\"100%\"} justify={\"between\"}>\n <Text.formatted rule={\"symbol\"} showIcon>\n {position.symbol}\n </Text.formatted>\n <Flex gap={1}>\n <Badge color=\"neutral\" size=\"xs\">\n {orderType}\n </Badge>\n {orderSide}\n </Flex>\n </Flex>\n );\n\n const lastPrice = (\n <Flex width={\"100%\"} justify={\"between\"}>\n <Text intensity={54}>{t(\"common.lastPrice\")}</Text>\n <Text.numeral dp={quote_dp} suffix={<Text intensity={36}> {quote}</Text>}>\n {position.mark_price}\n </Text.numeral>\n </Flex>\n );\n\n const inputForm = !isMarketClose && (\n <>\n <Flex width={\"100%\"} direction={\"column\"} gap={2}>\n <Input.tooltip\n prefix={t(\"common.price\")}\n suffix={quote}\n align=\"right\"\n fullWidth\n autoComplete=\"off\"\n inputMode=\"decimal\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(quote_dp),\n ]}\n triggerClassName=\"oui-w-full\"\n tooltip={priceErrorMsg}\n color={priceErrorMsg ? \"danger\" : undefined}\n value={price}\n onValueChange={props.updatePriceChange}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n suffix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-w-full oui-outline-line-12\",\n priceErrorMsg ? \"oui-outline-danger\" : undefined,\n ),\n }}\n />\n <Input.tooltip\n prefix={t(\"common.quantity\")}\n suffix={base}\n align=\"right\"\n fullWidth\n autoComplete=\"off\"\n inputMode=\"decimal\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(base_dp),\n ]}\n triggerClassName=\"oui-w-full\"\n tooltip={quantityErrorMsg}\n color={quantityErrorMsg ? \"danger\" : undefined}\n value={quantity}\n onBlur={() => props.formatQuantityToBaseTick(quantity)}\n onValueChange={props.updateQuantity}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n suffix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-w-full oui-outline-line-12\",\n quantityErrorMsg ? \"oui-outline-danger\" : undefined,\n ),\n }}\n />\n </Flex>\n </>\n );\n\n const slider = (\n <QuantitySlider\n value={props.sliderValue}\n onValueChange={props.onSliderValueChange}\n base_dp={base_dp}\n max={maxQty}\n onMax={props.onMax}\n />\n );\n\n const footer = (\n <Flex width={\"100%\"} gap={3} mt={2}>\n <Button fullWidth color=\"secondary\" onClick={props.onCloseSheet}>\n {t(\"common.cancel\")}\n </Button>\n\n <ThrottledButton\n fullWidth\n disabled={submitting || disabled}\n loading={submitting}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n props.onDoubleConfirm();\n }}\n >\n {t(\"common.confirm\")}\n </ThrottledButton>\n </Flex>\n );\n\n return (\n <>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"sm\"\n className=\"oui-border-base-contrast-36\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n setSheetOpen(true);\n }}\n >\n {title}\n </Button>\n\n <SimpleSheet title={title} open={sheetOpen} onOpenChange={setSheetOpen}>\n <Flex\n direction={\"column\"}\n gap={3}\n width={\"100%\"}\n itemAlign={\"start\"}\n className=\"oui-text-sm\"\n >\n {header}\n <Divider className=\"oui-w-full\" />\n {lastPrice}\n {inputForm}\n {slider}\n {footer}\n </Flex>\n </SimpleSheet>\n\n <SimpleDialog open={dialogOpen} onOpenChange={setDialogOpen} size=\"xs\">\n {isMarketClose ? (\n <MarketCloseConfirm\n base={base}\n quantity={quantity}\n submitting={submitting}\n onClose={props.onCloseDialog}\n onConfirm={props.onConfirm}\n hideCloseIcon\n />\n ) : (\n <LimitConfirmDialog\n base={base}\n quoteDp={quote_dp}\n quantity={quantity}\n price={price}\n submitting={submitting}\n order={props.closeOrderData}\n onClose={props.onCloseDialog}\n onConfirm={props.onConfirm}\n hideCloseIcon\n />\n )}\n </SimpleDialog>\n </>\n );\n};\n","import { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Flex, Slider, Text } from \"@kodiak-finance/orderly-ui\";\n\ntype QuantitySliderProps = {\n value: number;\n onValueChange: (value: number) => void;\n base_dp: number;\n max: number;\n onMax: () => void;\n};\n\nexport const QuantitySlider = (props: QuantitySliderProps) => {\n const { t } = useTranslation();\n\n return (\n <>\n <Slider\n showTip\n markCount={4}\n value={[props.value]}\n color=\"primary\"\n onValueChange={(value) => {\n props.onValueChange(value[0]);\n }}\n />\n <Flex width={\"100%\"} justify={\"between\"}>\n <Text color=\"primary\" size=\"2xs\">{`${props.value}%`}</Text>\n <Flex gap={1} onClick={props.onMax} className=\"oui-cursor-pointer\">\n <Text size=\"2xs\" color=\"primary\">\n {t(\"common.max\")}\n </Text>\n <Text.numeral\n intensity={54}\n size=\"2xs\"\n dp={props.base_dp}\n padding={false}\n >\n {props.max}\n </Text.numeral>\n </Flex>\n </Flex>\n </>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\nimport {\n Button,\n cn,\n Divider,\n Flex,\n Input,\n inputFormatter,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n Select,\n SimpleDialog,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ClosePositionScriptReturn } from \"./closePosition.script\";\nimport {\n ConfirmFooter,\n LimitConfirmDialog,\n MarketCloseConfirm,\n} from \"./components/confirmDialog\";\nimport { QuantitySlider } from \"./components/quantitySlider\";\n\nexport const DesktopClosePosition: FC<ClosePositionScriptReturn> = (props) => {\n const {\n position,\n base,\n base_dp,\n quote_dp,\n price,\n quantity,\n submitting,\n dialogOpen,\n setDialogOpen,\n isMarketClose,\n popoverOpen,\n setPopoverOpen,\n maxQty,\n quantityErrorMsg,\n priceErrorMsg,\n isEntirePosition,\n } = props;\n\n const { t } = useTranslation();\n\n // const disabled = isMarketClose ? !quantity : !price || !quantity;\n\n const quantityForm = (\n <Flex width=\"100%\" gap={2} mb={1}>\n <Input.tooltip\n ref={props.quantityInputRef}\n prefix={t(\"common.quantity\")}\n suffix={\n isEntirePosition ? (\n <Text\n size=\"2xs\"\n intensity={54}\n className=\"oui-cursor-pointer oui-px-3\"\n onClick={props.onEntirePosition}\n >\n {t(\"tpsl.entirePosition\")}\n </Text>\n ) : (\n base\n )\n }\n align=\"right\"\n size=\"md\"\n fullWidth\n autoComplete=\"off\"\n inputMode=\"decimal\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(base_dp),\n ]}\n triggerClassName=\"oui-w-full\"\n tooltip={quantityErrorMsg}\n color={quantityErrorMsg ? \"danger\" : undefined}\n value={isEntirePosition ? \"\" : quantity}\n onBlur={() => props.formatQuantityToBaseTick(quantity)}\n onValueChange={props.updateQuantity}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n suffix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-w-full oui-outline-line-12\",\n quantityErrorMsg ? \"oui-outline-danger\" : undefined,\n ),\n }}\n />\n <Button\n onClick={props.onMax}\n size=\"md\"\n variant=\"outlined\"\n className={cn(\n \"oui-text-2xs\",\n isEntirePosition\n ? \"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20\"\n : \"oui-border-line-12 oui-bg-base-6 oui-text-base-contrast-54 hover:oui-bg-base-5\",\n )}\n >\n {t(\"common.position\")}\n </Button>\n </Flex>\n );\n\n const suffix = (\n <Select.options\n variant=\"text\"\n size=\"md\"\n options={[\n {\n label: t(\"orderEntry.orderType.limit\"),\n value: OrderType.LIMIT,\n },\n {\n label: t(\"orderEntry.orderType.market\"),\n value: OrderType.MARKET,\n },\n ]}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n value={props.type}\n onValueChange={(value) => {\n props.updateOrderType(value as OrderType);\n }}\n contentProps={{\n align: \"end\",\n className: \"oui-border oui-border-line-6\",\n }}\n />\n );\n\n const disabledInput = isMarketClose;\n\n const priceForm = (\n <Input.tooltip\n suffix={suffix}\n size=\"md\"\n fullWidth\n autoComplete=\"off\"\n inputMode=\"decimal\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(quote_dp),\n ]}\n triggerClassName=\"oui-w-full\"\n tooltip={priceErrorMsg}\n color={priceErrorMsg ? \"danger\" : undefined}\n value={price}\n onValueChange={props.updatePriceChange}\n placeholder={disabledInput ? \"--\" : \"\"}\n disabled={disabledInput}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n suffix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-w-full oui-outline-line-12\",\n priceErrorMsg ? \"oui-outline-danger\" : undefined,\n // when disabled, override the outline color\n disabledInput ? \"focus-within:oui-outline-line-12\" : undefined,\n ),\n }}\n />\n );\n\n return (\n <>\n <PopoverRoot open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger\n asChild\n onClick={() => {\n setPopoverOpen(true);\n }}\n >\n <Button variant=\"outlined\" size=\"sm\" color=\"secondary\">\n {t(\"positions.column.close\")}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"oui-w-[360px] oui-p-5\",\n popoverOpen ? \"oui-visible\" : \"oui-invisible\",\n )}\n align=\"end\"\n side=\"top\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Flex gapY={2} direction=\"column\">\n {quantityForm}\n <QuantitySlider\n value={props.sliderValue}\n onValueChange={props.onSliderValueChange}\n base_dp={base_dp}\n max={maxQty}\n onMax={props.onMax}\n />\n <Divider my={2} intensity={8} className=\"oui-w-full\" />\n {priceForm}\n <ConfirmFooter\n onConfirm={props.onDoubleConfirm}\n onCancel={props.onClosePopover}\n submitting={submitting}\n disabled={props.disabled}\n />\n </Flex>\n </PopoverContent>\n </PopoverRoot>\n\n <SimpleDialog open={dialogOpen} onOpenChange={setDialogOpen} size=\"sm\">\n {isMarketClose ? (\n <MarketCloseConfirm\n base={base}\n quantity={quantity}\n submitting={submitting}\n onClose={props.onCloseDialog}\n onConfirm={props.onConfirm}\n classNames={{\n root: \"oui-items-start\",\n }}\n hideCloseIcon\n />\n ) : (\n <LimitConfirmDialog\n base={base}\n quoteDp={quote_dp}\n quantity={quantity}\n price={price}\n submitting={submitting}\n order={props.closeOrderData}\n onClose={props.onCloseDialog}\n onConfirm={props.onConfirm}\n hideCloseIcon\n />\n )}\n </SimpleDialog>\n </>\n );\n};\n","import { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport {\n ClosePositionScriptProps,\n useClosePositionScript,\n} from \"./closePosition.script\";\nimport { DesktopClosePosition } from \"./closePosition.ui\";\nimport { MobileClosePosition } from \"./closePositions.mobile.ui\";\n\ntype ClosePositionWidgetProps = Pick<ClosePositionScriptProps, \"type\">;\n\nexport const ClosePositionWidget = (props: ClosePositionWidgetProps) => {\n const state = useClosePositionScript(props);\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return <MobileClosePosition {...state} />;\n }\n\n return <DesktopClosePosition {...state} />;\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage, utils } from \"@kodiak-finance/orderly-hooks\";\nimport { useOrderEntryFormErrorMsg } from \"@kodiak-finance/orderly-react-app\";\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\n\nexport type ClosePositionScriptProps = {\n type?: OrderType.MARKET | OrderType.LIMIT;\n};\n\nexport type ClosePositionScriptReturn = ReturnType<\n typeof useClosePositionScript\n>;\n\nexport const useClosePositionScript = (props: ClosePositionScriptProps) => {\n const [sheetOpen, setSheetOpen] = useState(false);\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [sliderValue, setSliderValue] = useState(100);\n const quantityInputRef = useRef<HTMLInputElement>(null);\n const [orderConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const {\n position,\n onSubmit,\n price,\n quantity,\n closeOrderData,\n submitting,\n updatePriceChange,\n updateOrderType,\n updateQuantity,\n errors,\n baseTick,\n type,\n } = usePositionsRowContext();\n const { quote_dp, base_dp, base, quote } = useSymbolContext();\n const { getErrorMsg } = useOrderEntryFormErrorMsg(errors);\n\n // buy position quantity is positive, sell position quantity is negative\n const isBuy = position.position_qty > 0;\n\n // we need to use Math.abs to get the absolute value of the position quantity\n const maxQty = Math.abs(position.position_qty);\n\n // close position type: limit or market\n const closeType = props.type || type;\n\n const isMarketClose = closeType === OrderType.MARKET;\n\n const isEntirePosition = maxQty?.toString() === quantity.toString();\n\n useEffect(() => {\n // mobile sheet open, update order type\n if (sheetOpen) {\n updateOrderType(props.type as OrderType);\n }\n }, [props.type, sheetOpen]);\n\n // reset state when sheet is closed\n // useEffect(() => {\n // if (!sheetOpen || !popoverOpen) {\n // // set default slider value to 100 when table edit remove\n // updateQuantity(maxQty?.toString());\n // }\n // }, [sheetOpen, popoverOpen, maxQty]);\n\n const { priceErrorMsg, quantityErrorMsg } = useMemo(() => {\n return {\n priceErrorMsg: getErrorMsg(\"order_price\"),\n quantityErrorMsg: getErrorMsg(\"order_quantity\"),\n };\n // getErrorMsg is changed when errors is changed\n }, [errors]);\n\n const disabled = !!(priceErrorMsg || quantityErrorMsg);\n\n const formatQuantityToBaseTick = useCallback(\n (value: string) => {\n if (baseTick && baseTick > 0) {\n // format quantity to baseTick\n const formatQty = utils.formatNumber(value, baseTick) ?? value;\n updateQuantity(formatQty);\n }\n },\n [baseTick, updateQuantity],\n );\n\n const onSliderValueChange = useCallback(\n (value: number) => {\n setSliderValue(value);\n\n // transform slider value to quantity\n const qty = new Decimal(value)\n .div(100)\n .mul(maxQty)\n .toFixed(base_dp, Decimal.ROUND_DOWN);\n\n formatQuantityToBaseTick(qty);\n },\n [maxQty, base_dp, formatQuantityToBaseTick],\n );\n\n useEffect(() => {\n const qty = Math.min(Number(quantity || 0), maxQty);\n // transform quantity to slider value\n const slider = new Decimal(qty)\n .div(maxQty)\n .mul(100)\n .toDecimalPlaces(2, Decimal.ROUND_DOWN)\n .toNumber();\n\n setSliderValue(slider);\n }, [quantity]);\n\n const onMax = useCallback(() => {\n updateQuantity(maxQty?.toString());\n }, [maxQty, updateQuantity]);\n\n const onConfirm = useCallback(() => {\n return onSubmit().then((res) => {\n setSheetOpen(false);\n setDialogOpen(false);\n setPopoverOpen(false);\n });\n }, [onSubmit]);\n\n const onDoubleConfirm = useCallback(() => {\n if (!orderConfirm) {\n return onConfirm();\n }\n setDialogOpen(true);\n return Promise.resolve();\n }, [onConfirm, orderConfirm]);\n\n const onCloseSheet = useCallback(() => {\n setSheetOpen(false);\n }, []);\n\n const onCloseDialog = useCallback(() => {\n setDialogOpen(false);\n }, []);\n\n const onClosePopover = useCallback(() => {\n setPopoverOpen(false);\n }, []);\n\n // when click entire position button, set quantity to 0 and focus on input\n const onEntirePosition = useCallback(() => {\n updateQuantity(\"0\");\n quantityInputRef.current?.focus();\n\n setTimeout(() => {\n quantityInputRef.current?.setSelectionRange(0, 1);\n }, 0);\n }, [updateQuantity]);\n\n return {\n position,\n closeOrderData,\n quote_dp,\n base_dp,\n base,\n quote,\n price,\n quantity,\n submitting,\n\n onConfirm,\n onDoubleConfirm,\n updatePriceChange,\n updateQuantity,\n formatQuantityToBaseTick,\n updateOrderType,\n\n sliderValue,\n onSliderValueChange,\n\n priceErrorMsg,\n quantityErrorMsg,\n disabled,\n isMarketClose,\n\n maxQty,\n onMax,\n isBuy,\n isEntirePosition,\n type: closeType,\n quantityInputRef,\n onEntirePosition,\n\n sheetOpen,\n onCloseSheet,\n setSheetOpen,\n\n dialogOpen,\n setDialogOpen,\n onCloseDialog,\n\n popoverOpen,\n setPopoverOpen,\n onClosePopover,\n };\n};\n","import { useLocalStorage, useLeverageBySymbol } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { PositionType } from \"@kodiak-finance/orderly-types\";\nimport {\n ChevronRightIcon,\n cn,\n EditIcon,\n Text,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { modal } from \"@kodiak-finance/orderly-ui\";\nimport {\n PositionTPSLPopover,\n TPSLDetailDialogId,\n TPSLDialogId,\n TPSLSheetId,\n TPSLDetailSheetId,\n} from \"@kodiak-finance/orderly-ui-tpsl\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\n\n// ------------ TP/SL Price input end------------\nexport const TPSLButton = () => {\n const { position, baseDp, quoteDp, tpslOrder } = usePositionsRowContext();\n const { t } = useTranslation();\n return (\n <PositionTPSLPopover\n position={position}\n order={tpslOrder}\n label={t(\"common.tpsl\")}\n baseDP={baseDp}\n quoteDP={quoteDp}\n isEditing={false}\n />\n );\n};\n\nexport const TPSLEditIcon = () => {\n const { position, baseDp, quoteDp, tpslOrder } = usePositionsRowContext();\n const { isMobile } = useScreen();\n\n const onEdit = () => {\n const dialogId = isMobile ? TPSLDetailSheetId : TPSLDetailDialogId;\n modal.show(dialogId, {\n order: tpslOrder,\n position: position,\n baseDP: baseDp,\n quoteDP: quoteDp,\n });\n };\n\n return (\n // <PositionTPSLPopover\n // position={position}\n // order={tpslOrder}\n // baseDP={baseDp}\n // quoteDP={quoteDp}\n // isEditing\n // >\n <EditIcon\n onClick={onEdit}\n opacity={1}\n className=\"oui-cursor-pointer oui-text-base-contrast-54\"\n size={16}\n />\n // </PositionTPSLPopover>\n );\n};\n\nexport const AddIcon = (props: { positionType: PositionType }) => {\n const { position, baseDp, quoteDp, tpslOrder } = usePositionsRowContext();\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const onAdd = () => {\n const dialogId = isMobile ? TPSLSheetId : TPSLDialogId;\n const modalParams = {\n symbol: position.symbol,\n baseDP: baseDp,\n quoteDP: quoteDp,\n isEditing: false,\n positionType: props.positionType,\n };\n modal.show(dialogId, modalParams);\n };\n return (\n <Text\n className={cn(\n \"oui-cursor-pointer oui-text-base-contrast\",\n isMobile && \"oui-text-base-contrast-80\",\n )}\n onClick={onAdd}\n >\n {t(\"tpsl.add\")}\n </Text>\n );\n};\n\ntype LeverageBadgeProps = {\n symbol: string;\n leverage: number;\n modalId: string;\n};\n\nexport const LeverageBadge = (props: LeverageBadgeProps) => {\n const { symbol, leverage } = props;\n\n const showModal = () => {\n modal.show(props.modalId, {\n symbol,\n curLeverage: leverage,\n });\n };\n\n return (\n <div\n className={cn(\n \"oui-flex oui-h-[18px] oui-items-center oui-gap-1\",\n \"oui-cursor-pointer oui-rounded oui-bg-line-6 oui-pl-2 oui-pr-1\",\n \"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\",\n )}\n onClick={showModal}\n >\n <Text>Cross</Text>\n {leverage ? (\n <Text.numeral dp={0} rm={Decimal.ROUND_DOWN} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n ) : (\n <LeverageDisplay symbol={symbol} />\n )}\n <ChevronRightIcon\n size={14}\n opacity={1}\n className=\"oui-text-base-contrast-36\"\n />\n </div>\n );\n};\n\n/** TODO: remove this */\nexport const LeverageDisplay = ({ symbol }: { symbol: string }) => {\n const leverage = useLeverageBySymbol(symbol);\n\n return (\n <Text.numeral dp={0} rm={Decimal.ROUND_DOWN} size=\"2xs\" unit=\"X\">\n {leverage || 1}\n </Text.numeral>\n );\n};\n","import { Text } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\nimport { PriceInput } from \"./priceInput\";\nimport { QuantityInput } from \"./quantityInput\";\n\nexport const renderQuantity = (value: number) => {\n const symbolInfo = useSymbolContext();\n return (\n <Text.numeral\n dp={symbolInfo.base_dp}\n rm={Decimal.ROUND_DOWN}\n padding={false}\n coloring\n >\n {value}\n </Text.numeral>\n );\n};\n\nexport const renderQuantityInput = (value: number, record: any) => {\n return <QuantityInput value={record[\"position_qty\"]} />;\n};\n\nexport const renderPriceInput = (value: number) => {\n return <PriceInput />;\n};\n","import { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\nimport {\n CaretDownIcon,\n cn,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Input,\n inputFormatter,\n} from \"@kodiak-finance/orderly-ui\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\n\nexport const PriceInput = () => {\n const { type, quoteDp, price, updatePriceChange, updateOrderType } =\n usePositionsRowContext();\n const { t } = useTranslation();\n\n return (\n <DropdownMenuRoot>\n <Input\n size=\"sm\"\n value={\n type === OrderType.LIMIT ? price : t(\"orderEntry.orderType.market\")\n }\n inputMode=\"decimal\"\n onValueChange={(e) => updatePriceChange(e)}\n formatters={[\n inputFormatter.numberFormatter,\n ...(quoteDp ? [inputFormatter.dpFormatter(quoteDp)] : []),\n ]}\n onFocus={() => {\n if (type === OrderType.MARKET) {\n updateOrderType(OrderType.LIMIT);\n }\n }}\n suffix={\n <DropdownMenuTrigger asChild>\n <button className=\"oui-h-full oui-px-1\">\n <CaretDownIcon size={12} color=\"white\" />\n </button>\n </DropdownMenuTrigger>\n }\n classNames={{\n root: cn(\n \"oui-border oui-border-solid oui-border-white/[0.12] oui-outline-none focus-within:oui-outline-primary-light\",\n ),\n }}\n />\n <DropdownMenuContent\n align=\"end\"\n className=\"oui-w-[96px] oui-min-w-[96px]\"\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <DropdownMenuGroup>\n <DropdownMenuItem\n size=\"xs\"\n onSelect={() => {\n updateOrderType(OrderType.MARKET);\n }}\n >\n <span>{t(\"common.marketPrice\")}</span>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenuRoot>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport { utils } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n PopoverRoot,\n PopoverContent,\n PopoverTrigger,\n Flex,\n Text,\n Slider,\n Button,\n inputFormatter,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Input } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\n\nexport const QuantityInput = (props: { value: number }) => {\n const [sliderValue, setSliderValue] = useState<number>(100);\n const { baseDp, updateQuantity, quantity, baseTick } =\n usePositionsRowContext();\n\n const resetQuantity = (percent: number) => {\n formatQuantityToBaseTick(`${props.value * percent}`);\n };\n\n const formatQuantityToBaseTick = (value: string) => {\n if (baseTick && baseTick > 0) {\n // format quantity to baseTick\n const formatQty = utils.formatNumber(value, baseTick) ?? value;\n updateQuantity(formatQty);\n }\n };\n\n useEffect(() => {\n const maxQty = Math.abs(props.value);\n const qty = Math.min(Number(quantity || 0), maxQty);\n\n // transform quantity to slider value\n const slider = new Decimal(qty)\n .div(maxQty)\n .mul(100)\n .todp(2, Decimal.ROUND_DOWN)\n .toNumber();\n\n setSliderValue(slider);\n }, [quantity, props.value]);\n\n return (\n <PopoverRoot>\n <PopoverTrigger>\n <Input\n size=\"sm\"\n inputMode=\"decimal\"\n classNames={{\n root: \"oui-outline-none oui-border oui-border-solid oui-border-white/[0.12] focus-within:oui-outline-primary-light\",\n }}\n formatters={[\n inputFormatter.numberFormatter,\n ...(baseDp ? [inputFormatter.dpFormatter(baseDp)] : []),\n ]}\n value={quantity}\n onBlur={(event) => formatQuantityToBaseTick(event.target.value)}\n onValueChange={updateQuantity}\n />\n </PopoverTrigger>\n <PopoverContent\n className=\"oui-w-[360px] oui-rounded-xl\"\n align=\"start\"\n side=\"bottom\"\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n <Flex p={1} gap={2} width={\"100%\"} itemAlign={\"start\"}>\n <Text size=\"xs\" intensity={98} className=\"oui-min-w-[40px]\">\n {`${sliderValue}%`}\n </Text>\n <Flex direction={\"column\"} width={\"100%\"} gap={2}>\n <Slider\n markCount={4}\n value={[sliderValue]}\n onValueChange={(values) => {\n resetQuantity(values[0] / 100);\n }}\n />\n <PercentButtons onClick={resetQuantity} />\n </Flex>\n </Flex>\n </PopoverContent>\n </PopoverRoot>\n );\n};\n\nconst PercentButtons = (props: { onClick: (value: number) => void }) => {\n const { t } = useTranslation();\n const list = [\n {\n label: \"0%\",\n value: 0,\n },\n {\n label: \"25%\",\n value: 0.25,\n },\n {\n label: \"50%\",\n value: 0.5,\n },\n {\n label: \"75%\",\n value: 0.75,\n },\n {\n label: t(\"common.max\"),\n value: 1,\n },\n ];\n\n return (\n <Flex gap={2} width={\"100%\"}>\n {list.map((item, index) => {\n return (\n <Button\n key={index}\n variant=\"outlined\"\n color=\"secondary\"\n size=\"xs\"\n onClick={(e) => {\n e.stopPropagation();\n props.onClick(item.value);\n }}\n className=\"oui-w-1/5\"\n >\n {item.label}\n </Button>\n );\n })}\n </Flex>\n );\n};\n","import React from \"react\";\nimport { NumeralProps, Text } from \"@kodiak-finance/orderly-ui\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\n\nexport type TickName = \"quote_dp\" | \"base_dp\";\n\nexport const NumeralWithCtx: React.FC<\n React.PropsWithChildren<\n Omit<NumeralProps, \"precision\" | \"tick\"> & { tick?: TickName }\n >\n> = (props) => {\n const { tick = \"quote_dp\", children, ...rest } = props;\n const symbolInfo = useSymbolContext();\n\n if (!symbolInfo) {\n // TODO i18n\n throw new Error(\"NumeralWithCtx must be used inside SymbolProvider\");\n }\n\n return (\n <Text.numeral as={\"span\" as any} dp={symbolInfo[tick]} {...rest}>\n {children}\n </Text.numeral>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { PositionType } from \"@kodiak-finance/orderly-types\";\nimport { cn, Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\nimport { AddIcon, TPSLEditIcon } from \"./components\";\n\nexport const PartialTPSL: FC<{\n orderNum?: number;\n tpTriggerPrice?: number;\n slTriggerPrice?: number;\n direction?: \"column\" | \"row\";\n}> = (props) => {\n const {\n orderNum,\n tpTriggerPrice,\n slTriggerPrice,\n direction = \"column\",\n } = props;\n const { partialTPSLOrder: order, quoteDp, baseDp } = usePositionsRowContext();\n const symbolInfo = useSymbolsInfo();\n const { t } = useTranslation();\n\n const child = useMemo(() => {\n const children = [];\n\n if (!order?.symbol) return <AddIcon positionType={PositionType.PARTIAL} />;\n\n if (tpTriggerPrice) {\n children.push(\n <Text.formatted\n className={cn(\n \"oui-text-trade-profit oui-gap-0 oui-decoration-white/20\",\n )}\n key={\"tp\"}\n rule=\"price\"\n dp={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={tpTriggerPrice}\n prefix={\n !slTriggerPrice || direction === \"column\" ? (\n <Text intensity={54}>{`${t(\"tpsl.tp\")} - `}</Text>\n ) : (\n \"\"\n )\n }\n />,\n );\n }\n if (slTriggerPrice) {\n children.push(\n <Text.formatted\n key={\"sl\"}\n className={cn(\n \"oui-text-trade-loss oui-gap-0 oui-decoration-white/20 \",\n )}\n rule={\"price\"}\n dp={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n prefix={<Text intensity={54}>{`${t(\"tpsl.sl\")} - `}</Text>}\n >\n {slTriggerPrice}\n </Text.formatted>,\n );\n }\n if (children.length === 0)\n return <AddIcon positionType={PositionType.PARTIAL} />;\n\n if (children.length === 2 && direction === \"row\") {\n children.splice(1, 0, <Text key={\"split\"}>/</Text>);\n }\n\n return children;\n }, [tpTriggerPrice, slTriggerPrice, order?.symbol, t]);\n const hasTPSL = Array.isArray(child) ? !!child.length : !child;\n return (\n <Flex className=\"oui-gap-[6px]\">\n <div\n className={cn(\n \"oui-inline-flex oui-text-base-contrast-36\",\n direction === \"column\" ? \"oui-flex-col\" : \"oui-flex-row oui-gap-1\",\n )}\n >\n {child}\n </div>\n {hasTPSL && (\n <>\n <Text className=\"oui-text-base-contrast-54\">({orderNum})</Text>\n <TPSLEditIcon />\n </>\n )}\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { ShareIcon } from \"@kodiak-finance/orderly-ui\";\nimport { ShareButtonScriptReturn } from \"./shareButton.script\";\n\nexport const ShareButton: FC<ShareButtonScriptReturn> = (props) => {\n if (!props.sharePnLConfig) {\n return null;\n }\n\n return (\n <button\n type=\"button\"\n onClick={(e: any) => {\n e.stopPropagation();\n props.showModal();\n }}\n >\n <ShareIcon color=\"white\" opacity={0.54} size={props.iconSize ?? 16} />\n </button>\n );\n};\n","import { useMemo } from \"react\";\nimport {\n useAccountInfo,\n useReferralInfo,\n useLeverageBySymbol,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { account, positions } from \"@kodiak-finance/orderly-perp\";\nimport { modal } from \"@kodiak-finance/orderly-ui\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\n\nexport type ShareButtonScriptOptions = {\n position: any;\n sharePnLConfig?: SharePnLConfig;\n modalId: string;\n iconSize?: number;\n isPositionHistory?: boolean;\n};\n\nexport type ShareButtonScriptReturn = ReturnType<typeof useShareButtonScript>;\n\nexport const useShareButtonScript = (props: ShareButtonScriptOptions) => {\n const { position, sharePnLConfig, iconSize } = props;\n const { getFirstRefCode } = useReferralInfo();\n const symbolsInfo = useSymbolsInfo();\n const { data: accountInfo } = useAccountInfo();\n\n const refCode = useMemo(() => {\n return getFirstRefCode()?.code;\n }, [getFirstRefCode]);\n\n const symbolLeverage = useLeverageBySymbol(position.symbol);\n\n const getHistoryEntity = () => {\n const netPnL = position.netPnL || 0;\n const openPrice = Math.abs(position.avg_open_price);\n const quantity = Math.abs(position.closed_position_qty);\n\n let roi;\n\n const symbolInfo = symbolsInfo[position.symbol];\n const baseIMR = symbolInfo(\"base_imr\");\n const IMR_Factor = symbolInfo(\"imr_factor\");\n\n // calculate unrealized pnl ROI for position history\n if (\n netPnL !== 0 &&\n quantity !== 0 &&\n openPrice !== 0 &&\n accountInfo?.max_leverage &&\n baseIMR &&\n IMR_Factor\n ) {\n const notional = positions.notional(quantity, openPrice);\n\n const maxLeverage = position.leverage\n ? position.leverage\n : accountInfo.max_leverage;\n\n const imr = account.IMR({\n maxLeverage,\n baseIMR: baseIMR,\n IMR_Factor: IMR_Factor,\n positionNotional: notional,\n ordersNotional: 0,\n IMR_factor_power: 4 / 5,\n });\n\n const unrealizedPnLROI = positions.unrealizedPnLROI({\n positionQty: quantity,\n openPrice: openPrice,\n IMR: imr,\n unrealizedPnL: netPnL,\n });\n\n roi = new Decimal(unrealizedPnLROI * 100).toFixed(2, Decimal.ROUND_DOWN);\n }\n\n return {\n side: position.side,\n pnl: netPnL,\n roi: roi,\n openPrice: openPrice,\n closePrice: Math.abs(position.avg_close_price),\n openTime: position.open_timestamp,\n closeTime: position.close_timestamp,\n quantity: position.closed_position_qty,\n };\n };\n\n const showModal = () => {\n const entity = props.isPositionHistory\n ? getHistoryEntity()\n : {\n side: position.position_qty > 0 ? \"LONG\" : \"SHORT\",\n pnl: position.unrealized_pnl,\n roi: new Decimal(position.unrealized_pnl_ROI * 100).toFixed(\n 2,\n Decimal.ROUND_DOWN,\n ),\n openPrice: Math.abs(position.average_open_price),\n markPrice: position.mark_price,\n openTime: position.timestamp,\n quantity: position.position_qty,\n };\n\n modal.show(props.modalId, {\n pnl: {\n entity: {\n symbol: position.symbol,\n // when position.leverage is empty, use leverage from useSymbolLeverage\n leverage: position.leverage || symbolLeverage,\n ...entity,\n },\n refCode,\n ...sharePnLConfig,\n },\n });\n };\n\n return {\n iconSize,\n sharePnLConfig,\n showModal,\n };\n};\n","import {\n useShareButtonScript,\n ShareButtonScriptOptions,\n} from \"./shareButton.script\";\nimport { ShareButton } from \"./shareButton.ui\";\n\nexport type ShareButtonWidgetProps = ShareButtonScriptOptions;\n\nexport const ShareButtonWidget = (props: ShareButtonWidgetProps) => {\n const state = useShareButtonScript(props);\n return <ShareButton {...state} />;\n};\n","import { FC, useMemo } from \"react\";\nimport { useSymbolsInfo, utils } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n AlgoOrderType,\n API,\n OrderSide,\n PositionType,\n} from \"@kodiak-finance/orderly-types\";\nimport { cn, Flex, Text, Tooltip } from \"@kodiak-finance/orderly-ui\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\nimport { TPSLEditIcon, AddIcon } from \"./components\";\n\nexport const TriggerPrice: FC<{\n stopLossPrice?: number;\n takeProfitPrice?: number;\n}> = (props) => {\n const { stopLossPrice, takeProfitPrice } = props;\n const { tpslOrder, position } = usePositionsRowContext();\n\n return (\n <TPSLTriggerPrice\n stopLossPrice={stopLossPrice}\n takeProfitPrice={takeProfitPrice}\n direction={\"column\"}\n order={tpslOrder}\n position={position}\n tooltip\n />\n );\n};\n\nexport const TriggerPriceItem: FC<{\n qty: number;\n price: number;\n entryPrice: number;\n orderSide: OrderSide;\n orderType: AlgoOrderType;\n symbolInfo: API.SymbolExt;\n}> = (props) => {\n const { qty, price, entryPrice, orderSide, orderType, symbolInfo } = props;\n const pnl = utils.priceToPnl(\n {\n qty,\n price,\n entryPrice,\n orderSide,\n orderType,\n },\n {\n symbol: symbolInfo,\n },\n );\n\n const type = orderType === AlgoOrderType.TAKE_PROFIT ? \"TP\" : \"SL\";\n\n return (\n <Flex>\n <Text intensity={54} className=\"oui-mr-1\">{`${type} PnL:`}</Text>\n <Text.formatted\n rule=\"price\"\n className={\n pnl === 0\n ? \"oui-text-base-contrast-36\"\n : pnl > 0\n ? \"oui-text-trade-profit oui-gap-0\"\n : \"oui-text-trade-loss oui-gap-0\"\n }\n prefix={<Text>{pnl === 0 ? \"\" : pnl > 0 ? \"+\" : \"-\"}</Text>}\n suffix={\n <Text intensity={36} className=\"oui-ml-1\">\n USDC\n </Text>\n }\n >{`${Math.abs(pnl)}`}</Text.formatted>\n </Flex>\n );\n};\n\nexport const TPSLTriggerPrice: FC<{\n takeProfitPrice: number | undefined;\n stopLossPrice: number | undefined;\n className?: string;\n direction?: \"row\" | \"column\";\n tooltip?: boolean;\n order?: API.AlgoOrder;\n position?: API.PositionTPSLExt;\n}> = (props) => {\n const { direction = \"row\", order, position } = props;\n // const symbolInfo = useSymbolsInfo()[position?.symbol ?? \"\"]();\n const symbolInfo = useSymbolsInfo();\n const { t } = useTranslation();\n const pnl = useMemo(() => {\n const msgs = [];\n\n if (!props.tooltip || !order || !position) return;\n\n let quantity = order.quantity;\n\n if (quantity === 0) {\n if (order.child_orders[0].type === \"CLOSE_POSITION\") {\n quantity = position.position_qty;\n }\n }\n\n if (!!props.takeProfitPrice) {\n msgs.push(\n <TriggerPriceItem\n key={\"tp\"}\n qty={quantity}\n price={props.takeProfitPrice}\n entryPrice={position.average_open_price}\n orderSide={order.side as OrderSide}\n orderType={AlgoOrderType.TAKE_PROFIT}\n symbolInfo={symbolInfo[order.symbol]()}\n />,\n );\n }\n\n if (!!props.stopLossPrice) {\n msgs.push(\n <TriggerPriceItem\n key={\"sl\"}\n qty={quantity}\n price={props.stopLossPrice}\n entryPrice={position.average_open_price}\n orderSide={order.side as OrderSide}\n orderType={AlgoOrderType.STOP_LOSS}\n symbolInfo={symbolInfo[order.symbol]()}\n />,\n );\n }\n\n return <div>{msgs}</div>;\n }, [\n props.takeProfitPrice,\n props.stopLossPrice,\n position?.average_open_price,\n order?.side,\n order?.quantity,\n order?.algo_type,\n ]);\n\n const child = useMemo(() => {\n const children = [];\n\n if (!order?.symbol) return <AddIcon positionType={PositionType.FULL} />;\n\n const Label = ({ children }: { children?: string }) => {\n return !props.stopLossPrice || direction === \"column\" ? (\n <Text intensity={54}>{children}</Text>\n ) : (\n \"\"\n );\n };\n\n if (props.takeProfitPrice) {\n children.push(\n <Text.formatted\n className={cn(\n \"oui-text-trade-profit oui-gap-0 oui-decoration-white/20\",\n )}\n key={\"tp\"}\n rule=\"price\"\n dp={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={props.takeProfitPrice}\n prefix={\n !props.stopLossPrice || direction === \"column\" ? (\n <Text intensity={54}>{`${t(\"tpsl.tp\")} - `}</Text>\n ) : (\n \"\"\n )\n }\n />,\n );\n }\n if (props.stopLossPrice) {\n children.push(\n <Text.formatted\n key={\"sl\"}\n className={cn(\n \"oui-text-trade-loss oui-gap-0 oui-decoration-white/20 \",\n )}\n rule={\"price\"}\n dp={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={props.stopLossPrice}\n prefix={\n !props.takeProfitPrice || direction === \"column\" ? (\n <Text intensity={54}>{`${t(\"tpsl.sl\")} - `}</Text>\n ) : (\n \"\"\n )\n }\n />,\n );\n }\n\n if (children.length === 0)\n return <AddIcon positionType={PositionType.FULL} />;\n\n if (children.length === 2 && direction === \"row\") {\n children.splice(1, 0, <Text key={\"split\"}>/</Text>);\n }\n\n return children;\n }, [props.takeProfitPrice, props.stopLossPrice, order?.symbol, t]);\n\n const content = (\n <div\n className={cn(\n \"oui-inline-flex oui-text-base-contrast-36\",\n props.direction === \"column\"\n ? \"oui-flex-col\"\n : \"oui-flex-row oui-gap-1\",\n props.className,\n )}\n >\n {child}\n </div>\n );\n\n const showIcon = Array.isArray(child) ? !!child.length : !child;\n\n if (props.tooltip) {\n return (\n <Flex gapX={2}>\n <Tooltip content={pnl}>{content}</Tooltip>\n {showIcon && <TPSLEditIcon />}\n </Flex>\n );\n }\n\n return content;\n};\n","import { FC } from \"react\";\nimport { useLocalStorage } from \"@kodiak-finance/orderly-hooks\";\nimport { Divider, Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport const UnrealizedPnLPopoverCard: FC<{}> = (props) => {\n const [unPnlPriceBasis, setUnPnlPriceBasic] = useLocalStorage(\n \"unPnlPriceBasis\",\n \"markPrice\"\n );\n const { t } = useTranslation();\n return (\n <Flex\n direction={\"column\"}\n gap={3}\n className=\"oui-text-base-contrast-54 oui-items-start\"\n >\n <Text>{t(\"positions.column.unrealPnl.tooltip\")}</Text>\n <Divider className=\"oui-w-full\" />\n <div className=\"oui-mb-0\">\n {t(\"positions.column.unrealPnl.priceBasis\")}\n </div>\n <UnPnlPriceBasisCheckBox\n value={unPnlPriceBasis}\n onValueChange={setUnPnlPriceBasic}\n />\n </Flex>\n );\n};\n\nconst UnPnlPriceBasisCheckBox = (props: {\n value: string;\n onValueChange: (value: string) => void;\n}) => {\n const { value, onValueChange } = props;\n const { t } = useTranslation();\n\n // \"markPrice\" | \"lastPrice\"\n return (\n <Flex gap={2}>\n <RadioButton\n sel={value === \"markPrice\"}\n label={t(\"common.markPrice\")}\n value={\"markPrice\"}\n onCheckChange={onValueChange}\n />\n <RadioButton\n sel={value === \"lastPrice\"}\n label={t(\"common.lastPrice\")}\n value={\"lastPrice\"}\n onCheckChange={onValueChange}\n />\n </Flex>\n );\n};\n\nconst RadioButton = (props: {\n sel: boolean;\n label: any;\n value: any;\n onCheckChange: (value: any) => void;\n}) => {\n const { sel, label, value, onCheckChange } = props;\n return (\n <Flex\n onClick={(e) => {\n onCheckChange(value);\n e.stopPropagation();\n }}\n gap={1}\n className=\"oui-cursor-pointer\"\n >\n {sel ? <SelIcon /> : <UnselIcon />}\n <Text size=\"xs\" intensity={sel ? 98 : 54}>\n {label}\n </Text>\n </Flex>\n );\n};\n\nconst SelIcon = () => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"oui-fill-white\"\n >\n <path\n d=\"M8.01 1.333a6.667 6.667 0 1 0 0 13.333 6.667 6.667 0 0 0 0-13.333m0 1.333a5.334 5.334 0 1 1-.001 10.667 5.334 5.334 0 0 1 0-10.667\"\n fill=\"#fff\"\n fillOpacity=\".36\"\n />\n <circle cx=\"8\" cy=\"8\" r=\"3.333\" />\n </svg>\n );\n};\n\nconst UnselIcon = () => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.01 1.333a6.667 6.667 0 1 0 0 13.333 6.667 6.667 0 0 0 0-13.333m0 1.333a5.334 5.334 0 1 1-.001 10.667 5.334 5.334 0 0 1 0-10.667\"\n fill=\"#fff\"\n fillOpacity=\".54\"\n />\n </svg>\n );\n};\n","import { FC } from \"react\";\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\nimport { cn, Divider, Flex, Grid } from \"@kodiak-finance/orderly-ui\";\nimport { ClosePositionWidget } from \"../../closePosition\";\nimport { TpSLBtnWidget } from \"../tpSLBtn\";\nimport {\n UnrealPnL,\n SymbolToken,\n Qty,\n Margin,\n Notional,\n AvgOpen,\n MarkPrice,\n LiqPrice,\n TPSLPrice,\n FundingFee,\n} from \"./items\";\nimport { PositionCellState } from \"./positionCell.script\";\n\nexport const PositionCell: FC<\n PositionCellState & {\n className?: string;\n }\n> = (props) => {\n const { className, ...rest } = props;\n\n const header = (\n <Flex justify={\"between\"} width={\"100%\"}>\n <SymbolToken {...props} />\n <UnrealPnL {...props} />\n </Flex>\n );\n\n const body = (\n <Grid cols={3} rows={2} gap={2} width={\"100%\"}>\n <Qty {...props} />\n <Margin {...props} />\n <Notional {...props} />\n <AvgOpen {...props} />\n <MarkPrice {...props} />\n <LiqPrice {...props} />\n </Grid>\n );\n\n const buttons = (\n <Grid width={\"100%\"} gap={2} cols={2} rows={1}>\n <ClosePositionWidget type={OrderType.LIMIT} />\n <ClosePositionWidget type={OrderType.MARKET} />\n </Grid>\n );\n\n return (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n p={2}\n r=\"xl\"\n itemAlign={\"start\"}\n className={cn(className, \"oui-bg-base-9\")}\n >\n {header}\n <Divider intensity={6} className=\"oui-w-full\" />\n {body}\n <TPSLPrice {...rest} />\n <FundingFee {...rest} />\n {buttons}\n </Flex>\n );\n};\n","import { FC, useMemo, useRef } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API, PositionType } from \"@kodiak-finance/orderly-types\";\nimport { Badge, cn, Flex, Grid, Statistic, Text } from \"@kodiak-finance/orderly-ui\";\nimport { SymbolLeverageSheetId } from \"@kodiak-finance/orderly-ui-leverage\";\nimport { SharePnLBottomSheetId } from \"@kodiak-finance/orderly-ui-share\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { FundingFeeButton } from \"../../../fundingFeeHistory/fundingFeeButton\";\nimport { LeverageBadge } from \"../../desktop/components\";\nimport { AddIcon, TPSLEditIcon } from \"../../desktop/components\";\nimport { ShareButtonWidget } from \"../../desktop/shareButton\";\nimport { PositionCellState } from \"./positionCell.script\";\n\nexport const SymbolToken: FC<PositionCellState> = (props) => {\n const { item } = props;\n const isBuy = item.position_qty > 0;\n const { t } = useTranslation();\n return (\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size=\"2xs\"\n suffix={\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Badge color={isBuy ? \"success\" : \"danger\"} size=\"xs\">\n {isBuy ? t(\"common.long\") : t(\"common.short\")}\n </Badge>\n <LeverageBadge\n symbol={item.symbol}\n leverage={item.leverage}\n modalId={SymbolLeverageSheetId}\n />\n </div>\n }\n showIcon\n onClick={() => {\n props.onSymbolChange?.({ symbol: item.symbol } as API.Symbol);\n }}\n >\n {item.symbol}\n </Text.formatted>\n );\n};\n\nexport const UnrealPnL: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n return (\n <Flex gap={3}>\n <Flex direction={\"column\"} className=\"oui-text-2xs\" itemAlign={\"end\"}>\n <div>\n <Text intensity={36}>{t(\"common.unrealizedPnl\")}</Text>\n <Text intensity={20}>(USDC)</Text>\n </div>\n\n <Text.numeral\n size=\"xs\"\n dp={props.pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"orderly-font-semibold\"\n suffix={\n <Text.numeral\n rule=\"percentages\"\n dp={props.pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n prefix=\"(\"\n suffix=\")\"\n className={cn(\n \"oui-ml-1\",\n item.unrealized_pnl_ROI > 0\n ? \"oui-text-success-darken\"\n : \"oui-text-danger-darken\",\n )}\n >\n {item.unrealized_pnl_ROI}\n </Text.numeral>\n }\n >\n {item.unrealized_pnl}\n </Text.numeral>\n </Flex>\n <ShareButtonWidget\n position={item}\n sharePnLConfig={props.sharePnLConfig}\n modalId={SharePnLBottomSheetId}\n iconSize={12}\n />\n </Flex>\n );\n};\n\nexport const Qty: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n label={t(\"common.qty\")}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.base_dp} padding={false} coloring>\n {item.position_qty}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const Margin: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n label={\n <span>\n {t(\"positions.column.margin\")}\n <Text intensity={20}>(USDC)</Text>\n </span>\n }\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} intensity={80}>\n {item.mm}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const Notional: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n align=\"end\"\n label={\n <span>\n {t(\"common.notional\")}\n <Text intensity={20}>(USDC)</Text>\n </span>\n }\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} intensity={80}>\n {item.notional}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const AvgOpen: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n label={t(\"common.avgOpen\")}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} rm={Decimal.ROUND_DOWN} intensity={80}>\n {item.average_open_price}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const MarkPrice: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n return (\n <Statistic\n label={t(\"common.markPrice\")}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} rm={Decimal.ROUND_DOWN} intensity={80}>\n {item.mark_price}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const LiqPrice: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n const liqPrice =\n item.est_liq_price && item.est_liq_price > 0 ? item.est_liq_price : \"-\";\n\n return (\n <Statistic\n label={t(\"positions.column.liqPrice\")}\n align=\"end\"\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} rm={Decimal.ROUND_DOWN} color=\"warning\">\n {liqPrice}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const TPSLPrice: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n const fullTPSL = useMemo(() => {\n if (\n item.full_tp_sl?.tp_trigger_price == null &&\n item.full_tp_sl?.sl_trigger_price == null\n )\n return <AddIcon positionType={PositionType.FULL} />;\n\n return (\n <Flex className=\"oui-gap-[2px]\">\n {item.full_tp_sl?.tp_trigger_price && (\n <Text.numeral color=\"buy\">\n {item.full_tp_sl.tp_trigger_price}\n </Text.numeral>\n )}\n {item.full_tp_sl?.sl_trigger_price && \"/\"}\n {item.full_tp_sl?.sl_trigger_price && (\n <Text.numeral color=\"sell\">\n {item.full_tp_sl.sl_trigger_price}\n </Text.numeral>\n )}\n <TPSLEditIcon />\n </Flex>\n );\n }, [item.full_tp_sl]);\n\n const partialTPSL = useMemo(() => {\n if (\n item.partial_tp_sl?.tp_trigger_price == null &&\n item.partial_tp_sl?.sl_trigger_price == null\n )\n return <AddIcon positionType={PositionType.PARTIAL} />;\n\n return (\n <Flex className=\"oui-gap-[2px]\" itemAlign={\"center\"}>\n {item.partial_tp_sl?.tp_trigger_price && (\n <Text.numeral color=\"buy\">\n {item.partial_tp_sl.tp_trigger_price}\n </Text.numeral>\n )}\n {item.partial_tp_sl?.sl_trigger_price && \"/\"}\n {item.partial_tp_sl?.sl_trigger_price && (\n <Text.numeral color=\"sell\">\n {item.partial_tp_sl.sl_trigger_price}\n </Text.numeral>\n )}\n <Text>{`(${item.partial_tp_sl?.order_num})`}</Text>\n <TPSLEditIcon />\n </Flex>\n );\n }, [item.partial_tp_sl]);\n\n return (\n <Grid cols={2} rows={1} gap={2} width={\"100%\"}>\n <Flex\n className=\"oui-text-2xs oui-text-base-contrast-36\"\n direction={\"column\"}\n itemAlign={\"start\"}\n >\n <Text>{t(\"common.fullTPSL\")}: </Text>\n {fullTPSL}\n </Flex>\n <Flex\n className=\"oui-text-2xs oui-text-base-contrast-36 oui-grid-cols-end\"\n direction={\"column\"}\n itemAlign={\"end\"}\n >\n <Text>{t(\"common.partialTPSL\")}: </Text>\n {partialTPSL}\n </Flex>\n </Grid>\n );\n};\n\nexport const FundingFee: FC<PositionCellState> = (props) => {\n const { t } = useTranslation();\n const fundingFeeEndTime = useRef(Date.now().toString());\n return (\n <Flex justify={\"end\"} className=\"oui-w-full oui-text-2xs\">\n <Text intensity={36}>{t(\"funding.fundingFee\")}: </Text>\n <FundingFeeButton\n fee={props.item.fundingFee!}\n symbol={props.item.symbol}\n start_t={props.item.timestamp.toString()}\n end_t={fundingFeeEndTime.current}\n />\n </Flex>\n );\n};\n","import { API } from \"@kodiak-finance/orderly-types\";\nimport { useSymbolContext } from \"../../../../provider/symbolContext\";\nimport { PositionsProps } from \"../../../../types/types\";\n\ntype PositionCellScriptProps = {\n item: API.PositionTPSLExt;\n index: number;\n} & PositionsProps;\n\nexport type PositionCellState = ReturnType<typeof usePositionCellScript>;\n\nexport const usePositionCellScript = (props: PositionCellScriptProps) => {\n const symbolInfo = useSymbolContext();\n return {\n ...props,\n ...symbolInfo,\n };\n};\n","import { FC } from \"react\";\nimport { usePositionCellScript } from \"./positionCell.script\";\nimport { PositionCell } from \"./positionCell.ui\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { PositionsProps } from \"../../../../types/types\";\n\nexport const PositionCellWidget: FC<\n {\n item: API.PositionTPSLExt;\n index: number;\n className?: string;\n shareIconSize?: number;\n } & PositionsProps\n> = (props) => {\n const state = usePositionCellScript(props);\n return <PositionCell {...state} className={props.className} />;\n};\n","import {\n createContext,\n FC,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n KeyedMutator,\n usePositionClose,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API, OrderSide, OrderType } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { PositionsRowContext } from \"./positionsRowContext\";\nimport type { PositionsRowContextState } from \"./positionsRowContext\";\n\n// export interface PositionsRowContextState {\n// quantity: string;\n// price: string;\n// type: OrderType;\n// side: OrderSide;\n// position: API.PositionExt | API.PositionTPSLExt;\n// updateQuantity: (value: string) => void;\n// updatePriceChange: (value: string) => void;\n\n// updateOrderType: (value: OrderType, price?: string) => void;\n\n// closeOrderData: any;\n\n// onSubmit: () => Promise<any>;\n// submitting: boolean;\n// tpslOrder?: API.AlgoOrder;\n// partialTPSLOrder?: API.AlgoOrder;\n// quoteDp?: number;\n// baseDp?: number;\n// baseTick?: number;\n// errors: any | undefined;\n// }\n\n// export const PositionsRowContext = createContext(\n// {} as PositionsRowContextState,\n// );\n\n// export const usePositionsRowContext = () => {\n// return useContext(PositionsRowContext);\n// };\n\ntype PositionsRowProviderProps = PropsWithChildren<{\n position: API.PositionExt | API.PositionTPSLExt;\n mutatePositions?: KeyedMutator<API.PositionExt[]>;\n}>;\n\nexport const PositionsRowProvider: FC<PositionsRowProviderProps> = (props) => {\n const { position, children, mutatePositions } = props;\n const { t } = useTranslation();\n const [quantity, setQuantity] = useState<string>(\n Math.abs(position.position_qty).toString(),\n );\n const [price, setPrice] = useState<string>(\"\");\n const [type, setType] = useState<OrderType>(OrderType.MARKET);\n\n useEffect(() => {\n setQuantity(Math.abs(position.position_qty).toString());\n }, [position.position_qty]);\n\n const symbol = position.symbol;\n const symbolsInfo = useSymbolsInfo();\n const symbolInfo = symbolsInfo?.[symbol];\n const quoteDp = symbolInfo(\"quote_dp\");\n const baseDp = symbolInfo(\"base_dp\");\n const baseTick = symbolInfo(\"base_tick\");\n\n const {\n side,\n closeOrderData,\n submit,\n isMutating: submitting,\n errors,\n calculate,\n } = usePositionClose({\n position,\n order: {\n type,\n quantity,\n price,\n },\n });\n\n const updateQuantity = useCallback(\n (value: string) => {\n const newValues = calculate(\n {},\n \"order_quantity\",\n value,\n position.mark_price,\n symbolInfo(),\n );\n setQuantity(newValues.order_quantity!);\n },\n [calculate, symbolsInfo, position.mark_price],\n );\n\n const updatePriceChange = useCallback(\n (value: string) => {\n const newValues = calculate(\n {},\n \"order_price\",\n value,\n position.mark_price,\n symbolInfo(),\n );\n setPrice(newValues.order_price!);\n },\n [calculate, symbolsInfo, position.mark_price],\n );\n\n const updateOrderType = useCallback(\n (type: OrderType) => {\n setType(type);\n // when type is Limit, set price to mark price\n // when type is Market, set price to empty string\n setPrice(type === OrderType.LIMIT ? position.mark_price?.toString() : \"\");\n },\n [position.mark_price],\n );\n\n const onSubmit = useCallback(async () => {\n if (Number(quantity) > symbolInfo(\"base_max\")) {\n toast.error(\n <div>\n {t(\"positions.limitClose.errors.exceed.title\")}\n <br />\n <div className=\"oui-break-normal\">\n {t(\"positions.limitClose.errors.exceed.description\", {\n quantity: quantity,\n symbol: transSymbolformString(symbol, \"base\"),\n maxQuantity: symbolInfo(\"base_max\"),\n })}\n </div>\n </div>,\n );\n return;\n }\n\n return submit()\n .then((res) => {\n if (res.success) {\n mutatePositions?.();\n return res;\n }\n\n if (res.message) {\n toast.error(res.message);\n }\n\n throw true;\n })\n .catch((err) => {\n if (err.message) {\n toast.error(err.message);\n }\n return false;\n });\n }, [submit]);\n\n const memoizedValue = useMemo<PositionsRowContextState>(() => {\n return {\n quantity,\n price,\n type,\n side,\n position,\n updatePriceChange,\n updateQuantity,\n updateOrderType,\n tpslOrder: (position as API.PositionTPSLExt).full_tp_sl?.algo_order,\n partialTPSLOrder: (position as API.PositionTPSLExt).partial_tp_sl\n ?.algo_order,\n onSubmit,\n submitting,\n closeOrderData,\n quoteDp,\n baseDp,\n baseTick,\n errors,\n };\n }, [\n quantity,\n price,\n type,\n side,\n position,\n updatePriceChange,\n updateQuantity,\n updateOrderType,\n onSubmit,\n submitting,\n closeOrderData,\n quoteDp,\n baseDp,\n baseTick,\n errors,\n ]);\n\n return (\n <PositionsRowContext.Provider value={memoizedValue}>\n {children}\n </PositionsRowContext.Provider>\n );\n};\n\nfunction transSymbolformString(symbol: string, formatString = \"base\") {\n const arr = symbol.split(\"_\");\n const type = arr[0];\n const base = arr[1];\n const quote = arr[2];\n return (formatString ?? \"base-quote\")\n .replace(\"type\", type)\n .replace(\"base\", base)\n .replace(\"quote\", quote);\n}\n","import React from \"react\";\nimport type { PositionsProps } from \"../../types/types\";\nimport { useCombinePositionsScript } from \"./combinePositions.script\";\nimport { usePositionsScript } from \"./positions.script\";\nimport { MobilePositions, Positions, CombinePositions } from \"./positions.ui\";\n\nexport const PositionsWidget: React.FC<PositionsProps> = (props) => {\n const state = usePositionsScript(props);\n return <Positions {...state} />;\n};\n\nexport const MobilePositionsWidget: React.FC<PositionsProps> = (props) => {\n const state = usePositionsScript(props);\n return <MobilePositions {...state} />;\n};\n\nexport const CombinePositionsWidget: React.FC<PositionsProps> = (props) => {\n const state = useCombinePositionsScript(props);\n return <CombinePositions {...state} />;\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n cn,\n DataFilter,\n Flex,\n Grid,\n ListView,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\nimport { SymbolProvider } from \"../../provider/symbolProvider\";\nimport { usePositionHistoryColumn } from \"./desktop/usePositionHistoryColumn\";\nimport { PositionHistoryCellWidget } from \"./mobile\";\nimport {\n PositionHistoryExt,\n PositionHistoryState,\n} from \"./positionHistory.script\";\n\ntype PositionHistoryProps = PositionHistoryState & {\n sharePnLConfig?: SharePnLConfig;\n};\n\nexport const PositionHistory: FC<PositionHistoryProps> = (props) => {\n const { onSymbolChange, pagination, pnlNotionalDecimalPrecision } = props;\n const column = usePositionHistoryColumn({\n onSymbolChange,\n pnlNotionalDecimalPrecision,\n sharePnLConfig: props.sharePnLConfig,\n });\n\n const { t } = useTranslation();\n\n const dayLabel: Record<number, string> = useMemo(() => {\n return {\n 1: t(\"common.select.1d\"),\n 7: t(\"common.select.7d\"),\n 30: t(\"common.select.30d\"),\n 90: t(\"common.select.90d\"),\n };\n }, [t]);\n\n return (\n <Flex direction=\"column\" width=\"100%\" height=\"100%\" itemAlign=\"start\">\n {/* <Divider className=\"oui-w-full\" /> */}\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n />\n )}\n {[1, 7, 30, 90].map((value) => {\n return (\n <button\n key={`item-${value}`}\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDays === value ? \"brand\" : undefined}\n className={cn(\n \"oui-whitespace-nowrap oui-break-normal\",\n props.filterDays !== value\n ? \"oui-text-base-contrast-54\"\n : \"\",\n )}\n >\n {dayLabel[value] || `${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n props.updateFilterDays(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n\n <AuthGuardDataTable<PositionHistoryExt>\n loading={props.isLoading}\n id=\"oui-desktop-positions-content\"\n columns={column}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: PositionHistoryExt) =>\n `${record.symbol}_${record.position_id}`\n }\n renderRowContainer={(record: any, index: number, children: any) => (\n <SymbolProvider symbol={record.symbol}>{children}</SymbolProvider>\n )}\n manualPagination={false}\n pagination={pagination}\n manualSorting={true}\n onSort={props.onSort}\n initialSort={\n props.initialSort\n ? {\n sortKey: props.initialSort.sortKey,\n sort: props.initialSort.sortOrder,\n }\n : undefined\n }\n testIds={{\n body: \"oui-testid-dataList-positionHistory-tab-body\",\n }}\n classNames={{\n root: \"!oui-h-[calc(100%_-_49px)]\",\n }}\n />\n </Flex>\n );\n};\n\nexport const MobilePositionHistory: FC<\n PositionHistoryState & {\n classNames?: { root?: string; content?: string; cell?: string };\n sharePnLConfig?: SharePnLConfig;\n }\n> = (props) => {\n return (\n <Grid\n cols={1}\n rows={2}\n className=\"oui-w-full oui-grid-rows-[auto,1fr]\"\n gap={1}\n >\n <Flex gap={2} p={2} className=\"oui-rounded-b-xl oui-bg-base-9\">\n <DataFilter\n className=\"oui-border-none oui-py-0\"\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n />\n </Flex>\n <ListView\n className={cn(\n \"oui-hide-scrollbar oui-w-full oui-space-y-0 oui-overflow-y-hidden\",\n props.classNames?.root,\n )}\n contentClassName={cn(\"!oui-space-y-1\", props.classNames?.content)}\n dataSource={props.dataSource}\n renderItem={(item, index) => (\n <SymbolProvider symbol={item.symbol}>\n <PositionHistoryCellWidget\n item={item}\n index={index}\n onSymbolChange={props.onSymbolChange}\n classNames={{\n root: props.classNames?.cell,\n }}\n sharePnLConfig={props.sharePnLConfig}\n />\n </SymbolProvider>\n )}\n />\n </Grid>\n );\n};\n","import { ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport { useLeverageBySymbol, useMaxLeverage } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n Badge,\n Box,\n capitalizeFirstLetter,\n cn,\n Column,\n Flex,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport { SharePnLConfig, SharePnLDialogId } from \"@kodiak-finance/orderly-ui-share\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\nimport { FundingFeeButton } from \"../../fundingFeeHistory/fundingFeeButton\";\nimport { ShareButtonWidget } from \"../../positions/desktop/shareButton\";\nimport { PositionHistoryExt } from \"../positionHistory.script\";\n\nexport const usePositionHistoryColumn = (props: {\n onSymbolChange?: (symbol: API.Symbol) => void;\n pnlNotionalDecimalPrecision?: number;\n sharePnLConfig?: SharePnLConfig;\n}) => {\n const { onSymbolChange, pnlNotionalDecimalPrecision } = props;\n const { t } = useTranslation();\n\n const column = useMemo(\n () =>\n [\n // instrument\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n fixed: \"left\",\n width: 200,\n onSort: (r1: any, r2: any) => {\n return r1.symbol?.localeCompare(r2.symbol || \"\");\n },\n render: (value: string, record) => (\n <SymbolInfo record={record} onSymbolChange={onSymbolChange} />\n ),\n },\n // quantity\n {\n title: t(\"positions.history.column.closed&maxClosed\"),\n dataIndex: \"close_maxClose\",\n width: 200,\n render: (value: string, record) => <Quantity record={record} />,\n },\n // net pnl\n {\n title: t(\"positions.history.column.netPnl\"),\n dataIndex: \"netPnL\",\n width: 140,\n onSort: (a, b) => {\n if (a.netPnL == null || b.netPnL == null) return -1;\n return (a.netPnL ?? 0) - (b.netPnL ?? 0);\n },\n render: (_: any, record) => (\n <Flex gapX={1}>\n <NetPnL\n record={record}\n pnlNotionalDecimalPrecision={pnlNotionalDecimalPrecision}\n />\n <ShareButtonWidget\n position={record}\n sharePnLConfig={props.sharePnLConfig}\n modalId={SharePnLDialogId}\n isPositionHistory\n />\n </Flex>\n ),\n },\n // avg open\n {\n title: t(\"common.avgPrice\"),\n dataIndex: \"avg_open\",\n width: 140,\n render: (_: any, record) => {\n const avgOpen =\n record.avg_open_price != null\n ? Math.abs(record.avg_open_price)\n : \"--\";\n const { quote_dp } = useSymbolContext();\n return (\n <Text.numeral dp={quote_dp} padding={false}>\n {avgOpen}\n </Text.numeral>\n );\n },\n },\n // avg close\n {\n title: t(\"common.avgClose\"),\n dataIndex: \"avg_close\",\n width: 175,\n render: (_: any, record) => {\n const avgClose =\n record.avg_close_price != null\n ? Math.abs(record.avg_close_price)\n : \"--\";\n const { quote_dp } = useSymbolContext();\n return (\n <Text.numeral dp={quote_dp} padding={false}>\n {avgClose}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"funding.fundingFee\"),\n dataIndex: \"accumulated_funding_fee\",\n render: (value, record) => {\n return (\n <FundingFeeButton\n fee={-value}\n symbol={record.symbol}\n start_t={record.open_timestamp.toString()}\n end_t={record.close_timestamp?.toString()}\n />\n );\n },\n },\n // time opened\n {\n title: t(\"positions.history.column.timeOpened\"),\n dataIndex: \"open_timestamp\",\n width: 175,\n onSort: true,\n render: (_: any, record) => (\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd HH:mm:ss\">\n {record.open_timestamp}\n </Text.formatted>\n ),\n },\n // time close\n {\n title: t(\"positions.history.column.timeClosed\"),\n dataIndex: \"close_timestamp\",\n width: 175,\n onSort: true,\n render: (_: any, record) => {\n if (record.position_status == \"closed\" && record.close_timestamp) {\n return (\n <Text.formatted\n rule={\"date\"}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n >\n {record.close_timestamp ?? \"--\"}\n </Text.formatted>\n );\n }\n return \"--\";\n },\n },\n // updated time\n {\n title: t(\"positions.history.column.updatedTime\"),\n dataIndex: \"last_update_time\",\n width: 175,\n onSort: true,\n render: (_: any, record) => (\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd HH:mm:ss\">\n {record.last_update_time}\n </Text.formatted>\n ),\n },\n ] as Column<PositionHistoryExt>[],\n [pnlNotionalDecimalPrecision, t],\n );\n\n return column;\n};\n\nexport const SymbolInfo = (props: {\n record: PositionHistoryExt;\n onSymbolChange?: (symbol: API.Symbol) => void;\n}) => {\n const { record, onSymbolChange } = props;\n const { t } = useTranslation();\n\n const tags = useMemo(() => {\n const list: ReactNode[] = [];\n\n const status = record.position_status;\n\n const renderStatus = () => {\n if (status === \"closed\") {\n return t(\"positions.history.status.closed\");\n } else if (status === \"partial_closed\") {\n return t(\"positions.history.status.partialClosed\");\n } else {\n return capitalizeFirstLetter(status.replace(\"_\", \" \"));\n }\n };\n\n list.push(\n <Badge\n key={`status-${status}`}\n color={status !== \"closed\" ? \"primaryLight\" : \"neutral\"}\n size=\"xs\"\n className=\"oui-whitespace-nowrap oui-break-normal\"\n >\n {renderStatus()}\n </Badge>,\n );\n\n if (record.type === \"adl\") {\n list.push(\n <Badge key={`type-${record.type}`} color={\"danger\"} size=\"xs\">\n {t(\"positions.history.type.adl\")}\n </Badge>,\n );\n } else if (record.type === \"liquidated\") {\n list.push(\n <Tooltip\n key={`type-${record.type}`}\n className=\"oui-min-w-[204px] oui-bg-base-5\"\n arrow={{ className: \"oui-fill-base-5\" }}\n content={\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-text-2xs\"\n >\n {record.liquidation_id != null && (\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.liquidated.liquidationId\")}\n </Text>\n <Text intensity={98}>{record.liquidation_id}</Text>\n </Flex>\n )}\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.liquidated.liquidatorFee\")}\n </Text>\n <Text color=\"lose\">\n {record.liquidator_fee > 0 && \"-\"}\n {commifyOptional(record.liquidator_fee)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.liquidated.insFundFee\")}\n </Text>\n <Text color=\"lose\">\n {record.insurance_fund_fee > 0 && \"-\"}\n {commifyOptional(record.insurance_fund_fee)}\n </Text>\n </Flex>\n </Flex>\n }\n >\n <div>\n <Badge size=\"xs\" color=\"danger\" className=\"oui-cursor-pointer\">\n <span className=\"oui-underline oui-decoration-dashed oui-decoration-1\">\n {t(\"positions.history.type.liquidated\")}\n </span>\n </Badge>\n </div>\n </Tooltip>,\n );\n }\n\n list.push(\n <LeverageBadge\n key={`leverage-${record.symbol}`}\n symbol={record.symbol}\n leverage={record.leverage}\n />,\n );\n\n return list;\n }, [record, t]);\n\n return (\n <Flex gap={2} height={48}>\n <Box\n width={4}\n height={38}\n className={cn(\n \"oui-shrink-0 oui-rounded-[1px]\",\n record.side === \"LONG\" ? \"oui-bg-trade-profit\" : \"oui-bg-trade-loss\",\n )}\n />\n\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n <Text.formatted\n // rule={\"symbol\"}\n formatString=\"base-type\"\n className=\"oui-cursor-pointer\"\n onClick={(e) => {\n onSymbolChange?.({ symbol: record.symbol } as API.Symbol);\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {`${record.symbol.split(\"_\")[1]}-PERP`}\n </Text.formatted>\n <Flex gap={1}>{tags}</Flex>\n </Flex>\n </Flex>\n );\n};\n\nexport const Quantity = (props: { record: PositionHistoryExt }) => {\n const { record } = props;\n\n const { base_dp } = useSymbolContext();\n\n return (\n <Flex\n gap={1}\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-truncate\"\n >\n <Text.numeral dp={base_dp} padding={false}>\n {Math.abs(record.closed_position_qty)}\n </Text.numeral>\n <Text.numeral dp={base_dp} padding={false} className=\"oui-truncate\">\n {Math.abs(record.max_position_qty)}\n </Text.numeral>\n {/* <Text className=\"oui-truncate\">{`${record.symbol.split(\"_\")[1]}`}</Text> */}\n </Flex>\n );\n};\n\nexport const NetPnL = (props: {\n record: PositionHistoryExt;\n pnlNotionalDecimalPrecision?: number;\n}) => {\n const { record, pnlNotionalDecimalPrecision } = props;\n const { t } = useTranslation();\n const netPnl = record.netPnL != null ? record.netPnL : undefined;\n\n const text = () => (\n <Text.numeral\n dp={pnlNotionalDecimalPrecision}\n color={\n record.netPnL != null\n ? record.netPnL > 0\n ? \"profit\"\n : \"lose\"\n : undefined\n }\n className={\n netPnl == null\n ? \"\"\n : \"oui-cursor-pointer oui-border-b oui-border-dashed oui-border-line-12\"\n }\n >\n {netPnl ?? \"--\"}\n </Text.numeral>\n );\n\n if (record.netPnL == null) return text();\n\n return (\n <Tooltip\n // open={record.max_position_qty == 3.22}\n delayDuration={200}\n // @ts-ignore\n content={\n <Flex direction={\"column\"} itemAlign={\"start\"} className=\"oui-text-2xs\">\n <Text intensity={80}>{t(\"positions.history.column.netPnl\")}</Text>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>{t(\"common.realizedPnl\")}</Text>\n <Text\n color={record.realized_pnl >= 0 ? \"profit\" : \"lose\"}\n className=\"oui-cursor-pointer\"\n >\n {commifyOptional(record.realized_pnl)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>{t(\"funding.fundingFee\")}</Text>\n <Text\n color={record.accumulated_funding_fee > 0 ? \"lose\" : \"profit\"}\n className=\"oui-cursor-pointer\"\n >\n {commifyOptional(-record.accumulated_funding_fee)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.netPnl.tradingFee\")}\n </Text>\n <Text\n color={record.trading_fee > 0 ? \"lose\" : \"profit\"}\n className=\"oui-cursor-pointer\"\n >\n {commifyOptional(-record.trading_fee)}\n </Text>\n </Flex>\n </Flex>\n }\n className=\"oui-min-w-[204px] oui-bg-base-5\"\n arrow={{\n className: \"oui-fill-base-5\",\n }}\n >\n <div>{text()}</div>\n </Tooltip>\n );\n};\n\nconst LeverageBadge = (props: { symbol: string; leverage: number }) => {\n const { symbol, leverage } = props;\n\n return (\n <Badge color=\"neutral\" size=\"xs\">\n {leverage ? (\n <Text.numeral dp={0} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n ) : (\n <LeverageDisplay symbol={symbol} />\n )}\n </Badge>\n );\n};\n\nconst LeverageDisplay = ({ symbol }: { symbol: string }) => {\n const leverage = useMaxLeverage(symbol);\n\n return (\n <Text.numeral dp={0} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Divider, Flex, Grid, modal, Text } from \"@kodiak-finance/orderly-ui\";\nimport { SharePnLBottomSheetId } from \"@kodiak-finance/orderly-ui-share\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\nimport { ShareButtonWidget } from \"../../positions/desktop/shareButton\";\nimport {\n PositionHistoryType,\n ClosedQty,\n SymbolToken,\n OpenTime,\n AvgOpen,\n AvgClosed,\n ClosedTime,\n MaxClosedQty,\n FundingFee,\n} from \"./items\";\nimport { PositionHistoryCellState } from \"./positionHistoryCell.script\";\n\nexport const PositionHistoryCell: FC<PositionHistoryCellState> = (props) => {\n return (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n itemAlign={\"start\"}\n className={props.classNames?.root}\n >\n <Header {...props} />\n <Divider intensity={6} className=\"oui-w-full\" />\n <Body {...props} />\n </Flex>\n );\n};\n\nexport const Header: FC<PositionHistoryCellState> = (props) => {\n const { t } = useTranslation();\n\n const showAlert = () => {\n const { item: record } = props;\n\n modal.alert({\n title: t(\"positions.history.column.netPnl\"),\n message: (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n className=\"oui-text-2xs oui-text-base-contrast-54\"\n >\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>{t(\"common.realizedPnl\")}</Text>\n <Text color={record.realized_pnl >= 0 ? \"profit\" : \"lose\"}>\n {commifyOptional(record.realized_pnl)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>{t(\"funding.fundingFee\")}</Text>\n <Text\n color={record.accumulated_funding_fee > 0 ? \"lose\" : \"profit\"}\n >\n {commifyOptional(-record.accumulated_funding_fee)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.netPnl.tradingFee\")}\n </Text>\n <Text color={record.trading_fee > 0 ? \"lose\" : \"profit\"}>\n {commifyOptional(-record.trading_fee)}\n </Text>\n </Flex>\n </Flex>\n ),\n });\n };\n\n return (\n <Flex gap={1} width={\"100%\"}>\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-flex-1\"\n gap={1}\n >\n <SymbolToken {...props} />\n <PositionHistoryType {...props} />\n </Flex>\n <Flex direction={\"column\"} itemAlign={\"end\"} className=\"oui-flex-1\">\n <Text size=\"2xs\" intensity={36}>\n {t(\"positions.history.column.netPnl\")}\n </Text>\n <Flex gapX={1}>\n <button onClick={showAlert}>\n <Text.numeral size=\"xs\" coloring>\n {props.item.netPnL ?? \"--\"}\n </Text.numeral>\n </button>\n\n <ShareButtonWidget\n position={props.item}\n sharePnLConfig={props.sharePnLConfig}\n modalId={SharePnLBottomSheetId}\n iconSize={12}\n isPositionHistory\n />\n </Flex>\n </Flex>\n </Flex>\n );\n};\n\nexport const Body: FC<PositionHistoryCellState> = (props) => {\n return (\n <div className=\"oui-w-full\">\n <Grid\n cols={3}\n rows={2}\n width={\"100%\"}\n gap={0}\n className=\"oui-grid-cols-[1fr,1fr,135px]\"\n >\n <ClosedQty {...props} />\n <MaxClosedQty {...props} />\n <OpenTime {...props} />\n <AvgOpen {...props} />\n <AvgClosed {...props} />\n <ClosedTime {...props} />\n </Grid>\n <FundingFee {...props} />\n </div>\n );\n};\n","import { FC, ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n Badge,\n capitalizeFirstLetter,\n Flex,\n modal,\n Statistic,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\nimport { FundingFeeButton } from \"../../fundingFeeHistory/fundingFeeButton\";\nimport { PositionHistorySide } from \"../positionHistory.script\";\nimport { PositionHistoryCellState } from \"./positionHistoryCell.script\";\n\nexport const SymbolToken: FC<PositionHistoryCellState> = (props) => {\n const { side, symbol } = props.item;\n const { t } = useTranslation();\n const isBuy = side === PositionHistorySide.buy;\n\n return (\n <Text.formatted\n intensity={80}\n rule=\"symbol\"\n formatString=\"base-type\"\n size=\"sm\"\n // @ts-ignore\n prefix={\n <Badge color={isBuy ? \"success\" : \"danger\"} size=\"xs\">\n {isBuy ? t(\"common.buy\") : t(\"common.sell\")}\n </Badge>\n }\n onClick={() => {\n props.onSymbolChange?.({ symbol: symbol } as API.Symbol);\n }}\n // showIcon\n >\n {symbol}\n </Text.formatted>\n );\n};\n\nexport const Time: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n\n return (\n <Text.formatted\n rule={\"date\"}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n intensity={36}\n size=\"2xs\"\n >\n {item.last_update_time}\n </Text.formatted>\n );\n};\n\nexport const PositionHistoryType: FC<PositionHistoryCellState> = (props) => {\n const { item: record } = props;\n const { t } = useTranslation();\n\n const showAlert = () => {\n modal.alert({\n title: t(\"positions.liquidation\"),\n message: (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n className=\"oui-text-2xs oui-text-base-contrast-54\"\n >\n {record.liquidation_id != null && (\n <Flex justify={\"between\"} width={\"100%\"}>\n <Text>{t(\"positions.history.liquidated.liquidationId\")}</Text>\n <Text intensity={98}>{record.liquidation_id}</Text>\n </Flex>\n )}\n <Flex justify={\"between\"} width={\"100%\"}>\n <Text>{t(\"positions.history.liquidated.liquidatorFee\")}</Text>\n <Text color=\"lose\">\n {record.liquidator_fee > 0 && \"-\"}\n {commifyOptional(record.liquidator_fee)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"}>\n <Text>{t(\"positions.history.liquidated.insFundFee\")}</Text>\n <Text color=\"lose\">\n {record.insurance_fund_fee > 0 && \"-\"}\n {commifyOptional(record.insurance_fund_fee)}\n </Text>\n </Flex>\n </Flex>\n ),\n });\n };\n\n const tags = useMemo(() => {\n const list: ReactNode[] = [];\n\n const status = record.position_status;\n\n const renderStatus = () => {\n if (status === \"closed\") {\n return t(\"positions.history.status.closed\");\n } else if (status === \"partial_closed\") {\n return t(\"positions.history.status.partialClosed\");\n } else {\n return capitalizeFirstLetter(status.replace(\"_\", \" \"));\n }\n };\n\n list.push(\n <Badge\n key={1}\n color={status !== \"closed\" ? \"primaryLight\" : \"neutral\"}\n size=\"xs\"\n >\n {renderStatus()}\n </Badge>,\n );\n\n if (record.type === \"adl\") {\n list.push(\n <Badge key={2} color={\"danger\"} size=\"xs\">\n {t(\"positions.history.type.adl\")}\n </Badge>,\n );\n } else if (record.type === \"liquidated\") {\n list.push(\n <Badge\n key={3}\n size=\"xs\"\n color=\"danger\"\n className=\"oui-cursor-pointer\"\n onClick={showAlert}\n >\n <span className=\"oui-underline oui-decoration-dashed oui-decoration-1\">\n {/* {capitalizeFirstLetter(record.type)} */}\n {t(\"positions.history.type.liquidated\")}\n </span>\n </Badge>,\n );\n }\n\n return list;\n }, [record]);\n\n return <Flex gap={1}>{tags}</Flex>;\n};\n\nexport const ClosedQty: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n const closedQty =\n item.closed_position_qty != null\n ? Math.abs(item.closed_position_qty)\n : \"--\";\n\n return (\n <Statistic\n // label={\n // <Text>Closed{<Text intensity={20}>{` (${props.base})`}</Text>}</Text>\n // }\n label={<Text>{t(\"positions.history.column.closed\")}</Text>}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.base_dp} padding={false} coloring intensity={80}>\n {closedQty}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const MaxClosedQty: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n const maxClosedQty =\n item.max_position_qty != null ? Math.abs(item.max_position_qty) : \"--\";\n return (\n <Statistic\n // label={\n // <Text>\n // Max closed{<Text intensity={20}>{` (${props.base})`}</Text>}\n // </Text>\n // }\n label={<Text>{t(\"positions.history.column.maxClosed\")}</Text>}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.base_dp} padding={false} coloring intensity={80}>\n {maxClosedQty}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const AvgOpen: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const avgOpen =\n item.avg_open_price != null ? Math.abs(item.avg_open_price) : \"--\";\n const { t } = useTranslation();\n return (\n <Statistic\n label={\n <Flex gap={1}>\n {t(\"common.avgOpen\")}\n <Text intensity={20}>(USDC)</Text>\n </Flex>\n }\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} padding={false} coloring intensity={80}>\n {avgOpen}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const AvgClosed: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const avgClose =\n item.avg_close_price != null ? Math.abs(item.avg_close_price) : \"--\";\n const { t } = useTranslation();\n return (\n <Statistic\n label={\n <Flex gap={1}>\n {t(\"common.avgClose\")}\n <Text intensity={20}>(USDC)</Text>\n </Flex>\n }\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} padding={false} coloring intensity={80}>\n {avgClose}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const OpenTime: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n label={<Text>{t(\"positions.history.column.timeOpened\")}</Text>}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n align=\"end\"\n >\n <Text.formatted\n intensity={80}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n rule={\"date\"}\n >\n {item.open_timestamp}\n </Text.formatted>\n </Statistic>\n );\n};\nexport const ClosedTime: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n const child =\n item.position_status == \"closed\" && item.close_timestamp ? (\n <Text.formatted\n intensity={80}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n rule={\"date\"}\n >\n {item.close_timestamp}\n </Text.formatted>\n ) : (\n \"--\"\n );\n\n return (\n <Statistic\n label={<Text>{t(\"positions.history.column.timeClosed\")}</Text>}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n align=\"end\"\n >\n {child}\n </Statistic>\n );\n};\n\nexport const FundingFee: FC<PositionHistoryCellState> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex\n justify={\"end\"}\n className=\"oui-text-2xs oui-w-full oui-py-2 oui-gap-1 oui-gap-1\"\n >\n <Text intensity={36}>{t(\"funding.fundingFee\")}: </Text>\n <FundingFeeButton\n fee={-props.item.accumulated_funding_fee}\n symbol={props.item.symbol}\n start_t={props.item.open_timestamp.toString()}\n end_t={props.item.close_timestamp?.toString()}\n />\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { differenceInDays, setDate, setHours, subDays } from \"date-fns\";\nimport {\n useAccount,\n usePrivateQuery,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { TRADING_POSITIONS_SORT_STORAGE_KEY } from \"../../constants\";\nimport {\n areDatesEqual,\n formatDatePickerRange,\n offsetEndOfDay,\n offsetStartOfDay,\n} from \"../../utils\";\nimport { useSort } from \"../../utils/sorting\";\nimport { useTabSort, PositionsTabName } from \"../shared/hooks/useTabSort\";\nimport { PositionHistoryProps } from \"./positionHistory.widget\";\n\nexport type PositionHistoryExt = API.PositionHistory & {\n netPnL?: number;\n};\n\nexport enum PositionHistorySide {\n all = \"all\",\n buy = \"LONG\",\n sell = \"SHORT\",\n}\nexport enum PositionHistoryStatus {\n all = \"all\",\n closed = \"closed\",\n partial_closed = \"partial_closed\",\n}\n\nexport const usePositionHistoryScript = (props: PositionHistoryProps) => {\n const {\n onSymbolChange,\n symbol,\n pnlNotionalDecimalPrecision,\n enableSortingStorage = true,\n } = props;\n const { state } = useAccount();\n\n // Sorting functionality\n const { tabSort, onTabSort } = useTabSort({\n storageKey: TRADING_POSITIONS_SORT_STORAGE_KEY,\n });\n\n const { onSort, getSortedList } = useSort(\n enableSortingStorage\n ? tabSort?.[PositionsTabName.PositionHistory]\n : undefined,\n enableSortingStorage\n ? onTabSort(PositionsTabName.PositionHistory)\n : undefined,\n );\n\n const { data, isLoading } = usePrivateQuery<PositionHistoryExt[]>(\n symbol\n ? `/v1/position_history?symbol=${symbol}&limit=1000`\n : \"/v1/position_history?limit=1000\",\n {\n formatter(data) {\n return (data.rows ?? null)?.map(\n (item: API.PositionHistory): PositionHistoryExt => {\n if (\n item.realized_pnl != null &&\n item.accumulated_funding_fee != null &&\n item.trading_fee != null\n ) {\n const netPnL =\n item.realized_pnl -\n item.accumulated_funding_fee -\n item.trading_fee;\n return {\n ...item,\n netPnL: netPnL,\n };\n }\n return item;\n },\n );\n },\n revalidateOnFocus: true,\n },\n );\n\n const { pagination, setPage } = usePagination({\n pageSize: 10,\n });\n\n const {\n status,\n side,\n dateRange,\n filterDays,\n updateFilterDays,\n filterItems,\n onFilter,\n } = useFilter();\n\n useEffect(() => {\n setPage(1);\n }, [status, side, dateRange, filterDays, symbol]);\n\n const filterData = useMemo(() => {\n if (data == null) return data;\n\n return data.filter((item) => {\n const sideFilter =\n side === PositionHistorySide.all\n ? true\n : item.side.toLowerCase() === side.toLowerCase();\n const statusFilter =\n status === PositionHistoryStatus.all\n ? true\n : item.position_status.toLowerCase() === status.toLowerCase();\n\n // const time = item.close_timestamp ?? item?.last_update_timestamp ?? item.open_timestamp;\n const time = item?.last_update_time ?? item.open_timestamp;\n const dateFilter =\n dateRange.from && dateRange.to\n ? time >= dateRange.from.getTime() && time <= dateRange.to.getTime()\n : true;\n\n const symbolFilter = symbol ? item.symbol == symbol : true;\n\n return sideFilter && statusFilter && dateFilter && symbolFilter;\n });\n }, [status, side, dateRange, data, symbol]);\n\n const rawDataSource = useDataTap(filterData, {\n accountStatus:\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading,\n fallbackData: [],\n });\n\n const dataSource = getSortedList(rawDataSource || []);\n\n return {\n dataSource,\n isLoading,\n onSymbolChange,\n pagination,\n filterItems,\n onFilter,\n symbol,\n filterDays,\n updateFilterDays,\n pnlNotionalDecimalPrecision,\n onSort,\n initialSort: enableSortingStorage\n ? tabSort?.[PositionsTabName.PositionHistory]\n : undefined,\n };\n};\n\nconst useFilter = () => {\n const { t } = useTranslation();\n\n const [status, setStatus] = useState<PositionHistoryStatus>(\n PositionHistoryStatus.all,\n );\n const [side, setSide] = useState<PositionHistorySide>(\n PositionHistorySide.all,\n );\n const defaultRange = formatDatePickerRange({\n to: offsetEndOfDay(new Date()),\n from: offsetStartOfDay(subDays(new Date(), 89)),\n });\n\n /// default is 90d\n const [filterDays, setFilterDays] = useState<1 | 7 | 30 | 90 | null>(90);\n\n const [dateRange, setDateRange] = useState<{\n from?: Date;\n to?: Date;\n }>(defaultRange);\n\n const updateFilterDays = (days: 1 | 7 | 30 | 90) => {\n setFilterDays(days);\n setDateRange({\n from: offsetStartOfDay(subDays(new Date(), days - 1)),\n to: offsetEndOfDay(new Date()),\n });\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"side\") {\n setSide(filter.value);\n }\n\n if (filter.name === \"status\") {\n setStatus(filter.value);\n }\n\n if (filter.name === \"dateRange\") {\n const newDateRange = formatDatePickerRange(filter.value);\n setDateRange(newDateRange);\n if (newDateRange.from && newDateRange.to) {\n const diffDays =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n const dateRangeMap: { [key: number]: { from: Date; to: Date } } = {\n 1: {\n from: offsetStartOfDay(new Date())!,\n to: offsetEndOfDay(new Date())!,\n },\n 7: {\n from: offsetStartOfDay(subDays(new Date(), 6))!,\n to: offsetEndOfDay(new Date())!,\n },\n 30: {\n from: offsetStartOfDay(subDays(new Date(), 29))!,\n to: offsetEndOfDay(new Date())!,\n },\n 90: {\n from: offsetStartOfDay(subDays(new Date(), 89))!,\n to: offsetEndOfDay(new Date())!,\n },\n };\n\n const dateRange = dateRangeMap[diffDays];\n if (\n dateRange &&\n areDatesEqual(dateRange.from, newDateRange.from) &&\n areDatesEqual(dateRange.to, newDateRange.to)\n ) {\n setFilterDays(diffDays as any);\n } else {\n setFilterDays(null);\n }\n }\n }\n };\n\n const { isMobile } = useScreen();\n\n const filterItems = useMemo((): any[] => {\n const sideFilter = {\n type: \"select\",\n name: \"side\",\n options: [\n {\n label: t(\"common.side.all\"),\n value: \"all\",\n },\n {\n label: t(\"common.buy\"),\n value: PositionHistorySide.buy,\n },\n {\n label: t(\"common.sell\"),\n value: PositionHistorySide.sell,\n },\n ],\n value: side,\n };\n\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n fromDate: offsetStartOfDay(subDays(new Date(), 89)),\n toDate: offsetEndOfDay(new Date()),\n };\n\n const statusFilter = {\n type: \"select\",\n name: \"status\",\n options: [\n {\n label: t(\"common.status.all\"),\n value: \"all\",\n },\n {\n label: t(\"positions.history.status.closed\"),\n value: PositionHistoryStatus.closed,\n },\n {\n label: t(\"positions.history.status.partialClosed\"),\n value: PositionHistoryStatus.partial_closed,\n },\n ],\n value: status,\n };\n\n if (isMobile) {\n return [sideFilter, statusFilter];\n }\n return [sideFilter, statusFilter, dateRangeFilter];\n }, [side, status, dateRange]);\n\n return {\n filterItems,\n onFilter,\n side,\n dateRange,\n status,\n filterDays,\n updateFilterDays,\n };\n};\n\nexport type PositionHistoryState = ReturnType<typeof usePositionHistoryScript>;\n","import { differenceInDays, setDate, setHours, subDays } from \"date-fns\";\n\nexport const parseDateRangeForFilter = (dateRange: {\n from: Date;\n to?: Date;\n}) => {\n let { from, to } = dateRange;\n\n if (typeof to === \"undefined\") {\n to = new Date();\n }\n\n const diff = differenceInDays(from, to);\n\n // console.log(\"diff\", diff);\n\n if (diff === 0) {\n return [from, setHours(to, 23)];\n }\n\n return [from, to];\n};\n\nexport function offsetStartOfDay(date?: Date) {\n if (date == null) return date;\n\n const newDate = new Date(date);\n newDate.setHours(0, 0, 0, 0);\n return newDate;\n}\n\nexport function offsetEndOfDay(date?: Date) {\n if (date == null) return date;\n\n const newDate = new Date(date);\n newDate.setHours(23, 59, 59, 999);\n return newDate;\n}\n\nexport const formatDatePickerRange = (option: { from?: Date; to?: Date }) => ({\n from: offsetStartOfDay(option.from),\n to: offsetEndOfDay(option.to ?? option.from),\n});\n\nexport const areDatesEqual = (date1: Date, date2: Date): boolean => {\n return date1.getTime() === date2.getTime();\n};\n","import { API } from \"@kodiak-finance/orderly-types\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\nimport { PositionHistoryExt } from \"../positionHistory.script\";\n\nexport const usePositionHistoryCellScript = (props: {\n item: PositionHistoryExt;\n onSymbolChange?: (symbol: API.Symbol) => void;\n index: number;\n classNames?: {\n root?: string;\n };\n sharePnLConfig?: SharePnLConfig;\n}) => {\n const symbolInfo = useSymbolContext();\n\n return {\n ...props,\n ...symbolInfo,\n };\n};\n\nexport type PositionHistoryCellState = ReturnType<\n typeof usePositionHistoryCellScript\n>;\n","import { API } from \"@kodiak-finance/orderly-types\";\nimport { PositionHistoryExt } from \"../positionHistory.script\";\nimport { usePositionHistoryCellScript } from \"./positionHistoryCell.script\";\nimport { PositionHistoryCell } from \"./positionHistoryCell.ui\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\n\nexport const PositionHistoryCellWidget = (props: {\n item: PositionHistoryExt;\n onSymbolChange?: (symbol: API.Symbol) => void;\n index: number;\n classNames?: {\n root?: string;\n };\n sharePnLConfig?: SharePnLConfig;\n}) => {\n const state = usePositionHistoryCellScript(props);\n return <PositionHistoryCell {...state} />;\n};\n","import React from \"react\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\nimport { usePositionHistoryScript } from \"./positionHistory.script\";\nimport { MobilePositionHistory, PositionHistory } from \"./positionHistory.ui\";\n\nexport type PositionHistoryProps = {\n onSymbolChange?: (symbol: API.Symbol) => void;\n symbol?: string;\n pnlNotionalDecimalPrecision?: number;\n sharePnLConfig?: SharePnLConfig;\n enableSortingStorage?: boolean; // Controls whether to persist sorting preferences\n};\n\nexport const PositionHistoryWidget: React.FC<PositionHistoryProps> = (\n props,\n) => {\n const state = usePositionHistoryScript(props);\n return <PositionHistory {...state} sharePnLConfig={props.sharePnLConfig} />;\n};\n\nexport const MobilePositionHistoryWidget: React.FC<\n PositionHistoryProps & {\n classNames?: { root?: string; content?: string; cell?: string };\n }\n> = (props) => {\n const { classNames, ...rest } = props;\n const state = usePositionHistoryScript(rest);\n return (\n <MobilePositionHistory\n {...state}\n classNames={classNames}\n sharePnLConfig={props.sharePnLConfig}\n />\n );\n};\n","import { FC, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n cn,\n DataFilter,\n Flex,\n Grid,\n ListView,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\nimport { useLiquidationColumn } from \"./desktop/useLiquidationColumn\";\nimport { LiquidationState } from \"./liquidation.script\";\nimport { LiquidationCellWidget } from \"./mobile\";\n\nexport const Liquidation: FC<LiquidationState> = (props) => {\n const [expanded, setExpanded] = useState({});\n const column = useLiquidationColumn({});\n\n return (\n <Flex direction=\"column\" width=\"100%\" height=\"100%\" itemAlign=\"start\">\n {/* <Divider className=\"oui-w-full\" /> */}\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n />\n )}\n {[1, 7, 30, 90].map((value) => {\n return (\n <button\n key={`item-${value}`}\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDays === value ? \"brand\" : undefined}\n className={\n props.filterDays !== value\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n props.updateFilterDays(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n\n <AuthGuardDataTable<API.Liquidation>\n loading={props.isLoading}\n id=\"oui-desktop-liquidation-content\"\n columns={column}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: API.Liquidation) =>\n `${record.liquidation_id}`\n }\n // manualPagination={false}\n pagination={props.pagination}\n testIds={{\n body: \"oui-testid-dataList-liquidation-tab-body\",\n }}\n classNames={{\n root: \"!oui-h-[calc(100%_-_49px)]\",\n }}\n // onRow={(record, index, row) => {\n // return {\n // className: \"[&>td:first-child]:oui-pl-0 [&>td:last-child]:oui-pr-0\",\n // };\n // }}\n expanded={expanded}\n onExpandedChange={setExpanded}\n getRowCanExpand={() => true}\n expandRowRender={(record) => {\n return <LiquidationDetails record={record.original} />;\n }}\n />\n </Flex>\n );\n};\n\nconst TooltipHeaderCell: FC<{\n tooltip: string;\n label: string;\n side?: \"left\";\n}> = (props) => {\n return (\n <th className=\"oui-h-10 oui-border-b oui-border-line oui-text-left oui-text-base-contrast-36\">\n <Tooltip\n content={props.tooltip}\n className=\"oui-w-[275px] oui-bg-base-6\"\n side={props.side}\n arrow={{\n className: \"oui-fill-base-6\",\n }}\n >\n <button className=\"oui-border-b oui-border-dashed oui-border-line-12\">\n {props.label}\n </button>\n </Tooltip>\n </th>\n );\n};\n\nconst LiquidationDetails: FC<{\n record: API.Liquidation;\n}> = (props) => {\n const { margin_ratio, account_mmr, collateral_value, position_notional } =\n props.record as any;\n\n const { t } = useTranslation();\n\n return (\n <div className=\"oui-w-full oui-bg-base-8 oui-px-6\">\n {/* <pre>{JSON.stringify(props.record, null, 2)}</pre> */}\n\n <table className=\"oui-w-full\">\n <thead>\n <tr>\n <TooltipHeaderCell\n tooltip={t(\"positions.Liquidation.expand.tooltip.mr\")}\n label={t(\"positions.Liquidation.expand.label.mr\")}\n side=\"left\"\n />\n <TooltipHeaderCell\n tooltip={t(\"positions.Liquidation.expand.tooltip.mmr\")}\n label={t(\"positions.Liquidation.expand.label.mmr\")}\n />\n <TooltipHeaderCell\n tooltip={t(\"positions.Liquidation.expand.tooltip.collateral\")}\n label={t(\"positions.Liquidation.expand.label.collateral\")}\n />\n <TooltipHeaderCell\n tooltip={t(\"positions.Liquidation.expand.tooltip.notional\")}\n label={t(\"positions.Liquidation.expand.label.notional\")}\n />\n </tr>\n </thead>\n <tbody>\n <tr>\n <td className=\"oui-h-10\">\n <Text.numeral rule=\"percentages\">{margin_ratio}</Text.numeral>\n </td>\n <td className=\"oui-h-10\">\n <Text.numeral rule=\"percentages\">{account_mmr}</Text.numeral>\n </td>\n <td className=\"oui-h-10\">{commifyOptional(collateral_value)}</td>\n <td className=\"oui-h-10\">{commifyOptional(position_notional)}</td>\n </tr>\n </tbody>\n </table>\n </div>\n );\n};\n\nexport const MobileLiquidation: FC<\n LiquidationState & {\n classNames?: {\n root?: string;\n content?: string;\n cell?: string;\n };\n }\n> = (props) => {\n return (\n <Grid\n cols={1}\n rows={2}\n className=\"oui-w-full oui-grid-rows-[auto,1fr]\"\n gap={1}\n >\n <Flex gap={2} p={2} className=\"oui-rounded-b-xl oui-bg-base-9\">\n <DataFilter\n className=\"oui-border-none oui-py-0\"\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n />\n </Flex>\n <ListView\n className={cn(\n \"oui-hide-scrollbar oui-w-full oui-space-y-0 oui-overflow-y-hidden\",\n props.classNames?.root,\n )}\n contentClassName={cn(\"!oui-space-y-1\", props.classNames?.content)}\n dataSource={props.dataSource}\n loadMore={props.loadMore}\n renderItem={(item, index) => (\n <LiquidationCellWidget\n item={item}\n index={index}\n classNames={{\n root: props.classNames?.cell,\n }}\n />\n )}\n />\n </Grid>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { Column, Flex, Text, Tooltip } from \"@kodiak-finance/orderly-ui\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\n\nconst TooltipButton: FC<{\n tooltip: string;\n label: string;\n}> = (props) => {\n return (\n <Tooltip\n className=\"oui-w-[275px] oui-bg-base-6\"\n content={props.tooltip}\n arrow={{\n className: \"oui-fill-base-6\",\n }}\n >\n <button className=\"oui-border-b oui-border-dashed oui-border-line-12\">\n {props.label}\n </button>\n </Tooltip>\n );\n};\n\nexport const useLiquidationColumn = (props: {}) => {\n const { t } = useTranslation();\n\n const column = useMemo(\n () =>\n [\n // Time\n {\n title: t(\"common.time\"),\n dataIndex: \"timestamp\",\n width: 202,\n render: (value: string) => (\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd HH:mm:ss\">\n {value}\n </Text.formatted>\n ),\n },\n // Liquidation id\n {\n title: t(\"positions.Liquidation.column.liquidationId\"),\n dataIndex: \"liquidation_id\",\n width: 120,\n render: (value) => <Text>{value}</Text>,\n },\n // Symbol\n {\n title: t(\"common.symbol\"),\n dataIndex: \"Symbol\",\n // width: 202,\n render: (_: any, record) => (\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n {record.positions_by_perp?.map((item) => (\n <Text.formatted\n rule={\"symbol\"}\n formatString=\"base-quote\"\n key={item.symbol}\n >\n {item.symbol}\n </Text.formatted>\n ))}\n </Flex>\n ),\n },\n // Price (USDC)\n {\n title: t(\"positions.Liquidation.column.markPrice\"),\n dataIndex: \"Price_(USDC)\",\n // width: 202,\n render: (_: any, record) => {\n return (\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n {record.positions_by_perp?.map((item) => (\n // <SymbolProvider symbol={item.symbol}>\n // </SymbolProvider>\n <FormattedText\n value={item.mark_price}\n type=\"quote\"\n key={item.symbol}\n />\n ))}\n </Flex>\n );\n },\n },\n // Quantity\n {\n title: t(\"common.quantity\"),\n dataIndex: \"Quantity\",\n // width: 202,\n render: (_: any, record) => {\n return (\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n {record.positions_by_perp?.map((item) => (\n // <SymbolProvider symbol={item.symbol}>\n // </SymbolProvider>\n <FormattedText\n value={item.position_qty}\n type=\"base\"\n key={item.symbol}\n />\n ))}\n </Flex>\n );\n },\n },\n\n // net pnl\n // {\n // title: t(\"positions.Liquidation.column.insFundTransfer\"),\n // dataIndex: \"transfer_amount_to_insurance_fund\",\n // width: 202,\n // render: (value) => {\n // return <Text>{commifyOptional(value)}</Text>;\n // },\n // },\n // Liquidation fee rate\n // TODO: use i18\n {\n title: (\n <TooltipButton\n tooltip={t(\"positions.Liquidation.col.tooltip.feeRate\")}\n label={t(\"positions.Liquidation.column.liquidationFeeRate\")}\n />\n ),\n dataIndex: \"liquidationFeeRate\",\n // width: 202,\n render: (value) => {\n return <Text.numeral rule=\"percentages\">{value}</Text.numeral>;\n // return <Text>{commifyOptional(value)}</Text>;\n },\n },\n\n // Liquidation Fee\n {\n title: (\n <TooltipButton\n tooltip={t(\"positions.Liquidation.col.tooltip.fee\")}\n label={t(\"positions.Liquidation.column.liquidationFee\")}\n />\n ),\n dataIndex: \"abs_liquidation_fee\",\n width: 100,\n render: (abs_liquidation_fee: any, record) => {\n return (\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n {record.positions_by_perp?.map((item) => (\n // <SymbolProvider symbol={item.symbol}>\n // </SymbolProvider>\n <FormattedText\n key={item.symbol}\n value={item.abs_liquidation_fee}\n type=\"quote\"\n />\n ))}\n </Flex>\n );\n },\n },\n {\n title: \"\",\n dataIndex: \"actions\",\n align: \"right\",\n width: 40,\n render: (_: any, record: API.Liquidation, index, ctx) => {\n const isExpanded = ctx.row.getIsExpanded();\n\n return (\n <button\n className=\"oui-p-2\"\n onClick={() => {\n ctx.row.getToggleExpandedHandler()();\n }}\n >\n <ArrowIcon className={isExpanded ? \"oui-rotate-180\" : \"\"} />\n </button>\n );\n },\n },\n ] as Column<API.Liquidation>[],\n [t],\n );\n\n return column;\n};\n\nconst FormattedText: FC<{ value?: string | number; type: \"base\" | \"quote\" }> = (\n props,\n) => {\n return <Text>{commifyOptional(props.value)}</Text>;\n};\n\nconst ArrowIcon: FC<{\n className?: string;\n onClick?: () => void;\n}> = (props) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={props.className}\n >\n <path\n d=\"M3.884 6.02a.67.67 0 0 0-.436.27.68.68 0 0 0 .187.933L7.63 9.88a.68.68 0 0 0 .749 0l3.994-2.657a.68.68 0 0 0 .187-.934.68.68 0 0 0-.936-.186L8.003 8.51l-3.62-2.407a.65.65 0 0 0-.499-.084\"\n fill=\"#fff\"\n fillOpacity=\".54\"\n />\n </svg>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, Text, Divider, Badge } from \"@kodiak-finance/orderly-ui\";\nimport { commifyOptional, Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { LiquidationCellState } from \"./liquidationCell.script\";\n\nexport const LiquidationCell: FC<\n LiquidationCellState & {\n classNames?: {\n root?: string;\n };\n }\n> = (props) => {\n return (\n <Flex\n key={props.item.timestamp}\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n itemAlign={\"start\"}\n className={cn(\n \"oui-rounded-xl oui-bg-base-9 oui-p-2\",\n props.classNames?.root,\n )}\n >\n <Header {...props} />\n <Divider />\n <Body {...props} />\n </Flex>\n );\n};\n\nexport const Header: FC<LiquidationCellState> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex width={\"100%\"} justify={\"between\"} itemAlign={\"start\"}>\n <Flex direction={\"column\"} itemAlign={\"start\"} gap={1}>\n <Flex gap={2} itemAlign={\"center\"}>\n <Flex direction={\"column\"} gap={1} itemAlign={\"start\"}>\n <Text.formatted\n rule={\"symbol\"}\n formatString=\"base-quote\"\n size=\"xs\"\n intensity={80}\n >\n {props.item.positions_by_perp?.[0]?.symbol || \"\"}\n </Text.formatted>\n {/* <Badge size=\"sm\" color=\"neutral\">\n Cross 10X\n </Badge> */}\n </Flex>\n </Flex>\n </Flex>\n <Flex direction={\"column\"} itemAlign={\"end\"}>\n <Text size=\"2xs\" intensity={36}>\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd HH:mm:ss\">\n {props.item.timestamp}\n </Text.formatted>\n </Text>\n <Text size=\"2xs\" intensity={36}>\n {`${t(\"positions.Liquidation.column.liquidationId\")}: `}\n <Text as=\"span\" intensity={80}>\n {props.item.liquidation_id}\n </Text>\n </Text>\n </Flex>\n </Flex>\n );\n};\n\nexport const Body: FC<LiquidationCellState> = (props) => {\n const position = props.item.positions_by_perp?.[0];\n const { t } = useTranslation();\n const mr = useMemo(() => {\n if (isNaN(props.item?.margin_ratio)) return \"--\";\n return `${new Decimal(props.item.margin_ratio).mul(100).todp(2, Decimal.ROUND_DOWN).toNumber()}%`;\n }, [props.item?.margin_ratio]);\n\n if (!position) return null;\n\n return (\n <Flex direction={\"column\"} width={\"100%\"} gap={1}>\n {/* First row */}\n <Flex gap={2} width={\"100%\"}>\n <DataItem\n label={t(\"positions.Liquidation.column.markPrice\")}\n value={commifyOptional(position.transfer_price)}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"common.quantity\")}\n value={commifyOptional(position.position_qty)}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"positions.Liquidation.column.liquidationFeeRate\")}\n value={props.item.liquidationFeeRate}\n className=\"oui-flex-1\"\n align=\"end\"\n />\n </Flex>\n\n {/* Second row */}\n <Flex gap={2} width={\"100%\"}>\n <DataItem\n label={t(\"positions.Liquidation.column.liquidationFee\")}\n value={commifyOptional(position.abs_liquidation_fee)}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"positions.Liquidation.expand.label.mr\")}\n value={mr}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"positions.Liquidation.expand.label.mmr\")}\n value={\n props.item.formatted_account_mmr\n ? `${props.item.formatted_account_mmr}%`\n : \"--\"\n }\n className=\"oui-flex-1\"\n align=\"end\"\n />\n </Flex>\n\n {/* Third row */}\n <Flex gap={2} width={\"100%\"}>\n <DataItem\n label={t(\"positions.Liquidation.expand.label.collateral\")}\n value={commifyOptional(props.item.collateral_value)}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"positions.Liquidation.expand.label.notional\")}\n value={commifyOptional(props.item.position_notional)}\n className=\"oui-flex-1\"\n />\n <div className=\"oui-flex-1 oui-opacity-0\" /> {/* Empty placeholder */}\n </Flex>\n </Flex>\n );\n};\n\nconst DataItem: FC<{\n label: string;\n value: string | number;\n className?: string;\n align?: \"start\" | \"end\";\n}> = ({ label, value, className, align = \"start\" }) => {\n return (\n <Flex direction={\"column\"} itemAlign={align} className={className}>\n <Text size=\"2xs\" intensity={36}>\n {label}\n </Text>\n <Text size=\"xs\" intensity={80}>\n {value}\n </Text>\n </Flex>\n );\n};\n","import { API } from \"@kodiak-finance/orderly-types\";\n\nexport const useLiquidationCellScript = (props: {\n item: API.Liquidation & {\n formatted_account_mmr: string;\n liquidationFeeRate: number;\n };\n onSymbolChange?: (symbol: API.Symbol) => void;\n index: number;\n}) => {\n return {\n ...props,\n };\n};\n\nexport type LiquidationCellState = ReturnType<typeof useLiquidationCellScript>;\n","import { API } from \"@kodiak-finance/orderly-types\";\nimport { useLiquidationCellScript } from \"./liquidationCell.script\";\nimport { LiquidationCell } from \"./liquidationCell.ui\";\n\nexport const LiquidationCellWidget = (props: {\n item: API.Liquidation;\n onSymbolChange?: (symbol: API.Symbol) => void;\n index: number;\n classNames?: {\n root?: string;\n };\n}) => {\n const { classNames, ...rest } = props;\n const state = useLiquidationCellScript(rest);\n return <LiquidationCell classNames={classNames} {...state} />;\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { differenceInDays, subDays } from \"date-fns\";\nimport {\n usePrivateInfiniteQuery,\n usePrivateQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal, zero } from \"@kodiak-finance/orderly-utils\";\nimport {\n areDatesEqual,\n formatDatePickerRange,\n offsetEndOfDay,\n offsetStartOfDay,\n} from \"../../utils\";\nimport { LiquidationProps } from \"./liquidation.widget\";\n\nexport const useLiquidationScript = (props: LiquidationProps) => {\n const { symbol, enableLoadMore } = props;\n const { page, pageSize, setPage, pagination, parsePagination } =\n usePagination({\n pageSize: 10,\n });\n\n const { dateRange, filterDays, updateFilterDays, filterItems, onFilter } =\n useFilter();\n\n useEffect(() => {\n setPage(1);\n }, [symbol, dateRange, filterDays]);\n\n const [data, { meta, isLoading, loadMore }] = useLiquidation({\n page: enableLoadMore ? undefined : page,\n size: pageSize,\n symbol,\n start_t: dateRange.from != null ? dateRange.from.getTime() : undefined,\n end_t: dateRange.to != null ? dateRange.to.getTime() : undefined,\n });\n\n const dataSource = useDataTap(data, {\n fallbackData: [],\n });\n\n // useEffect(() => {\n // setPage(1);\n // }, [dateRange, filterDays]);\n\n // console.log(\"pagination\", pagination, meta);\n\n return {\n dataSource,\n isLoading,\n loadMore,\n\n pagination: parsePagination(meta),\n\n // filter\n dateRange,\n filterDays,\n updateFilterDays,\n filterItems,\n onFilter,\n };\n};\n\nexport type LiquidationState = ReturnType<typeof useLiquidationScript>;\n\n/**\n *\n * @param props size default is 100\n */\nconst useLiquidation = (props: {\n symbol?: string;\n start_t?: number;\n end_t?: number;\n page?: number;\n size?: number;\n}) => {\n const ordersResponse = usePrivateInfiniteQuery(generateKeyFun(props), {\n initialSize: 1,\n formatter: (data) => data,\n revalidateOnFocus: true,\n });\n\n const meta = useMemo(() => {\n // @ts-ignore\n return ordersResponse.data?.[0]?.meta;\n }, [ordersResponse.data?.[0]]);\n\n const data = useMemo(() => {\n return ordersResponse.data\n ?.map((item) =>\n // @ts-ignore\n item.rows?.map((item) => {\n let liquidationFeeRate = null;\n const firstPosition = item.positions_by_perp[0];\n\n if (firstPosition) {\n liquidationFeeRate = new Decimal(firstPosition.liquidator_fee)\n .add(firstPosition.insurance_fund_fee)\n .toNumber();\n }\n\n return {\n ...item,\n formatted_account_mmr: isNaN(item.account_mmr)\n ? null\n : new Decimal(item.account_mmr).mul(100).toFixed(2).toString(),\n liquidationFeeRate,\n };\n }),\n )\n ?.flat();\n }, [ordersResponse.data]);\n\n const isLoading = ordersResponse.isLoading;\n\n const loadMore = () => {\n ordersResponse.setSize(ordersResponse.size + 1);\n };\n\n return [data, { meta, isLoading, loadMore }] as const;\n};\n\nconst useFilter = () => {\n const defaultRange = formatDatePickerRange({\n to: offsetEndOfDay(new Date()),\n from: offsetStartOfDay(subDays(new Date(), 89)),\n });\n\n /// default is 90d\n const [filterDays, setFilterDays] = useState<1 | 7 | 30 | 90 | null>(90);\n\n const [dateRange, setDateRange] = useState<{\n from?: Date;\n to?: Date;\n }>(defaultRange);\n\n const updateFilterDays = (days: 1 | 7 | 30 | 90) => {\n setFilterDays(days);\n setDateRange({\n from: offsetStartOfDay(subDays(new Date(), days - 1)),\n to: offsetEndOfDay(new Date()),\n });\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = formatDatePickerRange(filter.value);\n setDateRange(newDateRange);\n if (newDateRange.from && newDateRange.to) {\n const diffDays =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n const dateRangeMap: { [key: number]: { from: Date; to: Date } } = {\n 1: {\n from: offsetStartOfDay(new Date())!,\n to: offsetEndOfDay(new Date())!,\n },\n 7: {\n from: offsetStartOfDay(subDays(new Date(), 6))!,\n to: offsetEndOfDay(new Date())!,\n },\n 30: {\n from: offsetStartOfDay(subDays(new Date(), 29))!,\n to: offsetEndOfDay(new Date())!,\n },\n 90: {\n from: offsetStartOfDay(subDays(new Date(), 89))!,\n to: offsetEndOfDay(new Date())!,\n },\n };\n\n const dateRange = dateRangeMap[diffDays];\n if (\n dateRange &&\n areDatesEqual(dateRange.from, newDateRange.from) &&\n areDatesEqual(dateRange.to, newDateRange.to)\n ) {\n setFilterDays(diffDays as any);\n } else {\n setFilterDays(null);\n }\n }\n }\n };\n\n const { isMobile } = useScreen();\n\n const filterItems = useMemo((): any[] => {\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n fromDate: offsetStartOfDay(subDays(new Date(), 89)),\n toDate: offsetEndOfDay(new Date()),\n };\n\n if (isMobile) {\n return [dateRangeFilter];\n }\n return [dateRangeFilter];\n }, [dateRange]);\n\n return {\n filterItems,\n onFilter,\n dateRange,\n filterDays,\n updateFilterDays,\n };\n};\n\nconst generateKeyFun =\n (args: {\n symbol?: string;\n start_t?: number;\n end_t?: number;\n page?: number;\n size?: number;\n }) =>\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n const { symbol, size = 10, page, end_t, start_t } = args;\n\n const search = new URLSearchParams([\n [\"size\", size.toString()],\n [\"page\", `${pageIndex + 1}`],\n ]);\n\n if (page) {\n search.set(\"page\", `${page}`);\n }\n\n if (symbol) {\n search.set(`symbol`, symbol);\n }\n\n if (end_t) {\n search.set(`end_t`, `${end_t}`);\n }\n\n if (start_t) {\n search.set(`start_t`, `${start_t}`);\n }\n\n return `/v1/liquidations?${search.toString()}`;\n };\n","import React from \"react\";\nimport { useLiquidationScript } from \"./liquidation.script\";\nimport { Liquidation, MobileLiquidation } from \"./liquidation.ui\";\n\nexport type LiquidationProps = {\n symbol?: string;\n enableLoadMore?: boolean;\n};\n\nexport const LiquidationWidget: React.FC<LiquidationProps> = (props) => {\n const state = useLiquidationScript(props);\n return <Liquidation {...state} />;\n};\n\nexport const MobileLiquidationWidget: React.FC<\n LiquidationProps & {\n classNames?: { root?: string; content?: string; cell?: string };\n }\n> = (props) => {\n const { classNames, ...rest } = props;\n const state = useLiquidationScript(rest);\n return <MobileLiquidation classNames={classNames} {...state} />;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/components/positions/closePosition/components/confirmDialog.tsx","../src/components/positions/positionsRowContext.tsx","../src/components/fundingFeeHistory/fundingFeeHistory.ui.tsx","../src/components/fundingFeeHistory/endReachedBox.tsx","../src/components/fundingFeeHistory/useEndReached.ts","../src/components/fundingFeeHistory/fundingFeeButton.tsx","../src/components/positions/positions.widget.tsx","../src/components/positions/combinePositions.script.ts","../src/components/positions/hooks/useSubAccountQuery.ts","../src/components/positions/positions.script.ts","../src/constants.ts","../src/utils/sorting.ts","../src/components/shared/hooks/useTabSort.ts","../src/components/positions/positions.ui.tsx","../src/provider/symbolProvider.tsx","../src/provider/symbolContext.tsx","../src/components/positions/desktop/useColumn.tsx","../src/components/positions/closePosition/closePositions.mobile.ui.tsx","../src/components/positions/closePosition/components/quantitySlider.tsx","../src/components/positions/closePosition/closePosition.ui.tsx","../src/components/positions/closePosition/closePosition.widget.tsx","../src/components/positions/closePosition/closePosition.script.tsx","../src/components/positions/desktop/components.tsx","../src/components/positions/desktop/listElement.tsx","../src/components/positions/desktop/priceInput.tsx","../src/components/positions/desktop/quantityInput.tsx","../src/components/positions/desktop/numeralWithCtx.tsx","../src/components/positions/desktop/partialTPSL.tsx","../src/components/positions/desktop/shareButton/shareButton.ui.tsx","../src/components/positions/desktop/shareButton/shareButton.script.tsx","../src/components/positions/desktop/shareButton/shareButton.widget.tsx","../src/components/positions/desktop/triggerPrice.tsx","../src/components/positions/desktop/unrealPnLHover.tsx","../src/components/positions/mobile/positionCell/positionCell.ui.tsx","../src/components/positions/mobile/positionCell/items.tsx","../src/components/positions/mobile/positionCell/positionCell.script.tsx","../src/components/positions/mobile/positionCell/positionCell.widget.tsx","../src/components/positions/positionsRowProvider.tsx","../src/components/positionHistory/positionHistory.ui.tsx","../src/components/positionHistory/desktop/usePositionHistoryColumn.tsx","../src/components/positionHistory/mobile/positionHistoryCell.ui.tsx","../src/components/positionHistory/mobile/items.tsx","../src/components/positionHistory/positionHistory.script.tsx","../src/utils/utils.ts","../src/components/positionHistory/mobile/positionHistoryCell.script.tsx","../src/components/positionHistory/mobile/positionHistoryCell.widget.tsx","../src/components/positionHistory/positionHistory.widget.tsx","../src/components/liquidation/liquidation.ui.tsx","../src/components/liquidation/desktop/useLiquidationColumn.tsx","../src/components/liquidation/mobile/liquidationCell.ui.tsx","../src/components/liquidation/mobile/liquidationCell.script.tsx","../src/components/liquidation/mobile/liquidationCell.widget.tsx","../src/components/liquidation/liquidation.widget.tsx","../src/components/liquidation/liquidation.script.tsx"],"names":["registerSimpleDialog","useMemo","useTranslation","OrderSide","Button","Text","CloseIcon","Flex","Divider","Badge","ThrottledButton","Box","commify","commifyOptional","Decimal","Fragment","jsx","jsxs","ConfirmHeader","props","hideCloseIcon","ConfirmFooter","t","OrderDetail","quantity","price","quoteDp","side","total","MarketCloseConfirm","onCancel","LimitConfirmDialog","order","createContext","useContext","PositionsRowContext","usePositionsRowContext","useCallback","usePrivateInfiniteQuery","EMPTY_LIST","Grid","Statistic","DataTable","ListView","useScreen","cn","useRef","useEffect","useEndReached","sentinelRef","onEndReached","observer","cb","options","handleObserver","entries","entry","EndReachedBox","PAGE_SIZE","FundingFeeHistoryUI","symbol","start_t","end_t","isMobile","isLoading","data","setSize","pageIndex","previousPageData","loadMore","prev","flattenData","item","listView","HistoryDataListViewSimple","HistoryDataListView","columns","value","renderItem","FundingFeeItem","useBoolean","SimpleDialog","SimpleSheet","FundingFeeButton","fee","isOpen","setTrue","setFalse","React","forwardRef","produce","useAccount","usePositionStream","usePrivateQuery","useSymbolsInfo","i18n","positions","_account","useDataTap","formatAddress","usePagination","useSWR","fetcher","useConfig","AccountStatusEnum","getTimestamp","signatureMiddleware","account","accountId","apiBaseUrl","useSWRNext","key","config","args","url","fullUrl","signer","payload","signature","ids","id","e","useSubAccountQuery","query","formatter","swrOptions","state","middleware","shouldFetch","init","useCombinePositionsScript","calcMode","includedPendingOrder","pnlNotionalDecimalPrecision","sharePnLConfig","onSymbolChange","selectedAccount","pagination","setPage","symbolsInfo","oldPositions","newPositions","isPositionLoading","mutatePositions","accountInfo","isAccountInfoLoading","processPositions","acc","draft","info","notional","MMR","mm","unrealPnl","maxLeverage","imr","unrealPnlROI","unrealPnl_index","unrealPnlROI_index","dataSource","filtered","groupDataSource","groupDataByAccount","mergedLoading","mainAccountId","subAccounts","map","findSubAccount","TRADING_POSITIONS_SORT_STORAGE_KEY","useState","compareValues","aValue","bValue","aStr","bStr","aNum","bNum","aIsNumber","bIsNumber","aIsDate","bIsDate","aDate","bDate","sortList","list","sort","sortKey","sortOrder","sortedList","a","b","comparison","useSort","initialSort","onSortChange","setSort","onSort","nextSort","getSortedList","useSessionStorage","PositionsTabName","useTabSort","tabSort","setTabSort","onTabSort","type","usePositionsScript","enableSortingStorage","rawDataSource","TableFeatures","AuthGuardDataTable","SymbolContext","useSymbolContext","SymbolProvider","children","symbolInfo","memoizedValue","HoverCard","Tooltip","SymbolLeverageDialogId","SharePnLDialogId","Input","inputFormatter","Slider","QuantitySlider","MobileClosePosition","base","base_dp","quote","quote_dp","sheetOpen","setSheetOpen","dialogOpen","setDialogOpen","submitting","priceErrorMsg","quantityErrorMsg","disabled","isMarketClose","position","maxQty","isBuy","title","orderType","orderSide","header","lastPrice","inputForm","slider","footer","OrderType","PopoverContent","PopoverRoot","PopoverTrigger","Select","DesktopClosePosition","popoverOpen","setPopoverOpen","isEntirePosition","quantityForm","suffix","disabledInput","priceForm","useLocalStorage","utils","useOrderEntryFormErrorMsg","useClosePositionScript","sliderValue","setSliderValue","quantityInputRef","orderConfirm","onSubmit","closeOrderData","updatePriceChange","updateOrderType","updateQuantity","errors","baseTick","getErrorMsg","closeType","formatQuantityToBaseTick","formatQty","onSliderValueChange","qty","onMax","onConfirm","res","onDoubleConfirm","onCloseSheet","onCloseDialog","onClosePopover","onEntirePosition","ClosePositionWidget","useLeverageBySymbol","ChevronRightIcon","EditIcon","modal","PositionTPSLPopover","TPSLDetailDialogId","TPSLDialogId","TPSLSheetId","TPSLDetailSheetId","TPSLEditIcon","baseDp","tpslOrder","dialogId","AddIcon","needConfirm","onAdd","modalParams","LeverageBadge","leverage","showModal","LeverageDisplay","CaretDownIcon","DropdownMenuContent","DropdownMenuGroup","DropdownMenuItem","DropdownMenuRoot","DropdownMenuTrigger","renderQuantity","NumeralWithCtx","tick","rest","PositionType","PartialTPSL","orderNum","tpTriggerPrice","slTriggerPrice","direction","child","hasTPSL","ShareIcon","ShareButton","useAccountInfo","useReferralInfo","useShareButtonScript","iconSize","getFirstRefCode","refCode","symbolLeverage","getHistoryEntity","netPnL","openPrice","roi","baseIMR","IMR_Factor","unrealizedPnLROI","entity","ShareButtonWidget","AlgoOrderType","TriggerPrice","stopLossPrice","takeProfitPrice","TPSLTriggerPrice","TriggerPriceItem","entryPrice","pnl","msgs","Label","content","showIcon","UnrealizedPnLPopoverCard","unPnlPriceBasis","setUnPnlPriceBasic","UnPnlPriceBasisCheckBox","onValueChange","RadioButton","sel","label","onCheckChange","SelIcon","UnselIcon","useColumn","fundingFeeEndTime","r1","r2","record","_","SymbolLeverageSheetId","SharePnLBottomSheetId","SymbolToken","UnrealPnL","Qty","Margin","Notional","AvgOpen","MarkPrice","LiqPrice","liqPrice","TPSLPrice","fullTPSL","partialTPSL","FundingFee","PositionCell","className","body","buttons","usePositionCellScript","PositionCellWidget","usePositionClose","toast","PositionsRowProvider","setQuantity","setPrice","setType","submit","calculate","newValues","transSymbolformString","err","formatString","arr","Positions","tableRef","index","table","MobilePositions","CombinePositions","tableData","row","column","PositionsWidget","ref","MobilePositionsWidget","CombinePositionsWidget","DataFilter","useMaxLeverage","capitalizeFirstLetter","usePositionHistoryColumn","SymbolInfo","Quantity","NetPnL","avgOpen","avgClose","tags","status","renderStatus","netPnl","text","differenceInDays","subDays","setHours","offsetStartOfDay","date","newDate","offsetEndOfDay","formatDatePickerRange","option","areDatesEqual","date1","date2","usePositionHistoryScript","dateRange","filterDays","updateFilterDays","filterItems","onFilter","useFilter","filterData","sideFilter","statusFilter","time","dateFilter","symbolFilter","setStatus","setSide","defaultRange","setFilterDays","setDateRange","days","filter","newDateRange","diffDays","dateRangeFilter","PositionHistoryType","showAlert","ClosedQty","closedQty","MaxClosedQty","maxClosedQty","AvgClosed","OpenTime","ClosedTime","PositionHistoryCell","Header","Body","usePositionHistoryCellScript","PositionHistoryCellWidget","PositionHistory","dayLabel","MobilePositionHistory","PositionHistoryWidget","MobilePositionHistoryWidget","classNames","onExport","TooltipButton","useLiquidationColumn","FormattedText","abs_liquidation_fee","ctx","isExpanded","ArrowIcon","LiquidationCell","mr","DataItem","align","useLiquidationCellScript","LiquidationCellWidget","Liquidation","expanded","setExpanded","LiquidationDetails","TooltipHeaderCell","margin_ratio","account_mmr","collateral_value","position_notional","MobileLiquidation","useLiquidationScript","enableLoadMore","page","pageSize","parsePagination","meta","useLiquidation","ordersResponse","generateKeyFun","liquidationFeeRate","firstPosition","size","search","LiquidationWidget","MobileLiquidationWidget","MarketCloseConfirmID"],"mappings":"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","sourcesContent":["import { registerSimpleDialog } from \"@kodiak-finance/orderly-ui\";\nimport { MarketCloseConfirm } from \"./components/positions/closePosition/components/confirmDialog\";\n\nexport { usePositionsRowContext } from \"./components/positions/positionsRowContext\";\n\nexport { FundingFeeHistoryUI } from \"./components/fundingFeeHistory/fundingFeeHistory.ui\";\nexport { FundingFeeButton } from \"./components/fundingFeeHistory/fundingFeeButton\";\n\nexport {\n PositionsWidget,\n MobilePositionsWidget,\n CombinePositionsWidget,\n} from \"./components/positions/positions.widget\";\nexport type { PositionsInstance } from \"./components/positions/positions.widget\";\n\nexport type { PositionsProps, SortType } from \"./types/types\";\nexport {\n useTabSort,\n PositionsTabName,\n} from \"./components/shared/hooks/useTabSort\";\nexport { useSort, sortList } from \"./utils/sorting\";\n\nexport const MarketCloseConfirmID = \"MarketCloseConfirmID\";\n\nregisterSimpleDialog(MarketCloseConfirmID, MarketCloseConfirm, {\n size: \"md\",\n closable: false,\n});\n\nexport * from \"./components/positionHistory\";\nexport * from \"./components/liquidation\";\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { OrderEntity, OrderSide } from \"@kodiak-finance/orderly-types\";\nimport {\n Button,\n Text,\n CloseIcon,\n Flex,\n Divider,\n Badge,\n ThrottledButton,\n Box,\n} from \"@kodiak-finance/orderly-ui\";\nimport { commify, commifyOptional, Decimal } from \"@kodiak-finance/orderly-utils\";\n\nexport const ConfirmHeader: FC<{\n onClose?: () => void;\n title: string;\n hideCloseIcon?: boolean;\n}> = (props) => {\n const { hideCloseIcon = false } = props;\n return (\n <div className=\"oui-relative oui-w-full oui-border-b oui-border-line-4 oui-pb-3\">\n <Text size={\"base\"}>{props.title}</Text>\n {!hideCloseIcon && (\n <button\n onClick={props.onClose}\n className=\"oui-absolute oui-right-0 oui-top-0 oui-p-2 oui-text-base-contrast-54 hover:oui-text-base-contrast-80\"\n >\n <CloseIcon size={18} color=\"white\" />\n </button>\n )}\n </div>\n );\n};\n\nexport const ConfirmFooter: FC<{\n onConfirm?: () => Promise<any>;\n onCancel?: () => void;\n submitting?: boolean;\n disabled?: boolean;\n}> = (props) => {\n const { t } = useTranslation();\n\n return (\n <Flex\n id=\"oui-positions-confirm-footer\"\n gap={2}\n width={\"100%\"}\n className=\"oui-mt-3 oui-pb-1\"\n >\n <Button\n id=\"oui-positions-confirm-footer-cancel-button\"\n color={\"secondary\"}\n fullWidth\n onClick={props.onCancel}\n size=\"md\"\n >\n {t(\"common.cancel\")}\n </Button>\n <ThrottledButton\n id=\"oui-positions-confirm-footer-confirm-button\"\n onClick={props.onConfirm}\n fullWidth\n loading={props.submitting}\n disabled={props.disabled}\n size=\"md\"\n >\n {t(\"common.confirm\")}\n </ThrottledButton>\n </Flex>\n );\n};\n\nexport const OrderDetail = (props: {\n quantity: any;\n price: any;\n side: OrderSide;\n quoteDp: number;\n className?: string;\n}) => {\n const { quantity, price, quoteDp, side } = props;\n const { t } = useTranslation();\n\n const total = useMemo(() => {\n if (price && quantity) {\n return new Decimal(price)\n .mul(quantity)\n .toFixed(quoteDp, Decimal.ROUND_DOWN);\n }\n return \"--\";\n }, [price, quantity]);\n\n return (\n <Flex\n direction={\"column\"}\n gap={1}\n width={\"100%\"}\n className=\"oui-text-sm oui-text-base-contrast-54\"\n py={5}\n >\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>{t(\"common.qty\")}</Text>\n <Text color={side === OrderSide.BUY ? \"success\" : \"danger\"}>\n {quantity}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>{t(\"common.price\")}</Text>\n <Text.formatted\n intensity={98}\n suffix={<Text intensity={54}>USDC</Text>}\n >\n {price}\n </Text.formatted>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={1}>\n <Text>{t(\"common.notional\")}</Text>\n <Text.formatted\n intensity={98}\n suffix={<Text intensity={54}>USDC</Text>}\n >\n {total}\n </Text.formatted>\n </Flex>\n </Flex>\n );\n};\n\nexport const MarketCloseConfirm: FC<{\n base?: string;\n quantity?: string;\n onClose?: () => void;\n close?: () => void;\n onConfirm?: () => Promise<any>;\n submitting?: boolean;\n hideCloseIcon?: boolean;\n classNames?: {\n root?: string;\n };\n}> = (props) => {\n const { t } = useTranslation();\n\n const onCancel = () => {\n const func = props?.onClose ?? props.close;\n func?.();\n };\n return (\n <Flex direction={\"column\"} className={props.classNames?.root}>\n <ConfirmHeader\n onClose={onCancel}\n title={t(\"positions.marketClose\")}\n hideCloseIcon={props.hideCloseIcon}\n />\n <Text intensity={54} size=\"sm\" className=\"oui-my-5\">\n {t(\"positions.marketClose.description\", {\n quantity: commifyOptional(props.quantity),\n base: props.base,\n })}\n </Text>\n <ConfirmFooter\n onCancel={onCancel}\n onConfirm={async () => {\n await props.onConfirm?.();\n onCancel();\n }}\n submitting={props.submitting}\n />\n </Flex>\n );\n};\n\nexport const LimitConfirmDialog: FC<{\n base: string;\n quantity: string;\n price: string;\n onClose?: () => void;\n onConfirm: () => Promise<any>;\n order: OrderEntity;\n submitting: boolean;\n quoteDp?: number;\n hideCloseIcon?: boolean;\n}> = (props) => {\n const { order, quoteDp, quantity, price } = props;\n const { side } = order;\n const { t } = useTranslation();\n\n const onCancel = () => {\n props.onClose?.();\n };\n\n return (\n <>\n <ConfirmHeader\n onClose={onCancel}\n title={t(\"positions.limitClose\")}\n hideCloseIcon={props.hideCloseIcon}\n />\n <Box mt={5}>\n <Text intensity={54} size=\"sm\">\n {t(\"positions.limitClose.description\", {\n quantity: commify(props.quantity),\n base: props.base,\n })}\n </Text>\n </Box>\n\n <Flex gap={2} mb={4} mt={5} justify={\"between\"}>\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size=\"base\"\n showIcon\n >\n {order.symbol}\n </Text.formatted>\n <Flex gap={1}>\n <Badge color=\"neutral\" size=\"xs\">\n {t(\"orderEntry.orderType.limit\")}\n </Badge>\n <Badge\n color={side === OrderSide.BUY ? \"success\" : \"danger\"}\n size=\"xs\"\n >\n {side === OrderSide.BUY ? t(\"common.buy\") : t(\"common.sell\")}\n </Badge>\n </Flex>\n </Flex>\n\n <Divider className=\"oui-w-full\" />\n\n <OrderDetail\n className=\"oui-text-sm\"\n price={price}\n quantity={quantity}\n side={order.side}\n quoteDp={quoteDp ?? 2}\n />\n <ConfirmFooter\n onCancel={onCancel}\n onConfirm={props.onConfirm}\n submitting={props.submitting}\n />\n </>\n );\n};\n","import { createContext, useContext } from \"react\";\nimport { API, OrderSide, OrderType } from \"@kodiak-finance/orderly-types\";\n\nexport interface PositionsRowContextState {\n quantity: string;\n price: string;\n type: OrderType;\n side: OrderSide;\n position: API.PositionExt | API.PositionTPSLExt;\n updateQuantity: (value: string) => void;\n updatePriceChange: (value: string) => void;\n updateOrderType: (value: OrderType) => void;\n\n closeOrderData: any;\n\n onSubmit: () => Promise<any>;\n submitting: boolean;\n tpslOrder?: API.AlgoOrder;\n partialTPSLOrder?: API.AlgoOrder;\n quoteDp?: number;\n baseDp?: number;\n baseTick?: number;\n errors: any | undefined;\n}\n\nexport const PositionsRowContext = createContext(\n {} as PositionsRowContextState,\n);\n\nexport const usePositionsRowContext = () => {\n return useContext(PositionsRowContext);\n};\n","import { FC, useCallback, useMemo } from \"react\";\nimport { usePrivateInfiniteQuery } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { EMPTY_LIST } from \"@kodiak-finance/orderly-types\";\nimport {\n Grid,\n Statistic,\n DataTable,\n Text,\n ListView,\n Flex,\n useScreen,\n cn,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { EndReachedBox } from \"./endReachedBox\";\n\ntype FundingFeeHistory = {\n created_time: number;\n funding_fee: number;\n funding_rate: number;\n mark_price: number;\n payment_type: \"Pay\" | \"Receive\";\n status: \"Accrued\" | \"Settled\";\n symbol: string;\n updated_time: number;\n};\n\nconst PAGE_SIZE = 60;\n\nexport const FundingFeeHistoryUI: FC<{\n total: number;\n symbol: string;\n start_t: string;\n end_t: string;\n}> = ({ total, symbol, start_t, end_t }) => {\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n\n const { isLoading, data, setSize } =\n usePrivateInfiniteQuery<FundingFeeHistory>(\n (pageIndex, previousPageData) => {\n if (\n (!previousPageData || (previousPageData.length ?? 0) < PAGE_SIZE) &&\n pageIndex > 0\n )\n return null;\n return `/v1/funding_fee/history?page=${pageIndex + 1}&size=${PAGE_SIZE}&symbol=${symbol}&start_t=${start_t}&end_t=${end_t}`;\n },\n {\n revalidateFirstPage: false,\n },\n );\n\n const loadMore = useCallback(() => {\n setSize((prev) => {\n return prev + 1;\n });\n }, [setSize]);\n\n const flattenData = useMemo(() => {\n if (!Array.isArray(data)) return [];\n return data.flat().map((item) => {\n return {\n ...item,\n funding_fee: -item.funding_fee,\n };\n });\n }, [data]);\n\n const listView = useMemo(() => {\n if (isMobile) {\n return (\n <HistoryDataListViewSimple\n data={flattenData ?? EMPTY_LIST}\n isLoading={isLoading}\n loadMore={loadMore}\n />\n );\n }\n return (\n <HistoryDataListView\n data={flattenData ?? EMPTY_LIST}\n isLoading={isLoading}\n loadMore={loadMore}\n />\n );\n }, [isMobile, flattenData, isLoading]);\n\n return (\n <div>\n <Grid\n cols={2}\n gapX={3}\n className=\"oui-sticky oui-top-0 oui-z-10 oui-bg-base-8 oui-py-4\"\n >\n <div className=\"oui-rounded-lg oui-border oui-border-line-6 oui-bg-base-9 oui-p-3\">\n {/* <Statistic label={\"Instrument\"} /> */}\n <Flex direction={\"column\"} gap={1} itemAlign={\"start\"}>\n <span className=\"oui-text-2xs oui-text-base-contrast-36\">\n {t(\"common.symbol\")}\n </span>\n <Text.formatted\n rule=\"symbol\"\n className=\"oui-font-semibold\"\n intensity={98}\n >\n {symbol}\n </Text.formatted>\n </Flex>\n </div>\n <div className=\"oui-rounded-lg oui-border oui-border-line-6 oui-bg-base-9 oui-p-3\">\n <Statistic\n label={`${t(\"funding.fundingFee\")} (USDC)`}\n valueProps={{\n ignoreDP: true,\n coloring: true,\n showIdentifier: true,\n }}\n >\n {total}\n </Statistic>\n </div>\n </Grid>\n {listView}\n </div>\n );\n};\n\ntype ListProps = {\n isLoading: boolean;\n data: any[];\n loadMore: () => void;\n};\n\nconst HistoryDataListView: FC<ListProps> = ({ isLoading, data, loadMore }) => {\n const { t } = useTranslation();\n const columns = useMemo(() => {\n return [\n {\n title: t(\"common.time\"),\n dataIndex: \"created_time\",\n width: 120,\n render: (value: string) => {\n return <Text.formatted rule=\"date\">{value}</Text.formatted>;\n },\n },\n {\n title: t(\"funding.fundingRate\"),\n dataIndex: \"funding_rate\",\n formatter: (value: string) => new Decimal(value).mul(100).toString(),\n render: (value: string) => {\n return <span>{`${value}%`}</span>;\n },\n },\n {\n title: t(\"funding.paymentType\"),\n dataIndex: \"payment_type\",\n formatter: (value: string) => {\n return value === \"Pay\"\n ? t(\"funding.paymentType.paid\")\n : t(\"funding.paymentType.received\");\n },\n render: (value) => <span>{value}</span>,\n },\n {\n title: `${t(\"funding.fundingFee\")} (USDC)`,\n dataIndex: \"funding_fee\",\n render: (value: string) => {\n return (\n <Text.numeral rule=\"price\" coloring showIdentifier ignoreDP>\n {value}\n </Text.numeral>\n );\n },\n },\n ];\n }, [t]);\n\n return (\n <div className=\"oui-h-[calc(80vh_-_132px_-_8px)] oui-overflow-y-auto\">\n <EndReachedBox onEndReached={loadMore}>\n <DataTable\n classNames={{\n root: cn(\"oui-h-auto oui-bg-base-8 oui-text-sm\"),\n }}\n columns={columns}\n dataSource={data ?? EMPTY_LIST}\n loading={isLoading}\n />\n </EndReachedBox>\n </div>\n );\n};\n\nconst HistoryDataListViewSimple: FC<ListProps> = ({\n data,\n isLoading,\n loadMore,\n}) => {\n const renderItem = useCallback((item: FundingFeeHistory) => {\n return <FundingFeeItem item={item} />;\n }, []);\n return (\n <div className=\"oui-h-[calc(80vh_-_104px)] oui-overflow-y-auto\">\n <ListView\n dataSource={data}\n renderItem={renderItem}\n isLoading={isLoading}\n contentClassName=\"oui-space-y-0\"\n loadMore={loadMore}\n />\n </div>\n );\n};\n\nconst FundingFeeItem: FC<{\n item: any;\n}> = ({ item }) => {\n const { t } = useTranslation();\n return (\n <div className=\"oui-flex oui-flex-col oui-space-y-2 oui-border-t oui-border-line-6 oui-py-2\">\n <Flex justify={\"between\"}>\n <Statistic\n label={t(\"funding.fundingRate\")}\n classNames={{\n label: \"oui-text-2xs\",\n }}\n valueProps={{\n ignoreDP: true,\n rule: \"percentages\",\n className: \"oui-text-xs\",\n }}\n >\n {item.funding_rate}\n </Statistic>\n <Statistic\n label={t(\"common.amount\")}\n className=\"oui-items-end\"\n classNames={{\n label: \"oui-text-2xs\",\n }}\n valueProps={{\n ignoreDP: true,\n coloring: true,\n as: \"div\",\n className: \"oui-text-xs\",\n showIdentifier: true,\n }}\n >\n {item.funding_fee}\n </Statistic>\n </Flex>\n <Flex justify={\"between\"}>\n <Text.formatted\n rule=\"date\"\n className=\"oui-text-base-contrast-36\"\n size=\"2xs\"\n >\n {item.created_time}\n </Text.formatted>\n <Text size=\"sm\" intensity={80}>\n {item.payment_type === \"Pay\"\n ? t(\"funding.paymentType.paid\")\n : t(\"funding.paymentType.received\")}\n </Text>\n </Flex>\n </div>\n );\n};\n","import { FC, useRef, type PropsWithChildren } from \"react\";\nimport { useEndReached } from \"./useEndReached\";\n\nexport interface EndReachedBoxProps {\n onEndReached?: () => void;\n // className?: string;\n}\n\nexport const EndReachedBox: FC<PropsWithChildren<EndReachedBoxProps>> = (\n props,\n) => {\n const sentinelRef = useRef<HTMLDivElement | null>(null);\n const { onEndReached } = props;\n\n useEndReached(sentinelRef, () => {\n onEndReached?.();\n });\n\n return (\n <>\n {props.children}\n <div\n ref={sentinelRef}\n className=\"oui-relative oui-invisible oui-h-[25px] oui-bg-red-400 oui-top-[-300px]\"\n />\n </>\n );\n};\n","import { useEffect, useRef, MutableRefObject } from \"react\";\n\n/**\n * Listen for the specified element to scroll to the bottom\n */\nexport function useEndReached(\n sentinelRef: MutableRefObject<HTMLDivElement | null>,\n onEndReached?: () => void,\n) {\n const observer = useRef<IntersectionObserver>();\n const cb = useRef(onEndReached);\n\n cb.current = onEndReached;\n\n useEffect(() => {\n const options: IntersectionObserverInit = {\n root: null,\n rootMargin: \"0px\",\n threshold: 0,\n };\n\n const handleObserver = (entries: IntersectionObserverEntry[]) => {\n console.log(\">>>>>>>>handleObserver\", entries);\n entries.forEach((entry) => {\n if (entry.isIntersecting) {\n cb.current?.();\n }\n });\n };\n\n observer.current = new IntersectionObserver(handleObserver, options);\n\n return () => {\n // console.log(\"------->disconnect\");\n observer.current?.disconnect();\n };\n }, []);\n\n useEffect(() => {\n observer.current?.observe(sentinelRef.current!);\n }, []);\n}\n","import { FC } from \"react\";\nimport { useBoolean } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n SimpleDialog,\n SimpleSheet,\n Text,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { FundingFeeHistoryUI } from \"./fundingFeeHistory.ui\";\n\nexport const FundingFeeButton: FC<{\n fee: number;\n symbol: string;\n start_t: string;\n end_t: string;\n}> = ({ fee, symbol, start_t, end_t }) => {\n const { t } = useTranslation();\n const [isOpen, { setTrue, setFalse }] = useBoolean(false);\n const { isMobile } = useScreen();\n\n return (\n <>\n <button onClick={setTrue}>\n <Text.numeral\n rule=\"price\"\n coloring\n showIdentifier\n ignoreDP\n className=\"oui-border-b oui-border-line-16 oui-border-dashed oui-py-0.5\"\n >\n {fee}\n </Text.numeral>\n </button>\n {isMobile ? (\n <SimpleSheet\n open={isOpen}\n onOpenChange={setFalse}\n title={t(\"funding.fundingFee\")}\n classNames={{\n body: \"oui-max-h-[80vh] oui-py-0\",\n }}\n >\n <FundingFeeHistoryUI\n total={fee}\n symbol={symbol}\n start_t={start_t}\n end_t={end_t}\n />\n </SimpleSheet>\n ) : (\n <SimpleDialog\n open={isOpen}\n onOpenChange={setFalse}\n title={t(\"funding.fundingFee\")}\n classNames={{\n content: \"lg:oui-max-w-[640px]\",\n body: \"oui-max-h-[80vh] oui-bg-base-8 lg:oui-py-0\",\n }}\n >\n <FundingFeeHistoryUI\n total={fee}\n symbol={symbol}\n start_t={start_t}\n end_t={end_t}\n />\n </SimpleDialog>\n )}\n </>\n );\n};\n","import React, { forwardRef } from \"react\";\nimport { Table } from \"@kodiak-finance/orderly-ui\";\nimport type { PositionsProps } from \"../../types/types\";\nimport { useCombinePositionsScript } from \"./combinePositions.script\";\nimport { usePositionsScript } from \"./positions.script\";\nimport { MobilePositions, Positions, CombinePositions } from \"./positions.ui\";\n\nexport type PositionsInstance = {\n getRowCount?: () => number;\n getDataSource?: () => any[] | null;\n};\n\nexport const PositionsWidget = forwardRef<PositionsInstance, PositionsProps>(\n (props, ref) => {\n const state = usePositionsScript(props);\n const tableRef = React.useRef<Table<any>>(null);\n\n React.useImperativeHandle(\n ref,\n () => ({\n getRowCount: () => {\n return tableRef.current?.getRowCount?.() ?? 0;\n },\n getDataSource: () => {\n return state.dataSource ?? null;\n },\n }),\n [state.dataSource],\n );\n\n return <Positions {...state} tableRef={tableRef} />;\n },\n);\n\nPositionsWidget.displayName = \"PositionsWidget\";\n\nexport const MobilePositionsWidget = React.forwardRef<\n PositionsInstance,\n PositionsProps\n>((props, ref) => {\n const state = usePositionsScript(props);\n\n React.useImperativeHandle(\n ref,\n () => ({\n getRowCount: () => {\n return state.dataSource?.length ?? 0;\n },\n getDataSource: () => {\n return state.dataSource ?? null;\n },\n }),\n [state.dataSource],\n );\n\n return <MobilePositions {...state} />;\n});\n\nMobilePositionsWidget.displayName = \"MobilePositionsWidget\";\n\nexport const CombinePositionsWidget = forwardRef<\n PositionsInstance,\n PositionsProps\n>((props, ref) => {\n const state = useCombinePositionsScript(props);\n const tableRef = React.useRef<Table<any>>(null);\n\n React.useImperativeHandle(ref, () => ({\n getRowCount: () => {\n return tableRef.current?.getRowCount?.() ?? 0;\n },\n getDataSource: () => {\n // CombinePositions has a different data structure\n return null;\n },\n }));\n\n return <CombinePositions {...state} tableRef={tableRef} />;\n});\n\nCombinePositionsWidget.displayName = \"CombinePositionsWidget\";\n","import { useEffect, useMemo } from \"react\";\nimport { produce } from \"immer\";\nimport {\n SubAccount,\n useAccount,\n usePositionStream,\n usePrivateQuery,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { i18n } from \"@kodiak-finance/orderly-i18n\";\nimport { positions, account as _account } from \"@kodiak-finance/orderly-perp\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { formatAddress, usePagination } from \"@kodiak-finance/orderly-ui\";\nimport type { PositionsProps } from \"../../types/types\";\nimport { useSubAccountQuery } from \"./hooks/useSubAccountQuery\";\n\nexport enum AccountType {\n ALL = \"All accounts\",\n MAIN = \"Main accounts\",\n}\n\nexport const useCombinePositionsScript = (props: PositionsProps) => {\n const {\n symbol,\n calcMode,\n includedPendingOrder,\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n onSymbolChange,\n selectedAccount,\n } = props;\n\n const { pagination, setPage } = usePagination({ pageSize: 50 });\n\n useEffect(() => {\n setPage(1);\n }, [symbol]);\n\n const symbolsInfo = useSymbolsInfo();\n\n const { state } = useAccount();\n\n const [oldPositions, , { isLoading }] = usePositionStream(symbol, {\n calcMode,\n includedPendingOrder,\n });\n\n // need to get sub account Positions info to calculate portfolio and positions\n const {\n data: newPositions = [],\n isLoading: isPositionLoading,\n mutate: mutatePositions,\n } = usePrivateQuery<API.PositionExt[]>(\"/v1/client/aggregate/positions\", {\n // formatter: (data) => data,\n errorRetryCount: 3,\n });\n\n // need to get sub account info to calculate portfolio and positions\n const { data: accountInfo = [], isLoading: isAccountInfoLoading } =\n useSubAccountQuery<API.AccountInfo[]>(\"/v1/client/info\", {\n accountId: newPositions.map((item) => item.account_id!),\n revalidateOnFocus: false,\n });\n\n const processPositions = produce<API.PositionTPSLExt[]>(\n newPositions.filter((acc) => acc.account_id !== state.mainAccountId),\n (draft) => {\n for (const item of draft) {\n const info = symbolsInfo[item.symbol];\n const notional = positions.notional(item.position_qty, item.mark_price);\n const account = accountInfo.find(\n (acc) => acc.account_id === item.account_id,\n );\n\n const MMR = positions.MMR({\n baseMMR: info?.(\"base_mmr\"),\n baseIMR: info?.(\"base_imr\"),\n IMRFactor: account?.imr_factor[item.symbol] ?? 0,\n positionNotional: notional,\n IMR_factor_power: 4 / 5,\n });\n\n const mm = positions.maintenanceMargin({\n positionQty: item.position_qty,\n markPrice: item.mark_price,\n MMR: MMR,\n });\n\n const unrealPnl = positions.unrealizedPnL({\n qty: item.position_qty,\n openPrice: item?.average_open_price,\n // markPrice: unRealizedPrice,\n markPrice: item.mark_price,\n });\n\n const maxLeverage = item.leverage || 1;\n\n const imr = _account.IMR({\n maxLeverage,\n baseIMR: info?.(\"base_imr\"),\n IMR_Factor: account?.imr_factor[item.symbol] ?? 0,\n positionNotional: notional,\n ordersNotional: 0,\n IMR_factor_power: 4 / 5,\n });\n\n const unrealPnlROI = positions.unrealizedPnLROI({\n positionQty: item.position_qty,\n openPrice: item.average_open_price,\n IMR: imr,\n unrealizedPnL: unrealPnl,\n });\n\n let unrealPnl_index = 0;\n let unrealPnlROI_index = 0;\n if (item.index_price) {\n unrealPnl_index = positions.unrealizedPnL({\n qty: item.position_qty,\n openPrice: item?.average_open_price,\n // markPrice: unRealizedPrice,\n markPrice: item.index_price,\n });\n unrealPnlROI_index = positions.unrealizedPnLROI({\n positionQty: item.position_qty,\n openPrice: item.average_open_price,\n IMR: imr,\n unrealizedPnL: unrealPnl_index,\n });\n }\n item.mmr = MMR;\n item.mm = mm;\n item.notional = notional;\n item.unrealized_pnl = unrealPnl;\n item.unrealized_pnl_ROI = unrealPnlROI;\n item.unrealized_pnl_ROI_index = unrealPnlROI_index;\n }\n },\n );\n\n const dataSource =\n useDataTap(\n [...oldPositions?.rows, ...processPositions].filter(\n (acc) => acc.position_qty !== 0,\n ),\n ) ?? [];\n\n const filtered = useMemo(() => {\n if (!selectedAccount || selectedAccount === AccountType.ALL) {\n return dataSource;\n }\n return dataSource.filter((item) => {\n if (selectedAccount === AccountType.MAIN) {\n return item.account_id === state.mainAccountId || !item.account_id;\n } else {\n return item.account_id === selectedAccount;\n }\n });\n }, [dataSource, selectedAccount, state.mainAccountId]);\n\n const groupDataSource = useMemo(() => {\n return groupDataByAccount(filtered, {\n mainAccountId: state.mainAccountId,\n subAccounts: state.subAccounts,\n });\n }, [filtered, state.mainAccountId, state.subAccounts]);\n\n const mergedLoading = useMemo<boolean>(() => {\n return isLoading || isPositionLoading || isAccountInfoLoading;\n }, [isLoading, isPositionLoading, isAccountInfoLoading]);\n\n return {\n tableData: groupDataSource,\n isLoading: mergedLoading,\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n symbol,\n onSymbolChange,\n pagination,\n mutatePositions,\n };\n};\n\nexport type CombinePositionsState = ReturnType<\n typeof useCombinePositionsScript\n>;\n\nexport const groupDataByAccount = (\n data: API.PositionExt[],\n options: {\n mainAccountId?: string;\n subAccounts?: SubAccount[];\n },\n) => {\n const { mainAccountId = \"\", subAccounts = [] } = options;\n\n const map = new Map<\n PropertyKey,\n {\n id: string;\n description: string;\n children: API.PositionExt[];\n }\n >();\n\n for (const item of data) {\n // if account_id is not set, as a main account\n const accountId = item.account_id || mainAccountId;\n const findSubAccount = subAccounts.find((acc) => acc.id === accountId);\n if (map.has(accountId)) {\n map.get(accountId)?.children?.push(item);\n } else {\n map.set(accountId, {\n id: accountId,\n description:\n accountId === mainAccountId\n ? i18n.t(\"common.mainAccount\")\n : findSubAccount?.description ||\n formatAddress(findSubAccount?.id || \"\"),\n children: [item],\n });\n }\n }\n return {\n expanded: Array.from(map.keys()),\n dataSource: Array.from(map.values()),\n };\n};\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport {\n type SWRConfiguration,\n type SWRHook,\n type SWRResponse,\n type Middleware,\n useAccount,\n useSWR,\n fetcher,\n useConfig,\n useAccountInstance,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { getTimestamp } from \"@kodiak-finance/orderly-utils\";\n\nexport type QueryOptions<T> = SWRConfiguration & {\n formatter?: (data: any) => T;\n accountId?: string | string[];\n};\n\nconst signatureMiddleware = (\n account: ReturnType<typeof useAccountInstance>,\n accountId?: string | string[],\n): Middleware => {\n const apiBaseUrl = useConfig(\"apiBaseUrl\");\n // @ts-ignore\n return (useSWRNext: SWRHook) => {\n return (key, fetcher, config) => {\n try {\n const extendedFetcher = async (args: any) => {\n const url = Array.isArray(args) ? args[0] : args;\n const fullUrl = `${apiBaseUrl}${url}`;\n const signer = account.signer;\n const payload: MessageFactor = { method: \"GET\", url };\n const signature = await signer.sign(payload, getTimestamp());\n const ids = Array.isArray(accountId) ? accountId : [accountId];\n return Promise.all(\n ids.map((id) => {\n // @ts-ignore\n return fetcher(fullUrl, {\n headers: {\n ...signature,\n \"orderly-account-id\": id,\n },\n });\n }),\n );\n };\n // @ts-ignore\n return useSWRNext(key, extendedFetcher, config);\n } catch (e) {\n throw e;\n }\n };\n };\n};\n\nexport const useSubAccountQuery = <T>(\n query: Parameters<SWRHook>[0],\n options?: QueryOptions<T>,\n): SWRResponse<T> => {\n const { formatter, accountId, ...swrOptions } = options || {};\n const { state, account } = useAccount();\n const middleware = Array.isArray(options?.use) ? (options?.use ?? []) : [];\n\n const ids = Array.isArray(accountId) ? accountId : [accountId];\n\n const shouldFetch =\n ids.filter(Boolean).length &&\n (state.status >= AccountStatusEnum.EnableTrading ||\n state.status === AccountStatusEnum.EnableTradingWithoutConnected);\n\n return useSWR<T>(\n () => (shouldFetch ? [query, ids] : null),\n (url: string, init: RequestInit) => {\n return fetcher(url, init, { formatter });\n },\n {\n ...swrOptions,\n use: [...middleware, signatureMiddleware(account, ids as string[])],\n onError: () => {},\n },\n );\n};\n\nexport type MessageFactor = {\n url: string;\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n data?: any;\n};\n","import React from \"react\";\nimport { usePositionStream } from \"@kodiak-finance/orderly-hooks\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { usePagination } from \"@kodiak-finance/orderly-ui\";\nimport { TRADING_POSITIONS_SORT_STORAGE_KEY } from \"../../constants\";\nimport type { PositionsProps } from \"../../types/types\";\nimport { useSort } from \"../../utils/sorting\";\nimport { useTabSort, PositionsTabName } from \"../shared/hooks/useTabSort\";\n\nexport const usePositionsScript = (props: PositionsProps) => {\n const {\n symbol,\n calcMode,\n includedPendingOrder,\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n onSymbolChange,\n enableSortingStorage = true, // Default to true for backward compatibility\n } = props;\n // const [showAllSymbol] = useLocalStorage(\n // \"showAllSymbol\",\n // true\n // );\n const { pagination, setPage } = usePagination({ pageSize: 50 });\n\n // Sorting functionality\n const { tabSort, onTabSort } = useTabSort({\n storageKey: TRADING_POSITIONS_SORT_STORAGE_KEY,\n });\n\n const { onSort, getSortedList, sort } = useSort(\n enableSortingStorage ? tabSort?.[PositionsTabName.Positions] : undefined,\n enableSortingStorage ? onTabSort(PositionsTabName.Positions) : undefined,\n );\n\n React.useEffect(() => {\n setPage(1);\n }, [symbol]);\n\n const [data, , { isLoading }] = usePositionStream(symbol, {\n calcMode,\n includedPendingOrder,\n });\n\n const rawDataSource =\n useDataTap(data?.rows, { fallbackData: [] }) ?? undefined;\n const dataSource = getSortedList(rawDataSource || []);\n\n return {\n dataSource,\n isLoading, // will be use isLoading when usePositionStream support\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n symbol,\n onSymbolChange,\n pagination,\n onSort,\n initialSort: enableSortingStorage\n ? tabSort?.[PositionsTabName.Positions]\n : undefined,\n };\n};\n\nexport type PositionsState = ReturnType<typeof usePositionsScript>;\n","export const TRADING_POSITIONS_SORT_STORAGE_KEY =\n \"orderly_trading_positions_sort\";\n","import { useCallback, useEffect, useState } from \"react\";\nimport { TableSort } from \"@kodiak-finance/orderly-ui\";\nimport { SortType } from \"../types/types\";\n\n/**\n * Compare two values intelligently\n */\nconst compareValues = (aValue: any, bValue: any): number => {\n // Handle null/undefined values (always sort to bottom)\n if (aValue == null && bValue == null) return 0;\n if (aValue == null) return 1;\n if (bValue == null) return -1;\n\n // Convert to string first for type checking\n const aStr = String(aValue).trim();\n const bStr = String(bValue).trim();\n\n // More robust number detection - check if values can be converted to valid numbers\n const aNum = Number(aStr);\n const bNum = Number(bStr);\n const aIsNumber =\n !isNaN(aNum) && isFinite(aNum) && /^-?\\d*\\.?\\d+([eE][+-]?\\d+)?$/.test(aStr);\n const bIsNumber =\n !isNaN(bNum) && isFinite(bNum) && /^-?\\d*\\.?\\d+([eE][+-]?\\d+)?$/.test(bStr);\n\n if (aIsNumber && bIsNumber) {\n return aNum - bNum;\n }\n\n // Check if both are valid dates (ISO format or timestamp)\n const aIsDate = /^\\d{4}-\\d{2}-\\d{2}/.test(aStr) || /^\\d{13}$/.test(aStr);\n const bIsDate = /^\\d{4}-\\d{2}-\\d{2}/.test(bStr) || /^\\d{13}$/.test(bStr);\n\n if (aIsDate && bIsDate) {\n const aDate = new Date(aValue);\n const bDate = new Date(bValue);\n if (!isNaN(aDate.getTime()) && !isNaN(bDate.getTime())) {\n return aDate.getTime() - bDate.getTime();\n }\n }\n\n // String comparison - use localeCompare for proper string sorting\n return aStr.localeCompare(bStr, undefined, {\n sensitivity: \"base\",\n numeric: false,\n });\n};\n\nexport function sortList(list: any[], sort?: SortType) {\n const { sortKey, sortOrder } = sort || {};\n const sortedList = [...(list || [])];\n\n if (sortKey && sortOrder) {\n // sort list\n sortedList.sort((a: any, b: any) => {\n const comparison = compareValues(a[sortKey], b[sortKey]);\n // Handle sort order: desc means reverse the comparison result\n return sortOrder === \"desc\" ? -comparison : comparison;\n });\n }\n return sortedList;\n}\n\nexport function useSort(\n initialSort?: SortType,\n onSortChange?: (sort?: SortType) => void,\n) {\n const [sort, setSort] = useState<SortType | undefined>(initialSort);\n\n const onSort = useCallback((options?: TableSort) => {\n const nextSort = options\n ? {\n sortKey: options.sortKey,\n sortOrder: options.sort,\n }\n : undefined;\n\n setSort(nextSort);\n onSortChange?.(nextSort);\n // initialSort, onSortChange is not needed to be in the dependency array, otherwise it will cause infinite loop\n }, []);\n\n const getSortedList = useCallback(\n (list: any[]) => sortList(list, sort),\n [sort],\n );\n\n return {\n sort,\n onSort,\n getSortedList,\n };\n}\n","import { useCallback } from \"react\";\nimport { useSessionStorage } from \"@kodiak-finance/orderly-hooks\";\nimport { SortType } from \"../../../types/types\";\n\nexport enum PositionsTabName {\n Positions = \"positions\",\n PositionHistory = \"positionHistory\",\n}\n\nexport function useTabSort(options: { storageKey: string }) {\n const [tabSort, setTabSort] = useSessionStorage(options.storageKey, {\n [PositionsTabName.Positions]: {\n sortKey: \"unrealized_pnl\",\n sortOrder: \"desc\",\n },\n [PositionsTabName.PositionHistory]: {\n sortKey: \"close_timestamp\",\n sortOrder: \"desc\",\n },\n } as Record<PositionsTabName, SortType>);\n\n const onTabSort = useCallback(\n (type: PositionsTabName) => (sort?: SortType) => {\n setTabSort({ ...tabSort, [type]: sort });\n },\n [tabSort, setTabSort],\n );\n\n return {\n tabSort,\n onTabSort,\n };\n}\n","import React from \"react\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport {\n Badge,\n formatAddress,\n ListView,\n Table,\n TableFeatures,\n Flex,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { SymbolProvider } from \"../../provider/symbolProvider\";\nimport type { PositionsProps } from \"../../types/types\";\nimport type { CombinePositionsState } from \"./combinePositions.script\";\nimport { useColumn } from \"./desktop/useColumn\";\nimport { PositionCellWidget } from \"./mobile/positionCell\";\nimport type { PositionsState } from \"./positions.script\";\nimport { PositionsRowProvider } from \"./positionsRowProvider\";\n\nexport const Positions: React.FC<\n Readonly<PositionsState & { tableRef?: React.RefObject<Table<any>> }>\n> = (props) => {\n const {\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n pagination,\n isLoading,\n dataSource,\n onSymbolChange,\n tableRef,\n } = props;\n\n const columns = useColumn({\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n onSymbolChange: onSymbolChange,\n });\n\n return (\n <Flex direction=\"column\" width=\"100%\" height=\"100%\" gap={3}>\n <AuthGuardDataTable<API.PositionTPSLExt>\n loading={isLoading}\n id=\"oui-desktop-positions-content\"\n columns={columns}\n bordered\n dataSource={dataSource}\n generatedRowKey={(record: any) => record.symbol}\n renderRowContainer={(record: any, index: number, children: any) => {\n return (\n <SymbolProvider symbol={record.symbol}>\n <PositionsRowProvider position={record}>\n {children}\n </PositionsRowProvider>\n </SymbolProvider>\n );\n }}\n manualPagination={false}\n pagination={pagination}\n manualSorting={true}\n onSort={props.onSort}\n initialSort={\n props.initialSort\n ? {\n sortKey: props.initialSort.sortKey,\n sort: props.initialSort.sortOrder,\n }\n : undefined\n }\n features={[TableFeatures.DownloadFeature]}\n getTableInstance={(table) => {\n if (tableRef) {\n (tableRef as any).current = table;\n }\n }}\n testIds={{\n body: \"oui-testid-dataList-position-tab-body\",\n }}\n />\n </Flex>\n );\n};\n\nexport const MobilePositions: React.FC<\n Readonly<PositionsState & PositionsProps>\n> = (props) => {\n const {\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n dataSource,\n onSymbolChange,\n } = props;\n return (\n <ListView\n className=\"oui-hide-scrollbar oui-w-full oui-space-y-0 oui-overflow-y-hidden\"\n contentClassName=\"!oui-space-y-1\"\n dataSource={dataSource}\n renderItem={(item, index) => (\n <SymbolProvider symbol={item.symbol}>\n <PositionsRowProvider position={item}>\n <PositionCellWidget\n item={item}\n index={index}\n pnlNotionalDecimalPrecision={pnlNotionalDecimalPrecision}\n sharePnLConfig={sharePnLConfig}\n onSymbolChange={onSymbolChange}\n />\n </PositionsRowProvider>\n </SymbolProvider>\n )}\n />\n );\n};\n\nexport const CombinePositions: React.FC<\n Readonly<CombinePositionsState & { tableRef?: React.RefObject<Table<any>> }>\n> = (props) => {\n const {\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n pagination,\n isLoading,\n tableData,\n onSymbolChange,\n mutatePositions,\n tableRef,\n } = props;\n\n const columns = useColumn({\n pnlNotionalDecimalPrecision,\n sharePnLConfig,\n onSymbolChange: onSymbolChange,\n });\n\n const { dataSource = [] } = tableData;\n\n return (\n <Flex direction=\"column\" width=\"100%\" height=\"100%\" gap={3}>\n <AuthGuardDataTable<any>\n bordered\n loading={isLoading}\n id=\"oui-desktop-positions-content\"\n columns={columns}\n dataSource={dataSource}\n expanded\n getSubRows={(row) => row.children}\n generatedRowKey={(record) => record.id}\n onCell={(column, record) => {\n const isGroup = (record.children ?? []).length > 0;\n if (isGroup) {\n return {\n children:\n column.id === \"symbol\" ? (\n <Badge color=\"neutral\" size=\"xs\">\n {record?.description || formatAddress(record?.id)}\n </Badge>\n ) : null,\n };\n }\n }}\n renderRowContainer={(record: any, index: number, children: any) => {\n if (record.symbol) {\n return (\n <SymbolProvider symbol={record.symbol}>\n <PositionsRowProvider\n position={record}\n mutatePositions={mutatePositions}\n >\n {children}\n </PositionsRowProvider>\n </SymbolProvider>\n );\n }\n return children;\n }}\n manualPagination={false}\n pagination={pagination}\n features={[TableFeatures.DownloadFeature]}\n getTableInstance={(table) => {\n if (tableRef) {\n (tableRef as any).current = table;\n }\n }}\n testIds={{\n body: \"oui-testid-dataList-position-tab-body\",\n }}\n />\n </Flex>\n );\n};\n","import { FC, PropsWithChildren, useMemo } from \"react\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { SymbolContext, SymbolContextState } from \"./symbolContext\";\n\ninterface FormatterProviderProps {\n symbol: string;\n}\n\nexport const SymbolProvider: FC<PropsWithChildren<FormatterProviderProps>> = (\n props,\n) => {\n const { symbol, children } = props;\n const symbolInfo = useSymbolsInfo()[symbol];\n const memoizedValue = useMemo<SymbolContextState>(() => {\n return {\n symbol: symbol,\n base_dp: symbolInfo(\"base_dp\"),\n quote_dp: symbolInfo(\"quote_dp\"),\n base_tick: symbolInfo(\"base_tick\"),\n quote_tick: symbolInfo(\"quote_tick\"),\n base: symbolInfo(\"base\"),\n quote: symbolInfo(\"quote\"),\n origin: symbolInfo(),\n quote_max: symbolInfo(\"quote_max\"),\n quote_min: symbolInfo(\"quote_min\"),\n };\n }, [symbol, symbolInfo]);\n return (\n <SymbolContext.Provider value={memoizedValue}>\n {children}\n </SymbolContext.Provider>\n );\n};\n","import { createContext, useContext } from \"react\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\n\nexport interface SymbolContextState {\n base_dp: number;\n quote_dp: number;\n base_tick: number;\n quote_tick: number;\n base: string;\n quote: string;\n symbol: string;\n origin: API.SymbolExt;\n quote_min: number;\n quote_max: number;\n}\n\nexport const SymbolContext = createContext<SymbolContextState>(\n {} as SymbolContextState,\n);\n\nexport const useSymbolContext = () => {\n return useContext(SymbolContext);\n};\n","import { useMemo, useRef } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n Box,\n cn,\n Divider,\n Flex,\n HoverCard,\n Column,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport { SymbolLeverageDialogId } from \"@kodiak-finance/orderly-ui-leverage\";\nimport {\n SharePnLOptions,\n SharePnLDialogId,\n} from \"@kodiak-finance/orderly-ui-share\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { FundingFeeButton } from \"../../fundingFeeHistory/fundingFeeButton\";\nimport { ClosePositionWidget } from \"../closePosition\";\nimport { LeverageBadge } from \"./components\";\nimport { renderQuantity } from \"./listElement\";\nimport { NumeralWithCtx } from \"./numeralWithCtx\";\nimport { PartialTPSL } from \"./partialTPSL\";\nimport { ShareButtonWidget } from \"./shareButton\";\nimport { TriggerPrice } from \"./triggerPrice\";\nimport { UnrealizedPnLPopoverCard } from \"./unrealPnLHover\";\n\ninterface ColumnConfig {\n pnlNotionalDecimalPrecision?: number;\n sharePnLConfig?: SharePnLOptions;\n onSymbolChange?: (symbol: API.Symbol) => void;\n}\n\nexport const useColumn = (config: ColumnConfig) => {\n const { pnlNotionalDecimalPrecision, sharePnLConfig, onSymbolChange } =\n config;\n const { t } = useTranslation();\n const fundingFeeEndTime = useRef(Date.now().toString());\n const column = useMemo<Column<API.PositionTPSLExt>[]>(\n () => [\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n fixed: \"left\",\n width: 140,\n onSort: (r1, r2) => {\n return r1.symbol?.localeCompare(r2.symbol || \"\");\n // if (sortOrder === \"asc\") {\n // return r1.symbol.localeCompare(r2.symbol);\n // }\n // return r2.symbol.localeCompare(r1.symbol);\n },\n render: (value: string, record) => (\n <Flex gap={2}>\n <Box\n width={4}\n height={20}\n className={cn(\n \"oui-h-[38px] oui-rounded-[1px]\",\n record.position_qty > 0\n ? \"oui-bg-trade-profit\"\n : \"oui-bg-trade-loss\",\n )}\n />\n <Flex direction=\"column\" itemAlign=\"start\">\n <Text.formatted\n // rule={\"symbol\"}\n formatString=\"base-type\"\n className=\"oui-cursor-pointer\"\n onClick={(e) => {\n onSymbolChange?.({ symbol: value } as API.Symbol);\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {`${value.split(\"_\")[1]}-PERP`}\n </Text.formatted>\n <LeverageBadge\n symbol={value}\n leverage={record.leverage}\n modalId={SymbolLeverageDialogId}\n />\n </Flex>\n </Flex>\n ),\n },\n {\n title: t(\"common.quantity\"),\n dataIndex: \"position_qty\",\n // onSort: true,\n onSort: (a, b) => {\n return a.position_qty - b.position_qty;\n },\n width: 120,\n className: \"oui-pl-6\",\n // rule: \"price\",\n // numeralProps: {\n // coloring: true,\n // // tick: \"base_dp\",\n // },\n render: renderQuantity,\n // render: (value: string) => (\n // <NumeralWithCtx\n // coloring\n // className=\"oui-font-semibold\"\n // tick=\"base_dp\"\n // >\n // {value}\n // </NumeralWithCtx>\n // ),\n },\n {\n title: t(\"common.avgOpen\"),\n className: \"oui-h-[48px]\",\n width: 120,\n onSort: true,\n dataIndex: \"average_open_price\",\n render: (value: string) => {\n // const ctx = usePositionsRowContext();\n return (\n <NumeralWithCtx rm={Decimal.ROUND_DOWN}>{value}</NumeralWithCtx>\n );\n },\n },\n {\n title: t(\"common.markPrice\"),\n dataIndex: \"mark_price\",\n width: 120,\n onSort: true,\n className: \"oui-h-[48px]\",\n render: (value: string) => {\n return (\n <NumeralWithCtx rm={Decimal.ROUND_DOWN}>{value}</NumeralWithCtx>\n );\n },\n },\n {\n title: (\n <Tooltip\n className=\"oui-max-w-[280px] oui-bg-base-8 oui-p-3 oui-text-2xs oui-text-base-contrast-54\"\n content={t(\"positions.column.liqPrice.tooltip\")}\n >\n <Text>{t(\"positions.column.liqPrice\")}</Text>\n </Tooltip>\n ),\n plantTextTitle: t(\"positions.column.liqPrice\"),\n width: 100,\n onSort: true,\n dataIndex: \"est_liq_price\",\n render: (value: string) => {\n return Number(value) === 0 ? (\n \"--\"\n ) : (\n <NumeralWithCtx\n rm={Decimal.ROUND_DOWN}\n className={Number(value) > 0 ? \"oui-text-warning-light\" : \"\"}\n >\n {value ?? \"--\"}\n </NumeralWithCtx>\n );\n },\n },\n {\n title: (\n <HoverCard\n content={<UnrealizedPnLPopoverCard />}\n side=\"top\"\n align=\"center\"\n className=\"oui-max-w-[280px] oui-text-2xs\"\n >\n <Text>{t(\"common.unrealizedPnl\")}</Text>\n </HoverCard>\n ),\n plantTextTitle: t(\"common.unrealizedPnl\"),\n dataIndex: \"unrealized_pnl\",\n width: 180,\n onSort: true,\n rule: \"price\",\n numeralProps: {\n coloring: true,\n // tick: \"base_dp\",\n },\n // hint: <UnrealizedPnLPopoverCard />,\n render: (value: string, record) => {\n return (\n <Flex gap={2}>\n <Flex>\n <Text.numeral\n dp={pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"oui-font-semibold\"\n >\n {value}\n </Text.numeral>\n <Text.numeral\n rule=\"percentages\"\n dp={pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"oui-font-semibold\"\n prefix=\"(\"\n suffix=\")\"\n >\n {record.unrealized_pnl_ROI}\n </Text.numeral>\n </Flex>\n <ShareButtonWidget\n position={record}\n sharePnLConfig={sharePnLConfig}\n modalId={SharePnLDialogId}\n />\n </Flex>\n );\n },\n },\n {\n title: t(\"common.fullTPSL\"),\n dataIndex: \"full_tpsl\",\n width: 150,\n render: (_: string, record) => {\n return (\n <TriggerPrice\n stopLossPrice={record.full_tp_sl?.sl_trigger_price}\n takeProfitPrice={record.full_tp_sl?.tp_trigger_price}\n />\n );\n },\n },\n\n {\n title: t(\"common.partialTPSL\"),\n dataIndex: \"partial_tpsl\",\n width: 150,\n render: (_: string, record) => (\n <PartialTPSL\n orderNum={record.partial_tp_sl?.order_num}\n tpTriggerPrice={record.partial_tp_sl?.tp_trigger_price}\n slTriggerPrice={record.partial_tp_sl?.sl_trigger_price}\n />\n ),\n },\n {\n title: t(\"common.notional\"),\n dataIndex: \"notional\",\n className: \"oui-h-[48px]\",\n width: 100,\n onSort: true,\n render: (value: string) => (\n <Text.numeral dp={pnlNotionalDecimalPrecision}>{value}</Text.numeral>\n ),\n },\n {\n title: (\n <Tooltip\n className=\"oui-max-w-[280px] oui-bg-base-8 oui-p-3 oui-text-2xs oui-text-base-contrast-54\"\n content={\n <Flex\n direction={\"column\"}\n gap={3}\n className=\"oui-rounded-sm oui-bg-base-8 oui-text-base-contrast-54\"\n >\n <span>{t(\"positions.column.margin.tooltip\")}</span>\n <Divider className=\"oui-w-full\" />\n <span>{t(\"positions.column.margin.formula\")}</span>\n </Flex>\n }\n >\n <Text>{t(\"positions.column.margin\")}</Text>\n </Tooltip>\n ),\n plantTextTitle: t(\"positions.column.margin\"),\n dataIndex: \"mm\",\n onSort: true,\n width: 100,\n rule: \"price\",\n render: (value: string) => <Text.numeral>{value}</Text.numeral>,\n },\n {\n title: t(\"funding.fundingFee\"),\n dataIndex: \"fundingFee\",\n width: 100,\n render: (value, record) => (\n <FundingFeeButton\n fee={value}\n symbol={record.symbol}\n start_t={record.timestamp.toString()}\n end_t={fundingFeeEndTime.current}\n />\n ),\n },\n // {\n // title: t(\"common.qty\"),\n // dataIndex: \"close_qty\",\n // width: 100,\n // fixed: \"right\",\n // render: renderQuantityInput,\n // },\n // {\n // title: t(\"common.price\"),\n // dataIndex: \"close_price\",\n // width: 100,\n // fixed: \"right\",\n // render: renderPriceInput,\n // // render: (value: string) => <PriceInput />,\n // },\n {\n title: null,\n dataIndex: \"close_position\",\n align: \"right\",\n width: 70,\n fixed: \"right\",\n render() {\n return (\n <Flex gapX={2} justify={\"end\"}>\n <ClosePositionWidget />\n </Flex>\n );\n },\n },\n ],\n [pnlNotionalDecimalPrecision, sharePnLConfig, t],\n );\n return column;\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Badge,\n Button,\n cn,\n Divider,\n Flex,\n Input,\n inputFormatter,\n SimpleDialog,\n SimpleSheet,\n Text,\n ThrottledButton,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ClosePositionScriptReturn } from \"./closePosition.script\";\nimport {\n LimitConfirmDialog,\n MarketCloseConfirm,\n} from \"./components/confirmDialog\";\nimport { QuantitySlider } from \"./components/quantitySlider\";\n\nexport const MobileClosePosition: FC<ClosePositionScriptReturn> = (props) => {\n const {\n base,\n base_dp,\n quote,\n quote_dp,\n sheetOpen,\n setSheetOpen,\n dialogOpen,\n setDialogOpen,\n quantity,\n price,\n submitting,\n priceErrorMsg,\n quantityErrorMsg,\n disabled,\n isMarketClose,\n position,\n maxQty,\n isBuy,\n } = props;\n const { t } = useTranslation();\n\n const title = isMarketClose\n ? t(\"positions.marketClose\")\n : t(\"positions.limitClose\");\n\n const orderType = isMarketClose\n ? t(\"orderEntry.orderType.market\")\n : t(\"orderEntry.orderType.limit\");\n\n const orderSide = isBuy ? (\n <Badge color=\"success\" size=\"xs\">\n {t(\"common.buy\")}\n </Badge>\n ) : (\n <Badge color=\"danger\" size=\"xs\">\n {t(\"common.sell\")}\n </Badge>\n );\n\n const header = (\n <Flex width={\"100%\"} justify={\"between\"}>\n <Text.formatted rule={\"symbol\"} showIcon>\n {position.symbol}\n </Text.formatted>\n <Flex gap={1}>\n <Badge color=\"neutral\" size=\"xs\">\n {orderType}\n </Badge>\n {orderSide}\n </Flex>\n </Flex>\n );\n\n const lastPrice = (\n <Flex width={\"100%\"} justify={\"between\"}>\n <Text intensity={54}>{t(\"common.lastPrice\")}</Text>\n <Text.numeral dp={quote_dp} suffix={<Text intensity={36}> {quote}</Text>}>\n {position.mark_price}\n </Text.numeral>\n </Flex>\n );\n\n const inputForm = !isMarketClose && (\n <>\n <Flex width={\"100%\"} direction={\"column\"} gap={2}>\n <Input.tooltip\n prefix={t(\"common.price\")}\n suffix={quote}\n align=\"right\"\n fullWidth\n autoComplete=\"off\"\n inputMode=\"decimal\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(quote_dp),\n ]}\n triggerClassName=\"oui-w-full\"\n tooltip={priceErrorMsg}\n color={priceErrorMsg ? \"danger\" : undefined}\n value={price}\n onValueChange={props.updatePriceChange}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n suffix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-w-full oui-outline-line-12\",\n priceErrorMsg ? \"oui-outline-danger\" : undefined,\n ),\n }}\n />\n <Input.tooltip\n prefix={t(\"common.quantity\")}\n suffix={base}\n align=\"right\"\n fullWidth\n autoComplete=\"off\"\n inputMode=\"decimal\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(base_dp),\n ]}\n triggerClassName=\"oui-w-full\"\n tooltip={quantityErrorMsg}\n color={quantityErrorMsg ? \"danger\" : undefined}\n value={quantity}\n onBlur={() => props.formatQuantityToBaseTick(quantity)}\n onValueChange={props.updateQuantity}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n suffix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-w-full oui-outline-line-12\",\n quantityErrorMsg ? \"oui-outline-danger\" : undefined,\n ),\n }}\n />\n </Flex>\n </>\n );\n\n const slider = (\n <QuantitySlider\n value={props.sliderValue}\n onValueChange={props.onSliderValueChange}\n base_dp={base_dp}\n max={maxQty}\n onMax={props.onMax}\n />\n );\n\n const footer = (\n <Flex width={\"100%\"} gap={3} mt={2}>\n <Button fullWidth color=\"secondary\" onClick={props.onCloseSheet}>\n {t(\"common.cancel\")}\n </Button>\n\n <ThrottledButton\n fullWidth\n disabled={submitting || disabled}\n loading={submitting}\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n props.onDoubleConfirm();\n }}\n >\n {t(\"common.confirm\")}\n </ThrottledButton>\n </Flex>\n );\n\n return (\n <>\n <Button\n variant=\"outlined\"\n color=\"secondary\"\n size=\"sm\"\n className=\"oui-border-base-contrast-36\"\n onClick={(e) => {\n e.stopPropagation();\n e.preventDefault();\n setSheetOpen(true);\n }}\n >\n {title}\n </Button>\n\n <SimpleSheet title={title} open={sheetOpen} onOpenChange={setSheetOpen}>\n <Flex\n direction={\"column\"}\n gap={3}\n width={\"100%\"}\n itemAlign={\"start\"}\n className=\"oui-text-sm\"\n >\n {header}\n <Divider className=\"oui-w-full\" />\n {lastPrice}\n {inputForm}\n {slider}\n {footer}\n </Flex>\n </SimpleSheet>\n\n <SimpleDialog open={dialogOpen} onOpenChange={setDialogOpen} size=\"xs\">\n {isMarketClose ? (\n <MarketCloseConfirm\n base={base}\n quantity={quantity}\n submitting={submitting}\n onClose={props.onCloseDialog}\n onConfirm={props.onConfirm}\n hideCloseIcon\n />\n ) : (\n <LimitConfirmDialog\n base={base}\n quoteDp={quote_dp}\n quantity={quantity}\n price={price}\n submitting={submitting}\n order={props.closeOrderData}\n onClose={props.onCloseDialog}\n onConfirm={props.onConfirm}\n hideCloseIcon\n />\n )}\n </SimpleDialog>\n </>\n );\n};\n","import { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Flex, Slider, Text } from \"@kodiak-finance/orderly-ui\";\n\ntype QuantitySliderProps = {\n value: number;\n onValueChange: (value: number) => void;\n base_dp: number;\n max: number;\n onMax: () => void;\n};\n\nexport const QuantitySlider = (props: QuantitySliderProps) => {\n const { t } = useTranslation();\n\n return (\n <>\n <Slider\n showTip\n markCount={4}\n value={[props.value]}\n color=\"primary\"\n onValueChange={(value) => {\n props.onValueChange(value[0]);\n }}\n />\n <Flex width={\"100%\"} justify={\"between\"}>\n <Text color=\"primary\" size=\"2xs\">{`${props.value}%`}</Text>\n <Flex gap={1} onClick={props.onMax} className=\"oui-cursor-pointer\">\n <Text size=\"2xs\" color=\"primary\">\n {t(\"common.max\")}\n </Text>\n <Text.numeral\n intensity={54}\n size=\"2xs\"\n dp={props.base_dp}\n padding={false}\n >\n {props.max}\n </Text.numeral>\n </Flex>\n </Flex>\n </>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\nimport {\n Button,\n cn,\n Divider,\n Flex,\n Input,\n inputFormatter,\n PopoverContent,\n PopoverRoot,\n PopoverTrigger,\n Select,\n SimpleDialog,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { ClosePositionScriptReturn } from \"./closePosition.script\";\nimport {\n ConfirmFooter,\n LimitConfirmDialog,\n MarketCloseConfirm,\n} from \"./components/confirmDialog\";\nimport { QuantitySlider } from \"./components/quantitySlider\";\n\nexport const DesktopClosePosition: FC<ClosePositionScriptReturn> = (props) => {\n const {\n position,\n base,\n base_dp,\n quote_dp,\n price,\n quantity,\n submitting,\n dialogOpen,\n setDialogOpen,\n isMarketClose,\n popoverOpen,\n setPopoverOpen,\n maxQty,\n quantityErrorMsg,\n priceErrorMsg,\n isEntirePosition,\n } = props;\n\n const { t } = useTranslation();\n\n // const disabled = isMarketClose ? !quantity : !price || !quantity;\n\n const quantityForm = (\n <Flex width=\"100%\" gap={2} mb={1}>\n <Input.tooltip\n ref={props.quantityInputRef}\n prefix={t(\"common.quantity\")}\n suffix={\n isEntirePosition ? (\n <Text\n size=\"2xs\"\n intensity={54}\n className=\"oui-cursor-pointer oui-px-3\"\n onClick={props.onEntirePosition}\n >\n {t(\"tpsl.entirePosition\")}\n </Text>\n ) : (\n base\n )\n }\n align=\"right\"\n size=\"md\"\n fullWidth\n autoComplete=\"off\"\n inputMode=\"decimal\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(base_dp),\n ]}\n triggerClassName=\"oui-w-full\"\n tooltip={quantityErrorMsg}\n color={quantityErrorMsg ? \"danger\" : undefined}\n value={isEntirePosition ? \"\" : quantity}\n onBlur={() => props.formatQuantityToBaseTick(quantity)}\n onValueChange={props.updateQuantity}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n suffix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-w-full oui-outline-line-12\",\n quantityErrorMsg ? \"oui-outline-danger\" : undefined,\n ),\n }}\n />\n <Button\n onClick={props.onMax}\n size=\"md\"\n variant=\"outlined\"\n className={cn(\n \"oui-text-2xs\",\n isEntirePosition\n ? \"oui-border-primary-light oui-text-primary-light hover:oui-bg-primary-light/20\"\n : \"oui-border-line-12 oui-bg-base-6 oui-text-base-contrast-54 hover:oui-bg-base-5\",\n )}\n >\n {t(\"common.position\")}\n </Button>\n </Flex>\n );\n\n const suffix = (\n <Select.options\n variant=\"text\"\n size=\"md\"\n options={[\n {\n label: t(\"orderEntry.orderType.limit\"),\n value: OrderType.LIMIT,\n },\n {\n label: t(\"orderEntry.orderType.market\"),\n value: OrderType.MARKET,\n },\n ]}\n classNames={{\n // set the width of the trigger to the width of the content\n trigger: \"oui-w-[--radix-select-content-available-width]\",\n }}\n value={props.type}\n onValueChange={(value) => {\n props.updateOrderType(value as OrderType);\n }}\n contentProps={{\n align: \"end\",\n className: \"oui-border oui-border-line-6\",\n }}\n />\n );\n\n const disabledInput = isMarketClose;\n\n const priceForm = (\n <Input.tooltip\n suffix={suffix}\n size=\"md\"\n fullWidth\n autoComplete=\"off\"\n inputMode=\"decimal\"\n formatters={[\n inputFormatter.numberFormatter,\n inputFormatter.dpFormatter(quote_dp),\n ]}\n triggerClassName=\"oui-w-full\"\n tooltip={priceErrorMsg}\n color={priceErrorMsg ? \"danger\" : undefined}\n value={price}\n onValueChange={props.updatePriceChange}\n placeholder={disabledInput ? \"--\" : \"\"}\n disabled={disabledInput}\n classNames={{\n prefix: \"oui-text-base-contrast-54\",\n suffix: \"oui-text-base-contrast-54\",\n root: cn(\n \"oui-w-full oui-outline-line-12\",\n priceErrorMsg ? \"oui-outline-danger\" : undefined,\n // when disabled, override the outline color\n disabledInput ? \"focus-within:oui-outline-line-12\" : undefined,\n ),\n }}\n />\n );\n\n return (\n <>\n <PopoverRoot open={popoverOpen} onOpenChange={setPopoverOpen}>\n <PopoverTrigger\n asChild\n onClick={() => {\n setPopoverOpen(true);\n }}\n >\n <Button variant=\"outlined\" size=\"sm\" color=\"secondary\">\n {t(\"positions.column.close\")}\n </Button>\n </PopoverTrigger>\n <PopoverContent\n className={cn(\n \"oui-w-[360px] oui-p-5\",\n popoverOpen ? \"oui-visible\" : \"oui-invisible\",\n )}\n align=\"end\"\n side=\"top\"\n onOpenAutoFocus={(e) => e.preventDefault()}\n >\n <Flex gapY={2} direction=\"column\">\n {quantityForm}\n <QuantitySlider\n value={props.sliderValue}\n onValueChange={props.onSliderValueChange}\n base_dp={base_dp}\n max={maxQty}\n onMax={props.onMax}\n />\n <Divider my={2} intensity={8} className=\"oui-w-full\" />\n {priceForm}\n <ConfirmFooter\n onConfirm={props.onDoubleConfirm}\n onCancel={props.onClosePopover}\n submitting={submitting}\n disabled={props.disabled}\n />\n </Flex>\n </PopoverContent>\n </PopoverRoot>\n\n <SimpleDialog open={dialogOpen} onOpenChange={setDialogOpen} size=\"sm\">\n {isMarketClose ? (\n <MarketCloseConfirm\n base={base}\n quantity={quantity}\n submitting={submitting}\n onClose={props.onCloseDialog}\n onConfirm={props.onConfirm}\n classNames={{\n root: \"oui-items-start\",\n }}\n hideCloseIcon\n />\n ) : (\n <LimitConfirmDialog\n base={base}\n quoteDp={quote_dp}\n quantity={quantity}\n price={price}\n submitting={submitting}\n order={props.closeOrderData}\n onClose={props.onCloseDialog}\n onConfirm={props.onConfirm}\n hideCloseIcon\n />\n )}\n </SimpleDialog>\n </>\n );\n};\n","import { useScreen } from \"@kodiak-finance/orderly-ui\";\nimport {\n ClosePositionScriptProps,\n useClosePositionScript,\n} from \"./closePosition.script\";\nimport { DesktopClosePosition } from \"./closePosition.ui\";\nimport { MobileClosePosition } from \"./closePositions.mobile.ui\";\n\ntype ClosePositionWidgetProps = Pick<ClosePositionScriptProps, \"type\">;\n\nexport const ClosePositionWidget = (props: ClosePositionWidgetProps) => {\n const state = useClosePositionScript(props);\n const { isMobile } = useScreen();\n\n if (isMobile) {\n return <MobileClosePosition {...state} />;\n }\n\n return <DesktopClosePosition {...state} />;\n};\n","import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useLocalStorage, utils } from \"@kodiak-finance/orderly-hooks\";\nimport { useOrderEntryFormErrorMsg } from \"@kodiak-finance/orderly-react-app\";\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\n\nexport type ClosePositionScriptProps = {\n type?: OrderType.MARKET | OrderType.LIMIT;\n};\n\nexport type ClosePositionScriptReturn = ReturnType<\n typeof useClosePositionScript\n>;\n\nexport const useClosePositionScript = (props: ClosePositionScriptProps) => {\n const [sheetOpen, setSheetOpen] = useState(false);\n const [dialogOpen, setDialogOpen] = useState(false);\n const [popoverOpen, setPopoverOpen] = useState(false);\n const [sliderValue, setSliderValue] = useState(100);\n const quantityInputRef = useRef<HTMLInputElement>(null);\n const [orderConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n\n const {\n position,\n onSubmit,\n price,\n quantity,\n closeOrderData,\n submitting,\n updatePriceChange,\n updateOrderType,\n updateQuantity,\n errors,\n baseTick,\n type,\n } = usePositionsRowContext();\n const { quote_dp, base_dp, base, quote } = useSymbolContext();\n const { getErrorMsg } = useOrderEntryFormErrorMsg(errors);\n\n // buy position quantity is positive, sell position quantity is negative\n const isBuy = position.position_qty > 0;\n\n // we need to use Math.abs to get the absolute value of the position quantity\n const maxQty = Math.abs(position.position_qty);\n\n // close position type: limit or market\n const closeType = props.type || type;\n\n const isMarketClose = closeType === OrderType.MARKET;\n\n const isEntirePosition = maxQty?.toString() === quantity.toString();\n\n useEffect(() => {\n // mobile sheet open, update order type\n if (sheetOpen) {\n updateOrderType(props.type as OrderType);\n }\n }, [props.type, sheetOpen]);\n\n // reset state when sheet is closed\n // useEffect(() => {\n // if (!sheetOpen || !popoverOpen) {\n // // set default slider value to 100 when table edit remove\n // updateQuantity(maxQty?.toString());\n // }\n // }, [sheetOpen, popoverOpen, maxQty]);\n\n const { priceErrorMsg, quantityErrorMsg } = useMemo(() => {\n return {\n priceErrorMsg: getErrorMsg(\"order_price\"),\n quantityErrorMsg: getErrorMsg(\"order_quantity\"),\n };\n // getErrorMsg is changed when errors is changed\n }, [errors]);\n\n const disabled = !!(priceErrorMsg || quantityErrorMsg);\n\n const formatQuantityToBaseTick = useCallback(\n (value: string) => {\n if (baseTick && baseTick > 0) {\n // format quantity to baseTick\n const formatQty = utils.formatNumber(value, baseTick) ?? value;\n updateQuantity(formatQty);\n }\n },\n [baseTick, updateQuantity],\n );\n\n const onSliderValueChange = useCallback(\n (value: number) => {\n setSliderValue(value);\n\n // transform slider value to quantity\n const qty = new Decimal(value)\n .div(100)\n .mul(maxQty)\n .toFixed(base_dp, Decimal.ROUND_DOWN);\n\n formatQuantityToBaseTick(qty);\n },\n [maxQty, base_dp, formatQuantityToBaseTick],\n );\n\n useEffect(() => {\n const qty = Math.min(Number(quantity || 0), maxQty);\n // transform quantity to slider value\n const slider = new Decimal(qty)\n .div(maxQty)\n .mul(100)\n .toDecimalPlaces(2, Decimal.ROUND_DOWN)\n .toNumber();\n\n setSliderValue(slider);\n }, [quantity]);\n\n const onMax = useCallback(() => {\n updateQuantity(maxQty?.toString());\n }, [maxQty, updateQuantity]);\n\n const onConfirm = useCallback(() => {\n return onSubmit().then((res) => {\n setSheetOpen(false);\n setDialogOpen(false);\n setPopoverOpen(false);\n });\n }, [onSubmit]);\n\n const onDoubleConfirm = useCallback(() => {\n if (!orderConfirm) {\n return onConfirm();\n }\n setDialogOpen(true);\n return Promise.resolve();\n }, [onConfirm, orderConfirm]);\n\n const onCloseSheet = useCallback(() => {\n setSheetOpen(false);\n }, []);\n\n const onCloseDialog = useCallback(() => {\n setDialogOpen(false);\n }, []);\n\n const onClosePopover = useCallback(() => {\n setPopoverOpen(false);\n }, []);\n\n // when click entire position button, set quantity to 0 and focus on input\n const onEntirePosition = useCallback(() => {\n updateQuantity(\"0\");\n quantityInputRef.current?.focus();\n\n setTimeout(() => {\n quantityInputRef.current?.setSelectionRange(0, 1);\n }, 0);\n }, [updateQuantity]);\n\n return {\n position,\n closeOrderData,\n quote_dp,\n base_dp,\n base,\n quote,\n price,\n quantity,\n submitting,\n\n onConfirm,\n onDoubleConfirm,\n updatePriceChange,\n updateQuantity,\n formatQuantityToBaseTick,\n updateOrderType,\n\n sliderValue,\n onSliderValueChange,\n\n priceErrorMsg,\n quantityErrorMsg,\n disabled,\n isMarketClose,\n\n maxQty,\n onMax,\n isBuy,\n isEntirePosition,\n type: closeType,\n quantityInputRef,\n onEntirePosition,\n\n sheetOpen,\n onCloseSheet,\n setSheetOpen,\n\n dialogOpen,\n setDialogOpen,\n onCloseDialog,\n\n popoverOpen,\n setPopoverOpen,\n onClosePopover,\n };\n};\n","import { useLocalStorage, useLeverageBySymbol } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { PositionType } from \"@kodiak-finance/orderly-types\";\nimport {\n ChevronRightIcon,\n cn,\n EditIcon,\n Text,\n useScreen,\n} from \"@kodiak-finance/orderly-ui\";\nimport { modal } from \"@kodiak-finance/orderly-ui\";\nimport {\n PositionTPSLPopover,\n TPSLDetailDialogId,\n TPSLDialogId,\n TPSLSheetId,\n TPSLDetailSheetId,\n} from \"@kodiak-finance/orderly-ui-tpsl\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\n\n// ------------ TP/SL Price input end------------\nexport const TPSLButton = () => {\n const { position, baseDp, quoteDp, tpslOrder } = usePositionsRowContext();\n const { t } = useTranslation();\n return (\n <PositionTPSLPopover\n position={position}\n order={tpslOrder}\n label={t(\"common.tpsl\")}\n baseDP={baseDp}\n quoteDP={quoteDp}\n isEditing={false}\n />\n );\n};\n\nexport const TPSLEditIcon = () => {\n const { position, baseDp, quoteDp, tpslOrder } = usePositionsRowContext();\n const { isMobile } = useScreen();\n\n const onEdit = () => {\n const dialogId = isMobile ? TPSLDetailSheetId : TPSLDetailDialogId;\n modal.show(dialogId, {\n order: tpslOrder,\n position: position,\n baseDP: baseDp,\n quoteDP: quoteDp,\n });\n };\n\n return (\n // <PositionTPSLPopover\n // position={position}\n // order={tpslOrder}\n // baseDP={baseDp}\n // quoteDP={quoteDp}\n // isEditing\n // >\n <EditIcon\n onClick={onEdit}\n opacity={1}\n className=\"oui-cursor-pointer oui-text-base-contrast-54\"\n size={16}\n />\n // </PositionTPSLPopover>\n );\n};\n\nexport const AddIcon = (props: { positionType: PositionType }) => {\n const { position, baseDp, quoteDp, tpslOrder } = usePositionsRowContext();\n const [needConfirm] = useLocalStorage(\"orderly_order_confirm\", true);\n const { t } = useTranslation();\n const { isMobile } = useScreen();\n const onAdd = () => {\n const dialogId = isMobile ? TPSLSheetId : TPSLDialogId;\n const modalParams = {\n symbol: position.symbol,\n baseDP: baseDp,\n quoteDP: quoteDp,\n isEditing: false,\n positionType: props.positionType,\n };\n modal.show(dialogId, modalParams);\n };\n return (\n <Text\n className={cn(\n \"oui-cursor-pointer oui-text-base-contrast\",\n isMobile && \"oui-text-base-contrast-80\",\n )}\n onClick={onAdd}\n >\n {t(\"tpsl.add\")}\n </Text>\n );\n};\n\ntype LeverageBadgeProps = {\n symbol: string;\n leverage: number;\n modalId: string;\n};\n\nexport const LeverageBadge = (props: LeverageBadgeProps) => {\n const { symbol, leverage } = props;\n\n const showModal = () => {\n modal.show(props.modalId, {\n symbol,\n curLeverage: leverage,\n });\n };\n\n return (\n <div\n className={cn(\n \"oui-flex oui-h-[18px] oui-items-center oui-gap-1\",\n \"oui-cursor-pointer oui-rounded oui-bg-line-6 oui-pl-2 oui-pr-1\",\n \"oui-text-2xs oui-font-semibold oui-text-base-contrast-36\",\n )}\n onClick={showModal}\n >\n <Text>Cross</Text>\n {leverage ? (\n <Text.numeral dp={0} rm={Decimal.ROUND_DOWN} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n ) : (\n <LeverageDisplay symbol={symbol} />\n )}\n <ChevronRightIcon\n size={14}\n opacity={1}\n className=\"oui-text-base-contrast-36\"\n />\n </div>\n );\n};\n\n/** TODO: remove this */\nexport const LeverageDisplay = ({ symbol }: { symbol: string }) => {\n const leverage = useLeverageBySymbol(symbol);\n\n return (\n <Text.numeral dp={0} rm={Decimal.ROUND_DOWN} size=\"2xs\" unit=\"X\">\n {leverage || 1}\n </Text.numeral>\n );\n};\n","import { Text } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\nimport { PriceInput } from \"./priceInput\";\nimport { QuantityInput } from \"./quantityInput\";\n\nexport const renderQuantity = (value: number) => {\n const symbolInfo = useSymbolContext();\n return (\n <Text.numeral\n dp={symbolInfo.base_dp}\n rm={Decimal.ROUND_DOWN}\n padding={false}\n coloring\n >\n {value}\n </Text.numeral>\n );\n};\n\nexport const renderQuantityInput = (value: number, record: any) => {\n return <QuantityInput value={record[\"position_qty\"]} />;\n};\n\nexport const renderPriceInput = (value: number) => {\n return <PriceInput />;\n};\n","import { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\nimport {\n CaretDownIcon,\n cn,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuRoot,\n DropdownMenuTrigger,\n Input,\n inputFormatter,\n} from \"@kodiak-finance/orderly-ui\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\n\nexport const PriceInput = () => {\n const { type, quoteDp, price, updatePriceChange, updateOrderType } =\n usePositionsRowContext();\n const { t } = useTranslation();\n\n return (\n <DropdownMenuRoot>\n <Input\n size=\"sm\"\n value={\n type === OrderType.LIMIT ? price : t(\"orderEntry.orderType.market\")\n }\n inputMode=\"decimal\"\n onValueChange={(e) => updatePriceChange(e)}\n formatters={[\n inputFormatter.numberFormatter,\n ...(quoteDp ? [inputFormatter.dpFormatter(quoteDp)] : []),\n ]}\n onFocus={() => {\n if (type === OrderType.MARKET) {\n updateOrderType(OrderType.LIMIT);\n }\n }}\n suffix={\n <DropdownMenuTrigger asChild>\n <button className=\"oui-h-full oui-px-1\">\n <CaretDownIcon size={12} color=\"white\" />\n </button>\n </DropdownMenuTrigger>\n }\n classNames={{\n root: cn(\n \"oui-border oui-border-solid oui-border-white/[0.12] oui-outline-none focus-within:oui-outline-primary-light\",\n ),\n }}\n />\n <DropdownMenuContent\n align=\"end\"\n className=\"oui-w-[96px] oui-min-w-[96px]\"\n onCloseAutoFocus={(e) => e.preventDefault()}\n >\n <DropdownMenuGroup>\n <DropdownMenuItem\n size=\"xs\"\n onSelect={() => {\n updateOrderType(OrderType.MARKET);\n }}\n >\n <span>{t(\"common.marketPrice\")}</span>\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenuRoot>\n );\n};\n","import { useEffect, useState } from \"react\";\nimport { utils } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n PopoverRoot,\n PopoverContent,\n PopoverTrigger,\n Flex,\n Text,\n Slider,\n Button,\n inputFormatter,\n} from \"@kodiak-finance/orderly-ui\";\nimport { Input } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\n\nexport const QuantityInput = (props: { value: number }) => {\n const [sliderValue, setSliderValue] = useState<number>(100);\n const { baseDp, updateQuantity, quantity, baseTick } =\n usePositionsRowContext();\n\n const resetQuantity = (percent: number) => {\n formatQuantityToBaseTick(`${props.value * percent}`);\n };\n\n const formatQuantityToBaseTick = (value: string) => {\n if (baseTick && baseTick > 0) {\n // format quantity to baseTick\n const formatQty = utils.formatNumber(value, baseTick) ?? value;\n updateQuantity(formatQty);\n }\n };\n\n useEffect(() => {\n const maxQty = Math.abs(props.value);\n const qty = Math.min(Number(quantity || 0), maxQty);\n\n // transform quantity to slider value\n const slider = new Decimal(qty)\n .div(maxQty)\n .mul(100)\n .todp(2, Decimal.ROUND_DOWN)\n .toNumber();\n\n setSliderValue(slider);\n }, [quantity, props.value]);\n\n return (\n <PopoverRoot>\n <PopoverTrigger>\n <Input\n size=\"sm\"\n inputMode=\"decimal\"\n classNames={{\n root: \"oui-outline-none oui-border oui-border-solid oui-border-white/[0.12] focus-within:oui-outline-primary-light\",\n }}\n formatters={[\n inputFormatter.numberFormatter,\n ...(baseDp ? [inputFormatter.dpFormatter(baseDp)] : []),\n ]}\n value={quantity}\n onBlur={(event) => formatQuantityToBaseTick(event.target.value)}\n onValueChange={updateQuantity}\n />\n </PopoverTrigger>\n <PopoverContent\n className=\"oui-w-[360px] oui-rounded-xl\"\n align=\"start\"\n side=\"bottom\"\n onOpenAutoFocus={(event) => {\n event.preventDefault();\n }}\n >\n <Flex p={1} gap={2} width={\"100%\"} itemAlign={\"start\"}>\n <Text size=\"xs\" intensity={98} className=\"oui-min-w-[40px]\">\n {`${sliderValue}%`}\n </Text>\n <Flex direction={\"column\"} width={\"100%\"} gap={2}>\n <Slider\n markCount={4}\n value={[sliderValue]}\n onValueChange={(values) => {\n resetQuantity(values[0] / 100);\n }}\n />\n <PercentButtons onClick={resetQuantity} />\n </Flex>\n </Flex>\n </PopoverContent>\n </PopoverRoot>\n );\n};\n\nconst PercentButtons = (props: { onClick: (value: number) => void }) => {\n const { t } = useTranslation();\n const list = [\n {\n label: \"0%\",\n value: 0,\n },\n {\n label: \"25%\",\n value: 0.25,\n },\n {\n label: \"50%\",\n value: 0.5,\n },\n {\n label: \"75%\",\n value: 0.75,\n },\n {\n label: t(\"common.max\"),\n value: 1,\n },\n ];\n\n return (\n <Flex gap={2} width={\"100%\"}>\n {list.map((item, index) => {\n return (\n <Button\n key={index}\n variant=\"outlined\"\n color=\"secondary\"\n size=\"xs\"\n onClick={(e) => {\n e.stopPropagation();\n props.onClick(item.value);\n }}\n className=\"oui-w-1/5\"\n >\n {item.label}\n </Button>\n );\n })}\n </Flex>\n );\n};\n","import React from \"react\";\nimport { NumeralProps, Text } from \"@kodiak-finance/orderly-ui\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\n\nexport type TickName = \"quote_dp\" | \"base_dp\";\n\nexport const NumeralWithCtx: React.FC<\n React.PropsWithChildren<\n Omit<NumeralProps, \"precision\" | \"tick\"> & { tick?: TickName }\n >\n> = (props) => {\n const { tick = \"quote_dp\", children, ...rest } = props;\n const symbolInfo = useSymbolContext();\n\n if (!symbolInfo) {\n // TODO i18n\n throw new Error(\"NumeralWithCtx must be used inside SymbolProvider\");\n }\n\n return (\n <Text.numeral as={\"span\" as any} dp={symbolInfo[tick]} {...rest}>\n {children}\n </Text.numeral>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useSymbolsInfo } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { PositionType } from \"@kodiak-finance/orderly-types\";\nimport { cn, Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\nimport { AddIcon, TPSLEditIcon } from \"./components\";\n\nexport const PartialTPSL: FC<{\n orderNum?: number;\n tpTriggerPrice?: number;\n slTriggerPrice?: number;\n direction?: \"column\" | \"row\";\n}> = (props) => {\n const {\n orderNum,\n tpTriggerPrice,\n slTriggerPrice,\n direction = \"column\",\n } = props;\n const { partialTPSLOrder: order, quoteDp, baseDp } = usePositionsRowContext();\n const symbolInfo = useSymbolsInfo();\n const { t } = useTranslation();\n\n const child = useMemo(() => {\n const children = [];\n\n if (!order?.symbol) return <AddIcon positionType={PositionType.PARTIAL} />;\n\n if (tpTriggerPrice) {\n children.push(\n <Text.formatted\n className={cn(\n \"oui-text-trade-profit oui-gap-0 oui-decoration-white/20\",\n )}\n key={\"tp\"}\n rule=\"price\"\n dp={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={tpTriggerPrice}\n prefix={\n !slTriggerPrice || direction === \"column\" ? (\n <Text intensity={54}>{`${t(\"tpsl.tp\")} - `}</Text>\n ) : (\n \"\"\n )\n }\n />,\n );\n }\n if (slTriggerPrice) {\n children.push(\n <Text.formatted\n key={\"sl\"}\n className={cn(\n \"oui-text-trade-loss oui-gap-0 oui-decoration-white/20 \",\n )}\n rule={\"price\"}\n dp={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n prefix={<Text intensity={54}>{`${t(\"tpsl.sl\")} - `}</Text>}\n >\n {slTriggerPrice}\n </Text.formatted>,\n );\n }\n if (children.length === 0)\n return <AddIcon positionType={PositionType.PARTIAL} />;\n\n if (children.length === 2 && direction === \"row\") {\n children.splice(1, 0, <Text key={\"split\"}>/</Text>);\n }\n\n return children;\n }, [tpTriggerPrice, slTriggerPrice, order?.symbol, t]);\n const hasTPSL = Array.isArray(child) ? !!child.length : !child;\n return (\n <Flex className=\"oui-gap-[6px]\">\n <div\n className={cn(\n \"oui-inline-flex oui-text-base-contrast-36\",\n direction === \"column\" ? \"oui-flex-col\" : \"oui-flex-row oui-gap-1\",\n )}\n >\n {child}\n </div>\n {hasTPSL && (\n <>\n <Text className=\"oui-text-base-contrast-54\">({orderNum})</Text>\n <TPSLEditIcon />\n </>\n )}\n </Flex>\n );\n};\n","import { FC } from \"react\";\nimport { ShareIcon } from \"@kodiak-finance/orderly-ui\";\nimport { ShareButtonScriptReturn } from \"./shareButton.script\";\n\nexport const ShareButton: FC<ShareButtonScriptReturn> = (props) => {\n if (!props.sharePnLConfig) {\n return null;\n }\n\n return (\n <button\n type=\"button\"\n onClick={(e: any) => {\n e.stopPropagation();\n props.showModal();\n }}\n >\n <ShareIcon color=\"white\" opacity={0.54} size={props.iconSize ?? 16} />\n </button>\n );\n};\n","import { useMemo } from \"react\";\nimport {\n useAccountInfo,\n useReferralInfo,\n useLeverageBySymbol,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { account, positions } from \"@kodiak-finance/orderly-perp\";\nimport { modal } from \"@kodiak-finance/orderly-ui\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\n\nexport type ShareButtonScriptOptions = {\n position: any;\n sharePnLConfig?: SharePnLConfig;\n modalId: string;\n iconSize?: number;\n isPositionHistory?: boolean;\n};\n\nexport type ShareButtonScriptReturn = ReturnType<typeof useShareButtonScript>;\n\nexport const useShareButtonScript = (props: ShareButtonScriptOptions) => {\n const { position, sharePnLConfig, iconSize } = props;\n const { getFirstRefCode } = useReferralInfo();\n const symbolsInfo = useSymbolsInfo();\n const { data: accountInfo } = useAccountInfo();\n\n const refCode = useMemo(() => {\n return getFirstRefCode()?.code;\n }, [getFirstRefCode]);\n\n const symbolLeverage = useLeverageBySymbol(position.symbol);\n\n const getHistoryEntity = () => {\n const netPnL = position.netPnL || 0;\n const openPrice = Math.abs(position.avg_open_price);\n const quantity = Math.abs(position.closed_position_qty);\n\n let roi;\n\n const symbolInfo = symbolsInfo[position.symbol];\n const baseIMR = symbolInfo(\"base_imr\");\n const IMR_Factor = symbolInfo(\"imr_factor\");\n\n // calculate unrealized pnl ROI for position history\n if (\n netPnL !== 0 &&\n quantity !== 0 &&\n openPrice !== 0 &&\n accountInfo?.max_leverage &&\n baseIMR &&\n IMR_Factor\n ) {\n const notional = positions.notional(quantity, openPrice);\n\n const maxLeverage = position.leverage\n ? position.leverage\n : accountInfo.max_leverage;\n\n const imr = account.IMR({\n maxLeverage,\n baseIMR: baseIMR,\n IMR_Factor: IMR_Factor,\n positionNotional: notional,\n ordersNotional: 0,\n IMR_factor_power: 4 / 5,\n });\n\n const unrealizedPnLROI = positions.unrealizedPnLROI({\n positionQty: quantity,\n openPrice: openPrice,\n IMR: imr,\n unrealizedPnL: netPnL,\n });\n\n roi = new Decimal(unrealizedPnLROI * 100).toFixed(2, Decimal.ROUND_DOWN);\n }\n\n return {\n side: position.side,\n pnl: netPnL,\n roi: roi,\n openPrice: openPrice,\n closePrice: Math.abs(position.avg_close_price),\n openTime: position.open_timestamp,\n closeTime: position.close_timestamp,\n quantity: position.closed_position_qty,\n };\n };\n\n const showModal = () => {\n const entity = props.isPositionHistory\n ? getHistoryEntity()\n : {\n side: position.position_qty > 0 ? \"LONG\" : \"SHORT\",\n pnl: position.unrealized_pnl,\n roi: new Decimal(position.unrealized_pnl_ROI * 100).toFixed(\n 2,\n Decimal.ROUND_DOWN,\n ),\n openPrice: Math.abs(position.average_open_price),\n markPrice: position.mark_price,\n openTime: position.timestamp,\n quantity: position.position_qty,\n };\n\n modal.show(props.modalId, {\n pnl: {\n entity: {\n symbol: position.symbol,\n // when position.leverage is empty, use leverage from useSymbolLeverage\n leverage: position.leverage || symbolLeverage,\n ...entity,\n },\n refCode,\n ...sharePnLConfig,\n },\n });\n };\n\n return {\n iconSize,\n sharePnLConfig,\n showModal,\n };\n};\n","import {\n useShareButtonScript,\n ShareButtonScriptOptions,\n} from \"./shareButton.script\";\nimport { ShareButton } from \"./shareButton.ui\";\n\nexport type ShareButtonWidgetProps = ShareButtonScriptOptions;\n\nexport const ShareButtonWidget = (props: ShareButtonWidgetProps) => {\n const state = useShareButtonScript(props);\n return <ShareButton {...state} />;\n};\n","import { FC, useMemo } from \"react\";\nimport { useSymbolsInfo, utils } from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n AlgoOrderType,\n API,\n OrderSide,\n PositionType,\n} from \"@kodiak-finance/orderly-types\";\nimport { cn, Flex, Text, Tooltip } from \"@kodiak-finance/orderly-ui\";\nimport { usePositionsRowContext } from \"../positionsRowContext\";\nimport { TPSLEditIcon, AddIcon } from \"./components\";\n\nexport const TriggerPrice: FC<{\n stopLossPrice?: number;\n takeProfitPrice?: number;\n}> = (props) => {\n const { stopLossPrice, takeProfitPrice } = props;\n const { tpslOrder, position } = usePositionsRowContext();\n\n return (\n <TPSLTriggerPrice\n stopLossPrice={stopLossPrice}\n takeProfitPrice={takeProfitPrice}\n direction={\"column\"}\n order={tpslOrder}\n position={position}\n tooltip\n />\n );\n};\n\nexport const TriggerPriceItem: FC<{\n qty: number;\n price: number;\n entryPrice: number;\n orderSide: OrderSide;\n orderType: AlgoOrderType;\n symbolInfo: API.SymbolExt;\n}> = (props) => {\n const { qty, price, entryPrice, orderSide, orderType, symbolInfo } = props;\n const pnl = utils.priceToPnl(\n {\n qty,\n price,\n entryPrice,\n orderSide,\n orderType,\n },\n {\n symbol: symbolInfo,\n },\n );\n\n const type = orderType === AlgoOrderType.TAKE_PROFIT ? \"TP\" : \"SL\";\n\n return (\n <Flex>\n <Text intensity={54} className=\"oui-mr-1\">{`${type} PnL:`}</Text>\n <Text.formatted\n rule=\"price\"\n className={\n pnl === 0\n ? \"oui-text-base-contrast-36\"\n : pnl > 0\n ? \"oui-text-trade-profit oui-gap-0\"\n : \"oui-text-trade-loss oui-gap-0\"\n }\n prefix={<Text>{pnl === 0 ? \"\" : pnl > 0 ? \"+\" : \"-\"}</Text>}\n suffix={\n <Text intensity={36} className=\"oui-ml-1\">\n USDC\n </Text>\n }\n >{`${Math.abs(pnl)}`}</Text.formatted>\n </Flex>\n );\n};\n\nexport const TPSLTriggerPrice: FC<{\n takeProfitPrice: number | undefined;\n stopLossPrice: number | undefined;\n className?: string;\n direction?: \"row\" | \"column\";\n tooltip?: boolean;\n order?: API.AlgoOrder;\n position?: API.PositionTPSLExt;\n}> = (props) => {\n const { direction = \"row\", order, position } = props;\n // const symbolInfo = useSymbolsInfo()[position?.symbol ?? \"\"]();\n const symbolInfo = useSymbolsInfo();\n const { t } = useTranslation();\n const pnl = useMemo(() => {\n const msgs = [];\n\n if (!props.tooltip || !order || !position) return;\n\n let quantity = order.quantity;\n\n if (quantity === 0) {\n if (order.child_orders[0].type === \"CLOSE_POSITION\") {\n quantity = position.position_qty;\n }\n }\n\n if (!!props.takeProfitPrice) {\n msgs.push(\n <TriggerPriceItem\n key={\"tp\"}\n qty={quantity}\n price={props.takeProfitPrice}\n entryPrice={position.average_open_price}\n orderSide={order.side as OrderSide}\n orderType={AlgoOrderType.TAKE_PROFIT}\n symbolInfo={symbolInfo[order.symbol]()}\n />,\n );\n }\n\n if (!!props.stopLossPrice) {\n msgs.push(\n <TriggerPriceItem\n key={\"sl\"}\n qty={quantity}\n price={props.stopLossPrice}\n entryPrice={position.average_open_price}\n orderSide={order.side as OrderSide}\n orderType={AlgoOrderType.STOP_LOSS}\n symbolInfo={symbolInfo[order.symbol]()}\n />,\n );\n }\n\n return <div>{msgs}</div>;\n }, [\n props.takeProfitPrice,\n props.stopLossPrice,\n position?.average_open_price,\n order?.side,\n order?.quantity,\n order?.algo_type,\n ]);\n\n const child = useMemo(() => {\n const children = [];\n\n if (!order?.symbol) return <AddIcon positionType={PositionType.FULL} />;\n\n const Label = ({ children }: { children?: string }) => {\n return !props.stopLossPrice || direction === \"column\" ? (\n <Text intensity={54}>{children}</Text>\n ) : (\n \"\"\n );\n };\n\n if (props.takeProfitPrice) {\n children.push(\n <Text.formatted\n className={cn(\n \"oui-text-trade-profit oui-gap-0 oui-decoration-white/20\",\n )}\n key={\"tp\"}\n rule=\"price\"\n dp={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={props.takeProfitPrice}\n prefix={\n !props.stopLossPrice || direction === \"column\" ? (\n <Text intensity={54}>{`${t(\"tpsl.tp\")} - `}</Text>\n ) : (\n \"\"\n )\n }\n />,\n );\n }\n if (props.stopLossPrice) {\n children.push(\n <Text.formatted\n key={\"sl\"}\n className={cn(\n \"oui-text-trade-loss oui-gap-0 oui-decoration-white/20 \",\n )}\n rule={\"price\"}\n dp={symbolInfo[order!.symbol](\"quote_dp\", 2)}\n children={props.stopLossPrice}\n prefix={\n !props.takeProfitPrice || direction === \"column\" ? (\n <Text intensity={54}>{`${t(\"tpsl.sl\")} - `}</Text>\n ) : (\n \"\"\n )\n }\n />,\n );\n }\n\n if (children.length === 0)\n return <AddIcon positionType={PositionType.FULL} />;\n\n if (children.length === 2 && direction === \"row\") {\n children.splice(1, 0, <Text key={\"split\"}>/</Text>);\n }\n\n return children;\n }, [props.takeProfitPrice, props.stopLossPrice, order?.symbol, t]);\n\n const content = (\n <div\n className={cn(\n \"oui-inline-flex oui-text-base-contrast-36\",\n props.direction === \"column\"\n ? \"oui-flex-col\"\n : \"oui-flex-row oui-gap-1\",\n props.className,\n )}\n >\n {child}\n </div>\n );\n\n const showIcon = Array.isArray(child) ? !!child.length : !child;\n\n if (props.tooltip) {\n return (\n <Flex gapX={2}>\n <Tooltip content={pnl}>{content}</Tooltip>\n {showIcon && <TPSLEditIcon />}\n </Flex>\n );\n }\n\n return content;\n};\n","import { FC } from \"react\";\nimport { useLocalStorage } from \"@kodiak-finance/orderly-hooks\";\nimport { Divider, Flex, Text } from \"@kodiak-finance/orderly-ui\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\n\nexport const UnrealizedPnLPopoverCard: FC<{}> = (props) => {\n const [unPnlPriceBasis, setUnPnlPriceBasic] = useLocalStorage(\n \"unPnlPriceBasis\",\n \"markPrice\"\n );\n const { t } = useTranslation();\n return (\n <Flex\n direction={\"column\"}\n gap={3}\n className=\"oui-text-base-contrast-54 oui-items-start\"\n >\n <Text>{t(\"positions.column.unrealPnl.tooltip\")}</Text>\n <Divider className=\"oui-w-full\" />\n <div className=\"oui-mb-0\">\n {t(\"positions.column.unrealPnl.priceBasis\")}\n </div>\n <UnPnlPriceBasisCheckBox\n value={unPnlPriceBasis}\n onValueChange={setUnPnlPriceBasic}\n />\n </Flex>\n );\n};\n\nconst UnPnlPriceBasisCheckBox = (props: {\n value: string;\n onValueChange: (value: string) => void;\n}) => {\n const { value, onValueChange } = props;\n const { t } = useTranslation();\n\n // \"markPrice\" | \"lastPrice\"\n return (\n <Flex gap={2}>\n <RadioButton\n sel={value === \"markPrice\"}\n label={t(\"common.markPrice\")}\n value={\"markPrice\"}\n onCheckChange={onValueChange}\n />\n <RadioButton\n sel={value === \"lastPrice\"}\n label={t(\"common.lastPrice\")}\n value={\"lastPrice\"}\n onCheckChange={onValueChange}\n />\n </Flex>\n );\n};\n\nconst RadioButton = (props: {\n sel: boolean;\n label: any;\n value: any;\n onCheckChange: (value: any) => void;\n}) => {\n const { sel, label, value, onCheckChange } = props;\n return (\n <Flex\n onClick={(e) => {\n onCheckChange(value);\n e.stopPropagation();\n }}\n gap={1}\n className=\"oui-cursor-pointer\"\n >\n {sel ? <SelIcon /> : <UnselIcon />}\n <Text size=\"xs\" intensity={sel ? 98 : 54}>\n {label}\n </Text>\n </Flex>\n );\n};\n\nconst SelIcon = () => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"currentColor\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className=\"oui-fill-white\"\n >\n <path\n d=\"M8.01 1.333a6.667 6.667 0 1 0 0 13.333 6.667 6.667 0 0 0 0-13.333m0 1.333a5.334 5.334 0 1 1-.001 10.667 5.334 5.334 0 0 1 0-10.667\"\n fill=\"#fff\"\n fillOpacity=\".36\"\n />\n <circle cx=\"8\" cy=\"8\" r=\"3.333\" />\n </svg>\n );\n};\n\nconst UnselIcon = () => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n >\n <path\n d=\"M8.01 1.333a6.667 6.667 0 1 0 0 13.333 6.667 6.667 0 0 0 0-13.333m0 1.333a5.334 5.334 0 1 1-.001 10.667 5.334 5.334 0 0 1 0-10.667\"\n fill=\"#fff\"\n fillOpacity=\".54\"\n />\n </svg>\n );\n};\n","import { FC } from \"react\";\nimport { OrderType } from \"@kodiak-finance/orderly-types\";\nimport { cn, Divider, Flex, Grid } from \"@kodiak-finance/orderly-ui\";\nimport { ClosePositionWidget } from \"../../closePosition\";\nimport { TpSLBtnWidget } from \"../tpSLBtn\";\nimport {\n UnrealPnL,\n SymbolToken,\n Qty,\n Margin,\n Notional,\n AvgOpen,\n MarkPrice,\n LiqPrice,\n TPSLPrice,\n FundingFee,\n} from \"./items\";\nimport { PositionCellState } from \"./positionCell.script\";\n\nexport const PositionCell: FC<\n PositionCellState & {\n className?: string;\n }\n> = (props) => {\n const { className, ...rest } = props;\n\n const header = (\n <Flex justify={\"between\"} width={\"100%\"}>\n <SymbolToken {...props} />\n <UnrealPnL {...props} />\n </Flex>\n );\n\n const body = (\n <Grid cols={3} rows={2} gap={2} width={\"100%\"}>\n <Qty {...props} />\n <Margin {...props} />\n <Notional {...props} />\n <AvgOpen {...props} />\n <MarkPrice {...props} />\n <LiqPrice {...props} />\n </Grid>\n );\n\n const buttons = (\n <Grid width={\"100%\"} gap={2} cols={2} rows={1}>\n <ClosePositionWidget type={OrderType.LIMIT} />\n <ClosePositionWidget type={OrderType.MARKET} />\n </Grid>\n );\n\n return (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n p={2}\n r=\"xl\"\n itemAlign={\"start\"}\n className={cn(className, \"oui-bg-base-9\")}\n >\n {header}\n <Divider intensity={6} className=\"oui-w-full\" />\n {body}\n <TPSLPrice {...rest} />\n <FundingFee {...rest} />\n {buttons}\n </Flex>\n );\n};\n","import { FC, useMemo, useRef } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API, PositionType } from \"@kodiak-finance/orderly-types\";\nimport { Badge, cn, Flex, Grid, Statistic, Text } from \"@kodiak-finance/orderly-ui\";\nimport { SymbolLeverageSheetId } from \"@kodiak-finance/orderly-ui-leverage\";\nimport { SharePnLBottomSheetId } from \"@kodiak-finance/orderly-ui-share\";\nimport { Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { FundingFeeButton } from \"../../../fundingFeeHistory/fundingFeeButton\";\nimport { LeverageBadge } from \"../../desktop/components\";\nimport { AddIcon, TPSLEditIcon } from \"../../desktop/components\";\nimport { ShareButtonWidget } from \"../../desktop/shareButton\";\nimport { PositionCellState } from \"./positionCell.script\";\n\nexport const SymbolToken: FC<PositionCellState> = (props) => {\n const { item } = props;\n const isBuy = item.position_qty > 0;\n const { t } = useTranslation();\n return (\n <Text.formatted\n rule=\"symbol\"\n formatString=\"base-type\"\n size=\"2xs\"\n suffix={\n <div className=\"oui-flex oui-items-center oui-gap-1\">\n <Badge color={isBuy ? \"success\" : \"danger\"} size=\"xs\">\n {isBuy ? t(\"common.long\") : t(\"common.short\")}\n </Badge>\n <LeverageBadge\n symbol={item.symbol}\n leverage={item.leverage}\n modalId={SymbolLeverageSheetId}\n />\n </div>\n }\n showIcon\n onClick={() => {\n props.onSymbolChange?.({ symbol: item.symbol } as API.Symbol);\n }}\n >\n {item.symbol}\n </Text.formatted>\n );\n};\n\nexport const UnrealPnL: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n return (\n <Flex gap={3}>\n <Flex direction={\"column\"} className=\"oui-text-2xs\" itemAlign={\"end\"}>\n <div>\n <Text intensity={36}>{t(\"common.unrealizedPnl\")}</Text>\n <Text intensity={20}>(USDC)</Text>\n </div>\n\n <Text.numeral\n size=\"xs\"\n dp={props.pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n coloring\n className=\"orderly-font-semibold\"\n suffix={\n <Text.numeral\n rule=\"percentages\"\n dp={props.pnlNotionalDecimalPrecision}\n rm={Decimal.ROUND_DOWN}\n prefix=\"(\"\n suffix=\")\"\n className={cn(\n \"oui-ml-1\",\n item.unrealized_pnl_ROI > 0\n ? \"oui-text-success-darken\"\n : \"oui-text-danger-darken\",\n )}\n >\n {item.unrealized_pnl_ROI}\n </Text.numeral>\n }\n >\n {item.unrealized_pnl}\n </Text.numeral>\n </Flex>\n <ShareButtonWidget\n position={item}\n sharePnLConfig={props.sharePnLConfig}\n modalId={SharePnLBottomSheetId}\n iconSize={12}\n />\n </Flex>\n );\n};\n\nexport const Qty: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n label={t(\"common.qty\")}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.base_dp} padding={false} coloring>\n {item.position_qty}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const Margin: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n label={\n <span>\n {t(\"positions.column.margin\")}\n <Text intensity={20}>(USDC)</Text>\n </span>\n }\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} intensity={80}>\n {item.mm}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const Notional: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n align=\"end\"\n label={\n <span>\n {t(\"common.notional\")}\n <Text intensity={20}>(USDC)</Text>\n </span>\n }\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} intensity={80}>\n {item.notional}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const AvgOpen: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n label={t(\"common.avgOpen\")}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} rm={Decimal.ROUND_DOWN} intensity={80}>\n {item.average_open_price}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const MarkPrice: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n return (\n <Statistic\n label={t(\"common.markPrice\")}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} rm={Decimal.ROUND_DOWN} intensity={80}>\n {item.mark_price}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const LiqPrice: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n const liqPrice =\n item.est_liq_price && item.est_liq_price > 0 ? item.est_liq_price : \"-\";\n\n return (\n <Statistic\n label={t(\"positions.column.liqPrice\")}\n align=\"end\"\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} rm={Decimal.ROUND_DOWN} color=\"warning\">\n {liqPrice}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const TPSLPrice: FC<PositionCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n const fullTPSL = useMemo(() => {\n if (\n item.full_tp_sl?.tp_trigger_price == null &&\n item.full_tp_sl?.sl_trigger_price == null\n )\n return <AddIcon positionType={PositionType.FULL} />;\n\n return (\n <Flex className=\"oui-gap-[2px]\">\n {item.full_tp_sl?.tp_trigger_price && (\n <Text.numeral color=\"buy\">\n {item.full_tp_sl.tp_trigger_price}\n </Text.numeral>\n )}\n {item.full_tp_sl?.sl_trigger_price && \"/\"}\n {item.full_tp_sl?.sl_trigger_price && (\n <Text.numeral color=\"sell\">\n {item.full_tp_sl.sl_trigger_price}\n </Text.numeral>\n )}\n <TPSLEditIcon />\n </Flex>\n );\n }, [item.full_tp_sl]);\n\n const partialTPSL = useMemo(() => {\n if (\n item.partial_tp_sl?.tp_trigger_price == null &&\n item.partial_tp_sl?.sl_trigger_price == null\n )\n return <AddIcon positionType={PositionType.PARTIAL} />;\n\n return (\n <Flex className=\"oui-gap-[2px]\" itemAlign={\"center\"}>\n {item.partial_tp_sl?.tp_trigger_price && (\n <Text.numeral color=\"buy\">\n {item.partial_tp_sl.tp_trigger_price}\n </Text.numeral>\n )}\n {item.partial_tp_sl?.sl_trigger_price && \"/\"}\n {item.partial_tp_sl?.sl_trigger_price && (\n <Text.numeral color=\"sell\">\n {item.partial_tp_sl.sl_trigger_price}\n </Text.numeral>\n )}\n <Text>{`(${item.partial_tp_sl?.order_num})`}</Text>\n <TPSLEditIcon />\n </Flex>\n );\n }, [item.partial_tp_sl]);\n\n return (\n <Grid cols={2} rows={1} gap={2} width={\"100%\"}>\n <Flex\n className=\"oui-text-2xs oui-text-base-contrast-36\"\n direction={\"column\"}\n itemAlign={\"start\"}\n >\n <Text>{t(\"common.fullTPSL\")}: </Text>\n {fullTPSL}\n </Flex>\n <Flex\n className=\"oui-text-2xs oui-text-base-contrast-36 oui-grid-cols-end\"\n direction={\"column\"}\n itemAlign={\"end\"}\n >\n <Text>{t(\"common.partialTPSL\")}: </Text>\n {partialTPSL}\n </Flex>\n </Grid>\n );\n};\n\nexport const FundingFee: FC<PositionCellState> = (props) => {\n const { t } = useTranslation();\n const fundingFeeEndTime = useRef(Date.now().toString());\n return (\n <Flex justify={\"end\"} className=\"oui-w-full oui-text-2xs\">\n <Text intensity={36}>{t(\"funding.fundingFee\")}: </Text>\n <FundingFeeButton\n fee={props.item.fundingFee!}\n symbol={props.item.symbol}\n start_t={props.item.timestamp.toString()}\n end_t={fundingFeeEndTime.current}\n />\n </Flex>\n );\n};\n","import { API } from \"@kodiak-finance/orderly-types\";\nimport { useSymbolContext } from \"../../../../provider/symbolContext\";\nimport { PositionsProps } from \"../../../../types/types\";\n\ntype PositionCellScriptProps = {\n item: API.PositionTPSLExt;\n index: number;\n} & PositionsProps;\n\nexport type PositionCellState = ReturnType<typeof usePositionCellScript>;\n\nexport const usePositionCellScript = (props: PositionCellScriptProps) => {\n const symbolInfo = useSymbolContext();\n return {\n ...props,\n ...symbolInfo,\n };\n};\n","import { FC } from \"react\";\nimport { usePositionCellScript } from \"./positionCell.script\";\nimport { PositionCell } from \"./positionCell.ui\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { PositionsProps } from \"../../../../types/types\";\n\nexport const PositionCellWidget: FC<\n {\n item: API.PositionTPSLExt;\n index: number;\n className?: string;\n shareIconSize?: number;\n } & PositionsProps\n> = (props) => {\n const state = usePositionCellScript(props);\n return <PositionCell {...state} className={props.className} />;\n};\n","import {\n createContext,\n FC,\n PropsWithChildren,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport {\n KeyedMutator,\n usePositionClose,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API, OrderSide, OrderType } from \"@kodiak-finance/orderly-types\";\nimport { toast } from \"@kodiak-finance/orderly-ui\";\nimport { PositionsRowContext } from \"./positionsRowContext\";\nimport type { PositionsRowContextState } from \"./positionsRowContext\";\n\n// export interface PositionsRowContextState {\n// quantity: string;\n// price: string;\n// type: OrderType;\n// side: OrderSide;\n// position: API.PositionExt | API.PositionTPSLExt;\n// updateQuantity: (value: string) => void;\n// updatePriceChange: (value: string) => void;\n\n// updateOrderType: (value: OrderType, price?: string) => void;\n\n// closeOrderData: any;\n\n// onSubmit: () => Promise<any>;\n// submitting: boolean;\n// tpslOrder?: API.AlgoOrder;\n// partialTPSLOrder?: API.AlgoOrder;\n// quoteDp?: number;\n// baseDp?: number;\n// baseTick?: number;\n// errors: any | undefined;\n// }\n\n// export const PositionsRowContext = createContext(\n// {} as PositionsRowContextState,\n// );\n\n// export const usePositionsRowContext = () => {\n// return useContext(PositionsRowContext);\n// };\n\ntype PositionsRowProviderProps = PropsWithChildren<{\n position: API.PositionExt | API.PositionTPSLExt;\n mutatePositions?: KeyedMutator<API.PositionExt[]>;\n}>;\n\nexport const PositionsRowProvider: FC<PositionsRowProviderProps> = (props) => {\n const { position, children, mutatePositions } = props;\n const { t } = useTranslation();\n const [quantity, setQuantity] = useState<string>(\n Math.abs(position.position_qty).toString(),\n );\n const [price, setPrice] = useState<string>(\"\");\n const [type, setType] = useState<OrderType>(OrderType.MARKET);\n\n useEffect(() => {\n setQuantity(Math.abs(position.position_qty).toString());\n }, [position.position_qty]);\n\n const symbol = position.symbol;\n const symbolsInfo = useSymbolsInfo();\n const symbolInfo = symbolsInfo?.[symbol];\n const quoteDp = symbolInfo(\"quote_dp\");\n const baseDp = symbolInfo(\"base_dp\");\n const baseTick = symbolInfo(\"base_tick\");\n\n const {\n side,\n closeOrderData,\n submit,\n isMutating: submitting,\n errors,\n calculate,\n } = usePositionClose({\n position,\n order: {\n type,\n quantity,\n price,\n },\n });\n\n const updateQuantity = useCallback(\n (value: string) => {\n const newValues = calculate(\n {},\n \"order_quantity\",\n value,\n position.mark_price,\n symbolInfo(),\n );\n setQuantity(newValues.order_quantity!);\n },\n [calculate, symbolsInfo, position.mark_price],\n );\n\n const updatePriceChange = useCallback(\n (value: string) => {\n const newValues = calculate(\n {},\n \"order_price\",\n value,\n position.mark_price,\n symbolInfo(),\n );\n setPrice(newValues.order_price!);\n },\n [calculate, symbolsInfo, position.mark_price],\n );\n\n const updateOrderType = useCallback(\n (type: OrderType) => {\n setType(type);\n // when type is Limit, set price to mark price\n // when type is Market, set price to empty string\n setPrice(type === OrderType.LIMIT ? position.mark_price?.toString() : \"\");\n },\n [position.mark_price],\n );\n\n const onSubmit = useCallback(async () => {\n if (Number(quantity) > symbolInfo(\"base_max\")) {\n toast.error(\n <div>\n {t(\"positions.limitClose.errors.exceed.title\")}\n <br />\n <div className=\"oui-break-normal\">\n {t(\"positions.limitClose.errors.exceed.description\", {\n quantity: quantity,\n symbol: transSymbolformString(symbol, \"base\"),\n maxQuantity: symbolInfo(\"base_max\"),\n })}\n </div>\n </div>,\n );\n return;\n }\n\n return submit()\n .then((res) => {\n if (res.success) {\n mutatePositions?.();\n return res;\n }\n\n if (res.message) {\n toast.error(res.message);\n }\n\n throw true;\n })\n .catch((err) => {\n if (err.message) {\n toast.error(err.message);\n }\n return false;\n });\n }, [submit]);\n\n const memoizedValue = useMemo<PositionsRowContextState>(() => {\n return {\n quantity,\n price,\n type,\n side,\n position,\n updatePriceChange,\n updateQuantity,\n updateOrderType,\n tpslOrder: (position as API.PositionTPSLExt).full_tp_sl?.algo_order,\n partialTPSLOrder: (position as API.PositionTPSLExt).partial_tp_sl\n ?.algo_order,\n onSubmit,\n submitting,\n closeOrderData,\n quoteDp,\n baseDp,\n baseTick,\n errors,\n };\n }, [\n quantity,\n price,\n type,\n side,\n position,\n updatePriceChange,\n updateQuantity,\n updateOrderType,\n onSubmit,\n submitting,\n closeOrderData,\n quoteDp,\n baseDp,\n baseTick,\n errors,\n ]);\n\n return (\n <PositionsRowContext.Provider value={memoizedValue}>\n {children}\n </PositionsRowContext.Provider>\n );\n};\n\nfunction transSymbolformString(symbol: string, formatString = \"base\") {\n const arr = symbol.split(\"_\");\n const type = arr[0];\n const base = arr[1];\n const quote = arr[2];\n return (formatString ?? \"base-quote\")\n .replace(\"type\", type)\n .replace(\"base\", base)\n .replace(\"quote\", quote);\n}\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport {\n Button,\n cn,\n DataFilter,\n Flex,\n Grid,\n ListView,\n Text,\n Table,\n TableFeatures,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\nimport { SymbolProvider } from \"../../provider/symbolProvider\";\nimport { usePositionHistoryColumn } from \"./desktop/usePositionHistoryColumn\";\nimport { PositionHistoryCellWidget } from \"./mobile\";\nimport {\n PositionHistoryExt,\n PositionHistoryState,\n} from \"./positionHistory.script\";\n\ntype PositionHistoryProps = PositionHistoryState & {\n sharePnLConfig?: SharePnLConfig;\n tableRef?: React.RefObject<Table<any>>;\n};\n\nexport const PositionHistory: FC<PositionHistoryProps> = (props) => {\n const { onSymbolChange, pagination, pnlNotionalDecimalPrecision, tableRef } =\n props;\n const column = usePositionHistoryColumn({\n onSymbolChange,\n pnlNotionalDecimalPrecision,\n sharePnLConfig: props.sharePnLConfig,\n });\n\n const { t } = useTranslation();\n\n const dayLabel: Record<number, string> = useMemo(() => {\n return {\n 1: t(\"common.select.1d\"),\n 7: t(\"common.select.7d\"),\n 30: t(\"common.select.30d\"),\n 90: t(\"common.select.90d\"),\n };\n }, [t]);\n\n return (\n <Flex direction=\"column\" width=\"100%\" height=\"100%\" itemAlign=\"start\">\n {/* <Divider className=\"oui-w-full\" /> */}\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n />\n )}\n {[1, 7, 30, 90].map((value) => {\n return (\n <button\n key={`item-${value}`}\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDays === value ? \"brand\" : undefined}\n className={cn(\n \"oui-whitespace-nowrap oui-break-normal\",\n props.filterDays !== value\n ? \"oui-text-base-contrast-54\"\n : \"\",\n )}\n >\n {dayLabel[value] || `${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n props.updateFilterDays(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n\n <AuthGuardDataTable<PositionHistoryExt>\n loading={props.isLoading}\n id=\"oui-desktop-positions-content\"\n columns={column}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: PositionHistoryExt) =>\n `${record.symbol}_${record.position_id}`\n }\n renderRowContainer={(record: any, index: number, children: any) => (\n <SymbolProvider symbol={record.symbol}>{children}</SymbolProvider>\n )}\n manualPagination={false}\n pagination={pagination}\n manualSorting={true}\n onSort={props.onSort}\n initialSort={\n props.initialSort\n ? {\n sortKey: props.initialSort.sortKey,\n sort: props.initialSort.sortOrder,\n }\n : undefined\n }\n features={[TableFeatures.DownloadFeature]}\n getTableInstance={(table) => {\n if (tableRef) {\n (tableRef as any).current = table;\n }\n }}\n testIds={{\n body: \"oui-testid-dataList-positionHistory-tab-body\",\n }}\n classNames={{\n root: \"!oui-h-[calc(100%_-_49px)]\",\n }}\n />\n </Flex>\n );\n};\n\nexport const MobilePositionHistory: FC<\n PositionHistoryState & {\n classNames?: { root?: string; content?: string; cell?: string };\n sharePnLConfig?: SharePnLConfig;\n onExport?: () => void;\n }\n> = (props) => {\n const { t } = useTranslation();\n return (\n <Grid\n cols={1}\n rows={2}\n className=\"oui-w-full oui-grid-rows-[auto,1fr]\"\n gap={1}\n >\n <Flex\n gap={2}\n p={2}\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"oui-rounded-b-xl oui-bg-base-9\"\n >\n <DataFilter\n className=\"oui-border-none oui-py-0\"\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n />\n {props.onExport && (\n <Button\n variant=\"outlined\"\n size=\"xs\"\n color=\"secondary\"\n onClick={props.onExport}\n >\n {t(\"common.export\") || \"Export CSV\"}\n </Button>\n )}\n </Flex>\n <ListView\n className={cn(\n \"oui-hide-scrollbar oui-w-full oui-space-y-0 oui-overflow-y-hidden\",\n props.classNames?.root,\n )}\n contentClassName={cn(\"!oui-space-y-1\", props.classNames?.content)}\n dataSource={props.dataSource}\n renderItem={(item, index) => (\n <SymbolProvider symbol={item.symbol}>\n <PositionHistoryCellWidget\n item={item}\n index={index}\n onSymbolChange={props.onSymbolChange}\n classNames={{\n root: props.classNames?.cell,\n }}\n sharePnLConfig={props.sharePnLConfig}\n />\n </SymbolProvider>\n )}\n />\n </Grid>\n );\n};\n","import { ReactNode } from \"react\";\nimport { useMemo } from \"react\";\nimport {\n useLeverageBySymbol,\n useMaxLeverage,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n Badge,\n Box,\n capitalizeFirstLetter,\n cn,\n Column,\n Flex,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport {\n SharePnLConfig,\n SharePnLDialogId,\n} from \"@kodiak-finance/orderly-ui-share\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\nimport { FundingFeeButton } from \"../../fundingFeeHistory/fundingFeeButton\";\nimport { ShareButtonWidget } from \"../../positions/desktop/shareButton\";\nimport { PositionHistoryExt } from \"../positionHistory.script\";\n\nexport const usePositionHistoryColumn = (props: {\n onSymbolChange?: (symbol: API.Symbol) => void;\n pnlNotionalDecimalPrecision?: number;\n sharePnLConfig?: SharePnLConfig;\n}) => {\n const { onSymbolChange, pnlNotionalDecimalPrecision } = props;\n const { t } = useTranslation();\n\n const column = useMemo(\n () =>\n [\n // instrument\n {\n title: t(\"common.symbol\"),\n dataIndex: \"symbol\",\n fixed: \"left\",\n width: 200,\n onSort: (r1: any, r2: any) => {\n return r1.symbol?.localeCompare(r2.symbol || \"\");\n },\n render: (value: string, record) => (\n <SymbolInfo record={record} onSymbolChange={onSymbolChange} />\n ),\n },\n // quantity\n {\n title: t(\"positions.history.column.closed&maxClosed\"),\n dataIndex: \"close_maxClose\",\n width: 200,\n render: (value: string, record) => <Quantity record={record} />,\n },\n // net pnl\n {\n title: t(\"positions.history.column.netPnl\"),\n dataIndex: \"netPnL\",\n width: 140,\n onSort: (a, b) => {\n if (a.netPnL == null || b.netPnL == null) return -1;\n return (a.netPnL ?? 0) - (b.netPnL ?? 0);\n },\n render: (_: any, record) => (\n <Flex gapX={1}>\n <NetPnL\n record={record}\n pnlNotionalDecimalPrecision={pnlNotionalDecimalPrecision}\n />\n <ShareButtonWidget\n position={record}\n sharePnLConfig={props.sharePnLConfig}\n modalId={SharePnLDialogId}\n isPositionHistory\n />\n </Flex>\n ),\n },\n // avg open\n {\n title: t(\"common.avgPrice\"),\n dataIndex: \"avg_open\",\n width: 140,\n render: (_: any, record) => {\n const avgOpen =\n record.avg_open_price != null\n ? Math.abs(record.avg_open_price)\n : \"--\";\n const { quote_dp } = useSymbolContext();\n return (\n <Text.numeral dp={quote_dp} padding={false}>\n {avgOpen}\n </Text.numeral>\n );\n },\n },\n // avg close\n {\n title: t(\"common.avgClose\"),\n dataIndex: \"avg_close\",\n width: 175,\n render: (_: any, record) => {\n const avgClose =\n record.avg_close_price != null\n ? Math.abs(record.avg_close_price)\n : \"--\";\n const { quote_dp } = useSymbolContext();\n return (\n <Text.numeral dp={quote_dp} padding={false}>\n {avgClose}\n </Text.numeral>\n );\n },\n },\n {\n title: t(\"funding.fundingFee\"),\n dataIndex: \"accumulated_funding_fee\",\n render: (value, record) => {\n return (\n <FundingFeeButton\n fee={-value}\n symbol={record.symbol}\n start_t={record.open_timestamp.toString()}\n end_t={record.close_timestamp?.toString()}\n />\n );\n },\n },\n // time opened\n {\n title: t(\"positions.history.column.timeOpened\"),\n dataIndex: \"open_timestamp\",\n width: 175,\n onSort: true,\n render: (_: any, record) => (\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd HH:mm:ss\">\n {record.open_timestamp}\n </Text.formatted>\n ),\n },\n // time close\n {\n title: t(\"positions.history.column.timeClosed\"),\n dataIndex: \"close_timestamp\",\n width: 175,\n onSort: true,\n render: (_: any, record) => {\n if (record.position_status == \"closed\" && record.close_timestamp) {\n return (\n <Text.formatted\n rule={\"date\"}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n >\n {record.close_timestamp ?? \"--\"}\n </Text.formatted>\n );\n }\n return \"--\";\n },\n },\n // updated time\n {\n title: t(\"positions.history.column.updatedTime\"),\n dataIndex: \"last_update_time\",\n width: 175,\n onSort: true,\n render: (_: any, record) => (\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd HH:mm:ss\">\n {record.last_update_time}\n </Text.formatted>\n ),\n },\n ] as Column<PositionHistoryExt>[],\n [pnlNotionalDecimalPrecision, t],\n );\n\n return column;\n};\n\nexport const SymbolInfo = (props: {\n record: PositionHistoryExt;\n onSymbolChange?: (symbol: API.Symbol) => void;\n}) => {\n const { record, onSymbolChange } = props;\n const { t } = useTranslation();\n\n const tags = useMemo(() => {\n const list: ReactNode[] = [];\n\n const status = record.position_status;\n\n const renderStatus = () => {\n if (status === \"closed\") {\n return t(\"positions.history.status.closed\");\n } else if (status === \"partial_closed\") {\n return t(\"positions.history.status.partialClosed\");\n } else {\n return capitalizeFirstLetter(status.replace(\"_\", \" \"));\n }\n };\n\n list.push(\n <Badge\n key={`status-${status}`}\n color={status !== \"closed\" ? \"primaryLight\" : \"neutral\"}\n size=\"xs\"\n className=\"oui-whitespace-nowrap oui-break-normal\"\n >\n {renderStatus()}\n </Badge>,\n );\n\n if (record.type === \"adl\") {\n list.push(\n <Badge key={`type-${record.type}`} color={\"danger\"} size=\"xs\">\n {t(\"positions.history.type.adl\")}\n </Badge>,\n );\n } else if (record.type === \"liquidated\") {\n list.push(\n <Tooltip\n key={`type-${record.type}`}\n className=\"oui-min-w-[204px] oui-bg-base-5\"\n arrow={{ className: \"oui-fill-base-5\" }}\n content={\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-text-2xs\"\n >\n {record.liquidation_id != null && (\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.liquidated.liquidationId\")}\n </Text>\n <Text intensity={98}>{record.liquidation_id}</Text>\n </Flex>\n )}\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.liquidated.liquidatorFee\")}\n </Text>\n <Text color=\"lose\">\n {record.liquidator_fee > 0 && \"-\"}\n {commifyOptional(record.liquidator_fee)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.liquidated.insFundFee\")}\n </Text>\n <Text color=\"lose\">\n {record.insurance_fund_fee > 0 && \"-\"}\n {commifyOptional(record.insurance_fund_fee)}\n </Text>\n </Flex>\n </Flex>\n }\n >\n <div>\n <Badge size=\"xs\" color=\"danger\" className=\"oui-cursor-pointer\">\n <span className=\"oui-underline oui-decoration-dashed oui-decoration-1\">\n {t(\"positions.history.type.liquidated\")}\n </span>\n </Badge>\n </div>\n </Tooltip>,\n );\n }\n\n list.push(\n <LeverageBadge\n key={`leverage-${record.symbol}`}\n symbol={record.symbol}\n leverage={record.leverage}\n />,\n );\n\n return list;\n }, [record, t]);\n\n return (\n <Flex gap={2} height={48}>\n <Box\n width={4}\n height={38}\n className={cn(\n \"oui-shrink-0 oui-rounded-[1px]\",\n record.side === \"LONG\" ? \"oui-bg-trade-profit\" : \"oui-bg-trade-loss\",\n )}\n />\n\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n <Text.formatted\n // rule={\"symbol\"}\n formatString=\"base-type\"\n className=\"oui-cursor-pointer\"\n onClick={(e) => {\n onSymbolChange?.({ symbol: record.symbol } as API.Symbol);\n e.stopPropagation();\n e.preventDefault();\n }}\n >\n {`${record.symbol.split(\"_\")[1]}-PERP`}\n </Text.formatted>\n <Flex gap={1}>{tags}</Flex>\n </Flex>\n </Flex>\n );\n};\n\nexport const Quantity = (props: { record: PositionHistoryExt }) => {\n const { record } = props;\n\n const { base_dp } = useSymbolContext();\n\n return (\n <Flex\n gap={1}\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-truncate\"\n >\n <Text.numeral dp={base_dp} padding={false}>\n {Math.abs(record.closed_position_qty)}\n </Text.numeral>\n <Text.numeral dp={base_dp} padding={false} className=\"oui-truncate\">\n {Math.abs(record.max_position_qty)}\n </Text.numeral>\n {/* <Text className=\"oui-truncate\">{`${record.symbol.split(\"_\")[1]}`}</Text> */}\n </Flex>\n );\n};\n\nexport const NetPnL = (props: {\n record: PositionHistoryExt;\n pnlNotionalDecimalPrecision?: number;\n}) => {\n const { record, pnlNotionalDecimalPrecision } = props;\n const { t } = useTranslation();\n const netPnl = record.netPnL != null ? record.netPnL : undefined;\n\n const text = () => (\n <Text.numeral\n dp={pnlNotionalDecimalPrecision}\n color={\n record.netPnL != null\n ? record.netPnL > 0\n ? \"profit\"\n : \"lose\"\n : undefined\n }\n className={\n netPnl == null\n ? \"\"\n : \"oui-cursor-pointer oui-border-b oui-border-dashed oui-border-line-12\"\n }\n >\n {netPnl ?? \"--\"}\n </Text.numeral>\n );\n\n if (record.netPnL == null) return text();\n\n return (\n <Tooltip\n // open={record.max_position_qty == 3.22}\n delayDuration={200}\n // @ts-ignore\n content={\n <Flex direction={\"column\"} itemAlign={\"start\"} className=\"oui-text-2xs\">\n <Text intensity={80}>{t(\"positions.history.column.netPnl\")}</Text>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>{t(\"common.realizedPnl\")}</Text>\n <Text\n color={record.realized_pnl >= 0 ? \"profit\" : \"lose\"}\n className=\"oui-cursor-pointer\"\n >\n {commifyOptional(record.realized_pnl)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>{t(\"funding.fundingFee\")}</Text>\n <Text\n color={record.accumulated_funding_fee > 0 ? \"lose\" : \"profit\"}\n className=\"oui-cursor-pointer\"\n >\n {commifyOptional(-record.accumulated_funding_fee)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.netPnl.tradingFee\")}\n </Text>\n <Text\n color={record.trading_fee > 0 ? \"lose\" : \"profit\"}\n className=\"oui-cursor-pointer\"\n >\n {commifyOptional(-record.trading_fee)}\n </Text>\n </Flex>\n </Flex>\n }\n className=\"oui-min-w-[204px] oui-bg-base-5\"\n arrow={{\n className: \"oui-fill-base-5\",\n }}\n >\n <div>{text()}</div>\n </Tooltip>\n );\n};\n\nconst LeverageBadge = (props: { symbol: string; leverage: number }) => {\n const { symbol, leverage } = props;\n\n return (\n <Badge color=\"neutral\" size=\"xs\">\n {leverage ? (\n <Text.numeral dp={0} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n ) : (\n <LeverageDisplay symbol={symbol} />\n )}\n </Badge>\n );\n};\n\nconst LeverageDisplay = ({ symbol }: { symbol: string }) => {\n const leverage = useMaxLeverage(symbol);\n\n return (\n <Text.numeral dp={0} size=\"2xs\" unit=\"X\">\n {leverage}\n </Text.numeral>\n );\n};\n","import { FC } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { Divider, Flex, Grid, modal, Text } from \"@kodiak-finance/orderly-ui\";\nimport { SharePnLBottomSheetId } from \"@kodiak-finance/orderly-ui-share\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\nimport { ShareButtonWidget } from \"../../positions/desktop/shareButton\";\nimport {\n PositionHistoryType,\n ClosedQty,\n SymbolToken,\n OpenTime,\n AvgOpen,\n AvgClosed,\n ClosedTime,\n MaxClosedQty,\n FundingFee,\n} from \"./items\";\nimport { PositionHistoryCellState } from \"./positionHistoryCell.script\";\n\nexport const PositionHistoryCell: FC<PositionHistoryCellState> = (props) => {\n return (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n itemAlign={\"start\"}\n className={props.classNames?.root}\n >\n <Header {...props} />\n <Divider intensity={6} className=\"oui-w-full\" />\n <Body {...props} />\n </Flex>\n );\n};\n\nexport const Header: FC<PositionHistoryCellState> = (props) => {\n const { t } = useTranslation();\n\n const showAlert = () => {\n const { item: record } = props;\n\n modal.alert({\n title: t(\"positions.history.column.netPnl\"),\n message: (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n className=\"oui-text-2xs oui-text-base-contrast-54\"\n >\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>{t(\"common.realizedPnl\")}</Text>\n <Text color={record.realized_pnl >= 0 ? \"profit\" : \"lose\"}>\n {commifyOptional(record.realized_pnl)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>{t(\"funding.fundingFee\")}</Text>\n <Text\n color={record.accumulated_funding_fee > 0 ? \"lose\" : \"profit\"}\n >\n {commifyOptional(-record.accumulated_funding_fee)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"} gap={2}>\n <Text intensity={54}>\n {t(\"positions.history.netPnl.tradingFee\")}\n </Text>\n <Text color={record.trading_fee > 0 ? \"lose\" : \"profit\"}>\n {commifyOptional(-record.trading_fee)}\n </Text>\n </Flex>\n </Flex>\n ),\n });\n };\n\n return (\n <Flex gap={1} width={\"100%\"}>\n <Flex\n direction={\"column\"}\n itemAlign={\"start\"}\n className=\"oui-flex-1\"\n gap={1}\n >\n <SymbolToken {...props} />\n <PositionHistoryType {...props} />\n </Flex>\n <Flex direction={\"column\"} itemAlign={\"end\"} className=\"oui-flex-1\">\n <Text size=\"2xs\" intensity={36}>\n {t(\"positions.history.column.netPnl\")}\n </Text>\n <Flex gapX={1}>\n <button onClick={showAlert}>\n <Text.numeral size=\"xs\" coloring>\n {props.item.netPnL ?? \"--\"}\n </Text.numeral>\n </button>\n\n <ShareButtonWidget\n position={props.item}\n sharePnLConfig={props.sharePnLConfig}\n modalId={SharePnLBottomSheetId}\n iconSize={12}\n isPositionHistory\n />\n </Flex>\n </Flex>\n </Flex>\n );\n};\n\nexport const Body: FC<PositionHistoryCellState> = (props) => {\n return (\n <div className=\"oui-w-full\">\n <Grid\n cols={3}\n rows={2}\n width={\"100%\"}\n gap={0}\n className=\"oui-grid-cols-[1fr,1fr,135px]\"\n >\n <ClosedQty {...props} />\n <MaxClosedQty {...props} />\n <OpenTime {...props} />\n <AvgOpen {...props} />\n <AvgClosed {...props} />\n <ClosedTime {...props} />\n </Grid>\n <FundingFee {...props} />\n </div>\n );\n};\n","import { FC, ReactNode, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n Badge,\n capitalizeFirstLetter,\n Flex,\n modal,\n Statistic,\n Text,\n} from \"@kodiak-finance/orderly-ui\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\nimport { FundingFeeButton } from \"../../fundingFeeHistory/fundingFeeButton\";\nimport { PositionHistorySide } from \"../positionHistory.script\";\nimport { PositionHistoryCellState } from \"./positionHistoryCell.script\";\n\nexport const SymbolToken: FC<PositionHistoryCellState> = (props) => {\n const { side, symbol } = props.item;\n const { t } = useTranslation();\n const isBuy = side === PositionHistorySide.buy;\n\n return (\n <Text.formatted\n intensity={80}\n rule=\"symbol\"\n formatString=\"base-type\"\n size=\"sm\"\n // @ts-ignore\n prefix={\n <Badge color={isBuy ? \"success\" : \"danger\"} size=\"xs\">\n {isBuy ? t(\"common.buy\") : t(\"common.sell\")}\n </Badge>\n }\n onClick={() => {\n props.onSymbolChange?.({ symbol: symbol } as API.Symbol);\n }}\n // showIcon\n >\n {symbol}\n </Text.formatted>\n );\n};\n\nexport const Time: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n\n return (\n <Text.formatted\n rule={\"date\"}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n intensity={36}\n size=\"2xs\"\n >\n {item.last_update_time}\n </Text.formatted>\n );\n};\n\nexport const PositionHistoryType: FC<PositionHistoryCellState> = (props) => {\n const { item: record } = props;\n const { t } = useTranslation();\n\n const showAlert = () => {\n modal.alert({\n title: t(\"positions.liquidation\"),\n message: (\n <Flex\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n className=\"oui-text-2xs oui-text-base-contrast-54\"\n >\n {record.liquidation_id != null && (\n <Flex justify={\"between\"} width={\"100%\"}>\n <Text>{t(\"positions.history.liquidated.liquidationId\")}</Text>\n <Text intensity={98}>{record.liquidation_id}</Text>\n </Flex>\n )}\n <Flex justify={\"between\"} width={\"100%\"}>\n <Text>{t(\"positions.history.liquidated.liquidatorFee\")}</Text>\n <Text color=\"lose\">\n {record.liquidator_fee > 0 && \"-\"}\n {commifyOptional(record.liquidator_fee)}\n </Text>\n </Flex>\n <Flex justify={\"between\"} width={\"100%\"}>\n <Text>{t(\"positions.history.liquidated.insFundFee\")}</Text>\n <Text color=\"lose\">\n {record.insurance_fund_fee > 0 && \"-\"}\n {commifyOptional(record.insurance_fund_fee)}\n </Text>\n </Flex>\n </Flex>\n ),\n });\n };\n\n const tags = useMemo(() => {\n const list: ReactNode[] = [];\n\n const status = record.position_status;\n\n const renderStatus = () => {\n if (status === \"closed\") {\n return t(\"positions.history.status.closed\");\n } else if (status === \"partial_closed\") {\n return t(\"positions.history.status.partialClosed\");\n } else {\n return capitalizeFirstLetter(status.replace(\"_\", \" \"));\n }\n };\n\n list.push(\n <Badge\n key={1}\n color={status !== \"closed\" ? \"primaryLight\" : \"neutral\"}\n size=\"xs\"\n >\n {renderStatus()}\n </Badge>,\n );\n\n if (record.type === \"adl\") {\n list.push(\n <Badge key={2} color={\"danger\"} size=\"xs\">\n {t(\"positions.history.type.adl\")}\n </Badge>,\n );\n } else if (record.type === \"liquidated\") {\n list.push(\n <Badge\n key={3}\n size=\"xs\"\n color=\"danger\"\n className=\"oui-cursor-pointer\"\n onClick={showAlert}\n >\n <span className=\"oui-underline oui-decoration-dashed oui-decoration-1\">\n {/* {capitalizeFirstLetter(record.type)} */}\n {t(\"positions.history.type.liquidated\")}\n </span>\n </Badge>,\n );\n }\n\n return list;\n }, [record]);\n\n return <Flex gap={1}>{tags}</Flex>;\n};\n\nexport const ClosedQty: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n const closedQty =\n item.closed_position_qty != null\n ? Math.abs(item.closed_position_qty)\n : \"--\";\n\n return (\n <Statistic\n // label={\n // <Text>Closed{<Text intensity={20}>{` (${props.base})`}</Text>}</Text>\n // }\n label={<Text>{t(\"positions.history.column.closed\")}</Text>}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.base_dp} padding={false} coloring intensity={80}>\n {closedQty}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const MaxClosedQty: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n const maxClosedQty =\n item.max_position_qty != null ? Math.abs(item.max_position_qty) : \"--\";\n return (\n <Statistic\n // label={\n // <Text>\n // Max closed{<Text intensity={20}>{` (${props.base})`}</Text>}\n // </Text>\n // }\n label={<Text>{t(\"positions.history.column.maxClosed\")}</Text>}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.base_dp} padding={false} coloring intensity={80}>\n {maxClosedQty}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const AvgOpen: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const avgOpen =\n item.avg_open_price != null ? Math.abs(item.avg_open_price) : \"--\";\n const { t } = useTranslation();\n return (\n <Statistic\n label={\n <Flex gap={1}>\n {t(\"common.avgOpen\")}\n <Text intensity={20}>(USDC)</Text>\n </Flex>\n }\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} padding={false} coloring intensity={80}>\n {avgOpen}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const AvgClosed: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const avgClose =\n item.avg_close_price != null ? Math.abs(item.avg_close_price) : \"--\";\n const { t } = useTranslation();\n return (\n <Statistic\n label={\n <Flex gap={1}>\n {t(\"common.avgClose\")}\n <Text intensity={20}>(USDC)</Text>\n </Flex>\n }\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n >\n <Text.numeral dp={props.quote_dp} padding={false} coloring intensity={80}>\n {avgClose}\n </Text.numeral>\n </Statistic>\n );\n};\n\nexport const OpenTime: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n return (\n <Statistic\n label={<Text>{t(\"positions.history.column.timeOpened\")}</Text>}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n align=\"end\"\n >\n <Text.formatted\n intensity={80}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n rule={\"date\"}\n >\n {item.open_timestamp}\n </Text.formatted>\n </Statistic>\n );\n};\nexport const ClosedTime: FC<PositionHistoryCellState> = (props) => {\n const { item } = props;\n const { t } = useTranslation();\n\n const child =\n item.position_status == \"closed\" && item.close_timestamp ? (\n <Text.formatted\n intensity={80}\n formatString=\"yyyy-MM-dd HH:mm:ss\"\n rule={\"date\"}\n >\n {item.close_timestamp}\n </Text.formatted>\n ) : (\n \"--\"\n );\n\n return (\n <Statistic\n label={<Text>{t(\"positions.history.column.timeClosed\")}</Text>}\n classNames={{\n root: \"oui-text-xs\",\n label: \"oui-text-2xs\",\n }}\n align=\"end\"\n >\n {child}\n </Statistic>\n );\n};\n\nexport const FundingFee: FC<PositionHistoryCellState> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex\n justify={\"end\"}\n className=\"oui-text-2xs oui-w-full oui-py-2 oui-gap-1 oui-gap-1\"\n >\n <Text intensity={36}>{t(\"funding.fundingFee\")}: </Text>\n <FundingFeeButton\n fee={-props.item.accumulated_funding_fee}\n symbol={props.item.symbol}\n start_t={props.item.open_timestamp.toString()}\n end_t={props.item.close_timestamp?.toString()}\n />\n </Flex>\n );\n};\n","import { useEffect, useMemo, useState } from \"react\";\nimport { differenceInDays, setDate, setHours, subDays } from \"date-fns\";\nimport {\n useAccount,\n usePrivateQuery,\n useSymbolsInfo,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { AccountStatusEnum } from \"@kodiak-finance/orderly-types\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { TRADING_POSITIONS_SORT_STORAGE_KEY } from \"../../constants\";\nimport {\n areDatesEqual,\n formatDatePickerRange,\n offsetEndOfDay,\n offsetStartOfDay,\n} from \"../../utils\";\nimport { useSort } from \"../../utils/sorting\";\nimport { useTabSort, PositionsTabName } from \"../shared/hooks/useTabSort\";\nimport { PositionHistoryProps } from \"./positionHistory.widget\";\n\nexport type PositionHistoryExt = API.PositionHistory & {\n netPnL?: number;\n};\n\nexport enum PositionHistorySide {\n all = \"all\",\n buy = \"LONG\",\n sell = \"SHORT\",\n}\nexport enum PositionHistoryStatus {\n all = \"all\",\n closed = \"closed\",\n partial_closed = \"partial_closed\",\n}\n\nexport const usePositionHistoryScript = (props: PositionHistoryProps) => {\n const {\n onSymbolChange,\n symbol,\n pnlNotionalDecimalPrecision,\n enableSortingStorage = true,\n } = props;\n const { state } = useAccount();\n\n // Sorting functionality\n const { tabSort, onTabSort } = useTabSort({\n storageKey: TRADING_POSITIONS_SORT_STORAGE_KEY,\n });\n\n const { onSort, getSortedList } = useSort(\n enableSortingStorage\n ? tabSort?.[PositionsTabName.PositionHistory]\n : undefined,\n enableSortingStorage\n ? onTabSort(PositionsTabName.PositionHistory)\n : undefined,\n );\n\n const { data, isLoading } = usePrivateQuery<PositionHistoryExt[]>(\n symbol\n ? `/v1/position_history?symbol=${symbol}&limit=1000`\n : \"/v1/position_history?limit=1000\",\n {\n formatter(data) {\n return (data.rows ?? null)?.map(\n (item: API.PositionHistory): PositionHistoryExt => {\n if (\n item.realized_pnl != null &&\n item.accumulated_funding_fee != null &&\n item.trading_fee != null\n ) {\n const netPnL =\n item.realized_pnl -\n item.accumulated_funding_fee -\n item.trading_fee;\n return {\n ...item,\n netPnL: netPnL,\n };\n }\n return item;\n },\n );\n },\n revalidateOnFocus: true,\n },\n );\n\n const { pagination, setPage } = usePagination({\n pageSize: 10,\n });\n\n const {\n status,\n side,\n dateRange,\n filterDays,\n updateFilterDays,\n filterItems,\n onFilter,\n } = useFilter();\n\n useEffect(() => {\n setPage(1);\n }, [status, side, dateRange, filterDays, symbol]);\n\n const filterData = useMemo(() => {\n if (data == null) return data;\n\n return data.filter((item) => {\n const sideFilter =\n side === PositionHistorySide.all\n ? true\n : item.side.toLowerCase() === side.toLowerCase();\n const statusFilter =\n status === PositionHistoryStatus.all\n ? true\n : item.position_status.toLowerCase() === status.toLowerCase();\n\n // const time = item.close_timestamp ?? item?.last_update_timestamp ?? item.open_timestamp;\n const time = item?.last_update_time ?? item.open_timestamp;\n const dateFilter =\n dateRange.from && dateRange.to\n ? time >= dateRange.from.getTime() && time <= dateRange.to.getTime()\n : true;\n\n const symbolFilter = symbol ? item.symbol == symbol : true;\n\n return sideFilter && statusFilter && dateFilter && symbolFilter;\n });\n }, [status, side, dateRange, data, symbol]);\n\n const rawDataSource = useDataTap(filterData, {\n accountStatus:\n state.status === AccountStatusEnum.EnableTradingWithoutConnected\n ? AccountStatusEnum.EnableTradingWithoutConnected\n : AccountStatusEnum.EnableTrading,\n fallbackData: [],\n });\n\n const dataSource = getSortedList(rawDataSource || []);\n\n return {\n dataSource,\n isLoading,\n onSymbolChange,\n pagination,\n filterItems,\n onFilter,\n symbol,\n filterDays,\n updateFilterDays,\n pnlNotionalDecimalPrecision,\n onSort,\n initialSort: enableSortingStorage\n ? tabSort?.[PositionsTabName.PositionHistory]\n : undefined,\n };\n};\n\nconst useFilter = () => {\n const { t } = useTranslation();\n\n const [status, setStatus] = useState<PositionHistoryStatus>(\n PositionHistoryStatus.all,\n );\n const [side, setSide] = useState<PositionHistorySide>(\n PositionHistorySide.all,\n );\n const defaultRange = formatDatePickerRange({\n to: offsetEndOfDay(new Date()),\n from: offsetStartOfDay(subDays(new Date(), 89)),\n });\n\n /// default is 90d\n const [filterDays, setFilterDays] = useState<1 | 7 | 30 | 90 | null>(90);\n\n const [dateRange, setDateRange] = useState<{\n from?: Date;\n to?: Date;\n }>(defaultRange);\n\n const updateFilterDays = (days: 1 | 7 | 30 | 90) => {\n setFilterDays(days);\n setDateRange({\n from: offsetStartOfDay(subDays(new Date(), days - 1)),\n to: offsetEndOfDay(new Date()),\n });\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"side\") {\n setSide(filter.value);\n }\n\n if (filter.name === \"status\") {\n setStatus(filter.value);\n }\n\n if (filter.name === \"dateRange\") {\n const newDateRange = formatDatePickerRange(filter.value);\n setDateRange(newDateRange);\n if (newDateRange.from && newDateRange.to) {\n const diffDays =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n const dateRangeMap: { [key: number]: { from: Date; to: Date } } = {\n 1: {\n from: offsetStartOfDay(new Date())!,\n to: offsetEndOfDay(new Date())!,\n },\n 7: {\n from: offsetStartOfDay(subDays(new Date(), 6))!,\n to: offsetEndOfDay(new Date())!,\n },\n 30: {\n from: offsetStartOfDay(subDays(new Date(), 29))!,\n to: offsetEndOfDay(new Date())!,\n },\n 90: {\n from: offsetStartOfDay(subDays(new Date(), 89))!,\n to: offsetEndOfDay(new Date())!,\n },\n };\n\n const dateRange = dateRangeMap[diffDays];\n if (\n dateRange &&\n areDatesEqual(dateRange.from, newDateRange.from) &&\n areDatesEqual(dateRange.to, newDateRange.to)\n ) {\n setFilterDays(diffDays as any);\n } else {\n setFilterDays(null);\n }\n }\n }\n };\n\n const { isMobile } = useScreen();\n\n const filterItems = useMemo((): any[] => {\n const sideFilter = {\n type: \"select\",\n name: \"side\",\n options: [\n {\n label: t(\"common.side.all\"),\n value: \"all\",\n },\n {\n label: t(\"common.buy\"),\n value: PositionHistorySide.buy,\n },\n {\n label: t(\"common.sell\"),\n value: PositionHistorySide.sell,\n },\n ],\n value: side,\n };\n\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n fromDate: offsetStartOfDay(subDays(new Date(), 89)),\n toDate: offsetEndOfDay(new Date()),\n };\n\n const statusFilter = {\n type: \"select\",\n name: \"status\",\n options: [\n {\n label: t(\"common.status.all\"),\n value: \"all\",\n },\n {\n label: t(\"positions.history.status.closed\"),\n value: PositionHistoryStatus.closed,\n },\n {\n label: t(\"positions.history.status.partialClosed\"),\n value: PositionHistoryStatus.partial_closed,\n },\n ],\n value: status,\n };\n\n if (isMobile) {\n return [sideFilter, statusFilter];\n }\n return [sideFilter, statusFilter, dateRangeFilter];\n }, [side, status, dateRange]);\n\n return {\n filterItems,\n onFilter,\n side,\n dateRange,\n status,\n filterDays,\n updateFilterDays,\n };\n};\n\nexport type PositionHistoryState = ReturnType<typeof usePositionHistoryScript>;\n","import { differenceInDays, setDate, setHours, subDays } from \"date-fns\";\n\nexport const parseDateRangeForFilter = (dateRange: {\n from: Date;\n to?: Date;\n}) => {\n let { from, to } = dateRange;\n\n if (typeof to === \"undefined\") {\n to = new Date();\n }\n\n const diff = differenceInDays(from, to);\n\n // console.log(\"diff\", diff);\n\n if (diff === 0) {\n return [from, setHours(to, 23)];\n }\n\n return [from, to];\n};\n\nexport function offsetStartOfDay(date?: Date) {\n if (date == null) return date;\n\n const newDate = new Date(date);\n newDate.setHours(0, 0, 0, 0);\n return newDate;\n}\n\nexport function offsetEndOfDay(date?: Date) {\n if (date == null) return date;\n\n const newDate = new Date(date);\n newDate.setHours(23, 59, 59, 999);\n return newDate;\n}\n\nexport const formatDatePickerRange = (option: { from?: Date; to?: Date }) => ({\n from: offsetStartOfDay(option.from),\n to: offsetEndOfDay(option.to ?? option.from),\n});\n\nexport const areDatesEqual = (date1: Date, date2: Date): boolean => {\n return date1.getTime() === date2.getTime();\n};\n","import { API } from \"@kodiak-finance/orderly-types\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\nimport { useSymbolContext } from \"../../../provider/symbolContext\";\nimport { PositionHistoryExt } from \"../positionHistory.script\";\n\nexport const usePositionHistoryCellScript = (props: {\n item: PositionHistoryExt;\n onSymbolChange?: (symbol: API.Symbol) => void;\n index: number;\n classNames?: {\n root?: string;\n };\n sharePnLConfig?: SharePnLConfig;\n}) => {\n const symbolInfo = useSymbolContext();\n\n return {\n ...props,\n ...symbolInfo,\n };\n};\n\nexport type PositionHistoryCellState = ReturnType<\n typeof usePositionHistoryCellScript\n>;\n","import { API } from \"@kodiak-finance/orderly-types\";\nimport { PositionHistoryExt } from \"../positionHistory.script\";\nimport { usePositionHistoryCellScript } from \"./positionHistoryCell.script\";\nimport { PositionHistoryCell } from \"./positionHistoryCell.ui\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\n\nexport const PositionHistoryCellWidget = (props: {\n item: PositionHistoryExt;\n onSymbolChange?: (symbol: API.Symbol) => void;\n index: number;\n classNames?: {\n root?: string;\n };\n sharePnLConfig?: SharePnLConfig;\n}) => {\n const state = usePositionHistoryCellScript(props);\n return <PositionHistoryCell {...state} />;\n};\n","import React, { forwardRef } from \"react\";\nimport type { API } from \"@kodiak-finance/orderly-types\";\nimport { Table } from \"@kodiak-finance/orderly-ui\";\nimport { SharePnLConfig } from \"@kodiak-finance/orderly-ui-share\";\nimport { usePositionHistoryScript } from \"./positionHistory.script\";\nimport { MobilePositionHistory, PositionHistory } from \"./positionHistory.ui\";\n\nexport type PositionHistoryProps = {\n onSymbolChange?: (symbol: API.Symbol) => void;\n symbol?: string;\n pnlNotionalDecimalPrecision?: number;\n sharePnLConfig?: SharePnLConfig;\n enableSortingStorage?: boolean; // Controls whether to persist sorting preferences\n};\n\nexport type PositionHistoryInstance = {\n getRowCount?: () => number;\n getDataSource?: () => any[] | null;\n};\n\nexport const PositionHistoryWidget = forwardRef<\n PositionHistoryInstance,\n PositionHistoryProps\n>((props, ref) => {\n const state = usePositionHistoryScript(props);\n const tableRef = React.useRef<Table<any>>(null);\n\n React.useImperativeHandle(\n ref,\n () => ({\n getRowCount: () => {\n return tableRef.current?.getRowCount?.() ?? 0;\n },\n getDataSource: () => {\n return state.dataSource ?? null;\n },\n }),\n [state.dataSource],\n );\n\n return (\n <PositionHistory\n {...state}\n sharePnLConfig={props.sharePnLConfig}\n tableRef={tableRef}\n />\n );\n});\n\nPositionHistoryWidget.displayName = \"PositionHistoryWidget\";\n\nexport const MobilePositionHistoryWidget = React.forwardRef<\n PositionHistoryInstance,\n PositionHistoryProps & {\n classNames?: { root?: string; content?: string; cell?: string };\n onExport?: () => void;\n }\n>((props, ref) => {\n const { classNames, onExport, ...rest } = props;\n const state = usePositionHistoryScript(rest);\n\n React.useImperativeHandle(\n ref,\n () => ({\n getRowCount: () => {\n return state.dataSource?.length ?? 0;\n },\n getDataSource: () => {\n return state.dataSource ?? null;\n },\n }),\n [state.dataSource],\n );\n\n return (\n <MobilePositionHistory\n {...state}\n classNames={classNames}\n sharePnLConfig={props.sharePnLConfig}\n onExport={onExport}\n />\n );\n});\n","import { FC, useState } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport {\n Button,\n cn,\n DataFilter,\n Flex,\n Grid,\n ListView,\n Text,\n Tooltip,\n} from \"@kodiak-finance/orderly-ui\";\nimport { AuthGuardDataTable } from \"@kodiak-finance/orderly-ui-connector\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\nimport { useLiquidationColumn } from \"./desktop/useLiquidationColumn\";\nimport { LiquidationState } from \"./liquidation.script\";\nimport { LiquidationCellWidget } from \"./mobile\";\n\nexport const Liquidation: FC<LiquidationState> = (props) => {\n const [expanded, setExpanded] = useState({});\n const column = useLiquidationColumn({});\n\n return (\n <Flex direction=\"column\" width=\"100%\" height=\"100%\" itemAlign=\"start\">\n {/* <Divider className=\"oui-w-full\" /> */}\n <Flex gap={3}>\n {props.filterItems.length > 0 && (\n <DataFilter\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n />\n )}\n {[1, 7, 30, 90].map((value) => {\n return (\n <button\n key={`item-${value}`}\n className=\"oui-relative oui-px-2 oui-py-[2px] oui-text-sm\"\n >\n <div className=\"oui-z-10\">\n <Text.gradient\n color={props.filterDays === value ? \"brand\" : undefined}\n className={\n props.filterDays !== value\n ? \"oui-text-base-contrast-54\"\n : \"\"\n }\n >\n {`${value}D`}\n </Text.gradient>\n </div>\n <div\n className=\"oui-absolute oui-inset-0 oui-rounded oui-opacity-[.12] oui-gradient-primary\"\n onClick={() => {\n props.updateFilterDays(value as any);\n }}\n ></div>\n </button>\n );\n })}\n </Flex>\n\n <AuthGuardDataTable<API.Liquidation>\n loading={props.isLoading}\n id=\"oui-desktop-liquidation-content\"\n columns={column}\n bordered\n dataSource={props.dataSource}\n generatedRowKey={(record: API.Liquidation) =>\n `${record.liquidation_id}`\n }\n // manualPagination={false}\n pagination={props.pagination}\n testIds={{\n body: \"oui-testid-dataList-liquidation-tab-body\",\n }}\n classNames={{\n root: \"!oui-h-[calc(100%_-_49px)]\",\n }}\n // onRow={(record, index, row) => {\n // return {\n // className: \"[&>td:first-child]:oui-pl-0 [&>td:last-child]:oui-pr-0\",\n // };\n // }}\n expanded={expanded}\n onExpandedChange={setExpanded}\n getRowCanExpand={() => true}\n expandRowRender={(record) => {\n return <LiquidationDetails record={record.original} />;\n }}\n />\n </Flex>\n );\n};\n\nconst TooltipHeaderCell: FC<{\n tooltip: string;\n label: string;\n side?: \"left\";\n}> = (props) => {\n return (\n <th className=\"oui-h-10 oui-border-b oui-border-line oui-text-left oui-text-base-contrast-36\">\n <Tooltip\n content={props.tooltip}\n className=\"oui-w-[275px] oui-bg-base-6\"\n side={props.side}\n arrow={{\n className: \"oui-fill-base-6\",\n }}\n >\n <button className=\"oui-border-b oui-border-dashed oui-border-line-12\">\n {props.label}\n </button>\n </Tooltip>\n </th>\n );\n};\n\nconst LiquidationDetails: FC<{\n record: API.Liquidation;\n}> = (props) => {\n const { margin_ratio, account_mmr, collateral_value, position_notional } =\n props.record as any;\n\n const { t } = useTranslation();\n\n return (\n <div className=\"oui-w-full oui-bg-base-8 oui-px-6\">\n {/* <pre>{JSON.stringify(props.record, null, 2)}</pre> */}\n\n <table className=\"oui-w-full\">\n <thead>\n <tr>\n <TooltipHeaderCell\n tooltip={t(\"positions.Liquidation.expand.tooltip.mr\")}\n label={t(\"positions.Liquidation.expand.label.mr\")}\n side=\"left\"\n />\n <TooltipHeaderCell\n tooltip={t(\"positions.Liquidation.expand.tooltip.mmr\")}\n label={t(\"positions.Liquidation.expand.label.mmr\")}\n />\n <TooltipHeaderCell\n tooltip={t(\"positions.Liquidation.expand.tooltip.collateral\")}\n label={t(\"positions.Liquidation.expand.label.collateral\")}\n />\n <TooltipHeaderCell\n tooltip={t(\"positions.Liquidation.expand.tooltip.notional\")}\n label={t(\"positions.Liquidation.expand.label.notional\")}\n />\n </tr>\n </thead>\n <tbody>\n <tr>\n <td className=\"oui-h-10\">\n <Text.numeral rule=\"percentages\">{margin_ratio}</Text.numeral>\n </td>\n <td className=\"oui-h-10\">\n <Text.numeral rule=\"percentages\">{account_mmr}</Text.numeral>\n </td>\n <td className=\"oui-h-10\">{commifyOptional(collateral_value)}</td>\n <td className=\"oui-h-10\">{commifyOptional(position_notional)}</td>\n </tr>\n </tbody>\n </table>\n </div>\n );\n};\n\nexport const MobileLiquidation: FC<\n LiquidationState & {\n classNames?: {\n root?: string;\n content?: string;\n cell?: string;\n };\n onExport?: () => void;\n }\n> = (props) => {\n const { t } = useTranslation();\n return (\n <Grid\n cols={1}\n rows={2}\n className=\"oui-w-full oui-grid-rows-[auto,1fr]\"\n gap={1}\n >\n <Flex\n gap={2}\n p={2}\n justify={\"between\"}\n itemAlign={\"center\"}\n className=\"oui-rounded-b-xl oui-bg-base-9\"\n >\n <DataFilter\n className=\"oui-border-none oui-py-0\"\n items={props.filterItems}\n onFilter={(value: any) => {\n props.onFilter(value);\n }}\n />\n {props.onExport && (\n <Button\n variant=\"outlined\"\n size=\"xs\"\n color=\"secondary\"\n onClick={props.onExport}\n >\n {t(\"common.export\") || \"Export CSV\"}\n </Button>\n )}\n </Flex>\n <ListView\n className={cn(\n \"oui-hide-scrollbar oui-w-full oui-space-y-0 oui-overflow-y-hidden\",\n props.classNames?.root,\n )}\n contentClassName={cn(\"!oui-space-y-1\", props.classNames?.content)}\n dataSource={props.dataSource}\n loadMore={props.loadMore}\n renderItem={(item, index) => (\n <LiquidationCellWidget\n item={item}\n index={index}\n classNames={{\n root: props.classNames?.cell,\n }}\n />\n )}\n />\n </Grid>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { Column, Flex, Text, Tooltip } from \"@kodiak-finance/orderly-ui\";\nimport { commifyOptional } from \"@kodiak-finance/orderly-utils\";\n\nconst TooltipButton: FC<{\n tooltip: string;\n label: string;\n}> = (props) => {\n return (\n <Tooltip\n className=\"oui-w-[275px] oui-bg-base-6\"\n content={props.tooltip}\n arrow={{\n className: \"oui-fill-base-6\",\n }}\n >\n <button className=\"oui-border-b oui-border-dashed oui-border-line-12\">\n {props.label}\n </button>\n </Tooltip>\n );\n};\n\nexport const useLiquidationColumn = (props: {}) => {\n const { t } = useTranslation();\n\n const column = useMemo(\n () =>\n [\n // Time\n {\n title: t(\"common.time\"),\n dataIndex: \"timestamp\",\n width: 202,\n render: (value: string) => (\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd HH:mm:ss\">\n {value}\n </Text.formatted>\n ),\n },\n // Liquidation id\n {\n title: t(\"positions.Liquidation.column.liquidationId\"),\n dataIndex: \"liquidation_id\",\n width: 120,\n render: (value) => <Text>{value}</Text>,\n },\n // Symbol\n {\n title: t(\"common.symbol\"),\n dataIndex: \"Symbol\",\n // width: 202,\n render: (_: any, record) => (\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n {record.positions_by_perp?.map((item) => (\n <Text.formatted\n rule={\"symbol\"}\n formatString=\"base-quote\"\n key={item.symbol}\n >\n {item.symbol}\n </Text.formatted>\n ))}\n </Flex>\n ),\n },\n // Price (USDC)\n {\n title: t(\"positions.Liquidation.column.markPrice\"),\n dataIndex: \"Price_(USDC)\",\n // width: 202,\n render: (_: any, record) => {\n return (\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n {record.positions_by_perp?.map((item) => (\n // <SymbolProvider symbol={item.symbol}>\n // </SymbolProvider>\n <FormattedText\n value={item.mark_price}\n type=\"quote\"\n key={item.symbol}\n />\n ))}\n </Flex>\n );\n },\n },\n // Quantity\n {\n title: t(\"common.quantity\"),\n dataIndex: \"Quantity\",\n // width: 202,\n render: (_: any, record) => {\n return (\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n {record.positions_by_perp?.map((item) => (\n // <SymbolProvider symbol={item.symbol}>\n // </SymbolProvider>\n <FormattedText\n value={item.position_qty}\n type=\"base\"\n key={item.symbol}\n />\n ))}\n </Flex>\n );\n },\n },\n\n // net pnl\n // {\n // title: t(\"positions.Liquidation.column.insFundTransfer\"),\n // dataIndex: \"transfer_amount_to_insurance_fund\",\n // width: 202,\n // render: (value) => {\n // return <Text>{commifyOptional(value)}</Text>;\n // },\n // },\n // Liquidation fee rate\n // TODO: use i18\n {\n title: (\n <TooltipButton\n tooltip={t(\"positions.Liquidation.col.tooltip.feeRate\")}\n label={t(\"positions.Liquidation.column.liquidationFeeRate\")}\n />\n ),\n dataIndex: \"liquidationFeeRate\",\n // width: 202,\n render: (value) => {\n return <Text.numeral rule=\"percentages\">{value}</Text.numeral>;\n // return <Text>{commifyOptional(value)}</Text>;\n },\n },\n\n // Liquidation Fee\n {\n title: (\n <TooltipButton\n tooltip={t(\"positions.Liquidation.col.tooltip.fee\")}\n label={t(\"positions.Liquidation.column.liquidationFee\")}\n />\n ),\n dataIndex: \"abs_liquidation_fee\",\n width: 100,\n render: (abs_liquidation_fee: any, record) => {\n return (\n <Flex direction={\"column\"} itemAlign={\"start\"}>\n {record.positions_by_perp?.map((item) => (\n // <SymbolProvider symbol={item.symbol}>\n // </SymbolProvider>\n <FormattedText\n key={item.symbol}\n value={item.abs_liquidation_fee}\n type=\"quote\"\n />\n ))}\n </Flex>\n );\n },\n },\n {\n title: \"\",\n dataIndex: \"actions\",\n align: \"right\",\n width: 40,\n render: (_: any, record: API.Liquidation, index, ctx) => {\n const isExpanded = ctx.row.getIsExpanded();\n\n return (\n <button\n className=\"oui-p-2\"\n onClick={() => {\n ctx.row.getToggleExpandedHandler()();\n }}\n >\n <ArrowIcon className={isExpanded ? \"oui-rotate-180\" : \"\"} />\n </button>\n );\n },\n },\n ] as Column<API.Liquidation>[],\n [t],\n );\n\n return column;\n};\n\nconst FormattedText: FC<{ value?: string | number; type: \"base\" | \"quote\" }> = (\n props,\n) => {\n return <Text>{commifyOptional(props.value)}</Text>;\n};\n\nconst ArrowIcon: FC<{\n className?: string;\n onClick?: () => void;\n}> = (props) => {\n return (\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 16 16\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n className={props.className}\n >\n <path\n d=\"M3.884 6.02a.67.67 0 0 0-.436.27.68.68 0 0 0 .187.933L7.63 9.88a.68.68 0 0 0 .749 0l3.994-2.657a.68.68 0 0 0 .187-.934.68.68 0 0 0-.936-.186L8.003 8.51l-3.62-2.407a.65.65 0 0 0-.499-.084\"\n fill=\"#fff\"\n fillOpacity=\".54\"\n />\n </svg>\n );\n};\n","import { FC, useMemo } from \"react\";\nimport { useTranslation } from \"@kodiak-finance/orderly-i18n\";\nimport { cn, Flex, Text, Divider, Badge } from \"@kodiak-finance/orderly-ui\";\nimport { commifyOptional, Decimal } from \"@kodiak-finance/orderly-utils\";\nimport { LiquidationCellState } from \"./liquidationCell.script\";\n\nexport const LiquidationCell: FC<\n LiquidationCellState & {\n classNames?: {\n root?: string;\n };\n }\n> = (props) => {\n return (\n <Flex\n key={props.item.timestamp}\n direction={\"column\"}\n width={\"100%\"}\n gap={2}\n itemAlign={\"start\"}\n className={cn(\n \"oui-rounded-xl oui-bg-base-9 oui-p-2\",\n props.classNames?.root,\n )}\n >\n <Header {...props} />\n <Divider />\n <Body {...props} />\n </Flex>\n );\n};\n\nexport const Header: FC<LiquidationCellState> = (props) => {\n const { t } = useTranslation();\n return (\n <Flex width={\"100%\"} justify={\"between\"} itemAlign={\"start\"}>\n <Flex direction={\"column\"} itemAlign={\"start\"} gap={1}>\n <Flex gap={2} itemAlign={\"center\"}>\n <Flex direction={\"column\"} gap={1} itemAlign={\"start\"}>\n <Text.formatted\n rule={\"symbol\"}\n formatString=\"base-quote\"\n size=\"xs\"\n intensity={80}\n >\n {props.item.positions_by_perp?.[0]?.symbol || \"\"}\n </Text.formatted>\n {/* <Badge size=\"sm\" color=\"neutral\">\n Cross 10X\n </Badge> */}\n </Flex>\n </Flex>\n </Flex>\n <Flex direction={\"column\"} itemAlign={\"end\"}>\n <Text size=\"2xs\" intensity={36}>\n <Text.formatted rule={\"date\"} formatString=\"yyyy-MM-dd HH:mm:ss\">\n {props.item.timestamp}\n </Text.formatted>\n </Text>\n <Text size=\"2xs\" intensity={36}>\n {`${t(\"positions.Liquidation.column.liquidationId\")}: `}\n <Text as=\"span\" intensity={80}>\n {props.item.liquidation_id}\n </Text>\n </Text>\n </Flex>\n </Flex>\n );\n};\n\nexport const Body: FC<LiquidationCellState> = (props) => {\n const position = props.item.positions_by_perp?.[0];\n const { t } = useTranslation();\n const mr = useMemo(() => {\n if (isNaN(props.item?.margin_ratio)) return \"--\";\n return `${new Decimal(props.item.margin_ratio).mul(100).todp(2, Decimal.ROUND_DOWN).toNumber()}%`;\n }, [props.item?.margin_ratio]);\n\n if (!position) return null;\n\n return (\n <Flex direction={\"column\"} width={\"100%\"} gap={1}>\n {/* First row */}\n <Flex gap={2} width={\"100%\"}>\n <DataItem\n label={t(\"positions.Liquidation.column.markPrice\")}\n value={commifyOptional(position.transfer_price)}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"common.quantity\")}\n value={commifyOptional(position.position_qty)}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"positions.Liquidation.column.liquidationFeeRate\")}\n value={props.item.liquidationFeeRate}\n className=\"oui-flex-1\"\n align=\"end\"\n />\n </Flex>\n\n {/* Second row */}\n <Flex gap={2} width={\"100%\"}>\n <DataItem\n label={t(\"positions.Liquidation.column.liquidationFee\")}\n value={commifyOptional(position.abs_liquidation_fee)}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"positions.Liquidation.expand.label.mr\")}\n value={mr}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"positions.Liquidation.expand.label.mmr\")}\n value={\n props.item.formatted_account_mmr\n ? `${props.item.formatted_account_mmr}%`\n : \"--\"\n }\n className=\"oui-flex-1\"\n align=\"end\"\n />\n </Flex>\n\n {/* Third row */}\n <Flex gap={2} width={\"100%\"}>\n <DataItem\n label={t(\"positions.Liquidation.expand.label.collateral\")}\n value={commifyOptional(props.item.collateral_value)}\n className=\"oui-flex-1\"\n />\n <DataItem\n label={t(\"positions.Liquidation.expand.label.notional\")}\n value={commifyOptional(props.item.position_notional)}\n className=\"oui-flex-1\"\n />\n <div className=\"oui-flex-1 oui-opacity-0\" /> {/* Empty placeholder */}\n </Flex>\n </Flex>\n );\n};\n\nconst DataItem: FC<{\n label: string;\n value: string | number;\n className?: string;\n align?: \"start\" | \"end\";\n}> = ({ label, value, className, align = \"start\" }) => {\n return (\n <Flex direction={\"column\"} itemAlign={align} className={className}>\n <Text size=\"2xs\" intensity={36}>\n {label}\n </Text>\n <Text size=\"xs\" intensity={80}>\n {value}\n </Text>\n </Flex>\n );\n};\n","import { API } from \"@kodiak-finance/orderly-types\";\n\nexport const useLiquidationCellScript = (props: {\n item: API.Liquidation & {\n formatted_account_mmr: string;\n liquidationFeeRate: number;\n };\n onSymbolChange?: (symbol: API.Symbol) => void;\n index: number;\n}) => {\n return {\n ...props,\n };\n};\n\nexport type LiquidationCellState = ReturnType<typeof useLiquidationCellScript>;\n","import { API } from \"@kodiak-finance/orderly-types\";\nimport { useLiquidationCellScript } from \"./liquidationCell.script\";\nimport { LiquidationCell } from \"./liquidationCell.ui\";\n\nexport const LiquidationCellWidget = (props: {\n item: API.Liquidation;\n onSymbolChange?: (symbol: API.Symbol) => void;\n index: number;\n classNames?: {\n root?: string;\n };\n}) => {\n const { classNames, ...rest } = props;\n const state = useLiquidationCellScript(rest);\n return <LiquidationCell classNames={classNames} {...state} />;\n};\n","import React, { forwardRef } from \"react\";\nimport { useLiquidationScript } from \"./liquidation.script\";\nimport { Liquidation, MobileLiquidation } from \"./liquidation.ui\";\n\nexport type LiquidationProps = {\n symbol?: string;\n enableLoadMore?: boolean;\n};\n\nexport type LiquidationInstance = {\n getRowCount?: () => number;\n getDataSource?: () => any[] | null;\n};\n\nexport const LiquidationWidget = forwardRef<\n LiquidationInstance,\n LiquidationProps\n>((props, ref) => {\n const state = useLiquidationScript(props);\n\n React.useImperativeHandle(\n ref,\n () => ({\n getRowCount: () => {\n return state.dataSource?.length ?? 0;\n },\n getDataSource: () => {\n return state.dataSource ?? null;\n },\n }),\n [state.dataSource],\n );\n\n return <Liquidation {...state} />;\n});\n\nexport const MobileLiquidationWidget = forwardRef<\n LiquidationInstance,\n LiquidationProps & {\n classNames?: { root?: string; content?: string; cell?: string };\n onExport?: () => void;\n }\n>((props, ref) => {\n const { classNames, onExport, ...rest } = props;\n const state = useLiquidationScript(rest);\n\n React.useImperativeHandle(\n ref,\n () => ({\n getRowCount: () => {\n return state.dataSource?.length ?? 0;\n },\n getDataSource: () => {\n return state.dataSource ?? null;\n },\n }),\n [state.dataSource],\n );\n\n return (\n <MobileLiquidation classNames={classNames} {...state} onExport={onExport} />\n );\n});\n","import { useEffect, useMemo, useState } from \"react\";\nimport { differenceInDays, subDays } from \"date-fns\";\nimport {\n usePrivateInfiniteQuery,\n usePrivateQuery,\n} from \"@kodiak-finance/orderly-hooks\";\nimport { useDataTap } from \"@kodiak-finance/orderly-react-app\";\nimport { API } from \"@kodiak-finance/orderly-types\";\nimport { usePagination, useScreen } from \"@kodiak-finance/orderly-ui\";\nimport { Decimal, zero } from \"@kodiak-finance/orderly-utils\";\nimport {\n areDatesEqual,\n formatDatePickerRange,\n offsetEndOfDay,\n offsetStartOfDay,\n} from \"../../utils\";\nimport { LiquidationProps } from \"./liquidation.widget\";\n\nexport const useLiquidationScript = (props: LiquidationProps) => {\n const { symbol, enableLoadMore } = props;\n const { page, pageSize, setPage, pagination, parsePagination } =\n usePagination({\n pageSize: 10,\n });\n\n const { dateRange, filterDays, updateFilterDays, filterItems, onFilter } =\n useFilter();\n\n useEffect(() => {\n setPage(1);\n }, [symbol, dateRange, filterDays]);\n\n const [data, { meta, isLoading, loadMore }] = useLiquidation({\n page: enableLoadMore ? undefined : page,\n size: pageSize,\n symbol,\n start_t: dateRange.from != null ? dateRange.from.getTime() : undefined,\n end_t: dateRange.to != null ? dateRange.to.getTime() : undefined,\n });\n\n const dataSource = useDataTap(data, {\n fallbackData: [],\n });\n\n // useEffect(() => {\n // setPage(1);\n // }, [dateRange, filterDays]);\n\n // console.log(\"pagination\", pagination, meta);\n\n return {\n dataSource,\n isLoading,\n loadMore,\n\n pagination: parsePagination(meta),\n\n // filter\n dateRange,\n filterDays,\n updateFilterDays,\n filterItems,\n onFilter,\n };\n};\n\nexport type LiquidationState = ReturnType<typeof useLiquidationScript>;\n\n/**\n *\n * @param props size default is 100\n */\nconst useLiquidation = (props: {\n symbol?: string;\n start_t?: number;\n end_t?: number;\n page?: number;\n size?: number;\n}) => {\n const ordersResponse = usePrivateInfiniteQuery(generateKeyFun(props), {\n initialSize: 1,\n formatter: (data) => data,\n revalidateOnFocus: true,\n });\n\n const meta = useMemo(() => {\n // @ts-ignore\n return ordersResponse.data?.[0]?.meta;\n }, [ordersResponse.data?.[0]]);\n\n const data = useMemo(() => {\n return ordersResponse.data\n ?.map((item) =>\n // @ts-ignore\n item.rows?.map((item) => {\n let liquidationFeeRate = null;\n const firstPosition = item.positions_by_perp[0];\n\n if (firstPosition) {\n liquidationFeeRate = new Decimal(firstPosition.liquidator_fee)\n .add(firstPosition.insurance_fund_fee)\n .toNumber();\n }\n\n return {\n ...item,\n // Flatten first position for CSV export\n symbol: firstPosition?.symbol,\n transfer_price: firstPosition?.transfer_price,\n position_qty: firstPosition?.position_qty,\n abs_liquidation_fee: firstPosition?.abs_liquidation_fee,\n // Formatted fields\n formatted_account_mmr: isNaN(item.account_mmr)\n ? null\n : new Decimal(item.account_mmr).mul(100).toFixed(2).toString(),\n liquidationFeeRate,\n };\n }),\n )\n ?.flat();\n }, [ordersResponse.data]);\n\n const isLoading = ordersResponse.isLoading;\n\n const loadMore = () => {\n ordersResponse.setSize(ordersResponse.size + 1);\n };\n\n return [data, { meta, isLoading, loadMore }] as const;\n};\n\nconst useFilter = () => {\n const defaultRange = formatDatePickerRange({\n to: offsetEndOfDay(new Date()),\n from: offsetStartOfDay(subDays(new Date(), 89)),\n });\n\n /// default is 90d\n const [filterDays, setFilterDays] = useState<1 | 7 | 30 | 90 | null>(90);\n\n const [dateRange, setDateRange] = useState<{\n from?: Date;\n to?: Date;\n }>(defaultRange);\n\n const updateFilterDays = (days: 1 | 7 | 30 | 90) => {\n setFilterDays(days);\n setDateRange({\n from: offsetStartOfDay(subDays(new Date(), days - 1)),\n to: offsetEndOfDay(new Date()),\n });\n };\n\n const onFilter = (filter: { name: string; value: any }) => {\n if (filter.name === \"dateRange\") {\n const newDateRange = formatDatePickerRange(filter.value);\n setDateRange(newDateRange);\n if (newDateRange.from && newDateRange.to) {\n const diffDays =\n Math.abs(differenceInDays(newDateRange.from, newDateRange.to)) + 1;\n const dateRangeMap: { [key: number]: { from: Date; to: Date } } = {\n 1: {\n from: offsetStartOfDay(new Date())!,\n to: offsetEndOfDay(new Date())!,\n },\n 7: {\n from: offsetStartOfDay(subDays(new Date(), 6))!,\n to: offsetEndOfDay(new Date())!,\n },\n 30: {\n from: offsetStartOfDay(subDays(new Date(), 29))!,\n to: offsetEndOfDay(new Date())!,\n },\n 90: {\n from: offsetStartOfDay(subDays(new Date(), 89))!,\n to: offsetEndOfDay(new Date())!,\n },\n };\n\n const dateRange = dateRangeMap[diffDays];\n if (\n dateRange &&\n areDatesEqual(dateRange.from, newDateRange.from) &&\n areDatesEqual(dateRange.to, newDateRange.to)\n ) {\n setFilterDays(diffDays as any);\n } else {\n setFilterDays(null);\n }\n }\n }\n };\n\n const { isMobile } = useScreen();\n\n const filterItems = useMemo((): any[] => {\n const dateRangeFilter = {\n type: \"range\",\n name: \"dateRange\",\n value: dateRange,\n fromDate: offsetStartOfDay(subDays(new Date(), 89)),\n toDate: offsetEndOfDay(new Date()),\n };\n\n if (isMobile) {\n return [dateRangeFilter];\n }\n return [dateRangeFilter];\n }, [dateRange]);\n\n return {\n filterItems,\n onFilter,\n dateRange,\n filterDays,\n updateFilterDays,\n };\n};\n\nconst generateKeyFun =\n (args: {\n symbol?: string;\n start_t?: number;\n end_t?: number;\n page?: number;\n size?: number;\n }) =>\n (pageIndex: number, previousPageData: any): string | null => {\n // reached the end\n if (previousPageData && !previousPageData.rows?.length) return null;\n\n const { symbol, size = 10, page, end_t, start_t } = args;\n\n const search = new URLSearchParams([\n [\"size\", size.toString()],\n [\"page\", `${pageIndex + 1}`],\n ]);\n\n if (page) {\n search.set(\"page\", `${page}`);\n }\n\n if (symbol) {\n search.set(`symbol`, symbol);\n }\n\n if (end_t) {\n search.set(`end_t`, `${end_t}`);\n }\n\n if (start_t) {\n search.set(`start_t`, `${start_t}`);\n }\n\n return `/v1/liquidations?${search.toString()}`;\n };\n"]}
|