€• mŒsphinx.addnodes”Œdocument”“”)”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)”}”(hhh]”(hŒ pending_xref”“”)”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…””}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ'/translations/zh_CN/networking/fib_trie”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)”}”(hhh]”hŒChinese (Traditional)”…””}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/zh_TW/networking/fib_trie”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒItalian”…””}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/it_IT/networking/fib_trie”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒJapanese”…””}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/ja_JP/networking/fib_trie”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒKorean”…””}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/ko_KR/networking/fib_trie”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒPortuguese (Brazilian)”…””}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/pt_BR/networking/fib_trie”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)”}”(hhh]”hŒSpanish”…””}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ'/translations/sp_SP/networking/fib_trie”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…””}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒA/var/lib/git/docbuild/linux/Documentation/networking/fib_trie.rst”h´KubhŒsection”“”)”}”(hhh]”(hŒtitle”“”)”}”(hŒLC-trie implementation notes”h]”hŒLC-trie implementation notes”…””}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒ Node types”h]”hŒ Node types”…””}”(hhàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÝh²hh³hÇh´KubhŒdefinition_list”“”)”}”(hhh]”(hŒdefinition_list_item”“”)”}”(hŒ®leaf An end node with data. This has a copy of the relevant key, along with 'hlist' with routing table entries sorted by prefix length. See struct leaf and struct leaf_info. ”h]”(hŒterm”“”)”}”(hŒleaf”h]”hŒleaf”…””}”(hhûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´K hhõubhŒ definition”“”)”}”(hhh]”hŒ paragraph”“”)”}”(hŒ¨An end node with data. This has a copy of the relevant key, along with 'hlist' with routing table entries sorted by prefix length. See struct leaf and struct leaf_info.”h]”hŒ¬An end node with data. This has a copy of the relevant key, along with ‘hlist’ with routing table entries sorted by prefix length. See struct leaf and struct leaf_info.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hhõubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´K hhðubhô)”}”(hŒ•trie node or tnode An internal node, holding an array of child (leaf or tnode) pointers, indexed through a subset of the key. See Level Compression. ”h]”(hú)”}”(hŒtrie node or tnode”h]”hŒtrie node or tnode”…””}”(hj.h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´Khj*ubj )”}”(hhh]”j)”}”(hŒAn internal node, holding an array of child (leaf or tnode) pointers, indexed through a subset of the key. See Level Compression.”h]”hŒAn internal node, holding an array of child (leaf or tnode) pointers, indexed through a subset of the key. See Level Compression.”…””}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´Khj<ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´Khhðh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîhhÝh²hh³hÇh´Nubeh}”(h]”Œ node-types”ah ]”h"]”Œ node types”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒA few concepts explained”h]”hŒA few concepts explained”…””}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhjgh²hh³hÇh´Kubhï)”}”(hhh]”(hô)”}”(hŒ†Bits (tnode) The number of bits in the key segment used for indexing into the child array - the "child index". See Level Compression. ”h]”(hú)”}”(hŒ Bits (tnode)”h]”hŒ Bits (tnode)”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´Khj{ubj )”}”(hhh]”j)”}”(hŒxThe number of bits in the key segment used for indexing into the child array - the "child index". See Level Compression.”h]”hŒ|The number of bits in the key segment used for indexing into the child array - the “child indexâ€. See Level Compression.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´Khjubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj{ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´Khjxubhô)”}”(hŒwPos (tnode) The position (in the key) of the key segment used for indexing into the child array. See Path Compression. ”h]”(hú)”}”(hŒ Pos (tnode)”h]”hŒ Pos (tnode)”…””}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´Khjªubj )”}”(hhh]”j)”}”(hŒjThe position (in the key) of the key segment used for indexing into the child array. See Path Compression.”h]”hŒjThe position (in the key) of the key segment used for indexing into the child array. See Path Compression.”…””}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´Khj¼ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjªubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´Khjxh²hubhô)”}”(hXqPath Compression / skipped bits Any given tnode is linked to from the child array of its parent, using a segment of the key specified by the parent's "pos" and "bits" In certain cases, this tnode's own "pos" will not be immediately adjacent to the parent (pos+bits), but there will be some bits in the key skipped over because they represent a single path with no deviations. These "skipped bits" constitute Path Compression. Note that the search algorithm will simply skip over these bits when searching, making it necessary to save the keys in the leaves to verify that they actually do match the key we are searching for. ”h]”(hú)”}”(hŒPath Compression / skipped bits”h]”hŒPath Compression / skipped bits”…””}”(hjÝh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´K%hjÙubj )”}”(hhh]”j)”}”(hXPAny given tnode is linked to from the child array of its parent, using a segment of the key specified by the parent's "pos" and "bits" In certain cases, this tnode's own "pos" will not be immediately adjacent to the parent (pos+bits), but there will be some bits in the key skipped over because they represent a single path with no deviations. These "skipped bits" constitute Path Compression. Note that the search algorithm will simply skip over these bits when searching, making it necessary to save the keys in the leaves to verify that they actually do match the key we are searching for.”h]”hXdAny given tnode is linked to from the child array of its parent, using a segment of the key specified by the parent’s “pos†and “bits†In certain cases, this tnode’s own “pos†will not be immediately adjacent to the parent (pos+bits), but there will be some bits in the key skipped over because they represent a single path with no deviations. These “skipped bits†constitute Path Compression. Note that the search algorithm will simply skip over these bits when searching, making it necessary to save the keys in the leaves to verify that they actually do match the key we are searching for.”…””}”(hjîh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´Khjëubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÙubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´K%hjxh²hubhô)”}”(hXîLevel Compression / child arrays the trie is kept level balanced moving, under certain conditions, the children of a full child (see "full_children") up one level, so that instead of a pure binary tree, each internal node ("tnode") may contain an arbitrarily large array of links to several children. Conversely, a tnode with a mostly empty child array (see empty_children) may be "halved", having some of its children moved downwards one level, in order to avoid ever-increasing child arrays. ”h]”(hú)”}”(hŒ Level Compression / child arrays”h]”hŒ Level Compression / child arrays”…””}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´K.hjubj )”}”(hhh]”j)”}”(hXÌthe trie is kept level balanced moving, under certain conditions, the children of a full child (see "full_children") up one level, so that instead of a pure binary tree, each internal node ("tnode") may contain an arbitrarily large array of links to several children. Conversely, a tnode with a mostly empty child array (see empty_children) may be "halved", having some of its children moved downwards one level, in order to avoid ever-increasing child arrays.”h]”hXØthe trie is kept level balanced moving, under certain conditions, the children of a full child (see “full_childrenâ€) up one level, so that instead of a pure binary tree, each internal node (“tnodeâ€) may contain an arbitrarily large array of links to several children. Conversely, a tnode with a mostly empty child array (see empty_children) may be “halvedâ€, having some of its children moved downwards one level, in order to avoid ever-increasing child arrays.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K(hjubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´K.hjxh²hubhô)”}”(hŒZempty_children the number of positions in the child array of a given tnode that are NULL. ”h]”(hú)”}”(hŒempty_children”h]”hŒempty_children”…””}”(hj;h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´K2hj7ubj )”}”(hhh]”j)”}”(hŒJthe number of positions in the child array of a given tnode that are NULL.”h]”hŒJthe number of positions in the child array of a given tnode that are NULL.”…””}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K1hjIubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj7ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´K2hjxh²hubhô)”}”(hX8full_children the number of children of a given tnode that aren't path compressed. (in other words, they aren't NULL or leaves and their "pos" is equal to this tnode's "pos"+"bits"). (The word "full" here is used more in the sense of "complete" than as the opposite of "empty", which might be a tad confusing.) ”h]”(hú)”}”(hŒ full_children”h]”hŒ full_children”…””}”(hjjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´K:hjfubj )”}”(hhh]”(j)”}”(hŒ¨the number of children of a given tnode that aren't path compressed. (in other words, they aren't NULL or leaves and their "pos" is equal to this tnode's "pos"+"bits").”h]”hŒºthe number of children of a given tnode that aren’t path compressed. (in other words, they aren’t NULL or leaves and their “pos†is equal to this tnode’s “posâ€+â€bitsâ€).”…””}”(hj{h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K5hjxubj)”}”(hŒ(The word "full" here is used more in the sense of "complete" than as the opposite of "empty", which might be a tad confusing.)”h]”hŒ‹(The word “full†here is used more in the sense of “complete†than as the opposite of “emptyâ€, which might be a tad confusing.)”…””}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K9hjxubeh}”(h]”h ]”h"]”h$]”h&]”uh1j hjfubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´K:hjxh²hubeh}”(h]”h ]”h"]”h$]”h&]”uh1hîhjgh²hh³hÇh´Nubeh}”(h]”Œa-few-concepts-explained”ah ]”h"]”Œa few concepts explained”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´KubhÉ)”}”(hhh]”(hÎ)”}”(hŒComments”h]”hŒComments”…””}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhj±h²hh³hÇh´K=ubj)”}”(hŒ}We have tried to keep the structure of the code as close to fib_hash as possible to allow verification and help up reviewing.”h]”hŒ}We have tried to keep the structure of the code as close to fib_hash as possible to allow verification and help up reviewing.”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K?hj±h²hubhï)”}”(hhh]”(hô)”}”(hŒrfib_find_node() A good start for understanding this code. This function implements a straightforward trie lookup. ”h]”(hú)”}”(hŒfib_find_node()”h]”hŒfib_find_node()”…””}”(hj×h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´KDhjÓubj )”}”(hhh]”j)”}”(hŒaA good start for understanding this code. This function implements a straightforward trie lookup.”h]”hŒaA good start for understanding this code. This function implements a straightforward trie lookup.”…””}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KChjåubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjÓubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´KDhjÐubhô)”}”(hŒÏfib_insert_node() Inserts a new leaf node in the trie. This is bit more complicated than fib_find_node(). Inserting a new node means we might have to run the level compression algorithm on part of the trie. ”h]”(hú)”}”(hŒfib_insert_node()”h]”hŒfib_insert_node()”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´KIhjubj )”}”(hhh]”j)”}”(hŒ¼Inserts a new leaf node in the trie. This is bit more complicated than fib_find_node(). Inserting a new node means we might have to run the level compression algorithm on part of the trie.”h]”hŒ¼Inserts a new leaf node in the trie. This is bit more complicated than fib_find_node(). Inserting a new node means we might have to run the level compression algorithm on part of the trie.”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KGhjubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´KIhjÐh²hubhô)”}”(hŒXtrie_leaf_remove() Looks up a key, deletes it and runs the level compression algorithm. ”h]”(hú)”}”(hŒtrie_leaf_remove()”h]”hŒtrie_leaf_remove()”…””}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´KLhj1ubj )”}”(hhh]”j)”}”(hŒDLooks up a key, deletes it and runs the level compression algorithm.”h]”hŒDLooks up a key, deletes it and runs the level compression algorithm.”…””}”(hjFh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KLhjCubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj1ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´KLhjÐh²hubhô)”}”(hŒûtrie_rebalance() The key function for the dynamic trie after any change in the trie it is run to optimize and reorganize. It will walk the trie upwards towards the root from a given tnode, doing a resize() at each step to implement level compression. ”h]”(hú)”}”(hŒtrie_rebalance()”h]”hŒtrie_rebalance()”…””}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´KRhj`ubj )”}”(hhh]”j)”}”(hŒéThe key function for the dynamic trie after any change in the trie it is run to optimize and reorganize. It will walk the trie upwards towards the root from a given tnode, doing a resize() at each step to implement level compression.”h]”hŒéThe key function for the dynamic trie after any change in the trie it is run to optimize and reorganize. It will walk the trie upwards towards the root from a given tnode, doing a resize() at each step to implement level compression.”…””}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KOhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj`ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´KRhjÐh²hubhô)”}”(hXresize() Analyzes a tnode and optimizes the child array size by either inflating or shrinking it repeatedly until it fulfills the criteria for optimal level compression. This part follows the original paper pretty closely and there may be some room for experimentation here. ”h]”(hú)”}”(hŒresize()”h]”hŒresize()”…””}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´KXhjubj )”}”(hhh]”j)”}”(hX Analyzes a tnode and optimizes the child array size by either inflating or shrinking it repeatedly until it fulfills the criteria for optimal level compression. This part follows the original paper pretty closely and there may be some room for experimentation here.”h]”hX Analyzes a tnode and optimizes the child array size by either inflating or shrinking it repeatedly until it fulfills the criteria for optimal level compression. This part follows the original paper pretty closely and there may be some room for experimentation here.”…””}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KUhj¡ubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´KXhjÐh²hubhô)”}”(hŒPinflate() Doubles the size of the child array within a tnode. Used by resize(). ”h]”(hú)”}”(hŒ inflate()”h]”hŒ inflate()”…””}”(hjÂh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´K[hj¾ubj )”}”(hhh]”j)”}”(hŒEDoubles the size of the child array within a tnode. Used by resize().”h]”hŒEDoubles the size of the child array within a tnode. Used by resize().”…””}”(hjÓh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K[hjÐubah}”(h]”h ]”h"]”h$]”h&]”uh1j hj¾ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´K[hjÐh²hubhô)”}”(hŒhhalve() Halves the size of the child array within a tnode - the inverse of inflate(). Used by resize(); ”h]”(hú)”}”(hŒhalve()”h]”hŒhalve()”…””}”(hjñh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hùh³hÇh´K_hjíubj )”}”(hhh]”j)”}”(hŒ_Halves the size of the child array within a tnode - the inverse of inflate(). Used by resize();”h]”hŒ_Halves the size of the child array within a tnode - the inverse of inflate(). Used by resize();”…””}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K^hjÿubah}”(h]”h ]”h"]”h$]”h&]”uh1j hjíubeh}”(h]”h ]”h"]”h$]”h&]”uh1hóh³hÇh´K_hjÐh²hubhô)”}”(hŒ©fn_trie_insert(), fn_trie_delete(), fn_trie_select_default() The route manipulation functions. Should conform pretty closely to the corresponding functions in fib_hash. ”h]”(hú)”}”(hŒstats.backtrack++) up the trie, continuing to chop off part of the key in order to find the longest matching prefix.”h]”hŒ“At this point we backtrack (t->stats.backtrack++) up the trie, continuing to chop off part of the key in order to find the longest matching prefix.”…””}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KŒhjÞh²hubj)”}”(hŒçAt this point we will repeatedly descend subtries to look for a match, and there are some optimizations available that can provide us with "shortcuts" to avoid descending into dead ends. Look for "HL_OPTIMIZE" sections in the code.”h]”hŒïAt this point we will repeatedly descend subtries to look for a match, and there are some optimizations available that can provide us with “shortcuts†to avoid descending into dead ends. Look for “HL_OPTIMIZE†sections in the code.”…””}”(hjCh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´KhjÞh²hubj)”}”(hŒ¿To alleviate any doubts about the correctness of the route selection process, a new netlink operation has been added. Look for NETLINK_FIB_LOOKUP, which gives userland access to fib_lookup().”h]”hŒ¿To alleviate any doubts about the correctness of the route selection process, a new netlink operation has been added. Look for NETLINK_FIB_LOOKUP, which gives userland access to fib_lookup().”…””}”(hjQh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jh³hÇh´K“hjÞh²hubeh}”(h]”Œmain-lookup-mechanism”ah ]”h"]”Œmain lookup mechanism”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´Kxubeh}”(h]”Œlc-trie-implementation-notes”ah ]”h"]”Œlc-trie implementation notes”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”Œentry”Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”j’Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œrefids”}”Œnameids”}”(jljijdjaj®j«j´j±jÛjØjdjauŒ nametypes”}”(jl‰jd‰j®‰j´‰jÛ‰jd‰uh}”(jihÊjahÝj«jgj±j±jØj·jajÞuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”…”R”Œparse_messages”]”Œtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.