<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.flexiblesurvival.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADependencyList</id>
	<title>Module:DependencyList - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.flexiblesurvival.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ADependencyList"/>
	<link rel="alternate" type="text/html" href="https://wiki.flexiblesurvival.com/index.php?title=Module:DependencyList&amp;action=history"/>
	<updated>2026-05-05T09:32:47Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://wiki.flexiblesurvival.com/index.php?title=Module:DependencyList&amp;diff=2356094&amp;oldid=prev</id>
		<title>Syntax McBucketface at 17:23, 22 May 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flexiblesurvival.com/index.php?title=Module:DependencyList&amp;diff=2356094&amp;oldid=prev"/>
		<updated>2025-05-22T17:23:41Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:23, 22 May 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l548&quot;&gt;Line 548:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 548:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     for _, item in ipairs( styleList ) do&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     for _, item in ipairs( styleList ) do&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         table.insert( res, string.format(&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         table.insert( res, string.format(&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             &quot;&amp;lt;div role=&#039;note&#039; class=&#039;hatnote&#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&#039;&amp;gt;&amp;lt;span class=&#039;hatnote-icon metadata&#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&#039;&#039;&#039;%s&#039;&#039;&#039; invokes [[%s]] using [&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[Star Citizen&lt;/del&gt;:TemplateStyles&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|&lt;/del&gt;TemplateStyles&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;].&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             &quot;&amp;lt;div role=&#039;note&#039; class=&#039;hatnote&#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&#039;&amp;gt;&amp;lt;span class=&#039;hatnote-icon metadata&#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&#039;&#039;&#039;%s&#039;&#039;&#039; invokes [[%s]] using [&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;https://www.mediawiki.org/wiki/Extension&lt;/ins&gt;:TemplateStyles TemplateStyles].&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             templateName,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             templateName,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             item.styleName&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             item.styleName&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Syntax McBucketface</name></author>
	</entry>
	<entry>
		<id>https://wiki.flexiblesurvival.com/index.php?title=Module:DependencyList&amp;diff=2356086&amp;oldid=prev</id>
		<title>Syntax McBucketface at 16:46, 22 May 2025</title>
		<link rel="alternate" type="text/html" href="https://wiki.flexiblesurvival.com/index.php?title=Module:DependencyList&amp;diff=2356086&amp;oldid=prev"/>
		<updated>2025-05-22T16:46:37Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:46, 22 May 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l343&quot;&gt;Line 343:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Line 343:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     for _, item in ipairs( invokeList ) do&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     for _, item in ipairs( invokeList ) do&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         table.insert( res, string.format(&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         table.insert( res, string.format(&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             &quot;&amp;lt;div role=&#039;note&#039; class=&#039;hatnote&#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&#039;&amp;gt;&amp;lt;span class=&#039;hatnote-icon metadata&#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&#039;&#039;&#039;%s&#039;&#039;&#039; invokes function &#039;&#039;&#039;%s&#039;&#039;&#039; in [[%s]] using [&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[Star Citizen&lt;/del&gt;:Lua&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;|&lt;/del&gt;Lua&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;]&lt;/del&gt;].&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&quot;,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             &quot;&amp;lt;div role=&#039;note&#039; class=&#039;hatnote&#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&#039;&amp;gt;&amp;lt;span class=&#039;hatnote-icon metadata&#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&#039;&#039;&#039;%s&#039;&#039;&#039; invokes function &#039;&#039;&#039;%s&#039;&#039;&#039; in [[%s]] using [&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;https&lt;/ins&gt;:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;//en.wikipedia.org/wiki/&lt;/ins&gt;Lua Lua].&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&quot;,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             templateName,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             templateName,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             item.funcName,&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;             item.funcName,&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>Syntax McBucketface</name></author>
	</entry>
	<entry>
		<id>https://wiki.flexiblesurvival.com/index.php?title=Module:DependencyList&amp;diff=2356081&amp;oldid=prev</id>
		<title>Syntax McBucketface: Protected &quot;Module:DependencyList&quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))</title>
		<link rel="alternate" type="text/html" href="https://wiki.flexiblesurvival.com/index.php?title=Module:DependencyList&amp;diff=2356081&amp;oldid=prev"/>
		<updated>2025-05-22T16:33:21Z</updated>

		<summary type="html">&lt;p&gt;Protected &amp;quot;&lt;a href=&quot;/w/Module:DependencyList&quot; title=&quot;Module:DependencyList&quot;&gt;Module:DependencyList&lt;/a&gt;&amp;quot; ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite))&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 16:33, 22 May 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Syntax McBucketface</name></author>
	</entry>
	<entry>
		<id>https://wiki.flexiblesurvival.com/index.php?title=Module:DependencyList&amp;diff=2356070&amp;oldid=prev</id>
		<title>Syntax McBucketface: Created page with &quot;-- &lt;nowiki&gt; local p = {} local libraryUtil = require( &#039;libraryUtil&#039; ) local enum = require( &#039;Module:Enum&#039; ) local yn = require( &#039;Module:Yesno&#039; ) local param = require( &#039;Module:Paramtest&#039; ) local dpl = require( &#039;Module:DPLlua&#039; ) local moduleIsUsed = false local COLLAPSE_LIST_LENGTH_THRESHOLD = 5 local MAX_DYNAMIC_REQUIRE_LIST_LENGTH = 30 local dynamicRequireListQueryCache = {}  --- Used in case &#039;require( varName )&#039; is found. Attempts to find a string value stored in &#039;varN...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.flexiblesurvival.com/index.php?title=Module:DependencyList&amp;diff=2356070&amp;oldid=prev"/>
		<updated>2025-05-22T16:29:14Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-- &amp;lt;nowiki&amp;gt; local p = {} local libraryUtil = require( &amp;#039;libraryUtil&amp;#039; ) local enum = require( &amp;#039;Module:Enum&amp;#039; ) local yn = require( &amp;#039;Module:Yesno&amp;#039; ) local param = require( &amp;#039;Module:Paramtest&amp;#039; ) local dpl = require( &amp;#039;Module:DPLlua&amp;#039; ) local moduleIsUsed = false local COLLAPSE_LIST_LENGTH_THRESHOLD = 5 local MAX_DYNAMIC_REQUIRE_LIST_LENGTH = 30 local dynamicRequireListQueryCache = {}  --- Used in case &amp;#039;require( varName )&amp;#039; is found. Attempts to find a string value stored in &amp;#039;varN...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- &amp;lt;nowiki&amp;gt;&lt;br /&gt;
local p = {}&lt;br /&gt;
local libraryUtil = require( &amp;#039;libraryUtil&amp;#039; )&lt;br /&gt;
local enum = require( &amp;#039;Module:Enum&amp;#039; )&lt;br /&gt;
local yn = require( &amp;#039;Module:Yesno&amp;#039; )&lt;br /&gt;
local param = require( &amp;#039;Module:Paramtest&amp;#039; )&lt;br /&gt;
local dpl = require( &amp;#039;Module:DPLlua&amp;#039; )&lt;br /&gt;
local moduleIsUsed = false&lt;br /&gt;
local COLLAPSE_LIST_LENGTH_THRESHOLD = 5&lt;br /&gt;
local MAX_DYNAMIC_REQUIRE_LIST_LENGTH = 30&lt;br /&gt;
local dynamicRequireListQueryCache = {}&lt;br /&gt;
&lt;br /&gt;
--- Used in case &amp;#039;require( varName )&amp;#039; is found. Attempts to find a string value stored in &amp;#039;varName&amp;#039;.&lt;br /&gt;
---@param content string    The content of the module to search in&lt;br /&gt;
---@param varName string&lt;br /&gt;
---@return string&lt;br /&gt;
local function substVarValue( content, varName )&lt;br /&gt;
    local res = content:match( varName .. &amp;#039;%s*=%s*(%b&amp;quot;&amp;quot;%s-%.*)&amp;#039; ) or content:match( varName .. &amp;quot;%s*=%s*(%b&amp;#039;&amp;#039;%s-%.*)&amp;quot; ) or &amp;#039;&amp;#039;&lt;br /&gt;
    if res:find( &amp;#039;^([&amp;quot;\&amp;#039;])[Mm]odule:[%S]+%1&amp;#039; ) and not res:find( &amp;#039;%.%.&amp;#039; ) and not res:find( &amp;#039;%%%a&amp;#039; ) then&lt;br /&gt;
        return mw.text.trim( res )&lt;br /&gt;
    else&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param capture string&lt;br /&gt;
---@param content string    The content of the module to search in&lt;br /&gt;
---@return string&lt;br /&gt;
local function extractModuleName( capture, content )&lt;br /&gt;
    capture = capture:gsub( &amp;#039;^%(%s*(.-)%s*%)$&amp;#039;, &amp;#039;%1&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    if capture:find( &amp;#039;^([&amp;quot;\&amp;#039;]).-%1$&amp;#039; ) then -- Check if it is already a pure string&lt;br /&gt;
        return capture&lt;br /&gt;
    elseif capture:find( &amp;#039;^[%a_][%w_]*$&amp;#039; ) then -- Check if if is a single variable&lt;br /&gt;
        return substVarValue( content, capture )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return capture&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param str string&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatModuleName( str )&lt;br /&gt;
    return (str:gsub( &amp;#039;^([\&amp;#039;\&amp;quot;])(.-)%1$&amp;#039;, function(_, x) return x end ) -- Only remove quotes at start and end of string if both are the same type&lt;br /&gt;
        :gsub( &amp;#039;_&amp;#039;, &amp;#039; &amp;#039; )&lt;br /&gt;
        :gsub( &amp;#039;^.&amp;#039;, string.upper )&lt;br /&gt;
        :gsub( &amp;#039;:(.)&amp;#039;, function(x) return &amp;#039;:&amp;#039;..x:upper() end ))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Used in case a construct like &amp;#039;require( &amp;quot;Module:wowee/&amp;quot; .. isTheBest )&amp;#039; is found.&lt;br /&gt;
--- Will return a list of pages which satisfy this pattern where &amp;#039;isTheBest&amp;#039; can take any value.&lt;br /&gt;
---@param query string&lt;br /&gt;
---@return string[]     Sequence of strings&lt;br /&gt;
local function getDynamicRequireList( query )&lt;br /&gt;
    if query:find( &amp;#039;%.%.&amp;#039; ) then&lt;br /&gt;
        query = mw.text.split( query, &amp;#039;..&amp;#039;, true )&lt;br /&gt;
        query = enum.map( query, function(x) return mw.text.trim(x) end )&lt;br /&gt;
        query = enum.map( query, function(x) return (x:match(&amp;#039;^[\&amp;#039;\&amp;quot;](.-)[\&amp;#039;\&amp;quot;]$&amp;#039;) or &amp;#039;%&amp;#039;) end )&lt;br /&gt;
        query = table.concat( query )&lt;br /&gt;
    else&lt;br /&gt;
        _, query = query:match( &amp;#039;([&amp;quot;\&amp;#039;])(.-)%1&amp;#039; )&lt;br /&gt;
        query = query:gsub( &amp;#039;%%%a&amp;#039;, &amp;#039;%%&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
    query = query:gsub( &amp;#039;^[Mm]odule:&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    if query:find( &amp;#039;^[Ee]xchange/&amp;#039; ) or query:find( &amp;#039;^[Dd]ata/&amp;#039; ) then&lt;br /&gt;
        return { &amp;#039;Module:&amp;#039; .. query }   -- This format will later be used by formatDynamicQueryLink()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if dynamicRequireListQueryCache[ query ] then&lt;br /&gt;
        return dynamicRequireListQueryCache[ query ]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local list = dpl.ask{&lt;br /&gt;
        namespace = &amp;#039;Module&amp;#039;,&lt;br /&gt;
        titlematch = query,&lt;br /&gt;
        nottitlematch = &amp;#039;%/doc|&amp;#039;..query..&amp;#039;/%&amp;#039;,&lt;br /&gt;
        distinct = &amp;#039;strict&amp;#039;,&lt;br /&gt;
        ignorecase = true,&lt;br /&gt;
        ordermethod = &amp;#039;title&amp;#039;,&lt;br /&gt;
        count = MAX_DYNAMIC_REQUIRE_LIST_LENGTH + 1,&lt;br /&gt;
        skipthispage = &amp;#039;no&amp;#039;,&lt;br /&gt;
        allowcachedresults = true,&lt;br /&gt;
        cacheperiod = 604800 -- One week&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if #list &amp;gt; MAX_DYNAMIC_REQUIRE_LIST_LENGTH then&lt;br /&gt;
        list = { &amp;#039;Module:&amp;#039; .. query }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    dynamicRequireListQueryCache[ query ] = list&lt;br /&gt;
&lt;br /&gt;
    return list&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a list of modules loaded and required by module &amp;#039;moduleName&amp;#039;.&lt;br /&gt;
---@param moduleName string&lt;br /&gt;
---@param searchForUsedTemplates boolean&lt;br /&gt;
---@return string[], string[], string[]&lt;br /&gt;
local function getRequireList( moduleName, searchForUsedTemplates )&lt;br /&gt;
    local content = mw.title.new( moduleName ):getContent()&lt;br /&gt;
    local requireList = {}&lt;br /&gt;
    local loadDataList = {}&lt;br /&gt;
    local usedTemplateList = {}&lt;br /&gt;
    local dynamicRequirelist = {}&lt;br /&gt;
    local dynamicLoadDataList = {}&lt;br /&gt;
&lt;br /&gt;
    assert( param.has_content( content ), string.format( &amp;#039;%s does not exist&amp;#039;, moduleName ) )&lt;br /&gt;
&lt;br /&gt;
    content = content:gsub( &amp;#039;%-%-%[(=-)%[.-%]%1%]&amp;#039;, &amp;#039;&amp;#039; ):gsub( &amp;#039;%-%-[^\n]*&amp;#039;, &amp;#039;&amp;#039; ) -- Strip comments&lt;br /&gt;
&lt;br /&gt;
    local function dualGmatch( str, pat1, pat2 )&lt;br /&gt;
        local f1 = string.gmatch( str, pat1 )&lt;br /&gt;
        local f2 = string.gmatch( str, pat2 )&lt;br /&gt;
        return function()&lt;br /&gt;
            return f1() or f2()&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for match in dualGmatch( content, &amp;#039;require%s*(%b())&amp;#039;, &amp;#039;require%s*(([&amp;quot;\&amp;#039;])%s*[Mm]odule:.-%2)&amp;#039; ) do&lt;br /&gt;
        match = mw.text.trim( match )&lt;br /&gt;
        match = extractModuleName( match, content )&lt;br /&gt;
&lt;br /&gt;
        if match:find( &amp;#039;%.%.&amp;#039; ) or match:find( &amp;#039;%%%a&amp;#039; ) then&lt;br /&gt;
            for _, x in ipairs( getDynamicRequireList( match ) ) do&lt;br /&gt;
                table.insert( dynamicRequirelist, x )&lt;br /&gt;
            end&lt;br /&gt;
        elseif match ~= &amp;#039;&amp;#039; then&lt;br /&gt;
            match = formatModuleName( match )&lt;br /&gt;
&lt;br /&gt;
            if match == &amp;#039;LibraryUtil&amp;#039; then&lt;br /&gt;
                match = &amp;#039;Module:LibraryUtil&amp;#039;&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            table.insert( requireList, match )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for match in dualGmatch( content, &amp;#039;mw%.loadData%s*(%b())&amp;#039;, &amp;#039;mw%.loadData%s*(([&amp;quot;\&amp;#039;])%s*[Mm]odule:.-%2)&amp;#039; ) do&lt;br /&gt;
        match = mw.text.trim( match )&lt;br /&gt;
        match = extractModuleName( match, content )&lt;br /&gt;
&lt;br /&gt;
        if match:find( &amp;#039;%.%.&amp;#039; ) or match:find( &amp;#039;%%%a&amp;#039; ) then&lt;br /&gt;
            for _, x in ipairs( getDynamicRequireList( match ) ) do&lt;br /&gt;
                table.insert( dynamicLoadDataList, x )&lt;br /&gt;
            end&lt;br /&gt;
        elseif match ~= &amp;#039;&amp;#039; then&lt;br /&gt;
            match = formatModuleName( match )&lt;br /&gt;
            table.insert( loadDataList, match )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for func, match in string.gmatch( content, &amp;#039;pcall%s*%(([^,]+),([^%),]+)&amp;#039; ) do&lt;br /&gt;
        func = mw.text.trim( func )&lt;br /&gt;
        match = mw.text.trim( match )&lt;br /&gt;
&lt;br /&gt;
        if func == &amp;#039;require&amp;#039; then&lt;br /&gt;
            for _, x in ipairs( getDynamicRequireList( match ) ) do&lt;br /&gt;
                table.insert( dynamicRequirelist, x )&lt;br /&gt;
            end&lt;br /&gt;
        elseif func == &amp;#039;mw.loadData&amp;#039; then&lt;br /&gt;
            for _, x in ipairs( getDynamicRequireList( match ) ) do&lt;br /&gt;
                table.insert( dynamicLoadDataList, x )&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if searchForUsedTemplates then&lt;br /&gt;
        for preprocess in string.gmatch( content, &amp;#039;:preprocess%s*(%b())&amp;#039; ) do&lt;br /&gt;
            local function recursiveGMatch( str, pat )&lt;br /&gt;
                local list = {}&lt;br /&gt;
                local i = 0&lt;br /&gt;
                repeat&lt;br /&gt;
                    for match in string.gmatch( list[i] or str, pat ) do&lt;br /&gt;
                        table.insert( list, match )&lt;br /&gt;
                    end&lt;br /&gt;
                    i =  i + 1&lt;br /&gt;
                until i &amp;gt; #list or i &amp;gt; 100&lt;br /&gt;
&lt;br /&gt;
                i = 0&lt;br /&gt;
                return function()&lt;br /&gt;
                    i = i + 1&lt;br /&gt;
                    return list[i]&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
&lt;br /&gt;
            for template in recursiveGMatch( preprocess, &amp;#039;{(%b{})}&amp;#039; ) do&lt;br /&gt;
                local name = string.match( template, &amp;#039;{(.-)[|{}]&amp;#039; )&lt;br /&gt;
                if name ~= &amp;#039;&amp;#039; then&lt;br /&gt;
                    if name:find( &amp;#039;:&amp;#039; ) then&lt;br /&gt;
                        local ns = name:match( &amp;#039;^(.-):&amp;#039; )&lt;br /&gt;
                        if enum.contains( {&amp;#039;&amp;#039;, &amp;#039;template&amp;#039;, &amp;#039;user&amp;#039;}, ns:lower() ) then&lt;br /&gt;
                            table.insert( usedTemplateList, name )&lt;br /&gt;
                        elseif ns == ns:upper() then&lt;br /&gt;
                            table.insert( usedTemplateList, ns ) -- Probably a magic word&lt;br /&gt;
                        end&lt;br /&gt;
                    else&lt;br /&gt;
                        if name:match( &amp;#039;^%u+$&amp;#039; ) or name == &amp;#039;!&amp;#039; then&lt;br /&gt;
                            table.insert( usedTemplateList, name ) -- Probably a magic word&lt;br /&gt;
                        else&lt;br /&gt;
                            table.insert( usedTemplateList, &amp;#039;Template:&amp;#039;..name )&lt;br /&gt;
                        end&lt;br /&gt;
                    end&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    dynamicRequirelist = enum.reject( dynamicRequirelist, function(x) return (enum.contains(requireList, x) or enum.contains(loadDataList, x)) end )&lt;br /&gt;
    dynamicLoadDataList = enum.reject( dynamicLoadDataList, function(x) return (enum.contains(requireList, x) or enum.contains(loadDataList, x)) end )&lt;br /&gt;
    requireList = enum.insert( requireList, dynamicRequirelist )&lt;br /&gt;
    requireList = enum.unique( requireList )&lt;br /&gt;
    loadDataList = enum.insert( loadDataList, dynamicLoadDataList )&lt;br /&gt;
    loadDataList = enum.unique( loadDataList )&lt;br /&gt;
    usedTemplateList = enum.unique( usedTemplateList )&lt;br /&gt;
    table.sort( requireList )&lt;br /&gt;
    table.sort( loadDataList )&lt;br /&gt;
    table.sort( usedTemplateList )&lt;br /&gt;
&lt;br /&gt;
    return requireList, loadDataList, usedTemplateList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a list with module and function names used in all &amp;#039;{{#Invoke:moduleName|funcName}}&amp;#039; found on page &amp;#039;templateName&amp;#039;.&lt;br /&gt;
---@param templateName string&lt;br /&gt;
---@return table&amp;lt;string, string&amp;gt;[]&lt;br /&gt;
local function getInvokeCallList( templateName )&lt;br /&gt;
    local content = mw.title.new( templateName ):getContent()&lt;br /&gt;
    local invokeList = {}&lt;br /&gt;
&lt;br /&gt;
    assert( param.has_content( content ), string.format( &amp;#039;%s does not exist&amp;#039;, templateName ) )&lt;br /&gt;
&lt;br /&gt;
    for moduleName, funcName in string.gmatch( content, &amp;#039;{{[{|safeubt:}]-#[Ii]nvoke:([^|]+)|([^}|]+)[^}]*}}&amp;#039; ) do&lt;br /&gt;
        moduleName = string.format( &amp;#039;Module:%s&amp;#039;, mw.text.trim( moduleName ) )&lt;br /&gt;
        moduleName = formatModuleName( moduleName )&lt;br /&gt;
        funcName = mw.text.trim( funcName )&lt;br /&gt;
        table.insert( invokeList, {moduleName=moduleName, funcName=funcName} )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    invokeList = enum.unique( invokeList, function(x) return x.moduleName..x.funcName end )&lt;br /&gt;
    table.sort( invokeList, function(x, y) return x.moduleName..x.funcName &amp;lt; y.moduleName..y.funcName end )&lt;br /&gt;
&lt;br /&gt;
    return invokeList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Returns a list with TemplateStyles found on page &amp;#039;templateName&amp;#039;.&lt;br /&gt;
---@param templateName string&lt;br /&gt;
---@return table&amp;lt;string&amp;gt;[]&lt;br /&gt;
local function getTemplateStylesList( templateName )&lt;br /&gt;
    local content = mw.title.new( templateName ):getContent()&lt;br /&gt;
    local styleList = {}&lt;br /&gt;
&lt;br /&gt;
    assert( param.has_content( content ), string.format( &amp;#039;%s does not exist&amp;#039;, templateName ) )&lt;br /&gt;
&lt;br /&gt;
    for styleName in string.gmatch( content, &amp;#039;&amp;lt;templatestyles src=&amp;quot;(.[^&amp;quot;]+)&amp;quot;&amp;#039; ) do&lt;br /&gt;
    	if string.find( styleName, &amp;#039;:&amp;#039;, 1, true ) then&lt;br /&gt;
    		styleName = mw.text.trim( styleName )&lt;br /&gt;
    	else&lt;br /&gt;
    		styleName = string.format( &amp;#039;Template:%s&amp;#039;, mw.text.trim( styleName ) )&lt;br /&gt;
    	end&lt;br /&gt;
        styleName = formatModuleName( styleName )&lt;br /&gt;
        table.insert( styleList, {styleName=styleName} )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    styleList = enum.unique( styleList, function(x) return x.styleName end )&lt;br /&gt;
    table.sort( styleList, function(x, y) return x.styleName &amp;lt; y.styleName end )&lt;br /&gt;
&lt;br /&gt;
    return styleList&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param pageName string&lt;br /&gt;
---@param addCategories boolean&lt;br /&gt;
---@return string&lt;br /&gt;
local function messageBoxUnused( pageName, addCategories )&lt;br /&gt;
    local html = mw.html.create( &amp;#039;div&amp;#039; ):addClass( &amp;#039;mbox mbox-med mbox-unusedmodule&amp;#039; ):attr( &amp;#039;role&amp;#039;, &amp;#039;presentation&amp;#039;)&lt;br /&gt;
    html:tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
            :addClass( &amp;#039;mbox-title&amp;#039; )&lt;br /&gt;
            :tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
                :addClass( &amp;#039;mbox-icon metadata&amp;#039; )&lt;br /&gt;
                :wikitext( &amp;#039;[[File:WikimediaUI-Alert.svg|14px|link=]]&amp;#039; )&lt;br /&gt;
                :done()&lt;br /&gt;
            :wikitext( &amp;#039;This module is unused.&amp;#039; )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;span&amp;#039; )&lt;br /&gt;
            :addClass( &amp;#039;mbox-text&amp;#039; )&lt;br /&gt;
            :wikitext(&lt;br /&gt;
                string.format( &amp;#039;This module is neither invoked by a template nor required/loaded by another module. If this is in error, make sure to add &amp;lt;code&amp;gt;{{[[Template:Documentation|Documentation]]}}&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;{{[[Template:No documentation|No&amp;amp;nbsp;documentation]]}}&amp;lt;/code&amp;gt; to the calling template\&amp;#039;s or parent\&amp;#039;s module documentation.&amp;#039;, &lt;br /&gt;
                    pageName &lt;br /&gt;
                )&lt;br /&gt;
            )&lt;br /&gt;
            :wikitext( addCategories and &amp;#039;[[Category:Unused modules]]&amp;#039; or &amp;#039;&amp;#039; )&lt;br /&gt;
            :done()&lt;br /&gt;
        :done()&lt;br /&gt;
    return tostring( html )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function collapseList( list, id, listType )&lt;br /&gt;
    local text = string.format( &amp;#039;%d %s&amp;#039;, #list, listType )&lt;br /&gt;
    local button = &amp;#039;&amp;lt;span&amp;gt;&amp;#039; .. text .. &amp;#039;:&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
    list = enum.map( list, function(x) return &amp;#039;\n# &amp;#039;..x end )&lt;br /&gt;
    local content = &amp;#039;\n&amp;#039;..table.concat( list )..&amp;#039;\n\n&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    return { tostring( button ) .. tostring( content ) }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--- Creates a link to [[Special:Search]] showing all pages found by getDynamicRequireList() in case it found more than MAX_DYNAMIC_REQUIRE_LIST_LENGTH pages.&lt;br /&gt;
---@param query string      @This will be in a format like &amp;#039;Module:Wowee/%&amp;#039; or &amp;#039;Module:Wowee/%/data&amp;#039;&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatDynamicQueryLink( query )&lt;br /&gt;
    local prefix = query:match( &amp;#039;^([^/]+)&amp;#039; )&lt;br /&gt;
    local linkText = query:gsub( &amp;#039;%%&amp;#039;, &amp;#039;&amp;amp;lt; ... &amp;amp;gt;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    query = query:gsub( &amp;#039;^Module:&amp;#039;,  &amp;#039;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    query = query:gsub( &amp;#039;([^/]+)/?&amp;#039;, function ( match )&lt;br /&gt;
        if match == &amp;#039;%&amp;#039; then&lt;br /&gt;
            return &amp;#039;\\/[^\\/]+&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;#039;\\/&amp;quot;&amp;#039; .. match .. &amp;#039;&amp;quot;&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    query = query:gsub( &amp;#039;^\\/&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
    query = string.format(&lt;br /&gt;
        &amp;#039;intitle:/%s%s/i -intitle:/%s\\/&amp;quot;&amp;quot;/i -intitle:doc prefix:&amp;quot;%s&amp;quot;&amp;#039;,&lt;br /&gt;
        query,&lt;br /&gt;
        query:find( &amp;#039;&amp;quot;$&amp;#039; ) and &amp;#039;&amp;#039; or &amp;#039;&amp;quot;&amp;quot;&amp;#039;,&lt;br /&gt;
        query,&lt;br /&gt;
        prefix&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
    return string.format( &amp;#039;&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[%s %s]&amp;lt;/span&amp;gt;&amp;#039;, tostring( mw.uri.fullUrl( &amp;#039;Special:Search&amp;#039;, { search = query } ) ), linkText )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param templateName string&lt;br /&gt;
---@param addCategories boolean&lt;br /&gt;
---@param invokeList table&amp;lt;string, string&amp;gt;[]    @This is the list returned by getInvokeCallList()&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatInvokeCallList( templateName, addCategories, invokeList )&lt;br /&gt;
    local category = addCategories and &amp;#039;[[Category:Lua-based templates]]&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    for _, item in ipairs( invokeList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role=&amp;#039;note&amp;#039; class=&amp;#039;hatnote&amp;#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&amp;#039;&amp;gt;&amp;lt;span class=&amp;#039;hatnote-icon metadata&amp;#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; invokes function &amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; in [[%s]] using [[Star Citizen:Lua|Lua]].&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            templateName,&lt;br /&gt;
            item.funcName,&lt;br /&gt;
            item.moduleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #invokeList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, category )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param moduleName string&lt;br /&gt;
---@param addCategories boolean&lt;br /&gt;
---@param whatLinksHere string    @A list generated by a dpl of pages in the Template namespace which link to moduleName.&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatInvokedByList( moduleName, addCategories, whatLinksHere )&lt;br /&gt;
    local templateData = enum.map( whatLinksHere, function(x) return {templateName=x, invokeList=getInvokeCallList(x)} end )&lt;br /&gt;
    templateData = enum.filter( templateData, function(x)&lt;br /&gt;
        return enum.any( x.invokeList, function(y)&lt;br /&gt;
            return y.moduleName:lower() == moduleName:lower()&lt;br /&gt;
        end )&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local invokedByList = {}&lt;br /&gt;
&lt;br /&gt;
    for _, template in ipairs( templateData ) do&lt;br /&gt;
        for _, invoke in ipairs( template.invokeList ) do&lt;br /&gt;
            table.insert( invokedByList, string.format( &amp;quot;function &amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; is invoked by [[%s]]&amp;quot;, invoke.funcName, template.templateName ) )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    table.sort( invokedByList)&lt;br /&gt;
&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    if #invokedByList &amp;gt; COLLAPSE_LIST_LENGTH_THRESHOLD then&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role=&amp;#039;note&amp;#039; class=&amp;#039;hatnote&amp;#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&amp;#039;&amp;gt;&amp;lt;span class=&amp;#039;hatnote-icon metadata&amp;#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; is invoked by %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            moduleName,&lt;br /&gt;
            collapseList( invokedByList, &amp;#039;invokedBy&amp;#039;, &amp;#039;templates&amp;#039; )[1]&lt;br /&gt;
        ) )&lt;br /&gt;
    else&lt;br /&gt;
	    for _, item in ipairs( invokedByList ) do&lt;br /&gt;
	        table.insert( res, string.format(&lt;br /&gt;
	            &amp;quot;&amp;lt;div role=&amp;#039;note&amp;#039; class=&amp;#039;hatnote&amp;#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&amp;#039;&amp;gt;&amp;lt;span class=&amp;#039;hatnote-icon metadata&amp;#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; is invoked by %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
	            moduleName,&lt;br /&gt;
	            item&lt;br /&gt;
	        ) )&lt;br /&gt;
	    end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #templateData &amp;gt; 0 then&lt;br /&gt;
        moduleIsUsed = true&lt;br /&gt;
        table.insert( res, (addCategories and &amp;#039;[[Category:Template invoked modules]]&amp;#039; or &amp;#039;&amp;#039;) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param moduleName string&lt;br /&gt;
---@param addCategories boolean&lt;br /&gt;
---@param whatLinksHere string      @A list generated by a dpl of pages in the Module namespace which link to moduleName.&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatRequiredByList( moduleName, addCategories, whatLinksHere )&lt;br /&gt;
    local childModuleData = enum.map( whatLinksHere, function ( title )&lt;br /&gt;
        local requireList, loadDataList = getRequireList( title )&lt;br /&gt;
        return {name=title, requireList=requireList, loadDataList=loadDataList}&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local requiredByList = enum.map( childModuleData, function ( item )&lt;br /&gt;
        if enum.any( item.requireList, function(x) return x:lower()==moduleName:lower() end ) then&lt;br /&gt;
            if item.name:find( &amp;#039;%%&amp;#039; ) then&lt;br /&gt;
                return formatDynamicQueryLink( item.name )&lt;br /&gt;
            else&lt;br /&gt;
                return &amp;#039;[[&amp;#039; .. item.name .. &amp;#039;]]&amp;#039;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local loadedByList = enum.map( childModuleData, function ( item )&lt;br /&gt;
        if enum.any( item.loadDataList, function(x) return x:lower()==moduleName:lower() end ) then&lt;br /&gt;
            if item.name:find( &amp;#039;%%&amp;#039; ) then&lt;br /&gt;
                return formatDynamicQueryLink( item.name )&lt;br /&gt;
            else&lt;br /&gt;
                return &amp;#039;[[&amp;#039; .. item.name .. &amp;#039;]]&amp;#039;&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    if #requiredByList &amp;gt; 0 or #loadedByList &amp;gt; 0 then&lt;br /&gt;
        moduleIsUsed  = true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #requiredByList &amp;gt; COLLAPSE_LIST_LENGTH_THRESHOLD then&lt;br /&gt;
        requiredByList = collapseList( requiredByList, &amp;#039;requiredBy&amp;#039;, &amp;#039;modules&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #loadedByList &amp;gt; COLLAPSE_LIST_LENGTH_THRESHOLD then&lt;br /&gt;
        loadedByList = collapseList( loadedByList, &amp;#039;loadedBy&amp;#039;, &amp;#039;modules&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    for _, requiredByModuleName in ipairs( requiredByList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role=&amp;#039;note&amp;#039; class=&amp;#039;hatnote&amp;#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&amp;#039;&amp;gt;&amp;lt;span class=&amp;#039;hatnote-icon metadata&amp;#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; is required by %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            moduleName,&lt;br /&gt;
            requiredByModuleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #requiredByList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, (addCategories and &amp;#039;[[Category:Modules required by modules]]&amp;#039; or &amp;#039;&amp;#039;) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, loadedByModuleName in ipairs( loadedByList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role=&amp;#039;note&amp;#039; class=&amp;#039;hatnote&amp;#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&amp;#039;&amp;gt;&amp;lt;span class=&amp;#039;hatnote-icon metadata&amp;#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; is loaded by %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            moduleName,&lt;br /&gt;
            loadedByModuleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #loadedByList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, (addCategories and &amp;#039;[[Category:Module data]]&amp;#039; or &amp;#039;&amp;#039;) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatRequireList( currentPageName, addCategories, requireList )&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    if #requireList &amp;gt; COLLAPSE_LIST_LENGTH_THRESHOLD then&lt;br /&gt;
       requireList = collapseList( requireList, &amp;#039;require&amp;#039;, &amp;#039;modules&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, requiredModuleName in ipairs( requireList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role=&amp;#039;note&amp;#039; class=&amp;#039;hatnote&amp;#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&amp;#039;&amp;gt;&amp;lt;span class=&amp;#039;hatnote-icon metadata&amp;#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; requires %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            currentPageName,&lt;br /&gt;
            requiredModuleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #requireList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, (addCategories and &amp;#039;[[Category:Modules requiring modules]]&amp;#039; or &amp;#039;&amp;#039;) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatLoadDataList( currentPageName, addCategories, loadDataList )&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    if #loadDataList &amp;gt; COLLAPSE_LIST_LENGTH_THRESHOLD then&lt;br /&gt;
        loadDataList = collapseList( loadDataList, &amp;#039;loadData&amp;#039;, &amp;#039;modules&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, loadedModuleName in ipairs( loadDataList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role=&amp;#039;note&amp;#039; class=&amp;#039;hatnote&amp;#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&amp;#039;&amp;gt;&amp;lt;span class=&amp;#039;hatnote-icon metadata&amp;#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; loads data from %s.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            currentPageName,&lt;br /&gt;
            loadedModuleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #loadDataList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, (addCategories and &amp;#039;[[Category:Modules using data]]&amp;#039; or &amp;#039;&amp;#039;) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function formatUsedTemplatesList( currentPageName, addCategories, usedTemplateList )&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    if #usedTemplateList &amp;gt; COLLAPSE_LIST_LENGTH_THRESHOLD then&lt;br /&gt;
        usedTemplateList = collapseList( usedTemplateList, &amp;#039;usedTemplates&amp;#039;, &amp;#039;templates&amp;#039; )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for _, templateName in ipairs( usedTemplateList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role=&amp;#039;note&amp;#039; class=&amp;#039;hatnote&amp;#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&amp;#039;&amp;gt;&amp;lt;span class=&amp;#039;hatnote-icon metadata&amp;#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; transcludes  [[%s]] using &amp;lt;samp&amp;gt;frame:preprocess()&amp;lt;/samp&amp;gt;.&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            currentPageName,&lt;br /&gt;
            templateName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param templateName string&lt;br /&gt;
---@param addCategories boolean&lt;br /&gt;
---@param styleList table&amp;lt;string&amp;gt;[]    @This is the list returned by getTemplateStylesList()&lt;br /&gt;
---@return string&lt;br /&gt;
local function formatTemplateStylesList( templateName, addCategories, styleList )&lt;br /&gt;
    local category = addCategories and &amp;#039;[[Category:Templates using TemplateStyles]]&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    for _, item in ipairs( styleList ) do&lt;br /&gt;
        table.insert( res, string.format(&lt;br /&gt;
            &amp;quot;&amp;lt;div role=&amp;#039;note&amp;#039; class=&amp;#039;hatnote&amp;#039;&amp;gt;&amp;lt;div class=hatnote-container navigation-not-searchable&amp;#039;&amp;gt;&amp;lt;span class=&amp;#039;hatnote-icon metadata&amp;#039;&amp;gt;[[File:WikimediaUI-Code.svg|14px|link=]]&amp;lt;/span&amp;gt;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039; invokes [[%s]] using [[Star Citizen:TemplateStyles|TemplateStyles]].&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;,&lt;br /&gt;
            templateName,&lt;br /&gt;
            item.styleName&lt;br /&gt;
        ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if #styleList &amp;gt; 0 then&lt;br /&gt;
        table.insert( res, category )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main( frame )&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    return p._main( args[1], args.category, args.isUsed )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
---@param currentPageName string|nil&lt;br /&gt;
---@param addCategories boolean|string|nil&lt;br /&gt;
---@return string&lt;br /&gt;
function p._main( currentPageName, addCategories, isUsed )&lt;br /&gt;
    libraryUtil.checkType( &amp;#039;Module:RequireList._main&amp;#039;, 1, currentPageName, &amp;#039;string&amp;#039;, true )&lt;br /&gt;
    libraryUtil.checkTypeMulti( &amp;#039;Module:RequireList._main&amp;#039;, 2, addCategories, {&amp;#039;boolean&amp;#039;, &amp;#039;string&amp;#039;, &amp;#039;nil&amp;#039;} )&lt;br /&gt;
    libraryUtil.checkTypeMulti( &amp;#039;Module:RequireList._main&amp;#039;, 3, isUsed, {&amp;#039;boolean&amp;#039;, &amp;#039;string&amp;#039;, &amp;#039;nil&amp;#039;} )&lt;br /&gt;
&lt;br /&gt;
    local title = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
    -- Leave early if not in module, template namespace or if module is part of exchange or data groups&lt;br /&gt;
    if param.is_empty( currentPageName ) and (&lt;br /&gt;
        ( not enum.contains( {&amp;#039;Module&amp;#039;, &amp;#039;Template&amp;#039;}, title.nsText ) ) or&lt;br /&gt;
        ( title.nsText == &amp;#039;Module&amp;#039; and ( enum.contains( {&amp;#039;Exchange&amp;#039;, &amp;#039;Exchange historical&amp;#039;, &amp;#039;Data&amp;#039;}, title.text:match( &amp;#039;^(.-)/&amp;#039; ) ) ) )&lt;br /&gt;
    ) then&lt;br /&gt;
        return &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    &lt;br /&gt;
    currentPageName = param.default_to( currentPageName, title.fullText )&lt;br /&gt;
    currentPageName = string.gsub( currentPageName, &amp;#039;/[Dd]oc$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
    currentPageName = formatModuleName( currentPageName )&lt;br /&gt;
    addCategories = yn( param.default_to( addCategories, title.subpageText~=&amp;#039;doc&amp;#039; ) )&lt;br /&gt;
    moduleIsUsed = yn( param.default_to( isUsed, false ) )&lt;br /&gt;
    &lt;br /&gt;
    if title.text:match( &amp;#039;^(.-)/&amp;#039; ) == &amp;#039;Sandbox&amp;#039; then&lt;br /&gt;
    	moduleIsUsed = true -- Don&amp;#039;t show sandbox modules as unused&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if currentPageName:find( &amp;#039;^Template:&amp;#039; ) then&lt;br /&gt;
        local invokeList = getInvokeCallList( currentPageName )&lt;br /&gt;
        local styleList = getTemplateStylesList( currentPageName )&lt;br /&gt;
        return formatInvokeCallList( currentPageName, addCategories, invokeList ) .. formatTemplateStylesList( currentPageName, addCategories, styleList )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local whatTemplatesLinkHere, whatModulesLinkHere = dpl.ask( {&lt;br /&gt;
        namespace = &amp;#039;Template&amp;#039;,&lt;br /&gt;
        linksto = currentPageName,&lt;br /&gt;
        distinct = &amp;#039;strict&amp;#039;,&lt;br /&gt;
        ignorecase = true,&lt;br /&gt;
        ordermethod = &amp;#039;title&amp;#039;,&lt;br /&gt;
        allowcachedresults = true,&lt;br /&gt;
        cacheperiod = 604800 -- One week&lt;br /&gt;
    }, {&lt;br /&gt;
        namespace = &amp;#039;Module&amp;#039;,&lt;br /&gt;
        linksto = currentPageName,&lt;br /&gt;
        nottitlematch = &amp;#039;%/doc|Exchange/%|Data/%|&amp;#039; .. currentPageName:gsub( &amp;#039;Module:&amp;#039;, &amp;#039;&amp;#039; ),&lt;br /&gt;
        distinct = &amp;#039;strict&amp;#039;,&lt;br /&gt;
        ignorecase = true,&lt;br /&gt;
        ordermethod = &amp;#039;title&amp;#039;,&lt;br /&gt;
        allowcachedresults = true,&lt;br /&gt;
        cacheperiod = 604800 -- One week&lt;br /&gt;
    } )&lt;br /&gt;
&lt;br /&gt;
    local requireList, loadDataList, usedTemplateList = getRequireList( currentPageName, true )&lt;br /&gt;
&lt;br /&gt;
    requireList = enum.map( requireList, function ( moduleName )&lt;br /&gt;
        if moduleName:find( &amp;#039;%%&amp;#039; ) then&lt;br /&gt;
            return formatDynamicQueryLink( moduleName )&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;#039;[[&amp;#039; .. moduleName .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    loadDataList = enum.map( loadDataList, function ( moduleName )&lt;br /&gt;
        if moduleName:find( &amp;#039;%%&amp;#039; ) then&lt;br /&gt;
            return formatDynamicQueryLink( moduleName )&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;#039;[[&amp;#039; .. moduleName .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    usedTemplateList = enum.map( usedTemplateList, function( templateName )&lt;br /&gt;
        if string.find( templateName, &amp;#039;:&amp;#039; ) then -- Real templates are prefixed by a namespace, magic words are not&lt;br /&gt;
            return &amp;#039;[[&amp;#039;..templateName..&amp;#039;]]&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            return &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;amp;#123;&amp;amp;#123;&amp;quot;..templateName..&amp;quot;&amp;amp;#125;&amp;amp;#125;&amp;#039;&amp;#039;&amp;#039;&amp;quot; -- Magic words don&amp;#039;t have a page so make them bold instead&lt;br /&gt;
        end&lt;br /&gt;
    end )&lt;br /&gt;
&lt;br /&gt;
    local res = {}&lt;br /&gt;
&lt;br /&gt;
    table.insert( res, formatInvokedByList( currentPageName, addCategories, whatTemplatesLinkHere ) )&lt;br /&gt;
    table.insert( res, formatRequireList( currentPageName, addCategories, requireList ) )&lt;br /&gt;
    table.insert( res, formatLoadDataList( currentPageName, addCategories, loadDataList ) )&lt;br /&gt;
    table.insert( res, formatUsedTemplatesList( currentPageName, addCategories, usedTemplateList ) )&lt;br /&gt;
    table.insert( res, formatRequiredByList( currentPageName, addCategories, whatModulesLinkHere ) )&lt;br /&gt;
&lt;br /&gt;
    if not moduleIsUsed then&lt;br /&gt;
        table.insert( res, 1, messageBoxUnused( currentPageName:gsub( &amp;#039;Module:&amp;#039;, &amp;#039;&amp;#039; ), addCategories ) )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat( res )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;br /&gt;
-- &amp;lt;/nowiki&amp;gt;&lt;/div&gt;</summary>
		<author><name>Syntax McBucketface</name></author>
	</entry>
</feed>