{"version":3,"sources":["webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/components/edited_timestamp/containers/dropdown_menu_container.js","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/components/edited_timestamp/index.js","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/status/components/detailed_status.js","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/status/components/action_bar.js","webpack:///app/javascript/opt/mastodon/app/javascript/flavours/glitch/features/status/index.js"],"names":["connect","state","statusId","dropdownPlacement","getIn","openDropdownId","openedViaKeyboard","items","loading","dispatch","onOpen","id","onItemClick","keyboard","fetchHistory","openDropdownMenu","onClose","closeDropdownMenu","DropdownMenu","EditedTimestamp","index","openModal","injectIntl","React","PureComponent","handleItemClick","item","i","this","props","renderHeader","defaultMessage","values","count","size","renderItem","onClick","onKeyPress","formattedDate","timestamp","get","short","formattedName","accountId","label","name","date","className","render","intl","scrollable","formatDate","hour12","month","day","hour","minute","DetailedStatus","ImmutablePureComponent","height","handleAccountClick","e","button","ctrlKey","altKey","metaKey","context","router","preventDefault","history","location","mastodonBackSteps","push","status","stopPropagation","parseClick","destination","handleOpenVideo","options","onOpenVideo","setRef","c","node","_measureHeight","handleChildUpdate","handleModalLink","href","target","nodeName","parentNode","window","open","handleTranslate","onTranslate","heightJustChanged","measureHeight","scheduleIdleTask","setState","Math","ceil","scrollHeight","onHeightChange","componentDidUpdate","prevProps","prevState","expanded","onToggleHidden","settings","usingPiP","outerStyle","boxSizing","compact","applicationLink","reblogLink","reblogIcon","favouriteLink","edited","contentMedia","contentMediaIcons","extraMedia","extraMediaIcons","media","mediaIcons","some","attachment","src","alt","duration","poster","backgroundColor","foregroundColor","accentColor","sensitive","visible","showMedia","blurhash","onToggleVisibility","onToggleMediaVisibility","preview","frameRate","inline","letterbox","fullwidth","preventPlayback","autoplay","standalone","hidden","onOpenMedia","card","pollId","Fragment","rel","visibilityLink","visibility","includes","Link","to","value","style","ref","classNames","account","localDomain","domain","collapsed","onExpandedToggle","onUpdate","tagLinks","rewriteMentions","disabled","Date","year","contextTypes","PropTypes","object","propTypes","ImmutablePropTypes","map","isRequired","func","bool","string","messages","defineMessages","delete","redraft","edit","direct","mention","reply","reblog","reblog_private","cancel_reblog_private","cannot_reblog","favourite","bookmark","more","mute","muteConversation","unmuteConversation","block","report","share","pin","unpin","embed","admin_account","admin_status","copy","openOriginalPage","ActionBar","handleReplyClick","onReply","handleReblogClick","onReblog","handleFavouriteClick","onFavourite","handleBookmarkClick","onBookmark","handleDeleteClick","onDelete","handleRedraftClick","handleEditClick","onEdit","handleDirectClick","onDirect","handleMentionClick","onMention","handleMuteClick","onMute","handleConversationMuteClick","onMuteConversation","handleBlockClick","onBlock","handleReport","onReport","handlePinClick","onPin","handleShare","navigator","text","url","handleEmbed","onEmbed","handleCopy","clipboard","writeText","signedIn","permissions","identity","publicStatus","pinnableStatus","mutingConversation","writtenByMe","me","isRemote","menu","formatMessage","action","PERMISSION_MANAGE_USERS","accountAdminLink","statusAdminLink","undefined","shareButton","title","icon","reblogPrivate","reblogTitle","active","animate","direction","deleteConfirm","deleteMessage","redraftConfirm","redraftMessage","revealAll","hideAll","detailedStatus","replyConfirm","replyMessage","tootHeading","Status","getStatus","makeGetStatus","getAncestorsIds","createSelector","_","inReplyTos","ancestorsIds","Immutable","List","withMutations","mutable","unshift","getDescendantsIds","contextReplies","statuses","descendantsIds","ids","length","pop","replies","reverse","forEach","insertAt","findIndex","idx","splice","params","isLoading","askReplyConfirmation","trim","fullscreen","isExpanded","threadExpanded","loadedStatusId","revealBehindCW","handleToggleHidden","revealStatus","hideStatus","setExpansion","handleToggleMediaVisibility","handleModalFavourite","unfavourite","shiftKey","favouriteModal","type","handlePin","message","confirm","onDoNotAsk","changeLocalSetting","onConfirm","replyCompose","handleModalReblog","privacy","unreblog","initBoostModal","missingMediaDescription","boostModal","unbookmark","withRedraft","deleteModal","deleteStatus","editStatus","directCompose","mentionCompose","handleOpenMedia","handleHotkeyOpenMedia","startTime","initMuteModal","unmuteStatus","muteStatus","handleToggleAll","statusIds","concat","toJS","undoStatusTranslation","translateStatus","initBlockModal","initReport","handleHotkeyToggleSensitive","handleHotkeyMoveUp","handleMoveUp","handleHotkeyMoveDown","handleMoveDown","handleHotkeyReply","handleHotkeyFavourite","handleHotkeyBoost","handleHotkeyBookmark","handleHotkeyMention","handleHotkeyOpenProfile","_selectChild","indexOf","handleHeaderClick","column","scrollTop","setColumnRef","onFullScreenChange","isFullscreen","componentDidMount","attachFullscreenListener","fetchStatus","element","querySelectorAll","requestAnimationFrame","scrollIntoView","static","update","updated","defaultMediaVisibility","autoUnfoldCW","align_top","container","offsetTop","clientHeight","offsetHeight","focus","renderChildren","list","onMoveUp","onMoveDown","contextType","componentWillUnmount","detachFullscreenListener","ancestors","descendants","multiColumn","isLocal","isIndexable","handlers","moveUp","moveDown","boost","openProfile","toggleSpoiler","toggleSensitive","openMedia","bindToDocument","showBackButton","extraButton","scrollKey","tabIndex","textForScreenReader","Helmet","displayName","username","prefix","str","num","slice","titleFromStatus","content"],"mappings":"mcA0BeA,I,EAAAA,qBArBS,CAACC,EAAM,KAAD,IAAE,SAAEC,GAAU,QAAM,CAChDC,kBAAmBF,EAAMG,MAAM,CAAC,gBAAiB,cACjDC,eAAgBJ,EAAMG,MAAM,CAAC,gBAAiB,WAC9CE,kBAAmBL,EAAMG,MAAM,CAAC,gBAAiB,aACjDG,MAAON,EAAMG,MAAM,CAAC,UAAWF,EAAU,UACzCM,QAASP,EAAMG,MAAM,CAAC,UAAWF,EAAU,gBAGlB,CAACO,EAAS,KAAD,IAAE,SAAEP,GAAU,QAAM,CAEtDQ,OAAQC,EAAIC,EAAaT,EAAmBU,GAC1CJ,EAASK,YAAaZ,IACtBO,EAASM,YAAiBJ,EAAIR,EAAmBU,KAGnDG,QAASL,GACPF,EAASQ,YAAkBN,QAKhBX,CAA6CkB,K,2BCVzD,IAIGC,EAFUnB,kBAAQ,MARG,CAACS,EAAS,KAAD,IAAE,SAAEP,GAAU,QAAM,CAEtDU,YAAaQ,GACXX,EAASY,YAAU,kBAAmB,CAAED,QAAOlB,kBAKF,GAChDoB,YAAU,EADI,cAEeC,IAAMC,cAAe,cAAD,yBAShDC,gBAAkB,CAACC,EAAMC,KACvB,MAAM,YAAEf,GAAgBgB,KAAKC,MAC7BjB,EAAYe,IACZ,KAEFG,aAAevB,GAEX,YAAC,IAAgB,CAACI,GAAG,wBAAwBoB,eAAe,mEAAmEC,OAAQ,CAAEC,MAAO1B,EAAM2B,KAAO,KAEhK,KAEDC,WAAa,CAACT,EAAMN,EAAM,KAA8B,IAA7B,QAAEgB,EAAO,WAAEC,GAAY,EAChD,MAAMC,EAAgB,YAAC,UAAiB,CAACC,UAAWb,EAAKc,IAAI,cAAeC,OAAO,IAC7EC,EAAgB,YAAC,IAAa,CAACC,UAAWjB,EAAKc,IAAI,aAEnDI,EAAQlB,EAAKc,IAAI,YACrB,YAAC,IAAgB,CAAC7B,GAAG,yBAAyBoB,eAAe,wBAAwBC,OAAQ,CAAEa,KAAMH,EAAeI,KAAMR,KAE1H,YAAC,IAAgB,CAAC3B,GAAG,wBAAwBoB,eAAe,uBAAuBC,OAAQ,CAAEa,KAAMH,EAAeI,KAAMR,KAG1H,OACE,kBAAIS,UAAU,uDAA2DrB,EAAKc,IAAI,cAChF,sBAAQ,aAAYpB,EAAOgB,QAASA,EAASC,WAAYA,QAAW,EAAEO,KAK5EI,SACE,MAAM,UAAET,EAAS,KAAEU,EAAI,SAAE/C,GAAa0B,KAAKC,MAE3C,OACE,YAAC,EAAY,CAAC3B,SAAUA,EAAUiC,WAAYP,KAAKO,WAAYe,YAAU,EAACpB,aAAcF,KAAKE,aAAclB,YAAagB,KAAKH,sBAAgB,EAC3I,sBAAQsB,UAAU,mCAA4B,EAC5C,YAAC,IAAgB,CAACpC,GAAG,gBAAgBoB,eAAe,gBAAgBC,OAAQ,CAAEc,KAAMG,EAAKE,WAAWZ,EAAW,CAAEa,QAAQ,EAAOC,MAAO,QAASC,IAAK,UAAWC,KAAM,UAAWC,OAAQ,eAAkB,IAAC,YAAC,IAAI,CAAC7C,GAAG,qBAM9N,M,QChDyE,IAGpE8C,EADUnC,aAAU,EAAX,cACcoC,IAAwB,cAAD,yBAwBlDzD,MAAQ,CACN0D,OAAQ,MACR,KAEFC,mBAAsBC,IACpB,GAAiB,IAAbA,EAAEC,UAAkBD,EAAEE,SAAWF,EAAEG,QAAUH,EAAEI,UAAYrC,KAAKsC,QAAQC,OAAQ,CAClFN,EAAEO,iBACF,IAAInE,EAAQ,IAAI2B,KAAKsC,QAAQC,OAAOE,QAAQC,SAASrE,OACrDA,EAAMsE,mBAAqBtE,EAAMsE,mBAAqB,GAAK,EAC3D3C,KAAKsC,QAAQC,OAAOE,QAAQG,KAAM,KAAI5C,KAAKC,MAAM4C,OAAOrE,MAAM,CAAC,UAAW,WAAYH,GAGxF4D,EAAEa,mBACH,KAEDC,WAAa,CAACd,EAAGe,KACf,GAAiB,IAAbf,EAAEC,UAAkBD,EAAEE,SAAWF,EAAEG,QAAUH,EAAEI,UAAYrC,KAAKsC,QAAQC,OAAQ,CAClFN,EAAEO,iBACF,IAAInE,EAAQ,IAAI2B,KAAKsC,QAAQC,OAAOE,QAAQC,SAASrE,OACrDA,EAAMsE,mBAAqBtE,EAAMsE,mBAAqB,GAAK,EAC3D3C,KAAKsC,QAAQC,OAAOE,QAAQG,KAAKI,EAAa3E,GAGhD4D,EAAEa,mBACH,KAEDG,gBAAmBC,IACjBlD,KAAKC,MAAMkD,YAAYnD,KAAKC,MAAM4C,OAAOrE,MAAM,CAAC,oBAAqB,IAAK0E,IAC3E,KAYDE,OAASC,IACPrD,KAAKsD,KAAOD,EACZrD,KAAKuD,kBACN,KAMDC,kBAAoB,KAClBxD,KAAKuD,kBACN,KAEDE,gBAAkBxB,IAGhB,IAAIyB,EAFJzB,EAAEO,iBAKAkB,EADwB,MAAtBzB,EAAE0B,OAAOC,SACJ3B,EAAE0B,OAAOE,WAAWH,KAEpBzB,EAAE0B,OAAOD,KAGlBI,OAAOC,KAAKL,EAAM,kBAAmB,0EACtC,KAEDM,gBAAkB,KAChB,MAAM,YAAEC,EAAW,OAAEpB,GAAW7C,KAAKC,MACrCgE,EAAYpB,IAvCdU,eAAgBW,GACVlE,KAAKC,MAAMkE,eAAiBnE,KAAKsD,OACnCc,aAAiB,IAAMpE,KAAKsD,MAAQtD,KAAKqE,SAAS,CAAEtC,OAAQuC,KAAKC,KAAKvE,KAAKsD,KAAKkB,cAAgB,MAE5FxE,KAAKC,MAAMwE,gBAAkBP,GAC/BlE,KAAKC,MAAMwE,kBAUjBC,mBAAoBC,EAAWC,GAC7B5E,KAAKuD,eAAeqB,EAAU7C,SAAW/B,KAAK3B,MAAM0D,QA0BtDX,SACE,MAAMyB,EAAU7C,KAAKC,MAAM4C,QAAU7C,KAAKC,MAAM4C,OAAOjC,IAAI,UAAaZ,KAAKC,MAAM4C,OAAOjC,IAAI,UAAYZ,KAAKC,MAAM4C,QAC/G,SAAEgC,EAAQ,eAAEC,EAAc,SAAEC,EAAQ,SAAEC,EAAQ,KAAE3D,GAASrB,KAAKC,MAC9DgF,EAAa,CAAEC,UAAW,eAC1B,QAAEC,GAAYnF,KAAKC,MAEzB,IAAK4C,EACH,OAAO,KAGT,IAAIuC,EAAkB,GAClBC,EAAa,GACbC,EAAa,UACbC,EAAgB,GAChBC,EAAS,GAKTC,EAAe,GACfC,EAAoB,GACpBC,EAAa,GACbC,EAAkB,GAClBC,EAAQJ,EACRK,EAAaJ,EAWjB,GATIX,EAASvG,MAAM,CAAC,mBAAoB,oBACtCqH,EAAQF,EACRG,EAAaF,GAGX5F,KAAKC,MAAMkE,gBACbc,EAAWlD,OAAU,GAAE/B,KAAK3B,MAAM0D,YAGhCiD,EACFa,EAAMjD,KAAK,YAAC,IAA2B,KACvCkD,EAAWlD,KAAK,qBACX,GAAIC,EAAOjC,IAAI,qBAAqBN,KAAO,EAChD,GAAIuC,EAAOjC,IAAI,qBAAqBmF,MAAKjG,GAA6B,YAArBA,EAAKc,IAAI,UACxDiF,EAAMjD,KAAK,YAAC,IAAc,CAACiD,MAAOhD,EAAOjC,IAAI,6BACxC,GAAuD,UAAnDiC,EAAOrE,MAAM,CAAC,oBAAqB,EAAG,SAAsB,CACrE,MAAMwH,EAAanD,EAAOrE,MAAM,CAAC,oBAAqB,IAEtDqH,EAAMjD,KACJ,YAAC,UAAK,CACJqD,IAAKD,EAAWpF,IAAI,OACpBsF,IAAKF,EAAWpF,IAAI,eACpBuF,SAAUH,EAAWxH,MAAM,CAAC,OAAQ,WAAY,YAAa,GAC7D4H,OAAQJ,EAAWpF,IAAI,gBAAkBiC,EAAOrE,MAAM,CAAC,UAAW,kBAClE6H,gBAAiBL,EAAWxH,MAAM,CAAC,OAAQ,SAAU,eACrD8H,gBAAiBN,EAAWxH,MAAM,CAAC,OAAQ,SAAU,eACrD+H,YAAaP,EAAWxH,MAAM,CAAC,OAAQ,SAAU,WACjDgI,UAAW3D,EAAOjC,IAAI,aACtB6F,QAASzG,KAAKC,MAAMyG,UACpBC,SAAUX,EAAWpF,IAAI,YACzBmB,OAAQ,IACR6E,mBAAoB5G,KAAKC,MAAM4G,2BAGnCf,EAAWlD,KAAK,cACX,GAAuD,UAAnDC,EAAOrE,MAAM,CAAC,oBAAqB,EAAG,SAAsB,CACrE,MAAMwH,EAAanD,EAAOrE,MAAM,CAAC,oBAAqB,IACtDqH,EAAMjD,KACJ,YAAC,UAAK,CACJkE,QAASd,EAAWpF,IAAI,eACxBmG,UAAWf,EAAWxH,MAAM,CAAC,OAAQ,WAAY,eACjDmI,SAAUX,EAAWpF,IAAI,YACzBqF,IAAKD,EAAWpF,IAAI,OACpBsF,IAAKF,EAAWpF,IAAI,eACpBoG,QAAM,EACNR,UAAW3D,EAAOjC,IAAI,aACtBqG,UAAWlC,EAASvG,MAAM,CAAC,QAAS,cACpC0I,UAAWnC,EAASvG,MAAM,CAAC,QAAS,cACpC2I,iBAAkBtC,EAClB1B,YAAanD,KAAKiD,gBAClBmE,UAAQ,EACRX,QAASzG,KAAKC,MAAMyG,UACpBE,mBAAoB5G,KAAKC,MAAM4G,2BAGnCf,EAAWlD,KAAK,qBAEhBiD,EAAMjD,KACJ,YAAC,UAAY,CACXyE,YAAU,EACVb,UAAW3D,EAAOjC,IAAI,aACtBiF,MAAOhD,EAAOjC,IAAI,qBAClBqG,UAAWlC,EAASvG,MAAM,CAAC,QAAS,cACpC0I,UAAWnC,EAASvG,MAAM,CAAC,QAAS,cACpC8I,QAASzC,EACT0C,YAAavH,KAAKC,MAAMsH,YACxBd,QAASzG,KAAKC,MAAMyG,UACpBE,mBAAoB5G,KAAKC,MAAM4G,2BAGnCf,EAAWlD,KAAK,kBAETC,EAAOjC,IAAI,UACpBiF,EAAMjD,KAAK,YAAC,IAAI,CAAC4D,UAAW3D,EAAOjC,IAAI,aAAc2G,YAAavH,KAAKC,MAAMsH,YAAaC,KAAM3E,EAAOjC,IAAI,WAC3GkF,EAAWlD,KAAK,SAGdC,EAAOjC,IAAI,UACb6E,EAAa7C,KAAK,YAAC,IAAa,CAAC6E,OAAQ5E,EAAOjC,IAAI,WACpD8E,EAAkB9C,KAAK,UAGrBC,EAAOjC,IAAI,iBACbwE,EAAkB,YAAC,IAAMsC,SAAQ,UAAC,MAAG,iBAAGvG,UAAU,+BAA+BuC,KAAMb,EAAOrE,MAAM,CAAC,cAAe,YAAamF,OAAO,SAASgE,IAAI,4BAAqB,EAAE9E,EAAOrE,MAAM,CAAC,cAAe,YAG3M,MAAMoJ,EAAiB,YAAC,IAAMF,SAAQ,UAAC,MAAG,YAAC,IAAc,CAACG,WAAYhF,EAAOjC,IAAI,iBAiEjF,MA/DiC,WAA7BiC,EAAOjC,IAAI,cACb0E,EAAa,WACyB,YAA7BzC,EAAOjC,IAAI,gBACpB0E,EAAa,QAMbD,EAHG,CAAC,WAAY,UAAUyC,SAASjF,EAAOjC,IAAI,eAErCZ,KAAKsC,QAAQC,OAEpB,YAAC,IAAMmF,SAAQ,UACb,YAAC,IAAMA,SAAQ,UAAC,OAChB,YAACK,EAAA,EAAI,CAACC,GAAK,KAAInF,EAAOrE,MAAM,CAAC,UAAW,YAAYqE,EAAOjC,IAAI,gBAAiBO,UAAU,8BAAuB,EAC/G,YAAC,IAAI,CAACpC,GAAIuG,IACV,oBAAMnE,UAAU,iCAA0B,EACxC,YAAC,IAAc,CAAC8G,MAAOpF,EAAOjC,IAAI,sBAOxC,YAAC,IAAM8G,SAAQ,UACb,YAAC,IAAMA,SAAQ,UAAC,OAChB,iBAAGhE,KAAO,aAAYb,EAAOjC,IAAI,oBAAqBO,UAAU,wBAAwBX,QAASR,KAAKyD,sBAAgB,EACpH,YAAC,IAAI,CAAC1E,GAAIuG,IACV,oBAAMnE,UAAU,iCAA0B,EACxC,YAAC,IAAc,CAAC8G,MAAOpF,EAAOjC,IAAI,sBApB7B,KA4Bb2E,EADEvF,KAAKsC,QAAQC,OAEb,YAACwF,EAAA,EAAI,CAACC,GAAK,KAAInF,EAAOrE,MAAM,CAAC,UAAW,YAAYqE,EAAOjC,IAAI,mBAAoBO,UAAU,8BAAuB,EAClH,YAAC,IAAI,CAACpC,GAAG,SACT,oBAAMoC,UAAU,mCAA4B,EAC1C,YAAC,IAAc,CAAC8G,MAAOpF,EAAOjC,IAAI,wBAMtC,iBAAG8C,KAAO,aAAYb,EAAOjC,IAAI,uBAAwBO,UAAU,wBAAwBX,QAASR,KAAKyD,sBAAgB,EACvH,YAAC,IAAI,CAAC1E,GAAG,SACT,oBAAMoC,UAAU,mCAA4B,EAC1C,YAAC,IAAc,CAAC8G,MAAOpF,EAAOjC,IAAI,wBAMtCiC,EAAOjC,IAAI,eACb4E,EACE,YAAC,IAAMkC,SAAQ,UACb,YAAC,IAAMA,SAAQ,UAAC,OAChB,YAAC,EAAe,CAACpJ,SAAUuE,EAAOjC,IAAI,MAAOD,UAAWkC,EAAOjC,IAAI,iBAMvE,mBAAKsH,MAAOjD,QAAW,EACrB,yBAAKkD,IAAKnI,KAAKoD,OAAQjC,UAAWiH,IAAW,kBAAoB,mBAAkBvF,EAAOjC,IAAI,gBAAiB,CAAEuE,YAAY,iBAAgBtC,EAAOrE,MAAM,CAAC,UAAW,UACpK,iBAAGkF,KAAMb,EAAOrE,MAAM,CAAC,UAAW,QAASgC,QAASR,KAAKgC,mBAAoBb,UAAU,sCAA+B,EACpH,mBAAKA,UAAU,wCAAiC,EAAC,YAAC,IAAM,CAACkH,QAASxF,EAAOjC,IAAI,WAAYN,KAAM,MAC/F,YAAC,IAAW,CAAC+H,QAASxF,EAAOjC,IAAI,WAAY0H,YAAatI,KAAKC,MAAMsI,UAGvE,YAAC,IAAa,CACZ1F,OAAQA,EACRgD,MAAOJ,EACPE,WAAYA,EACZG,WAAYJ,EACZb,SAAUA,EACV2D,WAAW,EACXC,iBAAkB3D,EAClBb,YAAajE,KAAKgE,gBAClBjB,WAAY/C,KAAK+C,WACjB2F,SAAU1I,KAAKwD,kBACfmF,SAAU5D,EAASnE,IAAI,wBACvBgI,gBAAiB7D,EAASnE,IAAI,oBAC9BiI,UAAQ,IAGV,mBAAK1H,UAAU,8BAAuB,EACpC,iBAAGA,UAAU,4BAA4BuC,KAAMb,EAAOjC,IAAI,OAAQ+C,OAAO,SAASgE,IAAI,4BAAqB,EACzG,YAAC,IAAa,CAACM,MAAO,IAAIa,KAAKjG,EAAOjC,IAAI,eAAgBY,QAAQ,EAAOuH,KAAK,UAAUtH,MAAM,QAAQC,IAAI,UAAUC,KAAK,UAAUC,OAAO,aACvI4D,EAAQoC,EAAgBxC,EAAiBC,EAAW,MAAIE,OAOxE,EAjTQyD,aAAe,CACpBzG,OAAQ0G,IAAUC,QACnB,EAEMC,UAAY,CACjBtG,OAAQuG,IAAmBC,IAC3BtE,SAAUqE,IAAmBC,IAAIC,WACjC/B,YAAa0B,IAAUM,KAAKD,WAC5BnG,YAAa8F,IAAUM,KAAKD,WAC5BxE,eAAgBmE,IAAUM,KAC1BtF,YAAagF,IAAUM,KAAKD,WAC5BzE,SAAUoE,IAAUO,KACpBrF,cAAe8E,IAAUO,KACzB/E,eAAgBwE,IAAUM,KAC1BhB,OAAQU,IAAUQ,OAAOH,WACzBnE,QAAS8D,IAAUO,KACnB9C,UAAWuC,IAAUO,KACrBxE,SAAUiE,IAAUO,KACpB3C,wBAAyBoC,IAAUM,KACnClI,KAAM4H,IAAUC,OAAOI,YAtBD,EAuBvB,O,qDCnCH,MAAMI,GAAWC,YAAe,CAC9BC,OAAO,CAAD,4CACNC,QAAQ,CAAD,wDACPC,KAAK,CAAD,wCACJC,OAAO,CAAD,4DACNC,QAAQ,CAAD,sDACPC,MAAM,CAAD,0CACLC,OAAO,CAAD,2CACNC,eAAe,CAAD,4EACdC,sBAAsB,CAAD,4DACrBC,cAAc,CAAD,wEACbC,UAAU,CAAD,kDACTC,SAAS,CAAD,gDACRC,KAAK,CAAD,wCACJC,KAAK,CAAD,gDACJC,iBAAiB,CAAD,kEAChBC,mBAAmB,CAAD,sEAClBC,MAAM,CAAD,kDACLC,OAAO,CAAD,oDACNC,MAAM,CAAD,0CACLC,IAAI,CAAD,iDACHC,MAAM,CAAD,uDACLC,MAAM,CAAD,0CACLC,cAAc,CAAD,kFACbC,aAAa,CAAD,wFACZC,KAAK,CAAD,uDACJC,iBAAiB,CAAD,uEACf,IAGGC,GADU5L,aAAU,EAAX,cACSC,IAAMC,cAAe,cAAD,yBA0B1C2L,iBAAmB,KACjBvL,KAAKC,MAAMuL,QAAQxL,KAAKC,MAAM4C,SAC/B,KAED4I,kBAAqBxJ,IACnBjC,KAAKC,MAAMyL,SAAS1L,KAAKC,MAAM4C,OAAQZ,IACxC,KAED0J,qBAAwB1J,IACtBjC,KAAKC,MAAM2L,YAAY5L,KAAKC,MAAM4C,OAAQZ,IAC3C,KAED4J,oBAAuB5J,IACrBjC,KAAKC,MAAM6L,WAAW9L,KAAKC,MAAM4C,OAAQZ,IAC1C,KAED8J,kBAAoB,KAClB/L,KAAKC,MAAM+L,SAAShM,KAAKC,MAAM4C,OAAQ7C,KAAKsC,QAAQC,OAAOE,UAC5D,KAEDwJ,mBAAqB,KACnBjM,KAAKC,MAAM+L,SAAShM,KAAKC,MAAM4C,OAAQ7C,KAAKsC,QAAQC,OAAOE,SAAS,IACrE,KAEDyJ,gBAAkB,KAChBlM,KAAKC,MAAMkM,OAAOnM,KAAKC,MAAM4C,OAAQ7C,KAAKsC,QAAQC,OAAOE,UAC1D,KAED2J,kBAAoB,KAClBpM,KAAKC,MAAMoM,SAASrM,KAAKC,MAAM4C,OAAOjC,IAAI,WAAYZ,KAAKsC,QAAQC,OAAOE,UAC3E,KAED6J,mBAAqB,KACnBtM,KAAKC,MAAMsM,UAAUvM,KAAKC,MAAM4C,OAAOjC,IAAI,WAAYZ,KAAKsC,QAAQC,OAAOE,UAC5E,KAED+J,gBAAkB,KAChBxM,KAAKC,MAAMwM,OAAOzM,KAAKC,MAAM4C,OAAOjC,IAAI,aACzC,KAED8L,4BAA8B,KAC5B1M,KAAKC,MAAM0M,mBAAmB3M,KAAKC,MAAM4C,SAC1C,KAED+J,iBAAmB,KACjB5M,KAAKC,MAAM4M,QAAQ7M,KAAKC,MAAM4C,SAC/B,KAEDiK,aAAe,KACb9M,KAAKC,MAAM8M,SAAS/M,KAAKC,MAAM4C,SAChC,KAEDmK,eAAiB,KACfhN,KAAKC,MAAMgN,MAAMjN,KAAKC,MAAM4C,SAC7B,KAEDqK,YAAc,KACZC,UAAUrC,MAAM,CACdsC,KAAMpN,KAAKC,MAAM4C,OAAOjC,IAAI,gBAC5ByM,IAAKrN,KAAKC,MAAM4C,OAAOjC,IAAI,UAE9B,KAED0M,YAAc,KACZtN,KAAKC,MAAMsN,QAAQvN,KAAKC,MAAM4C,SAC/B,KAED2K,WAAa,KACX,MAAMH,EAAMrN,KAAKC,MAAM4C,OAAOjC,IAAI,OAClCuM,UAAUM,UAAUC,UAAUL,IAGhCjM,SACE,MAAM,OAAEyB,EAAM,KAAExB,GAASrB,KAAKC,OACxB,SAAE0N,EAAQ,YAAEC,GAAgB5N,KAAKsC,QAAQuL,SAEzCC,EAAqB,CAAC,SAAU,YAAYhG,SAASjF,EAAOjC,IAAI,eAChEmN,EAAqB,CAAC,SAAU,WAAY,WAAWjG,SAASjF,EAAOjC,IAAI,eAC3EoN,EAAqBnL,EAAOjC,IAAI,SAChCqN,EAAqBpL,EAAOrE,MAAM,CAAC,UAAW,SAAW0P,IACzDC,EAAqBtL,EAAOrE,MAAM,CAAC,UAAW,eAAiBqE,EAAOrE,MAAM,CAAC,UAAW,SAE9F,IAAI4P,EAAO,GAEPN,IACEK,GACFC,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAAS2B,kBAAmB3H,KAAMb,EAAOjC,IAAI,SAGpFwN,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAAS0B,MAAOkD,OAAQtO,KAAKwN,aAClEY,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAASuB,OAAQqD,OAAQtO,KAAKsN,cACnEc,EAAKxL,KAAK,OAGRqL,GACEF,IACFK,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAcxL,EAAOjC,IAAI,UAAY8I,GAASsB,MAAQtB,GAASqB,KAAMuD,OAAQtO,KAAKgN,iBACzGoB,EAAKxL,KAAK,OAGZwL,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAcL,EAAqBtE,GAASiB,mBAAqBjB,GAASgB,kBAAmB4D,OAAQtO,KAAK0M,8BACjI0B,EAAKxL,KAAK,MACVwL,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAASI,MAAOwE,OAAQtO,KAAKkM,kBAClEkC,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAASE,QAAS0E,OAAQtO,KAAK+L,oBACpEqC,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAASG,SAAUyE,OAAQtO,KAAKiM,uBAErEmC,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAASM,QAAS,CAAE/I,KAAM4B,EAAOrE,MAAM,CAAC,UAAW,eAAiB8P,OAAQtO,KAAKsM,qBACtH8B,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAASK,OAAQ,CAAE9I,KAAM4B,EAAOrE,MAAM,CAAC,UAAW,eAAiB8P,OAAQtO,KAAKoM,oBACrHgC,EAAKxL,KAAK,MACVwL,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAASe,KAAM,CAAExJ,KAAM4B,EAAOrE,MAAM,CAAC,UAAW,eAAiB8P,OAAQtO,KAAKwM,kBACnH4B,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAASkB,MAAO,CAAE3J,KAAM4B,EAAOrE,MAAM,CAAC,UAAW,eAAiB8P,OAAQtO,KAAK4M,mBACpHwB,EAAKxL,KAAK,CAAEwK,KAAM/L,EAAKgN,cAAc3E,GAASmB,OAAQ,CAAE5J,KAAM4B,EAAOrE,MAAM,CAAC,UAAW,eAAiB8P,OAAQtO,KAAK8M,gBAChHc,EAAcW,OAA6BA,MAA4BC,KAAoBC,OAC9FL,EAAKxL,KAAK,WACe8L,IAArBF,KACFJ,EAAKxL,KAAK,CACRwK,KAAM/L,EAAKgN,cAAc3E,GAASwB,cAAe,CAAEjK,KAAM4B,EAAOrE,MAAM,CAAC,UAAW,eAClFkF,KAAM8K,YAAiB3L,EAAOrE,MAAM,CAAC,UAAW,eAG5BkQ,IAApBD,KACFL,EAAKxL,KAAK,CACRwK,KAAM/L,EAAKgN,cAAc3E,GAASyB,cAClCzH,KAAM+K,YAAgB5L,EAAOrE,MAAM,CAAC,UAAW,OAAQqE,EAAOjC,IAAI,WAM1E,MAAM+N,EAAe,UAAWxB,WAAcW,GAC5C,mBAAK3M,UAAU,gCAAyB,EAAC,YAAC,IAAU,CAACyN,MAAOvN,EAAKgN,cAAc3E,GAASoB,OAAQ+D,KAAK,YAAYrO,QAASR,KAAKkN,eAG3H4B,EAAgBjM,EAAOrE,MAAM,CAAC,UAAW,SAAW0P,KAAmC,YAA7BrL,EAAOjC,IAAI,cAE3E,IAAImO,EAWJ,OATEA,EADElM,EAAOjC,IAAI,aACCS,EAAKgN,cAAc3E,GAASU,uBACjC0D,EACKzM,EAAKgN,cAAc3E,GAASQ,QACjC4E,EACKzN,EAAKgN,cAAc3E,GAASS,gBAE5B9I,EAAKgN,cAAc3E,GAASW,eAI1C,mBAAKlJ,UAAU,oCAA6B,EAC1C,mBAAKA,UAAU,gCAAyB,EAAC,YAAC,IAAU,CAACyN,MAAOvN,EAAKgN,cAAc3E,GAASO,OAAQ4E,KAA6C,OAAvChM,EAAOjC,IAAI,iBAAkB,MAAiB,QAAU,YAAaJ,QAASR,KAAKuL,oBACzL,mBAAKpK,UAAU,gCAAyB,EAAC,YAAC,IAAU,CAACA,UAAWiH,IAAW,CAAE0G,kBAAkBjG,UAAWiF,IAAiBgB,EAAeE,OAAQnM,EAAOjC,IAAI,aAAcgO,MAAOG,EAAaF,KAAK,UAAUrO,QAASR,KAAKyL,qBAC5N,mBAAKtK,UAAU,gCAAyB,EAAC,YAAC,IAAU,CAACA,UAAU,YAAY8N,SAAO,EAACD,OAAQnM,EAAOjC,IAAI,cAAegO,MAAOvN,EAAKgN,cAAc3E,GAASY,WAAYuE,KAAK,OAAOrO,QAASR,KAAK2L,wBAC7LgD,EACD,mBAAKxN,UAAU,gCAAyB,EAAC,YAAC,IAAU,CAACA,UAAU,gBAAgB0H,UAAW8E,EAAUqB,OAAQnM,EAAOjC,IAAI,cAAegO,MAAOvN,EAAKgN,cAAc3E,GAASa,UAAWsE,KAAK,WAAWrO,QAASR,KAAK6L,uBAElN,mBAAK1K,UAAU,6CAAsC,EACnD,YAAC,IAAqB,CAACb,KAAM,GAAIuO,KAAK,aAAalQ,MAAOyP,EAAMc,UAAU,OAAON,MAAOvN,EAAKgN,cAAc3E,GAASc,YAM7H,EAzLQxB,aAAe,CACpBzG,OAAQ0G,IAAUC,OAClB2E,SAAU5E,IAAUC,QALE,EAMvB,O,wMCaH,MAAMQ,GAAWC,YAAe,CAC9BwF,cAAc,CAAD,2DACbC,cAAc,CAAD,iGACbC,eAAe,CAAD,sEACdC,eAAe,CAAD,0KACdC,UAAU,CAAD,8DACTC,QAAQ,CAAD,8DACPC,eAAe,CAAD,yEACdC,aAAa,CAAD,yDACZC,aAAa,CAAD,0JACZC,YAAY,CAAD,sEAoGX,IAIIC,IAAM,GADXzR,mBApG2B,KAC1B,MAAM0R,EAAYC,eAEZC,EAAkBC,YAAe,CACrC,CAACC,EAAE,KAAD,IAAE,GAAEnR,GAAI,SAAKA,GACfV,GAASA,EAAMG,MAAM,CAAC,WAAY,iBACjC,CAACF,EAAU6R,KACZ,IAAIC,EAAeC,UAAUC,OAU7B,OATAF,EAAeA,EAAaG,eAAcC,IACxC,IAAIzR,EAAKT,EAET,KAAOS,IAAOyR,EAAQ1I,SAAS/I,IAC7ByR,EAAQC,QAAQ1R,GAChBA,EAAKoR,EAAWvP,IAAI7B,MAIjBqR,KAGHM,EAAoBT,YAAe,CACvC,CAACC,EAAE,KAAD,IAAE,GAAEnR,GAAI,SAAKA,GACfV,GAASA,EAAMG,MAAM,CAAC,WAAY,YAClCH,GAASA,EAAMuC,IAAI,cAClB,CAACtC,EAAUqS,EAAgBC,KAC5B,IAAIC,EAAiB,GACrB,MAAMC,EAAM,CAACxS,GAEb,KAAOwS,EAAIC,OAAS,GAAG,CACrB,IAAIhS,EAAY+R,EAAIE,MACpB,MAAMC,EAAUN,EAAe/P,IAAI7B,GAE/BT,IAAaS,GACf8R,EAAejO,KAAK7D,GAGlBkS,GACFA,EAAQC,UAAUC,SAAQlH,IACnB6G,EAAIhJ,SAASmC,IAAW4G,EAAe/I,SAASmC,IAAU3L,IAAa2L,GAAO6G,EAAIlO,KAAKqH,MAKlG,IAAImH,EAAWP,EAAeQ,WAAWtS,GAAO6R,EAAShQ,IAAI7B,GAAI6B,IAAI,4BAA8BgQ,EAAShQ,IAAI7B,GAAI6B,IAAI,aAWxH,OAVkB,IAAdwQ,GACFP,EAAeM,SAAQ,CAACpS,EAAIuS,KACtBA,EAAMF,GAAYR,EAAShQ,IAAI7B,GAAI6B,IAAI,4BAA8BgQ,EAAShQ,IAAI7B,GAAI6B,IAAI,aAC5FiQ,EAAeU,OAAOD,EAAK,GAC3BT,EAAeU,OAAOH,EAAU,EAAGrS,GACnCqS,GAAY,MAKXf,UAAUC,KAAKO,MAyBxB,MAtBwB,CAACxS,EAAO4B,KAC9B,MAAM4C,EAASiN,EAAUzR,EAAO,CAAEU,GAAIkB,EAAMuR,OAAOlT,WACnD,IAAI8R,EAAeC,UAAUC,OACzBO,EAAiBR,UAAUC,OAO/B,OALIzN,IACFuN,EAAeJ,EAAgB3R,EAAO,CAAEU,GAAI8D,EAAOjC,IAAI,oBACvDiQ,EAAiBH,EAAkBrS,EAAO,CAAEU,GAAI8D,EAAOjC,IAAI,SAGtD,CACL6Q,UAAWpT,EAAMG,MAAM,CAAC,WAAYyB,EAAMuR,OAAOlT,SAAU,cAC3DuE,SACAuN,eACAS,iBACA9L,SAAU1G,EAAMuC,IAAI,kBACpB8Q,qBAAsBrT,EAAMG,MAAM,CAAC,iBAAkB,mCAAwF,IAAnDH,EAAMG,MAAM,CAAC,UAAW,SAASmT,OAAOZ,OAClIxI,OAAQlK,EAAMG,MAAM,CAAC,OAAQ,WAC7BwG,SAAU3G,EAAMuC,IAAI,sBAAsBtC,WAAa2B,EAAMuR,OAAOlT,cAwB1DoB,YAAU,UAAX,cAEMoC,IAAwB,cAAD,sCAsB1CzD,MAAQ,CACNuT,YAAY,EACZC,gBAAYnD,EACZoD,oBAAgBpD,EAChBpQ,cAAUoQ,EACVqD,oBAAgBrD,EAChBhI,eAAWgI,EACXsD,oBAAgBtD,GAChB,KA6CFuD,mBAAqB,KACnB,MAAM,OAAEpP,GAAW7C,KAAKC,MAEpBD,KAAKC,MAAM8E,SAASvG,MAAM,CAAC,mBAAoB,iBAC7CqE,EAAOjC,IAAI,UACbZ,KAAKC,MAAMpB,SAASqT,YAAarP,EAAOjC,IAAI,QAE5CZ,KAAKC,MAAMpB,SAASsT,YAAWtP,EAAOjC,IAAI,QAEnCZ,KAAKC,MAAM4C,OAAOjC,IAAI,iBAC/BZ,KAAKoS,cAAcpS,KAAK3B,MAAMwT,aAEjC,KAEDQ,4BAA8B,KAC5BrS,KAAKqE,SAAS,CAAEqC,WAAY1G,KAAK3B,MAAMqI,aACxC,KAED4L,qBAAwBzP,IACtB7C,KAAKC,MAAMpB,SAASyL,aAAUzH,KAC/B,KAED8I,qBAAuB,CAAC9I,EAAQZ,KAC9B,MAAM,SAAEpD,GAAamB,KAAKC,OACpB,SAAE0N,GAAa3N,KAAKsC,QAAQuL,SAE9BF,EACE9K,EAAOjC,IAAI,cACb/B,EAAS0T,aAAY1P,IAEhBZ,GAAKA,EAAEuQ,WAAcC,IACxBzS,KAAKsS,qBAAqBzP,GAE1BhE,EAASY,YAAU,YAAa,CAAEoD,SAAQ+I,YAAa5L,KAAKsS,wBAIhEzT,EAASY,YAAU,cAAe,CAChCiT,KAAM,YACN3R,UAAW8B,EAAOrE,MAAM,CAAC,UAAW,OACpC6O,IAAKxK,EAAOjC,IAAI,WAGrB,KAED+R,UAAa9P,IACPA,EAAOjC,IAAI,UACbZ,KAAKC,MAAMpB,SAASmM,aAAMnI,IAE1B7C,KAAKC,MAAMpB,SAASkM,aAAIlI,KAE3B,KAED0I,iBAAoB1I,IAClB,MAAM,qBAAE6O,EAAoB,SAAE7S,EAAQ,KAAEwC,GAASrB,KAAKC,OAChD,SAAE0N,GAAa3N,KAAKsC,QAAQuL,SAI9BhP,EAFA8O,EACE+D,EACOjS,YAAU,UAAW,CAC5BmT,QAASvR,EAAKgN,cAAc3E,GAASiG,cACrCkD,QAASxR,EAAKgN,cAAc3E,GAASgG,cACrCoD,WAAY,IAAMjU,EAASkU,aAAmB,CAAC,kCAAkC,IACjFC,UAAW,IAAMnU,EAASoU,cAAapQ,EAAQ7C,KAAKsC,QAAQC,OAAOE,YAG5DwQ,cAAapQ,EAAQ7C,KAAKsC,QAAQC,OAAOE,SAG3ChD,YAAU,cAAe,CAChCiT,KAAM,QACN3R,UAAW8B,EAAOrE,MAAM,CAAC,UAAW,OACpC6O,IAAKxK,EAAOjC,IAAI,WAGrB,KAEDsS,kBAAoB,CAACrQ,EAAQsQ,KAC3B,MAAM,SAAEtU,GAAamB,KAAKC,MAEtB4C,EAAOjC,IAAI,aACb/B,EAASuU,aAASvQ,IAElBhE,EAASqL,aAAOrH,EAAQsQ,KAE3B,KAED1H,kBAAoB,CAAC5I,EAAQZ,KAC3B,MAAM,SAAE8C,EAAQ,SAAElG,GAAamB,KAAKC,OAC9B,SAAE0N,GAAa3N,KAAKsC,QAAQuL,SAE9BF,EACE5I,EAASnE,IAAI,4CAA8CiC,EAAOjC,IAAI,qBAAqBmF,MAAKjG,IAASA,EAAKc,IAAI,mBAAoBiC,EAAOjC,IAAI,aACnJ/B,EAASwU,aAAe,CAAExQ,SAAQ6I,SAAU1L,KAAKkT,kBAAmBI,yBAAyB,KACnFrR,GAAKA,EAAEuQ,WAAce,IAC/BvT,KAAKkT,kBAAkBrQ,GAEvBhE,EAASwU,aAAe,CAAExQ,SAAQ6I,SAAU1L,KAAKkT,qBAGnDrU,EAASY,YAAU,cAAe,CAChCiT,KAAM,SACN3R,UAAW8B,EAAOrE,MAAM,CAAC,UAAW,OACpC6O,IAAKxK,EAAOjC,IAAI,WAGrB,KAEDiL,oBAAuBhJ,IACjBA,EAAOjC,IAAI,cACbZ,KAAKC,MAAMpB,SAAS2U,aAAW3Q,IAE/B7C,KAAKC,MAAMpB,SAAS0L,aAAS1H,KAEhC,KAEDkJ,kBAAoB,SAAClJ,EAAQJ,EAASgR,QAAW,IAAXA,OAAc,GAClD,MAAM,SAAE5U,EAAQ,KAAEwC,GAAS,EAAKpB,MAE3ByT,IAGH7U,EAASY,YAAU,UAAW,CAC5BmT,QAASvR,EAAKgN,cAAcoF,EAAc/J,GAAS4F,eAAiB5F,GAAS0F,eAC7EyD,QAASxR,EAAKgN,cAAcoF,EAAc/J,GAAS2F,eAAiB3F,GAASyF,eAC7E6D,UAAW,IAAMnU,EAAS8U,YAAa9Q,EAAOjC,IAAI,MAAO6B,EAASgR,OALpE5U,EAAS8U,YAAa9Q,EAAOjC,IAAI,MAAO6B,EAASgR,KAQpD,KAEDvH,gBAAkB,CAACrJ,EAAQJ,KACzBzC,KAAKC,MAAMpB,SAAS+U,YAAW/Q,EAAOjC,IAAI,MAAO6B,KAClD,KAED2J,kBAAoB,CAAC/D,EAAS9F,KAC5BvC,KAAKC,MAAMpB,SAASgV,cAAcxL,EAAS9F,KAC5C,KAED+J,mBAAqB,CAACjE,EAAS9F,KAC7BvC,KAAKC,MAAMpB,SAASiV,cAAezL,EAAS9F,KAC7C,KAEDwR,gBAAkB,CAAClO,EAAOrG,KACxBQ,KAAKC,MAAMpB,SAASY,YAAU,QAAS,CAAEnB,SAAU0B,KAAKC,MAAM4C,OAAOjC,IAAI,MAAOiF,QAAOrG,YACxF,KAEDyD,gBAAkB,CAAC4C,EAAO3C,KACxBlD,KAAKC,MAAMpB,SAASY,YAAU,QAAS,CAAEnB,SAAU0B,KAAKC,MAAM4C,OAAOjC,IAAI,MAAOiF,QAAO3C,cACxF,KAED8Q,sBAAwB/R,IACtB,MAAM,OAAEY,GAAW7C,KAAKC,MAExBgC,EAAEO,iBAEEK,EAAOjC,IAAI,qBAAqBN,KAAO,IACc,UAAnDuC,EAAOrE,MAAM,CAAC,oBAAqB,EAAG,SACxCwB,KAAKiD,gBAAgBJ,EAAOrE,MAAM,CAAC,oBAAqB,IAAK,CAAEyV,UAAW,IAE1EjU,KAAK+T,gBAAgBlR,EAAOjC,IAAI,qBAAsB,KAG3D,KAED4L,gBAAmBnE,IACjBrI,KAAKC,MAAMpB,SAASqV,aAAc7L,KACnC,KAEDqE,4BAA+B7J,IACzBA,EAAOjC,IAAI,SACbZ,KAAKC,MAAMpB,SAASsV,YAAatR,EAAOjC,IAAI,QAE5CZ,KAAKC,MAAMpB,SAASuV,YAAWvR,EAAOjC,IAAI,SAE7C,KAEDyT,gBAAkB,KAChB,MAAM,OAAExR,EAAM,aAAEuN,EAAY,eAAES,EAAc,SAAE9L,GAAa/E,KAAKC,MAC1DqU,EAAY,CAACzR,EAAOjC,IAAI,OAAO2T,OAAOnE,EAAaoE,OAAQ3D,EAAe2D,QAChF,IAAI,WAAE3C,GAAe7R,KAAK3B,MAEtB0G,EAASvG,MAAM,CAAC,mBAAoB,mBACtCqT,GAAchP,EAAOjC,IAAI,WAEtBiR,EAGH7R,KAAKC,MAAMpB,SAASsT,YAAWmC,IAF/BtU,KAAKC,MAAMpB,SAASqT,YAAaoC,IAKnCtU,KAAKqE,SAAS,CAAEwN,YAAaA,EAAYC,gBAAiBD,KAC3D,KAED7N,gBAAkBnB,IAChB,MAAM,SAAEhE,GAAamB,KAAKC,MAEtB4C,EAAOjC,IAAI,eACb/B,EAAS4V,YAAsB5R,EAAOjC,IAAI,QAE1C/B,EAAS6V,YAAgB7R,EAAOjC,IAAI,SAEvC,KAEDgM,iBAAoB/J,IAClB,MAAM,SAAEhE,GAAamB,KAAKC,MACpBoI,EAAUxF,EAAOjC,IAAI,WAC3B/B,EAAS8V,aAAetM,KACzB,KAEDyE,aAAgBjK,IACd7C,KAAKC,MAAMpB,SAAS+V,aAAW/R,EAAOjC,IAAI,WAAYiC,KACvD,KAEDyK,YAAezK,IACb7C,KAAKC,MAAMpB,SAASY,YAAU,QAAS,CAAE4N,IAAKxK,EAAOjC,IAAI,WAC1D,KAEDiU,4BAA8B,KAC5B7U,KAAKqS,+BACN,KAEDyC,mBAAqB,KACnB9U,KAAK+U,aAAa/U,KAAKC,MAAM4C,OAAOjC,IAAI,QACzC,KAEDoU,qBAAuB,KACrBhV,KAAKiV,eAAejV,KAAKC,MAAM4C,OAAOjC,IAAI,QAC3C,KAEDsU,kBAAoBjT,IAClBA,EAAEO,iBACFxC,KAAKuL,iBAAiBvL,KAAKC,MAAM4C,SAClC,KAEDsS,sBAAwB,KACtBnV,KAAK2L,qBAAqB3L,KAAKC,MAAM4C,SACtC,KAEDuS,kBAAoB,KAClBpV,KAAKyL,kBAAkBzL,KAAKC,MAAM4C,SACnC,KAEDwS,qBAAuB,KACrBrV,KAAK6L,oBAAoB7L,KAAKC,MAAM4C,SACrC,KAEDyS,oBAAsBrT,IACpBA,EAAEO,iBACFxC,KAAKsM,mBAAmBtM,KAAKC,MAAM4C,SACpC,KAED0S,wBAA0B,KACxB,IAAIlX,EAAQ,IAAI2B,KAAKsC,QAAQC,OAAOE,QAAQC,SAASrE,OACrDA,EAAMsE,mBAAqBtE,EAAMsE,mBAAqB,GAAK,EAC3D3C,KAAKsC,QAAQC,OAAOE,QAAQG,KAAM,KAAI5C,KAAKC,MAAM4C,OAAOrE,MAAM,CAAC,UAAW,WAAYH,IACvF,KAED0W,aAAehW,IACb,MAAM,OAAE8D,EAAM,aAAEuN,EAAY,eAAES,GAAmB7Q,KAAKC,MAEtD,GAAIlB,IAAO8D,EAAOjC,IAAI,MACpBZ,KAAKwV,aAAapF,EAAa9P,KAAO,GAAG,OACpC,CACL,IAAId,EAAQ4Q,EAAaqF,QAAQ1W,IAElB,IAAXS,GACFA,EAAQqR,EAAe4E,QAAQ1W,GAC/BiB,KAAKwV,aAAapF,EAAa9P,KAAOd,GAAO,IAE7CQ,KAAKwV,aAAahW,EAAQ,GAAG,KAGlC,KAEDyV,eAAiBlW,IACf,MAAM,OAAE8D,EAAM,aAAEuN,EAAY,eAAES,GAAmB7Q,KAAKC,MAEtD,GAAIlB,IAAO8D,EAAOjC,IAAI,MACpBZ,KAAKwV,aAAapF,EAAa9P,KAAO,GAAG,OACpC,CACL,IAAId,EAAQ4Q,EAAaqF,QAAQ1W,IAElB,IAAXS,GACFA,EAAQqR,EAAe4E,QAAQ1W,GAC/BiB,KAAKwV,aAAapF,EAAa9P,KAAOd,EAAQ,GAAG,IAEjDQ,KAAKwV,aAAahW,EAAQ,GAAG,KAGlC,KAgBDkW,kBAAoB,KAClB1V,KAAK2V,OAAOC,aACb,KAeDxD,aAAenK,IACbjI,KAAKqE,SAAS,CAAEwN,WAAY5J,KAC7B,KAED7E,OAASC,IACPrD,KAAKsD,KAAOD,GACb,KAEDwS,aAAexS,IACbrD,KAAK2V,OAAStS,GACf,KAoBDyS,mBAAqB,KACnB9V,KAAKqE,SAAS,CAAEuN,WAAYmE,kBA5Y9BC,oBACEC,aAAyBjW,KAAK8V,oBAC9B9V,KAAKC,MAAMpB,SAASqX,YAAYlW,KAAKC,MAAMuR,OAAOlT,WAElD,MAAM,OAAEuE,EAAM,aAAEuN,GAAiBpQ,KAAKC,MAEtC,GAAI4C,GAAUuN,GAAgBA,EAAa9P,KAAO,EAAG,CACnD,MAAM6V,EAAUnW,KAAKsD,KAAK8S,iBAAiB,cAAchG,EAAa9P,KAAO,GAE7EwD,OAAOuS,uBAAsB,KAC3BF,EAAQG,gBAAe,OAK7BC,gCAAgCtW,EAAO5B,GACrC,IAAImY,EAAS,GACTC,GAAU,EAEVxW,EAAMuR,OAAOlT,UAAYD,EAAMC,WAAa2B,EAAMuR,OAAOlT,WAC3D2B,EAAMpB,SAASqX,YAAYjW,EAAMuR,OAAOlT,WACxCkY,EAAO1E,oBAAiBpD,EACxB8H,EAAOlY,SAAW2B,EAAMuR,OAAOlT,SAC/BmY,GAAU,GAGZ,MAAMzE,EAAiB/R,EAAM8E,SAASvG,MAAM,CAAC,QAAS,qBActD,OAbIwT,IAAmB3T,EAAM2T,iBAC3BwE,EAAOxE,eAAiBA,EACpBA,IAAgBwE,EAAO9P,UAAYgQ,aAAuBzW,EAAM4C,OAAQ5C,EAAM8E,WAClF0R,GAAU,GAGRxW,EAAM4C,QAAUxE,EAAM0T,iBAAmB9R,EAAM4C,OAAOjC,IAAI,QAC5D4V,EAAO9P,UAAYgQ,aAAuBzW,EAAM4C,OAAQ5C,EAAM8E,UAC9DyR,EAAOzE,eAAiB9R,EAAM4C,OAAOjC,IAAI,MACzC4V,EAAO3E,WAAa8E,aAAa1W,EAAM8E,SAAU9E,EAAM4C,QACvD4T,GAAU,GAGLA,EAAUD,EAAS,KAsS5BhB,aAAchW,EAAOoX,GACnB,MAAMC,EAAY7W,KAAKsD,KACjB6S,EAAUU,EAAUT,iBAAiB,cAAc5W,GAErD2W,IACES,GAAaC,EAAUjB,UAAYO,EAAQW,UAC7CX,EAAQG,gBAAe,IACbM,GAAaC,EAAUjB,UAAYiB,EAAUE,aAAeZ,EAAQW,UAAYX,EAAQa,cAClGb,EAAQG,gBAAe,GAEzBH,EAAQc,SAQZC,eAAgBC,GACd,OAAOA,EAAK9N,KAAItK,GACd,YAAC,KAAe,CAEdA,GAAIA,EACJ8F,SAAU7E,KAAK3B,MAAMyT,eACrBsF,SAAUpX,KAAK+U,aACfsC,WAAYrX,KAAKiV,eACjBqC,YAAY,UALPvY,KAsBX2F,mBAAoBC,GAClB,GAAI3E,KAAKC,MAAMuR,OAAOlT,WAAa0B,KAAKC,MAAMuR,OAAOlT,WAAaqG,EAAU6M,OAAOlT,UAAYqG,EAAUyL,aAAa9P,KAAON,KAAKC,MAAMmQ,aAAa9P,MAAO,CAC1J,MAAM,OAAEuC,EAAM,aAAEuN,GAAiBpQ,KAAKC,MAEtC,GAAI4C,GAAUuN,GAAgBA,EAAa9P,KAAO,EAAG,CACnD,MAAM6V,EAAUnW,KAAKsD,KAAK8S,iBAAiB,cAAchG,EAAa9P,KAAO,GAE7EwD,OAAOuS,uBAAsB,KAC3BF,EAAQG,gBAAe,QAM/BiB,uBACEC,aAAyBxX,KAAK8V,oBAOhC1U,SACE,IAAIqW,EAAWC,EACf,MAAM,UAAEjG,EAAS,OAAE5O,EAAM,SAAEkC,EAAQ,aAAEqL,EAAY,eAAES,EAAc,KAAExP,EAAI,OAAEkH,EAAM,YAAEoP,EAAW,SAAE3S,GAAahF,KAAKC,OAC1G,WAAE2R,GAAe5R,KAAK3B,MAE5B,GAAIoT,EACF,OACE,YAAC,KAAM,UACL,YAAC,IAAgB,KAKvB,GAAe,OAAX5O,EACF,OACE,YAAC,KAAM,UACL,YAAC,KAAgB,CAAC8U,YAAaA,IAC/B,YAAC,IAAgB,KAKvB,MAAM9F,EAAa9M,EAASvG,MAAM,CAAC,mBAAoB,kBAAoBqE,EAAOjC,IAAI,UAAYZ,KAAK3B,MAAMwT,WAEzGzB,GAAgBA,EAAa9P,KAAO,IACtCmX,EAAY,4BAAMzX,KAAKkX,eAAe9G,KAGpCS,GAAkBA,EAAevQ,KAAO,IAC1CoX,EAAc,4BAAM1X,KAAKkX,eAAerG,KAG1C,MAAM+G,GAAkE,IAAxD/U,EAAOrE,MAAM,CAAC,UAAW,QAAS,IAAIiX,QAAQ,KACxDoC,GAAehV,EAAOrE,MAAM,CAAC,UAAW,YAExCsZ,EAAW,CACfC,OAAQ/X,KAAK8U,mBACbkD,SAAUhY,KAAKgV,qBACf/K,MAAOjK,KAAKkV,kBACZ5K,UAAWtK,KAAKmV,sBAChB8C,MAAOjY,KAAKoV,kBACZ7K,SAAUvK,KAAKqV,qBACfrL,QAAShK,KAAKsV,oBACd4C,YAAalY,KAAKuV,wBAClB4C,cAAenY,KAAKiS,mBACpBmG,gBAAiBpY,KAAK6U,4BACtBwD,UAAWrY,KAAKgU,uBAGlB,OACE,kBAAC,KAAM,CAACsE,gBAAiBX,EAAaxP,IAAKnI,KAAK6V,aAAc7U,MAAOK,EAAKgN,cAAc3E,GAAS+F,iBAC/F,YAAC,KAAY,CACXZ,KAAK,UACLD,MAAOvN,EAAKgN,cAAc3E,GAASkG,aACnCpP,QAASR,KAAK0V,kBACd6C,gBAAc,EACdZ,YAAaA,EACba,YACE,sBAAQrX,UAAU,wBAAwByN,MAAOvN,EAAKgN,cAAewD,EAAkCnI,GAAS8F,QAA9B9F,GAAS6F,WAA+B,aAAYlO,EAAKgN,cAAewD,EAAkCnI,GAAS8F,QAA9B9F,GAAS6F,WAA+B/O,QAASR,KAAKqU,sBAAgB,EAAC,YAAC,IAAI,CAACtV,GAAK8S,EAA2B,MAAd,iBAI1Q,YAAC,KAAe,CAAC4G,UAAU,eAAQ,EACjC,yBAAKtX,UAAWiH,IAAW,aAAc,2BAA4B,CAAEwJ,eAAezJ,IAAKnI,KAAKoD,QAC7FqU,EAED,YAAC,WAAO,CAACK,SAAUA,QAAS,EAC1B,mBAAK3W,UAAU,YAAYuX,SAAS,IAAI,aAAYC,aAAoBtX,EAAMwB,GAAQ,EAAOgP,SAAY,EACvG,YAAC,EAAc,CAEbhP,OAAQA,EACRkC,SAAUA,EACV5B,YAAanD,KAAKiD,gBAClBsE,YAAavH,KAAK+T,gBAClBlP,SAAUgN,EACV/M,eAAgB9E,KAAKiS,mBACrBhO,YAAajE,KAAKgE,gBAClBuE,OAAQA,EACR7B,UAAW1G,KAAK3B,MAAMqI,UACtBG,wBAAyB7G,KAAKqS,4BAC9BrN,SAAUA,GAXJ,WAAUnC,EAAOjC,IAAI,SAc7B,YAAC,GAAS,CAERiC,OAAQA,EACR2I,QAASxL,KAAKuL,iBACdK,YAAa5L,KAAK2L,qBAClBD,SAAU1L,KAAKyL,kBACfK,WAAY9L,KAAK6L,oBACjBG,SAAUhM,KAAK+L,kBACfI,OAAQnM,KAAKkM,gBACbG,SAAUrM,KAAKoM,kBACfG,UAAWvM,KAAKsM,mBAChBG,OAAQzM,KAAKwM,gBACbG,mBAAoB3M,KAAK0M,4BACzBG,QAAS7M,KAAK4M,iBACdG,SAAU/M,KAAK8M,aACfG,MAAOjN,KAAK2S,UACZpF,QAASvN,KAAKsN,aAfR,cAAazK,EAAOjC,IAAI,WAoBnC8W,IAIL,YAACkB,GAAA,EAAM,UACL,8BAviBc/V,KACtB,MAAMgW,EAAchW,EAAOrE,MAAM,CAAC,UAAW,iBACvCsa,EAAWjW,EAAOrE,MAAM,CAAC,UAAW,aACpCua,EAAuC,IAA9BF,EAAYlH,OAAOZ,OAAe+H,EAAWD,EACtDzL,EAAOvK,EAAOjC,IAAI,gBAExB,MAAQ,GAAEmY,OAdMC,EAce5L,EAdV6L,EAcgB,GAbjCD,EAAIjI,OAASkI,EACRD,EAAIE,MAAM,EAAGD,GAAO,IAEpBD,KAJM,IAACA,EAAKC,GA+iBLE,CAAgBtW,IACxB,oBAAM5B,KAAK,SAASmY,QAAUxB,GAAWC,EAAe,MAAQ,gBAMzE,GAjiBQ7O,aAAe,CACpBzG,OAAQ0G,IAAUC,OAClB2E,SAAU5E,IAAUC,QACrB,GAEMC,UAAY,CACjBqI,OAAQvI,IAAUC,OAAOI,WACzBzK,SAAUoK,IAAUM,KAAKD,WACzBzG,OAAQuG,IAAmBC,IAC3BoI,UAAWxI,IAAUO,KACrBzE,SAAUqE,IAAmBC,IAAIC,WACjC8G,aAAchH,IAAmB+N,KACjCtG,eAAgBzH,IAAmB+N,KACnC9V,KAAM4H,IAAUC,OAAOI,WACvBoI,qBAAsBzI,IAAUO,KAChCmO,YAAa1O,IAAUO,KACvBjB,OAAQU,IAAUQ,OAAOH,WACzBtE,SAAUiE,IAAUO,MArBE,GAsBvB","file":"js/flavours/glitch/async/status-22f7529542d8aa64ffb9.chunk.js","sourcesContent":["import { connect } from 'react-redux';\nimport { openDropdownMenu, closeDropdownMenu } from 'flavours/glitch/actions/dropdown_menu';\nimport { fetchHistory } from 'flavours/glitch/actions/history';\nimport DropdownMenu from 'flavours/glitch/components/dropdown_menu';\n\nconst mapStateToProps = (state, { statusId }) => ({\n dropdownPlacement: state.getIn(['dropdown_menu', 'placement']),\n openDropdownId: state.getIn(['dropdown_menu', 'openId']),\n openedViaKeyboard: state.getIn(['dropdown_menu', 'keyboard']),\n items: state.getIn(['history', statusId, 'items']),\n loading: state.getIn(['history', statusId, 'loading']),\n});\n\nconst mapDispatchToProps = (dispatch, { statusId }) => ({\n\n onOpen (id, onItemClick, dropdownPlacement, keyboard) {\n dispatch(fetchHistory(statusId));\n dispatch(openDropdownMenu(id, dropdownPlacement, keyboard));\n },\n\n onClose (id) {\n dispatch(closeDropdownMenu(id));\n },\n\n});\n\nexport default connect(mapStateToProps, mapDispatchToProps)(DropdownMenu);\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport { FormattedMessage, injectIntl } from 'react-intl';\nimport Icon from 'flavours/glitch/components/icon';\nimport DropdownMenu from './containers/dropdown_menu_container';\nimport { connect } from 'react-redux';\nimport { openModal } from 'flavours/glitch/actions/modal';\nimport RelativeTimestamp from 'flavours/glitch/components/relative_timestamp';\nimport InlineAccount from 'flavours/glitch/components/inline_account';\n\nconst mapDispatchToProps = (dispatch, { statusId }) => ({\n\n onItemClick (index) {\n dispatch(openModal('COMPARE_HISTORY', { index, statusId }));\n },\n\n});\n\nexport default @connect(null, mapDispatchToProps)\n@injectIntl\nclass EditedTimestamp extends React.PureComponent {\n\n static propTypes = {\n statusId: PropTypes.string.isRequired,\n timestamp: PropTypes.string.isRequired,\n intl: PropTypes.object.isRequired,\n onItemClick: PropTypes.func.isRequired,\n };\n\n handleItemClick = (item, i) => {\n const { onItemClick } = this.props;\n onItemClick(i);\n };\n\n renderHeader = items => {\n return (\n <FormattedMessage id='status.edited_x_times' defaultMessage='Edited {count, plural, one {{count} time} other {{count} times}}' values={{ count: items.size - 1 }} />\n );\n }\n\n renderItem = (item, index, { onClick, onKeyPress }) => {\n const formattedDate = <RelativeTimestamp timestamp={item.get('created_at')} short={false} />;\n const formattedName = <InlineAccount accountId={item.get('account')} />;\n\n const label = item.get('original') ? (\n <FormattedMessage id='status.history.created' defaultMessage='{name} created {date}' values={{ name: formattedName, date: formattedDate }} />\n ) : (\n <FormattedMessage id='status.history.edited' defaultMessage='{name} edited {date}' values={{ name: formattedName, date: formattedDate }} />\n );\n\n return (\n <li className='dropdown-menu__item edited-timestamp__history__item' key={item.get('created_at')}>\n <button data-index={index} onClick={onClick} onKeyPress={onKeyPress}>{label}</button>\n </li>\n );\n }\n\n render () {\n const { timestamp, intl, statusId } = this.props;\n\n return (\n <DropdownMenu statusId={statusId} renderItem={this.renderItem} scrollable renderHeader={this.renderHeader} onItemClick={this.handleItemClick}>\n <button className='dropdown-menu__text-button'>\n <FormattedMessage id='status.edited' defaultMessage='Edited {date}' values={{ date: intl.formatDate(timestamp, { hour12: false, month: 'short', day: '2-digit', hour: '2-digit', minute: '2-digit' }) }} /> <Icon id='caret-down' />\n </button>\n </DropdownMenu>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport Avatar from 'flavours/glitch/components/avatar';\nimport DisplayName from 'flavours/glitch/components/display_name';\nimport StatusContent from 'flavours/glitch/components/status_content';\nimport MediaGallery from 'flavours/glitch/components/media_gallery';\nimport AttachmentList from 'flavours/glitch/components/attachment_list';\nimport { Link } from 'react-router-dom';\nimport { injectIntl, FormattedDate } from 'react-intl';\nimport Card from './card';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport Video from 'flavours/glitch/features/video';\nimport Audio from 'flavours/glitch/features/audio';\nimport VisibilityIcon from 'flavours/glitch/components/status_visibility_icon';\nimport scheduleIdleTask from '../../ui/util/schedule_idle_task';\nimport classNames from 'classnames';\nimport PollContainer from 'flavours/glitch/containers/poll_container';\nimport Icon from 'flavours/glitch/components/icon';\nimport AnimatedNumber from 'flavours/glitch/components/animated_number';\nimport PictureInPicturePlaceholder from 'flavours/glitch/components/picture_in_picture_placeholder';\nimport EditedTimestamp from 'flavours/glitch/components/edited_timestamp';\n\nexport default @injectIntl\nclass DetailedStatus extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n };\n\n static propTypes = {\n status: ImmutablePropTypes.map,\n settings: ImmutablePropTypes.map.isRequired,\n onOpenMedia: PropTypes.func.isRequired,\n onOpenVideo: PropTypes.func.isRequired,\n onToggleHidden: PropTypes.func,\n onTranslate: PropTypes.func.isRequired,\n expanded: PropTypes.bool,\n measureHeight: PropTypes.bool,\n onHeightChange: PropTypes.func,\n domain: PropTypes.string.isRequired,\n compact: PropTypes.bool,\n showMedia: PropTypes.bool,\n usingPiP: PropTypes.bool,\n onToggleMediaVisibility: PropTypes.func,\n intl: PropTypes.object.isRequired,\n };\n\n state = {\n height: null,\n };\n\n handleAccountClick = (e) => {\n if (e.button === 0 && !(e.ctrlKey || e.altKey || e.metaKey) && this.context.router) {\n e.preventDefault();\n let state = {...this.context.router.history.location.state};\n state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;\n this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state);\n }\n\n e.stopPropagation();\n }\n\n parseClick = (e, destination) => {\n if (e.button === 0 && !(e.ctrlKey || e.altKey || e.metaKey) && this.context.router) {\n e.preventDefault();\n let state = {...this.context.router.history.location.state};\n state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;\n this.context.router.history.push(destination, state);\n }\n\n e.stopPropagation();\n }\n\n handleOpenVideo = (options) => {\n this.props.onOpenVideo(this.props.status.getIn(['media_attachments', 0]), options);\n }\n\n _measureHeight (heightJustChanged) {\n if (this.props.measureHeight && this.node) {\n scheduleIdleTask(() => this.node && this.setState({ height: Math.ceil(this.node.scrollHeight) + 1 }));\n\n if (this.props.onHeightChange && heightJustChanged) {\n this.props.onHeightChange();\n }\n }\n }\n\n setRef = c => {\n this.node = c;\n this._measureHeight();\n }\n\n componentDidUpdate (prevProps, prevState) {\n this._measureHeight(prevState.height !== this.state.height);\n }\n\n handleChildUpdate = () => {\n this._measureHeight();\n }\n\n handleModalLink = e => {\n e.preventDefault();\n\n let href;\n\n if (e.target.nodeName !== 'A') {\n href = e.target.parentNode.href;\n } else {\n href = e.target.href;\n }\n\n window.open(href, 'mastodon-intent', 'width=445,height=600,resizable=no,menubar=no,status=no,scrollbars=yes');\n }\n\n handleTranslate = () => {\n const { onTranslate, status } = this.props;\n onTranslate(status);\n }\n\n render () {\n const status = (this.props.status && this.props.status.get('reblog')) ? this.props.status.get('reblog') : this.props.status;\n const { expanded, onToggleHidden, settings, usingPiP, intl } = this.props;\n const outerStyle = { boxSizing: 'border-box' };\n const { compact } = this.props;\n\n if (!status) {\n return null;\n }\n\n let applicationLink = '';\n let reblogLink = '';\n let reblogIcon = 'retweet';\n let favouriteLink = '';\n let edited = '';\n\n // Depending on user settings, some media are considered as parts of the\n // contents (affected by CW) while other will be displayed outside of the\n // CW.\n let contentMedia = [];\n let contentMediaIcons = [];\n let extraMedia = [];\n let extraMediaIcons = [];\n let media = contentMedia;\n let mediaIcons = contentMediaIcons;\n\n if (settings.getIn(['content_warnings', 'media_outside'])) {\n media = extraMedia;\n mediaIcons = extraMediaIcons;\n }\n\n if (this.props.measureHeight) {\n outerStyle.height = `${this.state.height}px`;\n }\n\n if (usingPiP) {\n media.push(<PictureInPicturePlaceholder />);\n mediaIcons.push('video-camera');\n } else if (status.get('media_attachments').size > 0) {\n if (status.get('media_attachments').some(item => item.get('type') === 'unknown')) {\n media.push(<AttachmentList media={status.get('media_attachments')} />);\n } else if (status.getIn(['media_attachments', 0, 'type']) === 'audio') {\n const attachment = status.getIn(['media_attachments', 0]);\n\n media.push(\n <Audio\n src={attachment.get('url')}\n alt={attachment.get('description')}\n duration={attachment.getIn(['meta', 'original', 'duration'], 0)}\n poster={attachment.get('preview_url') || status.getIn(['account', 'avatar_static'])}\n backgroundColor={attachment.getIn(['meta', 'colors', 'background'])}\n foregroundColor={attachment.getIn(['meta', 'colors', 'foreground'])}\n accentColor={attachment.getIn(['meta', 'colors', 'accent'])}\n sensitive={status.get('sensitive')}\n visible={this.props.showMedia}\n blurhash={attachment.get('blurhash')}\n height={150}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />,\n );\n mediaIcons.push('music');\n } else if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n const attachment = status.getIn(['media_attachments', 0]);\n media.push(\n <Video\n preview={attachment.get('preview_url')}\n frameRate={attachment.getIn(['meta', 'original', 'frame_rate'])}\n blurhash={attachment.get('blurhash')}\n src={attachment.get('url')}\n alt={attachment.get('description')}\n inline\n sensitive={status.get('sensitive')}\n letterbox={settings.getIn(['media', 'letterbox'])}\n fullwidth={settings.getIn(['media', 'fullwidth'])}\n preventPlayback={!expanded}\n onOpenVideo={this.handleOpenVideo}\n autoplay\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />,\n );\n mediaIcons.push('video-camera');\n } else {\n media.push(\n <MediaGallery\n standalone\n sensitive={status.get('sensitive')}\n media={status.get('media_attachments')}\n letterbox={settings.getIn(['media', 'letterbox'])}\n fullwidth={settings.getIn(['media', 'fullwidth'])}\n hidden={!expanded}\n onOpenMedia={this.props.onOpenMedia}\n visible={this.props.showMedia}\n onToggleVisibility={this.props.onToggleMediaVisibility}\n />,\n );\n mediaIcons.push('picture-o');\n }\n } else if (status.get('card')) {\n media.push(<Card sensitive={status.get('sensitive')} onOpenMedia={this.props.onOpenMedia} card={status.get('card')} />);\n mediaIcons.push('link');\n }\n\n if (status.get('poll')) {\n contentMedia.push(<PollContainer pollId={status.get('poll')} />);\n contentMediaIcons.push('tasks');\n }\n\n if (status.get('application')) {\n applicationLink = <React.Fragment> · <a className='detailed-status__application' href={status.getIn(['application', 'website'])} target='_blank' rel='noopener noreferrer'>{status.getIn(['application', 'name'])}</a></React.Fragment>;\n }\n\n const visibilityLink = <React.Fragment> · <VisibilityIcon visibility={status.get('visibility')} /></React.Fragment>;\n\n if (status.get('visibility') === 'direct') {\n reblogIcon = 'envelope';\n } else if (status.get('visibility') === 'private') {\n reblogIcon = 'lock';\n }\n\n if (!['unlisted', 'public'].includes(status.get('visibility'))) {\n reblogLink = null;\n } else if (this.context.router) {\n reblogLink = (\n <React.Fragment>\n <React.Fragment> · </React.Fragment>\n <Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/reblogs`} className='detailed-status__link'>\n <Icon id={reblogIcon} />\n <span className='detailed-status__reblogs'>\n <AnimatedNumber value={status.get('reblogs_count')} />\n </span>\n </Link>\n </React.Fragment>\n );\n } else {\n reblogLink = (\n <React.Fragment>\n <React.Fragment> · </React.Fragment>\n <a href={`/interact/${status.get('id')}?type=reblog`} className='detailed-status__link' onClick={this.handleModalLink}>\n <Icon id={reblogIcon} />\n <span className='detailed-status__reblogs'>\n <AnimatedNumber value={status.get('reblogs_count')} />\n </span>\n </a>\n </React.Fragment>\n );\n }\n\n if (this.context.router) {\n favouriteLink = (\n <Link to={`/@${status.getIn(['account', 'acct'])}/${status.get('id')}/favourites`} className='detailed-status__link'>\n <Icon id='star' />\n <span className='detailed-status__favorites'>\n <AnimatedNumber value={status.get('favourites_count')} />\n </span>\n </Link>\n );\n } else {\n favouriteLink = (\n <a href={`/interact/${status.get('id')}?type=favourite`} className='detailed-status__link' onClick={this.handleModalLink}>\n <Icon id='star' />\n <span className='detailed-status__favorites'>\n <AnimatedNumber value={status.get('favourites_count')} />\n </span>\n </a>\n );\n }\n\n if (status.get('edited_at')) {\n edited = (\n <React.Fragment>\n <React.Fragment> · </React.Fragment>\n <EditedTimestamp statusId={status.get('id')} timestamp={status.get('edited_at')} />\n </React.Fragment>\n );\n }\n\n return (\n <div style={outerStyle}>\n <div ref={this.setRef} className={classNames('detailed-status', `detailed-status-${status.get('visibility')}`, { compact })} data-status-by={status.getIn(['account', 'acct'])}>\n <a href={status.getIn(['account', 'url'])} onClick={this.handleAccountClick} className='detailed-status__display-name'>\n <div className='detailed-status__display-avatar'><Avatar account={status.get('account')} size={48} /></div>\n <DisplayName account={status.get('account')} localDomain={this.props.domain} />\n </a>\n\n <StatusContent\n status={status}\n media={contentMedia}\n extraMedia={extraMedia}\n mediaIcons={contentMediaIcons}\n expanded={expanded}\n collapsed={false}\n onExpandedToggle={onToggleHidden}\n onTranslate={this.handleTranslate}\n parseClick={this.parseClick}\n onUpdate={this.handleChildUpdate}\n tagLinks={settings.get('tag_misleading_links')}\n rewriteMentions={settings.get('rewrite_mentions')}\n disabled\n />\n\n <div className='detailed-status__meta'>\n <a className='detailed-status__datetime' href={status.get('url')} target='_blank' rel='noopener noreferrer'>\n <FormattedDate value={new Date(status.get('created_at'))} hour12={false} year='numeric' month='short' day='2-digit' hour='2-digit' minute='2-digit' />\n </a>{edited}{visibilityLink}{applicationLink}{reblogLink} · {favouriteLink}\n </div>\n </div>\n </div>\n );\n }\n\n}\n","import React from 'react';\nimport PropTypes from 'prop-types';\nimport IconButton from 'flavours/glitch/components/icon_button';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport DropdownMenuContainer from 'flavours/glitch/containers/dropdown_menu_container';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport { me } from 'flavours/glitch/initial_state';\nimport { accountAdminLink, statusAdminLink } from 'flavours/glitch/utils/backend_links';\nimport classNames from 'classnames';\nimport { PERMISSION_MANAGE_USERS } from 'flavours/glitch/permissions';\n\nconst messages = defineMessages({\n delete: { id: 'status.delete', defaultMessage: 'Delete' },\n redraft: { id: 'status.redraft', defaultMessage: 'Delete & re-draft' },\n edit: { id: 'status.edit', defaultMessage: 'Edit' },\n direct: { id: 'status.direct', defaultMessage: 'Direct message @{name}' },\n mention: { id: 'status.mention', defaultMessage: 'Mention @{name}' },\n reply: { id: 'status.reply', defaultMessage: 'Reply' },\n reblog: { id: 'status.reblog', defaultMessage: 'Boost' },\n reblog_private: { id: 'status.reblog_private', defaultMessage: 'Boost with original visibility' },\n cancel_reblog_private: { id: 'status.cancel_reblog_private', defaultMessage: 'Unboost' },\n cannot_reblog: { id: 'status.cannot_reblog', defaultMessage: 'This post cannot be boosted' },\n favourite: { id: 'status.favourite', defaultMessage: 'Favourite' },\n bookmark: { id: 'status.bookmark', defaultMessage: 'Bookmark' },\n more: { id: 'status.more', defaultMessage: 'More' },\n mute: { id: 'status.mute', defaultMessage: 'Mute @{name}' },\n muteConversation: { id: 'status.mute_conversation', defaultMessage: 'Mute conversation' },\n unmuteConversation: { id: 'status.unmute_conversation', defaultMessage: 'Unmute conversation' },\n block: { id: 'status.block', defaultMessage: 'Block @{name}' },\n report: { id: 'status.report', defaultMessage: 'Report @{name}' },\n share: { id: 'status.share', defaultMessage: 'Share' },\n pin: { id: 'status.pin', defaultMessage: 'Pin on profile' },\n unpin: { id: 'status.unpin', defaultMessage: 'Unpin from profile' },\n embed: { id: 'status.embed', defaultMessage: 'Embed' },\n admin_account: { id: 'status.admin_account', defaultMessage: 'Open moderation interface for @{name}' },\n admin_status: { id: 'status.admin_status', defaultMessage: 'Open this status in the moderation interface' },\n copy: { id: 'status.copy', defaultMessage: 'Copy link to status' },\n openOriginalPage: { id: 'account.open_original_page', defaultMessage: 'Open original page' },\n});\n\nexport default @injectIntl\nclass ActionBar extends React.PureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n identity: PropTypes.object,\n };\n\n static propTypes = {\n status: ImmutablePropTypes.map.isRequired,\n onReply: PropTypes.func.isRequired,\n onReblog: PropTypes.func.isRequired,\n onFavourite: PropTypes.func.isRequired,\n onBookmark: PropTypes.func.isRequired,\n onMute: PropTypes.func,\n onMuteConversation: PropTypes.func,\n onBlock: PropTypes.func,\n onDelete: PropTypes.func.isRequired,\n onEdit: PropTypes.func.isRequired,\n onDirect: PropTypes.func.isRequired,\n onMention: PropTypes.func.isRequired,\n onReport: PropTypes.func,\n onPin: PropTypes.func,\n onEmbed: PropTypes.func,\n intl: PropTypes.object.isRequired,\n };\n\n handleReplyClick = () => {\n this.props.onReply(this.props.status);\n }\n\n handleReblogClick = (e) => {\n this.props.onReblog(this.props.status, e);\n }\n\n handleFavouriteClick = (e) => {\n this.props.onFavourite(this.props.status, e);\n }\n\n handleBookmarkClick = (e) => {\n this.props.onBookmark(this.props.status, e);\n }\n\n handleDeleteClick = () => {\n this.props.onDelete(this.props.status, this.context.router.history);\n }\n\n handleRedraftClick = () => {\n this.props.onDelete(this.props.status, this.context.router.history, true);\n }\n\n handleEditClick = () => {\n this.props.onEdit(this.props.status, this.context.router.history);\n }\n\n handleDirectClick = () => {\n this.props.onDirect(this.props.status.get('account'), this.context.router.history);\n }\n\n handleMentionClick = () => {\n this.props.onMention(this.props.status.get('account'), this.context.router.history);\n }\n\n handleMuteClick = () => {\n this.props.onMute(this.props.status.get('account'));\n }\n\n handleConversationMuteClick = () => {\n this.props.onMuteConversation(this.props.status);\n }\n\n handleBlockClick = () => {\n this.props.onBlock(this.props.status);\n }\n\n handleReport = () => {\n this.props.onReport(this.props.status);\n }\n\n handlePinClick = () => {\n this.props.onPin(this.props.status);\n }\n\n handleShare = () => {\n navigator.share({\n text: this.props.status.get('search_index'),\n url: this.props.status.get('url'),\n });\n }\n\n handleEmbed = () => {\n this.props.onEmbed(this.props.status);\n }\n\n handleCopy = () => {\n const url = this.props.status.get('url');\n navigator.clipboard.writeText(url);\n }\n\n render () {\n const { status, intl } = this.props;\n const { signedIn, permissions } = this.context.identity;\n\n const publicStatus = ['public', 'unlisted'].includes(status.get('visibility'));\n const pinnableStatus = ['public', 'unlisted', 'private'].includes(status.get('visibility'));\n const mutingConversation = status.get('muted');\n const writtenByMe = status.getIn(['account', 'id']) === me;\n const isRemote = status.getIn(['account', 'username']) !== status.getIn(['account', 'acct']);\n\n let menu = [];\n\n if (publicStatus) {\n if (isRemote) {\n menu.push({ text: intl.formatMessage(messages.openOriginalPage), href: status.get('url') });\n }\n\n menu.push({ text: intl.formatMessage(messages.copy), action: this.handleCopy });\n menu.push({ text: intl.formatMessage(messages.embed), action: this.handleEmbed });\n menu.push(null);\n }\n\n if (writtenByMe) {\n if (pinnableStatus) {\n menu.push({ text: intl.formatMessage(status.get('pinned') ? messages.unpin : messages.pin), action: this.handlePinClick });\n menu.push(null);\n }\n\n menu.push({ text: intl.formatMessage(mutingConversation ? messages.unmuteConversation : messages.muteConversation), action: this.handleConversationMuteClick });\n menu.push(null);\n menu.push({ text: intl.formatMessage(messages.edit), action: this.handleEditClick });\n menu.push({ text: intl.formatMessage(messages.delete), action: this.handleDeleteClick });\n menu.push({ text: intl.formatMessage(messages.redraft), action: this.handleRedraftClick });\n } else {\n menu.push({ text: intl.formatMessage(messages.mention, { name: status.getIn(['account', 'username']) }), action: this.handleMentionClick });\n menu.push({ text: intl.formatMessage(messages.direct, { name: status.getIn(['account', 'username']) }), action: this.handleDirectClick });\n menu.push(null);\n menu.push({ text: intl.formatMessage(messages.mute, { name: status.getIn(['account', 'username']) }), action: this.handleMuteClick });\n menu.push({ text: intl.formatMessage(messages.block, { name: status.getIn(['account', 'username']) }), action: this.handleBlockClick });\n menu.push({ text: intl.formatMessage(messages.report, { name: status.getIn(['account', 'username']) }), action: this.handleReport });\n if ((permissions & PERMISSION_MANAGE_USERS) === PERMISSION_MANAGE_USERS && (accountAdminLink || statusAdminLink)) {\n menu.push(null);\n if (accountAdminLink !== undefined) {\n menu.push({\n text: intl.formatMessage(messages.admin_account, { name: status.getIn(['account', 'username']) }),\n href: accountAdminLink(status.getIn(['account', 'id'])),\n });\n }\n if (statusAdminLink !== undefined) {\n menu.push({\n text: intl.formatMessage(messages.admin_status),\n href: statusAdminLink(status.getIn(['account', 'id']), status.get('id')),\n });\n }\n }\n }\n\n const shareButton = ('share' in navigator) && publicStatus && (\n <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.share)} icon='share-alt' onClick={this.handleShare} /></div>\n );\n\n const reblogPrivate = status.getIn(['account', 'id']) === me && status.get('visibility') === 'private';\n\n let reblogTitle;\n if (status.get('reblogged')) {\n reblogTitle = intl.formatMessage(messages.cancel_reblog_private);\n } else if (publicStatus) {\n reblogTitle = intl.formatMessage(messages.reblog);\n } else if (reblogPrivate) {\n reblogTitle = intl.formatMessage(messages.reblog_private);\n } else {\n reblogTitle = intl.formatMessage(messages.cannot_reblog);\n }\n\n return (\n <div className='detailed-status__action-bar'>\n <div className='detailed-status__button'><IconButton title={intl.formatMessage(messages.reply)} icon={status.get('in_reply_to_id', null) === null ? 'reply' : 'reply-all'} onClick={this.handleReplyClick} /></div>\n <div className='detailed-status__button'><IconButton className={classNames({ reblogPrivate })} disabled={!publicStatus && !reblogPrivate} active={status.get('reblogged')} title={reblogTitle} icon='retweet' onClick={this.handleReblogClick} /></div>\n <div className='detailed-status__button'><IconButton className='star-icon' animate active={status.get('favourited')} title={intl.formatMessage(messages.favourite)} icon='star' onClick={this.handleFavouriteClick} /></div>\n {shareButton}\n <div className='detailed-status__button'><IconButton className='bookmark-icon' disabled={!signedIn} active={status.get('bookmarked')} title={intl.formatMessage(messages.bookmark)} icon='bookmark' onClick={this.handleBookmarkClick} /></div>\n\n <div className='detailed-status__action-bar-dropdown'>\n <DropdownMenuContainer size={18} icon='ellipsis-h' items={menu} direction='left' title={intl.formatMessage(messages.more)} />\n </div>\n </div>\n );\n }\n\n}\n","import Immutable from 'immutable';\nimport React from 'react';\nimport { connect } from 'react-redux';\nimport PropTypes from 'prop-types';\nimport classNames from 'classnames';\nimport ImmutablePropTypes from 'react-immutable-proptypes';\nimport { createSelector } from 'reselect';\nimport { fetchStatus } from 'flavours/glitch/actions/statuses';\nimport MissingIndicator from 'flavours/glitch/components/missing_indicator';\nimport LoadingIndicator from 'flavours/glitch/components/loading_indicator';\nimport DetailedStatus from './components/detailed_status';\nimport ActionBar from './components/action_bar';\nimport Column from 'flavours/glitch/features/ui/components/column';\nimport {\n favourite,\n unfavourite,\n bookmark,\n unbookmark,\n reblog,\n unreblog,\n pin,\n unpin,\n} from 'flavours/glitch/actions/interactions';\nimport {\n replyCompose,\n mentionCompose,\n directCompose,\n} from 'flavours/glitch/actions/compose';\nimport { changeLocalSetting } from 'flavours/glitch/actions/local_settings';\nimport {\n muteStatus,\n unmuteStatus,\n deleteStatus,\n editStatus,\n hideStatus,\n revealStatus,\n translateStatus,\n undoStatusTranslation,\n} from 'flavours/glitch/actions/statuses';\nimport { initMuteModal } from 'flavours/glitch/actions/mutes';\nimport { initBlockModal } from 'flavours/glitch/actions/blocks';\nimport { initReport } from 'flavours/glitch/actions/reports';\nimport { initBoostModal } from 'flavours/glitch/actions/boosts';\nimport { makeGetStatus } from 'flavours/glitch/selectors';\nimport ScrollContainer from 'flavours/glitch/containers/scroll_container';\nimport ColumnBackButton from 'flavours/glitch/components/column_back_button';\nimport ColumnHeader from '../../components/column_header';\nimport StatusContainer from 'flavours/glitch/containers/status_container';\nimport { openModal } from 'flavours/glitch/actions/modal';\nimport { defineMessages, injectIntl } from 'react-intl';\nimport ImmutablePureComponent from 'react-immutable-pure-component';\nimport { HotKeys } from 'react-hotkeys';\nimport { boostModal, favouriteModal, deleteModal } from 'flavours/glitch/initial_state';\nimport { attachFullscreenListener, detachFullscreenListener, isFullscreen } from '../ui/util/fullscreen';\nimport { autoUnfoldCW } from 'flavours/glitch/utils/content_warning';\nimport { textForScreenReader, defaultMediaVisibility } from 'flavours/glitch/components/status';\nimport Icon from 'flavours/glitch/components/icon';\nimport { Helmet } from 'react-helmet';\n\nconst messages = defineMessages({\n deleteConfirm: { id: 'confirmations.delete.confirm', defaultMessage: 'Delete' },\n deleteMessage: { id: 'confirmations.delete.message', defaultMessage: 'Are you sure you want to delete this status?' },\n redraftConfirm: { id: 'confirmations.redraft.confirm', defaultMessage: 'Delete & redraft' },\n redraftMessage: { id: 'confirmations.redraft.message', defaultMessage: 'Are you sure you want to delete this status and re-draft it? You will lose all replies, boosts and favourites to it.' },\n revealAll: { id: 'status.show_more_all', defaultMessage: 'Show more for all' },\n hideAll: { id: 'status.show_less_all', defaultMessage: 'Show less for all' },\n detailedStatus: { id: 'status.detailed_status', defaultMessage: 'Detailed conversation view' },\n replyConfirm: { id: 'confirmations.reply.confirm', defaultMessage: 'Reply' },\n replyMessage: { id: 'confirmations.reply.message', defaultMessage: 'Replying now will overwrite the message you are currently composing. Are you sure you want to proceed?' },\n tootHeading: { id: 'account.posts_with_replies', defaultMessage: 'Posts and replies' },\n});\n\nconst makeMapStateToProps = () => {\n const getStatus = makeGetStatus();\n\n const getAncestorsIds = createSelector([\n (_, { id }) => id,\n state => state.getIn(['contexts', 'inReplyTos']),\n ], (statusId, inReplyTos) => {\n let ancestorsIds = Immutable.List();\n ancestorsIds = ancestorsIds.withMutations(mutable => {\n let id = statusId;\n\n while (id && !mutable.includes(id)) {\n mutable.unshift(id);\n id = inReplyTos.get(id);\n }\n });\n\n return ancestorsIds;\n });\n\n const getDescendantsIds = createSelector([\n (_, { id }) => id,\n state => state.getIn(['contexts', 'replies']),\n state => state.get('statuses'),\n ], (statusId, contextReplies, statuses) => {\n let descendantsIds = [];\n const ids = [statusId];\n\n while (ids.length > 0) {\n let id = ids.pop();\n const replies = contextReplies.get(id);\n\n if (statusId !== id) {\n descendantsIds.push(id);\n }\n\n if (replies) {\n replies.reverse().forEach(reply => {\n if (!ids.includes(reply) && !descendantsIds.includes(reply) && statusId !== reply) ids.push(reply);\n });\n }\n }\n\n let insertAt = descendantsIds.findIndex((id) => statuses.get(id).get('in_reply_to_account_id') !== statuses.get(id).get('account'));\n if (insertAt !== -1) {\n descendantsIds.forEach((id, idx) => {\n if (idx > insertAt && statuses.get(id).get('in_reply_to_account_id') === statuses.get(id).get('account')) {\n descendantsIds.splice(idx, 1);\n descendantsIds.splice(insertAt, 0, id);\n insertAt += 1;\n }\n });\n }\n\n return Immutable.List(descendantsIds);\n });\n\n const mapStateToProps = (state, props) => {\n const status = getStatus(state, { id: props.params.statusId });\n let ancestorsIds = Immutable.List();\n let descendantsIds = Immutable.List();\n\n if (status) {\n ancestorsIds = getAncestorsIds(state, { id: status.get('in_reply_to_id') });\n descendantsIds = getDescendantsIds(state, { id: status.get('id') });\n }\n\n return {\n isLoading: state.getIn(['statuses', props.params.statusId, 'isLoading']),\n status,\n ancestorsIds,\n descendantsIds,\n settings: state.get('local_settings'),\n askReplyConfirmation: state.getIn(['local_settings', 'confirm_before_clearing_draft']) && state.getIn(['compose', 'text']).trim().length !== 0,\n domain: state.getIn(['meta', 'domain']),\n usingPiP: state.get('picture_in_picture').statusId === props.params.statusId,\n };\n };\n\n return mapStateToProps;\n};\n\nconst truncate = (str, num) => {\n if (str.length > num) {\n return str.slice(0, num) + '…';\n } else {\n return str;\n }\n};\n\nconst titleFromStatus = status => {\n const displayName = status.getIn(['account', 'display_name']);\n const username = status.getIn(['account', 'username']);\n const prefix = displayName.trim().length === 0 ? username : displayName;\n const text = status.get('search_index');\n\n return `${prefix}: \"${truncate(text, 30)}\"`;\n};\n\nexport default @injectIntl\n@connect(makeMapStateToProps)\nclass Status extends ImmutablePureComponent {\n\n static contextTypes = {\n router: PropTypes.object,\n identity: PropTypes.object,\n };\n\n static propTypes = {\n params: PropTypes.object.isRequired,\n dispatch: PropTypes.func.isRequired,\n status: ImmutablePropTypes.map,\n isLoading: PropTypes.bool,\n settings: ImmutablePropTypes.map.isRequired,\n ancestorsIds: ImmutablePropTypes.list,\n descendantsIds: ImmutablePropTypes.list,\n intl: PropTypes.object.isRequired,\n askReplyConfirmation: PropTypes.bool,\n multiColumn: PropTypes.bool,\n domain: PropTypes.string.isRequired,\n usingPiP: PropTypes.bool,\n };\n\n state = {\n fullscreen: false,\n isExpanded: undefined,\n threadExpanded: undefined,\n statusId: undefined,\n loadedStatusId: undefined,\n showMedia: undefined,\n revealBehindCW: undefined,\n };\n\n componentDidMount () {\n attachFullscreenListener(this.onFullScreenChange);\n this.props.dispatch(fetchStatus(this.props.params.statusId));\n\n const { status, ancestorsIds } = this.props;\n\n if (status && ancestorsIds && ancestorsIds.size > 0) {\n const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size - 1];\n\n window.requestAnimationFrame(() => {\n element.scrollIntoView(true);\n });\n }\n }\n\n static getDerivedStateFromProps(props, state) {\n let update = {};\n let updated = false;\n\n if (props.params.statusId && state.statusId !== props.params.statusId) {\n props.dispatch(fetchStatus(props.params.statusId));\n update.threadExpanded = undefined;\n update.statusId = props.params.statusId;\n updated = true;\n }\n\n const revealBehindCW = props.settings.getIn(['media', 'reveal_behind_cw']);\n if (revealBehindCW !== state.revealBehindCW) {\n update.revealBehindCW = revealBehindCW;\n if (revealBehindCW) update.showMedia = defaultMediaVisibility(props.status, props.settings);\n updated = true;\n }\n\n if (props.status && state.loadedStatusId !== props.status.get('id')) {\n update.showMedia = defaultMediaVisibility(props.status, props.settings);\n update.loadedStatusId = props.status.get('id');\n update.isExpanded = autoUnfoldCW(props.settings, props.status);\n updated = true;\n }\n\n return updated ? update : null;\n }\n\n handleToggleHidden = () => {\n const { status } = this.props;\n\n if (this.props.settings.getIn(['content_warnings', 'shared_state'])) {\n if (status.get('hidden')) {\n this.props.dispatch(revealStatus(status.get('id')));\n } else {\n this.props.dispatch(hideStatus(status.get('id')));\n }\n } else if (this.props.status.get('spoiler_text')) {\n this.setExpansion(!this.state.isExpanded);\n }\n }\n\n handleToggleMediaVisibility = () => {\n this.setState({ showMedia: !this.state.showMedia });\n }\n\n handleModalFavourite = (status) => {\n this.props.dispatch(favourite(status));\n }\n\n handleFavouriteClick = (status, e) => {\n const { dispatch } = this.props;\n const { signedIn } = this.context.identity;\n\n if (signedIn) {\n if (status.get('favourited')) {\n dispatch(unfavourite(status));\n } else {\n if ((e && e.shiftKey) || !favouriteModal) {\n this.handleModalFavourite(status);\n } else {\n dispatch(openModal('FAVOURITE', { status, onFavourite: this.handleModalFavourite }));\n }\n }\n } else {\n dispatch(openModal('INTERACTION', {\n type: 'favourite',\n accountId: status.getIn(['account', 'id']),\n url: status.get('url'),\n }));\n }\n }\n\n handlePin = (status) => {\n if (status.get('pinned')) {\n this.props.dispatch(unpin(status));\n } else {\n this.props.dispatch(pin(status));\n }\n }\n\n handleReplyClick = (status) => {\n const { askReplyConfirmation, dispatch, intl } = this.props;\n const { signedIn } = this.context.identity;\n\n if (signedIn) {\n if (askReplyConfirmation) {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(messages.replyMessage),\n confirm: intl.formatMessage(messages.replyConfirm),\n onDoNotAsk: () => dispatch(changeLocalSetting(['confirm_before_clearing_draft'], false)),\n onConfirm: () => dispatch(replyCompose(status, this.context.router.history)),\n }));\n } else {\n dispatch(replyCompose(status, this.context.router.history));\n }\n } else {\n dispatch(openModal('INTERACTION', {\n type: 'reply',\n accountId: status.getIn(['account', 'id']),\n url: status.get('url'),\n }));\n }\n }\n\n handleModalReblog = (status, privacy) => {\n const { dispatch } = this.props;\n\n if (status.get('reblogged')) {\n dispatch(unreblog(status));\n } else {\n dispatch(reblog(status, privacy));\n }\n }\n\n handleReblogClick = (status, e) => {\n const { settings, dispatch } = this.props;\n const { signedIn } = this.context.identity;\n\n if (signedIn) {\n if (settings.get('confirm_boost_missing_media_description') && status.get('media_attachments').some(item => !item.get('description')) && !status.get('reblogged')) {\n dispatch(initBoostModal({ status, onReblog: this.handleModalReblog, missingMediaDescription: true }));\n } else if ((e && e.shiftKey) || !boostModal) {\n this.handleModalReblog(status);\n } else {\n dispatch(initBoostModal({ status, onReblog: this.handleModalReblog }));\n }\n } else {\n dispatch(openModal('INTERACTION', {\n type: 'reblog',\n accountId: status.getIn(['account', 'id']),\n url: status.get('url'),\n }));\n }\n }\n\n handleBookmarkClick = (status) => {\n if (status.get('bookmarked')) {\n this.props.dispatch(unbookmark(status));\n } else {\n this.props.dispatch(bookmark(status));\n }\n }\n\n handleDeleteClick = (status, history, withRedraft = false) => {\n const { dispatch, intl } = this.props;\n\n if (!deleteModal) {\n dispatch(deleteStatus(status.get('id'), history, withRedraft));\n } else {\n dispatch(openModal('CONFIRM', {\n message: intl.formatMessage(withRedraft ? messages.redraftMessage : messages.deleteMessage),\n confirm: intl.formatMessage(withRedraft ? messages.redraftConfirm : messages.deleteConfirm),\n onConfirm: () => dispatch(deleteStatus(status.get('id'), history, withRedraft)),\n }));\n }\n }\n\n handleEditClick = (status, history) => {\n this.props.dispatch(editStatus(status.get('id'), history));\n }\n\n handleDirectClick = (account, router) => {\n this.props.dispatch(directCompose(account, router));\n }\n\n handleMentionClick = (account, router) => {\n this.props.dispatch(mentionCompose(account, router));\n }\n\n handleOpenMedia = (media, index) => {\n this.props.dispatch(openModal('MEDIA', { statusId: this.props.status.get('id'), media, index }));\n }\n\n handleOpenVideo = (media, options) => {\n this.props.dispatch(openModal('VIDEO', { statusId: this.props.status.get('id'), media, options }));\n }\n\n handleHotkeyOpenMedia = e => {\n const { status } = this.props;\n\n e.preventDefault();\n\n if (status.get('media_attachments').size > 0) {\n if (status.getIn(['media_attachments', 0, 'type']) === 'video') {\n this.handleOpenVideo(status.getIn(['media_attachments', 0]), { startTime: 0 });\n } else {\n this.handleOpenMedia(status.get('media_attachments'), 0);\n }\n }\n }\n\n handleMuteClick = (account) => {\n this.props.dispatch(initMuteModal(account));\n }\n\n handleConversationMuteClick = (status) => {\n if (status.get('muted')) {\n this.props.dispatch(unmuteStatus(status.get('id')));\n } else {\n this.props.dispatch(muteStatus(status.get('id')));\n }\n }\n\n handleToggleAll = () => {\n const { status, ancestorsIds, descendantsIds, settings } = this.props;\n const statusIds = [status.get('id')].concat(ancestorsIds.toJS(), descendantsIds.toJS());\n let { isExpanded } = this.state;\n\n if (settings.getIn(['content_warnings', 'shared_state']))\n isExpanded = !status.get('hidden');\n\n if (!isExpanded) {\n this.props.dispatch(revealStatus(statusIds));\n } else {\n this.props.dispatch(hideStatus(statusIds));\n }\n\n this.setState({ isExpanded: !isExpanded, threadExpanded: !isExpanded });\n }\n\n handleTranslate = status => {\n const { dispatch } = this.props;\n\n if (status.get('translation')) {\n dispatch(undoStatusTranslation(status.get('id')));\n } else {\n dispatch(translateStatus(status.get('id')));\n }\n }\n\n handleBlockClick = (status) => {\n const { dispatch } = this.props;\n const account = status.get('account');\n dispatch(initBlockModal(account));\n }\n\n handleReport = (status) => {\n this.props.dispatch(initReport(status.get('account'), status));\n }\n\n handleEmbed = (status) => {\n this.props.dispatch(openModal('EMBED', { url: status.get('url') }));\n }\n\n handleHotkeyToggleSensitive = () => {\n this.handleToggleMediaVisibility();\n }\n\n handleHotkeyMoveUp = () => {\n this.handleMoveUp(this.props.status.get('id'));\n }\n\n handleHotkeyMoveDown = () => {\n this.handleMoveDown(this.props.status.get('id'));\n }\n\n handleHotkeyReply = e => {\n e.preventDefault();\n this.handleReplyClick(this.props.status);\n }\n\n handleHotkeyFavourite = () => {\n this.handleFavouriteClick(this.props.status);\n }\n\n handleHotkeyBoost = () => {\n this.handleReblogClick(this.props.status);\n }\n\n handleHotkeyBookmark = () => {\n this.handleBookmarkClick(this.props.status);\n }\n\n handleHotkeyMention = e => {\n e.preventDefault();\n this.handleMentionClick(this.props.status);\n }\n\n handleHotkeyOpenProfile = () => {\n let state = {...this.context.router.history.location.state};\n state.mastodonBackSteps = (state.mastodonBackSteps || 0) + 1;\n this.context.router.history.push(`/@${this.props.status.getIn(['account', 'acct'])}`, state);\n }\n\n handleMoveUp = id => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n\n if (id === status.get('id')) {\n this._selectChild(ancestorsIds.size - 1, true);\n } else {\n let index = ancestorsIds.indexOf(id);\n\n if (index === -1) {\n index = descendantsIds.indexOf(id);\n this._selectChild(ancestorsIds.size + index, true);\n } else {\n this._selectChild(index - 1, true);\n }\n }\n }\n\n handleMoveDown = id => {\n const { status, ancestorsIds, descendantsIds } = this.props;\n\n if (id === status.get('id')) {\n this._selectChild(ancestorsIds.size + 1, false);\n } else {\n let index = ancestorsIds.indexOf(id);\n\n if (index === -1) {\n index = descendantsIds.indexOf(id);\n this._selectChild(ancestorsIds.size + index + 2, false);\n } else {\n this._selectChild(index + 1, false);\n }\n }\n }\n\n _selectChild (index, align_top) {\n const container = this.node;\n const element = container.querySelectorAll('.focusable')[index];\n\n if (element) {\n if (align_top && container.scrollTop > element.offsetTop) {\n element.scrollIntoView(true);\n } else if (!align_top && container.scrollTop + container.clientHeight < element.offsetTop + element.offsetHeight) {\n element.scrollIntoView(false);\n }\n element.focus();\n }\n }\n\n handleHeaderClick = () => {\n this.column.scrollTop();\n }\n\n renderChildren (list) {\n return list.map(id => (\n <StatusContainer\n key={id}\n id={id}\n expanded={this.state.threadExpanded}\n onMoveUp={this.handleMoveUp}\n onMoveDown={this.handleMoveDown}\n contextType='thread'\n />\n ));\n }\n\n setExpansion = value => {\n this.setState({ isExpanded: value });\n }\n\n setRef = c => {\n this.node = c;\n }\n\n setColumnRef = c => {\n this.column = c;\n }\n\n componentDidUpdate (prevProps) {\n if (this.props.params.statusId && (this.props.params.statusId !== prevProps.params.statusId || prevProps.ancestorsIds.size < this.props.ancestorsIds.size)) {\n const { status, ancestorsIds } = this.props;\n\n if (status && ancestorsIds && ancestorsIds.size > 0) {\n const element = this.node.querySelectorAll('.focusable')[ancestorsIds.size - 1];\n\n window.requestAnimationFrame(() => {\n element.scrollIntoView(true);\n });\n }\n }\n }\n\n componentWillUnmount () {\n detachFullscreenListener(this.onFullScreenChange);\n }\n\n onFullScreenChange = () => {\n this.setState({ fullscreen: isFullscreen() });\n }\n\n render () {\n let ancestors, descendants;\n const { isLoading, status, settings, ancestorsIds, descendantsIds, intl, domain, multiColumn, usingPiP } = this.props;\n const { fullscreen } = this.state;\n\n if (isLoading) {\n return (\n <Column>\n <LoadingIndicator />\n </Column>\n );\n }\n\n if (status === null) {\n return (\n <Column>\n <ColumnBackButton multiColumn={multiColumn} />\n <MissingIndicator />\n </Column>\n );\n }\n\n const isExpanded = settings.getIn(['content_warnings', 'shared_state']) ? !status.get('hidden') : this.state.isExpanded;\n\n if (ancestorsIds && ancestorsIds.size > 0) {\n ancestors = <div>{this.renderChildren(ancestorsIds)}</div>;\n }\n\n if (descendantsIds && descendantsIds.size > 0) {\n descendants = <div>{this.renderChildren(descendantsIds)}</div>;\n }\n\n const isLocal = status.getIn(['account', 'acct'], '').indexOf('@') === -1;\n const isIndexable = !status.getIn(['account', 'noindex']);\n\n const handlers = {\n moveUp: this.handleHotkeyMoveUp,\n moveDown: this.handleHotkeyMoveDown,\n reply: this.handleHotkeyReply,\n favourite: this.handleHotkeyFavourite,\n boost: this.handleHotkeyBoost,\n bookmark: this.handleHotkeyBookmark,\n mention: this.handleHotkeyMention,\n openProfile: this.handleHotkeyOpenProfile,\n toggleSpoiler: this.handleToggleHidden,\n toggleSensitive: this.handleHotkeyToggleSensitive,\n openMedia: this.handleHotkeyOpenMedia,\n };\n\n return (\n <Column bindToDocument={!multiColumn} ref={this.setColumnRef} label={intl.formatMessage(messages.detailedStatus)}>\n <ColumnHeader\n icon='comment'\n title={intl.formatMessage(messages.tootHeading)}\n onClick={this.handleHeaderClick}\n showBackButton\n multiColumn={multiColumn}\n extraButton={(\n <button className='column-header__button' title={intl.formatMessage(!isExpanded ? messages.revealAll : messages.hideAll)} aria-label={intl.formatMessage(!isExpanded ? messages.revealAll : messages.hideAll)} onClick={this.handleToggleAll}><Icon id={!isExpanded ? 'eye-slash' : 'eye'} /></button>\n )}\n />\n\n <ScrollContainer scrollKey='thread'>\n <div className={classNames('scrollable', 'detailed-status__wrapper', { fullscreen })} ref={this.setRef}>\n {ancestors}\n\n <HotKeys handlers={handlers}>\n <div className='focusable' tabIndex='0' aria-label={textForScreenReader(intl, status, false, isExpanded)}>\n <DetailedStatus\n key={`details-${status.get('id')}`}\n status={status}\n settings={settings}\n onOpenVideo={this.handleOpenVideo}\n onOpenMedia={this.handleOpenMedia}\n expanded={isExpanded}\n onToggleHidden={this.handleToggleHidden}\n onTranslate={this.handleTranslate}\n domain={domain}\n showMedia={this.state.showMedia}\n onToggleMediaVisibility={this.handleToggleMediaVisibility}\n usingPiP={usingPiP}\n />\n\n <ActionBar\n key={`action-bar-${status.get('id')}`}\n status={status}\n onReply={this.handleReplyClick}\n onFavourite={this.handleFavouriteClick}\n onReblog={this.handleReblogClick}\n onBookmark={this.handleBookmarkClick}\n onDelete={this.handleDeleteClick}\n onEdit={this.handleEditClick}\n onDirect={this.handleDirectClick}\n onMention={this.handleMentionClick}\n onMute={this.handleMuteClick}\n onMuteConversation={this.handleConversationMuteClick}\n onBlock={this.handleBlockClick}\n onReport={this.handleReport}\n onPin={this.handlePin}\n onEmbed={this.handleEmbed}\n />\n </div>\n </HotKeys>\n\n {descendants}\n </div>\n </ScrollContainer>\n\n <Helmet>\n <title>{titleFromStatus(status)}</title>\n <meta name='robots' content={(isLocal && isIndexable) ? 'all' : 'noindex'} />\n </Helmet>\n </Column>\n );\n }\n\n}\n"],"sourceRoot":""}