Áƒ*žEP�W®°§‹¸pG>ŽÓ¹gZ—øö )*+-,/0427283:WPNoneSystemCore UBrowserParseDelimitedUWindowTick LogoNamesCreated GetNextValue AddMenuItem GetValueAddRuleQueryFinishedSendBufferedData ChopLeft SystemTextAddTextCountClose BeforePaint MultiInStr AddColumnSetText ProcessInputCreateControlChopQueryFindChannelWindowRefreshPaintRemove ParseReplyDone ShowWindowSetFont SetSizePosBegin FindNickEngineUBrowserSubsetFactDefaultStatusBarText SetParent HideWindow DisconnectWaitForResizedTimerFindIDValidateServerGetPlayerOwnerIpDrvLocalizeBoolValue ChangeOpDoBufferQueueIO CloseUWindowAddPage ChangeVoice ChangedNick ExecuteItemGetSelectedRow SetHelpText SortByColumn ShutdownOpenURLSort PingServerResolutionChanged SetValue UserNoticeUBrowserGSpyFact PeekChar FoundServerSetupSentinelCompare ChannelText FirstPage ResetBuffer JoinChannel NextPage UserQuitStart BindPortResolvePrivateAction PrivateText ClientTravelAppendFindPrivateWindowSetNumericOnlyUBrowserHTTPFact SetErrorChannelAction AddFavorite GotMatch Resolved ClosePage RMouseUpNotify PingDoneIRCChannelHistory ShowInfoAddItemRightClickMenuClass SendText IsConnected ParseOptionSetAway DeletePage ShowInfoArea SortColumn SelectRow SetMaxLength PingFinished NewIRCServerUserInChannel KickUserConsoleCommand AppendItemGetColorString ReceivedTextOpenedRePingClosed HTTPErrorDoJoin InternalTime SetEditableSaveFavorites HandleServerFindExistingServerCTCP PingNext ClientClassReadBufferedLineJoinedChannelPartedChannel DestroyListClear ChangeMode RemoveUserSendCommandTextFailureSuccessGetServerUnderRowBrowseCurrentURIGotMatchTimeout InsertItem PartChannelIsAwayConnectSetupDoBindRemoveNickPrefixGotoTabOpen CheckAwaySaveChannelComboAddFavoriteItems DestroyLink SetSizesSaveServerCombo StatusDoneLoadCurrentValuesColor JoinServer AutoInfo PingServersFavoritesNameSuspendPingingResumePinging AddedTextAddUserHTTPReceivedData BeginPlaySelectInternet SelectLAN ConsiderItem IRCClosed ServerStatusSendChannelAction TimeOutError JoinTextSendChannelTextSetSelectedIndex WindowShownOKText OKPressedRightClickRow ReadChar StartQuery WindowTitleToolTip PaintColumnCopyExistingListItemMoveItemSorted ShowModalLaunchUnrealURLResolveFailedBinding SetTextColor SetRangeCreateSubMenu LocalizeTeam LoggingIn LocalizeSkin BindFailedQueryUpdateServer MaxLines ChangeNick ResolvingBrowse GetStatusCouldNotConnectError SetupURIs ProcessData WaitForCount LoggedInSetNickGetInfoBroadcastBeacon AddSubset AddSuperSetFoundSecretState RemoveSubsetTagServersAsOldRemoveOldServers GetItemNameRefreshSubsetsCreateFactoriesShutdownFactoriesClickRemoveFavoriteRefreshServerMasterServerTimeoutKeyDownTextAreaClassResolveFailedErrorbMasked SetCaption RefreshNameMipZeroVClampUClampVBits InfoName ConnectTextUBitsDisconnectTextMasterServerTCPPort CreateItemCreatePrivChannelGetLookAndFeelTextureScrollShow IRCVisible RemoveItem WindowHiddenVSizeSetMOTDUSizeDoubleClickRowDecodeServerPropertiesGetPageUpdateServerCountInvalidatePingsConsiderForSubsets bNoKeyboardSetMasterServer SetIRCServerPostBeginPlayShowOpenWindow RegisterClientMessage OpenText OpenHelp DrawCellNewMasterServerByPingCreateColumnsByMap ClearValuePaletteCloseUpFindItemIndex ByPlayers SetMultiLine CancelPingByName ProcessText CloseText MaxColor LocalizeBuildObjectWithProperties ListClass MouseEnter StripCRLF KeyEvent DrawItem ServerNameGetAddressURL ItemHeightCopyToClipboardAllDoubleClickItem AutoWidth SaveConfigsPing MouseLeaveNotifyAfterLevelChangeNotifyQuitUnrealMessageBoxDone MessageBox GameName PingTimeout ShowUBrowserMaxSimultaneousPing bTopCentricbVariableRowHeight MapNameName PingName PlayersNameSetHTMLOverURLAutoPingIntervalVersionString ValueTextDisconnectReason SetHistory RuleTextIDText FaceText SkinText MeshText TeamText PingTextUpdateServerClassFavoriteServersClassServerListWindowClass MOTDName WarningTextDisconnectHelp WarningTitle ChannelHelp ServerHelp ConnectHelpUpdateServerAddressUpdateServerPort NumTries LinkClass FailureText QueryTextByTextKickedFromText IsAwayText QuitTextMouseLeaveColumn SetsModeTextNowKnownAsTextWasKickedByText CompleteText PingingTextQueryFailedTextQueryServerTextServerCountNamePlayerCountNamePS_DoneLookAndFeelClass PS_RePinging PS_PingingPS_QueryFailed CopyNameOpenLocationName PingAllNameRefreshServerNameBindRetryTime ClickURLTournamentTextServerModeTextDestroyListItemDedicatedTextMinNetVersionText BotSkillText PlayersText MaxTeamsText ValidateBalanceTeamsTextWindowTitleString InviteString FragsTextConnectedTextResolveFailedTextConnectingToText NameTextInvalidAddressTextIRCName LANTabNameMasterServerURIGoalTeamScoreTextMinPlayersText ServerTextServerAddressText ReceiveModeIRCServerHistoryIpAddrToString GamePortTextIPTextUpdateDescriptionTextDescriptionTextQueryPortTextServerBeaconPortBeaconProduct FalseStringNotInAChannelText SystemName GameModeText HasLeftText GameTypeTextAdminNameTextRemoveSupersetUBrowserBannerAdUBrowserBannerBarUBrowserBrowserButtonUBrowserBufferedTCPLinkUBrowserColorIRCTextAreaUBrowserConsoleUBrowserEditFavoriteCWUBrowserEditFavoriteWindowUBrowserFavoriteServersUBrowserServerListWindowUBrowserFavoritesFactUBrowserServerListFactoryUBrowserFavoritesMenuUBrowserRightClickMenu WorldLogTextUBrowserGSpyLinkUBrowserHTTPClient MutatorsTextUBrowserHTTPLinkUBrowserInfoClientWindowUBrowserInfoMenuUBrowserInfoWindowUBrowserIRCChannelMenuUBrowserIRCChannelPageUBrowserIRCPageBaseUBrowserIRCJoinMenuUBrowserIRCLinkUBrowserIRCPrivateMenuUBrowserIRCPrivPageUBrowserIRCSetupClientUBrowserIRCSystemMenuUBrowserIRCSystemPageUBrowserIRCTextAreaUBrowserIRCUserListUBrowserIRCUserListBoxUBrowserIRCWindowUBrowserLocalFactUBrowserLocalLinkUBrowserMainClientWindowUBrowserMainWindowUBrowserNewFavoriteCWUBrowserNewFavoriteWindowNoneUBrowserOpenCWUBrowserOpenWindowUBrowserPlayerGridUBrowserPlayerListUBrowserRootWindowUBrowserRulesGridUBrowserRulesListUBrowserScreenshotCWUBrowserServerGridUBrowserServerListUBrowserServerPing LogoCountUBrowserSubsetListUBrowserSupersetListUBrowserUpdateServerLinkUBrowserUpdateServerTextAreaUBrowserUpdateServerWindowMaxBindAttemptsMasterServerAddressNonDedicatedTextPS_QueryServerbShowFailedServersbSuspendPingOnClose GridClassNotFoundError SupersetTagServerListClassNameFriendlyFireTextbIncrementalPing PartTextAdminEmailText CloseNameChangeLevelsTextMultiplayerBotsTextFragLimitTextTimeLimitTextListFactoriesHasJoinedTextGameVersionTextNotReadyError PlayName TrueStringEditFavoriteNameUpdateServerTimeoutPlayersBalanceTeamsText UBrowserAllErrorBindingTextNewFavoriteNameWinTop ParentWindow WinHeight BlackTexture InternetLinkTcpLink bUnderline CreateWindowbJustThisServer bInitialServerMessageBoxResultLaunchUWindow OwnerFactoryInPingAttemptsMouseXWinLeft bFoundStartRootWindowConsolebBold CompareCount DrawUpBevel PingAttempts BindAttemptsAttemptNumberbNoSortbOK PlayerEntryUWindowRootWindowUWindowRightClickMenu InputBuffer OutputBufferCRLFLF bWaiting QueryState WaitingForWaitForCountChars LastDeltaWaitMatchDataUWindowPulldownMenuItemRequestSentTimeWhat ServerIPAddrUWindowPageWindow QueryPortUWindowPageControlPageUWindowTabControl DelimiterMouseYLastUWindowMessageBoxUWindowLookAndFeelUWindowListBoxItemUWindowListBoxMasterServerIpAddrbOpenedDrawStretchedTexture WhiteTextureUWindowHSplitterUWindowGridColumn UWindowGridUWindowEditControlFoundSecureRequest FoundSecretNextIP NextAddressUWindowDynamicTextRowUWindowFramedWindowUWindowDynamicTextAreaData WinWidth ServerPort CurrentState ErrorCodebClosedProxyServerAddressProxyServerPort ConnectingWaitingForHeaderReceivingHeaderReceivingData HadErrorUWindowDialogClientWindow InAddressRow OwnerWindow UWindowListUWindowComboListItemCodeUWindowListControl bGotDatabWindowVisible bDisabledBroadcastAddrbIgnoreLDoubleClick LookAndFeelCursorPortAddr GetFallback GetMasterGetIRCIpAddr bSizableUdpLinkUWindowCheckboxUWindowDialogControlUWindowButton bHasOpened GetLevel FoundHeaderSize_ScrollbarWidth NickNameSetSize OverTextureColumnHeadingHeight bByParent BringToFrontPagebFlashWindowToGlobalSetAcceptsFocusGlobalToWindow SourceItemCaption SplitPos SelectedTab RowHeight InUserIdent InFullNameInDefaultChannelModeCRNickHDrawClippedTextureTemp2ActionCopy bChecked ItemClass DrawColorTile ClipTextAddressValueKeyNewNick MaxPlayers AwayTextMinNetVersion OldWinHeightEngineVersionJunkOutTextIn CurrentFrame CurrentTimebSpin ScreenshotNewUser TimeSeconds TimeDilationOldNickReason PlayerIDUWindowVSplitter PlayerNamebVoice NumPlayers ElapsedTimePingAll Favorites OpenLocationbSuspendableSortLtriestemp SentinelRuleUWindowVScrollbar RulesListIP EditFavorite NewFavoriteUWindowURLTextAreaUWindowSmallCloseButton CloseItemUWindowSmallButtonPartJoinWaitTimeoutTimeN CloseChatF MeshName PlayerList BoldStateUnderlineState ColorStateGXGYFGBGbColorbNormal bReverseResultGetEntryLevel StatusURLServerListTitle WaitResult URLAppendAutoRefreshTime bNoAutoSortbFallbackFactoriesUWindowPulldownMenuServerListClass PingedList UnpingedList Factories QueryDone MatchData TimeElapsed bPingSuspend bPingResumebPingResumeIntialUWindowTabControlItem SubsetList SupersetListURL bBottomGrowbHadInitialRefreshFallbackFactory VSplitter InfoWindow InfoClient InfoItemMinHeightForSplitter EPingStateBottomClientWindowTopClientWindowFonts HandCursor MaxSplitPos OldWinWidthRightClientWindowLeftClientWindowUWindowPageControl bToEndOfLineUWindowHTMLTextArea ErrorString PingStateTeamNumIdMbShow bFloating bNoActivateLinkItem bAutoInfoNewItemSubsetNext Superset NextState GetParent SelectedItem bBySupersetbSaveExistingList bInNoSortpos FullNameP NextSubsetNum SkinDescFact bSuccess ErrorMsgbDone SkinNamePrefixbUsePingedListMapNamePercentCompleteTotalReturnedServers TotalServersPingedServers MyServers DeltaTimeDeltaFoundFC ColumnNumServerAddress ServerURITimeOutTAClassMenuXMenuYCommand EInputKey ChannelName UserList Splitter EInputActionStyleRegionOwnerbHidden TextSize KickedNickKickerTextYLXLDynamicLoadObject PrivNickEji PageParentOldPlayerName SetupClient bConnectedbAway ReplaceTextInURIInPort bStretchedtChanSPriv ReturnValueGNewPageRWYX PageControlColumn UpTexture DownTextureTopRow bGotMOTDbHadInitialQueryURIsCMOTDB ScriptTextDescriptionEdit CurrentURIUpdateDescriptionCheckMaxURIIPEdit UpdateWindow GamePortEditGetMOTDQueryPortEditUWindowComboListControlOffset CenterPos CenterWidth LevelInfo ServerCombo ChannelComboConnectButton InTimeOutMenubHasReadWarning bStatusBarStatusBarText MinWinHeight MinWinWidthUWindowComboControlUWindowClientWindowUWindowWindow ConfirmJoinPlayerReplicationInfoInfo ViewportCanvas OpenComboFontLevel OpenHistory EditWidthActor HistoryItem HSplitter PrevSplitPos EditBoxWidthServerListNamesbKeepMasterServerIRC ClientArea bShowHorizSBDefaultChannel UserIdent SystemPageLANPagePageBeforeLANFactoryWindowsMCPawn PlayerPawnBitmap NewServersbHadNewServer CloseButtonChannelPlayer BannerWindowStatusBarDefaultTextbStandaloneBrowser OwnerTabListGrid OKButton EditControlItemsVertSB Background TextArea Selected NextBlockVisibleSkipped TopMargin BottomMarginbSelectNearestTabOnRemove InNickName HighlightNonePlayersTexturebSortDescending UWindowBase InSystemPage InServerSelectedServer TimePassedLineOldPingServerMessageConsolePlayCmdUserClassPackageInputOut MainWindow BannerAdNoneBannerAdWindowbChOpUTUBTCConst Category HostName NewListEntryFavoriteCount TextBuffer GameMode GameTypeTemp3bLocalServersOnlybCompatibleServersOnly MinPlayersMaxPing bAddModifier LogoImagesSupersetWindowObject MinNetVerGameVer PlayerMesh PlayerSkin PlayerFace PlayerTeam PlayerFrags PlayerPing bDescendingPTPBEnumRTRB TotalPlayersTotalMaxPlayersbNeedUpdateCountIcons ServerPing bPinging bPingFailedbPingedbNoInitalPing bOldServerbKeepDescription bLocalServer GamePort MapTitleMapDisplayName FunctionStateStruct StrPropertyStructProperty OldSentinelClassProperty NamePropertyObjectPropertyFloatProperty TotalPinging BoolPropertyFindIPFindQueryPort IntProperty BytePropertySubsetFactory bOldElementbOpNoneNoneServerCountLeader bUseMapNamePlayerCountLeaderNoneWorldLogWorkingTrueWorldLogWorkingFalseWorldLogWorkingTextPlayerListSortColumn EnabledTextBotText DisabledText ngSecretText PlayerStatsNextWindowDescNonengSecretColumnngSecretWidthNextWindowClassNoneGetNextIntDescNoneNoneNoneNoneNoneNoneMaxSimBroadbandPingNoneNoneCurrentNetSpeedNone Palette169 Palette167NoneNone PasswordTextNone ChangeHalfOpTextAreaClipTextTextAreaTextSize DrawTextLine IndentSize CheckMaxRows bHCenterChannelPrefixes Palette1DefaultTextHeight UserPrefixes UPhalfopUPop WrapParent RowClassbDirtybHalfOpindent bRowDirtyUPvoice Palette3ŠTQXÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿs� góŠK4èž� gó� gó� gó� gó� gó� gó� gó~ÜÛÌ(¤É� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó~ÜÛŠK4èž� gó� góŠK4èž~ÜÛ¤ºµ§+ÙR@G¢� gó� gó� gó� gó~ÜÛ� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó~ÜÛ ¶5´c ¶5´c ¶5´cF)·eÅ ¶5´cM•ÝTU� gó� gó~ÜÛ� gó~ÜÛ� gó~ÜÛ� gó� gó� gó~ÜÛ� gó� gó~ÜÛ~ÜÛ~ÜÛ� góM•ÝTUM•ÝTUÞÄ (€r˜¤ºµ§+¨•P¨M•ÝTUM•ÝTU¤ºµ§+¨•P¨M•ÝTUM•ÝTUM•ÝTUM•ÝTUM•ÝTU~ÜÛM•ÝTU‘|" p"]"zŠVhRÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ@€r˜ŠK4螀r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜€r˜‘n"zz @zÂP}mÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6j~ÜÛÂôŒÇË -Wù -Wù~ÜÛ -Wù~ÜÛ� gó -Wù~ÜÛ� gó -Wù~ÜÛ� gó� gó -Wù~ÜÛ� gó� gó� gó� gó܌̅܌̅܌̅܌̅� gó܌̅� gó� gó� gó� gó� gó"í¼æû"í¼æû"í¼æû"í¼æû"í¼æû"í¼æû� gó"í¼æû� gó� gó"í¼æû� gó� gó ¶5´c ¶5´c ¶5´c ¶5´c ¶5´c ¶5´c ¶5´c ¶5´cF)·eÅ� gó~ÜÛ� gó� gó� góÌ(¤ÉÌ(¤É� gó� gó� gó� gó� gó’þ � góÌ(¤É� gó� gó� gó� gó� gó� gó+g陕?{~ÜÛ -Wù -Wù -Wù -Wù -Wù ¶5´c ¶5´c ¶5´c ¶5´c ¶5´c -Wù -Wù -Wù -Wù -Wù -Wù ¶5´c ¶5´c ¶5´c ¶5´c ¶5´c ¶5´c�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`Ì(¤É—o û!+£ —o û’þ !+£ � gó� gó—o û!+£ �c1Q`�c1Q`�c1Q`’þ Ì(¤ÉÌ(¤É!+£ !+£ !+£ !+£ �c1Q`�c1Q`Ì(¤É’þ �c1Q`�c1Q`!+£ �c1Q`�c1Q`�c1Q`’þ Ì(¤ÉÌ(¤ÉÌ(¤É ¶5´c -Wù�c1Q`�c1Q`�c1Q`+gé™!+£ —o û� gó -Wù -Wù -Wù~ÜÛ -Wù�c1Q`’þ �c1Q`’þ �c1Q`’þ ’þ !+£ � gó!+£  -Wù -Wù -Wù~ÜÛ -Wù‘i]UBrowser.UBrowserServerListf]UBrowser.UBrowserServerGrideÓg*u]Infom] Playersl] Serversk]43Querying master server (hit F5 if nothing happens)j]Master Server Failed: i]Pinging Serversh] Completez0niCÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6|I?�E0f‘òw¨•P¨1ÂCþt—o û1ÂCþt1ÂCþt1ÂCþtB½ôs¤ºµ§+Ü{#U¿¤ºµ§+Ü{#U¿1ÂCþtN2ÈfN2ÈfN2ÈfN2Èf¡´è7`•?{•?{N2ÈfJ%ÌλN2Èf•?{B½ôsB½ôs•?{¡´è7`•?{•?{N2ÈfJ%ÌλN2Èf•?{B½ôsB½ôs•?{1ÂCþt¡´è7`•?{•?{N2ÈfJ%ÌλN2Èf•?{B½ôs•?{B½ôs•?{¡´è7`¡´è7`N2ÈfN2Èf¡´è7`¡´è7`N2Èf¡´è7`•?{N2ÈfJ%Ìλ1ÂCþtN2ÈfJ%Ìλ1ÂCþtN2ÈfJ%Ìλ1ÂCþtN2ÈfN2ÈfN2Èf¡´è7`N2ÈfB½ôsN2Èf¡´è7`•?{B½ôsB½ôsB½ôsB½ôsN2Èf£zÃZ1ÂCþt1ÂCþt1ÂCþt1ÂCþt¡´è7`•?{•?{¡´è7`1ÂCþt1ÂCþt¡´è7`N2Èf¤ºµ§+Ü{#U¿¤ºµ§+Ü{#U¿¤ºµ§+¨•P¨1ÂCþt¡´è7`•?{•?{B½ôs•?{¡´è7`•?{•?{N2Èf•?{1ÂCþt�c1Q`“tµð�c1Q`£zÃZ�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`‘]]Not in a channel!a]You were kicked from`-byb] is awaygT zzzz0jR{ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6%N2Èf0f‘òwJ%ÌλJ%ÌλJ%Ìλ£zÃZ£zÃZJ%Ìλ£zÃZJ%ÌλJ%Ìλ£zÃZJ%Ìλ£zÃZJ%Ìλ£zÃZJ%ÌλI?�EI?�E1ÂCþtI?�EI?�EI?�E1ÂCþt£zÃZ£zÃZ£zÃZ¦†`‘“tµðI?�E¦†`‘£zÃZ¦†`‘¦†`‘¦†`‘¦†`‘¦†`‘‘g|zzxzŠp~\ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ -WùŠK4èž‘zŠtg[ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ ¶5´cŠK4èž‘zz€@zÕjaEÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ tRFÊÕyŸ&. tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ tRFÊ‘zz@zŒAJKÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2܌̅ŒüM»ï+gé™+g除ºµ§+¤ºµ§+¤ºµ§+—o ûÏ/Tã2—o û—o û—o û—o û—o û—o û—o û—o û—o ûÏ/Tã2—o û—o û‘C]Unreal Server BrowserzzE@zzIzŠQrUÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÞÄ (ŠK4èžÞÄ (ÞÄ (ÞÄ (‘n"zzy@zzzz@zzLz0F~@ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6B½ôs0f‘òw£zÃZI?�E£zÃZ£zÃZƒ.ü'lI?�E¤ºµ§+£zÃZƒ.ü'lI?�E¤ºµ§+£zÃZ£zÃZI?�EI?�E1ÂCþtI?�EI?�EI?�E1ÂCþtI?�E¡´è7`‘gbzz@zÑSWwÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ’þ ÑA4y�c1Q`�c1Q`¦†`‘¦†`‘�c1Q`�c1Q`�c1Q`�c1Q`¦†`‘¦†`‘�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`¦†`‘¦†`‘¦†`‘�c1Q`�c1Q`�c1Q`�c1Q`�c1Q`¦†`‘¦†`‘¦†`‘¦†`‘‘zza @zz€@z˜NCWÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2_Ì(¤É˜Œ{²¢~ÜÛ~ÜÛ~ÜÛ� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó°£½þ˰£½þË� g󤺵§+� gó� gó~ÜÛƒ.ü'l—o ûÏ/Tã2~ÜÛ� gó� gó~ÜÛ� gó� gó*íQ˜¿*íQ˜¿*íQ˜¿*íQ˜¿*íQ˜¿~ÜÛ~ÜÛ~ÜÛ� gó� gó~ÜÛ~ÜÛ� gó� gó� gó~ÜÛ� góšx�—o û~ÜÛ� góÆ¼ÔŒŽÆ¼ÔŒŽ°£½þ˰£½þË� gó°£½þË�Ôºå�Ôºå� gó�Ôºå� gó�Ôºå� gó�Ôºå� gó�Ôºå� gó� gó*íQ˜¿*íQ˜¿—o û~ÜÛ*íQ˜¿‘k]Server@]Ping] Map NameA] PlayersD"zzn€@zzzzzzGz�Œp`yÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2!+£ ŒüM»ï—o û—o û—o ûOÜQR7OÜQR7‘EzŠT{oÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"í¼æûŠK4èž� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó‘zzO zzm@zz<z£z=zz}z�z?z1z3z�®^F qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2*íQ˜¿®J!››;aG°� gó›;aG°� gó›;aG°� gó›;aG°›;aG°Ì(¤É›;aG°Ì(¤ÉÌ(¤É~ÜÛÌ(¤ÉÌ(¤ÉÌ(¤ÉÌ(¤É܌̅¤ºµ§+� gó� gó‘w]&Play on This Serverp]&Refresh All Serversu]&Server and Player Infoh]Add to &Favoritesv]P&ing This Serveru]Ping &All ServerstMOpen &Locations]&Copy This Server LocationzÑNKJÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6)+gé™ÑA4y¡´è7`•?{f«³*I?�E@S®ò¯~ÜÛ~ÜÛ~ÜÛ~ÜÛ~ÜÛ~ÜÛ¡´è7`¡´è7`¡´è7`¡´è7`—o û!+£ ¡´è7`¡´è7`¡´è7`¡´è7`¡´è7`•?{~ÜÛ¡´è7`~ÜÛ•?{~ÜÛ•?{¤ºµ§+¡´è7`•?{~ÜÛ¡´è7`~ÜÛ•?{~ÜÛ•?{¤ºµ§+‘L] UBrowserLANh] FavoritesK]ChatS]NewsR]#"UBrowser.UBrowserServerListWindowQ]"!UBrowser.UBrowserFavoriteServersP]%$UBrowser.UBrowserUpdateServerWindowzz/€@zzy zz`@zzhzÂoG|ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ60f‘òwÂôŒÇË“tµð“tµð£zÃZ°£½þË£zÃZ°£½þË“tµð“tµð“tµð“tµð“tµð£zÃZ“tµð•?{•?{•?{§Õ¶mê§Õ¶mê§Õ¶mê§Õ¶mê§Õ¶mê—o û§Õ¶mê“tµð“tµð“tµð“tµð‘l]UBrowser.UBrowserIRCTextArea`] has leftt= has joinedg]was kicked byf]is now known asc]Quite] sets modezT@s~ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:01ÂCþtT¹xÛI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�E¨•P¨I?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�EI?�E3'‘J]#"Invalid server address, aborting.}]%$Error binding local port, aborting.G]-,Failed to resolve server address, aborting.F= Connected.H]Connecting tou]Timeout connecting to server.D]invites you to joinG] DisconnectedE]UBrowser IRC Client version zzS@zz]z�zTzMzD@zzUz�zzzYzz_@zzzzE€zŠzy z“zF@zz@zzh z¡zzzzzr z"zBzzr@zzzzPzzqz!zw@@zzBzòsVFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ J%Ìλò¤N2ÈfI?�E tRFÊ tRFÊŠK4èž tRFÊŠK4èž tRFÊŠK4èžšx�šx�šx�šx�šx�šx�šx�—o û tRFÊ tRFÊ tRFÊ tRFÊŠK4èž tRFÊ tRFÊ tRFÊ tRFÊ tRFÊŠK4èž tRFÊŠK4èž‘m$PAf zzszzzàqYÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>lM•ÝTUà6…� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó¨•P¨¨•P¨� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó¨•P¨� gó� gó€r˜� gó€r˜€r˜€r˜� gó€r˜€r˜� gó€r˜€r˜� gó€r˜€r˜� gó€r˜€r˜� gó€r˜€r˜� gó€r˜€r˜� gó€r˜€r˜� gó� gó� gó� gó€r˜� gó� gó€r˜� gó� góÞÄ (� gó� góÞÄ (� gó� gó� gó� góÞÄ (ÞÄ (ÞÄ (ÞÄ (� góÞÄ (ÞÄ (ÞÄ (� gó� gó3'‘m] Admin Emailb= Admin Nameo]Change Levelsp]Bots in Multiplayerq= Frag Limitr= Time Limit_] Game Modea] Game Typeu] Game Versionr] ngWorldStatsu] Mutatorsx] Enabled\] DisabledQMServer AddressN]Required Team ScoreO]Bots Enter Game for Min. of] Players@] Max TeamsB]Bots Balance Teams{]Force Team Balancej]Friendly Fire Damage}]Min. Compatible Version~] Bot Skilly]Tournament Modez] Server Mode|] Dedicatedb]Non-Dedicated\]ngWorldStats StatusZ]Processing Stats Correctly[] Not Processing Stats Correctlyy]Requires Password`"w" z"zz]z®zFxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2OÜQR7®J!›!+£ ’þ � gó!+£ ‘p]&Refresh Infon]&Closezz:zzLzfzzzN zzSzzKz¦z5@zzEzJzq z¡zNzzAzmzZz“zA€zzzfblÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6 ^ÝÇ=~ÜÛ� gó^h{� gó� gó� gó� gó� gó^h{‘s] UBrowser.UBrowserFavoritesFactgzdÓzz^zzg@zzz€@zzizszkzz] zzjzTzgsÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:fÙ¡õËT¹xÛA»Þv"A»Þv"A»Þv"A»Þv"A»Þv"A»Þv"3'‘m]+*The master server could not be resolved: u]&%Timeout talking to the master serverU]-,Connecting to the master server timed out: zzzzzP zpz�zgzzCzz_@zz nZ]ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿmŠeÉoz 釅mX̬aX̬aX̬aX̬aX̬a¨•P¨3'‘Z]unreal.epicgames.com["Pz"zzU z z€@zz~zzEzzHzTZvÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ:s¥ýT¹xÛq¼‰_“q¼‰_“q¼‰_“q¼‰_“q¼‰_“3'‘m]+*The master server could not be resolved: u]&%Timeout talking to the master serverU]-,Connecting to the master server timed out: zz`z“zqzzpz*zzzbz“zq@zzK€@zzgly zJ@zz[zezzzO@zzu @zzCzzhzzi€z�z6zzz¦zv€zšzC€zšz^z“zz§zD2zzWzzC zzzXzXzzR@zzK@zzl@zz€@zÍN[gÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿT¹xÛÍ2ç!¨•P¨¨•P¨¨•P¨3'‘Rzzg@zz€@zzzÂg^_ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2X̬aÂôŒÇËboÐÁ÷mŠeÉomŠeÉomŠeÉomŠeÉo܌̅+gé™܌̅+gé™boÐÁ÷boÐÁ÷܌̅boÐÁ÷܌̅mŠeÉomŠeÉo¨•P¨mŠeÉomŠeÉo‘_]Querying Server...^]The server did not respond.]mlb\"zzE z z{o?°-*g*t* zYz zjzŸzUz«zzzzzzz€zÃkE^ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿboÐÁ÷ÃHümaƒ.ü'l—o ûÏ/Tã2‘zzzz@zàSSIÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿeÔºÙà6…xލ¸9xލ¸9xލ¸93'‘zzzztzzozzzzezzZT 5- -TS z{zzizzhzz[zzz zCz zrzzZzzY€@zzdzÅzFz•zqzzzz}zzz z[zzDzzBzzKzzzŠ´FkAÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6K@S®ò¯´ÚãÌ~�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4ØùjbŠK4èž�_ã‰4ØùjbŠK4螊K4èž�_ã‰4ØùjbŠK4螸e?Æ;¸e?Æ;�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4ØùjbŠK4èž�_ã‰4ØùjbŠK4螊K4èž�_ã‰4ØùjbŠK4螸e?Æ;¸e?Æ;�_ã‰4ØùjbŠK4èž�_ã‰4�_ã‰4�_ã‰4�_ã‰4I?�EI?�EI?�E�_ã‰4I?�E�_ã‰4I?�E�_ã‰4I?�EI?�E«×7Xë×7Xë×7Xë×7Xë×7XÃ�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4«×7XÑS]irc.gameslink.netd] #utgamesdÝ #utchatdÝ #utmodsdÝ  #utlevelsdÝ #uthelpP= IRC ServerK]Default ChannelX]XVChoose an IRC server from the list or type in your own IRC server name or IP address.W]dbChoose a default channel to join once the server has connected, or type in your own channel name.v] Connectx]LogoffY]! Connect to the IRC chat server.U]&%Disconnect from the IRC chat server.T]îlThe Chat facility will connect you to the Internet Relay Chat (IRC) network.\n\nEpic Games is not responsible for the content of any channels in IRC. You enter these channels at your own risk.\n\nAre you sure you still want to connect?V] Warningz"JWFÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ A»Þv""í¼æûfÙ¡õËfÙ¡õˤºµ§+¨•P¨fÙ¡õËfÙ¡õËfÙ¡õËfÙ¡õËfÙ¡õËfÙ¡õËfÙ¡õË‘y"äpj" y]unrealzzzzg zz}€zzbzzJ @zzVzzt@zzi €@zzd@@zz_zAzmzzX@zzc@zzP@zz]@zzWzzq€zzzzF€@zzYz zzzxzzWzzz zzzQzzkzzhz"UInÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ^h{"í¼æû� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó‘zzN@zz@zzyz«z\zÌzD€zzzzz zzzU @@zzqzzzzzzl@@zzi@@zzV@zzzzKzzuz@"mdZÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ q¼‰_“"í¼æûs¥ýs¥ý¤ºµ§+¨•P¨s¥ýs¥ýs¥ýs¥ýs¥ýs¥ý‘a]master.telefragged.comM] /servers.txty"Pj" zzzzzz2zzzzzzB z•z_€@zz`@zz{z•zRz•z}z¡zlzzozzJ zzR zz[ @zzu@zzM zP zOz•zrz«zC @@zz~@zzI zzz zE@zzz zv@zzPzqzt2@zza€zz€zzP€z�zHzzzzzŒoXPÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2UØ~-æŒüM»ïƒ.ü'lƒ.ü'lƒ.ü'lƒ.ü'l«×7XÃ.ü'lƒ.ü'l«×7XÃ.ü'lƒ.ü'lпВƒ.ü'lƒ.ü'lпВƒ.ü'lƒ.ü'lƒ.ü'lƒ.ü'lƒ.ü'l—o û—o û«×7Xë×7XÑz-OKE\ ]Open Locationzzzz`zzx€zzzzI zzwzzlzzzzt€@zzK zŸzAzz@zzBzŸzNzzXzzo@zzzz] zFzzzTz•zez•z€@zz>zzzOzO€zz^zzwzÉzlzzzŒgCkÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2s\¶ŸgŒüM»ïƒ.ü'lƒ.ü'lƒ.ü'lƒ.ü'l«×7XÃ.ü'lƒ.ü'l«×7XÃ.ü'lƒ.ü'lпВƒ.ü'lƒ.ü'lпВƒ.ü'lƒ.ü'lƒ.ü'lƒ.ü'lƒ.ü'l—o û—o û—o û«×7Xë×7XÑz-OKEr]Edit Favoritezzu€@zzv€@zz&zzT€@zzEz¸zG€@zzz zz zz zzzO€@zzT @zzyzbzGz¸z]zzu @zzz"zR(ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6)F)·eÅ"í¼æû� gó� gó� gó~ÜÛ¤ºµ§+¨•P¨� gó~ÜÛ¤ºµ§+¨•P¨� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó� gó~ÜÛ� gó~ÜÛ+gé™+gé™+gé™~ÜÛ~ÜÛ� gó~ÜÛ� gó~ÜÛ� gó� gó� gó‘s$<Fhog]Could not find the window: v]Window is not ready: zz@zzzzZ z›zO @zzzzJzz @@zzJ zzCzŸzzzTz¸zzzn@zzzz_zzLz�z@zzY zOzN zOzJ@zz\ @zzzzzzRzzQ€zztz�zP@zza€zzJzözh@zzzz@ zzozzn@zzez•z zzd€zšzdzzzzzzQz+´pjÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2;r*ƒ‚ ´ÚãÌ~ƒ.ü'l*íQ˜¿� gó“tµð� góÌ|.XÚ� gó“tµð� gó“tµð� gó“tµðƒ.ü'l*íQ˜¿Ì(¤É^ÝÇ=^h{� góƒ.ü'ls\¶Ÿg“tµð“tµðƒ.ü'l*íQ˜¿“tµð� góÌ|.XÚ� gó“tµð� gó“tµð� gó“tµð� gó“tµð“tµð“tµð“tµð“tµðÌ|.XÚÌ|.XÚ“tµð“tµð“tµð“tµð“tµð“tµð“tµð“tµð“tµð“tµð“tµð“tµð“tµð“tµð“tµð“tµð‘X] DescriptionW]Auto-Update DescriptionV]Server IP AddressU]Server Port NumberY]Query Port NumberzzG €@zz€zzzz| €zŠzE @z"wwHÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿxލ¸9"í¼æûeÔºÙeÔºÙ� gó~ÜÛ� gó� gó� gó� gó~ÜÛ� gó~ÜÛ¤ºµ§+¨•P¨eÔºÙeÔºÙeÔºÙeÔºÙ‘[]unrealZ"I"kÓzzzzB zŸzyzz²%}#ײ}£Ûy ’7r}*} C %.£}�Ž<.“ “¯Ž?,�€A<#%<Y(< p�<H' zz’£z@zzWzzzz`zzGzzzzRzzDzzwzxz¹oP VX¥¹P Q R <¬�ˆA<ª<¯¯Ž<Ž<ë�% ¬�¯Ž<Ž zj €zãzX€zz{zzOzzzzzzzczzzzc €@zzWzzN zzzzF @@zzz zzzj€zzf �zzzzfc6“! `2-r4±Öùr-r(RS�—t%S–}$t22€$t$$t-r(^S/c~$HÑ‚šcÿÿÿÿ zH5c~$D,›cÿÿÿÿ2€$’c}H$$’c}H-r(^S/2^ichmmmc zj�@zzX€zze€@zzz zzƒFSdÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿaŽÓA ƒ.ü'l—o ûÏ/Tã2÷¤ºµ§+—o û‘zzs€zzz’zzzzzIz›z@zzyzzzzXzzAzzzzzz\@zzfzz€@zz€@zzAzzmzz-zzAzz|zzf€@zzx@zzzznzzvzzs@Dzzzzz^zEzÐz_zzW€zšzc€@zzazÐzz!z€@zz}€z�zf €@zz@zzo@zzzzF€z�zzzYzzzzNz•zd €@zzzzzzdzzzzTz•zG €@zzz•zWzzpz"zOzzzzezz\€@zzzƒzw@zzzz€@zzp €@zzzz€@z®PT}ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿeWoÑîJ!›I?�E@S®ò¯I?�E@S®ò¯I?�E›;aG°‘zzzzzz~zzzƒzzzn@zzWzzc@zz@zzzzbz�zmzzHzzn€zz|z�z€@zzb€zzk@@zz~ €@zz` €@zzszzN zÅzXz�zj@zz@€zãzLzz€zzY zzIzzD zzzz|€@zzJ@(zl{‡û  z@zzA zzK€zšzz zzzPzŸzz zV€zãz@zzA€zzz z`€zšz} €zzF€zšz€zzB@zzNzzuzzC zz@zzI zzlzz z0z_€zz`€zzX€@zz@zzzz€z›ÂFMGÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2 f«³*ÂôŒÇËI?�EI?�E܌̅I?�E¡´è7`¡´è7`¡´è7`¡´è7`•?{I?�E‘^]Systemzzc €z"zy€zzjz›zd z›zU z›z_ z›zkz›zh€zzmz›zS €@zzzzS zzTzzxzzH z›z~@zzQ z›z{zzm z0zb €zzA zzz!z�zzI@zz}�zzLzzizz@zzÄs E ;(EdE &iP e:W YfV�f-ÙP e:W ŒI.P ž  ]:W ¦d PW À_ PzW ÚlPiW Z .P ž OW Tj±7npppunreal://:9:S:FW ÿÿÄE  zezz€z›zßC "JøÉf-Ù„r:*š:F%i-Ù„r:*š:F%j-Ù„r:*š:F%I-Ùr:*l-Ùr:*Î*ß zX @zzt z›ze @zzCzzFzzB @zzzz}zz€@zzL €@zz~ z›zG €@zzk €zzU DR:' zZI^5Ú z€z›zo €@zz@zz€z›zD z›zI @z´mLOÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ6'\ ±.«;´ÚãÌ~�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4ØùjbŠK4èž�_ã‰4ØùjbŠK4螊K4èž�_ã‰4ØùjbŠK4螸e?Æ;¸e?Æ;�_ã‰4ƒ.ü'lƒ.ü'l܌̅UØ~-æšx�—o û�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4�_ã‰4‘R]Open:S]VTEnter a standard URL, or select one from the URL history. Press Enter to activate.zz^ z›zL z›zfz›˜w~Qÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ24` Ñ€Õ%˜Œ{²¢’þ � gó€r˜�Ôºå!+£ OÜQR7OÜQR7OÜQR7Æ¼ÔŒŽÆ¼ÔŒŽ’þ � gó€r˜� gó�Ôºå�Ôºå�Ôºå�Ôºå�Ôºå�Ôºå�Ôºåšx�—o û°£½þ˰£½þË€r˜°£½þË�Ôºå�Ôºå€r˜�Ôºå€r˜�Ôºå€r˜�Ôºå€r˜�Ôºå€r˜�Ôºå€r˜�Ôºå€r˜�Ôºå€r˜€r˜�Ôºå€r˜�Ôºå�Ôºå€r˜‘I]NameE]FragsO]PingN]TeamM]MeshL]SkinK]FaceJ-IDa]ngWorldStats Status^= Registered`] Unregistered_]BotKÓzzzzu z›z€z›zlz›z_@zz@zzUh ùi64z€h ,PING ppPONG h ,V z€@zz[zz~€@zz€@zzd€z›zb z›zK€@zzj €@z˜e[Tÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2p ­æe0˜Œ{²¢’þ � góÞÄ (�Ôºå!+£ OÜQR7OÜQR7OÜQR7Æ¼ÔŒŽÆ¼ÔŒŽ’þ � góÞÄ (šx�—o û°£½þ˰£½þËÞÄ (°£½þË�Ôºå�ÔºåÞÄ (�ÔºåÞÄ (ÞÄ (‘I]RuleF]ValueKÓzzz€@zz@€@zz@z­zY@zzv @zzw zzx zzzzz€@zze€@zzR€@zzS €zz€z›zH €@zz@ zzzzLzzA zzazzZ€@zzzÑxNVÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿF ܉²ÚÑA4y’þ � góÅëŠZ!ÅëŠZ!‘zza€zzk€@zzp zz| z’zG€zz`€zzP �zz\zzSzzY�zz€@zzu€zŠz€zzY@zzd€zŠz€@zz€zzzzX zzw €@zzq�zz@€@zzzz€@zz[ �zz€@zzH@(za @(z{@@(zGz­zc @@(z€@zzzzk @zzB€zz€zzH@zzy�@zzn zzzzg@@zz}€zzv z•zS @zz€@zzf€@zzM @zzdz•zzzkbH$+L-Bbp rL*L.-z-×L9bL_p L&<F±{l L=l ÅL=bL^}L[|L-v(- vLL-r(L zzTkWtÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿz 釅mT¹xÛ3'‘zzw €@zzW€@zze`DY zzazs€zz\€zzZzzzzBzzB zzb€@zzzzE €@zz€z�zlzzpzzizzF zzc€@zzK zzhzzLcrqpnzp€@zzO zz~ €@zzLzzz z €@zz^zzU€@zzW zz\ €@zz\zzO�@zz[ zzzÅz²\` ~ï bcÛM ’` ÛN ’S.©` �ŽSî[ [IY YI .�© ��Ž î ÔpB +G.+ž +Dq.G¢`³ Ž?€m'( zz’zo€zšzV €@zz{€@zzL€@zzzUzz €@zz€@zzy zzh @zzl €zz€zzzÅzA€zšzz€zFzyzzp zzp€zz€zzb€zšzkzzx €zãz\z’Xz€zz€@zzN€zšzw z’^zf €@zz€@zz`zÊz€@zzz•z}@zzX €@zzIz’§zz€@zzzzzz�zzzzt@zz€@zzP€@zzy€zz€@zz]€z®WQBÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2 T gVŒ®J!››;aG°I?�E›;aG°I?�E›;aG°I?�EI?�E@S®ò¯I?�E›;aG°‘v] &Connectx] &Disconnectv]&JoinzzW €@zzs�zzzQ ]ù9..+ž +q ¿ ]Q  zI€zzZ �zz[ �zzf�zzV€zz_ €@zzQ€zšzP €@zzK€zFz€zz�zzh €zze €zšzf €zzh€zz\ €@zzm�@zz~€zz_€zzi €zzj €@zz�zzh€@zzm �zzo €zz€@zzR€@zzt^#ÛI W * zq €@zz@ €@zz€zzf€@zzr €@zzz @@zz{ €@zz| €@zzb €@zzw €@zz} €@zzF €@zz|€@zz^zzN€@zÅiRDÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿC Šœ½¨Åò§J­ä`Ë›°£½þ˰£½þË­ä`Ë›­ä`Ë›­ä`Ë›0f‘òw0f‘òwƒ.ü'l—o ûÏ/Tã2­ä`Ë›­ä`Ë›­ä`Ë›­ä`Ë›­ä`Ë›0f‘òw‘"P"ôzzV €@zzA z’*zG €zzL €zz€@zz[zz€zÕz�zzO €@zzc@zzW €@zzu @zzQ €zšzR €zz€zzO @zzB€zšzr @@zzN €@zzY €@zz€@zz€@zz€zz€@zzZ €zz€zz] €zz€zz^ €zšz`€zzR€@zzd €zšze €zz€zz�zzh €@zz€@zz€@zzk €@zz€@zzb €@zzn €@zz€@zz] €@zzzz€zzq €zzJ€zŠzr €zšƒyZeÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿu ×ëƒ.ü'laŽÓA šx�¤ºµ§+šx�¤ºµ§+‘zzs €zŠzx €@zz€@zz€@zz€@zzx€zzL €zz| €zz€zz€zz€@zz €zzC€@zz€@zzA€zzF€@zz€zzM€zzI€@zz€zz~ €zzD €zŸzzz�@zz{@zzU€@zz^ €@zz{ €@zzV€@zzT€@zz€@zzQ€@zzW€@zzY€@zzrzzZ€@zza€@zz4@zz]€@zz€@zz[@zz`€@zz€@zzc€@z®yxÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2bàœb÷®J!›B½ôs›;aG°B½ôs‘b] &Close v]&Joinzzj€@zzv€@zzd€@zzB€zzf€zÉzg€zÜzG€z"zz €@zz€@zzv€@zzn€@zzo€@zz@ €@zzR €zŠzr€@zzx€@zzt€zšzu€zz€zzl€@zzx€@zz|€@zz[€@zz}€@zz€@zzy €@zz`€@zz@@zzm €zzt @zz€zz|€zz�@zzE€zšzI€zzE€@zz~€@zzG€@zzb @(z€zrncLÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2KhwÓ4r*ƒ‚ ƒ.ü'l*íQ˜¿Ì(¤É^ÝÇ="í¼æû� gó"í¼æû� gó� gó“tµð� gó“tµð� gó� gó“tµð� góÌ|.XÚ� gó“tµð^ÝÇ=� góƒ.ü'l“tµð“tµð‘zz�@zz�zzL€zzq€@zzO€@zzR€@zzS€@zzc€@zzP€zzT€@zz�zz€@zzV�zz@zz�zzY@@zz�@zz^€@zz_€@zz`€@zz\€zz�zza�zz€@zz@Zzd@Zze@@Zz€@zzg€@zzf@@Zz�zz€@zz�@zzl€zz�zzk€@zzn�zz@@Fzs€@zzR€@zsEMÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2tK'ës\¶Ÿg‘z]NewEK] New Favoritezzx@Fzu@FzJ€zzq@Fz€@zzi€@zzY,M¶Tí/|€,,MSG ,pPRIVMSG ,,]|€,,LEAVE ,pPART ,,/~, Ì›/ÿÿÿÿyë€,/,py,/y ¼PRIVMSG ÇNOTICE CKILL`,’/&/~` @›/ÿÿÿÿ,pp¨y€`/ :`’/&É ÎCTCP`,’/&/~` Ë›/ÿÿÿÿ,pppppPRIVMSG €`/ :ì&`’/&ì&É ’KICK`,’/&/~` �›/ÿÿÿÿg`’/&h~g �›hÿÿÿÿ,pp¨¨y€`/€gh :g’h&É ÆQUIT,ppy :,’/&É ÿÿÙ,ë,p,V zl €@zz|€@zzd€zŠz~€zŠz€zz€zz]_|„m  z€zz€zŸzV€@zzQ€zzB@@zzP€zzU€zzL@zzD €zzk@zzN€@zzO€@zz}€@zz[€zzU€zzS€@zzT€@zz[€zz€zzU€zzX€@zzY€@zzy€zzZ€@zz€zz€zz_€zzZ€@zzK€zz^€@zzc€@zzo€@zzJ@zzfz•z`€@zzh€@zz^€zza€@zz8€@zzi€@zzj€@zz€@zzk€@zz€@zzh€@zzq€zšzr€zzI €zz�zzX@zz[€zz€zzN@Dzzv@zzz€@zz{€@zz|z’mz}z’bzDzz€zŸzñE{l 6 z€@zzzzm@zzv€zz€z�zF€zšzG€zzm€zz@€@zzC€zšzp€zšzZ€zzm€@zzK€zz€@zz€zzH€@zze€@zzP€@zzd€zšzQ€@zzT€@zz`€zz€zzc€@zzX€@zzb€@zzR€@zzH€@zz[€@zzt€@zz]€@zzx€@zz€zz€@zze€@zz€zzU€@zz€zz[uc@´»u.*ʳ:[Du=b-ï�u-BHDu9tDSuFxDSu_ zd€zzf€zzk€zšzl€zz€zzJ@zz€zzn€zzö\B{]o *B.*ʳ:B=[ B-B�b-ïB9H BFJt B_Jx .^%.^.*ʳP ž ^(B@B B(''Ê z�zz~€zzr€@zz€zz;€z’Šzq€@zzU €zŠzw€@zzC€z*YVpÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ2 zX "$Text); } function ChannelAction(string Nick, string Text) { TextArea.AddText("* "$Nick$" "$Text); } function UserNotice(string Nick, string Text) { TextArea.AddText("-"$Nick$"- "$Text); } function ProcessInput(string Text) { if(Left(Text, 4) ~= "/me ") { ChannelAction(SystemPage.NickName, Mid(Text, 4)); SystemPage.Link.SendChannelAction(ChannelName, Mid(Text, 4)); } else if(Left(Text, 1) == "/") SystemPage.ProcessInput(Text); else { if(Text != "") { ChannelText(SystemPage.NickName, Text); SystemPage.Link.SendChannelText(ChannelName, Text); } } } function PartedChannel(string Nick) { TextArea.AddText("*** "$Nick@HasLeftText@ChannelName$"."); UserList.RemoveUser(Nick); } function JoinedChannel(string Nick) { TextArea.AddText("*** "$Nick@HasJoinedText@ChannelName$"."); UserList.AddUser(Nick); } function KickUser(string KickedNick, string Kicker, string Reason) { TextArea.AddText("*** "$KickedNick@WasKickedByText@Kicker$" ("$Reason$")"); UserList.RemoveUser(KickedNick); } function UserInChannel(string Nick) { UserList.AddUser(Nick); } function ChangedNick(string OldNick, string NewNick) { TextArea.AddText("*** "$OldNick@NowKnownAsText@NewNick$"."); UserList.ChangeNick(OldNick, NewNick); } function UserQuit(string Nick, string Reason) { TextArea.AddText("*** "$Nick@QuitText@"("$Reason$")."); UserList.RemoveUser(Nick); } function ChangeMode(string Nick, string Mode) { TextArea.AddText("*** "$Nick@SetsModeText$": "$Mode); } function ChangeOp(string Nick, bool bOp) { UserList.ChangeOp(Nick, bOp); } //utpg: halfop support function ChangeHalfOp(string Nick, bool bHalfOp) { UserList.ChangeHalfOp(Nick, bHalfOp); } //utpg: halfop support -- end function ChangeVoice(string Nick, bool bVoice) { UserList.ChangeVoice(Nick, bVoice); } zj€zzfndf�"Ýn. [–Qwn*n-] 'n. n–n. [–Û‚wn*n-] U . n–ng-#'nU j zn 1zT 2z|(H|i.�© ��Žp.@i © @�Ž% *iiøpi÷%iÁ4Biæ4BiÔi-ã'i-ï'W zA //============================================================================= // UBrowserInfoWindow //============================================================================= class UBrowserInfoWindow extends UWindowFramedWindow; var UBrowserInfoMenu Menu; function Created() { bSizable = True; bStatusBar = True; Menu = UBrowserInfoMenu(Root.CreateWindow(class'UBrowserInfoMenu', 0, 0, 100, 100)); Menu.Info = Self; Menu.HideWindow(); Super.Created(); SetSizes(); } function ResolutionChanged(float W, float H) { Super.ResolutionChanged(W, H); SetSizes(); } function SetSizes() { local UBrowserInfoClientWindow C; MinWinHeight = 100; SetSize(Min(Root.WinWidth - 20, 500), Min(Root.WinHeight - 30, 230)); } z€zzôNMˆ-à'-í'0{} ÷ôM%–MN M{.ÅÛ¥jN Å¥M=j% zv\ Pe K%,pp¨¨p*** \ V (@).W L\  zÒi Òf N *j P *i D *Z  _ * -*^ -*l o *_  ] *d  V * zU Xt^~{ St ³&u!>„zìG5zìGD}~„zê2&5zê2&D2€2“}2&>ž{2-5 A&°-5 A,Q K,u!ë„zìG5zìGD}+„zê2&5zê2&D2€2“}2&ëA2-5 A,Q ÿÿQ z}} :_wJ%&p¨¨p*** } b f .WQ} f  z\j \*(%ppp* j  k  zgca,t D7777x D7778 zèsy²kèi„„„°ª?% °¯?,±®ª� �±®¯Ž Ž$ zj class UBrowserInfoMenu extends UWindowRightClickMenu; var UWindowPulldownMenuItem Refresh, CloseItem; var localized string RefreshName; var localized string CloseName; var UBrowserInfoWindow Info; function Created() { Super.Created(); Refresh = AddMenuItem(RefreshName, None); AddMenuItem("-", None); CloseItem = AddMenuItem(CloseName, None); } function ExecuteItem(UWindowPulldownMenuItem I) { switch(I) { case Refresh: UBrowserInfoClientWindow(Info.ClientArea).Server.ServerStatus(); break; case CloseItem: Info.Close(); break; } Super.ExecuteItem(I); } zT uMRŸ� M  (fq!! zDZ tT�R%3ppp¨¨p*** Z | w  (x )W LZ  zwm E/e(%ppp-m - n  z€zzûr_  *›v-L¸_ s± …=ðj{ððûð¥jh™jN j%™ð%{ððûð zûfs ëá,‰ s F-\H-\(‡—r %¸ts ‡±t?r t '-S  zÔIoC>*$Ôon z²D µ-²6.�© ��ŽU.¦6© ¦�Ž6ø.` 6© ` �Ž6÷UUÿ.p U© p �ŽUþ.F U© F �Ž z¹gjK I¹jkl[�¯�?,[ë¯�?,Œ zA$DzåQ° Ž?�¬?ùlD¯ �?, ¯ Ž?, †¬?ùlD¯ �?, ¯ Ž?,2ª?D¬¯ ��?,¯?D¬¯ ŽŽ?,ü?ù,D¯Ž?, zDe OTBe .U !© U–C BÈBÈB'De  zYa f¾];9„³ Ž?€G-Îea ' zEk@Z£³:|€k,http://±upstart k“n|€k, unreal://±Vk$(“±Vpunreal://k$( å7 zK 1zGoh .+¢o zIpmY .+¢p z\ 0zzz€zzá ½£áE.«© «¯�?,l¯Ž?,@B€A.Щ Я�?,8¯Ž?,@B€AEP.\ ¢E r$ zÔNiCMÔif$ zlclass UBrowserIRCJoinMenu expands UWindowRightClickMenu; function ExecuteItem(UWindowPulldownMenuItem I) { UBrowserIRCSystemPage(OwnerWindow).JoinChannel(I.Caption); Super.ExecuteItem(I); } function ShowWindow() { local UBrowserIRCSystemPage S; local int i; S = UBrowserIRCSystemPage(OwnerWindow); Super.ShowWindow(); Clear(); for (i=0; i<10; i++) if (S.SetupClient.IRCChannelHistory[i] != "") AddMenuItem(S.SetupClient.IRCChannelHistory[i], None); } zLzzO$�V¬–C´Bª?D¬¯ ��?,¯?D¬¯ ŽŽ?, zÒR."28Ò¢'¬¢�¯¢Ž?, zçSt(ÃßçthdEª¯®¢ª¢�?,hE¯®®¢¯¢Ž?,ª¯®¢ª¢�?,4¯®®¢¯¢Ž?, zQzz€zz¹cI2ù€¹ICv~µ6ÁKK6ÁUϯU�¯6Ž6Á zÿTa 4/r^ |úa ¢ª®¢¯¢Ž¢�ÀA^ ÿa on z_ p m–®ÅH-p ¾-o  + ø* ÷*q *GS*S¬�Ž¡�G-ÎG"»�-m GéEG+ " ¬�ŽS * q *  øS ÷qÃG+ + ø* ÷*q *GS*S¬�Ž z{!¦ç v! %zÿÿÿÿÿÿÿÿÿÿ z²[Uz²[.“ “ A A\C€?[ Z[#%[Y([ p,[ëÈBb.Ì Ì AðAC€?b \b#%H.“ “ AHB\C€?H ^H#%HY(Hp,(HëÈBt.“ “ AŒB C€?t `t#%tY'tp,të Bx.“ “ A´B C€?x bx#%xY'xp,xë B[éc znjoõ I�-^('-x(G-{-{(ID-A -Z zhqMK½FhqD{q.+.ž ¢ rq zÅaVkm×)V $,tAJ' ÿÿ z€zz_€zzbOc?4DZN*ZaZ*k% z]NSwUZN*ZaZ*¥kA–kA Dzk% zõYS(Â�×S�Ž ä�µ6ÁKK6ÁUϯU�¯6Ž6Á zV€zzæpͱæÀ@AppBYðAXðAcðAe BU BTpBQðAZeÈB_,d zâeGA2@!-çgDêå(g%jêáz.ž Dhrz* nzC‰rn* [ nò™zC–ï²Z�?&Z"Z�?_??±Z�?&_DZ�Z�Z+Gô% (ó] D¬¯Ž?’jgÀÈI?’[ &?] ÚDÈé\%e&d.n–‚°?e¯¯®ÀŽÀ?’jg wd*ú³?\ÈéCÉ }%C+¶G@?’ejd.æ ¹&C,¶G@?’ejSd]æ ö,C,¶G@?’ejSdhæ 2,C+¶G@?’ejdPæ n,C+¶G@?’ejd`æ ª,C+¶G@?’ejdæ æ,C+¶G@?’ejdOæ #,C,¶G@?’ejSdoæ ã,n|d[botC"¶G@?’ejdàµ|d[trueC"¶G@?’ejaàC"¶G@?’ejcæ ÿÿeD®?eÀ¥\d.d–ß zl!¼Wv! %zÿÿÿÿÿÿÿÿÿÿ zapLDâLÞpì, J{p.+.ž ¢ Up zj€zzz€zzWª D8WB‚�iz2\final\K 'q!! zqk_´ÉXu!pp\list\\gamename\e\final\-ip\ðA, %zÿÿÿÿÿÿÿÿÿÿHzgclass UBrowserHTTPFact extends UBrowserServerListFactory; var UBrowserHTTPLink Link; var() config string MasterServerAddress; // Address of the master server var() config string MasterServerURI; var() config int MasterServerTCPPort; // Optional port that the master server is listening on var() config int MasterServerTimeout; function Query(optional bool bBySuperset, optional bool bInitial) { Super.Query(bBySuperset, bInitial); Link = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserHTTPLink'); Link.MasterServerAddress = MasterServerAddress; Link.MasterServerURI = MasterServerURI; Link.MasterServerTCPPort = MasterServerTCPPort; Link.MasterServerTimeout = MasterServerTimeout; Link.OwnerFactory = Self; Link.Start(); } function QueryFinished(bool bSuccess, optional string ErrorMsg) { Link.Destroy(); Link = None; Super.QueryFinished(bSuccess, ErrorMsg); } function Shutdown(optional bool bBySuperset) { if(Link != None) Link.Destroy(); Link = None; Super.Shutdown(bBySuperset); } zoii¡ -I -x' zÑy{A`Ê fÑi{. Y–dw{*{~i{. {–% zr€zzT saR  qçpppTimed out in master server protocol. Waiting for H in state SaK  (hq!! z€zzU xO^] O $&u!X, @, ”,u!pppppp\gamename\e\location\SC\validate\A2e\final\q!_ ß,u!Ìz2final\K 'q!!Ü-\ A, ,u!A2-\ @, ÿÿ zÛfu|“?Š^ž !r^* Z.!^míMKY W ZªY Z¯W Z" zM€zz¹wE+Ç—�-u ¹EFGA¬�Žm.ž �zDm)Ac•m )D zAs{-u 'Dy:wZ*ZN*ZaZéa{ZNZO-}( zP Au… XL P :&B P :,\&KHL JB e zèP zyG]1èp -Î\w.�qÊ* Á.�qÊÁq * qDE½wE*Gýppb - E=ÑGýbjz. Y–/wz*z~jz. z–ð zs u^Ó8I W *u t *H  q * z€zzÞtDn¡Q<.ž DC>DÉ z¹@d  f/_¹d e f h.ž q. Y–F‚wq* ›:h:$Cq~hhC¼š:C:$q~I`q~B’q~I`AWq~fÅChtš:C:$I`B’I`AWfì—B%M D¬«?`ÈB?BC W$@—%h1)ppppppS  (WS p)Th )S ] z$h)p~ W] $ $hp)pppppppppppppp}  SM % w . WSA p, XSS Q ] Z$hI)ppppppppWSA p, XSS Q ] ÿÿ zÜ|o¦ï z€zzjÝclass UBrowserIRCLink expands UBrowserBufferedTCPLink; var IpAddr ServerIpAddr; var string ServerAddress; var int ServerPort; var string NickName; var string UserIdent; var string FullName; var string DefaultChannel; var localized string InvalidAddressText; var localized string ErrorBindingText; var localized string ResolveFailedText; var localized string ConnectedText; var localized string ConnectingToText; var localized string TimeOutError; var localized string InviteString; var UBrowserIRCSystemPage SystemPage; var string DisconnectReason; var string VersionString; //utpg: user/channel prefix var string UPop; var string UPhalfop; var string UPvoice; var string UserPrefixes; var string ChannelPrefixes; // &# //utpg: user/channel prefix -- end function PostBeginPlay() { Super.PostBeginPlay(); Disable('Tick'); } function Connect(UBrowserIRCSystemPage InSystemPage, string InServer, string InNickName, string InUserIdent, string InFullName, string InDefaultChannel) { local int i; UPop = "@"; UPhalfop = "%"; UPvoice = "+"; UserPrefixes = UPop$UPhalfop$UPvoice; ChannelPrefixes = "&#"; SystemPage = InSystemPage; NickName = InNickName; FullName = InFullName; UserIdent = InUserIdent; DefaultChannel = InDefaultChannel; i = InStr(InServer, ":"); if(i == -1) { ServerAddress = InServer; ServerPort = 6667; } else { ServerAddress = Left(InServer, i); ServerPort = Int(Mid(InServer, i+1)); } ResetBuffer(); ServerIpAddr.Port = ServerPort; SetTimer(20, False); SystemPage.SystemText( ConnectingToText@ServerAddress ); Resolve( ServerAddress ); } function string ChopLeft(string Text) { while(Text != "" && InStr(": !", Left(Text, 1)) != -1) Text = Mid(Text, 1); return Text; } function string RemoveNickPrefix(string Nick) { while(Nick != "" && InStr(":"$UserPrefixes, Left(Nick, 1)) != -1) //utpg: FIXME: use prefixes Nick = Mid(Nick, 1); return Nick; } function string Chop(string Text) { while(Text != "" && InStr(": !", Left(Text, 1)) != -1) Text = Mid(Text, 1); while(Text != "" && InStr(": !", Right(Text, 1)) != -1) Text = Left(Text, Len(Text)-1); return Text; } function Resolved( IpAddr Addr ) { // Set the address ServerIpAddr.Addr = Addr.Addr; // Handle failure. if( ServerIpAddr.Addr == 0 ) { if(SystemPage != None) { SystemPage.SystemText( InvalidAddressText ); SystemPage.Disconnect(); } return; } // Display success message. Log( "UBrowserIRCLink: Server is "$ServerAddress$":"$ServerIpAddr.Port ); // Bind the local port. if( BindPort() == 0 ) { if(SystemPage != None) { SystemPage.SystemText( ErrorBindingText ); SystemPage.Disconnect(); } return; } Open( ServerIpAddr ); } event Closed() { if(SystemPage != None) SystemPage.Disconnect(); } // Host resolution failue. function ResolveFailed() { if(SystemPage != None) { SystemPage.SystemText(ResolveFailedText); SystemPage.Disconnect(); } } event Timer() { if(SystemPage != None) { SystemPage.SystemText( TimeOutError ); SystemPage.Disconnect(); } return; } event Opened() { SetTimer(0, False); if(SystemPage != None) SystemPage.SystemText(ConnectedText); Enable('Tick'); GotoState('LoggingIn'); } function Tick(float DeltaTime) { local string Line; DoBufferQueueIO(); if(ReadBufferedLine(Line)) ProcessInput(Line); } function SendCommandText(string Text) { local int i, j; local string Cmd, Temp, Temp2; // Process fake commands like /MSG if(Left(Text, 4) ~= "MSG ") Text = "PRIVMSG "$Mid(Text, 4); if(Left(Text, 6) ~= "LEAVE ") Text = "PART "$Mid(Text, 6); // Add colons for commands: PRIVMSG, QUIT, KILL, KICK, NOTICE i = InStr(Text, " "); if(i != -1) { Cmd = Caps(Left(Text, i)); Text = Cmd$Mid(Text, i); switch(Cmd) { // CMD nick :message case "PRIVMSG": case "NOTICE": case "KILL": Temp = ChopLeft(Mid(Text, i+1)); i = InStr(Temp, " "); if(i != -1) Text = Cmd@Left(Temp, i)$" :"$ChopLeft(Mid(Temp, i+1)); break; // hack for CTCP case "CTCP": Temp = ChopLeft(Mid(Text, i+1)); i = InStr(Temp, " "); if(i != -1) Text = "PRIVMSG "$Left(Temp, i)$" :"$Chr(1)$ChopLeft(Mid(Temp, i+1))$Chr(1); break; // CMD #channel nick :message case "KICK": Temp = ChopLeft(Mid(Text, i+1)); i = InStr(Temp, " "); if(i != -1) { Temp2 = ChopLeft(Mid(Temp, i+1)); j = InStr(Temp2, " "); if(j != -1) Text = Cmd@Left(Temp, i)@Left(Temp2, j)$" :"$ChopLeft(Mid(Temp2, j+1)); } break; // CMD :message case "QUIT": Text = Cmd$" :"$ChopLeft(Mid(Text, i+1)); break; } } else Text = Caps(Text); SendBufferedData(Text$CRLF); } function SendChannelText(string Channel, string Text) { SendBufferedData("PRIVMSG "$Channel$" :"$Text$CRLF); } function SendChannelAction(string Channel, string Text) { SendBufferedData("PRIVMSG "$Channel$" :"$Chr(1)$"ACTION "$Text$Chr(1)$CRLF); } function ProcessInput(string Line) { // Respond to PING if(Left(Line, 5) == "PING ") SendBufferedData("PONG "$Mid(Line, 5)$CRLF); } state LoggingIn { function ProcessInput(string Line) { local string Temp, Temp2; local int i; Temp = ParseDelimited(Line, " ", 2); if(ParseDelimited(Line, " ", 1)== "ERROR") SystemPage.SystemText(ChopLeft(ParseDelimited(Line, ":", 2, True))); // Handle nick already in use on connect... if(Temp == "433") { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 3, True))); } //utpg: figure out CHANTYPES= and PREFIX= else if(Temp == "005") { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 3, True))); i = 3; Temp = ParseDelimited(Line, " ", i); while (Temp != "") { if (Left(Temp, 10) ~= "CHANTYPES=") { ChannelPrefixes = Mid(Temp, 10); SystemPage.SystemText("Supported CHANTYPES: "$ChannelPrefixes); // FIXME: DEBUG: remove before release } else if (Left(Temp, 7) ~= "PREFIX=") { //PREFIX=(ov)@+ or PREFIX=(ohv)@%+ Temp = Mid(Temp, 7); if (Left(Temp, 1) == "(") { Temp2 = Mid(Temp, (InStr(Temp, ")")+1)); // temp = ohv; temp2 = @%+ Temp = Mid(Temp, 1); while (Temp2 != "") { switch (Caps(Left(Temp, 1))) { case "O": UPop = Left(Temp2, 1); break; case "H": UPhalfop = Left(Temp2, 1); break; case "V": UPvoice = Left(Temp2, 1); break; } Temp = Mid(Temp, 1); Temp2 = Mid(Temp2, 1); } UserPrefixes = UPop$UPhalfop$UPvoice; SystemPage.SystemText("Used user PREFIX: "$UserPrefixes); // FIXME: DEBUG: remove before release } } i++; Temp = ParseDelimited(Line, " ", i); } } //utpg: figure out CHANTYPES= and PREFIX= -- end else if(Int(Temp) > 5) // on 005 we are really logged in { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 3, True))); GotoState('LoggedIn'); } else { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 3, True))); } Global.ProcessInput(Line); } function SendCommandText(string Text) { Global.SendCommandText(Text); if(ParseDelimited(Text, " ", 1) ~= "NICK") { SystemPage.ChangedNick(NickName, Chop(ParseDelimited(Text, " ", 2))); } } Begin: SendBufferedData("USER "$UserIdent$" localhost "$ServerAddress$" :"$FullName$CRLF); SendBufferedData("NICK "$NickName$CRLF); } state LoggedIn { function ProcessInput(string Line) { local string Temp, Temp2, Temp3; local bool bAddModifier; local int i; local string Command; Global.ProcessInput(Line); Command = ParseDelimited(Line, " ", 2); if(ParseDelimited(Line, " ", 1) == "ERROR") { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, ":", 2, True))); } else if(Command == "JOIN") { Temp = ParseDelimited(Line, ":!", 2); if(Temp ~= NickName) Temp = ""; SystemPage.JoinedChannel(Chop(ParseDelimited(Line, " ", 3)), Temp); } else if(Command == "PART") { Temp = ParseDelimited(Line, ":!", 2); if(Temp ~= NickName) Temp = ""; SystemPage.PartedChannel(Chop(ParseDelimited(Line, " ", 3)), Temp); } else if(Command == "NICK") { SystemPage.ChangedNick(ParseDelimited(Line, ":!", 2), Chop(ParseDelimited(Line, " ", 3))); } else if(Command == "QUIT") { SystemPage.UserQuit(ParseDelimited(Line, ":!", 2), ChopLeft(ParseDelimited(Line, " ", 3, True))); } else if(Command == "353") // NAMES { Temp2 = ParseDelimited(Line, "#", 2); Temp2 = ParseDelimited(Temp2, " :", 1); Temp = ParseDelimited(Line, ":", 3, True); while(Temp != "") { // Nickname Temp3 = ParseDelimited(Temp, " ", 1); SystemPage.UserInChannel("#"$Temp2, RemoveNickPrefix(Temp3)); if(Left(Temp3, 1) == UPop) SystemPage.ChangeOp("#"$Temp2, RemoveNickPrefix(Temp3), True); else if(Left(Temp3, 1) == UPvoice) SystemPage.ChangeVoice("#"$Temp2, RemoveNickPrefix(Temp3), True); //utpg: halfop support else if(Left(Temp3, 1) == UPhalfop) SystemPage.ChangeHalfop("#"$Temp2, RemoveNickPrefix(Temp3), True); //utpg: halfop support -- end //utpg: FIXME: use prefix + add halfop support Temp = ParseDelimited(Temp, " ", 2, True); } } else if(Command == "333") // Channel formed info { } else if(Command == "366") // End of NAMES { } else if(Command == "331") // RPL_NOTOPIC { } else if(Command == "332") // RPL_TOPIC { } else if(Command == "341") // RPL_INVITING { } else if(Command == "301") // RPL_AWAY { SystemPage.IsAway(Chop(ParseDelimited(Line, " ", 4)), ChopLeft(ParseDelimited(Line, ":", 3, True))); } else if(Command == "NOTICE") { Temp = ParseDelimited(Line, ": ", 2); Temp2 = ParseDelimited(Line, ":! ", 2); if(InStr(Temp, "!") != -1 && InStr(Temp2, ".") == -1) { // it's a Nick. Temp = ChopLeft(ParseDelimited(Line, " ", 4, True)); if(Asc(Left(Temp, 1)) == 1 && Asc(Right(Temp, 1)) == 1) SystemPage.CTCP("", Temp2, Mid(Temp, 1, Len(Temp) - 2)); else SystemPage.UserNotice(Temp2, Temp); } else SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 4, True))); } else if(Int(Command)!= 0) { SystemPage.SystemText(ChopLeft(ParseDelimited(Line, " ", 4, True))); } else if(Command == "MODE") { // channel mode Temp = Chop(ParseDelimited(Line, " ", 4)); // channel Temp3 = Chop(ParseDelimited(Line, " ", 3)); i = 5; bAddModifier = True; while(Temp != "") { Temp2 = Left(Temp, 1); if(Temp2 == "+") bAddModifier = True; if(Temp2 == "-") bAddModifier = False; if(Temp2 == UPop) { SystemPage.ChangeOp(Temp3, Chop(ParseDelimited(Line, " ", i)), bAddModifier); i++; } if(Temp2 == UPvoice) { SystemPage.ChangeVoice(Temp3, Chop(ParseDelimited(Line, " ", i)), bAddModifier); i++; } //utpg: halfop support if(Temp2 == UPhalfop) { SystemPage.ChangeHalfOp(Temp3, Chop(ParseDelimited(Line, " ", i)), bAddModifier); i++; } //utpg: halfop support -- end Temp = Mid(Temp, 1); } SystemPage.ChangeMode(Temp3, ParseDelimited(Line, ":!", 2), ChopLeft(ParseDelimited(Line, " ", 4, True))); } else if(Command == "KICK") { // FIXME: handle multiple kicks in a single message SystemPage.KickUser(Chop(ParseDelimited(Line, " ", 3)), Chop(ParseDelimited(Line, " ", 4)), ParseDelimited(Line, ":!", 2), ChopLeft(ParseDelimited(Line, ":", 3, True))); } else if(Command == "INVITE") { SystemPage.SystemText(ParseDelimited(Line, ":!", 2)@InviteString@ParseDelimited(Line, ":", 3)); } else if(Command == "PRIVMSG") { Temp = Chop(ParseDelimited(Line, " ", 3)); Temp2 = ChopLeft(ParseDelimited(Line, " ", 4, True)); if(Mid(Temp2, 1, 7) == "ACTION " && Asc(Left(Temp2, 1))==1 && Asc(Right(Temp2, 1))==1) { Temp2 = Mid(Temp2, 8); Temp2 = Left(Temp2, Len(Temp2) - 1); if(Temp != "" && InStr("&#@", Left(Temp, 1)) != -1) //utpg: FIXME: use prefix SystemPage.ChannelAction(Temp, ParseDelimited(Line, ":!", 2), Temp2); else SystemPage.PrivateAction(ParseDelimited(Line, ":!", 2), Temp2); } else if(Asc(Left(Temp2, 1))==1 && Asc(Right(Temp2, 1))==1) { Temp2 = Mid(Temp2, 1, Len(Temp2) - 2); switch(Temp2) { case "VERSION": SendBufferedData("NOTICE "$ParseDelimited(Line, ":!", 2)$" :"$Chr(1)$"VERSION "$VersionString$Level.EngineVersion$Chr(1)$CRLF); SystemPage.CTCP(Temp, ParseDelimited(Line, ":!", 2), Temp2); break; default: SystemPage.CTCP(Temp, ParseDelimited(Line, ":!", 2), Temp2); break; } } else { if(Temp != "" && InStr("&#@", Left(Temp, 1)) != -1) SystemPage.ChannelText(Temp, ParseDelimited(Line, ":!", 2), Temp2); else SystemPage.PrivateText(ParseDelimited(Line, ":!", 2), Temp2); } } } Begin: JoinChannel(DefaultChannel); } function JoinChannel(string Channel) { if(Left(Channel, 1) == "#") SendBufferedData("JOIN "$Channel$CRLF); } function PartChannel(string Channel) { if(Left(Channel, 1) == "#") SendBufferedData("PART "$Channel$CRLF); } function SetNick(string NewNick) { SendBufferedData("NICK "$NewNick$CRLF); } function SetAway(string AwayText) { SendBufferedData("AWAY :"$AwayText$CRLF); } function DestroyLink() { SystemPage = None; if(IsConnected()) { SendText("QUIT :"$DisconnectReason$CRLF); Close(); } else Destroy(); } z²ZÅ9²A.b|�Žî zæL D3æÀ@ALCmC zâBJAÐS!-ç^Dêå(^%oêáM.ž DhrM* YMA‰rY* O YJô% (óR D¬¯Ž?’o^ÀÈI?’O &?R ÚDÈéh%~&@.Y–Q‚°?~¯¯®ÀŽÀ?’o^ w@*.³?hÈéKÉ Ü%K+¶J@?’~o@@ &K+¶J@?’~o@T  ÿÿ~D®?~À¥h@.@–> zbg 5[\HV&g FwV*V-X-\ ¼ CV zÇHycŠ.-K 'u!-\basic\\secure\ @& zG€zzM€zzëIF\ÁmçUBrowserGSpyLink: Failed to resolve master server address, aborting.K (poFq!! zÍJ{W‚ zÝN/M¬hf�-K çUBrowserGSpyLink: Couldn't connect to master server.K (pgFq!! zC ze;§ýe ZuP ž Œ0D !© s–C BÈBÈB'ð ­H P ž Œ0D !© t–C BÈBÈB'ð íI.^P ž  h:Äe ð ÿÿC e zo  384zÈZL *Þ&È-L $-L }r zúO~_4…6µ_6µ~eš6µ_%çUBrowserGSpyLink: Invalid master server address, aborting. çpppUBrowserGSpyLink: Master Server is F:S6Õ_ìšR%çUBrowserGSpyLink: Error binding local port, aborting. [_a?D ( z[P6.+[ zUQ"CUM6Õ_J HzFFppmasterSC.gamespy.comSF zÛCR|R]Šiž !ri* [.!imíluN K [ªN [¯K [" zl€zzJ//============================================================================= // UBrowserInfoClientWindow - extra info on a specific server //============================================================================= class UBrowserInfoClientWindow extends UWindowClientWindow; var UBrowserServerList Server; var UWindowVSplitter VSplitter; var UWindowHSplitter HSplitter; var float PrevSplitPos; function Created() { Super.Created(); VSplitter = UWindowVSplitter(CreateWindow(class'UWindowVSplitter', 0, 0, WinWidth, WinHeight)); HSplitter = UWindowHSplitter(VSplitter.CreateWindow(class'UWindowHSplitter', 0, 0, WinWidth, WinHeight)); VSplitter.TopClientWindow = UBrowserPlayerGrid(VSplitter.CreateWindow(class'UBrowserPlayerGrid', 0, 0, WinWidth, WinHeight)); VSplitter.BottomClientWindow = HSplitter; HSplitter.LeftClientWindow = UBrowserRulesGrid(HSplitter.CreateWindow(class'UBrowserRulesGrid', 0, 0, WinWidth, WinHeight)); HSplitter.RightClientWindow = UBrowserScreenshotCW(HSplitter.CreateWindow(class'UBrowserScreenshotCW', 0, 0, WinWidth, WinHeight)); } function Resized() { VSplitter.SetSize(WinWidth, WinHeight); VSplitter.OldWinHeight = VSplitter.WinHeight; VSplitter.SplitPos = WinHeight / 2; PrevSplitPos = VSplitter.SplitPos; HSplitter.WinWidth = WinWidth; HSplitter.OldWinWidth = WinWidth; HSplitter.SplitPos = WinWidth - VSplitter.SplitPos; } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); if(VSplitter.SplitPos != PrevSplitPos) { PrevSplitPos = VSplitter.SplitPos; HSplitter.SplitPos = HSplitter.WinWidth - (VSplitter.WinHeight - VSplitter.SplitPos); } } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); if(VSplitter.SplitPos != PrevSplitPos) { PrevSplitPos = VSplitter.SplitPos; HSplitter.SplitPos = HSplitter.WinWidth - (VSplitter.WinHeight - VSplitter.SplitPos); } } zxhaJ¢ Sh.–Qwh*h-r'h.h– zÃXnv!à zF K"" u-Ùr:*F  zuclass UBrowserIRCSystemMenu expands UWindowRightClickMenu; var UWindowPulldownMenuItem Connect; var UWindowPulldownMenuItem Disconnect; var UWindowPulldownMenuItem Join; var localized string ConnectText; var localized string DisconnectText; var localized string JoinText; function Created() { Super.Created(); Connect = AddMenuItem(ConnectText, None); Disconnect = AddMenuItem(DisconnectText, None); AddMenuItem("-", None); Join = AddMenuItem(JoinText, None); Join.CreateSubMenu(class'UBrowserIRCJoinMenu', OwnerWindow); } function ExecuteItem(UWindowPulldownMenuItem I) { local UBrowserIRCSystemPage S; S = UBrowserIRCSystemPage(OwnerWindow); switch(I) { case Connect: S.SetupClient.DoJoin(); break; case Disconnect: S.Disconnect(); break; } Super.ExecuteItem(I); } function ShowWindow() { local UBrowserIRCSystemPage S; S = UBrowserIRCSystemPage(OwnerWindow); Super.ShowWindow(); Connect.bDisabled = S.bConnected; Disconnect.bDisabled = !S.bConnected; Join.bDisabled = !S.bConnected; } z] 4zÞQ@n`o<.ž DA>@É zÑjA${Ñ}r zÜY\oe  z€zz^ 3z_ 2zK 1nÓZTwtD"B"s"r"q*d€c*d€ÿ~"ïa>~¢‚z]¸@zÝjFj;�…yrøv6ãFî$6êFî$6ìFî$€×F| S k ¯i ?& ì6ãFî=,ÿ6êFî=,ÿ6ìFî=,ÿFô% (ó. v-X~DT'. v-W~FTL. v-x~ET~¶F| S p~. vM zìd.=|¬�Ž z²| Á”²|.¡© ¡�Ž|^'|-Ì'}.|8l ¿}?| zÎbN$KÎv! zÖmnx‹“ $p$n zegV,+v@t%u+|ppvtu&#gAeI ^[ `e ZZ~^:­šZÿÿÿÿB^u ÕB€^ZuJ^’Z&M6Õbua A(¨PBSB ze€z zlGCÕÒ'qB„zG zGHpppp[f : z ]opppppp[f :G z ] zOn &0‡be. ¼–^we*BzeMn ee. e–* zx5class UBrowserHTTPClient extends UBrowserBufferedTcpLink; var IpAddr ServerIpAddr; var string ServerAddress; var string ServerURI; var int ServerPort; var int CurrentState; var int ErrorCode; var bool bClosed; var globalconfig string ProxyServerAddress; var globalconfig int ProxyServerPort; const Connecting = 0; const WaitingForHeader = 1; const ReceivingHeader = 2; const ReceivingData = 3; const HadError = 4; function PostBeginPlay() { Super.PostBeginPlay(); ServerIpAddr.Addr = 0; Disable('Tick'); } function Browse(string InAddress, string InURI, optional int InPort, optional int InTimeout) { CurrentState = Connecting; ServerAddress = InAddress; ServerURI = InURI; if(InPort == 0) ServerPort = 80; else ServerPort = InPort; if(InTimeout > 0 ) SetTimer(InTimeout, False); ResetBuffer(); if(ProxyServerAddress != "") { ServerIpAddr.Port = ProxyServerPort; if(ServerIpAddr.Addr == 0) Resolve( ProxyServerAddress ); else DoBind(); } else { ServerIpAddr.Port = ServerPort; if(ServerIpAddr.Addr == 0) Resolve( ServerAddress ); else DoBind(); } } function Resolved( IpAddr Addr ) { // Set the address ServerIpAddr.Addr = Addr.Addr; if( ServerIpAddr.Addr == 0 ) { Log( "UBrowserHTTPClient: Invalid server address" ); SetError(-1); return; } DoBind(); } function DoBind() { if( BindPort() == 0 ) { Log( "UBrowserHTTPLink: Error binding local port." ); SetError(-2); return; } Open( ServerIpAddr ); bClosed = False; } event Timer() { SetError(-3); } event Opened() { Enable('Tick'); if(ProxyServerAddress != "") SendBufferedData("GET http://"$ServerAddress$":"$string(ServerPort)$ServerURI$" HTTP/1.1"$CR$LF); else SendBufferedData("GET "$ServerURI$" HTTP/1.1"$CR$LF); SendBufferedData("User-Agent: Unreal"$CR$LF); SendBufferedData("Connection: close"$CR$LF); SendBufferedData("Host: "$ServerAddress$":"$ServerPort$CR$LF$CR$LF); CurrentState = WaitingForHeader; } function SetError(int Code) { Disable('Tick'); SetTimer(0, False); ResetBuffer(); CurrentState = HadError; ErrorCode = Code; if(!IsConnected() || !Close()) HTTPError(ErrorCode); } event Closed() { bClosed = True; } function HTTPReceivedData(string Data) { } function HTTPError(int Code) { } event Tick(float DeltaTime) { local string Line; local bool bGotData; local int NextState; local int i; local int Result; Super.Tick(DeltaTime); DoBufferQueueIO(); do { NextState = CurrentState; switch(CurrentState) { case WaitingForHeader: bGotData = ReadBufferedLine(Line); if(bGotData) { i = InStr(Line, " "); Result = Int(Mid(Line, i+1)); if(Result != 200) { SetError(Result); return; } NextState = ReceivingHeader; } break; case ReceivingHeader: bGotData = ReadBufferedLine(Line); if(bGotData) { if(Line == "") NextState = ReceivingData; } break; case ReceivingData: bGotData = False; break; default: bGotData = False; break; } CurrentState = NextState; } until(!bGotData); if(bClosed) { Disable('Tick'); if(CurrentState == ReceivingData) HTTPReceivedData(InputBuffer); if(CurrentState == HadError) HTTPError(ErrorCode); } } zqr·ô%\ zvk†D mpmk zh¡class UBrowserIRCSystemPage expands UBrowserIRCPageBase; var UBrowserIRCLink Link; var UWindowPageControl PageParent; var string Server; var string DefaultChannel; var config string NickName; var config string FullName; var config string OldPlayerName; var config string UserIdent; var UWindowVSplitter Splitter; var UBrowserIRCSetupClient SetupClient; var bool bConnected; var bool bAway; var localized string NotInAChannelText; var localized string KickedFromText; var localized string ByText; var localized string IsAwayText; function Created() { Super.Created(); Splitter = UWindowVSplitter(CreateWindow(class'UWindowVSplitter', 0, 0, WinWidth, WinHeight)); SetupClient = UBrowserIRCSetupClient(Splitter.CreateWindow(class'UBrowserIRCSetupClient', 0, 0, WinWidth, WinHeight, Self)); TextArea.SetParent(Splitter); Splitter.TopClientWindow = SetupClient; Splitter.BottomClientWindow = TextArea; Splitter.SplitPos = 45; Splitter.MaxSplitPos = 45; Splitter.MinWinHeight = 0; Splitter.bSizable = True; Splitter.bBottomGrow = True; Setup(); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); Splitter.SetSize(WinWidth, WinHeight - EditControl.WinHeight); } function ProcessInput(string Text) { if(Left(Text, 1) != "/") SystemText("*** "$NotInAChannelText); else Link.SendCommandText(Mid(Text, 1)); } function UBrowserIRCChannelPage FindChannelWindow(string Channel) { local UWindowPageControlPage P; local UBrowserIRCChannelPage Chan; for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Chan = UBrowserIRCChannelPage(P.Page); if(Chan != None && (Chan.ChannelName ~= Channel)) return Chan; } return None; } function UBrowserIRCPrivPage FindPrivateWindow(string Nick) { local UWindowPageControlPage P; local UBrowserIRCPrivPage Priv; for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Priv = UBrowserIRCPrivPage(P.Page); if(Priv != None && (Priv.PrivNick ~= Nick)) return Priv; } return CreatePrivChannel(Nick); } function Connect() { local int i; if(Link != None) Disconnect(); if(GetPlayerOwner().PlayerReplicationInfo.PlayerName != OldPlayerName) { NickName = GetPlayerOwner().PlayerReplicationInfo.PlayerName; OldPlayerName = NickName; if(FullName == "") FullName = NickName; SaveConfig(); } if(UserIdent == "") { UserIdent = "u"; for(i=0;i<7;i++) UserIdent = UserIdent $ Chr((Rand(10)+48)); Log("Created new UserIdent: "$UserIdent); SaveConfig(); } Link = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserIRCLink'); Link.Connect(Self, Server, NickName, UserIdent, FullName, DefaultChannel); bConnected = True; } function JoinChannel(string ChannelName) { local UBrowserIRCChannelPage P; P = FindChannelWindow(ChannelName); if(P == None) Link.JoinChannel(ChannelName); else PageParent.GotoTab(P.OwnerTab, True); } function PartChannel(string ChannelName) { local UBrowserIRCChannelPage P; P = FindChannelWindow(ChannelName); if(P != None) Link.PartChannel(ChannelName); } function Disconnect() { local UWindowPageControlPage P, Next; if(Link != None) { // don't localize - sent to other clients Link.DisconnectReason = "Disconnected"; Link.DestroyLink(); } Link = None; P = PageParent.FirstPage(); while( P != None ) { Next = P.NextPage(); if(P.Page != Self) PageParent.DeletePage(P); P = Next; } SystemText( "Server disconnected" ); bConnected = False; } function NotifyQuitUnreal() { Super.NotifyQuitUnreal(); if(Link != None) { // don't localize - sent to other clients Link.DisconnectReason = "Exit Game"; Link.DestroyLink(); } } function SystemText(string Text) { // FIXME!! should do something better with this if(Text != "You have been marked as being away" && Text != "You are no longer marked as being away") TextArea.AddText(Text); } function ChannelText(string Channel, string Nick, string Text) { local UBrowserIRCChannelPage P; P = FindChannelWindow(Channel); if(P != None) P.ChannelText(Nick, Text); } function PrivateText(string Nick, string Text) { FindPrivateWindow(Nick).PrivateText(Nick, Text); } function UBrowserIRCPrivPage CreatePrivChannel(string Nick) { local UBrowserIRCPrivPage P; P = UBrowserIRCPrivPage(PageParent.AddPage(Nick, class'UBrowserIRCPrivPage').Page); P.SystemPage = Self; P.PrivNick = Nick; P.Setup(); return P; } function ChannelAction(string Channel, string Nick, string Text) { local UBrowserIRCChannelPage P; P = FindChannelWindow(Channel); if(P != None) P.ChannelAction(Nick, Text); } function PrivateAction(string Nick, string Text) { FindPrivateWindow(Nick).PrivateAction(Nick, Text); } function JoinedChannel(string Channel, optional string Nick) { local UBrowserIRCChannelPage P; local UBrowserIRCChannelPage W; local UWindowPageControlPage NewPage; if(Nick == "") { NewPage = PageParent.AddPage(Channel, class'UBrowserIRCChannelPage'); P = UBrowserIRCChannelPage(NewPage.Page); //utpg: user/channel prefix P.UserList.UPop = Link.UPop; P.UserList.UPvoice = Link.UPvoice; P.UserList.UPhalfop = Link.UPhalfop; //utpg: user/channel prefix -- end P.SystemPage = Self; P.ChannelName = Channel; P.Setup(); PageParent.GotoTab(NewPage, True); } if(Nick == "") Nick = NickName; W = FindChannelWindow(Channel); if(W != None) W.JoinedChannel(Nick); } function KickUser(string Channel, string KickedNick, string Kicker, string Reason) { local UWindowPageControlPage P; local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(KickedNick == NickName) { P = PageParent.GetPage(Channel); if(P != None) PageParent.DeletePage(P); SystemText("*** "$KickedFromText@Channel@ByText@Kicker$" ("$Reason$")"); } else { if(W != None) W.KickUser(KickedNick, Kicker, Reason); } } function UserInChannel(string Channel, string Nick) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.UserInChannel(Nick); } function PartedChannel(string Channel, optional string Nick) { local UWindowPageControlPage P; local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(Nick == "") { P = PageParent.GetPage(Channel); if(P != None) PageParent.DeletePage(P); } else { if(W != None) W.PartedChannel(Nick); } } function ChangedNick(string OldNick, string NewNick) { local UWindowPageControlPage P; local UBrowserIRCChannelPage Chan; local UBrowserIRCPrivPage Priv; if(OldNick == NickName) { NickName = NewNick; Link.NickName = NewNick; SaveConfig(); } for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Chan = UBrowserIRCChannelPage(P.Page); if(Chan != None && Chan.UserList.FindNick(OldNick) != None) Chan.ChangedNick(OldNick, NewNick); Priv = UBrowserIRCPrivPage(P.Page); if(Priv != None && Priv.PrivNick == OldNick) { P.Caption = NewNick; Priv.ChangedNick(OldNick, NewNick); } } } function UserQuit(string Nick, string Reason) { local UWindowPageControlPage P; local UBrowserIRCChannelPage Chan; local UBrowserIRCPrivPage Priv; for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Chan = UBrowserIRCChannelPage(P.Page); if(Chan != None && Chan.UserList.FindNick(Nick) != None) Chan.UserQuit(Nick, Reason); Priv = UBrowserIRCPrivPage(P.Page); if(Priv != None && Priv.PrivNick == Nick) Priv.UserQuit(Nick, Reason); } } function UserNotice(string Nick, string Text) { local UWindowPageControlPage P; local UBrowserIRCChannelPage Chan; local UBrowserIRCPrivPage Priv; for(P = PageParent.FirstPage(); P != None; P = P.NextPage()) { Chan = UBrowserIRCChannelPage(P.Page); if(Chan != None && Chan.UserList.FindNick(Nick) != None) Chan.UserNotice(Nick, Text); Priv = UBrowserIRCPrivPage(P.Page); if(Priv != None && Priv.PrivNick == Nick) Priv.UserNotice(Nick, Text); } } function ChangeMode(string Channel, string Nick, string Mode) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.ChangeMode(Nick, Mode); } function ChangeOp(string Channel, string Nick, bool bOp) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.ChangeOp(Nick, bOp); } //utpg: halfop support function ChangeHalfOp(string Channel, string Nick, bool bHalfOp) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.ChangeOp(Nick, bHalfOp); } //utpg: halfop support -- end function ChangeVoice(string Channel, string Nick, bool bVoice) { local UBrowserIRCChannelPage W; W = FindChannelWindow(Channel); if(W != None) W.ChangeVoice(Nick, bVoice); } function Tick(float Delta) { if(bConnected && GetPlayerOwner().PlayerReplicationInfo.PlayerName != OldPlayerName) { OldPlayerName = GetPlayerOwner().PlayerReplicationInfo.PlayerName; Link.SetNick(OldPlayerName); SystemText("SetNick: "$OldPlayerName); } Super.Tick(Delta); } function IsAway(string Nick, string Message) { local UBrowserIRCPrivPage W; W = FindPrivateWindow(Nick); if(W != None) W.IsAway(Nick, Message); else SystemText(Nick@IsAwayText$": "$Message); } function IRCVisible() { if(bAway) { if(bConnected) Link.SetAway(""); bAway = False; } } function IRCClosed() { CheckAway(); } function NotifyAfterLevelChange() { Super.NotifyAfterLevelChange(); CheckAway(); } function CheckAway() { local string URL; if( bConnected ) { bAway = True; URL = GetLevel().GetAddressURL(); if(InStr(URL, ":") > 0) Link.SetAway("unreal://"$URL); else if(!Root.bWindowVisible) Link.SetAway("local game"); else Link.SetAway("in menus"); } } function CTCP(string Channel, string Nick, string Message) { if(Channel == "" || Channel == NickName) SystemText("["$Nick$": "$Message$"]"); else SystemText("["$Nick$":"$Channel$" "$Message$"]"); } zv€zzæväpæÀ@AWv.* 4©.ž E ÈBÈBv+ zÓps" <Ó-s:‚wv*v-Îv[ zölu¼.&ö\ zqW)…epm–CbkðAtjÈB|iHBXb zsmT3¢Q >pQ#¶mdaP=ÿ wbQ%¶mdaSDP&ÿ ®tQ#¶mdaPlÿ ü|Q:¶mdappSPc/SPkÿ ÿÿ z_ [_  zybFxF mv~$ì, "švÿÿÿÿ(b€$vTz$’v&&ì, ¥v$$’v&' zzzw€zz|xGo³z$%í€$& zâtUAMâ9Uô% (ór.ž Srr*Y%hYr‰-ç`Dêå�`%WêáI D¬¯Ž?’W`ÀÈI?’Y&?I ÚDÈél%r.r–7wr*H€?7‚°H¯¯®ÀŽÀ?’W` wr*³?lÈéÛrr8F=×U®¯H?&?WF�®À?& `TU@®H?WFrH®HÀ¥lr.r–4 zM €zzC{}c¸4z$%M í€$&$$&M  z~€zzr€zzJ€@zzgMÊ@8‚{›~: !€&ÿÿÿÿ& zÒm  ê6Òm  u * -*b  @ * zQW9Ž#8yW6wy*y9X-Y zT BB×ÂJE&R%º–R}BHBR&�›~cHÿÿÿÿ…šEG -apJBR…J¥E°°™EG JpJH¥RJ z€zzÞzH n€{ Y!rXH -L�-L)-L(XH .ž A zÄA} ;¬b} 8m .|¢DsU Rb |U ÿÿÄ}  zûE_ލ Qd.ž ¤‚š:dh:$ r8*8.d–…„r8*8-T8*¤.ž  f8Oš:dh:$=³?J  w8pÿwp*p_p8=‚w8*�8-T8 B(''®_ zûB\•Š#„w‚-u {±ÄÆkk±ÄÆ( ZkpSetNick: kû\ z€zzÜG^o±mfP^Uw8fJwf*.ž  ffkwf*8f z€@zzÍ`{†B w*, zÛJ]|ÂQ}í_KD B vªD v¯B v:P]vPv" znR5|k!8[R6w[*[5S-T z€@zzW uQ] í‚Ur"BQ9Q_*H .BcQA.^%B@H  zÒw ßSÒQ  H *Q J e.³Kw ~ * zÄQV ;Ý6V &w.³`) ÿÿÄV  zMQPÏg‘f.ž �wf*o%f.f–�wf*jšoQff.f–¥oJ* z€@zzo€zzmz[�8‚{z›~: !€z&ÿÿÿÿzz&y‚{z›~: !êz&ÿÿÿÿz€z“}z&8z zñBIŽû 7ñI6hll Œ&-nFU‰-n@ ~U LJU’@ &�›L,È[L h,á Ã,-nFUÀ-nÀzUh,á Ó,-n(á ÿÿ-n(álh�-n5-vv!šl,m$5šl,|{ zSY<åð•_.ž �w_*@%_._–�w_*jr_8@_._–¥@Jÿÿÿÿ z@€zzhHX*ëK-r'HtHr®ÖùPS[2 zQQEe ó{?Lñw{*R.{¿‚‚wR*!wRW &Q*REQc W.{¿Ù‚wW*zWUQWEQc {{O zXteøa¯­‚wt*›tF%±UVppppunreal://t9:StF.ž U $(ž Œ å7 z²wjfã²D.! © ! A B›C*CD+X.¡© ¡�ŽX^'w XÛL ’dX8aw v X8h f| ^ÛJ ’q X8f| J Ûc ’j%o–j,2[þjN!zoDX8J jN£|WjNwkDO.D¿âO-O X lD{Oo DoOo TD4odServerListTitlesWjNUBrowserjJO¥j7á–j,2]%±Ác]\^á‚{\ –j,2J Û\ ’³wJ *jN!zDX 8J O.D¿RO-O X lD‡{Oo DoOo ›D o^jJO¥j¥]±Ác]\^¦ zý\FEì/QPF"w8Q eQ z€zzúVD_f Ö6µb6µDUš6µb%Sw* _, çpppUBrowserIRCLink: Server is B:S6ÕbÉšR%Çw* ], [b zþ^bd Š @ z€z�zÍa@ k϶@ ,t´ M,&oû“<&%“Y&È ~?<´ …,(oû’<&%“Y&È ~?<´ ™, E<´ ÿÿÍ@ \C´ zßR"s1ßwñ¨~ .³Q z]zz]pff 64wk*eXÏX Zk' zc]J(ÑrX p`]X 9bV]X RtX]X k|]]X ÿÿ% ziE- J-r'HEt%r®ÖùVSU2 z$ME>$m-r(Vpì, ì, 5ì, Dì,  z€zzg V;�rs*ÿÿÿÿ@° &s&nÿÿÿÿrk± &s&n&rn%ˆ-Ln�nn zÄY ;r/.³NY ñÄY  zr"class UBrowserOpenCW expands UWindowDialogClientWindow; var UWindowComboControl OpenCombo; var localized string OpenText; var localized string OpenHelp; var config string OpenHistory[10]; function Created() { local float EditWidth; local int i; local Color TC; Super.Created(); EditWidth = WinWidth - 140; OpenCombo = UWindowComboControl(CreateControl(class'UWindowComboControl', 20, 20, EditWidth, 1)); OpenCombo.SetText(OpenText); OpenCombo.SetHelpText(OpenHelp); OpenCombo.SetFont(F_Normal); OpenCombo.SetEditable(True); for (i=0; i<10; i++) if (OpenHistory[i] != "") OpenCombo.AddItem(OpenHistory[i]); } function BeforePaint(Canvas C, float X, float Y) { local float EditWidth; local float XL, YL; C.Font = Root.Fonts[OpenCombo.Font]; TextSize(C, OpenCombo.Text, XL, YL); EditWidth = WinWidth - 50; OpenCombo.WinLeft = (WinWidth - EditWidth) / 2; OpenCombo.WinTop = (WinHeight-OpenCombo.WinHeight) / 2; OpenCombo.SetSize(EditWidth, OpenCombo.WinHeight); OpenCombo.EditBoxWidth = OpenCombo.WinWidth - XL - 20; Super.BeforePaint(C, X, Y); } function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); if((C == OpenCombo && E == DE_EnterPressed) || (C == UBrowserOpenWindow(ParentWindow).OKButton && E == DE_Click)) OpenURL(); } function OpenURL() { local int i; local bool HistoryItem; local UWindowComboListItem Item; local string URL; URL = OpenCombo.GetValue(); if(URL == "") { OpenCombo.BringToFront(); return; } for (i=0; i<10; i++) { if (OpenHistory[i] ~= URL) OpenCombo.RemoveItem(i); // HistoryItem = True; } if (!HistoryItem) { OpenCombo.InsertItem(URL); while(OpenCombo.List.Items.Count() > 10) OpenCombo.List.Items.Last.Remove(); Item = UWindowComboListItem(OpenCombo.List.Items.Next); for (i=0; i<10; i++) { if(Item != None) { OpenHistory[i] = Item.Value; Item = UWindowComboListItem(Item.Next); } else OpenHistory[i] = ""; } } SaveConfig(); OpenCombo.ClearValue(); GetParent(class'UWindowFramedWindow').Close(); UBrowserMainWindow(ParentWindow.OwnerWindow).OpenURL(URL); } zn€zzZclass UBrowserOpenWindow expands UWindowFramedWindow; var UWindowSmallCloseButton CloseButton; var UWindowSmallButton OKButton; var localized string OKText; function Created() { Super.Created(); OKButton = UWindowSmallButton(CreateWindow(class'UWindowSmallButton', WinWidth-108, WinHeight-24, 48, 16)); CloseButton = UWindowSmallCloseButton(CreateWindow(class'UWindowSmallCloseButton', WinWidth-56, WinHeight-24, 48, 16)); OKButton.Register(UBrowserOpenCW(ClientArea)); OKButton.SetText(OKText); SetSizePos(); } function ResolutionChanged(float W, float H) { Super.ResolutionChanged(W, H); SetSizePos(); } function SetSizePos() { SetSize(300, 90); WinLeft = Int((Root.WinWidth - WinWidth) / 2); WinTop = Int((Root.WinHeight - WinHeight) / 2); } function Resized() { Super.Resized(); ClientArea.SetSize(ClientArea.WinWidth, ClientArea.WinHeight-24); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); OKButton.WinLeft = ClientArea.WinLeft+ClientArea.WinWidth-104; OKButton.WinTop = ClientArea.WinTop+ClientArea.WinHeight+4; CloseButton.WinLeft = ClientArea.WinLeft+ClientArea.WinWidth-52; CloseButton.WinTop = ClientArea.WinTop+ClientArea.WinHeight+4; } function Paint(Canvas C, float X, float Y) { local Texture T; T = GetLookAndFeelTexture(); DrawUpBevel( C, ClientArea.WinLeft, ClientArea.WinTop + ClientArea.WinHeight, ClientArea.WinWidth, 24, T); Super.Paint(C, X, Y); } zkv`\ºÊrb*ÿÿÿÿ,´v&?'&K´b&?'ÿÿÿÿzsv=b=iÿÿÿÿ¬¥tv=b=i&¬i%Â-Li�ii z|R\9(S9 %zÿÿÿÿÿÿÿÿÿÿzÝv/86[1c–szçpppPing Timeout from 9. Attempt Ss¥sqLYçppPing Timeout from 9 Giving Up&<FF%PlR_Nc%k%v!c-O-c(-N zi€zzB@[nGNv!a(Ml,{@L„�i �|{ zpJXxXèrX*ÿÿÿÿ,´J&?'&K´X&?'ÿÿÿÿzsJlXldÿÿÿÿÊ¥tJlXld&ÊdD¯J&X&à-Ld�dd zñ{y3Ô5 A y zu?//============================================================================= // UBrowserPlayerGrid //============================================================================= class UBrowserPlayerGrid extends UWindowGrid; var localized string NameText; var localized string FragsText; var localized string PingText; var localized string TeamText; var localized string MeshText; var localized string SkinText; var localized string FaceText; var localized string IDText; var localized string ngSecretText; var localized string EnabledText; var localized string DisabledText; var localized string BotText; var int ngSecretWidth; var UWindowGridColumn ngSecretColumn; function Created() { Super.Created(); RowHeight = 12; AddColumn(NameText, 60); AddColumn(FragsText, 30); AddColumn(PingText, 30); AddColumn(TeamText, 30); AddColumn(MeshText, 80); AddColumn(SkinText, 80); AddColumn(FaceText, 60); AddColumn(IDText, 30); ngSecretColumn = AddColumn(ngSecretText, 100); ngSecretWidth = 100; } function PaintColumn(Canvas C, UWindowGridColumn Column, float MouseX, float MouseY) { local UBrowserServerList Server; local UBrowserPlayerList PlayerList, l; local int Visible; local int Count; local int Skipped; local int Y; local int TopMargin; local int BottomMargin; if(bShowHorizSB) BottomMargin = LookAndFeel.Size_ScrollbarWidth; else BottomMargin = 0; TopMargin = LookAndFeel.ColumnHeadingHeight; Server = UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server; if(Server == None) return; PlayerList = Server.PlayerList; if(PlayerList == None) return; Count = PlayerList.Count(); if( Server.GameVer >= 406 ) { if( ngSecretColumn.WinWidth <= 1 ) { ngSecretColumn.ShowWindow(); ngSecretColumn.WinWidth = ngSecretWidth; } } else { if( ngSecretColumn.WinWidth > 1 ) { ngSecretWidth = ngSecretColumn.WinWidth; ngSecretColumn.WinWidth = 0; ngSecretColumn.HideWindow(); } } C.Font = Root.Fonts[F_Normal]; Visible = int((WinHeight - (TopMargin + BottomMargin))/RowHeight); VertSB.SetRange(0, Count+1, Visible); TopRow = VertSB.Pos; Skipped = 0; Y = 1; l = UBrowserPlayerList(PlayerList.Next); while((Y < RowHeight + WinHeight - RowHeight - (TopMargin + BottomMargin)) && (l != None)) { if(Skipped >= VertSB.Pos) { switch(Column.ColumnNum) { case 0: Column.ClipText( C, 2, Y + TopMargin, l.PlayerName ); break; case 1: Column.ClipText( C, 2, Y + TopMargin, l.PlayerFrags ); break; case 2: Column.ClipText( C, 2, Y + TopMargin, l.PlayerPing); break; case 3: Column.ClipText( C, 2, Y + TopMargin, l.PlayerTeam ); break; case 4: Column.ClipText( C, 2, Y + TopMargin, l.PlayerMesh ); break; case 5: Column.ClipText( C, 2, Y + TopMargin, l.PlayerSkin ); break; case 6: Column.ClipText( C, 2, Y + TopMargin, l.PlayerFace ); break; case 7: Column.ClipText( C, 2, Y + TopMargin, l.PlayerID ); break; case 8: if( l.PlayerStats ~= "bot" ) Column.ClipText( C, 2, Y + TopMargin, BotText ); else if( l.PlayerStats ~= "true" ) Column.ClipText( C, 2, Y + TopMargin, EnabledText ); else Column.ClipText( C, 2, Y + TopMargin, DisabledText ); break; } Y = Y + RowHeight; } Skipped ++; l = UBrowserPlayerList(l.Next); } } function RightClickRow(int Row, float X, float Y) { local UBrowserInfoMenu Menu; local float MenuX, MenuY; local UWindowWindow W; W = GetParent(class'UBrowserInfoWindow'); if(W == None) return; Menu = UBrowserInfoWindow(W).Menu; WindowToGlobal(X, Y, MenuX, MenuY); Menu.WinLeft = MenuX; Menu.WinTop = MenuY; Menu.ShowWindow(); } function SortColumn(UWindowGridColumn Column) { UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server.PlayerList.SortByColumn(Column.ColumnNum); } function SelectRow(int Row) { } zd€zzo€zŸzuc]•!BrD*ÿÿÿÿ,´c&?'&K´D&?'ÿÿÿÿz—ccDcWÿÿÿÿ$¥–ccDcW&$Ô—ckDkWÿÿÿÿ$ÿ–ckDkW&$WD¯c&D&:-LW�WW zØyxéE.šTy7{9€~: 1a «¯ÖùB ÖÃ&?úD¯¯«?èa «?A ?, ,Î�-B=9F%PRl_Nc%k%C%]% ohostnameÄ‚{�-B= ohostport{FJ omapname:{P omaptitleî{RlRî„„zR|RUntitled-YlP ogametype){_ onumplayersg{cJ omaxplayers¥{kJ ogamemodeà{N ogamever{CJ ominnetverX{]J˜ Foc-O-c'-Nv! zDr[SU8Pu!hz\info\B Öùa®?t Ã( %zÿÿÿÿÿÿÿÿÿÿ@zW€zzi €@zzzAe¼##!.ž  eA zõDX°&×X�Ž ä zÁ–#.ž  zAiÆ $?J  zBzËF$.ž z zko Ü*-Oi ~o pp\j \[o ’’i }j ,€[~[\ zÓ^ YhÓ^.© HBðAúC–C^-h '^ýUnreal Browser. zÇE.LŠÇ^#¬?ùôD¯�?, ¯Ž?,^ª?D¬¯�^�?,^¯?D¬¯Ž^Ž?, zÝh/´‹)™W–szçpTimed out getting player replies. Attempt Ss¥sqL—b(çTimed out getting player replies. Giving Up z²n p3nhttp://www.unreal.com ÷ nÓZVwtD"B"@s"r"@q*dF<9~"�X›±~¢‚zDt@€§101U5ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÇ1111111111111111111111111111111111111111111111111111111111111111111111111134688888888888888888888888888888888888888888888885R30Çf¡CY]RX]I¡vjmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrv��������������������������������������������������������������������������������������������������������������������������������������������������������Š‹‹‹‹–G]XR]YA§‹Afƒ}urX» ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ"^vu}�fC‹¡C^}–**xî×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×$ {^C¡¾F^}"ÞØãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØõ}^D¾¾F^�"ØØØØØØØØØØØØØØØØØØØØØØ××ãÛò"mYG@61ÇÇÇÇ26@FYu'òØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×Ø÷ôëãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØõ�^F¾ºGc"ØØØØØØØØØØØØØØØØØØØ×××â°�V4ÅÇ32Å0GÞØØØØØØØØØØØØØØØØØØØØØØØØØØêï…VCT"ãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØõcGºº\j|×ØØØØØØØØØØØØØØØØØØ×ÐÌ¥G17Fbp‹ššŠvfVGA954313Aƒ×ØØØØØØØØØØØØØØØØØØØØØØØØ×ïL0D"ãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØîÛØÖÖØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØòzj\º±¹¯ãØØØØØØØØØØØØØØØØØØØ×Û­uVxÿã×××ãÛã××Þ̬¶¡v^IF¡³Í×ØØØØØØØØØØØØØØØØØØØØØØØØ×'f<È{ÛØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØâkDD[öïÖØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØé¯¹±­¡½îØØØØØØØØØØØØØØØØØ××Þõ" ÞØØØØØØØØØØØØ×××ãî§{j´ÎÍãØØØØØØØØØØØØØØØØØØØØØØØÞk15šù×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×$6Ç6SïØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØâ½¡®¯6f ØØØØØØØØØØØØØØØØØØ×ØØØØØØØØØØØØØØØØØØØØØØã­¯Ã§ÁvqâØØØØØØØØØãØØØØØØØØØØØ%@/5¡³ÞØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×ØØØØØØØØØØØØØØØØØØØØðlA50ÉBæØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãÆX–¯Æf ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××ãåÃ^=0;$ØØØØØØØ*jÞØØØØØØØØ×^2š²×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××ØØØØØØØØØØØØØØØØØØØØØØØØØØØ×ØØØØØ×ØØÞÛâØØØØØØØØØØØØØØØØØØØØØpJ2.1`ïØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãÆX–®Æf ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×÷}AF5Gý×××åF=ŽÕØØãØØØØØKÆ8cÍÃ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÖï "îØØØ ØØØØØØØØØØØØØØØØØØõ 'xkîØ×)ok^F;COj&××ØØØØØØØØØØØØØØØØÞzG=9Ä?êØØØØØØØØææØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØâÆX–±Æf ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ× KDWAÆwʸ66¸××xo ×רKÇFG§ÊÞØØØØØØØØØØØØØØØû òØØØØØØØØØØØØØØØØØØØØØØ %OGl ×רxÅx×ØØØØØØØØØØØØÞ"sK=42pÛò$_Yhc_WD5Æ4FqØ×ØØØØØØØØØØØØØØåjGG9/: æØØØ×Ø(æØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÞÆX¡´Æf ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ{CDOG5A27¾¤ôãä"Å2A_KÇGRM´¤ØØØØØØØØØØØØå$WAIm'ãØ×ØØØØØØØØØØØØØØØØØòW30Q¿óØäÞW41ðØØØØØØØØØØòm@Ç@u­Ù îÙâììó¶‡W93I'ØØØØØØØØØØØØØØ×)fDG;.7ïרûI=tïØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÞÆX¡´Æf ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÛqQ=AG]=0DÁ¶ÓØ×Õ¸GÅDZGb°¹ ØØØØØØØØØØñ\30U¿ÚäãjÛØØØØØØØØØØØØØãA9Šÿßר÷I1=%ØØØØØØØ×ã"G2‡¿¹üØØØØØØØØØØü~šY1ÆOõØØØØØØØØØØØØØýŠY@JA.3ˆÿV1@"×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÞÆX¡´Æf ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ|J2IA=D=š³¾üÓØØØã¼f=0ÇDUVFp±ÃÛØØØØØØØ× %VG¾®ÐÙè¯Q06ñØØØØØØØØØØØ jFÅK¸­ßØØ@Zš âØØØØØÿkV1Ç6@DG^]m·¾ØØØØØØØØØØØ³f;A80kØØØØØØØØØØØØ×"‡@@GO;1ÆÇjýÞØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×ÅX¡´Åf ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ"FÇIcjFK³¿¸ßÓØØØãÊ–j;DZ§‡C‡¬ãØØØØØØñc5ÅW­­¬€ÌyÆGã×ØØØØØØØØ÷f3ÆW·¬ÍâÿÇÇGj½¿åØØ×îu;Ç^ƒ‡uW]Á½AÃ¾ÃØØØØØØØØØØØØìÎuch@C5GîØØØØØØØØØØØ}U=CVc3GÃ·åØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×ÅX¡´Åf ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØéŠ5I§µKh¬»®ÙØØØØâ×µmF6^´¡@�Î÷ØØØØØØ4Ç5G³°­€´8Å9QØØØØØØØØ%.7IЧ®¤š1017O»¼§¸ÛÕ$52p¶½Á–cG–�9fÁh"ØØØØØØØØØØØØÞÙ¸rb}°´‡|ÞØØØØØØØØØØâ‡Z5IA6C¿®"×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×ÅX¡³Å^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãØØØã"K=V{‹Dj­¬ÊßØØØØâØv=1X‡mA–® ×ØØØØÞO6FJp¯³Ê¸56bD4cØØØØØØY6Æ5I§‹lh¹ÃYQkЧŠ^‹m�«±Ê¸014]^ÁÁ¶Ê¤½QhjC@rOÇ”ØØØØØØØØØØØØØ¼r]hÍüü,ù×ØØØØØØØØ×Õ®c4Ajb„¯³÷ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×1X¡±1^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØâ%__$%Ç6XfhDp®´¤íØØØØØØ×=5WrfC–®¸ãØØØâ{C=Yh–Šƒƒ–8AlvFÅGÞØØØî"rR=bÎÁjš–ø«Ð××ùjRW{Í´¤µ^AA³š¿¶¹üÙ#{PbW@R{K\¼õØØØØØØØØØØØhGGÁ™÷íîØØØØ×âý÷îÊw8I;§¾¡Î²ãã×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×1X¡±1^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ(V60ÇÇ3RjhDp®¸ÎíØØØØ×ØÐÃR6YkbD–®·ãØØØØã)hFA{Î{GYfVbbYYµÁ=F5AâØØØØ×Àl=A‹jû§ òã×רõ‹GF𱾤€ÐŠK3}j¼¯¶óä„]Ac‹¹±»Á�Ã ØØØØØØØØØØØ¡]=j‡ÀØ×ÞØØã*M6466.G7rj{³½¹žþëãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×1X¡±1^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÞ ¾j@5D8=VcjDl¯·ÎíØØØØØ×Ø“Z6]c]D–®¸ãØØØØØùpF4jšIs–Á³­Î´]lpA@IAA(ØØØ×Õ´c68ll¸¾¶ãØØØØØð$Y8¸Î·«ÑÑ‹A5]Z»°³ìØìˆ^IÃ̤ͱË#üØØØØØØØØØãÙ³FI6G]W�óØãã×ãÊÍÀc@ÇÅ=7@fWY¾±¾Šr{§ÏøÖØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×1X¡±1^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãØ�}W;YR^cDj¯¶ÎíØØØØØÚØ~c6Y^]D–®·ãØØØØØÞx62^lp¶¿»ÌÑЫ–V^YC;v¡%õãØØÒ¬Y5;j{µ´ãØØØØØØ*bD¼¾»×ã×)V;^X»±²ìãÔŒD‡ÎÌãØØØØØØØØØØáØj3V^GZOV½ßââØââíèÊ»phC=YYRbÀ³Î››ìÚ×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×1X¡±1^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãÒØ¸{hFDRY]Fj¯·ÎíØØØØØÚØ~c6Z]ZD–®¸ãØØØØØØ%D7Zbù¿Îã×ã«ÃlDYU@P¼»±×Ø×ãÍwD7f{¯¶÷ØØØØØØØ fm§*ùãØØ l;bW»Î®üá%E–¤ØØØØØØØØØØØ×ØÍf5hšÃW@c]„¬àØØØØØâÝݨsV@XYR„¾¶ÊÐèäØß×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×1Z¡±1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×ÕÔÔÎ\G7JWZFj¯¶ÎíØØØØØßØ~b6ZYXD–®¸ãØØØØØØQ7W]½µµÐãØã㼋FAYG@ô¹Þ××í¤–C=]p¯³òØØØØØØ×f‹·ØØØØr;^U·¬´è"<–ØØØØØØØØØØØØÙüÀAF‹­Ê´j1Iru¿àØØØââØÝЖV6F^R}³¯«Ê¤¬ÞØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×1Z¡±1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ"o\IQK4kDDRQFj®¶ÎÙØØØØØßØf6ZYXD–®·ãØØØØØØ W7YX¸³±ÐרØÒ¬Šh5QV@‹¤³ÌíØí«ÁF@Zj°·ùØØØØØØ×¶fÃîØØØØp9^Q¹¸¼°T‹#ØØØØØØØØØØ×ØØ›¶k5F´²ìäºm85b}‡¶âØØØØâÙ耿;Y=]Oh¼­²·–w�éãØØØØØØØØØØØØØØØØØØØØØØØØØéØØØØØØØØØØØØØØØØØ×1Z¡¯1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØòxYF50Gƒ;GOPFj®·®ÙØØØØØ×ר�8ZWUD–®¸ãØØØØØØ Y7ZV¸°ÎÐרØãךl@CZA�ͶÍíØí«ÀG@Wj®¶ûãØØØØØÒ¼‹ éØØØØØp9^K�¿¸¼{¯óØØØØØØØØØØØ‡;33/Á±³ßضjG4Ajlp»×ØØ½fŠÃ§D0l8XJVÁ±´» ýîãØØØØØØØØØØØØØØØØØØØØØØØØØØ éØØØØØØØØØØØØØØØØØ×1Z¡¯1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãåxf=DWOPGcή¬ÙØØØØØãØól=WWWD–®·ãØØØØØØ Y7WU·´°Ð×ØØØä³rR7YF{¯¸ÍíØí«ÀG=Vj¯¶¬ãØØØØØ×½ÞØØØØØØp;^Ip¿Î½µØØØØØØØØØØØØØ,„MÇÇDM³²®ÚØrY6AKsD;‰ØØâ¸fD4ÅFA7YG�¼¡Þ×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØm ØØØØØØØØØØØØØØØØØØ×1Y¡¯1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØñrDGWKPGU¬±°ÙØØØØã×ãXÆ8ZWUD–®¸ãØØØØØØ Y7WR¶´±ÐרØ×ã«}Y4PD{®¯«ÚØí«ÀG@Vj¯¶¬ãØØØØØñ×ØØØØØØ×p;YI{À¯ÁÌÒØØØØØØØØØØØØ××Ã^AI¸–¸µ®ââß�c7O·�Z0@ÌáØáü»�jC6WOG–´¿×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØÛbuØØØØØØØØØØØØØØØØØØØ×1Y¡¯1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×&]8QOOKD¾½¶óàâררi=YORD–®¸ãØØØØØØ \7WR¶´±Ð×ØØØØÙ‹DÅJG‹°¶«íØí«ÀG@Rh¯¶­ãØØØØØ÷òØØØØØØØØp9YGŠ³Í³üØØØØØØØØØØØØØØÒ«vC6š�µµ±ÚØí¹jCF´QIDA,áØÓÕ­ŠVAYKG§®¸×ØØØØØØØØØØØØØØØØØØØØØØØØØ×ØbuãØØØØØØØØØØØØØØØØØØØØ1Y¡®1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ$G1KOORCh½všäØãØÞbÅ1VPMKD–®¸ãØØØØØØ Y7VR¶´±Ð×ØØØØÝ¿C2p½¼¹Á«íØí«ÀG@Rh¯¶­ãØØØØØâØØØØØØØØØp;YG§³³×ØØØØØØØØØØØØØØØüw84WY³µ°ÚØÙ­fA7jF=OG6G®ÕØØóÃs@FKD¾®³×ØØØØØØØØØØØØØØØØØØØØØØØØØ"O=héØØØØØØØØØØØØØØØØØØØØØ1Y¡®1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØj6OOORG@}C2‹Ú×C=VYP¡�C�®¸ãØØØØØØõY7VR¶´±Ð×ØØØØà“f6f±Í¯½Êߨí«ÁG@Qf°¶¬ãØØØØØØØØØØØØØØØp;WG½´¹üØØØØÒááØüÊüüØØØØì‹F8]]³µ³ÚØØãÃG4^m�÷ÀŠ–,âäà³^;9hZ¾®³×ØØØØØØØØØØØØØØØØØØØØØØØâhÅ@zîØØØØØØØØØØØØØØØØØØØØØ×1Y¡¯1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØh7PMOOP@CJÆÆFF3=b{]DW¨ÀA‹­¼òØØØØØØñb8VO¶³±Ð×ØØØ××­„;F½Ì´²×ââ૽G@Rf¯¶¬ãØØØØØØØØØØØØØØØ{;WJ¹¯±üØØÒØ¡pjl{�ÁŽóâܸ\7WZ³®ãרìÃ^5}®­÷ðñ®½½›ØìA8¹šÁ­×ØØØØØØØØØØØØØØØØØØØØØ xA;jãØØØØØØØØØØØØØØØØØØØØØØ×1Y¡±1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØï^Å3WJMMPV=Cc8=u¼°»j3P„pA‡¤µâØØØØØØØu=VK¶´±Ð×ØØØØØ«½7Q®¾‹¤âØØ×ФV=Kf¯¶­ãØØØØØØØØØØØØØØØâÃ;VG¸Î¯óÙÙc23Q{)òÛããØßÊu9RJ±¯Ø×†@Æ;m²«òÛØ×ãå#ò×ã§I;ŠfÁÌØØØØØØØØØØØØØØØØØØØð%K42O&õãØØØØØØØØØØØØØØØØØØØØØØØ×1Z¡º1b ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØdDWfWOG]Áu==;I„Áî×׬{5I{jClÌ¯ÞØØØØØØ×l=Á‡¼³±Ð×ØØØØØ×~4p³�¶Ð×ÓâØâ®KA]j°¶¬ãØØØØØØØØØØØØØØØÞuAhX¹²¦€Îh;3K$õ×ØØØØØØ×Ù«f@ZJ½„n^15v²Î÷ñØØØØ×רã€r.AlI‹¯××ר×××ØØØØ×רÛý'jFÅÆF‡ÿØØØØØØØØØØØØØØØØØØØØØØØØØ×1X¡º1^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ'x& $mY^·uJc½Í¸îØ×Þ{KJjcGQ¬´îØØØØØã@5µ‹¼³±Ð×ØØØØØØ†;§¹¼«Ó×ÓØØ‰AÇF»Ã³·¬ãØØØØØØØØØØØØØØÞfÆ=¼Š–{M§8D‡ýØØØØØØØØ×ä«Q=¿‹l\C60=‡·õÛØØØØØØ×ó~6DQ�Ã�»kÎÊüüüîð÷)%bG4ÇD¾õØØØØØØØØØØØØØØØØØØØØØØØØØØ×ÇX¡ºÇ^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØô ÖØØØî¿‡�c{°Ì»娨Ø×÷"ƒlbQAÁÁòØØØØ× }IR‡hµ³±Ð×ØØØ×Øâ„W»¶¬ÐãØØãÚ8ÆIš„²·­ãØØØØØØØØØØØØããG5;‹fb]vF=j¾ ñØØØØØØØØØãйA1A¿CWR46b§¾ðØØØØØØØék=K‹²Í«Ìγ½u5;GIKKFA;61ÇJ‡¸·ÿÛØØØØØØØØØØØØØØØØØØØØØØØØØØØ×1X¡º1^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØææØØØØØØ×Þ÷"³¬¿'ÞØØØØØØãã±�pYмרØ× {§±®¶§¶·­Ð×ØØØØã±Y¡³â×××çÀ„{‹‡–ƒ‹¯³Î×ØØØØØØØØØØØî š„‹š–§ufKIjš¹îØØØØØØØØØñŠ„‹––ÃuWDAb§»"ÞØØØØØØØØØ"ò×ãÍ­¤ÐÑ«µuCÇ=fï¯ðãØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×1X¡º1^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×Ø×ʳ"ãØØØØØØØØ×׬³¸Ã·¼ãããÛîÞÛ××ÛÁ´Ð×ØØØÒ÷fl¨ îØØØØéûîããñ²¹½¬ãØØØØØØØØØØØØõ«ÐÑÊη‡lÁ¼ÿÞØØØØØØØØØØ×ùÌÐÑÊι‡Á¯°ÿØØØØØØØØØØØØØ×ØØ×ÞÞâ××ã×ðµ¡]5Ç03=338C]–¯Í¤ÿîãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×ÇX¡ºÇ^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ××â×ØØØØØØØØØØ×ã×ã̳»¶ÍÑ×ØØØØØ×Øâ±³Ðר×Òãwb¿îØØØØØØØØØØ×ØâÐ;ÿãØØØØØØØØØØØØØØã××××âãʤ°·îØØØØØØØØØØØØØØ××××ãâ×夰÷ØØØØØØØØØØØØØØØØØØØØØØØØØâÛÞ®‡VG‡´c]„¾¬«Ì÷ÛÞØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×3X¡º3^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×××õ «×ØØØØØØØ×îòÐרØä¨Y·òéØØØØØØØØØØØØØ×ÞÞÎ÷ØØØØØØØØØØØØØØØØØØØØØ×××Î ãØØØØØØØØØØØØØØØØØØØØØ×ЬØØØØØØØØØØØØØØØØØØØØØØØØØØØØÞåÁb9�­Á¹¬ÍÌâéÞØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×3X¡º3^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×Øñ÷ãØØØØØØØØØâ×ר×Þ ñããØØØØØØØØØØØØØØØØ×Þ×ØØØØØØØØØØØØØØØØØØØØØØØÞåãØØØØØØØØØØØØØØØØØØØØØØãéîîØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãÃjW§¬¬ÍÎõÞãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×4X¡º4^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØã×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÕ¶Ã¬îîîãâ×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×4X¡º4^ ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØõÀÌ××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×4X¡º4^ ×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØú ÷õùýãã×äÕâòõ×ÕãØ×ã÷òõýîäðýÞ×éÞãÞðûýòãääØØØØØñù÷÷ñâ××ãðýòØØØãîû÷ûðãØØØØØØåý÷ùò×רØâÛÿ îãû÷÷ûÞ××òù÷ý÷×רãðÿòãòý÷÷ýÛØØéõÞ××ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×4Z¡º4b´ãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ(>cmh5Ç^pkGO«áÔÊ}CVphGAlûØØ'C5ÅÅ@h,Ô¨Q@@hì{D5ÇAhhW@@jýØØØØØ)FÆ.A¬ÔØä½G7KØØØÕ±3räØØØØØØ FÅFÐãØÒ×=ÇG!×w;3cmhf^=„ØãÀF1=Ø×Õ»D4H™ÐK^‡‡OFƒ}mKØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãØØØØØØØØØØØØØØØØØØØ×4Z¡º4b´ãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØzžÐÑÎ@Ah®ÐÐÍäè›fõãâV3ØÜ¯O=K¶ÐØâÚÊÁ¾ÊüÝÍc3A}¤Ê«–85 ØØØØ×±O@F_}Õ×ß²÷ØØØØÕ³ADY‡åØØØØØØÖG7FkÍãØÕÁ;FŠéØØØ–6Ip­âââß·œãââ²OAW\k÷äØê– è­}«ÑÑk3I§ÊÑи ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×4Z¡º4b´ãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ)áá«I‹»­ÝÔè´Í«pØØØØãI;Qû×Ñ^m½«èâØÝè¶œèâØ×‚W½¾ááÊhIJ*×ØØØÒʾÃ��_¡ìØä«‹ããØØØÒš‡r–pØØØØØØÕý}{§}¼ãã×r^À»×ØØ×ýk§ÃÎØØØèè¤âØí ”ákIwìäâ ™üÔ¯¹ããÕwV¾¼âäÕÞØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×4Z¡º4b´ãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØîãØãÍFc�®ØØØÞÑvW"ÞØØØØâWIYÀ×ÓYW�±âØØäèÁ‘ӨרpDƒ¡ÊØØß§}§¨ãØØØ×Í–¤»cVjÀÚäÍ{ÊרØãñ‹Í‡^]$×ØØØØØØ –Š^]�÷Õ-нY}Á騨Øópb‡¬âãØÓâØØØØ—ͧYKVŠóØ”Þ×ÞîרãŠIÀÞØØØÛØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×4Z¡º4b´ãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×òGW‡ûרØã€b6^½ÛØØØØØhCY¡ÜØrO³ØØØäÙ¶©ãØØ×ƒDp§üáÙYk¶÷×ØØØã¬üI\r¹€«{ÊרØã¶“ÙŸjV{ØØØØØØ ¢,cKw~èq°­^mÁ娨Øók\ŠŸèäáì¿ßØØã˜Ð«}OW^Áã •ÞØØØØØä–GwÀÛØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØî4Z¡º4b´ãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÛ\IûØØØ×Ñ{W}¼ÛØØØØØ*Kr¡ñ׌Ir³âØØäá°¼âØØØÃFjšÍ«¶73²ÑãØØØØã΃Þ×pI^{°«„«×Ø×ã§›óhGf"×ØØØØØ  Ù‚Gb¼³}è­chÃìØØØûbQ�¹£Â§^ŒâØØã –ó×wKWk­¤‘îØØØØØã§GhÁîØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØî4Z¡º3b´ãØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãjG}ûØØØ×סv§½îØØØØØ*V–§óãÃFj³ØâØ×á´¾âØ×Ø»I^–vQÅ{Ã±ÕØØØØã¤ŠÞØØ hKb¡¯�«×Ø×ð„]K^^W\ùØØØØØ¼Ô-KVŠh¸Ô#\]§óØØ×VI–¶‡Š‡j“ÕØØã ‘óØä÷fKYÙŠîØØØØØãÁF^ÀîØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØî3Z¡º3_×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØãkG}÷×ØØØãÿkkÀåØØØØØˆFr¨ÜØÃKw±âØØØÙ¼§íØ××ÏGW§ŸÁŠÀVjîÒØØØ×Ì�ãØßÓ±bKk‹‡«×ØØ­Í®Í²\Ok×ØØØØ¸×ìjh‹Ãóä[WšóØØØVKŠÍÙßÝÓµØâØØ ’î×ר\KcrÛØØØØØä¾G\ÀÛØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØî3Z¡½5l*ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×pFwõØØØØØØWƒòØØØØã%Dëâ×§mÃ¯ÝØØØÙ»ÁÝØØÝ³GVÃüÔü¼{WjÁ×רØ×«Áâר×ãVj‡ÃóØØÞãàÒãâ�K^ÁéØØØØµ×ؾw¿ ØØ iI–óØØØóbG‡¬ÝØØØ÷«ÍÝÓ �ó×ØØØV^}¿éØØØØØä³KV½ÞØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØî4Z¡¾U¡ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ×Õ]‡ÕãØØØØòŠc*ýÕÕÕFÍÞÓà´{Àèèèݸ÷רãáÌfvÃüÔØóÃ^h–®äÒØÒѽóØ×ØØ×*}ŠÃóØ×ÍÌàØãØäÍ]j�õØØØã°×ãÛ‡½÷Ø×qh�óר×Õwb�ÍèÙáèèp|èÙ!)üãØØØØ*k§½éØØØØ×Õ´_k½×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØîçç@Z]jØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØã paÃÁv–ÿØØ×Ø×Ì·¡kг½6hÊÐãØÓʯ»¡}–¶¼{"ר×ü—W}¿ª½¼÷Øó½¸Á·°ã÷sj¼ðØ×ØØã)pÀ슊·õ××Àhf�ŠåØ"h¾Ø×´ÎØ×±gb¾ÃµŽ×ec¿¦½½½¾»„8+è¤ea¶õ×ØØØ×$p¼ÞØØØØð‡@{¿½ ÛØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ]FDGh½0]m$ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØñqx x"ØØØ×ããããû''" ãã××××ãããî$|$騨×îr%sôãã×Ûõòã'u"Ø×ØØØñùâq Øäu$"ñu)××òîäÞ%% 'Þx$$$xxzqk"å×u ãØØØØò ÷ÞרØ×(s(‰‰†(òÒ×ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØhAOc¾½]r ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØêêæææØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØÖæææææÖØØØØØØØØØØØØÖØØØØØØØØØØØØØØØØØØØØêæææÖØØØØØêÖØØØØØØØØØØØæÖØØØÖØêæêêÖØØØØØØØØØØØØØØØØØØØØØØØØêð÷ÿñÖØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØk8Rc½½Xu ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØs;Uf¼½R{fAF]ØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØØ]FC=Vm¸½]lF;6AòsÆÅÆ1ÇÅÅÅÅÅÅÅÅÅÅÅÅ0000000000ÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÅÞ@6;FZ‡¶½2^hfchj²‹IOPPPPPPPPPPPPPPPPPPPPPPPOOOOOOOPPPPPPPPOOOPPPPPPPPPPPPPPPPOOPRRPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPORPPPNPPPPPPPPPPPPPPPPRPOPOOOOPPPPPPPPPPPPPPPPPPPPPPPPPOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP²jhcffйÀ¡§¡¡‹‹Š¸½¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¹¸Š‹‹¡¡À¶@zõHYáåY I zq €zzN€zz€zzËKPg=< åÔÂupstart n zQ€zz€zzíOt˜í@ zÞRg"Üí@n zßls"ƒs.³ßJT%�–T, w{TspF TspF*¥T# zõ~ A PHAø±$ÊA ÈAø±$ zj7//============================================================================= // UBrowserPlayerList - The player list returned by the server. //============================================================================= class UBrowserPlayerList extends UWindowList; var string PlayerName; var string PlayerMesh; var string PlayerSkin; var string PlayerFace; var string PlayerTeam; var int PlayerFrags; var int PlayerPing; var int PlayerID; var string PlayerStats; // Sentinel Only var int SortColumn; var bool bDescending; function SortByColumn(int Column) { if(SortColumn == Column) { bDescending = !bDescending; } else { SortColumn = Column; bDescending = False; } Sort(); } function int Compare(UWindowList T, UWindowList B) { local int Result; local UBrowserPlayerList PT, PB; if(B == None) return -1; PT = UBrowserPlayerList(T); PB = UBrowserPlayerList(B); switch(UBrowserPlayerList(Sentinel).SortColumn) { case 0: if(Caps(PT.PlayerName) < Caps(PB.PlayerName)) Result = -1; else if(PT.PlayerName > PB.PlayerName) Result = 1; else Result = (PT.PlayerPing - PB.PlayerPing); break; case 1: if(PT.PlayerFrags > PB.PlayerFrags) Result = -1; else if(PT.PlayerFrags < PB.PlayerFrags) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 2: if(PT.PlayerPing < PB.PlayerPing) Result = -1; else if(PT.PlayerPing > PB.PlayerPing) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 3: if(PT.PlayerTeam > PB.PlayerTeam) Result = -1; else if(PT.PlayerTeam < PB.PlayerTeam) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 4: if(PT.PlayerMesh < PB.PlayerMesh) Result = -1; else if(PT.PlayerMesh > PB.PlayerMesh) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 5: if(PT.PlayerSkin < PB.PlayerSkin) Result = -1; else if(PT.PlayerSkin > PB.PlayerSkin) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 6: if(PT.PlayerFace < PB.PlayerFace) Result = -1; else if(PT.PlayerFace > PB.PlayerFace) Result = 1; else { if(PT.PlayerSkin < PB.PlayerSkin) Result = -1; else if(PT.PlayerSkin > PB.PlayerSkin) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } } break; case 7: if(PT.PlayerID < PB.PlayerID) Result = -1; else if(PT.PlayerID > PB.PlayerID) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; case 8: if(PT.PlayerStats < PB.PlayerStats) Result = -1; else if(PT.PlayerStats > PB.PlayerStats) Result = 1; else { if(PT.PlayerName < PB.PlayerName) Result = -1; else Result = 1; } break; } if(UBrowserPlayerList(Sentinel).bDescending) Result = -Result; return Result; } function UBrowserPlayerList FindID(int ID) { local UBrowserPlayerList l; l = UBrowserPlayerList(Next); while(l != None) { if(l.PlayerID == ID) return l; l = UBrowserPlayerList(l.Next); } return None; } zX€zz€zz²Uý2²~ .a© a@€C€B z¹Y[§#~ ª¬¯�??, z\€zšz]€zz€zz_ class UBrowserRightClickMenu extends UWindowRightClickMenu; var UWindowPulldownMenuItem Play, Copy, Refresh, RefreshServer, PingAll, Info, Favorites, OpenLocation; var localized string PlayName; var localized string RefreshName; var localized string InfoName; var localized string FavoritesName; var localized string RefreshServerName; var localized string PingAllName; var localized string OpenLocationName; var localized string CopyName; var UBrowserServerGrid Grid; var UBrowserServerList List; function Created() { Super.Created(); Info = AddMenuItem(InfoName, None); Copy = AddMenuItem(CopyName, None); Play = AddMenuItem(PlayName, None); OpenLocation = AddMenuItem(OpenLocationName, None); AddMenuItem("-", None); AddFavoriteItems(); AddMenuItem("-", None); RefreshServer = AddMenuItem(RefreshServerName, None); PingAll = AddMenuItem(PingAllName, None); Refresh = AddMenuItem(RefreshName, None); } function AddFavoriteItems() { Favorites = AddMenuItem(FavoritesName, None); } function ExecuteItem(UWindowPulldownMenuItem I) { switch(I) { case Play: Grid.JoinServer(List); break; case Info: if(!Info.bDisabled) Grid.ShowInfo(List); break; case Favorites: UBrowserServerListWindow(Grid.GetParent(class'UBrowserServerListWindow')).AddFavorite(List); break; case Refresh: Grid.Refresh(); break; case PingAll: Grid.RePing(); break; case RefreshServer: Grid.RefreshServer(); break; case OpenLocation: UBrowserMainWindow(Grid.GetParent(class'UBrowserMainWindow')).ShowOpenWindow(); break; case Copy: GetPlayerOwner().CopyToClipboard("unreal://"$List.IP$":"$string(List.GamePort)); break; } Super.ExecuteItem(I); } function ShowWindow() { Info.bDisabled = List == None || List.GamePort == 0; Play.bDisabled = List == None || List.GamePort == 0; Copy.bDisabled = List == None || List.GamePort == 0; Favorites.bDisabled = List == None; RefreshServer.bDisabled = List == None; Selected = None; Super.ShowWindow(); } —`FSÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ _J¤Ò¾—o û܌̅܌̅܌̅܌̅܌̅܌̅܌̅‘o]! UWindow.UWindowWin95LookAndFeelzzk //============================================================================= // UBrowserRootWindow - root window subclass for UnrealBrowser //============================================================================= class UBrowserRootWindow extends UWindowRootWindow; var UBrowserMainWindow MainWindow; function Created() { Super.Created(); MainWindow = UBrowserMainWindow(CreateWindow(class'UBrowserMainWindow', 50, 30, 500, 300)); MainWindow.bStandaloneBrowser = True; MainWindow.WindowTitle = "Unreal Browser"; Resized(); } function Resized() { Super.Resized(); MainWindow.SetSize(Min(500, WinWidth - 10), WinHeight-30); MainWindow.WinLeft = Int((WinWidth - MainWindow.WinWidth) / 2); MainWindow.WinTop = Int((WinHeight - MainWindow.WinHeight) / 2); } zÊMJ üWU. Y. ~N‚U-X�Y-Xÿÿÿÿx‚�U-XY-X&¦‚U-x�Y-xÿÿÿÿЂ�U-xY-x&þ‚U-W�Y-Wÿÿÿÿ(‚�U-WY-W&SsëUMëYMÿÿÿÿ& zL€zzHr ^÷Î�p. Y–Zwp*>rp~r  p. p–p. Y W p~r  zU€zzQ$//============================================================================= // UBrowserRulesGrid //============================================================================= class UBrowserRulesGrid extends UWindowGrid; var localized string RuleText; var localized string ValueText; function Created() { Super.Created(); RowHeight = 12; AddColumn(RuleText, 150); AddColumn(ValueText, 150); } function PaintColumn(Canvas C, UWindowGridColumn Column, float MouseX, float MouseY) { local UBrowserServerList Server; local UBrowserRulesList RulesList, l; local int Visible; local int Count; local int Skipped; local int Y; local int TopMargin; local int BottomMargin; if(bShowHorizSB) BottomMargin = LookAndFeel.Size_ScrollbarWidth; else BottomMargin = 0; TopMargin = LookAndFeel.ColumnHeadingHeight; Server = UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server; if(Server == None) return; RulesList = Server.RulesList; if(RulesList == None) return; Count = RulesList.Count(); C.Font = Root.Fonts[F_Normal]; Visible = int((WinHeight - (TopMargin + BottomMargin))/RowHeight); VertSB.SetRange(0, Count+1, Visible); TopRow = VertSB.Pos; Skipped = 0; Y = 1; l = UBrowserRulesList(RulesList.Next); while((Y < RowHeight + WinHeight - RowHeight - (TopMargin + BottomMargin)) && (l != None)) { if(Skipped >= VertSB.Pos) { switch(Column.ColumnNum) { case 0: Column.ClipText( C, 2, Y + TopMargin, l.Rule ); break; case 1: Column.ClipText( C, 2, Y + TopMargin, l.Value ); break; } Y = Y + RowHeight; } Skipped ++; l = UBrowserRulesList(l.Next); } } function RightClickRow(int Row, float X, float Y) { local UBrowserInfoMenu Menu; local float MenuX, MenuY; local UWindowWindow W; W = GetParent(class'UBrowserInfoWindow'); if(W == None) return; Menu = UBrowserInfoWindow(W).Menu; WindowToGlobal(X, Y, MenuX, MenuY); Menu.WinLeft = MenuX; Menu.WinTop = MenuY; Menu.ShowWindow(); } function SortColumn(UWindowGridColumn Column) { UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server.RulesList.SortByColumn(Column.ColumnNum); } function SelectRow(int Row) { } zqUSŒÒl%jUnu3š%\,P>\S—}%a?}(Mœ{|6Õ\s“š6µ\%S|™XÐ6Õ\\Êš6µ\%SjÐX zw€zŸzØgxÑZ 1 w-  z€,player_E=Jê“},@C 0:EÀr@*@.C W @o:E-  @.M ¦z€,frags_E=Jê“},-  @C 0:E@]JM Dz€,ping_E=Jê“},-  @C 0:E@hJê“}&M Ûz€,team_E=Jê“},-  @C 0:E@PKM rz€,skin_E=Jê“},-  @C 0:E@MM  z€,face_E=Jê“},-  @C 0:E@OcM šz€,mesh_E=Jê“},-  @C 0:E@`M /z€, ngsecret_E=Jê“}, -  @C 0:E@[M Uzfinalb' M —|gamever-  ZM Û|minnetver-  wM |gametype-  YM b|timelimit-  VM ¦|fraglimit-  RM ö|MultiplayerBots-  { 4M :|AdminName-  UM |AdminEMail-  OM Ì|WantWorldLog-  a4M c|WorldLog- J™C–7|True `bG `f` a4M ¦|mutators-  cM î|goalteamscore-  dM Z |minplayers- @ z0 { z W  v¨lM § |changelevels-  Q4M ê |botskill-  xM - |maxteams-  vM z |balanceteams-  q4M Î |playersbalanceteams-  r4M  |friendlyfire-  xM Y |gamestyle-  WM ¤ |tournament-  |4M  |listenserver- ô K y }  y zM M |password-  s4�- ze!class UBrowserIRCTextArea expands UWindowURLTextArea; var globalconfig int IndentSize; function UWindowDynamicTextRow AddText(string Text) { local UWindowDynamicTextRow R; local int i, j; ReplaceText(Text, Chr(2), ""); ReplaceText(Text, Chr(15), ""); ReplaceText(Text, Chr(22), ""); ReplaceText(Text, Chr(31), ""); i = InStr(Text, Chr(3)); while(i != -1) { j = 1; While(i+j < Len(Text) && InStr("0123456789,", Mid(Text, i+j, 1)) != -1) j++; Text = Left(Text, i) $ Mid(Text, i+j); i = InStr(Text, Chr(3)); } //utpg: \n bug fix, "\n" in a string should not be replaced by an actual newline //R = Super.AddText(Text); // reuse a row if possible R = CheckMaxRows(); if(R != None) List.AppendItem(R); else R = UWindowDynamicTextRow(List.Append(RowClass)); R.WrapParent = None; R.bRowDirty = True; R.Text = Text; bDirty = True; // or else it won't wrap //utpg: \n bug fix -- end UBrowserIRCPageBase(OwnerWindow).AddedText(); return R; } function LaunchUnrealURL(string URL) { Super.LaunchUnrealURL(URL); GetParent(class'UWindowFramedWindow').Close(); Root.Console.CloseUWindow(); } function RMouseUp(float X, float Y) { local UBrowserIRCPageBase P; local float GX, GY; P = UBrowserIRCPageBase(GetParent(class'UBrowserIRCPageBase')); WindowToGlobal(X, Y, GX, GY); P.GlobalToWindow(GX, GY, X, Y); P.RMouseUp(X, Y); } //utpg: improved wrapping, add IndentSize spaces in front of the wrapped line to improve readability function float DrawTextLine(Canvas C, UWindowDynamicTextRow L, float Y) { local float X, W, H; local int i; local string indent; if(bHCenter) { TextAreaTextSize(C, L.Text, W, H); if(VertSB.bWindowVisible) X = int(((WinWidth - VertSB.WinWidth) - W) / 2); else X = int((WinWidth - W) / 2); } else X = 2; if (L.WrapParent == none) TextAreaClipText(C, X, Y, L.Text); else { for (i = 0; i < IndentSize; i++) indent = indent$" "; TextAreaClipText(C, X, Y, indent$L.Text); } return DefaultTextHeight; } //utpg: improved wrapping zT class UBrowserIRCUserList expands UWindowListBoxItem; var string NickName; var bool bChOp; var bool bVoice; var bool bHalfOp; //utpg: halfop support function int Compare(UWindowList T, UWindowList B) { local UBrowserIRCUserList UT, UB; UT = UBrowserIRCUserList(T); UB = UBrowserIRCUserList(B); if(UT.bChOp && !UB.bChOp) return -1; if(!UT.bChOp && UB.bChOp) return 1; //utpg: halfop support if(UT.bHalfOp && !UB.bHalfOp) return -1; if(!UT.bHalfOp && UB.bHalfOp) return 1; //utpg: halfop support -- end if(UT.bVoice && !UB.bVoice) return -1; if(!UT.bVoice && UB.bVoice) return 1; if(Caps(UT.NickName) < Caps(UB.NickName)) return -1; return 1; } zpGTÀš*012wC*CIC* CIŽwA*AIA* AI epppunreal://9:SFhz\status\a®?t Ã( %zÿÿÿÿÿÿÿÿÿÿ zm�zz�zzÝ/¿ò q!G z�zztnNÂa?@( %zÿÿÿÿÿÿÿÿÿÿ zÎvNáÎ6µ\%v! z\ 3zq(class UBrowserIRCUserListBox expands UWindowListBox; //utpg: user/channel prefix var string UPop; var string UPhalfop; var string UPvoice; //utpg: user/channel prefix -- end function Created() { Super.Created(); } function AddUser(string NickName) { local UBrowserIRCUserList NewUser; if(FindNick(NickName) == None) { NewUser = UBrowserIRCUserList(Items.Append(ListClass)); NewUser.NickName = NickName; Items.MoveItemSorted(NewUser); } } function RemoveUser(string NickName) { local UBrowserIRCUserList User; User = FindNick(NickName); if(User != None) User.Remove(); } function ChangeNick(string OldNick, string NewNick) { local UBrowserIRCUserList User; User = FindNick(OldNick); if(User != None) User.NickName = NewNick; Sort(); } function UBrowserIRCUserList FindNick(string NickName) { local UBrowserIRCUserList User; for(User=UBrowserIRCUserList(Items.Next);User != None; User=UBrowserIRCUserList(User.Next)) if(User.NickName == NickName) return User; return None; } function DrawItem(Canvas C, UWindowList Item, float X, float Y, float W, float H) { local string Prefix; if(SelectedItem == Item) { C.DrawColor.r = 0; C.DrawColor.g = 0; C.DrawColor.b = 128; DrawStretchedTexture(C, X, Y, W, H-1, Texture'WhiteTexture'); } C.DrawColor.r = 255; C.DrawColor.g = 255; C.DrawColor.b = 255; C.Font = Root.Fonts[F_Normal]; if(UBrowserIRCUserList(Item).bChOp) Prefix = UPop; else if(UBrowserIRCUserList(Item).bVoice) Prefix = UPvoice; //utpg: halfop support else if(UBrowserIRCUserList(Item).bHalfOp) Prefix = UPhalfop; //utpg: halfop support -- end else Prefix = ""; ClipText(C, X, Y, Prefix$UBrowserIRCUserList(Item).NickName); } function ChangeOp(string Nick, bool bOp) { local UBrowserIRCUserList User; User = FindNick(Nick); if(User != None) { User.bChOp = bOp; Items.MoveItemSorted(User); } } //utpg: halfop support function ChangeHalfOp(string Nick, bool bHalfOp) { local UBrowserIRCUserList User; User = FindNick(Nick); if(User != None) { User.bHalfOp = bHalfOp; Items.MoveItemSorted(User); } } //utpg: halfop support -- end function ChangeVoice(string Nick, bool bVoice) { local UBrowserIRCUserList User; User = FindNick(Nick); if(User != None) { User.bVoice = bVoice; Items.MoveItemSorted(User); } } function DoubleClickItem(UWindowListBoxItem I) { UBrowserIRCChannelPage(OwnerWindow).SystemPage.FindPrivateWindow(UBrowserIRCUserList(I).NickName); } z~G©f´›šRÐ'%çpUBrowserServerPing: Port failed to bind. Attempt SZ¥Z1‘šZ~c-O-c(-N˜q!N¢qL %zÿÿÿÿÿÿÿÿÿÿ¤zÒ]  åSÒ^  O *^ J e.³g]  L * zr 4záC Å£áa.«© «¯�?,l¯Ž?,@B€AC.Щ Я�?,8¯Ž?,@B€AaP.r¢a y$ zÄuc ;æ6c &] .³`) ÿÿÄc  zL€zzx=class UBrowserGSpyLink extends UBrowserBufferedTcpLink; // Misc var UBrowserGSpyFact OwnerFactory; var IpAddr MasterServerIpAddr; var bool bOpened; // Params var string MasterServerAddress; // Address of the master server var int MasterServerTCPPort; // Optional port that the master server is listening on var int Region; // Region of the game server var int MasterServerTimeout; var string GameName; // Error messages var localized string ResolveFailedError; var localized string TimeOutError; var localized string CouldNotConnectError; // for WaitFor const FoundSecureRequest = 1; const FoundSecret = 2; const NextIP = 3; const NextAddress = 4; function BeginPlay() { Disable('Tick'); Super.BeginPlay(); } function Start() { ResetBuffer(); MasterServerIpAddr.Port = MasterServerTCPPort; if( MasterServerAddress=="" ) MasterServerAddress = "master"$Region$".gamespy.com"; Resolve( MasterServerAddress ); } function DoBufferQueueIO() { Super.DoBufferQueueIO(); } function Resolved( IpAddr Addr ) { // Set the address MasterServerIpAddr.Addr = Addr.Addr; // Handle failure. if( MasterServerIpAddr.Addr == 0 ) { Log( "UBrowserGSpyLink: Invalid master server address, aborting." ); return; } // Display success message. Log( "UBrowserGSpyLink: Master Server is "$MasterServerAddress$":"$MasterServerIpAddr.Port ); // Bind the local port. if( BindPort() == 0 ) { Log( "UBrowserGSpyLink: Error binding local port, aborting." ); return; } Open( MasterServerIpAddr ); SetTimer(MasterServerTimeout, False); } event Timer() { if(!bOpened) { Log("UBrowserGSpyLink: Couldn't connect to master server."); OwnerFactory.QueryFinished(False, CouldNotConnectError$MasterServerAddress); GotoState('Done'); } } event Closed() { } // Host resolution failue. function ResolveFailed() { Log("UBrowserGSpyLink: Failed to resolve master server address, aborting."); OwnerFactory.QueryFinished(False, ResolveFailedError$MasterServerAddress); GotoState('Done'); } event Opened() { bOpened = True; Enable('Tick'); WaitFor("\\basic\\\\secure\\", 5, FoundSecureRequest); } function Tick(float DeltaTime) { DoBufferQueueIO(); } function HandleServer(string Text) { local string Address; local string Port; Address = ParseDelimited(Text, ":", 1); Port = ParseDelimited(ParseDelimited(Text, ":", 2), "\\", 1); OwnerFactory.FoundServer(Address, int(Port), "", GameName); } function GotMatch(int MatchData) { switch(MatchData) { case FoundSecureRequest: Enable('Tick'); WaitForCount(6, 5, FoundSecret); break; case FoundSecret: Enable('Tick'); SendBufferedData("\\gamename\\"$GameName$"\\location\\"$Region$"\\validate\\"$Validate(WaitResult, GameName)$"\\final\\"); GotoState('FoundSecretState'); break; case NextIP: Enable('Tick'); if(WaitResult == "final\\") { OwnerFactory.QueryFinished(True); GotoState('Done'); } else WaitFor("\\", 10, NextAddress); break; case NextAddress: Enable('Tick'); HandleServer(WaitResult); WaitFor("\\", 5, NextIP); break; default: break; } } function GotMatchTimeout(int MatchData) { Log("Timed out in master server protocol. Waiting for "$WaitingFor$" in state "$MatchData); OwnerFactory.QueryFinished(False, TimeOutError); GotoState('Done'); } // States state FoundSecretState { function Tick(float Delta) { Global.Tick(Delta); // Hack for 0 servers in server list if(!IsConnected() && WaitResult == "\\final\\") { OwnerFactory.QueryFinished(True); GotoState('Done'); } } Begin: Enable('Tick'); SendBufferedData("\\list\\\\gamename\\"$GameName$"\\final\\"); WaitFor("ip\\", 30, NextIP); } state Done { Begin: Disable('Tick'); } zx |2BÙ-2 z€z¤zCq ›ß »1i.A–iwi*Mzi@q  i.i–(i.A W i@q iT z z|Ij ‰‡'Fši %S~I\@›SÿÿÿÿI€ISIS~I\hšSÿÿÿÿII’S&¦i  z€@zzÖHna= ny.0ž 0ínhm n yòm n nhyanh zS€@zzKr K‘I zr 255r  z{M%o°{-M-RC%§–C|g HjCJ&JjCJ,UnrealjCJ%g -B|jCJ,T'¥C ' zHclass UBrowserNewFavoriteWindow expands UBrowserEditFavoriteWindow; ziIclass UBrowserIRCSetupClient expands UWindowDialogClientWindow; var UWindowComboControl ServerCombo; var UWindowComboControl ChannelCombo; var UWindowSmallButton ConnectButton; var config string IRCServerHistory[10]; var config string IRCChannelHistory[10]; var config bool bHasReadWarning; var localized string ServerText; var localized string ChannelText; var localized string ServerHelp; var localized string ChannelHelp; var localized string ConnectText; var localized string DisconnectText; var localized string ConnectHelp; var localized string DisconnectHelp; var localized string WarningText; var localized string WarningTitle; var UWindowMessageBox ConfirmJoin; var UBrowserIRCSystemPage SystemPage; function Created() { local Color TC; local int i; Super.Created(); SystemPage = UBrowserIRCSystemPage(OwnerWindow); ServerCombo = UWindowComboControl(CreateControl(class'UWindowComboControl', 10, 5, 250, 1)); ServerCombo.EditBoxWidth = 160; ServerCombo.SetText(ServerText); ServerCombo.SetHelpText(ServerHelp); ServerCombo.SetFont(F_Normal); ServerCombo.SetEditable(True); for (i=0; i<10; i++) if (IRCServerHistory[i] != "") ServerCombo.AddItem(IRCServerHistory[i]); TC.R = 255; TC.G = 255; TC.B = 255; ServerCombo.SetTextColor(TC); ServerCombo.SetSelectedIndex(0); ChannelCombo = UWindowComboControl(CreateControl(class'UWindowComboControl', 10, 25, 180, 1)); ChannelCombo.EditBoxWidth = 90; ChannelCombo.SetText(ChannelText); ChannelCombo.SetHelpText(ChannelHelp); ChannelCombo.SetFont(F_Normal); ChannelCombo.SetEditable(True); for (i=0; i<10; i++) if (IRCChannelHistory[i] != "") ChannelCombo.AddItem(IRCChannelHistory[i]); ChannelCombo.SetSelectedIndex(0); ChannelCombo.SetTextColor(TC); ConnectButton = UWindowSmallButton(CreateControl(class'UWindowSmallButton', 196, 26, 64, 16)); ConnectButton.bIgnoreLDoubleclick = True; } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); if(SystemPage.bConnected) { ConnectButton.SetText(DisconnectText); ConnectButton.SetHelpText(DisconnectHelp); } else { ConnectButton.SetText(ConnectText); ConnectButton.SetHelpText(ConnectHelp); } ConnectButton.AutoWidth(C); } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function DoJoin() { SystemPage.Server = ServerCombo.GetValue(); SystemPage.DefaultChannel = ChannelCombo.GetValue(); SystemPage.Connect(); SaveServerCombo(); SaveChannelCombo(); SaveConfig(); } function MessageBoxDone(UWindowMessageBox W, MessageBoxResult Result) { if(W == ConfirmJoin && Result == MR_Yes) { bHasReadWarning = True; DoJoin(); } } function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); if(C == ConnectButton && E == DE_Click) { if(SystemPage.bConnected) SystemPage.Disconnect(); else { if(bHasReadWarning) DoJoin(); else ConfirmJoin = MessageBox(WarningTitle, WarningText, MB_YesNo, MR_No); } } if(C == ChannelCombo && E == DE_EnterPressed) { SystemPage.JoinChannel(ChannelCombo.GetValue()); SaveChannelCombo(); SaveConfig(); } } function NewIRCServer(string S) { if(ServerCombo.List.Items.Count() == 1 && ServerCombo.GetValue() != S) { Log("Received new IRC server from UpdateServer: "$S); ServerCombo.Clear(); ServerCombo.AddItem(S); ServerCombo.SetSelectedIndex(0); SaveServerCombo(); SaveConfig(); } } function SaveServerCombo() { local UWindowComboListItem Item; local int i; ServerCombo.RemoveItem(ServerCombo.FindItemIndex(ServerCombo.GetValue())); ServerCombo.InsertItem(ServerCombo.GetValue()); while(ServerCombo.List.Items.Count() > 10) ServerCombo.List.Items.Last.Remove(); Item = UWindowComboListItem(ServerCombo.List.Items.Next); for (i=0; i<10; i++) { if(Item != None) { IRCServerHistory[i] = Item.Value; Item = UWindowComboListItem(Item.Next); } else IRCServerHistory[i] = ""; } } function SaveChannelCombo() { local UWindowComboListItem Item; local int i; ChannelCombo.RemoveItem(ChannelCombo.FindItemIndex(ChannelCombo.GetValue())); ChannelCombo.InsertItem(ChannelCombo.GetValue()); while(ChannelCombo.List.Items.Count() > 10) ChannelCombo.List.Items.Last.Remove(); Item = UWindowComboListItem(ChannelCombo.List.Items.Next); for (i=0; i<10; i++) { if(Item != None) { IRCChannelHistory[i] = Item.Value; Item = UWindowComboListItem(Item.Next); } else IRCChannelHistory[i] = ""; } } zm€@zzÌ@X E29:ÌX ž Œ å7 zDA@4âŠ|%A.g–¹wA*:š|,d¹|JppppppA=\A9\SA_\TA-B¥|A.A– A.t–kwA*ìš|,dk|JppppppA=\A9\SA_\TA-B¥|A.A–Ò…–|,d|Jb zeclass UBrowserGSpyFact extends UBrowserServerListFactory; var UBrowserGSpyLink Link; var() config string MasterServerAddress; // Address of the master server var() config int MasterServerTCPPort; // Optional port that the master server is listening on var() config int Region; // Region of the game server var() config int MasterServerTimeout; var() config string GameName; function Query(optional bool bBySuperset, optional bool bInitial) { Super.Query(bBySuperset, bInitial); Link = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserGSpyLink'); Link.MasterServerAddress = MasterServerAddress; Link.MasterServerTCPPort = MasterServerTCPPort; Link.Region = Region; Link.MasterServerTimeout = MasterServerTimeout; Link.GameName = GameName; Link.OwnerFactory = Self; Link.Start(); } function QueryFinished(bool bSuccess, optional string ErrorMsg) { Link.Destroy(); Link = None; Super.QueryFinished(bSuccess, ErrorMsg); } function Shutdown(optional bool bBySuperset) { if(Link != None) Link.Destroy(); Link = None; Super.Shutdown(bBySuperset); } zsyM„ xm€y~y.b!mpy1%cPXzcb!my%cPpzccyP z`Z H"(zNZ Yz\ O? GZ VwO*? lOxxwN*N H\  z{owîa-ppppPRIVMSG o :kV zçvD(ìßçDEIaª¯®¢ª¢�?,ha¯®®¢¯¢Ž?,Cª¯®¢ª¢�?,4C¯®®¢¯¢Ž?, zPx Q%Ì8R&x 0wR*RMr A zxB L+-N&B +wN*N z{Qp Ô¹{-p-nQ2ïa fQFLQJ vQCuQD xQeqQKQQ z|W&@PNwF *I.§  ©F ÈBÈBI+ z[Vt½ÁTV–zG HU? GVYwU*? lUppp¨¨¨p*** nVoE  (X )¿¿wT*TtG E X  zkQm ‡&QaQ*k-ml zMhtóÙBpppppppPRIVMSG h :ì&ACTION gì&V z{ZaMEŒQ8MaO|a &NICK!:Aa , zZTj?$ ,wQ*QaQ*Z-j zg VLL3lppppppUSER [  localhost B :I VppNICK AV %zÿÿÿÿÿÿÿÿÿÿ\zGclass UBrowserFavoritesMenu expands UBrowserRightClickMenu; var UWindowPulldownMenuItem EditFavorite, NewFavorite; var localized string EditFavoriteName, NewFavoriteName; function AddFavoriteItems() { Favorites = AddMenuItem(FavoritesName, None); EditFavorite = AddMenuItem(EditFavoriteName, None); NewFavorite = AddMenuItem(NewFavoriteName, None); } function ExecuteItem(UWindowPulldownMenuItem I) { switch(I) { case EditFavorite: Grid.GetParent(class'UWindowFramedWindow').ShowModal(Root.CreateWindow(class'UBrowserEditFavoriteWindow', 300, 80, 100, 100, Self, True)); break; case NewFavorite: Grid.GetParent(class'UWindowFramedWindow').ShowModal(Root.CreateWindow(class'UBrowserNewFavoriteWindow', 300, 80, 100, 100, Self, True)); break; case Favorites: UBrowserFavoriteServers(Grid.GetParent(class'UBrowserServerListWindow')).RemoveFavorite(List); Super(UWindowRightClickMenu).ExecuteItem(I); return; break; } Super.ExecuteItem(I); } function ShowWindow() { EditFavorite.bDisabled = List == None; Super.ShowWindow(); } zg x._x ,Wzx &ERRORx:,'�z_433x ,'ó�z_005x ,'},_x }�{_J|€_, CHANTYPES=_, $pSupported CHANTYPES: jj|€_,PREFIX=__,jz€_&(w_’~_)&__&'{wë€_& ×Ov€w& îHt€w& Vu€w& ÿÿ__&ww&¨|ppvtu!pUsed user PREFIX: |¥}_x }åóÍ—J_,x ,'q!Yóx ,'8x z]]GéîGþz\W?8] j.W¿jWD(vjWF(ujWE(tjKjQ]jW? ZW'z\\HX]EwX*X G\ zÖRF a1)^\wI*íF G L F IªL I¯F I" z_M Tà!XM TM c z{bb ž¥{-b-ab2ïa sbGib~fbIebA dbMbQ zg]\Ùy7`]5w`*`\^_ zg Zj_ 8 >  ,ez  &ERROR :,'] Ðz>JOIN :!,£|A!G  ,] ;z>PART :!,|A!H  ,] „z>NICK-: :!,  ,] Îz>QUIT.P :!,  ,'] -z>353 #, :& :,'*{y &sp#YyŸz€y&v5p#Yy'Ùz€y&u9p#Yy'z€y&t{p#Yy' ,' ] ?z>333] Qz>366] cz>331] uz>332] ‡z>341] Õz>3013U  , :,'] ðz>NOTICE : , :! ,Ç‚›~!ÿÿÿÿš~.ÿÿÿÿ  ,'«‚ší€&&šíê&& C&“},ÄEí  ,'] %›J>%  ,'] ìz>MODE  ,y  ,l,-q'­{€&¬z+-q'Áz--q( zv*5y  l-q¥lSzu*9y  l-q¥lœzt*{y  l-q¥l&}3Ky :!,  ,'] bz>KICKZt  ,  , :!, :,'] °z>INVITE0¨¨ :!,@ :,] ] z>PRIVMSG  ,  ,'Ú‚‚z&,ACTION ší€&&šíê&&,€“}&²‚{›~&#@€&ÿÿÿÿ!\ :!,×T :!,] ä ‚ší€&&šíê&&&“}, ± VERSIONppppppppNOTICE  :!, :ì&VERSION xÖÔì&V!C :!,á ÿÿ!C :!,á ] 8 ‚{›~&#@€&ÿÿÿÿ!K :!,] U :!, zk^` I&bab*k-`\ zr€zzX`Y5 Ne  %zÿÿÿÿÿÿÿÿÿÿzZaZ?#Î,wb*bab*Z-Z zÈ\K <ã<È-K :‚wI*I-ÎI[ z€@zzjE {Ínhr.?8E ¿rgrUE rWr zè} yHzèü-è( z{}X ø {-X-V-g-#q}2ïa e}w[}E Y}G}Q zk| UÆÕ!X| U| W zmQK¿M7cQ5wc*cKRS zx iUHåvHx UTPOH-v'n�H-TH B''-#-ZH zpd¶Vxv‚{dYou have been marked as being away0{dYou are no longer marked as being away% d zg class UBrowserNewFavoriteCW expands UBrowserEditFavoriteCW; function LoadCurrentValues() { GamePortEdit.SetValue("7777"); QueryPortEdit.SetValue("7778"); } function OKPressed() { local UBrowserServerListFactory F; local UBrowserServerList L; local UBrowserFavoriteServers W; W = UBrowserFavoriteServers(UBrowserRightClickMenu(ParentWindow.OwnerWindow).Grid.GetParent(class'UBrowserFavoriteServers')); F = W.Factories[0]; L = UBrowserServerList(F.PingedList.CreateItem(F.PingedList.Class)); L.HostName = DescriptionEdit.GetValue(); L.IP = IPEdit.GetValue(); L.Ping = 9999; L.QueryPort = Int(QueryPortEdit.GetValue()); L.bKeepDescription = !UpdateDescriptionCheck.bChecked; L.GamePort = Int(GamePortEdit.GetValue()); L = W.AddFavorite(L); if(L != None) L.PingServer(False, True, True); ParentWindow.Close(); } zhkNÊ2�-Îü-è'0ü-è( zõdv¨S<õ:w(*(xExit Game(_ zr�@zzH€zzGw4wC 5|wTruej-|wFalsez w zklN *×>}a}*k-NL-#q z]$­k¬ô¯ �?,ÈC Cª?D¬¯ ��?,¯?D¬¯ ŽŽ?, zÒu."[8Ò¢'¬¢�¯¢Ž?, zZtM?5“,w}*}a}*Z-M zkn l5ZXr&n *K. ¼ WÚKMn ¼ CK zÒo 3aÒo U *m W * -*k Y *kJ e³ zd €z­zF@(z|€zzÌHT b�&×T �Ž ä zL{ T† 2w { 0ww *( T{  zÄyl ;ƒdd.³l :odp}W Tmd,W ÿÿÄl  zùKa Ë�Þaì,Þaì,Þaì,Þaì,G~aì,÷›GÿÿÿÿV&¼‚–’GV}a+›~0123456789,a’GV&ÿÿÿÿ¥Vkap€aGa’GVG~aì,Ud @%wd *Õ vd Dd .­Õ WÓd ó*d -Û'd Ëa-ê'.0³kd  zR&//============================================================================= // UBrowserMainWindow - The main window //============================================================================= class UBrowserMainWindow extends UWindowFramedWindow; var UBrowserBannerBar BannerWindow; var string StatusBarDefaultText; var bool bStandaloneBrowser; var localized string WindowTitleString; function DefaultStatusBarText(string Text) { StatusBarDefaultText = Text; StatusBarText = Text; } function BeginPlay() { Super.BeginPlay(); WindowTitle = WindowTitleString; ClientClass = class'UBrowserMainClientWindow'; } function WindowShown() { Super.WindowShown(); if(WinLeft < 0 || WinTop < 16 || WinLeft + WinWidth > Root.WinWidth || WinTop + WinHeight > Root.WinHeight) SetSizePos(); } function Created() { bSizable = True; bStatusBar = True; Super.Created(); MinWinWidth = 300; SetSizePos(); } function BeforePaint(Canvas C, float X, float Y) { if(StatusBarText == "") StatusBarText = StatusBarDefaultText; Super.BeforePaint(C, X, Y); } function Close(optional bool bByParent) { if(bStandaloneBrowser) Root.Console.CloseUWindow(); else Super.Close(bByParent); } function ResolutionChanged(float W, float H) { SetSizePos(); Super.ResolutionChanged(W, H); } function SetSizePos() { if(Root.WinHeight < 400) SetSize(Min(620, Root.WinWidth - 10), Root.WinHeight-32); else SetSize(Min(620, Root.WinWidth - 10), Root.WinHeight-50); WinLeft = Int((Root.WinWidth - WinWidth) / 2); WinTop = Int((Root.WinHeight - WinHeight) / 2); MinWinHeight = Min(300, WinHeight - 20); } // External entry points function ShowOpenWindow() { local UBrowserOpenWindow W; W = UBrowserOpenWindow(Root.CreateWindow(class'UBrowserOpenWindow', 300, 80, 100, 100, Self, True)); ShowModal(W); } function OpenURL(string URL) { if( Left(URL, 7) ~= "http://" ) GetPlayerOwner().ConsoleCommand("start "$URL); else if( Left(URL, 9) ~= "unreal://" ) GetPlayerOwner().ClientTravel(URL, TRAVEL_Absolute, false); else GetPlayerOwner().ClientTravel("unreal://"$URL, TRAVEL_Absolute, false); Close(); Root.Console.CloseUWindow(); } function SelectInternet() { UBrowserMainClientWindow(ClientArea).SelectInternet(); } function SelectLAN() { UBrowserMainClientWindow(ClientArea).SelectLAN(); } zq€zzÿNn 4Xrm |ún ¢ª®¢¯¢Ž¢�ÀAm ÿn A z{e _ ¬{-_ -[ q.+-# ž +Q%µ–Q,«þQqÈNF~QqÈJ_QqÈJµ¥QAðw~*~]-# ^~ (pHWF&r_* (pGWFªX‚�-_  �-[ _# W._–£wW*qWW.W–q ' zÀFR C† cR  zÀP` 0cÀ` ^ ]  zIT X¢ ®E-D(|%ª–|}Tƒ-DfzT|&\FêT“}T|'€EpET|&  zT|&\-D'¥|( z]o ]ë}�z. [–Zwz*>rzgo  z. z–z. [ W zgo  zúVP_Nê6µz6µPq!G zXjV\l9w(*,v{±ÄÆkH±ÄÆkHszwwHbäzlluj%¿–j,lplì’§, ,0¥j’çpCreated new UserIdent: lb(±ïa 1( Vh Hlwk -u' zZD{?FÜZ-{~` zJt N{< Sft 3rf*( Nt Q?Zfü' zK\qP§ �\-d 7‚-J�\-v Y J-#±ÖÒX J-#±ÖÔØ‚-I0„—\]X —Y \C ‚{e {e \N (‚{c {c \_ O‚›b %–\cb  w‚›a %±\&?a  ªwg"B\9\_* A.-B\×\Ag vA--\' zqK//============================================================================= // UBrowserMainClientWindow - The main client area //============================================================================= class UBrowserMainClientWindow extends UWindowClientWindow; var globalconfig string LANTabName; var globalconfig name ServerListNames[50]; var globalconfig bool bKeepMasterServer; var UWindowPageControl PageControl; var UWindowPageControlPage Favorites, IRC, MOTD; var localized string FavoritesName, IRCName, MOTDName; var string ServerListWindowClass; var string FavoriteServersClass; var string UpdateServerClass; var UWindowPageControlPage LANPage; var UWindowTabControlItem PageBeforeLAN; var UBrowserServerListWindow FactoryWindows[50]; var UBrowserInfoWindow InfoWindow; function Created() { local int i, f, j; local UWindowPageControlPage P; local UBrowserServerListWindow W; local class C; local class FC; local class MC; local string NextWindowClass, NextWindowDesc; Super.Created(); InfoWindow = UBrowserInfoWindow(Root.CreateWindow(class'UBrowserInfoWindow', 10, 40, 310, 170)); InfoWindow.HideWindow(); PageControl = UWindowPageControl(CreateWindow(class'UWindowPageControl', 0, 0, WinWidth, WinHeight)); PageControl.SetMultiLine(True); // Add MOTD MC = class(DynamicLoadObject(UpdateServerClass, class'Class')); MOTD = PageControl.AddPage(MOTDName, MC); IRC = PageControl.AddPage(IRCName, class'UBrowserIRCWindow'); // Add favorites FC = class(DynamicLoadObject(FavoriteServersClass, class'Class')); Favorites = PageControl.AddPage(FavoritesName, FC); C = class(DynamicLoadObject(ServerListWindowClass, class'Class')); for(i=0; i<50; i++) { if(ServerListNames[i] == '') break; P = PageControl.AddPage("", C, ServerListNames[i]); if(string(ServerListNames[i]) ~= LANTabName) LANPage = P; W = UBrowserServerListWindow(P.Page); if(W.bHidden) PageControl.DeletePage(P); if(W.ServerListTitle != "") P.SetCaption(W.ServerListTitle); else P.SetCaption(Localize("ServerListTitles", string(ServerListNames[i]), "UBrowser")); FactoryWindows[i] = W; } // Load custom UBrowser pages if(i < 50) { j = 0; GetPlayerOwner().GetNextIntDesc(ServerListWindowClass, j, NextWindowClass, NextWindowDesc); while( NextWindowClass != "" && i < 50 ) { C = class(DynamicLoadObject(NextWindowClass, class'Class')); if( C != None ) { ServerListNames[i] = ''; P = PageControl.AddPage("", C); W = UBrowserServerListWindow(P.Page); if(W.bHidden) PageControl.DeletePage(P); if(W.ServerListTitle != "") P.SetCaption(W.ServerListTitle); else P.SetCaption(NextWindowDesc); FactoryWindows[i] = W; i++; } j++; GetPlayerOwner().GetNextIntDesc(ServerListWindowClass, j, NextWindowClass, NextWindowDesc); } } } function SelectLAN() { if(LANPage != None) { PageBeforeLAN = PageControl.SelectedTab; PageControl.GotoTab(LANPage, True); } } function SelectInternet() { if(PageBeforeLAN != None && PageControl.SelectedTab == LANPage) PageControl.GotoTab(PageBeforeLAN, True); PageBeforeLAN = None; } function NewMasterServer(string M) { local int i, j; local string NewServers[10]; local string T; local bool bHadNewServer; i = 0; while(M != "") { j = InStr(M, Chr(13)); if(j != -1) { T = Left(M, j); M = Mid(M, j+1); } else { T = M; M = ""; } if(T != "") NewServers[i++] = T; } if(!bKeepMasterServer) { for(i=0; i<20; i++) { if(ServerListNames[i] == 'UBrowserAll') { bHadNewServer = False; for(j=0; j<9; j++) { if(FactoryWindows[i].ListFactories[j] != NewServers[j]) { Log("Received new master server ["$j$"] from UpdateServer: "$NewServers[j]); FactoryWindows[i].ListFactories[j] = NewServers[j]; FactoryWindows[i].ListFactories[j+1] = ""; bHadNewServer = True; } } if(bHadNewServer) { if(FactoryWindows[i].bHadInitialRefresh) FactoryWindows[i].Refresh(False, True); FactoryWindows[i].SaveConfig(); } } } } } function NewIRCServer(string S) { UBrowserIRCWindow(IRC.Page).SystemPage.SetupClient.NewIRCServer(S); } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function Resized() { Super.Resized(); PageControl.SetSize(WinWidth, WinHeight); } function SaveConfigs() { SaveConfig(); } zck N[5-+z€k &#ppJOIN k V zÀc[ E†:À[ ž Œ å7 zßl"+‚yl.³ßo-Ùl-um-Ù�l-uk-Ù�l-u zkMy s k-yC zOO T"Ò5-+z€O &#ppPART O V zP�//============================================================================= // UBrowserServerList // Stores a server entry in an Unreal Server List //============================================================================= class UBrowserServerList extends UWindowList; // Valid for sentinel only var UBrowserServerListWindow Owner; var int TotalServers; var int TotalPlayers; var int TotalMaxPlayers; var bool bNeedUpdateCount; // Config var config int MaxSimultaneousPing; var config int MaxSimBroadbandPing; // Master server variables var string IP; var int QueryPort; var string Category; // Master server categorization var string GameName; // Unreal, Unreal Tournament // State of the ping var UBrowserServerPing ServerPing; var bool bPinging; var bool bPingFailed; var bool bPinged; var bool bNoInitalPing; var bool bOldServer; // Rules and Lists var UBrowserRulesList RulesList; var UBrowserPlayerList PlayerList; var bool bKeepDescription; // don't overwrite HostName var int PlayerListSortColumn; // Unreal server variables var bool bLocalServer; var float Ping; var string HostName; var int GamePort; var string MapName; var string MapTitle; var string MapDisplayName; var string GameType; var string GameMode; var int NumPlayers; var int MaxPlayers; var int GameVer; var int MinNetVer; function DestroyListItem() { Owner = None; if(ServerPing != None) { ServerPing.Destroy(); ServerPing = None; } Super.DestroyListItem(); } function QueryFinished(UBrowserServerListFactory Fact, bool bSuccess, optional string ErrorMsg) { Owner.QueryFinished(Fact, bSuccess, ErrorMsg); } // Functions for server list entries only. function PingServer(bool bInitial, bool bJustThisServer, bool bNoSort) { // Create the UdpLink to ping the server ServerPing = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserServerPing'); ServerPing.Server = Self; ServerPing.StartQuery('GetInfo', 2); ServerPing.bInitial = bInitial; ServerPing.bJustThisServer = bJustThisServer; ServerPing.bNoSort = bNoSort; bPinging = True; } function ServerStatus() { // Create the UdpLink to ping the server ServerPing = GetPlayerOwner().GetEntryLevel().Spawn(class'UBrowserServerPing'); ServerPing.Server = Self; ServerPing.StartQuery('GetStatus', 2); bPinging = True; } function StatusDone(bool bSuccess) { // Destroy the UdpLink ServerPing.Destroy(); ServerPing = None; bPinging = False; RulesList.Sort(); PlayerList.Sort(); } function CancelPing() { if(bPinging && ServerPing != None && ServerPing.bJustThisServer) PingDone(False, True, False, True); } function PingDone(bool bInitial, bool bJustThisServer, bool bSuccess, bool bNoSort) { local UBrowserServerListWindow W; local UBrowserServerList OldSentinel; // Destroy the UdpLink if(ServerPing != None) ServerPing.Destroy(); ServerPing = None; bPinging = False; bPingFailed = !bSuccess; bPinged = True; OldSentinel = UBrowserServerList(Sentinel); if(!bNoSort) { Remove(); // Move to the ping list if(!bPingFailed || (OldSentinel != None && OldSentinel.Owner != None && OldSentinel.Owner.bShowFailedServers)) { if(OldSentinel.Owner.PingedList != None) OldSentinel.Owner.PingedList.AppendItem(Self); } } else { if(OldSentinel != None && OldSentinel.Owner != None && OldSentinel != OldSentinel.Owner.PingedList) Log("Unsorted PingDone lost as it's not in ping list!"); } if(Sentinel != None) { UBrowserServerList(Sentinel).bNeedUpdateCount = True; if(bInitial) ConsiderForSubsets(); } if(!bJustThisServer) if(OldSentinel != None) { W = OldSentinel.Owner; if(W.bPingSuspend) { W.bPingResume = True; W.bPingResumeIntial = bInitial; } else OldSentinel.PingNext(bInitial, bNoSort); } } function ConsiderForSubsets() { local UBrowserSubsetList l; for(l = UBrowserSubsetList(UBrowserServerList(Sentinel).Owner.SubsetList.Next); l != None; l = UBrowserSubsetList(l.Next)) { l.SubsetFactory.ConsiderItem(Self); } } // Functions for sentinel only function InvalidatePings() { local UBrowserServerList l; for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) l.Ping = 9999; } function PingServers(bool bInitial, bool bNoSort) { local UBrowserServerList l; bPinging = False; for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) { l.bPinging = False; l.bPingFailed = False; l.bPinged = False; } PingNext(bInitial, bNoSort); } function PingNext(bool bInitial, bool bNoSort) { local int TotalPinging; local UBrowserServerList l; local bool bDone; local int MaxPing; MaxPing = MaxSimultaneousPing; if( Owner != None && Owner.GetPlayerOwner().Player.CurrentNetSpeed > 5000 ) MaxPing = MaxSimBroadbandPing; TotalPinging = 0; bDone = True; for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) { if(!l.bPinged) bDone = False; if(l.bPinging) TotalPinging ++; } if(bDone && Owner != None) { bPinging = False; Owner.PingFinished(); } else if(TotalPinging < MaxPing) { for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) { if( !l.bPinging && !l.bPinged && (!bInitial || !l.bNoInitalPing) && TotalPinging < MaxPing ) { TotalPinging ++; l.PingServer(bInitial, False, bNoSort); } if(TotalPinging >= MaxPing) break; } } } function UBrowserServerList FindExistingServer(string FindIP, int FindQueryPort) { local UWindowList l; for(l = Next;l != None;l = l.Next) { if(UBrowserServerList(l).IP == FindIP && UBrowserServerList(l).QueryPort == FindQueryPort) return UBrowserServerList(l); } return None; } function PlayerPawn GetPlayerOwner() { return UBrowserServerList(Sentinel).Owner.GetPlayerOwner(); } function UWindowList CopyExistingListItem(Class ItemClass, UWindowList SourceItem) { local UBrowserServerList L; L = UBrowserServerList(Super.CopyExistingListItem(ItemClass, SourceItem)); L.bLocalServer = UBrowserServerList(SourceItem).bLocalServer; L.IP = UBrowserServerList(SourceItem).IP; L.QueryPort = UBrowserServerList(SourceItem).QueryPort; L.Ping = UBrowserServerList(SourceItem).Ping; L.HostName = UBrowserServerList(SourceItem).HostName; L.GamePort = UBrowserServerList(SourceItem).GamePort; L.MapName = UBrowserServerList(SourceItem).MapName; L.MapTitle = UBrowserServerList(SourceItem).MapTitle; L.MapDisplayName= UBrowserServerList(SourceItem).MapDisplayName; L.MapName = UBrowserServerList(SourceItem).MapName; L.GameType = UBrowserServerList(SourceItem).GameType; L.GameMode = UBrowserServerList(SourceItem).GameMode; L.NumPlayers = UBrowserServerList(SourceItem).NumPlayers; L.MaxPlayers = UBrowserServerList(SourceItem).MaxPlayers; L.GameVer = UBrowserServerList(SourceItem).GameVer; L.MinNetVer = UBrowserServerList(SourceItem).MinNetVer; L.bKeepDescription = UBrowserServerList(SourceItem).bKeepDescription; return L; } function int Compare(UWindowList T, UWindowList B) { CompareCount++; return UBrowserServerList(Sentinel).Owner.Grid.Compare(UBrowserServerList(T), UBrowserServerList(B)); } function AppendItem(UWindowList L) { Super.AppendItem(L); UBrowserServerList(Sentinel).bNeedUpdateCount = True; } function Remove() { local UBrowserServerList S; S = UBrowserServerList(Sentinel); Super.Remove(); if(S != None) S.bNeedUpdateCount = True; } // Sentinel only // FIXME: slow when lots of servers!! function UpdateServerCount() { local UBrowserServerList l; TotalServers = 0; TotalPlayers = 0; TotalMaxPlayers = 0; for(l = UBrowserServerList(Next);l != None;l = UBrowserServerList(l.Next)) { TotalServers++; TotalPlayers += l.NumPlayers; TotalMaxPlayers += l.MaxPlayers; } } function bool DecodeServerProperties(string Data) { return True; } zbclass UBrowserFavoritesFact extends UBrowserServerListFactory; var config int FavoriteCount; var config string Favorites[100]; /* eg Favorites[0]=Host Name\10.0.0.1\7778\True */ function string ParseOption(string Input, int Pos) { local int i; while(True) { if(Pos == 0) { i = InStr(Input, "\\"); if(i != -1) Input = Left(Input, i); return Input; } i = InStr(Input, "\\"); if(i == -1) return ""; Input = Mid(Input, i+1); Pos--; } } function Query(optional bool bBySuperset, optional bool bInitial) { local int i; local UBrowserServerList L; Super.Query(bBySuperset, bInitial); for(i=0;ih<!šiW -o�-o4iW -o(A z€@zzÊ_wJ)jrU *ÿÿÿÿ.w.U .Ëi Ï%}së.ë.ÿÿÿÿ̨t..&Ì“hhë f&—]]ÿÿÿÿc-–]]&c\s..ÿÿÿÿc&ë þ,š–hhÿÿÿÿûÅ—hh&ûôs..ÿÿÿÿû&ë –,2tPPÿÿÿÿ“]sPP&“Œs..ÿÿÿÿ“&ë .,Ês``ÿÿÿÿ+õt``&+$s..ÿÿÿÿ+&ë Æ,bsÿÿÿÿÃ�t&üs..ÿÿÿÿÃ&ë ¸,úsOOÿÿÿÿµ%tOO&µTsÿÿÿÿµt&µ®s..ÿÿÿÿµ&ë P,ì–ooÿÿÿÿM—oo&MFs..ÿÿÿÿM&ë è,„s[[ÿÿÿÿå¯t[[&åÞs..ÿÿÿÿå&ë ÿÿ.Ë-o� zHos.‰@Hstui ¬�¯Ž<Ž zza wàÅ a %#ffffff #&#000000 2,#0000ff A,#00ff00 P,#ff0000 _,#7f0000 n,#7f007f },#ff7f00 Œ,#ffff00 ›, #00ff00 ª, #00ffff ¹, #00ffff È, #0000ff ×, #ff00ff æ, #ff00ff õ,#7f7f7f ,#c0c0c0 ÿÿ z€zzGbs 5?&{€s &/p*** m=(Ms & z| class UBrowserFavoriteServers extends UBrowserServerListWindow; function Created() { Super.Created(); Refresh(); } function UBrowserServerList AddFavorite(UBrowserServerList Server) { local UBrowserServerList NewItem; if(PingedList.FindExistingServer(Server.IP, Server.QueryPort) == None) NewItem = UBrowserServerList(PingedList.CopyExistingListItem(ServerListClass, Server)); PingedList.Sort(); UBrowserFavoritesFact(Factories[0]).SaveFavorites(); return NewItem; } function RemoveFavorite(UBrowserServerList Item) { Item.Remove(); UBrowserFavoritesFact(Factories[0]).SaveFavorites(); } zCclass UBrowserEditFavoriteWindow expands UWindowFramedWindow; var UWindowSmallCloseButton CloseButton; var UWindowSmallButton OKButton; var localized string OKText; function Created() { Super.Created(); OKButton = UWindowSmallButton(CreateWindow(class'UWindowSmallButton', WinWidth-108, WinHeight-24, 48, 16)); CloseButton = UWindowSmallCloseButton(CreateWindow(class'UWindowSmallCloseButton', WinWidth-56, WinHeight-24, 48, 16)); OKButton.Register(UBrowserEditFavoriteCW(ClientArea)); OKButton.SetText(OKText); SetSizePos(); } function ResolutionChanged(float W, float H) { Super.ResolutionChanged(W, H); SetSizePos(); } function SetSizePos() { SetSize(FMin(Root.WinWidth-20, 400), 160); WinLeft = Int((Root.WinWidth - WinWidth) / 2); WinTop = Int((Root.WinHeight - WinHeight) / 2); } function Resized() { Super.Resized(); ClientArea.SetSize(ClientArea.WinWidth, ClientArea.WinHeight-24); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); OKButton.WinLeft = ClientArea.WinLeft+ClientArea.WinWidth-104; OKButton.WinTop = ClientArea.WinTop+ClientArea.WinHeight+4; CloseButton.WinLeft = ClientArea.WinLeft+ClientArea.WinWidth-52; CloseButton.WinTop = ClientArea.WinTop+ClientArea.WinHeight+4; } function Paint(Canvas C, float X, float Y) { local Texture T; T = GetLookAndFeelTexture(); DrawUpBevel( C, ClientArea.WinLeft, ClientArea.WinTop + ClientArea.WinHeight, ClientArea.WinWidth, 24, T); Super.Paint(C, X, Y); } zax0ºV YZ.–UwZ*9šZoxZZ.Z–* zYkk-š6ppAWAY :kV zZ€zzÆD ÐÆ zâ}Ibg ÑâIj j X$I R<< <JU ÿÿÏ ’$I Œ<%Á }€¿� ÿÿÏ Ì$I Æ<%Á }€?É ÿÿÏ ÿÿ zÐ^ BÞ^&&Þ^>>Þ^<<@…{^a^u v w x @p@u E¤›:v %@p@Û:w %@p@å›:x %@p@s Ð@.0³ks  zÔ^JC+ÔJ~ ` zA,class UBrowserIRCPageBase expands UWindowPageWindow; var UWindowDynamicTextArea TextArea; var UWindowEditControl EditControl; var config string TextAreaClass; var localized string HasLeftText; var localized string HasJoinedText; var localized string WasKickedByText; var localized string NowKnownAsText; var localized string QuitText; var localized string SetsModeText; var class RightClickMenuClass; var UWindowPulldownMenu Menu; function Created() { local class TAClass; Super.Created(); TAClass = class(DynamicLoadObject(TextAreaClass, class'Class')); if(TAClass == None) TAClass = class'UBrowserIRCTextArea'; TextArea = UWindowDynamicTextArea(CreateControl(TAClass, 0, 0, WinWidth, WinHeight, Self)); EditControl = UWindowEditControl(CreateControl(class'UWindowEditControl', 0, WinHeight-16, WinWidth, 16)); EditControl.SetFont(F_Normal); EditControl.SetNumericOnly(False); EditControl.SetMaxLength(400); EditControl.SetHistory(True); } function Setup() { if(RightClickMenuClass != None) { Menu = UWindowPulldownMenu(Root.CreateWindow(RightClickMenuClass, 0, 0, 100, 100, Self)); Menu.HideWindow(); } } function RMouseUp(float X, float Y) { local float MenuX, MenuY; if(Menu != None) { WindowToGlobal(X, Y, MenuX, MenuY); Menu.WinLeft = MenuX; Menu.WinTop = MenuY; Menu.ShowWindow(); } } function Close(optional bool bByParent) { Super.Close(bByParent); if(Menu != None && Menu.bWindowVisible) Menu.CloseUp(); } function ClosePage() { } function WindowShown() { Super.WindowShown(); OwnerTab.bFlash = False; } function AddedText() { if(!bWindowVisible) OwnerTab.bFlash = True; else OwnerTab.bFlash = False; } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); EditControl.SetSize(WinWidth, 17); EditControl.WinLeft = 0; EditControl.WinTop = WinHeight - EditControl.WinHeight; EditControl.EditBoxWidth = WinWidth; TextArea.SetSize(WinWidth, WinHeight - EditControl.WinHeight); } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); switch(E) { case DE_EnterPressed: switch(C) { case EditControl: ProcessInput(EditControl.GetValue()); EditControl.Clear(); break; } break; case DE_WheelUpPressed: switch(C) { case EditControl: TextArea.VertSB.Scroll(-1); break; } break; case DE_WheelDownPressed: switch(C) { case EditControl: TextArea.VertSB.Scroll(1); break; } break; } } function ProcessInput(string Text); z@S >¢<!šYS -u�-u4YS -u(A zV€zzÊppJ!£}rR *ÿÿÿÿJs.p@.R @[ÿÿÿÿQ[&u.Ë-u[�[[ zi_2æ6:*5ihppQUIT :xV8a zs €z­z[€zzühi|Öhgf zxzzzzd class UBrowserIRCPrivateMenu expands UWindowRightClickMenu; var UWindowPulldownMenuItem CloseChat; var UWindowPulldownMenuItem Join; var localized string CloseText; var localized string JoinText; function Created() { Super.Created(); Join = AddMenuItem(JoinText, None); Join.CreateSubMenu(class'UBrowserIRCJoinMenu', UBrowserIRCPrivPage(OwnerWindow).SystemPage); CloseChat = AddMenuItem(CloseText, None); } function ExecuteItem(UWindowPulldownMenuItem I) { switch(I) { case CloseChat: UBrowserIRCPrivPage(OwnerWindow).ClosePage(); break; } Super.ExecuteItem(I); } zvl ÕyV~l b G„šRÿÿÿÿ šVÿÿÿÿRúRVYRùRV‚›Vÿÿÿÿ šRV z€@zzÀmi E%s:Ài ž Œ å7 zE\E:�(%ppp-\- ] z}_U?ß3%(pp¨_g@ : ` z1class UBrowserEditFavoriteCW expands UWindowDialogClientWindow; var UWindowEditControl DescriptionEdit; var localized string DescriptionText; var UWindowCheckbox UpdateDescriptionCheck; var localized string UpdateDescriptionText; var UWindowEditControl IPEdit; var localized string IPText; var UWindowEditControl GamePortEdit; var localized string GamePortText; var UWindowEditControl QueryPortEdit; var localized string QueryPortText; function Created() { local float ControlOffset, CenterPos, CenterWidth; Super.Created(); DescriptionEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', 10, 10, 220, 1)); DescriptionEdit.SetText(DescriptionText); DescriptionEdit.SetFont(F_Normal); DescriptionEdit.SetNumericOnly(False); DescriptionEdit.SetMaxLength(300); DescriptionEdit.EditBoxWidth = 100; UpdateDescriptionCheck = UWindowCheckbox(CreateControl(class'UWindowCheckbox', 10, 30, 136, 1)); UpdateDescriptionCheck.SetText(UpdateDescriptionText); UpdateDescriptionCheck.SetFont(F_Normal); IPEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', 10, 50, 220, 1)); IPEdit.SetText(IPText); IPEdit.SetFont(F_Normal); IPEdit.SetNumericOnly(False); IPEdit.SetMaxLength(40); IPEdit.EditBoxWidth = 100; GamePortEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', 10, 70, 160, 1)); GamePortEdit.SetText(GamePortText); GamePortEdit.SetFont(F_Normal); GamePortEdit.SetNumericOnly(True); GamePortEdit.SetMaxLength(5); GamePortEdit.EditBoxWidth = 40; QueryPortEdit = UWindowEditControl(CreateControl(class'UWindowEditControl', 10, 90, 160, 1)); QueryPortEdit.SetText(QueryPortText); QueryPortEdit.SetFont(F_Normal); QueryPortEdit.SetNumericOnly(True); QueryPortEdit.SetMaxLength(5); QueryPortEdit.EditBoxWidth = 40; DescriptionEdit.BringToFront(); LoadCurrentValues(); } function LoadCurrentValues() { local UBrowserServerList L; L = UBrowserRightClickMenu(ParentWindow.OwnerWindow).List; DescriptionEdit.SetValue(L.HostName); UpdateDescriptionCheck.bChecked = !L.bKeepDescription; IPEdit.SetValue(L.IP); GamePortEdit.SetValue(string(L.GamePort)); QueryPortEdit.SetValue(string(L.QueryPort)); } function BeforePaint(Canvas C, float X, float Y) { Super.BeforePaint(C, X, Y); DescriptionEdit.WinWidth = WinWidth - 20; DescriptionEdit.EditBoxWidth = WinWidth - 140; } function Notify(UWindowDialogControl C, byte E) { Super.Notify(C, E); if((C == UBrowserEditFavoriteWindow(ParentWindow).OKButton && E == DE_Click)) OKPressed(); } function OKPressed() { local UBrowserServerList L; L = UBrowserRightClickMenu(ParentWindow.OwnerWindow).List; L.HostName = DescriptionEdit.GetValue(); L.bKeepDescription = !UpdateDescriptionCheck.bChecked; L.IP = IPEdit.GetValue(); L.GamePort = Int(GamePortEdit.GetValue()); L.QueryPort = Int(QueryPortEdit.GetValue()); UBrowserFavoritesFact(UBrowserFavoriteServers(UBrowserRightClickMenu(ParentWindow.OwnerWindow).Grid.GetParent(class'UBrowserFavoriteServers')).Factories[0]).SaveFavorites(); L.PingServer(False, True, True); ParentWindow.Close(); } zÎ\ g:Ø>,{}±upstart }Î\ Z  zLSP' 7%,pp¨¨p*** SV (T). z€zzvclass UBrowserConsole expands WindowConsole; event bool KeyEvent( EInputKey Key, EInputAction Action, FLOAT Delta ) { return Super(Console).KeyEvent( Key, Action, Delta ); } exec function ShowUBrowser() { Super.LaunchUWindow(); } ÏCGiÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿ>D–ʯdÏ/Tã2'‘zzHxT3‹ˆ%ppp* x ~ †‚�ž Œ-Î{xgH±"QpppIRC: * x ~  zaclass UBrowserIRCPrivPage expands UBrowserIRCPageBase; var string PrivNick; var UBrowserIRCSystemPage SystemPage; function ClosePage() { SystemPage.PageParent.DeletePage(OwnerTab); } function ProcessInput(string Text) { if(Left(Text, 4) ~= "/me ") { PrivateAction(SystemPage.NickName, Mid(Text, 4)); SystemPage.Link.SendChannelAction(PrivNick, Mid(Text, 4)); } else if(Left(Text, 1) == "/") SystemPage.ProcessInput(Text); else { if(Text != "") { PrivateText(SystemPage.NickName, Text); SystemPage.Link.SendChannelText(PrivNick, Text); } } } function ChangedNick(string OldNick, string NewNick) { TextArea.AddText("*** "$OldNick@NowKnownAsText@NewNick$"."); PrivNick = NewNick; } function UserQuit(string Nick, string Reason) { TextArea.AddText("*** "$Nick@QuitText@"("$Reason$")."); } function PrivateText(string Nick, string Text) { TextArea.AddText("<"$Nick$"> "$Text); if(!GetParent(class'UWindowFramedWindow').bWindowVisible && Nick != SystemPage.NickName) GetPlayerOwner().ClientMessage("IRC: <"$Nick$"> "$Text); } function PrivateAction(string Nick, string Text) { TextArea.AddText("* "$Nick$" "$Text); if(!GetParent(class'UWindowFramedWindow').bWindowVisible && Nick != SystemPage.NickName) GetPlayerOwner().ClientMessage("IRC: * "$Nick$" "$Text); } function UserNotice(string Nick, string Text) { TextArea.AddText("-"$Nick$"- "$Text); } function IsAway(string Nick, string Message) { TextArea.AddText(Nick@SystemPage.IsAwayText$": "$Message); } zv{ ÚÇ zAyU,’ˆ%ppp<y> ` †‚�ž Œ-Î{ygH±"QpppIRC: <y> `  z|Q ߨ|E.¦© ¦�ŽW.JE © JÈBŽ% *EEÿ%EþWEϯE�?,dEØÈB zROclass UBrowserColorIRCTextArea expands UWindowHTMLTextArea; // Converts to IRC codes to HTML and uses the HTML renderer. // ***SLOW*** function UWindowDynamicTextRow AddText(string Text) { local UWindowDynamicTextRow R; local string OutText, NextBlock; local byte BoldState, UnderlineState, ColorState; ReplaceText(Text, "&", "&"); ReplaceText(Text, ">", ">"); ReplaceText(Text, "<", "<"); OutText = ""; while(Text != "") { ProcessText(Text, NextBlock, BoldState, UnderlineState, ColorState); OutText = OutText $ NextBlock; } if(BoldState != 0) OutText = OutText $ ""; if(UnderlineState != 0) OutText = OutText $ ""; if(ColorState != 0) OutText = OutText $ ""; R = Super.AddText(OutText); UBrowserIRCPageBase(OwnerWindow).AddedText(); return R; } function LaunchUnrealURL(string URL) { Super.LaunchUnrealURL(URL); GetParent(class'UWindowFramedWindow').Close(); Root.Console.CloseUWindow(); } function RMouseUp(float X, float Y) { local UBrowserIRCPageBase P; local float GX, GY; P = UBrowserIRCPageBase(GetParent(class'UBrowserIRCPageBase')); WindowToGlobal(X, Y, GX, GY); P.GlobalToWindow(GX, GY, X, Y); P.RMouseUp(X, Y); } function ProcessText(out string Text, out string NextBlock, out byte BoldState, out byte UnderlineState, out byte ColorState) { local int i; local string FG, BG; local bool bColor, bUnderline, bBold, bNormal, bReverse; i = InStr(Text, "http://"); MultiInStr(Text, "www.", i); MultiInStr(Text, "unreal://", i); MultiInStr(Text, "ftp://", i); MultiInStr(Text, "ftp.", i); MultiInStr(Text, "telnet://", i); bBold = MultiInStr(Text, Chr(2), i); bColor = MultiInStr(Text, Chr(3), i); if(bColor) bBold = False; bNormal = MultiInStr(Text, Chr(15), i); if(bNormal) { bBold = False; bColor = False; } bReverse = MultiInStr(Text, Chr(22), i); if(bReverse) { bBold = False; bColor = False; bNormal = False; } bUnderline = MultiInStr(Text, Chr(31), i); if(bUnderline) { bBold = False; bColor = False; bNormal = False; bReverse = False; } if(i == -1) { NextBlock = Text; Text = ""; } else if(i == 0) { if(bUnderline || bBold || bNormal || bReverse) i = 1; else if(bColor) { for(i = 1;i"; else NextBlock = ""; } } else if(bUnderline) { if(UnderlineState != 0) NextBlock = ""; else NextBlock = ""; UnderlineState = 1-UnderlineState; } else if(bBold) { if(BoldState != 0) NextBlock = ""; else NextBlock = ""; BoldState = 1-BoldState; } else if(bNormal) { NextBlock = ""; if(BoldState != 0) NextBlock = ""; BoldState = 0; if(UnderlineState != 0) NextBlock = ""; UnderlineState = 0; if(ColorState != 0) NextBlock = ""; ColorState = 0; } else if(bReverse) { if(ColorState != 0) NextBlock = ""; else NextBlock = ""; ColorState = 1 - ColorState; } else NextBlock = ""$NextBlock$""; } else { NextBlock = Left(Text, i); Text = Mid(Text, i); } } function bool MultiInStr(string Text, string In, out int i) { local int j; j = InStr(Text, In); if(i == -1 || j == -1) i = Max(i, j); else i = Min(i, j); return j!=-1 && i==j; } function string GetColorString(int Num) { switch(Num) { case 0:return "#ffffff"; case 1:return "#000000"; case 2:return "#0000ff"; case 3:return "#00ff00"; case 4:return "#ff0000"; case 5:return "#7f0000"; case 6:return "#7f007f"; case 7:return "#ff7f00"; case 8:return "#ffff00"; case 9:return "#00ff00"; case 10:return "#00ffff"; case 11:return "#00ffff"; case 12:return "#0000ff"; case 13:return "#ff00ff"; case 13:return "#ff00ff"; case 14:return "#7f7f7f"; case 15:return "#c0c0c0"; } return ""; } z} I`ªK TQ zOP:!”<%&p¨¨p*** Pb ^ .U^  ÃJchÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿM©åËÃHüma0f‘òw0f‘òwƒ.ü'l—o ûÏ/Tã20f‘òw‘P"ô}S~Szzt9//============================================================================= // UBrowserBufferedTcpLink //============================================================================= class UBrowserBufferedTcpLink extends TcpLink; var string InputBuffer; var string OutputBuffer; var string CRLF; var string CR; var string LF; var bool bWaiting; var float WaitTimeoutTime; var string WaitingFor; var int WaitForCountChars; // if we're waiting for X bytes var string WaitResult; var int WaitMatchData; function ResetBuffer() { InputBuffer = ""; OutputBuffer = ""; bWaiting = False; CRLF = Chr(10)$Chr(13); CR = Chr(13); LF = Chr(10); } function WaitFor(string What, float TimeOut, int MatchData) { bWaiting = True; WaitingFor = What; WaitForCountChars = 0; WaitTimeoutTime = Level.TimeSeconds + TimeOut; WaitMatchData = MatchData; WaitResult = ""; } function WaitForCount(int Count, float TimeOut, int MatchData) { bWaiting = True; WaitingFor = ""; WaitForCountChars = Count; WaitTimeoutTime = Level.TimeSeconds + TimeOut; WaitMatchData = MatchData; WaitResult = ""; } function GotMatch(int MatchData) { // called when a match happens } function GotMatchTimeout(int MatchData) { // when a match times out } function string ParseDelimited(string Text, string Delimiter, int Count, optional bool bToEndOfLine) { local string Result; local int Found, i; local string s; Result = ""; Found = 1; for(i=0;i= Count) Result = Result $ s; } } return Result; } // Read an individual character, returns 0 if no characters waiting function int ReadChar() { local int c; if(InputBuffer == "") return 0; c = Asc(Left(InputBuffer, 1)); InputBuffer = Mid(InputBuffer, 1); return c; } // Take a look at the next waiting character, return 0 if no characters waiting function int PeekChar() { local int c; if(InputBuffer == "") return 0; return Asc(Left(InputBuffer, 1)); } function bool ReadBufferedLine(out string Text) { local int i; i = InStr(InputBuffer, Chr(13)); if(i == -1) return False; Text = Left(InputBuffer, i); if(Mid(InputBuffer, i+1, 1) == Chr(10)) i++; InputBuffer = Mid(InputBuffer, i+1); return True; } function SendBufferedData(string Text) { OutputBuffer = OutputBuffer $ Text; } event ReceivedText(string Text) { InputBuffer = InputBuffer $ Text; } // DoQueueIO is intended to be called from Tick(); function DoBufferQueueIO() { local int i; while(bWaiting) { if(Level.TimeSeconds > WaitTimeoutTime) { bWaiting = False; GotMatchTimeout(WaitMatchData); } if(WaitForCountChars > 0) { if(Len(InputBuffer) < WaitForCountChars) break; WaitResult = Left(InputBuffer, WaitForCountChars); InputBuffer = Mid(InputBuffer, WaitForCountChars); bWaiting = False; GotMatch(WaitMatchData); } else { i = InStr(InputBuffer, WaitingFor); if(i == -1 && WaitingFor == CR) i = InStr(InputBuffer, LF); if(i != -1) { WaitResult = Left(InputBuffer, i + Len(WaitingFor)); InputBuffer = Mid(InputBuffer, i + Len(WaitingFor)); bWaiting = False; GotMatch(WaitMatchData); } else break; } } if(IsConnected()) { i = SendText(OutputBuffer); OutputBuffer = Mid(OutputBuffer, i); } } zGUS íÊZ|€S,/me TgHS,g(tUS,È�z€S&/g SÈÈ{SUgHSg(wUS z]E5p W5E-F z@//============================================================================= // UBrowserRulesList - The rules returned by the server //============================================================================= class UBrowserRulesList extends UWindowList; var string Rule; var string Value; // Sentinel only var int SortColumn; var bool bDescending; function SortByColumn(int Column) { if(SortColumn == Column) { bDescending = !bDescending; } else { SortColumn = Column; bDescending = False; } Sort(); } function int Compare(UWindowList T, UWindowList B) { local int Result; local UBrowserRulesList RT, RB; if(B == None) return -1; if(UBrowserRulesList(T).Rule < UBrowserRulesList(B).Rule) Result = -1; else Result = 1; if(UBrowserRulesList(Sentinel).bDescending) Result = -Result; return Result; } zSH9|ÿ W9H-I zØTKx3Ú‹Z}w‰|€D ’Z&pw C JD ’Z&aTKa€a~a:GHaC w zVM\$Þ^6µMÑP%\–P, 6ÕM’E PhMREPORTQUERY¥P z~class UBrowserBrowserButton extends UWindowButton; var string LogoNames[30]; var Texture LogoImages[30]; var int LogoCount; var string ClickURL; var int CurrentFrame; var float CurrentTime; var bool bSpin; function Created() { local int i; bNoKeyboard = True; bStretched = True; if(ClickURL != "") Cursor = Root.HandCursor; Super.Created(); for(i=0;i 0.03333) { UpTexture = LogoImages[CurrentFrame]; OverTexture = UpTexture; DownTexture = UpTexture; CurrentFrame++; if(CurrentFrame >= LogoCount) CurrentFrame = 0; CurrentTime = 0; } } else { UpTexture = LogoImages[0]; OverTexture = UpTexture; DownTexture = UpTexture; } } function Click(float X, float Y) { if(ClickURL != "") GetPlayerOwner().ConsoleCommand("start "$ClickURL); Super.Click(X, Y); } zÝX/pG ' zzzGWQ»YQšR%G: (UBrowserLocalLink: Could not bind to a free port. \ zÉ#{8Þ-#*%w4*4a4*É zYi DÄ!# i-GM zzz_g K%¤(%ppp<g > h  zsBKk¤ 2%'pp¨p*** B : C zZDBKœ”42ïa M44 ~![,4-O-D4-c-A4-N- -T' zHKc  @Hc d e E ¬�¯Ž<Ž zn[`žHüÈB¬?ùD¯ �?,ô?ùD¯ Ž?,,æ zÔik CÏ b$³ Ž?€m'(,m('PwG*GCk l Ôk l  z^sW R42ïa M44 ~!T,-T' zbdb`ñ ;4a4*-T(AACA z€zzc_k~ 64‚‚-T w4*4-cc('(' zeTcu¬ w4*4a4*-T(-S�-| -d'R.Ëë�-L è„�-S<‚‚wR*wR#*R#-A èwR#*R#vcc‚‚wR*wR#*wRR#çUnsorted PingDone lost as it's not in ping list!“wË*.Ë-\'“-TJ�-} wR*`R#ù`-x`-{'`-A -TRD-T-L  zt$class UBrowserUpdateServerWindow expands UWindowPageWindow; var UBrowserUpdateServerLink Link; var UBrowserUpdateServerTextArea TextArea; var localized string QueryText; var localized string FailureText; var class LinkClass; var class TextAreaClass; var bool bGotMOTD; var string StatusBarText; var bool bHadInitialQuery; var int Tries; var int NumTries; function Created() { Super.Created(); TextArea = UBrowserUpdateServerTextArea(CreateControl(TextAreaClass, 0, 0, WinWidth, WinHeight, Self)); SetAcceptsFocus(); } function Query() { bHadInitialQuery = True; StatusBarText = QueryText; if(Link != None) { Link.UpdateWindow = None; Link.Destroy(); } Link = GetEntryLevel().Spawn(LinkClass); Link.UpdateWindow = Self; Link.QueryUpdateServer(); bGotMOTD = False; } function BeforePaint(Canvas C, float X, float Y) { local UBrowserMainWindow W; if(!bHadInitialQuery) Query(); Super.BeforePaint(C, X, Y); TextArea.SetSize(WinWidth, WinHeight); W = UBrowserMainWindow(GetParent(class'UBrowserMainWindow')); if(StatusBarText == "") W.DefaultStatusBarText(TextArea.StatusURL); else W.DefaultStatusBarText(StatusBarText); } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function SetMOTD(string MOTD) { TextArea.SetHTML(MOTD); } function SetMasterServer(string Value) { ReplaceText(Value, Chr(10), ""); if(Value != "") UBrowserMainClientWindow(UBrowserMainWindow(GetParent(class'UBrowserMainWindow')).ClientArea).NewMasterServer(Value); } function SetIRCServer(string Value) { StripCRLF(Value); if(Value != "") UBrowserMainClientWindow(UBrowserMainWindow(GetParent(class'UBrowserMainWindow')).ClientArea).NewIRCServer(Value); } function Failure() { Link.UpdateWindow = None; Link.Destroy(); Link = None; Tries++; if(Tries < NumTries) { Query(); return; } StatusBarText = FailureText; Tries = 0; } function Success() { StatusBarText = ""; Link.UpdateWindow = None; Link.Destroy(); Link = None; Tries = 0; } function KeyDown(int Key, float X, float Y) { switch(Key) { case 0x74: // IK_F5; TextArea.Clear(); Query(); break; } } zj zu zFzeÄ‹ rz* m'° Ž?€-b EzqDEGýppb - E=zs zÖ|aa0Gn_.0ž 0ía` @ _ò @ a`_aa` z\class UBrowserUpdateServerTextArea expands UWindowHTMLTextArea; var string StatusURL; function LaunchUnrealURL(string URL) { Super.LaunchUnrealURL(URL); GetParent(class'UWindowFramedWindow').Close(); Root.Console.CloseUWindow(); } function BeforePaint(Canvas C, float X, float Y) { StatusURL = ""; Super.BeforePaint(C, X, Y); } function OverURL(string URL) { StatusURL = URL; } ºU@fÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿlBLT¿º»Õx<¤ºµ§+—o û‘]RotatingU.u_a00ÝRotatingU.u_a01ÝRotatingU.u_a02ÝRotatingU.u_a03ÝRotatingU.u_a04ÝRotatingU.u_a05ÝRotatingU.u_a06ÝRotatingU.u_a07ÝRotatingU.u_a08Ý RotatingU.u_a09Ý RotatingU.u_a10Ý RotatingU.u_a11Ý RotatingU.u_a12Ý RotatingU.u_a13ÝRotatingU.u_a14ÝRotatingU.u_a15ÝRotatingU.u_a16ÝRotatingU.u_a17ÝRotatingU.u_a18ÝRotatingU.u_a19ÝRotatingU.u_a20ÝRotatingU.u_a21ÝRotatingU.u_a22ÝRotatingU.u_a23ÝRotatingU.u_a24ÝRotatingU.u_a25ÝRotatingU.u_a26ÝRotatingU.u_a27ÝRotatingU.u_a28ÝRotatingU.u_a29Z"x]! http://www.unrealtournament.comzzf}J«ýr}. .Ë#[–pw}*}gq}. }–0 zsclass UBrowserUpdateServerLink expands UBrowserHTTPClient; var config string UpdateServerAddress; var config int UpdateServerPort; var config int UpdateServerTimeout; var string URIs[10]; var int CurrentURI; var int MaxURI; var UBrowserUpdateServerWindow UpdateWindow; const GetMOTD = 3; const GetFallback = 2; const GetMaster = 1; const GetIRC = 0; function QueryUpdateServer() { SetupURIs(); CurrentURI = MaxURI; BrowseCurrentURI(); } function SetupURIs() { MaxURI = 3; URIs[3] = "/UpdateServer/motd"$Level.EngineVersion$".html"; URIs[2] = "/UpdateServer/motdfallback.html"; URIs[1] = "/UpdateServer/masterserver.txt"; URIs[0] = "/UpdateServer/ircserver.txt"; } function BrowseCurrentURI() { Browse(UpdateServerAddress, URIs[CurrentURI], UpdateServerPort, UpdateServerTimeout); } function Failure() { UpdateWindow.Failure(); } function Success() { UpdateWindow.Success(); } function ProcessData(string Data) { switch(CurrentURI) { case GetMOTD: case GetFallback: UpdateWindow.SetMOTD(Data); break; case GetMaster: UpdateWindow.SetMasterServer(Data); break; case GetIRC: UpdateWindow.SetIRCServer(Data); break; } } ////////////////////////////////////////////////////////////////// // HTTPClient functions ////////////////////////////////////////////////////////////////// function HTTPError(int ErrorCode) { if(ErrorCode == 404 && CurrentURI == GetMOTD) { CurrentURI = GetFallback; BrowseCurrentURI(); } else Failure(); } function HTTPReceivedData(string Data) { ProcessData(Data); if(CurrentURI == MaxURI) CurrentURI--; if(CurrentURI == 0) Success(); else { CurrentURI--; BrowseCurrentURI(); } } zmVI·MV.–KwV*V&<FV.V– zbclass UBrowserSupersetList expands UWindowList; var UBrowserServerListWindow SupersetWindow; zoHg¿Ë†-T(x.–rwx*x-T(x-S(x-d(x.x–D-H-{  zhg ) Òj g Ýg  zÅrn'Åýy ò + zpclass UBrowserSubsetList expands UWindowList; var UBrowserSubsetFact SubsetFactory; var bool bOldElement; zqK DÒ:ÔmkN‚w#*)—#±ëóˆmno%-s'K.–ÉwK*”�K-d-s(­K-T¥oK.K–mù‚-s w#*-T(#qÒÒ–omK.–ÒwK*¤‚‚‚�K-T�K-d„�-K �K-X –om¥oKB-K (-G¶™omÒK.K– zja<É~http://www.unreal://ftp://ftp.telnet://-{ì,-~ì,×-~-{(-[ì, -[-{(-~(-Qì,G-Q-{(-~(-[(-Kì,‹-K-{(-~(-[(-Q(°šÿÿÿÿÝš%ï„„„-K-{-[-Q&Âb-~&C–}9š~,0123456789&ÿÿÿÿC¥ÿ_š}ÿÿÿÿÂ~ ì,ì,ì,ì,çšÿÿÿÿ €F-~&TzI›:a%a$Ca$~,�šÿÿÿÿLwJÅLwJ€vwJ’&àzLL#ffffffzvppCppppÚŠ-Kj›:O%uO=“:$:OÚÎ-{®›:n%¹n=“:$:nÚE-[÷›:n%n$›:O%O$:›:a%a$Ú­-Ql›:a%˜a=“:$:aÚpppp€ záy"d)-Ñ'-ù'áâ–C$ zMclass UBrowserScreenshotCW expands UWindowClientWindow; var Texture Screenshot; var string MapName; function Paint(Canvas C, float MouseX, float MouseY) { local float X, Y, W, H; local int i; local string M; local UBrowserServerList L; L = UBrowserInfoClientWindow(GetParent(class'UBrowserInfoClientWindow')).Server; if( L != None ) { M = L.MapName; if( M != MapName ) { MapName = M; if( MapName == "" ) ScreenShot = None; else { i = InStr(Caps(MapName), ".UNR"); if(i != -1) MapName = Left(MapName, i); Screenshot = Texture(DynamicLoadObject(MapName$".Screenshot", class'Texture')); } } } else { ScreenShot = None; MapName = ""; } DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); if(Screenshot != None) { W = Min(WinWidth, Screenshot.USize); H = Min(WinHeight, Screenshot.VSize); if(W > H) W = H; if(H > W) H = W; X = (WinWidth - W) / 2; Y = (WinHeight - H) / 2; DrawStretchedTexture(C, X, Y, W, H, Screenshot); } } z] //============================================================================= // UBrowserToolbar - the toolbar! //============================================================================= class UBrowserBannerBar extends UWindowWindow; var UBrowserBannerAd BannerAdWindow; function Paint(Canvas C, float X, float Y) { C.Style = GetPlayerOwner().ERenderStyle.STY_Modulated; Tile(C, Texture'Background'); C.Style = GetPlayerOwner().ERenderStyle.STY_Normal; } function Created() { Super.Created(); BannerAdWindow = UBrowserBannerAd(CreateWindow(class'UBrowserBannerAd', 0, 2, 256, 64)); } function BeforePaint(Canvas C, float X, float Y) { BannerAdWindow.WinLeft = (WinWidth - 256) / 2; } zz(class UBrowserSubsetFact extends UBrowserServerListFactory; // Config var() config string GameMode; var() config string GameType; var() config float Ping; var() config name SupersetTag; var() config bool bLocalServersOnly; var() config bool bCompatibleServersOnly; var() config int MinPlayers; var() config int MaxPing; // Errors var localized string NotFoundError; var localized string NotReadyError; var UBrowserServerListWindow SupersetWindow; function Query(optional bool bBySuperset, optional bool bInitial) { local UBrowserMainClientWindow W; local int i; local UBrowserServerList l, List; Super.Query(bBySuperset, bInitial); W = UBrowserMainClientWindow(Owner.Owner.GetParent(class'UBrowserMainClientWindow')); for(i=0;i<20;i++) { if(W.ServerListNames[i] == SupersetTag) { SupersetWindow = W.FactoryWindows[i]; List = W.FactoryWindows[i].PingedList; break; } } if(SupersetWindow != None) { SupersetWindow.AddSubset(Self); Owner.Owner.AddSuperSet(SupersetWindow); } else { QueryFinished(False, NotFoundError$SupersetTag); } if(List == None) { QueryFinished(False, NotReadyError$SupersetTag); } else { if(!bBySuperset && !bInitial) { List.Owner.Refresh(); return; } for(l = UBrowserServerList(List.Next);l != None;l = UBrowserServerList(l.Next)) ConsiderItem(l); QueryFinished(True); } } function Shutdown(optional bool bBySuperset) { Super.Shutdown(bBySuperset); SupersetWindow.RemoveSubset(Self); } function ConsiderItem(UBrowserServerList L) { local UBrowserServerList NewItem; local int MinNetVer; local int GameVer; if(!L.bPinged) return; if(bLocalServersOnly && !L.bLocalServer) return; MinNetVer = int(Owner.Owner.GetPlayerOwner().Level.MinNetVersion); GameVer = int(Owner.Owner.GetPlayerOwner().Level.EngineVersion); if(bCompatibleServersOnly && (L.MinNetVer > GameVer || MinNetVer > L.GameVer)) return; if(GameMode != "" && GameMode != L.GameMode) return; if(GameType != "" && GameType != L.GameType) return; if(MinPlayers != 0 && L.NumPlayers < MinPlayers) return; if(MaxPing != 0 && L.Ping > MaxPing) return; if( PingedList.FindExistingServer( L.IP, L.QueryPort ) != None) return; NewItem = UBrowserServerList(Owner.CopyExistingListItem(L.Class, L)); NewItem.Remove(); PingedList.AppendItem(NewItem); Owner.bNeedUpdateCount = True; } function QueryFinished(bool bSuccess, optional string ErrorMsg) { Super.QueryFinished(bSuccess, ErrorMsg); } zusBÿÙx–tw*]‚z.9sš._r.– * zçwt ..zÝÝj çt r q  z|z sZW lz  z€zzgä//============================================================================= // UBrowserServerPing: Query an Unreal server for its details //============================================================================= class UBrowserServerPing extends UdpLink; var UBrowserServerList Server; var IpAddr ServerIPAddr; var float RequestSentTime; var float LastDelta; var name QueryState; var bool bInitial; var bool bJustThisServer; var bool bNoSort; var int PingAttempts; var int AttemptNumber; var int BindAttempts; var localized string AdminEmailText; var localized string AdminNameText; var localized string ChangeLevelsText; var localized string MultiplayerBotsText; var localized string FragLimitText; var localized string TimeLimitText; var localized string GameModeText; var localized string GameTypeText; var localized string GameVersionText; var localized string WorldLogText; var localized string MutatorsText; var localized string TrueString; var localized string FalseString; var localized string ServerAddressText; var localized string GoalTeamScoreText; var localized string MinPlayersText; var localized string PlayersText; var localized string MaxTeamsText; var localized string BalanceTeamsText; var localized string PlayersBalanceTeamsText; var localized string FriendlyFireText; var localized string MinNetVersionText; var localized string BotSkillText; var localized string TournamentText; var localized string ServerModeText; var localized string DedicatedText; var localized string NonDedicatedText; var localized string WorldLogWorkingText; var localized string WorldLogWorkingTrue; var localized string WorldLogWorkingFalse; var localized string PasswordText; // config var config int MaxBindAttempts; var config int BindRetryTime; var config int PingTimeout; var config bool bUseMapName; function ValidateServer() { if(Server.ServerPing != Self) { Log("ORPHANED: "$Self); Destroy(); } } function StartQuery(name S, int InPingAttempts) { QueryState = S; ValidateServer(); ServerIPAddr.Port = Server.QueryPort; GotoState('Resolving'); PingAttempts=InPingAttempts; AttemptNumber=1; } function Resolved( IpAddr Addr ) { ServerIPAddr.Addr = Addr.Addr; GotoState('Binding'); } function bool GetNextValue(string In, out string Out, out string Result) { local int i; local bool bFoundStart; Result = ""; bFoundStart = False; for(i=0;i= 406 ) { if( Value ~= "True" ) AddRule(WorldLogWorkingText, WorldLogWorkingTrue); else AddRule(WorldLogWorkingText, WorldLogWorkingFalse); } else AddRule(WorldLogText, LocalizeBoolValue(Value)); } else if(Value ~= "mutators") { bOK = GetNextValue(In, Out, Value); AddRule(MutatorsText, Value); } else if(Value ~= "goalteamscore") { bOK = GetNextValue(In, Out, Value); AddRule(GoalTeamScoreText, Value); } else if(Value ~= "minplayers") { bOK = GetNextValue(In, Out, Value); if(Value == "0") AddRule(MultiplayerBotsText, FalseString); else AddRule(MinPlayersText, Value@PlayersText); } else if(Value ~= "changelevels") { bOK = GetNextValue(In, Out, Value); AddRule(ChangeLevelsText, LocalizeBoolValue(Value)); } else if(Value ~= "botskill") { bOK = GetNextValue(In, Out, Value); AddRule(BotSkillText, Value); } else if(Value ~= "maxteams") { bOK = GetNextValue(In, Out, Value); AddRule(MaxTeamsText, Value); } else if(Value ~= "balanceteams") { bOK = GetNextValue(In, Out, Value); AddRule(BalanceTeamsText, LocalizeBoolValue(Value)); } else if(Value ~= "playersbalanceteams") { bOK = GetNextValue(In, Out, Value); AddRule(PlayersBalanceTeamsText, LocalizeBoolValue(Value)); } else if(Value ~= "friendlyfire") { bOK = GetNextValue(In, Out, Value); AddRule(FriendlyFireText, Value); } else if(Value ~= "gamestyle") { bOK = GetNextValue(In, Out, Value); AddRule(GameModeText, Value); } else if(Value ~= "tournament") { bOK = GetNextValue(In, Out, Value); AddRule(TournamentText, LocalizeBoolValue(Value)); } else if(Value ~= "listenserver") { bOK = GetNextValue(In, Out, Value); if(bool(Value)) AddRule(ServerModeText, NonDedicatedText); else AddRule(ServerModeText, DedicatedText); } else if(Value ~= "password") { bOK = GetNextValue(In, Out, Value); AddRule(PasswordText, LocalizeBoolValue(Value)); } } until(!bOK); } event Timer() { if(AttemptNumber < PingAttempts) { Log("Timed out getting player replies. Attempt "$AttemptNumber); AttemptNumber++; GotoState(QueryState); } else { Server.StatusDone(False); Log("Timed out getting player replies. Giving Up"); } } Begin: // Player info ValidateServer(); if(Server.PlayerList != None) { Server.PlayerList.DestroyList(); } Server.PlayerList = New(None) class'UBrowserPlayerList'; Server.PlayerList.SetupSentinel(); if(Server.RulesList != None) { Server.RulesList.DestroyList(); } Server.RulesList = New(None) class'UBrowserRulesList'; Server.RulesList.SetupSentinel(); AddRule(ServerAddressText, "unreal://"$Server.IP$":"$string(Server.GamePort)); SendText( ServerIPAddr, "\\status\\" ); SetTimer(PingTimeout + FRand(), False); } function string ParseReply(string Text, string Key) { local int i; local string Temp; i=InStr(Text, "\\"$Key$"\\"); Temp = Mid(Text, i + Len(Key) + 2); return Left(Temp, InStr(Temp, "\\")); } state GetInfo { event ReceivedText(IpAddr Addr, string Text) { local string Temp; local float ElapsedTime; // Make sure this packet really is for us. Temp = IpAddrToString(Addr); if(Server.IP != Left(Temp, InStr(Temp, ":"))) return; ValidateServer(); ElapsedTime = (Level.TimeSeconds - RequestSentTime) * Level.TimeDilation; Server.Ping = Max(1000*ElapsedTime - (0.5*LastDelta) - 10, 4); // subtract avg client and server frametime from ping. if(!Server.bKeepDescription) Server.HostName = Server.IP; Server.GamePort = 0; Server.MapName = ""; Server.MapTitle = ""; Server.MapDisplayName = ""; Server.GameType = ""; Server.GameMode = ""; Server.NumPlayers = 0; Server.MaxPlayers = 0; Server.GameVer = 0; Server.MinNetVer = 0; Temp = ParseReply(Text, "hostname"); if(Temp != "" && !Server.bKeepDescription) Server.HostName = Temp; Temp = ParseReply(Text, "hostport"); if(Temp != "") Server.GamePort = Int(Temp); Temp = ParseReply(Text, "mapname"); if(Temp != "") Server.MapName = Temp; Temp = ParseReply(Text, "maptitle"); if(Temp != "") { Server.MapTitle = Temp; Server.MapDisplayName = Server.MapTitle; if(Server.MapTitle == "" || Server.MapTitle ~= "Untitled" || bUseMapName) Server.MapDisplayName = Server.MapName; } Temp = ParseReply(Text, "gametype"); if(Temp != "") Server.GameType = Temp; Temp = ParseReply(Text, "numplayers"); if(Temp != "") Server.NumPlayers = Int(Temp); Temp = ParseReply(Text, "maxplayers"); if(Temp != "") Server.MaxPlayers = Int(Temp); Temp = ParseReply(Text, "gamemode"); if(Temp != "") Server.GameMode = Temp; Temp = ParseReply(Text, "gamever"); if(Temp != "") Server.GameVer = Int(Temp); Temp = ParseReply(Text, "minnetver"); if(Temp != "") Server.MinNetVer = Int(Temp); if( Server.DecodeServerProperties(Text) ) { Server.PingDone(bInitial, bJustThisServer, True, bNoSort); Disable('Tick'); } } event Tick(Float DeltaTime) { LastDelta = DeltaTime; } event Timer() { ValidateServer(); if(AttemptNumber < PingAttempts) { Log("Ping Timeout from "$Server.IP$". Attempt "$AttemptNumber); AttemptNumber++; GotoState(QueryState); } else { Log("Ping Timeout from "$Server.IP$" Giving Up"); Server.Ping = 9999; Server.GamePort = 0; Server.MapName = ""; Server.MapDisplayName = ""; Server.MapTitle = ""; Server.GameType = ""; Server.GameMode = ""; Server.NumPlayers = 0; Server.MaxPlayers = 0; Disable('Tick'); Server.PingDone(bInitial, bJustThisServer, False, bNoSort); } } Begin: Enable('Tick'); SendText( ServerIPAddr, "\\info\\" ); RequestSentTime = Level.TimeSeconds; SetTimer(PingTimeout + FRand(), False); } state Resolving { Begin: Resolve( Server.IP ); } z{A2 à .Ë#± z€z¤zË@uBŠi7.Ëu;7-v.;-v79.;97_.;_7&.;&7=.;=7F.;F7P.;P7R.;R7l.;l7P.;P7_.;_7N.;N7c.;c7k.;k7C.;C7].;]7-B.;-B7 zG}V4¹ÊZ|€V,/me \KHV,K(tQV,È�z€V&/K VÈÈ{VKKHVK(wQV zHV GNÜE%&p¨¨p*** V { Q.W lV  z7€zŠzE //============================================================================= // UBrowserBannerAd //============================================================================= class UBrowserBannerAd extends UWindowWindow; #exec TEXTURE IMPORT NAME=BannerAd FILE=Textures\logo3.pcx GROUP="Icons" FLAGS=2 MIPS=OFF var string URL; function Created() { URL = "http://www.unreal.com"; Cursor = Root.HandCursor; } function Paint(Canvas C, float X, float Y) { DrawClippedTexture(C, 0, 0, Texture'BannerAd'); } function Click(float X, float Y) { Root.Console.ViewPort.Actor.ConsoleCommand("start "$URL); } function MouseLeave() { Super.MouseLeave(); ToolTip(""); } function MouseEnter() { Super.MouseLeave(); ToolTip(URL); } zÊBv J)þD¥è.Ë#SJ.v .s  zCQ HHUE%&p¨¨p*** Q z Q.W LQ  zÓ|q6™2$-h  å70Ó-q z€zzÒGZv/¤#ÒZ.Ë-\' zLM@>¸ÎG' 2zG'é M%x–M, n|MMG' @M¥M9ƒ�-C ' SGì—'Ú¼, 'Ú¼ä—B.¸'Ú¼–M%ƒ–M, kwB*MMBßB.¸B–yMM¥Mb'Yž Œ.ʳ @G zýKg7.4g.Ëý2wg*g-\' z\’//============================================================================= // UBrowserServerGrid - base class for server listings //============================================================================= class UBrowserServerGrid extends UWindowGrid; #exec TEXTURE IMPORT NAME=Highlight FILE=Textures\Highlight.bmp GROUP="Icons" FLAGS=2 MIPS=OFF var UBrowserRightClickMenu Menu; var UWindowGridColumn Server, Ping, MapName, Players, SortByColumn; var bool bSortDescending; var localized string ServerName, PingName, MapNameName, PlayersName; var UBrowserServerList SelectedServer; var int Count; var float TimePassed; var int AutoPingInterval; var UBrowserServerList OldPingServer; function Created() { Super.Created(); RowHeight = 12; CreateColumns(); Menu = UBrowserRightClickMenu(Root.CreateWindow(UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).RightClickMenuClass, 0, 0, 100, 100, Self)); Menu.HideWindow(); } function Close(optional bool bByParent) { Super.Close(bByParent); if(Menu != None && Menu.bWindowVisible) Menu.CloseUp(); } function CreateColumns() { Server = AddColumn(ServerName, 300); Ping = AddColumn(PingName, 30); MapName = AddColumn(MapNameName, 100); Players = AddColumn(PlayersName, 50); SortByColumn = Ping; } function DrawCell(Canvas C, float X, float Y, UWindowGridColumn Column, UBrowserServerList List) { switch(Column) { case Server: Column.ClipText( C, X, Y, List.HostName ); break; case Ping: Column.ClipText( C, X, Y, Int(List.Ping) ); break; case MapName: Column.ClipText( C, X, Y, List.MapDisplayName ); break; case Players: Column.ClipText( C, X, Y, List.NumPlayers$"/"$List.MaxPlayers ); break; } } function PaintColumn(Canvas C, UWindowGridColumn Column, float MouseX, float MouseY) { local UBrowserServerList List; local float Y; local int Visible; local int Skipped; local int TopMargin; local int BottomMargin; C.Font = Root.Fonts[F_Normal]; List = UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).PingedList; if(List == None) Count = 0; else Count = List.Count(); if(bShowHorizSB) BottomMargin = LookAndFeel.Size_ScrollbarWidth; else BottomMargin = 0; TopMargin = LookAndFeel.ColumnHeadingHeight; Visible = int((WinHeight - (TopMargin + BottomMargin))/RowHeight); VertSB.SetRange(0, Count+1, Visible); TopRow = VertSB.Pos; Skipped = 0; List = UBrowserServerList(List.Next); if(List != None) { Y = 1; while((Y < RowHeight + WinHeight - RowHeight - (TopMargin + BottomMargin)) && (List != None)) { // FIXME: make more efficient - cache top server in list if TopRow doesn't change if(Skipped >= VertSB.Pos) { // Draw highlight if(List == SelectedServer) Column.DrawStretchedTexture( C, 0, Y-1 + TopMargin, Column.WinWidth, RowHeight + 1, Texture'Highlight'); DrawCell(C, 2, Y + TopMargin, Column, List); Y = Y + RowHeight; } Skipped ++; List = UBrowserServerList(List.Next); } } } function SortColumn(UWindowGridColumn Column) { if(SortByColumn == Column) bSortDescending = !bSortDescending; else bSortDescending = False; SortByColumn = Column; UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).PingedList.Sort(); } function Tick(float DeltaTime) { local UBrowserServerListWindow W; W = UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')); if(W.PingState == PS_Done && SelectedServer == None) { SelectedServer = UBrowserServerList(W.PingedList.Next); if(SelectedServer == None || SelectedServer.bPinging) SelectedServer = None; else UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).AutoInfo(SelectedServer); } if(W.PingState == PS_Done) { if(TimePassed >= AutoPingInterval) { TimePassed = 0; if(SelectedServer != OldPingServer) { if(OldPingServer != None) OldPingServer.CancelPing(); OldPingServer = SelectedServer; } if(SelectedServer != None && !SelectedServer.bPinging) SelectedServer.PingServer(False, True, True); } TimePassed = TimePassed + DeltaTime; } } function SelectRow(int Row) { local UBrowserServerList S; S = GetServerUnderRow(Row); if(SelectedServer != S) { if(S != None) UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).AutoInfo(S); TimePassed = 0; } if(S != None) SelectedServer = S; } function RightClickRow(int Row, float X, float Y) { local float MenuX, MenuY; WindowToGlobal(X, Y, MenuX, MenuY); Menu.WinLeft = MenuX; Menu.WinTop = MenuY; Menu.List = GetServerUnderRow(Row); Menu.Grid = Self; Menu.ShowWindow(); } function UBrowserServerList GetServerUnderRow(int Row) { local int i; local UBrowserServerList List; List = UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).PingedList; if(List != None) { i = 0; List = UBrowserServerList(List.Next); while(List != None) { if(i == Row) return List; List = UBrowserServerList(List.Next); i++; } } return None; } function int GetSelectedRow() { local int i; local UBrowserServerList List; List = UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).PingedList; if(List != None) { i = 0; List = UBrowserServerList(List.Next); while(List != None) { if(List == SelectedServer) return i; List = UBrowserServerList(List.Next); i++; } } return -1; } function JoinServer(UBrowserServerList Server) { if(Server != None && Server.GamePort != 0) { GetPlayerOwner().ClientTravel("unreal://"$Server.IP$":"$Server.GamePort$UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).URLAppend, TRAVEL_Absolute, false); GetParent(class'UWindowFramedWindow').Close(); Root.Console.CloseUWindow(); } } function DoubleClickRow(int Row) { local UBrowserServerList Server; Server = GetServerUnderRow(Row); if(SelectedServer != Server) return; JoinServer(Server); } function MouseLeaveColumn(UWindowGridColumn Column) { ToolTip(""); } function KeyDown(int Key, float X, float Y) { switch(Key) { case 0x74: // IK_F5; Refresh(); break; case 0x26: // IK_Up SelectRow(Clamp(GetSelectedRow() - 1, 0, Count - 1)); VertSB.Show(GetSelectedRow()); break; case 0x28: // IK_Down SelectRow(Clamp(GetSelectedRow() + 1, 0, Count - 1)); VertSB.Show(GetSelectedRow()); break; case 0x0D: // IK_Enter: DoubleClickRow(GetSelectedRow()); break; default: Super.KeyDown(Key, X, Y); break; } } function int Compare(UBrowserServerList T, UBrowserServerList B) { switch(SortByColumn) { case Server: return ByName(T, B); case Ping: return ByPing(T, B); case MapName: return ByMap(T, B); case Players: return ByPlayers(T, B); default: return 0; } } function int ByPing(UBrowserServerList T, UBrowserServerList B) { local int Result; if(B == None) return -1; if(T.Ping < B.Ping) { Result = -1; } else if (T.Ping > B.Ping) { Result = 1; } else { /* if(T.HostName < B.HostName) Result = -1; else if(T.HostName > B.HostName) Result = 1; else */ Result = 0; } if(bSortDescending) Result = -Result; return Result; } function int ByName(UBrowserServerList T, UBrowserServerList B) { local int Result; if(B == None) return -1; if(T.Ping == 9999) return 1; if(B.Ping == 9999) return -1; if(T.HostName < B.HostName) { Result = -1; } else if (T.HostName > B.HostName) { Result = 1; } else { Result = 0;//T.Ping - B.Ping; } if(bSortDescending) Result = -Result; return Result; } function int ByMap(UBrowserServerList T, UBrowserServerList B) { local int Result; if(B == None) return -1; if(T.Ping == 9999) return 1; if(B.Ping == 9999) return -1; if(T.MapDisplayName < B.MapDisplayName) { Result = -1; } else if (T.MapDisplayName > B.MapDisplayName) { Result = 1; } else { Result = T.Ping - B.Ping; } if(bSortDescending) Result = -Result; return Result; } function int ByPlayers(UBrowserServerList T, UBrowserServerList B) { local int Result; if(B == None) return -1; if(T.Ping == 9999) return 1; if(B.Ping == 9999) return -1; if(T.NumPlayers > B.NumPlayers) { Result = -1; } else if (T.NumPlayers < B.NumPlayers) { Result = 1; } else { if (T.MaxPlayers > B.MaxPlayers) { Result = -1; } else if(T.MaxPlayers < B.MaxPlayers) { Result = 1; } else { Result = T.Ping - B.Ping; } } if(bSortDescending) Result = -Result; return Result; } function ShowInfo(UBrowserServerList List) { UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).ShowInfo(List); } function Refresh() { UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).Refresh(); } function RefreshServer() { TimePassed = AutoPingInterval; } function RePing() { UBrowserServerListWindow(GetParent(class'UBrowserServerListWindow')).RePing(); } zMrHDO %S%N %r.–}wr*¥O ¡Src¡N rkr.r–% zW×class UBrowserServerListWindow extends UWindowPageWindow PerObjectConfig; var config string ServerListTitle; // Non-localized page title var config string ListFactories[10]; var config string URLAppend; var config int AutoRefreshTime; var config bool bNoAutoSort; var config bool bHidden; var config bool bFallbackFactories; var string ServerListClassName; var class ServerListClass; var UBrowserServerList PingedList; var UBrowserServerList UnpingedList; var UBrowserServerListFactory Factories[10]; var int QueryDone[10]; var UBrowserServerGrid Grid; var string GridClass; var float TimeElapsed; var bool bPingSuspend; var bool bPingResume; var bool bPingResumeIntial; var bool bNoSort; var bool bSuspendPingOnClose; var UBrowserSubsetList SubsetList; var UBrowserSupersetList SupersetList; var class RightClickMenuClass; var bool bShowFailedServers; var bool bHadInitialRefresh; var int FallbackFactory; var UWindowVSplitter VSplitter; var UBrowserInfoWindow InfoWindow; var UBrowserInfoClientWindow InfoClient; var UBrowserServerList InfoItem; var localized string InfoName; const MinHeightForSplitter = 384; var localized string PlayerCountLeader; var localized string ServerCountLeader; // Status info enum EPingState { PS_QueryServer, PS_QueryFailed, PS_Pinging, PS_RePinging, PS_Done }; var localized string PlayerCountName; var localized string ServerCountName; var localized string QueryServerText; var localized string QueryFailedText; var localized string PingingText; var localized string CompleteText; var string ErrorString; var EPingState PingState; function WindowShown() { local UBrowserSupersetList l; Super.WindowShown(); if(VSplitter.bWindowVisible) { if(UWindowVSplitter(InfoClient.ParentWindow) != None) VSplitter.SplitPos = UWindowVSplitter(InfoClient.ParentWindow).SplitPos; InfoClient.SetParent(VSplitter); } InfoClient.Server = InfoItem; if(InfoItem != None) InfoWindow.WindowTitle = InfoName$" - "$InfoItem.HostName; else InfoWindow.WindowTitle = InfoName; ResumePinging(); for(l = UBrowserSupersetList(SupersetList.Next); l != None; l = UBrowserSupersetList(l.Next)) l.SuperSetWindow.ResumePinging(); } function WindowHidden() { local UBrowserSupersetList l; Super.WindowHidden(); SuspendPinging(); for(l = UBrowserSupersetList(SupersetList.Next); l != None; l = UBrowserSupersetList(l.Next)) l.SuperSetWindow.SuspendPinging(); } function SuspendPinging() { if(bSuspendPingOnClose) bPingSuspend = True; } function ResumePinging() { if(!bHadInitialRefresh) Refresh(False, True); bPingSuspend = False; if(bPingResume) { bPingResume = False; UnpingedList.PingNext(bPingResumeIntial, bNoSort); } } function Created() { local Class C; ServerListClass = class(DynamicLoadObject(ServerListClassName, class'Class')); C = class(DynamicLoadObject(GridClass, class'Class')); Grid = UBrowserServerGrid(CreateWindow(C, 0, 0, WinWidth, WinHeight)); Grid.SetAcceptsFocus(); SubsetList = new class'UBrowserSubsetList'; SubsetList.SetupSentinel(); SupersetList = new class'UBrowserSupersetList'; SupersetList.SetupSentinel(); VSplitter = UWindowVSplitter(CreateWindow(class'UWindowVSplitter', 0, 0, WinWidth, WinHeight)); VSplitter.SetAcceptsFocus(); VSplitter.MinWinHeight = 60; VSplitter.HideWindow(); InfoWindow = UBrowserMainClientWindow(GetParent(class'UBrowserMainClientWindow')).InfoWindow; InfoClient = UBrowserInfoClientWindow(InfoWindow.ClientArea); if(Root.WinHeight >= MinHeightForSplitter) ShowInfoArea(True, False); } function ShowInfoArea(bool bShow, optional bool bFloating, optional bool bNoActivate) { if(bShow) { if(bFloating) { VSplitter.HideWindow(); VSplitter.TopClientWindow = None; VSplitter.BottomClientWindow = None; InfoClient.SetParent(InfoWindow); Grid.SetParent(Self); Grid.SetSize(WinWidth, WinHeight); if(!InfoWindow.bWindowVisible) InfoWindow.ShowWindow(); if(!bNoActivate) InfoWindow.BringToFront(); } else { InfoWindow.HideWindow(); VSplitter.ShowWindow(); VSplitter.SetSize(WinWidth, WinHeight); Grid.SetParent(VSplitter); InfoClient.SetParent(VSplitter); VSplitter.TopClientWindow = Grid; VSplitter.BottomClientWindow = InfoClient; } } else { InfoWindow.HideWindow(); VSplitter.HideWindow(); VSplitter.TopClientWindow = None; VSplitter.BottomClientWindow = None; InfoClient.SetParent(InfoWindow); Grid.SetParent(Self); Grid.SetSize(WinWidth, WinHeight); } } function AutoInfo(UBrowserServerList I) { if(Root.WinHeight >= MinHeightForSplitter || InfoWindow.bWindowVisible) ShowInfo(I, True); } function ShowInfo(UBrowserServerList I, optional bool bAutoInfo) { if(I == None) return; ShowInfoArea(True, Root.WinHeight < MinHeightForSplitter, bAutoInfo); InfoItem = I; InfoClient.Server = InfoItem; InfoWindow.WindowTitle = InfoName$" - "$InfoItem.HostName; I.ServerStatus(); } function ResolutionChanged(float W, float H) { if(Root.WinHeight >= MinHeightForSplitter) ShowInfoArea(True, False); else ShowInfoArea(False, True); if(InfoWindow != None) InfoWindow.ResolutionChanged(W, H); Super.ResolutionChanged(W, H); } function Resized() { Super.Resized(); if(VSplitter.bWindowVisible) { VSplitter.SetSize(WinWidth, WinHeight); VSplitter.OldWinHeight = VSplitter.WinHeight; VSplitter.SplitPos = VSplitter.WinHeight - Min(VSplitter.WinHeight / 2, 250); } else Grid.SetSize(WinWidth, WinHeight); } function AddSubset(UBrowserSubsetFact Subset) { local UBrowserSubsetList l; for(l = UBrowserSubsetList(SubsetList.Next); l != None; l = UBrowserSubsetList(l.Next)) if(l.SubsetFactory == Subset) return; l = UBrowserSubsetList(SubsetList.Append(class'UBrowserSubsetList')); l.SubsetFactory = Subset; } function AddSuperSet(UBrowserServerListWindow Superset) { local UBrowserSupersetList l; for(l = UBrowserSupersetList(SupersetList.Next); l != None; l = UBrowserSupersetList(l.Next)) if(l.SupersetWindow == Superset) return; l = UBrowserSupersetList(SupersetList.Append(class'UBrowserSupersetList')); l.SupersetWindow = Superset; } function RemoveSubset(UBrowserSubsetFact Subset) { local UBrowserSubsetList l; for(l = UBrowserSubsetList(SubsetList.Next); l != None; l = UBrowserSubsetList(l.Next)) if(l.SubsetFactory == Subset) l.Remove(); } function RemoveSuperset(UBrowserServerListWindow Superset) { local UBrowserSupersetList l; for(l = UBrowserSupersetList(SupersetList.Next); l != None; l = UBrowserSupersetList(l.Next)) if(l.SupersetWindow == Superset) l.Remove(); } function UBrowserServerList AddFavorite(UBrowserServerList Server) { return UBrowserServerListWindow(UBrowserMainClientWindow(GetParent(class'UBrowserMainClientWindow')).Favorites.Page).AddFavorite(Server); } function Refresh(optional bool bBySuperset, optional bool bInitial, optional bool bSaveExistingList, optional bool bInNoSort) { bHadInitialRefresh = True; if(!bSaveExistingList) { InfoItem = None; InfoClient.Server = None; } if(!bSaveExistingList && PingedList != None) { PingedList.DestroyList(); PingedList = None; Grid.SelectedServer = None; } if(PingedList == None) { PingedList=New ServerListClass; PingedList.Owner = Self; PingedList.SetupSentinel(True); PingedList.bSuspendableSort = True; } else { TagServersAsOld(); } if(UnpingedList != None) UnpingedList.DestroyList(); if(!bSaveExistingList) { UnpingedList = New ServerListClass; UnpingedList.Owner = Self; UnpingedList.SetupSentinel(False); } PingState = PS_QueryServer; ShutdownFactories(bBySuperset); CreateFactories(bSaveExistingList); Query(bBySuperset, bInitial, bInNoSort); if(!bInitial) RefreshSubsets(); } function TagServersAsOld() { local UBrowserServerList l; for(l = UBrowserServerList(PingedList.Next);l != None;l = UBrowserServerList(l.Next)) l.bOldServer = True; } function RemoveOldServers() { local UBrowserServerList l, n; l = UBrowserServerList(PingedList.Next); while(l != None) { n = UBrowserServerList(l.Next); if(l.bOldServer) { if(Grid.SelectedServer == l) Grid.SelectedServer = n; l.Remove(); } l = n; } } function RefreshSubsets() { local UBrowserSubsetList l, NextSubset; for(l = UBrowserSubsetList(SubsetList.Next); l != None; l = UBrowserSubsetList(l.Next)) l.bOldElement = True; l = UBrowserSubsetList(SubsetList.Next); while(l != None && l.bOldElement) { NextSubset = UBrowserSubsetList(l.Next); l.SubsetFactory.Owner.Owner.Refresh(True); l = NextSubset; } } function RePing() { PingState = PS_RePinging; PingedList.InvalidatePings(); PingedList.PingServers(True, False); } function QueryFinished(UBrowserServerListFactory Fact, bool bSuccess, optional string ErrorMsg) { local int i; local bool bDone; bDone = True; for(i=0;i<10;i++) { if(Factories[i] != None) { if(Factories[i] == Fact) QueryDone[i] = 1; if(QueryDone[i] == 0) bDone = False; } } if(!bSuccess) { PingState = PS_QueryFailed; ErrorString = ErrorMsg; // don't ping and report success if we have no servers. if(bDone && UnpingedList.Count() == 0) { if( bFallbackFactories ) { FallbackFactory++; if( ListFactories[FallbackFactory] != "" ) Refresh(); // try the next fallback master server else FallbackFactory = 0; } return; } } else ErrorString = ""; if(bDone) { RemoveOldServers(); PingState = PS_Pinging; if(!bNoSort && !Fact.bIncrementalPing) PingedList.Sort(); UnpingedList.PingServers(True, bNoSort || Fact.bIncrementalPing); } } function PingFinished() { PingState = PS_Done; } function CreateFactories(bool bUsePingedList) { local int i; for(i=0;i<10;i++) { if(ListFactories[i] == "") break; if(!bFallbackFactories || FallbackFactory == i) { Factories[i] = UBrowserServerListFactory(BuildObjectWithProperties(ListFactories[i])); Factories[i].PingedList = PingedList; Factories[i].UnpingedList = UnpingedList; if(bUsePingedList) Factories[i].Owner = PingedList; else Factories[i].Owner = UnpingedList; } QueryDone[i] = 0; } } function ShutdownFactories(optional bool bBySuperset) { local int i; for(i=0;i<10;i++) { if(Factories[i] != None) { Factories[i].Shutdown(bBySuperset); Factories[i] = None; } } } function Query(optional bool bBySuperset, optional bool bInitial, optional bool bInNoSort) { local int i; bNoSort = bInNoSort; // Query all our factories for(i=0;i<10;i++) { if(Factories[i] != None) Factories[i].Query(bBySuperset, bInitial); } } function Paint(Canvas C, float X, float Y) { DrawStretchedTexture(C, 0, 0, WinWidth, WinHeight, Texture'BlackTexture'); } function Tick(float Delta) { PingedList.Tick(Delta); if(PingedList.bNeedUpdateCount) { PingedList.UpdateServerCount(); PingedList.bNeedUpdateCount = False; } // AutoRefresh local servers if(AutoRefreshTime > 0) { TimeElapsed += Delta; if(TimeElapsed > AutoRefreshTime) { TimeElapsed = 0; Refresh(,,True, bNoAutoSort); } } } function BeforePaint(Canvas C, float X, float Y) { local UBrowserMainWindow W; local UBrowserSupersetList l; local EPingState P; local int PercentComplete; local int TotalReturnedServers; local string E; local int TotalServers; local int PingedServers; local int MyServers; Super.BeforePaint(C, X, Y); W = UBrowserMainWindow(GetParent(class'UBrowserMainWindow')); l = UBrowserSupersetList(SupersetList.Next); if(l != None && PingState != PS_RePinging) { P = l.SupersetWindow.PingState; PingState = P; if(P == PS_QueryServer) TotalReturnedServers = l.SupersetWindow.UnpingedList.Count(); PingedServers = l.SupersetWindow.PingedList.Count(); TotalServers = l.SupersetWindow.UnpingedList.Count() + PingedServers; MyServers = PingedList.Count(); E = l.SupersetWindow.ErrorString; } else { P = PingState; if(P == PS_QueryServer) TotalReturnedServers = UnpingedList.Count(); PingedServers = PingedList.Count(); TotalServers = UnpingedList.Count() + PingedServers; MyServers = PingedList.Count(); E = ErrorString; } if(TotalServers > 0) PercentComplete = PingedServers*100.0/TotalServers; switch(P) { case PS_QueryServer: if(TotalReturnedServers > 0) W.DefaultStatusBarText(QueryServerText$" ("$ServerCountLeader$TotalReturnedServers$" "$ServerCountName$")"); else W.DefaultStatusBarText(QueryServerText); break; case PS_QueryFailed: W.DefaultStatusBarText(QueryFailedText$E); break; case PS_Pinging: case PS_RePinging: W.DefaultStatusBarText(PingingText$" "$PercentComplete$"% "$CompleteText$". "$ServerCountLeader$MyServers$" "$ServerCountName$", "$PlayerCountLeader$PingedList.TotalPlayers$" "$PlayerCountName); break; case PS_Done: W.DefaultStatusBarText(ServerCountLeader$MyServers$" "$ServerCountName$", "$PlayerCountLeader$PingedList.TotalPlayers$" "$PlayerCountName); break; } } zORFR< ' zS€@zz€zz}//============================================================================= // UBrowserServerListFactory // An abstract class to add servers to an existing server list. // eg GameSpy, HTTP master servers, favorites list, etc //============================================================================= class UBrowserServerListFactory extends UWindowList abstract; var UBrowserServerList PingedList; var UBrowserServerList UnpingedList; var UBrowserServerList Owner; var bool bIncrementalPing; // Servers are pinged as they come in function Query(optional bool bBySuperset, optional bool bInitial) { } function Shutdown(optional bool bBySuperset) { Owner = None; PingedList = None; UnpingedList = None; } function QueryFinished(bool bSuccess, optional string ErrorMsg) { Owner.QueryFinished(Self, bSuccess, ErrorMsg); } function UBrowserServerList FoundServer(string IP, int QueryPort, string Category, string GameName, optional string HostName) { local UBrowserServerList NewListEntry; NewListEntry = Owner.FindExistingServer(IP, QueryPort); // Don't add if it's already in the existing list if(NewListEntry == None) { // Add it to the server list(s) NewListEntry = UBrowserServerList(Owner.CreateItem(Owner.Class)); NewListEntry.IP = IP; NewListEntry.QueryPort = QueryPort; NewListEntry.Ping = 9999; if(HostName != "") NewListEntry.HostName = HostName; else NewListEntry.HostName = IP; NewListEntry.Category = Category; NewListEntry.GameName = GameName; NewListEntry.bLocalServer = False; Owner.AppendItem(NewListEntry); } NewListEntry.bOldServer = False; return NewListEntry; } function PlayerPawn GetPlayerOwner() { return Owner.GetPlayerOwner(); } z} U`“g? lü zzQ €@zzW€@zz@zzz�zi@zz^@zzDzz@zzZzzb€@zzc€@zzf€@zzd€@zz_€@zza€@zzs€@zzvzzzz9@zz~€@zzu@zz|@zzt@zz}@zzzzBzzG€z­zz z@zzzzzz@zz@zz@zzJzzz€zšzE@zzF@zz@zzU€zz€zzH€@zzAzz@zz{€zzP€@zzL€@zzM€@zz~€zzNO{…;"8~O6w~*~5M-P zÕAC~J�-†-á}CzËBJjÁ-Îy?D¬¯¯�Á�B?,ƒy?D¬¯�B?,‘y@Ërzó*|CyGzË%A%û–AK@p@ ¥AÒ|CyGp@zËú zPI{v€ W{I-H z@ÿ€ÿ€ÿ€€ÿ€ÿ€€ÿ€€ÿÀÀÀÿÀÜÀÿ¦Êðÿ@ ÿ` ÿ€ ÿ  ÿÀ ÿà ÿ@ÿ @ÿ@@ÿ`@ÿ€@ÿ @ÿÀ@ÿà@ÿ`ÿ `ÿ@`ÿ``ÿ€`ÿ `ÿÀ`ÿà`ÿ€ÿ €ÿ@€ÿ`€ÿ€€ÿ €ÿÀ€ÿà€ÿ ÿ  ÿ@ ÿ` ÿ€ ÿ  ÿÀ ÿà ÿÀÿ Àÿ@Àÿ`Àÿ€Àÿ ÀÿÀÀÿàÀÿàÿ àÿ@àÿ`àÿ€àÿ àÿÀàÿààÿ@ÿ @ÿ@@ÿ`@ÿ€@ÿ @ÿÀ@ÿà@ÿ @ÿ @ÿ@ @ÿ` @ÿ€ @ÿ  @ÿÀ @ÿà @ÿ@@ÿ @@ÿ@@@ÿ`@@ÿ€@@ÿ @@ÿÀ@@ÿà@@ÿ`@ÿ `@ÿ@`@ÿ``@ÿ€`@ÿ `@ÿÀ`@ÿà`@ÿ€@ÿ €@ÿ@€@ÿ`€@ÿ€€@ÿ €@ÿÀ€@ÿà€@ÿ @ÿ  @ÿ@ @ÿ` @ÿ€ @ÿ  @ÿÀ @ÿà @ÿÀ@ÿ À@ÿ@À@ÿ`À@ÿ€À@ÿ À@ÿÀÀ@ÿàÀ@ÿà@ÿ à@ÿ@à@ÿ`à@ÿ€à@ÿ à@ÿÀà@ÿàà@ÿ€ÿ €ÿ@€ÿ`€ÿ€€ÿ €ÿÀ€ÿà€ÿ €ÿ €ÿ@ €ÿ` €ÿ€ €ÿ  €ÿÀ €ÿà €ÿ@€ÿ @€ÿ@@€ÿ`@€ÿ€@€ÿ @€ÿÀ@€ÿà@€ÿ`€ÿ `€ÿ@`€ÿ``€ÿ€`€ÿ `€ÿÀ`€ÿà`€ÿ€€ÿ €€ÿ@€€ÿ`€€ÿ€€€ÿ €€ÿÀ€€ÿà€€ÿ €ÿ  €ÿ@ €ÿ` €ÿ€ €ÿ  €ÿÀ €ÿà €ÿÀ€ÿ À€ÿ@À€ÿ`À€ÿ€À€ÿ À€ÿÀÀ€ÿàÀ€ÿà€ÿ à€ÿ@à€ÿ`à€ÿ€à€ÿ à€ÿÀà€ÿàà€ÿÀÿ Àÿ@Àÿ`Àÿ€Àÿ ÀÿÀÀÿàÀÿ Àÿ Àÿ@ Àÿ` Àÿ€ Àÿ  ÀÿÀ Àÿà Àÿ@Àÿ @Àÿ@@Àÿ`@Àÿ€@Àÿ @ÀÿÀ@Àÿà@Àÿ`Àÿ `Àÿ@`Àÿ``Àÿ€`Àÿ `ÀÿÀ`Àÿà`Àÿ€Àÿ €Àÿ@€Àÿ`€Àÿ€€Àÿ €ÀÿÀ€Àÿà€Àÿ Àÿ  Àÿ@ Àÿ` Àÿ€ Àÿ  ÀÿÀ Àÿà ÀÿÀÀÿ ÀÀÿ@ÀÀÿ`ÀÀÿ€ÀÀÿ ÀÀÿÿûðÿ  ¤ÿ€€€ÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿÿzy€zz@ÿÿÿÿJ@=ÿ*"ÿ6+'ÿ/%ÿ$ÿWKAÿ2'ÿ4(ÿ6)ÿM;&ÿ8+ÿ>.ÿk\HÿC1ÿ7(ÿ-"ÿL9ÿWA!ÿ4&ÿF3ÿJ5ÿA.ÿ€iEÿkO!ÿ;+ÿ3% ÿP9ÿW>ÿ¢‰[ÿ�l-ÿwXÿ<+ ÿJ5ÿcEÿE0 ÿ‹bÿ—kÿ…]ÿlKÿ�YÿvQ ÿ}V ÿhG ÿK3ÿcCÿÿþüÿÿýùÿÿûóÿÿñÕÿÿïÎÿÿìÅÿÿê¾ÿÿçµÿÿâ©ÿÿßžÿÿÝ—ÿÿÜ”ÿÿÛ�ÿÿÚŽÿúÖŠÿÿÕ�ÿýÓ~ÿüÏtÿÿÑtÿÿÌfÿë»\ÿûÈbÿøÅ_ÿñ¿[ÿôÁ[ÿï¼Vÿâ±Qÿë¸Rÿê·QÿèµOÿã²Mÿç´Nÿä±Lÿæ³Mÿä±Kÿå²Lÿã°JÿÕ¥EÿÙ§Fÿà­Gÿá®Hÿ߬FÿÞ«EÿÛ¨BÿÜ©CÿÕ£@ÿÚ§AÿØ¥?ÿÕ¢<ÿÖ£=ÿºŽ4ÿÔ¡;ÿÓ :ÿÐ�7ÿÏœ6ÿÌ™3ÿÍš4ÿÃ’0ÿÊ—1ÿ½Œ,ÿÇ”.ÿÄ‘+ÿÃ�*ÿÂ�)ÿ»Š&ÿ½‹&ÿ¿Œ&ÿµ„#ÿ¾‹%ÿ½Š$ÿ­~ ÿ¹‡"ÿ¼‰#ÿ»ˆ"ÿ«|ÿ²€ÿ¢tÿ·„ÿ�pÿµ‚ÿS; ÿ³€ÿÿ²ÿ¥uÿ±~ÿ°}ÿ~XÿaD ÿ­zÿ”hÿZ? ÿªwÿ§tÿ n ÿqOÿZ>ÿ¢p ÿ¤q ÿšj ÿŠ_ÿnKÿ‚Yÿ�cÿ¡nÿ‡\ÿ—hÿcDÿŸlÿ`Aÿ{Sÿ–gÿ›iÿG0ÿ‰]ÿ�jÿ”dÿ—fÿ>*ÿœiÿ“dÿ›hÿwPÿ�aÿ˜gÿ4#ÿM4ÿQ7ÿU9ÿY<ÿ\>ÿ`AÿcCÿfEÿiGÿnJÿpLÿsMÿuNÿyQÿzRÿ|SÿUÿƒXÿ‡[ÿŠ]ÿ�_ÿ‘bÿ–eÿ—fÿÿúïÿÿùìÿÿ÷åÿÿõßÿûïÕÿÿðÐÿ)ÿfFÿ9'ÿC.ÿI2ÿrNÿÿÿ 0ÿ /ÿ )ÿ .ÿ 4ÿ 3ÿ 4ÿ  ÿ*ÿ.ÿ-ÿ )ÿ0ÿ -ÿ ,ÿ &ÿ 1ÿ 2ÿ 0ÿ+ÿ4ÿ.ÿ ÿ.ÿ3ÿ-ÿ(ÿ%ÿ,ÿ""9ÿ*ÿ)ÿ(ÿ$ÿ,ÿ&ÿ84Aÿ$ÿ &ÿ $ÿ/)1ÿ""ÿÿ$"ÿ*"&ÿ&!ÿzDN{h:H{&NFw{*{-x-L¼ C{ HHGþÿÿÿ~ GÿÿÿÿDGÿÿÿÿAGÿÿÿÿIH'GÿÿÿÿOGÿÿÿÿJGþÿÿÿW GÿÿÿÿLGþÿÿÿD Gþÿÿÿg JýÿÿÿAJýÿÿÿG Gþÿÿÿ| GÿÿÿÿcGÿÿÿÿGGþÿÿÿ~H3GþÿÿÿnIöÿÿÿI Gþÿÿÿ\Gþÿÿÿ}GÿÿÿÿXGùÿÿÿCGþÿÿÿhGìÿÿÿCGþÿÿÿ|AýÿÿÿL Cäÿÿÿg IýÿÿÿQGþÿÿÿy IôÿÿÿQGþÿÿÿE Gùÿÿÿ[GùÿÿÿIGþÿÿÿ{GþÿÿÿY Gùÿÿÿq AýÿÿÿFJýÿÿÿOGþÿÿÿ} Aýÿÿÿr GþÿÿÿC Gþÿÿÿ]JýÿÿÿGþÿÿÿu Aýÿÿÿ2AýÿÿÿIýÿÿÿV GþÿÿÿS Oáÿÿÿc AýÿÿÿP GþÿÿÿZ GþÿÿÿX AýÿÿÿGþÿÿÿl GÿÿÿÿEIÉÿÿÿjGÿÿÿÿSGÿÿÿÿPIëÿÿÿw Jèÿÿÿ@ Jóÿÿÿ~ GþÿÿÿlGþÿÿÿ{ AÙÿÿÿ;GùÿÿÿyGþÿÿÿtGÿÿÿÿGIèÿÿÿkCïÿÿÿdIýÿÿÿ@Iöÿÿÿs Gþÿÿÿj GìÿÿÿDLýÿÿÿ\ GþÿÿÿRGþÿÿÿ{ Gþÿÿÿ} AÒÿÿÿGÿÿÿÿBAýÿÿÿCOáÿÿÿb IÛÿÿÿFAýÿÿÿyGþÿÿÿm Låÿÿÿ] IðÿÿÿfAïÿÿÿ Gùÿÿÿ@AÛÿÿÿ/AýÿÿÿI AÙÿÿÿ"Gìÿÿÿi AôÿÿÿAÌÿÿÿbGþÿÿÿk 'yþÿÿÿBIéÿÿÿCAèÿÿÿAôÿÿÿAýÿÿÿyJÐÿÿÿQ Iýÿÿÿ` JíÿÿÿMAýÿÿÿ.Aýÿÿÿy EæÿÿÿN AÜÿÿÿQ IÆÿÿÿZ AÛÿÿÿGþÿÿÿvIéÿÿÿs IæÿÿÿEAýÿÿÿGþÿÿÿd Ióÿÿÿq Ióÿÿÿr JØÿÿÿb Aäÿÿÿ_AýÿÿÿI¾ÿÿÿeDôÿÿÿGùÿÿÿCAôÿÿÿA½ÿÿÿEIÝÿÿÿkGùÿÿÿZAÛÿÿÿnI~ÿÿÿ@Gþÿÿÿz D¤ÿÿÿh A³ÿÿÿyA¯ÿÿÿOãÿÿÿh AöÿÿÿJDÓÿÿÿ| AÌÿÿÿA³ÿÿÿ{AÛÿÿÿNJÚÿÿÿ~ GÿÿÿÿHAýÿÿÿAAôÿÿÿ.AýÿÿÿDØÿÿÿY GþÿÿÿuAýÿÿÿaGïÿÿÿGA ÿÿÿxGùÿÿÿaOèÿÿÿ\ Aèÿÿÿ|AèÿÿÿoDôÿÿÿy AèÿÿÿnDÈÿÿÿR GþÿÿÿoOºÿÿÿt AèÿÿÿAP·ÿÿÿT IöÿÿÿrJºÿÿÿp JðÿÿÿMLèÿÿÿRLŠÿÿÿx Aýÿÿÿv P·ÿÿÿR AäÿÿÿFP·ÿÿÿb AýÿÿÿtAýÿÿÿz L´ÿÿÿL IÆÿÿÿs Dåÿÿÿ} Aýÿÿÿ{ IÓÿÿÿHAÆÿÿÿAýÿÿÿvAýÿÿÿuEéÿÿÿt Pæÿÿÿu Lôÿÿÿx AýÿÿÿUIÆÿÿÿ[ Jôÿÿÿz AöÿÿÿIÚÿÿÿw IÚÿÿÿx A½ÿÿÿAÛÿÿÿiEýÿÿÿa GùÿÿÿZGùÿÿÿ\AýÿÿÿnAŽÿÿÿAéÿÿÿ.JóÿÿÿX Aöÿÿÿ{GþÿÿÿsAöÿÿÿBA{ÿÿÿEAèÿÿÿkAÆÿÿÿgI`ÿÿÿ A½ÿÿÿLôÿÿÿh AöÿÿÿvAéÿÿÿJóÿÿÿz IÝÿÿÿfA‚ÿÿÿiD�ÿÿÿ| JÚÿÿÿ{ Gþÿÿÿ{GÉÿÿÿfLÓÿÿÿMo‚ÿÿÿp AÉÿÿÿjAýÿÿÿgAŽÿÿÿpL�ÿÿÿKLÝÿÿÿAJôÿÿÿ{ Lóÿÿÿh JÚÿÿÿv AýÿÿÿH Jóÿÿÿu HþÿÿÿuOöÿÿÿTAýÿÿÿQ LÝÿÿÿJIÜÿÿÿa'yþÿÿÿzLÆÿÿÿL Lýÿÿÿ_ Lóÿÿÿh Aýÿÿÿn Aýÿÿÿy GôÿÿÿEOgÿÿÿsLöÿÿÿo o'ÿÿÿJAÌÿÿÿ{GùÿÿÿBIŽÿÿÿM AÝÿÿÿJÝÿÿÿDO�ÿÿÿEA±ÿÿÿiAèÿÿÿEAèÿÿÿdAýÿÿÿrA½ÿÿÿCDŠÿÿÿ} IgÿÿÿIJØÿÿÿc AýÿÿÿwAýÿÿÿkO<ÿÿÿDA±ÿÿÿK'yÿÿÿlo‚ÿÿÿt AýÿÿÿO AýÿÿÿgL`ÿÿÿtO<ÿÿÿBIÙÿÿÿnGÿÿÿÿHGÿÿÿÿoO ÿÿÿ^ DØÿÿÿW GÝÿÿÿII‚ÿÿÿBAÝÿÿÿ~A³ÿÿÿxŠXu]¤ŠRO R¶„(R aÀÂmjoÀ0CxY݆MIQñ0{bañ†1UCøŠ\YSøŠ[Ylù„`@EûÕEYSû„(\ lþŒKazþ„(J[ƒ†[ jƒŠU{zƒ„`I u…ˆ¡P D†„`r R†ˆöC `†0@do†‹(ZS‹Ñw`b‹„ûr B‘„ö| Q‘z˜WZ_‘„öoy †¡nH¡†¡mW¡†k f¡ŒyLv¡Šo`B¤†w b§„”^r§†0mA¨‰sP¨†\D^¨†D n¨†Àr }¨®q_L©ÑJf k°„û| Qº†"w _º„h oºˆûC ~ºÂ|NM»T~M [„”T hΆÀs wΆvGÏ„”E Xφk gφp wφ~FЄw VІ*feІ| tІ0iDÑ„UTÑ„`o cцD qц([AÒ†IC PÒ†] _Ò†E oÒ„”aÒ¾( NÓˆ~]Ó†l lÓ„q |Ó†\ KÔòFu[Ô†õp PÚ†¸V`ÚàY]oÚˆýB Lõ®x][õ†*gx÷†ÁD Gø†æFXø†ggø‹wwø†KFù„”`Vù†r dù†+X uùˆýC Eú†˜D Tú†rd eú†�p uúˆÛC EûlQSûˆmdþ„ûr sþ„€| Bÿ†ñD Qÿˆj bÿ†fp qÿˆfV A€TscP€†Us„¾} B…†s R…ˆfrb…ˆU q…„@@†z ]@O††,p O‰„û| _‰†#p m‰†m }‰†ºfMŠTvY]Іrj vŽ‹G F�†v U�ˆ!C e�†rl s�„`[C�„Ö| R�…"a�ˆÞW�†xD N‘† b_‘„gn‘„­[ }‘†v L’‹|\’†fY k’†I{’†s J“†¢` Y“†f` i“†rh y“†0v I”†+XX”†Uh”zˆ C x”†mi G•ˆme W•„^ f•„q u•„D–„Ï| S–Íg|a–„@ ]˜„| l˜ˆúP z˜Â_]H™†f ež…"?,už†e aŸ»ºkqŸ†Àt A †KQ †Øf` †ÀUo ¾öH ~ Ã^xM¡ˆ›C E£„†^ S£àI{a£†Óf\¥†"[ k¥ˆk{¥†>v J¦ˆÝC Y¦…" /h¦ˆºI W§ˆÒC f§‹×[ u§ˆf D¨†#p S¨†}p b¨‹”br¨ˆMXA©„ý@ P©††` _©†S p©†æp @ª†ñp Pª‰U _ª†ˆp nª‹öS}ªˆ‡C L«‰G [«‹öM j«†ûp y«´AaH¬"F`i†pp IƈDC XƆúb gƆn wÆ„faGLj€C VÇ„”deÇ„?ItÇ„Þm CȆfLQÈ‹zbÈ„ q qÈ„Y@É„hOÉ„i^Ɉ„C mɈºC |Ɉ?C KÊ„‡\ Yʆ!PhʈºB xÊ‹ i FË‹ OUˆ!Qdˆ¨p sË‹öN BÌ‹tQ̈j`Ì"naoÌ„ZPЄf_І3hnІrf ~ІúM OшõP _цªFmцÊO |Ñ„sKÒ†}U ZÒˆðP jÒˆì] xÒ„E GÓ„TVÓ„”_eÓˆëP tÓˆõKBÔ†F QÔ"ZxbÔ†p Z؈àC i؈”ew؆gp EÙˆ¶C TÙ†$S bÙ„Z@rÙ„ûEAÚ†S PÚ†ÛS `Ú†&X pÚ†&U@ÛˆƒV PÛ‰_Û†ƒp nÛ„1q ~Û„1i Mܾ}S \܆ÝS m܆h}Ü„ÀdMÝ„sa\݉ºV k݆úp zÝ„ÃP IÞ†p XÞ„öK gÞ†sLvÞÐ+NGß¾öG V߆´ff߆´Y u߈ÃC Eàˆ”gTàˆC bàŒPJpàˆ€B z刺rHæ†õb Wæˆgæ‹Yv戲P E爺H Tçˆdcç„­| qç»fw@èˆ}b Pè„ÓQ _è»1kmè‹MG}è‹yLé„fy[éˆC jé† Qx醔p IꆚS XꆘS hê„Gg xêˆ`C Fë†!v Të¾öF d눃rtë»!RCì‹``Tì†gS cìŒkSrì„d Eò„T Tò‹}cò„íF qò†ëE @ó„K[ Pó†yp _ó†op nóz†íp }ó†FbLô„À| [ô„t jô†˜myô† E JõˆeZõ„˜y iõˆëC xõ"(@Fö„ g Fþ†lp Tþ†*m cþ„m_ sþ‰LBÿˆÉC Pÿ„\G_ÿz†ÝU mÿ»sw}ÿ‹öO M€z†óE [€ˆóC k€„×@y€†ïp H�†„p W�†>g�†ƒv w�†tv G‚†‘v X‚„ýM i‚„ý]x‚ˆƒsGƒ†„fUƒ†æU dƒ‰´V tƒ†sC„„KZ S„‰´W b„†+Wq„„| B…ˆfsQ…ˆ×K _…ˆnn…„ºi }…†+VL†ˆj \††´` j††fE z†‹lJ‡†AX‡†„U g‡´jV w‡„F M“†ÜI\“‹lk“†¢E y“„¥[I”"HPX”†P h˜»Mkw˜†N G™…²0eW™Ç|l |›„¢\ Lœˆ}` Zœzˆ}c iœˆ}a wœ‹sm F�†P U�ˆÃf d�†N s�†¥LCž…¹0@Tž†¬` T †õM e ‹öEu ÐMcD¡ˆ2C S¡‹MYa¡‹MHp¡ˆÔC ¡„ÛF M¢†ÛN \¢ˆrl¢†šN {¢„ÀSJ£†„FY£†ÛP h£†çb w£‹øO G¤ˆ§C V¤…”6Rd¤„[F v¨†çM E©„§}U©†âFd©ˆºss©ƒdIAª†ðb J¬ÇZ Z¬†ÇU j¬†˜P y¬†*AH­„ûI X­ˆûB f­‹ÒZ u­†[S C®ˆ˜q S®†‘O b®†vU q®„ºj @¯ˆÓC O¯„hR ^¯„]R l¯‹{z¯‹õZ I°†"\ X°ˆ1H g°‹ºK v°„sR E±„1GT±†ÂU c±†fIr±ˆºJ B²„ºL Q²†îU `²†#U o²†_²ˆØC P³†` _³„Ã| o³†3_~³†+l O´„ÄF ^´†ºY l´„©`|´„ìg Kµ„@ Yµ‹ý^hµ†ƒY vµ†ôU F¶†ƒIU¶†LU e¶†LS t¶„ôF D·†ÞIS·† U b·‹xq·†SU @¸†SS O¸„S`_¸†[S n¸†[U }¸†#C M¹ˆMW]¹†ÎU l¹ˆfq{¹„[`Jº†tU Yº„Zr hº†_S wº„V| F»„¸w T»†kS c»„m| r»®}R@¼†ŒS R¾† O a¾ˆƒqp¾†‘U ¾ˆŠC N¿ˆ|\¿ˆºqk¿„KD z¿„¡g IÀ†p WÀ†IfÀ‹H vÀ‰”@ EÁ†ëb TÁ†^ dÁ„ËO tÁ†ðM B„R R„ÅF a„ÈF pˆMV†ìaNÆx_ÄìxoÆ×` ~Éì^ Oľ×A ^Ć�G mĈC }Ĉfv LÅ‹‡P[Å„‡P iÅÐFhxÅ…0FÆ„ÃO dƈsyrƆƒ` Adžxa QLj×P `Ç»Ôc ndžPF~džÌ` MÈ„KV ^ȆÐIlȆOF|ȆÕ` KÉ‹æH[Ɇº` jɾÌA zÉ„}A Iʈmg XʈngʈÓA vÊ„r EËz‰ÕHSË‹i bˆêS qˉêV ẢêW PÌ„u_Ì„¢R n̆O |̆‹C KÍÂGBZ͆ÒW \ЉAV lІ*D{І*K Kц [ц*ikц,{щAW KÒ†VZÒ„ljÒ†æA yÒˆ^ HÓ†O WÓ‰` gÓ†zx vÓ„öL FÔ†¼~ UÔ‹a eÔ†AS tÔ†éC DÕ‹b TÕ†OAcÕˆ&u rÕ„sM@Öˆ&K OÖˆ×C ^ÖˆsjmÖ„xb |Ö…Ä*;_J׈fjiÛ†CC xÛ…ß*"oGÜ„Q vÞ†zy Eß„1R U߈fydß‹fxsß„xQ Bàˆ¼` QàˆìZ_à„“`nà„x| |à†¼ Ká„| [ቢV já…”Ryá…”^Xâ†ÒC wâ„*hFã„b Uã†ìC cã†*n rã„1TBä´OPQ䆢B a솢 qì†*l Aí˜Qv Qí‰ûk Gø†O| Uø†8C eø†*tø„1SDù„@Sù…1Iaù„g@júˆC xú„S Gû„�`Vû†C dû†Otû„xq Dü„| Sü˜TYbü„>t {�„C~ J‚†­T Y‚ˆMzi‚„­ox‚¾­F Gƒ¾­G Wƒ¾­H gƒ„Mzvƒ„M\E„„MpT„‰¢W c„†ÆC r„„¼lA…‰êI P…‰êJ _…‰Mfm…‰Mi|…ˆÓmK†„Ó| Z†ˆ¥Zi†ÑVBw†ˆÃyˆ„˜F H‰‰Õ~ W‰ÇÝ` f‰‹õHw‰‹æYFŠ‹øN UŠˆsdŠˆa sŠ‹øHB‹„F Q‹†²b _‹ˆ°Y o‹„R }‹†¡b LŒ„F \ŒˆŸY jŒˆ�exŒˆ�dF�„<z U�‹„Hd�„3F s�‹ RBŽ„ÌT PŽ‹„N ^Ž„È| mŽˆF_{ŽˆF^I�„FZW�†€T e�„FYu�„6T C�†Dp Q�„I`�ˆ?Q o�¾¬A ~�„SM‘„¸U\‘‰AI k‘‰AJ z‘„S H’ˆ¸mW’†+m f’ˆV v’„¥| E“„Œq S“‹X b“†+Pq“†~S A”…"HmP”‹"k}—Tt]K˜„~q h™„jF w™…0`Fš†uNdš†ëM tšˆãS D›‹c S›‰Ín b›‹ Jp›‰Ím ›„gF Nœ‰\n ]œ„Sz kœ†ÅY zœˆºpI�ˆDX�‰‘n g�‰\m v�„]F Ež‰‘m TžˆƒcžÐp rž„mBŸˆƒpQŸ„k`Ÿ‰ÉHoŸ†,T ~Ÿ„0cM ‰tn \ „Se k ‰tm z „L`I¡ˆfX¡„LF g¡ˆfpv¡†XM E¢…²U¢Çß` T¦†X` d¦„0ft¦„Û| C§„ôBR§†EU a§„©F q§„ò| @¨‹dN¨z„c]¨‰áU l¨‰áG {¨†ƒM I©†ƒ` Y©†ˆH i©‰V z©‰W Iª†#J Xª‰@e hª†` vª‹˜^ F«†Ü` U«ÇÝYf«¾ÜA x«z„©BG¬†` U¬ÇÝg e¬„6d w¬„Å| F­†À T­„be­z†$I s­‹Àw B®z„S{ Q®Ç0g`®„e q®†ÐG @¯†êU O¯zz‹�u ^¯ˆ}_ l¯„f{¯„¢vJ°„*sX°†Ig°„…g w°‹Û] E±®B_T±„vs´‹àN Bµ…]AQµ†úJ R¶‹N b¶‹Hq¶‹P @·‹„SO·„*u^·†&` m·„*t}·†H L¸†FC ]¸‹éF l¸‹ÒX z¸†}` I¹‰}W Y¹‰}V h¹„„F w¹„ÒY Fº‰¢G Uº‹âi dº‰¢U sº„âF B»‹YC Q»„ªq _»‹YB n»‹YA }»„z~L¼„OT Z¼…*^)i¼„zyR½„Opa½†"E p½„h½„Od N¾„0l]¾„0`l¾„0t{¾„0gJ¿„iY¿„jh¿„0ew¿„OnFÀ‹dUÀ„Pq dÀÅDDsÀ„*wwÄÇgFʼn\W Wʼn\V fÅ„¼vuÅ‹eCƆÖC RÆ‹eu bÆ„¢bpÆ„iÆ„*uNÇ‹x ]džˆ` lljˆW |ljˆV KÈ‹W YȆ}` hÈ„U xÈ„*pGÉ„xVÉ„Hg eÉ„vsɉÀV AÊ„�g OʉÀW ]ʉ†V lʉ†W zʉ?e Iˆ†` Wˈ£U gË„º\ vˆß` ẺßW ỦßV dÌ‹øP rÌ„ÜF @Í„Ü| OÍ„¼g ]Í„7F kÍ„7| zÍ„º| H΄=F W΄=| f΄*vtΉÕ} CωüV QωüW _φb nφü` ~σeHNІM VÒ„<{ fÒ„<e uÒ„CCÓ„ýF QÓ‹ñY_Ó‹æX nÓ‹æG}Ó‰®G LÔ‹ÞYZÔ„3e hÔ‹ÞGvÔ„ÝF EÕ„ÝD TÕ‹ÞHbÕ„ÐF qÕ‹ÐS@Ö‹ÚX NÖ„ÒF ]Ö‹Òi lÖ‰®U zÖ»Óc I׋ì_ YׄÚY gׄìuׄMmDØ„Ìd SØ„MobØ„MqqØ„ÁF @Ù„Áe OÙ„Mb]Ù„MrlÙ„M_{Ù‹zJÚ„MaYÚ„MuhÚ„ywÚ„½F EÛ„½| TÛ„TbÛ„¾F qÛ„¾B@Ü„MrNÜ®M]Ü„MujÞ„MNyÞ„MQH߉¶e Wß¾¶J fß¾¶S w߆ÚW Hà„MxXà„©V gà„Muà„]Dá„aSá„`bᆲM qá„MBAâ„M{P↢` _≢W o≢V ~â„MOLã„M}[ã„M~jㄚ`yã„M|Hä„™T Wä„Myeä„MbtäˆM`C剃V RåˆMwa剃W påЖO å„’Y Næ†N` \æ‰NW l愇J{æ„FvJç„FgYç‹F]hç‰G vçrLwDè„tY {ì‹wN Ií‹tX Wí„lyfí„lTuí„k`Dî„kF Sî„k| bîˆlmqî„lw @ï‹iHOï„j| ]ï‹iN kïˆxZzï‹dN Hð„x[Vð„aY eð„_`sð„_F Bñ„_| Qñ‹aX `ñ‹^Hoñ‹^N }ñ„]| LòˆñjZòˆñyhò„ñMwò„U| Fó„U`Tó„ñacó‹WN ró„M| @ô„TY Nô‹TX \ô‹QHkô„M`yô‹QN Hõ„ÁyWõ„ `eõ„ F tõsM{CöˆÁv ~÷ˆÁyMø‰U \øˆÁjkø„3zzø„>R Hù…1M}Wù„¸yT‚„¸Tc‚†!b r‚†!M BƒˆôY Rƒ†ÿf`ƒ…º|oƒ‰ãV N„»àc \„„èjk„ˆÞU z„„mZI…ˆÚX…‰×d g…„+Qv…‰ÍV E†„+PT†„î`c†„îF r†„îD A‡‰Úk P‡ˆÓU _‡„Î`n‡„ÎF }‡‹ÎSLˆˆè_ [ˆ‰èk iˆ„Â`xˆ„ÂF G‰‹Âi V‰„§C e‰ˆÚ_ t‰‰Èe BŠˆÍU PŠ„§B _ЉÍW nŠ„§A }Š„+SL‹„¶| [‹„+Rj‹†+a y‹„§uIŒ„+hXŒ†§|gŒ„+KwŒ„AF�„T�„@c�„&^r�„k@Ž„¦| OŽ„fm]ކê` lމêW |މêV K�‹±u Z�‹+Oh�‰‘V w�‰WV F�„+LT�„1Ec�„˜_r�„˜^A‘ǘ]P‘ǘlb‘‹˜] t‘»Žc C’…ñf"R’„1Dt’ˆ˜\B“ˆm[P“‰WW _“†|Y n“†v` }“‰vW M”‰vV \”„1uk”†W` z”†ã` J•‰tV Z•„pIi•‰tW x•„áa G–ˆs_ U–„1Hc–„`Jr–„1FA—†c` P—„`K`—„`Lo—ˆ^S ~—‰ke M˜„`O[˜„`Ej˜„rXy˜„1GH™„rWW™„1}f™„rVu™„1JDš„rUSšˆq_ bš„rYpš„`N~š‰TV M›„`M[›‰OG j›…rcax›‰TW Yž‰OU hž†C` wž‰CW GŸ‰CV VŸˆmzdŸ‰AG sŸ‰AU A …ör{mP ‹ u }£ˆûNK¤„ûMZ¤ˆ5_ i¤ÇM w¤„M@G¥†¡M V¥„Mjf¥‹’X u¥*pnD¦‹‹N r©ˆ–M@ª„ÀPNª„ÀK]ª„ÀXlª„ÀW{ª„ÀvJ«„ÀxY«„ÀYh«„ÀUw«„ÀTF¬„ÀVU¬‹õYd¬‹ñHs¬‰NV B­‹F\P­»ûc ^­„Áam­‹DN |­‰W K®‰V Z®»‰c h®†` w®‹DHG¯„«Y V¯‹«X d¯„&T s¯† U B°¾ P S°†` c°† ` s°† p C±‰ÕV R±‰ãW a±…ºmp±ˆÊU O²‰Çd ^²‰ÕW m²‹Ãz |²„sUK³„ÃpY³zz„suh³„fUw³„fuE´„smT´„ÚF c´„­| q´‰‘W ´„pFNµ‰XV \µ‰XW kµ„`Izµz„zI¶ˆºM W¶†T` e¶„&J u¶ˆÏJ D·„(| R·ˆ¨ `·‰öd o·z„\S}·®z^L¸„\Rjº„O yº»c G»†™Y V»z…mO)e»z…mWlN¼…z:z½zzz…²\jt¾»ÉR^Á…ÀrknÁ…â\biYÄ…mVEBÆ…mO-GÉ…Bm|JtÉ…[s6O~ʉ&W MÌ… h\Ì…q$Dѽmk  hÑ…¹\HqÑ…ßJp?yÔ…âÀboxÕ‰W gØ…ì.LvØ…]mmPBÛ…eIRÜ…ârbP[ßz…mN)kàz…f^Tá…˜C-râ…J9N_ã…̘7mäzz…bEdåz½so  i發c 4e rç…¹&LWó…À]ucô…\cXø…1YV{ú…KCQü½sH Tý…Ãsn-]ý…>Jþ…sQ3Hÿ…Àau{ÿ…U]pƒ…mQ2M…„�F …™xc 4xM†…UEš†Q Zž…ceiž…ús_DN …+oOR¤…+Una¥…ͺ{%O¬™sc 4T8t¬…ë1FW² …s@U³ …²ÀBU´ …^h9W» …pË{kP¼ …,v{À …Ís{qà …Ì7PÄ …ÇsygGÅ …ñs"nÇ ‰(d PÈ ™c 4v,^È †˜Q Tõ …dudõ ½me  Yø ½md  bø …|Rkø ™!c 4M }û ‰}V Jˆ …ôì~Xˆ …PVVŠ …Ò*Al‹ …U s^Qm� …:R~‘ …\;P“ …gËc@K” …èyeK• ™Oc 4v p– …T sR2f  …t[X¡ …E;s¢ ‰&V n£ …ûìL|£ …û~H¦ …ÔC-F¨ …²]s¨ …¹rMP¬ …$]­ …OO\° …fJk± …@lu² ½ºO  aµ …o*jµ …p*T¶ ½ºN  ~¶ ‰[p G· ˆ;_ U· …áJc· …ÔC-m¹ ™åc 4xZº ‰[o R …$Va …Ò.@wà …çpwÄ ‰[n gÇ ‰cV vÇ …¹qDÈ …ÿeuÉ …mGZË Ós!>aÐ …²rl_Ñ …jRKÙ …˜MJ]Ú …Řk>gÛ ‰^V eÜ ‰^W sÜ …˜ODBÝ …˜NZFÞ …õ~`ß ‰cW ^á …æ`Xmá …â`AaEä Óf!>fó …˜LPdô ‰fNtõ ‰fqCö …lNRö Óf_t`÷ ™ñc 4sTù …i+GŠ …ÑAdrŠ ‰ãW VŒ …T fRAeŒ ‰ãV fŽ …U f^ytŽ …Û`|xm’ ˆtU e” …¹˜}t” …˜xq– …fAZi˜ …èytCš …s z^@w� ‰?d wž …Þ`nFEŸ …¹V K  …Ü`o aª ˆ~U A« ™1c 4wÝO« …²˜@F‰ …æpAFŠ …âpAJG‹ …J5NQ’ …ÇfyC_“ ‰ƒNb” ‰ƒqq” …ëfF~@• …Íf{~– …Ýf/v]— …C z;WS™ ½o  jœ …È&9uœ …úf_Dn� …[f6"r¡ …fQ_T¢ …Ûp|xs£ ˆ‘U k¥ ™c 4Vz¥ …aUPÅ …Ãfn'eÆ …F z"3LÇ ™c 4AÇ ½fB  @Ù …ÞpnFIÙ …Ñ&A.OÚ …Üpo }Ú ˆ›U ]Û ½fA  kÛ ½f@  tÛ ½f }Û ÅvaFÜ z…ÝJjogá …ì&.,Væ …²&zBç …Î1N'|è …Ö”x*cé …1VfMê †ªQ sí …CxCî …J&_{ï ™ºc 4D6Zñ …r"^§…”*@¨™c 4u¡j¨‹¶Q _Ê…æknÊ…ÓKYÌ…öu'dÍ…WaKÎ…TRlÏ…_ ^$~Ò…”FmbÓˆ¹` OÕˆ¹Q ]Õ…”G2lÕ…âAq^Öˆ¼Q OÝ…”}A^݉ºN_Þ‰ºqnÞ„ÃQ }Þ…1RLß…ÒO?^à…9B]á…”l_âˆT_ Kå…Þn[Yå…ÄO;dtæ…ûHXè…û}`ìˆU_ ]î…Üohkî„ÖQ Sð…Í1{0að…Û|qQñ…5BBó„ÀQ Dô…W ^]wRô…Ò¼QIö…ļ;CZ÷…P~]ø„íQ [ú†ÓQ iú…1Iyú…ñºEBý…<@G�ˆØQ Gƒ…”XQVƒ…EJg„…e\q‡…²+O MŠ…ýE>\•ˆY Z–…ú1_wh–…þd&_™†áY Eš…ÍkfTš…ß¼"=zœˆÝC w�…+pDFž…JmJŸ…”-Ow …”MKF¢ˆçQ Q£…VI_£…Äå;;h¥™\c 4~"c¦ˆëQ aÉ™c 4fpÉ…`yVáÓMRFOä…Ýü/bUåˆðQ wé…º[WFê…XQ]ë…ñü&nî™`c 4A@TïˆõQ U¯»ûc d¯…]Wt¯…ØüxO K´ÓM[hZÁˆúQ BÄQ QÃ…e1`Ã…õ+7QÄ…+HÅ…i&sÅ…z-YÆ…M YFÇ…Ól_È…Ç.KÊ…Ý+/fJÌ…²¡EpÎÅLY�uÏz…õ¡3NщqAÒ‰ W PÒ‰ V _Ò…Ë¡gMmÒ‰W zÓ‰V IÔ…í¡t)WÔ…Þ¡g*@Õ…ßå"{jÕ…õuQe×™c 4v7v؉W l�‰V {�…²uAI‘…¹u7J’†` A“‰W Q“‰V `“™*c 4k n“—S~Y´™c 4w W·…Ê JoNĉN}È…^~LɈ!Q JË™pc 4]$YË…ºSsvï»(c iò…Ø+x}yò™Cc 4q!v’™ c 4` g´ÓMTHGÀ‹{N OÄ‹{H^Ä…Ý0/"lÄ‹šN NÅÓMNA\ŅκN.]ƽºQ  KÇ™Jc 4}(TÇÓMG~Qð…Ò¢QOó½ºR  `ô…á3Jiô…Ä¢;Csö†¸Q v÷™fc 4D>Fø…"2(J¶†;Q r¶z…M ZA·…ÞjH[¹„CQ c»…ÖCacq»„?Q T½…MK3c½…{Þ\V¾™ôc 4TrÀ™Àc 4uIF„KQ {‹…ÌCECJŒ…Þ@M�™Ác 4qL’…MMu}£…Htr¥…1wAf§…ç3pg¨…JQDW«…JL<[¬…{ÁaW­…0WXx¯…thP±…kÁ 9x³…1tVq´…{XMVG¶…ZÁ??]·Ó1LA\¸™zc 4S]º…g X] pË…G@MÕ…Ö0a]MÙ…T4jÚ…{ñS^Û…\CqÝ…g c{tÞ…kñ 9oû†gQ hüÓ1YCxü…Zñ??{ý…È0Kzþ„sQ E€…{bS€…è0y0u�…{xMe‚…U4r„…KCf……x xHri†…H[ˆ™Ëc 4s cŠ…0kDV˜…õvJZ™„lUdš†lQ sš…M4GC›…kx IJœ…3$eS�…Ò3.@xž…Zx??xŸ…JlYw …ÒZP¢†€Q j£‰Fsz£‹‡Q H¤…Ì07W¤…T?N¥…Ä;dM¦…ùCSq§™c 4^&D­‰}W bÓ…ÿ3eqÓ…{FHVÕ…À¢C'^Ú…À¢2EÛ…M bwÛ…]~YÞ…úM_0Wà…VHGá…ZF?3Oå…NWBæ…FqfYç™+c 4}Kí…1NA|¹…À¢EC}º…ß"t@¼…kF *t½…1TA^¾™c 4]�_¿™Þc 4n|À…M~JjÚ…M1?tÛ…X@sÜ…1Z3sÞ…yf߆šQ _ὺP  oá…ì.Fxá…á!o~ã…>Gmå„£Q tæ…ÊJgBç…HDiø…Íwgmùˆ¡Q Tþ…GNbþ™^c 4H pÿ™3c 4Ox‰…0YG¢…1k4`£†¨Q T¤…ÆJ"d¤…â0b|F¥…ÐÍjB¨…Ô!C.l«™0c 4M,Z¬…>HgØ‹ºQ oÙ…ÊJz~Ù…1_HxÛ†­Q @݈²Q PÝ…üÄi-_݆²pLÞ†²q\Þ™¢c 4p kÞ…Íy[è„| Tê…ÀÍECbê…E;eë…UB`ì™rc 4K2bí…ÎìgMmŸ…PHz ‹¶Q B¢™Äc 4BP¢Ïi]R¦…TDo§™c 4ms©…Ä{"`Â…UDBÃ…|qFÅ™Íc 4^OwÇ…} `-U—…:HB˜ÃhbJ™™”c 4@:l›…GtlÕ…5/`Ø™c 4LOÙ…9/[ç…Ø¥xCJè…¥\bMê™ìc 4Joë…Ý¥/)yüˆØS bý…¥Qmpý…É{;]ÿ… 1X€†à` I�…K;X�…KCS‚…BCVƒ…HDY……!`T]†…ÔCfq‡…sUW‰…bHlŠ‹ãX t‹…_FBŒ…cuH�™˜c 4@%}“†b}¸…eCN¹…ÖÍacQ»™¢c 4ht¼ºfM \Ã…JkiÏ™mc 4TÑ…IQSí™ c 4ndî…g{Rð…),Mò…Ån0yò™ c 4|ió…Dteõ…ÍaqYû…á:J�™†c 4YDŽ™uc 4i ]Ÿ™Fc 4F)F«…BoLÔ…ç={Õ…s-xÖ†ûQ e×™Mc 4täu×…21i¼!†Q Z½!…ËBTi½!…Gt}Ã!…GPqÆ!†Q AÈ!™¡c 4Q PÈ!…ÊJJaÔ!…HPkÕ!…ÓA{Ö!ˆQ |×!…Òv6JØ!…\@`@Ù!…ýB`Þ!™c 4i’bß!…HtKò"™c 4d×ó"…F!cË$„F DÌ$‹Q SÌ$™"c 4IaÌ$…} `3jè$Ïu]é$„V_é$„Xné$‹MW}é$†`eKê$„bZê$„Ýgiê$ˆÝB xê$„ÝcGë$ˆ`fUë$„M\dë$„`^së$„MZBì$„``Qì$„`_`ì$„`aoì$„M[~ì$zˆ]Mí$zzzzˆõ_\í$ˆpjí$zzzz„Myxí$„1FGî$„1NVî$„1Geî$„ZI tî$‹ KCï$‰RW Qï$†Rp `ï$†WFpï$„1Eï$ˆZC Nð$†QU \ð$„1Bkð$„RLyð$ˆRC Gñ$‰RU Vñ$†R` eñ$„JGuñ$„JFDò$„JNSò$‰RV aò$‹SKpò$„SF ~ò$‰RG Mó$ˆC\ó$‹WKjó$„QF yó$„WF Hô$„Q`Wô$‹QKfô$…{Cuô$…ÕC~xxõ$…{1pù$ÃCDaú$‰RQ eŠ%ÃODtŠ%…J{Oxš%