[{"data":1,"prerenderedAt":7102},["ShallowReactive",2],{"navigation":3,"\u002Fexamples\u002Fadministration":151,"\u002Fexamples\u002Fadministration-surround":7097},[4,26,48,84,102,129],{"title":5,"path":6,"stem":7,"children":8,"icon":10},"Getting Started","\u002Fgetting-started","1.getting-started\u002F1.index",[9,11,16,21],{"title":5,"path":6,"stem":7,"icon":10},"i-lucide-rocket",{"title":12,"path":13,"stem":14,"icon":15},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":17,"path":18,"stem":19,"icon":20},"Configuration","\u002Fgetting-started\u002Fconfiguration","1.getting-started\u002F3.configuration","i-lucide-settings",{"title":22,"path":23,"stem":24,"icon":25},"First Steps","\u002Fgetting-started\u002Ffirst-steps","1.getting-started\u002F4.first-steps","i-lucide-footprints",{"title":27,"path":28,"stem":29,"children":30,"icon":32},"Connection","\u002Fconnection","2.connection\u002F1.index",[31,33,38,43],{"title":27,"path":28,"stem":29,"icon":32},"i-lucide-server",{"title":34,"path":35,"stem":36,"icon":37},"Basic Connection","\u002Fconnection\u002Fbasic","2.connection\u002F2.basic","i-lucide-plug",{"title":39,"path":40,"stem":41,"icon":42},"Connection Options","\u002Fconnection\u002Foptions","2.connection\u002F3.options","i-lucide-settings-2",{"title":44,"path":45,"stem":46,"icon":47},"Database Operations","\u002Fconnection\u002Fdatabase","2.connection\u002F4.database","i-lucide-database",{"title":49,"path":50,"stem":51,"children":52,"icon":47},"CRUD Operations","\u002Fcrud-operations","3.crud-operations\u002F1.index",[53,54,59,64,69,74,79],{"title":49,"path":50,"stem":51,"icon":47},{"title":55,"path":56,"stem":57,"icon":58},"Insert Operations","\u002Fcrud-operations\u002Finsert","3.crud-operations\u002F2.insert","i-lucide-plus-square",{"title":60,"path":61,"stem":62,"icon":63},"Query Operations","\u002Fcrud-operations\u002Fquery","3.crud-operations\u002F3.query","i-lucide-search",{"title":65,"path":66,"stem":67,"icon":68},"Update Operations","\u002Fcrud-operations\u002Fupdate","3.crud-operations\u002F4.update","i-lucide-edit",{"title":70,"path":71,"stem":72,"icon":73},"Delete Operations","\u002Fcrud-operations\u002Fdelete","3.crud-operations\u002F5.delete","i-lucide-trash",{"title":75,"path":76,"stem":77,"icon":78},"Async Operations","\u002Fcrud-operations\u002Fasync","3.crud-operations\u002F6.async","i-lucide-cpu",{"title":80,"path":81,"stem":82,"icon":83},"Query Operators","\u002Fcrud-operations\u002Foperators","3.crud-operations\u002F7.operators","i-lucide-filter",{"title":85,"path":86,"stem":87,"children":88,"icon":90},"Advanced Features","\u002Fadvanced","4.advanced\u002F1.index",[89,91,96],{"title":85,"path":86,"stem":87,"icon":90},"i-lucide-zap",{"title":92,"path":93,"stem":94,"icon":95},"Aggregation Pipelines","\u002Fadvanced\u002Faggregation","4.advanced\u002F2.aggregation","i-lucide-bar-chart-3",{"title":97,"path":98,"stem":99,"children":100,"icon":63},"Manage Indexes","\u002Fadvanced\u002Findexes","4.advanced\u002F3.indexes",[101],{"title":97,"path":98,"stem":99,"icon":63},{"title":103,"path":104,"stem":105,"children":106,"icon":108},"Examples","\u002Fexamples","5.examples\u002F1.index",[107,109,114,119,124],{"title":103,"path":104,"stem":105,"icon":108},"i-lucide-code",{"title":110,"path":111,"stem":112,"icon":113},"Basic Examples","\u002Fexamples\u002Fbasic","5.examples\u002F2.basic","i-lucide-book-open",{"title":115,"path":116,"stem":117,"icon":118},"Player Systems","\u002Fexamples\u002Fplayer-systems","5.examples\u002F3.player-systems","i-lucide-users",{"title":120,"path":121,"stem":122,"icon":123},"Game Systems","\u002Fexamples\u002Fgame-systems","5.examples\u002F4.game-systems","i-lucide-gamepad-2",{"title":125,"path":126,"stem":127,"icon":128},"Server Administration","\u002Fexamples\u002Fadministration","5.examples\u002F5.administration","i-lucide-shield",{"title":130,"path":131,"stem":132,"children":133,"icon":113},"API Reference","\u002Fapi-reference","6.api-reference\u002F1.index",[134,135,139,143,147],{"title":130,"path":131,"stem":132,"icon":113},{"title":136,"path":137,"stem":138},"MongoDB Global","\u002Fapi-reference\u002Fglobal","6.api-reference\u002F2.global",{"title":140,"path":141,"stem":142},"MongoDBClient","\u002Fapi-reference\u002Fclient","6.api-reference\u002F3.client",{"title":144,"path":145,"stem":146},"MongoDBDatabase","\u002Fapi-reference\u002Fdatabase","6.api-reference\u002F4.database",{"title":148,"path":149,"stem":150},"MongoDBCollection","\u002Fapi-reference\u002Fcollection","6.api-reference\u002F5.collection",{"id":152,"title":125,"body":153,"description":7090,"extension":7091,"links":7092,"meta":7093,"navigation":7094,"path":126,"seo":7095,"stem":127,"__hash__":7096},"docs\u002F5.examples\u002F5.administration.md",{"type":154,"value":155,"toc":7083},"minimark",[156,163,167,170,175,2133,2137,3944,3948,5719,5723,7060,7064,7079],[157,158,159],"warning",{},[160,161,162],"p",{},"These examples are AI-generated and has not been reviewed for accuracy. Use them as a starting point and verify correctness before deploying in production.",[164,165,125],"h1",{"id":166},"server-administration",[160,168,169],{},"Examples for server administration using MongoDB.",[171,172,174],"h2",{"id":173},"ban-system","Ban System",[176,177,182],"pre",{"className":178,"code":179,"language":180,"meta":181,"style":181},"language-lua shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","--[[\n    Ban System\n    Manage player bans with expiration and history\n]]\n\nlocal BanSystem = {}\n\nfunction BanSystem.Initialize(db)\n    BanSystem.db = db\n    BanSystem.bans = db:Collection(\"bans\")\n    BanSystem.banHistory = db:Collection(\"ban_history\")\n\n    -- Indexes\n    BanSystem.bans:CreateIndex({ steamid = 1 }, true, \"steamid_unique\")\n    BanSystem.bans:CreateIndex({ expires_at = 1 }, false, \"expiry_index\")\n    BanSystem.banHistory:CreateIndex({ steamid = 1, banned_at = -1 }, false, \"player_history\")\nend\n\n-- Ban a player\nfunction BanSystem.Ban(steamid, reason, duration, adminSteamid, callback)\n    local ban = {\n        steamid = steamid,\n        reason = reason,\n        banned_at = os.time(),\n        expires_at = duration and (os.time() + duration) or nil,\n        permanent = duration == nil,\n        admin_steamid = adminSteamid\n    }\n\n    -- Add to active bans\n    BanSystem.bans:UpdateOneAsync(\n        { steamid = steamid },\n        { [\"$set\"] = ban },\n        function(err)\n            if err then\n                if callback then callback(false, err) end\n                return\n            end\n\n            -- Add to history\n            BanSystem.banHistory:InsertOneAsync({\n                steamid = steamid,\n                reason = reason,\n                duration = duration,\n                permanent = duration == nil,\n                banned_at = os.time(),\n                admin_steamid = adminSteamid\n            }, function()\n                if callback then callback(true) end\n            end)\n        end\n    )\nend\n\n-- Unban a player\nfunction BanSystem.Unban(steamid, adminSteamid, callback)\n    BanSystem.bans:DeleteOneAsync(\n        { steamid = steamid },\n        function(err, deleted)\n            if deleted > 0 then\n                -- Log the unban\n                BanSystem.banHistory:InsertOneAsync({\n                    steamid = steamid,\n                    action = \"unban\",\n                    unbanned_at = os.time(),\n                    admin_steamid = adminSteamid\n                })\n            end\n            if callback then callback(deleted > 0) end\n        end\n    )\nend\n\n-- Check if player is banned\nfunction BanSystem.IsBanned(steamid, callback)\n    BanSystem.bans:FindOneAsync({ steamid = steamid }, function(err, ban)\n        if not ban then\n            callback(false, nil)\n            return\n        end\n\n        -- Check if expired\n        if ban.expires_at and ban.expires_at \u003C os.time() then\n            -- Remove expired ban\n            BanSystem.bans:DeleteOneAsync({ steamid = steamid })\n            callback(false, nil)\n            return\n        end\n\n        callback(true, ban)\n    end)\nend\n\n-- Get player's ban history\nfunction BanSystem.GetHistory(steamid, callback)\n    BanSystem.banHistory:FindAsync(\n        { steamid = steamid },\n        100,\n        function(err, history)\n            callback(history or {})\n        end\n    )\nend\n\n-- Get all active bans\nfunction BanSystem.GetAllBans(callback)\n    BanSystem.bans:FindAsync({}, nil, function(err, bans)\n        callback(bans or {})\n    end)\nend\n\n-- Cleanup expired bans\nfunction BanSystem.CleanupExpired(callback)\n    BanSystem.bans:DeleteManyAsync(\n        {\n            permanent = false,\n            expires_at = { [\"$lt\"] = os.time() }\n        },\n        function(err, deleted)\n            if callback then callback(deleted) end\n        end\n    )\nend\n\n-- Get ban statistics\nfunction BanSystem.GetStats(callback)\n    BanSystem.bans:AggregateAsync({\n        {\n            [\"$group\"] = {\n                _id = nil,\n                total = { [\"$sum\"] = 1 },\n                permanent = {\n                    [\"$sum\"] = {\n                        [\"$cond\"] = { [\"if\"] = \"$permanent\", [\"then\"] = 1, [\"else\"] = 0 }\n                    }\n                },\n                temporary = {\n                    [\"$sum\"] = {\n                        [\"$cond\"] = { [\"if\"] = \"$permanent\", [\"then\"] = 0, [\"else\"] = 1 }\n                    }\n                }\n            }\n        }\n    }, function(err, results)\n        if results and #results > 0 then\n            callback(results[1])\n        else\n            callback({ total = 0, permanent = 0, temporary = 0 })\n        end\n    end)\nend\n\nreturn BanSystem\n","lua","",[183,184,185,194,200,206,212,219,236,241,268,283,314,341,346,352,391,425,468,474,479,485,525,539,550,561,575,613,630,641,647,652,658,673,684,705,718,730,753,759,765,770,776,792,802,812,823,839,851,861,872,892,900,906,912,917,922,928,954,968,977,993,1010,1016,1030,1040,1058,1070,1080,1086,1091,1113,1118,1123,1128,1133,1139,1161,1193,1206,1223,1229,1234,1239,1245,1272,1278,1296,1311,1316,1321,1326,1339,1347,1352,1357,1363,1385,1399,1408,1416,1432,1445,1450,1455,1460,1465,1471,1490,1521,1533,1540,1545,1550,1556,1574,1588,1594,1607,1634,1640,1655,1671,1676,1681,1686,1691,1697,1715,1729,1734,1753,1765,1791,1800,1818,1888,1894,1900,1910,1927,1990,1995,2001,2007,2013,2032,2054,2067,2073,2102,2107,2114,2119,2124],"code",{"__ignoreMap":181},[186,187,190],"span",{"class":188,"line":189},"line",1,[186,191,193],{"class":192},"sHwdD","--[[\n",[186,195,197],{"class":188,"line":196},2,[186,198,199],{"class":192},"    Ban System\n",[186,201,203],{"class":188,"line":202},3,[186,204,205],{"class":192},"    Manage player bans with expiration and history\n",[186,207,209],{"class":188,"line":208},4,[186,210,211],{"class":192},"]]\n",[186,213,215],{"class":188,"line":214},5,[186,216,218],{"emptyLinePlaceholder":217},true,"\n",[186,220,222,226,230,233],{"class":188,"line":221},6,[186,223,225],{"class":224},"sMK4o","local",[186,227,229],{"class":228},"sTEyZ"," BanSystem ",[186,231,232],{"class":224},"=",[186,234,235],{"class":228}," {}\n",[186,237,239],{"class":188,"line":238},7,[186,240,218],{"emptyLinePlaceholder":217},[186,242,244,248,252,255,258,261,265],{"class":188,"line":243},8,[186,245,247],{"class":246},"s7zQu","function",[186,249,251],{"class":250},"s2Zo4"," BanSystem",[186,253,254],{"class":228},".",[186,256,257],{"class":250},"Initialize",[186,259,260],{"class":224},"(",[186,262,264],{"class":263},"sHdIc","db",[186,266,267],{"class":224},")\n",[186,269,271,274,277,280],{"class":188,"line":270},9,[186,272,273],{"class":228},"    BanSystem.",[186,275,264],{"class":276},"sBMFI",[186,278,279],{"class":224}," =",[186,281,282],{"class":228}," db\n",[186,284,286,288,291,293,296,299,302,304,307,310,312],{"class":188,"line":285},10,[186,287,273],{"class":228},[186,289,290],{"class":276},"bans",[186,292,279],{"class":224},[186,294,295],{"class":276}," db",[186,297,298],{"class":228},":",[186,300,301],{"class":250},"Collection",[186,303,260],{"class":228},[186,305,306],{"class":224},"\"",[186,308,290],{"class":309},"sfazB",[186,311,306],{"class":224},[186,313,267],{"class":228},[186,315,317,319,322,324,326,328,330,332,334,337,339],{"class":188,"line":316},11,[186,318,273],{"class":228},[186,320,321],{"class":276},"banHistory",[186,323,279],{"class":224},[186,325,295],{"class":276},[186,327,298],{"class":228},[186,329,301],{"class":250},[186,331,260],{"class":228},[186,333,306],{"class":224},[186,335,336],{"class":309},"ban_history",[186,338,306],{"class":224},[186,340,267],{"class":228},[186,342,344],{"class":188,"line":343},12,[186,345,218],{"emptyLinePlaceholder":217},[186,347,349],{"class":188,"line":348},13,[186,350,351],{"class":192},"    -- Indexes\n",[186,353,355,357,359,361,364,367,369,373,376,379,382,384,387,389],{"class":188,"line":354},14,[186,356,273],{"class":228},[186,358,290],{"class":276},[186,360,298],{"class":228},[186,362,363],{"class":250},"CreateIndex",[186,365,366],{"class":228},"({ steamid ",[186,368,232],{"class":224},[186,370,372],{"class":371},"sbssI"," 1",[186,374,375],{"class":228}," }, ",[186,377,378],{"class":224},"true",[186,380,381],{"class":228},", ",[186,383,306],{"class":224},[186,385,386],{"class":309},"steamid_unique",[186,388,306],{"class":224},[186,390,267],{"class":228},[186,392,394,396,398,400,402,405,407,409,411,414,416,418,421,423],{"class":188,"line":393},15,[186,395,273],{"class":228},[186,397,290],{"class":276},[186,399,298],{"class":228},[186,401,363],{"class":250},[186,403,404],{"class":228},"({ expires_at ",[186,406,232],{"class":224},[186,408,372],{"class":371},[186,410,375],{"class":228},[186,412,413],{"class":224},"false",[186,415,381],{"class":228},[186,417,306],{"class":224},[186,419,420],{"class":309},"expiry_index",[186,422,306],{"class":224},[186,424,267],{"class":228},[186,426,428,430,432,434,436,438,440,442,445,447,450,453,455,457,459,461,464,466],{"class":188,"line":427},16,[186,429,273],{"class":228},[186,431,321],{"class":276},[186,433,298],{"class":228},[186,435,363],{"class":250},[186,437,366],{"class":228},[186,439,232],{"class":224},[186,441,372],{"class":371},[186,443,444],{"class":228},", banned_at ",[186,446,232],{"class":224},[186,448,449],{"class":224}," -",[186,451,452],{"class":371},"1",[186,454,375],{"class":228},[186,456,413],{"class":224},[186,458,381],{"class":228},[186,460,306],{"class":224},[186,462,463],{"class":309},"player_history",[186,465,306],{"class":224},[186,467,267],{"class":228},[186,469,471],{"class":188,"line":470},17,[186,472,473],{"class":246},"end\n",[186,475,477],{"class":188,"line":476},18,[186,478,218],{"emptyLinePlaceholder":217},[186,480,482],{"class":188,"line":481},19,[186,483,484],{"class":192},"-- Ban a player\n",[186,486,488,490,492,494,497,499,502,505,508,510,513,515,518,520,523],{"class":188,"line":487},20,[186,489,247],{"class":246},[186,491,251],{"class":250},[186,493,254],{"class":228},[186,495,496],{"class":250},"Ban",[186,498,260],{"class":224},[186,500,501],{"class":263},"steamid",[186,503,504],{"class":224},",",[186,506,507],{"class":263}," reason",[186,509,504],{"class":224},[186,511,512],{"class":263}," duration",[186,514,504],{"class":224},[186,516,517],{"class":263}," adminSteamid",[186,519,504],{"class":224},[186,521,522],{"class":263}," callback",[186,524,267],{"class":224},[186,526,528,531,534,536],{"class":188,"line":527},21,[186,529,530],{"class":224},"    local",[186,532,533],{"class":228}," ban ",[186,535,232],{"class":224},[186,537,538],{"class":228}," {\n",[186,540,542,545,547],{"class":188,"line":541},22,[186,543,544],{"class":228},"        steamid ",[186,546,232],{"class":224},[186,548,549],{"class":228}," steamid,\n",[186,551,553,556,558],{"class":188,"line":552},23,[186,554,555],{"class":228},"        reason ",[186,557,232],{"class":224},[186,559,560],{"class":228}," reason,\n",[186,562,564,567,569,572],{"class":188,"line":563},24,[186,565,566],{"class":228},"        banned_at ",[186,568,232],{"class":224},[186,570,571],{"class":250}," os.time",[186,573,574],{"class":228},"(),\n",[186,576,578,581,583,586,589,592,595,598,601,604,607,610],{"class":188,"line":577},25,[186,579,580],{"class":228},"        expires_at ",[186,582,232],{"class":224},[186,584,585],{"class":228}," duration ",[186,587,588],{"class":224},"and",[186,590,591],{"class":228}," (",[186,593,594],{"class":250},"os.time",[186,596,597],{"class":228},"() ",[186,599,600],{"class":224},"+",[186,602,603],{"class":228}," duration) ",[186,605,606],{"class":224},"or",[186,608,609],{"class":224}," nil",[186,611,612],{"class":228},",\n",[186,614,616,619,621,623,626,628],{"class":188,"line":615},26,[186,617,618],{"class":228},"        permanent ",[186,620,232],{"class":224},[186,622,585],{"class":228},[186,624,625],{"class":224},"==",[186,627,609],{"class":224},[186,629,612],{"class":228},[186,631,633,636,638],{"class":188,"line":632},27,[186,634,635],{"class":228},"        admin_steamid ",[186,637,232],{"class":224},[186,639,640],{"class":228}," adminSteamid\n",[186,642,644],{"class":188,"line":643},28,[186,645,646],{"class":228},"    }\n",[186,648,650],{"class":188,"line":649},29,[186,651,218],{"emptyLinePlaceholder":217},[186,653,655],{"class":188,"line":654},30,[186,656,657],{"class":192},"    -- Add to active bans\n",[186,659,661,663,665,667,670],{"class":188,"line":660},31,[186,662,273],{"class":228},[186,664,290],{"class":276},[186,666,298],{"class":228},[186,668,669],{"class":250},"UpdateOneAsync",[186,671,672],{"class":228},"(\n",[186,674,676,679,681],{"class":188,"line":675},32,[186,677,678],{"class":228},"        { steamid ",[186,680,232],{"class":224},[186,682,683],{"class":228}," steamid },\n",[186,685,687,690,692,695,697,700,702],{"class":188,"line":686},33,[186,688,689],{"class":228},"        { [",[186,691,306],{"class":224},[186,693,694],{"class":309},"$set",[186,696,306],{"class":224},[186,698,699],{"class":228},"] ",[186,701,232],{"class":224},[186,703,704],{"class":228}," ban },\n",[186,706,708,711,713,716],{"class":188,"line":707},34,[186,709,710],{"class":246},"        function",[186,712,260],{"class":224},[186,714,715],{"class":263},"err",[186,717,267],{"class":224},[186,719,721,724,727],{"class":188,"line":720},35,[186,722,723],{"class":246},"            if",[186,725,726],{"class":228}," err ",[186,728,729],{"class":246},"then\n",[186,731,733,736,739,742,744,746,748,751],{"class":188,"line":732},36,[186,734,735],{"class":246},"                if",[186,737,738],{"class":228}," callback ",[186,740,741],{"class":246},"then",[186,743,522],{"class":250},[186,745,260],{"class":228},[186,747,413],{"class":224},[186,749,750],{"class":228},", err) ",[186,752,473],{"class":246},[186,754,756],{"class":188,"line":755},37,[186,757,758],{"class":246},"                return\n",[186,760,762],{"class":188,"line":761},38,[186,763,764],{"class":246},"            end\n",[186,766,768],{"class":188,"line":767},39,[186,769,218],{"emptyLinePlaceholder":217},[186,771,773],{"class":188,"line":772},40,[186,774,775],{"class":192},"            -- Add to history\n",[186,777,779,782,784,786,789],{"class":188,"line":778},41,[186,780,781],{"class":228},"            BanSystem.",[186,783,321],{"class":276},[186,785,298],{"class":228},[186,787,788],{"class":250},"InsertOneAsync",[186,790,791],{"class":228},"({\n",[186,793,795,798,800],{"class":188,"line":794},42,[186,796,797],{"class":228},"                steamid ",[186,799,232],{"class":224},[186,801,549],{"class":228},[186,803,805,808,810],{"class":188,"line":804},43,[186,806,807],{"class":228},"                reason ",[186,809,232],{"class":224},[186,811,560],{"class":228},[186,813,815,818,820],{"class":188,"line":814},44,[186,816,817],{"class":228},"                duration ",[186,819,232],{"class":224},[186,821,822],{"class":228}," duration,\n",[186,824,826,829,831,833,835,837],{"class":188,"line":825},45,[186,827,828],{"class":228},"                permanent ",[186,830,232],{"class":224},[186,832,585],{"class":228},[186,834,625],{"class":224},[186,836,609],{"class":224},[186,838,612],{"class":228},[186,840,842,845,847,849],{"class":188,"line":841},46,[186,843,844],{"class":228},"                banned_at ",[186,846,232],{"class":224},[186,848,571],{"class":250},[186,850,574],{"class":228},[186,852,854,857,859],{"class":188,"line":853},47,[186,855,856],{"class":228},"                admin_steamid ",[186,858,232],{"class":224},[186,860,640],{"class":228},[186,862,864,867,869],{"class":188,"line":863},48,[186,865,866],{"class":228},"            }, ",[186,868,247],{"class":246},[186,870,871],{"class":224},"()\n",[186,873,875,877,879,881,883,885,887,890],{"class":188,"line":874},49,[186,876,735],{"class":246},[186,878,738],{"class":228},[186,880,741],{"class":246},[186,882,522],{"class":250},[186,884,260],{"class":228},[186,886,378],{"class":224},[186,888,889],{"class":228},") ",[186,891,473],{"class":246},[186,893,895,898],{"class":188,"line":894},50,[186,896,897],{"class":246},"            end",[186,899,267],{"class":228},[186,901,903],{"class":188,"line":902},51,[186,904,905],{"class":246},"        end\n",[186,907,909],{"class":188,"line":908},52,[186,910,911],{"class":228},"    )\n",[186,913,915],{"class":188,"line":914},53,[186,916,473],{"class":246},[186,918,920],{"class":188,"line":919},54,[186,921,218],{"emptyLinePlaceholder":217},[186,923,925],{"class":188,"line":924},55,[186,926,927],{"class":192},"-- Unban a player\n",[186,929,931,933,935,937,940,942,944,946,948,950,952],{"class":188,"line":930},56,[186,932,247],{"class":246},[186,934,251],{"class":250},[186,936,254],{"class":228},[186,938,939],{"class":250},"Unban",[186,941,260],{"class":224},[186,943,501],{"class":263},[186,945,504],{"class":224},[186,947,517],{"class":263},[186,949,504],{"class":224},[186,951,522],{"class":263},[186,953,267],{"class":224},[186,955,957,959,961,963,966],{"class":188,"line":956},57,[186,958,273],{"class":228},[186,960,290],{"class":276},[186,962,298],{"class":228},[186,964,965],{"class":250},"DeleteOneAsync",[186,967,672],{"class":228},[186,969,971,973,975],{"class":188,"line":970},58,[186,972,678],{"class":228},[186,974,232],{"class":224},[186,976,683],{"class":228},[186,978,980,982,984,986,988,991],{"class":188,"line":979},59,[186,981,710],{"class":246},[186,983,260],{"class":224},[186,985,715],{"class":263},[186,987,504],{"class":224},[186,989,990],{"class":263}," deleted",[186,992,267],{"class":224},[186,994,996,998,1001,1004,1007],{"class":188,"line":995},60,[186,997,723],{"class":246},[186,999,1000],{"class":228}," deleted ",[186,1002,1003],{"class":224},">",[186,1005,1006],{"class":371}," 0",[186,1008,1009],{"class":246}," then\n",[186,1011,1013],{"class":188,"line":1012},61,[186,1014,1015],{"class":192},"                -- Log the unban\n",[186,1017,1019,1022,1024,1026,1028],{"class":188,"line":1018},62,[186,1020,1021],{"class":228},"                BanSystem.",[186,1023,321],{"class":276},[186,1025,298],{"class":228},[186,1027,788],{"class":250},[186,1029,791],{"class":228},[186,1031,1033,1036,1038],{"class":188,"line":1032},63,[186,1034,1035],{"class":228},"                    steamid ",[186,1037,232],{"class":224},[186,1039,549],{"class":228},[186,1041,1043,1046,1048,1051,1054,1056],{"class":188,"line":1042},64,[186,1044,1045],{"class":228},"                    action ",[186,1047,232],{"class":224},[186,1049,1050],{"class":224}," \"",[186,1052,1053],{"class":309},"unban",[186,1055,306],{"class":224},[186,1057,612],{"class":228},[186,1059,1061,1064,1066,1068],{"class":188,"line":1060},65,[186,1062,1063],{"class":228},"                    unbanned_at ",[186,1065,232],{"class":224},[186,1067,571],{"class":250},[186,1069,574],{"class":228},[186,1071,1073,1076,1078],{"class":188,"line":1072},66,[186,1074,1075],{"class":228},"                    admin_steamid ",[186,1077,232],{"class":224},[186,1079,640],{"class":228},[186,1081,1083],{"class":188,"line":1082},67,[186,1084,1085],{"class":228},"                })\n",[186,1087,1089],{"class":188,"line":1088},68,[186,1090,764],{"class":246},[186,1092,1094,1096,1098,1100,1102,1105,1107,1109,1111],{"class":188,"line":1093},69,[186,1095,723],{"class":246},[186,1097,738],{"class":228},[186,1099,741],{"class":246},[186,1101,522],{"class":250},[186,1103,1104],{"class":228},"(deleted ",[186,1106,1003],{"class":224},[186,1108,1006],{"class":371},[186,1110,889],{"class":228},[186,1112,473],{"class":246},[186,1114,1116],{"class":188,"line":1115},70,[186,1117,905],{"class":246},[186,1119,1121],{"class":188,"line":1120},71,[186,1122,911],{"class":228},[186,1124,1126],{"class":188,"line":1125},72,[186,1127,473],{"class":246},[186,1129,1131],{"class":188,"line":1130},73,[186,1132,218],{"emptyLinePlaceholder":217},[186,1134,1136],{"class":188,"line":1135},74,[186,1137,1138],{"class":192},"-- Check if player is banned\n",[186,1140,1142,1144,1146,1148,1151,1153,1155,1157,1159],{"class":188,"line":1141},75,[186,1143,247],{"class":246},[186,1145,251],{"class":250},[186,1147,254],{"class":228},[186,1149,1150],{"class":250},"IsBanned",[186,1152,260],{"class":224},[186,1154,501],{"class":263},[186,1156,504],{"class":224},[186,1158,522],{"class":263},[186,1160,267],{"class":224},[186,1162,1164,1166,1168,1170,1173,1175,1177,1180,1182,1184,1186,1188,1191],{"class":188,"line":1163},76,[186,1165,273],{"class":228},[186,1167,290],{"class":276},[186,1169,298],{"class":228},[186,1171,1172],{"class":250},"FindOneAsync",[186,1174,366],{"class":228},[186,1176,232],{"class":224},[186,1178,1179],{"class":228}," steamid }, ",[186,1181,247],{"class":246},[186,1183,260],{"class":224},[186,1185,715],{"class":263},[186,1187,504],{"class":224},[186,1189,1190],{"class":263}," ban",[186,1192,267],{"class":224},[186,1194,1196,1199,1202,1204],{"class":188,"line":1195},77,[186,1197,1198],{"class":246},"        if",[186,1200,1201],{"class":224}," not",[186,1203,533],{"class":228},[186,1205,729],{"class":246},[186,1207,1209,1212,1214,1216,1218,1221],{"class":188,"line":1208},78,[186,1210,1211],{"class":250},"            callback",[186,1213,260],{"class":228},[186,1215,413],{"class":224},[186,1217,381],{"class":228},[186,1219,1220],{"class":224},"nil",[186,1222,267],{"class":228},[186,1224,1226],{"class":188,"line":1225},79,[186,1227,1228],{"class":246},"            return\n",[186,1230,1232],{"class":188,"line":1231},80,[186,1233,905],{"class":246},[186,1235,1237],{"class":188,"line":1236},81,[186,1238,218],{"emptyLinePlaceholder":217},[186,1240,1242],{"class":188,"line":1241},82,[186,1243,1244],{"class":192},"        -- Check if expired\n",[186,1246,1248,1250,1253,1256,1259,1261,1263,1266,1268,1270],{"class":188,"line":1247},83,[186,1249,1198],{"class":246},[186,1251,1252],{"class":228}," ban.",[186,1254,1255],{"class":276},"expires_at",[186,1257,1258],{"class":224}," and",[186,1260,1252],{"class":228},[186,1262,1255],{"class":276},[186,1264,1265],{"class":224}," \u003C",[186,1267,571],{"class":250},[186,1269,597],{"class":228},[186,1271,729],{"class":246},[186,1273,1275],{"class":188,"line":1274},84,[186,1276,1277],{"class":192},"            -- Remove expired ban\n",[186,1279,1281,1283,1285,1287,1289,1291,1293],{"class":188,"line":1280},85,[186,1282,781],{"class":228},[186,1284,290],{"class":276},[186,1286,298],{"class":228},[186,1288,965],{"class":250},[186,1290,366],{"class":228},[186,1292,232],{"class":224},[186,1294,1295],{"class":228}," steamid })\n",[186,1297,1299,1301,1303,1305,1307,1309],{"class":188,"line":1298},86,[186,1300,1211],{"class":250},[186,1302,260],{"class":228},[186,1304,413],{"class":224},[186,1306,381],{"class":228},[186,1308,1220],{"class":224},[186,1310,267],{"class":228},[186,1312,1314],{"class":188,"line":1313},87,[186,1315,1228],{"class":246},[186,1317,1319],{"class":188,"line":1318},88,[186,1320,905],{"class":246},[186,1322,1324],{"class":188,"line":1323},89,[186,1325,218],{"emptyLinePlaceholder":217},[186,1327,1329,1332,1334,1336],{"class":188,"line":1328},90,[186,1330,1331],{"class":250},"        callback",[186,1333,260],{"class":228},[186,1335,378],{"class":224},[186,1337,1338],{"class":228},", ban)\n",[186,1340,1342,1345],{"class":188,"line":1341},91,[186,1343,1344],{"class":246},"    end",[186,1346,267],{"class":228},[186,1348,1350],{"class":188,"line":1349},92,[186,1351,473],{"class":246},[186,1353,1355],{"class":188,"line":1354},93,[186,1356,218],{"emptyLinePlaceholder":217},[186,1358,1360],{"class":188,"line":1359},94,[186,1361,1362],{"class":192},"-- Get player's ban history\n",[186,1364,1366,1368,1370,1372,1375,1377,1379,1381,1383],{"class":188,"line":1365},95,[186,1367,247],{"class":246},[186,1369,251],{"class":250},[186,1371,254],{"class":228},[186,1373,1374],{"class":250},"GetHistory",[186,1376,260],{"class":224},[186,1378,501],{"class":263},[186,1380,504],{"class":224},[186,1382,522],{"class":263},[186,1384,267],{"class":224},[186,1386,1388,1390,1392,1394,1397],{"class":188,"line":1387},96,[186,1389,273],{"class":228},[186,1391,321],{"class":276},[186,1393,298],{"class":228},[186,1395,1396],{"class":250},"FindAsync",[186,1398,672],{"class":228},[186,1400,1402,1404,1406],{"class":188,"line":1401},97,[186,1403,678],{"class":228},[186,1405,232],{"class":224},[186,1407,683],{"class":228},[186,1409,1411,1414],{"class":188,"line":1410},98,[186,1412,1413],{"class":371},"        100",[186,1415,612],{"class":228},[186,1417,1419,1421,1423,1425,1427,1430],{"class":188,"line":1418},99,[186,1420,710],{"class":246},[186,1422,260],{"class":224},[186,1424,715],{"class":263},[186,1426,504],{"class":224},[186,1428,1429],{"class":263}," history",[186,1431,267],{"class":224},[186,1433,1435,1437,1440,1442],{"class":188,"line":1434},100,[186,1436,1211],{"class":250},[186,1438,1439],{"class":228},"(history ",[186,1441,606],{"class":224},[186,1443,1444],{"class":228}," {})\n",[186,1446,1448],{"class":188,"line":1447},101,[186,1449,905],{"class":246},[186,1451,1453],{"class":188,"line":1452},102,[186,1454,911],{"class":228},[186,1456,1458],{"class":188,"line":1457},103,[186,1459,473],{"class":246},[186,1461,1463],{"class":188,"line":1462},104,[186,1464,218],{"emptyLinePlaceholder":217},[186,1466,1468],{"class":188,"line":1467},105,[186,1469,1470],{"class":192},"-- Get all active bans\n",[186,1472,1474,1476,1478,1480,1483,1485,1488],{"class":188,"line":1473},106,[186,1475,247],{"class":246},[186,1477,251],{"class":250},[186,1479,254],{"class":228},[186,1481,1482],{"class":250},"GetAllBans",[186,1484,260],{"class":224},[186,1486,1487],{"class":263},"callback",[186,1489,267],{"class":224},[186,1491,1493,1495,1497,1499,1501,1504,1506,1508,1510,1512,1514,1516,1519],{"class":188,"line":1492},107,[186,1494,273],{"class":228},[186,1496,290],{"class":276},[186,1498,298],{"class":228},[186,1500,1396],{"class":250},[186,1502,1503],{"class":228},"({}, ",[186,1505,1220],{"class":224},[186,1507,381],{"class":228},[186,1509,247],{"class":246},[186,1511,260],{"class":224},[186,1513,715],{"class":263},[186,1515,504],{"class":224},[186,1517,1518],{"class":263}," bans",[186,1520,267],{"class":224},[186,1522,1524,1526,1529,1531],{"class":188,"line":1523},108,[186,1525,1331],{"class":250},[186,1527,1528],{"class":228},"(bans ",[186,1530,606],{"class":224},[186,1532,1444],{"class":228},[186,1534,1536,1538],{"class":188,"line":1535},109,[186,1537,1344],{"class":246},[186,1539,267],{"class":228},[186,1541,1543],{"class":188,"line":1542},110,[186,1544,473],{"class":246},[186,1546,1548],{"class":188,"line":1547},111,[186,1549,218],{"emptyLinePlaceholder":217},[186,1551,1553],{"class":188,"line":1552},112,[186,1554,1555],{"class":192},"-- Cleanup expired bans\n",[186,1557,1559,1561,1563,1565,1568,1570,1572],{"class":188,"line":1558},113,[186,1560,247],{"class":246},[186,1562,251],{"class":250},[186,1564,254],{"class":228},[186,1566,1567],{"class":250},"CleanupExpired",[186,1569,260],{"class":224},[186,1571,1487],{"class":263},[186,1573,267],{"class":224},[186,1575,1577,1579,1581,1583,1586],{"class":188,"line":1576},114,[186,1578,273],{"class":228},[186,1580,290],{"class":276},[186,1582,298],{"class":228},[186,1584,1585],{"class":250},"DeleteManyAsync",[186,1587,672],{"class":228},[186,1589,1591],{"class":188,"line":1590},115,[186,1592,1593],{"class":228},"        {\n",[186,1595,1597,1600,1602,1605],{"class":188,"line":1596},116,[186,1598,1599],{"class":228},"            permanent ",[186,1601,232],{"class":224},[186,1603,1604],{"class":224}," false",[186,1606,612],{"class":228},[186,1608,1610,1613,1615,1618,1620,1623,1625,1627,1629,1631],{"class":188,"line":1609},117,[186,1611,1612],{"class":228},"            expires_at ",[186,1614,232],{"class":224},[186,1616,1617],{"class":228}," { [",[186,1619,306],{"class":224},[186,1621,1622],{"class":309},"$lt",[186,1624,306],{"class":224},[186,1626,699],{"class":228},[186,1628,232],{"class":224},[186,1630,571],{"class":250},[186,1632,1633],{"class":228},"() }\n",[186,1635,1637],{"class":188,"line":1636},118,[186,1638,1639],{"class":228},"        },\n",[186,1641,1643,1645,1647,1649,1651,1653],{"class":188,"line":1642},119,[186,1644,710],{"class":246},[186,1646,260],{"class":224},[186,1648,715],{"class":263},[186,1650,504],{"class":224},[186,1652,990],{"class":263},[186,1654,267],{"class":224},[186,1656,1658,1660,1662,1664,1666,1669],{"class":188,"line":1657},120,[186,1659,723],{"class":246},[186,1661,738],{"class":228},[186,1663,741],{"class":246},[186,1665,522],{"class":250},[186,1667,1668],{"class":228},"(deleted) ",[186,1670,473],{"class":246},[186,1672,1674],{"class":188,"line":1673},121,[186,1675,905],{"class":246},[186,1677,1679],{"class":188,"line":1678},122,[186,1680,911],{"class":228},[186,1682,1684],{"class":188,"line":1683},123,[186,1685,473],{"class":246},[186,1687,1689],{"class":188,"line":1688},124,[186,1690,218],{"emptyLinePlaceholder":217},[186,1692,1694],{"class":188,"line":1693},125,[186,1695,1696],{"class":192},"-- Get ban statistics\n",[186,1698,1700,1702,1704,1706,1709,1711,1713],{"class":188,"line":1699},126,[186,1701,247],{"class":246},[186,1703,251],{"class":250},[186,1705,254],{"class":228},[186,1707,1708],{"class":250},"GetStats",[186,1710,260],{"class":224},[186,1712,1487],{"class":263},[186,1714,267],{"class":224},[186,1716,1718,1720,1722,1724,1727],{"class":188,"line":1717},127,[186,1719,273],{"class":228},[186,1721,290],{"class":276},[186,1723,298],{"class":228},[186,1725,1726],{"class":250},"AggregateAsync",[186,1728,791],{"class":228},[186,1730,1732],{"class":188,"line":1731},128,[186,1733,1593],{"class":228},[186,1735,1737,1740,1742,1745,1747,1749,1751],{"class":188,"line":1736},129,[186,1738,1739],{"class":228},"            [",[186,1741,306],{"class":224},[186,1743,1744],{"class":309},"$group",[186,1746,306],{"class":224},[186,1748,699],{"class":228},[186,1750,232],{"class":224},[186,1752,538],{"class":228},[186,1754,1756,1759,1761,1763],{"class":188,"line":1755},130,[186,1757,1758],{"class":228},"                _id ",[186,1760,232],{"class":224},[186,1762,609],{"class":224},[186,1764,612],{"class":228},[186,1766,1768,1771,1773,1775,1777,1780,1782,1784,1786,1788],{"class":188,"line":1767},131,[186,1769,1770],{"class":228},"                total ",[186,1772,232],{"class":224},[186,1774,1617],{"class":228},[186,1776,306],{"class":224},[186,1778,1779],{"class":309},"$sum",[186,1781,306],{"class":224},[186,1783,699],{"class":228},[186,1785,232],{"class":224},[186,1787,372],{"class":371},[186,1789,1790],{"class":228}," },\n",[186,1792,1794,1796,1798],{"class":188,"line":1793},132,[186,1795,828],{"class":228},[186,1797,232],{"class":224},[186,1799,538],{"class":228},[186,1801,1803,1806,1808,1810,1812,1814,1816],{"class":188,"line":1802},133,[186,1804,1805],{"class":228},"                    [",[186,1807,306],{"class":224},[186,1809,1779],{"class":309},[186,1811,306],{"class":224},[186,1813,699],{"class":228},[186,1815,232],{"class":224},[186,1817,538],{"class":228},[186,1819,1821,1824,1826,1829,1831,1833,1835,1837,1839,1842,1844,1846,1848,1850,1853,1855,1858,1860,1862,1864,1866,1868,1870,1872,1874,1877,1879,1881,1883,1885],{"class":188,"line":1820},134,[186,1822,1823],{"class":228},"                        [",[186,1825,306],{"class":224},[186,1827,1828],{"class":309},"$cond",[186,1830,306],{"class":224},[186,1832,699],{"class":228},[186,1834,232],{"class":224},[186,1836,1617],{"class":228},[186,1838,306],{"class":224},[186,1840,1841],{"class":309},"if",[186,1843,306],{"class":224},[186,1845,699],{"class":228},[186,1847,232],{"class":224},[186,1849,1050],{"class":224},[186,1851,1852],{"class":309},"$permanent",[186,1854,306],{"class":224},[186,1856,1857],{"class":228},", [",[186,1859,306],{"class":224},[186,1861,741],{"class":309},[186,1863,306],{"class":224},[186,1865,699],{"class":228},[186,1867,232],{"class":224},[186,1869,372],{"class":371},[186,1871,1857],{"class":228},[186,1873,306],{"class":224},[186,1875,1876],{"class":309},"else",[186,1878,306],{"class":224},[186,1880,699],{"class":228},[186,1882,232],{"class":224},[186,1884,1006],{"class":371},[186,1886,1887],{"class":228}," }\n",[186,1889,1891],{"class":188,"line":1890},135,[186,1892,1893],{"class":228},"                    }\n",[186,1895,1897],{"class":188,"line":1896},136,[186,1898,1899],{"class":228},"                },\n",[186,1901,1903,1906,1908],{"class":188,"line":1902},137,[186,1904,1905],{"class":228},"                temporary ",[186,1907,232],{"class":224},[186,1909,538],{"class":228},[186,1911,1913,1915,1917,1919,1921,1923,1925],{"class":188,"line":1912},138,[186,1914,1805],{"class":228},[186,1916,306],{"class":224},[186,1918,1779],{"class":309},[186,1920,306],{"class":224},[186,1922,699],{"class":228},[186,1924,232],{"class":224},[186,1926,538],{"class":228},[186,1928,1930,1932,1934,1936,1938,1940,1942,1944,1946,1948,1950,1952,1954,1956,1958,1960,1962,1964,1966,1968,1970,1972,1974,1976,1978,1980,1982,1984,1986,1988],{"class":188,"line":1929},139,[186,1931,1823],{"class":228},[186,1933,306],{"class":224},[186,1935,1828],{"class":309},[186,1937,306],{"class":224},[186,1939,699],{"class":228},[186,1941,232],{"class":224},[186,1943,1617],{"class":228},[186,1945,306],{"class":224},[186,1947,1841],{"class":309},[186,1949,306],{"class":224},[186,1951,699],{"class":228},[186,1953,232],{"class":224},[186,1955,1050],{"class":224},[186,1957,1852],{"class":309},[186,1959,306],{"class":224},[186,1961,1857],{"class":228},[186,1963,306],{"class":224},[186,1965,741],{"class":309},[186,1967,306],{"class":224},[186,1969,699],{"class":228},[186,1971,232],{"class":224},[186,1973,1006],{"class":371},[186,1975,1857],{"class":228},[186,1977,306],{"class":224},[186,1979,1876],{"class":309},[186,1981,306],{"class":224},[186,1983,699],{"class":228},[186,1985,232],{"class":224},[186,1987,372],{"class":371},[186,1989,1887],{"class":228},[186,1991,1993],{"class":188,"line":1992},140,[186,1994,1893],{"class":228},[186,1996,1998],{"class":188,"line":1997},141,[186,1999,2000],{"class":228},"                }\n",[186,2002,2004],{"class":188,"line":2003},142,[186,2005,2006],{"class":228},"            }\n",[186,2008,2010],{"class":188,"line":2009},143,[186,2011,2012],{"class":228},"        }\n",[186,2014,2016,2019,2021,2023,2025,2027,2030],{"class":188,"line":2015},144,[186,2017,2018],{"class":228},"    }, ",[186,2020,247],{"class":246},[186,2022,260],{"class":224},[186,2024,715],{"class":263},[186,2026,504],{"class":224},[186,2028,2029],{"class":263}," results",[186,2031,267],{"class":224},[186,2033,2035,2037,2040,2042,2045,2048,2050,2052],{"class":188,"line":2034},145,[186,2036,1198],{"class":246},[186,2038,2039],{"class":228}," results ",[186,2041,588],{"class":224},[186,2043,2044],{"class":224}," #",[186,2046,2047],{"class":228},"results ",[186,2049,1003],{"class":224},[186,2051,1006],{"class":371},[186,2053,1009],{"class":246},[186,2055,2057,2059,2062,2064],{"class":188,"line":2056},146,[186,2058,1211],{"class":250},[186,2060,2061],{"class":228},"(results[",[186,2063,452],{"class":371},[186,2065,2066],{"class":228},"])\n",[186,2068,2070],{"class":188,"line":2069},147,[186,2071,2072],{"class":246},"        else\n",[186,2074,2076,2078,2081,2083,2085,2088,2090,2092,2095,2097,2099],{"class":188,"line":2075},148,[186,2077,1211],{"class":250},[186,2079,2080],{"class":228},"({ total ",[186,2082,232],{"class":224},[186,2084,1006],{"class":371},[186,2086,2087],{"class":228},", permanent ",[186,2089,232],{"class":224},[186,2091,1006],{"class":371},[186,2093,2094],{"class":228},", temporary ",[186,2096,232],{"class":224},[186,2098,1006],{"class":371},[186,2100,2101],{"class":228}," })\n",[186,2103,2105],{"class":188,"line":2104},149,[186,2106,905],{"class":246},[186,2108,2110,2112],{"class":188,"line":2109},150,[186,2111,1344],{"class":246},[186,2113,267],{"class":228},[186,2115,2117],{"class":188,"line":2116},151,[186,2118,473],{"class":246},[186,2120,2122],{"class":188,"line":2121},152,[186,2123,218],{"emptyLinePlaceholder":217},[186,2125,2127,2130],{"class":188,"line":2126},153,[186,2128,2129],{"class":246},"return",[186,2131,2132],{"class":228}," BanSystem\n",[171,2134,2136],{"id":2135},"logging-system","Logging System",[176,2138,2140],{"className":178,"code":2139,"language":180,"meta":181,"style":181},"--[[\n    Logging System\n    Server event logging and analytics\n]]\n\nlocal Logger = {}\n\nLogger.Levels = {\n    DEBUG = 0,\n    INFO = 1,\n    WARN = 2,\n    ERROR = 3\n}\n\nLogger.Categories = {\n    \"player\",\n    \"economy\",\n    \"combat\",\n    \"admin\",\n    \"system\",\n    \"chat\"\n}\n\nfunction Logger.Initialize(db)\n    Logger.db = db\n    Logger.logs = db:Collection(\"logs\")\n\n    -- Indexes for efficient querying\n    Logger.logs:CreateIndex({ timestamp = -1 }, false, \"time_desc\")\n    Logger.logs:CreateIndex({ category = 1, timestamp = -1 }, false, \"category_time\")\n    Logger.logs:CreateIndex({ steamid = 1, timestamp = -1 }, false, \"player_time\")\n    Logger.logs:CreateIndex({ level = 1 }, false, \"level_index\")\nend\n\n-- Log an event\nfunction Logger.Log(level, category, message, data)\n    local entry = {\n        level = level,\n        category = category,\n        message = message,\n        data = data or {},\n        timestamp = os.time(),\n        server_id = GetHostName and GetHostName() or \"unknown\"\n    }\n\n    -- Fire and forget - don't block for logging\n    Logger.logs:InsertOneAsync(entry, function(err)\n        if err then\n            print(\"[Logger] Failed to log:\", err)\n        end\n    end)\nend\n\n-- Convenience methods\nfunction Logger.Debug(category, message, data)\n    Logger.Log(Logger.Levels.DEBUG, category, message, data)\nend\n\nfunction Logger.Info(category, message, data)\n    Logger.Log(Logger.Levels.INFO, category, message, data)\nend\n\nfunction Logger.Warn(category, message, data)\n    Logger.Log(Logger.Levels.WARN, category, message, data)\nend\n\nfunction Logger.Error(category, message, data)\n    Logger.Log(Logger.Levels.ERROR, category, message, data)\nend\n\n-- Query logs\nfunction Logger.Query(filter, limit, callback)\n    limit = limit or 100\n\n    Logger.logs:AggregateAsync({\n        { [\"$match\"] = filter },\n        { [\"$sort\"] = { timestamp = -1 } },\n        { [\"$limit\"] = limit }\n    }, function(err, results)\n        callback(results or {})\n    end)\nend\n\n-- Get logs by category\nfunction Logger.GetByCategory(category, limit, callback)\n    Logger.Query({ category = category }, limit, callback)\nend\n\n-- Get logs by player\nfunction Logger.GetByPlayer(steamid, limit, callback)\n    Logger.Query({ [\"data.steamid\"] = steamid }, limit, callback)\nend\n\n-- Get logs by time range\nfunction Logger.GetByTimeRange(startTime, endTime, callback)\n    Logger.Query({\n        timestamp = {\n            [\"$gte\"] = startTime,\n            [\"$lte\"] = endTime\n        }\n    }, 1000, callback)\nend\n\n-- Get error logs\nfunction Logger.GetErrors(limit, callback)\n    Logger.Query({ level = Logger.Levels.ERROR }, limit, callback)\nend\n\n-- Get log statistics\nfunction Logger.GetStats(hours, callback)\n    hours = hours or 24\n    local since = os.time() - (hours * 3600)\n\n    Logger.logs:AggregateAsync({\n        {\n            [\"$match\"] = { timestamp = { [\"$gte\"] = since } }\n        },\n        {\n            [\"$group\"] = {\n                _id = \"$category\",\n                count = { [\"$sum\"] = 1 },\n                errors = {\n                    [\"$sum\"] = {\n                        [\"$cond\"] = {\n                            [\"if\"] = { [\"$eq\"] = { \"$level\", Logger.Levels.ERROR } },\n                            [\"then\"] = 1,\n                            [\"else\"] = 0\n                        }\n                    }\n                }\n            }\n        },\n        { [\"$sort\"] = { count = -1 } }\n    }, function(err, results)\n        callback(results or {})\n    end)\nend\n\n-- Cleanup old logs\nfunction Logger.Cleanup(daysToKeep, callback)\n    local cutoff = os.time() - (daysToKeep * 24 * 3600)\n\n    Logger.logs:DeleteManyAsync(\n        { timestamp = { [\"$lt\"] = cutoff } },\n        function(err, deleted)\n            if callback then callback(deleted) end\n        end\n    )\nend\n\nreturn Logger\n",[183,2141,2142,2146,2151,2156,2160,2164,2175,2179,2191,2202,2213,2225,2235,2240,2244,2255,2267,2278,2289,2300,2311,2321,2325,2329,2346,2357,2382,2386,2391,2425,2466,2505,2537,2541,2545,2550,2583,2594,2604,2614,2624,2639,2650,2676,2680,2684,2689,2710,2718,2735,2739,2745,2749,2753,2758,2784,2803,2807,2811,2836,2853,2857,2861,2886,2903,2907,2911,2936,2953,2957,2961,2966,2993,3008,3012,3024,3042,3069,3087,3103,3114,3120,3124,3128,3133,3158,3171,3175,3179,3184,3209,3232,3236,3240,3245,3272,3280,3288,3306,3324,3328,3338,3342,3346,3351,3373,3395,3399,3403,3408,3429,3444,3471,3475,3487,3491,3524,3528,3532,3548,3563,3586,3595,3611,3627,3676,3694,3711,3716,3720,3724,3728,3732,3758,3774,3784,3790,3794,3798,3803,3825,3855,3859,3871,3893,3907,3921,3925,3929,3933,3937],{"__ignoreMap":181},[186,2143,2144],{"class":188,"line":189},[186,2145,193],{"class":192},[186,2147,2148],{"class":188,"line":196},[186,2149,2150],{"class":192},"    Logging System\n",[186,2152,2153],{"class":188,"line":202},[186,2154,2155],{"class":192},"    Server event logging and analytics\n",[186,2157,2158],{"class":188,"line":208},[186,2159,211],{"class":192},[186,2161,2162],{"class":188,"line":214},[186,2163,218],{"emptyLinePlaceholder":217},[186,2165,2166,2168,2171,2173],{"class":188,"line":221},[186,2167,225],{"class":224},[186,2169,2170],{"class":228}," Logger ",[186,2172,232],{"class":224},[186,2174,235],{"class":228},[186,2176,2177],{"class":188,"line":238},[186,2178,218],{"emptyLinePlaceholder":217},[186,2180,2181,2184,2187,2189],{"class":188,"line":243},[186,2182,2183],{"class":228},"Logger.",[186,2185,2186],{"class":276},"Levels",[186,2188,279],{"class":224},[186,2190,538],{"class":228},[186,2192,2193,2196,2198,2200],{"class":188,"line":270},[186,2194,2195],{"class":228},"    DEBUG ",[186,2197,232],{"class":224},[186,2199,1006],{"class":371},[186,2201,612],{"class":228},[186,2203,2204,2207,2209,2211],{"class":188,"line":285},[186,2205,2206],{"class":228},"    INFO ",[186,2208,232],{"class":224},[186,2210,372],{"class":371},[186,2212,612],{"class":228},[186,2214,2215,2218,2220,2223],{"class":188,"line":316},[186,2216,2217],{"class":228},"    WARN ",[186,2219,232],{"class":224},[186,2221,2222],{"class":371}," 2",[186,2224,612],{"class":228},[186,2226,2227,2230,2232],{"class":188,"line":343},[186,2228,2229],{"class":228},"    ERROR ",[186,2231,232],{"class":224},[186,2233,2234],{"class":371}," 3\n",[186,2236,2237],{"class":188,"line":348},[186,2238,2239],{"class":228},"}\n",[186,2241,2242],{"class":188,"line":354},[186,2243,218],{"emptyLinePlaceholder":217},[186,2245,2246,2248,2251,2253],{"class":188,"line":393},[186,2247,2183],{"class":228},[186,2249,2250],{"class":276},"Categories",[186,2252,279],{"class":224},[186,2254,538],{"class":228},[186,2256,2257,2260,2263,2265],{"class":188,"line":427},[186,2258,2259],{"class":224},"    \"",[186,2261,2262],{"class":309},"player",[186,2264,306],{"class":224},[186,2266,612],{"class":228},[186,2268,2269,2271,2274,2276],{"class":188,"line":470},[186,2270,2259],{"class":224},[186,2272,2273],{"class":309},"economy",[186,2275,306],{"class":224},[186,2277,612],{"class":228},[186,2279,2280,2282,2285,2287],{"class":188,"line":476},[186,2281,2259],{"class":224},[186,2283,2284],{"class":309},"combat",[186,2286,306],{"class":224},[186,2288,612],{"class":228},[186,2290,2291,2293,2296,2298],{"class":188,"line":481},[186,2292,2259],{"class":224},[186,2294,2295],{"class":309},"admin",[186,2297,306],{"class":224},[186,2299,612],{"class":228},[186,2301,2302,2304,2307,2309],{"class":188,"line":487},[186,2303,2259],{"class":224},[186,2305,2306],{"class":309},"system",[186,2308,306],{"class":224},[186,2310,612],{"class":228},[186,2312,2313,2315,2318],{"class":188,"line":527},[186,2314,2259],{"class":224},[186,2316,2317],{"class":309},"chat",[186,2319,2320],{"class":224},"\"\n",[186,2322,2323],{"class":188,"line":541},[186,2324,2239],{"class":228},[186,2326,2327],{"class":188,"line":552},[186,2328,218],{"emptyLinePlaceholder":217},[186,2330,2331,2333,2336,2338,2340,2342,2344],{"class":188,"line":563},[186,2332,247],{"class":246},[186,2334,2335],{"class":250}," Logger",[186,2337,254],{"class":228},[186,2339,257],{"class":250},[186,2341,260],{"class":224},[186,2343,264],{"class":263},[186,2345,267],{"class":224},[186,2347,2348,2351,2353,2355],{"class":188,"line":577},[186,2349,2350],{"class":228},"    Logger.",[186,2352,264],{"class":276},[186,2354,279],{"class":224},[186,2356,282],{"class":228},[186,2358,2359,2361,2364,2366,2368,2370,2372,2374,2376,2378,2380],{"class":188,"line":615},[186,2360,2350],{"class":228},[186,2362,2363],{"class":276},"logs",[186,2365,279],{"class":224},[186,2367,295],{"class":276},[186,2369,298],{"class":228},[186,2371,301],{"class":250},[186,2373,260],{"class":228},[186,2375,306],{"class":224},[186,2377,2363],{"class":309},[186,2379,306],{"class":224},[186,2381,267],{"class":228},[186,2383,2384],{"class":188,"line":632},[186,2385,218],{"emptyLinePlaceholder":217},[186,2387,2388],{"class":188,"line":643},[186,2389,2390],{"class":192},"    -- Indexes for efficient querying\n",[186,2392,2393,2395,2397,2399,2401,2404,2406,2408,2410,2412,2414,2416,2418,2421,2423],{"class":188,"line":649},[186,2394,2350],{"class":228},[186,2396,2363],{"class":276},[186,2398,298],{"class":228},[186,2400,363],{"class":250},[186,2402,2403],{"class":228},"({ timestamp ",[186,2405,232],{"class":224},[186,2407,449],{"class":224},[186,2409,452],{"class":371},[186,2411,375],{"class":228},[186,2413,413],{"class":224},[186,2415,381],{"class":228},[186,2417,306],{"class":224},[186,2419,2420],{"class":309},"time_desc",[186,2422,306],{"class":224},[186,2424,267],{"class":228},[186,2426,2427,2429,2431,2433,2435,2438,2440,2442,2445,2447,2449,2451,2453,2455,2457,2459,2462,2464],{"class":188,"line":654},[186,2428,2350],{"class":228},[186,2430,2363],{"class":276},[186,2432,298],{"class":228},[186,2434,363],{"class":250},[186,2436,2437],{"class":228},"({ category ",[186,2439,232],{"class":224},[186,2441,372],{"class":371},[186,2443,2444],{"class":228},", timestamp ",[186,2446,232],{"class":224},[186,2448,449],{"class":224},[186,2450,452],{"class":371},[186,2452,375],{"class":228},[186,2454,413],{"class":224},[186,2456,381],{"class":228},[186,2458,306],{"class":224},[186,2460,2461],{"class":309},"category_time",[186,2463,306],{"class":224},[186,2465,267],{"class":228},[186,2467,2468,2470,2472,2474,2476,2478,2480,2482,2484,2486,2488,2490,2492,2494,2496,2498,2501,2503],{"class":188,"line":660},[186,2469,2350],{"class":228},[186,2471,2363],{"class":276},[186,2473,298],{"class":228},[186,2475,363],{"class":250},[186,2477,366],{"class":228},[186,2479,232],{"class":224},[186,2481,372],{"class":371},[186,2483,2444],{"class":228},[186,2485,232],{"class":224},[186,2487,449],{"class":224},[186,2489,452],{"class":371},[186,2491,375],{"class":228},[186,2493,413],{"class":224},[186,2495,381],{"class":228},[186,2497,306],{"class":224},[186,2499,2500],{"class":309},"player_time",[186,2502,306],{"class":224},[186,2504,267],{"class":228},[186,2506,2507,2509,2511,2513,2515,2518,2520,2522,2524,2526,2528,2530,2533,2535],{"class":188,"line":675},[186,2508,2350],{"class":228},[186,2510,2363],{"class":276},[186,2512,298],{"class":228},[186,2514,363],{"class":250},[186,2516,2517],{"class":228},"({ level ",[186,2519,232],{"class":224},[186,2521,372],{"class":371},[186,2523,375],{"class":228},[186,2525,413],{"class":224},[186,2527,381],{"class":228},[186,2529,306],{"class":224},[186,2531,2532],{"class":309},"level_index",[186,2534,306],{"class":224},[186,2536,267],{"class":228},[186,2538,2539],{"class":188,"line":686},[186,2540,473],{"class":246},[186,2542,2543],{"class":188,"line":707},[186,2544,218],{"emptyLinePlaceholder":217},[186,2546,2547],{"class":188,"line":720},[186,2548,2549],{"class":192},"-- Log an event\n",[186,2551,2552,2554,2556,2558,2561,2563,2566,2568,2571,2573,2576,2578,2581],{"class":188,"line":732},[186,2553,247],{"class":246},[186,2555,2335],{"class":250},[186,2557,254],{"class":228},[186,2559,2560],{"class":250},"Log",[186,2562,260],{"class":224},[186,2564,2565],{"class":263},"level",[186,2567,504],{"class":224},[186,2569,2570],{"class":263}," category",[186,2572,504],{"class":224},[186,2574,2575],{"class":263}," message",[186,2577,504],{"class":224},[186,2579,2580],{"class":263}," data",[186,2582,267],{"class":224},[186,2584,2585,2587,2590,2592],{"class":188,"line":755},[186,2586,530],{"class":224},[186,2588,2589],{"class":228}," entry ",[186,2591,232],{"class":224},[186,2593,538],{"class":228},[186,2595,2596,2599,2601],{"class":188,"line":761},[186,2597,2598],{"class":228},"        level ",[186,2600,232],{"class":224},[186,2602,2603],{"class":228}," level,\n",[186,2605,2606,2609,2611],{"class":188,"line":767},[186,2607,2608],{"class":228},"        category ",[186,2610,232],{"class":224},[186,2612,2613],{"class":228}," category,\n",[186,2615,2616,2619,2621],{"class":188,"line":772},[186,2617,2618],{"class":228},"        message ",[186,2620,232],{"class":224},[186,2622,2623],{"class":228}," message,\n",[186,2625,2626,2629,2631,2634,2636],{"class":188,"line":778},[186,2627,2628],{"class":228},"        data ",[186,2630,232],{"class":224},[186,2632,2633],{"class":228}," data ",[186,2635,606],{"class":224},[186,2637,2638],{"class":228}," {},\n",[186,2640,2641,2644,2646,2648],{"class":188,"line":794},[186,2642,2643],{"class":228},"        timestamp ",[186,2645,232],{"class":224},[186,2647,571],{"class":250},[186,2649,574],{"class":228},[186,2651,2652,2655,2657,2660,2662,2665,2667,2669,2671,2674],{"class":188,"line":804},[186,2653,2654],{"class":228},"        server_id ",[186,2656,232],{"class":224},[186,2658,2659],{"class":228}," GetHostName ",[186,2661,588],{"class":224},[186,2663,2664],{"class":250}," GetHostName",[186,2666,597],{"class":228},[186,2668,606],{"class":224},[186,2670,1050],{"class":224},[186,2672,2673],{"class":309},"unknown",[186,2675,2320],{"class":224},[186,2677,2678],{"class":188,"line":814},[186,2679,646],{"class":228},[186,2681,2682],{"class":188,"line":825},[186,2683,218],{"emptyLinePlaceholder":217},[186,2685,2686],{"class":188,"line":841},[186,2687,2688],{"class":192},"    -- Fire and forget - don't block for logging\n",[186,2690,2691,2693,2695,2697,2699,2702,2704,2706,2708],{"class":188,"line":853},[186,2692,2350],{"class":228},[186,2694,2363],{"class":276},[186,2696,298],{"class":228},[186,2698,788],{"class":250},[186,2700,2701],{"class":228},"(entry, ",[186,2703,247],{"class":246},[186,2705,260],{"class":224},[186,2707,715],{"class":263},[186,2709,267],{"class":224},[186,2711,2712,2714,2716],{"class":188,"line":863},[186,2713,1198],{"class":246},[186,2715,726],{"class":228},[186,2717,729],{"class":246},[186,2719,2720,2723,2725,2727,2730,2732],{"class":188,"line":874},[186,2721,2722],{"class":250},"            print",[186,2724,260],{"class":228},[186,2726,306],{"class":224},[186,2728,2729],{"class":309},"[Logger] Failed to log:",[186,2731,306],{"class":224},[186,2733,2734],{"class":228},", err)\n",[186,2736,2737],{"class":188,"line":894},[186,2738,905],{"class":246},[186,2740,2741,2743],{"class":188,"line":902},[186,2742,1344],{"class":246},[186,2744,267],{"class":228},[186,2746,2747],{"class":188,"line":908},[186,2748,473],{"class":246},[186,2750,2751],{"class":188,"line":914},[186,2752,218],{"emptyLinePlaceholder":217},[186,2754,2755],{"class":188,"line":919},[186,2756,2757],{"class":192},"-- Convenience methods\n",[186,2759,2760,2762,2764,2766,2769,2771,2774,2776,2778,2780,2782],{"class":188,"line":924},[186,2761,247],{"class":246},[186,2763,2335],{"class":250},[186,2765,254],{"class":228},[186,2767,2768],{"class":250},"Debug",[186,2770,260],{"class":224},[186,2772,2773],{"class":263},"category",[186,2775,504],{"class":224},[186,2777,2575],{"class":263},[186,2779,504],{"class":224},[186,2781,2580],{"class":263},[186,2783,267],{"class":224},[186,2785,2786,2788,2790,2793,2795,2797,2800],{"class":188,"line":930},[186,2787,2350],{"class":228},[186,2789,2560],{"class":250},[186,2791,2792],{"class":228},"(Logger.",[186,2794,2186],{"class":276},[186,2796,254],{"class":228},[186,2798,2799],{"class":276},"DEBUG",[186,2801,2802],{"class":228},", category, message, data)\n",[186,2804,2805],{"class":188,"line":956},[186,2806,473],{"class":246},[186,2808,2809],{"class":188,"line":970},[186,2810,218],{"emptyLinePlaceholder":217},[186,2812,2813,2815,2817,2819,2822,2824,2826,2828,2830,2832,2834],{"class":188,"line":979},[186,2814,247],{"class":246},[186,2816,2335],{"class":250},[186,2818,254],{"class":228},[186,2820,2821],{"class":250},"Info",[186,2823,260],{"class":224},[186,2825,2773],{"class":263},[186,2827,504],{"class":224},[186,2829,2575],{"class":263},[186,2831,504],{"class":224},[186,2833,2580],{"class":263},[186,2835,267],{"class":224},[186,2837,2838,2840,2842,2844,2846,2848,2851],{"class":188,"line":995},[186,2839,2350],{"class":228},[186,2841,2560],{"class":250},[186,2843,2792],{"class":228},[186,2845,2186],{"class":276},[186,2847,254],{"class":228},[186,2849,2850],{"class":276},"INFO",[186,2852,2802],{"class":228},[186,2854,2855],{"class":188,"line":1012},[186,2856,473],{"class":246},[186,2858,2859],{"class":188,"line":1018},[186,2860,218],{"emptyLinePlaceholder":217},[186,2862,2863,2865,2867,2869,2872,2874,2876,2878,2880,2882,2884],{"class":188,"line":1032},[186,2864,247],{"class":246},[186,2866,2335],{"class":250},[186,2868,254],{"class":228},[186,2870,2871],{"class":250},"Warn",[186,2873,260],{"class":224},[186,2875,2773],{"class":263},[186,2877,504],{"class":224},[186,2879,2575],{"class":263},[186,2881,504],{"class":224},[186,2883,2580],{"class":263},[186,2885,267],{"class":224},[186,2887,2888,2890,2892,2894,2896,2898,2901],{"class":188,"line":1042},[186,2889,2350],{"class":228},[186,2891,2560],{"class":250},[186,2893,2792],{"class":228},[186,2895,2186],{"class":276},[186,2897,254],{"class":228},[186,2899,2900],{"class":276},"WARN",[186,2902,2802],{"class":228},[186,2904,2905],{"class":188,"line":1060},[186,2906,473],{"class":246},[186,2908,2909],{"class":188,"line":1072},[186,2910,218],{"emptyLinePlaceholder":217},[186,2912,2913,2915,2917,2919,2922,2924,2926,2928,2930,2932,2934],{"class":188,"line":1082},[186,2914,247],{"class":246},[186,2916,2335],{"class":250},[186,2918,254],{"class":228},[186,2920,2921],{"class":250},"Error",[186,2923,260],{"class":224},[186,2925,2773],{"class":263},[186,2927,504],{"class":224},[186,2929,2575],{"class":263},[186,2931,504],{"class":224},[186,2933,2580],{"class":263},[186,2935,267],{"class":224},[186,2937,2938,2940,2942,2944,2946,2948,2951],{"class":188,"line":1088},[186,2939,2350],{"class":228},[186,2941,2560],{"class":250},[186,2943,2792],{"class":228},[186,2945,2186],{"class":276},[186,2947,254],{"class":228},[186,2949,2950],{"class":276},"ERROR",[186,2952,2802],{"class":228},[186,2954,2955],{"class":188,"line":1093},[186,2956,473],{"class":246},[186,2958,2959],{"class":188,"line":1115},[186,2960,218],{"emptyLinePlaceholder":217},[186,2962,2963],{"class":188,"line":1120},[186,2964,2965],{"class":192},"-- Query logs\n",[186,2967,2968,2970,2972,2974,2977,2979,2982,2984,2987,2989,2991],{"class":188,"line":1125},[186,2969,247],{"class":246},[186,2971,2335],{"class":250},[186,2973,254],{"class":228},[186,2975,2976],{"class":250},"Query",[186,2978,260],{"class":224},[186,2980,2981],{"class":263},"filter",[186,2983,504],{"class":224},[186,2985,2986],{"class":263}," limit",[186,2988,504],{"class":224},[186,2990,522],{"class":263},[186,2992,267],{"class":224},[186,2994,2995,2998,3000,3003,3005],{"class":188,"line":1130},[186,2996,2997],{"class":228},"    limit ",[186,2999,232],{"class":224},[186,3001,3002],{"class":228}," limit ",[186,3004,606],{"class":224},[186,3006,3007],{"class":371}," 100\n",[186,3009,3010],{"class":188,"line":1135},[186,3011,218],{"emptyLinePlaceholder":217},[186,3013,3014,3016,3018,3020,3022],{"class":188,"line":1141},[186,3015,2350],{"class":228},[186,3017,2363],{"class":276},[186,3019,298],{"class":228},[186,3021,1726],{"class":250},[186,3023,791],{"class":228},[186,3025,3026,3028,3030,3033,3035,3037,3039],{"class":188,"line":1163},[186,3027,689],{"class":228},[186,3029,306],{"class":224},[186,3031,3032],{"class":309},"$match",[186,3034,306],{"class":224},[186,3036,699],{"class":228},[186,3038,232],{"class":224},[186,3040,3041],{"class":228}," filter },\n",[186,3043,3044,3046,3048,3051,3053,3055,3057,3060,3062,3064,3066],{"class":188,"line":1195},[186,3045,689],{"class":228},[186,3047,306],{"class":224},[186,3049,3050],{"class":309},"$sort",[186,3052,306],{"class":224},[186,3054,699],{"class":228},[186,3056,232],{"class":224},[186,3058,3059],{"class":228}," { timestamp ",[186,3061,232],{"class":224},[186,3063,449],{"class":224},[186,3065,452],{"class":371},[186,3067,3068],{"class":228}," } },\n",[186,3070,3071,3073,3075,3078,3080,3082,3084],{"class":188,"line":1208},[186,3072,689],{"class":228},[186,3074,306],{"class":224},[186,3076,3077],{"class":309},"$limit",[186,3079,306],{"class":224},[186,3081,699],{"class":228},[186,3083,232],{"class":224},[186,3085,3086],{"class":228}," limit }\n",[186,3088,3089,3091,3093,3095,3097,3099,3101],{"class":188,"line":1225},[186,3090,2018],{"class":228},[186,3092,247],{"class":246},[186,3094,260],{"class":224},[186,3096,715],{"class":263},[186,3098,504],{"class":224},[186,3100,2029],{"class":263},[186,3102,267],{"class":224},[186,3104,3105,3107,3110,3112],{"class":188,"line":1231},[186,3106,1331],{"class":250},[186,3108,3109],{"class":228},"(results ",[186,3111,606],{"class":224},[186,3113,1444],{"class":228},[186,3115,3116,3118],{"class":188,"line":1236},[186,3117,1344],{"class":246},[186,3119,267],{"class":228},[186,3121,3122],{"class":188,"line":1241},[186,3123,473],{"class":246},[186,3125,3126],{"class":188,"line":1247},[186,3127,218],{"emptyLinePlaceholder":217},[186,3129,3130],{"class":188,"line":1274},[186,3131,3132],{"class":192},"-- Get logs by category\n",[186,3134,3135,3137,3139,3141,3144,3146,3148,3150,3152,3154,3156],{"class":188,"line":1280},[186,3136,247],{"class":246},[186,3138,2335],{"class":250},[186,3140,254],{"class":228},[186,3142,3143],{"class":250},"GetByCategory",[186,3145,260],{"class":224},[186,3147,2773],{"class":263},[186,3149,504],{"class":224},[186,3151,2986],{"class":263},[186,3153,504],{"class":224},[186,3155,522],{"class":263},[186,3157,267],{"class":224},[186,3159,3160,3162,3164,3166,3168],{"class":188,"line":1298},[186,3161,2350],{"class":228},[186,3163,2976],{"class":250},[186,3165,2437],{"class":228},[186,3167,232],{"class":224},[186,3169,3170],{"class":228}," category }, limit, callback)\n",[186,3172,3173],{"class":188,"line":1313},[186,3174,473],{"class":246},[186,3176,3177],{"class":188,"line":1318},[186,3178,218],{"emptyLinePlaceholder":217},[186,3180,3181],{"class":188,"line":1323},[186,3182,3183],{"class":192},"-- Get logs by player\n",[186,3185,3186,3188,3190,3192,3195,3197,3199,3201,3203,3205,3207],{"class":188,"line":1328},[186,3187,247],{"class":246},[186,3189,2335],{"class":250},[186,3191,254],{"class":228},[186,3193,3194],{"class":250},"GetByPlayer",[186,3196,260],{"class":224},[186,3198,501],{"class":263},[186,3200,504],{"class":224},[186,3202,2986],{"class":263},[186,3204,504],{"class":224},[186,3206,522],{"class":263},[186,3208,267],{"class":224},[186,3210,3211,3213,3215,3218,3220,3223,3225,3227,3229],{"class":188,"line":1341},[186,3212,2350],{"class":228},[186,3214,2976],{"class":250},[186,3216,3217],{"class":228},"({ [",[186,3219,306],{"class":224},[186,3221,3222],{"class":309},"data.steamid",[186,3224,306],{"class":224},[186,3226,699],{"class":228},[186,3228,232],{"class":224},[186,3230,3231],{"class":228}," steamid }, limit, callback)\n",[186,3233,3234],{"class":188,"line":1349},[186,3235,473],{"class":246},[186,3237,3238],{"class":188,"line":1354},[186,3239,218],{"emptyLinePlaceholder":217},[186,3241,3242],{"class":188,"line":1359},[186,3243,3244],{"class":192},"-- Get logs by time range\n",[186,3246,3247,3249,3251,3253,3256,3258,3261,3263,3266,3268,3270],{"class":188,"line":1365},[186,3248,247],{"class":246},[186,3250,2335],{"class":250},[186,3252,254],{"class":228},[186,3254,3255],{"class":250},"GetByTimeRange",[186,3257,260],{"class":224},[186,3259,3260],{"class":263},"startTime",[186,3262,504],{"class":224},[186,3264,3265],{"class":263}," endTime",[186,3267,504],{"class":224},[186,3269,522],{"class":263},[186,3271,267],{"class":224},[186,3273,3274,3276,3278],{"class":188,"line":1387},[186,3275,2350],{"class":228},[186,3277,2976],{"class":250},[186,3279,791],{"class":228},[186,3281,3282,3284,3286],{"class":188,"line":1401},[186,3283,2643],{"class":228},[186,3285,232],{"class":224},[186,3287,538],{"class":228},[186,3289,3290,3292,3294,3297,3299,3301,3303],{"class":188,"line":1410},[186,3291,1739],{"class":228},[186,3293,306],{"class":224},[186,3295,3296],{"class":309},"$gte",[186,3298,306],{"class":224},[186,3300,699],{"class":228},[186,3302,232],{"class":224},[186,3304,3305],{"class":228}," startTime,\n",[186,3307,3308,3310,3312,3315,3317,3319,3321],{"class":188,"line":1418},[186,3309,1739],{"class":228},[186,3311,306],{"class":224},[186,3313,3314],{"class":309},"$lte",[186,3316,306],{"class":224},[186,3318,699],{"class":228},[186,3320,232],{"class":224},[186,3322,3323],{"class":228}," endTime\n",[186,3325,3326],{"class":188,"line":1434},[186,3327,2012],{"class":228},[186,3329,3330,3332,3335],{"class":188,"line":1447},[186,3331,2018],{"class":228},[186,3333,3334],{"class":371},"1000",[186,3336,3337],{"class":228},", callback)\n",[186,3339,3340],{"class":188,"line":1452},[186,3341,473],{"class":246},[186,3343,3344],{"class":188,"line":1457},[186,3345,218],{"emptyLinePlaceholder":217},[186,3347,3348],{"class":188,"line":1462},[186,3349,3350],{"class":192},"-- Get error logs\n",[186,3352,3353,3355,3357,3359,3362,3364,3367,3369,3371],{"class":188,"line":1467},[186,3354,247],{"class":246},[186,3356,2335],{"class":250},[186,3358,254],{"class":228},[186,3360,3361],{"class":250},"GetErrors",[186,3363,260],{"class":224},[186,3365,3366],{"class":263},"limit",[186,3368,504],{"class":224},[186,3370,522],{"class":263},[186,3372,267],{"class":224},[186,3374,3375,3377,3379,3381,3383,3386,3388,3390,3392],{"class":188,"line":1473},[186,3376,2350],{"class":228},[186,3378,2976],{"class":250},[186,3380,2517],{"class":228},[186,3382,232],{"class":224},[186,3384,3385],{"class":228}," Logger.",[186,3387,2186],{"class":276},[186,3389,254],{"class":228},[186,3391,2950],{"class":276},[186,3393,3394],{"class":228}," }, limit, callback)\n",[186,3396,3397],{"class":188,"line":1492},[186,3398,473],{"class":246},[186,3400,3401],{"class":188,"line":1523},[186,3402,218],{"emptyLinePlaceholder":217},[186,3404,3405],{"class":188,"line":1535},[186,3406,3407],{"class":192},"-- Get log statistics\n",[186,3409,3410,3412,3414,3416,3418,3420,3423,3425,3427],{"class":188,"line":1542},[186,3411,247],{"class":246},[186,3413,2335],{"class":250},[186,3415,254],{"class":228},[186,3417,1708],{"class":250},[186,3419,260],{"class":224},[186,3421,3422],{"class":263},"hours",[186,3424,504],{"class":224},[186,3426,522],{"class":263},[186,3428,267],{"class":224},[186,3430,3431,3434,3436,3439,3441],{"class":188,"line":1547},[186,3432,3433],{"class":228},"    hours ",[186,3435,232],{"class":224},[186,3437,3438],{"class":228}," hours ",[186,3440,606],{"class":224},[186,3442,3443],{"class":371}," 24\n",[186,3445,3446,3448,3451,3453,3455,3457,3460,3463,3466,3469],{"class":188,"line":1552},[186,3447,530],{"class":224},[186,3449,3450],{"class":228}," since ",[186,3452,232],{"class":224},[186,3454,571],{"class":250},[186,3456,597],{"class":228},[186,3458,3459],{"class":224},"-",[186,3461,3462],{"class":228}," (hours ",[186,3464,3465],{"class":224},"*",[186,3467,3468],{"class":371}," 3600",[186,3470,267],{"class":228},[186,3472,3473],{"class":188,"line":1558},[186,3474,218],{"emptyLinePlaceholder":217},[186,3476,3477,3479,3481,3483,3485],{"class":188,"line":1576},[186,3478,2350],{"class":228},[186,3480,2363],{"class":276},[186,3482,298],{"class":228},[186,3484,1726],{"class":250},[186,3486,791],{"class":228},[186,3488,3489],{"class":188,"line":1590},[186,3490,1593],{"class":228},[186,3492,3493,3495,3497,3499,3501,3503,3505,3507,3509,3511,3513,3515,3517,3519,3521],{"class":188,"line":1596},[186,3494,1739],{"class":228},[186,3496,306],{"class":224},[186,3498,3032],{"class":309},[186,3500,306],{"class":224},[186,3502,699],{"class":228},[186,3504,232],{"class":224},[186,3506,3059],{"class":228},[186,3508,232],{"class":224},[186,3510,1617],{"class":228},[186,3512,306],{"class":224},[186,3514,3296],{"class":309},[186,3516,306],{"class":224},[186,3518,699],{"class":228},[186,3520,232],{"class":224},[186,3522,3523],{"class":228}," since } }\n",[186,3525,3526],{"class":188,"line":1609},[186,3527,1639],{"class":228},[186,3529,3530],{"class":188,"line":1636},[186,3531,1593],{"class":228},[186,3533,3534,3536,3538,3540,3542,3544,3546],{"class":188,"line":1642},[186,3535,1739],{"class":228},[186,3537,306],{"class":224},[186,3539,1744],{"class":309},[186,3541,306],{"class":224},[186,3543,699],{"class":228},[186,3545,232],{"class":224},[186,3547,538],{"class":228},[186,3549,3550,3552,3554,3556,3559,3561],{"class":188,"line":1657},[186,3551,1758],{"class":228},[186,3553,232],{"class":224},[186,3555,1050],{"class":224},[186,3557,3558],{"class":309},"$category",[186,3560,306],{"class":224},[186,3562,612],{"class":228},[186,3564,3565,3568,3570,3572,3574,3576,3578,3580,3582,3584],{"class":188,"line":1673},[186,3566,3567],{"class":228},"                count ",[186,3569,232],{"class":224},[186,3571,1617],{"class":228},[186,3573,306],{"class":224},[186,3575,1779],{"class":309},[186,3577,306],{"class":224},[186,3579,699],{"class":228},[186,3581,232],{"class":224},[186,3583,372],{"class":371},[186,3585,1790],{"class":228},[186,3587,3588,3591,3593],{"class":188,"line":1678},[186,3589,3590],{"class":228},"                errors ",[186,3592,232],{"class":224},[186,3594,538],{"class":228},[186,3596,3597,3599,3601,3603,3605,3607,3609],{"class":188,"line":1683},[186,3598,1805],{"class":228},[186,3600,306],{"class":224},[186,3602,1779],{"class":309},[186,3604,306],{"class":224},[186,3606,699],{"class":228},[186,3608,232],{"class":224},[186,3610,538],{"class":228},[186,3612,3613,3615,3617,3619,3621,3623,3625],{"class":188,"line":1688},[186,3614,1823],{"class":228},[186,3616,306],{"class":224},[186,3618,1828],{"class":309},[186,3620,306],{"class":224},[186,3622,699],{"class":228},[186,3624,232],{"class":224},[186,3626,538],{"class":228},[186,3628,3629,3632,3634,3636,3638,3640,3642,3644,3646,3649,3651,3653,3655,3658,3660,3663,3665,3668,3670,3672,3674],{"class":188,"line":1693},[186,3630,3631],{"class":228},"                            [",[186,3633,306],{"class":224},[186,3635,1841],{"class":309},[186,3637,306],{"class":224},[186,3639,699],{"class":228},[186,3641,232],{"class":224},[186,3643,1617],{"class":228},[186,3645,306],{"class":224},[186,3647,3648],{"class":309},"$eq",[186,3650,306],{"class":224},[186,3652,699],{"class":228},[186,3654,232],{"class":224},[186,3656,3657],{"class":228}," { ",[186,3659,306],{"class":224},[186,3661,3662],{"class":309},"$level",[186,3664,306],{"class":224},[186,3666,3667],{"class":228},", Logger.",[186,3669,2186],{"class":276},[186,3671,254],{"class":228},[186,3673,2950],{"class":276},[186,3675,3068],{"class":228},[186,3677,3678,3680,3682,3684,3686,3688,3690,3692],{"class":188,"line":1699},[186,3679,3631],{"class":228},[186,3681,306],{"class":224},[186,3683,741],{"class":309},[186,3685,306],{"class":224},[186,3687,699],{"class":228},[186,3689,232],{"class":224},[186,3691,372],{"class":371},[186,3693,612],{"class":228},[186,3695,3696,3698,3700,3702,3704,3706,3708],{"class":188,"line":1717},[186,3697,3631],{"class":228},[186,3699,306],{"class":224},[186,3701,1876],{"class":309},[186,3703,306],{"class":224},[186,3705,699],{"class":228},[186,3707,232],{"class":224},[186,3709,3710],{"class":371}," 0\n",[186,3712,3713],{"class":188,"line":1731},[186,3714,3715],{"class":228},"                        }\n",[186,3717,3718],{"class":188,"line":1736},[186,3719,1893],{"class":228},[186,3721,3722],{"class":188,"line":1755},[186,3723,2000],{"class":228},[186,3725,3726],{"class":188,"line":1767},[186,3727,2006],{"class":228},[186,3729,3730],{"class":188,"line":1793},[186,3731,1639],{"class":228},[186,3733,3734,3736,3738,3740,3742,3744,3746,3749,3751,3753,3755],{"class":188,"line":1802},[186,3735,689],{"class":228},[186,3737,306],{"class":224},[186,3739,3050],{"class":309},[186,3741,306],{"class":224},[186,3743,699],{"class":228},[186,3745,232],{"class":224},[186,3747,3748],{"class":228}," { count ",[186,3750,232],{"class":224},[186,3752,449],{"class":224},[186,3754,452],{"class":371},[186,3756,3757],{"class":228}," } }\n",[186,3759,3760,3762,3764,3766,3768,3770,3772],{"class":188,"line":1820},[186,3761,2018],{"class":228},[186,3763,247],{"class":246},[186,3765,260],{"class":224},[186,3767,715],{"class":263},[186,3769,504],{"class":224},[186,3771,2029],{"class":263},[186,3773,267],{"class":224},[186,3775,3776,3778,3780,3782],{"class":188,"line":1890},[186,3777,1331],{"class":250},[186,3779,3109],{"class":228},[186,3781,606],{"class":224},[186,3783,1444],{"class":228},[186,3785,3786,3788],{"class":188,"line":1896},[186,3787,1344],{"class":246},[186,3789,267],{"class":228},[186,3791,3792],{"class":188,"line":1902},[186,3793,473],{"class":246},[186,3795,3796],{"class":188,"line":1912},[186,3797,218],{"emptyLinePlaceholder":217},[186,3799,3800],{"class":188,"line":1929},[186,3801,3802],{"class":192},"-- Cleanup old logs\n",[186,3804,3805,3807,3809,3811,3814,3816,3819,3821,3823],{"class":188,"line":1992},[186,3806,247],{"class":246},[186,3808,2335],{"class":250},[186,3810,254],{"class":228},[186,3812,3813],{"class":250},"Cleanup",[186,3815,260],{"class":224},[186,3817,3818],{"class":263},"daysToKeep",[186,3820,504],{"class":224},[186,3822,522],{"class":263},[186,3824,267],{"class":224},[186,3826,3827,3829,3832,3834,3836,3838,3840,3843,3845,3848,3851,3853],{"class":188,"line":1997},[186,3828,530],{"class":224},[186,3830,3831],{"class":228}," cutoff ",[186,3833,232],{"class":224},[186,3835,571],{"class":250},[186,3837,597],{"class":228},[186,3839,3459],{"class":224},[186,3841,3842],{"class":228}," (daysToKeep ",[186,3844,3465],{"class":224},[186,3846,3847],{"class":371}," 24",[186,3849,3850],{"class":224}," *",[186,3852,3468],{"class":371},[186,3854,267],{"class":228},[186,3856,3857],{"class":188,"line":2003},[186,3858,218],{"emptyLinePlaceholder":217},[186,3860,3861,3863,3865,3867,3869],{"class":188,"line":2009},[186,3862,2350],{"class":228},[186,3864,2363],{"class":276},[186,3866,298],{"class":228},[186,3868,1585],{"class":250},[186,3870,672],{"class":228},[186,3872,3873,3876,3878,3880,3882,3884,3886,3888,3890],{"class":188,"line":2015},[186,3874,3875],{"class":228},"        { timestamp ",[186,3877,232],{"class":224},[186,3879,1617],{"class":228},[186,3881,306],{"class":224},[186,3883,1622],{"class":309},[186,3885,306],{"class":224},[186,3887,699],{"class":228},[186,3889,232],{"class":224},[186,3891,3892],{"class":228}," cutoff } },\n",[186,3894,3895,3897,3899,3901,3903,3905],{"class":188,"line":2034},[186,3896,710],{"class":246},[186,3898,260],{"class":224},[186,3900,715],{"class":263},[186,3902,504],{"class":224},[186,3904,990],{"class":263},[186,3906,267],{"class":224},[186,3908,3909,3911,3913,3915,3917,3919],{"class":188,"line":2056},[186,3910,723],{"class":246},[186,3912,738],{"class":228},[186,3914,741],{"class":246},[186,3916,522],{"class":250},[186,3918,1668],{"class":228},[186,3920,473],{"class":246},[186,3922,3923],{"class":188,"line":2069},[186,3924,905],{"class":246},[186,3926,3927],{"class":188,"line":2075},[186,3928,911],{"class":228},[186,3930,3931],{"class":188,"line":2104},[186,3932,473],{"class":246},[186,3934,3935],{"class":188,"line":2109},[186,3936,218],{"emptyLinePlaceholder":217},[186,3938,3939,3941],{"class":188,"line":2116},[186,3940,2129],{"class":246},[186,3942,3943],{"class":228}," Logger\n",[171,3945,3947],{"id":3946},"server-monitor","Server Monitor",[176,3949,3951],{"className":178,"code":3950,"language":180,"meta":181,"style":181},"--[[\n    Server Monitor\n    Track server performance and player activity\n]]\n\nlocal Monitor = {}\n\nfunction Monitor.Initialize(db)\n    Monitor.db = db\n    Monitor.snapshots = db:Collection(\"server_snapshots\")\n    Monitor.playerSessions = db:Collection(\"player_sessions\")\n\n    -- Indexes\n    Monitor.snapshots:CreateIndex({ timestamp = -1 }, false, \"time_desc\")\n    Monitor.playerSessions:CreateIndex({ steamid = 1, joined_at = -1 }, false, \"player_sessions\")\nend\n\n-- Record server snapshot\nfunction Monitor.RecordSnapshot()\n    local snapshot = {\n        timestamp = os.time(),\n        player_count = player and #player.GetAll() or 0,\n        map = game and game.GetMap() or \"unknown\",\n        hostname = GetHostName and GetHostName() or \"unknown\",\n        tick_rate = 1 \u002F engine.TickInterval(),\n        -- Add more metrics as needed\n    }\n\n    Monitor.snapshots:InsertOneAsync(snapshot, function() end)\nend\n\n-- Get server statistics\nfunction Monitor.GetStats(hours, callback)\n    hours = hours or 24\n    local since = os.time() - (hours * 3600)\n\n    Monitor.snapshots:AggregateAsync({\n        {\n            [\"$match\"] = { timestamp = { [\"$gte\"] = since } }\n        },\n        {\n            [\"$group\"] = {\n                _id = nil,\n                avg_players = { [\"$avg\"] = \"$player_count\" },\n                max_players = { [\"$max\"] = \"$player_count\" },\n                min_players = { [\"$min\"] = \"$player_count\" },\n                snapshots = { [\"$sum\"] = 1 }\n            }\n        }\n    }, function(err, results)\n        if results and #results > 0 then\n            callback(results[1])\n        else\n            callback({ avg_players = 0, max_players = 0, min_players = 0, snapshots = 0 })\n        end\n    end)\nend\n\n-- Track player session\nfunction Monitor.PlayerJoined(steamid, username)\n    Monitor.playerSessions:InsertOneAsync({\n        steamid = steamid,\n        username = username,\n        joined_at = os.time(),\n        left_at = nil,\n        duration = nil\n    })\nend\n\nfunction Monitor.PlayerLeft(steamid)\n    Monitor.playerSessions:UpdateOneAsync(\n        { steamid = steamid, left_at = nil },\n        {\n            [\"$set\"] = { left_at = os.time() }\n        }\n    )\nend\n\n-- Get player activity\nfunction Monitor.GetPlayerActivity(steamid, days, callback)\n    days = days or 30\n    local since = os.time() - (days * 24 * 3600)\n\n    Monitor.playerSessions:AggregateAsync({\n        {\n            [\"$match\"] = {\n                steamid = steamid,\n                joined_at = { [\"$gte\"] = since }\n            }\n        },\n        {\n            [\"$group\"] = {\n                _id = nil,\n                sessions = { [\"$sum\"] = 1 },\n                total_time = {\n                    [\"$sum\"] = {\n                        [\"$subtract\"] = {\n                            { [\"$ifNull\"] = { \"$left_at\", os.time() } },\n                            \"$joined_at\"\n                        }\n                    }\n                },\n                first_seen = { [\"$min\"] = \"$joined_at\" },\n                last_seen = { [\"$max\"] = \"$joined_at\" }\n            }\n        }\n    }, function(err, results)\n        if results and #results > 0 then\n            callback(results[1])\n        else\n            callback({ sessions = 0, total_time = 0 })\n        end\n    end)\nend\n\n-- Get peak hours\nfunction Monitor.GetPeakHours(days, callback)\n    days = days or 7\n    local since = os.time() - (days * 24 * 3600)\n\n    Monitor.snapshots:AggregateAsync({\n        {\n            [\"$match\"] = { timestamp = { [\"$gte\"] = since } }\n        },\n        {\n            [\"$project\"] = {\n                hour = { [\"$mod\"] = {\n                    { [\"$floor\"] = { [\"$divide\"] = { \"$timestamp\", 3600 } } },\n                    24\n                }},\n                player_count = 1\n            }\n        },\n        {\n            [\"$group\"] = {\n                _id = \"$hour\",\n                avg_players = { [\"$avg\"] = \"$player_count\" }\n            }\n        },\n        { [\"$sort\"] = { avg_players = -1 } }\n    }, function(err, results)\n        callback(results or {})\n    end)\nend\n\nreturn Monitor\n",[183,3952,3953,3957,3962,3967,3971,3975,3986,3990,4007,4018,4044,4070,4074,4078,4110,4149,4153,4157,4162,4175,4186,4196,4224,4254,4279,4299,4304,4308,4312,4335,4339,4343,4348,4368,4380,4402,4406,4418,4422,4454,4458,4462,4478,4488,4519,4547,4575,4598,4602,4606,4622,4640,4650,4654,4688,4692,4698,4702,4706,4711,4733,4745,4753,4763,4774,4785,4795,4800,4804,4808,4825,4837,4852,4856,4879,4883,4887,4891,4895,4900,4926,4941,4968,4972,4984,4988,5004,5012,5034,5038,5042,5046,5062,5072,5095,5104,5120,5137,5169,5179,5183,5187,5191,5218,5245,5249,5253,5269,5287,5297,5301,5321,5325,5331,5335,5339,5344,5366,5379,5405,5409,5421,5425,5457,5461,5465,5482,5504,5550,5555,5560,5570,5574,5578,5582,5598,5613,5639,5643,5647,5672,5688,5698,5704,5708,5712],{"__ignoreMap":181},[186,3954,3955],{"class":188,"line":189},[186,3956,193],{"class":192},[186,3958,3959],{"class":188,"line":196},[186,3960,3961],{"class":192},"    Server Monitor\n",[186,3963,3964],{"class":188,"line":202},[186,3965,3966],{"class":192},"    Track server performance and player activity\n",[186,3968,3969],{"class":188,"line":208},[186,3970,211],{"class":192},[186,3972,3973],{"class":188,"line":214},[186,3974,218],{"emptyLinePlaceholder":217},[186,3976,3977,3979,3982,3984],{"class":188,"line":221},[186,3978,225],{"class":224},[186,3980,3981],{"class":228}," Monitor ",[186,3983,232],{"class":224},[186,3985,235],{"class":228},[186,3987,3988],{"class":188,"line":238},[186,3989,218],{"emptyLinePlaceholder":217},[186,3991,3992,3994,3997,3999,4001,4003,4005],{"class":188,"line":243},[186,3993,247],{"class":246},[186,3995,3996],{"class":250}," Monitor",[186,3998,254],{"class":228},[186,4000,257],{"class":250},[186,4002,260],{"class":224},[186,4004,264],{"class":263},[186,4006,267],{"class":224},[186,4008,4009,4012,4014,4016],{"class":188,"line":270},[186,4010,4011],{"class":228},"    Monitor.",[186,4013,264],{"class":276},[186,4015,279],{"class":224},[186,4017,282],{"class":228},[186,4019,4020,4022,4025,4027,4029,4031,4033,4035,4037,4040,4042],{"class":188,"line":285},[186,4021,4011],{"class":228},[186,4023,4024],{"class":276},"snapshots",[186,4026,279],{"class":224},[186,4028,295],{"class":276},[186,4030,298],{"class":228},[186,4032,301],{"class":250},[186,4034,260],{"class":228},[186,4036,306],{"class":224},[186,4038,4039],{"class":309},"server_snapshots",[186,4041,306],{"class":224},[186,4043,267],{"class":228},[186,4045,4046,4048,4051,4053,4055,4057,4059,4061,4063,4066,4068],{"class":188,"line":316},[186,4047,4011],{"class":228},[186,4049,4050],{"class":276},"playerSessions",[186,4052,279],{"class":224},[186,4054,295],{"class":276},[186,4056,298],{"class":228},[186,4058,301],{"class":250},[186,4060,260],{"class":228},[186,4062,306],{"class":224},[186,4064,4065],{"class":309},"player_sessions",[186,4067,306],{"class":224},[186,4069,267],{"class":228},[186,4071,4072],{"class":188,"line":343},[186,4073,218],{"emptyLinePlaceholder":217},[186,4075,4076],{"class":188,"line":348},[186,4077,351],{"class":192},[186,4079,4080,4082,4084,4086,4088,4090,4092,4094,4096,4098,4100,4102,4104,4106,4108],{"class":188,"line":354},[186,4081,4011],{"class":228},[186,4083,4024],{"class":276},[186,4085,298],{"class":228},[186,4087,363],{"class":250},[186,4089,2403],{"class":228},[186,4091,232],{"class":224},[186,4093,449],{"class":224},[186,4095,452],{"class":371},[186,4097,375],{"class":228},[186,4099,413],{"class":224},[186,4101,381],{"class":228},[186,4103,306],{"class":224},[186,4105,2420],{"class":309},[186,4107,306],{"class":224},[186,4109,267],{"class":228},[186,4111,4112,4114,4116,4118,4120,4122,4124,4126,4129,4131,4133,4135,4137,4139,4141,4143,4145,4147],{"class":188,"line":393},[186,4113,4011],{"class":228},[186,4115,4050],{"class":276},[186,4117,298],{"class":228},[186,4119,363],{"class":250},[186,4121,366],{"class":228},[186,4123,232],{"class":224},[186,4125,372],{"class":371},[186,4127,4128],{"class":228},", joined_at ",[186,4130,232],{"class":224},[186,4132,449],{"class":224},[186,4134,452],{"class":371},[186,4136,375],{"class":228},[186,4138,413],{"class":224},[186,4140,381],{"class":228},[186,4142,306],{"class":224},[186,4144,4065],{"class":309},[186,4146,306],{"class":224},[186,4148,267],{"class":228},[186,4150,4151],{"class":188,"line":427},[186,4152,473],{"class":246},[186,4154,4155],{"class":188,"line":470},[186,4156,218],{"emptyLinePlaceholder":217},[186,4158,4159],{"class":188,"line":476},[186,4160,4161],{"class":192},"-- Record server snapshot\n",[186,4163,4164,4166,4168,4170,4173],{"class":188,"line":481},[186,4165,247],{"class":246},[186,4167,3996],{"class":250},[186,4169,254],{"class":228},[186,4171,4172],{"class":250},"RecordSnapshot",[186,4174,871],{"class":224},[186,4176,4177,4179,4182,4184],{"class":188,"line":487},[186,4178,530],{"class":224},[186,4180,4181],{"class":228}," snapshot ",[186,4183,232],{"class":224},[186,4185,538],{"class":228},[186,4187,4188,4190,4192,4194],{"class":188,"line":527},[186,4189,2643],{"class":228},[186,4191,232],{"class":224},[186,4193,571],{"class":250},[186,4195,574],{"class":228},[186,4197,4198,4201,4203,4206,4208,4210,4213,4216,4218,4220,4222],{"class":188,"line":541},[186,4199,4200],{"class":228},"        player_count ",[186,4202,232],{"class":224},[186,4204,4205],{"class":228}," player ",[186,4207,588],{"class":224},[186,4209,2044],{"class":224},[186,4211,4212],{"class":228},"player.",[186,4214,4215],{"class":250},"GetAll",[186,4217,597],{"class":228},[186,4219,606],{"class":224},[186,4221,1006],{"class":371},[186,4223,612],{"class":228},[186,4225,4226,4229,4231,4234,4236,4239,4242,4244,4246,4248,4250,4252],{"class":188,"line":552},[186,4227,4228],{"class":228},"        map ",[186,4230,232],{"class":224},[186,4232,4233],{"class":228}," game ",[186,4235,588],{"class":224},[186,4237,4238],{"class":228}," game.",[186,4240,4241],{"class":250},"GetMap",[186,4243,597],{"class":228},[186,4245,606],{"class":224},[186,4247,1050],{"class":224},[186,4249,2673],{"class":309},[186,4251,306],{"class":224},[186,4253,612],{"class":228},[186,4255,4256,4259,4261,4263,4265,4267,4269,4271,4273,4275,4277],{"class":188,"line":563},[186,4257,4258],{"class":228},"        hostname ",[186,4260,232],{"class":224},[186,4262,2659],{"class":228},[186,4264,588],{"class":224},[186,4266,2664],{"class":250},[186,4268,597],{"class":228},[186,4270,606],{"class":224},[186,4272,1050],{"class":224},[186,4274,2673],{"class":309},[186,4276,306],{"class":224},[186,4278,612],{"class":228},[186,4280,4281,4284,4286,4288,4291,4294,4297],{"class":188,"line":577},[186,4282,4283],{"class":228},"        tick_rate ",[186,4285,232],{"class":224},[186,4287,372],{"class":371},[186,4289,4290],{"class":224}," \u002F",[186,4292,4293],{"class":228}," engine.",[186,4295,4296],{"class":250},"TickInterval",[186,4298,574],{"class":228},[186,4300,4301],{"class":188,"line":615},[186,4302,4303],{"class":192},"        -- Add more metrics as needed\n",[186,4305,4306],{"class":188,"line":632},[186,4307,646],{"class":228},[186,4309,4310],{"class":188,"line":643},[186,4311,218],{"emptyLinePlaceholder":217},[186,4313,4314,4316,4318,4320,4322,4325,4327,4330,4333],{"class":188,"line":649},[186,4315,4011],{"class":228},[186,4317,4024],{"class":276},[186,4319,298],{"class":228},[186,4321,788],{"class":250},[186,4323,4324],{"class":228},"(snapshot, ",[186,4326,247],{"class":246},[186,4328,4329],{"class":224},"()",[186,4331,4332],{"class":246}," end",[186,4334,267],{"class":228},[186,4336,4337],{"class":188,"line":654},[186,4338,473],{"class":246},[186,4340,4341],{"class":188,"line":660},[186,4342,218],{"emptyLinePlaceholder":217},[186,4344,4345],{"class":188,"line":675},[186,4346,4347],{"class":192},"-- Get server statistics\n",[186,4349,4350,4352,4354,4356,4358,4360,4362,4364,4366],{"class":188,"line":686},[186,4351,247],{"class":246},[186,4353,3996],{"class":250},[186,4355,254],{"class":228},[186,4357,1708],{"class":250},[186,4359,260],{"class":224},[186,4361,3422],{"class":263},[186,4363,504],{"class":224},[186,4365,522],{"class":263},[186,4367,267],{"class":224},[186,4369,4370,4372,4374,4376,4378],{"class":188,"line":707},[186,4371,3433],{"class":228},[186,4373,232],{"class":224},[186,4375,3438],{"class":228},[186,4377,606],{"class":224},[186,4379,3443],{"class":371},[186,4381,4382,4384,4386,4388,4390,4392,4394,4396,4398,4400],{"class":188,"line":720},[186,4383,530],{"class":224},[186,4385,3450],{"class":228},[186,4387,232],{"class":224},[186,4389,571],{"class":250},[186,4391,597],{"class":228},[186,4393,3459],{"class":224},[186,4395,3462],{"class":228},[186,4397,3465],{"class":224},[186,4399,3468],{"class":371},[186,4401,267],{"class":228},[186,4403,4404],{"class":188,"line":732},[186,4405,218],{"emptyLinePlaceholder":217},[186,4407,4408,4410,4412,4414,4416],{"class":188,"line":755},[186,4409,4011],{"class":228},[186,4411,4024],{"class":276},[186,4413,298],{"class":228},[186,4415,1726],{"class":250},[186,4417,791],{"class":228},[186,4419,4420],{"class":188,"line":761},[186,4421,1593],{"class":228},[186,4423,4424,4426,4428,4430,4432,4434,4436,4438,4440,4442,4444,4446,4448,4450,4452],{"class":188,"line":767},[186,4425,1739],{"class":228},[186,4427,306],{"class":224},[186,4429,3032],{"class":309},[186,4431,306],{"class":224},[186,4433,699],{"class":228},[186,4435,232],{"class":224},[186,4437,3059],{"class":228},[186,4439,232],{"class":224},[186,4441,1617],{"class":228},[186,4443,306],{"class":224},[186,4445,3296],{"class":309},[186,4447,306],{"class":224},[186,4449,699],{"class":228},[186,4451,232],{"class":224},[186,4453,3523],{"class":228},[186,4455,4456],{"class":188,"line":772},[186,4457,1639],{"class":228},[186,4459,4460],{"class":188,"line":778},[186,4461,1593],{"class":228},[186,4463,4464,4466,4468,4470,4472,4474,4476],{"class":188,"line":794},[186,4465,1739],{"class":228},[186,4467,306],{"class":224},[186,4469,1744],{"class":309},[186,4471,306],{"class":224},[186,4473,699],{"class":228},[186,4475,232],{"class":224},[186,4477,538],{"class":228},[186,4479,4480,4482,4484,4486],{"class":188,"line":804},[186,4481,1758],{"class":228},[186,4483,232],{"class":224},[186,4485,609],{"class":224},[186,4487,612],{"class":228},[186,4489,4490,4493,4495,4497,4499,4502,4504,4506,4508,4510,4513,4516],{"class":188,"line":814},[186,4491,4492],{"class":228},"                avg_players ",[186,4494,232],{"class":224},[186,4496,1617],{"class":228},[186,4498,306],{"class":224},[186,4500,4501],{"class":309},"$avg",[186,4503,306],{"class":224},[186,4505,699],{"class":228},[186,4507,232],{"class":224},[186,4509,1050],{"class":224},[186,4511,4512],{"class":309},"$player_count",[186,4514,4515],{"class":224},"\" ",[186,4517,4518],{"class":228},"},\n",[186,4520,4521,4524,4526,4528,4530,4533,4535,4537,4539,4541,4543,4545],{"class":188,"line":825},[186,4522,4523],{"class":228},"                max_players ",[186,4525,232],{"class":224},[186,4527,1617],{"class":228},[186,4529,306],{"class":224},[186,4531,4532],{"class":309},"$max",[186,4534,306],{"class":224},[186,4536,699],{"class":228},[186,4538,232],{"class":224},[186,4540,1050],{"class":224},[186,4542,4512],{"class":309},[186,4544,4515],{"class":224},[186,4546,4518],{"class":228},[186,4548,4549,4552,4554,4556,4558,4561,4563,4565,4567,4569,4571,4573],{"class":188,"line":841},[186,4550,4551],{"class":228},"                min_players ",[186,4553,232],{"class":224},[186,4555,1617],{"class":228},[186,4557,306],{"class":224},[186,4559,4560],{"class":309},"$min",[186,4562,306],{"class":224},[186,4564,699],{"class":228},[186,4566,232],{"class":224},[186,4568,1050],{"class":224},[186,4570,4512],{"class":309},[186,4572,4515],{"class":224},[186,4574,4518],{"class":228},[186,4576,4577,4580,4582,4584,4586,4588,4590,4592,4594,4596],{"class":188,"line":853},[186,4578,4579],{"class":228},"                snapshots ",[186,4581,232],{"class":224},[186,4583,1617],{"class":228},[186,4585,306],{"class":224},[186,4587,1779],{"class":309},[186,4589,306],{"class":224},[186,4591,699],{"class":228},[186,4593,232],{"class":224},[186,4595,372],{"class":371},[186,4597,1887],{"class":228},[186,4599,4600],{"class":188,"line":863},[186,4601,2006],{"class":228},[186,4603,4604],{"class":188,"line":874},[186,4605,2012],{"class":228},[186,4607,4608,4610,4612,4614,4616,4618,4620],{"class":188,"line":894},[186,4609,2018],{"class":228},[186,4611,247],{"class":246},[186,4613,260],{"class":224},[186,4615,715],{"class":263},[186,4617,504],{"class":224},[186,4619,2029],{"class":263},[186,4621,267],{"class":224},[186,4623,4624,4626,4628,4630,4632,4634,4636,4638],{"class":188,"line":902},[186,4625,1198],{"class":246},[186,4627,2039],{"class":228},[186,4629,588],{"class":224},[186,4631,2044],{"class":224},[186,4633,2047],{"class":228},[186,4635,1003],{"class":224},[186,4637,1006],{"class":371},[186,4639,1009],{"class":246},[186,4641,4642,4644,4646,4648],{"class":188,"line":908},[186,4643,1211],{"class":250},[186,4645,2061],{"class":228},[186,4647,452],{"class":371},[186,4649,2066],{"class":228},[186,4651,4652],{"class":188,"line":914},[186,4653,2072],{"class":246},[186,4655,4656,4658,4661,4663,4665,4668,4670,4672,4675,4677,4679,4682,4684,4686],{"class":188,"line":919},[186,4657,1211],{"class":250},[186,4659,4660],{"class":228},"({ avg_players ",[186,4662,232],{"class":224},[186,4664,1006],{"class":371},[186,4666,4667],{"class":228},", max_players ",[186,4669,232],{"class":224},[186,4671,1006],{"class":371},[186,4673,4674],{"class":228},", min_players ",[186,4676,232],{"class":224},[186,4678,1006],{"class":371},[186,4680,4681],{"class":228},", snapshots ",[186,4683,232],{"class":224},[186,4685,1006],{"class":371},[186,4687,2101],{"class":228},[186,4689,4690],{"class":188,"line":924},[186,4691,905],{"class":246},[186,4693,4694,4696],{"class":188,"line":930},[186,4695,1344],{"class":246},[186,4697,267],{"class":228},[186,4699,4700],{"class":188,"line":956},[186,4701,473],{"class":246},[186,4703,4704],{"class":188,"line":970},[186,4705,218],{"emptyLinePlaceholder":217},[186,4707,4708],{"class":188,"line":979},[186,4709,4710],{"class":192},"-- Track player session\n",[186,4712,4713,4715,4717,4719,4722,4724,4726,4728,4731],{"class":188,"line":995},[186,4714,247],{"class":246},[186,4716,3996],{"class":250},[186,4718,254],{"class":228},[186,4720,4721],{"class":250},"PlayerJoined",[186,4723,260],{"class":224},[186,4725,501],{"class":263},[186,4727,504],{"class":224},[186,4729,4730],{"class":263}," username",[186,4732,267],{"class":224},[186,4734,4735,4737,4739,4741,4743],{"class":188,"line":1012},[186,4736,4011],{"class":228},[186,4738,4050],{"class":276},[186,4740,298],{"class":228},[186,4742,788],{"class":250},[186,4744,791],{"class":228},[186,4746,4747,4749,4751],{"class":188,"line":1018},[186,4748,544],{"class":228},[186,4750,232],{"class":224},[186,4752,549],{"class":228},[186,4754,4755,4758,4760],{"class":188,"line":1032},[186,4756,4757],{"class":228},"        username ",[186,4759,232],{"class":224},[186,4761,4762],{"class":228}," username,\n",[186,4764,4765,4768,4770,4772],{"class":188,"line":1042},[186,4766,4767],{"class":228},"        joined_at ",[186,4769,232],{"class":224},[186,4771,571],{"class":250},[186,4773,574],{"class":228},[186,4775,4776,4779,4781,4783],{"class":188,"line":1060},[186,4777,4778],{"class":228},"        left_at ",[186,4780,232],{"class":224},[186,4782,609],{"class":224},[186,4784,612],{"class":228},[186,4786,4787,4790,4792],{"class":188,"line":1072},[186,4788,4789],{"class":228},"        duration ",[186,4791,232],{"class":224},[186,4793,4794],{"class":224}," nil\n",[186,4796,4797],{"class":188,"line":1082},[186,4798,4799],{"class":228},"    })\n",[186,4801,4802],{"class":188,"line":1088},[186,4803,473],{"class":246},[186,4805,4806],{"class":188,"line":1093},[186,4807,218],{"emptyLinePlaceholder":217},[186,4809,4810,4812,4814,4816,4819,4821,4823],{"class":188,"line":1115},[186,4811,247],{"class":246},[186,4813,3996],{"class":250},[186,4815,254],{"class":228},[186,4817,4818],{"class":250},"PlayerLeft",[186,4820,260],{"class":224},[186,4822,501],{"class":263},[186,4824,267],{"class":224},[186,4826,4827,4829,4831,4833,4835],{"class":188,"line":1120},[186,4828,4011],{"class":228},[186,4830,4050],{"class":276},[186,4832,298],{"class":228},[186,4834,669],{"class":250},[186,4836,672],{"class":228},[186,4838,4839,4841,4843,4846,4848,4850],{"class":188,"line":1125},[186,4840,678],{"class":228},[186,4842,232],{"class":224},[186,4844,4845],{"class":228}," steamid, left_at ",[186,4847,232],{"class":224},[186,4849,609],{"class":224},[186,4851,1790],{"class":228},[186,4853,4854],{"class":188,"line":1130},[186,4855,1593],{"class":228},[186,4857,4858,4860,4862,4864,4866,4868,4870,4873,4875,4877],{"class":188,"line":1135},[186,4859,1739],{"class":228},[186,4861,306],{"class":224},[186,4863,694],{"class":309},[186,4865,306],{"class":224},[186,4867,699],{"class":228},[186,4869,232],{"class":224},[186,4871,4872],{"class":228}," { left_at ",[186,4874,232],{"class":224},[186,4876,571],{"class":250},[186,4878,1633],{"class":228},[186,4880,4881],{"class":188,"line":1141},[186,4882,2012],{"class":228},[186,4884,4885],{"class":188,"line":1163},[186,4886,911],{"class":228},[186,4888,4889],{"class":188,"line":1195},[186,4890,473],{"class":246},[186,4892,4893],{"class":188,"line":1208},[186,4894,218],{"emptyLinePlaceholder":217},[186,4896,4897],{"class":188,"line":1225},[186,4898,4899],{"class":192},"-- Get player activity\n",[186,4901,4902,4904,4906,4908,4911,4913,4915,4917,4920,4922,4924],{"class":188,"line":1231},[186,4903,247],{"class":246},[186,4905,3996],{"class":250},[186,4907,254],{"class":228},[186,4909,4910],{"class":250},"GetPlayerActivity",[186,4912,260],{"class":224},[186,4914,501],{"class":263},[186,4916,504],{"class":224},[186,4918,4919],{"class":263}," days",[186,4921,504],{"class":224},[186,4923,522],{"class":263},[186,4925,267],{"class":224},[186,4927,4928,4931,4933,4936,4938],{"class":188,"line":1236},[186,4929,4930],{"class":228},"    days ",[186,4932,232],{"class":224},[186,4934,4935],{"class":228}," days ",[186,4937,606],{"class":224},[186,4939,4940],{"class":371}," 30\n",[186,4942,4943,4945,4947,4949,4951,4953,4955,4958,4960,4962,4964,4966],{"class":188,"line":1241},[186,4944,530],{"class":224},[186,4946,3450],{"class":228},[186,4948,232],{"class":224},[186,4950,571],{"class":250},[186,4952,597],{"class":228},[186,4954,3459],{"class":224},[186,4956,4957],{"class":228}," (days ",[186,4959,3465],{"class":224},[186,4961,3847],{"class":371},[186,4963,3850],{"class":224},[186,4965,3468],{"class":371},[186,4967,267],{"class":228},[186,4969,4970],{"class":188,"line":1247},[186,4971,218],{"emptyLinePlaceholder":217},[186,4973,4974,4976,4978,4980,4982],{"class":188,"line":1274},[186,4975,4011],{"class":228},[186,4977,4050],{"class":276},[186,4979,298],{"class":228},[186,4981,1726],{"class":250},[186,4983,791],{"class":228},[186,4985,4986],{"class":188,"line":1280},[186,4987,1593],{"class":228},[186,4989,4990,4992,4994,4996,4998,5000,5002],{"class":188,"line":1298},[186,4991,1739],{"class":228},[186,4993,306],{"class":224},[186,4995,3032],{"class":309},[186,4997,306],{"class":224},[186,4999,699],{"class":228},[186,5001,232],{"class":224},[186,5003,538],{"class":228},[186,5005,5006,5008,5010],{"class":188,"line":1313},[186,5007,797],{"class":228},[186,5009,232],{"class":224},[186,5011,549],{"class":228},[186,5013,5014,5017,5019,5021,5023,5025,5027,5029,5031],{"class":188,"line":1318},[186,5015,5016],{"class":228},"                joined_at ",[186,5018,232],{"class":224},[186,5020,1617],{"class":228},[186,5022,306],{"class":224},[186,5024,3296],{"class":309},[186,5026,306],{"class":224},[186,5028,699],{"class":228},[186,5030,232],{"class":224},[186,5032,5033],{"class":228}," since }\n",[186,5035,5036],{"class":188,"line":1323},[186,5037,2006],{"class":228},[186,5039,5040],{"class":188,"line":1328},[186,5041,1639],{"class":228},[186,5043,5044],{"class":188,"line":1341},[186,5045,1593],{"class":228},[186,5047,5048,5050,5052,5054,5056,5058,5060],{"class":188,"line":1349},[186,5049,1739],{"class":228},[186,5051,306],{"class":224},[186,5053,1744],{"class":309},[186,5055,306],{"class":224},[186,5057,699],{"class":228},[186,5059,232],{"class":224},[186,5061,538],{"class":228},[186,5063,5064,5066,5068,5070],{"class":188,"line":1354},[186,5065,1758],{"class":228},[186,5067,232],{"class":224},[186,5069,609],{"class":224},[186,5071,612],{"class":228},[186,5073,5074,5077,5079,5081,5083,5085,5087,5089,5091,5093],{"class":188,"line":1359},[186,5075,5076],{"class":228},"                sessions ",[186,5078,232],{"class":224},[186,5080,1617],{"class":228},[186,5082,306],{"class":224},[186,5084,1779],{"class":309},[186,5086,306],{"class":224},[186,5088,699],{"class":228},[186,5090,232],{"class":224},[186,5092,372],{"class":371},[186,5094,1790],{"class":228},[186,5096,5097,5100,5102],{"class":188,"line":1365},[186,5098,5099],{"class":228},"                total_time ",[186,5101,232],{"class":224},[186,5103,538],{"class":228},[186,5105,5106,5108,5110,5112,5114,5116,5118],{"class":188,"line":1387},[186,5107,1805],{"class":228},[186,5109,306],{"class":224},[186,5111,1779],{"class":309},[186,5113,306],{"class":224},[186,5115,699],{"class":228},[186,5117,232],{"class":224},[186,5119,538],{"class":228},[186,5121,5122,5124,5126,5129,5131,5133,5135],{"class":188,"line":1401},[186,5123,1823],{"class":228},[186,5125,306],{"class":224},[186,5127,5128],{"class":309},"$subtract",[186,5130,306],{"class":224},[186,5132,699],{"class":228},[186,5134,232],{"class":224},[186,5136,538],{"class":228},[186,5138,5139,5142,5144,5147,5149,5151,5153,5155,5157,5160,5162,5164,5166],{"class":188,"line":1410},[186,5140,5141],{"class":228},"                            { [",[186,5143,306],{"class":224},[186,5145,5146],{"class":309},"$ifNull",[186,5148,306],{"class":224},[186,5150,699],{"class":228},[186,5152,232],{"class":224},[186,5154,3657],{"class":228},[186,5156,306],{"class":224},[186,5158,5159],{"class":309},"$left_at",[186,5161,306],{"class":224},[186,5163,381],{"class":228},[186,5165,594],{"class":250},[186,5167,5168],{"class":228},"() } },\n",[186,5170,5171,5174,5177],{"class":188,"line":1418},[186,5172,5173],{"class":224},"                            \"",[186,5175,5176],{"class":309},"$joined_at",[186,5178,2320],{"class":224},[186,5180,5181],{"class":188,"line":1434},[186,5182,3715],{"class":228},[186,5184,5185],{"class":188,"line":1447},[186,5186,1893],{"class":228},[186,5188,5189],{"class":188,"line":1452},[186,5190,1899],{"class":228},[186,5192,5193,5196,5198,5200,5202,5204,5206,5208,5210,5212,5214,5216],{"class":188,"line":1457},[186,5194,5195],{"class":228},"                first_seen ",[186,5197,232],{"class":224},[186,5199,1617],{"class":228},[186,5201,306],{"class":224},[186,5203,4560],{"class":309},[186,5205,306],{"class":224},[186,5207,699],{"class":228},[186,5209,232],{"class":224},[186,5211,1050],{"class":224},[186,5213,5176],{"class":309},[186,5215,4515],{"class":224},[186,5217,4518],{"class":228},[186,5219,5220,5223,5225,5227,5229,5231,5233,5235,5237,5239,5241,5243],{"class":188,"line":1462},[186,5221,5222],{"class":228},"                last_seen ",[186,5224,232],{"class":224},[186,5226,1617],{"class":228},[186,5228,306],{"class":224},[186,5230,4532],{"class":309},[186,5232,306],{"class":224},[186,5234,699],{"class":228},[186,5236,232],{"class":224},[186,5238,1050],{"class":224},[186,5240,5176],{"class":309},[186,5242,4515],{"class":224},[186,5244,2239],{"class":228},[186,5246,5247],{"class":188,"line":1467},[186,5248,2006],{"class":228},[186,5250,5251],{"class":188,"line":1473},[186,5252,2012],{"class":228},[186,5254,5255,5257,5259,5261,5263,5265,5267],{"class":188,"line":1492},[186,5256,2018],{"class":228},[186,5258,247],{"class":246},[186,5260,260],{"class":224},[186,5262,715],{"class":263},[186,5264,504],{"class":224},[186,5266,2029],{"class":263},[186,5268,267],{"class":224},[186,5270,5271,5273,5275,5277,5279,5281,5283,5285],{"class":188,"line":1523},[186,5272,1198],{"class":246},[186,5274,2039],{"class":228},[186,5276,588],{"class":224},[186,5278,2044],{"class":224},[186,5280,2047],{"class":228},[186,5282,1003],{"class":224},[186,5284,1006],{"class":371},[186,5286,1009],{"class":246},[186,5288,5289,5291,5293,5295],{"class":188,"line":1535},[186,5290,1211],{"class":250},[186,5292,2061],{"class":228},[186,5294,452],{"class":371},[186,5296,2066],{"class":228},[186,5298,5299],{"class":188,"line":1542},[186,5300,2072],{"class":246},[186,5302,5303,5305,5308,5310,5312,5315,5317,5319],{"class":188,"line":1547},[186,5304,1211],{"class":250},[186,5306,5307],{"class":228},"({ sessions ",[186,5309,232],{"class":224},[186,5311,1006],{"class":371},[186,5313,5314],{"class":228},", total_time ",[186,5316,232],{"class":224},[186,5318,1006],{"class":371},[186,5320,2101],{"class":228},[186,5322,5323],{"class":188,"line":1552},[186,5324,905],{"class":246},[186,5326,5327,5329],{"class":188,"line":1558},[186,5328,1344],{"class":246},[186,5330,267],{"class":228},[186,5332,5333],{"class":188,"line":1576},[186,5334,473],{"class":246},[186,5336,5337],{"class":188,"line":1590},[186,5338,218],{"emptyLinePlaceholder":217},[186,5340,5341],{"class":188,"line":1596},[186,5342,5343],{"class":192},"-- Get peak hours\n",[186,5345,5346,5348,5350,5352,5355,5357,5360,5362,5364],{"class":188,"line":1609},[186,5347,247],{"class":246},[186,5349,3996],{"class":250},[186,5351,254],{"class":228},[186,5353,5354],{"class":250},"GetPeakHours",[186,5356,260],{"class":224},[186,5358,5359],{"class":263},"days",[186,5361,504],{"class":224},[186,5363,522],{"class":263},[186,5365,267],{"class":224},[186,5367,5368,5370,5372,5374,5376],{"class":188,"line":1636},[186,5369,4930],{"class":228},[186,5371,232],{"class":224},[186,5373,4935],{"class":228},[186,5375,606],{"class":224},[186,5377,5378],{"class":371}," 7\n",[186,5380,5381,5383,5385,5387,5389,5391,5393,5395,5397,5399,5401,5403],{"class":188,"line":1642},[186,5382,530],{"class":224},[186,5384,3450],{"class":228},[186,5386,232],{"class":224},[186,5388,571],{"class":250},[186,5390,597],{"class":228},[186,5392,3459],{"class":224},[186,5394,4957],{"class":228},[186,5396,3465],{"class":224},[186,5398,3847],{"class":371},[186,5400,3850],{"class":224},[186,5402,3468],{"class":371},[186,5404,267],{"class":228},[186,5406,5407],{"class":188,"line":1657},[186,5408,218],{"emptyLinePlaceholder":217},[186,5410,5411,5413,5415,5417,5419],{"class":188,"line":1673},[186,5412,4011],{"class":228},[186,5414,4024],{"class":276},[186,5416,298],{"class":228},[186,5418,1726],{"class":250},[186,5420,791],{"class":228},[186,5422,5423],{"class":188,"line":1678},[186,5424,1593],{"class":228},[186,5426,5427,5429,5431,5433,5435,5437,5439,5441,5443,5445,5447,5449,5451,5453,5455],{"class":188,"line":1683},[186,5428,1739],{"class":228},[186,5430,306],{"class":224},[186,5432,3032],{"class":309},[186,5434,306],{"class":224},[186,5436,699],{"class":228},[186,5438,232],{"class":224},[186,5440,3059],{"class":228},[186,5442,232],{"class":224},[186,5444,1617],{"class":228},[186,5446,306],{"class":224},[186,5448,3296],{"class":309},[186,5450,306],{"class":224},[186,5452,699],{"class":228},[186,5454,232],{"class":224},[186,5456,3523],{"class":228},[186,5458,5459],{"class":188,"line":1688},[186,5460,1639],{"class":228},[186,5462,5463],{"class":188,"line":1693},[186,5464,1593],{"class":228},[186,5466,5467,5469,5471,5474,5476,5478,5480],{"class":188,"line":1699},[186,5468,1739],{"class":228},[186,5470,306],{"class":224},[186,5472,5473],{"class":309},"$project",[186,5475,306],{"class":224},[186,5477,699],{"class":228},[186,5479,232],{"class":224},[186,5481,538],{"class":228},[186,5483,5484,5487,5489,5491,5493,5496,5498,5500,5502],{"class":188,"line":1717},[186,5485,5486],{"class":228},"                hour ",[186,5488,232],{"class":224},[186,5490,1617],{"class":228},[186,5492,306],{"class":224},[186,5494,5495],{"class":309},"$mod",[186,5497,306],{"class":224},[186,5499,699],{"class":228},[186,5501,232],{"class":224},[186,5503,538],{"class":228},[186,5505,5506,5509,5511,5514,5516,5518,5520,5522,5524,5527,5529,5531,5533,5535,5537,5540,5542,5544,5547],{"class":188,"line":1731},[186,5507,5508],{"class":228},"                    { [",[186,5510,306],{"class":224},[186,5512,5513],{"class":309},"$floor",[186,5515,306],{"class":224},[186,5517,699],{"class":228},[186,5519,232],{"class":224},[186,5521,1617],{"class":228},[186,5523,306],{"class":224},[186,5525,5526],{"class":309},"$divide",[186,5528,306],{"class":224},[186,5530,699],{"class":228},[186,5532,232],{"class":224},[186,5534,3657],{"class":228},[186,5536,306],{"class":224},[186,5538,5539],{"class":309},"$timestamp",[186,5541,306],{"class":224},[186,5543,381],{"class":228},[186,5545,5546],{"class":371},"3600",[186,5548,5549],{"class":228}," } } },\n",[186,5551,5552],{"class":188,"line":1736},[186,5553,5554],{"class":371},"                    24\n",[186,5556,5557],{"class":188,"line":1755},[186,5558,5559],{"class":228},"                }},\n",[186,5561,5562,5565,5567],{"class":188,"line":1767},[186,5563,5564],{"class":228},"                player_count ",[186,5566,232],{"class":224},[186,5568,5569],{"class":371}," 1\n",[186,5571,5572],{"class":188,"line":1793},[186,5573,2006],{"class":228},[186,5575,5576],{"class":188,"line":1802},[186,5577,1639],{"class":228},[186,5579,5580],{"class":188,"line":1820},[186,5581,1593],{"class":228},[186,5583,5584,5586,5588,5590,5592,5594,5596],{"class":188,"line":1890},[186,5585,1739],{"class":228},[186,5587,306],{"class":224},[186,5589,1744],{"class":309},[186,5591,306],{"class":224},[186,5593,699],{"class":228},[186,5595,232],{"class":224},[186,5597,538],{"class":228},[186,5599,5600,5602,5604,5606,5609,5611],{"class":188,"line":1896},[186,5601,1758],{"class":228},[186,5603,232],{"class":224},[186,5605,1050],{"class":224},[186,5607,5608],{"class":309},"$hour",[186,5610,306],{"class":224},[186,5612,612],{"class":228},[186,5614,5615,5617,5619,5621,5623,5625,5627,5629,5631,5633,5635,5637],{"class":188,"line":1902},[186,5616,4492],{"class":228},[186,5618,232],{"class":224},[186,5620,1617],{"class":228},[186,5622,306],{"class":224},[186,5624,4501],{"class":309},[186,5626,306],{"class":224},[186,5628,699],{"class":228},[186,5630,232],{"class":224},[186,5632,1050],{"class":224},[186,5634,4512],{"class":309},[186,5636,4515],{"class":224},[186,5638,2239],{"class":228},[186,5640,5641],{"class":188,"line":1912},[186,5642,2006],{"class":228},[186,5644,5645],{"class":188,"line":1929},[186,5646,1639],{"class":228},[186,5648,5649,5651,5653,5655,5657,5659,5661,5664,5666,5668,5670],{"class":188,"line":1992},[186,5650,689],{"class":228},[186,5652,306],{"class":224},[186,5654,3050],{"class":309},[186,5656,306],{"class":224},[186,5658,699],{"class":228},[186,5660,232],{"class":224},[186,5662,5663],{"class":228}," { avg_players ",[186,5665,232],{"class":224},[186,5667,449],{"class":224},[186,5669,452],{"class":371},[186,5671,3757],{"class":228},[186,5673,5674,5676,5678,5680,5682,5684,5686],{"class":188,"line":1997},[186,5675,2018],{"class":228},[186,5677,247],{"class":246},[186,5679,260],{"class":224},[186,5681,715],{"class":263},[186,5683,504],{"class":224},[186,5685,2029],{"class":263},[186,5687,267],{"class":224},[186,5689,5690,5692,5694,5696],{"class":188,"line":2003},[186,5691,1331],{"class":250},[186,5693,3109],{"class":228},[186,5695,606],{"class":224},[186,5697,1444],{"class":228},[186,5699,5700,5702],{"class":188,"line":2009},[186,5701,1344],{"class":246},[186,5703,267],{"class":228},[186,5705,5706],{"class":188,"line":2015},[186,5707,473],{"class":246},[186,5709,5710],{"class":188,"line":2034},[186,5711,218],{"emptyLinePlaceholder":217},[186,5713,5714,5716],{"class":188,"line":2056},[186,5715,2129],{"class":246},[186,5717,5718],{"class":228}," Monitor\n",[171,5720,5722],{"id":5721},"gmod-integration","GMod Integration",[176,5724,5726],{"className":178,"code":5725,"language":180,"meta":181,"style":181},"--[[\n    Admin System Integration for Garry's Mod\n]]\n\nrequire(\"mongo\")\n\nlocal client = MongoDB.Client(\"mongodb:\u002F\u002Flocalhost:27017\")\nlocal db = client:Database(\"gmod_server\")\n\n-- Initialize systems\nBanSystem.Initialize(db)\nLogger.Initialize(db)\nMonitor.Initialize(db)\n\n-- Check bans on connect\nhook.Add(\"CheckPassword\", \"CheckBan\", function(steamid, ip, svPassword, clPassword, name)\n    -- Note: CheckPassword is synchronous, so we need a cached ban list\n    -- or use a different approach\nend)\n\n-- Track player activity\nhook.Add(\"PlayerInitialSpawn\", \"TrackJoin\", function(ply)\n    Monitor.PlayerJoined(ply:SteamID(), ply:Nick())\n    Logger.Info(\"player\", \"Player joined\", {\n        steamid = ply:SteamID(),\n        name = ply:Nick(),\n        ip = ply:IPAddress()\n    })\nend)\n\nhook.Add(\"PlayerDisconnected\", \"TrackLeave\", function(ply)\n    Monitor.PlayerLeft(ply:SteamID())\n    Logger.Info(\"player\", \"Player left\", {\n        steamid = ply:SteamID(),\n        name = ply:Nick()\n    })\nend)\n\n-- Log chat messages\nhook.Add(\"PlayerSay\", \"LogChat\", function(ply, text)\n    Logger.Info(\"chat\", \"Chat message\", {\n        steamid = ply:SteamID(),\n        name = ply:Nick(),\n        message = text\n    })\nend)\n\n-- Record server snapshots every minute\ntimer.Create(\"ServerSnapshot\", 60, 0, function()\n    Monitor.RecordSnapshot()\nend)\n\n-- Cleanup old data daily\ntimer.Create(\"DailyCleanup\", 24 * 3600, 0, function()\n    Logger.Cleanup(30)  -- Keep 30 days\n    BanSystem.CleanupExpired()\n    print(\"[Server] Daily cleanup complete\")\nend)\n\n-- Admin commands\nconcommand.Add(\"ban\", function(ply, cmd, args)\n    if not ply:IsAdmin() then return end\n\n    local target = args[1]\n    local duration = tonumber(args[2]) or nil  -- nil = permanent\n    local reason = table.concat(args, \" \", 3) or \"No reason\"\n\n    BanSystem.Ban(target, reason, duration and duration * 60 or nil, ply:SteamID(), function(success)\n        if success then\n            ply:ChatPrint(\"Player banned successfully\")\n        else\n            ply:ChatPrint(\"Failed to ban player\")\n        end\n    end)\nend)\n\nconcommand.Add(\"unban\", function(ply, cmd, args)\n    if not ply:IsAdmin() then return end\n\n    local target = args[1]\n\n    BanSystem.Unban(target, ply:SteamID(), function(success)\n        if success then\n            ply:ChatPrint(\"Player unbanned\")\n        else\n            ply:ChatPrint(\"Player was not banned\")\n        end\n    end)\nend)\n\nconcommand.Add(\"serverstats\", function(ply)\n    Monitor.GetStats(24, function(stats)\n        ply:ChatPrint(\"=== Server Stats (24h) ===\")\n        ply:ChatPrint(\"Avg Players: \" .. string.format(\"%.1f\", stats.avg_players))\n        ply:ChatPrint(\"Peak: \" .. stats.max_players)\n    end)\nend)\n",[183,5727,5728,5732,5737,5741,5745,5761,5765,5791,5819,5823,5828,5838,5846,5855,5859,5864,5920,5925,5930,5937,5941,5946,5981,6009,6035,6050,6065,6081,6085,6091,6095,6129,6145,6170,6184,6198,6202,6208,6212,6217,6256,6281,6295,6309,6318,6322,6328,6332,6337,6370,6378,6384,6388,6393,6427,6444,6452,6468,6474,6478,6483,6519,6543,6547,6564,6591,6626,6630,6672,6681,6702,6706,6725,6729,6735,6741,6745,6777,6797,6801,6815,6819,6844,6852,6871,6875,6894,6898,6904,6910,6914,6939,6960,6980,7021,7048,7054],{"__ignoreMap":181},[186,5729,5730],{"class":188,"line":189},[186,5731,193],{"class":192},[186,5733,5734],{"class":188,"line":196},[186,5735,5736],{"class":192},"    Admin System Integration for Garry's Mod\n",[186,5738,5739],{"class":188,"line":202},[186,5740,211],{"class":192},[186,5742,5743],{"class":188,"line":208},[186,5744,218],{"emptyLinePlaceholder":217},[186,5746,5747,5750,5752,5754,5757,5759],{"class":188,"line":214},[186,5748,5749],{"class":250},"require",[186,5751,260],{"class":228},[186,5753,306],{"class":224},[186,5755,5756],{"class":309},"mongo",[186,5758,306],{"class":224},[186,5760,267],{"class":228},[186,5762,5763],{"class":188,"line":221},[186,5764,218],{"emptyLinePlaceholder":217},[186,5766,5767,5769,5772,5774,5777,5780,5782,5784,5787,5789],{"class":188,"line":238},[186,5768,225],{"class":224},[186,5770,5771],{"class":228}," client ",[186,5773,232],{"class":224},[186,5775,5776],{"class":228}," MongoDB.",[186,5778,5779],{"class":250},"Client",[186,5781,260],{"class":228},[186,5783,306],{"class":224},[186,5785,5786],{"class":309},"mongodb:\u002F\u002Flocalhost:27017",[186,5788,306],{"class":224},[186,5790,267],{"class":228},[186,5792,5793,5795,5798,5800,5803,5805,5808,5810,5812,5815,5817],{"class":188,"line":243},[186,5794,225],{"class":224},[186,5796,5797],{"class":228}," db ",[186,5799,232],{"class":224},[186,5801,5802],{"class":276}," client",[186,5804,298],{"class":228},[186,5806,5807],{"class":250},"Database",[186,5809,260],{"class":228},[186,5811,306],{"class":224},[186,5813,5814],{"class":309},"gmod_server",[186,5816,306],{"class":224},[186,5818,267],{"class":228},[186,5820,5821],{"class":188,"line":270},[186,5822,218],{"emptyLinePlaceholder":217},[186,5824,5825],{"class":188,"line":285},[186,5826,5827],{"class":192},"-- Initialize systems\n",[186,5829,5830,5833,5835],{"class":188,"line":316},[186,5831,5832],{"class":228},"BanSystem.",[186,5834,257],{"class":250},[186,5836,5837],{"class":228},"(db)\n",[186,5839,5840,5842,5844],{"class":188,"line":343},[186,5841,2183],{"class":228},[186,5843,257],{"class":250},[186,5845,5837],{"class":228},[186,5847,5848,5851,5853],{"class":188,"line":348},[186,5849,5850],{"class":228},"Monitor.",[186,5852,257],{"class":250},[186,5854,5837],{"class":228},[186,5856,5857],{"class":188,"line":354},[186,5858,218],{"emptyLinePlaceholder":217},[186,5860,5861],{"class":188,"line":393},[186,5862,5863],{"class":192},"-- Check bans on connect\n",[186,5865,5866,5869,5872,5874,5876,5879,5881,5883,5885,5888,5890,5892,5894,5896,5898,5900,5903,5905,5908,5910,5913,5915,5918],{"class":188,"line":427},[186,5867,5868],{"class":228},"hook.",[186,5870,5871],{"class":250},"Add",[186,5873,260],{"class":228},[186,5875,306],{"class":224},[186,5877,5878],{"class":309},"CheckPassword",[186,5880,306],{"class":224},[186,5882,381],{"class":228},[186,5884,306],{"class":224},[186,5886,5887],{"class":309},"CheckBan",[186,5889,306],{"class":224},[186,5891,381],{"class":228},[186,5893,247],{"class":246},[186,5895,260],{"class":224},[186,5897,501],{"class":263},[186,5899,504],{"class":224},[186,5901,5902],{"class":263}," ip",[186,5904,504],{"class":224},[186,5906,5907],{"class":263}," svPassword",[186,5909,504],{"class":224},[186,5911,5912],{"class":263}," clPassword",[186,5914,504],{"class":224},[186,5916,5917],{"class":263}," name",[186,5919,267],{"class":224},[186,5921,5922],{"class":188,"line":470},[186,5923,5924],{"class":192},"    -- Note: CheckPassword is synchronous, so we need a cached ban list\n",[186,5926,5927],{"class":188,"line":476},[186,5928,5929],{"class":192},"    -- or use a different approach\n",[186,5931,5932,5935],{"class":188,"line":481},[186,5933,5934],{"class":246},"end",[186,5936,267],{"class":228},[186,5938,5939],{"class":188,"line":487},[186,5940,218],{"emptyLinePlaceholder":217},[186,5942,5943],{"class":188,"line":527},[186,5944,5945],{"class":192},"-- Track player activity\n",[186,5947,5948,5950,5952,5954,5956,5959,5961,5963,5965,5968,5970,5972,5974,5976,5979],{"class":188,"line":541},[186,5949,5868],{"class":228},[186,5951,5871],{"class":250},[186,5953,260],{"class":228},[186,5955,306],{"class":224},[186,5957,5958],{"class":309},"PlayerInitialSpawn",[186,5960,306],{"class":224},[186,5962,381],{"class":228},[186,5964,306],{"class":224},[186,5966,5967],{"class":309},"TrackJoin",[186,5969,306],{"class":224},[186,5971,381],{"class":228},[186,5973,247],{"class":246},[186,5975,260],{"class":224},[186,5977,5978],{"class":263},"ply",[186,5980,267],{"class":224},[186,5982,5983,5985,5987,5989,5991,5993,5996,5999,6001,6003,6006],{"class":188,"line":552},[186,5984,4011],{"class":228},[186,5986,4721],{"class":250},[186,5988,260],{"class":228},[186,5990,5978],{"class":276},[186,5992,298],{"class":228},[186,5994,5995],{"class":250},"SteamID",[186,5997,5998],{"class":228},"(), ",[186,6000,5978],{"class":276},[186,6002,298],{"class":228},[186,6004,6005],{"class":250},"Nick",[186,6007,6008],{"class":228},"())\n",[186,6010,6011,6013,6015,6017,6019,6021,6023,6025,6027,6030,6032],{"class":188,"line":563},[186,6012,2350],{"class":228},[186,6014,2821],{"class":250},[186,6016,260],{"class":228},[186,6018,306],{"class":224},[186,6020,2262],{"class":309},[186,6022,306],{"class":224},[186,6024,381],{"class":228},[186,6026,306],{"class":224},[186,6028,6029],{"class":309},"Player joined",[186,6031,306],{"class":224},[186,6033,6034],{"class":228},", {\n",[186,6036,6037,6039,6041,6044,6046,6048],{"class":188,"line":577},[186,6038,544],{"class":228},[186,6040,232],{"class":224},[186,6042,6043],{"class":276}," ply",[186,6045,298],{"class":228},[186,6047,5995],{"class":250},[186,6049,574],{"class":228},[186,6051,6052,6055,6057,6059,6061,6063],{"class":188,"line":615},[186,6053,6054],{"class":228},"        name ",[186,6056,232],{"class":224},[186,6058,6043],{"class":276},[186,6060,298],{"class":228},[186,6062,6005],{"class":250},[186,6064,574],{"class":228},[186,6066,6067,6070,6072,6074,6076,6079],{"class":188,"line":632},[186,6068,6069],{"class":228},"        ip ",[186,6071,232],{"class":224},[186,6073,6043],{"class":276},[186,6075,298],{"class":228},[186,6077,6078],{"class":250},"IPAddress",[186,6080,871],{"class":228},[186,6082,6083],{"class":188,"line":643},[186,6084,4799],{"class":228},[186,6086,6087,6089],{"class":188,"line":649},[186,6088,5934],{"class":246},[186,6090,267],{"class":228},[186,6092,6093],{"class":188,"line":654},[186,6094,218],{"emptyLinePlaceholder":217},[186,6096,6097,6099,6101,6103,6105,6108,6110,6112,6114,6117,6119,6121,6123,6125,6127],{"class":188,"line":660},[186,6098,5868],{"class":228},[186,6100,5871],{"class":250},[186,6102,260],{"class":228},[186,6104,306],{"class":224},[186,6106,6107],{"class":309},"PlayerDisconnected",[186,6109,306],{"class":224},[186,6111,381],{"class":228},[186,6113,306],{"class":224},[186,6115,6116],{"class":309},"TrackLeave",[186,6118,306],{"class":224},[186,6120,381],{"class":228},[186,6122,247],{"class":246},[186,6124,260],{"class":224},[186,6126,5978],{"class":263},[186,6128,267],{"class":224},[186,6130,6131,6133,6135,6137,6139,6141,6143],{"class":188,"line":675},[186,6132,4011],{"class":228},[186,6134,4818],{"class":250},[186,6136,260],{"class":228},[186,6138,5978],{"class":276},[186,6140,298],{"class":228},[186,6142,5995],{"class":250},[186,6144,6008],{"class":228},[186,6146,6147,6149,6151,6153,6155,6157,6159,6161,6163,6166,6168],{"class":188,"line":686},[186,6148,2350],{"class":228},[186,6150,2821],{"class":250},[186,6152,260],{"class":228},[186,6154,306],{"class":224},[186,6156,2262],{"class":309},[186,6158,306],{"class":224},[186,6160,381],{"class":228},[186,6162,306],{"class":224},[186,6164,6165],{"class":309},"Player left",[186,6167,306],{"class":224},[186,6169,6034],{"class":228},[186,6171,6172,6174,6176,6178,6180,6182],{"class":188,"line":707},[186,6173,544],{"class":228},[186,6175,232],{"class":224},[186,6177,6043],{"class":276},[186,6179,298],{"class":228},[186,6181,5995],{"class":250},[186,6183,574],{"class":228},[186,6185,6186,6188,6190,6192,6194,6196],{"class":188,"line":720},[186,6187,6054],{"class":228},[186,6189,232],{"class":224},[186,6191,6043],{"class":276},[186,6193,298],{"class":228},[186,6195,6005],{"class":250},[186,6197,871],{"class":228},[186,6199,6200],{"class":188,"line":732},[186,6201,4799],{"class":228},[186,6203,6204,6206],{"class":188,"line":755},[186,6205,5934],{"class":246},[186,6207,267],{"class":228},[186,6209,6210],{"class":188,"line":761},[186,6211,218],{"emptyLinePlaceholder":217},[186,6213,6214],{"class":188,"line":767},[186,6215,6216],{"class":192},"-- Log chat messages\n",[186,6218,6219,6221,6223,6225,6227,6230,6232,6234,6236,6239,6241,6243,6245,6247,6249,6251,6254],{"class":188,"line":772},[186,6220,5868],{"class":228},[186,6222,5871],{"class":250},[186,6224,260],{"class":228},[186,6226,306],{"class":224},[186,6228,6229],{"class":309},"PlayerSay",[186,6231,306],{"class":224},[186,6233,381],{"class":228},[186,6235,306],{"class":224},[186,6237,6238],{"class":309},"LogChat",[186,6240,306],{"class":224},[186,6242,381],{"class":228},[186,6244,247],{"class":246},[186,6246,260],{"class":224},[186,6248,5978],{"class":263},[186,6250,504],{"class":224},[186,6252,6253],{"class":263}," text",[186,6255,267],{"class":224},[186,6257,6258,6260,6262,6264,6266,6268,6270,6272,6274,6277,6279],{"class":188,"line":778},[186,6259,2350],{"class":228},[186,6261,2821],{"class":250},[186,6263,260],{"class":228},[186,6265,306],{"class":224},[186,6267,2317],{"class":309},[186,6269,306],{"class":224},[186,6271,381],{"class":228},[186,6273,306],{"class":224},[186,6275,6276],{"class":309},"Chat message",[186,6278,306],{"class":224},[186,6280,6034],{"class":228},[186,6282,6283,6285,6287,6289,6291,6293],{"class":188,"line":794},[186,6284,544],{"class":228},[186,6286,232],{"class":224},[186,6288,6043],{"class":276},[186,6290,298],{"class":228},[186,6292,5995],{"class":250},[186,6294,574],{"class":228},[186,6296,6297,6299,6301,6303,6305,6307],{"class":188,"line":804},[186,6298,6054],{"class":228},[186,6300,232],{"class":224},[186,6302,6043],{"class":276},[186,6304,298],{"class":228},[186,6306,6005],{"class":250},[186,6308,574],{"class":228},[186,6310,6311,6313,6315],{"class":188,"line":814},[186,6312,2618],{"class":228},[186,6314,232],{"class":224},[186,6316,6317],{"class":228}," text\n",[186,6319,6320],{"class":188,"line":825},[186,6321,4799],{"class":228},[186,6323,6324,6326],{"class":188,"line":841},[186,6325,5934],{"class":246},[186,6327,267],{"class":228},[186,6329,6330],{"class":188,"line":853},[186,6331,218],{"emptyLinePlaceholder":217},[186,6333,6334],{"class":188,"line":863},[186,6335,6336],{"class":192},"-- Record server snapshots every minute\n",[186,6338,6339,6342,6345,6347,6349,6352,6354,6356,6359,6361,6364,6366,6368],{"class":188,"line":874},[186,6340,6341],{"class":228},"timer.",[186,6343,6344],{"class":250},"Create",[186,6346,260],{"class":228},[186,6348,306],{"class":224},[186,6350,6351],{"class":309},"ServerSnapshot",[186,6353,306],{"class":224},[186,6355,381],{"class":228},[186,6357,6358],{"class":371},"60",[186,6360,381],{"class":228},[186,6362,6363],{"class":371},"0",[186,6365,381],{"class":228},[186,6367,247],{"class":246},[186,6369,871],{"class":224},[186,6371,6372,6374,6376],{"class":188,"line":894},[186,6373,4011],{"class":228},[186,6375,4172],{"class":250},[186,6377,871],{"class":228},[186,6379,6380,6382],{"class":188,"line":902},[186,6381,5934],{"class":246},[186,6383,267],{"class":228},[186,6385,6386],{"class":188,"line":908},[186,6387,218],{"emptyLinePlaceholder":217},[186,6389,6390],{"class":188,"line":914},[186,6391,6392],{"class":192},"-- Cleanup old data daily\n",[186,6394,6395,6397,6399,6401,6403,6406,6408,6410,6413,6415,6417,6419,6421,6423,6425],{"class":188,"line":919},[186,6396,6341],{"class":228},[186,6398,6344],{"class":250},[186,6400,260],{"class":228},[186,6402,306],{"class":224},[186,6404,6405],{"class":309},"DailyCleanup",[186,6407,306],{"class":224},[186,6409,381],{"class":228},[186,6411,6412],{"class":371},"24",[186,6414,3850],{"class":224},[186,6416,3468],{"class":371},[186,6418,381],{"class":228},[186,6420,6363],{"class":371},[186,6422,381],{"class":228},[186,6424,247],{"class":246},[186,6426,871],{"class":224},[186,6428,6429,6431,6433,6435,6438,6441],{"class":188,"line":924},[186,6430,2350],{"class":228},[186,6432,3813],{"class":250},[186,6434,260],{"class":228},[186,6436,6437],{"class":371},"30",[186,6439,6440],{"class":228},")  ",[186,6442,6443],{"class":192},"-- Keep 30 days\n",[186,6445,6446,6448,6450],{"class":188,"line":930},[186,6447,273],{"class":228},[186,6449,1567],{"class":250},[186,6451,871],{"class":228},[186,6453,6454,6457,6459,6461,6464,6466],{"class":188,"line":956},[186,6455,6456],{"class":250},"    print",[186,6458,260],{"class":228},[186,6460,306],{"class":224},[186,6462,6463],{"class":309},"[Server] Daily cleanup complete",[186,6465,306],{"class":224},[186,6467,267],{"class":228},[186,6469,6470,6472],{"class":188,"line":970},[186,6471,5934],{"class":246},[186,6473,267],{"class":228},[186,6475,6476],{"class":188,"line":979},[186,6477,218],{"emptyLinePlaceholder":217},[186,6479,6480],{"class":188,"line":995},[186,6481,6482],{"class":192},"-- Admin commands\n",[186,6484,6485,6488,6490,6492,6494,6497,6499,6501,6503,6505,6507,6509,6512,6514,6517],{"class":188,"line":1012},[186,6486,6487],{"class":228},"concommand.",[186,6489,5871],{"class":250},[186,6491,260],{"class":228},[186,6493,306],{"class":224},[186,6495,6496],{"class":309},"ban",[186,6498,306],{"class":224},[186,6500,381],{"class":228},[186,6502,247],{"class":246},[186,6504,260],{"class":224},[186,6506,5978],{"class":263},[186,6508,504],{"class":224},[186,6510,6511],{"class":263}," cmd",[186,6513,504],{"class":224},[186,6515,6516],{"class":263}," args",[186,6518,267],{"class":224},[186,6520,6521,6524,6526,6528,6530,6533,6535,6537,6540],{"class":188,"line":1018},[186,6522,6523],{"class":246},"    if",[186,6525,1201],{"class":224},[186,6527,6043],{"class":276},[186,6529,298],{"class":228},[186,6531,6532],{"class":250},"IsAdmin",[186,6534,597],{"class":228},[186,6536,741],{"class":246},[186,6538,6539],{"class":246}," return",[186,6541,6542],{"class":246}," end\n",[186,6544,6545],{"class":188,"line":1032},[186,6546,218],{"emptyLinePlaceholder":217},[186,6548,6549,6551,6554,6556,6559,6561],{"class":188,"line":1042},[186,6550,530],{"class":224},[186,6552,6553],{"class":228}," target ",[186,6555,232],{"class":224},[186,6557,6558],{"class":228}," args[",[186,6560,452],{"class":371},[186,6562,6563],{"class":228},"]\n",[186,6565,6566,6568,6570,6572,6575,6578,6581,6584,6586,6588],{"class":188,"line":1060},[186,6567,530],{"class":224},[186,6569,585],{"class":228},[186,6571,232],{"class":224},[186,6573,6574],{"class":250}," tonumber",[186,6576,6577],{"class":228},"(args[",[186,6579,6580],{"class":371},"2",[186,6582,6583],{"class":228},"]) ",[186,6585,606],{"class":224},[186,6587,609],{"class":224},[186,6589,6590],{"class":192},"  -- nil = permanent\n",[186,6592,6593,6595,6598,6600,6603,6606,6608,6610,6612,6615,6617,6619,6621,6624],{"class":188,"line":1072},[186,6594,530],{"class":224},[186,6596,6597],{"class":228}," reason ",[186,6599,232],{"class":224},[186,6601,6602],{"class":250}," table.concat",[186,6604,6605],{"class":228},"(args, ",[186,6607,306],{"class":224},[186,6609,1050],{"class":224},[186,6611,381],{"class":228},[186,6613,6614],{"class":371},"3",[186,6616,889],{"class":228},[186,6618,606],{"class":224},[186,6620,1050],{"class":224},[186,6622,6623],{"class":309},"No reason",[186,6625,2320],{"class":224},[186,6627,6628],{"class":188,"line":1082},[186,6629,218],{"emptyLinePlaceholder":217},[186,6631,6632,6634,6636,6639,6641,6643,6645,6648,6651,6653,6655,6657,6659,6661,6663,6665,6667,6670],{"class":188,"line":1088},[186,6633,273],{"class":228},[186,6635,496],{"class":250},[186,6637,6638],{"class":228},"(target, reason, duration ",[186,6640,588],{"class":224},[186,6642,585],{"class":228},[186,6644,3465],{"class":224},[186,6646,6647],{"class":371}," 60",[186,6649,6650],{"class":224}," or",[186,6652,609],{"class":224},[186,6654,381],{"class":228},[186,6656,5978],{"class":276},[186,6658,298],{"class":228},[186,6660,5995],{"class":250},[186,6662,5998],{"class":228},[186,6664,247],{"class":246},[186,6666,260],{"class":224},[186,6668,6669],{"class":263},"success",[186,6671,267],{"class":224},[186,6673,6674,6676,6679],{"class":188,"line":1093},[186,6675,1198],{"class":246},[186,6677,6678],{"class":228}," success ",[186,6680,729],{"class":246},[186,6682,6683,6686,6688,6691,6693,6695,6698,6700],{"class":188,"line":1115},[186,6684,6685],{"class":276},"            ply",[186,6687,298],{"class":228},[186,6689,6690],{"class":250},"ChatPrint",[186,6692,260],{"class":228},[186,6694,306],{"class":224},[186,6696,6697],{"class":309},"Player banned successfully",[186,6699,306],{"class":224},[186,6701,267],{"class":228},[186,6703,6704],{"class":188,"line":1120},[186,6705,2072],{"class":246},[186,6707,6708,6710,6712,6714,6716,6718,6721,6723],{"class":188,"line":1125},[186,6709,6685],{"class":276},[186,6711,298],{"class":228},[186,6713,6690],{"class":250},[186,6715,260],{"class":228},[186,6717,306],{"class":224},[186,6719,6720],{"class":309},"Failed to ban player",[186,6722,306],{"class":224},[186,6724,267],{"class":228},[186,6726,6727],{"class":188,"line":1130},[186,6728,905],{"class":246},[186,6730,6731,6733],{"class":188,"line":1135},[186,6732,1344],{"class":246},[186,6734,267],{"class":228},[186,6736,6737,6739],{"class":188,"line":1141},[186,6738,5934],{"class":246},[186,6740,267],{"class":228},[186,6742,6743],{"class":188,"line":1163},[186,6744,218],{"emptyLinePlaceholder":217},[186,6746,6747,6749,6751,6753,6755,6757,6759,6761,6763,6765,6767,6769,6771,6773,6775],{"class":188,"line":1195},[186,6748,6487],{"class":228},[186,6750,5871],{"class":250},[186,6752,260],{"class":228},[186,6754,306],{"class":224},[186,6756,1053],{"class":309},[186,6758,306],{"class":224},[186,6760,381],{"class":228},[186,6762,247],{"class":246},[186,6764,260],{"class":224},[186,6766,5978],{"class":263},[186,6768,504],{"class":224},[186,6770,6511],{"class":263},[186,6772,504],{"class":224},[186,6774,6516],{"class":263},[186,6776,267],{"class":224},[186,6778,6779,6781,6783,6785,6787,6789,6791,6793,6795],{"class":188,"line":1208},[186,6780,6523],{"class":246},[186,6782,1201],{"class":224},[186,6784,6043],{"class":276},[186,6786,298],{"class":228},[186,6788,6532],{"class":250},[186,6790,597],{"class":228},[186,6792,741],{"class":246},[186,6794,6539],{"class":246},[186,6796,6542],{"class":246},[186,6798,6799],{"class":188,"line":1225},[186,6800,218],{"emptyLinePlaceholder":217},[186,6802,6803,6805,6807,6809,6811,6813],{"class":188,"line":1231},[186,6804,530],{"class":224},[186,6806,6553],{"class":228},[186,6808,232],{"class":224},[186,6810,6558],{"class":228},[186,6812,452],{"class":371},[186,6814,6563],{"class":228},[186,6816,6817],{"class":188,"line":1236},[186,6818,218],{"emptyLinePlaceholder":217},[186,6820,6821,6823,6825,6828,6830,6832,6834,6836,6838,6840,6842],{"class":188,"line":1241},[186,6822,273],{"class":228},[186,6824,939],{"class":250},[186,6826,6827],{"class":228},"(target, ",[186,6829,5978],{"class":276},[186,6831,298],{"class":228},[186,6833,5995],{"class":250},[186,6835,5998],{"class":228},[186,6837,247],{"class":246},[186,6839,260],{"class":224},[186,6841,6669],{"class":263},[186,6843,267],{"class":224},[186,6845,6846,6848,6850],{"class":188,"line":1247},[186,6847,1198],{"class":246},[186,6849,6678],{"class":228},[186,6851,729],{"class":246},[186,6853,6854,6856,6858,6860,6862,6864,6867,6869],{"class":188,"line":1274},[186,6855,6685],{"class":276},[186,6857,298],{"class":228},[186,6859,6690],{"class":250},[186,6861,260],{"class":228},[186,6863,306],{"class":224},[186,6865,6866],{"class":309},"Player unbanned",[186,6868,306],{"class":224},[186,6870,267],{"class":228},[186,6872,6873],{"class":188,"line":1280},[186,6874,2072],{"class":246},[186,6876,6877,6879,6881,6883,6885,6887,6890,6892],{"class":188,"line":1298},[186,6878,6685],{"class":276},[186,6880,298],{"class":228},[186,6882,6690],{"class":250},[186,6884,260],{"class":228},[186,6886,306],{"class":224},[186,6888,6889],{"class":309},"Player was not banned",[186,6891,306],{"class":224},[186,6893,267],{"class":228},[186,6895,6896],{"class":188,"line":1313},[186,6897,905],{"class":246},[186,6899,6900,6902],{"class":188,"line":1318},[186,6901,1344],{"class":246},[186,6903,267],{"class":228},[186,6905,6906,6908],{"class":188,"line":1323},[186,6907,5934],{"class":246},[186,6909,267],{"class":228},[186,6911,6912],{"class":188,"line":1328},[186,6913,218],{"emptyLinePlaceholder":217},[186,6915,6916,6918,6920,6922,6924,6927,6929,6931,6933,6935,6937],{"class":188,"line":1341},[186,6917,6487],{"class":228},[186,6919,5871],{"class":250},[186,6921,260],{"class":228},[186,6923,306],{"class":224},[186,6925,6926],{"class":309},"serverstats",[186,6928,306],{"class":224},[186,6930,381],{"class":228},[186,6932,247],{"class":246},[186,6934,260],{"class":224},[186,6936,5978],{"class":263},[186,6938,267],{"class":224},[186,6940,6941,6943,6945,6947,6949,6951,6953,6955,6958],{"class":188,"line":1349},[186,6942,4011],{"class":228},[186,6944,1708],{"class":250},[186,6946,260],{"class":228},[186,6948,6412],{"class":371},[186,6950,381],{"class":228},[186,6952,247],{"class":246},[186,6954,260],{"class":224},[186,6956,6957],{"class":263},"stats",[186,6959,267],{"class":224},[186,6961,6962,6965,6967,6969,6971,6973,6976,6978],{"class":188,"line":1354},[186,6963,6964],{"class":276},"        ply",[186,6966,298],{"class":228},[186,6968,6690],{"class":250},[186,6970,260],{"class":228},[186,6972,306],{"class":224},[186,6974,6975],{"class":309},"=== Server Stats (24h) ===",[186,6977,306],{"class":224},[186,6979,267],{"class":228},[186,6981,6982,6984,6986,6988,6990,6992,6995,6997,7000,7003,7005,7007,7010,7012,7015,7018],{"class":188,"line":1359},[186,6983,6964],{"class":276},[186,6985,298],{"class":228},[186,6987,6690],{"class":250},[186,6989,260],{"class":228},[186,6991,306],{"class":224},[186,6993,6994],{"class":309},"Avg Players: ",[186,6996,4515],{"class":224},[186,6998,6999],{"class":224},"..",[186,7001,7002],{"class":250}," string.format",[186,7004,260],{"class":228},[186,7006,306],{"class":224},[186,7008,7009],{"class":309},"%.1f",[186,7011,306],{"class":224},[186,7013,7014],{"class":228},", stats.",[186,7016,7017],{"class":276},"avg_players",[186,7019,7020],{"class":228},"))\n",[186,7022,7023,7025,7027,7029,7031,7033,7036,7038,7040,7043,7046],{"class":188,"line":1365},[186,7024,6964],{"class":276},[186,7026,298],{"class":228},[186,7028,6690],{"class":250},[186,7030,260],{"class":228},[186,7032,306],{"class":224},[186,7034,7035],{"class":309},"Peak: ",[186,7037,4515],{"class":224},[186,7039,6999],{"class":224},[186,7041,7042],{"class":228}," stats.",[186,7044,7045],{"class":276},"max_players",[186,7047,267],{"class":228},[186,7049,7050,7052],{"class":188,"line":1387},[186,7051,1344],{"class":246},[186,7053,267],{"class":228},[186,7055,7056,7058],{"class":188,"line":1401},[186,7057,5934],{"class":246},[186,7059,267],{"class":228},[171,7061,7063],{"id":7062},"next-steps","Next Steps",[7065,7066,7067,7074],"ul",{},[7068,7069,7070,7073],"li",{},[7071,7072,130],"a",{"href":131}," - Complete method documentation",[7068,7075,7076,7078],{},[7071,7077,5],{"href":6}," - Setup guide",[7080,7081,7082],"style",{},"html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":181,"searchDepth":189,"depth":196,"links":7084},[7085,7086,7087,7088,7089],{"id":173,"depth":196,"text":174},{"id":2135,"depth":196,"text":2136},{"id":3946,"depth":196,"text":3947},{"id":5721,"depth":196,"text":5722},{"id":7062,"depth":196,"text":7063},"Ban system, logging, and server monitoring examples","md",null,{},{"icon":128},{"title":125,"description":7090},"C3_Bv4uZpuKx7WhWZBi2bs-sw003toRCubnzccAmqDY",[7098,7100],{"title":120,"path":121,"stem":122,"description":7099,"icon":123,"children":-1},"Leaderboards, achievements, and matchmaking examples",{"title":130,"path":131,"stem":132,"description":7101,"icon":113,"children":-1},"Complete reference for all gmsv_mongo classes and methods",1774271025444]